diff --git a/pkg/analysis_server/lib/driver.dart b/pkg/analysis_server/lib/driver.dart
index 911cbc6..78d198f 100644
--- a/pkg/analysis_server/lib/driver.dart
+++ b/pkg/analysis_server/lib/driver.dart
@@ -82,6 +82,7 @@
       if (serve_http) {
         httpServer.close();
       }
+      exit(0);
     });
   }
 
diff --git a/pkg/analysis_server/lib/src/analysis_manager.dart b/pkg/analysis_server/lib/src/analysis_manager.dart
index 2c4ad01..0a5dc85 100644
--- a/pkg/analysis_server/lib/src/analysis_manager.dart
+++ b/pkg/analysis_server/lib/src/analysis_manager.dart
@@ -121,7 +121,7 @@
       return channel.close().then((_) => false);
     }
     return channel
-        .sendRequest(new Request('0', METHOD_SHUTDOWN))
+        .sendRequest(new Request('0', SERVER_SHUTDOWN))
         .timeout(new Duration(seconds: 2), onTimeout: () {
           print('Expected shutdown response');
         })
diff --git a/pkg/analysis_server/lib/src/analysis_server.dart b/pkg/analysis_server/lib/src/analysis_server.dart
index db5be05..3ddb9f7 100644
--- a/pkg/analysis_server/lib/src/analysis_server.dart
+++ b/pkg/analysis_server/lib/src/analysis_server.dart
@@ -5,6 +5,7 @@
 library analysis.server;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/src/analysis_logger.dart';
 import 'package:analysis_server/src/channel.dart';
@@ -14,6 +15,8 @@
 import 'package:analysis_server/src/operation/operation_analysis.dart';
 import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/operation/operation_queue.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
+import 'package:analysis_server/src/package_uri_resolver.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/ast.dart';
@@ -24,6 +27,7 @@
 import 'package:analyzer/src/generated/sdk_io.dart';
 import 'package:analyzer/src/generated/source_io.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 
 /**
@@ -35,18 +39,36 @@
 class AnalysisServerContextDirectoryManager extends ContextDirectoryManager {
   final AnalysisServer analysisServer;
 
+  /**
+   * The default options used to create new analysis contexts.
+   */
+  AnalysisOptionsImpl defaultOptions = new AnalysisOptionsImpl();
+
   AnalysisServerContextDirectoryManager(this.analysisServer, ResourceProvider resourceProvider)
       : super(resourceProvider);
 
-  void addContext(Folder folder, File pubspecFile) {
+  @override
+  void addContext(Folder folder) {
+    Map<String, List<Folder>> packageMap =
+        analysisServer.packageMapProvider.computePackageMap(folder);
     ContextDirectory contextDirectory = new ContextDirectory(
-        analysisServer.defaultSdk, folder, pubspecFile);
+        analysisServer.defaultSdk, resourceProvider, folder, packageMap);
     analysisServer.folderMap[folder] = contextDirectory;
-    analysisServer.schedulePerformAnalysisOperation(contextDirectory.context);
+    AnalysisContext context = contextDirectory.context;
+    context.analysisOptions = new AnalysisOptionsImpl.con1(defaultOptions);
+    analysisServer.schedulePerformAnalysisOperation(context);
   }
 
+  @override
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
-    analysisServer.folderMap[contextFolder].context.applyChanges(changeSet);
+    AnalysisContext context = analysisServer.folderMap[contextFolder].context;
+    context.applyChanges(changeSet);
+    analysisServer.schedulePerformAnalysisOperation(context);
+  }
+
+  @override
+  void removeContext(Folder folder) {
+    analysisServer.folderMap.remove(folder);
   }
 }
 
@@ -62,12 +84,23 @@
   final ServerCommunicationChannel channel;
 
   /**
+   * The [Index] for this server.
+   */
+  final Index index;
+
+  /**
    * [ContextDirectoryManager] which handles the mapping from analysis roots
    * to context directories.
    */
   AnalysisServerContextDirectoryManager contextDirectoryManager;
 
   /**
+   * Provider which is used to determine the mapping from package name to
+   * package folder.
+   */
+  final PackageMapProvider packageMapProvider;
+
+  /**
    * A flag indicating whether the server is running.  When false, contexts
    * will no longer be added to [contextWorkQueue], and [performOperation] will
    * discard any tasks it finds on [contextWorkQueue].
@@ -88,7 +121,8 @@
   /**
    * A table mapping [Folder]s to the [ContextDirectory]s associated with them.
    */
-  final Map<Folder, ContextDirectory> folderMap = <Folder, ContextDirectory>{};
+  final Map<Folder, ContextDirectory> folderMap =
+      new HashMap<Folder, ContextDirectory>();
 
   /**
    * A queue of the operations to perform in this server.
@@ -102,13 +136,14 @@
   /**
    * A set of the [ServerService]s to send notifications for.
    */
-  Set<ServerService> serverServices = new Set<ServerService>();
+  Set<ServerService> serverServices = new HashSet<ServerService>();
 
   /**
    * A table mapping [AnalysisService]s to the file paths for which these
    * notifications should be sent.
    */
-  Map<AnalysisService, Set<String>> analysisServices = <AnalysisService, Set<String>>{};
+  Map<AnalysisService, Set<String>> analysisServices =
+      new HashMap<AnalysisService, Set<String>>();
 
   /**
    * True if any exceptions thrown by analysis should be propagated up the call
@@ -126,24 +161,17 @@
    * running a full analysis server.
    */
   AnalysisServer(this.channel, ResourceProvider resourceProvider,
-      {this.rethrowExceptions: true}) {
+      this.packageMapProvider, this.index, {this.rethrowExceptions: true}) {
     operationQueue = new ServerOperationQueue(this);
     contextDirectoryManager = new AnalysisServerContextDirectoryManager(this, resourceProvider);
     AnalysisEngine.instance.logger = new AnalysisLogger();
     running = true;
-    Notification notification = new Notification(NOTIFICATION_CONNECTED);
+    Notification notification = new Notification(SERVER_CONNECTED);
     channel.sendNotification(notification);
     channel.listen(handleRequest, onDone: done, onError: error);
   }
 
   /**
-   * Schedules analysis of the given context.
-   */
-  void schedulePerformAnalysisOperation(AnalysisContext context) {
-    scheduleOperation(new PerformAnalysisOperation(context, false));
-  }
-
-  /**
    * Schedules execution of the given [ServerOperation].
    */
   void scheduleOperation(ServerOperation operation) {
@@ -155,6 +183,81 @@
   }
 
   /**
+   * Schedules analysis of the given context.
+   */
+  void schedulePerformAnalysisOperation(AnalysisContext context) {
+    scheduleOperation(new PerformAnalysisOperation(context, false));
+  }
+
+  /**
+   * Send the given [notification] to the client.
+   */
+  void sendNotification(Notification notification) {
+    channel.sendNotification(notification);
+  }
+
+  /**
+   * Set the priority files to the given [files].
+   */
+  void setPriorityFiles(Request request, List<String> files) {
+    Map<AnalysisContext, List<Source>> sourceMap =
+        new HashMap<AnalysisContext, List<Source>>();
+    List<String> unanalyzed = new List<String>();
+    files.forEach((file) {
+      AnalysisContext analysisContext = _getAnalysisContext(file);
+      if (analysisContext == null) {
+        unanalyzed.add(file);
+      } else {
+        List<Source> sourceList = sourceMap[analysisContext];
+        if (sourceList == null) {
+          sourceList = <Source>[];
+          sourceMap[analysisContext] = sourceList;
+        }
+        sourceList.add(_getSource(file));
+      }
+    });
+    if (unanalyzed.isNotEmpty) {
+      StringBuffer buffer = new StringBuffer();
+      buffer.writeAll(unanalyzed, ', ');
+      throw new RequestFailure(new Response.unanalyzedPriorityFiles(request,
+          buffer.toString()));
+    }
+    folderMap.forEach((Folder folder, ContextDirectory directory) {
+      AnalysisContext context = directory.context;
+      List<Source> sourceList = sourceMap[context];
+      if (sourceList == null) {
+        sourceList = Source.EMPTY_ARRAY;
+      }
+      context.analysisPriorityOrder = sourceList;
+    });
+  }
+
+  /**
+   * Use the given updaters to update the values of the options in every
+   * existing analysis context.
+   */
+  void updateOptions(List<OptionUpdater> optionUpdaters) {
+    //
+    // Update existing contexts.
+    //
+    folderMap.forEach((Folder folder, ContextDirectory directory) {
+      AnalysisContext context = directory.context;
+      AnalysisOptionsImpl options = new AnalysisOptionsImpl.con1(context.analysisOptions);
+      optionUpdaters.forEach((OptionUpdater optionUpdater) {
+        optionUpdater(options);
+      });
+      context.analysisOptions = options;
+    });
+    //
+    // Update the defaults used to create new contexts.
+    //
+    AnalysisOptionsImpl options = contextDirectoryManager.defaultOptions;
+    optionUpdaters.forEach((OptionUpdater optionUpdater) {
+      optionUpdater(options);
+    });
+  }
+
+  /**
    * Adds the given [ServerOperation] to the queue, but does not schedule
    * operations execution.
    */
@@ -166,6 +269,7 @@
    * The socket from which requests are being read has been closed.
    */
   void done() {
+    index.stop();
     running = false;
   }
 
@@ -177,6 +281,23 @@
     running = false;
   }
 
+// TODO(brianwilkerson) Add the following method after 'prioritySources' has
+// been added to InternalAnalysisContext.
+//  /**
+//   * Return a list containing the full names of all of the sources that are
+//   * priority sources.
+//   */
+//  List<String> getPriorityFiles() {
+//    List<String> priorityFiles = new List<String>();
+//    folderMap.values.forEach((ContextDirectory directory) {
+//      InternalAnalysisContext context = directory.context;
+//      context.prioritySources.forEach((Source source) {
+//        priorityFiles.add(source.fullName);
+//      });
+//    });
+//    return priorityFiles;
+//  }
+
   /**
    * Handle a [request] that was read from the communication channel.
    */
@@ -250,11 +371,7 @@
    * the current context being analyzed or `null` if analysis is complete.
    */
   void sendStatusNotification(String contextId) {
-//    if (contextId == lastStatusNotificationContextId) {
-//      return;
-//    }
-//    lastStatusNotificationContextId = contextId;
-    Notification notification = new Notification(NOTIFICATION_STATUS);
+    Notification notification = new Notification(SERVER_STATUS);
     Map<String, Object> analysis = new Map();
     if (contextId != null) {
       analysis['analyzing'] = true;
@@ -297,6 +414,10 @@
   void updateContent(Map<String, ContentChange> changes) {
     changes.forEach((file, change) {
       AnalysisContext analysisContext = _getAnalysisContext(file);
+      // TODO(paulberry): handle the case where a file is referred to by more
+      // than one context (e.g package A depends on package B using a local
+      // path, user has both packages open for editing in separate contexts,
+      // and user modifies a file in package B).
       if (analysisContext != null) {
         Source source = _getSource(file);
         if (change.offset == null) {
@@ -325,10 +446,22 @@
           List<AnalysisError> errors = analysisContext.getErrors(source).errors;
           sendAnalysisNotificationErrors(this, file, errors);
         }
-        if (service == AnalysisService.HIGHLIGHTS) {
-          CompilationUnit dartUnit = test_getResolvedCompilationUnit(file);
+        // Dart unit notifications.
+        if (AnalysisEngine.isDartFileName(file)) {
+          CompilationUnit dartUnit = getResolvedCompilationUnitToResendNotification(file);
           if (dartUnit != null) {
-            sendAnalysisNotificationHighlights(this, file, dartUnit);
+            switch (service) {
+              case AnalysisService.HIGHLIGHTS:
+                sendAnalysisNotificationHighlights(this, file, dartUnit);
+                break;
+              case AnalysisService.NAVIGATION:
+                // TODO(scheglov) consider support for one unit in 2+ libraries
+                sendAnalysisNotificationNavigation(this, file, dartUnit);
+                break;
+              case AnalysisService.OUTLINE:
+                sendAnalysisNotificationOutline(this, file, dartUnit);
+                break;
+            }
           }
         }
       }
@@ -359,6 +492,33 @@
   }
 
   /**
+   * Returns the [CompilationUnit] of the Dart file with the given [path] that
+   * should be used to resend notifications for already resolved unit.
+   * Returns `null` if the file is not a part of any context, library has not
+   * been yet resolved, or any problem happened.
+   */
+  CompilationUnit getResolvedCompilationUnitToResendNotification(String path) {
+    // prepare AnalysisContext
+    AnalysisContext context = _getAnalysisContext(path);
+    if (context == null) {
+      return null;
+    }
+    // prepare sources
+    Source unitSource = _getSource(path);
+    List<Source> librarySources = context.getLibrariesContaining(unitSource);
+    if (librarySources.isEmpty) {
+      return null;
+    }
+    // if library has not been resolved yet, the unit will be resolved later
+    Source librarySource = librarySources[0];
+    if (context.getLibraryElement(librarySource) == null) {
+      return null;
+    }
+    // if library has been already resolved, resolve unit
+    return context.resolveCompilationUnit2(unitSource, librarySource);
+  }
+
+  /**
    * Return the [CompilationUnit] of the Dart file with the given [path].
    * Return `null` if the file is not a part of any context.
    */
@@ -386,13 +546,6 @@
   }
 
   /**
-   * Send the given [notification] to the client.
-   */
-  void sendNotification(Notification notification) {
-    channel.sendNotification(notification);
-  }
-
-  /**
    * Schedules [performOperation] exection.
    */
   void _schedulePerformOperation() {
@@ -428,30 +581,32 @@
  */
 class ContextDirectory {
   /**
+   * The root [ResourceProvider] of this [ContextDirectory].
+   */
+  final ResourceProvider _resourceProvider;
+
+  /**
    * The root [Folder] of this [ContextDirectory].
    */
   final Folder _folder;
 
   /**
-   * The `pubspec.yaml` file in [_folder], or null if there isn't one.
-   */
-  File _pubspecFile;
-
-  /**
    * The [AnalysisContext] of this [_folder].
    */
   AnalysisContext _context;
 
-  ContextDirectory(DartSdk sdk, this._folder, this._pubspecFile) {
+  ContextDirectory(DartSdk sdk, this._resourceProvider, this._folder,
+      Map<String, List<Folder>> packageMap) {
     // create AnalysisContext
     _context = AnalysisEngine.instance.createAnalysisContext();
     // TODO(scheglov) replace FileUriResolver with an Resource based resolver
-    // TODO(scheglov) create packages resolver
-    _context.sourceFactory = new SourceFactory([
-      new DartUriResolver(sdk),
-      new FileUriResolver(),
-      // new PackageUriResolver(),
-    ]);
+    List<UriResolver> resolvers = <UriResolver>[new DartUriResolver(sdk),
+        new ResourceUriResolver(_resourceProvider),
+    ];
+    if (packageMap != null) {
+      resolvers.add(new PackageMapUriResolver(_resourceProvider, packageMap));
+    }
+    _context.sourceFactory = new SourceFactory(resolvers);
   }
 
   /**
@@ -460,6 +615,7 @@
   AnalysisContext get context => _context;
 }
 
+typedef void OptionUpdater(AnalysisOptionsImpl options);
 
 /**
  * An enumeration of the services provided by the server domain.
diff --git a/pkg/analysis_server/lib/src/computer/computer_highlights.dart b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
index 06a3db4..f1cf201 100644
--- a/pkg/analysis_server/lib/src/computer/computer_highlights.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_highlights.dart
@@ -4,6 +4,7 @@
 
 library computer.highlights;
 
+import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
@@ -263,7 +264,7 @@
   }
 
   void _addRegion(int offset, int length, HighlightType type) {
-    _regions.add({'offset': offset, 'length': length, 'type': type.name});
+    _regions.add({OFFSET: offset, LENGTH: length, TYPE: type.name});
   }
 
   bool _addRegion_node(AstNode node, HighlightType type) {
@@ -510,8 +511,5 @@
 
   final String name;
 
-  @override
-  String toString() => name;
-
   const HighlightType(this.name);
 }
diff --git a/pkg/analysis_server/lib/src/computer/computer_navigation.dart b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
index d329425..27aca2b 100644
--- a/pkg/analysis_server/lib/src/computer/computer_navigation.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_navigation.dart
@@ -4,11 +4,14 @@
 
 library computer.navigation;
 
+import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/element.dart';
 import 'package:analyzer/src/generated/scanner.dart';
 import 'package:analyzer/src/generated/source.dart';
 
+import 'element.dart' as computer;
+
 
 /**
  * A computer for navigation regions in a Dart [CompilationUnit].
@@ -16,7 +19,7 @@
 class DartUnitNavigationComputer {
   final CompilationUnit _unit;
 
-  List<Map<String, Object>> _regions = <Map<String, Object>>[];
+  final List<Map<String, Object>> _regions = <Map<String, Object>>[];
 
   DartUnitNavigationComputer(this._unit);
 
@@ -34,12 +37,24 @@
       return;
     }
     _regions.add({
-      'offset': offset,
-      'length': length,
-      'targets': [target]
+      OFFSET: offset,
+      LENGTH: length,
+      TARGETS: [target]
     });
   }
 
+  void _addRegionForNode(AstNode node, Element element) {
+    int offset = node.offset;
+    int length = node.length;
+    _addRegion(offset, length, element);
+  }
+
+  void _addRegionForToken(Token token, Element element) {
+    int offset = token.offset;
+    int length = token.length;
+    _addRegion(offset, length, element);
+  }
+
   void _addRegion_nodeStart_nodeEnd(AstNode a, AstNode b, Element element) {
     int offset = a.offset;
     int length = b.end - offset;
@@ -58,18 +73,6 @@
     _addRegion(offset, length, element);
   }
 
-  void _addRegionForNode(AstNode node, Element element) {
-    int offset = node.offset;
-    int length = node.length;
-    _addRegion(offset, length, element);
-  }
-
-  void _addRegionForToken(Token token, Element element) {
-    int offset = token.offset;
-    int length = token.length;
-    _addRegion(offset, length, element);
-  }
-
   /**
    * Returns the JSON for the given [Element], maybe `null` if `null` was given.
    */
@@ -94,10 +97,10 @@
     }
     // return as JSON
     return {
-      'file': source.fullName,
-      'offset': offset,
-      'length': length,
-      'elementId': element.location.encoding
+      FILE: source.fullName,
+      OFFSET: offset,
+      LENGTH: length,
+      ELEMENT: new computer.Element.fromEngine(element).toJson()
     };
   }
 }
@@ -131,7 +134,8 @@
         lastNode = firstNode;
       }
       if (firstNode != null && lastNode != null) {
-        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode, node.element);
+        computer._addRegion_nodeStart_nodeEnd(firstNode, lastNode,
+            node.element);
       }
     }
     return super.visitConstructorDeclaration(node);
@@ -175,13 +179,15 @@
 
   @override
   visitPartDirective(PartDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri, node.element);
+    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.uri,
+        node.element);
     return super.visitPartDirective(node);
   }
 
   @override
   visitPartOfDirective(PartOfDirective node) {
-    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName, node.element);
+    computer._addRegion_tokenStart_nodeEnd(node.keyword, node.libraryName,
+        node.element);
     return super.visitPartOfDirective(node);
   }
 
diff --git a/pkg/analysis_server/lib/src/computer/computer_outline.dart b/pkg/analysis_server/lib/src/computer/computer_outline.dart
index 3609759..d997f8c 100644
--- a/pkg/analysis_server/lib/src/computer/computer_outline.dart
+++ b/pkg/analysis_server/lib/src/computer/computer_outline.dart
@@ -4,8 +4,10 @@
 
 library computer.outline;
 
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
 
 
 /**
@@ -20,11 +22,11 @@
    * Returns the computed outline, not `null`.
    */
   Map<String, Object> compute() {
-    _Outline unitOutline = _newUnitOutline();
+    Outline unitOutline = _newUnitOutline();
     for (CompilationUnitMember unitMember in _unit.declarations) {
       if (unitMember is ClassDeclaration) {
         ClassDeclaration classDeclaration = unitMember;
-        _Outline classOutline = _newClassOutline(unitOutline, classDeclaration);
+        Outline classOutline = _newClassOutline(unitOutline, classDeclaration);
         for (ClassMember classMember in classDeclaration.members) {
           if (classMember is ConstructorDeclaration) {
             ConstructorDeclaration constructorDeclaration = classMember;
@@ -35,9 +37,11 @@
             VariableDeclarationList fields = fieldDeclaration.fields;
             if (fields != null) {
               TypeName fieldType = fields.type;
-              String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+              String fieldTypeName = fieldType != null ? fieldType.toSource() :
+                  '';
               for (VariableDeclaration field in fields.variables) {
-                _newVariableOutline(classOutline, fieldTypeName, _OutlineKind.FIELD, field, fieldDeclaration.isStatic);
+                _newVariableOutline(classOutline, fieldTypeName,
+                    ElementKind.FIELD, field, fieldDeclaration.isStatic);
               }
             }
           }
@@ -52,15 +56,16 @@
         VariableDeclarationList fields = fieldDeclaration.variables;
         if (fields != null) {
           TypeName fieldType = fields.type;
-          String fieldTypeName = fieldType != null ? fieldType.toSource() : "";
+          String fieldTypeName = fieldType != null ? fieldType.toSource() : '';
           for (VariableDeclaration field in fields.variables) {
-            _newVariableOutline(unitOutline, fieldTypeName, _OutlineKind.TOP_LEVEL_VARIABLE, field, false);
+            _newVariableOutline(unitOutline, fieldTypeName,
+                ElementKind.TOP_LEVEL_VARIABLE, field, false);
           }
         }
       }
       if (unitMember is FunctionDeclaration) {
         FunctionDeclaration functionDeclaration = unitMember;
-        _newFunctionOutline(unitOutline, functionDeclaration);
+        _newFunctionOutline(unitOutline, functionDeclaration, true);
       }
       if (unitMember is ClassTypeAlias) {
         ClassTypeAlias alias = unitMember;
@@ -74,7 +79,7 @@
     return unitOutline.toJson();
   }
 
-  void _addLocalFunctionOutlines(_Outline parent, FunctionBody body) {
+  void _addLocalFunctionOutlines(Outline parent, FunctionBody body) {
     body.accept(new _LocalFunctionOutlinesVisitor(this, parent));
   }
 
@@ -125,149 +130,209 @@
     return new _SourceRegion(prevSiblingEnd, endOffset - prevSiblingEnd);
   }
 
-  _Outline _newClassOutline(_Outline parent, ClassDeclaration classDeclaration) {
+  Outline _newClassOutline(Outline parent, ClassDeclaration classDeclaration) {
     SimpleIdentifier nameNode = classDeclaration.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(classDeclaration);
-    _Outline outline = new _Outline(
-        _OutlineKind.CLASS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        classDeclaration.isAbstract, false,
-        null, null);
+    Element element = new Element(ElementKind.CLASS, name, nameNode.offset,
+        nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        classDeclaration), isAbstract: classDeclaration.isAbstract);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     return outline;
   }
 
-  void _newClassTypeAlias(_Outline parent, ClassTypeAlias alias) {
+  void _newClassTypeAlias(Outline parent, ClassTypeAlias alias) {
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(alias);
-    _Outline outline = new _Outline(
-        _OutlineKind.CLASS_TYPE_ALIAS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        alias.isAbstract, false,
-        null, null);
+    Element element = new Element(ElementKind.CLASS_TYPE_ALIAS, name,
+        nameNode.offset, nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        alias), isAbstract: alias.isAbstract);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
 
-  void _newConstructorOutline(_Outline parent, ConstructorDeclaration constructor) {
+  void _newConstructorOutline(Outline parent,
+      ConstructorDeclaration constructor) {
     Identifier returnType = constructor.returnType;
     String name = returnType.name;
     int offset = returnType.offset;
     int length = returnType.length;
     SimpleIdentifier constructorNameNode = constructor.name;
+    bool isPrivate = false;
     if (constructorNameNode != null) {
       String constructorName = constructorNameNode.name;
-      name += ".${constructorName}";
+      isPrivate = Identifier.isPrivateName(constructorName);
+      name += '.${constructorName}';
       offset = constructorNameNode.offset;
       length = constructorNameNode.length;
     }
     _SourceRegion sourceRegion = _getSourceRegion(constructor);
     FormalParameterList parameters = constructor.parameters;
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    _Outline outline = new _Outline(
-        _OutlineKind.CONSTRUCTOR, name,
-        offset, length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, null);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    Element element = new Element(ElementKind.CONSTRUCTOR, name, offset, length,
+        isPrivate, _isDeprecated(constructor), parameters: parametersStr);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, constructor.body);
   }
 
-  void _newFunctionOutline(_Outline parent, FunctionDeclaration function) {
+  void _newFunctionOutline(Outline parent, FunctionDeclaration function,
+      bool isStatic) {
     TypeName returnType = function.returnType;
     SimpleIdentifier nameNode = function.name;
     String name = nameNode.name;
     FunctionExpression functionExpression = function.functionExpression;
     FormalParameterList parameters = functionExpression.parameters;
-    _OutlineKind kind;
+    ElementKind kind;
     if (function.isGetter) {
-      kind = _OutlineKind.GETTER;
+      kind = ElementKind.GETTER;
     } else if (function.isSetter) {
-      kind = _OutlineKind.SETTER;
+      kind = ElementKind.SETTER;
     } else {
-      kind = _OutlineKind.FUNCTION;
+      kind = ElementKind.FUNCTION;
     }
     _SourceRegion sourceRegion = _getSourceRegion(function);
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(function), parameters:
+        parametersStr, returnType: returnTypeStr, isStatic: isStatic);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, functionExpression.body);
   }
 
-  void _newFunctionTypeAliasOutline(_Outline parent, FunctionTypeAlias alias) {
+  void _newFunctionTypeAliasOutline(Outline parent, FunctionTypeAlias alias) {
     TypeName returnType = alias.returnType;
     SimpleIdentifier nameNode = alias.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(alias);
     FormalParameterList parameters = alias.parameters;
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        _OutlineKind.FUNCTION_TYPE_ALIAS, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, false,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(ElementKind.FUNCTION_TYPE_ALIAS, name,
+        nameNode.offset, nameNode.length, Identifier.isPrivateName(name), _isDeprecated(
+        alias), parameters: parametersStr, returnType: returnTypeStr);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
 
-  void _newMethodOutline(_Outline parent, MethodDeclaration method) {
+  void _newMethodOutline(Outline parent, MethodDeclaration method) {
     TypeName returnType = method.returnType;
     SimpleIdentifier nameNode = method.name;
     String name = nameNode.name;
     FormalParameterList parameters = method.parameters;
-    _OutlineKind kind;
+    ElementKind kind;
     if (method.isGetter) {
-      kind = _OutlineKind.GETTER;
+      kind = ElementKind.GETTER;
     } else if (method.isSetter) {
-      kind = _OutlineKind.SETTER;
+      kind = ElementKind.SETTER;
     } else {
-      kind = _OutlineKind.METHOD;
+      kind = ElementKind.METHOD;
     }
     _SourceRegion sourceRegion = _getSourceRegion(method);
-    String parametersStr = parameters != null ? parameters.toSource() : "";
-    String returnTypeStr = returnType != null ? returnType.toSource() : "";
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        method.isAbstract, method.isStatic,
-        parametersStr, returnTypeStr);
+    String parametersStr = parameters != null ? parameters.toSource() : '';
+    String returnTypeStr = returnType != null ? returnType.toSource() : '';
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(method), parameters:
+        parametersStr, returnType: returnTypeStr, isAbstract: method.isAbstract,
+        isStatic: method.isStatic);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
     _addLocalFunctionOutlines(outline, method.body);
   }
 
-  _Outline _newUnitOutline() {
-    return new _Outline(
-        _OutlineKind.COMPILATION_UNIT, "<unit>",
-        _unit.offset, _unit.length,
-        _unit.offset, _unit.length,
-        false, false,
-        null, null);
+  Outline _newUnitOutline() {
+    Element element = new Element(ElementKind.COMPILATION_UNIT, '<unit>',
+        _unit.offset, _unit.length, false, false);
+    return new Outline(element, _unit.offset, _unit.length);
   }
 
-  void _newVariableOutline(_Outline parent, String typeName, _OutlineKind kind, VariableDeclaration variable, bool isStatic) {
+  void _newVariableOutline(Outline parent, String typeName, ElementKind kind,
+      VariableDeclaration variable, bool isStatic) {
     SimpleIdentifier nameNode = variable.name;
     String name = nameNode.name;
     _SourceRegion sourceRegion = _getSourceRegion(variable);
-    _Outline outline = new _Outline(
-        kind, name,
-        nameNode.offset, nameNode.length,
-        sourceRegion.offset, sourceRegion.length,
-        false, isStatic,
-        null, typeName);
+    Element element = new Element(kind, name, nameNode.offset, nameNode.length,
+        Identifier.isPrivateName(name), _isDeprecated(variable), returnType: typeName,
+        isStatic: isStatic, isConst: variable.isConst, isFinal: variable.isFinal);
+    Outline outline = new Outline(element, sourceRegion.offset,
+        sourceRegion.length);
     parent.children.add(outline);
   }
+
+  /**
+   * Returns `true` if the given [element] is not `null` and deprecated.
+   */
+  static bool _isDeprecated(Declaration declaration) {
+    engine.Element element = declaration.element;
+    return element != null && element.isDeprecated;
+  }
+}
+
+
+/**
+ * An element outline.
+ */
+class Outline {
+  static const List<Outline> EMPTY_ARRAY = const <Outline>[];
+
+  /**
+   * The children of the node.
+   * The field will be omitted in JSON if the node has no children.
+   */
+  final List<Outline> children = <Outline>[];
+
+  /**
+   * A description of the element represented by this node.
+   */
+  final Element element;
+
+  /**
+   * The length of the element.
+   */
+  final int length;
+
+  /**
+   * The offset of the first character of the element.
+   */
+  final int offset;
+
+  Outline(this.element, this.offset, this.length);
+
+  factory Outline.fromJson(Map<String, Object> map) {
+    Element element = new Element.fromJson(map[ELEMENT]);
+    Outline outline = new Outline(element, map[OFFSET], map[LENGTH]);
+    // add children
+    List<Map<String, Object>> childrenMaps = map[CHILDREN];
+    if (childrenMaps != null) {
+      childrenMaps.forEach((childMap) {
+        outline.children.add(new Outline.fromJson(childMap));
+      });
+    }
+    // done
+    return outline;
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = {
+      ELEMENT: element.toJson(),
+      OFFSET: offset,
+      LENGTH: length
+    };
+    if (children.isNotEmpty) {
+      json[CHILDREN] = children.map((child) => child.toJson()).toList();
+    }
+    return json;
+  }
 }
 
 
@@ -276,98 +341,22 @@
  */
 class _LocalFunctionOutlinesVisitor extends RecursiveAstVisitor {
   final DartUnitOutlineComputer outlineComputer;
-  final _Outline parent;
+  final Outline parent;
 
   _LocalFunctionOutlinesVisitor(this.outlineComputer, this.parent);
 
   @override
   visitFunctionDeclaration(FunctionDeclaration node) {
-    outlineComputer._newFunctionOutline(parent, node);
+    outlineComputer._newFunctionOutline(parent, node, false);
   }
 }
 
 
-
 /**
  * A range of characters.
  */
 class _SourceRegion {
-  final int offset;
   final int length;
+  final int offset;
   _SourceRegion(this.offset, this.length);
 }
-
-
-/**
- * Element outline kinds.
- */
-class _OutlineKind {
-  static const _OutlineKind CLASS = const _OutlineKind('CLASS');
-  static const _OutlineKind CLASS_TYPE_ALIAS = const _OutlineKind('CLASS_TYPE_ALIAS');
-  static const _OutlineKind COMPILATION_UNIT = const _OutlineKind('COMPILATION_UNIT');
-  static const _OutlineKind CONSTRUCTOR = const _OutlineKind('CONSTRUCTOR');
-  static const _OutlineKind GETTER = const _OutlineKind('GETTER');
-  static const _OutlineKind FIELD = const _OutlineKind('FIELD');
-  static const _OutlineKind FUNCTION = const _OutlineKind('FUNCTION');
-  static const _OutlineKind FUNCTION_TYPE_ALIAS = const _OutlineKind('FUNCTION_TYPE_ALIAS');
-  static const _OutlineKind LIBRARY = const _OutlineKind('LIBRARY');
-  static const _OutlineKind METHOD = const _OutlineKind('METHOD');
-  static const _OutlineKind SETTER = const _OutlineKind('SETTER');
-  static const _OutlineKind TOP_LEVEL_VARIABLE = const _OutlineKind('TOP_LEVEL_VARIABLE');
-  static const _OutlineKind UNKNOWN = const _OutlineKind('UNKNOWN');
-  static const _OutlineKind UNIT_TEST_CASE = const _OutlineKind('UNIT_TEST_CASE');
-  static const _OutlineKind UNIT_TEST_GROUP = const _OutlineKind('UNIT_TEST_GROUP');
-
-  final String name;
-
-  const _OutlineKind(this.name);
-}
-
-
-/**
- * An element outline.
- */
-class _Outline {
-  static const List<_Outline> EMPTY_ARRAY = const <_Outline>[];
-
-  final _OutlineKind kind;
-  final String name;
-  final int nameOffset;
-  final int nameLength;
-  final int elementOffset;
-  final int elementLength;
-  final bool isAbstract;
-  final bool isStatic;
-  final String parameters;
-  final String returnType;
-  final List<_Outline> children = <_Outline>[];
-
-  _Outline(this.kind, this.name,
-           this.nameOffset, this.nameLength,
-           this.elementOffset, this.elementLength,
-           this.isAbstract, this.isStatic,
-           this.parameters, this.returnType);
-
-  Map<String, Object> toJson() {
-    Map<String, Object> json = {
-      KIND: kind.name,
-      NAME: name,
-      NAME_OFFSET: nameOffset,
-      NAME_LENGTH: nameLength,
-      ELEMENT_OFFSET: elementOffset,
-      ELEMENT_LENGTH: elementLength,
-      IS_ABSTRACT: isAbstract,
-      IS_STATIC: isStatic
-    };
-    if (parameters != null) {
-      json[PARAMETERS] = parameters;
-    }
-    if (returnType != null) {
-      json[RETURN_TYPE] = returnType;
-    }
-    if (children.isNotEmpty) {
-      json[CHILDREN] = children.map((child) => child.toJson()).toList();
-    }
-    return json;
-  }
-}
diff --git a/pkg/analysis_server/lib/src/computer/element.dart b/pkg/analysis_server/lib/src/computer/element.dart
new file mode 100644
index 0000000..9b23a75
--- /dev/null
+++ b/pkg/analysis_server/lib/src/computer/element.dart
@@ -0,0 +1,286 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library computer.element;
+
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
+
+
+/**
+ * Information about an element.
+ */
+class Element {
+  static const List<Element> EMPTY_ARRAY = const <Element>[];
+
+  static const int FLAG_ABSTRACT = 0x01;
+  static const int FLAG_CONST = 0x02;
+  static const int FLAG_DEPRECATED = 0x20;
+  static const int FLAG_FINAL = 0x04;
+  static const int FLAG_PRIVATE = 0x10;
+  static const int FLAG_STATIC = 0x08;
+
+  final bool isAbstract;
+  final bool isConst;
+  final bool isDeprecated;
+  final bool isFinal;
+  final bool isPrivate;
+  final bool isStatic;
+
+  /**
+   * The kind of the element.
+   */
+  final ElementKind kind;
+
+  /**
+   * The length of the name of the element.
+   */
+  final int length;
+
+  /**
+   * The name of the element. This is typically used as the label in the outline.
+   */
+  final String name;
+
+  /**
+   * The offset of the name of the element.
+   */
+  final int offset;
+
+  /**
+   * The parameter list for the element.
+   * If the element is not a method or function then `null`.
+   * If the element has zero parameters, then `()`.
+   */
+  final String parameters;
+
+  /**
+   * The return type of the element.
+   * If the element is not a method or function then `null`.
+   * If the element does not have a declared return type, then an empty string.
+   */
+  final String returnType;
+
+  Element(this.kind, this.name, this.offset, this.length, this.isPrivate,
+      this.isDeprecated, {this.parameters, this.returnType, this.isAbstract: false,
+      this.isConst: false, this.isFinal: false, this.isStatic: false});
+
+  factory Element.fromEngine(engine.Element element) {
+    String name = element.displayName;
+    int nameLength = name != null ? name.length : 0;
+    String elementParameters = _getParametersString(element);
+    String elementReturnType = _getReturnTypeString(element);
+    return new Element(ElementKind.valueOfEngine(element.kind), name,
+        element.nameOffset, nameLength, element.isPrivate, element.isDeprecated,
+        parameters: elementParameters, returnType: elementReturnType, isAbstract:
+        _isAbstract(element), isConst: _isConst(element), isFinal: _isFinal(element),
+        isStatic: _isStatic(element));
+  }
+
+  factory Element.fromJson(Map<String, Object> map) {
+    ElementKind kind = ElementKind.valueOf(map[KIND]);
+    int flags = map[FLAGS];
+    return new Element(kind, map[NAME], map[OFFSET], map[LENGTH], _hasFlag(
+        flags, FLAG_PRIVATE), _hasFlag(flags, FLAG_DEPRECATED), parameters:
+        map[PARAMETERS], returnType: map[RETURN_TYPE], isAbstract: _hasFlag(flags,
+        FLAG_ABSTRACT), isConst: _hasFlag(flags, FLAG_CONST), isFinal: _hasFlag(flags,
+        FLAG_FINAL), isStatic: _hasFlag(flags, FLAG_STATIC));
+  }
+
+  int get flags {
+    int flags = 0;
+    if (isAbstract) flags |= FLAG_ABSTRACT;
+    if (isConst) flags |= FLAG_CONST;
+    if (isFinal) flags |= FLAG_FINAL;
+    if (isStatic) flags |= FLAG_STATIC;
+    if (isPrivate) flags |= FLAG_PRIVATE;
+    if (isDeprecated) flags |= FLAG_DEPRECATED;
+    return flags;
+  }
+
+  Map<String, Object> toJson() {
+    Map<String, Object> json = {
+      KIND: kind.name,
+      NAME: name,
+      OFFSET: offset,
+      LENGTH: length,
+      FLAGS: flags
+    };
+    if (parameters != null) {
+      json[PARAMETERS] = parameters;
+    }
+    if (returnType != null) {
+      json[RETURN_TYPE] = returnType;
+    }
+    return json;
+  }
+
+  static String _getParametersString(engine.Element element) {
+    // TODO(scheglov) expose the corresponding feature from ExecutableElement
+    if (element is engine.ExecutableElement) {
+      var sb = new StringBuffer();
+      String closeOptionalString = '';
+      for (var parameter in element.parameters) {
+        if (sb.isNotEmpty) {
+          sb.write(', ');
+        }
+        if (closeOptionalString.isEmpty) {
+          if (parameter.kind == engine.ParameterKind.NAMED) {
+            sb.write('{');
+            closeOptionalString = '}';
+          }
+          if (parameter.kind == engine.ParameterKind.POSITIONAL) {
+            sb.write('[');
+            closeOptionalString = ']';
+          }
+        }
+        sb.write(parameter.toString());
+      }
+      sb.write(closeOptionalString);
+      return '(' + sb.toString() + ')';
+    } else {
+      return null;
+    }
+  }
+
+  static String _getReturnTypeString(engine.Element element) {
+    if ((element is engine.ExecutableElement)) {
+      return element.returnType.toString();
+    } else {
+      return null;
+    }
+  }
+
+  static bool _hasFlag(int flags, int flag) => (flags & flag) != 0;
+
+  static bool _isAbstract(engine.Element element) {
+    // TODO(scheglov) add isAbstract to Element API
+    if (element is engine.ClassElement) {
+      return element.isAbstract;
+    }
+    if (element is engine.MethodElement) {
+      return element.isAbstract;
+    }
+    if (element is engine.PropertyAccessorElement) {
+      return element.isAbstract;
+    }
+    return false;
+  }
+
+  static bool _isConst(engine.Element element) {
+    // TODO(scheglov) add isConst to Element API
+    if (element is engine.ConstructorElement) {
+      return element.isConst;
+    }
+    if (element is engine.VariableElement) {
+      return element.isConst;
+    }
+    return false;
+  }
+
+  static bool _isFinal(engine.Element element) {
+    // TODO(scheglov) add isFinal to Element API
+    if (element is engine.VariableElement) {
+      return element.isFinal;
+    }
+    return false;
+  }
+
+  static bool _isStatic(engine.Element element) {
+    // TODO(scheglov) add isStatic to Element API
+    if (element is engine.ExecutableElement) {
+      return element.isStatic;
+    }
+    if (element is engine.PropertyInducingElement) {
+      return element.isStatic;
+    }
+    return false;
+  }
+}
+
+
+/**
+ * An enumeration of the kinds of elements.
+ */
+class ElementKind {
+  static const CLASS = const ElementKind('CLASS');
+  static const CLASS_TYPE_ALIAS = const ElementKind('CLASS_TYPE_ALIAS');
+  static const COMPILATION_UNIT = const ElementKind('COMPILATION_UNIT');
+  static const CONSTRUCTOR = const ElementKind('CONSTRUCTOR');
+  static const FIELD = const ElementKind('FIELD');
+  static const FUNCTION = const ElementKind('FUNCTION');
+  static const FUNCTION_TYPE_ALIAS = const ElementKind('FUNCTION_TYPE_ALIAS');
+  static const GETTER = const ElementKind('GETTER');
+  static const LIBRARY = const ElementKind('LIBRARY');
+  static const METHOD = const ElementKind('METHOD');
+  static const SETTER = const ElementKind('SETTER');
+  static const TOP_LEVEL_VARIABLE = const ElementKind('TOP_LEVEL_VARIABLE');
+  static const UNIT_TEST_CASE = const ElementKind('UNIT_TEST_CASE');
+  static const UNIT_TEST_GROUP = const ElementKind('UNIT_TEST_GROUP');
+  static const UNKNOWN = const ElementKind('UNKNOWN');
+
+  final String name;
+
+  const ElementKind(this.name);
+
+  @override
+  String toString() => name;
+
+  static ElementKind valueOf(String name) {
+    if (CLASS.name == name) return CLASS;
+    if (CLASS_TYPE_ALIAS.name == name) return CLASS_TYPE_ALIAS;
+    if (COMPILATION_UNIT.name == name) return COMPILATION_UNIT;
+    if (CONSTRUCTOR.name == name) return CONSTRUCTOR;
+    if (FIELD.name == name) return FIELD;
+    if (FUNCTION.name == name) return FUNCTION;
+    if (FUNCTION_TYPE_ALIAS.name == name) return FUNCTION_TYPE_ALIAS;
+    if (GETTER.name == name) return GETTER;
+    if (LIBRARY.name == name) return LIBRARY;
+    if (METHOD.name == name) return METHOD;
+    if (SETTER.name == name) return SETTER;
+    if (TOP_LEVEL_VARIABLE.name == name) return TOP_LEVEL_VARIABLE;
+    if (UNIT_TEST_CASE.name == name) return UNIT_TEST_CASE;
+    if (UNIT_TEST_GROUP.name == name) return UNIT_TEST_GROUP;
+    if (UNKNOWN.name == name) return UNKNOWN;
+    throw new ArgumentError('Unknown ElementKind: $name');
+  }
+
+  static ElementKind valueOfEngine(engine.ElementKind kind) {
+    if (kind == engine.ElementKind.CLASS) {
+      return CLASS;
+    }
+    if (kind == engine.ElementKind.COMPILATION_UNIT) {
+      return COMPILATION_UNIT;
+    }
+    if (kind == engine.ElementKind.CONSTRUCTOR) {
+      return CONSTRUCTOR;
+    }
+    if (kind == engine.ElementKind.FIELD) {
+      return FIELD;
+    }
+    if (kind == engine.ElementKind.FUNCTION) {
+      return FUNCTION;
+    }
+    if (kind == engine.ElementKind.FUNCTION_TYPE_ALIAS) {
+      return FUNCTION_TYPE_ALIAS;
+    }
+    if (kind == engine.ElementKind.GETTER) {
+      return GETTER;
+    }
+    if (kind == engine.ElementKind.LIBRARY) {
+      return LIBRARY;
+    }
+    if (kind == engine.ElementKind.METHOD) {
+      return METHOD;
+    }
+    if (kind == engine.ElementKind.SETTER) {
+      return SETTER;
+    }
+    if (kind == engine.ElementKind.TOP_LEVEL_VARIABLE) {
+      return TOP_LEVEL_VARIABLE;
+    }
+    return UNKNOWN;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/constants.dart b/pkg/analysis_server/lib/src/constants.dart
index 32f5d8a..1e1f4fc 100644
--- a/pkg/analysis_server/lib/src/constants.dart
+++ b/pkg/analysis_server/lib/src/constants.dart
@@ -4,75 +4,120 @@
 
 library constants;
 
-
 //
 // Server methods
 //
-const String METHOD_GET_VERSION =              'server.getVersion';
-const String METHOD_SHUTDOWN =                 'server.shutdown';
-const String METHOD_SET_SERVER_SUBSCRIPTIONS = 'server.setSubscriptions';
-
-//
-// Analysis methods
-//
-const String METHOD_GET_FIXES =                  'analysis.getFixes';
-const String METHOD_GET_MINOR_REFACTORINGS =     'analysis.getMinorRefactorings';
-const String METHOD_SET_ANALYSIS_ROOTS =         'analysis.setAnalysisRoots';
-const String METHOD_SET_PRIORITY_FILES =         'analysis.setPriorityFiles';
-const String METHOD_SET_ANALYSIS_SUBSCRIPTIONS = 'analysis.setSubscriptions';
-const String METHOD_UPDATE_CONTENT =             'analysis.updateContent';
-const String METHOD_UPDATE_OPTIONS =             'analysis.updateOptions';
-const String METHOD_UPDATE_SDKS =                'analysis.updateSdks';
+const String SERVER_GET_VERSION = 'server.getVersion';
+const String SERVER_SHUTDOWN = 'server.shutdown';
+const String SERVER_SET_SUBSCRIPTIONS = 'server.setSubscriptions';
 
 //
 // Server notifications
 //
-const String NOTIFICATION_CONNECTED  = 'server.connected';
-const String NOTIFICATION_STATUS =     'server.status';
+const String SERVER_CONNECTED = 'server.connected';
+const String SERVER_ERROR = 'server.error';
+const String SERVER_STATUS = 'server.status';
+
+//
+// Analysis methods
+//
+const String ANALYSIS_SET_ANALYSIS_ROOTS = 'analysis.setAnalysisRoots';
+const String ANALYSIS_SET_PRIORITY_FILES = 'analysis.setPriorityFiles';
+const String ANALYSIS_SET_SUBSCRIPTIONS = 'analysis.setSubscriptions';
+const String ANALYSIS_UPDATE_CONTENT = 'analysis.updateContent';
+const String ANALYSIS_UPDATE_OPTIONS = 'analysis.updateOptions';
+const String ANALYSIS_UPDATE_SDKS = 'analysis.updateSdks';
 
 //
 // Analysis notifications
 //
-const String NOTIFICATION_ERRORS =     'analysis.errors';
-const String NOTIFICATION_HIGHLIGHTS = 'analysis.highlights';
-const String NOTIFICATION_NAVIGATION = 'analysis.navigation';
-const String NOTIFICATION_OUTLINE =    'analysis.outline';
+const String ANALYSIS_ERRORS = 'analysis.errors';
+const String ANALYSIS_HIGHLIGHTS = 'analysis.highlights';
+const String ANALYSIS_NAVIGATION = 'analysis.navigation';
+const String ANALYSIS_OUTLINE = 'analysis.outline';
 
+//
+// Code Completion methods
+//
+const String COMPLETION_GET_SUGGESTIONS = 'completion.getSuggestions';
 
+//
+// Code Completion notifications
+//
+const String COMPLETION_RESULTS = 'completion.results';
+
+//
+// Search methods
+//
+const String SEARCH_FIND_ELEMENT_REFERENCES = 'search.findElementReferences';
+const String SEARCH_FIND_MEMBER_DECLARATIONS = 'search.findMemberDeclarations';
+const String SEARCH_FIND_MEMBER_REFERENCES = 'search.findMemberReferences';
+const String SEARCH_FIND_TOP_LEVEL_DECLARATIONS =
+    'search.findTopLevelDeclarations';
+
+//
+// Search notifications
+//
+const String SEARCH_RESULTS = 'search.results';
+
+//
+// Edit methods
+//
+const String EDIT_APPLY_REFACTORING = 'edit.applyRefactoring';
+const String EDIT_CREATE_REFACTORING = 'edit.createRefactoring';
+const String EDIT_DELETE_REFACTORING = 'edit.deleteRefactoring';
+const String EDIT_GET_ASSISTS = 'edit.getAssists';
+const String EDIT_GET_FIXES = 'edit.getFixes';
+const String EDIT_GET_REFACTORINGS = 'edit.getRefactorings';
+const String EDIT_SET_REFACTORING_OPTIONS = 'edit.setRefactoringOptions';
+
+//
+// Property names
+//
 const String ADDED = 'added';
+const String CHILDREN = 'children';
 const String CONTENT = 'content';
+const String CORRECTION = 'correction';
 const String DEFAULT = 'default';
+const String ELEMENT = 'element';
 const String EXCLUDED = 'excluded';
+const String ERROR_CODE = 'errorCode';
 const String ERRORS = 'errors';
 const String FILE = 'file';
 const String FILES = 'files';
 const String FIXES = 'fixes';
+const String FLAGS = 'flags';
+const String ID = 'id';
 const String INCLUDED = 'included';
+const String IS_ABSTRACT = 'isAbstract';
+const String IS_STATIC = 'isStatic';
+const String KIND = 'kind';
 const String LENGTH = 'length';
+const String MESSAGE = 'message';
+const String NAME = 'name';
 const String NEW_LENGTH = 'newLength';
 const String OFFSET = 'offset';
 const String OLD_LENGTH = 'oldLength';
 const String OPTIONS = 'options';
 const String OUTLINE = 'outline';
+const String PARAMETERS = 'parameters';
+const String PATTERN = 'pattern';
 const String REFACTORINGS = 'refactorings';
 const String REGIONS = 'regions';
 const String REMOVED = 'removed';
+const String RETURN_TYPE = 'returnType';
 const String SUBSCRIPTIONS = 'subscriptions';
+const String TARGETS = 'targets';
+const String TYPE = 'type';
 const String VERSION = 'version';
 
-
-// TODO(scheglov) remove it with ContextDomain
-const String APPLY_CHANGES_NAME = 'context.applyChanges';
-const String GET_FIXES_NAME = 'context.getFixes';
-const String SET_OPTIONS_NAME = 'context.setOptions';
-const String SET_PRIORITY_SOURCES_NAME = 'context.setPrioritySources';
-const String CHANGES_PARAM = 'changes';
-const String CONTEXT_ID_PARAM = 'contextId';
-const String MODIFIED_PARAM = "modified";
-const String SOURCES_PARAM = 'sources';
-const String CACHE_SIZE_OPTION = 'cacheSize';
-const String GENERATE_HINTS_OPTION = 'generateHints';
-const String GENERATE_DART2JS_OPTION = 'generateDart2jsHints';
-const String PROVIDE_ERRORS_OPTION = 'provideErrors';
-const String PROVIDE_NAVIGATION_OPTION = 'provideNavigation';
-const String PROVIDE_OUTLINE_OPTION = 'provideOutline';
+//
+// Analysis option names
+//
+const String ANALYZE_ANGULAR = 'analyzeAngular'; // boolean
+const String ANALYZE_POLYMER = 'analyzePolymer'; // boolean
+const String ENABLE_ASYNC = 'enableAsync'; // boolean
+const String ENABLE_DEFERRED_LOADING = 'enableDeferredLoading'; // boolean
+const String ENABLE_ENUMS = 'enableEnums'; // boolean
+const String GENERATE_DART2JS_HINTS = 'generateDart2jsHints'; // boolean
+const String GENERATE_HINTS = 'generateHints'; // boolean
diff --git a/pkg/analysis_server/lib/src/context_directory_manager.dart b/pkg/analysis_server/lib/src/context_directory_manager.dart
index cadbb0f..9fc3c92 100644
--- a/pkg/analysis_server/lib/src/context_directory_manager.dart
+++ b/pkg/analysis_server/lib/src/context_directory_manager.dart
@@ -5,6 +5,7 @@
 library context.directory.manager;
 
 import 'dart:async';
+import 'dart:collection';
 
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart';
@@ -25,7 +26,7 @@
    * Map from full path to the [Source] object, for each source that has been
    * added to the context.
    */
-  Map<String, Source> sources = <String, Source>{};
+  Map<String, Source> sources = new HashMap<String, Source>();
 }
 
 /**
@@ -34,11 +35,16 @@
  */
 abstract class ContextDirectoryManager {
   /**
+   * File name of pubspec files.
+   */
+  static const String PUBSPEC_NAME = 'pubspec.yaml';
+
+  /**
    * [_ContextDirectoryInfo] object for each included directory in the most
    * recent successful call to [setRoots].
    */
   Map<Folder, _ContextDirectoryInfo> _currentDirectoryInfo =
-      <Folder, _ContextDirectoryInfo>{};
+      new HashMap<Folder, _ContextDirectoryInfo>();
 
   /**
    * The [ResourceProvider] using which paths are converted into [Resource]s.
@@ -54,7 +60,7 @@
   void setRoots(List<String> includedPaths,
                 List<String> excludedPaths) {
     // included
-    Set<Folder> includedFolders = new Set<Folder>();
+    Set<Folder> includedFolders = new HashSet<Folder>();
     for (int i = 0; i < includedPaths.length; i++) {
       String path = includedPaths[i];
       Resource resource = resourceProvider.getResource(path);
@@ -73,30 +79,46 @@
       throw new UnimplementedError(
           'Excluded paths are not supported yet');
     }
-    Set<Folder> excludedFolders = new Set<Folder>();
+    Set<Folder> excludedFolders = new HashSet<Folder>();
     // diff
     Set<Folder> currentFolders = _currentDirectoryInfo.keys.toSet();
     Set<Folder> newFolders = includedFolders.difference(currentFolders);
     Set<Folder> oldFolders = currentFolders.difference(includedFolders);
-    // remove old contexts
+    // destroy old contexts
     for (Folder folder in oldFolders) {
-      // TODO(scheglov) implement
+      _destroyContext(folder);
     }
-    // add new contexts
+    // create new contexts
     for (Folder folder in newFolders) {
-      _ContextDirectoryInfo info = new _ContextDirectoryInfo();
-      _currentDirectoryInfo[folder] = info;
-      info.changeSubscription = folder.changes.listen((WatchEvent event) {
-        _handleWatchEvent(folder, info, event);
-      });
-      File pubspecFile = folder.getChild('pubspec.yaml');
-      addContext(folder, pubspecFile.exists ? pubspecFile : null);
-      ChangeSet changeSet = new ChangeSet();
-      _addSourceFiles(changeSet, folder, info);
-      applyChangesToContext(folder, changeSet);
+      _createContext(folder);
     }
   }
 
+  /**
+   * Create a new context associated with the given folder.
+   */
+  void _createContext(Folder folder) {
+    _ContextDirectoryInfo info = new _ContextDirectoryInfo();
+    _currentDirectoryInfo[folder] = info;
+    info.changeSubscription = folder.changes.listen((WatchEvent event) {
+      _handleWatchEvent(folder, info, event);
+    });
+    File pubspecFile = folder.getChild(PUBSPEC_NAME);
+    addContext(folder);
+    ChangeSet changeSet = new ChangeSet();
+    _addSourceFiles(changeSet, folder, info);
+    applyChangesToContext(folder, changeSet);
+  }
+
+  /**
+   * Clean up and destroy the context associated with the given folder.
+   */
+  void _destroyContext(Folder folder) {
+    _currentDirectoryInfo[folder].changeSubscription.cancel();
+    _currentDirectoryInfo.remove(folder);
+    removeContext(folder);
+  }
+
   void _handleWatchEvent(Folder folder, _ContextDirectoryInfo info, WatchEvent event) {
     switch (event.type) {
       case ChangeType.ADD:
@@ -105,7 +127,6 @@
           // there is a pubspec.yaml?
           break;
         }
-        // TODO(paulberry): handle adding pubspec.yaml
         if (_shouldFileBeAnalyzed(event.path)) {
           ChangeSet changeSet = new ChangeSet();
           Resource resource = resourceProvider.getResource(event.path);
@@ -122,7 +143,6 @@
         }
         break;
       case ChangeType.REMOVE:
-        // TODO(paulberry): handle removing pubspec.yaml
         Source source = info.sources[event.path];
         if (source != null) {
           ChangeSet changeSet = new ChangeSet();
@@ -132,7 +152,12 @@
         }
         break;
       case ChangeType.MODIFY:
-        // TODO(paulberry): handle modification events
+        Source source = info.sources[event.path];
+        if (source != null) {
+          ChangeSet changeSet = new ChangeSet();
+          changeSet.changedSource(source);
+          applyChangesToContext(folder, changeSet);
+        }
         break;
     }
   }
@@ -181,11 +206,9 @@
   }
 
   /**
-   * Called when a new context needs to be created.  If the context is
-   * associated with a pubspec file, that file is passed in [pubspecFile];
-   * otherwise it is null.
+   * Called when a new context needs to be created.
    */
-  void addContext(Folder folder, File pubspecFile);
+  void addContext(Folder folder);
 
   /**
    * Called when the set of files associated with a context have changed (or
@@ -193,4 +216,9 @@
    * changes that need to be applied to the context.
    */
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet);
-}
\ No newline at end of file
+
+  /**
+   * Remove the context associated with the given [folder].
+   */
+  void removeContext(Folder folder);
+}
diff --git a/pkg/analysis_server/lib/src/domain_analysis.dart b/pkg/analysis_server/lib/src/domain_analysis.dart
index 129ac81..c153735 100644
--- a/pkg/analysis_server/lib/src/domain_analysis.dart
+++ b/pkg/analysis_server/lib/src/domain_analysis.dart
@@ -4,6 +4,9 @@
 
 library domain.analysis;
 
+import 'dart:collection';
+
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
@@ -27,21 +30,17 @@
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == METHOD_GET_FIXES) {
-        return getFixes(request);
-      } else if (requestName == METHOD_GET_MINOR_REFACTORINGS) {
-          return getMinorRefactorings(request);
-      } else if (requestName == METHOD_SET_ANALYSIS_ROOTS) {
+      if (requestName == ANALYSIS_SET_ANALYSIS_ROOTS) {
         return setAnalysisRoots(request);
-      } else if (requestName == METHOD_SET_PRIORITY_FILES) {
+      } else if (requestName == ANALYSIS_SET_PRIORITY_FILES) {
         return setPriorityFiles(request);
-      } else if (requestName == METHOD_SET_ANALYSIS_SUBSCRIPTIONS) {
+      } else if (requestName == ANALYSIS_SET_SUBSCRIPTIONS) {
         return setSubscriptions(request);
-      } else if (requestName == METHOD_UPDATE_CONTENT) {
+      } else if (requestName == ANALYSIS_UPDATE_CONTENT) {
         return updateContent(request);
-      } else if (requestName == METHOD_UPDATE_OPTIONS) {
+      } else if (requestName == ANALYSIS_UPDATE_OPTIONS) {
         return updateOptions(request);
-      } else if (requestName == METHOD_UPDATE_SDKS) {
+      } else if (requestName == ANALYSIS_UPDATE_SDKS) {
         return updateSdks(request);
       }
     } on RequestFailure catch (exception) {
@@ -50,16 +49,9 @@
     return null;
   }
 
-  Response getFixes(Request request) {
-    // TODO(scheglov) implement
-    return null;
-  }
-
-  Response getMinorRefactorings(Request request) {
-    // TODO(scheglov) implement
-    return null;
-  }
-
+  /**
+   * Implement the 'analysis.setAnalysisRoots' request.
+   */
   Response setAnalysisRoots(Request request) {
     // included
     RequestDatum includedDatum = request.getRequiredParameter(INCLUDED);
@@ -72,37 +64,51 @@
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.setPriorityFiles' request.
+   */
   Response setPriorityFiles(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    // files
+    RequestDatum filesDatum = request.getRequiredParameter(FILES);
+    List<String> files = filesDatum.asStringList();
+    server.setPriorityFiles(request, files);
+    return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.setSubscriptions' request.
+   */
   Response setSubscriptions(Request request) {
     // parse subscriptions
     Map<AnalysisService, Set<String>> subMap;
     {
       RequestDatum subDatum = request.getRequiredParameter(SUBSCRIPTIONS);
       Map<String, List<String>> subStringMap = subDatum.asStringListMap();
-      subMap = new Map<AnalysisService, Set<String>>();
+      subMap = new HashMap<AnalysisService, Set<String>>();
       subStringMap.forEach((String serviceName, List<String> paths) {
-        AnalysisService service = Enum2.valueOf(AnalysisService.VALUES, serviceName);
+        AnalysisService service = Enum2.valueOf(AnalysisService.VALUES,
+            serviceName);
         if (service == null) {
-          throw new RequestFailure(
-              new Response.unknownAnalysisService(request, serviceName));
+          throw new RequestFailure(new Response.unknownAnalysisService(request,
+              serviceName));
         }
-        subMap[service] = new Set.from(paths);
+        subMap[service] = new HashSet.from(paths);
       });
     }
     server.setAnalysisSubscriptions(subMap);
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateContent' request.
+   */
   Response updateContent(Request request) {
-    var changes = new Map<String, ContentChange>();
+    var changes = new HashMap<String, ContentChange>();
     RequestDatum filesDatum = request.getRequiredParameter(FILES);
     filesDatum.forEachMap((file, changeDatum) {
       var change = new ContentChange();
-      change.content = changeDatum[CONTENT].asString();
+      change.content = changeDatum[CONTENT].isNull ? null :
+          changeDatum[CONTENT].asString();
       if (changeDatum.hasKey(OFFSET)) {
         change.offset = changeDatum[OFFSET].asInt();
         change.oldLength = changeDatum[OLD_LENGTH].asInt();
@@ -114,12 +120,73 @@
     return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateOptions' request.
+   */
   Response updateOptions(Request request) {
-    // TODO(scheglov) implement
-    return null;
+    // options
+    RequestDatum optionsDatum = request.getRequiredParameter(OPTIONS);
+    List<OptionUpdater> updaters = new List<OptionUpdater>();
+    optionsDatum.forEachMap((String optionName, RequestDatum optionDatum) {
+      if (optionName == ANALYZE_ANGULAR) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.analyzeAngular = optionValue;
+        });
+      } else if (optionName == ANALYZE_POLYMER) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.analyzePolymer = optionValue;
+        });
+      } else if (optionName == ENABLE_ASYNC) {
+        // TODO(brianwilkerson) Uncomment this when the option is supported.
+//        bool optionValue = optionDatum.asBool();
+//        updaters.add((AnalysisOptionsImpl options) {
+//          options.enableAsync = optionValue;
+//        });
+      } else if (optionName == ENABLE_DEFERRED_LOADING) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.enableDeferredLoading = optionValue;
+        });
+      } else if (optionName == ENABLE_ENUMS) {
+        // TODO(brianwilkerson) Uncomment this when the option is supported.
+//        bool optionValue = optionDatum.asBool();
+//        updaters.add((AnalysisOptionsImpl options) {
+//          options.enableEnums = optionValue;
+//        });
+      } else if (optionName == GENERATE_DART2JS_HINTS) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.dart2jsHint = optionValue;
+        });
+      } else if (optionName == GENERATE_HINTS) {
+        bool optionValue = optionDatum.asBool();
+        updaters.add((AnalysisOptionsImpl options) {
+          options.hint = optionValue;
+        });
+      } else {
+        throw new RequestFailure(new Response.unknownOptionName(request,
+            optionName));
+      }
+    });
+    server.updateOptions(updaters);
+    return new Response(request.id);
   }
 
+  /**
+   * Implement the 'analysis.updateSdks' request.
+   */
   Response updateSdks(Request request) {
+    // added
+    RequestDatum addedDatum = request.getRequiredParameter(ADDED);
+    List<String> added = addedDatum.asStringList();
+    // removed
+    RequestDatum removedDatum = request.getRequiredParameter(REMOVED);
+    List<String> removed = removedDatum.asStringList();
+    // default
+    RequestDatum defaultDatum = request.getRequiredParameter(DEFAULT);
+    String defaultSdk = defaultDatum.asString();
     // TODO(scheglov) implement
     return null;
   }
diff --git a/pkg/analysis_server/lib/src/domain_completion.dart b/pkg/analysis_server/lib/src/domain_completion.dart
new file mode 100644
index 0000000..cfb6881
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_completion.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.
+
+library domain.completion;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [CompletionDomainHandler] implement a [RequestHandler]
+ * that handles requests in the search domain.
+ */
+class CompletionDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  CompletionDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == COMPLETION_GET_SUGGESTIONS) {
+        return getSuggestions(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response getSuggestions(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_edit.dart b/pkg/analysis_server/lib/src/domain_edit.dart
new file mode 100644
index 0000000..4a415b4
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_edit.dart
@@ -0,0 +1,200 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library domain.edit;
+
+import 'package:analyzer/src/generated/error.dart';
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [EditDomainHandler] implement a [RequestHandler]
+ * that handles requests in the edit domain.
+ */
+class EditDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  EditDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == EDIT_APPLY_REFACTORING) {
+        return applyRefactoring(request);
+      } else if (requestName == EDIT_CREATE_REFACTORING) {
+        return createRefactoring(request);
+      } else if (requestName == EDIT_DELETE_REFACTORING) {
+        return deleteRefactoring(request);
+      } else if (requestName == EDIT_GET_ASSISTS) {
+        return getAssists(request);
+      } else if (requestName == EDIT_GET_FIXES) {
+        return getFixes(request);
+      } else if (requestName == EDIT_GET_REFACTORINGS) {
+        return getRefactorings(request);
+      } else if (requestName == EDIT_SET_REFACTORING_OPTIONS) {
+        return setRefactoringOptions(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response applyRefactoring(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response createRefactoring(Request request) {
+    // kind
+    RequestDatum kindDatum = request.getRequiredParameter(KIND);
+    String kind = kindDatum.asString();
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response deleteRefactoring(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getAssists(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getFixes(Request request) {
+    // errors
+    RequestDatum errorsDatum = request.getRequiredParameter(ERRORS);
+    List<AnalysisError> errors = errorsDatum.asList((RequestDatum datum) {
+      return _createAnalysisError(request, datum);
+    });
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response getRefactorings(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // length
+    RequestDatum lengthDatum = request.getRequiredParameter(LENGTH);
+    int length = lengthDatum.asInt();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response setRefactoringOptions(Request request) {
+    // id
+    RequestDatum idDatum = request.getRequiredParameter(ID);
+    String id = idDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  /**
+   * Convert the given data from a request into an analysis error.
+   */
+  AnalysisError _createAnalysisError(Request request, RequestDatum datum) {
+    String file = datum[FILE].asString();
+    String errorCodeName = datum[ERROR_CODE].asString();
+    int offset = datum[OFFSET].asInt();
+    int length = datum[LENGTH].asInt();
+    String message = datum[MESSAGE].asString();
+    String correction;
+    if (datum.hasKey(CORRECTION)) {
+      correction = datum[CORRECTION].asString();
+    }
+    ErrorCode errorCode = convertErrorCode(errorCodeName);
+    if (errorCode == null) {
+//      throw new RequestFailure(new Response.invalidErrorCode(request));
+    }
+    // TODO(brianwilkerson) Implement this.
+//    return new AnalysisError.con2(
+//        server.sourceFromFile(file),
+//        offset,
+//        length,
+//        errorCode,
+//        null);
+    return null;
+  }
+
+  /**
+   * Return the error code corresponding to the given [errorCodeName], or `null`
+   * if the given name is not a valid error code.
+   */
+  ErrorCode convertErrorCode(String errorCodeName) {
+    // TODO(brianwilkerson) Implement this.
+//    Enum2 errorCode = Enum2.valueOf(AngularCode.values, errorCodeName);
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(CompileTimeErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(HintCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(HtmlWarningCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ParserErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(PolymerCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(PubSuggestionCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ResolverErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(ScannerErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(StaticTypeErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(StaticWarningErrorCode.values, errorCodeName);
+//    }
+//    if (errorCode == null) {
+//      errorCode = Enum2.valueOf(TodoCode.values, errorCodeName);
+//    }
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_search.dart b/pkg/analysis_server/lib/src/domain_search.dart
new file mode 100644
index 0000000..8b1a2b2
--- /dev/null
+++ b/pkg/analysis_server/lib/src/domain_search.dart
@@ -0,0 +1,82 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library domain.search;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+
+/**
+ * Instances of the class [SearchDomainHandler] implement a [RequestHandler]
+ * that handles requests in the search domain.
+ */
+class SearchDomainHandler implements RequestHandler {
+  /**
+   * The analysis server that is using this handler to process requests.
+   */
+  final AnalysisServer server;
+
+  /**
+   * Initialize a newly created handler to handle requests for the given [server].
+   */
+  SearchDomainHandler(this.server);
+
+  @override
+  Response handleRequest(Request request) {
+    try {
+      String requestName = request.method;
+      if (requestName == SEARCH_FIND_ELEMENT_REFERENCES) {
+        return findElementReferences(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_DECLARATIONS) {
+        return findMemberDeclarations(request);
+      } else if (requestName == SEARCH_FIND_MEMBER_REFERENCES) {
+        return findMemberReferences(request);
+      } else if (requestName == SEARCH_FIND_TOP_LEVEL_DECLARATIONS) {
+        return findTopLevelDeclarations(request);
+      }
+    } on RequestFailure catch (exception) {
+      return exception.response;
+    }
+    return null;
+  }
+
+  Response findElementReferences(Request request) {
+    // file
+    RequestDatum fileDatum = request.getRequiredParameter(FILE);
+    String file = fileDatum.asString();
+    // offset
+    RequestDatum offsetDatum = request.getRequiredParameter(OFFSET);
+    int offset = offsetDatum.asInt();
+    // includePotential
+    RequestDatum includePotentialDatum = request.getRequiredParameter(LENGTH);
+    bool includePotential = includePotentialDatum.asBool();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findMemberDeclarations(Request request) {
+    // name
+    RequestDatum nameDatum = request.getRequiredParameter(FILE);
+    String name = nameDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findMemberReferences(Request request) {
+    // name
+    RequestDatum nameDatum = request.getRequiredParameter(FILE);
+    String name = nameDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+
+  Response findTopLevelDeclarations(Request request) {
+    // pattern
+    RequestDatum patternDatum = request.getRequiredParameter(FILE);
+    String pattern = patternDatum.asString();
+    // TODO(brianwilkerson) implement
+    return null;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/domain_server.dart b/pkg/analysis_server/lib/src/domain_server.dart
index 9f9867b..6c0126c 100644
--- a/pkg/analysis_server/lib/src/domain_server.dart
+++ b/pkg/analysis_server/lib/src/domain_server.dart
@@ -23,15 +23,24 @@
    */
   ServerDomainHandler(this.server);
 
+  /**
+   * Return the version number of the analysis server.
+   */
+  Response getVersion(Request request) {
+    Response response = new Response(request.id);
+    response.setResult(VERSION, '0.0.1');
+    return response;
+  }
+
   @override
   Response handleRequest(Request request) {
     try {
       String requestName = request.method;
-      if (requestName == METHOD_GET_VERSION) {
+      if (requestName == SERVER_GET_VERSION) {
         return getVersion(request);
-      } else if (requestName == METHOD_SET_SERVER_SUBSCRIPTIONS) {
+      } else if (requestName == SERVER_SET_SUBSCRIPTIONS) {
           return setSubscriptions(request);
-      } else if (requestName == METHOD_SHUTDOWN) {
+      } else if (requestName == SERVER_SHUTDOWN) {
         return shutdown(request);
       }
     } on RequestFailure catch (exception) {
@@ -112,13 +121,4 @@
     Response response = new Response(request.id);
     return response;
   }
-
-  /**
-   * Return the version number of the analysis server.
-   */
-  Response getVersion(Request request) {
-    Response response = new Response(request.id);
-    response.setResult(VERSION, '0.0.1');
-    return response;
-  }
 }
diff --git a/pkg/analysis_server/lib/src/generated/service_interfaces.dart b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
index 07643a9..86b32f0 100644
--- a/pkg/analysis_server/lib/src/generated/service_interfaces.dart
+++ b/pkg/analysis_server/lib/src/generated/service_interfaces.dart
@@ -9,21 +9,20 @@
 
 import 'package:analyzer/src/generated/java_core.dart' show Enum, StringUtils;
 import 'package:analyzer/src/generated/source.dart' show Source;
-import 'package:analysis_services/src/generated/change.dart' show SourceChange;
 
-/**
- * The interface `AssistsConsumer` defines the behavior of objects that consume assists
- * [SourceChange]s.
- */
-abstract class AssistsConsumer implements Consumer {
-  /**
-   * A set of [SourceChange]s that have been computed.
-   *
-   * @param proposals an array of computed [SourceChange]s
-   * @param isLastResult is `true` if this is the last set of results
-   */
-  void computedSourceChanges(List<SourceChange> sourceChanges, bool isLastResult);
-}
+///**
+// * The interface `AssistsConsumer` defines the behavior of objects that consume assists
+// * [SourceChange]s.
+// */
+//abstract class AssistsConsumer implements Consumer {
+//  /**
+//   * A set of [SourceChange]s that have been computed.
+//   *
+//   * @param proposals an array of computed [SourceChange]s
+//   * @param isLastResult is `true` if this is the last set of results
+//   */
+//  void computedSourceChanges(List<SourceChange> sourceChanges, bool isLastResult);
+//}
 
 /**
  * The interface `CompletionSuggestion` defines the behavior of objects representing a
diff --git a/pkg/analysis_server/lib/src/get_handler.dart b/pkg/analysis_server/lib/src/get_handler.dart
index ce8ad00..f0f577f 100644
--- a/pkg/analysis_server/lib/src/get_handler.dart
+++ b/pkg/analysis_server/lib/src/get_handler.dart
@@ -6,9 +6,6 @@
 
 import 'dart:io';
 
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/java_engine.dart' show CaughtException;
-
 import 'package:analysis_server/src/socket_server.dart';
 
 /**
@@ -67,57 +64,57 @@
           ['Context', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
           true);
       // TODO(scheglov) replace with using folder based contexts
-      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        AnalysisContentStatistics statistics =
-            (context as AnalysisContextImpl).statistics;
-        int errorCount = 0;
-        int flushedCount = 0;
-        int inProcessCount = 0;
-        int invalidCount = 0;
-        int validCount = 0;
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-          errorCount += row.errorCount;
-          flushedCount += row.flushedCount;
-          inProcessCount += row.inProcessCount;
-          invalidCount += row.invalidCount;
-          validCount += row.validCount;
-        });
-        _writeRow(response, [
-            '<a href="#context_$key">$key</a>',
-            errorCount,
-            flushedCount,
-            inProcessCount,
-            invalidCount,
-            validCount]);
-      });
+//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
+//        AnalysisContentStatistics statistics =
+//            (context as AnalysisContextImpl).statistics;
+//        int errorCount = 0;
+//        int flushedCount = 0;
+//        int inProcessCount = 0;
+//        int invalidCount = 0;
+//        int validCount = 0;
+//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+//          errorCount += row.errorCount;
+//          flushedCount += row.flushedCount;
+//          inProcessCount += row.inProcessCount;
+//          invalidCount += row.invalidCount;
+//          validCount += row.validCount;
+//        });
+//        _writeRow(response, [
+//            '<a href="#context_$key">$key</a>',
+//            errorCount,
+//            flushedCount,
+//            inProcessCount,
+//            invalidCount,
+//            validCount]);
+//      });
       response.write('</table>');
-      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
-        response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
-        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
-        response.write('<table>');
-        _writeRow(
-            response,
-            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
-            true);
-        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
-          _writeRow(
-              response,
-              [row.name,
-               row.errorCount,
-               row.flushedCount,
-               row.inProcessCount,
-               row.invalidCount,
-               row.validCount]);
-        });
-        response.write('</table>');
-        List<CaughtException> exceptions = statistics.exceptions;
-        if (!exceptions.isEmpty) {
-          response.write('<h2>Exceptions</h2>');
-          exceptions.forEach((CaughtException exception) {
-            response.write('<p>${exception.exception}</p>');
-          });
-        }
-      });
+//      _server.analysisServer.contextMap.forEach((String key, AnalysisContext context) {
+//        response.write('<h2><a name="context_$key">Analysis Context: $key</a></h2>');
+//        AnalysisContentStatistics statistics = (context as AnalysisContextImpl).statistics;
+//        response.write('<table>');
+//        _writeRow(
+//            response,
+//            ['Item', 'ERROR', 'FLUSHED', 'IN_PROCESS', 'INVALID', 'VALID'],
+//            true);
+//        statistics.cacheRows.forEach((AnalysisContentStatistics_CacheRow row) {
+//          _writeRow(
+//              response,
+//              [row.name,
+//               row.errorCount,
+//               row.flushedCount,
+//               row.inProcessCount,
+//               row.invalidCount,
+//               row.validCount]);
+//        });
+//        response.write('</table>');
+//        List<CaughtException> exceptions = statistics.exceptions;
+//        if (!exceptions.isEmpty) {
+//          response.write('<h2>Exceptions</h2>');
+//          exceptions.forEach((CaughtException exception) {
+//            response.write('<p>${exception.exception}</p>');
+//          });
+//        }
+//      });
     }
     response.write('</body>');
     response.write('</html>');
diff --git a/pkg/analysis_server/lib/src/index/b_plus_tree.dart b/pkg/analysis_server/lib/src/index/b_plus_tree.dart
new file mode 100644
index 0000000..f4b52d7
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/b_plus_tree.dart
@@ -0,0 +1,774 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.b_plus_tree;
+
+import 'dart:collection';
+
+
+/**
+ * A simple B+ tree (http://en.wikipedia.org/wiki/B+_tree) implementation.
+ *
+ * [K] is the keys type.
+ * [V] is the values type.
+ * [N] is the type of node identifiers using by the [NodeManager].
+ */
+class BPlusTree<K, V, N> {
+  /**
+   * The [Comparator] to compare keys.
+   */
+  final Comparator<K> _comparator;
+
+  /**
+   * The [NodeManager] to manage nodes.
+   */
+  final NodeManager<K, V, N> _manager;
+
+  /**
+   * The maximum number of keys in an index node.
+   */
+  final int _maxIndexKeys;
+
+  /**
+   * The maximum number of keys in a leaf node.
+   */
+  final int _maxLeafKeys;
+
+  /**
+   * The root node.
+   */
+  _Node<K, V, N> _root;
+
+  /**
+   * Creates a new [BPlusTree] instance.
+   */
+  BPlusTree(this._comparator, NodeManager<K, V, N> manager)
+      : _manager = manager,
+        _maxIndexKeys = manager.maxIndexKeys,
+        _maxLeafKeys = manager.maxLeafKeys {
+    _root = _newLeafNode();
+    _writeLeafNode(_root);
+  }
+
+  /**
+   * Returns the value for [key] or `null` if [key] is not in the tree.
+   */
+  V find(K key) {
+    return _root.find(key);
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the key was already in the tree, its associated value is changed.
+   * Otherwise the key-value pair is added to the tree.
+   */
+  void insert(K key, V value) {
+    _Split<K, N> result = _root.insert(key, value);
+    if (result != null) {
+      _IndexNode<K, V, N> newRoot = _newIndexNode();
+      newRoot.keys.add(result.key);
+      newRoot.children.add(result.left);
+      newRoot.children.add(result.right);
+      _root = newRoot;
+      _writeIndexNode(_root);
+    }
+  }
+
+  /**
+   * Removes the association for the given [key].
+   *
+   * Returns the value associated with [key] in the tree or `null` if [key] is
+   * not in the tree.
+   */
+  V remove(K key) {
+    _Remove<K, V> result = _root.remove(key, null, null, null);
+    if (_root is _IndexNode<K, V, N>) {
+      List<N> children = (_root as _IndexNode<K, V, N>).children;
+      if (children.length == 1) {
+        _manager.delete(_root.id);
+        _root = _readNode(children[0]);
+      }
+    }
+    return result.value;
+  }
+
+  /**
+   * Writes a textual presentation of the tree into [buffer].
+   */
+  void writeOn(StringBuffer buffer) {
+    _root.writeOn(buffer, '');
+  }
+
+  /**
+   * Creates a new [_IndexNode] instance.
+   */
+  _IndexNode<K, V, N> _newIndexNode() {
+    N id = _manager.createIndex();
+    return new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
+  }
+
+  /**
+   * Creates a new [_LeafNode] instance.
+   */
+  _LeafNode<K, V, N> _newLeafNode() {
+    N id = _manager.createLeaf();
+    return new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
+  }
+
+  /**
+   * Reads the [_IndexNode] with [id] from the manager.
+   */
+  _IndexNode<K, V, N> _readIndexNode(N id) {
+    IndexNodeData<K, N> data = _manager.readIndex(id);
+    _IndexNode<K, V, N> node = new _IndexNode<K, V, N>(this, id, _maxIndexKeys);
+    node.keys = data.keys;
+    node.children = data.children;
+    return node;
+  }
+
+  /**
+   * Reads the [_LeafNode] with [id] from the manager.
+   */
+  _LeafNode<K, V, N> _readLeafNode(N id) {
+    _LeafNode<K, V, N> node = new _LeafNode<K, V, N>(this, id, _maxLeafKeys);
+    LeafNodeData<K, V> data = _manager.readLeaf(id);
+    node.keys = data.keys;
+    node.values = data.values;
+    return node;
+  }
+
+  /**
+   * Reads the [_IndexNode] or [_LeafNode] with [id] from the manager.
+   */
+  _Node<K, V, N> _readNode(N id) {
+    if (_manager.isIndex(id)) {
+      return _readIndexNode(id);
+    } else {
+      return _readLeafNode(id);
+    }
+  }
+
+  /**
+   * Writes [node] into the manager.
+   */
+  void _writeIndexNode(_IndexNode<K, V, N> node) {
+    _manager.writeIndex(node.id, new IndexNodeData<K, N>(node.keys, node.children));
+  }
+
+  /**
+   * Writes [node] into the manager.
+   */
+  void _writeLeafNode(_LeafNode<K, V, N> node) {
+    _manager.writeLeaf(node.id, new LeafNodeData<K, V>(node.keys, node.values));
+  }
+}
+
+
+/**
+ * A container with information about an index node.
+ */
+class IndexNodeData<K, N> {
+  final List<N> children;
+  final List<K> keys;
+  IndexNodeData(this.keys, this.children);
+}
+
+
+/**
+ * A container with information about a leaf node.
+ */
+class LeafNodeData<K, V> {
+  final List<K> keys;
+  final List<V> values;
+  LeafNodeData(this.keys, this.values);
+}
+
+
+/**
+ * An implementation of [NodeManager] that keeps node information in memory.
+ */
+class MemoryNodeManager<K, V> implements NodeManager<K, V, int> {
+  final int maxIndexKeys;
+  final int maxLeafKeys;
+  Map<int, IndexNodeData> _indexDataMap = new HashMap<int, IndexNodeData>();
+  Map<int, LeafNodeData> _leafDataMap = new HashMap<int, LeafNodeData>();
+
+  int _nextPageIndexId = 0;
+  int _nextPageLeafId = 1;
+
+  MemoryNodeManager(this.maxIndexKeys, this.maxLeafKeys);
+
+  @override
+  int createIndex() {
+    int id = _nextPageIndexId;
+    _nextPageIndexId += 2;
+    return id;
+  }
+
+  @override
+  int createLeaf() {
+    int id = _nextPageLeafId;
+    _nextPageLeafId += 2;
+    return id;
+  }
+
+  @override
+  void delete(int id) {
+    if (isIndex(id)) {
+      _indexDataMap.remove(id);
+    } else {
+      _leafDataMap.remove(id);
+    }
+  }
+
+  @override
+  bool isIndex(int id) {
+    return id.isEven;
+  }
+
+  @override
+  IndexNodeData<K, int> readIndex(int id) {
+    return _indexDataMap[id];
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(int id) {
+    return _leafDataMap[id];
+  }
+
+  @override
+  void writeIndex(int id, IndexNodeData<K, int> data) {
+    _indexDataMap[id] = data;
+  }
+
+  @override
+  void writeLeaf(int id, LeafNodeData<K, V> data) {
+    _leafDataMap[id] = data;
+  }
+}
+
+
+/**
+ * A manager that manages nodes.
+ */
+abstract class NodeManager<K, V, N> {
+  /**
+   * The maximum number of keys in an index node.
+   */
+  int get maxIndexKeys;
+
+  /**
+   * The maximum number of keys in a leaf node.
+   */
+  int get maxLeafKeys;
+
+  /**
+   * Generates an identifier for a new index node.
+   */
+  N createIndex();
+
+  /**
+   * Generates an identifier for a new leaf node.
+   */
+  N createLeaf();
+
+  /**
+   * Deletes the node with the given identifier.
+   */
+  void delete(N id);
+
+  /**
+   * Checks if the node with the given identifier is an index or a leaf node.
+   */
+  bool isIndex(N id);
+
+  /**
+   * Reads information about the index node with the given identifier.
+   */
+  IndexNodeData<K, N> readIndex(N id);
+
+  /**
+   * Reads information about the leaf node with the given identifier.
+   */
+  LeafNodeData<K, V> readLeaf(N id);
+
+  /**
+   * Writes information about the index node with the given identifier.
+   */
+  void writeIndex(N id, IndexNodeData<K, N> data);
+
+  /**
+   * Writes information about the leaf node with the given identifier.
+   */
+  void writeLeaf(N id, LeafNodeData<K, V> data);
+}
+
+
+/**
+ * An index node with keys and children references.
+ */
+class _IndexNode<K, V, N> extends _Node<K, V, N> {
+  List<N> children = new List<N>();
+  final int maxKeys;
+  final int minKeys;
+
+  _IndexNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
+      : super(tree, id),
+        maxKeys = maxKeys,
+        minKeys = maxKeys ~/ 2;
+
+  @override
+  V find(K key) {
+    int index = _findChildIndex(key);
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    return child.find(key);
+  }
+
+  _Split<K, N> insert(K key, V value) {
+    // Early split.
+    if (keys.length == maxKeys) {
+      int middle = (maxKeys + 1) ~/ 2;
+      K splitKey = keys[middle];
+      // Overflow into a new sibling.
+      _IndexNode<K, V, N> sibling = tree._newIndexNode();
+      sibling.keys.addAll(keys.getRange(middle + 1, keys.length));
+      sibling.children.addAll(children.getRange(middle + 1, children.length));
+      keys.length = middle;
+      children.length = middle + 1;
+      // Insert into this node or sibling.
+      if (comparator(key, splitKey) < 0) {
+        _insertNotFull(key, value);
+      } else {
+        sibling._insertNotFull(key, value);
+      }
+      // Prepare split.
+      tree._writeIndexNode(this);
+      tree._writeIndexNode(sibling);
+      return new _Split<K, N>(splitKey, id, sibling.id);
+    }
+    // No split.
+    _insertNotFull(key, value);
+    return null;
+  }
+
+  @override
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right) {
+    int index = _findChildIndex(key);
+    K thisAnchor = index == 0 ? keys[0] : keys[index - 1];
+    // Prepare children.
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    _Node<K, V, N> leftChild;
+    _Node<K, V, N> rightChild;
+    if (index != 0) {
+      leftChild = tree._readNode(children[index - 1]);
+    } else {
+      leftChild = null;
+    }
+    if (index < children.length - 1) {
+      rightChild = tree._readNode(children[index + 1]);
+    } else {
+      rightChild = null;
+    }
+    // Ask child to remove.
+    _Remove<K, V> result = child.remove(key, leftChild, thisAnchor, rightChild);
+    V value = result.value;
+    if (value == null) {
+      return new _Remove<K, V>(value);
+    }
+    // Do keys / children updates
+    bool hasUpdates = false;
+    {
+      // Update anchor if borrowed.
+      if (result.leftAnchor != null) {
+        keys[index - 1] = result.leftAnchor;
+        hasUpdates = true;
+      }
+      if (result.rightAnchor != null) {
+        keys[index] = result.rightAnchor;
+        hasUpdates = true;
+      }
+      // Update keys / children if merged.
+      if (result.mergedLeft) {
+        keys.removeAt(index - 1);
+        N child = children.removeAt(index);
+        manager.delete(child);
+        hasUpdates = true;
+      }
+      if (result.mergedRight) {
+        keys.removeAt(index);
+        N child = children.removeAt(index);
+        manager.delete(child);
+        hasUpdates = true;
+      }
+    }
+    // Write if updated.
+    if (!hasUpdates) {
+      return new _Remove<K, V>(value);
+    }
+    tree._writeIndexNode(this);
+    // Perform balancing.
+    if (keys.length < minKeys) {
+      // Try left sibling.
+      if (left is _IndexNode<K, V, N>) {
+        // Try to redistribute.
+        int leftLength = left.keys.length;
+        if (leftLength > minKeys) {
+          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
+          int newLeftLength = leftLength - halfExcess;
+          keys.insert(0, anchor);
+          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
+          children.insertAll(0, left.children.getRange(newLeftLength, leftLength
+              + 1));
+          K newAnchor = left.keys[newLeftLength - 1];
+          left.keys.length = newLeftLength - 1;
+          left.children.length = newLeftLength;
+          tree._writeIndexNode(this);
+          tree._writeIndexNode(left);
+          return new _Remove<K, V>.borrowLeft(value, newAnchor);
+        }
+        // Do merge.
+        left.keys.add(anchor);
+        left.keys.addAll(keys);
+        left.children.addAll(children);
+        tree._writeIndexNode(this);
+        tree._writeIndexNode(left);
+        return new _Remove<K, V>.mergeLeft(value);
+      }
+      // Try right sibling.
+      if (right is _IndexNode<K, V, N>) {
+        // Try to redistribute.
+        int rightLength = right.keys.length;
+        if (rightLength > minKeys) {
+          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
+          keys.add(anchor);
+          keys.addAll(right.keys.getRange(0, halfExcess - 1));
+          children.addAll(right.children.getRange(0, halfExcess));
+          K newAnchor = right.keys[halfExcess - 1];
+          right.keys.removeRange(0, halfExcess);
+          right.children.removeRange(0, halfExcess);
+          tree._writeIndexNode(this);
+          tree._writeIndexNode(right);
+          return new _Remove<K, V>.borrowRight(value, newAnchor);
+        }
+        // Do merge.
+        right.keys.insert(0, anchor);
+        right.keys.insertAll(0, keys);
+        right.children.insertAll(0, children);
+        tree._writeIndexNode(this);
+        tree._writeIndexNode(right);
+        return new _Remove<K, V>.mergeRight(value);
+      }
+    }
+    // No balancing required.
+    return new _Remove<K, V>(value);
+  }
+
+  @override
+  void writeOn(StringBuffer buffer, String indent) {
+    buffer.write(indent);
+    buffer.write('INode {\n');
+    for (int i = 0; i < keys.length; i++) {
+      _Node<K, V, N> child = tree._readNode(children[i]);
+      child.writeOn(buffer, indent + '    ');
+      buffer.write(indent);
+      buffer.write('  ');
+      buffer.write(keys[i]);
+      buffer.write('\n');
+    }
+    _Node<K, V, N> child = tree._readNode(children[keys.length]);
+    child.writeOn(buffer, indent + '    ');
+    buffer.write(indent);
+    buffer.write('}\n');
+  }
+
+  /**
+   * Returns the index of the child into which [key] should be inserted.
+   */
+  int _findChildIndex(K key) {
+    int lo = 0;
+    int hi = keys.length - 1;
+    while (lo <= hi) {
+      int mid = lo + (hi - lo) ~/ 2;
+      int compare = comparator(key, keys[mid]);
+      if (compare < 0) {
+        hi = mid - 1;
+      } else if (compare > 0) {
+        lo = mid + 1;
+      } else {
+        return mid + 1;
+      }
+    }
+    return lo;
+  }
+
+  void _insertNotFull(K key, V value) {
+    int index = _findChildIndex(key);
+    _Node<K, V, N> child = tree._readNode(children[index]);
+    _Split<K, N> result = child.insert(key, value);
+    if (result != null) {
+      keys.insert(index, result.key);
+      children[index] = result.left;
+      children.insert(index + 1, result.right);
+      tree._writeIndexNode(this);
+    }
+  }
+}
+
+
+/**
+ * A leaf node with keys and values.
+ */
+class _LeafNode<K, V, N> extends _Node<K, V, N> {
+  final int maxKeys;
+  final int minKeys;
+  List<V> values = new List<V>();
+
+  _LeafNode(BPlusTree<K, V, N> tree, N id, int maxKeys)
+      : super(tree, id),
+        maxKeys = maxKeys,
+        minKeys = maxKeys ~/ 2;
+
+  @override
+  V find(K key) {
+    int index = _findKeyIndex(key);
+    if (index < 0) {
+      return null;
+    }
+    if (index >= keys.length) {
+      return null;
+    }
+    if (keys[index] != key) {
+      return null;
+    }
+    return values[index];
+  }
+
+  _Split<K, N> insert(K key, V value) {
+    int index = _findKeyIndex(key);
+    // The node is full.
+    if (keys.length == maxKeys) {
+      int middle = (maxKeys + 1) ~/ 2;
+      _LeafNode<K, V, N> sibling = tree._newLeafNode();
+      sibling.keys.addAll(keys.getRange(middle, keys.length));
+      sibling.values.addAll(values.getRange(middle, values.length));
+      keys.length = middle;
+      values.length = middle;
+      // Insert into the left / right sibling.
+      if (index < middle) {
+        _insertNotFull(key, value, index);
+      } else {
+        sibling._insertNotFull(key, value, index - middle);
+      }
+      // Notify the parent about the split.
+      tree._writeLeafNode(this);
+      tree._writeLeafNode(sibling);
+      return new _Split<K, N>(sibling.keys[0], id, sibling.id);
+    }
+    // The node was not full.
+    _insertNotFull(key, value, index);
+    return null;
+  }
+
+  @override
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right) {
+    // Find the key.
+    int index = keys.indexOf(key);
+    if (index == -1) {
+      return new _Remove<K, V>(null);
+    }
+    // Remove key / value.
+    keys.removeAt(index);
+    V value = values.removeAt(index);
+    tree._writeLeafNode(this);
+    // Perform balancing.
+    if (keys.length < minKeys) {
+      // Try left sibling.
+      if (left is _LeafNode<K, V, N>) {
+        // Try to redistribute.
+        int leftLength = left.keys.length;
+        if (leftLength > minKeys) {
+          int halfExcess = (leftLength - minKeys + 1) ~/ 2;
+          int newLeftLength = leftLength - halfExcess;
+          keys.insertAll(0, left.keys.getRange(newLeftLength, leftLength));
+          values.insertAll(0, left.values.getRange(newLeftLength, leftLength));
+          left.keys.length = newLeftLength;
+          left.values.length = newLeftLength;
+          tree._writeLeafNode(this);
+          tree._writeLeafNode(left);
+          return new _Remove<K, V>.borrowLeft(value, keys.first);
+        }
+        // Do merge.
+        left.keys.addAll(keys);
+        left.values.addAll(values);
+        tree._writeLeafNode(this);
+        tree._writeLeafNode(left);
+        return new _Remove<K, V>.mergeLeft(value);
+      }
+      // Try right sibling.
+      if (right is _LeafNode<K, V, N>) {
+        // Try to redistribute.
+        int rightLength = right.keys.length;
+        if (rightLength > minKeys) {
+          int halfExcess = (rightLength - minKeys + 1) ~/ 2;
+          keys.addAll(right.keys.getRange(0, halfExcess));
+          values.addAll(right.values.getRange(0, halfExcess));
+          right.keys.removeRange(0, halfExcess);
+          right.values.removeRange(0, halfExcess);
+          tree._writeLeafNode(this);
+          tree._writeLeafNode(right);
+          return new _Remove<K, V>.borrowRight(value, right.keys.first);
+        }
+        // Do merge.
+        right.keys.insertAll(0, keys);
+        right.values.insertAll(0, values);
+        tree._writeLeafNode(this);
+        tree._writeLeafNode(right);
+        return new _Remove<K, V>.mergeRight(value);
+      }
+    }
+    // No balancing required.
+    return new _Remove<K, V>(value);
+  }
+
+  @override
+  void writeOn(StringBuffer buffer, String indent) {
+    buffer.write(indent);
+    buffer.write('LNode {');
+    for (int i = 0; i < keys.length; i++) {
+      if (i != 0) {
+        buffer.write(', ');
+      }
+      buffer.write(keys[i]);
+      buffer.write(': ');
+      buffer.write(values[i]);
+    }
+    buffer.write('}\n');
+  }
+
+  /**
+   * Returns the index where [key] should be inserted.
+   */
+  int _findKeyIndex(K key) {
+    int lo = 0;
+    int hi = keys.length - 1;
+    while (lo <= hi) {
+      int mid = lo + (hi - lo) ~/ 2;
+      int compare = comparator(key, keys[mid]);
+      if (compare < 0) {
+        hi = mid - 1;
+      } else if (compare > 0) {
+        lo = mid + 1;
+      } else {
+        return mid;
+      }
+    }
+    return lo;
+  }
+
+  void _insertNotFull(K key, V value, int index) {
+    if (index < keys.length && comparator(keys[index], key) == 0) {
+      values[index] = value;
+    } else {
+      keys.insert(index, key);
+      values.insert(index, value);
+    }
+    tree._writeLeafNode(this);
+  }
+}
+
+
+/**
+ * An internal or leaf node.
+ */
+abstract class _Node<K, V, N> {
+  /**
+   * The [Comparator] to compare keys.
+   */
+  final Comparator<K> comparator;
+
+  /**
+   * The identifier of this node.
+   */
+  final N id;
+
+  /**
+   *  The list of keys.
+   */
+  List<K> keys = new List<K>();
+
+  /**
+   * The [NodeManager] for this tree.
+   */
+  final NodeManager<K, V, N> manager;
+
+  /**
+   * The [BPlusTree] this node belongs to.
+   */
+  final BPlusTree<K, V, N> tree;
+
+  _Node(BPlusTree<K, V, N> tree, this.id)
+      : tree = tree,
+        comparator = tree._comparator,
+        manager = tree._manager;
+
+  /**
+   * Looks for [key].
+   *
+   * Returns the associated value if found.
+   * Returns `null` if not found.
+   */
+  V find(K key);
+
+  /**
+   * Inserts the [key] / [value] pair into this [_Node].
+   *
+   * Returns a [_Split] object if split happens, or `null` otherwise.
+   */
+  _Split<K, N> insert(K key, V value);
+
+  /**
+   * Removes the association for the given [key].
+   *
+   * Returns the [_Remove] information about an operation performed.
+   * It may be restructuring or merging, with [left] or [left] siblings.
+   */
+  _Remove<K, V> remove(K key, _Node<K, V, N> left, K anchor, _Node<K, V,
+      N> right);
+
+  /**
+   * Writes a textual presentation of the tree into [buffer].
+   */
+  void writeOn(StringBuffer buffer, String indent);
+}
+
+
+/**
+ * A container with information about redistribute / merge.
+ */
+class _Remove<K, V> {
+  K leftAnchor;
+  bool mergedLeft = false;
+  bool mergedRight = false;
+  K rightAnchor;
+  final V value;
+  _Remove(this.value);
+  _Remove.borrowLeft(this.value, this.leftAnchor);
+  _Remove.borrowRight(this.value, this.rightAnchor);
+  _Remove.mergeLeft(this.value) : mergedLeft = true;
+  _Remove.mergeRight(this.value) : mergedRight = true;
+}
+
+
+/**
+ * A container with information about split during insert.
+ */
+class _Split<K, N> {
+  final K key;
+  final N left;
+  final N right;
+  _Split(this.key, this.left, this.right);
+}
diff --git a/pkg/analysis_server/lib/src/index/file_page_manager.dart b/pkg/analysis_server/lib/src/index/file_page_manager.dart
new file mode 100644
index 0000000..55c2c75
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/file_page_manager.dart
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.file_page_manager;
+
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/page_node_manager.dart';
+
+
+/**
+ * A [PageManager] that stores pages on disk.
+ */
+class FilePageManager implements PageManager {
+  final int pageSizeInBytes;
+
+  RandomAccessFile _file;
+  File _fileRef;
+  List<int> _freePagesList = new List<int>();
+  Set<int> _freePagesSet = new Set<int>();
+  int _nextPage = 0;
+
+  FilePageManager(this.pageSizeInBytes, String path) {
+    _fileRef = new File(path);
+    _file = _fileRef.openSync(mode: FileMode.WRITE);
+  }
+
+  @override
+  int alloc() {
+    if (_freePagesList.isNotEmpty) {
+      int id = _freePagesList.removeLast();
+      _freePagesSet.remove(id);
+      return id;
+    }
+    int id = _nextPage++;
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _file.setPositionSync(id * pageSizeInBytes);
+    _file.writeFromSync(page);
+    return id;
+  }
+
+  /**
+   * Closes this [FilePageManager].
+   */
+  void close() {
+    _file.closeSync();
+  }
+
+  /**
+   * Deletes the underlaying file.
+   */
+  void delete() {
+    if (_fileRef.existsSync()) {
+      _fileRef.deleteSync();
+    }
+  }
+
+  @override
+  void free(int id) {
+    if (!_freePagesSet.add(id)) {
+      throw new StateError('Page $id has been already freed.');
+    }
+    _freePagesList.add(id);
+  }
+
+  @override
+  Uint8List read(int id) {
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _file.setPositionSync(id * pageSizeInBytes);
+    int actual = 0;
+    while (actual != page.length) {
+      actual += _file.readIntoSync(page, actual);
+    }
+    return page;
+  }
+
+  @override
+  void write(int id, Uint8List page) {
+    _file.setPositionSync(id * pageSizeInBytes);
+    _file.writeFromSync(page);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/index.dart b/pkg/analysis_server/lib/src/index/index.dart
new file mode 100644
index 0000000..023cfc9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/index.dart
@@ -0,0 +1,115 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/separate_file_manager.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+
+
+Index createLocalFileSplitIndex(Directory directory) {
+  var fileManager = new SeparateFileManager(directory);
+  var stringCodec = new StringCodec();
+  var nodeManager = new FileNodeManager(fileManager,
+      AnalysisEngine.instance.logger, stringCodec, new ContextCodec(),
+      new ElementCodec(stringCodec), new RelationshipCodec(stringCodec));
+  return new LocalIndex(nodeManager);
+}
+
+
+/**
+ * A local implementation of [Index].
+ */
+class LocalIndex extends Index {
+  SplitIndexStore _store;
+
+  LocalIndex(NodeManager nodeManager) {
+    _store = new SplitIndexStore(nodeManager);
+  }
+
+  @override
+  String get statistics => _store.statistics;
+
+  @override
+  void clear() {
+    _store.clear();
+  }
+
+  @override
+  void getRelationships(Element element, Relationship relationship,
+      RelationshipCallback callback) {
+    // TODO(scheglov) update Index API to use asynchronous interface
+    callback.hasRelationships(element, relationship, Location.EMPTY_ARRAY);
+  }
+
+  /**
+   * Returns a `Future<List<Location>>` that completes with the list of
+   * [Location]s of the given [relationship] with the given [element].
+   *
+   * For example, if the [element] represents a function and the [relationship]
+   * is the `is-invoked-by` relationship, then the locations will be all of the
+   * places where the function is invoked.
+   */
+  Future<List<Location>> getRelationshipsAsync(Element element,
+      Relationship relationship) {
+    return _store.getRelationshipsAsync(element, relationship);
+  }
+
+  @override
+  void indexHtmlUnit(AnalysisContext context, HtmlUnit unit) {
+    if (unit == null) {
+      return;
+    }
+    if (unit.element == null) {
+      return;
+    }
+    new IndexHtmlUnitOperation(_store, context, unit).performOperation();
+  }
+
+  @override
+  void indexUnit(AnalysisContext context, CompilationUnit unit) {
+    if (unit == null) {
+      return;
+    }
+    if (unit.element == null) {
+      return;
+    }
+    new IndexUnitOperation(_store, context, unit).performOperation();
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    _store.removeContext(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    _store.removeSource(context, source);
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    _store.removeSources(context, container);
+  }
+
+  @override
+  void run() {
+    // NO-OP if in the same isolate
+  }
+
+  @override
+  void stop() {
+    // NO-OP if in the same isolate
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/lru_cache.dart b/pkg/analysis_server/lib/src/index/lru_cache.dart
new file mode 100644
index 0000000..82dfeb5
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/lru_cache.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.lru_cache;
+
+import 'dart:collection';
+
+
+/**
+ * This handler is notified when an item is evicted from the cache.
+ */
+typedef EvictionHandler<K, V>(K key, V value);
+
+/**
+ * A hash-table based cache implementation.
+ *
+ * When it reaches the specified number of items, the item that has not been
+ * accessed (both get and put) recently is evicted.
+ */
+class LRUCache<K, V> {
+  final LinkedHashSet<K> _lastKeys = new LinkedHashSet<K>();
+  final HashMap<K, V> _map = new HashMap<K, V>();
+  final int _maxSize;
+  final EvictionHandler _handler;
+
+  LRUCache(this._maxSize, [this._handler]);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not
+   * in the cache.
+   */
+  V get(K key) {
+    V value = _map[key];
+    if (value != null) {
+      _lastKeys.remove(key);
+      _lastKeys.add(key);
+    }
+    return value;
+  }
+
+  /**
+   * Removes the association for the given [key].
+   */
+  void remove(K key) {
+    _lastKeys.remove(key);
+    _map.remove(key);
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the cache is full, an item that has not been accessed recently is
+   * evicted.
+   */
+  void put(K key, V value) {
+    _lastKeys.remove(key);
+    _lastKeys.add(key);
+    if (_lastKeys.length > _maxSize) {
+      K evictedKey = _lastKeys.first;
+      V evictedValue = _map.remove(evictedKey);
+      _lastKeys.remove(evictedKey);
+      if (_handler != null) {
+        _handler(evictedKey, evictedValue);
+      }
+    }
+    _map[key] = value;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/page_node_manager.dart b/pkg/analysis_server/lib/src/index/page_node_manager.dart
new file mode 100644
index 0000000..e03374a
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/page_node_manager.dart
@@ -0,0 +1,461 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.page_node_manager;
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/lru_cache.dart';
+
+
+/**
+ * A [NodeManager] that caches a specified number of index and leaf nodes.
+ */
+class CachingNodeManager<K, V, N> implements NodeManager<K, V, N> {
+  final NodeManager<K, V, N> _delegate;
+  LRUCache<N, IndexNodeData<K, N>> _indexCache;
+  LRUCache<N, LeafNodeData<K, V>> _leafCache;
+
+  CachingNodeManager(this._delegate, int indexNodeCacheSize,
+      int leafNodeCacheSize) {
+    _indexCache = new LRUCache<N, IndexNodeData<K, N>>(indexNodeCacheSize,
+        _delegate.writeIndex);
+    _leafCache = new LRUCache<N, LeafNodeData<K, V>>(leafNodeCacheSize,
+        _delegate.writeLeaf);
+  }
+
+  @override
+  int get maxIndexKeys => _delegate.maxIndexKeys;
+
+  @override
+  int get maxLeafKeys => _delegate.maxLeafKeys;
+
+  @override
+  N createIndex() {
+    return _delegate.createIndex();
+  }
+
+  @override
+  N createLeaf() {
+    return _delegate.createLeaf();
+  }
+
+  @override
+  void delete(N id) {
+    _indexCache.remove(id);
+    _leafCache.remove(id);
+    _delegate.delete(id);
+  }
+
+  @override
+  bool isIndex(N id) {
+    return _delegate.isIndex(id);
+  }
+
+  @override
+  IndexNodeData<K, N> readIndex(N id) {
+    IndexNodeData<K, N> data = _indexCache.get(id);
+    if (data == null) {
+      data = _delegate.readIndex(id);
+      _indexCache.put(id, data);
+    }
+    return data;
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(N id) {
+    LeafNodeData<K, V> data = _leafCache.get(id);
+    if (data == null) {
+      data = _delegate.readLeaf(id);
+      _leafCache.put(id, data);
+    }
+    return data;
+  }
+
+  @override
+  void writeIndex(N id, IndexNodeData<K, N> data) {
+    _indexCache.put(id, data);
+  }
+
+  @override
+  void writeLeaf(N id, LeafNodeData<K, V> data) {
+    _leafCache.put(id, data);
+  }
+}
+
+
+/**
+ * A [Codec] encodes and decodes data.
+ */
+abstract class Codec<E> {
+  /**
+   * The size of the value in bytes.
+   */
+  int get sizeInBytes;
+
+  /**
+   * Returns the value decoded from [buffer].
+   *
+   * The given [buffer] has exactly [sizeInBytes] bytes length.
+   */
+  E decode(ByteData buffer);
+
+  /**
+   * Encodes [value] into [buffer].
+   *
+   * The given [buffer] has exactly [sizeInBytes] bytes length.
+   */
+  void encode(ByteData buffer, E value);
+}
+
+
+/**
+ * A [Codec] for strings with a predefined maximum length.
+ */
+class FixedStringCodec implements Codec<String> {
+  final int maxLength;
+  final int sizeInBytes;
+
+  const FixedStringCodec(int maxLength)
+      : maxLength = maxLength,
+        sizeInBytes = 2 + 2 * maxLength;
+
+  @override
+  String decode(ByteData buffer) {
+    int length = buffer.getUint16(0);
+    int offset = 2;
+    List<int> codeUnits = new List<int>(length);
+    for (int i = 0; i < length; i++) {
+      codeUnits[i] = buffer.getUint16(offset);
+      offset += 2;
+    }
+    return new String.fromCharCodes(codeUnits);
+  }
+
+  @override
+  void encode(ByteData buffer, String value) {
+    int length = value.length;
+    if (length > maxLength) {
+      throw new ArgumentError(
+          'String $value length=$length is greater than allowed $maxLength');
+    }
+    buffer.setUint16(0, length);
+    int offset = 2;
+    List<int> codeUnits = value.codeUnits;
+    for (int i = 0; i < length; i++) {
+      buffer.setUint16(offset, codeUnits[i]);
+      offset += 2;
+    }
+  }
+}
+
+
+/**
+ * A [PageManager] that keeps all [Uint8List] pages in memory.
+ */
+class MemoryPageManager implements PageManager {
+  final int pageSizeInBytes;
+  int _nextPage = 0;
+  final Map<int, Uint8List> _pages = new HashMap<int, Uint8List>();
+
+  MemoryPageManager(this.pageSizeInBytes);
+
+  @override
+  int alloc() {
+    int id = _nextPage++;
+    Uint8List page = new Uint8List(pageSizeInBytes);
+    _pages[id] = page;
+    return id;
+  }
+
+  @override
+  void free(int id) {
+    Uint8List page = _pages.remove(id);
+    if (page == null) {
+      throw new StateError('Page $id has been already freed.');
+    }
+  }
+
+  @override
+  Uint8List read(int id) {
+    Uint8List page = _pages[id];
+    if (page == null) {
+      throw new StateError('Page $id does not exist.');
+    }
+    return page;
+  }
+
+  @override
+  void write(int id, Uint8List page) {
+    if (!_pages.containsKey(id)) {
+      throw new StateError('Page $id does not exist.');
+    }
+    if (page.length != pageSizeInBytes) {
+      throw new ArgumentError('Page $id has length ${page.length}, '
+          'but $pageSizeInBytes is expected.');
+    }
+    _pages[id] = page;
+  }
+}
+
+
+/**
+ * [PageManager] allows to allocate, read, write and free [Uint8List] pages.
+ */
+abstract class PageManager {
+  /**
+   * The size of pages provided by this [PageManager].
+   */
+  int get pageSizeInBytes;
+
+  /**
+   * Allocates a new page and returns its identifier.
+   */
+  int alloc();
+
+  /**
+   * Frees the page with the given identifier.
+   */
+  void free(int id);
+
+  /**
+   * Reads the page with the given identifier and returns its content.
+   *
+   * An internal representation of the page is returned, any changes made to it
+   * may be accessible to other clients reading the same page.
+   */
+  Uint8List read(int id);
+
+  /**
+   * Writes the given page.
+   */
+  void write(int id, Uint8List page);
+}
+
+
+/**
+ * A [NodeManager] that keeps nodes in [PageManager].
+ */
+class PageNodeManager<K, V> implements NodeManager<K, V, int> {
+  static const int _INDEX_OFFSET_DATA = 4;
+  static const int _INDEX_OFFSET_KEY_COUNT = 0;
+  static const int _LEAF_OFFSET_DATA = 4;
+  static const int _LEAF_OFFSET_KEY_COUNT = 0;
+
+  final Set<int> _indexPages = new HashSet<int>();
+  Codec<K> _keyCodec;
+  final Set<int> _leafPages = new HashSet<int>();
+  PageManager _pageManager;
+  Codec<V> _valueCodec;
+
+  PageNodeManager(this._pageManager, this._keyCodec, this._valueCodec);
+
+  @override
+  int get maxIndexKeys {
+    int keySize = _keyCodec.sizeInBytes;
+    int childSize = 4;
+    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
+    return (dataSize - childSize) ~/ (keySize + childSize);
+  }
+
+  @override
+  int get maxLeafKeys {
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int dataSize = _pageManager.pageSizeInBytes - _INDEX_OFFSET_DATA;
+    return dataSize ~/ (keySize + valueSize);
+  }
+
+  @override
+  int createIndex() {
+    int id = _pageManager.alloc();
+    _indexPages.add(id);
+    return id;
+  }
+
+  @override
+  int createLeaf() {
+    int id = _pageManager.alloc();
+    _leafPages.add(id);
+    return id;
+  }
+
+  @override
+  void delete(int id) {
+    _pageManager.free(id);
+    _indexPages.remove(id);
+    _leafPages.remove(id);
+  }
+
+  @override
+  bool isIndex(int id) {
+    return _indexPages.contains(id);
+  }
+
+  @override
+  IndexNodeData<K, int> readIndex(int id) {
+    Uint8List page = _pageManager.read(id);
+    // read header
+    int keyCount;
+    {
+      ByteData data = new ByteData.view(page.buffer);
+      keyCount = data.getInt32(_INDEX_OFFSET_KEY_COUNT);
+    }
+    // read keys/children
+    List<K> keys = new List<K>();
+    List<int> children = new List<int>();
+    int keySize = _keyCodec.sizeInBytes;
+    int offset = _INDEX_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // read child
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        int childPage = byteData.getUint32(0);
+        children.add(childPage);
+        offset += 4;
+      }
+      // read key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        K key = _keyCodec.decode(byteData);
+        keys.add(key);
+        offset += keySize;
+      }
+    }
+    // read last child
+    {
+      ByteData byteData = new ByteData.view(page.buffer, offset);
+      int childPage = byteData.getUint32(0);
+      children.add(childPage);
+    }
+    // done
+    return new IndexNodeData<K, int>(keys, children);
+  }
+
+  @override
+  LeafNodeData<K, V> readLeaf(int id) {
+    Uint8List page = _pageManager.read(id);
+    // read header
+    int keyCount;
+    {
+      ByteData data = new ByteData.view(page.buffer);
+      keyCount = data.getInt32(_LEAF_OFFSET_KEY_COUNT);
+    }
+    // read keys/children
+    List<K> keys = new List<K>();
+    List<V> values = new List<V>();
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int offset = _LEAF_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // read key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        K key = _keyCodec.decode(byteData);
+        keys.add(key);
+        offset += keySize;
+      }
+      // read value
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        V value = _valueCodec.decode(byteData);
+        values.add(value);
+        offset += valueSize;
+      }
+    }
+    // done
+    return new LeafNodeData<K, V>(keys, values);
+  }
+
+  @override
+  void writeIndex(int id, IndexNodeData<K, int> data) {
+    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
+    // write header
+    int keyCount = data.keys.length;
+    {
+      ByteData byteData = new ByteData.view(page.buffer);
+      byteData.setUint32(PageNodeManager._INDEX_OFFSET_KEY_COUNT, keyCount);
+    }
+    // write keys/children
+    int keySize = _keyCodec.sizeInBytes;
+    int offset = PageNodeManager._INDEX_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // write child
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        byteData.setUint32(0, data.children[i]);
+        offset += 4;
+      }
+      // write key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        _keyCodec.encode(byteData, data.keys[i]);
+        offset += keySize;
+      }
+    }
+    // write last child
+    {
+      ByteData byteData = new ByteData.view(page.buffer, offset);
+      byteData.setUint32(0, data.children.last);
+    }
+    // write page
+    _pageManager.write(id, page);
+  }
+
+  @override
+  void writeLeaf(int id, LeafNodeData<K, V> data) {
+    Uint8List page = new Uint8List(_pageManager.pageSizeInBytes);
+    // write header
+    int keyCount = data.keys.length;
+    {
+      ByteData byteData = new ByteData.view(page.buffer);
+      byteData.setUint32(PageNodeManager._LEAF_OFFSET_KEY_COUNT, keyCount);
+    }
+    // write keys/values
+    int keySize = _keyCodec.sizeInBytes;
+    int valueSize = _valueCodec.sizeInBytes;
+    int offset = PageNodeManager._LEAF_OFFSET_DATA;
+    for (int i = 0; i < keyCount; i++) {
+      // write key
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset, keySize);
+        _keyCodec.encode(byteData, data.keys[i]);
+        offset += keySize;
+      }
+      // write value
+      {
+        ByteData byteData = new ByteData.view(page.buffer, offset);
+        _valueCodec.encode(byteData, data.values[i]);
+        offset += valueSize;
+      }
+    }
+    // write page
+    _pageManager.write(id, page);
+  }
+}
+
+
+/**
+ * A [Codec] for unsigned 32-bit integers.
+ */
+class Uint32Codec implements Codec<int> {
+  static const Uint32Codec INSTANCE = const Uint32Codec._();
+
+  const Uint32Codec._();
+
+  @override
+  int get sizeInBytes => 4;
+
+  @override
+  int decode(ByteData buffer) {
+    return buffer.getUint32(0);
+  }
+
+  @override
+  void encode(ByteData buffer, int element) {
+    buffer.setUint32(0, element);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/codec.dart b/pkg/analysis_server/lib/src/index/store/codec.dart
new file mode 100644
index 0000000..20a66fd
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/codec.dart
@@ -0,0 +1,216 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.store.codec;
+
+import 'dart:collection';
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+
+
+/**
+ * A helper that encodes/decodes [AnalysisContext]s from/to integers.
+ */
+class ContextCodec {
+  /**
+   * A table mapping contexts to their unique indices.
+   */
+  Map<AnalysisContext, int> _contextToIndex = new HashMap<AnalysisContext, int>(
+      );
+
+  /**
+   * A table mapping indices to the corresponding contexts.
+   */
+  Map<int, AnalysisContext> _indexToContext = new HashMap<int, AnalysisContext>(
+      );
+
+  /**
+   * The next id to assign.
+   */
+  int _nextId = 0;
+
+  /**
+   * Returns the [AnalysisContext] that corresponds to the given index.
+   */
+  AnalysisContext decode(int index) => _indexToContext[index];
+
+  /**
+   * Returns an unique index for the given [AnalysisContext].
+   */
+  int encode(AnalysisContext context) {
+    int index = _contextToIndex[context];
+    if (index == null) {
+      index = _nextId++;
+      _contextToIndex[context] = index;
+      _indexToContext[index] = context;
+    }
+    return index;
+  }
+
+  /**
+   * Removes the given [context].
+   */
+  void remove(AnalysisContext context) {
+    int id = _contextToIndex.remove(context);
+    if (id != null) {
+      _indexToContext.remove(id);
+    }
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [Element]s to/from integers.
+ */
+class ElementCodec {
+  /**
+   * A list that works as a mapping of integers to element encodings (in form of integer arrays).
+   */
+  List<List<int>> _indexToPath = [];
+
+  /**
+   * A table mapping element locations (in form of integer arrays) into a single integer.
+   */
+  IntArrayToIntMap _pathToIndex = new IntArrayToIntMap();
+
+  final StringCodec _stringCodec;
+
+  ElementCodec(this._stringCodec);
+
+  /**
+   * Returns an [Element] that corresponds to the given location.
+   *
+   * @param context the [AnalysisContext] to find [Element] in
+   * @param index an integer corresponding to the [Element]
+   * @return the [Element] or `null`
+   */
+  Element decode(AnalysisContext context, int index) {
+    List<int> path = _indexToPath[index];
+    List<String> components = _getLocationComponents(path);
+    ElementLocation location = new ElementLocationImpl.con3(components);
+    return context.getElement(location);
+  }
+
+  /**
+   * Returns a unique integer that corresponds to the given [Element].
+   */
+  int encode(Element element) {
+    List<int> path = _getLocationPath(element);
+    int index = _pathToIndex[path];
+    if (index == null) {
+      index = _indexToPath.length;
+      _pathToIndex[path] = index;
+      _indexToPath.add(path);
+    }
+    return index;
+  }
+
+  List<String> _getLocationComponents(List<int> path) {
+    int length = path.length;
+    List<String> components = new List<String>();
+    for (int i = 0; i < length; i++) {
+      int componentId = path[i];
+      String component = _stringCodec.decode(componentId);
+      if (i < length - 1 && path[i + 1] < 0) {
+        component += '@${(-path[i + 1])}';
+        i++;
+      }
+      components.add(component);
+    }
+    return components;
+  }
+
+  List<int> _getLocationPath(Element element) {
+    List<String> components = element.location.components;
+    int length = components.length;
+    if (_hasLocalOffset(components)) {
+      List<int> path = new List<int>();
+      for (String component in components) {
+        int atOffset = component.indexOf('@');
+        if (atOffset == -1) {
+          path.add(_stringCodec.encode(component));
+        } else {
+          String preAtString = component.substring(0, atOffset);
+          String atString = component.substring(atOffset + 1);
+          path.add(_stringCodec.encode(preAtString));
+          path.add(-1 * int.parse(atString));
+        }
+      }
+      return path;
+    } else {
+      List<int> path = new List<int>.filled(length, 0);
+      for (int i = 0; i < length; i++) {
+        String component = components[i];
+        path[i] = _stringCodec.encode(component);
+      }
+      return path;
+    }
+  }
+
+  bool _hasLocalOffset(List<String> components) {
+    for (String component in components) {
+      if (component.indexOf('@') != -1) {
+        return true;
+      }
+    }
+    return false;
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [Relationship]s to/from integers.
+ */
+class RelationshipCodec {
+  final StringCodec _stringCodec;
+
+  RelationshipCodec(this._stringCodec);
+
+  Relationship decode(int idIndex) {
+    String id = _stringCodec.decode(idIndex);
+    return Relationship.getRelationship(id);
+  }
+
+  int encode(Relationship relationship) {
+    String id = relationship.identifier;
+    return _stringCodec.encode(id);
+  }
+}
+
+
+/**
+ * A helper that encodes/decodes [String]s from/to integers.
+ */
+class StringCodec {
+  /**
+   * A table mapping names to their unique indices.
+   */
+  final Map<String, int> nameToIndex = {};
+
+  /**
+   * A table mapping indices to the corresponding strings.
+   */
+  List<String> _indexToName = [];
+
+  /**
+   * Returns the [String] that corresponds to the given index.
+   */
+  String decode(int index) => _indexToName[index];
+
+  /**
+   * Returns an unique index for the given [String].
+   */
+  int encode(String name) {
+    int index = nameToIndex[name];
+    if (index == null) {
+      index = _indexToName.length;
+      nameToIndex[name] = index;
+      _indexToName.add(name);
+    }
+    return index;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/collection.dart b/pkg/analysis_server/lib/src/index/store/collection.dart
new file mode 100644
index 0000000..3c29445
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/collection.dart
@@ -0,0 +1,116 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.store.collection;
+
+import 'dart:collection';
+import 'dart:typed_data';
+
+
+/**
+ * A hash map with `List<int>` keys and [int] values.
+ */
+class IntArrayToIntMap {
+  final Map<Int32List, int> map = new HashMap<Int32List, int>(equals:
+      _intArrayEquals, hashCode: _intArrayHashCode);
+
+  /**
+   * Returns the value for the given [key] or null if [key] is not in the map.
+   */
+  int operator[](List<int> key) {
+    Int32List typedKey = _getTypedKey(key);
+    return map[typedKey];
+  }
+
+  /**
+   * Associates the [key] with the given [value].
+   *
+   * If the key was already in the map, its associated value is changed.
+   * Otherwise the key-value pair is added to the map.
+   */
+  void operator[]=(List<int> key, int value) {
+    Int32List typedKey = _getTypedKey(key);
+    map[typedKey] = value;
+  }
+
+  /**
+   * Returns an [Int32List] version of the given `List<int>` key.
+   */
+  static Int32List _getTypedKey(List<int> key) {
+    if (key is Int32List) {
+      return key;
+    }
+    return new Int32List.fromList(key);
+  }
+
+  static bool _intArrayEquals(List<int> a, List<int> b) {
+    int length = a.length;
+    if (length != b.length) {
+      return false;
+    }
+    for (int i = 0; i < length; i++) {
+      if (a[i] != b[i]) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  static int _intArrayHashCode(List<int> key) {
+    return key.fold(0, (int result, int item) {
+      return 31 * result + item;
+    });
+  }
+}
+
+
+/**
+ * A table mapping [int] keys to sets of [int]s.
+ */
+class IntToIntSetMap {
+  final Map<int, Int32List> _map = new HashMap<int, Int32List>();
+
+  /**
+   * The number of key-value pairs in the map.
+   */
+  int get length => _map.length;
+
+  /**
+   * Adds the [value] to the set associated with the given [value].
+   */
+  void add(int key, int value) {
+    Int32List values = _map[key];
+    if (values == null) {
+      values = new Int32List(1);
+      values[0] = value;
+      _map[key] = values;
+    }
+    if (values.indexOf(value) == -1) {
+      int length = values.length;
+      Int32List newSet = new Int32List(length + 1);
+      newSet.setRange(0, length, values);
+      newSet[length] = value;
+      _map[key] = newSet;
+    }
+  }
+
+  /**
+   * Removes all pairs from the map.
+   */
+  void clear() {
+    _map.clear();
+  }
+
+  /**
+   * Returns the set of [int]s for the given [key] or an empty list if [key] is
+   * not in the map.
+   */
+  List<int> get(int key) {
+    List<int> values = _map[key];
+    if (values == null) {
+      values = <int>[];
+    }
+    return values;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart b/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
new file mode 100644
index 0000000..143fb5e
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/separate_file_manager.dart
@@ -0,0 +1,59 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.store.separate_file_mananer;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * An implementation of [FileManager] that keeps each file in a separate file
+ * system file.
+ */
+class SeparateFileManager implements FileManager {
+  final Directory _directory;
+
+  SeparateFileManager(this._directory) {
+    clear();
+  }
+
+  @override
+  void clear() {
+    List<FileSystemEntity> entries = _directory.listSync();
+    for (FileSystemEntity entry in entries) {
+      entry.deleteSync(recursive: true);
+    }
+  }
+
+  @override
+  void delete(String name) {
+    File file = _getFile(name);
+    try {
+      file.deleteSync();
+    } catch (e) {
+    }
+  }
+
+  @override
+  Future<List<int>> read(String name) {
+    File file = _getFile(name);
+    return file.readAsBytes().catchError((e) {
+      return null;
+    });
+  }
+
+  @override
+  Future write(String name, List<int> bytes) {
+    return _getFile(name).writeAsBytes(bytes);
+  }
+
+  File _getFile(String name) {
+    String path = pathos.join(_directory.path, name);
+    return new File(path);
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/index/store/split_store.dart b/pkg/analysis_server/lib/src/index/store/split_store.dart
new file mode 100644
index 0000000..ccb6bd9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/index/store/split_store.dart
@@ -0,0 +1,898 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library index.split_store;
+
+import 'dart:async';
+import 'dart:collection';
+import 'dart:io';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/java_engine.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:analysis_server/src/index/store/codec.dart';
+
+
+/**
+ * A manager for files content.
+ */
+abstract class FileManager {
+  /**
+   * Removes all files.
+   */
+  void clear();
+
+  /**
+   * Deletes the file with the given name.
+   */
+  void delete(String name);
+
+  /**
+   * Read the entire file contents as a list of bytes.
+   */
+  Future<List<int>> read(String name);
+
+  /**
+   * Write a list of bytes to a file.
+   */
+  Future write(String name, List<int> bytes);
+}
+
+
+/**
+ * A [FileManager] based [NodeManager].
+ */
+class FileNodeManager implements NodeManager {
+  static int _VERSION = 1;
+
+  final ContextCodec contextCodec;
+
+  final ElementCodec elementCodec;
+
+  final StringCodec stringCodec;
+
+  final FileManager _fileManager;
+
+  int _locationCount = 0;
+
+  final Logger _logger;
+
+  Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
+
+  final RelationshipCodec _relationshipCodec;
+
+  FileNodeManager(this._fileManager, this._logger, this.stringCodec,
+      this.contextCodec, this.elementCodec, this._relationshipCodec);
+
+  @override
+  int get locationCount => _locationCount;
+
+  @override
+  void clear() {
+    _fileManager.clear();
+  }
+
+  @override
+  Future<IndexNode> getNode(String name) {
+    return _fileManager.read(name).then((List<int> bytes) {
+      if (bytes == null) {
+        return null;
+      }
+      _DataInputStream stream = new _DataInputStream(bytes);
+      return _readNode(stream);
+    }).catchError((e, stackTrace) {
+      _logger.logError2('Exception during reading index file ${name}',
+          new CaughtException(e, stackTrace));
+    });
+  }
+
+  @override
+  IndexNode newNode(AnalysisContext context) => new IndexNode(context,
+      elementCodec, _relationshipCodec);
+
+  @override
+  Future putNode(String name, IndexNode node) {
+    // update location count
+    {
+      _locationCount -= _getLocationCount(name);
+      int nodeLocationCount = node.locationCount;
+      _nodeLocationCounts[name] = nodeLocationCount;
+      _locationCount += nodeLocationCount;
+    }
+    // write the node
+    return new Future.microtask(() {
+      _DataOutputStream stream = new _DataOutputStream();
+      _writeNode(node, stream);
+      var bytes = stream.getBytes();
+      return _fileManager.write(name, bytes);
+    }).catchError((e, stackTrace) {
+      _logger.logError2('Exception during reading index file ${name}',
+          new CaughtException(e, stackTrace));
+    });
+  }
+
+  @override
+  void removeNode(String name) {
+    // update location count
+    _locationCount -= _getLocationCount(name);
+    _nodeLocationCounts.remove(name);
+    // remove node
+    _fileManager.delete(name);
+  }
+
+  int _getLocationCount(String name) {
+    int locationCount = _nodeLocationCounts[name];
+    return locationCount != null ? locationCount : 0;
+  }
+
+  RelationKeyData _readElementRelationKey(_DataInputStream stream) {
+    int elementId = stream.readInt();
+    int relationshipId = stream.readInt();
+    return new RelationKeyData.forData(elementId, relationshipId);
+  }
+
+  LocationData _readLocationData(_DataInputStream stream) {
+    int elementId = stream.readInt();
+    int offset = stream.readInt();
+    int length = stream.readInt();
+    return new LocationData.forData(elementId, offset, length);
+  }
+
+  IndexNode _readNode(_DataInputStream stream) {
+    // check version
+    {
+      int version = stream.readInt();
+      if (version != _VERSION) {
+        throw new StateError(
+            'Version ${_VERSION} expected, but ${version} found.');
+      }
+    }
+    // context
+    int contextId = stream.readInt();
+    AnalysisContext context = contextCodec.decode(contextId);
+    if (context == null) {
+      return null;
+    }
+    // relations
+    Map<RelationKeyData, List<LocationData>> relations =
+        new HashMap<RelationKeyData, List<LocationData>>();
+    int numRelations = stream.readInt();
+    for (int i = 0; i < numRelations; i++) {
+      RelationKeyData key = _readElementRelationKey(stream);
+      int numLocations = stream.readInt();
+      List<LocationData> locations = new List<LocationData>();
+      for (int j = 0; j < numLocations; j++) {
+        locations.add(_readLocationData(stream));
+      }
+      relations[key] = locations;
+    }
+    // create IndexNode
+    IndexNode node = new IndexNode(context, elementCodec, _relationshipCodec);
+    node.relations = relations;
+    return node;
+  }
+
+  void _writeElementRelationKey(_DataOutputStream stream, RelationKeyData key) {
+    stream.writeInt(key.elementId);
+    stream.writeInt(key.relationshipId);
+  }
+
+  void _writeNode(IndexNode node, _DataOutputStream stream) {
+    // version
+    stream.writeInt(_VERSION);
+    // context
+    {
+      AnalysisContext context = node.context;
+      int contextId = contextCodec.encode(context);
+      stream.writeInt(contextId);
+    }
+    // relations
+    Map<RelationKeyData, List<LocationData>> relations = node.relations;
+    stream.writeInt(relations.length);
+    relations.forEach((key, locations) {
+      _writeElementRelationKey(stream, key);
+      stream.writeInt(locations.length);
+      for (LocationData location in locations) {
+        stream.writeInt(location.elementId);
+        stream.writeInt(location.offset);
+        stream.writeInt(location.length);
+      }
+    });
+  }
+}
+
+
+/**
+ * A single index file in-memory presentation.
+ */
+class IndexNode {
+  final AnalysisContext context;
+
+  final ElementCodec _elementCodec;
+
+  Map<RelationKeyData, List<LocationData>> _relations =
+      new HashMap<RelationKeyData, List<LocationData>>();
+
+  final RelationshipCodec _relationshipCodec;
+
+  IndexNode(this.context, this._elementCodec, this._relationshipCodec);
+
+  /**
+   * Returns number of locations in this node.
+   */
+  int get locationCount {
+    int locationCount = 0;
+    for (List<LocationData> locations in _relations.values) {
+      locationCount += locations.length;
+    }
+    return locationCount;
+  }
+
+  /**
+   * Returns the recorded relations.
+   */
+  Map<RelationKeyData, List<LocationData>> get relations => _relations;
+
+  /**
+   * Sets relations data. This method is used during loading data from a storage.
+   */
+  void set relations(Map<RelationKeyData, List<LocationData>> relations) {
+    this._relations.clear();
+    this._relations.addAll(relations);
+  }
+
+  /**
+   * Return the locations of the elements that have the given relationship with the given element.
+   *
+   * @param element the the element that has the relationship with the locations to be returned
+   * @param relationship the [Relationship] between the given element and the locations to be
+   *          returned
+   */
+  List<Location> getRelationships(Element element, Relationship relationship) {
+    // prepare key
+    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
+        _relationshipCodec, element, relationship);
+    // find LocationData(s)
+    List<LocationData> locationDatas = _relations[key];
+    if (locationDatas == null) {
+      return Location.EMPTY_ARRAY;
+    }
+    // convert to Location(s)
+    List<Location> locations = <Location>[];
+    for (LocationData locationData in locationDatas) {
+      Location location = locationData.getLocation(context, _elementCodec);
+      if (location != null) {
+        locations.add(location);
+      }
+    }
+    return locations;
+  }
+
+  /**
+   * Records that the given element and location have the given relationship.
+   *
+   * @param element the element that is related to the location
+   * @param relationship the [Relationship] between the element and the location
+   * @param location the [Location] where relationship happens
+   */
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    RelationKeyData key = new RelationKeyData.forObject(_elementCodec,
+        _relationshipCodec, element, relationship);
+    // prepare LocationData(s)
+    List<LocationData> locationDatas = _relations[key];
+    if (locationDatas == null) {
+      locationDatas = <LocationData>[];
+      _relations[key] = locationDatas;
+    }
+    // add new LocationData
+    locationDatas.add(new LocationData.forObject(_elementCodec, location));
+  }
+}
+
+
+/**
+ * A container with information about a [Location].
+ */
+class LocationData {
+  final int elementId;
+  final int length;
+  final int offset;
+
+  LocationData.forData(this.elementId, this.offset, this.length);
+
+  LocationData.forObject(ElementCodec elementCodec, Location location)
+      : elementId = elementCodec.encode(location.element),
+        offset = location.offset,
+        length = location.length;
+
+  @override
+  int get hashCode {
+    return 31 * (31 * elementId + offset) + length;
+  }
+
+  @override
+  bool operator ==(Object obj) {
+    if (obj is! LocationData) {
+      return false;
+    }
+    LocationData other = obj;
+    return other.elementId == elementId && other.offset == offset &&
+        other.length == length;
+  }
+
+  /**
+   * Returns a {@link Location} that is represented by this {@link LocationData}.
+   */
+  Location getLocation(AnalysisContext context, ElementCodec elementCodec) {
+    Element element = elementCodec.decode(context, elementId);
+    if (element == null) {
+      return null;
+    }
+    return new Location(element, offset, length);
+  }
+}
+
+
+/**
+ * A manager for [IndexNode]s.
+ */
+abstract class NodeManager {
+  /**
+   * The shared {@link ContextCodec} instance.
+   */
+  ContextCodec get contextCodec;
+
+  /**
+   * The shared {@link ElementCodec} instance.
+   */
+  ElementCodec get elementCodec;
+
+  /**
+   * A number of locations in all nodes.
+   */
+  int get locationCount;
+
+  /**
+   * The shared {@link StringCodec} instance.
+   */
+  StringCodec get stringCodec;
+
+  /**
+   * Removes all nodes.
+   */
+  void clear();
+
+  /**
+   * Returns the {@link IndexNode} with the given name, {@code null} if not found.
+   */
+  Future<IndexNode> getNode(String name);
+
+  /**
+   * Returns a new {@link IndexNode}.
+   */
+  IndexNode newNode(AnalysisContext context);
+
+  /**
+   * Associates the given {@link IndexNode} with the given name.
+   */
+  void putNode(String name, IndexNode node);
+
+  /**
+   * Removes the {@link IndexNode} with the given name.
+   */
+  void removeNode(String name);
+}
+
+
+/**
+ * An [Element] to [Location] relation key.
+ */
+class RelationKeyData {
+  final int elementId;
+  final int relationshipId;
+
+  RelationKeyData.forData(this.elementId, this.relationshipId);
+
+  RelationKeyData.forObject(ElementCodec elementCodec,
+      RelationshipCodec relationshipCodec, Element element, Relationship relationship)
+      : elementId = elementCodec.encode(element),
+        relationshipId = relationshipCodec.encode(relationship);
+
+  @override
+  int get hashCode {
+    return 31 * elementId + relationshipId;
+  }
+
+  @override
+  bool operator ==(Object obj) {
+    if (obj is! RelationKeyData) {
+      return false;
+    }
+    RelationKeyData other = obj;
+    return other.elementId == elementId && other.relationshipId ==
+        relationshipId;
+  }
+}
+
+
+/**
+ * An [IndexStore] which keeps index information in separate nodes for each unit.
+ */
+class SplitIndexStore implements IndexStore {
+  /**
+   * The [ContextCodec] to encode/decode [AnalysisContext]s.
+   */
+  ContextCodec _contextCodec;
+
+  /**
+   * Information about "universe" elements.
+   * We need to keep them together to avoid loading of all index nodes.
+   *
+   * Order of keys: contextId, nodeId, Relationship.
+   */
+  Map<int, Map<int, Map<Relationship, List<LocationData>>>>
+      _contextNodeRelations = new HashMap<int, Map<int, Map<Relationship,
+      List<LocationData>>>>();
+
+  /**
+   * The mapping of library [Source] to the [Source]s of part units.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToLibraryToUnits =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  /**
+   * The mapping of unit [Source] to the [Source]s of libraries it is used in.
+   */
+  Map<AnalysisContext, Map<Source, Set<Source>>> _contextToUnitToLibraries =
+      new HashMap<AnalysisContext, Map<Source, Set<Source>>>();
+
+  int _currentContextId = 0;
+
+  IndexNode _currentNode;
+
+  String _currentNodeName;
+
+  int _currentNodeNameId = 0;
+
+  /**
+   * The [ElementCodec] to encode/decode [Element]s.
+   */
+  ElementCodec _elementCodec;
+
+  /**
+   * A table mapping element names to the node names that may have relations with elements with
+   * these names.
+   */
+  IntToIntSetMap _nameToNodeNames = new IntToIntSetMap();
+
+  /**
+   * The [NodeManager] to get/put [IndexNode]s.
+   */
+  final NodeManager _nodeManager;
+
+  /**
+   * The set of known [Source]s.
+   */
+  Set<Source> _sources = new HashSet<Source>();
+
+  /**
+   * The [StringCodec] to encode/decode [String]s.
+   */
+  StringCodec _stringCodec;
+
+  SplitIndexStore(this._nodeManager) {
+    this._contextCodec = _nodeManager.contextCodec;
+    this._elementCodec = _nodeManager.elementCodec;
+    this._stringCodec = _nodeManager.stringCodec;
+  }
+
+  @override
+  String get statistics =>
+      '[${_nodeManager.locationCount} locations, ${_sources.length} sources, ${_nameToNodeNames.length} names]';
+
+  @override
+  bool aboutToIndexDart(AnalysisContext context,
+      CompilationUnitElement unitElement) {
+    context = _unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // validate unit
+    if (unitElement == null) {
+      return false;
+    }
+    LibraryElement libraryElement = unitElement.library;
+    if (libraryElement == null) {
+      return false;
+    }
+    CompilationUnitElement definingUnitElement =
+        libraryElement.definingCompilationUnit;
+    if (definingUnitElement == null) {
+      return false;
+    }
+    // prepare sources
+    Source library = definingUnitElement.source;
+    Source unit = unitElement.source;
+    // special handling for the defining library unit
+    if (unit == library) {
+      // prepare new parts
+      HashSet<Source> newParts = new HashSet<Source>();
+      for (CompilationUnitElement part in libraryElement.parts) {
+        newParts.add(part.source);
+      }
+      // prepare old parts
+      Map<Source, Set<Source>> libraryToUnits =
+          _contextToLibraryToUnits[context];
+      if (libraryToUnits == null) {
+        libraryToUnits = new HashMap<Source, Set<Source>>();
+        _contextToLibraryToUnits[context] = libraryToUnits;
+      }
+      Set<Source> oldParts = libraryToUnits[library];
+      // check if some parts are not in the library now
+      if (oldParts != null) {
+        Set<Source> noParts = oldParts.difference(newParts);
+        for (Source noPart in noParts) {
+          _removeLocations(context, library, noPart);
+        }
+      }
+      // remember new parts
+      libraryToUnits[library] = newParts;
+    }
+    // remember library/unit relations
+    _recordUnitInLibrary(context, library, unit);
+    _recordLibraryWithUnit(context, library, unit);
+    _sources.add(library);
+    _sources.add(unit);
+    // prepare node
+    String libraryName = library.fullName;
+    String unitName = unit.fullName;
+    int libraryNameIndex = _stringCodec.encode(libraryName);
+    int unitNameIndex = _stringCodec.encode(unitName);
+    _currentNodeName = '${libraryNameIndex}_${unitNameIndex}.index';
+    _currentNodeNameId = _stringCodec.encode(_currentNodeName);
+    _currentNode = _nodeManager.newNode(context);
+    _currentContextId = _contextCodec.encode(context);
+    // remove Universe information for the current node
+    for (Map<int, dynamic> nodeRelations in _contextNodeRelations.values) {
+      nodeRelations.remove(_currentNodeNameId);
+    }
+    // done
+    return true;
+  }
+
+  @override
+  bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement) {
+    context = _unwrapContext(context);
+    // may be already disposed in other thread
+    if (context.isDisposed) {
+      return false;
+    }
+    // remove locations
+    Source source = htmlElement.source;
+    _removeLocations(context, null, source);
+    // remember library/unit relations
+    _recordUnitInLibrary(context, null, source);
+    // prepare node
+    String sourceName = source.fullName;
+    int sourceNameIndex = _stringCodec.encode(sourceName);
+    _currentNodeName = '${sourceNameIndex}.index';
+    _currentNodeNameId = _stringCodec.encode(_currentNodeName);
+    _currentNode = _nodeManager.newNode(context);
+    return true;
+  }
+
+  @override
+  void clear() {
+    _contextNodeRelations.clear();
+    _nodeManager.clear();
+    _nameToNodeNames.clear();
+  }
+
+  @override
+  void doneIndex() {
+    if (_currentNode != null) {
+      _nodeManager.putNode(_currentNodeName, _currentNode);
+      _currentNodeName = null;
+      _currentNodeNameId = -1;
+      _currentNode = null;
+      _currentContextId = -1;
+    }
+  }
+
+  @override
+  List<Location> getRelationships(Element element, Relationship relationship) {
+    // TODO(scheglov) make IndexStore interface async
+    return <Location>[];
+  }
+
+  Future<List<Location>> getRelationshipsAsync(Element element,
+      Relationship relationship) {
+    // special support for UniverseElement
+    if (identical(element, UniverseElement.INSTANCE)) {
+      List<Location> locations = _getRelationshipsUniverse(relationship);
+      return new Future.value(locations);
+    }
+    // prepare node names
+    String name = _getElementName(element);
+    int nameId = _stringCodec.encode(name);
+    List<int> nodeNameIds = _nameToNodeNames.get(nameId);
+    // prepare Future(s) for reading each IndexNode
+    List<Future<List<Location>>> nodeFutures = <Future<List<Location>>>[];
+    for (int nodeNameId in nodeNameIds) {
+      String nodeName = _stringCodec.decode(nodeNameId);
+      Future<IndexNode> nodeFuture = _nodeManager.getNode(nodeName);
+      Future<List<Location>> locationsFuture = nodeFuture.then((node) {
+        if (node == null) {
+          // TODO(scheglov) remove node
+          return Location.EMPTY_ARRAY;
+        }
+        return node.getRelationships(element, relationship);
+      });
+      nodeFutures.add(locationsFuture);
+    }
+    // return Future that merges separate IndexNode Location(s)
+    return Future.wait(nodeFutures).then((List<List<Location>> locationsList) {
+      List<Location> allLocations = <Location>[];
+      for (List<Location> locations in locationsList) {
+        allLocations.addAll(locations);
+      }
+      return allLocations;
+    });
+  }
+
+  @override
+  void recordRelationship(Element element, Relationship relationship,
+      Location location) {
+    if (element == null || location == null) {
+      return;
+    }
+    // special support for UniverseElement
+    if (identical(element, UniverseElement.INSTANCE)) {
+      _recordRelationshipUniverse(relationship, location);
+      return;
+    }
+    // other elements
+    _recordNodeNameForElement(element);
+    _currentNode.recordRelationship(element, relationship, location);
+  }
+
+  @override
+  void removeContext(AnalysisContext context) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove sources
+    removeSources(context, null);
+    // remove context information
+    _contextToLibraryToUnits.remove(context);
+    _contextToUnitToLibraries.remove(context);
+    _contextNodeRelations.remove(_contextCodec.encode(context));
+    // remove context from codec
+    _contextCodec.remove(context);
+  }
+
+  @override
+  void removeSource(AnalysisContext context, Source source) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      Set<Source> libraries = unitToLibraries.remove(source);
+      if (libraries != null) {
+        for (Source library in libraries) {
+          _removeLocations(context, library, source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      Set<Source> units = libraryToUnits.remove(source);
+      if (units != null) {
+        for (Source unit in units) {
+          _removeLocations(context, source, unit);
+        }
+      }
+    }
+  }
+
+  @override
+  void removeSources(AnalysisContext context, SourceContainer container) {
+    context = _unwrapContext(context);
+    if (context == null) {
+      return;
+    }
+    // remove nodes for unit/library pairs
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries != null) {
+      List<Source> units = new List<Source>.from(unitToLibraries.keys);
+      for (Source source in units) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+    // remove nodes for library/unit pairs
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits != null) {
+      List<Source> libraries = new List<Source>.from(libraryToUnits.keys);
+      for (Source source in libraries) {
+        if (container == null || container.contains(source)) {
+          removeSource(context, source);
+        }
+      }
+    }
+  }
+
+  String _getElementName(Element element) => element.name;
+
+  List<Location> _getRelationshipsUniverse(Relationship relationship) {
+    List<Location> locations = <Location>[];
+    _contextNodeRelations.forEach((contextId, contextRelations) {
+      AnalysisContext context = _contextCodec.decode(contextId);
+      if (context != null) {
+        for (Map<Relationship, List<LocationData>> nodeRelations in
+            contextRelations.values) {
+          List<LocationData> nodeLocations = nodeRelations[relationship];
+          if (nodeLocations != null) {
+            for (LocationData locationData in nodeLocations) {
+              Location location = locationData.getLocation(context,
+                  _elementCodec);
+              if (location != null) {
+                locations.add(location);
+              }
+            }
+          }
+        }
+      }
+    });
+    return locations;
+  }
+
+  void _recordLibraryWithUnit(AnalysisContext context, Source library,
+      Source unit) {
+    Map<Source, Set<Source>> libraryToUnits = _contextToLibraryToUnits[context];
+    if (libraryToUnits == null) {
+      libraryToUnits = new HashMap<Source, Set<Source>>();
+      _contextToLibraryToUnits[context] = libraryToUnits;
+    }
+    Set<Source> units = libraryToUnits[library];
+    if (units == null) {
+      units = new HashSet<Source>();
+      libraryToUnits[library] = units;
+    }
+    units.add(unit);
+  }
+
+  void _recordNodeNameForElement(Element element) {
+    String name = _getElementName(element);
+    int nameId = _stringCodec.encode(name);
+    _nameToNodeNames.add(nameId, _currentNodeNameId);
+  }
+
+  void _recordRelationshipUniverse(Relationship relationship,
+      Location location) {
+    // in current context
+    Map<int, Map<Relationship, List<LocationData>>> nodeRelations =
+        _contextNodeRelations[_currentContextId];
+    if (nodeRelations == null) {
+      nodeRelations = new HashMap<int, Map<Relationship, List<LocationData>>>();
+      _contextNodeRelations[_currentContextId] = nodeRelations;
+    }
+    // in current node
+    Map<Relationship, List<LocationData>> relations =
+        nodeRelations[_currentNodeNameId];
+    if (relations == null) {
+      relations = new HashMap<Relationship, List<LocationData>>();
+      nodeRelations[_currentNodeNameId] = relations;
+    }
+    // for the given relationship
+    List<LocationData> locations = relations[relationship];
+    if (locations == null) {
+      locations = <LocationData>[];
+      relations[relationship] = locations;
+    }
+    // record LocationData
+    locations.add(new LocationData.forObject(_elementCodec, location));
+  }
+
+  void _recordUnitInLibrary(AnalysisContext context, Source library,
+      Source unit) {
+    Map<Source, Set<Source>> unitToLibraries =
+        _contextToUnitToLibraries[context];
+    if (unitToLibraries == null) {
+      unitToLibraries = new HashMap<Source, Set<Source>>();
+      _contextToUnitToLibraries[context] = unitToLibraries;
+    }
+    Set<Source> libraries = unitToLibraries[unit];
+    if (libraries == null) {
+      libraries = new HashSet<Source>();
+      unitToLibraries[unit] = libraries;
+    }
+    libraries.add(library);
+  }
+
+  /**
+   * Removes locations recorded in the given library/unit pair.
+   */
+  void _removeLocations(AnalysisContext context, Source library, Source unit) {
+    // remove node
+    String libraryName = library != null ? library.fullName : null;
+    String unitName = unit.fullName;
+    int libraryNameIndex = _stringCodec.encode(libraryName);
+    int unitNameIndex = _stringCodec.encode(unitName);
+    String nodeName = '${libraryNameIndex}_${unitNameIndex}.index';
+    int nodeNameId = _stringCodec.encode(nodeName);
+    _nodeManager.removeNode(nodeName);
+    // remove source
+    _sources.remove(library);
+    _sources.remove(unit);
+    // remove universe relations
+    {
+      int contextId = _contextCodec.encode(context);
+      Map<int, Object> nodeRelations = _contextNodeRelations[contextId];
+      if (nodeRelations != null) {
+        nodeRelations.remove(nodeNameId);
+      }
+    }
+  }
+
+  /**
+   * When logging is on, [AnalysisEngine] actually creates
+   * [InstrumentedAnalysisContextImpl], which wraps [AnalysisContextImpl] used to create
+   * actual [Element]s. So, in index we have to unwrap [InstrumentedAnalysisContextImpl]
+   * when perform any operation.
+   */
+  AnalysisContext _unwrapContext(AnalysisContext context) {
+    if (context is InstrumentedAnalysisContextImpl) {
+      context = (context as InstrumentedAnalysisContextImpl).basis;
+    }
+    return context;
+  }
+}
+
+
+class _DataInputStream {
+  ByteData _byteData;
+  int _byteOffset = 0;
+
+  _DataInputStream(List<int> bytes) {
+    ByteBuffer buffer = new Uint8List.fromList(bytes).buffer;
+    _byteData = new ByteData.view(buffer);
+  }
+
+  int readInt() {
+    int result = _byteData.getInt32(_byteOffset);
+    _byteOffset += 4;
+    return result;
+  }
+}
+
+
+class _DataOutputStream {
+  BytesBuilder _buffer = new BytesBuilder();
+
+  Uint8List getBytes() {
+    return new Uint8List.fromList(_buffer.takeBytes());
+  }
+
+  void writeInt(int value) {
+    _buffer.addByte((value & 0xFF000000) >> 24);
+    _buffer.addByte((value & 0x00FF0000) >> 16);
+    _buffer.addByte((value & 0x0000FF00) >> 8);
+    _buffer.addByte(value & 0xFF);
+  }
+}
diff --git a/pkg/analysis_server/lib/src/operation/operation_analysis.dart b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
index ed8cfd8..7af044d 100644
--- a/pkg/analysis_server/lib/src/operation/operation_analysis.dart
+++ b/pkg/analysis_server/lib/src/operation/operation_analysis.dart
@@ -4,18 +4,79 @@
 
 library operation.analysis;
 
-import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/analysis_server.dart';
-import 'package:analysis_server/src/computers.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/computer/computer_navigation.dart';
+import 'package:analysis_server/src/computer/computer_outline.dart';
 import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/operation/operation.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analyzer/src/generated/ast.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/index.dart';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/source.dart';
 
 
+Map<String, Object> errorToJson(AnalysisError analysisError) {
+  // TODO(paulberry): move this function into the AnalysisError class.
+  ErrorCode errorCode = analysisError.errorCode;
+  Map<String, Object> result = {
+    FILE: analysisError.source.fullName,
+    // TODO(scheglov) add Enum.fullName ?
+    ERROR_CODE: '${errorCode.runtimeType}.${(errorCode as Enum).name}',
+    OFFSET: analysisError.offset,
+    LENGTH: analysisError.length,
+    MESSAGE: analysisError.message
+  };
+  if (analysisError.correction != null) {
+    result[CORRECTION] = analysisError.correction;
+  }
+  return result;
+}
+
+
+void sendAnalysisNotificationErrors(AnalysisServer server, String file,
+    List<AnalysisError> errors) {
+  Notification notification = new Notification(ANALYSIS_ERRORS);
+  notification.setParameter(FILE, file);
+  notification.setParameter(ERRORS, errors.map(errorToJson).toList());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationHighlights(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_HIGHLIGHTS);
+  notification.setParameter(FILE, file);
+  notification.setParameter(REGIONS, new DartUnitHighlightsComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationNavigation(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_NAVIGATION);
+  notification.setParameter(FILE, file);
+  notification.setParameter(REGIONS, new DartUnitNavigationComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
+void sendAnalysisNotificationOutline(AnalysisServer server, String file,
+    CompilationUnit dartUnit) {
+  Notification notification = new Notification(ANALYSIS_OUTLINE);
+  notification.setParameter(FILE, file);
+  notification.setParameter(OUTLINE, new DartUnitOutlineComputer(
+      dartUnit).compute());
+  server.sendNotification(notification);
+}
+
+
 /**
  * Instances of [PerformAnalysisOperation] perform a single analysis task.
  */
@@ -50,10 +111,9 @@
     if (notices == null) {
       return;
     }
-    // TODO(scheglov) remember known sources
-    // TODO(scheglov) index units
-    // TODO(scheglov) schedule notifications
+    // process results
     sendNotices(server, notices);
+    updateIndex(server.index, notices);
     // continue analysis
     server.addOperation(new PerformAnalysisOperation(context, true));
   }
@@ -75,55 +135,35 @@
         if (server.hasAnalysisSubscription(AnalysisService.NAVIGATION, file)) {
           sendAnalysisNotificationNavigation(server, file, dartUnit);
         }
+        if (server.hasAnalysisSubscription(AnalysisService.OUTLINE, file)) {
+          sendAnalysisNotificationOutline(server, file, dartUnit);
+        }
       }
       if (!source.isInSystemLibrary) {
         sendAnalysisNotificationErrors(server, file, notice.errors);
       }
     }
   }
-}
 
-void sendAnalysisNotificationErrors(AnalysisServer server,
-                                    String file, List<AnalysisError> errors) {
-  Notification notification = new Notification(NOTIFICATION_ERRORS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(ERRORS, errors.map(errorToJson).toList());
-  server.sendNotification(notification);
-}
-
-void sendAnalysisNotificationHighlights(AnalysisServer server,
-                                        String file, CompilationUnit dartUnit) {
-  Notification notification = new Notification(NOTIFICATION_HIGHLIGHTS);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitHighlightsComputer(dartUnit).compute());
-  server.sendNotification(notification);
-}
-
-void sendAnalysisNotificationNavigation(AnalysisServer server,
-                                        String file, CompilationUnit dartUnit) {
-  Notification notification = new Notification(NOTIFICATION_NAVIGATION);
-  notification.setParameter(FILE, file);
-  notification.setParameter(
-      REGIONS,
-      new DartUnitNavigationComputer(dartUnit).compute());
-  server.sendNotification(notification);
-}
-
-Map<String, Object> errorToJson(AnalysisError analysisError) {
-  // TODO(paulberry): move this function into the AnalysisError class.
-  ErrorCode errorCode = analysisError.errorCode;
-  Map<String, Object> result = {
-    'file': analysisError.source.fullName,
-    // TODO(scheglov) add Enum.fullName ?
-    'errorCode': '${errorCode.runtimeType}.${(errorCode as Enum).name}',
-    'offset': analysisError.offset,
-    'length': analysisError.length,
-    'message': analysisError.message
-  };
-  if (analysisError.correction != null) {
-    result['correction'] = analysisError.correction;
+  void updateIndex(Index index, List<ChangeNotice> notices) {
+    if (index == null) {
+      return;
+    }
+    for (ChangeNotice notice in notices) {
+      // Dart
+      {
+        CompilationUnit dartUnit = notice.compilationUnit;
+        if (dartUnit != null) {
+          index.indexUnit(context, dartUnit);
+        }
+      }
+      // HTML
+      {
+        HtmlUnit htmlUnit = notice.htmlUnit;
+        if (htmlUnit != null) {
+          index.indexHtmlUnit(context, htmlUnit);
+        }
+      }
+    }
   }
-  return result;
 }
diff --git a/pkg/analysis_server/lib/src/package_map_provider.dart b/pkg/analysis_server/lib/src/package_map_provider.dart
new file mode 100644
index 0000000..4324a3c
--- /dev/null
+++ b/pkg/analysis_server/lib/src/package_map_provider.dart
@@ -0,0 +1,111 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library package.map.provider;
+
+import 'dart:convert';
+import 'dart:io' as io;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+/**
+ * A PackageMapProvider is an entity capable of determining the mapping from
+ * package name to source directory for a given folder.
+ */
+abstract class PackageMapProvider {
+  /**
+   * Compute a package map for the given folder, if possible.
+   *
+   * If a package map can't be computed, return null.
+   */
+  Map<String, List<Folder>> computePackageMap(Folder folder);
+}
+
+/**
+ * Implementation of PackageMapProvider that operates by executing pub.
+ */
+class PubPackageMapProvider implements PackageMapProvider {
+  static const String PUB_LIST_COMMAND = 'list-package-dirs';
+
+  /**
+   * [ResourceProvider] that is used to create the [Folder]s that populate the
+   * package map.
+   */
+  final ResourceProvider resourceProvider;
+
+  PubPackageMapProvider(this.resourceProvider);
+
+  @override
+  Map<String, List<Folder>> computePackageMap(Folder folder) {
+    // TODO(paulberry) make this asynchronous so that we can (a) do other
+    // analysis while it's in progress, and (b) time out if it takes too long
+    // to respond.
+    String executable = SHARED_SDK.pubExecutable.getAbsolutePath();
+    io.ProcessResult result;
+    try {
+      result = io.Process.runSync(
+          executable, [PUB_LIST_COMMAND], workingDirectory: folder.path);
+    } on io.ProcessException catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logInformation(
+          "Error running pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+    if (result.exitCode != 0) {
+      AnalysisEngine.instance.logger.logInformation(
+          "pub $PUB_LIST_COMMAND failed: exit code ${result.exitCode}");
+      return null;
+    }
+    try {
+      return parsePackageMap(result.stdout);
+    } catch (exception, stackTrace) {
+      AnalysisEngine.instance.logger.logError(
+          "Malformed output from pub $PUB_LIST_COMMAND\n${exception}\n${stackTrace}");
+    }
+
+    return null;
+  }
+
+  /**
+   * Decode the JSON output from pub into a package map.
+   */
+  Map<String, List<Folder>> parsePackageMap(String jsonText) {
+    // The output of pub looks like this:
+    // {
+    //   "packages": {
+    //     "foo": "path/to/foo",
+    //     "bar": ["path/to/bar1", "path/to/bar2"],
+    //     "myapp": "path/to/myapp",  // self link is included
+    //   },
+    //   "input_files": [
+    //     "path/to/myapp/pubspec.lock"
+    //   ]
+    // }
+    Map<String, List<Folder>> packageMap = <String, List<Folder>>{};
+    Map obj = JSON.decode(jsonText);
+    Map packages = obj['packages'];
+    processPaths(String packageName, List paths) {
+      List<Folder> folders = <Folder>[];
+      for (var path in paths) {
+        if (path is String) {
+          Resource resource = resourceProvider.getResource(path);
+          if (resource is Folder) {
+            folders.add(resource);
+          }
+        }
+      }
+      if (folders.isNotEmpty) {
+        packageMap[packageName] = folders;
+      }
+    }
+    packages.forEach((key, value) {
+      if (value is String) {
+        processPaths(key, [value]);
+      } else if (value is List) {
+        processPaths(key, value);
+      }
+    });
+    return packageMap;
+  }
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/lib/src/package_uri_resolver.dart b/pkg/analysis_server/lib/src/package_uri_resolver.dart
new file mode 100644
index 0000000..2aaaca9
--- /dev/null
+++ b/pkg/analysis_server/lib/src/package_uri_resolver.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library resolver.package;
+
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+
+
+/**
+ * A [UriResolver] implementation for the `package:` scheme that uses a map of
+ * package names to their directories.
+ */
+class PackageMapUriResolver extends UriResolver {
+  /**
+   * The name of the `package` scheme.
+   */
+  static const String PACKAGE_SCHEME = "package";
+
+  /**
+   * A table mapping package names to the path of the directories containing
+   * the package.
+   */
+  final Map<String, List<Folder>> packageMap;
+
+  /**
+   * The [ResourceProvider] for this resolver.
+   */
+  final ResourceProvider resourceProvider;
+
+  /**
+   * Create a new [PackageMapUriResolver].
+   *
+   * [packageMap] is a table mapping package names to the paths of the
+   * directories containing the package
+   */
+  PackageMapUriResolver(this.resourceProvider, this.packageMap);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.PACKAGE_URI) {
+      Resource resource = resourceProvider.getResource(uri.path);
+      if (resource is File) {
+        return resource.createSource(kind);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!isPackageUri(uri)) {
+      return null;
+    }
+    // Prepare path.
+    String path = uri.path;
+    // Prepare path components.
+    String pkgName;
+    String relPath;
+    int index = path.indexOf('/');
+    if (index == -1 || index == 0) {
+      return null;
+    } else {
+      // <pkgName>/<relPath>
+      pkgName = path.substring(0, index);
+      relPath = path.substring(index + 1);
+    }
+    // Try to find an existing file.
+    List<Folder> packageDirs = packageMap[pkgName];
+    if (packageDirs != null) {
+      for (Folder packageDir in packageDirs) {
+        if (packageDir.exists) {
+          Resource result = packageDir.getChild(relPath);
+          if (result is File && result.exists) {
+            return result.createSource(UriKind.PACKAGE_URI);
+          }
+        }
+      }
+    }
+    // Return a NonExistingSource instance.
+    // This helps provide more meaningful error messages to users
+    // (a missing file error, as opposed to an invalid URI error).
+    // TODO(scheglov) move NonExistingSource to "source.dart"
+    return new NonExistingSource(uri.toString(), UriKind.PACKAGE_URI);
+  }
+
+  /**
+   * Returns `true` if [uri] is a `package` URI.
+   */
+  static bool isPackageUri(Uri uri) {
+    return uri.scheme == PACKAGE_SCHEME;
+  }
+}
diff --git a/pkg/analysis_server/lib/src/protocol.dart b/pkg/analysis_server/lib/src/protocol.dart
index 9efbf64..fa0d50e 100644
--- a/pkg/analysis_server/lib/src/protocol.dart
+++ b/pkg/analysis_server/lib/src/protocol.dart
@@ -4,6 +4,7 @@
 
 library protocol;
 
+import 'dart:collection';
 import 'dart:convert' show JsonDecoder;
 
 /**
@@ -77,7 +78,7 @@
   /**
    * A table mapping the names of request parameters to their values.
    */
-  final Map<String, Object> params = new Map<String, Object>();
+  final Map<String, Object> params = new HashMap<String, Object>();
 
   /**
    * A decoder that can be used to decode strings into JSON objects.
@@ -137,8 +138,7 @@
    * if there is no such parameter associated with this request.
    */
   RequestDatum getParameter(String name, defaultValue) {
-    Object value = params[name];
-    if (value == null) {
+    if (!params.containsKey(name)) {
       return new RequestDatum(this, "default for $name", defaultValue);
     }
     return new RequestDatum(this, name, params[name]);
@@ -150,11 +150,10 @@
    * such parameter associated with this request.
    */
   RequestDatum getRequiredParameter(String name) {
-    Object value = params[name];
-    if (value == null) {
+    if (!params.containsKey(name)) {
       throw new RequestFailure(new Response.missingRequiredParameter(this, name));
     }
-    return new RequestDatum(this, name, value);
+    return new RequestDatum(this, name, params[name]);
   }
 
   /**
@@ -212,26 +211,19 @@
    * a [RequestDatum] containing the corresponding value.
    */
   RequestDatum operator [](String key) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    if (!datum.containsKey(key)) {
+    Map<String, Object> map = _asMap();
+    if (!map.containsKey(key)) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "contain key '$key'"));
     }
-    return new RequestDatum(request, "$path.$key", datum[key]);
+    return new RequestDatum(request, "$path.$key", map[key]);
   }
 
   /**
    * Return `true` if the datum is a Map containing the given [key].
    */
   bool hasKey(String key) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    return datum.containsKey(key);
+    return _asMap().containsKey(key);
   }
 
   /**
@@ -239,11 +231,7 @@
    * each key/value pair in the map.
    */
   void forEachMap(void f(String key, RequestDatum value)) {
-    if (datum is! Map) {
-      throw new RequestFailure(new Response.invalidParameter(request, path,
-          "be a map"));
-    }
-    datum.forEach((String key, value) {
+    _asMap().forEach((String key, value) {
       f(key, new RequestDatum(request, "$path.$key", value));
     });
   }
@@ -285,6 +273,42 @@
   }
 
   /**
+   * Determine if the datum is a list.  Note: null is considered a synonym for
+   * the empty list.
+   */
+  bool get isList {
+    return datum == null || datum is List;
+  }
+
+  /**
+   * Validate that the datum is a list, and return it in raw form.
+   */
+  List _asList() {
+    if (!isList) {
+      throw new RequestFailure(new Response.invalidParameter(request, path,
+          "be a list"));
+    }
+    if (datum == null) {
+      return [];
+    } else {
+      return datum;
+    }
+  }
+
+  /**
+   * Validate that the datum is a list, and return a list where each element in
+   * the datum has been converted using the provided function.
+   */
+  List asList(elementConverter(RequestDatum datum)) {
+    List result = [];
+    List list = _asList();
+    for (int i = 0; i < list.length; i++) {
+      result.add(elementConverter(new RequestDatum(request, "$path.$i", list[i])));
+    }
+    return result;
+  }
+
+  /**
    * Validate that the datum is a string, and return it.
    */
   String asString() {
@@ -296,13 +320,14 @@
   }
 
   /**
-   * Determine if the datum is a list of strings.
+   * Determine if the datum is a list of strings.  Note: null is considered a
+   * synonym for the empty list.
    */
   bool get isStringList {
-    if (datum is! List) {
+    if (!isList) {
       return false;
     }
-    for (var element in datum) {
+    for (var element in _asList()) {
       if (element is! String) {
         return false;
       }
@@ -311,14 +336,15 @@
   }
 
   /**
-   * Validate that the datum is a list of strings, and return it.
+   * Validate that the datum is a list of strings, and return it.  Note: null
+   * is considered a synonym for the empty list.
    */
   List<String> asStringList() {
     if (!isStringList) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a list of strings"));
     }
-    return datum;
+    return _asList();
   }
 
   /**
@@ -338,16 +364,40 @@
   }
 
   /**
-   * Determine if the datum is a map whose values are all strings.
+   * Determine if the datum is a map.  Note: null is considered a synonym for
+   * the empty map.
+   */
+  bool get isMap {
+    return datum == null || datum is Map;
+  }
+
+  /**
+   * Validate that the datum is a map, and return it in raw form.
+   */
+  Map<String, Object> _asMap() {
+    if (!isMap) {
+      throw new RequestFailure(new Response.invalidParameter(request, path,
+          "be a map"));
+    }
+    if (datum == null) {
+      return {};
+    } else {
+      return datum;
+    }
+  }
+
+  /**
+   * Determine if the datum is a map whose values are all strings.  Note: null
+   * is considered a synonym for the empty map.
    *
    * Note: we can safely assume that the keys are all strings, since JSON maps
    * cannot have any other key type.
    */
   bool get isStringMap {
-    if (datum is! Map) {
+    if (!isMap) {
       return false;
     }
-    for (var value in datum.values) {
+    for (var value in _asMap().values) {
       if (value is! String) {
         return false;
       }
@@ -363,20 +413,21 @@
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string map"));
     }
-    return datum;
+    return _asMap();
   }
 
   /**
-   * Determine if the datum is a map whose values are all string lists.
+   * Determine if the datum is a map whose values are all string lists.  Note:
+   * null is considered a synonym for the empty map.
    *
    * Note: we can safely assume that the keys are all strings, since JSON maps
    * cannot have any other key type.
    */
-  bool isStringListMap() {
-    if (datum is! Map) {
+  bool get isStringListMap {
+    if (!isMap) {
       return false;
     }
-    for (var value in datum.values) {
+    for (var value in _asMap().values) {
       if (value is! List) {
         return false;
       }
@@ -390,16 +441,18 @@
   }
 
   /**
-   * Validate that the datum is a map from strings to string listss, and return
+   * Validate that the datum is a map from strings to string lists, and return
    * it.
    */
   Map<String, List<String>> asStringListMap() {
-    if (!isStringListMap()) {
+    if (!isStringListMap) {
       throw new RequestFailure(new Response.invalidParameter(request, path,
           "be a string list map"));
     }
-    return datum;
+    return _asMap();
   }
+
+  bool get isNull => datum == null;
 }
 
 /**
@@ -438,7 +491,7 @@
    * A table mapping the names of result fields to their values. The table
    * should be empty if there was an error.
    */
-  final Map<String, Object> result = new Map<String, Object>();
+  final Map<String, Object> result = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created instance to represent a response to a request
@@ -509,6 +562,22 @@
     : this(request.id, new RequestError(-10, 'Unknown analysis service: "$name"'));
 
   /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.setPriorityFiles` [request] that includes one or more files
+   * that are not being analyzed.
+   */
+  Response.unanalyzedPriorityFiles(Request request, String fileNames)
+    : this(request.id, new RequestError(-11, "Unanalyzed files cannot be a priority: '$fileNames'"));
+
+  /**
+   * Initialize a newly created instance to represent an error condition caused
+   * by a `analysis.updateOptions` [request] that includes an unknown analysis
+   * option.
+   */
+  Response.unknownOptionName(Request request, String optionName)
+    : this(request.id, new RequestError(-12, 'Unknown analysis option: "$optionName"'));
+
+  /**
    * Initialize a newly created instance based upon the given JSON data
    */
   factory Response.fromJson(Map<String, Object> json) {
@@ -646,7 +715,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> data = new Map<String, Object>();
+  final Map<String, Object> data = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created [Error] to have the given [code] and [message].
@@ -765,7 +834,7 @@
   /**
    * A table mapping the names of notification parameters to their values.
    */
-  final Map<String, Object> params = new Map<String, Object>();
+  final Map<String, Object> params = new HashMap<String, Object>();
 
   /**
    * Initialize a newly created [Notification] to have the given [event] name.
diff --git a/pkg/analysis_server/lib/src/resource.dart b/pkg/analysis_server/lib/src/resource.dart
index e3df8af..5659eb6 100644
--- a/pkg/analysis_server/lib/src/resource.dart
+++ b/pkg/analysis_server/lib/src/resource.dart
@@ -5,6 +5,7 @@
 library resource;
 
 import 'dart:async';
+import 'dart:collection';
 import 'dart:io' as io;
 
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
@@ -245,15 +246,16 @@
 
   @override
   Stream<WatchEvent> get changes {
-    if (_provider._pathToWatcher.containsKey(path)) {
-      // Two clients watching the same path is not yet supported.
-      // TODO(paulberry): add support for this if needed.
-      throw new StateError('Path "$path" is already being watched for changes');
-    }
     StreamController<WatchEvent> streamController = new StreamController<WatchEvent>();
-    _provider._pathToWatcher[path] = streamController;
+    if (!_provider._pathToWatchers.containsKey(path)) {
+      _provider._pathToWatchers[path] = <StreamController<WatchEvent>>[];
+    }
+    _provider._pathToWatchers[path].add(streamController);
     streamController.done.then((_) {
-      _provider._pathToWatcher.remove(path);
+      _provider._pathToWatchers[path].remove(streamController);
+      if (_provider._pathToWatchers[path].isEmpty) {
+        _provider._pathToWatchers.remove(path);
+      }
     });
     return streamController.stream;
   }
@@ -265,11 +267,12 @@
  * Use `/` as a path separator.
  */
 class MemoryResourceProvider implements ResourceProvider {
-  final Map<String, _MemoryResource> _pathToResource = <String, _MemoryResource>{};
-  final Map<String, String> _pathToContent = <String, String>{};
-  final Map<String, int> _pathToTimestamp = <String, int>{};
-  final Map<String, StreamController<WatchEvent>> _pathToWatcher =
-      <String, StreamController<WatchEvent>>{};
+  final Map<String, _MemoryResource> _pathToResource =
+      new HashMap<String, _MemoryResource>();
+  final Map<String, String> _pathToContent = new HashMap<String, String>();
+  final Map<String, int> _pathToTimestamp = new HashMap<String, int>();
+  final Map<String, List<StreamController<WatchEvent>>> _pathToWatchers =
+      new HashMap<String, List<StreamController<WatchEvent>>>();
   int nextStamp = 0;
 
   @override
@@ -323,9 +326,11 @@
   }
 
   void _notifyWatchers(String path, ChangeType changeType) {
-    _pathToWatcher.forEach((String watcherPath, StreamController<WatchEvent> streamController) {
+    _pathToWatchers.forEach((String watcherPath, List<StreamController<WatchEvent>> streamControllers) {
       if (posix.isWithin(watcherPath, path)) {
-        streamController.add(new WatchEvent(changeType, path));
+        for (StreamController<WatchEvent> streamController in streamControllers) {
+          streamController.add(new WatchEvent(changeType, path));
+        }
       }
     });
   }
@@ -454,3 +459,49 @@
   @override
   Context get pathContext => io.Platform.isWindows ? windows : posix;
 }
+
+
+/**
+ * A [UriResolver] for [Resource]s.
+ */
+class ResourceUriResolver extends UriResolver {
+  /**
+   * The name of the `file` scheme.
+   */
+  static String _FILE_SCHEME = "file";
+
+  final ResourceProvider _provider;
+
+  ResourceUriResolver(this._provider);
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    if (kind == UriKind.FILE_URI) {
+      Resource resource = _provider.getResource(uri.path);
+      if (resource is File) {
+        return resource.createSource(kind);
+      }
+    }
+    return null;
+  }
+
+  @override
+  Source resolveAbsolute(Uri uri) {
+    if (!_isFileUri(uri)) {
+      return null;
+    }
+    Resource resource = _provider.getResource(uri.path);
+    if (resource is File) {
+      return resource.createSource(UriKind.FILE_URI);
+    }
+    return null;
+  }
+
+  /**
+   * Return `true` if the given URI is a `file` URI.
+   *
+   * @param uri the URI being tested
+   * @return `true` if the given URI is a `file` URI
+   */
+  static bool _isFileUri(Uri uri) => uri.scheme == _FILE_SCHEME;
+}
diff --git a/pkg/analysis_server/lib/src/socket_server.dart b/pkg/analysis_server/lib/src/socket_server.dart
index 7d673b4..d6b7f1d 100644
--- a/pkg/analysis_server/lib/src/socket_server.dart
+++ b/pkg/analysis_server/lib/src/socket_server.dart
@@ -4,12 +4,41 @@
 
 library socket.server;
 
+import 'dart:io' as io;
+
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/domain_edit.dart';
+import 'package:analysis_server/src/domain_search.dart';
 import 'package:analysis_server/src/domain_server.dart';
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:path/path.dart' as pathos;
+
+
+/**
+ * Creates and runs an [Index].
+ */
+Index _createIndex() {
+  String tempPath = io.Directory.systemTemp.path;
+  String indexPath = pathos.join(tempPath, 'AnalysisServer_index');
+  io.Directory indexDirectory = new io.Directory(indexPath);
+  if (indexDirectory.existsSync()) {
+    indexDirectory.deleteSync(recursive: true);
+  }
+  if (!indexDirectory.existsSync()) {
+    indexDirectory.createSync();
+  }
+  Index index = createLocalFileSplitIndex(indexDirectory);
+  index.run();
+  return index;
+}
+
 
 /**
  * Instances of the class [SocketServer] implement the common parts of
@@ -37,9 +66,12 @@
       });
       return;
     }
+    PhysicalResourceProvider resourceProvider = PhysicalResourceProvider.INSTANCE;
     analysisServer = new AnalysisServer(
         serverChannel,
-        PhysicalResourceProvider.INSTANCE,
+        resourceProvider,
+        new PubPackageMapProvider(resourceProvider),
+        _createIndex(),
         rethrowExceptions: false);
     _initializeHandlers(analysisServer);
   }
@@ -51,7 +83,9 @@
     server.handlers = [
         new ServerDomainHandler(server),
         new AnalysisDomainHandler(server),
+        new EditDomainHandler(server),
+        new SearchDomainHandler(server),
+        new CompletionDomainHandler(server),
     ];
   }
-
 }
\ No newline at end of file
diff --git a/pkg/analysis_server/pubspec.yaml b/pkg/analysis_server/pubspec.yaml
index eb003a9..0979e2b 100644
--- a/pkg/analysis_server/pubspec.yaml
+++ b/pkg/analysis_server/pubspec.yaml
@@ -6,12 +6,11 @@
 environment:
   sdk: '>=1.0.0 <2.0.0'
 dependencies:
-  analysis_services: any
-  analyzer: '>=0.15.1 <0.16.0'
+  analyzer: '>=0.16.1 <0.17.0'
   args: any
   logging: any
   path: any
-  typed_mock: any
+  typed_mock: '>=0.0.4'
   watcher: any
 dev_dependencies:
   mock: '>=0.10.0 <0.11.0'
diff --git a/pkg/analysis_server/test/analysis_abstract.dart b/pkg/analysis_server/test/analysis_abstract.dart
index 2ea2e1d..923129d 100644
--- a/pkg/analysis_server/test/analysis_abstract.dart
+++ b/pkg/analysis_server/test/analysis_abstract.dart
@@ -15,6 +15,7 @@
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 
 /**
@@ -23,6 +24,7 @@
 class AbstractAnalysisTest {
   MockServerChannel serverChannel;
   MemoryResourceProvider resourceProvider;
+  MockPackageMapProvider packageMapProvider;
   AnalysisServer server;
   AnalysisDomainHandler handler;
 
@@ -43,15 +45,21 @@
   void setUp() {
     serverChannel = new MockServerChannel();
     resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    packageMapProvider = new MockPackageMapProvider();
+    Index index = createIndex();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, packageMapProvider, index);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream = serverChannel.notificationController.stream;
     notificationStream.listen((Notification notification) {
       processNotification(notification);
     });
-    // create an empty project
-    _createEmptyProject();
+  }
+
+  Index createIndex() {
+    return null;
   }
 
   void addAnalysisSubscription(AnalysisService service, String file) {
@@ -63,7 +71,7 @@
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS);
+    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
     request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
     handleSuccessfulRequest(request);
   }
@@ -183,11 +191,11 @@
 //  }
 
   /**
-   * Creates an empty project `/project/`.
+   * Creates a project `/project`.
    */
-  void _createEmptyProject() {
+  void createProject() {
     resourceProvider.newFolder(projectPath);
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, [projectPath]);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
diff --git a/pkg/analysis_server/test/analysis_notification_highlights_test.dart b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
new file mode 100644
index 0000000..012bb7d
--- /dev/null
+++ b/pkg/analysis_server/test/analysis_notification_highlights_test.dart
@@ -0,0 +1,769 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.analysis.notification.highlights;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_highlights.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
+
+
+main() {
+  group('notification.highlights', () {
+    runReflectiveTests(_AnalysisNotificationHighlightsTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _AnalysisNotificationHighlightsTest extends AbstractAnalysisTest {
+  List<_HighlightRegion> regions;
+
+  void assertHasRawRegion(HighlightType type, int offset, int length) {
+    for (_HighlightRegion region in regions) {
+      if (region.offset == offset && region.length == length && region.type ==
+          type.name) {
+        return;
+      }
+    }
+    fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
+        '${regions.join('\n')}');
+  }
+
+  void assertHasRegion(HighlightType type, String search, [int length = -1]) {
+    int offset = findOffset(search);
+    length = findRegionLength(search, length);
+    assertHasRawRegion(type, offset, length);
+  }
+
+  void assertNoRawRegion(HighlightType type, int offset, int length) {
+    for (_HighlightRegion region in regions) {
+      if (region.offset == offset && region.length == length && region.type ==
+          type.name) {
+        fail(
+            'Not expected to find (offset=$offset; length=$length; type=$type) in\n'
+            '${regions.join('\n')}');
+      }
+    }
+  }
+
+
+  void assertNoRegion(HighlightType type, String search, [int length = -1]) {
+    int offset = findOffset(search);
+    length = findRegionLength(search, length);
+    assertNoRawRegion(type, offset, length);
+  }
+
+  int findRegionLength(String search, int length) {
+    if (length == -1) {
+      length = 0;
+      while (length < search.length) {
+        int c = search.codeUnitAt(length);
+        if (length == 0 && c == '@'.codeUnitAt(0)) {
+          length++;
+          continue;
+        }
+        if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) || c >=
+            'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) || c >= '0'.codeUnitAt(0) && c <=
+            '9'.codeUnitAt(0))) {
+          break;
+        }
+        length++;
+      }
+    }
+    return length;
+  }
+
+  Future prepareHighlights(then()) {
+    addAnalysisSubscription(AnalysisService.HIGHLIGHTS, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_HIGHLIGHTS) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        regions = [];
+        List<Map<String, Object>> regionsJson = notification.getParameter(
+            REGIONS);
+        for (Map<String, Object> regionJson in regionsJson) {
+          regions.add(new _HighlightRegion.fromJson(regionJson));
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_ANNOTATION_hasArguments() {
+    addTestFile('''
+class AAA {
+  const AAA(a, b, c);
+}
+@AAA(1, 2, 3) main() {}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
+      assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
+    });
+  }
+
+  test_ANNOTATION_noArguments() {
+    addTestFile('''
+const AAA = 42;
+@AAA main() {}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.ANNOTATION, '@AAA');
+    });
+  }
+
+  test_BUILT_IN_abstract() {
+    addTestFile('''
+abstract class A {};
+main() {
+  var abstract = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
+      assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
+    });
+  }
+
+  test_BUILT_IN_as() {
+    addTestFile('''
+import 'dart:math' as math;
+main() {
+  p as int;
+  var as = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'as math');
+      assertHasRegion(HighlightType.BUILT_IN, 'as int');
+      assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
+    });
+  }
+
+  test_BUILT_IN_deferred() {
+    addTestFile('''
+import 'dart:math' deferred as math;
+main() {
+  var deferred = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
+      assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
+    });
+  }
+
+  test_BUILT_IN_export() {
+    addTestFile('''
+export "dart:math";
+main() {
+  var export = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
+      assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
+    });
+  }
+
+  test_BUILT_IN_external() {
+    addTestFile('''
+class A {
+  external A();
+  external aaa();
+}
+external main() {
+  var external = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'external A()');
+      assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
+      assertHasRegion(HighlightType.BUILT_IN, 'external main()');
+      assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
+    });
+  }
+
+  test_BUILT_IN_factory() {
+    addTestFile('''
+class A {
+  factory A() => null;
+}
+main() {
+  var factory = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
+      assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
+    });
+  }
+
+  test_BUILT_IN_get() {
+    addTestFile('''
+get aaa => 1;
+class A {
+  get bbb => 2;
+}
+main() {
+  var get = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
+      assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
+      assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
+    });
+  }
+
+  test_BUILT_IN_hide() {
+    addTestFile('''
+import 'foo.dart' hide Foo;
+main() {
+  var hide = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
+      assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
+    });
+  }
+
+  test_BUILT_IN_implements() {
+    addTestFile('''
+class A {}
+class B implements A {}
+main() {
+  var implements = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
+      assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
+    });
+  }
+
+  test_BUILT_IN_import() {
+    addTestFile('''
+import "foo.dart";
+main() {
+  var import = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'import "');
+      assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
+    });
+  }
+
+  test_BUILT_IN_library() {
+    addTestFile('''
+library lib;
+main() {
+  var library = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
+      assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
+    });
+  }
+
+  test_BUILT_IN_native() {
+    addTestFile('''
+class A native "A_native" {}
+class B {
+  bbb() native "bbb_native";
+}
+main() {
+  var native = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
+      assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
+      assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
+    });
+  }
+
+  test_BUILT_IN_on() {
+    addTestFile('''
+main() {
+  try {
+  } on int catch (e) {
+  }
+  var on = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'on int');
+      assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
+    });
+  }
+
+  test_BUILT_IN_operator() {
+    addTestFile('''
+class A {
+  operator +(x) => null;
+}
+main() {
+  var operator = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
+      assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
+    });
+  }
+
+  test_BUILT_IN_part() {
+    addTestFile('''
+part "my_part.dart";
+main() {
+  var part = 42;
+}''');
+    addFile('/project/bin/my_part.dart', 'part of lib;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
+      assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
+    });
+  }
+
+  test_BUILT_IN_partOf() {
+    addTestFile('''
+part of lib;
+main() {
+  var part = 1;
+  var of = 2;
+}''');
+    addFile('/project/bin/my_lib.dart', '''
+library lib;
+part 'test.dart';
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
+      assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
+      assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
+    });
+  }
+
+  test_BUILT_IN_set() {
+    addTestFile('''
+set aaa(x) {}
+class A
+  set bbb(x) {}
+}
+main() {
+  var set = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
+      assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
+      assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
+    });
+  }
+
+  test_BUILT_IN_show() {
+    addTestFile('''
+import 'foo.dart' show Foo;
+main() {
+  var show = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
+      assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
+    });
+  }
+
+  test_BUILT_IN_static() {
+    addTestFile('''
+class A {
+  static aaa;
+  static bbb() {}
+}
+main() {
+  var static = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
+      assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
+      assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
+    });
+  }
+
+  test_BUILT_IN_typedef() {
+    addTestFile('''
+typedef A();
+main() {
+  var typedef = 42;
+}''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
+      assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
+    });
+  }
+
+  test_CLASS() {
+    addTestFile('''
+class AAA {}
+AAA aaa;
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.CLASS, 'AAA {}');
+      assertHasRegion(HighlightType.CLASS, 'AAA aaa');
+    });
+  }
+
+  test_CLASS_notDynamic() {
+    addTestFile('''
+dynamic f() {}
+''');
+    return prepareHighlights(() {
+      assertNoRegion(HighlightType.CLASS, 'dynamic f()');
+    });
+  }
+
+  test_CLASS_notVoid() {
+    addTestFile('''
+void f() {}
+''');
+    return prepareHighlights(() {
+      assertNoRegion(HighlightType.CLASS, 'void f()');
+    });
+  }
+
+  test_CONSTRUCTOR() {
+    addTestFile('''
+class AAA {
+  AAA() {}
+  AAA.name(p) {}
+}
+main() {
+  new AAA();
+  new AAA.name(42);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
+      assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
+      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
+      assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
+    });
+  }
+
+  test_DYNAMIC_TYPE() {
+    addTestFile('''
+f() {}
+main(p) {
+  print(p);
+  var v1 = f();
+  int v2;
+  var v3 = v2;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
+      assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
+      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
+      assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
+    });
+  }
+
+  test_FIELD() {
+    addTestFile('''
+class A {
+  int aaa = 1;
+  int bbb = 2;
+  A([this.bbb = 3]);
+}
+main(A a) {
+  a.aaa = 4;
+  a.bbb = 5;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FIELD, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 3');
+      assertHasRegion(HighlightType.FIELD, 'aaa = 4');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 5');
+    });
+  }
+
+  test_FIELD_STATIC() {
+    addTestFile('''
+class A {
+  static aaa = 1;
+  static get bbb => null;
+  static set ccc(x) {}
+}
+main() {
+  A.aaa = 2;
+  A.bbb;
+  A.ccc = 3;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
+    });
+  }
+
+  test_FUNCTION() {
+    addTestFile('''
+fff(p) {}
+main() {
+  fff(42);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
+      assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
+    });
+  }
+
+  test_FUNCTION_TYPE_ALIAS() {
+    addTestFile('''
+typedef FFF(p);
+main(FFF fff) {
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
+      assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
+    });
+  }
+
+  test_GETTER_DECLARATION() {
+    addTestFile('''
+get aaa => null;
+class A {
+  get bbb => null;
+}
+main(A a) {
+  aaa;
+  a.bbb;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
+      assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
+      assertHasRegion(HighlightType.FIELD, 'bbb;');
+    });
+  }
+
+  test_IDENTIFIER_DEFAULT() {
+    addTestFile('''
+main() {
+  aaa = 42;
+  bbb(84);
+  CCC ccc;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
+      assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
+    });
+  }
+
+  test_IMPORT_PREFIX() {
+    addTestFile('''
+import 'dart:math' as ma;
+main() {
+  ma.max(1, 2);
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
+      assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
+    });
+  }
+
+  test_KEYWORD_void() {
+    addTestFile('''
+void main() {
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.KEYWORD, 'void main()');
+    });
+  }
+
+  test_LITERAL_BOOLEAN() {
+    addTestFile('var V = true;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
+    });
+  }
+
+  test_LITERAL_DOUBLE() {
+    addTestFile('var V = 4.2;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
+    });
+  }
+
+  test_LITERAL_INTEGER() {
+    addTestFile('var V = 42;');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
+    });
+  }
+
+  test_LITERAL_STRING() {
+    addTestFile('var V = "abc";');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
+    });
+  }
+
+  test_LOCAL_VARIABLE() {
+    addTestFile('''
+main() {
+  int vvv = 0;
+  vvv;
+  vvv = 1;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
+      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
+      assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
+    });
+  }
+
+  test_METHOD() {
+    addTestFile('''
+class A {
+  aaa() {}
+  static bbb() {}
+}
+main(A a) {
+  a.aaa();
+  a.aaa;
+  A.bbb();
+  A.bbb;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
+      assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
+      assertHasRegion(HighlightType.METHOD, 'aaa();');
+      assertHasRegion(HighlightType.METHOD, 'aaa;');
+      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
+      assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
+    });
+  }
+
+  test_METHOD_bestType() {
+    addTestFile('''
+main(p) {
+  if (p is List) {
+    p.add(null);
+  }
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.METHOD, 'add(null)');
+    });
+  }
+
+  test_PARAMETER() {
+    addTestFile('''
+main(int p) {
+  p;
+  p = 42;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.PARAMETER, 'p) {');
+      assertHasRegion(HighlightType.PARAMETER, 'p;');
+      assertHasRegion(HighlightType.PARAMETER, 'p = 42');
+    });
+  }
+
+  test_SETTER_DECLARATION() {
+    addTestFile('''
+set aaa(x) {}
+class A {
+  set bbb(x) {}
+}
+main(A a) {
+  aaa = 1;
+  a.bbb = 2;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
+      assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
+      assertHasRegion(HighlightType.FIELD, 'bbb = 2');
+    });
+  }
+
+  test_TOP_LEVEL_VARIABLE() {
+    addTestFile('''
+var VVV = 0;
+main() {
+  print(VVV);
+  VVV = 1;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
+      assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
+    });
+  }
+
+  test_TYPE_NAME_DYNAMIC() {
+    addTestFile('''
+dynamic main() {
+  dynamic = 42;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
+      assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
+      assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
+    });
+  }
+
+  test_TYPE_PARAMETER() {
+    addTestFile('''
+class A<T> {
+  T fff;
+  T mmm(T p) => null;
+}
+''');
+    return prepareHighlights(() {
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
+      assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
+    });
+  }
+}
+
+
+class _HighlightRegion {
+  final int length;
+  final int offset;
+  final String type;
+
+  _HighlightRegion(this.type, this.offset, this.length);
+
+  factory _HighlightRegion.fromJson(Map<String, Object> map) {
+    return new _HighlightRegion(map[TYPE], map[OFFSET], map[LENGTH]);
+  }
+}
diff --git a/pkg/analysis_server/test/analysis_notification_navigation_test.dart b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
index 0268147..f66e657 100644
--- a/pkg/analysis_server/test/analysis_notification_navigation_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_navigation_test.dart
@@ -7,63 +7,50 @@
 import 'dart:async';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'analysis_abstract_test.dart';
+import 'analysis_abstract.dart';
 import 'reflective_tests.dart';
 
 
+main() {
+  group('notification.navigation', () {
+    runReflectiveTests(_AnalysisNotificationNavigationTest);
+  });
+}
+
+
 @ReflectiveTestCase()
-class AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
-  List<Map<String, Object>> regions;
-  Map<String, Object> testRegion;
-  List<Map<String, Object>> testTargets;
-
-  void processNotification(Notification notification) {
-    if (notification.event == NOTIFICATION_NAVIGATION) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        regions = notification.getParameter(REGIONS);
-      }
-    }
-  }
-
-  Future prepareNavigation(then()) {
-    addAnalysisSubscription(AnalysisService.NAVIGATION, testFile);
-    return waitForTasksFinished().then((_) {
-      then();
-    });
-  }
+class _AnalysisNotificationNavigationTest extends AbstractAnalysisTest {
+  List<_NavigationRegion> regions;
+  _NavigationRegion testRegion;
+  List<_NavigationTarget> testTargets;
+  _NavigationTarget testTarget;
 
   /**
-   * Finds the navigation region with the given [offset] and [length].
-   * If [length] is `-1`, then it is ignored.
-   *
-   * If [exists] is `true`, then fails if such region does not exist.
-   * Otherwise remembers this it into [testRegion].
-   * Also fills [testTargets] with its targets.
-   *
-   * If [exists] is `false`, then fails if such region exists.
+   * Validates that there is a target in [testTargets]  with [file], at [offset]
+   * and with the given [length].
    */
-  void findRegion(int offset, int length, [bool exists]) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset &&
-          (length == -1 || region['length'] == length)) {
-        if (exists == false) {
-          fail('Not expected to find (offset=$offset; length=$length) in\n'
-               '${regions.join('\n')}');
-        }
-        testRegion = region;
-        testTargets = region['targets'];
+  void assertHasFileTarget(String file, int offset, int length) {
+    for (_NavigationTarget target in testTargets) {
+      if (target.file == file && target.offset == offset && target.length ==
+          length) {
+        testTarget = target;
         return;
       }
     }
-    if (exists == true) {
-      fail('Expected to find (offset=$offset; length=$length) in\n'
-           '${regions.join('\n')}');
-    }
+    fail(
+        'Expected to find target (file=$file; offset=$offset; length=$length) in\n'
+        '${testRegion} in\n' '${regions.join('\n')}');
+  }
+
+  void assertHasOperatorRegion(String regionSearch, int regionLength,
+      String targetSearch, int targetLength) {
+    assertHasRegion(regionSearch, regionLength);
+    assertHasTarget(targetSearch, targetLength);
   }
 
   /**
@@ -90,6 +77,15 @@
   }
 
   /**
+   * Validates that there is an identifier region at [regionSearch] with target
+   * at [targetSearch].
+   */
+  void assertHasRegionTarget(String regionSearch, String targetSearch) {
+    assertHasRegion(regionSearch);
+    assertHasTarget(targetSearch);
+  }
+
+  /**
    * Validates that there is a target in [testTargets]  with [testFile], at the
    * offset of [search] in [testFile], and with the given [length] or the length
    * of an leading identifier in [search].
@@ -99,48 +95,7 @@
     if (length == -1) {
       length = findIdentifierLength(search);
     }
-    for (Map<String, Object> target in testTargets) {
-      if (target['file'] == testFile &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return;
-      }
-    }
-    fail('Expected to find target (offset=$offset; length=$length) in\n'
-         '${testRegion} in\n'
-         '${regions.join('\n')}');
-  }
-
-  /**
-   * Validates that there is a target in [testTargets]  with [file], at [offset]
-   * and with the given [length].
-   */
-  void assertHasFileTarget(String file, int offset, int length) {
-    for (Map<String, Object> target in testTargets) {
-      if (target['file'] == file &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return;
-      }
-    }
-    fail('Expected to find target (file=$file; offset=$offset; length=$length) in\n'
-         '${testRegion} in\n'
-         '${regions.join('\n')}');
-  }
-
-  /**
-   * Validates that there is an identifier region at [regionSearch] with target
-   * at [targetSearch].
-   */
-  void assertHasRegionTarget(String regionSearch, String targetSearch) {
-    assertHasRegion(regionSearch);
-    assertHasTarget(targetSearch);
-  }
-
-  void assertHasOperatorRegion(String regionSearch, int regionLength,
-                               String targetSearch, int targetLength) {
-    assertHasRegion(regionSearch, regionLength);
-    assertHasTarget(targetSearch, targetLength);
+    assertHasFileTarget(testFile, offset, length);
   }
 
   /**
@@ -169,6 +124,87 @@
     findRegion(offset, length, false);
   }
 
+  /**
+   * Finds the navigation region with the given [offset] and [length].
+   * If [length] is `-1`, then it is ignored.
+   *
+   * If [exists] is `true`, then fails if such region does not exist.
+   * Otherwise remembers this it into [testRegion].
+   * Also fills [testTargets] with its targets.
+   *
+   * If [exists] is `false`, then fails if such region exists.
+   */
+  void findRegion(int offset, int length, [bool exists]) {
+    for (_NavigationRegion region in regions) {
+      if (region.offset == offset && (length == -1 || region.length == length))
+          {
+        if (exists == false) {
+          fail('Not expected to find (offset=$offset; length=$length) in\n'
+              '${regions.join('\n')}');
+        }
+        testRegion = region;
+        testTargets = region.targets;
+        return;
+      }
+    }
+    if (exists == true) {
+      fail('Expected to find (offset=$offset; length=$length) in\n'
+          '${regions.join('\n')}');
+    }
+  }
+
+  Future prepareNavigation(then()) {
+    addAnalysisSubscription(AnalysisService.NAVIGATION, testFile);
+    return waitForTasksFinished().then((_) {
+      then();
+    });
+  }
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_NAVIGATION) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        regions = [];
+        List<Map<String, Object>> regionsJson = notification.getParameter(
+            REGIONS);
+        for (Map<String, Object> regionJson in regionsJson) {
+          var regionOffset = regionJson[OFFSET];
+          var regionLength = regionJson[LENGTH];
+          List<_NavigationTarget> targets = [];
+          for (Map<String, Object> targetJson in regionJson[TARGETS]) {
+            var targetFile = targetJson[FILE];
+            var targetOffset = targetJson[OFFSET];
+            var targetLength = targetJson[LENGTH];
+            var elementJson = targetJson[ELEMENT];
+            targets.add(new _NavigationTarget(targetFile, targetOffset,
+                targetLength, new Element.fromJson(elementJson)));
+          }
+          var region = new _NavigationRegion(regionOffset, regionLength,
+              targets);
+          regions.add(region);
+        }
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+class AAA {}
+AAA aaa;
+''');
+    return waitForTasksFinished().then((_) {
+      return prepareNavigation(() {
+        assertHasRegionTarget('AAA aaa;', 'AAA {}');
+      });
+    });
+  }
+
   test_constructor_named() {
     addTestFile('''
 class A {
@@ -242,6 +278,20 @@
     });
   }
 
+  test_instanceCreation_implicit() {
+    addTestFile('''
+class A {
+}
+main() {
+  new A();
+}
+''');
+    return prepareNavigation(() {
+      assertHasRegionString('new A');
+      assertHasTarget('A {');
+    });
+  }
+
   test_instanceCreation_named() {
     addTestFile('''
 class A {
@@ -410,11 +460,41 @@
 //      assertNoRegionString('part "test_unit.dart"');
 //    });
   }
+
+  test_targetElement() {
+    addTestFile('''
+class AAA {}
+main() {
+  AAA aaa = null;
+}
+''');
+    return prepareNavigation(() {
+      assertHasRegionTarget('AAA aaa', 'AAA {}');
+      Element element = testTarget.element;
+      expect(element.kind, ElementKind.CLASS);
+      expect(element.name, 'AAA');
+      expect(element.isAbstract, false);
+      expect(element.parameters, isNull);
+      expect(element.returnType, isNull);
+    });
+  }
 }
 
 
-main() {
-  group('notification.navigation', () {
-    runReflectiveTests(AnalysisNotificationNavigationTest);
-  });
-}
\ No newline at end of file
+class _NavigationRegion {
+  final int offset;
+  final int length;
+  final List<_NavigationTarget> targets;
+
+  _NavigationRegion(this.offset, this.length, this.targets);
+}
+
+
+class _NavigationTarget {
+  final String file;
+  final int offset;
+  final int length;
+  final Element element;
+
+  _NavigationTarget(this.file, this.offset, this.length, this.element);
+}
diff --git a/pkg/analysis_server/test/analysis_notification_outline_test.dart b/pkg/analysis_server/test/analysis_notification_outline_test.dart
index 49011ef..54c9aff 100644
--- a/pkg/analysis_server/test/analysis_notification_outline_test.dart
+++ b/pkg/analysis_server/test/analysis_notification_outline_test.dart
@@ -5,9 +5,10 @@
 library test.domain.analysis.notification.outline;
 
 import 'dart:async';
-import 'dart:mirrors';
 
 import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/computer/computer_outline.dart';
+import 'package:analysis_server/src/computer/element.dart';
 import 'package:analysis_server/src/constants.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
@@ -18,24 +19,14 @@
 
 main() {
   group('notification.outline', () {
-    runReflectiveTests(AnalysisNotificationOutlineTest);
+    runReflectiveTests(_AnalysisNotificationOutlineTest);
   });
 }
 
 
 @ReflectiveTestCase()
-class AnalysisNotificationOutlineTest extends AbstractAnalysisTest {
-  _Outline outline;
-
-  void processNotification(Notification notification) {
-    if (notification.event == NOTIFICATION_OUTLINE) {
-      String file = notification.getParameter(FILE);
-      if (file == testFile) {
-        Map<String, Object> json = notification.getParameter(OUTLINE);
-        outline = new _Outline.fromJson(json);
-      }
-    }
-  }
+class _AnalysisNotificationOutlineTest extends AbstractAnalysisTest {
+  Outline outline;
 
   Future prepareOutline(then()) {
     addAnalysisSubscription(AnalysisService.OUTLINE, testFile);
@@ -44,6 +35,39 @@
     });
   }
 
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_OUTLINE) {
+      String file = notification.getParameter(FILE);
+      if (file == testFile) {
+        Map<String, Object> json = notification.getParameter(OUTLINE);
+        outline = new Outline.fromJson(json);
+      }
+    }
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    createProject();
+  }
+
+  test_afterAnalysis() {
+    addTestFile('''
+class AAA {
+}
+class BBB {
+}
+''');
+    return waitForTasksFinished().then((_) {
+      expect(outline, isNull);
+      return prepareOutline(() {
+        Outline unitOutline = outline;
+        List<Outline> outlines = unitOutline.children;
+        expect(outlines, hasLength(2));
+      });
+    });
+  }
+
   test_class() {
     addTestFile('''
 class A {
@@ -62,334 +86,149 @@
 }");
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(2));
       // A
       {
-        _Outline outline_A = topOutlines[0];
-        expect(outline_A.kind, _OutlineKind.CLASS);
-        expect(outline_A.name, "A");
-        expect(outline_A.nameOffset, testCode.indexOf("A {"));
-        expect(outline_A.nameLength, 1);
-        expect(outline_A.parameters, null);
-        expect(outline_A.returnType, null);
+        Outline outline_A = topOutlines[0];
+        Element element_A = outline_A.element;
+        expect(element_A.kind, ElementKind.CLASS);
+        expect(element_A.name, "A");
+        expect(element_A.offset, testCode.indexOf("A {"));
+        expect(element_A.length, 1);
+        expect(element_A.parameters, null);
+        expect(element_A.returnType, null);
         // A children
-        List<_Outline> outlines_A = outline_A.children;
+        List<Outline> outlines_A = outline_A.children;
         expect(outlines_A, hasLength(10));
         {
-          _Outline outline = outlines_A[0];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fa");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "int");
+          Outline outline = outlines_A[0];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fa");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "int");
         }
         {
-          _Outline outline = outlines_A[1];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fb");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "int");
+          Outline outline = outlines_A[1];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fb");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "int");
         }
         {
-          _Outline outline = outlines_A[2];
-          expect(outline.kind, _OutlineKind.FIELD);
-          expect(outline.name, "fc");
-          expect(outline.parameters, isNull);
-          expect(outline.returnType, "String");
+          Outline outline = outlines_A[2];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.FIELD);
+          expect(element.name, "fc");
+          expect(element.parameters, isNull);
+          expect(element.returnType, "String");
         }
         {
-          _Outline outline = outlines_A[3];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A");
-          expect(outline.nameOffset, testCode.indexOf("A(int i, String s);"));
-          expect(outline.nameLength, "A".length);
-          expect(outline.parameters, "(int i, String s)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[3];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A");
+          expect(element.offset, testCode.indexOf("A(int i, String s);"));
+          expect(element.length, "A".length);
+          expect(element.parameters, "(int i, String s)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[4];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A.name");
-          expect(outline.nameOffset, testCode.indexOf("name(num p);"));
-          expect(outline.nameLength, "name".length);
-          expect(outline.parameters, "(num p)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[4];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A.name");
+          expect(element.offset, testCode.indexOf("name(num p);"));
+          expect(element.length, "name".length);
+          expect(element.parameters, "(num p)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[5];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "A._privateName");
-          expect(outline.nameOffset, testCode.indexOf("_privateName(num p);"));
-          expect(outline.nameLength, "_privateName".length);
-          expect(outline.parameters, "(num p)");
-          expect(outline.returnType, isNull);
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[5];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "A._privateName");
+          expect(element.offset, testCode.indexOf("_privateName(num p);"));
+          expect(element.length, "_privateName".length);
+          expect(element.parameters, "(num p)");
+          expect(element.returnType, isNull);
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[6];
-          expect(outline.kind, _OutlineKind.METHOD);
-          expect(outline.name, "ma");
-          expect(outline.nameOffset, testCode.indexOf("ma(int pa) => null;"));
-          expect(outline.nameLength, "ma".length);
-          expect(outline.parameters, "(int pa)");
-          expect(outline.returnType, "String");
-          expect(outline.isAbstract, isFalse);
-          expect(outline.isStatic, isTrue);
+          Outline outline = outlines_A[6];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.METHOD);
+          expect(element.name, "ma");
+          expect(element.offset, testCode.indexOf("ma(int pa) => null;"));
+          expect(element.length, "ma".length);
+          expect(element.parameters, "(int pa)");
+          expect(element.returnType, "String");
+          expect(element.isAbstract, isFalse);
+          expect(element.isStatic, isTrue);
         }
         {
-          _Outline outline = outlines_A[7];
-          expect(outline.kind, _OutlineKind.METHOD);
-          expect(outline.name, "_mb");
-          expect(outline.nameOffset, testCode.indexOf("_mb(int pb);"));
-          expect(outline.nameLength, "_mb".length);
-          expect(outline.parameters, "(int pb)");
-          expect(outline.returnType, "");
-          expect(outline.isAbstract, isTrue);
-          expect(outline.isStatic, isFalse);
+          Outline outline = outlines_A[7];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.METHOD);
+          expect(element.name, "_mb");
+          expect(element.offset, testCode.indexOf("_mb(int pb);"));
+          expect(element.length, "_mb".length);
+          expect(element.parameters, "(int pb)");
+          expect(element.returnType, "");
+          expect(element.isAbstract, isTrue);
+          expect(element.isStatic, isFalse);
         }
         {
-          _Outline outline = outlines_A[8];
-          expect(outline.kind, _OutlineKind.GETTER);
-          expect(outline.name, "propA");
-          expect(outline.nameOffset, testCode.indexOf("propA => null;"));
-          expect(outline.nameLength, "propA".length);
-          expect(outline.parameters, "");
-          expect(outline.returnType, "String");
+          Outline outline = outlines_A[8];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.GETTER);
+          expect(element.name, "propA");
+          expect(element.offset, testCode.indexOf("propA => null;"));
+          expect(element.length, "propA".length);
+          expect(element.parameters, "");
+          expect(element.returnType, "String");
         }
         {
-          _Outline outline = outlines_A[9];
-          expect(outline.kind, _OutlineKind.SETTER);
-          expect(outline.name, "propB");
-          expect(outline.nameOffset, testCode.indexOf("propB(int v) {}"));
-          expect(outline.nameLength, "propB".length);
-          expect(outline.parameters, "(int v)");
-          expect(outline.returnType, "");
+          Outline outline = outlines_A[9];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.SETTER);
+          expect(element.name, "propB");
+          expect(element.offset, testCode.indexOf("propB(int v) {}"));
+          expect(element.length, "propB".length);
+          expect(element.parameters, "(int v)");
+          expect(element.returnType, "");
         }
       }
       // B
       {
-        _Outline outline_B = topOutlines[1];
-        expect(outline_B.kind, _OutlineKind.CLASS);
-        expect(outline_B.name, "B");
-        expect(outline_B.nameOffset, testCode.indexOf("B {"));
-        expect(outline_B.nameLength, 1);
-        expect(outline_B.parameters, null);
-        expect(outline_B.returnType, null);
+        Outline outline_B = topOutlines[1];
+        Element element_B = outline_B.element;
+        expect(element_B.kind, ElementKind.CLASS);
+        expect(element_B.name, "B");
+        expect(element_B.offset, testCode.indexOf("B {"));
+        expect(element_B.length, 1);
+        expect(element_B.parameters, null);
+        expect(element_B.returnType, null);
         // B children
-        List<_Outline> outlines_B = outline_B.children;
+        List<Outline> outlines_B = outline_B.children;
         expect(outlines_B, hasLength(1));
         {
-          _Outline outline = outlines_B[0];
-          expect(outline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(outline.name, "B");
-          expect(outline.nameOffset, testCode.indexOf("B(int p);"));
-          expect(outline.nameLength, "B".length);
-          expect(outline.parameters, "(int p)");
-          expect(outline.returnType, isNull);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inClass() {
-    addTestFile('''
-class A { // leftA
-  int methodA() {} // endA
-  int methodB() {} // endB
-}
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children[0].children;
-      expect(outlines, hasLength(2));
-      // methodA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.METHOD);
-        expect(outline.name, "methodA");
-        {
-          int offset = testCode.indexOf(" // leftA");
-          int end = testCode.indexOf(" // endA");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // methodB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.METHOD);
-        expect(outline.name, "methodB");
-        {
-          int offset = testCode.indexOf(" // endA");
-          int end = testCode.indexOf(" // endB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inClass_inVariableList() {
-    addTestFile('''
-class A { // leftA
-  int fieldA, fieldB, fieldC; // marker
-  int fieldD; // marker2
-}
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children[0].children;
-      expect(outlines, hasLength(4));
-      // fieldA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldA");
-        {
-          int offset = testCode.indexOf(" // leftA");
-          int end = testCode.indexOf(", fieldB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldB");
-        {
-          int offset = testCode.indexOf(", fieldB");
-          int end = testCode.indexOf(", fieldC");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldC
-      {
-        _Outline outline = outlines[2];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldC");
-        {
-          int offset = testCode.indexOf(", fieldC");
-          int end = testCode.indexOf(" // marker");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldD
-      {
-        _Outline outline = outlines[3];
-        expect(outline.kind, _OutlineKind.FIELD);
-        expect(outline.name, "fieldD");
-        {
-          int offset = testCode.indexOf(" // marker");
-          int end = testCode.indexOf(" // marker2");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inUnit() {
-    addTestFile('''
-class A {
-} // endA
-class B {
-} // endB
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
-      expect(topOutlines, hasLength(2));
-      // A
-      {
-        _Outline outline = topOutlines[0];
-        expect(outline.kind, _OutlineKind.CLASS);
-        expect(outline.name, "A");
-        {
-          int offset = 0;
-          int end = testCode.indexOf(" // endA");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // B
-      {
-        _Outline outline = topOutlines[1];
-        expect(outline.kind, _OutlineKind.CLASS);
-        expect(outline.name, "B");
-        {
-          int offset = testCode.indexOf(" // endA");
-          int end = testCode.indexOf(" // endB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-    });
-  }
-
-  test_sourceRange_inUnit_inVariableList() {
-    addTestFile('''
-int fieldA, fieldB, fieldC; // marker
-int fieldD; // marker2
-''');
-    return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> outlines = unitOutline.children;
-      expect(outlines, hasLength(4));
-      // fieldA
-      {
-        _Outline outline = outlines[0];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldA");
-        {
-          int offset = 0;
-          int end = testCode.indexOf(", fieldB");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldB
-      {
-        _Outline outline = outlines[1];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldB");
-        {
-          int offset = testCode.indexOf(", fieldB");
-          int end = testCode.indexOf(", fieldC");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldC
-      {
-        _Outline outline = outlines[2];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldC");
-        {
-          int offset = testCode.indexOf(", fieldC");
-          int end = testCode.indexOf(" // marker");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
-        }
-      }
-      // fieldD
-      {
-        _Outline outline = outlines[3];
-        expect(outline.kind, _OutlineKind.TOP_LEVEL_VARIABLE);
-        expect(outline.name, "fieldD");
-        {
-          int offset = testCode.indexOf(" // marker");
-          int end = testCode.indexOf(" // marker2");
-          expect(outline.elementOffset, offset);
-          expect(outline.elementLength, end - offset);
+          Outline outline = outlines_B[0];
+          Element element = outline.element;
+          expect(element.kind, ElementKind.CONSTRUCTOR);
+          expect(element.name, "B");
+          expect(element.offset, testCode.indexOf("B(int p);"));
+          expect(element.length, "B".length);
+          expect(element.parameters, "(int p)");
+          expect(element.returnType, isNull);
         }
       }
     });
@@ -413,110 +252,329 @@
 }
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(2));
       // A
       {
-        _Outline outline_A = topOutlines[0];
-        expect(outline_A.kind, _OutlineKind.CLASS);
-        expect(outline_A.name, "A");
-        expect(outline_A.nameOffset, testCode.indexOf("A {"));
-        expect(outline_A.nameLength, "A".length);
-        expect(outline_A.parameters, null);
-        expect(outline_A.returnType, null);
+        Outline outline_A = topOutlines[0];
+        Element element_A = outline_A.element;
+        expect(element_A.kind, ElementKind.CLASS);
+        expect(element_A.name, "A");
+        expect(element_A.offset, testCode.indexOf("A {"));
+        expect(element_A.length, "A".length);
+        expect(element_A.parameters, null);
+        expect(element_A.returnType, null);
         // A children
-        List<_Outline> outlines_A = outline_A.children;
+        List<Outline> outlines_A = outline_A.children;
         expect(outlines_A, hasLength(2));
         {
-          _Outline constructorOutline = outlines_A[0];
-          expect(constructorOutline.kind, _OutlineKind.CONSTRUCTOR);
-          expect(constructorOutline.name, "A");
-          expect(constructorOutline.nameOffset, testCode.indexOf("A() {"));
-          expect(constructorOutline.nameLength, "A".length);
-          expect(constructorOutline.parameters, "()");
-          expect(constructorOutline.returnType, isNull);
+          Outline constructorOutline = outlines_A[0];
+          Element constructorElement = constructorOutline.element;
+          expect(constructorElement.kind, ElementKind.CONSTRUCTOR);
+          expect(constructorElement.name, "A");
+          expect(constructorElement.offset, testCode.indexOf("A() {"));
+          expect(constructorElement.length, "A".length);
+          expect(constructorElement.parameters, "()");
+          expect(constructorElement.returnType, isNull);
           // local function
-          List<_Outline> outlines_constructor = constructorOutline.children;
+          List<Outline> outlines_constructor = constructorOutline.children;
           expect(outlines_constructor, hasLength(1));
           {
-            _Outline outline = outlines_constructor[0];
-            expect(outline.kind, _OutlineKind.FUNCTION);
-            expect(outline.name, "local_A");
-            expect(outline.nameOffset, testCode.indexOf("local_A() {}"));
-            expect(outline.nameLength, "local_A".length);
-            expect(outline.parameters, "()");
-            expect(outline.returnType, "int");
+            Outline outline = outlines_constructor[0];
+            Element element = outline.element;
+            expect(element.kind, ElementKind.FUNCTION);
+            expect(element.name, "local_A");
+            expect(element.offset, testCode.indexOf("local_A() {}"));
+            expect(element.length, "local_A".length);
+            expect(element.parameters, "()");
+            expect(element.returnType, "int");
           }
         }
         {
-          _Outline outline_m = outlines_A[1];
-          expect(outline_m.kind, _OutlineKind.METHOD);
-          expect(outline_m.name, "m");
-          expect(outline_m.nameOffset, testCode.indexOf("m() {"));
-          expect(outline_m.nameLength, "m".length);
-          expect(outline_m.parameters, "()");
-          expect(outline_m.returnType, "");
+          Outline outline_m = outlines_A[1];
+          Element element_m = outline_m.element;
+          expect(element_m.kind, ElementKind.METHOD);
+          expect(element_m.name, "m");
+          expect(element_m.offset, testCode.indexOf("m() {"));
+          expect(element_m.length, "m".length);
+          expect(element_m.parameters, "()");
+          expect(element_m.returnType, "");
           // local function
-          List<_Outline> methodChildren = outline_m.children;
+          List<Outline> methodChildren = outline_m.children;
           expect(methodChildren, hasLength(1));
           {
-            _Outline outline = methodChildren[0];
-            expect(outline.kind, _OutlineKind.FUNCTION);
-            expect(outline.name, "local_m");
-            expect(outline.nameOffset, testCode.indexOf("local_m() {}"));
-            expect(outline.nameLength, "local_m".length);
-            expect(outline.parameters, "()");
-            expect(outline.returnType, "");
+            Outline outline = methodChildren[0];
+            Element element = outline.element;
+            expect(element.kind, ElementKind.FUNCTION);
+            expect(element.name, "local_m");
+            expect(element.offset, testCode.indexOf("local_m() {}"));
+            expect(element.length, "local_m".length);
+            expect(element.parameters, "()");
+            expect(element.returnType, "");
           }
         }
       }
       // f()
       {
-        _Outline outline_f = topOutlines[1];
-        expect(outline_f.kind, _OutlineKind.FUNCTION);
-        expect(outline_f.name, "f");
-        expect(outline_f.nameOffset, testCode.indexOf("f() {"));
-        expect(outline_f.nameLength, "f".length);
-        expect(outline_f.parameters, "()");
-        expect(outline_f.returnType, "");
+        Outline outline_f = topOutlines[1];
+        Element element_f = outline_f.element;
+        expect(element_f.kind, ElementKind.FUNCTION);
+        expect(element_f.name, "f");
+        expect(element_f.offset, testCode.indexOf("f() {"));
+        expect(element_f.length, "f".length);
+        expect(element_f.parameters, "()");
+        expect(element_f.returnType, "");
         // f() children
-        List<_Outline> outlines_f = outline_f.children;
+        List<Outline> outlines_f = outline_f.children;
         expect(outlines_f, hasLength(2));
         {
-          _Outline outline_f1 = outlines_f[0];
-          expect(outline_f1.kind, _OutlineKind.FUNCTION);
-          expect(outline_f1.name, "local_f1");
-          expect(outline_f1.nameOffset, testCode.indexOf("local_f1(int i) {}"));
-          expect(outline_f1.nameLength, "local_f1".length);
-          expect(outline_f1.parameters, "(int i)");
-          expect(outline_f1.returnType, "");
+          Outline outline_f1 = outlines_f[0];
+          Element element_f1 = outline_f1.element;
+          expect(element_f1.kind, ElementKind.FUNCTION);
+          expect(element_f1.name, "local_f1");
+          expect(element_f1.offset, testCode.indexOf("local_f1(int i) {}"));
+          expect(element_f1.length, "local_f1".length);
+          expect(element_f1.parameters, "(int i)");
+          expect(element_f1.returnType, "");
         }
         {
-          _Outline outline_f2 = outlines_f[1];
-          expect(outline_f2.kind, _OutlineKind.FUNCTION);
-          expect(outline_f2.name, "local_f2");
-          expect(outline_f2.nameOffset, testCode.indexOf("local_f2(String s) {"));
-          expect(outline_f2.nameLength, "local_f2".length);
-          expect(outline_f2.parameters, "(String s)");
-          expect(outline_f2.returnType, "");
+          Outline outline_f2 = outlines_f[1];
+          Element element_f2 = outline_f2.element;
+          expect(element_f2.kind, ElementKind.FUNCTION);
+          expect(element_f2.name, "local_f2");
+          expect(element_f2.offset, testCode.indexOf("local_f2(String s) {"));
+          expect(element_f2.length, "local_f2".length);
+          expect(element_f2.parameters, "(String s)");
+          expect(element_f2.returnType, "");
           // local_f2() local function
-          List<_Outline> outlines_f2 = outline_f2.children;
+          List<Outline> outlines_f2 = outline_f2.children;
           expect(outlines_f2, hasLength(1));
           {
-            _Outline outline_f21 = outlines_f2[0];
-            expect(outline_f21.kind, _OutlineKind.FUNCTION);
-            expect(outline_f21.name, "local_f21");
-            expect(outline_f21.nameOffset, testCode.indexOf("local_f21(int p) {"));
-            expect(outline_f21.nameLength, "local_f21".length);
-            expect(outline_f21.parameters, "(int p)");
-            expect(outline_f21.returnType, "");
+            Outline outline_f21 = outlines_f2[0];
+            Element element_f21 = outline_f21.element;
+            expect(element_f21.kind, ElementKind.FUNCTION);
+            expect(element_f21.name, "local_f21");
+            expect(element_f21.offset, testCode.indexOf("local_f21(int p) {"));
+            expect(element_f21.length, "local_f21".length);
+            expect(element_f21.parameters, "(int p)");
+            expect(element_f21.returnType, "");
           }
         }
       }
     });
   }
 
+  test_sourceRange_inClass() {
+    addTestFile('''
+class A { // leftA
+  int methodA() {} // endA
+  int methodB() {} // endB
+}
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children[0].children;
+      expect(outlines, hasLength(2));
+      // methodA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.METHOD);
+        expect(element.name, "methodA");
+        {
+          int offset = testCode.indexOf(" // leftA");
+          int end = testCode.indexOf(" // endA");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // methodB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.METHOD);
+        expect(element.name, "methodB");
+        {
+          int offset = testCode.indexOf(" // endA");
+          int end = testCode.indexOf(" // endB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inClass_inVariableList() {
+    addTestFile('''
+class A { // leftA
+  int fieldA, fieldB, fieldC; // marker
+  int fieldD; // marker2
+}
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children[0].children;
+      expect(outlines, hasLength(4));
+      // fieldA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldA");
+        {
+          int offset = testCode.indexOf(" // leftA");
+          int end = testCode.indexOf(", fieldB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldB");
+        {
+          int offset = testCode.indexOf(", fieldB");
+          int end = testCode.indexOf(", fieldC");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldC
+      {
+        Outline outline = outlines[2];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldC");
+        {
+          int offset = testCode.indexOf(", fieldC");
+          int end = testCode.indexOf(" // marker");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldD
+      {
+        Outline outline = outlines[3];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FIELD);
+        expect(element.name, "fieldD");
+        {
+          int offset = testCode.indexOf(" // marker");
+          int end = testCode.indexOf(" // marker2");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inUnit() {
+    addTestFile('''
+class A {
+} // endA
+class B {
+} // endB
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
+      expect(topOutlines, hasLength(2));
+      // A
+      {
+        Outline outline = topOutlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS);
+        expect(element.name, "A");
+        {
+          int offset = 0;
+          int end = testCode.indexOf(" // endA");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // B
+      {
+        Outline outline = topOutlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS);
+        expect(element.name, "B");
+        {
+          int offset = testCode.indexOf(" // endA");
+          int end = testCode.indexOf(" // endB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
+  test_sourceRange_inUnit_inVariableList() {
+    addTestFile('''
+int fieldA, fieldB, fieldC; // marker
+int fieldD; // marker2
+''');
+    return prepareOutline(() {
+      Outline unitOutline = outline;
+      List<Outline> outlines = unitOutline.children;
+      expect(outlines, hasLength(4));
+      // fieldA
+      {
+        Outline outline = outlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldA");
+        {
+          int offset = 0;
+          int end = testCode.indexOf(", fieldB");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldB
+      {
+        Outline outline = outlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldB");
+        {
+          int offset = testCode.indexOf(", fieldB");
+          int end = testCode.indexOf(", fieldC");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldC
+      {
+        Outline outline = outlines[2];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldC");
+        {
+          int offset = testCode.indexOf(", fieldC");
+          int end = testCode.indexOf(" // marker");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+      // fieldD
+      {
+        Outline outline = outlines[3];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.TOP_LEVEL_VARIABLE);
+        expect(element.name, "fieldD");
+        {
+          int offset = testCode.indexOf(" // marker");
+          int end = testCode.indexOf(" // marker2");
+          expect(outline.offset, offset);
+          expect(outline.length, end - offset);
+        }
+      }
+    });
+  }
+
   test_topLevel() {
     addTestFile('''
 typedef String FTA(int i, String s);
@@ -530,152 +588,86 @@
 set propB(int v) {}
 ''');
     return prepareOutline(() {
-      _Outline unitOutline = outline;
-      List<_Outline> topOutlines = unitOutline.children;
+      Outline unitOutline = outline;
+      List<Outline> topOutlines = unitOutline.children;
       expect(topOutlines, hasLength(9));
       // FTA
       {
-        _Outline outline = topOutlines[0];
-        expect(outline.kind, _OutlineKind.FUNCTION_TYPE_ALIAS);
-        expect(outline.name, "FTA");
-        expect(outline.nameOffset, testCode.indexOf("FTA("));
-        expect(outline.nameLength, "FTA".length);
-        expect(outline.parameters, "(int i, String s)");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[0];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+        expect(element.name, "FTA");
+        expect(element.offset, testCode.indexOf("FTA("));
+        expect(element.length, "FTA".length);
+        expect(element.parameters, "(int i, String s)");
+        expect(element.returnType, "String");
       }
       // FTB
       {
-        _Outline outline = topOutlines[1];
-        expect(outline.kind, _OutlineKind.FUNCTION_TYPE_ALIAS);
-        expect(outline.name, "FTB");
-        expect(outline.nameOffset, testCode.indexOf("FTB("));
-        expect(outline.nameLength, "FTB".length);
-        expect(outline.parameters, "(int p)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[1];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION_TYPE_ALIAS);
+        expect(element.name, "FTB");
+        expect(element.offset, testCode.indexOf("FTB("));
+        expect(element.length, "FTB".length);
+        expect(element.parameters, "(int p)");
+        expect(element.returnType, "");
       }
       // CTA
       {
-        _Outline outline = topOutlines[4];
-        expect(outline.kind, _OutlineKind.CLASS_TYPE_ALIAS);
-        expect(outline.name, "CTA");
-        expect(outline.nameOffset, testCode.indexOf("CTA ="));
-        expect(outline.nameLength, "CTA".length);
-        expect(outline.parameters, isNull);
-        expect(outline.returnType, isNull);
+        Outline outline = topOutlines[4];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.CLASS_TYPE_ALIAS);
+        expect(element.name, "CTA");
+        expect(element.offset, testCode.indexOf("CTA ="));
+        expect(element.length, "CTA".length);
+        expect(element.parameters, isNull);
+        expect(element.returnType, isNull);
       }
       // fA
       {
-        _Outline outline = topOutlines[5];
-        expect(outline.kind, _OutlineKind.FUNCTION);
-        expect(outline.name, "fA");
-        expect(outline.nameOffset, testCode.indexOf("fA("));
-        expect(outline.nameLength, "fA".length);
-        expect(outline.parameters, "(int i, String s)");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[5];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION);
+        expect(element.name, "fA");
+        expect(element.offset, testCode.indexOf("fA("));
+        expect(element.length, "fA".length);
+        expect(element.parameters, "(int i, String s)");
+        expect(element.returnType, "String");
       }
       // fB
       {
-        _Outline outline = topOutlines[6];
-        expect(outline.kind, _OutlineKind.FUNCTION);
-        expect(outline.name, "fB");
-        expect(outline.nameOffset, testCode.indexOf("fB("));
-        expect(outline.nameLength, "fB".length);
-        expect(outline.parameters, "(int p)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[6];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.FUNCTION);
+        expect(element.name, "fB");
+        expect(element.offset, testCode.indexOf("fB("));
+        expect(element.length, "fB".length);
+        expect(element.parameters, "(int p)");
+        expect(element.returnType, "");
       }
       // propA
       {
-        _Outline outline = topOutlines[7];
-        expect(outline.kind, _OutlineKind.GETTER);
-        expect(outline.name, "propA");
-        expect(outline.nameOffset, testCode.indexOf("propA => null;"));
-        expect(outline.nameLength, "propA".length);
-        expect(outline.parameters, "");
-        expect(outline.returnType, "String");
+        Outline outline = topOutlines[7];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.GETTER);
+        expect(element.name, "propA");
+        expect(element.offset, testCode.indexOf("propA => null;"));
+        expect(element.length, "propA".length);
+        expect(element.parameters, "");
+        expect(element.returnType, "String");
       }
       // propB
       {
-        _Outline outline = topOutlines[8];
-        expect(outline.kind, _OutlineKind.SETTER);
-        expect(outline.name, "propB");
-        expect(outline.nameOffset, testCode.indexOf("propB(int v) {}"));
-        expect(outline.nameLength, "propB".length);
-        expect(outline.parameters, "(int v)");
-        expect(outline.returnType, "");
+        Outline outline = topOutlines[8];
+        Element element = outline.element;
+        expect(element.kind, ElementKind.SETTER);
+        expect(element.name, "propB");
+        expect(element.offset, testCode.indexOf("propB(int v) {}"));
+        expect(element.length, "propB".length);
+        expect(element.parameters, "(int v)");
+        expect(element.returnType, "");
       }
     });
   }
 }
-
-
-/**
- * Element outline kinds.
- */
-class _OutlineKind {
-  static const _OutlineKind CLASS = const _OutlineKind('CLASS');
-  static const _OutlineKind CLASS_TYPE_ALIAS = const _OutlineKind('CLASS_TYPE_ALIAS');
-  static const _OutlineKind COMPILATION_UNIT = const _OutlineKind('COMPILATION_UNIT');
-  static const _OutlineKind CONSTRUCTOR = const _OutlineKind('CONSTRUCTOR');
-  static const _OutlineKind GETTER = const _OutlineKind('GETTER');
-  static const _OutlineKind FIELD = const _OutlineKind('FIELD');
-  static const _OutlineKind FUNCTION = const _OutlineKind('FUNCTION');
-  static const _OutlineKind FUNCTION_TYPE_ALIAS = const _OutlineKind('FUNCTION_TYPE_ALIAS');
-  static const _OutlineKind LIBRARY = const _OutlineKind('LIBRARY');
-  static const _OutlineKind METHOD = const _OutlineKind('METHOD');
-  static const _OutlineKind SETTER = const _OutlineKind('SETTER');
-  static const _OutlineKind TOP_LEVEL_VARIABLE = const _OutlineKind('TOP_LEVEL_VARIABLE');
-  static const _OutlineKind UNKNOWN = const _OutlineKind('UNKNOWN');
-  static const _OutlineKind UNIT_TEST_CASE = const _OutlineKind('UNIT_TEST_CASE');
-  static const _OutlineKind UNIT_TEST_GROUP = const _OutlineKind('UNIT_TEST_GROUP');
-
-  final String name;
-
-  const _OutlineKind(this.name);
-
-  static _OutlineKind valueOf(String name) {
-    ClassMirror classMirror = reflectClass(_OutlineKind);
-    return classMirror.getField(new Symbol(name)).reflectee;
-  }
-}
-
-
-/**
- * An element outline.
- */
-class _Outline {
-  static const List<_Outline> EMPTY_ARRAY = const <_Outline>[];
-
-  final _OutlineKind kind;
-  final String name;
-  final int nameOffset;
-  final int nameLength;
-  final int elementOffset;
-  final int elementLength;
-  final bool isAbstract;
-  final bool isStatic;
-  final String parameters;
-  final String returnType;
-  final List<_Outline> children = <_Outline>[];
-
-  _Outline(this.kind, this.name,
-           this.nameOffset, this.nameLength,
-           this.elementOffset, this.elementLength,
-           this.isAbstract, this.isStatic,
-           this.parameters, this.returnType);
-
-  factory _Outline.fromJson(Map<String, Object> map) {
-    _Outline outline = new _Outline(
-        _OutlineKind.valueOf(map[KIND]), map[NAME],
-        map[NAME_OFFSET], map[NAME_LENGTH],
-        map[ELEMENT_OFFSET], map[ELEMENT_LENGTH],
-        map[IS_ABSTRACT], map[IS_STATIC],
-        map[PARAMETERS], map[RETURN_TYPE]);
-    List<Map<String, Object>> childrenMaps = map[CHILDREN];
-    if (childrenMaps != null) {
-      childrenMaps.forEach((childMap) {
-        outline.children.add(new _Outline.fromJson(childMap));
-      });
-    }
-    return outline;
-  }
-}
diff --git a/pkg/analysis_server/test/analysis_server_test.dart b/pkg/analysis_server/test/analysis_server_test.dart
index b3c11f6..3fb4e27 100644
--- a/pkg/analysis_server/test/analysis_server_test.dart
+++ b/pkg/analysis_server/test/analysis_server_test.dart
@@ -5,7 +5,6 @@
 library test.analysis_server;
 
 import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/error.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_server.dart';
@@ -26,6 +25,7 @@
   AnalysisServerTestHelper({bool rethrowExceptions: true}) {
     channel = new MockServerChannel();
     server = new AnalysisServer(channel, PhysicalResourceProvider.INSTANCE,
+        new MockPackageMapProvider(), null,
         rethrowExceptions: rethrowExceptions);
   }
 }
@@ -71,7 +71,7 @@
     test('shutdown', () {
       AnalysisServerTestHelper helper = new AnalysisServerTestHelper();
       helper.server.handlers = [new ServerDomainHandler(helper.server)];
-      var request = new Request('my28', METHOD_SHUTDOWN);
+      var request = new Request('my28', SERVER_SHUTDOWN);
       return helper.channel.sendRequest(request)
           .then((Response response) {
             expect(response.id, equals('my28'));
diff --git a/pkg/analysis_server/test/computer/element_test.dart b/pkg/analysis_server/test/computer/element_test.dart
new file mode 100644
index 0000000..ba83c65
--- /dev/null
+++ b/pkg/analysis_server/test/computer/element_test.dart
@@ -0,0 +1,263 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.computer.element;
+
+import 'package:analysis_server/src/computer/element.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analyzer/src/generated/element.dart' as engine;
+import 'package:analyzer/src/generated/utilities_dart.dart' as engine;
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../index/store/typed_mocks.dart';
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('Element', () {
+    runReflectiveTests(_ElementTest);
+  });
+  group('ElementKind', () {
+    test('toString', test_ElementKind_toString);
+    test('valueOf', test_ElementKind_valueOf);
+    test('valueOfEngine', test_ElementKind_valueOfEngine);
+  });
+}
+
+
+void test_ElementKind_toString() {
+  expect(ElementKind.CLASS.toString(), 'CLASS');
+  expect(ElementKind.COMPILATION_UNIT.toString(), 'COMPILATION_UNIT');
+}
+
+
+void test_ElementKind_valueOf() {
+  expect(ElementKind.valueOf(ElementKind.CLASS.name), ElementKind.CLASS);
+  expect(ElementKind.valueOf(ElementKind.CLASS_TYPE_ALIAS.name),
+      ElementKind.CLASS_TYPE_ALIAS);
+  expect(ElementKind.valueOf(ElementKind.COMPILATION_UNIT.name),
+      ElementKind.COMPILATION_UNIT);
+  expect(ElementKind.valueOf(ElementKind.CONSTRUCTOR.name),
+      ElementKind.CONSTRUCTOR);
+  expect(ElementKind.valueOf(ElementKind.FIELD.name), ElementKind.FIELD);
+  expect(ElementKind.valueOf(ElementKind.FUNCTION.name), ElementKind.FUNCTION);
+  expect(ElementKind.valueOf(ElementKind.FUNCTION_TYPE_ALIAS.name),
+      ElementKind.FUNCTION_TYPE_ALIAS);
+  expect(ElementKind.valueOf(ElementKind.GETTER.name), ElementKind.GETTER);
+  expect(ElementKind.valueOf(ElementKind.LIBRARY.name), ElementKind.LIBRARY);
+  expect(ElementKind.valueOf(ElementKind.METHOD.name), ElementKind.METHOD);
+  expect(ElementKind.valueOf(ElementKind.SETTER.name), ElementKind.SETTER);
+  expect(ElementKind.valueOf(ElementKind.TOP_LEVEL_VARIABLE.name),
+      ElementKind.TOP_LEVEL_VARIABLE);
+  expect(ElementKind.valueOf(ElementKind.UNIT_TEST_CASE.name),
+      ElementKind.UNIT_TEST_CASE);
+  expect(ElementKind.valueOf(ElementKind.UNIT_TEST_GROUP.name),
+      ElementKind.UNIT_TEST_GROUP);
+  expect(ElementKind.valueOf(ElementKind.UNKNOWN.name), ElementKind.UNKNOWN);
+  expect(() {
+    ElementKind.valueOf('no-such-kind');
+  }, throws);
+}
+
+
+void test_ElementKind_valueOfEngine() {
+  expect(ElementKind.valueOfEngine(engine.ElementKind.CLASS),
+      ElementKind.CLASS);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.COMPILATION_UNIT),
+      ElementKind.COMPILATION_UNIT);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.CONSTRUCTOR),
+      ElementKind.CONSTRUCTOR);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FIELD),
+      ElementKind.FIELD);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION),
+      ElementKind.FUNCTION);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.FUNCTION_TYPE_ALIAS),
+      ElementKind.FUNCTION_TYPE_ALIAS);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.GETTER),
+      ElementKind.GETTER);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.LIBRARY),
+      ElementKind.LIBRARY);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.METHOD),
+      ElementKind.METHOD);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.SETTER),
+      ElementKind.SETTER);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.TOP_LEVEL_VARIABLE),
+      ElementKind.TOP_LEVEL_VARIABLE);
+  expect(ElementKind.valueOfEngine(engine.ElementKind.ANGULAR_COMPONENT),
+      ElementKind.UNKNOWN);
+}
+
+
+@ReflectiveTestCase()
+class _ElementTest {
+  void test_fromElement_CLASS() {
+    engine.ClassElement engineElement = new MockClassElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.CLASS);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('MyClass');
+    when(engineElement.isAbstract).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(true);
+    when(engineElement.isPrivate).thenReturn(true);
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.CLASS);
+    expect(element.name, 'MyClass');
+    expect(element.offset, 1);
+    expect(element.length, 'MyClass'.length);
+    expect(element.flags, Element.FLAG_ABSTRACT | Element.FLAG_DEPRECATED |
+        Element.FLAG_PRIVATE);
+  }
+
+  void test_fromElement_CONSTRUCTOR() {
+    engine.ConstructorElement engineElement = new MockConstructorElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.CONSTRUCTOR);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myConstructor');
+    when(engineElement.isConst).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(false);
+    when(engineElement.parameters).thenReturn([]);
+    {
+      engine.ParameterElement a = new MockParameterElement('int a');
+      engine.ParameterElement b = new MockParameterElement('String b');
+      when(b.kind).thenReturn(engine.ParameterKind.POSITIONAL);
+      when(engineElement.parameters).thenReturn([a, b]);
+    }
+    {
+      engine.DartType returnType = new MockDartType('Map<int, String>');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.CONSTRUCTOR);
+    expect(element.name, 'myConstructor');
+    expect(element.offset, 1);
+    expect(element.length, 'myConstructor'.length);
+    expect(element.parameters, '(int a, [String b])');
+    expect(element.returnType, 'Map<int, String>');
+    expect(element.flags, Element.FLAG_CONST);
+  }
+
+  void test_fromElement_FIELD() {
+    engine.FieldElement engineElement = new MockFieldElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.FIELD);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myField');
+    when(engineElement.isConst).thenReturn(true);
+    when(engineElement.isFinal).thenReturn(true);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(true);
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.FIELD);
+    expect(element.name, 'myField');
+    expect(element.offset, 1);
+    expect(element.length, 'myField'.length);
+    expect(element.parameters, isNull);
+    expect(element.returnType, isNull);
+    expect(element.flags, Element.FLAG_CONST | Element.FLAG_FINAL |
+        Element.FLAG_STATIC);
+  }
+
+  void test_fromElement_GETTER() {
+    engine.PropertyAccessorElement engineElement =
+        new MockPropertyAccessorElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.GETTER);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myGetter');
+    when(engineElement.isAbstract).thenReturn(false);
+    when(engineElement.isDeprecated).thenReturn(true);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(false);
+    when(engineElement.parameters).thenReturn([]);
+    {
+      engine.DartType returnType = new MockDartType('String');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.GETTER);
+    expect(element.name, 'myGetter');
+    expect(element.offset, 1);
+    expect(element.length, 'myGetter'.length);
+    expect(element.parameters, '()');
+    expect(element.returnType, 'String');
+    expect(element.flags, Element.FLAG_DEPRECATED);
+  }
+
+  void test_fromElement_METHOD() {
+    engine.MethodElement engineElement = new MockMethodElement();
+    when(engineElement.kind).thenReturn(engine.ElementKind.METHOD);
+    when(engineElement.nameOffset).thenReturn(1);
+    when(engineElement.displayName).thenReturn('myMethod');
+    when(engineElement.isAbstract).thenReturn(false);
+    when(engineElement.isDeprecated).thenReturn(false);
+    when(engineElement.isPrivate).thenReturn(false);
+    when(engineElement.isStatic).thenReturn(true);
+    {
+      engine.ParameterElement a = new MockParameterElement('int a');
+      engine.ParameterElement b = new MockParameterElement('String b');
+      when(b.kind).thenReturn(engine.ParameterKind.NAMED);
+      when(engineElement.parameters).thenReturn([a, b]);
+    }
+    {
+      engine.DartType returnType = new MockDartType('List<String>');
+      when(engineElement.returnType).thenReturn(returnType);
+    }
+    // create notification Element
+    Element element = new Element.fromEngine(engineElement);
+    expect(element.kind, ElementKind.METHOD);
+    expect(element.name, 'myMethod');
+    expect(element.offset, 1);
+    expect(element.length, 'myMethod'.length);
+    expect(element.parameters, '(int a, {String b})');
+    expect(element.returnType, 'List<String>');
+    expect(element.flags, Element.FLAG_STATIC);
+  }
+
+  void test_fromJson() {
+    var flags = Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+        Element.FLAG_STATIC;
+    var json = {
+      KIND: 'METHOD',
+      NAME: 'my name',
+      OFFSET: 1,
+      LENGTH: 2,
+      FLAGS: flags,
+      PARAMETERS: '(int a, String b)',
+      RETURN_TYPE: 'List<String>'
+    };
+    Element element = new Element.fromJson(json);
+    expect(element.kind, ElementKind.METHOD);
+    expect(element.name, 'my name');
+    expect(element.offset, 1);
+    expect(element.length, 2);
+    expect(element.flags, flags);
+    expect(element.isAbstract, isFalse);
+    expect(element.isConst, isFalse);
+    expect(element.isDeprecated, isTrue);
+    expect(element.isFinal, isFalse);
+    expect(element.isPrivate, isTrue);
+    expect(element.isStatic, isTrue);
+  }
+
+  void test_toJson() {
+    var json = {
+      KIND: 'METHOD',
+      NAME: 'my name',
+      OFFSET: 1,
+      LENGTH: 2,
+      FLAGS: Element.FLAG_DEPRECATED | Element.FLAG_PRIVATE |
+          Element.FLAG_STATIC,
+      PARAMETERS: '(int a, String b)',
+      RETURN_TYPE: 'List<String>'
+    };
+    Element element = new Element.fromJson(json);
+    expect(element.toJson(), equals(json));
+  }
+}
diff --git a/pkg/analysis_server/test/computer/test_all.dart b/pkg/analysis_server/test/computer/test_all.dart
new file mode 100644
index 0000000..2badfdf
--- /dev/null
+++ b/pkg/analysis_server/test/computer/test_all.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.computer.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'element_test.dart' as element_test;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('index', () {
+    element_test.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/context_directory_manager_test.dart b/pkg/analysis_server/test/context_directory_manager_test.dart
index 283dd63..ac149fc 100644
--- a/pkg/analysis_server/test/context_directory_manager_test.dart
+++ b/pkg/analysis_server/test/context_directory_manager_test.dart
@@ -15,29 +15,47 @@
 class TestContextDirectoryManager extends ContextDirectoryManager {
   TestContextDirectoryManager(MemoryResourceProvider provider) : super(provider);
 
+  /**
+   * Source of timestamps stored in [currentContextFilePaths].
+   */
+  int now = 0;
+
   final Set<String> currentContextPaths = new Set<String>();
-  final Map<String, String> currentContextPubspecPaths = <String, String>{};
-  final Map<String, Set<String>> currentContextFilePaths = <String, Set<String>>{};
+
+  /**
+   * Map from context to (map from file path to timestamp of last event)
+   */
+  final Map<String, Map<String, int>> currentContextFilePaths = <String, Map<String, int>>{};
 
   @override
-  void addContext(Folder folder, File pubspecFile) {
-    currentContextPaths.add(folder.path);
-    currentContextPubspecPaths[folder.path] = pubspecFile != null ? pubspecFile.path : null;
-    currentContextFilePaths[folder.path] = new Set<String>();
+  void addContext(Folder folder) {
+    String path = folder.path;
+    currentContextPaths.add(path);
+    currentContextFilePaths[path] = <String, int>{};
   }
 
   @override
   void applyChangesToContext(Folder contextFolder, ChangeSet changeSet) {
-    Set<String> filePaths = currentContextFilePaths[contextFolder.path];
+    Map<String, int> filePaths = currentContextFilePaths[contextFolder.path];
     for (Source source in changeSet.addedSources) {
       expect(filePaths, isNot(contains(source.fullName)));
-      filePaths.add(source.fullName);
+      filePaths[source.fullName] = now;
     }
     for (Source source in changeSet.removedSources) {
       expect(filePaths, contains(source.fullName));
       filePaths.remove(source.fullName);
     }
-    // TODO(paulberry): handle source.changedSources.
+    for (Source source in changeSet.changedSources) {
+      expect(filePaths, contains(source.fullName));
+      filePaths[source.fullName] = now;
+    }
+  }
+
+  @override
+  void removeContext(Folder folder) {
+    String path = folder.path;
+    currentContextPaths.remove(path);
+    currentContextFilePaths.remove(path);
   }
 }
 
@@ -61,7 +79,6 @@
       manager.setRoots(<String>[projPath], <String>[]);
       expect(manager.currentContextPaths, hasLength(1));
       expect(manager.currentContextPaths, contains(projPath));
-      expect(manager.currentContextPubspecPaths[projPath], equals(pubspecPath));
       expect(manager.currentContextFilePaths[projPath], hasLength(0));
     });
 
@@ -71,7 +88,6 @@
       manager.setRoots(<String>[projPath], <String>[]);
       expect(manager.currentContextPaths, hasLength(1));
       expect(manager.currentContextPaths, contains(projPath));
-      expect(manager.currentContextPubspecPaths[projPath], isNull);
       expect(manager.currentContextFilePaths[projPath], hasLength(0));
     });
 
@@ -97,6 +113,26 @@
       expect(filePaths, contains(filePath));
     });
 
+    test('remove folder with pubspec', () {
+      String projPath = '/my/proj';
+      String pubspecPath = posix.join(projPath, 'pubspec.yaml');
+      provider.newFolder(projPath);
+      provider.newFile(pubspecPath, 'pubspec');
+      manager.setRoots(<String>[projPath], <String>[]);
+      manager.setRoots(<String>[], <String>[]);
+      expect(manager.currentContextPaths, hasLength(0));
+      expect(manager.currentContextFilePaths, hasLength(0));
+    });
+
+    test('remove folder without pubspec', () {
+      String projPath = '/my/proj';
+      provider.newFolder(projPath);
+      manager.setRoots(<String>[projPath], <String>[]);
+      manager.setRoots(<String>[], <String>[]);
+      expect(manager.currentContextPaths, hasLength(0));
+      expect(manager.currentContextFilePaths, hasLength(0));
+    });
+
     test('ignore files in packages dir', () {
       String projPath = '/my/proj';
       provider.newFolder(projPath);
@@ -105,7 +141,7 @@
       String filePath1 = posix.join(projPath, 'packages', 'file1.dart');
       provider.newFile(filePath1, 'contents');
       manager.setRoots(<String>[projPath], <String>[]);
-      Set<String> filePaths = manager.currentContextFilePaths[projPath];
+      Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
       expect(filePaths, hasLength(0));
       String filePath2 = posix.join(projPath, 'packages', 'file2.dart');
       provider.newFile(filePath2, 'contents');
@@ -124,7 +160,7 @@
 
       test('Add file', () {
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(0));
         String filePath = posix.join(projPath, 'foo.dart');
         provider.newFile(filePath, 'contents');
@@ -136,7 +172,7 @@
 
       test('Add file in subdirectory', () {
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(0));
         String filePath = posix.join(projPath, 'foo', 'bar.dart');
         provider.newFile(filePath, 'contents');
@@ -150,12 +186,26 @@
         String filePath = posix.join(projPath, 'foo.dart');
         provider.newFile(filePath, 'contents');
         manager.setRoots(<String>[projPath], <String>[]);
-        Set<String> filePaths = manager.currentContextFilePaths[projPath];
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
         expect(filePaths, hasLength(1));
         expect(filePaths, contains(filePath));
         provider.deleteFile(filePath);
         return pumpEventQueue().then((_) => expect(filePaths, hasLength(0)));
       });
+
+      test('Modify file', () {
+        String filePath = posix.join(projPath, 'foo.dart');
+        provider.newFile(filePath, 'contents');
+        manager.setRoots(<String>[projPath], <String>[]);
+        Map<String, int> filePaths = manager.currentContextFilePaths[projPath];
+        expect(filePaths, hasLength(1));
+        expect(filePaths, contains(filePath));
+        expect(filePaths[filePath], equals(manager.now));
+        manager.now++;
+        provider.modifyFile(filePath, 'new contents');
+        return pumpEventQueue().then((_) => expect(filePaths[filePath], equals(
+            manager.now)));
+      });
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/analysis_server/test/declarative_tests.dart b/pkg/analysis_server/test/declarative_tests.dart
deleted file mode 100644
index dadc680..0000000
--- a/pkg/analysis_server/test/declarative_tests.dart
+++ /dev/null
@@ -1,57 +0,0 @@
-library declarative_tests;
-
-import 'dart:mirrors';
-
-import 'package:unittest/unittest.dart' show group, test;
-
-/**
- * Use [runTest] annotation to indicate that method is a test method.
- * Alternatively method name can have the `test` prefix.
- */
-const runTest = const _RunTest();
-
-class _RunTest {
-  const _RunTest();
-}
-
-/**
- * Creates a new named group of tests with the name of the given [Type], then
- * adds new tests using [addTestMethods].
- */
-addTestSuite(Type type) {
-  group(type.toString(), () {
-    addTestMethods(type);
-  });
-}
-
-/**
- * Creates a new test case for the each static method with the name starting
- * with `test` or having the [runTest] annotation.
- */
-addTestMethods(Type type) {
-  var typeMirror = reflectClass(type);
-  typeMirror.staticMembers.forEach((methodSymbol, method) {
-    if (_isTestMethod(method)) {
-      var methodName = MirrorSystem.getName(methodSymbol);
-      test(methodName, () {
-        typeMirror.invoke(methodSymbol, []);
-      });
-    }
-  });
-}
-
-bool _isTestMethod(MethodMirror method) {
-  if (method.parameters.isNotEmpty) {
-    return false;
-  }
-  var methodSymbol = method.simpleName;
-  // name starts with "test"
-  var methodName = MirrorSystem.getName(methodSymbol);
-  if (methodName.startsWith('test')) {
-    return true;
-  }
-  // has @testMethod
-  return method.metadata.any((annotation) {
-    return identical(annotation.reflectee, runTest);
-  });
-}
diff --git a/pkg/analysis_server/test/domain_analysis_test.dart b/pkg/analysis_server/test/domain_analysis_test.dart
index 4e1fa97..caae294 100644
--- a/pkg/analysis_server/test/domain_analysis_test.dart
+++ b/pkg/analysis_server/test/domain_analysis_test.dart
@@ -8,59 +8,46 @@
 
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/constants.dart';
-import 'package:analysis_server/src/computers.dart';
 import 'package:analysis_server/src/domain_analysis.dart';
 import 'package:analysis_server/src/protocol.dart';
 import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/engine.dart';
 import 'package:unittest/unittest.dart';
 
 import 'mocks.dart';
+import 'analysis_abstract.dart';
+import 'reflective_tests.dart';
 
 
 main() {
   groupSep = ' | ';
 
+  runReflectiveTests(AnalysisDomainTest);
+
   MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
   AnalysisServer server;
   AnalysisDomainHandler handler;
-  MemoryResourceProvider resourceProvider = new MemoryResourceProvider();
 
   setUp(() {
     serverChannel = new MockServerChannel();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
   });
 
   group('notification.errors', testNotificationErrors);
-  group('notification.highlights', testNotificationHighlights);
-  group('notification.navigation', testNotificationNavigation);
   group('updateContent', testUpdateContent);
   group('setSubscriptions', test_setSubscriptions);
 
   group('AnalysisDomainHandler', () {
-    test('getFixes', () {
-      var request = new Request('0', METHOD_GET_FIXES);
-      request.setParameter(ERRORS, []);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
-    });
-
-    test('getMinorRefactorings', () {
-      var request = new Request('0', METHOD_GET_MINOR_REFACTORINGS);
-      request.setParameter(FILE, 'test.dart');
-      request.setParameter(OFFSET, 10);
-      request.setParameter(LENGTH, 20);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
-    });
-
     group('setAnalysisRoots', () {
       Request request;
 
       setUp(() {
-        request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+        request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
         request.setParameter(INCLUDED, []);
         request.setParameter(EXCLUDED, []);
       });
@@ -92,32 +79,72 @@
       });
     });
 
-    test('setPriorityFiles', () {
-      var request = new Request('0', METHOD_SET_PRIORITY_FILES);
-      request.setParameter(
-          FILES,
-          ['projectA/aa.dart', 'projectB/ba.dart']);
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
+    group('setPriorityFiles', () {
+      test('invalid', () {
+        var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
+        request.setParameter(FILES, ['/project/lib.dart']);
+        var response = handler.handleRequest(request);
+        expect(response, isResponseFailure('0'));
+      });
+
+      test('valid', () {
+        resourceProvider.newFolder('/p1');
+        resourceProvider.newFile('/p1/a.dart', 'library a;');
+        resourceProvider.newFolder('/p2');
+        resourceProvider.newFile('/p2/b.dart', 'library b;');
+        resourceProvider.newFile('/p2/c.dart', 'library c;');
+
+        var setRootsRequest = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
+        setRootsRequest.setParameter(INCLUDED, ['/p1', '/p2']);
+        setRootsRequest.setParameter(EXCLUDED, []);
+        var setRootsResponse = handler.handleRequest(setRootsRequest);
+        expect(setRootsResponse, isResponseSuccess('0'));
+
+        void setPriorityFiles(List<String> fileList) {
+          var request = new Request('0', ANALYSIS_SET_PRIORITY_FILES);
+          request.setParameter(FILES, fileList);
+          var response = handler.handleRequest(request);
+          expect(response, isResponseSuccess('0'));
+          // TODO(brianwilkerson) Enable the line below after getPriorityFiles
+          // has been implemented.
+          // expect(server.getPriorityFiles(), unorderedEquals(fileList));
+        }
+
+        setPriorityFiles(['/p1/a.dart', '/p2/b.dart']);
+        setPriorityFiles(['/p2/b.dart', '/p2/c.dart']);
+        setPriorityFiles([]);
+      });
     });
 
-    test('updateOptions', () {
-      var request = new Request('0', METHOD_UPDATE_OPTIONS);
-      request.setParameter(
-          OPTIONS,
-          {
-            'analyzeAngular' : true,
-            'enableDeferredLoading': true,
-            'enableEnums': false
-          });
-      var response = handler.handleRequest(request);
-      // TODO(scheglov) implement
-      expect(response, isNull);
+    group('updateOptions', () {
+      test('invalid', () {
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
+        request.setParameter(OPTIONS, {'not-an-option' : true});
+        var response = handler.handleRequest(request);
+        expect(response, isResponseFailure('0'));
+      });
+
+      test('valid', () {
+        AnalysisOptions options = server.contextDirectoryManager.defaultOptions;
+        bool analyzeAngular = !options.analyzeAngular;
+        bool enableDeferredLoading = options.enableDeferredLoading;
+        var request = new Request('0', ANALYSIS_UPDATE_OPTIONS);
+        request.setParameter(
+            OPTIONS,
+            {
+              'analyzeAngular' : analyzeAngular,
+              'enableDeferredLoading': enableDeferredLoading,
+              'enableEnums': false
+            });
+        var response = handler.handleRequest(request);
+        expect(response, isResponseSuccess('0'));
+        expect(options.analyzeAngular, equals(analyzeAngular));
+        expect(options.enableDeferredLoading, equals(enableDeferredLoading));
+      });
     });
 
     test('updateSdks', () {
-      var request = new Request('0', METHOD_UPDATE_SDKS);
+      var request = new Request('0', ANALYSIS_UPDATE_SDKS);
       request.setParameter(
           ADDED,
           ['/dart/sdk-1.3', '/dart/sdk-1.4']);
@@ -183,21 +210,23 @@
   AnalysisTestHelper() {
     serverChannel = new MockServerChannel();
     resourceProvider = new MemoryResourceProvider();
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
     handler = new AnalysisDomainHandler(server);
     // listen for notifications
     Stream<Notification> notificationStream = serverChannel.notificationController.stream;
     notificationStream.listen((Notification notification) {
-      if (notification.event == NOTIFICATION_ERRORS) {
+      if (notification.event == ANALYSIS_ERRORS) {
         String file = notification.getParameter(FILE);
         List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
         filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
       }
-      if (notification.event == NOTIFICATION_HIGHLIGHTS) {
+      if (notification.event == ANALYSIS_HIGHLIGHTS) {
         String file = notification.getParameter(FILE);
         filesHighlights[file] = notification.getParameter(REGIONS);
       }
-      if (notification.event == NOTIFICATION_NAVIGATION) {
+      if (notification.event == ANALYSIS_NAVIGATION) {
         String file = notification.getParameter(FILE);
         filesNavigation[file] = notification.getParameter(REGIONS);
       }
@@ -221,7 +250,7 @@
     }
     files.add(file);
     // set subscriptions
-    Request request = new Request('0', METHOD_SET_ANALYSIS_SUBSCRIPTIONS);
+    Request request = new Request('0', ANALYSIS_SET_SUBSCRIPTIONS);
     request.setParameter(SUBSCRIPTIONS, analysisSubscriptions);
     handleSuccessfulRequest(request);
   }
@@ -309,7 +338,7 @@
    */
   void createEmptyProject() {
     resourceProvider.newFolder('/project');
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, ['/project']);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
@@ -323,7 +352,7 @@
     this.testCode = _getCodeString(code);
     resourceProvider.newFolder('/project');
     resourceProvider.newFile(testFile, testCode);
-    Request request = new Request('0', METHOD_SET_ANALYSIS_ROOTS);
+    Request request = new Request('0', ANALYSIS_SET_ANALYSIS_ROOTS);
     request.setParameter(INCLUDED, ['/project']);
     request.setParameter(EXCLUDED, []);
     handleSuccessfulRequest(request);
@@ -349,6 +378,17 @@
     server.done();
   }
 
+  /**
+   * Send an `updateContent` request for [testFile].
+   */
+  void sendContentChange(Map contentChange) {
+    Request request = new Request('0', ANALYSIS_UPDATE_CONTENT);
+    request.setParameter('files', {
+      testFile: contentChange
+    });
+    handleSuccessfulRequest(request);
+  }
+
   static String _getCodeString(code) {
     if (code is List<String>) {
       code = code.join('\n');
@@ -394,1146 +434,6 @@
 }
 
 
-class NotificationHighlightHelper extends AnalysisTestHelper {
-  List<Map<String, Object>> regions;
-
-  Future prepareRegions(then()) {
-    addAnalysisSubscriptionHighlights(testFile);
-    return waitForOperationsFinished().then((_) {
-      regions = getTestHighlights();
-      then();
-    });
-  }
-
-  void assertHasRawRegion(HighlightType type, int offset, int length) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length
-          && region['type'] == type.name) {
-        return;
-      }
-    }
-    fail('Expected to find (offset=$offset; length=$length; type=$type) in\n'
-         '${regions.join('\n')}');
-  }
-
-  void assertNoRawRegion(HighlightType type, int offset, int length) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length
-          && region['type'] == type.name) {
-        fail('Not expected to find (offset=$offset; length=$length; type=$type) in\n'
-             '${regions.join('\n')}');
-      }
-    }
-  }
-
-  void assertHasRegion(HighlightType type, String search, [int length = -1]) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNot(-1));
-    length = findRegionLength(search, length);
-    assertHasRawRegion(type, offset, length);
-  }
-
-  void assertNoRegion(HighlightType type, String search, [int length = -1]) {
-    int offset = testCode.indexOf(search);
-    expect(offset, isNot(-1));
-    length = findRegionLength(search, length);
-    assertNoRawRegion(type, offset, length);
-  }
-
-  int findRegionLength(String search, int length) {
-    if (length == -1) {
-      length = 0;
-      while (length < search.length) {
-        int c = search.codeUnitAt(length);
-        if (length == 0 && c == '@'.codeUnitAt(0)) {
-          length++;
-          continue;
-        }
-        if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-              c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-              c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-          break;
-        }
-        length++;
-      }
-    }
-    return length;
-  }
-}
-
-
-testNotificationHighlights() {
-  Future testRegions(String code, then(NotificationHighlightHelper helper)) {
-    var helper = new NotificationHighlightHelper();
-    helper.createSingleFileProject(code);
-    return helper.prepareRegions(() {
-      then(helper);
-    });
-  }
-
-  group('ANNOTATION', () {
-    test('no arguments', () {
-      var code = '''
-const AAA = 42;
-@AAA main() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA');
-      });
-    });
-
-    test('has arguments', () {
-      var code = '''
-class AAA {
-  const AAA(a, b, c);
-}
-@AAA(1, 2, 3) main() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.ANNOTATION, '@AAA(', '@AAA('.length);
-        helper.assertHasRegion(HighlightType.ANNOTATION, ') main', ')'.length);
-      });
-    });
-  });
-
-  group('BUILT_IN', () {
-    test('abstract', () {
-      var code = '''
-abstract class A {};
-main() {
-  var abstract = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'abstract class');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'abstract = 42');
-      });
-    });
-
-    test('as', () {
-      var code = '''
-import 'dart:math' as math;
-main() {
-  p as int;
-  var as = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'as math');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'as int');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'as = 42');
-      });
-    });
-
-    test('deferred', () {
-      var code = '''
-import 'dart:math' deferred as math;
-main() {
-  var deferred = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'deferred as math');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'deferred = 42');
-      });
-    });
-
-    test('export', () {
-      var code = '''
-export "dart:math";
-main() {
-  var export = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'export "dart:');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'export = 42');
-      });
-    });
-
-    test('external', () {
-      var code = '''
-class A {
-  external A();
-  external aaa();
-}
-external main() {
-  var external = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external A()');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external aaa()');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'external main()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'external = 42');
-      });
-    });
-
-    test('factory', () {
-      var code = '''
-class A {
-  factory A() => null;
-}
-main() {
-  var factory = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'factory A()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'factory = 42');
-      });
-    });
-
-    test('get', () {
-      var code = '''
-get aaa => 1;
-class A {
-  get bbb => 2;
-}
-main() {
-  var get = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'get aaa =>');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'get bbb =>');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'get = 42');
-      });
-    });
-
-    test('hide', () {
-      var code = '''
-import 'foo.dart' hide Foo;
-main() {
-  var hide = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'hide Foo');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'hide = 42');
-      });
-    });
-
-    test('implements', () {
-      var code = '''
-class A {}
-class B implements A {}
-main() {
-  var implements = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'implements A {}');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'implements = 42');
-      });
-    });
-
-    test('import', () {
-      var code = '''
-import "foo.dart";
-main() {
-  var import = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'import "');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'import = 42');
-      });
-    });
-
-    test('library', () {
-      var code = '''
-library lib;
-main() {
-  var library = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'library lib;');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'library = 42');
-      });
-    });
-
-    test('native', () {
-      var code = '''
-class A native "A_native" {}
-class B {
-  bbb() native "bbb_native";
-}
-main() {
-  var native = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'native "A_');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'native "bbb_');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'native = 42');
-      });
-    });
-
-    test('on', () {
-      var code = '''
-main() {
-  try {
-  } on int catch (e) {
-  }
-  var on = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'on int');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'on = 42');
-      });
-    });
-
-    test('operator', () {
-      var code = '''
-class A {
-  operator +(x) => null;
-}
-main() {
-  var operator = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'operator +(');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'operator = 42');
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationHighlightHelper();
-      var code = '''
-part "my_part.dart";
-main() {
-  var part = 42;
-}''';
-      helper.createSingleFileProject(code);
-      helper.setFileContent('/project/bin/my_part.dart', 'part of lib;');
-      return helper.prepareRegions(() {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'part "my_');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 42');
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationHighlightHelper();
-      var code = '''
-part of lib;
-main() {
-  var part = 1;
-  var of = 2;
-}''';
-      helper.createSingleFileProject(code);
-      helper.setFileContent('/project/bin/lib.dart', '''
-library lib;
-part 'test.dart';
-''');
-      return helper.prepareRegions(() {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'part of', 'part of'.length);
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'part = 1');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'of = 2');
-      });
-    });
-
-    test('set', () {
-      var code = '''
-set aaa(x) {}
-class A
-  set bbb(x) {}
-}
-main() {
-  var set = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'set aaa(');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'set bbb(');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'set = 42');
-      });
-    });
-
-    test('show', () {
-      var code = '''
-import 'foo.dart' show Foo;
-main() {
-  var show = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'show Foo');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'show = 42');
-      });
-    });
-
-    test('static', () {
-      var code = '''
-class A {
-  static aaa;
-  static bbb() {}
-}
-main() {
-  var static = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'static aaa;');
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'static bbb()');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'static = 42');
-      });
-    });
-
-    test('typedef', () {
-      var code = '''
-typedef A();
-main() {
-  var typedef = 42;
-}''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.BUILT_IN, 'typedef A();');
-        helper.assertNoRegion(HighlightType.BUILT_IN, 'typedef = 42');
-      });
-    });
-  });
-
-  group('CLASS', () {
-    test('CLASS', () {
-      var code = '''
-class AAA {}
-AAA aaa;
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertHasRegion(HighlightType.CLASS, 'AAA {}');
-        helper.assertHasRegion(HighlightType.CLASS, 'AAA aaa');
-      });
-    });
-
-    test('not dynamic', () {
-      var code = '''
-dynamic f() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertNoRegion(HighlightType.CLASS, 'dynamic f()');
-      });
-    });
-
-    test('not void', () {
-      var code = '''
-void f() {}
-''';
-      return testRegions(code, (NotificationHighlightHelper helper) {
-        helper.assertNoRegion(HighlightType.CLASS, 'void f()');
-      });
-    });
-  });
-
-  test('CONSTRUCTOR', () {
-    var code = '''
-class AAA {
-  AAA() {}
-  AAA.name(p) {}
-}
-main() {
-  new AAA();
-  new AAA.name(42);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(p)');
-      helper.assertHasRegion(HighlightType.CONSTRUCTOR, 'name(42)');
-      helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA() {}');
-      helper.assertNoRegion(HighlightType.CONSTRUCTOR, 'AAA();');
-    });
-  });
-
-  test('DYNAMIC_TYPE', () {
-    var code = '''
-f() {}
-main(p) {
-  print(p);
-  var v1 = f();
-  int v2;
-  var v3 = v2;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'p)');
-      helper.assertHasRegion(HighlightType.DYNAMIC_TYPE, 'v1 =');
-      helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v2;');
-      helper.assertNoRegion(HighlightType.DYNAMIC_TYPE, 'v3 =');
-    });
-  });
-
-  test('FIELD', () {
-    var code = '''
-class A {
-  int aaa = 1;
-  int bbb = 2;
-  A([this.bbb = 3]);
-}
-main(A a) {
-  a.aaa = 4;
-  a.bbb = 5;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FIELD, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 3');
-      helper.assertHasRegion(HighlightType.FIELD, 'aaa = 4');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 5');
-    });
-  });
-
-  test('FIELD_STATIC', () {
-    var code = '''
-class A {
-  static aaa = 1;
-  static get bbb => null;
-  static set ccc(x) {}
-}
-main() {
-  A.aaa = 2;
-  A.bbb;
-  A.ccc = 3;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 2');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'bbb;');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'ccc = 3');
-    });
-  });
-
-  test('FUNCTION', () {
-    var code = '''
-fff(p) {}
-main() {
-  fff(42);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FUNCTION_DECLARATION, 'fff(p) {}');
-      helper.assertHasRegion(HighlightType.FUNCTION, 'fff(42)');
-    });
-  });
-
-  test('FUNCTION_TYPE_ALIAS', () {
-    var code = '''
-typedef FFF(p);
-main(FFF fff) {
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF(p)');
-      helper.assertHasRegion(HighlightType.FUNCTION_TYPE_ALIAS, 'FFF fff)');
-    });
-  });
-
-  test('GETTER_DECLARATION', () {
-    var code = '''
-get aaa => null;
-class A {
-  get bbb => null;
-}
-main(A a) {
-  aaa;
-  a.bbb;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'aaa => null');
-      helper.assertHasRegion(HighlightType.GETTER_DECLARATION, 'bbb => null');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa;');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb;');
-    });
-  });
-
-  test('IDENTIFIER_DEFAULT', () {
-    var code = '''
-main() {
-  aaa = 42;
-  bbb(84);
-  CCC ccc;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'aaa = 42');
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'bbb(84)');
-      helper.assertHasRegion(HighlightType.IDENTIFIER_DEFAULT, 'CCC ccc');
-    });
-  });
-
-  test('IMPORT_PREFIX', () {
-    var code = '''
-import 'dart:math' as ma;
-main() {
-  ma.max(1, 2);
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma;');
-      helper.assertHasRegion(HighlightType.IMPORT_PREFIX, 'ma.max');
-    });
-  });
-
-  test('KEYWORD void', () {
-    var code = '''
-void main() {
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.KEYWORD, 'void main()');
-    });
-  });
-
-  test('LITERAL_BOOLEAN', () {
-    var code = 'var V = true;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_BOOLEAN, 'true;');
-    });
-  });
-
-  test('LITERAL_DOUBLE', () {
-    var code = 'var V = 4.2;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_DOUBLE, '4.2;', '4.2'.length);
-    });
-  });
-
-  test('LITERAL_INTEGER', () {
-    var code = 'var V = 42;';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_INTEGER, '42;');
-    });
-  });
-
-  test('LITERAL_STRING', () {
-    var code = 'var V = "abc";';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LITERAL_STRING, '"abc";', '"abc"'.length);
-    });
-  });
-
-  test('LOCAL_VARIABLE', () {
-    var code = '''
-main() {
-  int vvv = 0;
-  vvv;
-  vvv = 1;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE_DECLARATION, 'vvv = 0');
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv;');
-      helper.assertHasRegion(HighlightType.LOCAL_VARIABLE, 'vvv = 1;');
-    });
-  });
-
-  test('METHOD', () {
-    var code = '''
-class A {
-  aaa() {}
-  static bbb() {}
-}
-main(A a) {
-  a.aaa();
-  a.aaa;
-  A.bbb();
-  A.bbb;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.METHOD_DECLARATION, 'aaa() {}');
-      helper.assertHasRegion(HighlightType.METHOD_DECLARATION_STATIC, 'bbb() {}');
-      helper.assertHasRegion(HighlightType.METHOD, 'aaa();');
-      helper.assertHasRegion(HighlightType.METHOD, 'aaa;');
-      helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb();');
-      helper.assertHasRegion(HighlightType.METHOD_STATIC, 'bbb;');
-    });
-  });
-
-  test('METHOD best type', () {
-    var code = '''
-main(p) {
-  if (p is List) {
-    p.add(null);
-  }
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.METHOD, 'add(null)');
-    });
-  });
-
-  test('PARAMETER', () {
-    var code = '''
-main(int p) {
-  p;
-  p = 42;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p) {');
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p;');
-      helper.assertHasRegion(HighlightType.PARAMETER, 'p = 42');
-    });
-  });
-
-  test('SETTER_DECLARATION', () {
-    var code = '''
-set aaa(x) {}
-class A {
-  set bbb(x) {}
-}
-main(A a) {
-  aaa = 1;
-  a.bbb = 2;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'aaa(x)');
-      helper.assertHasRegion(HighlightType.SETTER_DECLARATION, 'bbb(x)');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'aaa = 1');
-      helper.assertHasRegion(HighlightType.FIELD, 'bbb = 2');
-    });
-  });
-
-  test('TOP_LEVEL_VARIABLE', () {
-    var code = '''
-var VVV = 0;
-main() {
-  print(VVV);
-  VVV = 1;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TOP_LEVEL_VARIABLE, 'VVV = 0');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV);');
-      helper.assertHasRegion(HighlightType.FIELD_STATIC, 'VVV = 1');
-    });
-  });
-
-  test('TYPE_NAME_DYNAMIC', () {
-    var code = '''
-dynamic main() {
-  dynamic = 42;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic main()');
-      helper.assertNoRegion(HighlightType.IDENTIFIER_DEFAULT, 'dynamic main()');
-      helper.assertNoRegion(HighlightType.TYPE_NAME_DYNAMIC, 'dynamic = 42');
-    });
-  });
-
-  test('TYPE_PARAMETER', () {
-    var code = '''
-class A<T> {
-  T fff;
-  T mmm(T p) => null;
-}
-''';
-    return testRegions(code, (NotificationHighlightHelper helper) {
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T> {');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T fff;');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T mmm(');
-      helper.assertHasRegion(HighlightType.TYPE_PARAMETER, 'T p)');
-    });
-  });
-}
-
-
-
-
-class NotificationNavigationHelper extends AnalysisTestHelper {
-  List<Map<String, Object>> regions;
-
-  Future prepareRegions(then()) {
-    addAnalysisSubscriptionNavigation(testFile);
-    return waitForOperationsFinished().then((_) {
-      regions = getTestNavigation();
-      then();
-    });
-  }
-
-  void assertHasRegion(String regionSearch, String targetSearch) {
-    var regionOffset = findOffset(regionSearch);
-    int regionLength = findIdentifierLength(regionSearch);
-    var targetOffset = findOffset(targetSearch);
-    var targetLength = findIdentifierLength(targetSearch);
-    asserHasRegionInts(regionOffset, regionLength, targetOffset, targetLength);
-  }
-
-  void asserHasOperatorRegion(String search, int regionLength, int targetLength) {
-    var regionOffset = findOffset(search);
-    var region = asserHasRegionInts(regionOffset, regionLength, -1, 0);
-    if (targetLength != -1) {
-      expect(region['targets'][0]['length'], targetLength);
-    }
-  }
-
-  asserHasRegionInts(int regionOffset, int regionLength,
-                          int targetOffset, int targetLength) {
-    Map<String, Object> region = findRegion(regionOffset, regionLength);
-    if (region != null) {
-      List<Map<String, Object>> targets = region['targets'];
-      if (targetOffset == -1) {
-        return region;
-      }
-      var target = findTarget(targets, testFile, targetOffset, targetLength);
-      if (target != null) {
-        return target;
-      }
-    }
-    fail('Expected to find (offset=$regionOffset; length=$regionLength) => '
-         '(offset=$targetOffset; length=$targetLength) in\n'
-         '${regions.join('\n')}');
-  }
-
-  Map<String, Object> findRegionString(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    int length = search.length;
-    return findRegion(offset, length, notNull);
-  }
-
-  Map<String, Object> findRegionAt(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset) {
-        if (notNull == false) {
-          fail('Not expected to find at offset=$offset in\n'
-               '${regions.join('\n')}');
-        }
-        return region;
-      }
-    }
-    if (notNull == true) {
-      fail('Expected to find at offset=$offset in\n'
-           '${regions.join('\n')}');
-    }
-    return null;
-  }
-
-  Map<String, Object> findRegionIdentifier(String search, [bool notNull]) {
-    int offset = findOffset(search);
-    int length = findIdentifierLength(search);
-    return findRegion(offset, length, notNull);
-  }
-
-  Map<String, Object> findRegion(int offset, int length, [bool notNull]) {
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == offset && region['length'] == length) {
-        if (notNull == false) {
-          fail('Not expected to find (offset=$offset; length=$length) in\n'
-               '${regions.join('\n')}');
-        }
-        return region;
-      }
-    }
-    if (notNull == true) {
-      fail('Expected to find (offset=$offset; length=$length) in\n'
-           '${regions.join('\n')}');
-    }
-    return null;
-  }
-
-  Map<String, Object> findTarget(List<Map<String, Object>> targets,
-                                 String file, int offset, int length) {
-    for (Map<String, Object> target in targets) {
-      if (target['file'] == file &&
-          target['offset'] == offset &&
-          target['length'] == length) {
-        return target;
-      }
-    }
-    return null;
-  }
-
-  void assertNoRegion(String regionSearch) {
-    var regionOffset = findOffset(regionSearch);
-    var regionLength = findIdentifierLength(regionSearch);
-    for (Map<String, Object> region in regions) {
-      if (region['offset'] == regionOffset && region['length'] == regionLength) {
-        fail('Unexpected (offset=$regionOffset; length=$regionLength) in\n'
-             '${regions.join('\n')}');
-      }
-    }
-  }
-}
-
-
-int findIdentifierLength(String search) {
-  int length = 0;
-  while (length < search.length) {
-    int c = search.codeUnitAt(length);
-    if (!(c >= 'a'.codeUnitAt(0) && c <= 'z'.codeUnitAt(0) ||
-          c >= 'A'.codeUnitAt(0) && c <= 'Z'.codeUnitAt(0) ||
-          c >= '0'.codeUnitAt(0) && c <= '9'.codeUnitAt(0))) {
-      break;
-    }
-    length++;
-  }
-  return length;
-}
-
-
-testNotificationNavigation() {
-  Future testNavigation(String code, then(NotificationNavigationHelper helper)) {
-    var helper = new NotificationNavigationHelper();
-    helper.createSingleFileProject(code);
-    return helper.prepareRegions(() {
-      then(helper);
-    });
-  }
-
-  group('constructor', () {
-    test('named', () {
-      var code = '''
-class A {
-  A.named(int p) {}
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        // has region for complete "A.named"
-        helper.asserHasRegionInts(
-            helper.findOffset('A.named'), 'A.named'.length,
-            helper.findOffset('named(int'), 'named'.length);
-        // no separate regions for "A" and "named"
-        helper.assertNoRegion('A.named(');
-        helper.assertNoRegion('named(');
-        // validate that we don't forget to resolve parameters
-        helper.asserHasRegionInts(
-            helper.findOffset('int p'), 'int'.length,
-            -1, 0);
-      });
-    });
-
-    test('unnamed', () {
-      var code = '''
-class A {
-  A(int p) {}
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        // has constructor region for "A()"
-        helper.asserHasRegionInts(
-            helper.findOffset('A(int p)'), 'A'.length,
-            helper.findOffset('A(int p)'), 0);
-        // validate that we don't forget to resolve parameters
-        helper.asserHasRegionInts(
-            helper.findOffset('int p'), 'int'.length,
-            -1, 0);
-      });
-    });
-  });
-
-  group('identifier', () {
-    test('resolved', () {
-      var code = '''
-class AAA {}
-main() {
-  AAA aaa = null;
-  print(aaa);
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.assertHasRegion('AAA aaa', 'AAA {}');
-        helper.assertHasRegion('aaa);', 'aaa = null');
-        helper.assertHasRegion('main() {', 'main() {');
-      });
-    });
-
-    test('unresolved', () {
-      var code = '''
-main() {
-  print(noo);
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.assertNoRegion('noo);');
-      });
-    });
-  });
-
-  test('fieldFormalParameter', () {
-    var code = '''
-class A {
-  int fff = 123;
-  A(this.fff);
-}
-''';
-    return testNavigation(code, (NotificationNavigationHelper helper) {
-      helper.assertHasRegion('fff);', 'fff = 123');
-    });
-  });
-
-  group('instanceCreation', () {
-    test('named', () {
-      var code = '''
-class A {
-  A.named() {}
-}
-main() {
-  new A.named();
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasRegionInts(
-            helper.findOffset('new A.named'), 'new A.named'.length,
-            helper.findOffset('named()'), 'named'.length);
-      });
-    });
-
-    test('unnamed', () {
-      var code = '''
-class A {
-  A() {}
-}
-main() {
-  new A();
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasRegionInts(
-            helper.findOffset('new A'), 'new A'.length,
-            helper.findOffset('A()'), ''.length);
-      });
-    });
-  });
-
-  group('operator', () {
-    test('int', () {
-      var code = '''
-main() {
-  var v = 0;
-  v - 1;
-  v + 2;
-  -v; // unary
-  --v;
-  ++v;
-  v--; // mm
-  v++; // pp
-  v -= 3;
-  v += 4;
-  v *= 5;
-  v /= 6;
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasOperatorRegion('- 1;', 1, 1);
-        helper.asserHasOperatorRegion('+ 2;', 1, 1);
-        helper.asserHasOperatorRegion('-v; // unary', 1, -1);
-        helper.asserHasOperatorRegion('--v;', 2, 1);
-        helper.asserHasOperatorRegion('++v;', 2, 1);
-        helper.asserHasOperatorRegion('--; // mm', 2, 1);
-        helper.asserHasOperatorRegion('++; // pp', 2, 1);
-        helper.asserHasOperatorRegion('-= 3;', 2, 1);
-        helper.asserHasOperatorRegion('+= 4;', 2, 1);
-        helper.asserHasOperatorRegion('*= 5;', 2, 1);
-        helper.asserHasOperatorRegion('/= 6;', 2, 1);
-      });
-    });
-
-    test('list', () {
-      var code = '''
-main() {
-  List<int> v = [1, 2, 3];
-  v[0]; // []
-  v[1] = 1; // []=
-  v[2] += 2;
-}
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.asserHasOperatorRegion(']; // []', 1, 2);
-        helper.asserHasOperatorRegion('] = 1', 1, 3);
-        helper.asserHasOperatorRegion('] += 2', 1, 3);
-        helper.asserHasOperatorRegion('+= 2', 2, 1);
-      });
-    });
-  });
-
-  test('partOf', () {
-    var helper = new NotificationNavigationHelper();
-    var code = '''
-part of lib;
-''';
-    helper.createSingleFileProject(code);
-    var libPath = helper.setFileContent('/project/bin/lib.dart', '''
-library lib;
-part 'test.dart';
-''');
-    return helper.prepareRegions(() {
-      var region = helper.findRegionString('part of lib', true);
-      var target = region['targets'][0];
-      expect(target['file'], libPath);
-    });
-  });
-
-  group('string', () {
-    test('export', () {
-      var code = '''
-export "dart:math";
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionString('export "dart:math"', true);
-      });
-    });
-
-    test('export unresolved URI', () {
-      var code = '''
-export 'no.dart';
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('export ', false);
-      });
-    });
-
-    test('import', () {
-      var code = '''
-import "dart:math" as m;
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionString('import "dart:math"', true);
-      });
-    });
-
-    test('import no URI', () {
-      var code = '''
-import ;
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('import ', false);
-      });
-    });
-
-    test('import unresolved URI', () {
-      var code = '''
-import 'no.dart';
-''';
-      return testNavigation(code, (NotificationNavigationHelper helper) {
-        helper.findRegionAt('import ', false);
-      });
-    });
-
-    test('part', () {
-      var helper = new NotificationNavigationHelper();
-      var code = '''
-library lib;
-part "my_part.dart";
-''';
-      helper.createSingleFileProject(code);
-      var unitPath = helper.setFileContent('/project/bin/my_part.dart', '''
-part of lib;
-''');
-      return helper.prepareRegions(() {
-        var region = helper.findRegionString('part "my_part.dart"', true);
-        var target = region['targets'][0];
-        expect(target['file'], unitPath);
-      });
-    });
-
-    test('part unresolved URI', () {
-      // TODO(scheglov) why do we throw MemoryResourceException here?
-      // This Source/File does not exist.
-//      var helper = new NotificationNavigationHelper();
-//      var code = '''
-//library lib;
-//part "my_part.dart";
-//''';
-//      helper.createSingleFileProject(code);
-//      return helper.prepareRegions(() {
-//        helper.findRegionAt('part ', false);
-//      });
-    });
-  });
-}
-
-
 testUpdateContent() {
   test('full content', () {
     AnalysisTestHelper helper = new AnalysisTestHelper();
@@ -1543,16 +443,9 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
-      {
-        Request request = new Request('0', METHOD_UPDATE_CONTENT);
-        request.setParameter('files',
-            {
-              helper.testFile : {
-                CONTENT : 'library lib'
-              }
-            });
-        helper.handleSuccessfulRequest(request);
-      }
+      helper.sendContentChange({
+        CONTENT: 'library lib'
+      });
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -1569,19 +462,12 @@
       List<AnalysisError> errors = helper.getTestErrors();
       expect(errors, isEmpty);
       // update code
-      {
-        Request request = new Request('0', METHOD_UPDATE_CONTENT);
-        request.setParameter('files',
-            {
-              helper.testFile : {
-                CONTENT : 'library lib',
-                OFFSET : 'library '.length,
-                OLD_LENGTH : 'A;'.length,
-                NEW_LENGTH : 'lib'.length,
-              }
-            });
-        helper.handleSuccessfulRequest(request);
-      }
+      helper.sendContentChange({
+        CONTENT: 'library lib',
+        OFFSET: 'library '.length,
+        OLD_LENGTH: 'A;'.length,
+        NEW_LENGTH: 'lib'.length,
+      });
       // wait, there is an error
       return helper.waitForOperationsFinished().then((_) {
         List<AnalysisError> errors = helper.getTestErrors();
@@ -1589,8 +475,54 @@
       });
     });
   });
-}
 
+  test('change on disk, normal', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    return helper.waitForOperationsFinished().then((_) {
+      // There should be no errors
+      expect(helper.getTestErrors(), hasLength(0));
+      // Change file on disk, adding a syntax error.
+      helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+      // There should be errors now.
+      return pumpEventQueue().then((_) {
+        return helper.waitForOperationsFinished().then((_) {
+          expect(helper.getTestErrors(), hasLength(1));
+        });
+      });
+    });
+  });
+
+  test('change on disk, during override', () {
+    AnalysisTestHelper helper = new AnalysisTestHelper();
+    helper.createSingleFileProject('library A;');
+    return helper.waitForOperationsFinished().then((_) {
+      // update code
+      helper.sendContentChange({
+        CONTENT: 'library B;'
+      });
+      // There should be no errors
+      return helper.waitForOperationsFinished().then((_) {
+        expect(helper.getTestErrors(), hasLength(0));
+        // Change file on disk, adding a syntax error.
+        helper.resourceProvider.modifyFile(helper.testFile, 'library lib');
+        // There should still be no errors (file should not have been reread).
+        return helper.waitForOperationsFinished().then((_) {
+          expect(helper.getTestErrors(), hasLength(0));
+          // Send a content change with a null content param--file should be
+          // reread from disk.
+          helper.sendContentChange({
+            CONTENT: null
+          });
+          // There should be errors now.
+          return helper.waitForOperationsFinished().then((_) {
+            expect(helper.getTestErrors(), hasLength(1));
+          });
+        });
+      });
+    });
+  });
+}
 
 void test_setSubscriptions() {
   test('before analysis', () {
@@ -1624,3 +556,41 @@
     });
   });
 }
+
+
+@ReflectiveTestCase()
+class AnalysisDomainTest extends AbstractAnalysisTest {
+  Map<String, List<AnalysisError>> filesErrors = {};
+
+  void processNotification(Notification notification) {
+    if (notification.event == ANALYSIS_ERRORS) {
+      String file = notification.getParameter(FILE);
+      List<Map<String, Object>> errorMaps = notification.getParameter(ERRORS);
+      filesErrors[file] = errorMaps.map(jsonToAnalysisError).toList();
+    }
+  }
+
+  test_setRoots_packages() {
+    // prepare package
+    String pkgFile = '/packages/pkgA/libA.dart';
+    resourceProvider.newFile(pkgFile, '''
+library lib_a;
+class A {}
+''');
+    packageMapProvider.packageMap['pkgA'] =
+        [resourceProvider.getResource('/packages/pkgA')];
+    addTestFile('''
+import 'package:pkgA/libA.dart';
+main(A a) {
+}
+''');
+    // create project and wait for analysis
+    createProject();
+    return waitForTasksFinished().then((_) {
+      // if 'package:pkgA/libA.dart' was resolved, then there are no errors
+      expect(filesErrors[testFile], isEmpty);
+      // packages file also was resolved
+      expect(filesErrors[pkgFile], isEmpty);
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/domain_completion_test.dart b/pkg/analysis_server/test/domain_completion_test.dart
new file mode 100644
index 0000000..cfe203b
--- /dev/null
+++ b/pkg/analysis_server/test/domain_completion_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.completion;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_completion.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main() {
+  groupSep = ' | ';
+
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  CompletionDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new CompletionDomainHandler(server);
+  });
+
+  group('CompletionDomainHandler', () {
+    test('getSuggestions', () {
+      var request = new Request('0', COMPLETION_GET_SUGGESTIONS);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/domain_edit_test.dart b/pkg/analysis_server/test/domain_edit_test.dart
new file mode 100644
index 0000000..14f838b
--- /dev/null
+++ b/pkg/analysis_server/test/domain_edit_test.dart
@@ -0,0 +1,97 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.domain.edit;
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_edit.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:unittest/unittest.dart';
+
+import 'mocks.dart';
+
+main() {
+  groupSep = ' | ';
+
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  EditDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new EditDomainHandler(server);
+  });
+
+  group('EditDomainHandler', () {
+    test('applyRefactoring', () {
+      var request = new Request('0', EDIT_APPLY_REFACTORING);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('createRefactoring', () {
+      var request = new Request('0', EDIT_CREATE_REFACTORING);
+      request.setParameter(KIND, null);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      request.setParameter(LENGTH, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('deleteRefactoring', () {
+      var request = new Request('0', EDIT_DELETE_REFACTORING);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getAssists', () {
+      var request = new Request('0', EDIT_GET_ASSISTS);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      request.setParameter(LENGTH, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getFixes', () {
+      var request = new Request('0', EDIT_GET_FIXES);
+      request.setParameter(ERRORS, []);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('getRefactorings', () {
+      var request = new Request('0', EDIT_GET_REFACTORINGS);
+      request.setParameter(FILE, 'test.dart');
+      request.setParameter(OFFSET, 10);
+      request.setParameter(LENGTH, 20);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('setRefactoringOptions', () {
+      var request = new Request('0', EDIT_SET_REFACTORING_OPTIONS);
+      request.setParameter(ID, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/domain_search_test.dart b/pkg/analysis_server/test/domain_search_test.dart
new file mode 100644
index 0000000..46b8cfa
--- /dev/null
+++ b/pkg/analysis_server/test/domain_search_test.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 test.domain.search;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/analysis_server.dart';
+import 'package:analysis_server/src/constants.dart';
+import 'package:analysis_server/src/domain_search.dart';
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:unittest/unittest.dart';
+
+import 'analysis_abstract.dart';
+import 'index/store/memory_node_manager.dart';
+import 'mocks.dart';
+import 'reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+  group('SearchDomainHandler', () {
+    runReflectiveTests(SearchDomainTest);
+  });
+
+  MockServerChannel serverChannel;
+  MemoryResourceProvider resourceProvider;
+  AnalysisServer server;
+  SearchDomainHandler handler;
+
+  setUp(() {
+    serverChannel = new MockServerChannel();
+    resourceProvider = new MemoryResourceProvider();
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
+    server.defaultSdk = new MockSdk();
+    handler = new SearchDomainHandler(server);
+  });
+
+  group('SearchDomainHandler', () {
+    test('findElementReferences', () {
+      var request = new Request('0', SEARCH_FIND_ELEMENT_REFERENCES);
+      request.setParameter(FILE, null);
+      request.setParameter(OFFSET, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findMemberDeclarations', () {
+      var request = new Request('0', SEARCH_FIND_MEMBER_DECLARATIONS);
+      request.setParameter(NAME, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findMemberReferences', () {
+      var request = new Request('0', SEARCH_FIND_MEMBER_REFERENCES);
+      request.setParameter(NAME, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+
+    test('findTopLevelDeclarations', () {
+      var request = new Request('0', SEARCH_FIND_TOP_LEVEL_DECLARATIONS);
+      request.setParameter(PATTERN, null);
+      var response = handler.handleRequest(request);
+      // TODO(brianwilkerson) implement
+      //expect(response, isNull);
+    });
+  });
+}
+
+@ReflectiveTestCase()
+class SearchDomainTest extends AbstractAnalysisTest {
+  LocalIndex index;
+
+  @override
+  Index createIndex() {
+    return new LocalIndex(new MemoryNodeManager());
+  }
+
+  @override
+  void setUp() {
+    super.setUp();
+    index = server.index;
+    createProject();
+  }
+
+  Future test_findTopLevelDeclarations() {
+    // TODO(scheglov) replace this temporary Index test with an actual
+    // SearchEngine and SearchDomainHandler test.
+    addTestFile('''
+class AAA {
+  AAA() {}
+}
+''');
+    return waitForTasksFinished().then((_) {
+      return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+          IndexConstants.DEFINES_CLASS).then((List<Location> locations) {
+        bool hasClassFunction = false;
+        bool hasClassAAA = false;
+        for (var location in locations) {
+          if (location.element.name == 'Function') {
+            hasClassFunction = true;
+          }
+          if (location.element.name == 'AAA') {
+            hasClassAAA = true;
+          }
+        }
+        expect(hasClassFunction, isTrue, reason: locations.toString());
+        expect(hasClassAAA, isTrue, reason: locations.toString());
+      });
+    });
+  }
+}
diff --git a/pkg/analysis_server/test/domain_server_test.dart b/pkg/analysis_server/test/domain_server_test.dart
index cb726d4..a4a1012 100644
--- a/pkg/analysis_server/test/domain_server_test.dart
+++ b/pkg/analysis_server/test/domain_server_test.dart
@@ -20,13 +20,14 @@
   setUp(() {
     var serverChannel = new MockServerChannel();
     var resourceProvider = PhysicalResourceProvider.INSTANCE;
-    server = new AnalysisServer(serverChannel, resourceProvider);
+    server = new AnalysisServer(
+        serverChannel, resourceProvider, new MockPackageMapProvider(), null);
     handler = new ServerDomainHandler(server);
   });
 
   group('ServerDomainHandler', () {
     test('getVersion', () {
-      var request = new Request('0', METHOD_GET_VERSION);
+      var request = new Request('0', SERVER_GET_VERSION);
       var response = handler.handleRequest(request);
       expect(response.toJson(), equals({
         Response.ID: '0',
@@ -39,7 +40,7 @@
     group('setSubscriptions', () {
       Request request;
       setUp(() {
-        request = new Request('0', METHOD_SET_SERVER_SUBSCRIPTIONS);
+        request = new Request('0', SERVER_SET_SUBSCRIPTIONS);
       });
 
       test('invalid service name', () {
@@ -66,7 +67,7 @@
     test('shutdown', () {
       expect(server.running, isTrue);
       // send request
-      var request = new Request('0', METHOD_SHUTDOWN);
+      var request = new Request('0', SERVER_SHUTDOWN);
       var response = handler.handleRequest(request);
       expect(response, isResponseSuccess('0'));
       // server is down
diff --git a/pkg/analysis_server/test/index/b_plus_tree_test.dart b/pkg/analysis_server/test/index/b_plus_tree_test.dart
new file mode 100644
index 0000000..a3abcce
--- /dev/null
+++ b/pkg/analysis_server/test/index/b_plus_tree_test.dart
@@ -0,0 +1,686 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.b_plus_tree;
+
+import 'dart:math';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('BTree', () {
+    runReflectiveTests(BPlusTreeTest);
+  });
+}
+
+
+void _assertDebugString(BPlusTree tree, String expected) {
+  String dump = _getDebugString(tree);
+  expect(dump, expected);
+}
+
+
+_TestBTree<int, String> _createTree(int maxIndexKeys, int maxLeafKeys) {
+  return new _TestBTree<int, String>(maxIndexKeys, maxLeafKeys, _intComparator);
+}
+
+
+String _getDebugString(BPlusTree tree) {
+  StringBuffer buffer = new StringBuffer();
+  tree.writeOn(buffer);
+  return buffer.toString();
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+@ReflectiveTestCase()
+class BPlusTreeTest {
+  BPlusTree<int, String, dynamic> tree = _createTree(4, 4);
+
+  test_NoSuchMethodError() {
+    expect(() {
+      (tree as dynamic).thereIsNoSuchMethod();
+    }, throwsA(new isInstanceOf<NoSuchMethodError>()));
+  }
+
+  void test_find() {
+    _insertValues(12);
+    expect(tree.find(-1), isNull);
+    expect(tree.find(1000), isNull);
+    for (int key = 0; key < 12; key++) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void test_insert_01() {
+    _insert(0, 'A');
+    _assertDebugString(tree, 'LNode {0: A}\n');
+  }
+
+  void test_insert_02() {
+    _insert(1, 'B');
+    _insert(0, 'A');
+    _assertDebugString(tree, 'LNode {0: A, 1: B}\n');
+  }
+
+  void test_insert_03() {
+    _insert(2, 'C');
+    _insert(0, 'A');
+    _insert(1, 'B');
+    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
+  }
+
+  void test_insert_05() {
+    _insertValues(5);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3, 4: V4}
+}
+''');
+  }
+
+  void test_insert_09() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_insert_innerSplitLeft() {
+    // Prepare a tree with '0' key missing.
+    for (int i = 1; i < 12; i++) {
+      _insert(i, "V$i");
+    }
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2}
+  3
+    LNode {3: V3, 4: V4}
+  5
+    LNode {5: V5, 6: V6}
+  7
+    LNode {7: V7, 8: V8}
+  9
+    LNode {9: V9, 10: V10, 11: V11}
+}
+''');
+    // Split and insert into the 'left' child.
+    _insert(0, 'V0');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1, 2: V2}
+      3
+        LNode {3: V3, 4: V4}
+      5
+        LNode {5: V5, 6: V6}
+    }
+  7
+    INode {
+        LNode {7: V7, 8: V8}
+      9
+        LNode {9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+  }
+
+  void test_insert_innerSplitRight() {
+    _insertValues(12);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+  }
+
+  void test_insert_replace() {
+    _insert(0, 'A');
+    _insert(1, 'B');
+    _insert(2, 'C');
+    _assertDebugString(tree, 'LNode {0: A, 1: B, 2: C}\n');
+    _insert(2, 'C2');
+    _insert(1, 'B2');
+    _insert(0, 'A2');
+    _assertDebugString(tree, 'LNode {0: A2, 1: B2, 2: C2}\n');
+  }
+
+  void test_remove_inner_borrowLeft() {
+    tree = _createTree(10, 4);
+    for (int i = 100; i < 125; i++) {
+      _insert(i, 'V$i');
+    }
+    for (int i = 0; i < 10; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+      6
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+    }
+  112
+    INode {
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123, 124: V124}
+    }
+}
+''');
+    expect(tree.remove(112), 'V112');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+      6
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+    }
+  106
+    INode {
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+      112
+        LNode {113: V113, 114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123, 124: V124}
+    }
+}
+''');
+  }
+
+  void test_remove_inner_borrowRight() {
+    tree = _createTree(10, 4);
+    for (int i = 100; i < 135; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {100: V100, 101: V101}
+      102
+        LNode {102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+    }
+  112
+    INode {
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+      118
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123}
+      124
+        LNode {124: V124, 125: V125}
+      126
+        LNode {126: V126, 127: V127}
+      128
+        LNode {128: V128, 129: V129}
+      130
+        LNode {130: V130, 131: V131}
+      132
+        LNode {132: V132, 133: V133, 134: V134}
+    }
+}
+''');
+    expect(tree.remove(100), 'V100');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {101: V101, 102: V102, 103: V103}
+      104
+        LNode {104: V104, 105: V105}
+      106
+        LNode {106: V106, 107: V107}
+      108
+        LNode {108: V108, 109: V109}
+      110
+        LNode {110: V110, 111: V111}
+      112
+        LNode {112: V112, 113: V113}
+      114
+        LNode {114: V114, 115: V115}
+      116
+        LNode {116: V116, 117: V117}
+    }
+  118
+    INode {
+        LNode {118: V118, 119: V119}
+      120
+        LNode {120: V120, 121: V121}
+      122
+        LNode {122: V122, 123: V123}
+      124
+        LNode {124: V124, 125: V125}
+      126
+        LNode {126: V126, 127: V127}
+      128
+        LNode {128: V128, 129: V129}
+      130
+        LNode {130: V130, 131: V131}
+      132
+        LNode {132: V132, 133: V133, 134: V134}
+    }
+}
+''');
+  }
+
+  void test_remove_inner_mergeLeft() {
+    _insertValues(15);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9}
+      10
+        LNode {10: V10, 11: V11}
+      12
+        LNode {12: V12, 13: V13, 14: V14}
+    }
+}
+''');
+    expect(tree.remove(12), 'V12');
+    expect(tree.remove(13), 'V13');
+    expect(tree.remove(14), 'V14');
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9}
+      10
+        LNode {10: V10, 11: V11}
+    }
+}
+''');
+    expect(tree.remove(8), 'V8');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 9: V9}
+  10
+    LNode {10: V10, 11: V11}
+}
+''');
+  }
+
+  void test_remove_inner_mergeRight() {
+    _insertValues(12);
+    _assertDebugString(tree, '''
+INode {
+    INode {
+        LNode {0: V0, 1: V1}
+      2
+        LNode {2: V2, 3: V3}
+      4
+        LNode {4: V4, 5: V5}
+    }
+  6
+    INode {
+        LNode {6: V6, 7: V7}
+      8
+        LNode {8: V8, 9: V9, 10: V10, 11: V11}
+    }
+}
+''');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7}
+  8
+    LNode {8: V8, 9: V9, 10: V10, 11: V11}
+}
+''');
+  }
+
+  void test_remove_inner_notFound() {
+    _insertValues(20);
+    expect(tree.remove(100), isNull);
+  }
+
+  void test_remove_leafRoot_becomesEmpty() {
+    _insertValues(1);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, 'LNode {}\n');
+  }
+
+  void test_remove_leafRoot_first() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, 'LNode {1: V1, 2: V2}\n');
+  }
+
+  void test_remove_leafRoot_last() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(2), 'V2');
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1}\n');
+  }
+
+  void test_remove_leafRoot_middle() {
+    _insertValues(3);
+    _assertDebugString(tree, 'LNode {0: V0, 1: V1, 2: V2}\n');
+    expect(tree.remove(1), 'V1');
+    _assertDebugString(tree, 'LNode {0: V0, 2: V2}\n');
+  }
+
+  void test_remove_leafRoot_notFound() {
+    _insertValues(1);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+    expect(tree.remove(10), null);
+    _assertDebugString(tree, 'LNode {0: V0}\n');
+  }
+
+  void test_remove_leaf_borrowLeft() {
+    tree = _createTree(10, 10);
+    for (int i = 20; i < 40; i++) {
+      _insert(i, 'V$i');
+    }
+    for (int i = 0; i < 5; i++) {
+      _insert(i, 'V$i');
+    }
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21, 22: V22, 23: V23, 24: V24}
+  25
+    LNode {25: V25, 26: V26, 27: V27, 28: V28, 29: V29}
+  30
+    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
+}
+''');
+    expect(tree.remove(25), 'V25');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4, 20: V20, 21: V21}
+  22
+    LNode {22: V22, 23: V23, 24: V24, 26: V26, 27: V27, 28: V28, 29: V29}
+  30
+    LNode {30: V30, 31: V31, 32: V32, 33: V33, 34: V34, 35: V35, 36: V36, 37: V37, 38: V38, 39: V39}
+}
+''');
+  }
+
+  void test_remove_leaf_borrowRight() {
+    tree = _createTree(10, 10);
+    _insertValues(15);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 2: V2, 3: V3, 4: V4}
+  5
+    LNode {5: V5, 6: V6, 7: V7, 8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
+}
+''');
+    expect(tree.remove(0), 'V0');
+    _assertDebugString(tree, '''
+INode {
+    LNode {1: V1, 2: V2, 3: V3, 4: V4, 5: V5, 6: V6, 7: V7}
+  8
+    LNode {8: V8, 9: V9, 10: V10, 11: V11, 12: V12, 13: V13, 14: V14}
+}
+''');
+  }
+
+  void test_remove_leaf_mergeLeft() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+    expect(tree.remove(2), 'V2');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_remove_leaf_mergeRight() {
+    _insertValues(9);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+    expect(tree.remove(1), 'V1');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 2: V2, 3: V3}
+  4
+    LNode {4: V4, 5: V5}
+  6
+    LNode {6: V6, 7: V7, 8: V8}
+}
+''');
+  }
+
+  void test_remove_leaf_noReorder() {
+    _insertValues(5);
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 3: V3, 4: V4}
+}
+''');
+    expect(tree.remove(3), 'V3');
+    _assertDebugString(tree, '''
+INode {
+    LNode {0: V0, 1: V1}
+  2
+    LNode {2: V2, 4: V4}
+}
+''');
+  }
+
+  void test_stress_evenOdd() {
+    int count = 1000;
+    // insert odd, forward
+    for (int i = 1; i < count; i += 2) {
+      _insert(i, 'V$i');
+    }
+    // insert even, backward
+    for (int i = count - 2; i >= 0; i -= 2) {
+      _insert(i, 'V$i');
+    }
+    // find every
+    for (int i = 0; i < count; i++) {
+      expect(tree.find(i), 'V$i');
+    }
+    // remove odd, backward
+    for (int i = count - 1; i >= 1; i -= 2) {
+      expect(tree.remove(i), 'V$i');
+    }
+    for (int i = 0; i < count; i++) {
+      if (i.isEven) {
+        expect(tree.find(i), 'V$i');
+      } else {
+        expect(tree.find(i), isNull);
+      }
+    }
+    // remove even, forward
+    for (int i = 0; i < count; i += 2) {
+      tree.remove(i);
+    }
+    for (int i = 0; i < count; i++) {
+      expect(tree.find(i), isNull);
+    }
+  }
+
+  void test_stress_random() {
+    tree = _createTree(10, 10);
+    int maxKey = 1000000;
+    int tryCount = 1000;
+    Set<int> keys = new Set<int>();
+    {
+      Random random = new Random(37);
+      for (int i = 0; i < tryCount; i++) {
+        int key = random.nextInt(maxKey);
+        keys.add(key);
+        _insert(key, 'V$key');
+      }
+    }
+    // find every
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+    // remove random keys
+    {
+      Random random = new Random(37);
+      for (int key in new Set<int>.from(keys)) {
+        if (random.nextBool()) {
+          keys.remove(key);
+          expect(tree.remove(key), 'V$key');
+        }
+      }
+    }
+    // find every remaining key
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void _insert(int key, String value) {
+    tree.insert(key, value);
+  }
+
+  void _insertValues(int count) {
+    for (int i = 0; i < count; i++) {
+      _insert(i, 'V$i');
+    }
+  }
+}
+
+class _TestBTree<K, V> extends BPlusTree<K, V, int> {
+  _TestBTree(int maxIndexKeys, int maxLeafKeys, Comparator<K> comparator) :
+      super(comparator, new MemoryNodeManager(maxIndexKeys, maxLeafKeys));
+}
diff --git a/pkg/analysis_server/test/index/file_page_manager_test.dart b/pkg/analysis_server/test/index/file_page_manager_test.dart
new file mode 100644
index 0000000..1c11942
--- /dev/null
+++ b/pkg/analysis_server/test/index/file_page_manager_test.dart
@@ -0,0 +1,125 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.file_page_manager;
+
+import 'dart:collection';
+import 'dart:io';
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/file_page_manager.dart';
+import 'package:analysis_server/src/index/page_node_manager.dart';
+import 'package:path/path.dart' as pathos;
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('FixedStringCodecTest', () {
+    runReflectiveTests(_FilePageManagerTest);
+  });
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+@ReflectiveTestCase()
+class _FilePageManagerTest {
+  FilePageManager manager;
+  int pageSize = 1024;
+  Directory tempDir;
+
+  void setUp() {
+    tempDir = Directory.systemTemp.createTempSync('testIndex_');
+    String path = pathos.join(tempDir.path, 'my.index');
+    manager = new FilePageManager(pageSize, path);
+  }
+
+  void tearDown() {
+    manager.close();
+    manager.delete();
+    tempDir.deleteSync(recursive: true);
+  }
+
+  void test_alloc_reuseFree() {
+    int id = manager.alloc();
+    manager.free(id);
+    int newId = manager.alloc();
+    expect(newId, id);
+  }
+
+  void test_alloc_unique() {
+    int idA = manager.alloc();
+    int idB = manager.alloc();
+    expect(idB, isNot(idA));
+  }
+
+  void test_btree_stress_random() {
+    NodeManager<int, String, int> nodeManager = new PageNodeManager<int,
+        String>(manager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
+    nodeManager = new CachingNodeManager(nodeManager, 32, 32);
+    BPlusTree<int, String, int> tree = new BPlusTree(_intComparator,
+        nodeManager);
+    // insert
+    int maxKey = 1000000;
+    int tryCount = 1000;
+    Set<int> keys = new Set<int>();
+    {
+      Random random = new Random(37);
+      for (int i = 0; i < tryCount; i++) {
+        int key = random.nextInt(maxKey);
+        keys.add(key);
+        tree.insert(key, 'V$key');
+      }
+    }
+    // find every
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+    // remove random keys
+    {
+      Random random = new Random(37);
+      Set<int> removedKeys = new HashSet<int>();
+      for (int key in new Set<int>.from(keys)) {
+        if (random.nextBool()) {
+          removedKeys.add(key);
+          keys.remove(key);
+          expect(tree.remove(key), 'V$key');
+        }
+      }
+      // check the removed keys are actually gone
+      for (int key in removedKeys) {
+        expect(tree.find(key), isNull);
+      }
+    }
+    // find every remaining key
+    for (int key in keys) {
+      expect(tree.find(key), 'V$key');
+    }
+  }
+
+  void test_free_double() {
+    int id = manager.alloc();
+    manager.free(id);
+    expect(() {
+      manager.free(id);
+    }, throws);
+  }
+
+  void test_writeRead() {
+    // write
+    int id1 = manager.alloc();
+    int id2 = manager.alloc();
+    manager.write(id1, new Uint8List.fromList(new List.filled(pageSize, 1)));
+    manager.write(id2, new Uint8List.fromList(new List.filled(pageSize, 2)));
+    // read
+    expect(manager.read(id1), everyElement(1));
+    expect(manager.read(id2), everyElement(2));
+  }
+}
diff --git a/pkg/analysis_server/test/index/index_test.dart b/pkg/analysis_server/test/index/index_test.dart
new file mode 100644
index 0000000..965acff
--- /dev/null
+++ b/pkg/analysis_server/test/index/index_test.dart
@@ -0,0 +1,204 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index;
+
+import 'dart:async';
+import 'dart:io' show Directory;
+
+import 'package:analysis_server/src/index/index.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/ast.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/html.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source_io.dart';
+import 'package:unittest/unittest.dart';
+
+import '../mocks.dart';
+import '../reflective_tests.dart';
+import 'store/single_source_container.dart';
+import 'store/memory_node_manager.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('LocalIndex', () {
+    runReflectiveTests(LocalIndexTest);
+  });
+}
+
+
+void _assertElementNames(List<Location> locations, List expected) {
+  expect(_toElementNames(locations), unorderedEquals(expected));
+}
+
+
+Iterable<String> _toElementNames(List<Location> locations) {
+  return locations.map((loc) => loc.element.name);
+}
+
+
+@ReflectiveTestCase()
+class LocalIndexTest {
+  static final DartSdk SDK = new MockSdk();
+
+  AnalysisContext context;
+  LocalIndex index;
+  Directory indexDirectory;
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  void setUp() {
+    // prepare Index
+    indexDirectory = Directory.systemTemp.createTempSync(
+        'AnalysisServer_index');
+    index = new LocalIndex(new MemoryNodeManager());
+    // prepare AnalysisContext
+    context = AnalysisEngine.instance.createAnalysisContext();
+    context.sourceFactory = new SourceFactory(<UriResolver>[new DartUriResolver(
+        SDK), new ResourceUriResolver(provider)]);
+  }
+
+  void tearDown() {
+    indexDirectory.delete(recursive: true);
+    index = null;
+    context = null;
+    provider = null;
+  }
+
+  Future test_clear() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      _assertElementNames(locations, ['main']);
+      // clear
+      index.clear();
+      return _getDefinedFunctions().then((locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  void test_getRelationships() {
+    var callback = new _RecordingRelationshipCallback();
+    Element element = UniverseElement.INSTANCE;
+    index.getRelationships(element, IndexConstants.DEFINES_CLASS, callback);
+    expect(callback.locations, isEmpty);
+  }
+
+  void test_indexHtmlUnit_nullUnit() {
+    index.indexHtmlUnit(context, null);
+  }
+
+  void test_indexHtmlUnit_nullUnitElement() {
+    HtmlUnit unit = new HtmlUnit(null, [], null);
+    index.indexHtmlUnit(context, unit);
+  }
+
+  Future test_indexUnit() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      _assertElementNames(locations, ['main']);
+    });
+  }
+
+  void test_indexUnit_nullUnit() {
+    index.indexUnit(context, null);
+  }
+
+  void test_indexUnit_nullUnitElement() {
+    CompilationUnit unit = new CompilationUnit(null, null, [], [], null);
+    index.indexUnit(context, unit);
+  }
+
+  Future test_removeContext() {
+    _indexTest('main() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there is a location
+      _assertElementNames(locations, ['main']);
+      // remove context
+      index.removeContext(context);
+      return _getDefinedFunctions().then((locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  Future test_removeSource() {
+    Source sourceA = _indexLibraryUnit('/testA.dart', 'fa() {}');
+    _indexLibraryUnit('/testB.dart', 'fb() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there are 2 functions
+      _assertElementNames(locations, ['fa', 'fb']);
+      // remove source
+      index.removeSource(context, sourceA);
+      return _getDefinedFunctions().then((locations) {
+        _assertElementNames(locations, ['fb']);
+      });
+    });
+  }
+
+  Future test_removeSources() {
+    Source sourceA = _indexLibraryUnit('/testA.dart', 'fa() {}');
+    _indexLibraryUnit('/testB.dart', 'fb() {}');
+    return _getDefinedFunctions().then((locations) {
+      // OK, there are 2 functions
+      _assertElementNames(locations, ['fa', 'fb']);
+      // remove source(s)
+      index.removeSources(context, new SingleSourceContainer(sourceA));
+      return _getDefinedFunctions().then((locations) {
+        _assertElementNames(locations, ['fb']);
+      });
+    });
+  }
+
+  void test_statistics() {
+    expect(index.statistics, '[0 locations, 0 sources, 0 names]');
+  }
+
+  Source _addSource(String path, String content) {
+    File file = provider.newFile(path, content);
+    Source source = file.createSource(UriKind.FILE_URI);
+    ChangeSet changeSet = new ChangeSet();
+    changeSet.addedSource(source);
+    context.applyChanges(changeSet);
+    context.setContents(source, content);
+    return source;
+  }
+
+  Future<List<Location>> _getDefinedFunctions() {
+    return index.getRelationshipsAsync(UniverseElement.INSTANCE,
+        IndexConstants.DEFINES_FUNCTION);
+  }
+
+  Source _indexLibraryUnit(String path, String content) {
+    Source source = _addSource(path, content);
+    CompilationUnit dartUnit = _resolveLibraryUnit(source);
+    index.indexUnit(context, dartUnit);
+    return source;
+  }
+
+  void _indexTest(String content) {
+    _indexLibraryUnit('/test.dart', content);
+  }
+
+  CompilationUnit _resolveLibraryUnit(Source source) {
+    return context.resolveCompilationUnit2(source, source);
+  }
+}
+
+
+/**
+ * A [RelationshipCallback] that remembers [Location]s.
+ */
+class _RecordingRelationshipCallback extends RelationshipCallback {
+  List<Location> locations;
+
+  @override
+  void hasRelationships(Element element, Relationship relationship,
+      List<Location> locations) {
+    this.locations = locations;
+  }
+}
diff --git a/pkg/analysis_server/test/index/lru_cache_test.dart b/pkg/analysis_server/test/index/lru_cache_test.dart
new file mode 100644
index 0000000..5874a77
--- /dev/null
+++ b/pkg/analysis_server/test/index/lru_cache_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.lru_cache;
+
+import 'package:analysis_server/src/index/lru_cache.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('LRUCache', () {
+    runReflectiveTests(_LRUCacheTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _LRUCacheTest {
+  LRUCache<int, String> cache = new LRUCache<int, String>(3);
+
+  void test_evict_notGet() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUCache<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // access '1' and '3'
+    cache.get(1);
+    cache.get(3);
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_evict_notPut() {
+    List<int> evictedKeys = new List<int>();
+    List<String> evictedValues = new List<String>();
+    cache = new LRUCache<int, String>(3, (int key, String value) {
+      evictedKeys.add(key);
+      evictedValues.add(value);
+    });
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // put '1' and '3'
+    cache.put(1, 'AA');
+    cache.put(3, 'CC');
+    // put '4', evict '2'
+    cache.put(4, 'D');
+    expect(cache.get(1), 'AA');
+    expect(cache.get(2), isNull);
+    expect(cache.get(3), 'CC');
+    expect(cache.get(4), 'D');
+    // check eviction listener
+    expect(evictedKeys, contains(2));
+    expect(evictedValues, contains('B'));
+  }
+
+  void test_putGet() {
+    // fill
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // check
+    expect(cache.get(1), 'A');
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), 'C');
+    expect(cache.get(4), isNull);
+  }
+
+  void test_remove() {
+    cache.put(1, 'A');
+    cache.put(2, 'B');
+    cache.put(3, 'C');
+    // remove
+    cache.remove(1);
+    cache.remove(3);
+    // check
+    expect(cache.get(1), isNull);
+    expect(cache.get(2), 'B');
+    expect(cache.get(3), isNull);
+  }
+}
diff --git a/pkg/analysis_server/test/index/page_node_manager_test.dart b/pkg/analysis_server/test/index/page_node_manager_test.dart
new file mode 100644
index 0000000..56dab61
--- /dev/null
+++ b/pkg/analysis_server/test/index/page_node_manager_test.dart
@@ -0,0 +1,434 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.page_node_manager;
+
+import 'dart:math';
+import 'dart:typed_data';
+
+import 'package:analysis_server/src/index/b_plus_tree.dart';
+import 'package:analysis_server/src/index/page_node_manager.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('_CachingNodeManagerTest', () {
+    runReflectiveTests(_CachingNodeManagerTest);
+  });
+  group('FixedStringCodecTest', () {
+    runReflectiveTests(_FixedStringCodecTest);
+  });
+  group('MemoryPageManager', () {
+    runReflectiveTests(_MemoryPageManagerTest);
+  });
+  group('PageNodeManager', () {
+    runReflectiveTests(_PageNodeManagerTest);
+  });
+  group('Uint32CodecTest', () {
+    runReflectiveTests(_Uint32CodecTest);
+  });
+  test('B+ tree with PageNodeManager', _treeWithPageNodeManager);
+}
+
+
+int _intComparator(int a, int b) => a - b;
+
+
+/**
+ * A stress test for [BPlusTree] using [PageNodeManager].
+ */
+_treeWithPageNodeManager() {
+  int pageSize = 256;
+  MemoryPageManager pageManager = new MemoryPageManager(pageSize);
+  NodeManager<int, String, int> nodeManager = new PageNodeManager<int, String>(
+      pageManager, Uint32Codec.INSTANCE, new FixedStringCodec(7));
+//  NodeManager<int, String, int> nodeManager = new MemoryNodeManager();
+  BPlusTree<int, String, int> tree = new BPlusTree(_intComparator, nodeManager);
+  int maxKey = 1000000;
+  int tryCount = 1000;
+  Set<int> keys = new Set<int>();
+  {
+    Random random = new Random(37);
+    for (int i = 0; i < tryCount; i++) {
+      int key = random.nextInt(maxKey);
+      keys.add(key);
+      tree.insert(key, 'V$key');
+    }
+  }
+  // find every
+  for (int key in keys) {
+    expect(tree.find(key), 'V$key');
+  }
+  // remove random keys
+  {
+    Random random = new Random(37);
+    for (int key in new Set<int>.from(keys)) {
+      if (random.nextBool()) {
+        keys.remove(key);
+        expect(tree.remove(key), 'V$key');
+      }
+    }
+  }
+  // find every remaining key
+  for (int key in keys) {
+    expect(tree.find(key), 'V$key');
+  }
+}
+
+
+@ReflectiveTestCase()
+class _CachingNodeManagerTest {
+  _NodeManagerMock<int, String, int> delegate = new _NodeManagerMock<int,
+      String, int>();
+  NodeManager<int, String, int> manager;
+
+  void setUp() {
+    when(delegate.writeIndex).thenReturn((key, value) {
+      delegate.writeIndex(key, value);
+    });
+    when(delegate.writeLeaf).thenReturn((key, value) {
+      delegate.writeLeaf(key, value);
+    });
+    manager = new CachingNodeManager<int, String, int>(delegate, 4, 4);
+    resetInteractions(delegate);
+  }
+
+  void test_createIndex() {
+    when(delegate.createIndex()).thenReturn(77);
+    expect(manager.createIndex(), 77);
+  }
+
+  void test_createLeaf() {
+    when(delegate.createLeaf()).thenReturn(99);
+    expect(manager.createLeaf(), 99);
+  }
+
+  void test_delete() {
+    manager.delete(42);
+    verify(delegate.delete(42)).once();
+  }
+
+  void test_isIndex() {
+    when(delegate.isIndex(1)).thenReturn(true);
+    when(delegate.isIndex(2)).thenReturn(false);
+    expect(manager.isIndex(1), isTrue);
+    expect(manager.isIndex(2), isFalse);
+  }
+
+  void test_maxIndexKeys() {
+    when(delegate.maxIndexKeys).thenReturn(42);
+    expect(manager.maxIndexKeys, 42);
+  }
+
+  void test_maxLeafKeys() {
+    when(delegate.maxLeafKeys).thenReturn(42);
+    expect(manager.maxLeafKeys, 42);
+  }
+
+  void test_readIndex_cache_whenRead() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    when(delegate.readIndex(2)).thenReturn(data);
+    expect(manager.readIndex(2), data);
+    verify(delegate.readIndex(2)).once();
+    resetInteractions(delegate);
+    // we just read "2", so it should be cached
+    manager.readIndex(2);
+    verify(delegate.readIndex(2)).never();
+  }
+
+  void test_readIndex_cache_whenWrite() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    manager.writeIndex(2, data);
+    expect(manager.readIndex(2), data);
+    verify(delegate.readLeaf(2)).never();
+    // delete, forces request to the delegate
+    manager.delete(2);
+    manager.readIndex(2);
+    verify(delegate.readIndex(2)).once();
+  }
+
+  void test_readIndex_delegate() {
+    var data = new IndexNodeData<int, int>([1, 2], [10, 20, 30]);
+    when(delegate.readIndex(2)).thenReturn(data);
+    expect(manager.readIndex(2), data);
+  }
+
+  void test_readLeaf_cache_whenRead() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    when(delegate.readLeaf(2)).thenReturn(data);
+    expect(manager.readLeaf(2), data);
+    verify(delegate.readLeaf(2)).once();
+    resetInteractions(delegate);
+    // we just read "2", so it should be cached
+    manager.readLeaf(2);
+    verify(delegate.readLeaf(2)).never();
+  }
+
+  void test_readLeaf_cache_whenWrite() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    manager.writeLeaf(2, data);
+    expect(manager.readLeaf(2), data);
+    verify(delegate.readLeaf(2)).never();
+    // delete, forces request to the delegate
+    manager.delete(2);
+    manager.readLeaf(2);
+    verify(delegate.readLeaf(2)).once();
+  }
+
+  void test_readLeaf_delegate() {
+    var data = new LeafNodeData<int, String>([1, 2, 3], ['A', 'B', 'C']);
+    when(delegate.readLeaf(2)).thenReturn(data);
+    expect(manager.readLeaf(2), data);
+  }
+
+  void test_writeIndex() {
+    var data = new IndexNodeData<int, int>([1], [10, 20]);
+    manager.writeIndex(1, data);
+    manager.writeIndex(2, data);
+    manager.writeIndex(3, data);
+    manager.writeIndex(4, data);
+    manager.writeIndex(1, data);
+    verifyZeroInteractions(delegate);
+    // only 4 nodes can be cached, 5-th one cause write to the delegate
+    manager.writeIndex(5, data);
+    verify(delegate.writeIndex(2, data)).once();
+  }
+
+  void test_writeLeaf() {
+    var data = new LeafNodeData<int, String>([1, 2], ['A', 'B']);
+    manager.writeLeaf(1, data);
+    manager.writeLeaf(2, data);
+    manager.writeLeaf(3, data);
+    manager.writeLeaf(4, data);
+    manager.writeLeaf(1, data);
+    verifyZeroInteractions(delegate);
+    // only 4 nodes can be cached, 5-th one cause write to the delegate
+    manager.writeLeaf(5, data);
+    verify(delegate.writeLeaf(2, data)).once();
+  }
+}
+
+
+@ReflectiveTestCase()
+class _FixedStringCodecTest {
+  ByteData buffer;
+  Uint8List bytes = new Uint8List(2 + 2 * 4);
+  FixedStringCodec codec = new FixedStringCodec(4);
+
+  void setUp() {
+    buffer = new ByteData.view(bytes.buffer);
+  }
+
+  test_empty() {
+    // encode
+    codec.encode(buffer, '');
+    expect(bytes, [0, 0, 0, 0, 0, 0, 0, 0, 0, 0]);
+    // decode
+    expect(codec.decode(buffer), '');
+  }
+
+  test_fourChars() {
+    // encode
+    codec.encode(buffer, 'ABCD');
+    expect(bytes, [0, 4, 0, 65, 0, 66, 0, 67, 0, 68]);
+    // decode
+    expect(codec.decode(buffer), 'ABCD');
+  }
+
+  test_russian() {
+    // encode
+    codec.encode(buffer, 'ЩУКА');
+    expect(bytes, [0, 4, 4, 41, 4, 35, 4, 26, 4, 16]);
+    // decode
+    expect(codec.decode(buffer), 'ЩУКА');
+  }
+
+  test_tooManyChars() {
+    expect(() {
+      codec.encode(buffer, 'ABCDE');
+    }, throws);
+  }
+
+  test_twoChars() {
+    // encode
+    codec.encode(buffer, 'AB');
+    expect(bytes, [0, 2, 0, 65, 0, 66, 0, 0, 0, 0]);
+    // decode
+    expect(codec.decode(buffer), 'AB');
+  }
+}
+
+
+@ReflectiveTestCase()
+class _MemoryPageManagerTest {
+  static const PAGE_SIZE = 8;
+  MemoryPageManager manager = new MemoryPageManager(PAGE_SIZE);
+
+  test_alloc() {
+    int idA = manager.alloc();
+    int idB = manager.alloc();
+    expect(idB, isNot(idA));
+  }
+
+  test_free() {
+    int id = manager.alloc();
+    manager.free(id);
+    // double free
+    expect(() {
+      manager.free(id);
+    }, throws);
+  }
+
+  test_read() {
+    int id = manager.alloc();
+    Uint8List page = manager.read(id);
+    expect(page.length, PAGE_SIZE);
+  }
+
+  test_read_doesNotExist() {
+    expect(() {
+      manager.read(0);
+    }, throws);
+  }
+
+  test_write() {
+    int id = manager.alloc();
+    // do write
+    {
+      Uint8List page = new Uint8List(PAGE_SIZE);
+      page[3] = 42;
+      manager.write(id, page);
+    }
+    // now read
+    {
+      Uint8List page = manager.read(id);
+      expect(page.length, PAGE_SIZE);
+      expect(page[3], 42);
+    }
+  }
+
+  test_write_doesNotExist() {
+    expect(() {
+      Uint8List page = new Uint8List(PAGE_SIZE);
+      manager.write(42, page);
+    }, throws);
+  }
+
+  test_write_invalidLength() {
+    int id = manager.alloc();
+    Uint8List page = new Uint8List(0);
+    expect(() {
+      manager.write(id, page);
+    }, throws);
+  }
+}
+
+
+
+class _NodeManagerMock<K, V, N> extends TypedMock implements NodeManager<K, V,
+    N> {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+
+@ReflectiveTestCase()
+class _PageNodeManagerTest {
+  static const Codec KEY_CODEC = Uint32Codec.INSTANCE;
+  static const int PAGE_SIZE = 128;
+  static const Codec VALUE_CODEC = const FixedStringCodec(4);
+
+  PageNodeManager<int, String> nodeManager;
+  MemoryPageManager pageManager = new MemoryPageManager(PAGE_SIZE);
+
+  setUp() {
+    nodeManager = new PageNodeManager<int, String>(pageManager, KEY_CODEC,
+        VALUE_CODEC);
+  }
+
+  test_index_createDelete() {
+    int id = nodeManager.createIndex();
+    expect(nodeManager.isIndex(id), isTrue);
+    // do delete
+    nodeManager.delete(id);
+    expect(nodeManager.isIndex(id), isFalse);
+  }
+
+  test_index_readWrite() {
+    int id = nodeManager.createIndex();
+    expect(nodeManager.isIndex(id), isTrue);
+    // write
+    {
+      var keys = [1, 2];
+      var children = [10, 20, 30];
+      nodeManager.writeIndex(id, new IndexNodeData<int, int>(keys, children));
+    }
+    // check the page
+    {
+      Uint8List page = pageManager.read(id);
+      expect(page, [0, 0, 0, 2, 0, 0, 0, 10, 0, 0, 0, 1, 0, 0, 0, 20, 0, 0, 0,
+          2, 0, 0, 0, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0]);
+    }
+    // read
+    {
+      IndexNodeData<int, int> data = nodeManager.readIndex(id);
+      expect(data.keys, [1, 2]);
+      expect(data.children, [10, 20, 30]);
+    }
+  }
+
+  test_leaf_readWrite() {
+    int id = nodeManager.createLeaf();
+    expect(nodeManager.isIndex(id), isFalse);
+    // write
+    {
+      var keys = [1, 2, 3];
+      var children = ['A', 'BB', 'CCC'];
+      nodeManager.writeLeaf(id, new LeafNodeData<int, String>(keys, children));
+    }
+    // check the page
+    {
+      Uint8List page = pageManager.read(id);
+      expect(page, [0, 0, 0, 3, 0, 0, 0, 1, 0, 1, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 2, 0, 2, 0, 66, 0, 66, 0, 0, 0, 0, 0, 0, 0, 3, 0, 3, 0, 67, 0, 67, 0, 67, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
+          0, 0]);
+    }
+    // read
+    {
+      LeafNodeData<int, String> data = nodeManager.readLeaf(id);
+      expect(data.keys, [1, 2, 3]);
+      expect(data.values, ['A', 'BB', 'CCC']);
+    }
+  }
+}
+
+@ReflectiveTestCase()
+class _Uint32CodecTest {
+  ByteData buffer;
+  Uint8List bytes = new Uint8List(4);
+  Uint32Codec codec = Uint32Codec.INSTANCE;
+
+  void setUp() {
+    buffer = new ByteData.view(bytes.buffer);
+  }
+
+  test_all() {
+    // encode
+    codec.encode(buffer, 42);
+    expect(bytes, [0, 0, 0, 42]);
+    // decode
+    expect(codec.decode(buffer), 42);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/codec_test.dart b/pkg/analysis_server/test/index/store/codec_test.dart
new file mode 100644
index 0000000..5d5262f
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/codec_test.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.store.codec;
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'typed_mocks.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('ContextCodec', () {
+    runReflectiveTests(_ContextCodecTest);
+  });
+  group('ElementCodec', () {
+    runReflectiveTests(_ElementCodecTest);
+  });
+  group('RelationshipCodec', () {
+    runReflectiveTests(_RelationshipCodecTest);
+  });
+  group('StringCodec', () {
+    runReflectiveTests(_StringCodecTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _ContextCodecTest {
+  ContextCodec codec = new ContextCodec();
+
+  void test_encode_decode() {
+    AnalysisContext contextA = new MockAnalysisContext('contextA');
+    AnalysisContext contextB = new MockAnalysisContext('contextB');
+    int idA = codec.encode(contextA);
+    int idB = codec.encode(contextB);
+    expect(idA, codec.encode(contextA));
+    expect(idB, codec.encode(contextB));
+    expect(codec.decode(idA), contextA);
+    expect(codec.decode(idB), contextB);
+  }
+
+  void test_remove() {
+    // encode
+    {
+      AnalysisContext context = new MockAnalysisContext('context');
+      // encode
+      int id = codec.encode(context);
+      expect(id, 0);
+      expect(codec.decode(id), context);
+      // remove
+      codec.remove(context);
+      expect(codec.decode(id), isNull);
+    }
+    // encode again
+    {
+      AnalysisContext context = new MockAnalysisContext('context');
+      // encode
+      int id = codec.encode(context);
+      expect(id, 1);
+      expect(codec.decode(id), context);
+    }
+  }
+}
+
+
+@ReflectiveTestCase()
+class _ElementCodecTest {
+  ElementCodec codec;
+  AnalysisContext context = new MockAnalysisContext('context');
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    codec = new ElementCodec(stringCodec);
+  }
+
+  void test_localLocalVariable() {
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main', 'foo@1',
+          'bar@2']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main', 'foo@10',
+          'bar@20']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    // check strings, "foo" as a single string, no "foo@1" or "foo@10"
+    expect(stringCodec.nameToIndex, hasLength(3));
+    expect(stringCodec.nameToIndex, containsPair('main', 0));
+    expect(stringCodec.nameToIndex, containsPair('foo', 1));
+    expect(stringCodec.nameToIndex, containsPair('bar', 2));
+  }
+
+  void test_localVariable() {
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main',
+          'foo@42']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    {
+      Element element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['main',
+          'foo@4200']);
+      when(context.getElement(location)).thenReturn(element);
+      when(element.location).thenReturn(location);
+      int id = codec.encode(element);
+      expect(codec.decode(context, id), element);
+    }
+    // check strings, "foo" as a single string, no "foo@42" or "foo@4200"
+    expect(stringCodec.nameToIndex, hasLength(2));
+    expect(stringCodec.nameToIndex, containsPair('main', 0));
+    expect(stringCodec.nameToIndex, containsPair('foo', 1));
+  }
+
+  void test_notLocal() {
+    Element element = new MockElement();
+    ElementLocation location = new ElementLocationImpl.con3(['foo', 'bar']);
+    when(element.location).thenReturn(location);
+    when(context.getElement(location)).thenReturn(element);
+    int id = codec.encode(element);
+    expect(codec.encode(element), id);
+    expect(codec.decode(context, id), element);
+    // check strings
+    expect(stringCodec.nameToIndex, hasLength(2));
+    expect(stringCodec.nameToIndex, containsPair('foo', 0));
+    expect(stringCodec.nameToIndex, containsPair('bar', 1));
+  }
+}
+
+
+@ReflectiveTestCase()
+class _RelationshipCodecTest {
+  RelationshipCodec codec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    codec = new RelationshipCodec(stringCodec);
+  }
+
+  void test_all() {
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    int id = codec.encode(relationship);
+    expect(codec.decode(id), relationship);
+  }
+}
+
+
+@ReflectiveTestCase()
+class _StringCodecTest {
+  StringCodec codec = new StringCodec();
+
+  void test_all() {
+    int idA = codec.encode('aaa');
+    int idB = codec.encode('bbb');
+    expect(codec.decode(idA), 'aaa');
+    expect(codec.decode(idB), 'bbb');
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/collection_test.dart b/pkg/analysis_server/test/index/store/collection_test.dart
new file mode 100644
index 0000000..382510b
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/collection_test.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.store.collection;
+
+import 'package:analysis_server/src/index/store/collection.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('IntArrayToIntMap', () {
+    runReflectiveTests(_IntArrayToIntMapTest);
+  });
+  group('IntToIntSetMap', () {
+    runReflectiveTests(_IntToIntSetMapTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _IntArrayToIntMapTest {
+  IntArrayToIntMap map = new IntArrayToIntMap();
+
+  void test_put_get() {
+    map[<int>[1, 2, 3]] = 1;
+    map[<int>[2, 3, 4, 5]] = 2;
+    expect(map[<int>[0]], isNull);
+    expect(map[<int>[1, 2, 3]], 1);
+    expect(map[<int>[2, 3, 4, 5]], 2);
+  }
+}
+
+
+@ReflectiveTestCase()
+class _IntToIntSetMapTest {
+  IntToIntSetMap map = new IntToIntSetMap();
+
+  void test_add_duplicate() {
+    map.add(1, 0);
+    map.add(1, 0);
+    List<int> set = map.get(1);
+    expect(set, hasLength(1));
+  }
+
+  void test_clear() {
+    map.add(1, 10);
+    map.add(2, 20);
+    expect(map.length, 2);
+    map.clear();
+    expect(map.length, 0);
+  }
+
+  void test_get() {
+    map.add(1, 10);
+    map.add(1, 11);
+    map.add(1, 12);
+    map.add(2, 20);
+    map.add(2, 21);
+    expect(map.get(1), unorderedEquals([10, 11, 12]));
+    expect(map.get(2), unorderedEquals([20, 21]));
+  }
+
+  void test_get_no() {
+    expect(map.get(3), []);
+  }
+
+  void test_length() {
+    expect(map.length, 0);
+    map.add(1, 10);
+    expect(map.length, 1);
+    map.add(1, 11);
+    map.add(1, 12);
+    expect(map.length, 1);
+    map.add(2, 20);
+    expect(map.length, 2);
+    map.add(2, 21);
+    expect(map.length, 2);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/memory_node_manager.dart b/pkg/analysis_server/test/index/store/memory_node_manager.dart
new file mode 100644
index 0000000..3a9209e
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/memory_node_manager.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.index.store_memory_node_manager;
+
+import 'dart:async';
+import 'dart:collection';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/engine.dart';
+
+
+class MemoryNodeManager implements NodeManager {
+  ContextCodec _contextCodec = new ContextCodec();
+  ElementCodec _elementCodec;
+  int _locationCount = 0;
+  final Map<String, int> _nodeLocationCounts = new HashMap<String, int>();
+  final Map<String, IndexNode> _nodes = new HashMap<String, IndexNode>();
+  RelationshipCodec _relationshipCodec;
+  StringCodec _stringCodec = new StringCodec();
+
+  MemoryNodeManager() {
+    _elementCodec = new ElementCodec(_stringCodec);
+    _relationshipCodec = new RelationshipCodec(_stringCodec);
+  }
+
+  @override
+  ContextCodec get contextCodec {
+    return _contextCodec;
+  }
+
+  @override
+  ElementCodec get elementCodec {
+    return _elementCodec;
+  }
+
+  @override
+  int get locationCount {
+    return _locationCount;
+  }
+
+  @override
+  StringCodec get stringCodec {
+    return _stringCodec;
+  }
+
+  @override
+  void clear() {
+    _nodes.clear();
+  }
+
+  int getLocationCount(String name) {
+    int locationCount = _nodeLocationCounts[name];
+    return locationCount != null ? locationCount : 0;
+  }
+
+  @override
+  Future<IndexNode> getNode(String name) {
+    return new Future.value(_nodes[name]);
+  }
+
+  bool isEmpty() {
+    for (IndexNode node in _nodes.values) {
+      Map<RelationKeyData, List<LocationData>> relations = node.relations;
+      if (!relations.isEmpty) {
+        return false;
+      }
+    }
+    return true;
+  }
+
+  @override
+  IndexNode newNode(AnalysisContext context) {
+    return new IndexNode(context, elementCodec, _relationshipCodec);
+  }
+
+  @override
+  void putNode(String name, IndexNode node) {
+    // update location count
+    {
+      _locationCount -= getLocationCount(name);
+      int nodeLocationCount = node.locationCount;
+      _nodeLocationCounts[name] = nodeLocationCount;
+      _locationCount += nodeLocationCount;
+    }
+    // remember the node
+    _nodes[name] = node;
+  }
+
+  @override
+  void removeNode(String name) {
+    _nodes.remove(name);
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/separate_file_manager_test.dart b/pkg/analysis_server/test/index/store/separate_file_manager_test.dart
new file mode 100644
index 0000000..6c3c0e2
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/separate_file_manager_test.dart
@@ -0,0 +1,77 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.index.store.separate_file_mananer;
+
+import 'dart:io';
+
+import 'package:analysis_server/src/index/store/separate_file_manager.dart';
+import 'package:path/path.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('SeparateFileManager', () {
+    runReflectiveTests(_SeparateFileManagerTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _SeparateFileManagerTest {
+  SeparateFileManager fileManager;
+  Directory tempDir;
+
+  void setUp() {
+    tempDir = Directory.systemTemp.createTempSync('AnalysisServer_index');
+    fileManager = new SeparateFileManager(tempDir);
+  }
+
+  void tearDown() {
+    tempDir.delete(recursive: true);
+  }
+
+  test_clear() {
+    String name = "42.index";
+    // create the file
+    return fileManager.write(name, <int>[1, 2, 3, 4]).then((_) {
+      // check that the file exists
+      expect(_existsSync(name), isTrue);
+      // clear
+      fileManager.clear();
+      expect(_existsSync(name), isFalse);
+    });
+  }
+
+  test_delete_doesNotExist() {
+    String name = "42.index";
+    fileManager.delete(name);
+  }
+
+  test_outputInput() {
+    String name = "42.index";
+    // create the file
+    return fileManager.write(name, <int>[1, 2, 3, 4]).then((_) {
+      // check that that the file exists
+      expect(_existsSync(name), isTrue);
+      // read the file
+      return fileManager.read(name).then((bytes) {
+        expect(bytes, <int>[1, 2, 3, 4]);
+        // delete
+        fileManager.delete(name);
+        // the file does not exist anymore
+        return fileManager.read(name).then((bytes) {
+          expect(bytes, isNull);
+        });
+      });
+    });
+  }
+
+  bool _existsSync(String name) {
+    return new File(join(tempDir.path, name)).existsSync();
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/single_source_container.dart b/pkg/analysis_server/test/index/store/single_source_container.dart
new file mode 100644
index 0000000..4968217
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/single_source_container.dart
@@ -0,0 +1,20 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.store_single_source_container;
+
+import 'package:analyzer/src/generated/source.dart';
+
+
+/**
+ * A [SourceContainer] with a single [Source].
+ */
+class SingleSourceContainer implements SourceContainer {
+  final Source _source;
+
+  SingleSourceContainer(this._source);
+
+  @override
+  bool contains(Source source) => source == _source;
+}
diff --git a/pkg/analysis_server/test/index/store/split_store_test.dart b/pkg/analysis_server/test/index/store/split_store_test.dart
new file mode 100644
index 0000000..cc1b5c1
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/split_store_test.dart
@@ -0,0 +1,1066 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.split_store;
+
+import 'dart:async';
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analysis_server/src/index/store/split_store.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+import 'package:unittest/unittest.dart';
+
+import '../../reflective_tests.dart';
+import 'memory_node_manager.dart';
+import 'single_source_container.dart';
+import 'typed_mocks.dart';
+
+
+main() {
+  groupSep = ' | ';
+  group('FileNodeManager', () {
+    runReflectiveTests(_FileNodeManagerTest);
+  });
+  group('IndexNode', () {
+    runReflectiveTests(_IndexNodeTest);
+  });
+  group('LocationData', () {
+    runReflectiveTests(_LocationDataTest);
+  });
+  group('RelationKeyData', () {
+    runReflectiveTests(_RelationKeyDataTest);
+  });
+  group('SplitIndexStore', () {
+    runReflectiveTests(_SplitIndexStoreTest);
+  });
+}
+
+
+void _assertHasLocation(List<Location> locations, Element element, int offset,
+    int length) {
+  for (Location location in locations) {
+    if ((element == null || location.element == element) && location.offset ==
+        offset && location.length == length) {
+      return;
+    }
+  }
+  fail('Expected to find Location'
+      '(element=$element, offset=$offset, length=$length)');
+}
+
+
+@ReflectiveTestCase()
+class _FileNodeManagerTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ContextCodec contextCodec = new MockContextCodec();
+  int contextId = 13;
+  ElementCodec elementCodec = new MockElementCodec();
+  FileManager fileManager = new _MockFileManager();
+  MockLogger logger = new MockLogger();
+  int nextElementId = 0;
+  FileNodeManager nodeManager;
+  RelationshipCodec relationshipCodec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    relationshipCodec = new RelationshipCodec(stringCodec);
+    nodeManager = new FileNodeManager(fileManager, logger, stringCodec,
+        contextCodec, elementCodec, relationshipCodec);
+    when(contextCodec.encode(context)).thenReturn(contextId);
+    when(contextCodec.decode(contextId)).thenReturn(context);
+  }
+
+  void test_clear() {
+    nodeManager.clear();
+    verify(fileManager.clear()).once();
+  }
+
+  void test_getLocationCount_empty() {
+    expect(nodeManager.locationCount, 0);
+  }
+
+  void test_getNode_contextNull() {
+    String name = '42.index';
+    // record bytes
+    List<int> bytes;
+    when(fileManager.write(name, anyObject)).thenInvoke((name, bs) {
+      bytes = bs;
+    });
+    // put Node
+    Future putFuture;
+    {
+      IndexNode node = new IndexNode(context, elementCodec, relationshipCodec);
+      putFuture = nodeManager.putNode(name, node);
+    }
+    // do in the "put" Future
+    putFuture.then((_) {
+      // force "null" context
+      when(contextCodec.decode(contextId)).thenReturn(null);
+      // prepare input bytes
+      when(fileManager.read(name)).thenReturn(new Future.value(bytes));
+      // get Node
+      return nodeManager.getNode(name).then((IndexNode node) {
+        expect(node, isNull);
+        // no exceptions
+        verifyZeroInteractions(logger);
+      });
+    });
+  }
+
+  test_getNode_invalidVersion() {
+    String name = '42.index';
+    // prepare a stream with an invalid version
+    when(fileManager.read(name)).thenReturn(new Future.value([0x01, 0x02, 0x03,
+        0x04]));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      // no IndexNode
+      expect(node, isNull);
+      // failed
+      verify(logger.logError2(anyObject, anyObject)).once();
+    });
+  }
+
+  test_getNode_streamException() {
+    String name = '42.index';
+    when(fileManager.read(name)).thenReturn(new Future(() {
+      return throw new Exception();
+    }));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      expect(node, isNull);
+      // failed
+      verify(logger.logError2(anyString, anyObject)).once();
+    });
+  }
+
+  test_getNode_streamNull() {
+    String name = '42.index';
+    when(fileManager.read(name)).thenReturn(new Future.value(null));
+    // do in the Future
+    return nodeManager.getNode(name).then((IndexNode node) {
+      expect(node, isNull);
+      // OK
+      verifyZeroInteractions(logger);
+    });
+  }
+
+  void test_newNode() {
+    IndexNode node = nodeManager.newNode(context);
+    expect(node.context, context);
+    expect(node.locationCount, 0);
+  }
+
+  test_putNode_getNode() {
+    String name = '42.index';
+    // record bytes
+    List<int> bytes;
+    when(fileManager.write(name, anyObject)).thenInvoke((name, bs) {
+      bytes = bs;
+    });
+    // prepare elements
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    // put Node
+    Future putFuture;
+    {
+      // prepare relations
+      int elementIdA = 0;
+      int elementIdB = 1;
+      int elementIdC = 2;
+      int relationshipId = relationshipCodec.encode(relationship);
+      RelationKeyData key = new RelationKeyData.forData(elementIdA,
+          relationshipId);
+      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
+          10), new LocationData.forData(elementIdC, 2, 20)];
+      Map<RelationKeyData, List<LocationData>> relations = {
+        key: locations
+      };
+      // prepare Node
+      IndexNode node = new _MockIndexNode();
+      when(node.context).thenReturn(context);
+      when(node.relations).thenReturn(relations);
+      when(node.locationCount).thenReturn(2);
+      // put Node
+      putFuture = nodeManager.putNode(name, node);
+    }
+    // do in the Future
+    putFuture.then((_) {
+      // has locations
+      expect(nodeManager.locationCount, 2);
+      // prepare input bytes
+      when(fileManager.read(name)).thenReturn(new Future.value(bytes));
+      // get Node
+      return nodeManager.getNode(name).then((IndexNode node) {
+        expect(2, node.locationCount);
+        {
+          List<Location> locations = node.getRelationships(elementA,
+              relationship);
+          expect(locations, hasLength(2));
+          _assertHasLocation(locations, elementB, 1, 10);
+          _assertHasLocation(locations, elementC, 2, 20);
+        }
+      });
+    });
+  }
+
+  test_putNode_streamException() {
+    String name = '42.index';
+    Exception exception = new Exception();
+    when(fileManager.write(name, anyObject)).thenReturn(new Future(() {
+      return throw exception;
+    }));
+    // prepare IndexNode
+    IndexNode node = new _MockIndexNode();
+    when(node.context).thenReturn(context);
+    when(node.locationCount).thenReturn(0);
+    when(node.relations).thenReturn({});
+    // try to put
+    return nodeManager.putNode(name, node).then((_) {
+      // failed
+      verify(logger.logError2(anyString, anyObject)).once();
+    });
+  }
+
+  void test_removeNode() {
+    String name = '42.index';
+    nodeManager.removeNode(name);
+    verify(fileManager.delete(name)).once();
+  }
+
+  Element _mockElement() {
+    int elementId = nextElementId++;
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(elementId);
+    when(elementCodec.decode(context, elementId)).thenReturn(element);
+    return element;
+  }
+}
+
+
+@ReflectiveTestCase()
+class _IndexNodeTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  int nextElementId = 0;
+  IndexNode node;
+  RelationshipCodec relationshipCodec;
+  StringCodec stringCodec = new StringCodec();
+
+  void setUp() {
+    relationshipCodec = new RelationshipCodec(stringCodec);
+    node = new IndexNode(context, elementCodec, relationshipCodec);
+  }
+
+  void test_getContext() {
+    expect(node.context, context);
+  }
+
+  void test_recordRelationship() {
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    Location locationA = new Location(elementB, 1, 2);
+    Location locationB = new Location(elementC, 10, 20);
+    // empty initially
+    expect(node.locationCount, 0);
+    // record
+    node.recordRelationship(elementA, relationship, locationA);
+    expect(node.locationCount, 1);
+    node.recordRelationship(elementA, relationship, locationB);
+    expect(node.locationCount, 2);
+    // get relations
+    expect(node.getRelationships(elementB, relationship), isEmpty);
+    {
+      List<Location> locations = node.getRelationships(elementA, relationship);
+      expect(locations, hasLength(2));
+      _assertHasLocation(locations, null, 1, 2);
+      _assertHasLocation(locations, null, 10, 20);
+    }
+    // verify relations map
+    {
+      Map<RelationKeyData, List<LocationData>> relations = node.relations;
+      expect(relations, hasLength(1));
+      List<LocationData> locations = relations.values.first;
+      expect(locations, hasLength(2));
+    }
+  }
+
+  void test_setRelations() {
+    Element elementA = _mockElement();
+    Element elementB = _mockElement();
+    Element elementC = _mockElement();
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    // record
+    {
+      int elementIdA = 0;
+      int elementIdB = 1;
+      int elementIdC = 2;
+      int relationshipId = relationshipCodec.encode(relationship);
+      RelationKeyData key = new RelationKeyData.forData(elementIdA,
+          relationshipId);
+      List<LocationData> locations = [new LocationData.forData(elementIdB, 1,
+          10), new LocationData.forData(elementIdC, 2, 20)];
+      node.relations = {
+        key: locations
+      };
+    }
+    // request
+    List<Location> locations = node.getRelationships(elementA, relationship);
+    expect(locations, hasLength(2));
+    _assertHasLocation(locations, elementB, 1, 10);
+    _assertHasLocation(locations, elementC, 2, 20);
+  }
+
+  Element _mockElement() {
+    int elementId = nextElementId++;
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(elementId);
+    when(elementCodec.decode(context, elementId)).thenReturn(element);
+    return element;
+  }
+}
+
+
+@ReflectiveTestCase()
+class _LocationDataTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  StringCodec stringCodec = new StringCodec();
+
+  void test_newForData() {
+    Element element = new MockElement();
+    when(elementCodec.decode(context, 0)).thenReturn(element);
+    LocationData locationData = new LocationData.forData(0, 1, 2);
+    Location location = locationData.getLocation(context, elementCodec);
+    expect(location.element, element);
+    expect(location.offset, 1);
+    expect(location.length, 2);
+  }
+
+  void test_newForObject() {
+    // prepare Element
+    Element element = new MockElement();
+    when(elementCodec.encode(element)).thenReturn(42);
+    when(elementCodec.decode(context, 42)).thenReturn(element);
+    // create
+    Location location = new Location(element, 1, 2);
+    LocationData locationData = new LocationData.forObject(elementCodec,
+        location);
+    // touch 'hashCode'
+    locationData.hashCode;
+    // ==
+    expect(locationData == new LocationData.forData(42, 1, 2), isTrue);
+    // getLocation()
+    {
+      Location newLocation = locationData.getLocation(context, elementCodec);
+      expect(location.element, element);
+      expect(location.offset, 1);
+      expect(location.length, 2);
+    }
+    // no Element - no Location
+    {
+      when(elementCodec.decode(context, 42)).thenReturn(null);
+      Location newLocation = locationData.getLocation(context, elementCodec);
+      expect(newLocation, isNull);
+    }
+  }
+}
+
+
+/**
+ * [Location] has no [==] and [hashCode], so to compare locations by value we
+ * need to wrap them into such object.
+ */
+class _LocationEqualsWrapper {
+  final Location location;
+
+  _LocationEqualsWrapper(this.location);
+
+  @override
+  int get hashCode {
+    return 31 * (31 * location.element.hashCode + location.offset) +
+        location.length;
+  }
+
+  @override
+  bool operator ==(Object other) {
+    if (other is _LocationEqualsWrapper) {
+      return other.location.offset == location.offset && other.location.length
+          == location.length && other.location.element == location.element;
+    }
+    return false;
+  }
+}
+
+
+class _MockFileManager extends TypedMock implements FileManager {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class _MockIndexNode extends TypedMock implements IndexNode {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+@ReflectiveTestCase()
+class _RelationKeyDataTest {
+  AnalysisContext context = new MockAnalysisContext('context');
+  ElementCodec elementCodec = new MockElementCodec();
+  RelationshipCodec relationshipCodec = new MockRelationshipCodec();
+  StringCodec stringCodec = new StringCodec();
+
+  void test_newFromData() {
+    RelationKeyData keyData = new RelationKeyData.forData(1, 2);
+    // equals
+    expect(keyData == this, isFalse);
+    expect(keyData == new RelationKeyData.forData(10, 20), isFalse);
+    expect(keyData == keyData, isTrue);
+    expect(keyData == new RelationKeyData.forData(1, 2), isTrue);
+  }
+
+  void test_newFromObjects() {
+    // prepare Element
+    Element element;
+    int elementId = 2;
+    {
+      element = new MockElement();
+      ElementLocation location = new ElementLocationImpl.con3(['foo', 'bar']);
+      when(element.location).thenReturn(location);
+      when(context.getElement(location)).thenReturn(element);
+      when(elementCodec.encode(element)).thenReturn(elementId);
+    }
+    // prepare relationship
+    Relationship relationship = Relationship.getRelationship('my-relationship');
+    int relationshipId = 1;
+    when(relationshipCodec.encode(relationship)).thenReturn(relationshipId);
+    // create RelationKeyData
+    RelationKeyData keyData = new RelationKeyData.forObject(elementCodec,
+        relationshipCodec, element, relationship);
+    // touch
+    keyData.hashCode;
+    // equals
+    expect(keyData == this, isFalse);
+    expect(keyData == new RelationKeyData.forData(10, 20), isFalse);
+    expect(keyData == keyData, isTrue);
+    expect(keyData == new RelationKeyData.forData(elementId, relationshipId),
+        isTrue);
+  }
+}
+
+
+
+
+@ReflectiveTestCase()
+class _SplitIndexStoreTest {
+  AnalysisContext contextA = new MockAnalysisContext('contextA');
+
+  AnalysisContext contextB = new MockAnalysisContext('contextB');
+
+  AnalysisContext contextC = new MockAnalysisContext('contextC');
+
+  Element elementA = new MockElement('elementA');
+  Element elementB = new MockElement('elementB');
+
+  Element elementC = new MockElement('elementC');
+  Element elementD = new MockElement('elementD');
+  ElementLocation elementLocationA = new ElementLocationImpl.con3(
+      ['/home/user/sourceA.dart', 'ClassA']);
+  ElementLocation elementLocationB = new ElementLocationImpl.con3(
+      ['/home/user/sourceB.dart', 'ClassB']);
+  ElementLocation elementLocationC = new ElementLocationImpl.con3(
+      ['/home/user/sourceC.dart', 'ClassC']);
+  ElementLocation elementLocationD = new ElementLocationImpl.con3(
+      ['/home/user/sourceD.dart', 'ClassD']);
+  HtmlElement htmlElementA = new MockHtmlElement();
+  HtmlElement htmlElementB = new MockHtmlElement();
+  LibraryElement libraryElement = new MockLibraryElement();
+  Source librarySource = new MockSource('librarySource');
+  CompilationUnitElement libraryUnitElement = new MockCompilationUnitElement();
+  MemoryNodeManager nodeManager = new MemoryNodeManager();
+  Relationship relationship = Relationship.getRelationship('test-relationship');
+  Source sourceA = new MockSource('sourceA');
+  Source sourceB = new MockSource('sourceB');
+  Source sourceC = new MockSource('sourceC');
+  Source sourceD = new MockSource('sourceD');
+  SplitIndexStore store;
+  CompilationUnitElement unitElementA = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementB = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementC = new MockCompilationUnitElement();
+  CompilationUnitElement unitElementD = new MockCompilationUnitElement();
+  void setUp() {
+    store = new SplitIndexStore(nodeManager);
+    when(contextA.isDisposed).thenReturn(false);
+    when(contextB.isDisposed).thenReturn(false);
+    when(contextC.isDisposed).thenReturn(false);
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextA.getElement(elementLocationB)).thenReturn(elementB);
+    when(contextA.getElement(elementLocationC)).thenReturn(elementC);
+    when(contextA.getElement(elementLocationD)).thenReturn(elementD);
+    when(sourceA.fullName).thenReturn('/home/user/sourceA.dart');
+    when(sourceB.fullName).thenReturn('/home/user/sourceB.dart');
+    when(sourceC.fullName).thenReturn('/home/user/sourceC.dart');
+    when(sourceD.fullName).thenReturn('/home/user/sourceD.dart');
+    when(elementA.context).thenReturn(contextA);
+    when(elementB.context).thenReturn(contextA);
+    when(elementC.context).thenReturn(contextA);
+    when(elementD.context).thenReturn(contextA);
+    when(elementA.location).thenReturn(elementLocationA);
+    when(elementB.location).thenReturn(elementLocationB);
+    when(elementC.location).thenReturn(elementLocationC);
+    when(elementD.location).thenReturn(elementLocationD);
+    when(elementA.enclosingElement).thenReturn(unitElementA);
+    when(elementB.enclosingElement).thenReturn(unitElementB);
+    when(elementC.enclosingElement).thenReturn(unitElementC);
+    when(elementD.enclosingElement).thenReturn(unitElementD);
+    when(elementA.source).thenReturn(sourceA);
+    when(elementB.source).thenReturn(sourceB);
+    when(elementC.source).thenReturn(sourceC);
+    when(elementD.source).thenReturn(sourceD);
+    when(elementA.library).thenReturn(libraryElement);
+    when(elementB.library).thenReturn(libraryElement);
+    when(elementC.library).thenReturn(libraryElement);
+    when(elementD.library).thenReturn(libraryElement);
+    when(unitElementA.source).thenReturn(sourceA);
+    when(unitElementB.source).thenReturn(sourceB);
+    when(unitElementC.source).thenReturn(sourceC);
+    when(unitElementD.source).thenReturn(sourceD);
+    when(unitElementA.library).thenReturn(libraryElement);
+    when(unitElementB.library).thenReturn(libraryElement);
+    when(unitElementC.library).thenReturn(libraryElement);
+    when(unitElementD.library).thenReturn(libraryElement);
+    when(htmlElementA.source).thenReturn(sourceA);
+    when(htmlElementB.source).thenReturn(sourceB);
+    // library
+    when(libraryUnitElement.library).thenReturn(libraryElement);
+    when(libraryUnitElement.source).thenReturn(librarySource);
+    when(libraryElement.source).thenReturn(librarySource);
+    when(libraryElement.definingCompilationUnit).thenReturn(libraryUnitElement);
+  }
+
+  void test_aboutToIndexDart_disposedContext() {
+    when(contextA.isDisposed).thenReturn(true);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_disposedContext_wrapped() {
+    when(contextA.isDisposed).thenReturn(true);
+    InstrumentedAnalysisContextImpl instrumentedContext =
+        new MockInstrumentedAnalysisContextImpl();
+    when(instrumentedContext.basis).thenReturn(contextA);
+    expect(store.aboutToIndexDart(instrumentedContext, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_library_first() {
+    when(libraryElement.parts).thenReturn(<CompilationUnitElement>[unitElementA,
+        unitElementB]);
+    {
+      store.aboutToIndexDart(contextA, libraryUnitElement);
+      store.doneIndex();
+    }
+    {
+      List<Location> locations = store.getRelationships(elementA, relationship);
+      assertLocations(locations, []);
+    }
+  }
+
+  test_aboutToIndexDart_library_secondWithoutOneUnit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // apply "libraryUnitElement", only with "B"
+      when(libraryElement.parts).thenReturn([unitElementB]);
+      {
+        store.aboutToIndexDart(contextA, libraryUnitElement);
+        store.doneIndex();
+      }
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  void test_aboutToIndexDart_nullLibraryElement() {
+    when(unitElementA.library).thenReturn(null);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_nullLibraryUnitElement() {
+    when(libraryElement.definingCompilationUnit).thenReturn(null);
+    expect(store.aboutToIndexDart(contextA, unitElementA), isFalse);
+  }
+
+  void test_aboutToIndexDart_nullUnitElement() {
+    expect(store.aboutToIndexDart(contextA, null), isFalse);
+  }
+
+  test_aboutToIndexHtml_() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexHtml(contextA, htmlElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexHtml(contextA, htmlElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  void test_aboutToIndexHtml_disposedContext() {
+    when(contextA.isDisposed).thenReturn(true);
+    expect(store.aboutToIndexHtml(contextA, htmlElementA), isFalse);
+  }
+
+  void test_clear() {
+    Location locationA = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isFalse);
+    // clear
+    store.clear();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  test_getRelationships_empty() {
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      expect(locations, isEmpty);
+    });
+  }
+
+  void test_getStatistics() {
+    // empty initially
+    {
+      String statistics = store.statistics;
+      expect(statistics, contains('0 locations'));
+      expect(statistics, contains('0 sources'));
+    }
+    // add 2 locations
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      String statistics = store.statistics;
+      expect(statistics, contains('2 locations'));
+      expect(statistics, contains('3 sources'));
+    }
+  }
+
+  void test_recordRelationship_nullElement() {
+    Location locationA = mockLocation(elementA);
+    store.recordRelationship(null, relationship, locationA);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  void test_recordRelationship_nullLocation() {
+    store.recordRelationship(elementA, relationship, null);
+    store.doneIndex();
+    expect(nodeManager.isEmpty(), isTrue);
+  }
+
+  test_recordRelationship_oneElement_twoNodes() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  test_recordRelationship_oneLocation() {
+    Location locationA = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.doneIndex();
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA]);
+    });
+  }
+
+  test_recordRelationship_twoLocations() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementA);
+    store.aboutToIndexDart(contextA, unitElementA);
+    store.recordRelationship(elementA, relationship, locationA);
+    store.recordRelationship(elementA, relationship, locationB);
+    store.doneIndex();
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    });
+  }
+
+  test_removeContext() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "A" context
+      store.removeContext(contextA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeContext_nullContext() {
+    store.removeContext(null);
+  }
+
+  test_removeSource_library() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "librarySource"
+      store.removeSource(contextA, librarySource);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeSource_nullContext() {
+    store.removeSource(null, sourceA);
+  }
+
+  test_removeSource_unit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "A" source
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB, locationC]);
+      });
+    });
+  }
+
+  test_removeSources_library() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    // "A" and "B" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "librarySource"
+      store.removeSources(contextA, new SingleSourceContainer(librarySource));
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, []);
+      });
+    });
+  }
+
+  void test_removeSources_nullContext() {
+    store.removeSources(null, null);
+  }
+
+  test_removeSources_unit() {
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    Location locationC = mockLocation(elementC);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(elementA, relationship, locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(elementA, relationship, locationB);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementC);
+      store.recordRelationship(elementA, relationship, locationC);
+      store.doneIndex();
+    }
+    // "A", "B" and "C" locations
+    return store.getRelationshipsAsync(elementA, relationship).then(
+        (List<Location> locations) {
+      assertLocations(locations, [locationA, locationB, locationC]);
+    }).then((_) {
+      // remove "A" source
+      store.removeSources(contextA, new SingleSourceContainer(sourceA));
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(elementA, relationship).then(
+          (List<Location> locations) {
+        assertLocations(locations, [locationB, locationC]);
+      });
+    });
+  }
+
+  test_universe_aboutToIndex() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextB, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    // get relationships
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // re-index "unitElementA"
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.doneIndex();
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  test_universe_clear() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // clear
+      store.clear();
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        expect(locations, isEmpty);
+      });
+    });
+  }
+
+  test_universe_removeContext() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextB, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "contextA"
+      store.removeContext(contextA);
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  test_universe_removeSource() {
+    when(contextA.getElement(elementLocationA)).thenReturn(elementA);
+    when(contextB.getElement(elementLocationB)).thenReturn(elementB);
+    Location locationA = mockLocation(elementA);
+    Location locationB = mockLocation(elementB);
+    {
+      store.aboutToIndexDart(contextA, unitElementA);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationA);
+      store.doneIndex();
+    }
+    {
+      store.aboutToIndexDart(contextA, unitElementB);
+      store.recordRelationship(UniverseElement.INSTANCE, relationship,
+          locationB);
+      store.doneIndex();
+    }
+    return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+        relationship).then((List<Location> locations) {
+      assertLocations(locations, [locationA, locationB]);
+    }).then((_) {
+      // remove "sourceA"
+      store.removeSource(contextA, sourceA);
+      return store.getRelationshipsAsync(UniverseElement.INSTANCE,
+          relationship).then((List<Location> locations) {
+        assertLocations(locations, [locationB]);
+      });
+    });
+  }
+
+  /**
+   * Asserts that the [actual] locations have all the [expected] locations and
+   * only them.
+   */
+  static void assertLocations(List<Location> actual, List<Location> expected) {
+    List<_LocationEqualsWrapper> actualWrappers = wrapLocations(actual);
+    List<_LocationEqualsWrapper> expectedWrappers = wrapLocations(expected);
+    expect(actualWrappers, unorderedEquals(expectedWrappers));
+  }
+
+  /**
+   * @return the new [Location] mock.
+   */
+  static Location mockLocation(Element element) {
+    Location location = new MockLocation();
+    when(location.element).thenReturn(element);
+    when(location.offset).thenReturn(0);
+    when(location.length).thenReturn(0);
+    return location;
+  }
+
+  /**
+   * Wraps the given locations into [LocationEqualsWrapper].
+   */
+  static List<_LocationEqualsWrapper> wrapLocations(List<Location> locations) {
+    List<_LocationEqualsWrapper> wrappers = <_LocationEqualsWrapper>[];
+    for (Location location in locations) {
+      wrappers.add(new _LocationEqualsWrapper(location));
+    }
+    return wrappers;
+  }
+}
diff --git a/pkg/analysis_server/test/index/store/test_all.dart b/pkg/analysis_server/test/index/store/test_all.dart
new file mode 100644
index 0000000..4e67d6b
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/test_all.dart
@@ -0,0 +1,26 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.store;
+
+import 'package:unittest/unittest.dart';
+
+import 'codec_test.dart' as codec_test;
+import 'collection_test.dart' as collection_test;
+import 'separate_file_manager_test.dart' as separate_file_manager_test;
+import 'split_store_test.dart' as split_store_test;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('store', () {
+    codec_test.main();
+    collection_test.main();
+    separate_file_manager_test.main();
+    split_store_test.main();
+  });
+}
diff --git a/pkg/analysis_server/test/index/store/typed_mocks.dart b/pkg/analysis_server/test/index/store/typed_mocks.dart
new file mode 100644
index 0000000..3ec5089
--- /dev/null
+++ b/pkg/analysis_server/test/index/store/typed_mocks.dart
@@ -0,0 +1,139 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.index.store.typed_mocks;
+
+import 'package:analysis_server/src/index/store/codec.dart';
+import 'package:analyzer/src/generated/element.dart';
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/index.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:typed_mock/typed_mock.dart';
+
+
+class MockAnalysisContext extends TypedMock implements AnalysisContext {
+  String _name;
+  MockAnalysisContext(this._name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class MockClassElement extends TypedMock implements ClassElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockCompilationUnitElement extends TypedMock implements
+    CompilationUnitElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockConstructorElement extends TypedMock implements
+    ConstructorElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockContextCodec extends TypedMock implements ContextCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockDartType extends StringTypedMock implements DartType {
+  MockDartType([String toString]) : super(toString);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockElement extends TypedMock implements Element {
+  String _name;
+  MockElement([this._name = '<element>']);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class MockElementCodec extends TypedMock implements ElementCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockFieldElement extends TypedMock implements FieldElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockHtmlElement extends TypedMock implements HtmlElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockInstrumentedAnalysisContextImpl extends TypedMock implements
+    InstrumentedAnalysisContextImpl {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLibraryElement extends TypedMock implements LibraryElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLocation extends TypedMock implements Location {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockLogger extends TypedMock implements Logger {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockMethodElement extends TypedMock implements MethodElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockParameterElement extends StringTypedMock implements ParameterElement {
+  MockParameterElement([String toString]) : super(toString);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockPropertyAccessorElement extends TypedMock implements
+    PropertyAccessorElement {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockRelationshipCodec extends TypedMock implements RelationshipCodec {
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+}
+
+
+class MockSource extends TypedMock implements Source {
+  String _name;
+  MockSource(this._name);
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+  String toString() => _name;
+}
+
+
+class StringTypedMock extends TypedMock {
+  String _toString;
+
+  StringTypedMock(this._toString);
+
+  noSuchMethod(Invocation invocation) => super.noSuchMethod(invocation);
+
+  @override
+  String toString() {
+    if (_toString != null) {
+      return _toString;
+    }
+    return super.toString();
+  }
+}
diff --git a/pkg/analysis_server/test/index/test_all.dart b/pkg/analysis_server/test/index/test_all.dart
new file mode 100644
index 0000000..bb601f9
--- /dev/null
+++ b/pkg/analysis_server/test/index/test_all.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library test.index.all;
+
+import 'package:unittest/unittest.dart';
+
+import 'b_plus_tree_test.dart' as b_plus_tree_test;
+import 'file_page_manager_test.dart' as file_page_manager_test;
+import 'index_test.dart' as index_test;
+import 'lru_cache_test.dart' as lru_cache_test;
+import 'page_node_manager_test.dart' as page_node_manager_test;
+import 'store/test_all.dart' as store_test_all;
+
+
+/**
+ * Utility for manually running all tests.
+ */
+main() {
+  groupSep = ' | ';
+  group('index', () {
+    b_plus_tree_test.main();
+    page_node_manager_test.main();
+    file_page_manager_test.main();
+    index_test.main();
+    lru_cache_test.main();
+    store_test_all.main();
+  });
+}
\ No newline at end of file
diff --git a/pkg/analysis_server/test/mocks.dart b/pkg/analysis_server/test/mocks.dart
index f8f3f9a..ed6da26 100644
--- a/pkg/analysis_server/test/mocks.dart
+++ b/pkg/analysis_server/test/mocks.dart
@@ -10,16 +10,20 @@
 @MirrorsUsed(targets: 'mocks', override: '*')
 import 'dart:mirrors';
 
-import 'package:analyzer/src/generated/engine.dart';
-import 'package:analyzer/src/generated/source.dart';
 import 'package:analysis_server/src/analysis_server.dart';
 import 'package:analysis_server/src/channel.dart';
+import 'package:analysis_server/src/operation/operation_analysis.dart';
+import 'package:analysis_server/src/operation/operation.dart';
+import 'package:analysis_server/src/package_map_provider.dart';
 import 'package:analysis_server/src/protocol.dart';
+import 'package:analysis_server/src/resource.dart' as resource;
+import 'package:analyzer/src/generated/engine.dart';
+import 'package:analyzer/src/generated/sdk.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:matcher/matcher.dart';
 import 'package:mock/mock.dart';
 import 'package:unittest/unittest.dart';
-import 'package:analysis_server/src/operation/operation_analysis.dart';
-import 'package:analysis_server/src/operation/operation.dart';
+import 'package:analyzer/src/generated/index.dart';
 
 /**
  * Answer the absolute path the the SDK relative to the currently running
@@ -211,6 +215,10 @@
   @override
   void sendNotices(AnalysisServer server, List<ChangeNotice> notices) {
   }
+
+  @override
+  void updateIndex(Index index, List<ChangeNotice> notices) {
+  }
 }
 
 
@@ -294,3 +302,131 @@
     return mismatchDescription;
   }
 }
+
+class MockSdk implements DartSdk {
+
+  final resource.MemoryResourceProvider provider = new resource.MemoryResourceProvider();
+
+  MockSdk() {
+    // TODO(paulberry): Add to this as needed.
+    const Map<String, String> pathToContent = const {
+      "/lib/core/core.dart": '''
+          library dart.core;
+          class Object {}
+          class Function {}
+          class StackTrace {}
+          class Symbol {}
+          class Type {}
+
+          class String extends Object {}
+          class bool extends Object {}
+          abstract class num extends Object {
+            num operator +(num other);
+            num operator -(num other);
+            num operator *(num other);
+            num operator /(num other);
+          }
+          abstract class int extends num {
+            int operator -();
+          }
+          class double extends num {}
+          class DateTime extends Object {}
+          class Null extends Object {}
+
+          class Deprecated extends Object {
+            final String expires;
+            const Deprecated(this.expires);
+          }
+          const Object deprecated = const Deprecated("next release");
+
+          abstract class List<E> extends Object {
+            void add(E value);
+            E operator [](int index);
+            void operator []=(int index, E value);
+          }
+          class Map<K, V> extends Object {}
+
+          void print(Object object) {}
+          ''',
+
+      "/lib/html/dartium/html_dartium.dart": '''
+          library dart.html;
+          class HtmlElement {}
+          ''',
+
+      "/lib/math/math.dart": '''
+          library dart.math;
+          '''
+    };
+
+    pathToContent.forEach((String path, String content) {
+      provider.newFile(path, content);
+    });
+  }
+
+  // Not used
+  @override
+  AnalysisContext get context => throw unimplemented;
+
+  @override
+  Source fromEncoding(UriKind kind, Uri uri) {
+    resource.Resource file = provider.getResource(uri.path);
+    if (file is resource.File) {
+      return file.createSource(kind);
+    }
+    return null;
+  }
+
+  UnimplementedError get unimplemented => new UnimplementedError();
+
+  @override
+  SdkLibrary getSdkLibrary(String dartUri) {
+    // getSdkLibrary() is only used to determine whether a library is internal
+    // to the SDK.  The mock SDK doesn't have any internals, so it's safe to
+    // return null.
+    return null;
+  }
+
+  @override
+  Source mapDartUri(String dartUri) {
+    const Map<String, String> uriToPath = const {
+      "dart:core": "/lib/core/core.dart",
+      "dart:html": "/lib/html/dartium/html_dartium.dart",
+      "dart:math": "/lib/math/math.dart"
+    };
+
+    String path = uriToPath[dartUri];
+    if (path != null) {
+      resource.File file = provider.getResource(path);
+      return file.createSource(UriKind.DART_URI);
+    }
+
+    // If we reach here then we tried to use a dartUri that's not in the
+    // table above.
+    throw unimplemented;
+  }
+
+  // Not used.
+  @override
+  List<SdkLibrary> get sdkLibraries => throw unimplemented;
+
+  // Not used.
+  @override
+  String get sdkVersion => throw unimplemented;
+
+  // Not used.
+  @override
+  List<String> get uris => throw unimplemented;
+}
+
+/**
+ * A mock [PackageMapProvider].
+ */
+class MockPackageMapProvider implements PackageMapProvider {
+  Map<String, List<resource.Folder>> packageMap = <String, List<resource.Folder>>{};
+
+  @override
+  Map<String, List<resource.Folder>> computePackageMap(resource.Folder folder) {
+    return packageMap;
+  }
+}
diff --git a/pkg/analysis_server/test/operation/operation_queue_test.dart b/pkg/analysis_server/test/operation/operation_queue_test.dart
index 2b05e14..32dcd78 100644
--- a/pkg/analysis_server/test/operation/operation_queue_test.dart
+++ b/pkg/analysis_server/test/operation/operation_queue_test.dart
@@ -54,8 +54,7 @@
       });
 
       test('use operation priorities', () {
-        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
-        when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false);
+        when(server.isPriorityContext(anyObject)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = mockOperation(ServerOperationPriority.SEARCH);
         var operationB = mockOperation(ServerOperationPriority.REFACTORING);
@@ -70,8 +69,7 @@
       });
 
       test('continue analysis first', () {
-        // TODO(scheglov) update 'typed_mock' to make 'any*' fields dynamic
-        when(server.isPriorityContext(anyObject as dynamic)).thenReturn(false);
+        when(server.isPriorityContext(anyObject)).thenReturn(false);
         var analysisContext = new AnalysisContextMock();
         var operationA = new PerformAnalysisOperation(analysisContext, false);
         var operationB = new PerformAnalysisOperation(analysisContext, true);
diff --git a/pkg/analysis_server/test/package_map_provider_test.dart b/pkg/analysis_server/test/package_map_provider_test.dart
new file mode 100644
index 0000000..f7567b0
--- /dev/null
+++ b/pkg/analysis_server/test/package_map_provider_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 test.package.map.provider;
+
+import 'dart:convert';
+
+import 'package:analysis_server/src/package_map_provider.dart';
+import 'package:unittest/unittest.dart';
+import 'package:analysis_server/src/resource.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('PubPackageMapProvider', () {
+    group('parsePackageMap', () {
+      MemoryResourceProvider resourceProvider;
+      PubPackageMapProvider packageMapProvider;
+
+      setUp(() {
+        resourceProvider = new MemoryResourceProvider();
+        packageMapProvider = new PubPackageMapProvider(resourceProvider);
+      });
+
+      test('normal folder', () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        resourceProvider.newFolder(folderPath);
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: folderPath}}));
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(1));
+        expect(result[packageName][0], new isInstanceOf<Folder>());
+        expect(result[packageName][0].path, equals(folderPath));
+      });
+
+      test('ignore nonexistent folder', () {
+        String packageName = 'foo';
+        String folderPath = '/path/to/folder';
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: folderPath}}));
+        expect(result, hasLength(0));
+      });
+
+      test('package maps to list', () {
+        String packageName = 'foo';
+        String folderPath1 = '/path/to/folder1';
+        String folderPath2 = '/path/to/folder2';
+        resourceProvider.newFolder(folderPath1);
+        resourceProvider.newFolder(folderPath2);
+        Map<String, List<Folder>> result = packageMapProvider.parsePackageMap(
+            JSON.encode({'packages': {packageName: [folderPath1, folderPath2]}}));
+        expect(result, hasLength(1));
+        expect(result.keys, contains(packageName));
+        expect(result[packageName], hasLength(2));
+        for (int i = 0; i < 2; i++) {
+          expect(result[packageName][i], new isInstanceOf<Folder>());
+          expect(result[packageName][i].path, isIn([folderPath1, folderPath2]));
+        }
+      });
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/package_uri_resolver_test.dart b/pkg/analysis_server/test/package_uri_resolver_test.dart
new file mode 100644
index 0000000..f059fdc
--- /dev/null
+++ b/pkg/analysis_server/test/package_uri_resolver_test.dart
@@ -0,0 +1,159 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.resolver.package;
+
+import 'package:analysis_server/src/package_uri_resolver.dart';
+import 'package:analysis_server/src/resource.dart';
+import 'package:analyzer/src/generated/source.dart';
+import 'package:unittest/unittest.dart';
+
+import 'reflective_tests.dart';
+
+main() {
+  groupSep = ' | ';
+
+  group('PackageMapUriResolver', () {
+    runReflectiveTests(_PackageMapUriResolverTest);
+  });
+}
+
+
+@ReflectiveTestCase()
+class _PackageMapUriResolverTest {
+  static const EMPTY_MAP = const <String, List<Folder>>{};
+  MemoryResourceProvider provider = new MemoryResourceProvider();
+
+  setUp() {
+  }
+
+  tearDown() {
+  }
+
+  void test_isPackageUri() {
+    Uri uri = Uri.parse('package:test/test.dart');
+    expect(uri.scheme, 'package');
+    expect(PackageMapUriResolver.isPackageUri(uri), isTrue);
+  }
+
+  void test_fromEncoding_nonPackage() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('file:/does/not/exist.dart');
+    Source result = resolver.fromEncoding(UriKind.DART_URI, uri);
+    expect(result, isNull);
+  }
+
+  void test_fromEncoding_package() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/does/not/exist.dart');
+    Source result = resolver.fromEncoding(UriKind.PACKAGE_URI, uri);
+    expect(result, isNotNull);
+    expect(result.fullName, '/does/not/exist.dart');
+  }
+
+  void test_isPackageUri_null_scheme() {
+    Uri uri = Uri.parse('foo.dart');
+    expect(uri.scheme, '');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_isPackageUri_other_scheme() {
+    Uri uri = Uri.parse('memfs:/foo.dart');
+    expect(uri.scheme, 'memfs');
+    expect(PackageMapUriResolver.isPackageUri(uri), isFalse);
+  }
+
+  void test_resolve_OK() {
+    const pkgFileA = '/pkgA/lib/libA.dart';
+    const pkgFileB = '/pkgB/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a;');
+    provider.newFile(pkgFileB, 'library lib_b;');
+    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
+        <String, List<Folder>>{
+      'pkgA': [provider.getResource('/pkgA/lib/')],
+      'pkgB': [provider.getResource('/pkgB/lib/')]
+    });
+    {
+      Uri uri = Uri.parse('package:pkgA/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkgB/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_multiple_folders() {
+    const pkgFileA = '/part1/lib/libA.dart';
+    const pkgFileB = '/part2/lib/libB.dart';
+    provider.newFile(pkgFileA, 'library lib_a');
+    provider.newFile(pkgFileB, 'library lib_b');
+    PackageMapUriResolver resolver = new PackageMapUriResolver(provider,
+        <String, List<Folder>>{
+      'pkg': [provider.getResource('/part1/lib/'),
+              provider.getResource('/part2/lib/')]
+    });
+    {
+      Uri uri = Uri.parse('package:pkg/libA.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileA);
+    }
+    {
+      Uri uri = Uri.parse('package:pkg/libB.dart');
+      Source result = resolver.resolveAbsolute(uri);
+      expect(result, isNotNull);
+      expect(result.exists(), isTrue);
+      expect(result.uriKind, UriKind.PACKAGE_URI);
+      expect(result.fullName, pkgFileB);
+    }
+  }
+
+  void test_resolve_nonPackage() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('dart:core');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_leadingSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_noSlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:foo');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_invalid_onlySlash() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:/');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNull);
+  }
+
+  void test_resolve_package_notInMap() {
+    UriResolver resolver = new PackageMapUriResolver(provider, EMPTY_MAP);
+    Uri uri = Uri.parse('package:analyzer/analyzer.dart');
+    Source result = resolver.resolveAbsolute(uri);
+    expect(result, isNotNull);
+    expect(result.exists(), isFalse);
+    expect(result.fullName, 'package:analyzer/analyzer.dart');
+  }
+}
diff --git a/pkg/analysis_server/test/physical_resource_provider_test.dart b/pkg/analysis_server/test/physical_resource_provider_test.dart
index e3dfdc7..63f0a0d 100644
--- a/pkg/analysis_server/test/physical_resource_provider_test.dart
+++ b/pkg/analysis_server/test/physical_resource_provider_test.dart
@@ -32,6 +32,9 @@
       group('Watch', () {
 
         Future delayed(computation()) {
+          // Give the tests 1 second to detect the changes. While it may only
+          // take up to a few hundred ms, a whole second gives a good margin
+          // for when running tests.
           return new Future.delayed(
               new Duration(seconds: 1), computation);
         }
diff --git a/pkg/analysis_server/test/protocol_test.dart b/pkg/analysis_server/test/protocol_test.dart
index 79c394b..985a8b3 100644
--- a/pkg/analysis_server/test/protocol_test.dart
+++ b/pkg/analysis_server/test/protocol_test.dart
@@ -9,244 +9,39 @@
 import 'package:analysis_server/src/protocol.dart';
 import 'package:unittest/unittest.dart';
 
-import 'declarative_tests.dart';
+import 'reflective_tests.dart';
+
+
+Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
+
 
 main() {
-  addTestSuite(NotificationTest);
-  addTestSuite(RequestTest);
-  addTestSuite(RequestErrorTest);
-  addTestSuite(RequestDatumTest);
-  addTestSuite(ResponseTest);
+  groupSep = ' | ';
+  group('Notification', () {
+    runReflectiveTests(NotificationTest);
+  });
+  group('Request', () {
+    runReflectiveTests(RequestTest);
+  });
+  group('RequestError', () {
+    runReflectiveTests(RequestErrorTest);
+  });
+  group('RequestDatum', () {
+    runReflectiveTests(RequestDatumTest);
+  });
+  group('Response', () {
+    runReflectiveTests(ResponseTest);
+  });
 }
 
-class NotificationTest {
-  @runTest
-  static void getParameter_defined() {
-    Notification notification = new Notification('foo');
-    notification.setParameter('x', 'y');
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
-    expect(notification.toJson(), equals({
-      'event' : 'foo',
-      'params' : {'x' : 'y'}
-    }));
-  }
 
-  @runTest
-  static void getParameter_undefined() {
-    Notification notification = new Notification('foo');
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
-    expect(notification.toJson(), equals({
-      'event' : 'foo'
-    }));
-  }
-
-  @runTest
-  static void fromJson() {
-    Notification original = new Notification('foo');
-    Notification notification = new Notification.fromJson(original.toJson());
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(0));
-    expect(notification.getParameter('x'), isNull);
-  }
-
-  @runTest
-  static void fromJson_withParams() {
-    Notification original = new Notification('foo');
-    original.setParameter('x', 'y');
-    Notification notification = new Notification.fromJson(original.toJson());
-    expect(notification.event, equals('foo'));
-    expect(notification.params.length, equals(1));
-    expect(notification.getParameter('x'), equals('y'));
-  }
-}
-
-class RequestTest {
-  @runTest
-  static void getParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getParameter(name, null).datum, equals(value));
-  }
-
-  @runTest
-  static void getParameter_undefined() {
-    String name = 'name';
-    String defaultValue = 'default value';
-    Request request = new Request('0', '');
-    expect(request.getParameter(name, defaultValue).datum, equals(defaultValue));
-  }
-
-  @runTest
-  static void getRequiredParameter_defined() {
-    String name = 'name';
-    String value = 'value';
-    Request request = new Request('0', '');
-    request.setParameter(name, value);
-    expect(request.getRequiredParameter(name).datum, equals(value));
-  }
-
-  @runTest
-  static void getRequiredParameter_undefined() {
-    String name = 'name';
-    Request request = new Request('0', '');
-    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
-  }
-
-  @runTest
-  static void fromJson() {
-    Request original = new Request('one', 'aMethod');
-    String json = JSON.encode(original.toJson());
-    Request request = new Request.fromString(json);
-    expect(request.id, equals('one'));
-    expect(request.method, equals('aMethod'));
-  }
-
-  @runTest
-  static void fromJson_invalidId() {
-    String json = '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_invalidMethod() {
-    String json = '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_invalidParams() {
-    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
-    Request request = new Request.fromString(json);
-    expect(request, isNull);
-  }
-
-  @runTest
-  static void fromJson_withParams() {
-    Request original = new Request('one', 'aMethod');
-    original.setParameter('foo', 'bar');
-    String json = JSON.encode(original.toJson());
-    Request request = new Request.fromString(json);
-    expect(request.id, equals('one'));
-    expect(request.method, equals('aMethod'));
-    expect(request.getParameter('foo', null).asString(), equals('bar'));
-  }
-
-  @runTest
-  static void toJson() {
-    Request request = new Request('one', 'aMethod');
-    expect(request.toJson(), equals({
-      Request.ID : 'one',
-      Request.METHOD : 'aMethod'
-    }));
-  }
-
-  @runTest
-  static void toJson_withParams() {
-    Request request = new Request('one', 'aMethod');
-    request.setParameter('foo', 'bar');
-    expect(request.toJson(), equals({
-      Request.ID : 'one',
-      Request.METHOD : 'aMethod',
-      Request.PARAMS : {'foo' : 'bar'}
-    }));
-  }
-}
-
-class RequestErrorTest {
-  @runTest
-  static void create() {
-    RequestError error = new RequestError(42, 'msg');
-    expect(error.code, 42);
-    expect(error.message, "msg");
-    expect(error.toJson(), equals({
-      RequestError.CODE: 42,
-      RequestError.MESSAGE: "msg"
-    }));
-  }
-
-  @runTest
-  static void create_parseError() {
-    RequestError error = new RequestError.parseError();
-    expect(error.code, RequestError.CODE_PARSE_ERROR);
-    expect(error.message, "Parse error");
-  }
-
-  @runTest
-  static void create_methodNotFound() {
-    RequestError error = new RequestError.methodNotFound();
-    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
-    expect(error.message, "Method not found");
-  }
-
-  @runTest
-  static void create_invalidParameters() {
-    RequestError error = new RequestError.invalidParameters();
-    expect(error.code, RequestError.CODE_INVALID_PARAMS);
-    expect(error.message, "Invalid parameters");
-  }
-
-  @runTest
-  static void create_invalidRequest() {
-    RequestError error = new RequestError.invalidRequest();
-    expect(error.code, RequestError.CODE_INVALID_REQUEST);
-    expect(error.message, "Invalid request");
-  }
-
-  @runTest
-  static void create_internalError() {
-    RequestError error = new RequestError.internalError();
-    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
-    expect(error.message, "Internal error");
-  }
-
-  @runTest
-  static void create_serverAlreadyStarted() {
-    RequestError error = new RequestError.serverAlreadyStarted();
-    expect(error.code, RequestError.CODE_SERVER_ALREADY_STARTED);
-    expect(error.message, "Server already started");
-  }
-
-  @runTest
-  static void fromJson() {
-    var json = {
-        RequestError.CODE: RequestError.CODE_PARSE_ERROR,
-        RequestError.MESSAGE: 'foo',
-        RequestError.DATA: {'ints': [1, 2, 3]}
-    };
-    RequestError error = new RequestError.fromJson(json);
-    expect(error.code, RequestError.CODE_PARSE_ERROR);
-    expect(error.message, "foo");
-    expect(error.data['ints'], [1, 2, 3]);
-    expect(error.getData('ints'), [1, 2, 3]);
-  }
-
-  @runTest
-  static void toJson() {
-    RequestError error = new RequestError(0, 'msg');
-    error.setData('answer', 42);
-    error.setData('question', 'unknown');
-    expect(error.toJson(), {
-        RequestError.CODE: 0,
-        RequestError.MESSAGE: 'msg',
-        RequestError.DATA: {'answer': 42, 'question': 'unknown'}
-    });
-  }
-}
-
+@ReflectiveTestCase()
 class InvalidParameterResponseMatcher extends Matcher {
   static const int ERROR_CODE = -2;
 
   @override
-  Description describe(Description description) =>
-      description.add("an 'invalid parameter' response (code $ERROR_CODE)");
+  Description describe(Description description) => description.add(
+      "an 'invalid parameter' response (code $ERROR_CODE)");
 
   @override
   bool matches(item, Map matchState) {
@@ -268,110 +63,66 @@
   }
 }
 
-class RequestDatumTest {
-  static Request request;
 
+@ReflectiveTestCase()
+class NotificationTest {
+  void test_fromJson() {
+    Notification original = new Notification('foo');
+    Notification notification = new Notification.fromJson(original.toJson());
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(0));
+    expect(notification.getParameter('x'), isNull);
+  }
+
+  void test_fromJson_withParams() {
+    Notification original = new Notification('foo');
+    original.setParameter('x', 'y');
+    Notification notification = new Notification.fromJson(original.toJson());
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(1));
+    expect(notification.getParameter('x'), equals('y'));
+  }
+
+  void test_getParameter_defined() {
+    Notification notification = new Notification('foo');
+    notification.setParameter('x', 'y');
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(1));
+    expect(notification.getParameter('x'), equals('y'));
+    expect(notification.toJson(), equals({
+      'event': 'foo',
+      'params': {
+        'x': 'y'
+      }
+    }));
+  }
+
+  void test_getParameter_undefined() {
+    Notification notification = new Notification('foo');
+    expect(notification.event, equals('foo'));
+    expect(notification.params.length, equals(0));
+    expect(notification.getParameter('x'), isNull);
+    expect(notification.toJson(), equals({
+      'event': 'foo'
+    }));
+  }
+}
+
+
+@ReflectiveTestCase()
+class RequestDatumTest {
+  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>(
+      "RequestDatum");
+
+  static Request request;
   static Matcher _throwsInvalidParameter = throwsA(
       new InvalidParameterResponseMatcher());
-  static Matcher isRequestDatum = new isInstanceOf<RequestDatum>("RequestDatum"
-      );
 
-  static void setUp() {
+  void setUp() {
     request = new Request('myId', 'myMethod');
   }
 
-  static RequestDatum makeDatum(dynamic datum) {
-    return new RequestDatum(request, 'myPath', datum);
-  }
-
-  @runTest
-  static void indexOperator_nonMap() {
-    setUp();
-    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void indexOperator_missingKey() {
-    setUp();
-    expect(() => makeDatum({
-      'foo': 'bar'
-    })['baz'], _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void indexOperator_hasKey() {
-    setUp();
-    var indexResult = makeDatum({
-      'foo': 'bar'
-    })['foo'];
-    expect(indexResult, isRequestDatum);
-    expect(indexResult.datum, equals('bar'));
-    expect(indexResult.path, equals('myPath.foo'));
-  }
-
-  @runTest
-  static void hasKey() {
-    setUp();
-    var datum = makeDatum({
-      'foo': 'bar'
-    });
-    expect(datum.hasKey('foo'), isTrue);
-    expect(datum.hasKey('bar'), isFalse);
-    expect(datum.hasKey('baz'), isFalse);
-  }
-
-  @runTest
-  static void forEachMap_nonMap() {
-    setUp();
-    expect(() => makeDatum(1).forEachMap((key, value) {
-      fail('Non-map should not be iterated');
-    }), _throwsInvalidParameter);
-  }
-
-  @runTest
-  static void forEachMap_emptyMap() {
-    setUp();
-    makeDatum({}).forEachMap((key, value) {
-      fail('Empty map should not be iterated');
-    });
-  }
-
-  @runTest
-  static void forEachMap_oneElementMap() {
-    setUp();
-    int callCount = 0;
-    makeDatum({
-      'key': 'value'
-    }).forEachMap((key, value) {
-      callCount++;
-      expect(key, equals('key'));
-      expect(value, isRequestDatum);
-      expect(value.datum, equals('value'));
-    });
-    expect(callCount, equals(1));
-  }
-
-  @runTest
-  static void forEachMap_twoElementMap() {
-    setUp();
-    int callCount = 0;
-    Map<String, String> map = {
-      'key1': 'value1',
-      'key2': 'value2'
-    };
-    Map iterationResult = {};
-    makeDatum(map).forEachMap((key, value) {
-      callCount++;
-      expect(value, isRequestDatum);
-      iterationResult[key] = value.datum;
-    });
-    expect(callCount, equals(2));
-    expect(iterationResult, equals(map));
-  }
-
-  @runTest
-  static void asBool() {
-    setUp();
+  void test_asBool() {
     expect(makeDatum(true).asBool(), isTrue);
     expect(makeDatum(false).asBool(), isFalse);
     expect(makeDatum('true').asBool(), isTrue);
@@ -379,56 +130,77 @@
     expect(() => makeDatum('abc').asBool(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asInt() {
-    setUp();
+  void test_asInt() {
     expect(makeDatum(1).asInt(), equals(1));
     expect(makeDatum('2').asInt(), equals(2));
     expect(() => makeDatum('xxx').asInt(), _throwsInvalidParameter);
     expect(() => makeDatum(true).asInt(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asString() {
-    setUp();
+  void test_asList_emptyList() {
+    expect(makeDatum([]).asList((datum) => datum.asString()), equals([]));
+  }
+
+  void test_asList_nonEmptyList() {
+    expect(makeDatum(['foo', 'bar']).asList((datum) => datum.asString()),
+        equals(['foo', 'bar']));
+  }
+
+  void test_isList() {
+    expect(makeDatum(3).isList, isFalse);
+    expect(makeDatum(null).isList, isTrue);
+    expect(makeDatum([]).isList, isTrue);
+    expect(makeDatum(['foo', 'bar']).isList, isTrue);
+  }
+
+  void test_asList_nonList() {
+    expect(() => makeDatum(3).asList((datum) => null), _throwsInvalidParameter);
+  }
+
+  void test_asList_null() {
+    expect(makeDatum(null).asList((datum) => datum.asString()), equals([]));
+  }
+
+  void test_asString() {
     expect(makeDatum('foo').asString(), equals('foo'));
     expect(() => makeDatum(3).asString(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asStringList() {
-    setUp();
+  void test_isStringList() {
+    expect(makeDatum(['foo', 'bar']).isStringList, isTrue);
+    expect(makeDatum([]).isStringList, isTrue);
+    expect(makeDatum(null).isStringList, isTrue);
+    expect(makeDatum(['foo', 1]).isStringList, isFalse);
+    expect(makeDatum({}).isStringList, isFalse);
+  }
+
+  void test_asStringList() {
     expect(makeDatum(['foo', 'bar']).asStringList(), equals(['foo', 'bar']));
     expect(makeDatum([]).asStringList(), equals([]));
+    expect(makeDatum(null).asStringList(), equals([]));
     expect(() => makeDatum(['foo', 1]).asStringList(), _throwsInvalidParameter);
     expect(() => makeDatum({}).asStringList(), _throwsInvalidParameter);
   }
 
-  @runTest
-  static void asStringMap() {
-    setUp();
+  void test_isStringListMap() {
     expect(makeDatum({
-      'key1': 'value1',
-      'key2': 'value2'
-    }).asStringMap(), equals({
-      'key1': 'value1',
-      'key2': 'value2'
-    }));
-    expect(makeDatum({}).asStringMap(), equals({}));
-    expect(() => makeDatum({
-      'key1': 'value1',
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum({
-      'key1': 1,
-      'key2': 2
-    }).asStringMap(), _throwsInvalidParameter);
-    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
+      'key1': ['value11', 'value12'],
+      'key2': ['value21', 'value22']
+    }).isStringListMap, isTrue);
+    expect(makeDatum({
+      'key1': 10,
+      'key2': 20
+    }).isStringListMap, isFalse);
+    expect(makeDatum({
+      'key1': [11, 12],
+      'key2': [21, 22]
+    }).isStringListMap, isFalse);
+    expect(makeDatum({}).isStringListMap, isTrue);
+    expect(makeDatum(null).isStringListMap, isTrue);
+    expect(makeDatum(3).isStringListMap, isFalse);
   }
 
-  @runTest
-  static void asStringListMap() {
-    setUp();
+  void test_asStringListMap() {
     {
       var map = {
         'key1': ['value11', 'value12'],
@@ -451,66 +223,447 @@
       expect(() => makeDatum(map).asStringListMap(), _throwsInvalidParameter);
     }
   }
+
+  void test_isMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isMap, isTrue);
+    expect(makeDatum({}).isMap, isTrue);
+    expect(makeDatum(null).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isMap, isTrue);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
+  void test_isStringMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).isStringMap, isTrue);
+    expect(makeDatum({}).isStringMap, isTrue);
+    expect(makeDatum(null).isStringMap, isTrue);
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).isStringMap, isFalse);
+    expect(makeDatum([]).isMap, isFalse);
+  }
+
+  void test_asStringMap() {
+    expect(makeDatum({
+      'key1': 'value1',
+      'key2': 'value2'
+    }).asStringMap(), equals({
+      'key1': 'value1',
+      'key2': 'value2'
+    }));
+    expect(makeDatum({}).asStringMap(), equals({}));
+    expect(() => makeDatum({
+      'key1': 'value1',
+      'key2': 2
+    }).asStringMap(), _throwsInvalidParameter);
+    expect(() => makeDatum({
+      'key1': 1,
+      'key2': 2
+    }).asStringMap(), _throwsInvalidParameter);
+    expect(() => makeDatum([]).asStringMap(), _throwsInvalidParameter);
+  }
+
+  void test_forEachMap_emptyMap() {
+    makeDatum({}).forEachMap((key, value) {
+      fail('Empty map should not be iterated');
+    });
+  }
+
+  void test_forEachMap_nonMap() {
+    expect(() => makeDatum(1).forEachMap((key, value) {
+      fail('Non-map should not be iterated');
+    }), _throwsInvalidParameter);
+  }
+
+   void test_forEachMap_null() {
+    makeDatum(null).forEachMap((key, value) {
+      fail('Empty map should not be iterated');
+    });
+  }
+
+  void test_forEachMap_oneElementMap() {
+    int callCount = 0;
+    makeDatum({
+      'key': 'value'
+    }).forEachMap((key, value) {
+      callCount++;
+      expect(key, equals('key'));
+      expect(value, isRequestDatum);
+      expect(value.datum, equals('value'));
+    });
+    expect(callCount, equals(1));
+  }
+
+  void test_forEachMap_twoElementMap() {
+    int callCount = 0;
+    Map<String, String> map = {
+      'key1': 'value1',
+      'key2': 'value2'
+    };
+    Map iterationResult = {};
+    makeDatum(map).forEachMap((key, value) {
+      callCount++;
+      expect(value, isRequestDatum);
+      iterationResult[key] = value.datum;
+    });
+    expect(callCount, equals(2));
+    expect(iterationResult, equals(map));
+  }
+
+  void test_hasKey() {
+    var datum = makeDatum({
+      'foo': 'bar'
+    });
+    expect(datum.hasKey('foo'), isTrue);
+    expect(datum.hasKey('bar'), isFalse);
+    expect(datum.hasKey('baz'), isFalse);
+  }
+
+  void test_hasKey_null() {
+    expect(makeDatum(null).hasKey('foo'), isFalse);
+  }
+
+  void test_indexOperator_hasKey() {
+    var indexResult = makeDatum({
+      'foo': 'bar'
+    })['foo'];
+    expect(indexResult, isRequestDatum);
+    expect(indexResult.datum, equals('bar'));
+    expect(indexResult.path, equals('myPath.foo'));
+  }
+
+  void test_indexOperator_null() {
+    expect(() => makeDatum(null)['foo'], _throwsInvalidParameter);
+  }
+
+  void test_indexOperator_missingKey() {
+    expect(() => makeDatum({
+      'foo': 'bar'
+    })['baz'], _throwsInvalidParameter);
+  }
+
+  void test_indexOperator_nonMap() {
+    expect(() => makeDatum(1)['foo'], _throwsInvalidParameter);
+  }
+
+  static RequestDatum makeDatum(dynamic datum) {
+    return new RequestDatum(request, 'myPath', datum);
+  }
 }
 
+
+@ReflectiveTestCase()
+class RequestErrorTest {
+  void test_create() {
+    RequestError error = new RequestError(42, 'msg');
+    expect(error.code, 42);
+    expect(error.message, "msg");
+    expect(error.toJson(), equals({
+      RequestError.CODE: 42,
+      RequestError.MESSAGE: "msg"
+    }));
+  }
+
+  void test_create_internalError() {
+    RequestError error = new RequestError.internalError();
+    expect(error.code, RequestError.CODE_INTERNAL_ERROR);
+    expect(error.message, "Internal error");
+  }
+
+  void test_create_invalidParameters() {
+    RequestError error = new RequestError.invalidParameters();
+    expect(error.code, RequestError.CODE_INVALID_PARAMS);
+    expect(error.message, "Invalid parameters");
+  }
+
+  void test_create_invalidRequest() {
+    RequestError error = new RequestError.invalidRequest();
+    expect(error.code, RequestError.CODE_INVALID_REQUEST);
+    expect(error.message, "Invalid request");
+  }
+
+  void test_create_methodNotFound() {
+    RequestError error = new RequestError.methodNotFound();
+    expect(error.code, RequestError.CODE_METHOD_NOT_FOUND);
+    expect(error.message, "Method not found");
+  }
+
+  void test_create_parseError() {
+    RequestError error = new RequestError.parseError();
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "Parse error");
+  }
+
+  void test_create_serverAlreadyStarted() {
+    RequestError error = new RequestError.serverAlreadyStarted();
+    expect(error.code, RequestError.CODE_SERVER_ALREADY_STARTED);
+    expect(error.message, "Server already started");
+  }
+
+  void test_fromJson() {
+    var json = {
+      RequestError.CODE: RequestError.CODE_PARSE_ERROR,
+      RequestError.MESSAGE: 'foo',
+      RequestError.DATA: {
+        'ints': [1, 2, 3]
+      }
+    };
+    RequestError error = new RequestError.fromJson(json);
+    expect(error.code, RequestError.CODE_PARSE_ERROR);
+    expect(error.message, "foo");
+    expect(error.data['ints'], [1, 2, 3]);
+    expect(error.getData('ints'), [1, 2, 3]);
+  }
+
+  void test_toJson() {
+    RequestError error = new RequestError(0, 'msg');
+    error.setData('answer', 42);
+    error.setData('question', 'unknown');
+    expect(error.toJson(), {
+      RequestError.CODE: 0,
+      RequestError.MESSAGE: 'msg',
+      RequestError.DATA: {
+        'answer': 42,
+        'question': 'unknown'
+      }
+    });
+  }
+}
+
+
+@ReflectiveTestCase()
+class RequestTest {
+  void test_fromJson() {
+    Request original = new Request('one', 'aMethod');
+    String json = JSON.encode(original.toJson());
+    Request request = new Request.fromString(json);
+    expect(request.id, equals('one'));
+    expect(request.method, equals('aMethod'));
+  }
+
+  void test_fromJson_invalidId() {
+    String json =
+        '{"id":{"one":"two"},"method":"aMethod","params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_invalidMethod() {
+    String json =
+        '{"id":"one","method":{"boo":"aMethod"},"params":{"foo":"bar"}}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_invalidParams() {
+    String json = '{"id":"one","method":"aMethod","params":"foobar"}';
+    Request request = new Request.fromString(json);
+    expect(request, isNull);
+  }
+
+  void test_fromJson_withParams() {
+    Request original = new Request('one', 'aMethod');
+    original.setParameter('foo', 'bar');
+    String json = JSON.encode(original.toJson());
+    Request request = new Request.fromString(json);
+    expect(request.id, equals('one'));
+    expect(request.method, equals('aMethod'));
+    expect(request.getParameter('foo', null).asString(), equals('bar'));
+  }
+
+  void test_getParameter_defined() {
+    String name = 'name';
+    String value = 'value';
+    Request request = new Request('0', '');
+    request.setParameter(name, value);
+    expect(request.getParameter(name, null).datum, equals(value));
+  }
+
+   void test_getParameter_null() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    request.setParameter(name, null);
+    expect(request.getParameter(name, 'default').datum, equals(null));
+  }
+
+  void test_getParameter_undefined() {
+    String name = 'name';
+    String defaultValue = 'default value';
+    Request request = new Request('0', '');
+    expect(request.getParameter(name, defaultValue).datum, equals(
+        defaultValue));
+  }
+
+  void test_getRequiredParameter_defined() {
+    String name = 'name';
+    String value = 'value';
+    Request request = new Request('0', '');
+    request.setParameter(name, value);
+    expect(request.getRequiredParameter(name).datum, equals(value));
+  }
+
+   void test_getRequiredParameter_null() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    request.setParameter(name, null);
+    expect(request.getRequiredParameter(name).datum, equals(null));
+  }
+
+  void test_getRequiredParameter_undefined() {
+    String name = 'name';
+    Request request = new Request('0', '');
+    expect(() => request.getRequiredParameter(name), _throwsRequestFailure);
+  }
+
+  void test_toJson() {
+    Request request = new Request('one', 'aMethod');
+    expect(request.toJson(), equals({
+      Request.ID: 'one',
+      Request.METHOD: 'aMethod'
+    }));
+  }
+
+  void test_toJson_withParams() {
+    Request request = new Request('one', 'aMethod');
+    request.setParameter('foo', 'bar');
+    expect(request.toJson(), equals({
+      Request.ID: 'one',
+      Request.METHOD: 'aMethod',
+      Request.PARAMS: {
+        'foo': 'bar'
+      }
+    }));
+  }
+}
+
+
+@ReflectiveTestCase()
 class ResponseTest {
-  @runTest
-  static void create_contextDoesNotExist() {
+  void test_create_contextDoesNotExist() {
     Response response = new Response.contextDoesNotExist(new Request('0', ''));
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -1, 'message': 'Context does not exist'}
+      Response.ERROR: {
+        'code': -1,
+        'message': 'Context does not exist'
+      }
     }));
   }
 
-  @runTest
-  static void create_invalidRequestFormat() {
+  void test_create_invalidRequestFormat() {
     Response response = new Response.invalidRequestFormat();
     expect(response.id, equals(''));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '',
-      Response.ERROR: {'code': -4, 'message': 'Invalid request'}
+      Response.ERROR: {
+        'code': -4,
+        'message': 'Invalid request'
+      }
     }));
   }
 
-  @runTest
-  static void create_missingRequiredParameter() {
-    Response response = new Response.missingRequiredParameter(new Request('0', ''), 'x');
+  void test_create_missingRequiredParameter() {
+    Response response = new Response.missingRequiredParameter(new Request('0',
+        ''), 'x');
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -5, 'message': 'Missing required parameter: x'}
+      Response.ERROR: {
+        'code': -5,
+        'message': 'Missing required parameter: x'
+      }
     }));
   }
 
-  @runTest
-  static void create_unknownAnalysisOption() {
-    Response response = new Response.unknownAnalysisOption(new Request('0', ''), 'x');
+  void test_create_unanalyzedPriorityFiles() {
+    Response response = new Response.unanalyzedPriorityFiles(new Request('0',
+        ''), 'file list');
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -6, 'message': 'Unknown analysis option: "x"'}
+      Response.ERROR: {
+        'code': -11,
+        'message': "Unanalyzed files cannot be a priority: 'file list'"
+      }
     }));
   }
 
-  @runTest
-  static void create_unknownRequest() {
+  void test_create_unknownAnalysisOption() {
+    Response response = new Response.unknownAnalysisOption(new Request('0', ''),
+        'x');
+    expect(response.id, equals('0'));
+    expect(response.error, isNotNull);
+    expect(response.toJson(), equals({
+      Response.ID: '0',
+      Response.ERROR: {
+        'code': -6,
+        'message': 'Unknown analysis option: "x"'
+      }
+    }));
+  }
+
+  void test_create_unknownRequest() {
     Response response = new Response.unknownRequest(new Request('0', ''));
     expect(response.id, equals('0'));
     expect(response.error, isNotNull);
     expect(response.toJson(), equals({
       Response.ID: '0',
-      Response.ERROR: {'code': -7, 'message': 'Unknown request'}
+      Response.ERROR: {
+        'code': -7,
+        'message': 'Unknown request'
+      }
     }));
   }
 
-  @runTest
-  static void setResult() {
+  void test_fromJson() {
+    Response original = new Response('myId');
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals('myId'));
+  }
+
+  void test_fromJson_withError() {
+    Response original = new Response.invalidRequestFormat();
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals(''));
+    expect(response.error, isNotNull);
+    RequestError error = response.error;
+    expect(error.code, equals(-4));
+    expect(error.message, equals('Invalid request'));
+  }
+
+  void test_fromJson_withResult() {
+    Response original = new Response('myId');
+    original.setResult('foo', 'bar');
+    Response response = new Response.fromJson(original.toJson());
+    expect(response.id, equals('myId'));
+    Map<String, Object> result = response.result;
+    expect(result.length, equals(1));
+    expect(result['foo'], equals('bar'));
+  }
+
+  void test_setResult() {
     String resultName = 'name';
     String resultValue = 'value';
     Response response = new Response('0');
@@ -523,35 +676,4 @@
       }
     }));
   }
-
-  @runTest
-  static void fromJson() {
-    Response original = new Response('myId');
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals('myId'));
-  }
-
-  @runTest
-  static void fromJson_withError() {
-    Response original = new Response.invalidRequestFormat();
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals(''));
-    expect(response.error, isNotNull);
-    RequestError error = response.error;
-    expect(error.code, equals(-4));
-    expect(error.message, equals('Invalid request'));
-  }
-
-  @runTest
-  static void fromJson_withResult() {
-    Response original = new Response('myId');
-    original.setResult('foo', 'bar');
-    Response response = new Response.fromJson(original.toJson());
-    expect(response.id, equals('myId'));
-    Map<String, Object> result = response.result;
-    expect(result.length, equals(1));
-    expect(result['foo'], equals('bar'));
-  }
 }
-
-Matcher _throwsRequestFailure = throwsA(new isInstanceOf<RequestFailure>());
diff --git a/pkg/analysis_server/test/reflective_tests.dart b/pkg/analysis_server/test/reflective_tests.dart
index 107812e..622ab5f 100644
--- a/pkg/analysis_server/test/reflective_tests.dart
+++ b/pkg/analysis_server/test/reflective_tests.dart
@@ -44,27 +44,39 @@
     if (memberMirror is! MethodMirror || !memberMirror.isRegularMethod) {
       return;
     }
-    // check name
     String memberName = MirrorSystem.getName(symbol);
+    // test_
     if (memberName.startsWith('test_')) {
       String testName = memberName.substring('test_'.length);
       test(testName, () {
-        InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
-        _invokeSymbolIfExists(instanceMirror, #setUp);
-        var testReturn = instanceMirror.invoke(symbol, []).reflectee;
-        if (testReturn is Future) {
-          return testReturn.whenComplete(() {
-            _invokeSymbolIfExists(instanceMirror, #tearDown);
-          });
-        } else {
-          _invokeSymbolIfExists(instanceMirror, #tearDown);
-          return testReturn;
-        }
+        return _runTest(classMirror, symbol);
+      });
+      return;
+    }
+    // solo_test_
+    if (memberName.startsWith('solo_test_')) {
+      String testName = memberName.substring('solo_test_'.length);
+      solo_test(testName, () {
+        return _runTest(classMirror, symbol);
       });
     }
   });
 }
 
+_runTest(ClassMirror classMirror, Symbol symbol) {
+  InstanceMirror instanceMirror = classMirror.newInstance(new Symbol(''), []);
+  _invokeSymbolIfExists(instanceMirror, #setUp);
+  var testReturn = instanceMirror.invoke(symbol, []).reflectee;
+  if (testReturn is Future) {
+    return testReturn.whenComplete(() {
+      _invokeSymbolIfExists(instanceMirror, #tearDown);
+    });
+  } else {
+    _invokeSymbolIfExists(instanceMirror, #tearDown);
+    return testReturn;
+  }
+}
+
 
 void _invokeSymbolIfExists(InstanceMirror instanceMirror, Symbol symbol) {
   try {
diff --git a/pkg/analysis_server/test/resource_test.dart b/pkg/analysis_server/test/resource_test.dart
index a7e2b47..489741d 100644
--- a/pkg/analysis_server/test/resource_test.dart
+++ b/pkg/analysis_server/test/resource_test.dart
@@ -6,15 +6,21 @@
 
 import 'dart:async';
 
-import 'mocks.dart';
-
 import 'package:analysis_server/src/resource.dart';
 import 'package:analyzer/src/generated/engine.dart' show TimestampedData;
-import 'package:analyzer/src/generated/source_io.dart';
+import 'package:analyzer/src/generated/source.dart';
 import 'package:path/path.dart';
 import 'package:unittest/unittest.dart';
 import 'package:watcher/watcher.dart';
 
+import 'mocks.dart';
+
+
+var _isFile = new isInstanceOf<File>();
+var _isFolder = new isInstanceOf<Folder>();
+var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
+
+
 main() {
   groupSep = ' | ';
 
@@ -114,21 +120,15 @@
 
     group('newFolder', () {
       test('empty path', () {
-        expect(
-          () {
-            provider.newFolder('');
-          },
-          throwsA(new isInstanceOf<ArgumentError>())
-        );
+        expect(() {
+          provider.newFolder('');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
       });
 
       test('not absolute', () {
-        expect(
-          () {
-            provider.newFolder('not/absolute');
-          },
-          throwsA(new isInstanceOf<ArgumentError>())
-        );
+        expect(() {
+          provider.newFolder('not/absolute');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
       });
 
       group('already exists', () {
@@ -140,12 +140,9 @@
 
         test('as file', () {
           File file = provider.newFile('/my/file', 'qwerty');
-          expect(
-            () {
+          expect(() {
             provider.newFolder('/my/file');
-            },
-            throwsA(new isInstanceOf<ArgumentError>())
-          );
+          }, throwsA(new isInstanceOf<ArgumentError>()));
         });
       });
     });
@@ -153,8 +150,9 @@
     group('modifyFile', () {
       test('nonexistent', () {
         String path = '/my/file';
-        expect(() { provider.modifyFile(path, 'contents'); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.modifyFile(path, 'contents');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         Resource file = provider.getResource(path);
         expect(file, isNotNull);
         expect(file.exists, isFalse);
@@ -163,8 +161,9 @@
       test('is folder', () {
         String path = '/my/file';
         provider.newFolder(path);
-        expect(() { provider.modifyFile(path, 'contents'); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.modifyFile(path, 'contents');
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         expect(provider.getResource(path), new isInstanceOf<Folder>());
       });
 
@@ -183,8 +182,9 @@
     group('deleteFile', () {
       test('nonexistent', () {
         String path = '/my/file';
-        expect(() { provider.deleteFile(path); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.deleteFile(path);
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         Resource file = provider.getResource(path);
         expect(file, isNotNull);
         expect(file.exists, isFalse);
@@ -193,8 +193,9 @@
       test('is folder', () {
         String path = '/my/file';
         provider.newFolder(path);
-        expect(() { provider.deleteFile(path); },
-            throwsA(new isInstanceOf<ArgumentError>()));
+        expect(() {
+          provider.deleteFile(path);
+        }, throwsA(new isInstanceOf<ArgumentError>()));
         expect(provider.getResource(path), new isInstanceOf<Folder>());
       });
 
@@ -392,12 +393,9 @@
         });
 
         test('contents', () {
-          expect(
-            () {
-              source.contents;
-            },
-            throwsA(_isMemoryResourceException)
-          );
+          expect(() {
+            source.contents;
+          }, throwsA(_isMemoryResourceException));
         });
 
         test('encoding', () {
@@ -423,8 +421,57 @@
       });
     });
   });
+
+  group('ResourceUriResolver', testResourceResourceUriResolver);
 }
 
-var _isFile = new isInstanceOf<File>();
-var _isFolder = new isInstanceOf<Folder>();
-var _isMemoryResourceException = new isInstanceOf<MemoryResourceException>();
+
+void testResourceResourceUriResolver() {
+  MemoryResourceProvider provider;
+  ResourceUriResolver resolver;
+
+  setUp(() {
+    provider = new MemoryResourceProvider();
+    resolver = new ResourceUriResolver(provider);
+    provider.newFile('/test.dart', '');
+    provider.newFolder('/folder');
+  });
+
+  group('fromEncoding', () {
+    test('file', () {
+      var uri = new Uri(path: '/test.dart');
+      Source source = resolver.fromEncoding(UriKind.FILE_URI, uri);
+      expect(source, isNotNull);
+      expect(source.exists(), isTrue);
+      expect(source.fullName, '/test.dart');
+    });
+
+    test('not a UriKind.FILE_URI', () {
+      var uri = new Uri(path: '/test.dart');
+      Source source = resolver.fromEncoding(UriKind.DART_URI, uri);
+      expect(source, isNull);
+    });
+  });
+
+  group('resolveAbsolute', () {
+    test('file', () {
+      var uri = new Uri(scheme: 'file', path: '/test.dart');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNotNull);
+      expect(source.exists(), isTrue);
+      expect(source.fullName, '/test.dart');
+    });
+
+    test('folder', () {
+      var uri = new Uri(scheme: 'file', path: '/folder');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNull);
+    });
+
+    test('not a file URI', () {
+      var uri = new Uri(scheme: 'https', path: '127.0.0.1/test.dart');
+      Source source = resolver.resolveAbsolute(uri);
+      expect(source, isNull);
+    });
+  });
+}
diff --git a/pkg/analysis_server/test/socket_server_test.dart b/pkg/analysis_server/test/socket_server_test.dart
index 0f9c083..67c6c2e 100644
--- a/pkg/analysis_server/test/socket_server_test.dart
+++ b/pkg/analysis_server/test/socket_server_test.dart
@@ -28,10 +28,10 @@
     MockServerChannel channel = new MockServerChannel();
     server.createAnalysisServer(channel);
     channel.expectMsgCount(notificationCount: 1);
-    expect(channel.notificationsReceived[0].event, NOTIFICATION_CONNECTED);
+    expect(channel.notificationsReceived[0].event, SERVER_CONNECTED);
     expect(channel.notificationsReceived[0].params, isEmpty);
     return channel.sendRequest(
-        new Request('0', METHOD_SHUTDOWN)
+        new Request('0', SERVER_SHUTDOWN)
     ).then((Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNull);
@@ -44,7 +44,7 @@
     MockServerChannel channel1 = new MockServerChannel();
     MockServerChannel channel2 = new MockServerChannel();
     server.createAnalysisServer(channel1);
-    expect(channel1.notificationsReceived[0].event, NOTIFICATION_CONNECTED);
+    expect(channel1.notificationsReceived[0].event, SERVER_CONNECTED);
     expect(channel1.notificationsReceived[0].params, isEmpty);
     server.createAnalysisServer(channel2);
     channel1.expectMsgCount(notificationCount: 1);
@@ -53,7 +53,7 @@
     expect(channel2.responsesReceived[0].error, isNotNull);
     expect(channel2.responsesReceived[0].error.code, equals(
         RequestError.CODE_SERVER_ALREADY_STARTED));
-    channel2.sendRequest(new Request('0', METHOD_SHUTDOWN)).then((Response response) {
+    channel2.sendRequest(new Request('0', SERVER_SHUTDOWN)).then((Response response) {
       expect(response.id, equals('0'));
       expect(response.error, isNotNull);
       expect(response.error.code, equals(
diff --git a/pkg/analysis_server/test/test_all.dart b/pkg/analysis_server/test/test_all.dart
index 42cf5a9..c22cd2e 100644
--- a/pkg/analysis_server/test/test_all.dart
+++ b/pkg/analysis_server/test/test_all.dart
@@ -4,12 +4,22 @@
 
 import 'package:unittest/unittest.dart';
 
+import 'analysis_notification_highlights_test.dart' as analysis_notification_highlights_test;
 import 'analysis_notification_navigation_test.dart' as analysis_notification_navigation_test;
+import 'analysis_notification_outline_test.dart' as analysis_notification_outline_test;
 import 'analysis_server_test.dart' as analysis_server_test;
 import 'channel_test.dart' as channel_test;
+import 'computer/test_all.dart' as computer_test_all;
+import 'context_directory_manager_test.dart' as context_directory_manager_test;
 import 'domain_analysis_test.dart' as domain_analysis_test;
+import 'domain_completion_test.dart' as domain_completion_test;
+import 'domain_edit_test.dart' as domain_edit_test;
+import 'domain_search_test.dart' as domain_search_test;
 import 'domain_server_test.dart' as domain_server_test;
+import 'index/test_all.dart' as index_test_all;
 import 'operation/test_all.dart' as operation_test;
+import 'package_map_provider_test.dart' as package_map_provider_test;
+import 'package_uri_resolver_test.dart' as package_uri_resolver_test;
 import 'protocol_test.dart' as protocol_test;
 import 'resource_test.dart' as resource_test;
 import 'socket_server_test.dart' as socket_server_test;
@@ -20,12 +30,22 @@
 main() {
   groupSep = ' | ';
   group('analysis_server', () {
+    analysis_notification_highlights_test.main();
     analysis_notification_navigation_test.main();
+    analysis_notification_outline_test.main();
     analysis_server_test.main();
     channel_test.main();
+    computer_test_all.main();
+    context_directory_manager_test.main();
     domain_analysis_test.main();
+    domain_completion_test.main();
+    domain_edit_test.main();
+    domain_search_test.main();
     domain_server_test.main();
+    index_test_all.main();
     operation_test.main();
+    package_map_provider_test.main();
+    package_uri_resolver_test.main();
     protocol_test.main();
     resource_test.main();
     socket_server_test.main();
diff --git a/pkg/analyzer/bin/analyzer.dart b/pkg/analyzer/bin/analyzer.dart
index bab77b6..db4c475 100644
--- a/pkg/analyzer/bin/analyzer.dart
+++ b/pkg/analyzer/bin/analyzer.dart
@@ -14,10 +14,13 @@
 import 'package:analyzer/src/analyzer_impl.dart';
 import 'package:analyzer/src/generated/engine.dart';
 import 'package:analyzer/src/generated/error.dart';
+import 'package:analyzer/src/generated/interner.dart';
 import 'package:analyzer/src/generated/java_core.dart' show JavaSystem;
+import 'package:analyzer/src/generated/java_engine.dart';
 import 'package:analyzer/options.dart';
 
 void main(args) {
+  StringUtilities.INTERNER = new MappedInterner();
   CommandLineOptions options = CommandLineOptions.parse(args);
   if (options.shouldBatch) {
     BatchRunner.runAsBatch(args, (List<String> args) {
diff --git a/pkg/analyzer/lib/src/generated/ast.dart b/pkg/analyzer/lib/src/generated/ast.dart
index 870309a..93307b7 100644
--- a/pkg/analyzer/lib/src/generated/ast.dart
+++ b/pkg/analyzer/lib/src/generated/ast.dart
@@ -2221,7 +2221,7 @@
       }
     } else {
       if (_propertyMap == null) {
-        _propertyMap = new Map<String, Object>();
+        _propertyMap = new HashMap<String, Object>();
       }
       _propertyMap[propertyName] = propertyValue;
     }
@@ -4554,7 +4554,7 @@
 
   @override
   Object visitMapLiteral(MapLiteral node) {
-    Map<String, Object> map = new Map<String, Object>();
+    HashMap<String, Object> map = new HashMap<String, Object>();
     for (MapLiteralEntry entry in node.entries) {
       Object key = entry.key.accept(this);
       Object value = entry.value.accept(this);
@@ -5819,6 +5819,9 @@
  */
 class ElementLocator_ElementMapper extends GeneralizingAstVisitor<Element> {
   @override
+  Element visitAnnotation(Annotation node) => node.element;
+
+  @override
   Element visitAssignmentExpression(AssignmentExpression node) => node.bestElement;
 
   @override
@@ -5839,6 +5842,13 @@
   @override
   Element visitIdentifier(Identifier node) {
     AstNode parent = node.parent;
+    // Type name in Annotation
+    if (parent is Annotation) {
+      Annotation annotation = parent;
+      if (identical(annotation.name, node) && annotation.constructorName == null) {
+        return annotation.element;
+      }
+    }
     // Type name in InstanceCreationExpression
     {
       AstNode typeNameCandidate = parent;
@@ -14508,7 +14518,7 @@
 
   AstNode _immediateChild;
 
-  Map<String, SimpleIdentifier> _locals = new Map<String, SimpleIdentifier>();
+  Map<String, SimpleIdentifier> _locals = new HashMap<String, SimpleIdentifier>();
 
   final int _position;
 
@@ -15110,7 +15120,10 @@
 
   @override
   Token get beginToken {
-    if (keyword != null) {
+    NodeList<Annotation> metadata = this.metadata;
+    if (!metadata.isEmpty) {
+      return metadata.beginToken;
+    } else if (keyword != null) {
       return keyword;
     } else if (_type != null) {
       return _type.beginToken;
@@ -18305,7 +18318,7 @@
   }
 
   /**
-   * Validate the given directive, but do not check for existance.
+   * Validate the given directive, but do not check for existence.
    *
    * @return a code indicating the problem if there is one, or `null` no problem
    */
@@ -18588,6 +18601,7 @@
 
   @override
   void visitChildren(AstVisitor visitor) {
+    super.visitChildren(visitor);
     safelyVisitChild(_type, visitor);
     _variables.accept(visitor);
   }
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index b5c986d..c911a76 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -7,6 +7,7 @@
 
 library engine.constant;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart' show ObjectUtilities;
 import 'source.dart' show Source;
@@ -229,12 +230,12 @@
   /**
    * A table mapping constant variable elements to the declarations of those variables.
    */
-  final Map<VariableElement, VariableDeclaration> variableMap = new Map<VariableElement, VariableDeclaration>();
+  final HashMap<VariableElement, VariableDeclaration> variableMap = new HashMap<VariableElement, VariableDeclaration>();
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final Map<ConstructorElement, ConstructorDeclaration> constructorMap = new Map<ConstructorElement, ConstructorDeclaration>();
+  final HashMap<ConstructorElement, ConstructorDeclaration> constructorMap = new HashMap<ConstructorElement, ConstructorDeclaration>();
 
   /**
    * A collection of constant constructor invocations.
@@ -305,12 +306,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  Map<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
+  HashMap<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
 
   /**
    * A collection of constant constructor invocations.
@@ -491,7 +492,7 @@
   ValidResult _evaluateConstructorCall(NodeList<Expression> arguments, ConstructorElement constructor, ConstantVisitor constantVisitor) {
     int argumentCount = arguments.length;
     List<DartObjectImpl> argumentValues = new List<DartObjectImpl>(argumentCount);
-    Map<String, DartObjectImpl> namedArgumentValues = new Map<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> namedArgumentValues = new HashMap<String, DartObjectImpl>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -534,8 +535,8 @@
       // been reported, so consider it an unknown value to suppress further errors.
       return constantVisitor._validWithUnknownValue(definingClass);
     }
-    Map<String, DartObjectImpl> fieldMap = new Map<String, DartObjectImpl>();
-    Map<String, DartObjectImpl> parameterMap = new Map<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> fieldMap = new HashMap<String, DartObjectImpl>();
+    HashMap<String, DartObjectImpl> parameterMap = new HashMap<String, DartObjectImpl>();
     List<ParameterElement> parameters = constructorBase.parameters;
     int parameterCount = parameters.length;
     for (int i = 0; i < parameterCount; i++) {
@@ -610,7 +611,7 @@
     return constantVisitor._valid(definingClass, new GenericState(fieldMap));
   }
 
-  void _evaluateSuperConstructorCall(Map<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
+  void _evaluateSuperConstructorCall(HashMap<String, DartObjectImpl> fieldMap, ConstructorElement superConstructor, NodeList<Expression> superArguments, ConstantVisitor initializerVisitor) {
     if (superConstructor != null && superConstructor.isConst) {
       ValidResult evaluationResult = _evaluateConstructorCall(superArguments, superConstructor, initializerVisitor);
       fieldMap[GenericState.SUPERCLASS_FIELD] = evaluationResult.value;
@@ -627,7 +628,7 @@
    *         constructor will be returned.
    */
   ConstructorElement _followConstantRedirectionChain(ConstructorElement constructor) {
-    Set<ConstructorElement> constructorsVisited = new Set<ConstructorElement>();
+    HashSet<ConstructorElement> constructorsVisited = new HashSet<ConstructorElement>();
     while (constructor.isFactory) {
       if (identical(constructor.enclosingElement.type, typeProvider.symbolType)) {
         // The dart:core.Symbol has a const factory constructor that redirects to
@@ -758,7 +759,7 @@
    */
   DartObjectImpl _nullObject;
 
-  Map<String, DartObjectImpl> _lexicalEnvironment;
+  HashMap<String, DartObjectImpl> _lexicalEnvironment;
 
   /**
    * Initialize a newly created constant visitor.
@@ -778,7 +779,7 @@
    * @param lexicalEnvironment values which should override simpleIdentifiers, or null if no
    *          overriding is necessary.
    */
-  ConstantVisitor.con2(this._typeProvider, Map<String, DartObjectImpl> lexicalEnvironment) {
+  ConstantVisitor.con2(this._typeProvider, HashMap<String, DartObjectImpl> lexicalEnvironment) {
     this._lexicalEnvironment = lexicalEnvironment;
   }
 
@@ -946,7 +947,7 @@
       return new ErrorResult.con1(node, CompileTimeErrorCode.MISSING_CONST_IN_MAP_LITERAL);
     }
     ErrorResult result = null;
-    Map<DartObjectImpl, DartObjectImpl> map = new Map<DartObjectImpl, DartObjectImpl>();
+    HashMap<DartObjectImpl, DartObjectImpl> map = new HashMap<DartObjectImpl, DartObjectImpl>();
     for (MapLiteralEntry entry in node.entries) {
       EvaluationResultImpl keyResult = entry.key.accept(this);
       EvaluationResultImpl valueResult = entry.value.accept(this);
@@ -1439,7 +1440,7 @@
     return null;
   }
 
-  Map<String, DartObjectImpl> get fields => _state.fields;
+  HashMap<String, DartObjectImpl> get fields => _state.fields;
 
   @override
   int get intValue {
@@ -1729,7 +1730,7 @@
   /**
    * A table mapping the names of declared variables to their values.
    */
-  Map<String, String> _declaredVariables = new Map<String, String>();
+  HashMap<String, String> _declaredVariables = new HashMap<String, String>();
 
   /**
    * Define a variable with the given name to have the given value.
@@ -2821,7 +2822,7 @@
   /**
    * The values of the fields of this instance.
    */
-  final Map<String, DartObjectImpl> _fieldMap;
+  final HashMap<String, DartObjectImpl> _fieldMap;
 
   /**
    * Pseudo-field that we use to represent fields in the superclass.
@@ -2831,7 +2832,7 @@
   /**
    * A state that can be used to represent an object whose state is not known.
    */
-  static GenericState UNKNOWN_VALUE = new GenericState(new Map<String, DartObjectImpl>());
+  static GenericState UNKNOWN_VALUE = new GenericState(new HashMap<String, DartObjectImpl>());
 
   /**
    * Initialize a newly created state to represent a newly created object.
@@ -2858,7 +2859,7 @@
       return false;
     }
     GenericState state = object as GenericState;
-    Set<String> otherFields = new Set<String>.from(state._fieldMap.keys.toSet());
+    HashSet<String> otherFields = new HashSet<String>.from(state._fieldMap.keys.toSet());
     for (String fieldName in _fieldMap.keys.toSet()) {
       if (_fieldMap[fieldName] != state._fieldMap[fieldName]) {
         return false;
@@ -2874,7 +2875,7 @@
   }
 
   @override
-  Map<String, DartObjectImpl> get fields => _fieldMap;
+  HashMap<String, DartObjectImpl> get fields => _fieldMap;
 
   @override
   String get typeName => "user defined type";
@@ -3014,7 +3015,7 @@
    * If this represents a generic dart object, return a map from its fieldnames to their values.
    * Otherwise return null.
    */
-  Map<String, DartObjectImpl> get fields => null;
+  HashMap<String, DartObjectImpl> get fields => null;
 
   /**
    * Return the name of the type of this value.
@@ -3842,7 +3843,7 @@
   /**
    * The entries in the map.
    */
-  final Map<DartObjectImpl, DartObjectImpl> _entries;
+  final HashMap<DartObjectImpl, DartObjectImpl> _entries;
 
   /**
    * Initialize a newly created state to represent a map with the given entries.
@@ -3868,7 +3869,7 @@
     if (object is! MapState) {
       return false;
     }
-    Map<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
+    HashMap<DartObjectImpl, DartObjectImpl> otherElements = (object as MapState)._entries;
     int count = _entries.length;
     if (otherElements.length != count) {
       return false;
@@ -3891,7 +3892,7 @@
 
   @override
   Map<Object, Object> get value {
-    Map<Object, Object> result = new Map<Object, Object>();
+    HashMap<Object, Object> result = new HashMap<Object, Object>();
     for (MapEntry<DartObjectImpl, DartObjectImpl> entry in getMapEntrySet(_entries)) {
       DartObjectImpl key = entry.getKey();
       DartObjectImpl value = entry.getValue();
@@ -4103,12 +4104,12 @@
   /**
    * A table mapping constant variables to the declarations of those variables.
    */
-  final Map<VariableElement, VariableDeclaration> _variableDeclarationMap;
+  final HashMap<VariableElement, VariableDeclaration> _variableDeclarationMap;
 
   /**
    * A table mapping constant constructors to the declarations of those constructors.
    */
-  final Map<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
+  final HashMap<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
 
   /**
    * Initialize a newly created reference finder to find references from the given variable to other
diff --git a/pkg/analyzer/lib/src/generated/element.dart b/pkg/analyzer/lib/src/generated/element.dart
index 50b872b..8418199 100644
--- a/pkg/analyzer/lib/src/generated/element.dart
+++ b/pkg/analyzer/lib/src/generated/element.dart
@@ -1413,7 +1413,7 @@
   @override
   bool get hasNonFinalField {
     List<ClassElement> classesToVisit = new List<ClassElement>();
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     classesToVisit.add(this);
     while (!classesToVisit.isEmpty) {
       ClassElement currentElement = classesToVisit.removeAt(0);
@@ -1465,7 +1465,7 @@
   bool get isAbstract => hasModifier(Modifier.ABSTRACT);
 
   @override
-  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new Set<ClassElement>());
+  bool get isOrInheritsProxy => _safeIsOrInheritsProxy(this, new HashSet<ClassElement>());
 
   @override
   bool get isProxy {
@@ -1701,7 +1701,7 @@
   }
 
   PropertyAccessorElement _internalLookUpGetter(String getterName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getGetter(getterName);
@@ -1733,7 +1733,7 @@
   }
 
   MethodElement _internalLookUpMethod(String methodName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       MethodElement element = currentElement.getMethod(methodName);
@@ -1765,7 +1765,7 @@
   }
 
   PropertyAccessorElement _internalLookUpSetter(String setterName, LibraryElement library, bool includeThisClass) {
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     ClassElement currentElement = this;
     if (includeThisClass) {
       PropertyAccessorElement element = currentElement.getSetter(setterName);
@@ -1796,7 +1796,7 @@
     return null;
   }
 
-  bool _safeIsOrInheritsProxy(ClassElement classElt, Set<ClassElement> visitedClassElts) {
+  bool _safeIsOrInheritsProxy(ClassElement classElt, HashSet<ClassElement> visitedClassElts) {
     if (visitedClassElts.contains(classElt)) {
       return false;
     }
@@ -3640,6 +3640,14 @@
  */
 abstract class ElementLocation {
   /**
+   * Return the path to the element whose location is represented by this object. Clients must not
+   * modify the returned array.
+   *
+   * @return the path to the element whose location is represented by this object
+   */
+  List<String> get components;
+
+  /**
    * Return an encoded representation of this location that can be used to create a location that is
    * equal to this location.
    *
@@ -3686,6 +3694,15 @@
     this._components = _decode(encoding);
   }
 
+  /**
+   * Initialize a newly created location from the given components.
+   *
+   * @param components the components of a location
+   */
+  ElementLocationImpl.con3(List<String> components) {
+    this._components = components;
+  }
+
   @override
   bool operator ==(Object object) {
     if (identical(this, object)) {
@@ -3714,11 +3731,7 @@
     return true;
   }
 
-  /**
-   * Return the path to the element whose location is represented by this object.
-   *
-   * @return the path to the element whose location is represented by this object
-   */
+  @override
   List<String> get components => _components;
 
   @override
@@ -4624,6 +4637,9 @@
   PropertyAccessorElement get getter => PropertyAccessorMember.from(baseElement.getter, definingType);
 
   @override
+  DartType get propagatedType => substituteFor(baseElement.propagatedType);
+
+  @override
   PropertyAccessorElement get setter => PropertyAccessorMember.from(baseElement.setter, definingType);
 
   @override
@@ -4755,7 +4771,13 @@
   }
 
   @override
-  String get identifier => "${name}@${nameOffset}";
+  String get identifier {
+    String identifier = super.identifier;
+    if (!isStatic) {
+      identifier += "@${nameOffset}";
+    }
+    return identifier;
+  }
 }
 
 /**
@@ -5148,13 +5170,14 @@
   FunctionTypeImpl.con2(FunctionTypeAliasElement element) : super(element, element == null ? null : element.name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
 
   @override
   String get displayName {
     String name = this.name;
     if (name == null || name.length == 0) {
-      // TODO(brianwilkerson) Determine whether function types should ever have an empty name.
+      // Function types have an empty name when they are defined implicitly by either a closure or
+      // as part of a parameter declaration.
       List<DartType> normalParameterTypes = this.normalParameterTypes;
       List<DartType> optionalParameterTypes = this.optionalParameterTypes;
       Map<String, DartType> namedParameterTypes = this.namedParameterTypes;
@@ -5451,7 +5474,7 @@
   }
 
   @override
-  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
 
   @override
   FunctionTypeImpl substitute3(List<DartType> argumentTypes) => substitute2(argumentTypes, typeArguments);
@@ -6071,6 +6094,9 @@
       builder.append(source.fullName);
     }
   }
+
+  @override
+  String get identifier => source.encoding;
 }
 
 /**
@@ -6528,7 +6554,7 @@
    * @return the computed longest inheritance path to Object
    * @see InterfaceType#getLeastUpperBound(Type)
    */
-  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new Set<ClassElement>());
+  static int computeLongestInheritancePathToObject(InterfaceType type) => _computeLongestInheritancePathToObject(type, 0, new HashSet<ClassElement>());
 
   /**
    * Returns the set of all superinterfaces of the passed [Type].
@@ -6537,7 +6563,7 @@
    * @return the [Set] of superinterfaces of the passed [Type]
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new Set<InterfaceType>());
+  static Set<InterfaceType> computeSuperinterfaceSet(InterfaceType type) => _computeSuperinterfaceSet(type, new HashSet<InterfaceType>());
 
   /**
    * This method computes the longest inheritance path from some passed [Type] to Object. This
@@ -6552,7 +6578,7 @@
    * @see #computeLongestInheritancePathToObject(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, Set<ClassElement> visitedClasses) {
+  static int _computeLongestInheritancePathToObject(InterfaceType type, int depth, HashSet<ClassElement> visitedClasses) {
     ClassElement classElement = type.element;
     // Object case
     if (classElement.supertype == null || visitedClasses.contains(classElement)) {
@@ -6596,7 +6622,7 @@
    * @see #computeSuperinterfaceSet(Type)
    * @see #getLeastUpperBound(Type)
    */
-  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, Set<InterfaceType> set) {
+  static Set<InterfaceType> _computeSuperinterfaceSet(InterfaceType type, HashSet<InterfaceType> set) {
     Element element = type.element;
     if (element != null) {
       List<InterfaceType> superinterfaces = type.interfaces;
@@ -6624,7 +6650,7 @@
    * @return the intersection of the given sets of types
    */
   static List<InterfaceType> _intersection(Set<InterfaceType> first, Set<InterfaceType> second) {
-    Set<InterfaceType> result = new Set<InterfaceType>.from(first);
+    Set<InterfaceType> result = new HashSet<InterfaceType>.from(first);
     result.retainAll(second);
     return new List.from(result);
   }
@@ -6688,7 +6714,7 @@
   InterfaceTypeImpl.con2(String name) : super(null, name);
 
   @override
-  bool operator ==(Object object) => internalEquals(object, new Set<ElementPair>());
+  bool operator ==(Object object) => internalEquals(object, new HashSet<ElementPair>());
 
   @override
   List<PropertyAccessorElement> get accessors {
@@ -6960,7 +6986,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -6998,7 +7024,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7036,7 +7062,7 @@
         return element;
       }
     }
-    Set<ClassElement> visitedClasses = new Set<ClassElement>();
+    HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
     InterfaceType supertype = superclass;
     ClassElement supertypeElement = supertype == null ? null : supertype.element;
     while (supertype != null && !visitedClasses.contains(supertypeElement)) {
@@ -7114,7 +7140,7 @@
     } else if (type is! InterfaceType) {
       return false;
     }
-    return _isMoreSpecificThan(type as InterfaceType, new Set<ClassElement>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(type as InterfaceType, new HashSet<ClassElement>(), withDynamic, visitedTypePairs);
   }
 
   @override
@@ -7138,10 +7164,10 @@
     } else if (this == type) {
       return true;
     }
-    return _isSubtypeOf(type as InterfaceType, new Set<ClassElement>(), visitedTypePairs);
+    return _isSubtypeOf(type as InterfaceType, new HashSet<ClassElement>(), visitedTypePairs);
   }
 
-  bool _isMoreSpecificThan(InterfaceType s, Set<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isMoreSpecificThan(InterfaceType s, HashSet<ClassElement> visitedClasses, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
     // A type T is more specific than a type S, written T << S,  if one of the following conditions
     // is met:
@@ -7205,7 +7231,7 @@
     return false;
   }
 
-  bool _isSubtypeOf(InterfaceType type, Set<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
+  bool _isSubtypeOf(InterfaceType type, HashSet<ClassElement> visitedClasses, Set<TypeImpl_TypePair> visitedTypePairs) {
     InterfaceType typeT = this;
     InterfaceType typeS = type;
     ClassElement elementT = element;
@@ -7627,7 +7653,7 @@
 
   @override
   List<LibraryElement> get exportedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
     for (ExportElement element in _exports) {
       LibraryElement library = element.exportedLibrary;
       if (library != null) {
@@ -7642,7 +7668,7 @@
 
   @override
   List<LibraryElement> get importedLibraries {
-    Set<LibraryElement> libraries = new Set<LibraryElement>();
+    HashSet<LibraryElement> libraries = new HashSet<LibraryElement>();
     for (ImportElement element in _imports) {
       LibraryElement library = element.importedLibrary;
       if (library != null) {
@@ -7691,7 +7717,7 @@
 
   @override
   List<PrefixElement> get prefixes {
-    Set<PrefixElement> prefixes = new Set<PrefixElement>();
+    HashSet<PrefixElement> prefixes = new HashSet<PrefixElement>();
     for (ImportElement element in _imports) {
       PrefixElement prefix = element.prefix;
       if (prefix != null) {
@@ -8220,6 +8246,9 @@
    * @return the result of transforming the type
    */
   DartType substituteFor(DartType type) {
+    if (type == null) {
+      return null;
+    }
     List<DartType> argumentTypes = _definingType.typeArguments;
     List<DartType> parameterTypes = TypeParameterTypeImpl.getTypes(_definingType.typeParameters);
     return type.substitute2(argumentTypes, parameterTypes);
@@ -8596,7 +8625,7 @@
    * @param elements the list to which the element(s) are to be added
    * @param element the element(s) to be added
    */
-  static void _add(Set<Element> elements, Element element) {
+  static void _add(HashSet<Element> elements, Element element) {
     if (element is MultiplyDefinedElementImpl) {
       for (Element conflictingElement in element.conflictingElements) {
         elements.add(conflictingElement);
@@ -8616,7 +8645,7 @@
    * @return an array containing all of the conflicting elements
    */
   static List<Element> _computeConflictingElements(Element firstElement, Element secondElement) {
-    Set<Element> elements = new Set<Element>();
+    HashSet<Element> elements = new HashSet<Element>();
     _add(elements, firstElement);
     _add(elements, secondElement);
     return new List.from(elements);
@@ -9810,6 +9839,14 @@
   PropertyAccessorElement get getter;
 
   /**
+   * Return the propagated type of this variable, or `null` if type propagation has not been
+   * performed, for example because the variable is not final.
+   *
+   * @return the propagated type of this variable
+   */
+  DartType get propagatedType;
+
+  /**
    * Return the setter associated with this variable, or `null` if the variable is effectively
    * `final` and therefore does not have a setter associated with it. (This can happen either
    * because the variable is explicitly defined as being `final` or because the variable is
@@ -9846,6 +9883,12 @@
   PropertyAccessorElement setter;
 
   /**
+   * The propagated type of this variable, or `null` if type propagation has not been
+   * performed.
+   */
+  DartType propagatedType;
+
+  /**
    * An empty array of elements.
    */
   static List<PropertyInducingElement> EMPTY_ARRAY = new List<PropertyInducingElement>(0);
@@ -10387,7 +10430,7 @@
   DartType getLeastUpperBound(DartType type) => null;
 
   @override
-  bool isAssignableTo(DartType type) => isAssignableTo2(type, new Set<TypeImpl_TypePair>());
+  bool isAssignableTo(DartType type) => isAssignableTo2(type, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is assignable to the given type. A type <i>T</i> may be
@@ -10414,7 +10457,7 @@
   bool get isDynamic => false;
 
   @override
-  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new Set<TypeImpl_TypePair>());
+  bool isMoreSpecificThan(DartType type) => isMoreSpecificThan2(type, false, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is more specific than the given type.
@@ -10443,7 +10486,7 @@
   bool get isObject => false;
 
   @override
-  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new Set<TypeImpl_TypePair>());
+  bool isSubtypeOf(DartType type) => isSubtypeOf2(type, new HashSet<TypeImpl_TypePair>());
 
   /**
    * Return `true` if this type is a subtype of the given type.
@@ -10700,11 +10743,11 @@
     if (s.isDynamic) {
       return true;
     }
-    return _isMoreSpecificThan(s, new Set<DartType>(), withDynamic, visitedTypePairs);
+    return _isMoreSpecificThan(s, new HashSet<DartType>(), withDynamic, visitedTypePairs);
   }
 
   @override
-  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new Set<TypeImpl_TypePair>());
+  bool internalIsSubtypeOf(DartType type, Set<TypeImpl_TypePair> visitedTypePairs) => isMoreSpecificThan2(type, true, new HashSet<TypeImpl_TypePair>());
 
   bool _isMoreSpecificThan(DartType s, Set<DartType> visitedTypes, bool withDynamic, Set<TypeImpl_TypePair> visitedTypePairs) {
     //
diff --git a/pkg/analyzer/lib/src/generated/engine.dart b/pkg/analyzer/lib/src/generated/engine.dart
index c513eec..b1d7275 100644
--- a/pkg/analyzer/lib/src/generated/engine.dart
+++ b/pkg/analyzer/lib/src/generated/engine.dart
@@ -7,6 +7,7 @@
 
 library engine;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'utilities_collection.dart';
@@ -18,10 +19,10 @@
 import 'ast.dart';
 import 'parser.dart' show Parser, IncrementalParser;
 import 'sdk.dart' show DartSdk;
+import 'constant.dart';
 import 'element.dart';
 import 'resolver.dart';
 import 'html.dart' as ht;
-import 'package:analyzer/src/generated/constant.dart';
 
 /**
  * Instances of the class `AnalysisCache` implement an LRU cache of information related to
@@ -867,19 +868,19 @@
    * An array containing sources whose AST structure is needed in order to resolve the next library
    * to be resolved.
    */
-  Set<Source> _neededForResolution = null;
+  HashSet<Source> _neededForResolution = null;
 
   /**
    * A table mapping sources to the change notices that are waiting to be returned related to that
    * source.
    */
-  Map<Source, ChangeNoticeImpl> _pendingNotices = new Map<Source, ChangeNoticeImpl>();
+  HashMap<Source, ChangeNoticeImpl> _pendingNotices = new HashMap<Source, ChangeNoticeImpl>();
 
   /**
    * A set containing information about the tasks that have been performed since the last change
    * notification. Used to detect infinite loops in [performAnalysisTask].
    */
-  Set<String> _recentTasks = new Set<String>();
+  HashSet<String> _recentTasks = new HashSet<String>();
 
   /**
    * The object used to synchronize access to all of the caches. The rules related to the use of
@@ -965,6 +966,11 @@
       }
     }
     for (Source source in changeSet.changedSources) {
+      if (_contentCache.getContents(source) != null) {
+        // This source is overridden in the content cache, so the change will have no effect.
+        // Just ignore it to avoid wasting time doing re-analysis.
+        continue;
+      }
       _sourceChanged(source);
     }
     for (MapEntry<Source, String> entry in getMapEntrySet(changeSet.changedContents)) {
@@ -1254,19 +1260,25 @@
   Element getElement(ElementLocation location) {
     // TODO(brianwilkerson) This should not be a "get" method.
     try {
-      List<String> components = (location as ElementLocationImpl).components;
-      Source librarySource = _computeSourceFromEncoding(components[0]);
-      ElementImpl element = computeLibraryElement(librarySource) as ElementImpl;
-      for (int i = 1; i < components.length; i++) {
-        if (element == null) {
-          return null;
+      List<String> components = location.components;
+      Source source = _computeSourceFromEncoding(components[0]);
+      String sourceName = source.shortName;
+      if (AnalysisEngine.isDartFileName(sourceName)) {
+        ElementImpl element = computeLibraryElement(source) as ElementImpl;
+        for (int i = 1; i < components.length; i++) {
+          if (element == null) {
+            return null;
+          }
+          element = element.getChild(components[i]);
         }
-        element = element.getChild(components[i]);
+        return element;
       }
-      return element;
+      if (AnalysisEngine.isHtmlFileName(sourceName)) {
+        return computeHtmlElement(source);
+      }
     } on AnalysisException catch (exception) {
-      return null;
     }
+    return null;
   }
 
   @override
@@ -1440,6 +1452,9 @@
   }
 
   @override
+  List<Source> get prioritySources => _priorityOrder;
+
+  @override
   Namespace getPublicNamespace(LibraryElement library) {
     // TODO(brianwilkerson) Rename this to not start with 'get'. Note that this is not part of the
     // API of the interface.
@@ -1522,7 +1537,7 @@
    * @return a list of the sources that would be processed by [performAnalysisTask]
    */
   List<Source> get sourcesNeedingProcessing {
-    Set<Source> sources = new Set<Source>();
+    HashSet<Source> sources = new HashSet<Source>();
     bool hintsEnabled = _options.hint;
     //
     // Look for priority sources that need to be analyzed.
@@ -1738,7 +1753,7 @@
 
   @override
   void set analysisOptions(AnalysisOptions options) {
-    bool needsRecompute = this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
+    bool needsRecompute = this._options.analyzeAngular != options.analyzeAngular || this._options.analyzeFunctionBodies != options.analyzeFunctionBodies || this._options.generateSdkErrors != options.generateSdkErrors || this._options.enableDeferredLoading != options.enableDeferredLoading || this._options.dart2jsHint != options.dart2jsHint || (this._options.hint && !options.hint) || this._options.preserveComments != options.preserveComments;
     int cacheSize = options.cacheSize;
     if (this._options.cacheSize != cacheSize) {
       this._options.cacheSize = cacheSize;
@@ -1756,6 +1771,7 @@
         _priorityOrder = newPriorityOrder;
       }
     }
+    this._options.analyzeAngular = options.analyzeAngular;
     this._options.analyzeFunctionBodies = options.analyzeFunctionBodies;
     this._options.generateSdkErrors = options.generateSdkErrors;
     this._options.enableDeferredLoading = options.enableDeferredLoading;
@@ -2490,7 +2506,7 @@
    * @param library the library on which the other libraries depend
    * @param librariesToInvalidate the libraries that depend on the given library
    */
-  void _computeAllLibrariesDependingOn(Source library, Set<Source> librariesToInvalidate) {
+  void _computeAllLibrariesDependingOn(Source library, HashSet<Source> librariesToInvalidate) {
     if (librariesToInvalidate.add(library)) {
       for (Source dependentLibrary in getLibrariesDependingOn(library)) {
         _computeAllLibrariesDependingOn(dependentLibrary, librariesToInvalidate);
@@ -3519,7 +3535,7 @@
    * @param hintsEnabled `true` if hints are currently enabled
    * @param sources the set to which sources should be added
    */
-  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, Set<Source> sources) {
+  void _getSourcesNeedingProcessing(Source source, SourceEntry sourceEntry, bool isPriority, bool hintsEnabled, HashSet<Source> sources) {
     if (sourceEntry is DartEntry) {
       DartEntry dartEntry = sourceEntry;
       CacheState scanErrorsState = dartEntry.getState(DartEntry.SCAN_ERRORS);
@@ -3554,23 +3570,25 @@
               return;
             }
           }
-          CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
-          if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
-            LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
-            if (libraryElement != null) {
-              sources.add(source);
-              return;
-            }
-          }
-          if (hintsEnabled) {
-            CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
-            if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
+          if (_generateSdkErrors || !source.isInSystemLibrary) {
+            CacheState verificationErrorsState = dartEntry.getStateInLibrary(DartEntry.VERIFICATION_ERRORS, librarySource);
+            if (verificationErrorsState == CacheState.INVALID || (isPriority && verificationErrorsState == CacheState.FLUSHED)) {
               LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
               if (libraryElement != null) {
                 sources.add(source);
                 return;
               }
             }
+            if (hintsEnabled) {
+              CacheState hintsState = dartEntry.getStateInLibrary(DartEntry.HINTS, librarySource);
+              if (hintsState == CacheState.INVALID || (isPriority && hintsState == CacheState.FLUSHED)) {
+                LibraryElement libraryElement = libraryEntry.getValue(DartEntry.ELEMENT);
+                if (libraryElement != null) {
+                  sources.add(source);
+                  return;
+                }
+              }
+            }
           }
         }
       }
@@ -3627,7 +3645,7 @@
    * <b>Note:</b> This method must only be invoked while we are synchronized on [cacheLock].
    */
   void _invalidateAllLocalResolutionInformation() {
-    Map<Source, List<Source>> oldPartMap = new Map<Source, List<Source>>();
+    HashMap<Source, List<Source>> oldPartMap = new HashMap<Source, List<Source>>();
     MapIterator<Source, SourceEntry> iterator = _privatePartition.iterator();
     while (iterator.moveNext()) {
       Source source = iterator.key;
@@ -3750,7 +3768,7 @@
    *          infinite recursion
    * @return `true` if this library is, or depends on, dart:html
    */
-  bool _isClient(LibraryElement library, Source htmlSource, Set<LibraryElement> visitedLibraries) {
+  bool _isClient(LibraryElement library, Source htmlSource, HashSet<LibraryElement> visitedLibraries) {
     if (visitedLibraries.contains(library)) {
       return false;
     }
@@ -3870,7 +3888,7 @@
               LibraryElementImpl libraryElement = library.libraryElement;
               dartCopy.setValue(DartEntry.ELEMENT, libraryElement);
               dartCopy.setValue(DartEntry.IS_LAUNCHABLE, libraryElement.entryPoint != null);
-              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new Set<LibraryElement>()));
+              dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(libraryElement, htmlSource, new HashSet<LibraryElement>()));
             }
           } else {
             dartCopy.recordBuildElementErrorInLibrary(librarySource, thrownException);
@@ -3949,7 +3967,7 @@
   void _recordElementData(DartEntryImpl dartCopy, LibraryElement library, Source librarySource, Source htmlSource) {
     dartCopy.setValue(DartEntry.ELEMENT, library);
     dartCopy.setValue(DartEntry.IS_LAUNCHABLE, library.entryPoint != null);
-    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new Set<LibraryElement>()));
+    dartCopy.setValue(DartEntry.IS_CLIENT, _isClient(library, htmlSource, new HashSet<LibraryElement>()));
   }
 
   /**
@@ -4038,7 +4056,7 @@
     Source librarySource = task.libraryElement.source;
     CaughtException thrownException = task.exception;
     DartEntry libraryEntry = null;
-    Map<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
+    HashMap<Source, TimestampedData<List<AnalysisError>>> hintMap = task.hintMap;
     if (hintMap == null) {
       // We don't have any information about which sources to mark as invalid other than the library
       // source.
@@ -4949,7 +4967,7 @@
    *
    * @param oldPartMap the table containing the parts associated with each library
    */
-  void _removeFromPartsUsingMap(Map<Source, List<Source>> oldPartMap) {
+  void _removeFromPartsUsingMap(HashMap<Source, List<Source>> oldPartMap) {
     for (MapEntry<Source, List<Source>> entry in getMapEntrySet(oldPartMap)) {
       Source librarySource = entry.getKey();
       List<Source> oldParts = entry.getValue();
@@ -5036,7 +5054,7 @@
       _workManager.add(source, SourcePriority.HTML);
     } else if (sourceEntry is DartEntry) {
       List<Source> containingLibraries = getLibrariesContaining(source);
-      Set<Source> librariesToInvalidate = new Set<Source>();
+      HashSet<Source> librariesToInvalidate = new HashSet<Source>();
       for (Source containingLibrary in containingLibraries) {
         _computeAllLibrariesDependingOn(containingLibrary, librariesToInvalidate);
       }
@@ -5066,7 +5084,7 @@
       htmlCopy.recordContentError(new CaughtException(new AnalysisException("This source was marked as being deleted"), null));
       _cache.put(source, htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      Set<Source> libraries = new Set<Source>();
+      HashSet<Source> libraries = new HashSet<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5095,7 +5113,7 @@
       HtmlEntryImpl htmlCopy = sourceEntry.writableCopy;
       _invalidateAngularResolution(htmlCopy);
     } else if (sourceEntry is DartEntry) {
-      Set<Source> libraries = new Set<Source>();
+      HashSet<Source> libraries = new HashSet<Source>();
       for (Source librarySource in getLibrariesContaining(source)) {
         libraries.add(librarySource);
         for (Source dependentLibrary in getLibrariesDependingOn(librarySource)) {
@@ -5261,7 +5279,7 @@
    * A table mapping the sources of the defining compilation units of libraries to the
    * representation of the library that has the information needed to resolve the library.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * The dependency graph used to compute the libraries in the cycle.
@@ -5558,7 +5576,7 @@
    *
    * @param library the library being tested
    */
-  void _ensureExports(ResolvableLibrary library, Set<Source> visitedLibraries) {
+  void _ensureExports(ResolvableLibrary library, HashSet<Source> visitedLibraries) {
     List<ResolvableLibrary> dependencies = library.exports;
     int dependencyCount = dependencies.length;
     for (int i = 0; i < dependencyCount; i++) {
@@ -5610,7 +5628,7 @@
    * cycle (but are not themselves in the cycle) have element models built for them.
    */
   void _ensureImportsAndExports() {
-    Set<Source> visitedLibraries = new Set<Source>();
+    HashSet<Source> visitedLibraries = new HashSet<Source>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -5636,16 +5654,18 @@
     List<CycleBuilder_SourceEntryPair> pairs = new List<CycleBuilder_SourceEntryPair>();
     Source librarySource = library.librarySource;
     DartEntry libraryEntry = AnalysisContextImpl_this._getReadableDartEntry(librarySource);
-    _ensureResolvableCompilationUnit(librarySource, libraryEntry);
-    pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
-    List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
-    int count = partSources.length;
-    for (int i = 0; i < count; i++) {
-      Source partSource = partSources[i];
-      DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
-      if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
-        _ensureResolvableCompilationUnit(partSource, partEntry);
-        pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
+    if (libraryEntry != null && libraryEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+      _ensureResolvableCompilationUnit(librarySource, libraryEntry);
+      pairs.add(new CycleBuilder_SourceEntryPair(librarySource, libraryEntry));
+      List<Source> partSources = _getSources(librarySource, libraryEntry, DartEntry.INCLUDED_PARTS);
+      int count = partSources.length;
+      for (int i = 0; i < count; i++) {
+        Source partSource = partSources[i];
+        DartEntry partEntry = AnalysisContextImpl_this._getReadableDartEntry(partSource);
+        if (partEntry != null && partEntry.getState(DartEntry.PARSED_UNIT) != CacheState.ERROR) {
+          _ensureResolvableCompilationUnit(partSource, partEntry);
+          pairs.add(new CycleBuilder_SourceEntryPair(partSource, partEntry));
+        }
       }
     }
     return pairs;
@@ -5666,9 +5686,9 @@
     }
   }
 
-  Set<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
+  HashSet<Source> _gatherSources(List<CycleBuilder_LibraryPair> libraryData) {
     int libraryCount = libraryData.length;
-    Set<Source> sources = new Set<Source>();
+    HashSet<Source> sources = new HashSet<Source>();
     for (int i = 0; i < libraryCount; i++) {
       List<CycleBuilder_SourceEntryPair> entryPairs = libraryData[i].entryPairs;
       int entryCount = entryPairs.length;
@@ -5784,11 +5804,11 @@
  * Implementation of the [AnalysisContextStatistics].
  */
 class AnalysisContextStatisticsImpl implements AnalysisContextStatistics {
-  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new Map<String, AnalysisContextStatistics_CacheRow>();
+  Map<String, AnalysisContextStatistics_CacheRow> _dataMap = new HashMap<String, AnalysisContextStatistics_CacheRow>();
 
   List<Source> _sources = new List<Source>();
 
-  Set<CaughtException> _exceptions = new Set<CaughtException>();
+  HashSet<CaughtException> _exceptions = new HashSet<CaughtException>();
 
   List<AnalysisContextStatistics_PartitionData> _partitionData;
 
@@ -5965,7 +5985,7 @@
   /**
    * A mapping from source to what type of analysis should be performed on that source.
    */
-  Map<Source, AnalysisLevel> _analysisMap = new Map<Source, AnalysisLevel>();
+  HashMap<Source, AnalysisLevel> _analysisMap = new HashMap<Source, AnalysisLevel>();
 
   /**
    * Return a collection of the sources that have been added. This is equivalent to calling
@@ -7645,7 +7665,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -7759,7 +7779,7 @@
   void _buildDirectiveModels() {
     AnalysisContext analysisContext = context;
     for (ResolvableLibrary library in librariesInCycle) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -7872,8 +7892,8 @@
    *
    * @return the map that was built
    */
-  Map<Source, ResolvableLibrary> _buildLibraryMap() {
-    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
+    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
     int libraryCount = librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = librariesInCycle[i];
@@ -7936,7 +7956,7 @@
   /**
    * A table mapping the sources known to the context to the information known about the source.
    */
-  Map<Source, SourceEntry> _sourceMap = new Map<Source, SourceEntry>();
+  HashMap<Source, SourceEntry> _sourceMap = new HashMap<Source, SourceEntry>();
 
   /**
    * The maximum number of sources for which AST structures should be kept in the cache.
@@ -8358,13 +8378,13 @@
    * A table mapping the sources whose content has been changed to the current content of those
    * sources.
    */
-  Map<Source, String> _changedContent = new Map<Source, String>();
+  HashMap<Source, String> _changedContent = new HashMap<Source, String>();
 
   /**
    * A table mapping the sources whose content has been changed within a single range to the current
    * content of those sources and information about the affected range.
    */
-  final Map<Source, ChangeSet_ContentChange> changedRanges = new Map<Source, ChangeSet_ContentChange>();
+  final HashMap<Source, ChangeSet_ContentChange> changedRanges = new HashMap<Source, ChangeSet_ContentChange>();
 
   /**
    * A list containing the sources that have been removed.
@@ -8417,7 +8437,8 @@
 
   /**
    * Record that the specified source has been changed. If the content of the source was previously
-   * overridden, use [changedContent] instead.
+   * overridden, this has no effect (the content remains overridden). To cancel (or change) the
+   * override, use [changedContent] instead.
    *
    * @param source the source that was changed
    */
@@ -8536,7 +8557,7 @@
    * @param label the label used to prefix the sources
    * @return `true` if future lists of sources will need a separator
    */
-  bool _appendSources2(JavaStringBuilder builder, Map<Source, dynamic> sources, bool needsSeparator, String label) {
+  bool _appendSources2(JavaStringBuilder builder, HashMap<Source, dynamic> sources, bool needsSeparator, String label) {
     if (sources.isEmpty) {
       return needsSeparator;
     }
@@ -10478,7 +10499,7 @@
    * A table mapping the sources that were analyzed to the hints that were generated for the
    * sources.
    */
-  Map<Source, TimestampedData<List<AnalysisError>>> _hintMap;
+  HashMap<Source, TimestampedData<List<AnalysisError>>> _hintMap;
 
   /**
    * Initialize a newly created task to perform analysis within the given context.
@@ -10501,7 +10522,7 @@
    * @return a table mapping the sources that were analyzed to the hints that were generated for the
    *         sources
    */
-  Map<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
+  HashMap<Source, TimestampedData<List<AnalysisError>>> get hintMap => _hintMap;
 
   @override
   String get taskDescription {
@@ -10531,7 +10552,7 @@
     //
     // Store the results.
     //
-    _hintMap = new Map<Source, TimestampedData<List<AnalysisError>>>();
+    _hintMap = new HashMap<Source, TimestampedData<List<AnalysisError>>>();
     for (int i = 0; i < unitCount; i++) {
       int modificationTime = _units[i].modificationTime;
       Source source = _units[i].data.element.source;
@@ -11980,6 +12001,18 @@
   }
 
   @override
+  List<Source> get prioritySources {
+    InstrumentationBuilder instrumentation = Instrumentation.builder2("Analysis-getPrioritySources");
+    _checkThread(instrumentation);
+    try {
+      instrumentation.metric3("contextId", _contextId);
+      return _basis.prioritySources;
+    } finally {
+      instrumentation.log();
+    }
+  }
+
+  @override
   Namespace getPublicNamespace(LibraryElement library) => _basis.getPublicNamespace(library);
 
   @override
@@ -12315,6 +12348,14 @@
   InternalAnalysisContext extractContextInto(SourceContainer container, InternalAnalysisContext newContext);
 
   /**
+   * Return an array containing all of the sources that have been marked as priority sources.
+   * Clients must not modify the returned array.
+   *
+   * @return the sources that have been marked as priority sources
+   */
+  List<Source> get prioritySources;
+
+  /**
    * Return a namespace containing mappings for all of the public names defined by the given
    * library.
    *
@@ -12762,17 +12803,17 @@
   /**
    * A set containing the sources referenced by 'export' directives.
    */
-  Set<Source> _exportedSources = new Set<Source>();
+  HashSet<Source> _exportedSources = new HashSet<Source>();
 
   /**
    * A set containing the sources referenced by 'import' directives.
    */
-  Set<Source> _importedSources = new Set<Source>();
+  HashSet<Source> _importedSources = new HashSet<Source>();
 
   /**
    * A set containing the sources referenced by 'part' directives.
    */
-  Set<Source> _includedSources = new Set<Source>();
+  HashSet<Source> _includedSources = new HashSet<Source>();
 
   /**
    * The errors that were produced by scanning and parsing the source.
@@ -12907,7 +12948,7 @@
    * @param sources the set to be converted
    * @return an array containing all of the sources in the given set
    */
-  List<Source> _toArray(Set<Source> sources) {
+  List<Source> _toArray(HashSet<Source> sources) {
     int size = sources.length;
     if (size == 0) {
       return Source.EMPTY_ARRAY;
@@ -13071,7 +13112,7 @@
   /**
    * A table mapping SDK's to the partitions used for those SDK's.
    */
-  Map<DartSdk, SdkCachePartition> _sdkPartitions = new Map<DartSdk, SdkCachePartition>();
+  HashMap<DartSdk, SdkCachePartition> _sdkPartitions = new HashMap<DartSdk, SdkCachePartition>();
 
   /**
    * The default cache size for a Dart SDK partition.
@@ -13654,7 +13695,7 @@
   /**
    * A HashMap of lists containing the errors that were collected, keyed by each [Source].
    */
-  Map<Source, Set<AnalysisError>> _errors = new Map<Source, Set<AnalysisError>>();
+  Map<Source, HashSet<AnalysisError>> _errors = new HashMap<Source, HashSet<AnalysisError>>();
 
   /**
    * Add all of the errors recorded by the given listener to this listener.
@@ -13673,13 +13714,13 @@
    * @return an array of errors (not `null`, contains no `null`s)
    */
   List<AnalysisError> get errors {
-    Iterable<MapEntry<Source, Set<AnalysisError>>> entrySet = getMapEntrySet(_errors);
+    Iterable<MapEntry<Source, HashSet<AnalysisError>>> entrySet = getMapEntrySet(_errors);
     int numEntries = entrySet.length;
     if (numEntries == 0) {
       return AnalysisError.NO_ERRORS;
     }
     List<AnalysisError> resultList = new List<AnalysisError>();
-    for (MapEntry<Source, Set<AnalysisError>> entry in entrySet) {
+    for (MapEntry<Source, HashSet<AnalysisError>> entry in entrySet) {
       resultList.addAll(entry.getValue());
     }
     return new List.from(resultList);
@@ -13693,7 +13734,7 @@
    * @return the errors collected by the listener for the passed [Source]
    */
   List<AnalysisError> getErrorsForSource(Source source) {
-    Set<AnalysisError> errorsForSource = _errors[source];
+    HashSet<AnalysisError> errorsForSource = _errors[source];
     if (errorsForSource == null) {
       return AnalysisError.NO_ERRORS;
     } else {
@@ -13704,9 +13745,9 @@
   @override
   void onError(AnalysisError error) {
     Source source = error.source;
-    Set<AnalysisError> errorsForSource = _errors[source];
+    HashSet<AnalysisError> errorsForSource = _errors[source];
     if (_errors[source] == null) {
-      errorsForSource = new Set<AnalysisError>();
+      errorsForSource = new HashSet<AnalysisError>();
       _errors[source] = errorsForSource;
     }
     errorsForSource.add(error);
diff --git a/pkg/analyzer/lib/src/generated/error.dart b/pkg/analyzer/lib/src/generated/error.dart
index e92f2ae..5cdc4b9 100644
--- a/pkg/analyzer/lib/src/generated/error.dart
+++ b/pkg/analyzer/lib/src/generated/error.dart
@@ -7,11 +7,12 @@
 
 library engine.error;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'source.dart';
 import 'scanner.dart' show Token;
 import 'ast.dart' show AstNode;
-import 'element.dart' show Element;
+import 'element.dart';
 
 /**
  * Instances of the class `AnalysisError` represent an error discovered during the analysis of
@@ -244,7 +245,7 @@
   /**
    * The properties associated with this error.
    */
-  Map<ErrorProperty, Object> _propertyMap = new Map<ErrorProperty, Object>();
+  HashMap<ErrorProperty, Object> _propertyMap = new HashMap<ErrorProperty, Object>();
 
   /**
    * Initialize a newly created analysis error for the specified source. The error has no location
@@ -353,6 +354,9 @@
 
   @override
   ErrorType get type => ErrorType.ANGULAR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1000,14 +1004,20 @@
    * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
    * <b>this</b>.<i>id</i>.
    */
-  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 74, "Instance member cannot be accessed from static method");
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_FACTORY = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_FACTORY', 74, "Instance members cannot be accessed from a factory constructor");
+
+  /**
+   * 12.30 Identifier Reference: Otherwise, e is equivalent to the property extraction
+   * <b>this</b>.<i>id</i>.
+   */
+  static const CompileTimeErrorCode INSTANCE_MEMBER_ACCESS_FROM_STATIC = const CompileTimeErrorCode.con1('INSTANCE_MEMBER_ACCESS_FROM_STATIC', 75, "Instance members cannot be accessed from a static method");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 75, "Annotation can be only constant variable or constant constructor invocation");
+  static const CompileTimeErrorCode INVALID_ANNOTATION = const CompileTimeErrorCode.con1('INVALID_ANNOTATION', 76, "Annotation can be only constant variable or constant constructor invocation");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1017,7 +1027,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 76, "Constant values from a deferred library cannot be used as annotations");
+  static const CompileTimeErrorCode INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY', 77, "Constant values from a deferred library cannot be used as annotations");
 
   /**
    * TODO(brianwilkerson) Remove this when we have decided on how to report errors in compile-time
@@ -1025,26 +1035,26 @@
    *
    * See TODOs in ConstantVisitor
    */
-  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 77, "Invalid constant value");
+  static const CompileTimeErrorCode INVALID_CONSTANT = const CompileTimeErrorCode.con1('INVALID_CONSTANT', 78, "Invalid constant value");
 
   /**
    * 7.6 Constructors: It is a compile-time error if the name of a constructor is not a constructor
    * name.
    */
-  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 78, "Invalid constructor name");
+  static const CompileTimeErrorCode INVALID_CONSTRUCTOR_NAME = const CompileTimeErrorCode.con1('INVALID_CONSTRUCTOR_NAME', 79, "Invalid constructor name");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>M</i> is not the name of the immediately
    * enclosing class.
    */
-  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 79, "The name of the immediately enclosing class expected");
+  static const CompileTimeErrorCode INVALID_FACTORY_NAME_NOT_A_CLASS = const CompileTimeErrorCode.con1('INVALID_FACTORY_NAME_NOT_A_CLASS', 80, "The name of the immediately enclosing class expected");
 
   /**
    * 12.10 This: It is a compile-time error if this appears in a top-level function or variable
    * initializer, in a factory constructor, or in a static method or variable initializer, or in the
    * initializer of an instance variable.
    */
-  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 80, "Invalid reference to 'this' expression");
+  static const CompileTimeErrorCode INVALID_REFERENCE_TO_THIS = const CompileTimeErrorCode.con1('INVALID_REFERENCE_TO_THIS', 81, "Invalid reference to 'this' expression");
 
   /**
    * 12.6 Lists: It is a compile time error if the type argument of a constant list literal includes
@@ -1052,7 +1062,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 81, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_LIST = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_LIST', 82, "Constant list literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 12.7 Maps: It is a compile time error if the type arguments of a constant map literal include a
@@ -1060,7 +1070,7 @@
    *
    * @name the name of the type parameter
    */
-  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 82, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
+  static const CompileTimeErrorCode INVALID_TYPE_ARGUMENT_IN_CONST_MAP = const CompileTimeErrorCode.con1('INVALID_TYPE_ARGUMENT_IN_CONST_MAP', 83, "Constant map literals cannot include a type parameter as a type argument, such as '%s'");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1075,7 +1085,7 @@
    * @param uri the URI that is invalid
    * @see #URI_DOES_NOT_EXIST
    */
-  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 83, "Invalid URI syntax: '%s'");
+  static const CompileTimeErrorCode INVALID_URI = const CompileTimeErrorCode.con1('INVALID_URI', 84, "Invalid URI syntax: '%s'");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1086,7 +1096,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 84, "Cannot reference label '%s' declared in an outer method");
+  static const CompileTimeErrorCode LABEL_IN_OUTER_SCOPE = const CompileTimeErrorCode.con1('LABEL_IN_OUTER_SCOPE', 85, "Cannot reference label '%s' declared in an outer method");
 
   /**
    * 13.13 Break: It is a compile-time error if no such statement <i>s<sub>E</sub></i> exists within
@@ -1097,7 +1107,7 @@
    *
    * @param labelName the name of the unresolvable label
    */
-  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 85, "Cannot reference undefined label '%s'");
+  static const CompileTimeErrorCode LABEL_UNDEFINED = const CompileTimeErrorCode.con1('LABEL_UNDEFINED', 86, "Cannot reference undefined label '%s'");
 
   /**
    * 12.6 Lists: A run-time list literal &lt;<i>E</i>&gt; [<i>e<sub>1</sub></i> ...
@@ -1111,7 +1121,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 86, "The element type '%s' cannot be assigned to the list type '%s'");
+  static const CompileTimeErrorCode LIST_ELEMENT_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('LIST_ELEMENT_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the list type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1125,7 +1135,7 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 87, "The element type '%s' cannot be assigned to the map key type '%s'");
+  static const CompileTimeErrorCode MAP_KEY_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_KEY_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map key type '%s'");
 
   /**
    * 12.7 Map: A run-time map literal &lt;<i>K</i>, <i>V</i>&gt; [<i>k<sub>1</sub></i> :
@@ -1139,13 +1149,13 @@
    * It is a static warning if <i>T<sub>j</sub></i> may not be assigned to <i>S<sub>j</sub>, 1 &lt;=
    * j &lt;= m</i>.
    */
-  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 88, "The element type '%s' cannot be assigned to the map value type '%s'");
+  static const CompileTimeErrorCode MAP_VALUE_TYPE_NOT_ASSIGNABLE = const CompileTimeErrorCode.con1('MAP_VALUE_TYPE_NOT_ASSIGNABLE', 89, "The element type '%s' cannot be assigned to the map value type '%s'");
 
   /**
    * 7 Classes: It is a compile time error if a class <i>C</i> declares a member with the same name
    * as <i>C</i>.
    */
-  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 89, "Class members cannot have the same name as the enclosing class");
+  static const CompileTimeErrorCode MEMBER_WITH_CLASS_NAME = const CompileTimeErrorCode.con1('MEMBER_WITH_CLASS_NAME', 90, "Class members cannot have the same name as the enclosing class");
 
   /**
    * 7.2 Getters: It is a compile-time error if a class has both a getter and a method with the same
@@ -1153,17 +1163,17 @@
    *
    * @param name the conflicting name of the getter and method
    */
-  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 90, "'%s' cannot be used to name a method, there is already a getter with the same name");
+  static const CompileTimeErrorCode METHOD_AND_GETTER_WITH_SAME_NAME = const CompileTimeErrorCode.con1('METHOD_AND_GETTER_WITH_SAME_NAME', 91, "'%s' cannot be used to name a method, there is already a getter with the same name");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant list literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 91, "List literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_LIST_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_LIST_LITERAL', 92, "List literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 12.1 Constants: A constant expression is ... a constant map literal.
    */
-  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 92, "Map literals must be prefixed with 'const' when used as a constant expression");
+  static const CompileTimeErrorCode MISSING_CONST_IN_MAP_LITERAL = const CompileTimeErrorCode.con1('MISSING_CONST_IN_MAP_LITERAL', 93, "Map literals must be prefixed with 'const' when used as a constant expression");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin explicitly declares a
@@ -1171,7 +1181,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 93, "The class '%s' cannot be used as a mixin because it declares a constructor");
+  static const CompileTimeErrorCode MIXIN_DECLARES_CONSTRUCTOR = const CompileTimeErrorCode.con1('MIXIN_DECLARES_CONSTRUCTOR', 94, "The class '%s' cannot be used as a mixin because it declares a constructor");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if the with clause of a mixin application
@@ -1181,7 +1191,7 @@
    * @see #EXTENDS_DEFERRED_CLASS
    * @see #IMPLEMENTS_DEFERRED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 94, "This class cannot mixin the deferred class '%s'");
+  static const CompileTimeErrorCode MIXIN_DEFERRED_CLASS = const CompileTimeErrorCode.con1('MIXIN_DEFERRED_CLASS', 95, "This class cannot mixin the deferred class '%s'");
 
   /**
    * 9 Mixins: It is a compile-time error if a mixin is derived from a class whose superclass is not
@@ -1189,7 +1199,7 @@
    *
    * @param typeName the name of the mixin that is invalid
    */
-  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 95, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
+  static const CompileTimeErrorCode MIXIN_INHERITS_FROM_NOT_OBJECT = const CompileTimeErrorCode.con1('MIXIN_INHERITS_FROM_NOT_OBJECT', 96, "The class '%s' cannot be used as a mixin because it extends a class other than Object");
 
   /**
    * 12.2 Null: It is a compile-time error for a class to attempt to extend or implement Null.
@@ -1208,43 +1218,43 @@
    * @param typeName the name of the type that cannot be extended
    * @see #IMPLEMENTS_DISALLOWED_CLASS
    */
-  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 96, "Classes cannot mixin '%s'");
+  static const CompileTimeErrorCode MIXIN_OF_DISALLOWED_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_DISALLOWED_CLASS', 97, "Classes cannot mixin '%s'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>M</i> does not denote a class or mixin
    * available in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 97, "Classes can only mixin other classes");
+  static const CompileTimeErrorCode MIXIN_OF_NON_CLASS = const CompileTimeErrorCode.con1('MIXIN_OF_NON_CLASS', 98, "Classes can only mixin other classes");
 
   /**
    * 9 Mixins: It is a compile-time error if a declared or derived mixin refers to super.
    */
-  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 98, "The class '%s' cannot be used as a mixin because it references 'super'");
+  static const CompileTimeErrorCode MIXIN_REFERENCES_SUPER = const CompileTimeErrorCode.con1('MIXIN_REFERENCES_SUPER', 99, "The class '%s' cannot be used as a mixin because it references 'super'");
 
   /**
    * 9.1 Mixin Application: It is a compile-time error if <i>S</i> does not denote a class available
    * in the immediately enclosing scope.
    */
-  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 99, "Mixin can only be applied to class");
+  static const CompileTimeErrorCode MIXIN_WITH_NON_CLASS_SUPERCLASS = const CompileTimeErrorCode.con1('MIXIN_WITH_NON_CLASS_SUPERCLASS', 100, "Mixin can only be applied to class");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 100, "Constructor may have at most one 'this' redirection");
+  static const CompileTimeErrorCode MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS = const CompileTimeErrorCode.con1('MULTIPLE_REDIRECTING_CONSTRUCTOR_INVOCATIONS', 101, "Constructor may have at most one 'this' redirection");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. Then <i>k</i> may
    * include at most one superinitializer in its initializer list or a compile time error occurs.
    */
-  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 101, "Constructor may have at most one 'super' initializer");
+  static const CompileTimeErrorCode MULTIPLE_SUPER_INITIALIZERS = const CompileTimeErrorCode.con1('MULTIPLE_SUPER_INITIALIZERS', 102, "Constructor may have at most one 'super' initializer");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
    * character @, followed by a constant expression that must be either a reference to a
    * compile-time constant variable, or a call to a constant constructor.
    */
-  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 102, "Annotation creation must have arguments");
+  static const CompileTimeErrorCode NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS = const CompileTimeErrorCode.con1('NO_ANNOTATION_CONSTRUCTOR_ARGUMENTS', 103, "Annotation creation must have arguments");
 
   /**
    * 7.6.1 Generative Constructors: If no superinitializer is provided, an implicit superinitializer
@@ -1254,7 +1264,7 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 103, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_EXPLICIT', 104, "The class '%s' does not have a default constructor");
 
   /**
    * 7.6 Constructors: Iff no constructor is specified for a class <i>C</i>, it implicitly has a
@@ -1263,13 +1273,13 @@
    * 7.6.1 Generative constructors. It is a compile-time error if class <i>S</i> does not declare a
    * generative constructor named <i>S</i> (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 104, "The class '%s' does not have a default constructor");
+  static const CompileTimeErrorCode NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT = const CompileTimeErrorCode.con1('NO_DEFAULT_SUPER_CONSTRUCTOR_IMPLICIT', 105, "The class '%s' does not have a default constructor");
 
   /**
    * 13.2 Expression Statements: It is a compile-time error if a non-constant map literal that has
    * no explicit type arguments appears in a place where a statement is expected.
    */
-  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 105, "A non-constant map literal without type arguments cannot be used as an expression statement");
+  static const CompileTimeErrorCode NON_CONST_MAP_AS_EXPRESSION_STATEMENT = const CompileTimeErrorCode.con1('NON_CONST_MAP_AS_EXPRESSION_STATEMENT', 106, "A non-constant map literal without type arguments cannot be used as an expression statement");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1280,7 +1290,7 @@
    * s<sub>n</sub>}</i>, it is a compile-time error if the expressions <i>e<sub>k</sub></i> are not
    * compile-time constants, for all <i>1 &lt;= k &lt;= n</i>.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 106, "Case expressions must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION', 107, "Case expressions must be constant");
 
   /**
    * 13.9 Switch: Given a switch statement of the form <i>switch (e) { label<sub>11</sub> &hellip;
@@ -1294,13 +1304,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 107, "Constant values from a deferred library cannot be used as a case expression");
+  static const CompileTimeErrorCode NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_CASE_EXPRESSION_FROM_DEFERRED_LIBRARY', 108, "Constant values from a deferred library cannot be used as a case expression");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
    * parameter is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 108, "Default values of an optional parameter must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE', 109, "Default values of an optional parameter must be constant");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the default value of an optional
@@ -1309,13 +1319,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 109, "Constant values from a deferred library cannot be used as a default parameter value");
+  static const CompileTimeErrorCode NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_DEFAULT_VALUE_FROM_DEFERRED_LIBRARY', 110, "Constant values from a deferred library cannot be used as a default parameter value");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
    * compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 110, "'const' lists must have all constant values");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT', 111, "'const' lists must have all constant values");
 
   /**
    * 12.6 Lists: It is a compile time error if an element of a constant list literal is not a
@@ -1324,13 +1334,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 111, "Constant values from a deferred library cannot be used as values in a 'const' list");
+  static const CompileTimeErrorCode NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_LIST_ELEMENT_FROM_DEFERRED_LIBRARY', 112, "Constant values from a deferred library cannot be used as values in a 'const' list");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 112, "The keys in a map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY', 113, "The keys in a map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1339,13 +1349,13 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 113, "Constant values from a deferred library cannot be used as keys in a map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_KEY_FROM_DEFERRED_LIBRARY', 114, "Constant values from a deferred library cannot be used as keys in a map");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
    * literal is not a compile-time constant.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 114, "The values in a 'const' map must be constant");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE', 115, "The values in a 'const' map must be constant");
 
   /**
    * 12.7 Maps: It is a compile time error if either a key or a value of an entry in a constant map
@@ -1354,7 +1364,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 115, "Constant values from a deferred library cannot be used as values in a 'const' map");
+  static const CompileTimeErrorCode NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_MAP_VALUE_FROM_DEFERRED_LIBRARY', 116, "Constant values from a deferred library cannot be used as values in a 'const' map");
 
   /**
    * 11 Metadata: Metadata consists of a series of annotations, each of which begin with the
@@ -1364,13 +1374,13 @@
    * "From deferred library" case is covered by
    * [CompileTimeErrorCode#INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY].
    */
-  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 116, "Annotation creation can use only 'const' constructor");
+  static const CompileTimeErrorCode NON_CONSTANT_ANNOTATION_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_CONSTANT_ANNOTATION_CONSTRUCTOR', 117, "Annotation creation can use only 'const' constructor");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
    * constant constructor must be a potentially constant expression, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 117, "Initializer expressions in constant constructors must be constants");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER', 118, "Initializer expressions in constant constructors must be constants");
 
   /**
    * 7.6.3 Constant Constructors: Any expression that appears within the initializer list of a
@@ -1379,7 +1389,7 @@
    * 12.1 Constants: A qualified reference to a static constant variable that is not qualified by a
    * deferred prefix.
    */
-  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 118, "Constant values from a deferred library cannot be used as constant initializers");
+  static const CompileTimeErrorCode NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY = const CompileTimeErrorCode.con1('NON_CONSTANT_VALUE_IN_INITIALIZER_FROM_DEFERRED_LIBRARY', 119, "Constant values from a deferred library cannot be used as constant initializers");
 
   /**
    * 12.14.2 Binding Actuals to Formals: It is a static warning if <i>m < h</i> or if <i>m > n</i>.
@@ -1390,7 +1400,7 @@
    * @param requiredCount the expected number of required arguments
    * @param argumentCount the actual number of positional arguments given
    */
-  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 119, "%d required argument(s) expected, but %d found");
+  static const CompileTimeErrorCode NOT_ENOUGH_REQUIRED_ARGUMENTS = const CompileTimeErrorCode.con1('NOT_ENOUGH_REQUIRED_ARGUMENTS', 120, "%d required argument(s) expected, but %d found");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1398,17 +1408,17 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 120, "The generative constructor '%s' expected, but factory found");
+  static const CompileTimeErrorCode NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('NON_GENERATIVE_CONSTRUCTOR', 121, "The generative constructor '%s' expected, but factory found");
 
   /**
    * 7.9 Superclasses: It is a compile-time error to specify an extends clause for class Object.
    */
-  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 121, "");
+  static const CompileTimeErrorCode OBJECT_CANNOT_EXTEND_ANOTHER_CLASS = const CompileTimeErrorCode.con1('OBJECT_CANNOT_EXTEND_ANOTHER_CLASS', 122, "");
 
   /**
    * 7.1.1 Operators: It is a compile-time error to declare an optional parameter in an operator.
    */
-  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 122, "Optional parameters are not allowed when defining an operator");
+  static const CompileTimeErrorCode OPTIONAL_PARAMETER_IN_OPERATOR = const CompileTimeErrorCode.con1('OPTIONAL_PARAMETER_IN_OPERATOR', 123, "Optional parameters are not allowed when defining an operator");
 
   /**
    * 14.3 Parts: It is a compile time error if the contents of the URI are not a valid part
@@ -1416,25 +1426,25 @@
    *
    * @param uri the uri pointing to a non-library declaration
    */
-  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 123, "The included part '%s' must have a part-of directive");
+  static const CompileTimeErrorCode PART_OF_NON_PART = const CompileTimeErrorCode.con1('PART_OF_NON_PART', 124, "The included part '%s' must have a part-of directive");
 
   /**
    * 14.1 Imports: It is a compile-time error if the current library declares a top-level member
    * named <i>p</i>.
    */
-  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 124, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
+  static const CompileTimeErrorCode PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER = const CompileTimeErrorCode.con1('PREFIX_COLLIDES_WITH_TOP_LEVEL_MEMBER', 125, "The name '%s' is already used as an import prefix and cannot be used to name a top-level element");
 
   /**
    * 6.2.2 Optional Formals: It is a compile-time error if the name of a named optional parameter
    * begins with an '_' character.
    */
-  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 125, "Named optional parameters cannot start with an underscore");
+  static const CompileTimeErrorCode PRIVATE_OPTIONAL_PARAMETER = const CompileTimeErrorCode.con1('PRIVATE_OPTIONAL_PARAMETER', 126, "Named optional parameters cannot start with an underscore");
 
   /**
    * 12.1 Constants: It is a compile-time error if the value of a compile-time constant expression
    * depends on itself.
    */
-  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 126, "");
+  static const CompileTimeErrorCode RECURSIVE_COMPILE_TIME_CONSTANT = const CompileTimeErrorCode.con1('RECURSIVE_COMPILE_TIME_CONSTANT', 127, "");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
@@ -1445,13 +1455,13 @@
    *
    * https://code.google.com/p/dart/issues/detail?id=954
    */
-  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 127, "Cycle in redirecting generative constructors");
+  static const CompileTimeErrorCode RECURSIVE_CONSTRUCTOR_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_CONSTRUCTOR_REDIRECT', 128, "Cycle in redirecting generative constructors");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if a redirecting factory constructor redirects to
    * itself, either directly or indirectly via a sequence of redirections.
    */
-  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 128, "Cycle in redirecting factory constructors");
+  static const CompileTimeErrorCode RECURSIVE_FACTORY_REDIRECT = const CompileTimeErrorCode.con1('RECURSIVE_FACTORY_REDIRECT', 129, "Cycle in redirecting factory constructors");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1464,7 +1474,7 @@
    * @param className the name of the class that implements itself recursively
    * @param strImplementsPath a string representation of the implements loop
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 129, "'%s' cannot be a superinterface of itself: %s");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE', 130, "'%s' cannot be a superinterface of itself: %s");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1476,7 +1486,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 130, "'%s' cannot extend itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_EXTENDS', 131, "'%s' cannot extend itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1488,7 +1498,7 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 131, "'%s' cannot implement itself");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_IMPLEMENTS', 132, "'%s' cannot implement itself");
 
   /**
    * 7.10 Superinterfaces: It is a compile-time error if the interface of a class <i>C</i> is a
@@ -1500,61 +1510,61 @@
    *
    * @param className the name of the class that implements itself recursively
    */
-  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 132, "'%s' cannot use itself as a mixin");
+  static const CompileTimeErrorCode RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH = const CompileTimeErrorCode.con1('RECURSIVE_INTERFACE_INHERITANCE_BASE_CASE_WITH', 133, "'%s' cannot use itself as a mixin");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 133, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_MISSING_CONSTRUCTOR', 134, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 134, "The name '%s' is not a type and cannot be used in a redirected constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CLASS = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CLASS', 135, "The name '%s' is not a type and cannot be used in a redirected constructor");
 
   /**
    * 7.6.2 Factories: It is a compile-time error if <i>k</i> is prefixed with the const modifier but
    * <i>k'</i> is not a constant constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 135, "Constant factory constructor cannot delegate to a non-constant constructor");
+  static const CompileTimeErrorCode REDIRECT_TO_NON_CONST_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_TO_NON_CONST_CONSTRUCTOR', 136, "Constant factory constructor cannot delegate to a non-constant constructor");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 136, "The constructor '%s' could not be found in '%s'");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_MISSING_CONSTRUCTOR', 137, "The constructor '%s' could not be found in '%s'");
 
   /**
    * 7.6.1 Generative constructors: A generative constructor may be <i>redirecting</i>, in which
    * case its only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 137, "Generative constructor cannot redirect to a factory constructor");
+  static const CompileTimeErrorCode REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('REDIRECT_GENERATIVE_TO_NON_GENERATIVE_CONSTRUCTOR', 138, "Generative constructor cannot redirect to a factory constructor");
 
   /**
    * 5 Variables: A local variable may only be referenced at a source code location that is after
    * its initializer, if any, is complete, or a compile-time error occurs.
    */
-  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 138, "Local variables cannot be referenced before they are declared");
+  static const CompileTimeErrorCode REFERENCED_BEFORE_DECLARATION = const CompileTimeErrorCode.con1('REFERENCED_BEFORE_DECLARATION', 139, "Local variables cannot be referenced before they are declared");
 
   /**
    * 12.8.1 Rethrow: It is a compile-time error if an expression of the form <i>rethrow;</i> is not
    * enclosed within a on-catch clause.
    */
-  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 139, "rethrow must be inside of a catch clause");
+  static const CompileTimeErrorCode RETHROW_OUTSIDE_CATCH = const CompileTimeErrorCode.con1('RETHROW_OUTSIDE_CATCH', 140, "rethrow must be inside of a catch clause");
 
   /**
    * 13.12 Return: It is a compile-time error if a return statement of the form <i>return e;</i>
    * appears in a generative constructor.
    */
-  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 140, "Constructors cannot return a value");
+  static const CompileTimeErrorCode RETURN_IN_GENERATIVE_CONSTRUCTOR = const CompileTimeErrorCode.con1('RETURN_IN_GENERATIVE_CONSTRUCTOR', 141, "Constructors cannot return a value");
 
   /**
    * 14.1 Imports: It is a compile-time error if a prefix used in a deferred import is used in
    * another import clause.
    */
-  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 141, "The prefix of a deferred import cannot be used in other import directives");
+  static const CompileTimeErrorCode SHARED_DEFERRED_PREFIX = const CompileTimeErrorCode.con1('SHARED_DEFERRED_PREFIX', 142, "The prefix of a deferred import cannot be used in other import directives");
 
   /**
    * 12.15.4 Super Invocation: A super method invocation <i>i</i> has the form
@@ -1564,19 +1574,19 @@
    * initializer list, in class Object, in a factory constructor, or in a static method or variable
    * initializer.
    */
-  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 142, "Invalid context for 'super' invocation");
+  static const CompileTimeErrorCode SUPER_IN_INVALID_CONTEXT = const CompileTimeErrorCode.con1('SUPER_IN_INVALID_CONTEXT', 143, "Invalid context for 'super' invocation");
 
   /**
    * 7.6.1 Generative Constructors: A generative constructor may be redirecting, in which case its
    * only action is to invoke another generative constructor.
    */
-  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 143, "The redirecting constructor cannot have a 'super' initializer");
+  static const CompileTimeErrorCode SUPER_IN_REDIRECTING_CONSTRUCTOR = const CompileTimeErrorCode.con1('SUPER_IN_REDIRECTING_CONSTRUCTOR', 144, "The redirecting constructor cannot have a 'super' initializer");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>k</i> be a generative constructor. It is a compile-time
    * error if a generative constructor of class Object includes a superinitializer.
    */
-  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 144, "");
+  static const CompileTimeErrorCode SUPER_INITIALIZER_IN_OBJECT = const CompileTimeErrorCode.con1('SUPER_INITIALIZER_IN_OBJECT', 145, "");
 
   /**
    * 12.11 Instance Creation: It is a static type warning if any of the type arguments to a
@@ -1595,19 +1605,19 @@
    * @param boundingTypeName the name of the bounding type
    * @see StaticTypeWarningCode#TYPE_ARGUMENT_NOT_MATCHING_BOUNDS
    */
-  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 145, "'%s' does not extend '%s'");
+  static const CompileTimeErrorCode TYPE_ARGUMENT_NOT_MATCHING_BOUNDS = const CompileTimeErrorCode.con1('TYPE_ARGUMENT_NOT_MATCHING_BOUNDS', 146, "'%s' does not extend '%s'");
 
   /**
    * 15.3.1 Typedef: Any self reference, either directly, or recursively via another typedef, is a
    * compile time error.
    */
-  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 146, "Type alias cannot reference itself directly or recursively via another typedef");
+  static const CompileTimeErrorCode TYPE_ALIAS_CANNOT_REFERENCE_ITSELF = const CompileTimeErrorCode.con1('TYPE_ALIAS_CANNOT_REFERENCE_ITSELF', 147, "Type alias cannot reference itself directly or recursively via another typedef");
 
   /**
    * 12.11.2 Const: It is a compile-time error if <i>T</i> is not a class accessible in the current
    * scope, optionally followed by type arguments.
    */
-  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 147, "Undefined class '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CLASS = const CompileTimeErrorCode.con1('UNDEFINED_CLASS', 148, "Undefined class '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1615,7 +1625,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 148, "The class '%s' does not have a generative constructor '%s'");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER', 149, "The class '%s' does not have a generative constructor '%s'");
 
   /**
    * 7.6.1 Generative Constructors: Let <i>C</i> be the class in which the superinitializer appears
@@ -1623,7 +1633,7 @@
    * a compile-time error if class <i>S</i> does not declare a generative constructor named <i>S</i>
    * (respectively <i>S.id</i>)
    */
-  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 149, "The class '%s' does not have a default generative constructor");
+  static const CompileTimeErrorCode UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT = const CompileTimeErrorCode.con1('UNDEFINED_CONSTRUCTOR_IN_INITIALIZER_DEFAULT', 150, "The class '%s' does not have a default generative constructor");
 
   /**
    * 12.14.2 Binding Actuals to Formals: Furthermore, each <i>q<sub>i</sub></i>, <i>1<=i<=l</i>,
@@ -1635,7 +1645,7 @@
    *
    * @param name the name of the requested named parameter
    */
-  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 150, "The named parameter '%s' is not defined");
+  static const CompileTimeErrorCode UNDEFINED_NAMED_PARAMETER = const CompileTimeErrorCode.con1('UNDEFINED_NAMED_PARAMETER', 151, "The named parameter '%s' is not defined");
 
   /**
    * 14.2 Exports: It is a compile-time error if the compilation unit found at the specified URI is
@@ -1650,7 +1660,7 @@
    * @param uri the URI pointing to a non-existent file
    * @see #INVALID_URI
    */
-  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 151, "Target of URI does not exist: '%s'");
+  static const CompileTimeErrorCode URI_DOES_NOT_EXIST = const CompileTimeErrorCode.con1('URI_DOES_NOT_EXIST', 152, "Target of URI does not exist: '%s'");
 
   /**
    * 14.1 Imports: It is a compile-time error if <i>x</i> is not a compile-time constant, or if
@@ -1662,7 +1672,7 @@
    * 14.5 URIs: It is a compile-time error if the string literal <i>x</i> that describes a URI is
    * not a compile-time constant, or if <i>x</i> involves string interpolation.
    */
-  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 152, "URIs cannot use string interpolation");
+  static const CompileTimeErrorCode URI_WITH_INTERPOLATION = const CompileTimeErrorCode.con1('URI_WITH_INTERPOLATION', 153, "URIs cannot use string interpolation");
 
   /**
    * 7.1.1 Operators: It is a compile-time error if the arity of the user-declared operator []= is
@@ -1675,7 +1685,7 @@
    * @param expectedNumberOfParameters the number of parameters expected
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 153, "Operator '%s' should declare exactly %d parameter(s), but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR', 154, "Operator '%s' should declare exactly %d parameter(s), but %d found");
 
   /**
    * 7.1.1 Operators: It is a compile time error if the arity of the user-declared operator - is not
@@ -1683,13 +1693,13 @@
    *
    * @param actualNumberOfParameters the number of parameters found in the operator declaration
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 154, "Operator '-' should declare 0 or 1 parameter, but %d found");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_OPERATOR_MINUS', 155, "Operator '-' should declare 0 or 1 parameter, but %d found");
 
   /**
    * 7.3 Setters: It is a compile-time error if a setter's formal parameter list does not include
    * exactly one required formal parameter <i>p</i>.
    */
-  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 155, "Setters should declare exactly one required parameter");
+  static const CompileTimeErrorCode WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER = const CompileTimeErrorCode.con1('WRONG_NUMBER_OF_PARAMETERS_FOR_SETTER', 156, "Setters should declare exactly one required parameter");
 
   static const List<CompileTimeErrorCode> values = const [
       AMBIGUOUS_EXPORT,
@@ -1766,6 +1776,7 @@
       INITIALIZER_FOR_STATIC_FIELD,
       INITIALIZING_FORMAL_FOR_NON_EXISTANT_FIELD,
       INITIALIZING_FORMAL_FOR_STATIC_FIELD,
+      INSTANCE_MEMBER_ACCESS_FROM_FACTORY,
       INSTANCE_MEMBER_ACCESS_FROM_STATIC,
       INVALID_ANNOTATION,
       INVALID_ANNOTATION_FROM_DEFERRED_LIBRARY,
@@ -1880,6 +1891,9 @@
 
   @override
   ErrorType get type => ErrorType.COMPILE_TIME_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -1921,6 +1935,13 @@
    * @return the type of the error
    */
   ErrorType get type;
+
+  /**
+   * Return a unique name for this error code.
+   *
+   * @return a unique name for this error code
+   */
+  String get uniqueName;
 }
 
 /**
@@ -1996,17 +2017,6 @@
    * Report an error with the given error code and arguments.
    *
    * @param errorCode the error code of the error to be reported
-   * @param node the node specifying the location of the error
-   * @param arguments the arguments to the error, used to compose the error message
-   */
-  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
-    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
-  }
-
-  /**
-   * Report an error with the given error code and arguments.
-   *
-   * @param errorCode the error code of the error to be reported
    * @param element the element which name should be used as the location of the error
    * @param arguments the arguments to the error, used to compose the error message
    */
@@ -2017,6 +2027,21 @@
   /**
    * Report an error with the given error code and arguments.
    *
+   * If the arguments contain the names of two or more types, the method
+   * [reportTypeErrorForNode] should be used and the types
+   * themselves (rather than their names) should be passed as arguments.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
+   * Report an error with the given error code and arguments.
+   *
    * @param errorCode the error code of the error to be reported
    * @param offset the offset of the location of the error
    * @param length the length of the location of the error
@@ -2038,6 +2063,24 @@
   }
 
   /**
+   * Report an error with the given error code and arguments. The arguments are expected to contain
+   * two or more types. Convert the types into strings by using the display names of the types,
+   * unless there are two or more types with the same names, in which case the extended display
+   * names of the types will be used in order to clarify the message.
+   *
+   * If there are not two or more types in the argument list, the method
+   * [reportErrorForNode] should be used instead.
+   *
+   * @param errorCode the error code of the error to be reported
+   * @param node the node specifying the location of the error
+   * @param arguments the arguments to the error, used to compose the error message
+   */
+  void reportTypeErrorForNode(ErrorCode errorCode, AstNode node, List<Object> arguments) {
+    _convertTypeNames(arguments);
+    reportErrorForOffset(errorCode, node.offset, node.length, arguments);
+  }
+
+  /**
    * Set the source to be used when reporting errors. Setting the source to `null` will cause
    * the default source to be used.
    *
@@ -2046,6 +2089,59 @@
   void set source(Source source) {
     this._source = source == null ? _defaultSource : source;
   }
+
+  /**
+   * Given an array of arguments that is expected to contain two or more types, convert the types
+   * into strings by using the display names of the types, unless there are two or more types with
+   * the same names, in which case the extended display names of the types will be used in order to
+   * clarify the message.
+   *
+   * @param arguments the arguments that are to be converted
+   */
+  void _convertTypeNames(List<Object> arguments) {
+    if (_hasEqualTypeNames(arguments)) {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          DartType type = argument;
+          Element element = type.element;
+          if (element == null) {
+            arguments[i] = type.displayName;
+          } else {
+            arguments[i] = element.extendedDisplayName;
+          }
+        }
+      }
+    } else {
+      int count = arguments.length;
+      for (int i = 0; i < count; i++) {
+        Object argument = arguments[i];
+        if (argument is DartType) {
+          arguments[i] = argument.displayName;
+        }
+      }
+    }
+  }
+
+  /**
+   * Return `true` if the given array of arguments contains two or more types with the same
+   * display name.
+   *
+   * @param arguments the arguments being tested
+   * @return `true` if the array of arguments contains two or more types with the same display
+   *         name
+   */
+  bool _hasEqualTypeNames(List<Object> arguments) {
+    int count = arguments.length;
+    HashSet<String> typeNames = new HashSet<String>();
+    for (int i = 0; i < count; i++) {
+      if (arguments[i] is DartType && !typeNames.add((arguments[i] as DartType).displayName)) {
+        return true;
+      }
+    }
+    return false;
+  }
 }
 
 /**
@@ -2448,6 +2544,9 @@
 
   @override
   ErrorType get type => ErrorType.HINT;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2506,6 +2605,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2555,6 +2657,9 @@
 
   @override
   ErrorType get type => ErrorType.POLYMER;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2623,6 +2728,9 @@
 
   @override
   ErrorType get type => ErrorType.PUB_SUGGESTION;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -2970,6 +3078,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_TYPE_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -3897,6 +4008,9 @@
 
   @override
   ErrorType get type => ErrorType.STATIC_WARNING;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -3938,4 +4052,7 @@
 
   @override
   ErrorType get type => ErrorType.TODO;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
\ No newline at end of file
diff --git a/pkg/analyzer/lib/src/generated/html.dart b/pkg/analyzer/lib/src/generated/html.dart
index 1da03c4..b559477 100644
--- a/pkg/analyzer/lib/src/generated/html.dart
+++ b/pkg/analyzer/lib/src/generated/html.dart
@@ -380,7 +380,7 @@
   /**
    * A set containing the names of tags that do not have a closing tag.
    */
-  static Set<String> SELF_CLOSING = new Set<String>.from(JavaArrays.asList(<String> [
+  static Set<String> SELF_CLOSING = new HashSet<String>.from(JavaArrays.asList(<String> [
       "area",
       "base",
       "basefont",
diff --git a/pkg/analyzer/lib/src/generated/index.dart b/pkg/analyzer/lib/src/generated/index.dart
index ae07ab5..92ed388 100644
--- a/pkg/analyzer/lib/src/generated/index.dart
+++ b/pkg/analyzer/lib/src/generated/index.dart
@@ -174,6 +174,33 @@
 }
 
 /**
+ * Instances of the [ClearOperation] implement an operation that removes all of the
+ * information from the index.
+ */
+class ClearOperation implements IndexOperation {
+  /**
+   * The index store against which this operation is being run.
+   */
+  final IndexStore _indexStore;
+
+  ClearOperation(this._indexStore);
+
+  @override
+  bool get isQuery => false;
+
+  @override
+  void performOperation() {
+    _indexStore.clear();
+  }
+
+  @override
+  bool removeWhenSourceRemoved(Source source) => false;
+
+  @override
+  String toString() => "ClearOperation()";
+}
+
+/**
  * Recursively visits [HtmlUnit] and every embedded [Expression].
  */
 abstract class ExpressionVisitor extends ht.RecursiveXmlVisitor<Object> {
@@ -265,6 +292,11 @@
  */
 abstract class Index {
   /**
+   * Asynchronously remove from the index all of the information.
+   */
+  void clear();
+
+  /**
    * Asynchronously invoke the given callback with an array containing all of the locations of the
    * elements that have the given relationship with the given element. For example, if the element
    * represents a method and the relationship is the is-referenced-by relationship, then the
@@ -1048,7 +1080,7 @@
   Object visitMethodInvocation(MethodInvocation node) {
     SimpleIdentifier name = node.methodName;
     Element element = name.bestElement;
-    if (element is MethodElement) {
+    if (element is MethodElement || element is PropertyAccessorElement) {
       Location location = _createLocationFromNode(name);
       Relationship relationship;
       if (node.target != null) {
@@ -1494,6 +1526,7 @@
       }
       AngularHtmlIndexContributor contributor = new AngularHtmlIndexContributor(_indexStore);
       unit.accept(contributor);
+      _indexStore.doneIndex();
     } catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
     }
@@ -1563,6 +1596,19 @@
   bool aboutToIndexHtml(AnalysisContext context, HtmlElement htmlElement);
 
   /**
+   * Removes all of the information.
+   */
+  void clear();
+
+  /**
+   * Notifies that index store that the current Dart or HTML unit indexing is done.
+   *
+   * If this method is not invoked after corresponding "aboutToIndex*" invocation, all recorded
+   * information may be lost.
+   */
+  void doneIndex();
+
+  /**
    * Return the locations of the elements that have the given relationship with the given element.
    * For example, if the element represents a method and the relationship is the is-referenced-by
    * relationship, then the returned locations will be all of the places where the method is
@@ -1699,6 +1745,7 @@
       }
       unit.accept(new IndexContributor(_indexStore));
       unit.accept(new AngularDartIndexContributor(_indexStore));
+      _indexStore.doneIndex();
     } catch (exception) {
       AnalysisEngine.instance.logger.logError2("Could not index ${unit.element.location}", exception);
     }
@@ -1950,6 +1997,20 @@
   }
 
   @override
+  void clear() {
+    _canonicalKeys.clear();
+    _keyToLocations.clear();
+    _contextToSourceToKeys.clear();
+    _contextToSourceToLocations.clear();
+    _contextToLibraryToUnits.clear();
+    _contextToUnitToLibraries.clear();
+  }
+
+  @override
+  void doneIndex() {
+  }
+
+  @override
   List<Location> getRelationships(Element element, Relationship relationship) {
     MemoryIndexStoreImpl_ElementRelationKey key = new MemoryIndexStoreImpl_ElementRelationKey(element, relationship);
     Set<Location> locations = _keyToLocations[key];
diff --git a/pkg/analyzer/lib/src/generated/interner.dart b/pkg/analyzer/lib/src/generated/interner.dart
new file mode 100644
index 0000000..9ff047b
--- /dev/null
+++ b/pkg/analyzer/lib/src/generated/interner.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.
+
+library interner;
+
+import 'dart:collection';
+
+/**
+ * The interface `Interner` defines the behavior of objects that can intern
+ * strings.
+ */
+abstract class Interner {
+  /**
+   * Return a string that is identical to all of the other strings that have
+   * been interned that are equal to the given [string].
+   */
+  String intern(String string);
+}
+
+/**
+ * The class `MappedInterner` implements an interner that uses a map to manage
+ * the strings that have been interned.
+ */
+class MappedInterner implements Interner {
+  /**
+   * A table mapping strings to themselves.
+   */
+  Map<String, String> _table = new HashMap<String, String>();
+
+  @override
+  String intern(String string) {
+    String original = _table[string];
+    if (original == null) {
+      _table[string] = string;
+      return string;
+    }
+    return original;
+  }
+}
+
+/**
+ * The class `NullInterner` implements an interner that does nothing (does not
+ * actually intern any strings).
+ */
+class NullInterner implements Interner {
+  @override
+  String intern(String string) => string;
+}
diff --git a/pkg/analyzer/lib/src/generated/java_engine.dart b/pkg/analyzer/lib/src/generated/java_engine.dart
index 3c2d08f..374586f 100644
--- a/pkg/analyzer/lib/src/generated/java_engine.dart
+++ b/pkg/analyzer/lib/src/generated/java_engine.dart
@@ -1,5 +1,6 @@
 library java.engine;
 
+import 'interner.dart';
 import 'java_core.dart';
 
 /**
@@ -10,7 +11,10 @@
 class StringUtilities {
   static const String EMPTY = '';
   static const List<String> EMPTY_ARRAY = const <String>[];
-  static String intern(String s) => s;
+
+  static Interner INTERNER = new NullInterner();
+
+  static String intern(String string) => INTERNER.intern(string);
   static bool isTagName(String s) {
     if (s == null || s.length == 0) {
       return false;
@@ -255,6 +259,17 @@
    * [cause].
    */
   AnalysisException([this.message = 'Exception', this.cause = null]);
+
+  String toString() {
+    StringBuffer buffer = new StringBuffer();
+    buffer.write("AnalysisException: ");
+    buffer.writeln(message);
+    if (cause != null) {
+      buffer.write('Caused by ');
+      cause._writeOn(buffer);
+    }
+    return buffer.toString();
+  }
 }
 
 
@@ -266,7 +281,7 @@
   /**
    * The exception that was caught.
    */
-  final Exception exception;
+  final Object exception;
 
   /**
    * The stack trace associated with the exception.
diff --git a/pkg/analyzer/lib/src/generated/parser.dart b/pkg/analyzer/lib/src/generated/parser.dart
index bac76fa..8ffc875 100644
--- a/pkg/analyzer/lib/src/generated/parser.dart
+++ b/pkg/analyzer/lib/src/generated/parser.dart
@@ -7,6 +7,7 @@
 
 library engine.parser;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'java_engine.dart';
 import 'instrumentation.dart';
@@ -6064,7 +6065,7 @@
     bool wasInSwitch = _inSwitch;
     _inSwitch = true;
     try {
-      Set<String> definedLabels = new Set<String>();
+      HashSet<String> definedLabels = new HashSet<String>();
       Token keyword = _expectKeyword(Keyword.SWITCH);
       Token leftParenthesis = _expect(TokenType.OPEN_PAREN);
       Expression expression = parseExpression2();
@@ -6570,7 +6571,17 @@
    * Skips a block with all containing blocks.
    */
   void _skipBlock() {
-    _currentToken = (_currentToken as BeginToken).endToken.next;
+    Token endToken = (_currentToken as BeginToken).endToken;
+    if (endToken == null) {
+      endToken = _currentToken.next;
+      while (!identical(endToken, _currentToken)) {
+        _currentToken = endToken;
+        endToken = _currentToken.next;
+      }
+      _reportErrorForToken(ParserErrorCode.EXPECTED_TOKEN, _currentToken.previous, ["}"]);
+    } else {
+      _currentToken = endToken.next;
+    }
   }
 
   /**
@@ -7884,6 +7895,9 @@
 
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/resolver.dart b/pkg/analyzer/lib/src/generated/resolver.dart
index 003a977..3fc2b55 100644
--- a/pkg/analyzer/lib/src/generated/resolver.dart
+++ b/pkg/analyzer/lib/src/generated/resolver.dart
@@ -352,11 +352,22 @@
     Element element = annotation.element;
     if (element is ConstructorElement) {
       ConstructorElement constructorElement = element;
-      return constructorElement.returnType.displayName == name;
+      if (constructorElement.returnType.displayName != name) {
+        return false;
+      }
+      return _isAngularLibraryElement(constructorElement);
     }
     return false;
   }
 
+  /**
+   * Checks if the given [Element] is a part of the Angular library.
+   */
+  bool _isAngularLibraryElement(Element element) {
+    LibraryElement library = element.library;
+    return library != null && library.name != null && library.name.startsWith("angular");
+  }
+
   void _parseComponent() {
     bool isValid = true;
     // publishAs
@@ -910,7 +921,7 @@
     DartType actualBestType = actualPropagatedType != null ? actualPropagatedType : actualStaticType;
     if (actualBestType != null && expectedBestType != null) {
       if (!actualBestType.isAssignableTo(expectedBestType)) {
-        _errorReporter.reportErrorForNode(hintCode, expression, [actualBestType.displayName, expectedBestType.displayName]);
+        _errorReporter.reportTypeErrorForNode(hintCode, expression, [actualBestType, expectedBestType]);
         return true;
       }
     }
@@ -1082,17 +1093,7 @@
     DartType bestRightType = rhs.bestType;
     if (leftType != null && bestRightType != null) {
       if (!bestRightType.isAssignableTo(leftType)) {
-        String leftName = leftType.displayName;
-        String rightName = bestRightType.displayName;
-        if (leftName == rightName) {
-          Element leftElement = leftType.element;
-          Element rightElement = bestRightType.element;
-          if (leftElement != null && rightElement != null) {
-            leftName = leftElement.extendedDisplayName;
-            rightName = rightElement.extendedDisplayName;
-          }
-        }
-        _errorReporter.reportErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+        _errorReporter.reportTypeErrorForNode(HintCode.INVALID_ASSIGNMENT, rhs, [bestRightType, leftType]);
         return true;
       }
     }
@@ -1191,7 +1192,7 @@
     DartType rhsType = typeName.type;
     // TODO(jwren) After dartbug.com/13732, revisit this, we should be able to remove the
     // !(x instanceof TypeParameterType) checks.
-    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isSubtypeOf(rhsType)) {
+    if (lhsType != null && rhsType != null && !lhsType.isDynamic && !rhsType.isDynamic && lhsType is! TypeParameterType && rhsType is! TypeParameterType && lhsType.isMoreSpecificThan(rhsType)) {
       _errorReporter.reportErrorForNode(HintCode.UNNECESSARY_CAST, node, []);
       return true;
     }
@@ -1233,11 +1234,10 @@
    * @param enclosingScope the scope in which this scope is lexically enclosed
    * @param typeElement the element representing the type represented by this scope
    */
-  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(new EnclosedScope(enclosingScope)) {
+  ClassScope(Scope enclosingScope, ClassElement typeElement) : super(enclosingScope) {
     if (typeElement == null) {
       throw new IllegalArgumentException("class element cannot be null");
     }
-    _defineTypeParameters(typeElement);
     _defineMembers(typeElement);
   }
 
@@ -1266,18 +1266,6 @@
       define(method);
     }
   }
-
-  /**
-   * Define the type parameters for the class.
-   *
-   * @param typeElement the element representing the type represented by this scope
-   */
-  void _defineTypeParameters(ClassElement typeElement) {
-    Scope parameterScope = enclosingScope;
-    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
-      parameterScope.define(typeParameter);
-    }
-  }
 }
 
 /**
@@ -1436,7 +1424,7 @@
     super.visitMapLiteral(node);
     bool isConst = node.constKeyword != null;
     bool reportEqualKeys = true;
-    Set<DartObject> keys = new Set<DartObject>();
+    HashSet<DartObject> keys = new HashSet<DartObject>();
     List<Expression> invalidKeys = new List<Expression>();
     for (MapLiteralEntry entry in node.entries) {
       Expression key = entry.key;
@@ -2197,14 +2185,14 @@
    * 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.
    */
-  Set<Element> _allElements = new Set<Element>();
+  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.
    */
-  Set<Element> _unmatchedElements = new Set<Element>();
+  HashSet<Element> _unmatchedElements = new HashSet<Element>();
 
   /**
    * Return `true` if the declarations within the given AST structure define an element model
@@ -3353,7 +3341,7 @@
    * A table mapping field names to field elements for the fields defined in the current class, or
    * `null` if we are not in the scope of a class.
    */
-  Map<String, FieldElement> _fieldMap;
+  HashMap<String, FieldElement> _fieldMap;
 
   /**
    * Initialize a newly created element builder to build the elements for a compilation unit.
@@ -3987,7 +3975,7 @@
    * @param fields the field elements defined in the current class
    */
   void _buildFieldMap(List<FieldElement> fields) {
-    _fieldMap = new Map<String, FieldElement>();
+    _fieldMap = new HashMap<String, FieldElement>();
     int count = fields.length;
     for (int i = 0; i < count; i++) {
       FieldElement field = fields[i];
@@ -5091,7 +5079,7 @@
         }
         if (classElementContext != null) {
           _subtypeManager.ensureLibraryVisited(_definingLibrary);
-          Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
+          HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(classElementContext);
           for (ClassElement subtypeElement in subtypeElements) {
             if (subtypeElement.getMethod(methodName.name) != null) {
               errorCode = null;
@@ -5891,7 +5879,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new Set<ClassElement>());
+      return _lookUpGetterInInterfaces(interfaceType, false, getterName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -5908,7 +5896,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the getter that was found
    */
-  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpGetterInInterfaces(InterfaceType targetType, bool includeTargetType, String getterName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -5964,7 +5952,7 @@
       if (member != null) {
         return member;
       }
-      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new Set<ClassElement>());
+      return _lookUpGetterOrMethodInInterfaces(interfaceType, false, memberName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -5981,7 +5969,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method or getter that was found
    */
-  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, Set<ClassElement> visitedInterfaces) {
+  ExecutableElement _lookUpGetterOrMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String memberName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6086,7 +6074,7 @@
       if (method != null) {
         return method;
       }
-      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new Set<ClassElement>());
+      return _lookUpMethodInInterfaces(interfaceType, false, methodName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -6103,7 +6091,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the method that was found
    */
-  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, Set<ClassElement> visitedInterfaces) {
+  MethodElement _lookUpMethodInInterfaces(InterfaceType targetType, bool includeTargetType, String methodName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6160,7 +6148,7 @@
       if (accessor != null) {
         return accessor;
       }
-      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new Set<ClassElement>());
+      return _lookUpSetterInInterfaces(interfaceType, false, setterName, new HashSet<ClassElement>());
     }
     return null;
   }
@@ -6177,7 +6165,7 @@
    *          to prevent infinite recursion and to optimize the search
    * @return the element representing the setter that was found
    */
-  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, Set<ClassElement> visitedInterfaces) {
+  PropertyAccessorElement _lookUpSetterInInterfaces(InterfaceType targetType, bool includeTargetType, String setterName, HashSet<ClassElement> visitedInterfaces) {
     // TODO(brianwilkerson) This isn't correct. Section 8.1.1 of the specification (titled
     // "Inheritance and Overriding" under "Interfaces") describes a much more complex scheme for
     // finding the inherited member. We need to follow that scheme. The code below should cover the
@@ -6228,7 +6216,7 @@
   bool _memberFoundInSubclass(Element element, String memberName, bool asMethod, bool asAccessor) {
     if (element is ClassElement) {
       _subtypeManager.ensureLibraryVisited(_definingLibrary);
-      Set<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
+      HashSet<ClassElement> subtypeElements = _subtypeManager.computeAllSubtypes(element);
       for (ClassElement subtypeElement in subtypeElements) {
         if (asMethod && subtypeElement.getMethod(memberName) != null) {
           return true;
@@ -6440,7 +6428,7 @@
   List<ParameterElement> _resolveArgumentsToParameters(bool reportError, ArgumentList argumentList, List<ParameterElement> parameters) {
     List<ParameterElement> requiredParameters = new List<ParameterElement>();
     List<ParameterElement> positionalParameters = new List<ParameterElement>();
-    Map<String, ParameterElement> namedParameters = new Map<String, ParameterElement>();
+    HashMap<String, ParameterElement> namedParameters = new HashMap<String, ParameterElement>();
     for (ParameterElement parameter in parameters) {
       ParameterKind kind = parameter.parameterKind;
       if (kind == ParameterKind.REQUIRED) {
@@ -6459,7 +6447,7 @@
     int argumentCount = arguments.length;
     List<ParameterElement> resolvedParameters = new List<ParameterElement>(argumentCount);
     int positionalArgumentCount = 0;
-    Set<String> usedNames = new Set<String>();
+    HashSet<String> usedNames = new HashSet<String>();
     for (int i = 0; i < argumentCount; i++) {
       Expression argument = arguments[i];
       if (argument is NamedExpression) {
@@ -6938,7 +6926,7 @@
    * According to the scoping rules these names are hidden, even if they were defined in an outer
    * scope.
    */
-  Map<String, Element> _hiddenElements = new Map<String, Element>();
+  HashMap<String, Element> _hiddenElements = new HashMap<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -7130,6 +7118,11 @@
   bool _isInStaticMethod = false;
 
   /**
+   * This is set to `true` iff the visitor is currently visiting a factory constructor.
+   */
+  bool _isInFactory = false;
+
+  /**
    * This is set to `true` iff the visitor is currently visiting code in the SDK.
    */
   bool _isInSystemLibrary = false;
@@ -7187,27 +7180,27 @@
    * @see #visitClassDeclaration(ClassDeclaration)
    * @see #checkForAllFinalInitializedErrorCodes(ConstructorDeclaration)
    */
-  Map<FieldElement, INIT_STATE> _initialFieldElementsMap;
+  HashMap<FieldElement, INIT_STATE> _initialFieldElementsMap;
 
   /**
    * A table mapping name of the library to the export directive which export this library.
    */
-  Map<String, LibraryElement> _nameToExportElement = new Map<String, LibraryElement>();
+  HashMap<String, LibraryElement> _nameToExportElement = new HashMap<String, LibraryElement>();
 
   /**
    * A table mapping name of the library to the import directive which import this library.
    */
-  Map<String, LibraryElement> _nameToImportElement = new Map<String, LibraryElement>();
+  HashMap<String, LibraryElement> _nameToImportElement = new HashMap<String, LibraryElement>();
 
   /**
    * A table mapping names to the exported elements.
    */
-  Map<String, Element> _exportedElements = new Map<String, Element>();
+  HashMap<String, Element> _exportedElements = new HashMap<String, Element>();
 
   /**
    * A set of the names of the variable initializers we are visiting now.
    */
-  Set<String> _namesForReferenceToDeclaredVariableInInitializer = new Set<String>();
+  HashSet<String> _namesForReferenceToDeclaredVariableInInitializer = new HashSet<String>();
 
   /**
    * A list of types used by the [CompileTimeErrorCode#EXTENDS_DISALLOWED_CLASS] and
@@ -7385,7 +7378,7 @@
       // initialize initialFieldElementsMap
       if (_enclosingClass != null) {
         List<FieldElement> fieldElements = _enclosingClass.fields;
-        _initialFieldElementsMap = new Map<FieldElement, INIT_STATE>();
+        _initialFieldElementsMap = new HashMap<FieldElement, INIT_STATE>();
         for (FieldElement fieldElement in fieldElements) {
           if (!fieldElement.isSynthetic) {
             _initialFieldElementsMap[fieldElement] = fieldElement.initializer == null ? INIT_STATE.NOT_INIT : INIT_STATE.INIT_IN_DECLARATION;
@@ -7453,6 +7446,7 @@
       ConstructorElement constructorElement = node.element;
       _enclosingFunction = constructorElement;
       _isEnclosingConstructorConst = node.constKeyword != null;
+      _isInFactory = node.factoryKeyword != null;
       _checkForConstConstructorWithNonFinalField(node, constructorElement);
       _checkForConstConstructorWithNonConstSuper(node);
       _checkForConflictingConstructorNameAndMember(node, constructorElement);
@@ -7469,6 +7463,7 @@
       return super.visitConstructorDeclaration(node);
     } finally {
       _isEnclosingConstructorConst = false;
+      _isInFactory = false;
       _enclosingFunction = outerFunction;
     }
   }
@@ -8010,7 +8005,7 @@
       return false;
     }
     bool foundError = false;
-    Map<FieldElement, INIT_STATE> fieldElementsMap = new Map<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
+    HashMap<FieldElement, INIT_STATE> fieldElementsMap = new HashMap<FieldElement, INIT_STATE>.from(_initialFieldElementsMap);
     // Visit all of the field formal parameters
     NodeList<FormalParameter> formalParameters = node.parameters.parameters;
     for (FormalParameter formalParameter in formalParameters) {
@@ -8111,60 +8106,6 @@
       isSetter = accessorElement.isSetter;
     }
     String executableElementName = executableElement.name;
-    // SWC.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
-    if (overriddenExecutable == null) {
-      if (!isGetter && !isSetter && !executableElement.isOperator) {
-        Set<ClassElement> visitedClasses = new Set<ClassElement>();
-        InterfaceType superclassType = _enclosingClass.supertype;
-        ClassElement superclassElement = superclassType == null ? null : superclassType.element;
-        bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
-        while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
-          visitedClasses.add(superclassElement);
-          LibraryElement superclassLibrary = superclassElement.library;
-          // Check fields.
-          List<FieldElement> fieldElts = superclassElement.fields;
-          for (FieldElement fieldElt in fieldElts) {
-            // We need the same name.
-            if (fieldElt.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (fieldElt.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  fieldElt.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          // Check methods.
-          List<MethodElement> methodElements = superclassElement.methods;
-          for (MethodElement methodElement in methodElements) {
-            // We need the same name.
-            if (methodElement.name != executableElementName) {
-              continue;
-            }
-            // Ignore if private in a different library - cannot collide.
-            if (executableElementPrivate && _currentLibrary != superclassLibrary) {
-              continue;
-            }
-            // instance vs. static
-            if (methodElement.isStatic) {
-              _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
-                  executableElementName,
-                  methodElement.enclosingElement.displayName]);
-              return true;
-            }
-          }
-          superclassType = superclassElement.supertype;
-          superclassElement = superclassType == null ? null : superclassType.element;
-        }
-      }
-      return false;
-    }
     FunctionType overridingFT = executableElement.type;
     FunctionType overriddenFT = overriddenExecutable.type;
     InterfaceType enclosingType = _enclosingClass.type;
@@ -8210,9 +8151,9 @@
     }
     // SWC.INVALID_METHOD_OVERRIDE_RETURN_TYPE
     if (overriddenFTReturnType != VoidTypeImpl.instance && !overridingFTReturnType.isAssignableTo(overriddenFTReturnType)) {
-      _errorReporter.reportErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
-          overridingFTReturnType.displayName,
-          overriddenFTReturnType.displayName,
+      _errorReporter.reportTypeErrorForNode(!isGetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_RETURN_TYPE : StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE, errorNameTarget, [
+          overridingFTReturnType,
+          overriddenFTReturnType,
           overriddenExecutable.enclosingElement.displayName]);
       return true;
     }
@@ -8223,9 +8164,9 @@
     int parameterIndex = 0;
     for (int i = 0; i < overridingNormalPT.length; i++) {
       if (!overridingNormalPT[i].isAssignableTo(overriddenNormalPT[i])) {
-        _errorReporter.reportErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingNormalPT[i].displayName,
-            overriddenNormalPT[i].displayName,
+        _errorReporter.reportTypeErrorForNode(!isSetter ? StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE : StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingNormalPT[i],
+            overriddenNormalPT[i],
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8234,9 +8175,9 @@
     // SWC.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE
     for (int i = 0; i < overriddenPositionalPT.length; i++) {
       if (!overridingPositionalPT[i].isAssignableTo(overriddenPositionalPT[i])) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
-            overridingPositionalPT[i].displayName,
-            overriddenPositionalPT[i].displayName,
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_OPTIONAL_PARAM_TYPE, parameterLocations[parameterIndex], [
+            overridingPositionalPT[i],
+            overriddenPositionalPT[i],
             overriddenExecutable.enclosingElement.displayName]);
         return true;
       }
@@ -8265,9 +8206,9 @@
           }
         }
         if (parameterToSelect != null) {
-          _errorReporter.reportErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
-              overridingType.displayName,
-              overriddenNamedPTEntry.getValue().displayName,
+          _errorReporter.reportTypeErrorForNode(StaticWarningCode.INVALID_METHOD_OVERRIDE_NAMED_PARAM_TYPE, parameterLocationToSelect, [
+              overridingType,
+              overriddenNamedPTEntry.getValue(),
               overriddenExecutable.enclosingElement.displayName]);
           return true;
         }
@@ -8373,25 +8314,20 @@
     //
     // Compute the overridden executable from the InheritanceManager
     //
-    ExecutableElement overriddenExecutable = _inheritanceManager.lookupInheritance(_enclosingClass, executableElement.name);
-    //
-    // If the result is a MultiplyInheritedExecutableElement call
-    // checkForAllInvalidOverrideErrorCodes on all of the elements, until an error is found.
-    //
-    if (overriddenExecutable is MultiplyInheritedExecutableElement) {
-      MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenExecutable;
-      List<ExecutableElement> overriddenElement = multiplyInheritedElement.inheritedElements;
-      for (int i = 0; i < overriddenElement.length; i++) {
-        if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement[i], parameters, parameterLocations, errorNameTarget)) {
-          return true;
-        }
-      }
-      return false;
+    List<ExecutableElement> overriddenExecutables = _inheritanceManager.lookupOverrides(_enclosingClass, executableElement.name);
+    if (overriddenExecutables.isEmpty) {
+      // Nothing is overridden, so we just have to check if the new name collides
+      // with a static defined in the superclass.
+      // TODO(paulberry): currently we don't do this check if the new element
+      // overrides a method in an interface (see issue 18947).
+      return _checkForInstanceMethodNameCollidesWithSuperclassStatic(executableElement, errorNameTarget);
     }
-    //
-    // Otherwise, just call checkForAllInvalidOverrideErrorCodes.
-    //
-    return _checkForAllInvalidOverrideErrorCodes(executableElement, overriddenExecutable, parameters, parameterLocations, errorNameTarget);
+    for (ExecutableElement overriddenElement in overriddenExecutables) {
+      if (_checkForAllInvalidOverrideErrorCodes(executableElement, overriddenElement, parameters, parameterLocations, errorNameTarget)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   /**
@@ -8648,9 +8584,7 @@
     //
     if (actualStaticType != null && expectedStaticType != null) {
       if (!actualStaticType.isAssignableTo(expectedStaticType)) {
-        _errorReporter.reportErrorForNode(errorCode, expression, [
-            actualStaticType.displayName,
-            expectedStaticType.displayName]);
+        _errorReporter.reportTypeErrorForNode(errorCode, expression, [actualStaticType, expectedStaticType]);
         return true;
       }
     }
@@ -9087,7 +9021,7 @@
     // construct the HashMap, at the same time, look for violations.  Don't add members if they are
     // part of a conflict, this prevents multiple warnings for one issue.
     bool foundError = false;
-    Map<String, ClassMember> memberHashMap = new Map<String, ClassMember>();
+    HashMap<String, ClassMember> memberHashMap = new HashMap<String, ClassMember>();
     for (ClassMember classMember in classMembers) {
       if (classMember is MethodDeclaration) {
         MethodDeclaration method = classMember;
@@ -9553,7 +9487,7 @@
     NodeList<Directive> directives = node.directives;
     int count = directives.length;
     if (count > 0) {
-      Map<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new Map<PrefixElement, List<ImportDirective>>();
+      HashMap<PrefixElement, List<ImportDirective>> prefixToDirectivesMap = new HashMap<PrefixElement, List<ImportDirective>>();
       for (int i = 0; i < count; i++) {
         Directive directive = directives[i];
         if (directive is ImportDirective) {
@@ -9886,9 +9820,9 @@
     }
     // report problem
     if (_isEnclosingConstructorConst) {
-      _errorReporter.reportErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportTypeErrorForNode(CompileTimeErrorCode.CONST_FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
     } else {
-      _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType.displayName, fieldType.displayName]);
+      _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZER_NOT_ASSIGNABLE, expression, [staticType, fieldType]);
     }
     return true;
   }
@@ -10029,7 +9963,7 @@
    * @see CompileTimeErrorCode#INSTANCE_MEMBER_ACCESS_FROM_STATIC TODO(scheglov) rename thid method
    */
   bool _checkForImplicitThisReferenceInInitializer(SimpleIdentifier node) {
-    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
+    if (!_isInConstructorInitializer && !_isInStaticMethod && !_isInFactory && !_isInInstanceVariableInitializer && !_isInStaticVariableDeclaration) {
       return false;
     }
     // prepare element
@@ -10075,6 +10009,8 @@
     // report problem
     if (_isInStaticMethod) {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_STATIC, node, []);
+    } else if (_isInFactory) {
+      _errorReporter.reportErrorForNode(CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY, node, []);
     } else {
       _errorReporter.reportErrorForNode(CompileTimeErrorCode.IMPLICIT_THIS_REFERENCE_IN_INITIALIZER, node, []);
     }
@@ -10154,7 +10090,7 @@
     // Ensure that the inheritance manager has a chance to generate all errors we may care about,
     // note that we ensure that the interfaces data since there are no errors.
     _inheritanceManager.getMapOfMembersInheritedFromInterfaces(_enclosingClass);
-    Set<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
+    HashSet<AnalysisError> errors = _inheritanceManager.getErrors(_enclosingClass);
     if (errors == null || errors.isEmpty) {
       return false;
     }
@@ -10204,6 +10140,70 @@
   }
 
   /**
+   * This checks whether the given [executableElement] collides with the name of a static
+   * method in one of its superclasses, and reports the appropriate warning if it does.
+   *
+   * @param executableElement the method to check.
+   * @param errorNameTarget the node to report problems on.
+   * @return `true` if and only if a warning was generated.
+   * @see StaticTypeWarningCode#INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC
+   */
+  bool _checkForInstanceMethodNameCollidesWithSuperclassStatic(ExecutableElement executableElement, SimpleIdentifier errorNameTarget) {
+    String executableElementName = executableElement.name;
+    if (executableElement is! PropertyAccessorElement && !executableElement.isOperator) {
+      HashSet<ClassElement> visitedClasses = new HashSet<ClassElement>();
+      InterfaceType superclassType = _enclosingClass.supertype;
+      ClassElement superclassElement = superclassType == null ? null : superclassType.element;
+      bool executableElementPrivate = Identifier.isPrivateName(executableElementName);
+      while (superclassElement != null && !visitedClasses.contains(superclassElement)) {
+        visitedClasses.add(superclassElement);
+        LibraryElement superclassLibrary = superclassElement.library;
+        // Check fields.
+        List<FieldElement> fieldElts = superclassElement.fields;
+        for (FieldElement fieldElt in fieldElts) {
+          // We need the same name.
+          if (fieldElt.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (fieldElt.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                fieldElt.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        // Check methods.
+        List<MethodElement> methodElements = superclassElement.methods;
+        for (MethodElement methodElement in methodElements) {
+          // We need the same name.
+          if (methodElement.name != executableElementName) {
+            continue;
+          }
+          // Ignore if private in a different library - cannot collide.
+          if (executableElementPrivate && _currentLibrary != superclassLibrary) {
+            continue;
+          }
+          // instance vs. static
+          if (methodElement.isStatic) {
+            _errorReporter.reportErrorForNode(StaticWarningCode.INSTANCE_METHOD_NAME_COLLIDES_WITH_SUPERCLASS_STATIC, errorNameTarget, [
+                executableElementName,
+                methodElement.enclosingElement.displayName]);
+            return true;
+          }
+        }
+        superclassType = superclassElement.supertype;
+        superclassElement = superclassType == null ? null : superclassType.element;
+      }
+    }
+    return false;
+  }
+
+  /**
    * This verifies that an 'int' can be assigned to the parameter corresponding to the given
    * expression. This is used for prefix and postfix expressions where the argument value is
    * implicit.
@@ -10255,17 +10255,7 @@
     DartType leftType = (leftVariableElement == null) ? getStaticType(lhs) : leftVariableElement.type;
     DartType staticRightType = getStaticType(rhs);
     if (!staticRightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = staticRightType.displayName;
-      if (leftName == rightName) {
-        Element leftElement = leftType.element;
-        Element rightElement = staticRightType.element;
-        if (leftElement != null && rightElement != null) {
-          leftName = leftElement.extendedDisplayName;
-          rightName = rightElement.extendedDisplayName;
-        }
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [staticRightType, leftType]);
       return true;
     }
     return false;
@@ -10296,17 +10286,7 @@
       return false;
     }
     if (!rightType.isAssignableTo(leftType)) {
-      String leftName = leftType.displayName;
-      String rightName = rightType.displayName;
-      if (leftName == rightName) {
-        Element leftElement = leftType.element;
-        Element rightElement = rightType.element;
-        if (leftElement != null && rightElement != null) {
-          leftName = leftElement.extendedDisplayName;
-          rightName = rightElement.extendedDisplayName;
-        }
-      }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightName, leftName]);
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.INVALID_ASSIGNMENT, rhs, [rightType, leftType]);
       return true;
     }
     return false;
@@ -10536,16 +10516,13 @@
     // it is dynamic which is assignable to everything).
     if (setterType != null && getterType != null && !getterType.isAssignableTo(setterType)) {
       if (enclosingClassForCounterpart == null) {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [
-            accessorTextName,
-            setterType.displayName,
-            getterType.displayName]);
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES, accessorDeclaration, [accessorTextName, setterType, getterType]);
         return true;
       } else {
-        _errorReporter.reportErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
+        _errorReporter.reportTypeErrorForNode(StaticWarningCode.MISMATCHED_GETTER_AND_SETTER_TYPES_FROM_SUPERTYPE, accessorDeclaration, [
             accessorTextName,
-            setterType.displayName,
-            getterType.displayName,
+            setterType,
+            getterType,
             enclosingClassForCounterpart.displayName]);
       }
     }
@@ -10760,7 +10737,7 @@
         return false;
       }
     }
-    Set<ExecutableElement> missingOverrides = new Set<ExecutableElement>();
+    HashSet<ExecutableElement> missingOverrides = new HashSet<ExecutableElement>();
     //
     // Loop through the set of all executable elements declared in the implicit interface.
     //
@@ -11285,9 +11262,9 @@
       if (staticReturnType.isVoid || staticReturnType.isDynamic || staticReturnType.isBottom) {
         return false;
       }
-      _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-          staticReturnType.displayName,
-          expectedReturnType.displayName,
+      _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+          staticReturnType,
+          expectedReturnType,
           _enclosingFunction.displayName]);
       return true;
     }
@@ -11295,9 +11272,9 @@
     if (isStaticAssignable) {
       return false;
     }
-    _errorReporter.reportErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
-        staticReturnType.displayName,
-        expectedReturnType.displayName,
+    _errorReporter.reportTypeErrorForNode(StaticTypeWarningCode.RETURN_OF_INVALID_TYPE, returnExpression, [
+        staticReturnType,
+        expectedReturnType,
         _enclosingFunction.displayName]);
     return true;
   }
@@ -11444,7 +11421,7 @@
           } else {
             errorCode = StaticTypeWarningCode.TYPE_ARGUMENT_NOT_MATCHING_BOUNDS;
           }
-          _errorReporter.reportErrorForNode(errorCode, argTypeName, [argType.displayName, boundType.displayName]);
+          _errorReporter.reportTypeErrorForNode(errorCode, argTypeName, [argType, boundType]);
           foundError = true;
         }
       }
@@ -11599,7 +11576,7 @@
           } else if (fieldElement.isStatic) {
             _errorReporter.reportErrorForNode(CompileTimeErrorCode.INITIALIZING_FORMAL_FOR_STATIC_FIELD, node, [node.identifier.name]);
           } else if (declaredType != null && fieldType != null && !declaredType.isAssignableTo(fieldType)) {
-            _errorReporter.reportErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType.displayName, fieldType.displayName]);
+            _errorReporter.reportTypeErrorForNode(StaticWarningCode.FIELD_INITIALIZING_FORMAL_NOT_ASSIGNABLE, node, [declaredType, fieldType]);
           }
         } else {
           if (fieldElement.isSynthetic) {
@@ -11836,7 +11813,7 @@
    * @return `true` if the given constructor redirects to itself, directly or indirectly
    */
   bool _hasRedirectingFactoryConstructorCycle(ConstructorElement element) {
-    Set<ConstructorElement> constructors = new Set<ConstructorElement>();
+    Set<ConstructorElement> constructors = new HashSet<ConstructorElement>();
     ConstructorElement current = element;
     while (current != null) {
       if (constructors.contains(current)) {
@@ -11856,7 +11833,7 @@
    *         from anywhere except [ClassElement] or type parameter bounds.
    */
   bool _hasTypedefSelfReference(Element target) {
-    Set<Element> checked = new Set<Element>();
+    Set<Element> checked = new HashSet<Element>();
     List<Element> toCheck = new List<Element>();
     toCheck.add(target);
     bool firstIteration = true;
@@ -12806,7 +12783,7 @@
   /**
    * A set of the libraries that were resolved while resolving the HTML unit.
    */
-  Set<Library> _resolvedLibraries = new Set<Library>();
+  Set<Library> _resolvedLibraries = new HashSet<Library>();
 
   /**
    * Initialize a newly created HTML unit builder.
@@ -13076,7 +13053,7 @@
    * will need to be used to compute the correct [ImportDirective] being used, see
    * [namespaceMap].
    */
-  Map<LibraryElement, List<ImportDirective>> _libraryMap;
+  HashMap<LibraryElement, List<ImportDirective>> _libraryMap;
 
   /**
    * In cases where there is more than one import directive per library element, this mapping is
@@ -13084,7 +13061,7 @@
    * [Namespace] for each of the imports to do lookups in the same way that they are done from
    * the [ElementResolver].
    */
-  Map<ImportDirective, Namespace> _namespaceMap;
+  HashMap<ImportDirective, Namespace> _namespaceMap;
 
   /**
    * This is a map between prefix elements and the import directives from which they are derived. In
@@ -13096,7 +13073,7 @@
    * it is possible to have an unreported unused import in situations where two imports use the same
    * prefix and at least one import directive is used.
    */
-  Map<PrefixElement, List<ImportDirective>> _prefixElementMap;
+  HashMap<PrefixElement, List<ImportDirective>> _prefixElementMap;
 
   /**
    * Create a new instance of the [ImportsVerifier].
@@ -13107,9 +13084,9 @@
     this._currentLibrary = library;
     this._unusedImports = new List<ImportDirective>();
     this._duplicateImports = new List<ImportDirective>();
-    this._libraryMap = new Map<LibraryElement, List<ImportDirective>>();
-    this._namespaceMap = new Map<ImportDirective, Namespace>();
-    this._prefixElementMap = new Map<PrefixElement, List<ImportDirective>>();
+    this._libraryMap = new HashMap<LibraryElement, List<ImportDirective>>();
+    this._namespaceMap = new HashMap<ImportDirective, Namespace>();
+    this._prefixElementMap = new HashMap<PrefixElement, List<ImportDirective>>();
   }
 
   /**
@@ -13246,8 +13223,10 @@
     Element element = prefixIdentifier.staticElement;
     if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      for (ImportDirective importDirective in importDirectives) {
-        _unusedImports.remove(importDirective);
+      if (importDirectives != null) {
+        for (ImportDirective importDirective in importDirectives) {
+          _unusedImports.remove(importDirective);
+        }
       }
       return null;
     }
@@ -13322,7 +13301,8 @@
     if (element == null) {
       return null;
     }
-    // If the element is multiply defined then call this method recursively for each of the conflicting elements.
+    // If the element is multiply defined then call this method recursively for each of the
+    // conflicting elements.
     if (element is MultiplyDefinedElement) {
       MultiplyDefinedElement multiplyDefinedElement = element;
       for (Element elt in multiplyDefinedElement.conflictingElements) {
@@ -13331,8 +13311,10 @@
       return null;
     } else if (element is PrefixElement) {
       List<ImportDirective> importDirectives = _prefixElementMap[element];
-      for (ImportDirective importDirective in importDirectives) {
-        _unusedImports.remove(importDirective);
+      if (importDirectives != null) {
+        for (ImportDirective importDirective in importDirectives) {
+          _unusedImports.remove(importDirective);
+        }
       }
       return null;
     } else if (element.enclosingElement is! CompilationUnitElement) {
@@ -13535,8 +13517,8 @@
    * named parameters of the <i>m<sub>1</sub>, &hellip;, m<sub>k</sub></i>. Then let
    * * <i>h = max(numberOfPositionals(m<sub>i</sub>)),</i>
    * * <i>r = min(numberOfRequiredParams(m<sub>i</sub>)), for all <i>i</i>, 1 <= i <= k.</i>
-   * If <i>r <= h</i> then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameters
-   * of type <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, named parameters
+   * Then <i>I</i> has a method named <i>n</i>, with <i>r</i> required parameters of type
+   * <b>dynamic</b>, <i>h</i> positional parameters of type <b>dynamic</b>, named parameters
    * <i>s</i> of type <b>dynamic</b> and return type <b>dynamic</b>.
    *
    * TODO (jwren) Associate a propagated type to the synthetic method element using least upper
@@ -13545,7 +13527,7 @@
   static ExecutableElement _computeMergedExecutableElement(List<ExecutableElement> elementArrayToMerge) {
     int h = _getNumOfPositionalParameters(elementArrayToMerge[0]);
     int r = _getNumOfRequiredParameters(elementArrayToMerge[0]);
-    Set<String> namedParametersList = new Set<String>();
+    Set<String> namedParametersList = new HashSet<String>();
     for (int i = 1; i < elementArrayToMerge.length; i++) {
       ExecutableElement element = elementArrayToMerge[i];
       int numOfPositionalParams = _getNumOfPositionalParameters(element);
@@ -13558,9 +13540,6 @@
       }
       namedParametersList.addAll(_getNamedParameterNames(element));
     }
-    if (r > h) {
-      return null;
-    }
     return _createSyntheticExecutableElement(elementArrayToMerge, elementArrayToMerge[0].displayName, r, h - r, new List.from(namedParametersList));
   }
 
@@ -13685,19 +13664,19 @@
    * This is a mapping between each [ClassElement] and a map between the [String] member
    * names and the associated [ExecutableElement] in the mixin and superclass chain.
    */
-  Map<ClassElement, MemberMap> _classLookup;
+  HashMap<ClassElement, MemberMap> _classLookup;
 
   /**
    * This is a mapping between each [ClassElement] and a map between the [String] member
    * names and the associated [ExecutableElement] in the interface set.
    */
-  Map<ClassElement, MemberMap> _interfaceLookup;
+  HashMap<ClassElement, MemberMap> _interfaceLookup;
 
   /**
    * A map between each visited [ClassElement] and the set of [AnalysisError]s found on
    * the class element.
    */
-  Map<ClassElement, Set<AnalysisError>> _errorsInClassElement = new Map<ClassElement, Set<AnalysisError>>();
+  HashMap<ClassElement, HashSet<AnalysisError>> _errorsInClassElement = new HashMap<ClassElement, HashSet<AnalysisError>>();
 
   /**
    * Initialize a newly created inheritance manager.
@@ -13706,8 +13685,8 @@
    */
   InheritanceManager(LibraryElement library) {
     this._library = library;
-    _classLookup = new Map<ClassElement, MemberMap>();
-    _interfaceLookup = new Map<ClassElement, MemberMap>();
+    _classLookup = new HashMap<ClassElement, MemberMap>();
+    _interfaceLookup = new HashMap<ClassElement, MemberMap>();
   }
 
   /**
@@ -13718,7 +13697,7 @@
    * @return the set of [AnalysisError]s found on the passed [ClassElement], or
    *         `null` if there are none
    */
-  Set<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
+  HashSet<AnalysisError> getErrors(ClassElement classElt) => _errorsInClassElement[classElt];
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13728,7 +13707,7 @@
    * @return a mapping between the set of all members inherited from the passed [ClassElement]
    *         superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromClasses(ClassElement classElt) => _computeClassChainLookupMap(classElt, new HashSet<ClassElement>());
 
   /**
    * Get and return a mapping between the set of all string names of the members inherited from the
@@ -13738,7 +13717,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement].
    */
-  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new Set<ClassElement>());
+  MemberMap getMapOfMembersInheritedFromInterfaces(ClassElement classElt) => _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>());
 
   /**
    * Given some [ClassElement] and some member name, this returns the
@@ -13755,9 +13734,9 @@
     if (memberName == null || memberName.isEmpty) {
       return null;
     }
-    ExecutableElement executable = _computeClassChainLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+    ExecutableElement executable = _computeClassChainLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
     if (executable == null) {
-      return _computeInterfaceLookupMap(classElt, new Set<ClassElement>()).get(memberName);
+      return _computeInterfaceLookupMap(classElt, new HashSet<ClassElement>()).get(memberName);
     }
     return executable;
   }
@@ -13800,6 +13779,40 @@
   }
 
   /**
+   * Determine the set of methods which is overridden by the given class member. If no member is
+   * inherited, an empty list is returned. If one of the inherited members is a
+   * [MultiplyInheritedExecutableElement], then it is expanded into its constituent inherited
+   * elements.
+   *
+   * @param classElt the class to query
+   * @param memberName the name of the class member to query
+   * @return a list of overridden methods
+   */
+  List<ExecutableElement> lookupOverrides(ClassElement classElt, String memberName) {
+    List<ExecutableElement> result = new List<ExecutableElement>();
+    if (memberName == null || memberName.isEmpty) {
+      return result;
+    }
+    List<MemberMap> interfaceMaps = _gatherInterfaceLookupMaps(classElt, new HashSet<ClassElement>());
+    if (interfaceMaps != null) {
+      for (MemberMap interfaceMap in interfaceMaps) {
+        ExecutableElement overriddenElement = interfaceMap.get(memberName);
+        if (overriddenElement != null) {
+          if (overriddenElement is MultiplyInheritedExecutableElement) {
+            MultiplyInheritedExecutableElement multiplyInheritedElement = overriddenElement;
+            for (ExecutableElement element in multiplyInheritedElement.inheritedElements) {
+              result.add(element);
+            }
+          } else {
+            result.add(overriddenElement);
+          }
+        }
+      }
+    }
+    return result;
+  }
+
+  /**
    * Set the new library element context.
    *
    * @param library the new library element
@@ -13852,7 +13865,7 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] superclass hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap _computeClassChainLookupMap(ClassElement classElt, Set<ClassElement> visitedClasses) {
+  MemberMap _computeClassChainLookupMap(ClassElement classElt, HashSet<ClassElement> visitedClasses) {
     MemberMap resultMap = _classLookup[classElt];
     if (resultMap != null) {
       return resultMap;
@@ -14008,13 +14021,37 @@
    * @return a mapping between the set of all string names of the members inherited from the passed
    *         [ClassElement] interface hierarchy, and the associated [ExecutableElement]
    */
-  MemberMap _computeInterfaceLookupMap(ClassElement classElt, Set<ClassElement> visitedInterfaces) {
+  MemberMap _computeInterfaceLookupMap(ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
     MemberMap resultMap = _interfaceLookup[classElt];
     if (resultMap != null) {
       return resultMap;
-    } else {
-      resultMap = new MemberMap();
     }
+    List<MemberMap> lookupMaps = _gatherInterfaceLookupMaps(classElt, visitedInterfaces);
+    if (lookupMaps == null) {
+      resultMap = new MemberMap();
+    } else {
+      HashMap<String, List<ExecutableElement>> unionMap = _unionInterfaceLookupMaps(lookupMaps);
+      resultMap = _resolveInheritanceLookup(classElt, unionMap);
+    }
+    _interfaceLookup[classElt] = resultMap;
+    return resultMap;
+  }
+
+  /**
+   * Collect a list of interface lookup maps whose elements correspond to all of the classes
+   * directly above [classElt] in the class hierarchy (the direct superclass if any, all
+   * mixins, and all direct superinterfaces). Each item in the list is the interface lookup map
+   * returned by [computeInterfaceLookupMap] for the corresponding super, except with type
+   * parameters appropriately substituted.
+   *
+   * @param classElt the class element to query
+   * @param visitedInterfaces a set of visited classes passed back into this method when it calls
+   *          itself recursively
+   * @return `null` if there was a problem (such as a loop in the class hierarchy) or if there
+   *         are no classes above this one in the class hierarchy. Otherwise, a list of interface
+   *         lookup maps.
+   */
+  List<MemberMap> _gatherInterfaceLookupMaps(ClassElement classElt, HashSet<ClassElement> visitedInterfaces) {
     InterfaceType supertype = classElt.supertype;
     ClassElement superclassElement = supertype != null ? supertype.element : null;
     List<InterfaceType> mixins = classElt.mixins;
@@ -14046,13 +14083,7 @@
           visitedInterfaces.remove(superclassElement);
         }
       } else {
-        MemberMap map = _interfaceLookup[classElt];
-        if (map != null) {
-          lookupMaps.add(map);
-        } else {
-          _interfaceLookup[superclassElement] = resultMap;
-          return resultMap;
-        }
+        return null;
       }
     }
     //
@@ -14083,13 +14114,7 @@
             visitedInterfaces.remove(mixinElement);
           }
         } else {
-          MemberMap map = _interfaceLookup[classElt];
-          if (map != null) {
-            lookupMaps.add(map);
-          } else {
-            _interfaceLookup[mixinElement] = resultMap;
-            return resultMap;
-          }
+          return null;
         }
       }
     }
@@ -14120,70 +14145,99 @@
             visitedInterfaces.remove(interfaceElement);
           }
         } else {
-          MemberMap map = _interfaceLookup[classElt];
-          if (map != null) {
-            lookupMaps.add(map);
-          } else {
-            _interfaceLookup[interfaceElement] = resultMap;
-            return resultMap;
-          }
+          return null;
         }
       }
     }
     if (lookupMaps.length == 0) {
-      _interfaceLookup[classElt] = resultMap;
-      return resultMap;
+      return null;
     }
-    //
-    // Union all of the lookupMaps together into unionMap, grouping the ExecutableElements into a
-    // list where none of the elements are equal where equality is determined by having equal
-    // function types. (We also take note too of the kind of the element: ()->int and () -> int may
-    // not be equal if one is a getter and the other is a method.)
-    //
-    Map<String, List<ExecutableElement>> unionMap = new Map<String, List<ExecutableElement>>();
-    for (MemberMap lookupMap in lookupMaps) {
-      int lookupMapSize = lookupMap.size;
-      for (int i = 0; i < lookupMapSize; i++) {
-        // Get the string key, if null, break.
-        String key = lookupMap.getKey(i);
-        if (key == null) {
-          break;
-        }
-        // Get the list value out of the unionMap
-        List<ExecutableElement> list = unionMap[key];
-        // If we haven't created such a map for this key yet, do create it and put the list entry
-        // into the unionMap.
-        if (list == null) {
-          list = new List<ExecutableElement>();
-          unionMap[key] = list;
-        }
-        // Fetch the entry out of this lookupMap
-        ExecutableElement newExecutableElementEntry = lookupMap.getValue(i);
-        if (list.isEmpty) {
-          // If the list is empty, just the new value
-          list.add(newExecutableElementEntry);
-        } else {
-          // Otherwise, only add the newExecutableElementEntry if it isn't already in the list, this
-          // covers situation where a class inherits two methods (or two getters) that are
-          // identical.
-          bool alreadyInList = false;
-          bool isMethod1 = newExecutableElementEntry is MethodElement;
-          for (ExecutableElement executableElementInList in list) {
-            bool isMethod2 = executableElementInList is MethodElement;
-            if (isMethod1 == isMethod2 && executableElementInList.type == newExecutableElementEntry.type) {
-              alreadyInList = true;
-              break;
-            }
-          }
-          if (!alreadyInList) {
-            list.add(newExecutableElementEntry);
-          }
-        }
+    return lookupMaps;
+  }
+
+  /**
+   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
+   * the passed name in the class element. Static members, members in super types and members not
+   * accessible from the current library are not considered.
+   *
+   * @param classElt the class element to query
+   * @param memberName the name of the member to lookup in the class
+   * @return the found [ExecutableElement], or `null` if no such member was found
+   */
+  ExecutableElement _lookupMemberInClass(ClassElement classElt, String memberName) {
+    List<MethodElement> methods = classElt.methods;
+    for (MethodElement method in methods) {
+      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
+        return method;
       }
     }
-    //
-    // Loop through the entries in the unionMap, adding them to the resultMap appropriately.
-    //
+    List<PropertyAccessorElement> accessors = classElt.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic) {
+        return accessor;
+      }
+    }
+    return null;
+  }
+
+  /**
+   * Record the passed map with the set of all members (methods, getters and setters) in the type
+   * into the passed map.
+   *
+   * @param map some non-`null` map to put the methods and accessors from the passed
+   *          [ClassElement] into
+   * @param type the type that will be recorded into the passed map
+   * @param doIncludeAbstract `true` if abstract members will be put into the map
+   */
+  void _recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
+    List<MethodElement> methods = type.methods;
+    for (MethodElement method in methods) {
+      if (method.isAccessibleIn(_library) && !method.isStatic && (doIncludeAbstract || !method.isAbstract)) {
+        map.put(method.name, method);
+      }
+    }
+    List<PropertyAccessorElement> accessors = type.accessors;
+    for (PropertyAccessorElement accessor in accessors) {
+      if (accessor.isAccessibleIn(_library) && !accessor.isStatic && (doIncludeAbstract || !accessor.isAbstract)) {
+        map.put(accessor.name, accessor);
+      }
+    }
+  }
+
+  /**
+   * This method is used to report errors on when they are found computing inheritance information.
+   * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
+   * error codes are reported back into the analysis engine.
+   *
+   * @param classElt the location of the source for which the exception occurred
+   * @param offset the offset of the location of the error
+   * @param length the length of the location of the error
+   * @param errorCode the error code to be associated with this error
+   * @param arguments the arguments used to build the error message
+   */
+  void _reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
+    HashSet<AnalysisError> errorSet = _errorsInClassElement[classElt];
+    if (errorSet == null) {
+      errorSet = new HashSet<AnalysisError>();
+      _errorsInClassElement[classElt] = errorSet;
+    }
+    errorSet.add(new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
+  }
+
+  /**
+   * Given the set of methods defined by classes above [classElt] in the class hierarchy,
+   * apply the appropriate inheritance rules to determine those methods inherited by or overridden
+   * by [classElt]. Also report static warnings
+   * [StaticTypeWarningCode.INCONSISTENT_METHOD_INHERITANCE] and
+   * [StaticWarningCode.INCONSISTENT_METHOD_INHERITANCE_GETTER_AND_METHOD] if appropriate.
+   *
+   * @param classElt the class element to query.
+   * @param unionMap a mapping from method name to the set of unique (in terms of signature) methods
+   *          defined in superclasses of [classElt].
+   * @return the inheritance lookup map for [classElt].
+   */
+  MemberMap _resolveInheritanceLookup(ClassElement classElt, HashMap<String, List<ExecutableElement>> unionMap) {
+    MemberMap resultMap = new MemberMap();
     for (MapEntry<String, List<ExecutableElement>> entry in getMapEntrySet(unionMap)) {
       String key = entry.getKey();
       List<ExecutableElement> list = entry.getValue();
@@ -14299,9 +14353,7 @@
                 elementArrayToMerge[i] = elements[subtypesOfAllOtherTypesIndexes[i]];
               }
               ExecutableElement mergedExecutableElement = _computeMergedExecutableElement(elementArrayToMerge);
-              if (mergedExecutableElement != null) {
-                resultMap.put(key, mergedExecutableElement);
-              }
+              resultMap.put(key, mergedExecutableElement);
             }
           }
         } else {
@@ -14309,80 +14361,10 @@
         }
       }
     }
-    _interfaceLookup[classElt] = resultMap;
     return resultMap;
   }
 
   /**
-   * Given some [ClassElement], this method finds and returns the [ExecutableElement] of
-   * the passed name in the class element. Static members, members in super types and members not
-   * accessible from the current library are not considered.
-   *
-   * @param classElt the class element to query
-   * @param memberName the name of the member to lookup in the class
-   * @return the found [ExecutableElement], or `null` if no such member was found
-   */
-  ExecutableElement _lookupMemberInClass(ClassElement classElt, String memberName) {
-    List<MethodElement> methods = classElt.methods;
-    for (MethodElement method in methods) {
-      if (memberName == method.name && method.isAccessibleIn(_library) && !method.isStatic) {
-        return method;
-      }
-    }
-    List<PropertyAccessorElement> accessors = classElt.accessors;
-    for (PropertyAccessorElement accessor in accessors) {
-      if (memberName == accessor.name && accessor.isAccessibleIn(_library) && !accessor.isStatic) {
-        return accessor;
-      }
-    }
-    return null;
-  }
-
-  /**
-   * Record the passed map with the set of all members (methods, getters and setters) in the type
-   * into the passed map.
-   *
-   * @param map some non-`null` map to put the methods and accessors from the passed
-   *          [ClassElement] into
-   * @param type the type that will be recorded into the passed map
-   * @param doIncludeAbstract `true` if abstract members will be put into the map
-   */
-  void _recordMapWithClassMembers(MemberMap map, InterfaceType type, bool doIncludeAbstract) {
-    List<MethodElement> methods = type.methods;
-    for (MethodElement method in methods) {
-      if (method.isAccessibleIn(_library) && !method.isStatic && (doIncludeAbstract || !method.isAbstract)) {
-        map.put(method.name, method);
-      }
-    }
-    List<PropertyAccessorElement> accessors = type.accessors;
-    for (PropertyAccessorElement accessor in accessors) {
-      if (accessor.isAccessibleIn(_library) && !accessor.isStatic && (doIncludeAbstract || !accessor.isAbstract)) {
-        map.put(accessor.name, accessor);
-      }
-    }
-  }
-
-  /**
-   * This method is used to report errors on when they are found computing inheritance information.
-   * See [ErrorVerifier#checkForInconsistentMethodInheritance] to see where these generated
-   * error codes are reported back into the analysis engine.
-   *
-   * @param classElt the location of the source for which the exception occurred
-   * @param offset the offset of the location of the error
-   * @param length the length of the location of the error
-   * @param errorCode the error code to be associated with this error
-   * @param arguments the arguments used to build the error message
-   */
-  void _reportError(ClassElement classElt, int offset, int length, ErrorCode errorCode, List<Object> arguments) {
-    Set<AnalysisError> errorSet = _errorsInClassElement[classElt];
-    if (errorSet == null) {
-      errorSet = new Set<AnalysisError>();
-      _errorsInClassElement[classElt] = errorSet;
-    }
-    errorSet.add(new AnalysisError.con2(classElt.source, offset, length, errorCode, arguments));
-  }
-
-  /**
    * Loop through all of the members in some [MemberMap], performing type parameter
    * substitutions using a passed supertype.
    *
@@ -14401,6 +14383,60 @@
       }
     }
   }
+
+  /**
+   * Union all of the [lookupMaps] together into a single map, grouping the ExecutableElements
+   * into a list where none of the elements are equal where equality is determined by having equal
+   * function types. (We also take note too of the kind of the element: ()->int and () -> int may
+   * not be equal if one is a getter and the other is a method.)
+   *
+   * @param lookupMaps the maps to be unioned together.
+   * @return the resulting union map.
+   */
+  HashMap<String, List<ExecutableElement>> _unionInterfaceLookupMaps(List<MemberMap> lookupMaps) {
+    HashMap<String, List<ExecutableElement>> unionMap = new HashMap<String, List<ExecutableElement>>();
+    for (MemberMap lookupMap in lookupMaps) {
+      int lookupMapSize = lookupMap.size;
+      for (int i = 0; i < lookupMapSize; i++) {
+        // Get the string key, if null, break.
+        String key = lookupMap.getKey(i);
+        if (key == null) {
+          break;
+        }
+        // Get the list value out of the unionMap
+        List<ExecutableElement> list = unionMap[key];
+        // If we haven't created such a map for this key yet, do create it and put the list entry
+        // into the unionMap.
+        if (list == null) {
+          list = new List<ExecutableElement>();
+          unionMap[key] = list;
+        }
+        // Fetch the entry out of this lookupMap
+        ExecutableElement newExecutableElementEntry = lookupMap.getValue(i);
+        if (list.isEmpty) {
+          // If the list is empty, just the new value
+          list.add(newExecutableElementEntry);
+        } else {
+          // Otherwise, only add the newExecutableElementEntry if it isn't already in the list, this
+          // covers situation where a class inherits two methods (or two getters) that are
+          // identical.
+          bool alreadyInList = false;
+          bool isMethod1 = newExecutableElementEntry is MethodElement;
+          for (ExecutableElement executableElementInList in list) {
+            bool isMethod2 = executableElementInList is MethodElement;
+            if (isMethod1 == isMethod2 && executableElementInList.type == newExecutableElementEntry.type) {
+              alreadyInList = true;
+              break;
+            }
+          }
+          if (!alreadyInList) {
+            list.add(newExecutableElementEntry);
+          }
+        }
+      }
+    }
+    return unionMap;
+  }
 }
 
 /**
@@ -14510,7 +14546,7 @@
   /**
    * A table mapping URI-based directive to the actual URI value.
    */
-  Map<UriBasedDirective, String> _directiveUris = new Map<UriBasedDirective, String>();
+  HashMap<UriBasedDirective, String> _directiveUris = new HashMap<UriBasedDirective, String>();
 
   /**
    * A flag indicating whether this library explicitly imports core.
@@ -14526,7 +14562,7 @@
    * A table mapping the sources for the compilation units in this library to their corresponding
    * AST structures.
    */
-  Map<Source, ResolvableCompilationUnit> _astMap = new Map<Source, ResolvableCompilationUnit>();
+  HashMap<Source, ResolvableCompilationUnit> _astMap = new HashMap<Source, ResolvableCompilationUnit>();
 
   /**
    * The library scope used when resolving elements within this library's compilation units.
@@ -14626,7 +14662,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<Library> get importsAndExports {
-    Set<Library> libraries = new Set<Library>();
+    HashSet<Library> libraries = new HashSet<Library>();
     for (Library library in _importedLibraries) {
       libraries.add(library);
     }
@@ -14978,7 +15014,7 @@
    * @param setters the list to which setters are to be added
    * @param unit the compilation unit defining the accessors that are potentially being added
    */
-  void _collectAccessors(Map<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
+  void _collectAccessors(HashMap<String, PropertyAccessorElement> getters, List<PropertyAccessorElement> setters, CompilationUnitElement unit) {
     for (PropertyAccessorElement accessor in unit.accessors) {
       if (accessor.isGetter) {
         if (!accessor.isSynthetic && accessor.correspondingSetter == null) {
@@ -15039,7 +15075,7 @@
    * @param libraryElement the library defining the compilation units to be processed
    */
   void _patchTopLevelAccessors(LibraryElementImpl libraryElement) {
-    Map<String, PropertyAccessorElement> getters = new Map<String, PropertyAccessorElement>();
+    HashMap<String, PropertyAccessorElement> getters = new HashMap<String, PropertyAccessorElement>();
     List<PropertyAccessorElement> setters = new List<PropertyAccessorElement>();
     _collectAccessors(getters, setters, libraryElement.definingCompilationUnit);
     for (CompilationUnitElement unit in libraryElement.parts) {
@@ -15248,7 +15284,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, Library> _libraryMap = new Map<Source, Library>();
+  HashMap<Source, Library> _libraryMap = new HashMap<Source, Library>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -15306,7 +15342,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = createLibrary(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException("Core library does not exist");
+          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15390,7 +15426,7 @@
         // This will be true unless the library being analyzed is the core library.
         _coreLibrary = _createLibraryOrNull(_coreLibrarySource);
         if (_coreLibrary == null) {
-          throw new AnalysisException("Core library does not exist");
+          LibraryResolver2.missingCoreLibrary(analysisContext, _coreLibrarySource);
         }
       }
       instrumentation.metric3("createLibrary", "complete");
@@ -15472,7 +15508,7 @@
    * @param referencingLibrary the library that references the referenced library
    * @param referencedLibrary the library referenced by the referencing library
    */
-  void _addDependencyToMap(Map<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
+  void _addDependencyToMap(HashMap<Library, List<Library>> dependencyMap, Library referencingLibrary, Library referencedLibrary) {
     List<Library> dependentLibraries = dependencyMap[referencedLibrary];
     if (dependentLibraries == null) {
       dependentLibraries = new List<Library>();
@@ -15491,7 +15527,7 @@
    * @param dependencyMap a table mapping libraries to the collection of libraries from which those
    *          libraries are referenced
    */
-  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, Map<Library, List<Library>> dependencyMap) {
+  void _addLibrariesInCycle(Library library, Set<Library> librariesInCycle, HashMap<Library, List<Library>> dependencyMap) {
     if (librariesInCycle.add(library)) {
       List<Library> dependentLibraries = dependencyMap[library];
       if (dependentLibraries != null) {
@@ -15511,7 +15547,7 @@
    * @param visitedLibraries the libraries that have already been visited, used to prevent infinite
    *          recursion
    */
-  void _addToDependencyMap(Library library, Map<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
+  void _addToDependencyMap(Library library, HashMap<Library, List<Library>> dependencyMap, Set<Library> visitedLibraries) {
     if (visitedLibraries.add(library)) {
       for (Library referencedLibrary in library.importsAndExports) {
         _addDependencyToMap(dependencyMap, library, referencedLibrary);
@@ -15556,7 +15592,7 @@
    */
   void _buildDirectiveModels() {
     for (Library library in _librariesInCycles) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -15692,9 +15728,9 @@
    *
    * @param library the library currently being added to the dependency map
    */
-  Map<Library, List<Library>> _computeDependencyMap(Library library) {
-    Map<Library, List<Library>> dependencyMap = new Map<Library, List<Library>>();
-    _addToDependencyMap(library, dependencyMap, new Set<Library>());
+  HashMap<Library, List<Library>> _computeDependencyMap(Library library) {
+    HashMap<Library, List<Library>> dependencyMap = new HashMap<Library, List<Library>>();
+    _addToDependencyMap(library, dependencyMap, new HashSet<Library>());
     return dependencyMap;
   }
 
@@ -15707,8 +15743,8 @@
    */
   void _computeEmbeddedLibraryDependencies(Library library, CompilationUnit unit) {
     Source librarySource = library.librarySource;
-    Set<Source> exportedSources = new Set<Source>();
-    Set<Source> importedSources = new Set<Source>();
+    HashSet<Source> exportedSources = new HashSet<Source>();
+    HashSet<Source> importedSources = new HashSet<Source>();
     for (Directive directive in unit.directives) {
       if (directive is ExportDirective) {
         Source exportSource = _resolveSource(librarySource, directive);
@@ -15734,8 +15770,8 @@
    *         back to the given library
    */
   Set<Library> _computeLibrariesInCycles(Library library) {
-    Map<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
-    Set<Library> librariesInCycle = new Set<Library>();
+    HashMap<Library, List<Library>> dependencyMap = _computeDependencyMap(library);
+    Set<Library> librariesInCycle = new HashSet<Library>();
     _addLibrariesInCycle(library, librariesInCycle, dependencyMap);
     return librariesInCycle;
   }
@@ -15962,6 +15998,18 @@
  */
 class LibraryResolver2 {
   /**
+   * Report that the core library could not be resolved in the given analysis context and throw an
+   * exception.
+   *
+   * @param analysisContext the analysis context in which the failure occurred
+   * @param coreLibrarySource the source representing the core library
+   * @throws AnalysisException always
+   */
+  static void missingCoreLibrary(AnalysisContext analysisContext, Source coreLibrarySource) {
+    throw new AnalysisException("Could not resolve dart:core");
+  }
+
+  /**
    * The analysis context in which the libraries are being analyzed.
    */
   final InternalAnalysisContext analysisContext;
@@ -15991,7 +16039,7 @@
   /**
    * A table mapping library sources to the information being maintained for those libraries.
    */
-  Map<Source, ResolvableLibrary> _libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _libraryMap = new HashMap<Source, ResolvableLibrary>();
 
   /**
    * A collection containing the libraries that are being resolved together.
@@ -16065,7 +16113,7 @@
       instrumentation.metric3("buildElementModels", "complete");
       LibraryElement coreElement = _coreLibrary.libraryElement;
       if (coreElement == null) {
-        throw new AnalysisException("Could not resolve dart:core");
+        missingCoreLibrary(analysisContext, _coreLibrarySource);
       }
       _buildDirectiveModels();
       instrumentation.metric3("buildDirectiveModels", "complete");
@@ -16132,7 +16180,7 @@
    */
   void _buildDirectiveModels() {
     for (ResolvableLibrary library in _librariesInCycle) {
-      Map<String, PrefixElementImpl> nameToPrefixMap = new Map<String, PrefixElementImpl>();
+      HashMap<String, PrefixElementImpl> nameToPrefixMap = new HashMap<String, PrefixElementImpl>();
       List<ImportElement> imports = new List<ImportElement>();
       List<ExportElement> exports = new List<ExportElement>();
       for (Directive directive in library.definingCompilationUnit.directives) {
@@ -16241,8 +16289,8 @@
     }
   }
 
-  Map<Source, ResolvableLibrary> _buildLibraryMap() {
-    Map<Source, ResolvableLibrary> libraryMap = new Map<Source, ResolvableLibrary>();
+  HashMap<Source, ResolvableLibrary> _buildLibraryMap() {
+    HashMap<Source, ResolvableLibrary> libraryMap = new HashMap<Source, ResolvableLibrary>();
     int libraryCount = _librariesInCycle.length;
     for (int i = 0; i < libraryCount; i++) {
       ResolvableLibrary library = _librariesInCycle[i];
@@ -16615,12 +16663,12 @@
    * A table mapping names that are defined in this namespace to the element representing the thing
    * declared with that name.
    */
-  final Map<String, Element> _definedNames;
+  final HashMap<String, Element> _definedNames;
 
   /**
    * An empty namespace.
    */
-  static Namespace EMPTY = new Namespace(new Map<String, Element>());
+  static Namespace EMPTY = new Namespace(new HashMap<String, Element>());
 
   /**
    * Initialize a newly created namespace to have the given defined names.
@@ -16644,7 +16692,7 @@
    *
    * @return a table containing the same mappings as those defined by this namespace
    */
-  Map<String, Element> get definedNames => new Map<String, Element>.from(_definedNames);
+  Map<String, Element> get definedNames => new HashMap<String, Element>.from(_definedNames);
 }
 
 /**
@@ -16666,7 +16714,7 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = _createExportMapping(exportedLibrary, new Set<LibraryElement>());
+    HashMap<String, Element> definedNames = _createExportMapping(exportedLibrary, new HashSet<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     return new Namespace(definedNames);
   }
@@ -16677,7 +16725,7 @@
    * @param library the library whose export namespace is to be created
    * @return the export namespace that was created
    */
-  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new Set<LibraryElement>()));
+  Namespace createExportNamespaceForLibrary(LibraryElement library) => new Namespace(_createExportMapping(library, new HashSet<LibraryElement>()));
 
   /**
    * Create a namespace representing the import namespace of the given library.
@@ -16693,7 +16741,7 @@
       //
       return Namespace.EMPTY;
     }
-    Map<String, Element> definedNames = _createExportMapping(importedLibrary, new Set<LibraryElement>());
+    HashMap<String, Element> definedNames = _createExportMapping(importedLibrary, new HashSet<LibraryElement>());
     definedNames = _applyCombinators(definedNames, element.combinators);
     definedNames = _applyPrefix(definedNames, element.prefix);
     return new Namespace(definedNames);
@@ -16706,7 +16754,7 @@
    * @return the public namespace that was created
    */
   Namespace createPublicNamespaceForLibrary(LibraryElement library) {
-    Map<String, Element> definedNames = new Map<String, Element>();
+    HashMap<String, Element> definedNames = new HashMap<String, Element>();
     _addPublicNames(definedNames, library.definingCompilationUnit);
     for (CompilationUnitElement compilationUnit in library.parts) {
       _addPublicNames(definedNames, compilationUnit);
@@ -16780,7 +16828,7 @@
    * @param definedNames the mapping table to which the namespace operations are to be applied
    * @param combinators the combinators to be applied
    */
-  Map<String, Element> _applyCombinators(Map<String, Element> definedNames, List<NamespaceCombinator> combinators) {
+  HashMap<String, Element> _applyCombinators(HashMap<String, Element> definedNames, List<NamespaceCombinator> combinators) {
     for (NamespaceCombinator combinator in combinators) {
       if (combinator is HideElementCombinator) {
         _hide(definedNames, combinator.hiddenNames);
@@ -16800,10 +16848,10 @@
    * @param definedNames the names that were defined before this operation
    * @param prefixElement the element defining the prefix to be added to the names
    */
-  Map<String, Element> _applyPrefix(Map<String, Element> definedNames, PrefixElement prefixElement) {
+  HashMap<String, Element> _applyPrefix(HashMap<String, Element> definedNames, PrefixElement prefixElement) {
     if (prefixElement != null) {
       String prefix = prefixElement.name;
-      Map<String, Element> newNames = new Map<String, Element>();
+      HashMap<String, Element> newNames = new HashMap<String, Element>();
       for (MapEntry<String, Element> entry in getMapEntrySet(definedNames)) {
         newNames["${prefix}.${entry.getKey()}"] = entry.getValue();
       }
@@ -16822,17 +16870,17 @@
    *          be added by another library
    * @return the mapping table that was created
    */
-  Map<String, Element> _createExportMapping(LibraryElement library, Set<LibraryElement> visitedElements) {
+  HashMap<String, Element> _createExportMapping(LibraryElement library, HashSet<LibraryElement> visitedElements) {
     visitedElements.add(library);
     try {
-      Map<String, Element> definedNames = new Map<String, Element>();
+      HashMap<String, Element> definedNames = new HashMap<String, Element>();
       for (ExportElement element in library.exports) {
         LibraryElement exportedLibrary = element.exportedLibrary;
         if (exportedLibrary != null && !visitedElements.contains(exportedLibrary)) {
           //
           // The exported library will be null if the URI does not reference a valid library.
           //
-          Map<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
+          HashMap<String, Element> exportedNames = _createExportMapping(exportedLibrary, visitedElements);
           exportedNames = _applyCombinators(exportedNames, element.combinators);
           _addAllFromMap(definedNames, exportedNames);
         }
@@ -16850,7 +16898,7 @@
    * @param definedNames the names that were defined before this operation
    * @param hiddenNames the names to be hidden
    */
-  void _hide(Map<String, Element> definedNames, List<String> hiddenNames) {
+  void _hide(HashMap<String, Element> definedNames, List<String> hiddenNames) {
     for (String name in hiddenNames) {
       definedNames.remove(name);
       definedNames.remove("${name}=");
@@ -16864,8 +16912,8 @@
    * @param definedNames the names that were defined before this operation
    * @param shownNames the names to be shown
    */
-  Map<String, Element> _show(Map<String, Element> definedNames, List<String> shownNames) {
-    Map<String, Element> newNames = new Map<String, Element>();
+  HashMap<String, Element> _show(HashMap<String, Element> definedNames, List<String> shownNames) {
+    HashMap<String, Element> newNames = new HashMap<String, Element>();
     for (String name in shownNames) {
       Element element = definedNames[name];
       if (element != null) {
@@ -17551,7 +17599,7 @@
    * @return the libraries that are either imported or exported from this library
    */
   List<ResolvableLibrary> get importsAndExports {
-    Set<ResolvableLibrary> libraries = new Set<ResolvableLibrary>();
+    HashSet<ResolvableLibrary> libraries = new HashSet<ResolvableLibrary>();
     for (ResolvableLibrary library in _importedLibraries) {
       libraries.add(library);
     }
@@ -17724,6 +17772,9 @@
 
   @override
   ErrorSeverity get errorSeverity => type.severity;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
@@ -17963,6 +18014,8 @@
       _enclosingClass = node.element;
       _typeAnalyzer.thisType = _enclosingClass == null ? null : _enclosingClass.type;
       super.visitClassDeclaration(node);
+      node.accept(_elementResolver);
+      node.accept(_typeAnalyzer);
     } finally {
       _typeAnalyzer.thisType = outerType == null ? null : outerType.type;
       _enclosingClass = outerType;
@@ -18163,7 +18216,7 @@
     try {
       super.visitFieldDeclaration(node);
     } finally {
-      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
+      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.fields);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18255,7 +18308,7 @@
   Object visitIfStatement(IfStatement node) {
     Expression condition = node.condition;
     safelyVisit(condition);
-    Map<Element, DartType> thenOverrides = null;
+    HashMap<Element, DartType> thenOverrides = null;
     Statement thenStatement = node.thenStatement;
     if (thenStatement != null) {
       _overrideManager.enterScope();
@@ -18277,7 +18330,7 @@
         _overrideManager.exitScope();
       }
     }
-    Map<Element, DartType> elseOverrides = null;
+    HashMap<Element, DartType> elseOverrides = null;
     Statement elseStatement = node.elseStatement;
     if (elseStatement != null) {
       _overrideManager.enterScope();
@@ -18426,7 +18479,7 @@
     try {
       super.visitTopLevelVariableDeclaration(node);
     } finally {
-      Map<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
+      HashMap<Element, DartType> overrides = _overrideManager.captureOverrides(node.variables);
       _overrideManager.exitScope();
       _overrideManager.applyOverrides(overrides);
     }
@@ -18578,14 +18631,15 @@
     if (potentialType == null || potentialType.isBottom) {
       return;
     }
-    if (element is PropertyInducingElement) {
-      PropertyInducingElement variable = element;
-      if (!variable.isConst && !variable.isFinal) {
-        return;
-      }
-    }
     DartType currentType = _getBestType(element);
     if (currentType == null || !currentType.isMoreSpecificThan(potentialType)) {
+      if (element is PropertyInducingElement) {
+        PropertyInducingElement variable = element;
+        if (!variable.isConst && !variable.isFinal) {
+          return;
+        }
+        (variable as PropertyInducingElementImpl).propagatedType = potentialType;
+      }
       _overrideManager.setType(element, potentialType);
     }
   }
@@ -19043,7 +19097,7 @@
    * A table mapping names that are defined in this scope to the element representing the thing
    * declared with that name.
    */
-  Map<String, Element> _definedNames = new Map<String, Element>();
+  HashMap<String, Element> _definedNames = new HashMap<String, Element>();
 
   /**
    * A flag indicating whether there are any names defined in this scope.
@@ -19264,13 +19318,13 @@
       if (element == null) {
         throw new AnalysisException("Cannot build a scope for an unresolved class");
       }
-      scope = new ClassScope(scope, element);
+      scope = new ClassScope(new TypeParameterScope(scope, element), element);
     } else if (node is ClassTypeAlias) {
       ClassElement element = node.element;
       if (element == null) {
         throw new AnalysisException("Cannot build a scope for an unresolved class type alias");
       }
-      scope = new ClassScope(scope, element);
+      scope = new ClassScope(new TypeParameterScope(scope, element), element);
     } else if (node is ConstructorDeclaration) {
       ConstructorElement element = node.element;
       if (element == null) {
@@ -19481,11 +19535,14 @@
     Scope outerScope = _nameScope;
     try {
       if (classElement == null) {
-        AnalysisEngine.instance.logger.logInformation2("Missing element for constructor ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        AnalysisEngine.instance.logger.logInformation2("Missing element for class declaration ${node.name.name} in ${definingLibrary.source.fullName}", new JavaException());
+        super.visitClassDeclaration(node);
       } else {
+        _nameScope = new TypeParameterScope(_nameScope, classElement);
+        visitClassDeclarationInScope(node);
         _nameScope = new ClassScope(_nameScope, classElement);
+        visitClassMembersInScope(node);
       }
-      visitClassDeclarationInScope(node);
     } finally {
       _nameScope = outerScope;
     }
@@ -19496,7 +19553,8 @@
   Object visitClassTypeAlias(ClassTypeAlias node) {
     Scope outerScope = _nameScope;
     try {
-      _nameScope = new ClassScope(_nameScope, node.element);
+      ClassElement element = node.element;
+      _nameScope = new ClassScope(new TypeParameterScope(_nameScope, element), element);
       super.visitClassTypeAlias(node);
     } finally {
       _nameScope = outerScope;
@@ -19827,7 +19885,18 @@
   }
 
   void visitClassDeclarationInScope(ClassDeclaration node) {
-    super.visitClassDeclaration(node);
+    safelyVisit(node.name);
+    safelyVisit(node.typeParameters);
+    safelyVisit(node.extendsClause);
+    safelyVisit(node.withClause);
+    safelyVisit(node.implementsClause);
+    safelyVisit(node.nativeClause);
+  }
+
+  void visitClassMembersInScope(ClassDeclaration node) {
+    safelyVisit(node.documentationComment);
+    node.metadata.accept(this);
+    node.members.accept(this);
   }
 
   /**
@@ -19942,8 +20011,8 @@
    *
    * @return the table that was created
    */
-  static Map<String, String> _createHtmlTagToClassMap() {
-    Map<String, String> map = new Map<String, String>();
+  static HashMap<String, String> _createHtmlTagToClassMap() {
+    HashMap<String, String> map = new HashMap<String, String>();
     map["a"] = "AnchorElement";
     map["area"] = "AreaElement";
     map["br"] = "BRElement";
@@ -20039,13 +20108,13 @@
   /**
    * A table mapping [ExecutableElement]s to their propagated return types.
    */
-  Map<ExecutableElement, DartType> _propagatedReturnTypes = new Map<ExecutableElement, DartType>();
+  HashMap<ExecutableElement, DartType> _propagatedReturnTypes = new HashMap<ExecutableElement, DartType>();
 
   /**
    * A table mapping HTML tag names to the names of the classes (in 'dart:html') that implement
    * those tags.
    */
-  static Map<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
+  static HashMap<String, String> _HTML_ELEMENT_TO_CLASS_MAP = _createHtmlTagToClassMap();
 
   /**
    * Initialize a newly created type analyzer.
@@ -20808,6 +20877,7 @@
     SimpleIdentifier prefixedIdentifier = node.identifier;
     Element staticElement = prefixedIdentifier.staticElement;
     DartType staticType = _dynamicType;
+    DartType propagatedType = null;
     if (staticElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         staticType = staticElement.type;
@@ -20824,6 +20894,7 @@
       staticType = staticElement.type;
     } else if (staticElement is PropertyAccessorElement) {
       staticType = _getTypeOfProperty(staticElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(staticElement, propagatedType);
     } else if (staticElement is ExecutableElement) {
       staticType = staticElement.type;
     } else if (staticElement is TypeParameterElement) {
@@ -20834,7 +20905,6 @@
     _recordStaticType(prefixedIdentifier, staticType);
     _recordStaticType(node, staticType);
     Element propagatedElement = prefixedIdentifier.propagatedElement;
-    DartType propagatedType = null;
     if (propagatedElement is ClassElement) {
       if (_isNotTypeLiteral(node)) {
         propagatedType = propagatedElement.type;
@@ -20847,6 +20917,7 @@
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is PropertyAccessorElement) {
       propagatedType = _getTypeOfProperty(propagatedElement, node.prefix.staticType);
+      propagatedType = _getPropertyPropagatedType(propagatedElement, propagatedType);
     } else if (propagatedElement is ExecutableElement) {
       propagatedType = propagatedElement.type;
     } else if (propagatedElement is TypeParameterElement) {
@@ -21052,7 +21123,13 @@
     _recordStaticType(node, staticType);
     // TODO(brianwilkerson) I think we want to repeat the logic above using the propagated element
     // to get another candidate for the propagated type.
-    DartType propagatedType = _overrideManager.getType(element);
+    DartType propagatedType = _getPropertyPropagatedType(element, null);
+    if (propagatedType == null) {
+      DartType overriddenType = _overrideManager.getType(element);
+      if (propagatedType == null || overriddenType != null && overriddenType.isMoreSpecificThan(propagatedType)) {
+        propagatedType = overriddenType;
+      }
+    }
     if (propagatedType != null && propagatedType.isMoreSpecificThan(staticType)) {
       _recordPropagatedType(node, propagatedType);
     }
@@ -21275,7 +21352,7 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  DartType _getElementNameAsType(LibraryElement library, String elementName, Map<String, String> nameMap) {
+  DartType _getElementNameAsType(LibraryElement library, String elementName, HashMap<String, String> nameMap) {
     if (elementName != null) {
       if (nameMap != null) {
         elementName = nameMap[elementName.toLowerCase()];
@@ -21363,7 +21440,24 @@
    * @param nameMap an optional map used to map the element name to a type name
    * @return the type specified by the first argument in the argument list
    */
-  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, Map<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
+  DartType _getFirstArgumentAsTypeWithMap(LibraryElement library, ArgumentList argumentList, HashMap<String, String> nameMap) => _getElementNameAsType(library, _getFirstArgumentAsString(argumentList), nameMap);
+
+  /**
+   * Return the propagated type of the given [Element], or `null`.
+   */
+  DartType _getPropertyPropagatedType(Element element, DartType currentType) {
+    if (element is PropertyAccessorElement) {
+      PropertyAccessorElement accessor = element;
+      if (accessor.isGetter) {
+        PropertyInducingElement variable = accessor.variable;
+        DartType propagatedType = variable.propagatedType;
+        if (currentType == null || propagatedType != null && propagatedType.isMoreSpecificThan(currentType)) {
+          return propagatedType;
+        }
+      }
+    }
+    return currentType;
+  }
 
   /**
    * Return the static type of the given expression.
@@ -21578,26 +21672,26 @@
    * A map between [ClassElement]s and a set of [ClassElement]s that are subtypes of the
    * key.
    */
-  Map<ClassElement, Set<ClassElement>> _subtypeMap = new Map<ClassElement, Set<ClassElement>>();
+  HashMap<ClassElement, HashSet<ClassElement>> _subtypeMap = new HashMap<ClassElement, HashSet<ClassElement>>();
 
   /**
    * The set of all [LibraryElement]s that have been visited by the manager. This is used both
    * to prevent infinite loops in the recursive methods, and also as a marker for the scope of the
    * libraries visited by this manager.
    */
-  Set<LibraryElement> _visitedLibraries = new Set<LibraryElement>();
+  HashSet<LibraryElement> _visitedLibraries = new HashSet<LibraryElement>();
 
   /**
    * Given some [ClassElement], return the set of all subtypes, and subtypes of subtypes.
    *
    * @param classElement the class to recursively return the set of subtypes of
    */
-  Set<ClassElement> computeAllSubtypes(ClassElement classElement) {
+  HashSet<ClassElement> computeAllSubtypes(ClassElement classElement) {
     // Ensure that we have generated the subtype map for the library
     _computeSubtypesInLibrary(classElement.library);
     // use the subtypeMap to compute the set of all subtypes and subtype's subtypes
-    Set<ClassElement> allSubtypes = new Set<ClassElement>();
-    _safelyComputeAllSubtypes(classElement, new Set<ClassElement>(), allSubtypes);
+    HashSet<ClassElement> allSubtypes = new HashSet<ClassElement>();
+    _safelyComputeAllSubtypes(classElement, new HashSet<ClassElement>(), allSubtypes);
     return allSubtypes;
   }
 
@@ -21690,9 +21784,9 @@
    * @param subtypeElement the value for the [subtypeMap] map
    */
   void _putInSubtypeMap(ClassElement supertypeElement, ClassElement subtypeElement) {
-    Set<ClassElement> subtypes = _subtypeMap[supertypeElement];
+    HashSet<ClassElement> subtypes = _subtypeMap[supertypeElement];
     if (subtypes == null) {
-      subtypes = new Set<ClassElement>();
+      subtypes = new HashSet<ClassElement>();
       _subtypeMap[supertypeElement] = subtypes;
     }
     subtypes.add(subtypeElement);
@@ -21706,12 +21800,12 @@
    * @param visitedClasses the set of class elements that this method has already recursively seen
    * @param allSubtypes the computed set of subtypes of the passed class element
    */
-  void _safelyComputeAllSubtypes(ClassElement classElement, Set<ClassElement> visitedClasses, Set<ClassElement> allSubtypes) {
+  void _safelyComputeAllSubtypes(ClassElement classElement, HashSet<ClassElement> visitedClasses, HashSet<ClassElement> allSubtypes) {
     if (!visitedClasses.add(classElement)) {
       // if this class has already been called on this class element
       return;
     }
-    Set<ClassElement> subtypes = _subtypeMap[classElement];
+    HashSet<ClassElement> subtypes = _subtypeMap[classElement];
     if (subtypes == null) {
       return;
     }
@@ -21797,7 +21891,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, DartType> overrides) {
+  void applyOverrides(HashMap<Element, DartType> overrides) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot apply overrides without a scope");
     }
@@ -21810,7 +21904,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, DartType> captureLocalOverrides() {
+  HashMap<Element, DartType> captureLocalOverrides() {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture local overrides without a scope");
     }
@@ -21824,7 +21918,7 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
     if (_currentScope == null) {
       throw new IllegalStateException("Cannot capture overrides without a scope");
     }
@@ -21889,7 +21983,7 @@
   /**
    * A table mapping elements to the overridden type of that element.
    */
-  Map<Element, DartType> _overridenTypes = new Map<Element, DartType>();
+  HashMap<Element, DartType> _overridenTypes = new HashMap<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -21903,7 +21997,7 @@
    *
    * @param overrides the overrides to be applied
    */
-  void applyOverrides(Map<Element, DartType> overrides) {
+  void applyOverrides(HashMap<Element, DartType> overrides) {
     for (MapEntry<Element, DartType> entry in getMapEntrySet(overrides)) {
       _overridenTypes[entry.getKey()] = entry.getValue();
     }
@@ -21915,7 +22009,7 @@
    *
    * @return the overrides in the current scope
    */
-  Map<Element, DartType> captureLocalOverrides() => _overridenTypes;
+  HashMap<Element, DartType> captureLocalOverrides() => _overridenTypes;
 
   /**
    * Return a map from the elements for the variables in the given list that have their types
@@ -21924,8 +22018,8 @@
    * @param variableList the list of variables whose overriding types are to be captured
    * @return a table mapping elements to their overriding types
    */
-  Map<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
-    Map<Element, DartType> overrides = new Map<Element, DartType>();
+  HashMap<Element, DartType> captureOverrides(VariableDeclarationList variableList) {
+    HashMap<Element, DartType> overrides = new HashMap<Element, DartType>();
     if (variableList.isConst || variableList.isFinal) {
       for (VariableDeclaration variable in variableList.variables) {
         Element element = variable.element;
@@ -21972,6 +22066,36 @@
 }
 
 /**
+ * Instances of the class `TypeParameterScope` implement the scope defined by the type
+ * parameters in a class.
+ */
+class TypeParameterScope extends EnclosedScope {
+  /**
+   * Initialize a newly created scope enclosed within another scope.
+   *
+   * @param enclosingScope the scope in which this scope is lexically enclosed
+   * @param typeElement the element representing the type represented by this scope
+   */
+  TypeParameterScope(Scope enclosingScope, ClassElement typeElement) : super(enclosingScope) {
+    if (typeElement == null) {
+      throw new IllegalArgumentException("class element cannot be null");
+    }
+    _defineTypeParameters(typeElement);
+  }
+
+  /**
+   * Define the type parameters for the class.
+   *
+   * @param typeElement the element representing the type represented by this scope
+   */
+  void _defineTypeParameters(ClassElement typeElement) {
+    for (TypeParameterElement typeParameter in typeElement.typeParameters) {
+      define(typeParameter);
+    }
+  }
+}
+
+/**
  * Instances of the class `TypePromotionManager` manage the ability to promote types of local
  * variables and formal parameters from their declared types based on control flow.
  */
@@ -22057,7 +22181,7 @@
   /**
    * A table mapping elements to the promoted type of that element.
    */
-  Map<Element, DartType> _promotedTypes = new Map<Element, DartType>();
+  HashMap<Element, DartType> _promotedTypes = new HashMap<Element, DartType>();
 
   /**
    * Initialize a newly created scope to be an empty child of the given scope.
@@ -22554,13 +22678,15 @@
 
   @override
   Object visitClassDeclaration(ClassDeclaration node) {
+    ExtendsClause extendsClause = node.extendsClause;
+    WithClause withClause = node.withClause;
+    ImplementsClause implementsClause = node.implementsClause;
     _hasReferenceToSuper = false;
     super.visitClassDeclaration(node);
     ClassElementImpl classElement = _getClassElement(node.name);
     InterfaceType superclassType = null;
-    ExtendsClause extendsClause = node.extendsClause;
     if (extendsClause != null) {
-      ErrorCode errorCode = (node.withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
+      ErrorCode errorCode = (withClause == null ? CompileTimeErrorCode.EXTENDS_NON_CLASS : CompileTimeErrorCode.MIXIN_WITH_NON_CLASS_SUPERCLASS);
       superclassType = _resolveType(extendsClause.superclass, errorCode, errorCode);
       if (!identical(superclassType, typeProvider.objectType)) {
         classElement.validMixin = false;
@@ -22576,7 +22702,7 @@
       classElement.supertype = superclassType;
       classElement.hasReferenceToSuper = _hasReferenceToSuper;
     }
-    _resolve(classElement, node.withClause, node.implementsClause);
+    _resolve(classElement, withClause, implementsClause);
     return null;
   }
 
@@ -23030,13 +23156,13 @@
   }
 
   @override
-  void visitClassDeclarationInScope(ClassDeclaration node) {
+  void visitClassMembersInScope(ClassDeclaration node) {
     //
     // Process field declarations before constructors and methods so that the types of field formal
     // parameters can be correctly resolved.
     //
     List<ClassMember> nonFields = new List<ClassMember>();
-    node.visitChildren(new UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope(this, nonFields));
+    node.visitChildren(new UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope(this, nonFields));
     int count = nonFields.length;
     for (int i = 0; i < count; i++) {
       nonFields[i].accept(this);
@@ -23527,12 +23653,12 @@
   Object visitNode(AstNode node) => node.accept(ElementBuilder_this);
 }
 
-class UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope extends UnifyingAstVisitor<Object> {
+class UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope extends UnifyingAstVisitor<Object> {
   final TypeResolverVisitor TypeResolverVisitor_this;
 
   List<ClassMember> nonFields;
 
-  UnifyingAstVisitor_TypeResolverVisitor_visitClassDeclarationInScope(this.TypeResolverVisitor_this, this.nonFields) : super();
+  UnifyingAstVisitor_TypeResolverVisitor_visitClassMembersInScope(this.TypeResolverVisitor_this, this.nonFields) : super();
 
   @override
   Object visitConstructorDeclaration(ConstructorDeclaration node) {
@@ -23541,6 +23667,12 @@
   }
 
   @override
+  Object visitExtendsClause(ExtendsClause node) => null;
+
+  @override
+  Object visitImplementsClause(ImplementsClause node) => null;
+
+  @override
   Object visitMethodDeclaration(MethodDeclaration node) {
     nonFields.add(node);
     return null;
@@ -23548,6 +23680,9 @@
 
   @override
   Object visitNode(AstNode node) => node.accept(TypeResolverVisitor_this);
+
+  @override
+  Object visitWithClause(WithClause node) => null;
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/scanner.dart b/pkg/analyzer/lib/src/generated/scanner.dart
index 0153b3c..2d50d11 100644
--- a/pkg/analyzer/lib/src/generated/scanner.dart
+++ b/pkg/analyzer/lib/src/generated/scanner.dart
@@ -1631,8 +1631,8 @@
     while (next != -1) {
       if (next == 0x24) {
         _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        _beginToken();
         next = _tokenizeStringInterpolation(start);
+        _beginToken();
         start = _reader.offset;
         continue;
       }
@@ -1678,7 +1678,11 @@
       }
     }
     _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-    _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    if (start == _reader.offset) {
+      _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+    } else {
+      _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+    }
     return _reader.advance();
   }
 
@@ -1750,7 +1754,7 @@
         return _reader.advance();
       } else if (next == 0xD || next == 0xA) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1766,14 +1770,20 @@
         next = _reader.advance();
       } else if (next == 0x24) {
         _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
-        _beginToken();
         next = _tokenizeStringInterpolation(start);
+        _beginToken();
         start = _reader.offset;
         continue;
       }
       if (next <= 0xD && (next == 0xA || next == 0xD || next == -1)) {
         _reportError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, []);
-        _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        if (start == _reader.offset) {
+          _appendStringTokenWithOffset(TokenType.STRING, "", 1);
+        } else if (next == -1) {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, 0));
+        } else {
+          _appendStringToken(TokenType.STRING, _reader.getString(start, -1));
+        }
         return _reader.advance();
       }
       next = _reader.advance();
@@ -1911,6 +1921,9 @@
 
   @override
   ErrorType get type => ErrorType.SYNTACTIC_ERROR;
+
+  @override
+  String get uniqueName => "${runtimeType.toString()}.${name}";
 }
 
 /**
diff --git a/pkg/analyzer/lib/src/generated/sdk.dart b/pkg/analyzer/lib/src/generated/sdk.dart
index 4a60af2..84ccc2d 100644
--- a/pkg/analyzer/lib/src/generated/sdk.dart
+++ b/pkg/analyzer/lib/src/generated/sdk.dart
@@ -7,6 +7,7 @@
 
 library engine.sdk;
 
+import 'dart:collection';
 import 'source.dart' show ContentCache, Source, UriKind;
 import 'ast.dart';
 import 'engine.dart' show AnalysisContext;
@@ -101,7 +102,7 @@
   /**
    * A table mapping Dart library URI's to the library.
    */
-  Map<String, SdkLibraryImpl> _libraryMap = new Map<String, SdkLibraryImpl>();
+  HashMap<String, SdkLibraryImpl> _libraryMap = new HashMap<String, SdkLibraryImpl>();
 
   /**
    * Return the library with the given URI, or `null` if the URI does not map to a library.
diff --git a/pkg/analyzer/lib/src/generated/source.dart b/pkg/analyzer/lib/src/generated/source.dart
index 3e41f46..e01f15f 100644
--- a/pkg/analyzer/lib/src/generated/source.dart
+++ b/pkg/analyzer/lib/src/generated/source.dart
@@ -7,6 +7,7 @@
 
 library engine.source;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'sdk.dart' show DartSdk;
 import 'engine.dart' show AnalysisContext, TimestampedData;
@@ -20,13 +21,13 @@
    * A table mapping sources to the contents of those sources. This is used to override the default
    * contents of a source.
    */
-  Map<Source, String> _contentMap = new Map<Source, String>();
+  HashMap<Source, String> _contentMap = new HashMap<Source, String>();
 
   /**
    * A table mapping sources to the modification stamps of those sources. This is used when the
    * default contents of a source has been overridden.
    */
-  Map<Source, int> _stampMap = new Map<Source, int>();
+  HashMap<Source, int> _stampMap = new HashMap<Source, int>();
 
   /**
    * Return the contents of the given source, or `null` if this cache does not override the
@@ -787,16 +788,11 @@
   static const UriKind FILE_URI = const UriKind('FILE_URI', 1, 0x66);
 
   /**
-   * A 'package:' URI referencing source package itself.
-   */
-  static const UriKind PACKAGE_SELF_URI = const UriKind('PACKAGE_SELF_URI', 2, 0x73);
-
-  /**
    * A 'package:' URI.
    */
-  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 3, 0x70);
+  static const UriKind PACKAGE_URI = const UriKind('PACKAGE_URI', 2, 0x70);
 
-  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_SELF_URI, PACKAGE_URI];
+  static const List<UriKind> values = const [DART_URI, FILE_URI, PACKAGE_URI];
 
   /**
    * Return the URI kind represented by the given encoding, or `null` if there is no kind with
@@ -811,8 +807,6 @@
         return DART_URI;
       } else if (encoding == 0x66) {
         return FILE_URI;
-      } else if (encoding == 0x73) {
-        return PACKAGE_SELF_URI;
       } else if (encoding == 0x70) {
         return PACKAGE_URI;
       }
diff --git a/pkg/analyzer/lib/src/generated/source_io.dart b/pkg/analyzer/lib/src/generated/source_io.dart
index fa87510..962368c 100644
--- a/pkg/analyzer/lib/src/generated/source_io.dart
+++ b/pkg/analyzer/lib/src/generated/source_io.dart
@@ -370,7 +370,7 @@
 
   @override
   Source fromEncoding(UriKind kind, Uri uri) {
-    if (kind == UriKind.PACKAGE_SELF_URI || kind == UriKind.PACKAGE_URI) {
+    if (kind == UriKind.PACKAGE_URI) {
       return new FileBasedSource.con2(new JavaFile.fromUri(uri), kind);
     }
     return null;
@@ -407,7 +407,7 @@
       JavaFile resolvedFile = new JavaFile.relative(packagesDirectory, path);
       if (resolvedFile.exists()) {
         JavaFile canonicalFile = getCanonicalFile(packagesDirectory, pkgName, relPath);
-        UriKind uriKind = _isSelfReference(packagesDirectory, canonicalFile) ? UriKind.PACKAGE_SELF_URI : UriKind.PACKAGE_URI;
+        UriKind uriKind = _isSelfReference(packagesDirectory, canonicalFile) ? UriKind.FILE_URI : UriKind.PACKAGE_URI;
         return new FileBasedSource.con2(canonicalFile, uriKind);
       }
     }
diff --git a/pkg/analyzer/lib/src/generated/utilities_collection.dart b/pkg/analyzer/lib/src/generated/utilities_collection.dart
index 0ba35d3..f89d69f 100644
--- a/pkg/analyzer/lib/src/generated/utilities_collection.dart
+++ b/pkg/analyzer/lib/src/generated/utilities_collection.dart
@@ -7,6 +7,7 @@
 
 library engine.utilities.collection;
 
+import 'dart:collection';
 import 'java_core.dart';
 import 'scanner.dart' show Token;
 
@@ -94,7 +95,7 @@
    * to a set of tails. Nodes that are not the head of any edge are represented by an entry mapping
    * the node to an empty set of tails.
    */
-  Map<N, Set<N>> _edges = new Map<N, Set<N>>();
+  HashMap<N, HashSet<N>> _edges = new HashMap<N, HashSet<N>>();
 
   /**
    * Add an edge from the given head node to the given tail node. Both nodes will be a part of the
@@ -108,14 +109,14 @@
     // First, ensure that the tail is a node known to the graph.
     //
     if (_edges[tail] == null) {
-      _edges[tail] = new Set<N>();
+      _edges[tail] = new HashSet<N>();
     }
     //
     // Then create the edge.
     //
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails == null) {
-      tails = new Set<N>();
+      tails = new HashSet<N>();
       _edges[head] = tails;
     }
     tails.add(tail);
@@ -127,9 +128,9 @@
    * @param node the node to be added
    */
   void addNode(N node) {
-    Set<N> tails = _edges[node];
+    HashSet<N> tails = _edges[node];
     if (tails == null) {
-      _edges[node] = new Set<N>();
+      _edges[node] = new HashSet<N>();
     }
   }
 
@@ -148,7 +149,7 @@
    * Return true if the graph contains at least one path from `source` to `destination`.
    */
   bool containsPath(N source, N destination) {
-    Set<N> nodesVisited = new Set<N>();
+    HashSet<N> nodesVisited = new HashSet<N>();
     return _containsPathInternal(source, destination, nodesVisited);
   }
 
@@ -187,9 +188,9 @@
    * @return a set containing the tails of edges that have the given node as their head
    */
   Set<N> getTails(N head) {
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails == null) {
-      return new Set<N>();
+      return new HashSet<N>();
     }
     return tails;
   }
@@ -223,7 +224,7 @@
    * @return `true` if the graph was modified as a result of this operation
    */
   void removeEdge(N head, N tail) {
-    Set<N> tails = _edges[head];
+    HashSet<N> tails = _edges[head];
     if (tails != null) {
       tails.remove(tail);
     }
@@ -237,7 +238,7 @@
    */
   void removeNode(N node) {
     _edges.remove(node);
-    for (Set<N> tails in _edges.values) {
+    for (HashSet<N> tails in _edges.values) {
       tails.remove(node);
     }
   }
@@ -260,11 +261,11 @@
     return sink;
   }
 
-  bool _containsPathInternal(N source, N destination, Set<N> nodesVisited) {
+  bool _containsPathInternal(N source, N destination, HashSet<N> nodesVisited) {
     if (identical(source, destination)) {
       return true;
     }
-    Set<N> tails = _edges[source];
+    HashSet<N> tails = _edges[source];
     if (tails != null) {
       nodesVisited.add(source);
       for (N tail in tails) {
@@ -355,7 +356,7 @@
   /**
    * A table mapping nodes to information about the nodes that is used by this algorithm.
    */
-  Map<N, DirectedGraph_NodeInfo<N>> _nodeMap = new Map<N, DirectedGraph_NodeInfo<N>>();
+  HashMap<N, DirectedGraph_NodeInfo<N>> _nodeMap = new HashMap<N, DirectedGraph_NodeInfo<N>>();
 
   /**
    * A list of all strongly connected components found, in topological sort order (each node in a
@@ -432,7 +433,7 @@
     //
     // Consider successors of v
     //
-    Set<N> tails = _graph._edges[v];
+    HashSet<N> tails = _graph._edges[v];
     if (tails != null) {
       for (N w in tails) {
         DirectedGraph_NodeInfo<N> wInfo = _nodeMap[w];
@@ -638,7 +639,7 @@
    * One possibility is a pair of parallel arrays, with keys being sorted by their offset and a
    * cursor indicating where to start searching.
    */
-  Map<Token, Token> _map = new Map<Token, Token>();
+  HashMap<Token, Token> _map = new HashMap<Token, Token>();
 
   /**
    * Return the token that is mapped to the given token, or `null` if there is no token
diff --git a/pkg/analyzer/lib/src/services/formatter_impl.dart b/pkg/analyzer/lib/src/services/formatter_impl.dart
index cfa81c9..588464d 100644
--- a/pkg/analyzer/lib/src/services/formatter_impl.dart
+++ b/pkg/analyzer/lib/src/services/formatter_impl.dart
@@ -425,7 +425,6 @@
     token(node.leftParenthesis);
     breakableNonSpace();
     visitCommaSeparatedNodes(node.arguments);
-    breakableNonSpace();
     token(node.rightParenthesis);
   }
 
@@ -808,7 +807,8 @@
     for (var i = 0; i < size; i++) {
       var parameter = parameters[i];
       if (i > 0) {
-        append(', ');
+        append(',');
+        space();
       }
       if (groupEnd == null && parameter is DefaultFormalParameter) {
         if (identical(parameter.kind, ParameterKind.NAMED)) {
@@ -1030,7 +1030,7 @@
 
   visitMapLiteral(MapLiteral node) {
     modifier(node.constKeyword);
-    visitNode(node.typeArguments, followedBy: space);
+    visitNode(node.typeArguments);
     token(node.leftBracket);
     if (!node.entries.isEmpty) {
       newlines();
@@ -1061,7 +1061,7 @@
     if (!node.isGetter) {
       visit(node.parameters);
     }
-    visitPrefixedBody(space, node.body);
+    visitPrefixedBody(nonBreakingSpace, node.body);
   }
 
   visitMethodInvocation(MethodInvocation node) {
@@ -1180,7 +1180,7 @@
   visitSimpleFormalParameter(SimpleFormalParameter node) {
     visitMemberMetadata(node.metadata);
     modifier(node.keyword);
-    visitNode(node.type, followedBy: space);
+    visitNode(node.type, followedBy: nonBreakingSpace);
     visit(node.identifier);
   }
 
@@ -1686,6 +1686,10 @@
   }
 
 
+  /// Test if this EOL [comment] is at the beginning of a line.
+  bool isAtBOL(Token comment) =>
+      lineInfo.getLocation(comment.offset).columnNumber == 1;
+
   /// Test if this [comment] is at the end of a line.
   bool isAtEOL(Token comment) =>
       comment != null && comment.toString().trim().startsWith(twoSlashes) &&
@@ -1701,6 +1705,11 @@
       }
     }
 
+    // Don't indent commented-out lines
+    if (isAtBOL(comment)) {
+      writer.currentLine.clear();
+    }
+
     append(comment.toString().trim());
   }
 
diff --git a/pkg/analyzer/lib/src/services/writer.dart b/pkg/analyzer/lib/src/services/writer.dart
index 4e8cef5..cf0dd74 100644
--- a/pkg/analyzer/lib/src/services/writer.dart
+++ b/pkg/analyzer/lib/src/services/writer.dart
@@ -33,6 +33,10 @@
     tokens.add(token);
   }
 
+  void clear() {
+    tokens.clear();
+  }
+
   bool isEmpty() => tokens.isEmpty;
 
   bool isWhitespace() => tokens.every(
@@ -346,8 +350,18 @@
     }
   }
 
-  void write(x) {
-    _addToken(new LineToken(x));
+  void write(String string) {
+    var lines = string.split(lineSeparator);
+    var length = lines.length;
+    for (int i = 0; i < length; i++) {
+      var line = lines[i];
+      _addToken(new LineToken(line));
+      if (i != length - 1) {
+        newline();
+        // no indentation for multi-line strings
+        currentLine.clear();
+      }
+    }
   }
 
   void writeln(String s) {
diff --git a/pkg/analyzer/pubspec.yaml b/pkg/analyzer/pubspec.yaml
index caa0f1c..1c66e72 100644
--- a/pkg/analyzer/pubspec.yaml
+++ b/pkg/analyzer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: analyzer
-version: 0.15.6-dev
+version: 0.16.1
 author: Dart Team <misc@dartlang.org>
 description: Static analyzer for Dart.
 homepage: http://www.dartlang.org
@@ -10,4 +10,4 @@
   logging: '>=0.9.0 <0.10.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
-  unittest: '>=0.9.0 <0.11.0'
+  unittest: '>=0.9.0 <0.12.0'
diff --git a/pkg/analyzer/test/generated/element_test.dart b/pkg/analyzer/test/generated/element_test.dart
index e6c2fc3..3bcb073 100644
--- a/pkg/analyzer/test/generated/element_test.dart
+++ b/pkg/analyzer/test/generated/element_test.dart
@@ -3269,6 +3269,16 @@
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(DynamicTypeImpl.instance));
   }
 
+  void test_isMoreSpecificThan_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", []);
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
+    JUnitTestCase.assertFalse(typeAOfDynamic.isMoreSpecificThan(typeAOfB));
+    JUnitTestCase.assertTrue(typeAOfB.isMoreSpecificThan(typeAOfDynamic));
+  }
+
   void test_isMoreSpecificThan_self() {
     InterfaceType type = ElementFactory.classElement2("A", []).type;
     JUnitTestCase.assertTrue(type.isMoreSpecificThan(type));
@@ -3392,6 +3402,16 @@
     JUnitTestCase.assertTrue(classA.type.isSubtypeOf(functionType));
   }
 
+  void test_isSubtypeOf_generic() {
+    ClassElement classA = ElementFactory.classElement2("A", ["E"]);
+    ClassElement classB = ElementFactory.classElement2("B", []);
+    DartType dynamicType = DynamicTypeImpl.instance;
+    InterfaceType typeAOfDynamic = classA.type.substitute4(<DartType> [dynamicType]);
+    InterfaceType typeAOfB = classA.type.substitute4(<DartType> [classB.type]);
+    JUnitTestCase.assertTrue(typeAOfDynamic.isSubtypeOf(typeAOfB));
+    JUnitTestCase.assertTrue(typeAOfB.isSubtypeOf(typeAOfDynamic));
+  }
+
   void test_isSubtypeOf_interface() {
     ClassElement classA = ElementFactory.classElement2("A", []);
     ClassElement classB = ElementFactory.classElement("B", classA.type, []);
@@ -4100,6 +4120,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_dynamic);
       });
+      _ut.test('test_isMoreSpecificThan_generic', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isMoreSpecificThan_generic);
+      });
       _ut.test('test_isMoreSpecificThan_self', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isMoreSpecificThan_self);
@@ -4140,6 +4164,10 @@
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_function);
       });
+      _ut.test('test_isSubtypeOf_generic', () {
+        final __test = new InterfaceTypeImplTest();
+        runJUnitTest(__test, __test.test_isSubtypeOf_generic);
+      });
       _ut.test('test_isSubtypeOf_interface', () {
         final __test = new InterfaceTypeImplTest();
         runJUnitTest(__test, __test.test_isSubtypeOf_interface);
diff --git a/pkg/analyzer/test/generated/parser_test.dart b/pkg/analyzer/test/generated/parser_test.dart
index 7d1c72b..6ad74bc 100644
--- a/pkg/analyzer/test/generated/parser_test.dart
+++ b/pkg/analyzer/test/generated/parser_test.dart
@@ -7661,6 +7661,12 @@
     EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
   }
 
+  void test_parseFunctionBody_skip_block_invalid() {
+    ParserTestCase.parseFunctionBodies = false;
+    FunctionBody functionBody = ParserTestCase.parse3("parseFunctionBody", <Object> [false, null, false], "{", [ParserErrorCode.EXPECTED_TOKEN]);
+    EngineTestCase.assertInstanceOf((obj) => obj is EmptyFunctionBody, EmptyFunctionBody, functionBody);
+  }
+
   void test_parseFunctionBody_skip_blocks() {
     ParserTestCase.parseFunctionBodies = false;
     FunctionBody functionBody = ParserTestCase.parse("parseFunctionBody", <Object> [false, null, false], "{ {} }");
@@ -10995,6 +11001,10 @@
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFunctionBody_skip_block);
       });
+      _ut.test('test_parseFunctionBody_skip_block_invalid', () {
+        final __test = new SimpleParserTest();
+        runJUnitTest(__test, __test.test_parseFunctionBody_skip_block_invalid);
+      });
       _ut.test('test_parseFunctionBody_skip_blocks', () {
         final __test = new SimpleParserTest();
         runJUnitTest(__test, __test.test_parseFunctionBody_skip_blocks);
diff --git a/pkg/analyzer/test/generated/resolver_test.dart b/pkg/analyzer/test/generated/resolver_test.dart
index b59d1e9..f01c9a2 100644
--- a/pkg/analyzer/test/generated/resolver_test.dart
+++ b/pkg/analyzer/test/generated/resolver_test.dart
@@ -7,6 +7,7 @@
 
 library engine.resolver_test;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -179,7 +180,7 @@
     htmlUnit.accessors = <PropertyAccessorElement> [document.getter];
     LibraryElementImpl htmlLibrary = new LibraryElementImpl(context, AstFactory.libraryIdentifier2(["dart", "dom", "html"]));
     htmlLibrary.definingCompilationUnit = htmlUnit;
-    Map<Source, LibraryElement> elementMap = new Map<Source, LibraryElement>();
+    HashMap<Source, LibraryElement> elementMap = new HashMap<Source, LibraryElement>();
     elementMap[coreSource] = coreLibrary;
     elementMap[asyncSource] = asyncLibrary;
     elementMap[htmlSource] = htmlLibrary;
@@ -2056,6 +2057,36 @@
     verify([source]);
   }
 
+  void test_instanceMemberAccessFromFactory_named() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "  A();",
+        "  factory A.make() {",
+        "    m();",
+        "    return new A();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
+  void test_instanceMemberAccessFromFactory_unnamed() {
+    Source source = addSource(EngineTestCase.createSource([
+        "class A {",
+        "  m() {}",
+        "  A._();",
+        "  factory A() {",
+        "    m();",
+        "    return new A._();",
+        "  }",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [CompileTimeErrorCode.INSTANCE_MEMBER_ACCESS_FROM_FACTORY]);
+    verify([source]);
+  }
+
   void test_instanceMemberAccessFromStatic_field() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -4714,6 +4745,14 @@
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_initializingFormalForStaticField);
       });
+      _ut.test('test_instanceMemberAccessFromFactory_named', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromFactory_named);
+      });
+      _ut.test('test_instanceMemberAccessFromFactory_unnamed', () {
+        final __test = new CompileTimeErrorCodeTest();
+        runJUnitTest(__test, __test.test_instanceMemberAccessFromFactory_unnamed);
+      });
       _ut.test('test_instanceMemberAccessFromStatic_field', () {
         final __test = new CompileTimeErrorCodeTest();
         runJUnitTest(__test, __test.test_instanceMemberAccessFromStatic_field);
@@ -6336,7 +6375,7 @@
       Scope outerScope = _visitor.nameScope_J2DAccessor as Scope;
       try {
         _visitor.enclosingClass_J2DAccessor = enclosingClass;
-        EnclosedScope innerScope = new ClassScope(outerScope, enclosingClass);
+        EnclosedScope innerScope = new ClassScope(new TypeParameterScope(outerScope, enclosingClass), enclosingClass);
         _visitor.nameScope_J2DAccessor = innerScope;
         node.accept(_resolver);
       } finally {
@@ -9204,9 +9243,66 @@
     _assertNoErrors(classA);
   }
 
+  void test_lookupOverrides_noParentClasses() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodM = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodM];
+    EngineTestCase.assertSizeOfList(0, _inheritanceManager.lookupOverrides(classA, methodName));
+    _assertNoErrors(classA);
+  }
+
+  void test_lookupOverrides_overrideBaseClass() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideInterface() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    classB.interfaces = <InterfaceType> [classA.type];
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classB, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+  }
+
+  void test_lookupOverrides_overrideTwoInterfaces() {
+    ClassElementImpl classA = ElementFactory.classElement2("A", []);
+    String methodName = "m";
+    MethodElementImpl methodMinA = ElementFactory.methodElement(methodName, _typeProvider.intType, []);
+    classA.methods = <MethodElement> [methodMinA];
+    ClassElementImpl classB = ElementFactory.classElement2("B", []);
+    MethodElementImpl methodMinB = ElementFactory.methodElement(methodName, _typeProvider.doubleType, []);
+    classB.methods = <MethodElement> [methodMinB];
+    ClassElementImpl classC = ElementFactory.classElement2("C", []);
+    classC.interfaces = <InterfaceType> [classA.type, classB.type];
+    MethodElementImpl methodMinC = ElementFactory.methodElement(methodName, _typeProvider.numType, []);
+    classC.methods = <MethodElement> [methodMinC];
+    List<ExecutableElement> overrides = _inheritanceManager.lookupOverrides(classC, methodName);
+    EngineTestCase.assertEqualsIgnoreOrder(<Object> [methodMinA, methodMinB], new List.from(overrides));
+    _assertNoErrors(classA);
+    _assertNoErrors(classB);
+    _assertNoErrors(classC);
+  }
+
   void _assertErrors(ClassElement classElt, List<ErrorCode> expectedErrorCodes) {
     GatheringErrorListener errorListener = new GatheringErrorListener();
-    Set<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
+    HashSet<AnalysisError> actualErrors = _inheritanceManager.getErrors(classElt);
     if (actualErrors != null) {
       for (AnalysisError error in actualErrors) {
         errorListener.onError(error);
@@ -9452,6 +9548,22 @@
         final __test = new InheritanceManagerTest();
         runJUnitTest(__test, __test.test_lookupMember_setter_static);
       });
+      _ut.test('test_lookupOverrides_noParentClasses', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_noParentClasses);
+      });
+      _ut.test('test_lookupOverrides_overrideBaseClass', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideBaseClass);
+      });
+      _ut.test('test_lookupOverrides_overrideInterface', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideInterface);
+      });
+      _ut.test('test_lookupOverrides_overrideTwoInterfaces', () {
+        final __test = new InheritanceManagerTest();
+        runJUnitTest(__test, __test.test_lookupOverrides_overrideTwoInterfaces);
+      });
     });
   }
 }
@@ -15961,6 +16073,19 @@
     verify([source]);
   }
 
+  void test_unnecessaryCast_generics() {
+    // dartbug.com/18953
+    Source source = addSource(EngineTestCase.createSource([
+        "import 'dart:async';",
+        "Future<int> f() => new Future.value(0);",
+        "void g(bool c) {",
+        "  (c ? f(): new Future.value(0) as Future<int>).then((int value) {});",
+        "}"]));
+    resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+  }
+
   void test_unnecessaryCast_type_dynamic() {
     Source source = addSource(EngineTestCase.createSource(["m(v) {", "  var b = Object as dynamic;", "}"]));
     resolve(source);
@@ -16259,6 +16384,10 @@
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unnecessaryCast_dynamic_type);
       });
+      _ut.test('test_unnecessaryCast_generics', () {
+        final __test = new NonHintCodeTest();
+        runJUnitTest(__test, __test.test_unnecessaryCast_generics);
+      });
       _ut.test('test_unnecessaryCast_type_dynamic', () {
         final __test = new NonHintCodeTest();
         runJUnitTest(__test, __test.test_unnecessaryCast_type_dynamic);
@@ -18570,7 +18699,7 @@
     _analyze5(p1);
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p1"] = dynamicType;
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, null, null, expectedNamedTypes, resultType);
@@ -18585,7 +18714,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, null, null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18628,7 +18757,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.blockFunctionBody2([]));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(dynamicType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -18644,7 +18773,7 @@
     FunctionExpression node = _resolvedFunctionExpression(AstFactory.formalParameterList([p1, p2]), AstFactory.expressionFunctionBody(_resolvedInteger(0)));
     _analyze5(p2);
     DartType resultType = _analyze(node);
-    Map<String, DartType> expectedNamedTypes = new Map<String, DartType>();
+    Map<String, DartType> expectedNamedTypes = new HashMap<String, DartType>();
     expectedNamedTypes["p2"] = dynamicType;
     _assertFunctionType(_typeProvider.intType, <DartType> [dynamicType], null, expectedNamedTypes, resultType);
     _listener.assertNoErrors();
@@ -21566,58 +21695,6 @@
 }
 
 class StaticWarningCodeTest extends ResolverTestCase {
-  void fail_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
-    // 17983
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  U get g => null;",
-        "}",
-        "abstract class J<V> {",
-        "  V get g => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  double get g => null;",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
-    verify([source]);
-  }
-
-  void fail_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
-    // 17983
-    // language/override_inheritance_generic_test/08
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  m(U u) => null;",
-        "}",
-        "abstract class J<V> {",
-        "  m(V v) => null;",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  m(double d) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
-    verify([source]);
-  }
-
-  void fail_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
-    // 17983
-    Source source = addSource(EngineTestCase.createSource([
-        "abstract class I<U> {",
-        "  set s(U u) {}",
-        "}",
-        "abstract class J<V> {",
-        "  set s(V v) {}",
-        "}",
-        "class B implements I<int>, J<String> {",
-        "  set s(double d) {}",
-        "}"]));
-    resolve(source);
-    assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
-    verify([source]);
-  }
-
   void fail_undefinedGetter() {
     Source source = addSource(EngineTestCase.createSource([]));
     resolve(source);
@@ -22862,6 +22939,22 @@
     verify([source]);
   }
 
+  void test_invalidGetterOverrideReturnType_twoInterfaces_conflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  U get g => null;",
+        "}",
+        "abstract class J<V> {",
+        "  V get g => null;",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  double get g => null;",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_GETTER_OVERRIDE_RETURN_TYPE]);
+    verify([source]);
+  }
+
   void test_invalidMethodOverrideNamedParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -22934,6 +23027,23 @@
     verify([source]);
   }
 
+  void test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting() {
+    // language/override_inheritance_generic_test/08
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  m(U u) => null;",
+        "}",
+        "abstract class J<V> {",
+        "  m(V v) => null;",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  m(double d) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_METHOD_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
   void test_invalidMethodOverrideOptionalParamType() {
     Source source = addSource(EngineTestCase.createSource([
         "class A {",
@@ -23215,6 +23325,22 @@
     verify([source]);
   }
 
+  void test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting() {
+    Source source = addSource(EngineTestCase.createSource([
+        "abstract class I<U> {",
+        "  set s(U u) {}",
+        "}",
+        "abstract class J<V> {",
+        "  set s(V v) {}",
+        "}",
+        "class B implements I<int>, J<String> {",
+        "  set s(double d) {}",
+        "}"]));
+    resolve(source);
+    assertErrors(source, [StaticWarningCode.INVALID_SETTER_OVERRIDE_NORMAL_PARAM_TYPE]);
+    verify([source]);
+  }
+
   void test_listElementTypeNotAssignable() {
     Source source = addSource(EngineTestCase.createSource(["var v = <String> [42];"]));
     resolve(source);
@@ -24771,6 +24897,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidGetterOverrideReturnType_twoInterfaces);
       });
+      _ut.test('test_invalidGetterOverrideReturnType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidGetterOverrideReturnType_twoInterfaces_conflicting);
+      });
       _ut.test('test_invalidMethodOverrideNamedParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideNamedParamType);
@@ -24791,6 +24921,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideNormalParamType_twoInterfaces);
       });
+      _ut.test('test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidMethodOverrideNormalParamType_twoInterfaces_conflicting);
+      });
       _ut.test('test_invalidMethodOverrideOptionalParamType', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidMethodOverrideOptionalParamType);
@@ -24871,6 +25005,10 @@
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType_twoInterfaces);
       });
+      _ut.test('test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting', () {
+        final __test = new StaticWarningCodeTest();
+        runJUnitTest(__test, __test.test_invalidSetterOverrideNormalParamType_twoInterfaces_conflicting);
+      });
       _ut.test('test_listElementTypeNotAssignable', () {
         final __test = new StaticWarningCodeTest();
         runJUnitTest(__test, __test.test_listElementTypeNotAssignable);
@@ -25527,7 +25665,7 @@
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     classA.supertype = classB.type;
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(2, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classA, classB]);
@@ -25547,9 +25685,9 @@
     ClassElementImpl classD = ElementFactory.classElement("D", classB.type, []);
     ClassElementImpl classE = ElementFactory.classElement("E", classB.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB, classC, classD, classE];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
-    Set<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
+    HashSet<ClassElement> subtypesOfB = _subtypeManager.computeAllSubtypes(classB);
     List<ClassElement> arraySubtypesOfB = new List.from(subtypesOfB);
     EngineTestCase.assertSizeOfSet(4, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB, classC, classD, classE]);
@@ -25563,7 +25701,7 @@
     //
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     _definingCompilationUnit.types = <ClassElement> [classA];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     EngineTestCase.assertSizeOfSet(0, subtypesOfA);
   }
 
@@ -25575,7 +25713,7 @@
     ClassElementImpl classA = ElementFactory.classElement2("A", []);
     ClassElementImpl classB = ElementFactory.classElement("B", classA.type, []);
     _definingCompilationUnit.types = <ClassElement> [classA, classB];
-    Set<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
+    HashSet<ClassElement> subtypesOfA = _subtypeManager.computeAllSubtypes(classA);
     List<ClassElement> arraySubtypesOfA = new List.from(subtypesOfA);
     EngineTestCase.assertSizeOfSet(1, subtypesOfA);
     EngineTestCase.assertContains(arraySubtypesOfA, [classB]);
@@ -26247,6 +26385,124 @@
     JUnitTestCase.assertEquals("CanvasRenderingContext2D", identifier.propagatedType.name);
   }
 
+  void test_finalPropertyInducingVariable_classMember_instance() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f(A a) {",
+        "  return a.v; // marker",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_instance_inherited() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "class B extends A {",
+        "  m() {",
+        "    return v; // marker",
+        "  }",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_instance_propagatedTarget() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  final v = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f(p) {",
+        "  if (p is A) {",
+        "    return p.v; // marker",
+        "  }",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "v; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_classMember_static() {
+    addNamedSource("/lib.dart", EngineTestCase.createSource(["class A {", "  static final V = 0;", "}"]));
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f() {",
+        "  return A.V; // marker",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // marker", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_topLevelVaraible_prefixed() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart' as p;",
+        "f() {",
+        "  var v2 = p.V; // prefixed",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // prefixed", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
+  void test_finalPropertyInducingVariable_topLevelVaraible_simple() {
+    addNamedSource("/lib.dart", "final V = 0;");
+    String code = EngineTestCase.createSource([
+        "import 'lib.dart';",
+        "f() {",
+        "  return V; // simple",
+        "}"]);
+    Source source = addSource(code);
+    LibraryElement library = resolve(source);
+    assertNoErrors(source);
+    verify([source]);
+    CompilationUnit unit = resolveCompilationUnit(source, library);
+    {
+      SimpleIdentifier identifier = EngineTestCase.findNode(unit, code, "V; // simple", (node) => node is SimpleIdentifier);
+      JUnitTestCase.assertSame(typeProvider.dynamicType, identifier.staticType);
+      JUnitTestCase.assertSame(typeProvider.intType, identifier.propagatedType);
+    }
+  }
+
   void test_forEach() {
     String code = EngineTestCase.createSource([
         "main() {",
@@ -27017,6 +27273,30 @@
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_assignment_null);
       });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance_inherited', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance_inherited);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_instance_propagatedTarget', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_instance_propagatedTarget);
+      });
+      _ut.test('test_finalPropertyInducingVariable_classMember_static', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_classMember_static);
+      });
+      _ut.test('test_finalPropertyInducingVariable_topLevelVaraible_prefixed', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_topLevelVaraible_prefixed);
+      });
+      _ut.test('test_finalPropertyInducingVariable_topLevelVaraible_simple', () {
+        final __test = new TypePropagationTest();
+        runJUnitTest(__test, __test.test_finalPropertyInducingVariable_topLevelVaraible_simple);
+      });
       _ut.test('test_forEach', () {
         final __test = new TypePropagationTest();
         runJUnitTest(__test, __test.test_forEach);
@@ -27364,6 +27644,9 @@
 
   void test_visitClassDeclaration() {
     // class A extends B with C implements D {}
+    // class B {}
+    // class C {}
+    // class D {}
     ClassElement elementA = ElementFactory.classElement2("A", []);
     ClassElement elementB = ElementFactory.classElement2("B", []);
     ClassElement elementC = ElementFactory.classElement2("C", []);
@@ -27384,6 +27667,22 @@
     _listener.assertNoErrors();
   }
 
+  void test_visitClassDeclaration_instanceMemberCollidesWithClass() {
+    // class A {}
+    // class B extends A {
+    //   void A() {}
+    // }
+    ClassElementImpl elementA = ElementFactory.classElement2("A", []);
+    ClassElementImpl elementB = ElementFactory.classElement2("B", []);
+    elementB.methods = <MethodElement> [ElementFactory.methodElement("A", VoidTypeImpl.instance, [])];
+    ExtendsClause extendsClause = AstFactory.extendsClause(AstFactory.typeName(elementA, []));
+    ClassDeclaration declaration = AstFactory.classDeclaration(null, "B", null, extendsClause, null, null, []);
+    declaration.name.staticElement = elementB;
+    _resolveNode(declaration, [elementA, elementB]);
+    JUnitTestCase.assertSame(elementA.type, elementB.supertype);
+    _listener.assertNoErrors();
+  }
+
   void test_visitClassTypeAlias() {
     // class A = B with C implements D;
     ClassElement elementA = ElementFactory.classElement2("A", []);
@@ -27579,6 +27878,10 @@
         final __test = new TypeResolverVisitorTest();
         runJUnitTest(__test, __test.test_visitClassDeclaration);
       });
+      _ut.test('test_visitClassDeclaration_instanceMemberCollidesWithClass', () {
+        final __test = new TypeResolverVisitorTest();
+        runJUnitTest(__test, __test.test_visitClassDeclaration_instanceMemberCollidesWithClass);
+      });
       _ut.test('test_visitClassTypeAlias', () {
         final __test = new TypeResolverVisitorTest();
         runJUnitTest(__test, __test.test_visitClassTypeAlias);
diff --git a/pkg/analyzer/test/generated/scanner_test.dart b/pkg/analyzer/test/generated/scanner_test.dart
index 575fcac..fabe810 100644
--- a/pkg/analyzer/test/generated/scanner_test.dart
+++ b/pkg/analyzer/test/generated/scanner_test.dart
@@ -1287,7 +1287,23 @@
   }
 
   void test_string_multi_unterminated() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string");
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''string", [new StringToken(TokenType.STRING, "'''string", 0)]);
+  }
+
+  void test_string_multi_unterminated_interpolation_block() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "'''\${name", [
+        new StringToken(TokenType.STRING, "'''", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 3),
+        new StringToken(TokenType.IDENTIFIER, "name", 5),
+        new StringToken(TokenType.STRING, "", 9)]);
+  }
+
+  void test_string_multi_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'''\$name", [
+        new StringToken(TokenType.STRING, "'''", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 3),
+        new StringToken(TokenType.IDENTIFIER, "name", 4),
+        new StringToken(TokenType.STRING, "", 8)]);
   }
 
   void test_string_raw_multi_double() {
@@ -1299,7 +1315,8 @@
   }
 
   void test_string_raw_multi_unterminated() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, "r'''string");
+    String source = "r'''string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 9, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_raw_simple_double() {
@@ -1311,11 +1328,13 @@
   }
 
   void test_string_raw_simple_unterminated_eof() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "r'string");
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_raw_simple_unterminated_eol() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "r'string\n");
+    String source = "r'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 8, "${source}\n", [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_double() {
@@ -1403,11 +1422,29 @@
   }
 
   void test_string_simple_unterminated_eof() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'string");
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, source, [new StringToken(TokenType.STRING, source, 0)]);
   }
 
   void test_string_simple_unterminated_eol() {
-    _assertError(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "'string\r");
+    String source = "'string";
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 7, "${source}\r", [new StringToken(TokenType.STRING, source, 0)]);
+  }
+
+  void test_string_simple_unterminated_interpolation_block() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 6, "'\${name", [
+        new StringToken(TokenType.STRING, "'", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_EXPRESSION, "\${", 1),
+        new StringToken(TokenType.IDENTIFIER, "name", 3),
+        new StringToken(TokenType.STRING, "", 7)]);
+  }
+
+  void test_string_simple_unterminated_interpolation_identifier() {
+    _assertErrorAndTokens(ScannerErrorCode.UNTERMINATED_STRING_LITERAL, 5, "'\$name", [
+        new StringToken(TokenType.STRING, "'", 0),
+        new StringToken(TokenType.STRING_INTERPOLATION_IDENTIFIER, "\$", 1),
+        new StringToken(TokenType.IDENTIFIER, "name", 2),
+        new StringToken(TokenType.STRING, "", 6)]);
   }
 
   void test_tilde() {
@@ -1457,8 +1494,8 @@
   /**
    * Assert that scanning the given source produces an error with the given code.
    *
-   * @param illegalCharacter
-   * @param i
+   * @param expectedError the error that should be produced
+   * @param expectedOffset the string offset that should be associated with the error
    * @param source the source to be scanned to produce the error
    */
   void _assertError(ScannerErrorCode expectedError, int expectedOffset, String source) {
@@ -2180,6 +2217,14 @@
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_multi_unterminated);
       });
+      _ut.test('test_string_multi_unterminated_interpolation_block', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_multi_unterminated_interpolation_block);
+      });
+      _ut.test('test_string_multi_unterminated_interpolation_identifier', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_multi_unterminated_interpolation_identifier);
+      });
       _ut.test('test_string_raw_multi_double', () {
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_raw_multi_double);
@@ -2256,6 +2301,14 @@
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_string_simple_unterminated_eol);
       });
+      _ut.test('test_string_simple_unterminated_interpolation_block', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_unterminated_interpolation_block);
+      });
+      _ut.test('test_string_simple_unterminated_interpolation_identifier', () {
+        final __test = new ScannerTest();
+        runJUnitTest(__test, __test.test_string_simple_unterminated_interpolation_identifier);
+      });
       _ut.test('test_tilde', () {
         final __test = new ScannerTest();
         runJUnitTest(__test, __test.test_tilde);
diff --git a/pkg/analyzer/test/generated/test_support.dart b/pkg/analyzer/test/generated/test_support.dart
index fe7f86b..382b42f 100644
--- a/pkg/analyzer/test/generated/test_support.dart
+++ b/pkg/analyzer/test/generated/test_support.dart
@@ -7,6 +7,7 @@
 
 library engine.test_support;
 
+import 'dart:collection';
 import 'package:analyzer/src/generated/java_core.dart';
 import 'package:analyzer/src/generated/java_junit.dart';
 import 'package:analyzer/src/generated/java_engine.dart';
@@ -453,7 +454,7 @@
   /**
    * A table mapping sources to the line information for the source.
    */
-  Map<Source, LineInfo> _lineInfoMap = new Map<Source, LineInfo>();
+  HashMap<Source, LineInfo> _lineInfoMap = new HashMap<Source, LineInfo>();
 
   /**
    * An empty array of errors used when no errors are expected.
@@ -536,7 +537,7 @@
     //
     // Compute the expected number of each type of error.
     //
-    Map<ErrorCode, int> expectedCounts = new Map<ErrorCode, int>();
+    HashMap<ErrorCode, int> expectedCounts = new HashMap<ErrorCode, int>();
     for (ErrorCode code in expectedErrorCodes) {
       int count = expectedCounts[code];
       if (count == null) {
@@ -549,7 +550,7 @@
     //
     // Compute the actual number of each type of error.
     //
-    Map<ErrorCode, List<AnalysisError>> errorsByCode = new Map<ErrorCode, List<AnalysisError>>();
+    HashMap<ErrorCode, List<AnalysisError>> errorsByCode = new HashMap<ErrorCode, List<AnalysisError>>();
     for (AnalysisError error in _errors) {
       ErrorCode code = error.errorCode;
       List<AnalysisError> list = errorsByCode[code];
diff --git a/pkg/analyzer/test/services/data/cu_tests.data b/pkg/analyzer/test/services/data/cu_tests.data
index d6186df..06dddef 100644
--- a/pkg/analyzer/test/services/data/cu_tests.data
+++ b/pkg/analyzer/test/services/data/cu_tests.data
@@ -274,4 +274,36 @@
 >>>
 import 'a.dart' deferred as a;
 <<<
-import 'a.dart' deferred as a;
\ No newline at end of file
+import 'a.dart' deferred as a;
+>>> Long parameters list, place the opening curly brace ({) on the same line
+class Foo {
+  method(int a012345678901234567890123456789, int b012345678901234567890123456)
+  {
+    print('42');
+  }
+}
+<<<
+class Foo {
+  method(int a012345678901234567890123456789,
+      int b012345678901234567890123456) {
+    print('42');
+  }
+}
+>>> Long parameters list, this.field
+class A {
+  int a0123456789012345678901234;
+  int b0123456789012345678901234;
+  int c0123456789012345678901234;
+  int d0123456789012345678901234;
+  A(this.a0123456789012345678901234, this.b0123456789012345678901234, this.c0123456789012345678901234,
+                    this.d0123456789012345678901234);
+}
+<<<
+class A {
+  int a0123456789012345678901234;
+  int b0123456789012345678901234;
+  int c0123456789012345678901234;
+  int d0123456789012345678901234;
+  A(this.a0123456789012345678901234, this.b0123456789012345678901234,
+      this.c0123456789012345678901234, this.d0123456789012345678901234);
+}
diff --git a/pkg/analyzer/test/services/data/stmt_tests.data b/pkg/analyzer/test/services/data/stmt_tests.data
index 006ca41..3143fe1 100644
--- a/pkg/analyzer/test/services/data/stmt_tests.data
+++ b/pkg/analyzer/test/services/data/stmt_tests.data
@@ -190,4 +190,15 @@
     zero = 2;
   }
   print(0);
-}
\ No newline at end of file
+}
+>>>
+main() {
+  f(a, b) {}
+  f(0000000000000000000000000000000000000000000000000000000000000000000000, 111);
+}
+<<<
+main() {
+  f(a, b) {}
+  f(0000000000000000000000000000000000000000000000000000000000000000000000,
+      111);
+}
diff --git a/pkg/analyzer/test/services/data/style_guide_tests.data b/pkg/analyzer/test/services/data/style_guide_tests.data
index 781516d..d059c38 100644
--- a/pkg/analyzer/test/services/data/style_guide_tests.data
+++ b/pkg/analyzer/test/services/data/style_guide_tests.data
@@ -153,10 +153,12 @@
 >>> DON'T use a space after (, [, and {, or before ), ], and }.
 spaces() {
   var numbers = <int> [ 1, 2,( 3+4 ) ];
+  var mapLiteral = <int, int> {};
 }
 <<<
 spaces() {
   var numbers = <int>[1, 2, (3 + 4)];
+  var mapLiteral = <int, int>{};
 }
 >>> DO use a space before { in function and method bodies.
 getEmptyFn(a){
diff --git a/pkg/analyzer/test/services/formatter_test.dart b/pkg/analyzer/test/services/formatter_test.dart
index 85e68aa..5298d73 100644
--- a/pkg/analyzer/test/services/formatter_test.dart
+++ b/pkg/analyzer/test/services/formatter_test.dart
@@ -184,6 +184,30 @@
           'class C {\n'
           '}\n'
       );
+      expectCUFormatsTo(
+          'main() {\n'
+          '//  print(1);\n'
+          '//  print(2);\n'
+          '  print(3);\n'
+          '}\n',
+          'main() {\n'
+          '//  print(1);\n'
+          '//  print(2);\n'
+          '  print(3);\n'
+          '}\n'
+      );
+      expectCUFormatsTo(
+          'class A {\n'
+          '//  int a;\n'
+          '//  int b;\n'
+          '  int c;\n'
+          '}\n',
+          'class A {\n'
+          '//  int a;\n'
+          '//  int b;\n'
+          '  int c;\n'
+          '}\n'
+      );
     });
 
     test('CU - nested functions', () {
@@ -976,6 +1000,51 @@
                           transforms: false);
     });
 
+    test('String - multiline - short - same line', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""01234567890123456789012345678901234567890123456789""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""01234567890123456789012345678901234567890123456789""");\n'
+        '}\n'
+      );
+    });
+
+    test('String - multiline - short - next line', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n'
+      );
+    });
+
+    test('String - multiline - long', () {
+      expectCUFormatsTo(
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n',
+        'main() {\n'
+        '  print("""\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '01234567890123456789012345678901234567890123456789\n'
+        '""");\n'
+        '}\n'
+      );
+    });
+
     // smoketest to ensure we're enforcing the 'no gratuitous linebreaks'
     // opinion
     test('CU (eat newlines)', () {
@@ -1242,6 +1311,15 @@
       expect(writer.toString(), equals('foo\n  bar\nbaz'));
     });
 
+    test('write - multiline', () {
+      var writer = new SourceWriter();
+      writer.indent();
+      writer.newline();
+      writer.write('aaa\nbbb\nccc');
+      expect(writer.toString(), equals('\n  aaa\nbbb\nccc'));
+      expect(writer.currentLine.toString(), equals('ccc'));
+    });
+
   });
 
 
diff --git a/pkg/barback/pubspec.yaml b/pkg/barback/pubspec.yaml
index 53666e3..048b3d0 100644
--- a/pkg/barback/pubspec.yaml
+++ b/pkg/barback/pubspec.yaml
@@ -7,7 +7,7 @@
 #
 # When the minor or patch version of this is upgraded, you *must* update that
 # version constraint in pub to stay in sync with this.
-version: 0.14.1-dev
+version: 0.14.1+1
 
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
diff --git a/pkg/dart2js_incremental/lib/caching_compiler.dart b/pkg/dart2js_incremental/lib/caching_compiler.dart
new file mode 100644
index 0000000..181f405
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/caching_compiler.dart
@@ -0,0 +1,146 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+part of dart2js_incremental;
+
+/// Do not call this method directly. It will be made private.
+// TODO(ahe): Make this method private.
+Compiler reuseCompiler(
+    {DiagnosticHandler diagnosticHandler,
+     CompilerInputProvider inputProvider,
+     CompilerOutputProvider outputProvider,
+     List<String> options: const [],
+     Compiler cachedCompiler,
+     Uri libraryRoot,
+     Uri packageRoot,
+     bool packagesAreImmutable: false,
+     Map<String, dynamic> environment}) {
+  UserTag oldTag = new UserTag('_reuseCompiler').makeCurrent();
+  if (libraryRoot == null) {
+    throw 'Missing libraryRoot';
+  }
+  if (inputProvider == null) {
+    throw 'Missing inputProvider';
+  }
+  if (diagnosticHandler == null) {
+    throw 'Missing diagnosticHandler';
+  }
+  if (outputProvider == null) {
+    outputProvider = NullSink.outputProvider;
+  }
+  if (environment == null) {
+    environment = {};
+  }
+  Compiler compiler = cachedCompiler;
+  if (compiler == null ||
+      compiler.libraryRoot != libraryRoot ||
+      !compiler.hasIncrementalSupport ||
+      compiler.hasCrashed ||
+      compiler.compilerWasCancelled ||
+      compiler.enqueuer.resolution.hasEnqueuedEverything ||
+      compiler.deferredLoadTask.splitProgram) {
+    if (compiler != null && compiler.hasIncrementalSupport) {
+      print('***FLUSH***');
+      if (compiler.hasCrashed) {
+        print('Unable to reuse compiler due to crash.');
+      } else if (compiler.compilerWasCancelled) {
+        print('Unable to reuse compiler due to cancel.');
+      } else if (compiler.enqueuer.resolution.hasEnqueuedEverything) {
+        print('Unable to reuse compiler due to dart:mirrors.');
+      } else if (compiler.deferredLoadTask.splitProgram) {
+        print('Unable to reuse compiler due to deferred loading.');
+      } else {
+        print('Unable to reuse compiler.');
+      }
+    }
+    compiler = new Compiler(
+        inputProvider,
+        outputProvider,
+        diagnosticHandler,
+        libraryRoot,
+        packageRoot,
+        options,
+        environment);
+  } else {
+    compiler
+        ..outputProvider = outputProvider
+        ..provider = inputProvider
+        ..handler = diagnosticHandler
+        ..enqueuer.resolution.queueIsClosed = false
+        ..enqueuer.resolution.hasEnqueuedEverything = false
+        ..enqueuer.resolution.hasEnqueuedReflectiveStaticFields = false
+        ..enqueuer.codegen.queueIsClosed = false
+        ..enqueuer.codegen.hasEnqueuedEverything = false
+        ..enqueuer.codegen.hasEnqueuedReflectiveStaticFields = false
+        ..assembledCode = null
+        ..compilationFailed = false;
+    JavaScriptBackend backend = compiler.backend;
+
+    backend.emitter.cachedElements.addAll(backend.generatedCode.keys);
+
+    compiler.enqueuer.codegen.newlyEnqueuedElements.clear();
+
+    backend.emitter.containerBuilder
+        ..staticGetters.clear()
+        ..methodClosures.clear();
+
+    backend.emitter.nsmEmitter
+        ..trivialNsmHandlers.clear();
+
+    backend.emitter.typeTestEmitter
+        ..checkedClasses = null
+        ..checkedFunctionTypes = null
+        ..checkedGenericFunctionTypes.clear()
+        ..checkedNonGenericFunctionTypes.clear()
+        ..rtiNeededClasses.clear()
+        ..cachedClassesUsingTypeVariableTests = null;
+
+    backend.emitter.interceptorEmitter
+        ..interceptorInvocationNames.clear();
+
+    backend.emitter.metadataEmitter
+        ..globalMetadata.clear()
+        ..globalMetadataMap.clear();
+
+    backend.emitter.nativeEmitter
+        ..nativeBuffer.clear()
+        ..nativeClasses.clear()
+        ..nativeMethods.clear();
+
+    backend.emitter
+        ..outputBuffers.clear()
+        ..deferredConstants.clear()
+        ..isolateProperties = null
+        ..classesCollector = null
+        ..neededClasses.clear()
+        ..outputClassLists.clear()
+        ..nativeClasses.clear()
+        ..mangledFieldNames.clear()
+        ..mangledGlobalFieldNames.clear()
+        ..recordedMangledNames.clear()
+        ..additionalProperties.clear()
+        ..readTypeVariables.clear()
+        ..instantiatedClasses = null
+        ..precompiledFunction.clear()
+        ..precompiledConstructorNames.clear()
+        ..hasMakeConstantList = false
+        ..elementDescriptors.clear();
+
+    backend
+        ..preMirrorsMethodCount = 0;
+
+    Map libraries = new Map.from(compiler.libraries);
+    compiler.libraries.clear();
+    compiler.libraryLoader.reset();
+    libraries.forEach((String uri, LibraryElement library) {
+      if (library.isPlatformLibrary ||
+          (packagesAreImmutable && library.isPackageLibrary)) {
+        compiler.libraries[uri] = library;
+        compiler.libraryLoader.reuseLibrary(library);
+      }
+    });
+  }
+  oldTag.makeCurrent();
+  return compiler;
+}
diff --git a/pkg/dart2js_incremental/lib/dart2js_incremental.dart b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
new file mode 100644
index 0000000..6e49c02
--- /dev/null
+++ b/pkg/dart2js_incremental/lib/dart2js_incremental.dart
@@ -0,0 +1,83 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library dart2js_incremental;
+
+import 'dart:async' show
+    Future;
+
+import 'dart:profiler' show
+    UserTag;
+
+import 'package:compiler/implementation/apiimpl.dart' show
+    Compiler;
+
+import 'package:compiler/compiler.dart' show
+    CompilerInputProvider,
+    CompilerOutputProvider,
+    Diagnostic,
+    DiagnosticHandler;
+
+import 'package:compiler/implementation/dart2jslib.dart' show
+    NullSink;
+
+import 'package:compiler/implementation/js_backend/js_backend.dart' show
+    JavaScriptBackend;
+
+import 'package:compiler/implementation/elements/elements.dart' show
+    LibraryElement;
+
+part 'caching_compiler.dart';
+
+const List<String> INCREMENTAL_OPTIONS = const <String>[
+    '--disable-type-inference',
+    '--incremental-support',
+    '--no-source-maps', // TODO(ahe): Remove this.
+];
+
+class IncrementalCompiler {
+  final Uri libraryRoot;
+  final Uri packageRoot;
+  final CompilerInputProvider inputProvider;
+  final DiagnosticHandler diagnosticHandler;
+  final List<String> options;
+  final CompilerOutputProvider outputProvider;
+  final Map<String, dynamic> environment;
+
+  Compiler _compiler;
+
+  IncrementalCompiler({
+      this.libraryRoot,
+      this.packageRoot,
+      this.inputProvider,
+      this.diagnosticHandler,
+      this.options,
+      this.outputProvider,
+      this.environment}) {
+    if (libraryRoot == null) {
+      throw new ArgumentError('libraryRoot is null.');
+    }
+    if (inputProvider == null) {
+      throw new ArgumentError('inputProvider is null.');
+    }
+    if (diagnosticHandler == null) {
+      throw new ArgumentError('diagnosticHandler is null.');
+    }
+  }
+
+  Future<bool> compile(Uri script) {
+    List<String> options = new List<String>.from(this.options);
+    options.addAll(INCREMENTAL_OPTIONS);
+    _compiler = reuseCompiler(
+        cachedCompiler: _compiler,
+        libraryRoot: libraryRoot,
+        packageRoot: packageRoot,
+        inputProvider: inputProvider,
+        diagnosticHandler: diagnosticHandler,
+        options: options,
+        outputProvider: outputProvider,
+        environment: environment);
+    return _compiler.run(script);
+  }
+}
diff --git a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart b/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
index 894dd51..a380c38 100644
--- a/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
+++ b/pkg/docgen/lib/src/exports/dart2js_mirrors.dart
@@ -4,4 +4,4 @@
 
 library docgen.exports.dart2js_mirrors;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart';
+export 'package:compiler/implementation/mirrors/dart2js_mirrors.dart';
diff --git a/pkg/docgen/lib/src/exports/mirrors_util.dart b/pkg/docgen/lib/src/exports/mirrors_util.dart
index 2479fbe..1bee22c 100644
--- a/pkg/docgen/lib/src/exports/mirrors_util.dart
+++ b/pkg/docgen/lib/src/exports/mirrors_util.dart
@@ -4,4 +4,4 @@
 
 library docgen.exports.mirrors_util;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+export 'package:compiler/implementation/mirrors/mirrors_util.dart';
diff --git a/pkg/docgen/lib/src/exports/source_mirrors.dart b/pkg/docgen/lib/src/exports/source_mirrors.dart
index 7c2ee9c..f15ef06 100644
--- a/pkg/docgen/lib/src/exports/source_mirrors.dart
+++ b/pkg/docgen/lib/src/exports/source_mirrors.dart
@@ -4,5 +4,5 @@
 
 library docgen.exports.source_mirrors;
 
-export '../../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart'
+export 'package:compiler/implementation/mirrors/source_mirrors.dart'
     hide SourceLocation;
diff --git a/pkg/docgen/lib/src/generator.dart b/pkg/docgen/lib/src/generator.dart
index 06a991e..42c2e3b 100644
--- a/pkg/docgen/lib/src/generator.dart
+++ b/pkg/docgen/lib/src/generator.dart
@@ -12,11 +12,11 @@
 import 'package:markdown/markdown.dart' as markdown;
 import 'package:path/path.dart' as path;
 
-import '../../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart'
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart'
     as dart2js;
-import '../../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
 
 import 'exports/dart2js_mirrors.dart' as dart2js_mirrors;
 import 'exports/libraries.dart';
diff --git a/pkg/docgen/lib/src/models/annotation.dart b/pkg/docgen/lib/src/models/annotation.dart
index f7a537c..18b0924 100644
--- a/pkg/docgen/lib/src/models/annotation.dart
+++ b/pkg/docgen/lib/src/models/annotation.dart
@@ -14,7 +14,7 @@
 import 'mirror_based.dart';
 
 import 'dart:mirrors';
-import '../../../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 /// Holds the name of the annotation, and its parameters.
 class Annotation extends MirrorBased<ClassMirror> {
diff --git a/pkg/docgen/lib/src/models/variable.dart b/pkg/docgen/lib/src/models/variable.dart
index 2d8b02a..b4b83ac 100644
--- a/pkg/docgen/lib/src/models/variable.dart
+++ b/pkg/docgen/lib/src/models/variable.dart
@@ -24,7 +24,7 @@
   final String name;
 
   factory Variable(String name, VariableMirror mirror, Indexable owner) {
-    var variable = getDocgenObject(mirror);
+    var variable = getDocgenObject(mirror, owner);
     if (variable is DummyMirror) {
       return new Variable._(name, mirror, owner);
     }
diff --git a/pkg/http/CHANGELOG.md b/pkg/http/CHANGELOG.md
index 8d6e3c8..98deb33 100644
--- a/pkg/http/CHANGELOG.md
+++ b/pkg/http/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 0.11.1+2
+
+* Widen the version constraint on `unittest`.
+
 ## 0.11.1+1
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/http/pubspec.yaml b/pkg/http/pubspec.yaml
index abb241d..5c9a754 100644
--- a/pkg/http/pubspec.yaml
+++ b/pkg/http/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http
-version: 0.11.1+1
+version: 0.11.1+2
 author: "Dart Team <misc@dartlang.org>"
 homepage: https://pub.dartlang.org/packages/http
 description: A composable, Future-based API for making HTTP requests.
@@ -8,6 +8,6 @@
   path: ">=0.9.0 <2.0.0"
   stack_trace: ">=0.9.1 <2.0.0"
 dev_dependencies:
-  unittest: ">=0.9.0 <0.11.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
   sdk: ">=1.1.0 <2.0.0"
diff --git a/pkg/http/test/html/streamed_request_test.dart b/pkg/http/test/html/streamed_request_test.dart
index e75d130..907bcaf 100644
--- a/pkg/http/test/html/streamed_request_test.dart
+++ b/pkg/http/test/html/streamed_request_test.dart
@@ -4,8 +4,6 @@
 
 library http.test.html.streamed_request_test;
 
-import 'dart:convert';
-
 import 'package:http/http.dart' as http;
 import 'package:http/browser_client.dart';
 import 'package:unittest/unittest.dart';
@@ -37,4 +35,4 @@
       });
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/http/test/html/utils.dart b/pkg/http/test/html/utils.dart
index 5803ec2..243278e 100644
--- a/pkg/http/test/html/utils.dart
+++ b/pkg/http/test/html/utils.dart
@@ -4,14 +4,8 @@
 
 library http.test.html_utils;
 
-import 'dart:async';
-import 'dart:convert';
 import 'dart:html';
 
-import 'package:http/http.dart';
-import 'package:http/src/utils.dart';
-import 'package:unittest/unittest.dart';
-
 export '../utils.dart';
 
 /// The test server's echo URL.
diff --git a/pkg/http/test/io/streamed_request_test.dart b/pkg/http/test/io/streamed_request_test.dart
index ef823f9..176d66f 100644
--- a/pkg/http/test/io/streamed_request_test.dart
+++ b/pkg/http/test/io/streamed_request_test.dart
@@ -55,4 +55,4 @@
     }).whenComplete(stopServer);
   });
 
-}
\ No newline at end of file
+}
diff --git a/pkg/http/test/streamed_request_test.dart b/pkg/http/test/streamed_request_test.dart
index afe8e09..444b36b 100644
--- a/pkg/http/test/streamed_request_test.dart
+++ b/pkg/http/test/streamed_request_test.dart
@@ -4,8 +4,6 @@
 
 library streamed_request_test;
 
-import 'dart:convert';
-
 import 'package:http/http.dart' as http;
 import 'package:unittest/unittest.dart';
 
@@ -29,4 +27,4 @@
       expect(() => request.contentLength = 10, throwsStateError);
     });
   });
-}
\ No newline at end of file
+}
diff --git a/pkg/http_base/CHANGELOG.md b/pkg/http_base/CHANGELOG.md
index 64312a4..e39f08d 100644
--- a/pkg/http_base/CHANGELOG.md
+++ b/pkg/http_base/CHANGELOG.md
@@ -1,2 +1,13 @@
+# 0.0.2
+
+* Renamed `Response.status` to `Response.statusCode`.
+
+* Renamed `Client` to `RequestHandler`.
+
+* Removed `HttpRequestHandler`.
+
+* Standardized doc comments.
+
 # 0.0.1
 
+* Initial release
diff --git a/pkg/http_base/lib/http_base.dart b/pkg/http_base/lib/http_base.dart
index d05812e..55f6014 100644
--- a/pkg/http_base/lib/http_base.dart
+++ b/pkg/http_base/lib/http_base.dart
@@ -6,121 +6,72 @@
 
 import 'dart:async';
 
-/**
- * Representation of a set of HTTP headers.
- */
+/// Representation of a set of HTTP headers.
 abstract class Headers {
-  /**
-   * Returns the names of all header fields.
-   */
+  /// Returns the names of all header fields.
   Iterable<String> get names;
 
-  /**
-   * Returns `true` if a header field of the specified [name] exist.
-   */
+  /// Returns `true` if a header field of the specified [name] exist.
   bool contains(String name);
 
-  /**
-   * Returns the value for the header field named [name].
-   *
-   * The HTTP standard supports multiple values for each header field name.
-   * Header fields with multiple values can be represented as a
-   * comma-separated list. If a header has multiple values the returned string
-   * is the comma-separated list of all these values.
-   *
-   * For header field-names which do not allow combining multiple values with
-   * comma, this index operator will throw `IllegalArgument`.
-   * This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use
-   * `getMultiple` method to iterate over the header values for these.
-   */
+  /// Returns the value for the header field named [name].
+  ///
+  /// The HTTP standard supports multiple values for each header field name.
+  /// Header fields with multiple values can be represented as a
+  /// comma-separated list. If a header has multiple values the returned string
+  /// is the comma-separated list of all these values.
+  ///
+  /// For header field-names which do not allow combining multiple values with
+  /// comma, this index operator will throw `IllegalArgument`.
+  /// This is currently the case for the 'Cookie' and 'Set-Cookie' headers. Use
+  /// `getMultiple` method to iterate over the header values for these.
   String operator [](String name);
 
-  /**
-   * Returns the values for the header field named [name].
-   *
-   * The order in which the values for the field name appear is the same
-   * as the order in which they are to be send or was received.
-   */
+  /// Returns the values for the header field named [name].
+  ///
+  /// The order in which the values for the field name appear is the same
+  /// as the order in which they are to be send or was received.
   Iterable<String> getMultiple(String name);
 }
 
-
-/**
- * Representation of a HTTP request.
- */
+/// Representation of a HTTP request.
 abstract class Request {
-  /**
-   * Request method.
-   */
+  /// Request method.
   String get method;
 
-  /**
-   * Request url.
-   */
+  /// Request url.
   Uri get url;
 
-  /**
-   * Request headers.
-   */
+  /// Request headers.
   Headers get headers;
 
-  /**
-   * Request body.
-   */
+  /// Request body.
   Stream<List<int>> read();
 }
 
-
-/**
- * Representation of a HTTP response.
- */
+/// Representation of a HTTP response.
 abstract class Response {
-  /**
-   * Response status code.
-   */
-  int get status;
+  /// Response status code.
+  int get statusCode;
 
-  /**
-   * Response headers.
-   */
+  /// Response headers.
   Headers get headers;
 
-  /**
-   * Response body.
-   */
+  /// Response body.
   Stream<List<int>> read();
 }
 
-
-
-/**
- * Function for performing a HTTP request.
- *
- * The [Client] may use any transport mechanism it wants
- * (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
- *
- * [Client]s are composable. E.g. A [Client] may add an 'Authorization'
- * header to [request] and forward to another [Client].
- *
- * A [Client] may ignore connection specific headers in [request] and may
- * not present them in the [Response] object.
- *
- * Connection specific headers:
- *    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
- */
-typedef Future<Response> Client(Request request);
-
-/**
- * Function for handling a HTTP request.
- *
- * The [RequestHandler] should not react on any connection specific headers
- * in [request] and connection specific headers in it's [Response] may be
- * ignored by a HTTP Server.
- *
- * [RequestHandler]s are composable. E.g. A [RequestHandler] may call another
- * [RequestHandler] and augment the headers with e.g. a 'Set-Cookie' header.
- *
- * Connection specific headers:
- *    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
- */
-typedef Future<Response> HttpRequestHandler(Request request);
+/// Function for performing an HTTP request.
+///
+/// The [RequestHandler] may use any transport mechanism it wants
+/// (e.g. HTTP/1.1, HTTP/2.0, SPDY) to perform the HTTP request.
+///
+/// [RequestHandler]s are composable. E.g. A [RequestHandler] may add an
+/// 'Authorization' header to [request] and forward to another [RequestHandler].
+///
+/// A [RequestHandler] may ignore connection specific headers in [request] and
+/// may not present them in the [Response] object.
+///
+/// Connection specific headers:
+///    'Connection', 'Upgrade', 'Keep-Alive', 'Transfer-Encoding'
+typedef Future<Response> RequestHandler(Request request);
diff --git a/pkg/http_base/pubspec.yaml b/pkg/http_base/pubspec.yaml
index d9f115a..00e1c31 100644
--- a/pkg/http_base/pubspec.yaml
+++ b/pkg/http_base/pubspec.yaml
@@ -1,5 +1,5 @@
 name: http_base
-version: 0.0.1
+version: 0.0.2-dev
 author: Dart Team <misc@dartlang.org>
 homepage: http://www.dartlang.org
 description: >
@@ -7,4 +7,3 @@
   objects, HTTP clients and HTTP request handlers.
 environment:
   sdk: '>=1.0.0 <2.0.0'
-
diff --git a/pkg/intl/lib/intl.dart b/pkg/intl/lib/intl.dart
index ba2e83a..a7213d0 100644
--- a/pkg/intl/lib/intl.dart
+++ b/pkg/intl/lib/intl.dart
@@ -29,7 +29,6 @@
 import 'src/date_format_internal.dart';
 import "number_symbols.dart";
 import "number_symbols_data.dart";
-import "src/temporary_debugging.dart";
 
 part 'date_format.dart';
 part 'src/date_format_field.dart';
diff --git a/pkg/intl/lib/src/date_format_helpers.dart b/pkg/intl/lib/src/date_format_helpers.dart
index d8adde1..e59a63e 100644
--- a/pkg/intl/lib/src/date_format_helpers.dart
+++ b/pkg/intl/lib/src/date_format_helpers.dart
@@ -36,22 +36,9 @@
    * Return a date built using our values. If no date portion is set,
    * use the "Epoch" of January 1, 1970.
    */
-  DateTime asDate() {
+  DateTime asDate({retry: true}) {
     // TODO(alanknight): Validate the date, especially for things which
     // can crash the VM, e.g. large month values.
-    if (debugLogDateCreation) {
-      debugDateCreationLog
-        ..write("  Creating Date from\n")
-        ..write("    UTC: $utc\n")
-        ..write("    year: $year\n")
-        ..write("    month: $month\n")
-        ..write("    day: $day\n")
-        ..write("    pm: $pm\n")
-        ..write("    hour: $hour\n")
-        ..write("    minute: $minute\n")
-        ..write("    second: $second\n")
-        ..write("    fractionalSecond: $fractionalSecond\n");
-    }
     var result;
     if (utc) {
       result = new DateTime.utc(
@@ -71,10 +58,12 @@
           minute,
           second,
           fractionalSecond);
-    }
-    if (debugLogDateCreation) {
-      debugDateCreationLog
-        ..write("Created $result");
+      // TODO(alanknight): Issue 15560 means non-UTC dates occasionally come
+      // out in UTC. If that happens, retry once. This will always happen if 
+      // the local time zone is UTC, but that's ok.
+      if (result.toUtc() == result) {
+        result = asDate(retry: false);
+      }
     }
     return result;
   }
diff --git a/pkg/intl/lib/src/http_request_data_reader.dart b/pkg/intl/lib/src/http_request_data_reader.dart
index bd86d66..af0d68f 100644
--- a/pkg/intl/lib/src/http_request_data_reader.dart
+++ b/pkg/intl/lib/src/http_request_data_reader.dart
@@ -23,6 +23,31 @@
     // TODO(alanknight): Remove this once it's not necessary for Chrome.
     // Without it, the tests will be flaky on Chrome. Issue 11834.
     var someNumber = new DateTime.now().millisecondsSinceEpoch;
-    return HttpRequest.getString('$url$locale.json?cacheBlocker=$someNumber');
+    var request = new HttpRequest();
+    request.timeout = 5000;
+    return _getString('$url$locale.json?cacheBlocker=$someNumber', request)
+      .then((r) => r.responseText);
+  }
+  
+  /// Read a string with the given request. This is a stripped down copy
+  /// of HttpRequest getString, but was the simplest way I could find to 
+  /// issue a request with a timeout.
+  Future<HttpRequest> _getString(String url, HttpRequest xhr) {
+    var completer = new Completer<HttpRequest>();
+    xhr.open('GET', url, async: true);
+    xhr.onLoad.listen((e) {
+      // Note: file:// URIs have status of 0.
+      if ((xhr.status >= 200 && xhr.status < 300) ||
+          xhr.status == 0 || xhr.status == 304) {
+        completer.complete(xhr);
+      } else {
+        completer.completeError(e);
+      }
+    });
+
+    xhr.onError.listen(completer.completeError);
+    xhr.send();
+
+    return completer.future;
   }
 }
diff --git a/pkg/intl/lib/src/temporary_debugging.dart b/pkg/intl/lib/src/temporary_debugging.dart
deleted file mode 100644
index 29740c4..0000000
--- a/pkg/intl/lib/src/temporary_debugging.dart
+++ /dev/null
@@ -1,10 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-/// This library contains temporary debugging code that should be
-/// removed once its purpose is finished. You would be crazy to use it.
-
-bool debugLogDateCreation = false;
-
-StringBuffer debugDateCreationLog = new StringBuffer();
diff --git a/pkg/intl/pubspec.yaml b/pkg/intl/pubspec.yaml
index 82dce33..3895b01 100644
--- a/pkg/intl/pubspec.yaml
+++ b/pkg/intl/pubspec.yaml
@@ -1,5 +1,5 @@
 name: intl
-version: 0.9.10-dev.1
+version: 0.9.10
 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: http://www.dartlang.org
@@ -7,7 +7,7 @@
   sdk: '>=1.4.0-dev.6.6 <2.0.0'
 documentation: http://api.dartlang.org/docs/pkg/intl
 dependencies:
-  analyzer: '>=0.13.2 <0.14.0'
+  analyzer: '>=0.13.2 <0.16.0'
   path: '>=0.9.0 <2.0.0'
 dev_dependencies:
   serialization: '>=0.9.0 <0.10.0'
diff --git a/pkg/intl/test/date_time_format_test_core.dart b/pkg/intl/test/date_time_format_test_core.dart
index ea7cfca..6510481 100644
--- a/pkg/intl/test/date_time_format_test_core.dart
+++ b/pkg/intl/test/date_time_format_test_core.dart
@@ -14,7 +14,6 @@
 import 'date_time_format_test_data.dart';
 import 'package:intl/intl.dart';
 import 'package:intl/src/date_format_internal.dart';
-import 'package:intl/src/temporary_debugging.dart';
 
 var formatsToTest = const [
   DateFormat.DAY,
@@ -165,35 +164,8 @@
     if (!badSkeletons.any((x) => x == skeleton)) {
       var format = new DateFormat(skeleton, localeName);
       var actualResult = format.format(date);
-      debugLogDateCreation = true;
       var parsed = format.parse(actualResult);
       var thenPrintAgain = format.format(parsed);
-      // We've seen a case where this failed in a way that seemed like a time
-      // zone shifting or some other strange behaviour that caused an off by
-      // one error in the date. Check for this and print out as much information
-      // as possible if it occurs again.
-      if (thenPrintAgain != actualResult) {
-        print("Date mismatch!");
-        print("Date creation log: $debugDateCreationLog");
-        debugDateCreationLog.clear();
-        print("  Expected $actualResult");
-        print("  Got $thenPrintAgain");
-        print("  Original date = $date");
-        print("  Original ms = ${date.millisecondsSinceEpoch}");
-        print("  Parsed back to $parsed");
-        var parsed2 = format.parse(actualResult);
-        print("  Parsing again yields $parsed2");
-        print("  Logged as: $debugDateCreationLog");
-        debugDateCreationLog.clear();
-        print("  Parsed ms = ${parsed.millisecondsSinceEpoch}");
-        print("  Original tz = $originalTimeZoneOffset");
-        print("  Current tz name = $originalTimeZoneName");
-        print("  Current tz = ${parsed.timeZoneOffset}");
-        print("  Current tz name = ${parsed.timeZoneName}");
-        print("  Start time = $originalTime");
-        print("  Current time ${new DateTime.now()}");
-      }
-      debugLogDateCreation = false;
       expect(thenPrintAgain, equals(actualResult));
     }
   }
diff --git a/pkg/json_rpc_2/CHANGELOG.md b/pkg/json_rpc_2/CHANGELOG.md
index ba15fb3..34123f9 100644
--- a/pkg/json_rpc_2/CHANGELOG.md
+++ b/pkg/json_rpc_2/CHANGELOG.md
@@ -1,3 +1,15 @@
+## 0.1.0
+
+* Remove `Server.handleRequest()` and `Server.parseRequest()`. Instead, `new
+  Server()` takes a `Stream` and a `StreamSink` and uses those behind-the-scenes
+  for its communication.
+
+* Add `Server.listen()`, which causes the server to begin listening to the
+  underlying request stream.
+
+* Add `Server.close()`, which closes the underlying request stream and response
+  sink.
+
 ## 0.0.2+3
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/json_rpc_2/lib/src/server.dart b/pkg/json_rpc_2/lib/src/server.dart
index d05c54f..c7ece5b 100644
--- a/pkg/json_rpc_2/lib/src/server.dart
+++ b/pkg/json_rpc_2/lib/src/server.dart
@@ -26,6 +26,20 @@
 /// asynchronously, it's possible for multiple methods to be invoked at the same
 /// time, or even for a single method to be invoked multiple times at once.
 class Server {
+  /// The stream for decoded requests.
+  final Stream _requests;
+
+  /// The subscription to the decoded request stream.
+  StreamSubscription _requestSubscription;
+
+  /// The sink for decoded responses.
+  final StreamSink _responses;
+
+  /// The completer for [listen].
+  ///
+  /// This is non-`null` after [listen] has been called.
+  Completer _listenCompleter;
+
   /// The methods registered for this server.
   final _methods = new Map<String, Function>();
 
@@ -35,7 +49,104 @@
   /// [RpcException.methodNotFound] exception.
   final _fallbacks = new Queue<Function>();
 
-  Server();
+  /// Creates a [Server] that reads requests from [requests] and writes
+  /// responses to [responses].
+  ///
+  /// If [requests] is a [StreamSink] as well as a [Stream] (for example, a
+  /// `WebSocket`), [responses] may be omitted.
+  ///
+  /// Note that the server won't begin listening to [requests] until
+  /// [Server.listen] is called.
+  factory Server(Stream<String> requests, [StreamSink<String> responses]) {
+    if (responses == null) {
+      if (requests is! StreamSink) {
+        throw new ArgumentError("Either `requests` must be a StreamSink or "
+            "`responses` must be passed.");
+      }
+      responses = requests as StreamSink;
+    }
+
+    var wrappedResponses = mapStreamSink(responses, JSON.encode);
+    return new Server.withoutJson(requests.expand((request) {
+      var decodedRequest;
+      try {
+        decodedRequest = JSON.decode(request);
+      } on FormatException catch (error) {
+        wrappedResponses.add(new RpcException(error_code.PARSE_ERROR,
+            'Invalid JSON: ${error.message}').serialize(request));
+        return [];
+      }
+
+      return [decodedRequest];
+    }), wrappedResponses);
+  }
+
+  /// Creates a [Server] that reads decoded requests from [requests] and writes
+  /// decoded responses to [responses].
+  ///
+  /// Unlike [new Server], this doesn't read or write JSON strings. Instead, it
+  /// reads and writes decoded maps or lists.
+  ///
+  /// If [requests] is a [StreamSink] as well as a [Stream], [responses] may be
+  /// omitted.
+  ///
+  /// Note that the server won't begin listening to [requests] until
+  /// [Server.listen] is called.
+  Server.withoutJson(Stream requests, [StreamSink responses])
+      : _requests = requests,
+        _responses = responses == null && requests is StreamSink ?
+            requests : responses {
+    if (_responses == null) {
+      throw new ArgumentError("Either `requests` must be a StreamSink or "
+          "`responses` must be passed.");
+    }
+  }
+
+  /// Starts listening to the underlying stream.
+  ///
+  /// Returns a [Future] that will complete when the stream is closed or when it
+  /// has an error.
+  ///
+  /// [listen] may only be called once.
+  Future listen() {
+    if (_listenCompleter != null) {
+      throw new StateError(
+          "Can only call Server.listen once on a given server.");
+    }
+
+    _listenCompleter = new Completer();
+    _requestSubscription = _requests.listen(_handleRequest,
+        onError: (error, stackTrace) {
+      if (_listenCompleter.isCompleted) return;
+      _responses.close();
+      _listenCompleter.completeError(error, stackTrace);
+    }, onDone: () {
+      if (_listenCompleter.isCompleted) return;
+      _responses.close();
+      _listenCompleter.complete();
+    }, cancelOnError: true);
+
+    return _listenCompleter.future;
+  }
+
+  /// Closes the server's request subscription and response sink.
+  ///
+  /// Returns a [Future] that completes when all resources have been released.
+  ///
+  /// A server can't be closed before [listen] has been called.
+  Future close() {
+    if (_listenCompleter == null) {
+      throw new StateError("Can't call Server.close before Server.listen.");
+    }
+
+    if (!_listenCompleter.isCompleted) _listenCompleter.complete();
+
+    var subscriptionFuture = _requestSubscription.cancel();
+    // TODO(nweiz): include the response future in the return value when issue
+    // 19095 is fixed.
+    _responses.close();
+    return subscriptionFuture == null ? new Future.value() : subscriptionFuture;
+  }
 
   /// Registers a method named [name] on this server.
   ///
@@ -69,14 +180,14 @@
     _fallbacks.add(callback);
   }
 
-  /// Handle a request that's already been parsed from JSON.
+  /// Handle a request.
   ///
   /// [request] is expected to be a JSON-serializable object representing a
   /// request sent by a client. This calls the appropriate method or methods for
   /// handling that request and returns a JSON-serializable response, or `null`
   /// if no response should be sent. [callback] may send custom
   /// errors by throwing an [RpcException].
-  Future handleRequest(request) {
+  Future _handleRequest(request) {
     return syncFuture(() {
       if (request is! List) return _handleSingleRequest(request);
       if (request.isEmpty) {
@@ -88,28 +199,7 @@
         var nonNull = results.where((result) => result != null);
         return nonNull.isEmpty ? null : nonNull.toList();
       });
-    });
-  }
-
-  /// Parses and handles a JSON serialized request.
-  ///
-  /// This calls the appropriate method or methods for handling that request and
-  /// returns a JSON string, or `null` if no response should be sent.
-  Future<String> parseRequest(String request) {
-    return syncFuture(() {
-      var decodedRequest;
-      try {
-        decodedRequest = JSON.decode(request);
-      } on FormatException catch (error) {
-        return new RpcException(error_code.PARSE_ERROR, 'Invalid JSON: '
-            '${error.message}').serialize(request);
-      }
-
-      return handleRequest(decodedRequest);
-    }).then((response) {
-      if (response == null) return null;
-      return JSON.encode(response);
-    });
+    }).then(_responses.add);
   }
 
   /// Handles an individual parsed request.
diff --git a/pkg/json_rpc_2/lib/src/utils.dart b/pkg/json_rpc_2/lib/src/utils.dart
index 1eff004..a212f58 100644
--- a/pkg/json_rpc_2/lib/src/utils.dart
+++ b/pkg/json_rpc_2/lib/src/utils.dart
@@ -43,3 +43,24 @@
 /// [toString], so we remove that if it exists.
 String getErrorMessage(error) =>
     error.toString().replaceFirst(_exceptionPrefix, '');
+
+/// Returns a [StreamSink] that wraps [sink] and maps each event added using
+/// [callback].
+StreamSink mapStreamSink(StreamSink sink, callback(event)) =>
+    new _MappedStreamSink(sink, callback);
+
+/// A [StreamSink] wrapper that maps each event added to the sink.
+class _MappedStreamSink implements StreamSink {
+  final StreamSink _inner;
+  final Function _callback;
+
+  Future get done => _inner.done;
+
+  _MappedStreamSink(this._inner, this._callback);
+
+  void add(event) => _inner.add(_callback(event));
+  void addError(error, [StackTrace stackTrace]) =>
+      _inner.addError(error, stackTrace);
+  Future addStream(Stream stream) => _inner.addStream(stream.map(_callback));
+  Future close() => _inner.close();
+}
diff --git a/pkg/json_rpc_2/pubspec.yaml b/pkg/json_rpc_2/pubspec.yaml
index 2cf1bc8..df1a8a0 100644
--- a/pkg/json_rpc_2/pubspec.yaml
+++ b/pkg/json_rpc_2/pubspec.yaml
@@ -1,5 +1,5 @@
 name: json_rpc_2
-version: 0.0.2+3
+version: 0.1.0
 author: Dart Team <misc@dartlang.org>
 description: An implementation of the JSON-RPC 2.0 spec.
 homepage: http://www.dartlang.org
@@ -7,7 +7,7 @@
 dependencies:
   stack_trace: '>=0.9.1 <2.0.0'
 dev_dependencies:
-  unittest: ">=0.9.0 <0.10.0"
+  unittest: ">=0.9.0 <0.12.0"
 environment:
   sdk: ">=1.2.0 <2.0.0"
 
diff --git a/pkg/json_rpc_2/test/server/batch_test.dart b/pkg/json_rpc_2/test/server/batch_test.dart
index 441df58..7dda84f 100644
--- a/pkg/json_rpc_2/test/server/batch_test.dart
+++ b/pkg/json_rpc_2/test/server/batch_test.dart
@@ -13,16 +13,17 @@
 import 'utils.dart';
 
 void main() {
-  var server;
+  var controller;
   setUp(() {
-    server = new json_rpc.Server()
+    controller = new ServerController();
+    controller.server
         ..registerMethod('foo', () => 'foo')
         ..registerMethod('id', (params) => params.value)
         ..registerMethod('arg', (params) => params['arg'].value);
   });
 
   test('handles a batch of requests', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value'], 'id': 2},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -34,7 +35,7 @@
   });
 
   test('handles errors individually', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'zap', 'id': 2},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -54,7 +55,7 @@
   });
 
   test('handles notifications individually', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
@@ -65,7 +66,7 @@
   });
 
   test('returns nothing if every request is a notification', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       {'jsonrpc': '2.0', 'method': 'foo'},
       {'jsonrpc': '2.0', 'method': 'id', 'params': ['value']},
       {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}}
@@ -73,24 +74,12 @@
   });
 
   test('returns an error if the batch is empty', () {
-    expectErrorResponse(server, [], error_code.INVALID_REQUEST,
+    expectErrorResponse(controller, [], error_code.INVALID_REQUEST,
         'A batch must contain at least one request.');
   });
 
-  test('handles a batch of requests parsed from JSON', () {
-    expect(server.parseRequest(JSON.encode([
-      {'jsonrpc': '2.0', 'method': 'foo', 'id': 1},
-      {'jsonrpc': '2.0', 'method': 'id', 'params': ['value'], 'id': 2},
-      {'jsonrpc': '2.0', 'method': 'arg', 'params': {'arg': 'value'}, 'id': 3}
-    ])), completion(equals(JSON.encode([
-      {'jsonrpc': '2.0', 'result': 'foo', 'id': 1},
-      {'jsonrpc': '2.0', 'result': ['value'], 'id': 2},
-      {'jsonrpc': '2.0', 'result': 'value', 'id': 3}
-    ]))));
-  });
-
   test('disallows nested batches', () {
-    expect(server.handleRequest([
+    expect(controller.handleRequest([
       [{'jsonrpc': '2.0', 'method': 'foo', 'id': 1}]
     ]), completion(equals([{
       'jsonrpc': '2.0',
diff --git a/pkg/json_rpc_2/test/server/invalid_request_test.dart b/pkg/json_rpc_2/test/server/invalid_request_test.dart
index feeefea..74cf86f 100644
--- a/pkg/json_rpc_2/test/server/invalid_request_test.dart
+++ b/pkg/json_rpc_2/test/server/invalid_request_test.dart
@@ -13,23 +13,23 @@
 import 'utils.dart';
 
 void main() {
-  var server;
-  setUp(() => server = new json_rpc.Server());
+  var controller;
+  setUp(() => controller = new ServerController());
 
   test("a non-Array/Object request is invalid", () {
-    expectErrorResponse(server, 'foo', error_code.INVALID_REQUEST,
+    expectErrorResponse(controller, 'foo', error_code.INVALID_REQUEST,
         'Request must be an Array or an Object.');
   });
 
   test("requests must have a jsonrpc key", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'method': 'foo',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "jsonrpc" key.');
   });
 
   test("the jsonrpc version must be 2.0", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '1.0',
       'method': 'foo',
       'id': 1234
@@ -38,14 +38,14 @@
   });
 
   test("requests must have a method key", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'id': 1234
     }, error_code.INVALID_REQUEST, 'Request must contain a "method" key.');
   });
 
   test("request method must be a string", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 1234,
       'id': 1234
@@ -54,7 +54,7 @@
   });
 
   test("request params must be an Array or Object", () {
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': 1234,
@@ -64,7 +64,7 @@
   });
 
   test("request id may not be an Array or Object", () {
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': {'bad': 'id'}
diff --git a/pkg/json_rpc_2/test/server/parameters_test.dart b/pkg/json_rpc_2/test/server/parameters_test.dart
index 49e4573..64fe232 100644
--- a/pkg/json_rpc_2/test/server/parameters_test.dart
+++ b/pkg/json_rpc_2/test/server/parameters_test.dart
@@ -262,7 +262,9 @@
       expect(() => parameters['invalid-uri'].asUri,
           throwsInvalidParams('Parameter "invalid-uri" for method "foo" must '
               'be a valid URI, but was "http://[::1".\n'
-              'Bad end of IPv6 host'));
+              'Missing end `]` to match `[` in host at position 7.\n'
+              'http://[::1\n'
+              '       ^'));
     });
 
     group("with a nested parameter map", () {
diff --git a/pkg/json_rpc_2/test/server/server_test.dart b/pkg/json_rpc_2/test/server/server_test.dart
index c18a8ca..a89a0d99 100644
--- a/pkg/json_rpc_2/test/server/server_test.dart
+++ b/pkg/json_rpc_2/test/server/server_test.dart
@@ -13,15 +13,15 @@
 import 'utils.dart';
 
 void main() {
-  var server;
-  setUp(() => server = new json_rpc.Server());
+  var controller;
+  setUp(() => controller = new ServerController());
 
   test("calls a registered method with the given name", () {
-    server.registerMethod('foo', (params) {
+    controller.server.registerMethod('foo', (params) {
       return {'params': params.value};
     });
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {'param': 'value'},
@@ -34,9 +34,9 @@
   });
 
   test("calls a method that takes no parameters", () {
-    server.registerMethod('foo', () => 'foo');
+    controller.server.registerMethod('foo', () => 'foo');
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -48,9 +48,9 @@
   });
 
   test("a method that takes no parameters rejects parameters", () {
-    server.registerMethod('foo', () => 'foo');
+    controller.server.registerMethod('foo', () => 'foo');
 
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -61,9 +61,9 @@
   });
 
   test("an unexpected error in a method is captured", () {
-    server.registerMethod('foo', () => throw new FormatException('bad format'));
+    controller.server.registerMethod('foo', () => throw new FormatException('bad format'));
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'id': 1234
@@ -83,9 +83,9 @@
   });
 
   test("doesn't return a result for a notification", () {
-    server.registerMethod('foo', (args) => 'result');
+    controller.server.registerMethod('foo', (args) => 'result');
 
-    expect(server.handleRequest({
+    expect(controller.handleRequest({
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {}
@@ -93,11 +93,11 @@
   });
 
   test("includes the error data in the response", () {
-    server.registerMethod('foo', (params) {
+    controller.server.registerMethod('foo', (params) {
       throw new json_rpc.RpcException(5, 'Error message.', data: 'data value');
     });
 
-    expectErrorResponse(server, {
+    expectErrorResponse(controller, {
       'jsonrpc': '2.0',
       'method': 'foo',
       'params': {},
@@ -108,58 +108,28 @@
         data: 'data value');
   });
 
-  group("JSON", () {
-    test("handles a request parsed from JSON", () {
-      server.registerMethod('foo', (params) {
-        return {'params': params.value};
-      });
-
-      expect(server.parseRequest(JSON.encode({
+  test("a JSON parse error is rejected", () {
+    return controller.handleJsonRequest('invalid json {').then((result) {
+      expect(JSON.decode(result), {
         'jsonrpc': '2.0',
-        'method': 'foo',
-        'params': {'param': 'value'},
-        'id': 1234
-      })), completion(equals(JSON.encode({
-        'jsonrpc': '2.0',
-        'result': {'params': {'param': 'value'}},
-        'id': 1234
-      }))));
-    });
-
-    test("handles a notification parsed from JSON", () {
-      server.registerMethod('foo', (params) {
-        return {'params': params};
-      });
-
-      expect(server.parseRequest(JSON.encode({
-        'jsonrpc': '2.0',
-        'method': 'foo',
-        'params': {'param': 'value'}
-      })), completion(isNull));
-    });
-
-    test("a JSON parse error is rejected", () {
-      return server.parseRequest('invalid json {').then((result) {
-        expect(JSON.decode(result), {
-          'jsonrpc': '2.0',
-          'error': {
-            'code': error_code.PARSE_ERROR,
-            'message': startsWith("Invalid JSON: "),
-            'data': {'request': 'invalid json {'}
-          },
-          'id': null
-        });
+        'error': {
+          'code': error_code.PARSE_ERROR,
+          'message': startsWith("Invalid JSON: "),
+          'data': {'request': 'invalid json {'}
+        },
+        'id': null
       });
     });
   });
 
   group("fallbacks", () {
     test("calls a fallback if no method matches", () {
-      server.registerMethod('foo', () => 'foo');
-      server.registerMethod('bar', () => 'foo');
-      server.registerFallback((params) => {'fallback': params.value});
+      controller.server
+          ..registerMethod('foo', () => 'foo')
+          ..registerMethod('bar', () => 'foo')
+          ..registerFallback((params) => {'fallback': params.value});
 
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'baz',
         'params': {'param': 'value'},
@@ -172,13 +142,13 @@
     });
 
     test("calls the first matching fallback", () {
-      server.registerFallback((params) =>
-          throw new json_rpc.RpcException.methodNotFound(params.method));
+      controller.server
+          ..registerFallback((params) =>
+              throw new json_rpc.RpcException.methodNotFound(params.method))
+          ..registerFallback((params) => 'fallback 2')
+          ..registerFallback((params) => 'fallback 3');
 
-      server.registerFallback((params) => 'fallback 2');
-      server.registerFallback((params) => 'fallback 3');
-
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'fallback 2',
         'id': 1234
@@ -190,9 +160,10 @@
     });
 
     test("an unexpected error in a fallback is captured", () {
-      server.registerFallback((_) => throw new FormatException('bad format'));
+      controller.server.registerFallback((_) =>
+          throw new FormatException('bad format'));
 
-      expect(server.handleRequest({
+      expect(controller.handleRequest({
         'jsonrpc': '2.0',
         'method': 'foo',
         'id': 1234
@@ -213,7 +184,8 @@
   });
 
   test("disallows multiple methods with the same name", () {
-    server.registerMethod('foo', () => null);
-    expect(() => server.registerMethod('foo', () => null), throwsArgumentError);
+    controller.server.registerMethod('foo', () => null);
+    expect(() => controller.server.registerMethod('foo', () => null),
+        throwsArgumentError);
   });
 }
diff --git a/pkg/json_rpc_2/test/server/utils.dart b/pkg/json_rpc_2/test/server/utils.dart
index 6f92c0a..a4fd36a 100644
--- a/pkg/json_rpc_2/test/server/utils.dart
+++ b/pkg/json_rpc_2/test/server/utils.dart
@@ -4,16 +4,53 @@
 
 library json_rpc_2.test.server.util;
 
-import 'package:unittest/unittest.dart';
-import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
+import 'dart:async';
+import 'dart:convert';
 
-void expectErrorResponse(json_rpc.Server server, request, int errorCode,
+import 'package:json_rpc_2/json_rpc_2.dart' as json_rpc;
+import 'package:json_rpc_2/error_code.dart' as error_code;
+import 'package:unittest/unittest.dart';
+
+/// A controller used to test a [json_rpc.Server].
+class ServerController {
+  /// The controller for the server's request stream.
+  final _requestController = new StreamController<String>();
+
+  /// The controller for the server's response sink.
+  final _responseController = new StreamController<String>();
+
+  /// The server.
+  json_rpc.Server get server => _server;
+  json_rpc.Server _server;
+
+  ServerController() {
+    _server = new json_rpc.Server(
+        _requestController.stream, _responseController.sink);
+    _server.listen();
+  }
+
+  /// Passes [request], a decoded request, to [server] and returns its decoded
+  /// response.
+  Future handleRequest(request) =>
+      handleJsonRequest(JSON.encode(request)).then(JSON.decode);
+
+  /// Passes [request], a JSON-encoded request, to [server] and returns its
+  /// encoded response.
+  Future handleJsonRequest(String request) {
+    _requestController.add(request);
+    return _responseController.stream.first;
+  }
+}
+
+/// Expects that [controller]'s server will return an error response to
+/// [request] with the given [errorCode], [message], and [data].
+void expectErrorResponse(ServerController controller, request, int errorCode,
     String message, {data}) {
   var id;
   if (request is Map) id = request['id'];
   if (data == null) data = {'request': request};
 
-  expect(server.handleRequest(request), completion(equals({
+  expect(controller.handleRequest(request), completion(equals({
     'jsonrpc': '2.0',
     'id': id,
     'error': {
@@ -24,10 +61,25 @@
   })));
 }
 
+/// Returns a matcher that matches a [json_rpc.RpcException] with an
+/// `invalid_params` error code.
 Matcher throwsInvalidParams(String message) {
   return throwsA(predicate((error) {
     expect(error, new isInstanceOf<json_rpc.RpcException>());
+    expect(error.code, equals(error_code.INVALID_PARAMS));
     expect(error.message, equals(message));
     return true;
   }));
 }
+
+/// Returns a [Future] that completes after pumping the event queue [times]
+/// times. By default, this should pump the event queue enough times to allow
+/// any code to run, as long as it's not waiting on some external event.
+Future pumpEventQueue([int times = 20]) {
+  if (times == 0) return new Future.value();
+  // We use a delayed future to allow microtask events to finish. The
+  // Future.value or Future() constructors use scheduleMicrotask themselves and
+  // would therefore not wait for microtask callbacks that are scheduled after
+  // invoking this method.
+  return new Future.delayed(Duration.ZERO, () => pumpEventQueue(times - 1));
+}
diff --git a/pkg/matcher/CHANGELOG.md b/pkg/matcher/CHANGELOG.md
index 98cd9f4..af9ce95 100644
--- a/pkg/matcher/CHANGELOG.md
+++ b/pkg/matcher/CHANGELOG.md
@@ -1,3 +1,11 @@
+## 0.10.1+1
+
+* Get the tests passing when run on dart2js in minified mode.
+
+## 0.10.1
+
+* Compare sets order-independently when using `equals()`.
+
 ## 0.10.0+3
 
 * Removed `@deprecated` annotation on matchers due to 
diff --git a/pkg/matcher/lib/matcher.dart b/pkg/matcher/lib/matcher.dart
index 85694ef..99fe44b 100644
--- a/pkg/matcher/lib/matcher.dart
+++ b/pkg/matcher/lib/matcher.dart
@@ -2,31 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * Support for specifying test expectations, such as for unit tests.
- *
- * The matcher library provides a third-generation assertion mechanism, drawing
- * inspiration from [Hamcrest](http://code.google.com/p/hamcrest/).
- *
- * For more information, see
- * [Unit Testing with Dart]
- * (http://www.dartlang.org/articles/dart-unit-tests/).
- */
+/// Support for specifying test expectations, such as for unit tests.
 library matcher;
 
-import 'dart:async';
-
-import 'src/description.dart';
-import 'src/interfaces.dart';
-
+export 'src/core_matchers.dart';
 export 'src/description.dart';
+export 'src/error_matchers.dart';
+export 'src/expect.dart';
+export 'src/future_matchers.dart';
 export 'src/interfaces.dart';
-
-part 'src/core_matchers.dart';
-part 'src/expect.dart';
-part 'src/future_matchers.dart';
-part 'src/iterable_matchers.dart';
-part 'src/map_matchers.dart';
-part 'src/numeric_matchers.dart';
-part 'src/operator_matchers.dart';
-part 'src/string_matchers.dart';
+export 'src/iterable_matchers.dart';
+export 'src/map_matchers.dart';
+export 'src/numeric_matchers.dart';
+export 'src/operator_matchers.dart';
+export 'src/string_matchers.dart';
diff --git a/pkg/matcher/lib/mirror_matchers.dart b/pkg/matcher/lib/mirror_matchers.dart
index c836bc9..f397128 100644
--- a/pkg/matcher/lib/mirror_matchers.dart
+++ b/pkg/matcher/lib/mirror_matchers.dart
@@ -2,21 +2,17 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/**
- * The mirror matchers library provides some additional matchers that
- * make use of `dart:mirrors`.
- */
+/// The mirror matchers library provides some additional matchers that
+/// make use of `dart:mirrors`.
 library matcher.mirror_matchers;
 
 import 'dart:mirrors';
 
 import 'matcher.dart';
 
-/**
- * Returns a matcher that checks if a class instance has a property
- * with name [name], and optionally, if that property in turn satisfies
- * a [matcher].
- */
+/// Returns a matcher that checks if a class instance has a property
+/// with name [name], and optionally, if that property in turn satisfies
+/// a [matcher].
 Matcher hasProperty(String name, [matcher]) =>
   new _HasProperty(name, matcher == null ? null : wrapMatcher(matcher));
 
diff --git a/pkg/matcher/lib/src/core_matchers.dart b/pkg/matcher/lib/src/core_matchers.dart
index 7acd7b4..cb76d68 100644
--- a/pkg/matcher/lib/src/core_matchers.dart
+++ b/pkg/matcher/lib/src/core_matchers.dart
@@ -2,12 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.core_matchers;
 
-/**
- * Returns a matcher that matches empty strings, maps or iterables
- * (including collections).
- */
+import 'dart:async';
+
+import 'description.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher that matches empty strings, maps or iterables
+/// (including collections).
 const Matcher isEmpty = const _Empty();
 
 class _Empty extends Matcher {
@@ -24,10 +28,10 @@
   Description describe(Description description) => description.add('empty');
 }
 
-/** A matcher that matches any null value. */
+/// A matcher that matches any null value.
 const Matcher isNull = const _IsNull();
 
-/** A matcher that matches any non-null value. */
+/// A matcher that matches any non-null value.
 const Matcher isNotNull = const _IsNotNull();
 
 class _IsNull extends Matcher {
@@ -42,10 +46,10 @@
   Description describe(Description description) => description.add('not null');
 }
 
-/** A matcher that matches the Boolean value true. */
+/// A matcher that matches the Boolean value true.
 const Matcher isTrue = const _IsTrue();
 
-/** A matcher that matches anything except the Boolean value true. */
+/// A matcher that matches anything except the Boolean value true.
 const Matcher isFalse = const _IsFalse();
 
 class _IsTrue extends Matcher {
@@ -60,10 +64,8 @@
   Description describe(Description description) => description.add('false');
 }
 
-/**
- * Returns a matches that matches if the value is the same instance
- * as [expected], using [identical].
- */
+/// Returns a matches that matches if the value is the same instance
+/// as [expected], using [identical].
 Matcher same(expected) => new _IsSameAs(expected);
 
 class _IsSameAs extends Matcher {
@@ -75,18 +77,16 @@
       description.add('same instance as ').addDescriptionOf(_expected);
 }
 
-/**
- * Returns a matcher that matches if the value is structurally equal to
- * [expected].
- *
- * If [expected] is a [Matcher], then it matches using that. Otherwise it tests
- * for equality using `==` on the expected value.
- *
- * For [Iterable]s and [Map]s, this will recursively match the elements. To
- * handle cyclic structures a recursion depth [limit] can be provided. The
- * default limit is 100.
- */
-Matcher equals(expected, [limit=100]) =>
+/// Returns a matcher that matches if the value is structurally equal to
+/// [expected].
+///
+/// If [expected] is a [Matcher], then it matches using that. Otherwise it tests
+/// for equality using `==` on the expected value.
+///
+/// For [Iterable]s and [Map]s, this will recursively match the elements. To
+/// handle cyclic structures a recursion depth [limit] can be provided. The
+/// default limit is 100. [Set]s will be compared order-independently.
+Matcher equals(expected, [int limit=100]) =>
     expected is String
         ? new _StringEqualsMatcher(expected)
         : new _DeepMatcher(expected, limit);
@@ -96,7 +96,7 @@
   final int _limit;
   var count;
 
-  _DeepMatcher(this._expected, [limit = 1000]): this._limit = limit;
+  _DeepMatcher(this._expected, [int limit = 1000]) : this._limit = limit;
 
   // Returns a pair (reason, location)
   List _compareIterables(expected, actual, matcher, depth, location) {
@@ -124,6 +124,26 @@
     }
   }
 
+  List _compareSets(Set expected, actual, matcher, depth, location) {
+    if (actual is! Iterable) return ['is not Iterable', location];
+    actual = actual.toSet();
+
+    for (var expectedElement in expected) {
+      if (actual.every((actualElement) =>
+          matcher(expectedElement, actualElement, location, depth) != null)) {
+        return ['does not contain $expectedElement', location];
+      }
+    }
+
+    if (actual.length > expected.length) {
+      return ['larger than expected', location];
+    } else if (actual.length < expected.length) {
+      return ['smaller than expected', location];
+    } else {
+      return null;
+    }
+  }
+
   List _recursiveMatch(expected, actual, String location, int depth) {
     // If the expected value is a matcher, try to match it.
     if (expected is Matcher) {
@@ -146,37 +166,38 @@
     if (depth > _limit) return ['recursion depth limit exceeded', location];
 
     // If _limit is 1 we can only recurse one level into object.
-    bool canRecurse = depth == 0 || _limit > 1;
+    if (depth == 0 || _limit > 1) {
+      if (expected is Set) {
+        return _compareSets(expected, actual, _recursiveMatch, depth + 1,
+            location);
+      } else if (expected is Iterable) {
+        return _compareIterables(expected, actual, _recursiveMatch, depth + 1,
+            location);
+      } else if (expected is Map) {
+        if (actual is! Map) return ['expected a map', location];
 
-    if (expected is Iterable && canRecurse) {
-      return _compareIterables(expected, actual, _recursiveMatch, depth + 1,
-          location);
-    }
-
-    if (expected is Map && canRecurse) {
-      if (actual is! Map) return ['expected a map', location];
-
-      var err = (expected.length == actual.length) ? '' :
-                'has different length and ';
-      for (var key in expected.keys) {
-        if (!actual.containsKey(key)) {
-          return ["${err}is missing map key '$key'", location];
+        var err = (expected.length == actual.length) ? '' :
+                  'has different length and ';
+        for (var key in expected.keys) {
+          if (!actual.containsKey(key)) {
+            return ["${err}is missing map key '$key'", location];
+          }
         }
-      }
 
-      for (var key in actual.keys) {
-        if (!expected.containsKey(key)) {
-          return ["${err}has extra map key '$key'", location];
+        for (var key in actual.keys) {
+          if (!expected.containsKey(key)) {
+            return ["${err}has extra map key '$key'", location];
+          }
         }
-      }
 
-      for (var key in expected.keys) {
-        var rp = _recursiveMatch(expected[key], actual[key],
-            "${location}['${key}']", depth + 1);
-        if (rp != null) return rp;
-      }
+        for (var key in expected.keys) {
+          var rp = _recursiveMatch(expected[key], actual[key],
+              "${location}['${key}']", depth + 1);
+          if (rp != null) return rp;
+        }
 
-      return null;
+        return null;
+      }
     }
 
     var description = new StringDescription();
@@ -235,7 +256,7 @@
   }
 }
 
-/** A special equality matcher for strings. */
+/// A special equality matcher for strings.
 class _StringEqualsMatcher extends Matcher {
   final String _value;
 
@@ -313,7 +334,7 @@
   }
 }
 
-/** A matcher that matches any value. */
+/// A matcher that matches any value.
 const Matcher anything = const _IsAnything();
 
 class _IsAnything extends Matcher {
@@ -322,84 +343,76 @@
   Description describe(Description description) => description.add('anything');
 }
 
-/**
- * Returns a matcher that matches if an object is an instance
- * of [type] (or a subtype).
- *
- * As types are not first class objects in Dart we can only
- * approximate this test by using a generic wrapper class.
- *
- * For example, to test whether 'bar' is an instance of type
- * 'Foo', we would write:
- *
- *     expect(bar, new isInstanceOf<Foo>());
- *
- * To get better error message, supply a name when creating the
- * Type wrapper; e.g.:
- *
- *     expect(bar, new isInstanceOf<Foo>('Foo'));
- *
- * Note that this does not currently work in dart2js; it will
- * match any type, and isNot(new isInstanceof<T>()) will always
- * fail. This is because dart2js currently ignores template type
- * parameters.
- */
+/// Returns a matcher that matches if an object is an instance
+/// of [type] (or a subtype).
+///
+/// As types are not first class objects in Dart we can only
+/// approximate this test by using a generic wrapper class.
+///
+/// For example, to test whether 'bar' is an instance of type
+/// 'Foo', we would write:
+///
+///     expect(bar, new isInstanceOf<Foo>());
+///
+/// To get better error message, supply a name when creating the
+/// Type wrapper; e.g.:
+///
+///     expect(bar, new isInstanceOf<Foo>('Foo'));
+///
+/// Note that this does not currently work in dart2js; it will
+/// match any type, and isNot(new isInstanceof<T>()) will always
+/// fail. This is because dart2js currently ignores template type
+/// parameters.
 class isInstanceOf<T> extends Matcher {
   final String _name;
-  const isInstanceOf([name = 'specified type']): this._name = name;
+  const isInstanceOf([name = 'specified type']) : this._name = name;
   bool matches(obj, Map matchState) => obj is T;
   // The description here is lame :-(
   Description describe(Description description) =>
       description.add('an instance of ${_name}');
 }
 
-/**
- * This can be used to match two kinds of objects:
- *
- *   * A [Function] that throws an exception when called. The function cannot
- *     take any arguments. If you want to test that a function expecting
- *     arguments throws, wrap it in another zero-argument function that calls
- *     the one you want to test.
- *
- *   * A [Future] that completes with an exception. Note that this creates an
- *     asynchronous expectation. The call to `expect()` that includes this will
- *     return immediately and execution will continue. Later, when the future
- *     completes, the actual expectation will run.
- */
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
 const Matcher throws = const Throws();
 
-/**
- * This can be used to match two kinds of objects:
- *
- *   * A [Function] that throws an exception when called. The function cannot
- *     take any arguments. If you want to test that a function expecting
- *     arguments throws, wrap it in another zero-argument function that calls
- *     the one you want to test.
- *
- *   * A [Future] that completes with an exception. Note that this creates an
- *     asynchronous expectation. The call to `expect()` that includes this will
- *     return immediately and execution will continue. Later, when the future
- *     completes, the actual expectation will run.
- *
- * In both cases, when an exception is thrown, this will test that the exception
- * object matches [matcher]. If [matcher] is not an instance of [Matcher], it
- * will implicitly be treated as `equals(matcher)`.
- */
+/// This can be used to match two kinds of objects:
+///
+///   * A [Function] that throws an exception when called. The function cannot
+///     take any arguments. If you want to test that a function expecting
+///     arguments throws, wrap it in another zero-argument function that calls
+///     the one you want to test.
+///
+///   * A [Future] that completes with an exception. Note that this creates an
+///     asynchronous expectation. The call to `expect()` that includes this will
+///     return immediately and execution will continue. Later, when the future
+///     completes, the actual expectation will run.
+///
+/// In both cases, when an exception is thrown, this will test that the exception
+/// object matches [matcher]. If [matcher] is not an instance of [Matcher], it
+/// will implicitly be treated as `equals(matcher)`.
 Matcher throwsA(matcher) => new Throws(wrapMatcher(matcher));
 
-/**
- * A matcher that matches a function call against no exception.
- * The function will be called once. Any exceptions will be silently swallowed.
- * The value passed to expect() should be a reference to the function.
- * Note that the function cannot take arguments; to handle this
- * a wrapper will have to be created.
- */
+/// A matcher that matches a function call against no exception.
+/// The function will be called once. Any exceptions will be silently swallowed.
+/// The value passed to expect() should be a reference to the function.
+/// Note that the function cannot take arguments; to handle this
+/// a wrapper will have to be created.
 const Matcher returnsNormally = const _ReturnsNormally();
 
 class Throws extends Matcher {
   final Matcher _matcher;
 
-  const Throws([Matcher matcher]): this._matcher = matcher;
+  const Throws([Matcher matcher]) : this._matcher = matcher;
 
   bool matches(item, Map matchState) {
     if (item is! Function && item is! Future) return false;
@@ -409,7 +422,9 @@
       // Queue up an asynchronous expectation that validates when the future
       // completes.
       item.then((value) {
-        done(() => fail("Expected future to fail, but succeeded with '$value'."));
+        done(() {
+          fail("Expected future to fail, but succeeded with '$value'.");
+        });
       }, onError: (error, trace) {
         done(() {
           if (_matcher == null) return;
@@ -519,179 +534,29 @@
   Description describe(Description description) => description.add(_name);
 }
 
-/** A matcher for FormatExceptions. */
-const isFormatException = const _FormatException();
-
-/** A matcher for functions that throw FormatException. */
-const Matcher throwsFormatException = const Throws(isFormatException);
-
-class _FormatException extends TypeMatcher {
-  const _FormatException(): super("FormatException");
-  bool matches(item, Map matchState) => item is FormatException;
-}
-
-/** A matcher for Exceptions. */
-const isException = const _Exception();
-
-/** A matcher for functions that throw Exception. */
-const Matcher throwsException = const Throws(isException);
-
-class _Exception extends TypeMatcher {
-  const _Exception(): super("Exception");
-  bool matches(item, Map matchState) => item is Exception;
-}
-
-/** A matcher for ArgumentErrors. */
-const isArgumentError = const _ArgumentError();
-
-/** A matcher for functions that throw ArgumentError. */
-const Matcher throwsArgumentError = const Throws(isArgumentError);
-
-class _ArgumentError extends TypeMatcher {
-  const _ArgumentError(): super("ArgumentError");
-  bool matches(item, Map matchState) => item is ArgumentError;
-}
-
-/** A matcher for RangeErrors. */
-const isRangeError = const _RangeError();
-
-/** A matcher for functions that throw RangeError. */
-const Matcher throwsRangeError = const Throws(isRangeError);
-
-class _RangeError extends TypeMatcher {
-  const _RangeError(): super("RangeError");
-  bool matches(item, Map matchState) => item is RangeError;
-}
-
-/** A matcher for NoSuchMethodErrors. */
-const isNoSuchMethodError = const _NoSuchMethodError();
-
-/** A matcher for functions that throw NoSuchMethodError. */
-const Matcher throwsNoSuchMethodError = const Throws(isNoSuchMethodError);
-
-class _NoSuchMethodError extends TypeMatcher {
-  const _NoSuchMethodError(): super("NoSuchMethodError");
-  bool matches(item, Map matchState) => item is NoSuchMethodError;
-}
-
-/** A matcher for UnimplementedErrors. */
-const isUnimplementedError = const _UnimplementedError();
-
-/** A matcher for functions that throw Exception. */
-const Matcher throwsUnimplementedError = const Throws(isUnimplementedError);
-
-class _UnimplementedError extends TypeMatcher {
-  const _UnimplementedError(): super("UnimplementedError");
-  bool matches(item, Map matchState) => item is UnimplementedError;
-}
-
-/** A matcher for UnsupportedError. */
-const isUnsupportedError = const _UnsupportedError();
-
-/** A matcher for functions that throw UnsupportedError. */
-const Matcher throwsUnsupportedError = const Throws(isUnsupportedError);
-
-class _UnsupportedError extends TypeMatcher {
-  const _UnsupportedError(): super("UnsupportedError");
-  bool matches(item, Map matchState) => item is UnsupportedError;
-}
-
-/** A matcher for StateErrors. */
-const isStateError = const _StateError();
-
-/** A matcher for functions that throw StateError. */
-const Matcher throwsStateError = const Throws(isStateError);
-
-class _StateError extends TypeMatcher {
-  const _StateError(): super("StateError");
-  bool matches(item, Map matchState) => item is StateError;
-}
-
-/** A matcher for FallThroughError. */
-const isFallThroughError = const _FallThroughError();
-
-/** A matcher for functions that throw FallThroughError. */
-const Matcher throwsFallThroughError = const Throws(isFallThroughError);
-
-class _FallThroughError extends TypeMatcher {
-  const _FallThroughError(): super("FallThroughError");
-  bool matches(item, Map matchState) => item is FallThroughError;
-}
-
-/** A matcher for NullThrownError. */
-const isNullThrownError = const _NullThrownError();
-
-/** A matcher for functions that throw NullThrownError. */
-const Matcher throwsNullThrownError = const Throws(isNullThrownError);
-
-class _NullThrownError extends TypeMatcher {
-  const _NullThrownError(): super("NullThrownError");
-  bool matches(item, Map matchState) => item is NullThrownError;
-}
-
-/** A matcher for ConcurrentModificationError. */
-const isConcurrentModificationError = const _ConcurrentModificationError();
-
-/** A matcher for functions that throw ConcurrentModificationError. */
-const Matcher throwsConcurrentModificationError =
-    const Throws(isConcurrentModificationError);
-
-class _ConcurrentModificationError extends TypeMatcher {
-  const _ConcurrentModificationError(): super("ConcurrentModificationError");
-  bool matches(item, Map matchState) => item is ConcurrentModificationError;
-}
-
-/** A matcher for AbstractClassInstantiationError. */
-const isAbstractClassInstantiationError =
-    const _AbstractClassInstantiationError();
-
-/** A matcher for functions that throw AbstractClassInstantiationError. */
-const Matcher throwsAbstractClassInstantiationError =
-    const Throws(isAbstractClassInstantiationError);
-
-class _AbstractClassInstantiationError extends TypeMatcher {
-  const _AbstractClassInstantiationError() :
-  super("AbstractClassInstantiationError");
-  bool matches(item, Map matchState) => item is AbstractClassInstantiationError;
-}
-
-/** A matcher for CyclicInitializationError. */
-const isCyclicInitializationError = const _CyclicInitializationError();
-
-/** A matcher for functions that throw CyclicInitializationError. */
-const Matcher throwsCyclicInitializationError =
-    const Throws(isCyclicInitializationError);
-
-class _CyclicInitializationError extends TypeMatcher {
-  const _CyclicInitializationError(): super("CyclicInitializationError");
-  bool matches(item, Map matchState) => item is CyclicInitializationError;
-}
-
-/** A matcher for Map types. */
-const isMap = const _IsMap();
+/// A matcher for Map types.
+const Matcher isMap = const _IsMap();
 
 class _IsMap extends TypeMatcher {
-  const _IsMap(): super("Map");
+  const _IsMap() : super("Map");
   bool matches(item, Map matchState) => item is Map;
 }
 
-/** A matcher for List types. */
-const isList = const _IsList();
+/// A matcher for List types.
+const Matcher isList = const _IsList();
 
 class _IsList extends TypeMatcher {
-  const _IsList(): super("List");
+  const _IsList() : super("List");
   bool matches(item, Map matchState) => item is List;
 }
 
-/**
- * Returns a matcher that matches if an object has a length property
- * that matches [matcher].
- */
+/// Returns a matcher that matches if an object has a length property
+/// that matches [matcher].
 Matcher hasLength(matcher) => new _HasLength(wrapMatcher(matcher));
 
 class _HasLength extends Matcher {
   final Matcher _matcher;
-  const _HasLength([Matcher matcher = null]): this._matcher = matcher;
+  const _HasLength([Matcher matcher = null]) : this._matcher = matcher;
 
   bool matches(item, Map matchState) {
     try {
@@ -722,18 +587,15 @@
   }
 }
 
-/**
- * Returns a matcher that matches if the match argument contains
- * the expected value. For [String]s this means substring matching;
- * for [Map]s it means the map has the key, and for [Iterable]s
- * (including [Iterable]s) it means the iterable has a matching
- * element. In the case of iterables, [expected] can itself be a
- * matcher.
- */
+/// Returns a matcher that matches if the match argument contains
+/// the expected value. For [String]s this means substring matching;
+/// for [Map]s it means the map has the key, and for [Iterable]s
+/// (including [Iterable]s) it means the iterable has a matching
+/// element. In the case of iterables, [expected] can itself be a
+/// matcher.
 Matcher contains(expected) => new _Contains(expected);
 
 class _Contains extends Matcher {
-
   final _expected;
 
   const _Contains(this._expected);
@@ -767,14 +629,11 @@
   }
 }
 
-/**
- * Returns a matcher that matches if the match argument is in
- * the expected value. This is the converse of [contains].
- */
+/// Returns a matcher that matches if the match argument is in
+/// the expected value. This is the converse of [contains].
 Matcher isIn(expected) => new _In(expected);
 
 class _In extends Matcher {
-
   final _expected;
 
   const _In(this._expected);
@@ -794,18 +653,17 @@
       description.add('is in ').addDescriptionOf(_expected);
 }
 
-/**
- * Returns a matcher that uses an arbitrary function that returns
- * true or false for the actual value. For example:
- *
- *     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
- */
-Matcher predicate(Function f, [description = 'satisfies function']) =>
+/// Returns a matcher that uses an arbitrary function that returns
+/// true or false for the actual value. For example:
+///
+///     expect(v, predicate((x) => ((x % 2) == 0), "is even"))
+Matcher predicate(bool f(value), [String description = 'satisfies function']) =>
     new _Predicate(f, description);
 
-class _Predicate extends Matcher {
+typedef bool _PredicateFunction(value);
 
-  final Function _matcher;
+class _Predicate extends Matcher {
+  final _PredicateFunction _matcher;
   final String _description;
 
   const _Predicate(this._matcher, this._description);
@@ -816,27 +674,25 @@
       description.add(_description);
 }
 
-/**
- * A useful utility class for implementing other matchers through inheritance.
- * Derived classes should call the base constructor with a feature name and
- * description, and an instance matcher, and should implement the
- * [featureValueOf] abstract method.
- *
- * The feature description will typically describe the item and the feature,
- * while the feature name will just name the feature. For example, we may
- * have a Widget class where each Widget has a price; we could make a
- * [CustomMatcher] that can make assertions about prices with:
- *
- *     class HasPrice extends CustomMatcher {
- *       const HasPrice(matcher) :
- *           super("Widget with price that is", "price", matcher);
- *       featureValueOf(actual) => actual.price;
- *     }
- *
- * and then use this for example like:
- *
- *      expect(inventoryItem, new HasPrice(greaterThan(0)));
- */
+/// A useful utility class for implementing other matchers through inheritance.
+/// Derived classes should call the base constructor with a feature name and
+/// description, and an instance matcher, and should implement the
+/// [featureValueOf] abstract method.
+///
+/// The feature description will typically describe the item and the feature,
+/// while the feature name will just name the feature. For example, we may
+/// have a Widget class where each Widget has a price; we could make a
+/// [CustomMatcher] that can make assertions about prices with:
+///
+///     class HasPrice extends CustomMatcher {
+///       const HasPrice(matcher) :
+///           super("Widget with price that is", "price", matcher);
+///       featureValueOf(actual) => actual.price;
+///     }
+///
+/// and then use this for example like:
+///
+///      expect(inventoryItem, new HasPrice(greaterThan(0)));
 class CustomMatcher extends Matcher {
   final String _featureDescription;
   final String _featureName;
@@ -845,7 +701,7 @@
   CustomMatcher(this._featureDescription, this._featureName, matcher)
       : this._matcher = wrapMatcher(matcher);
 
-  /** Override this to extract the interesting feature.*/
+  /// Override this to extract the interesting feature.
   featureValueOf(actual) => actual;
 
   bool matches(item, Map matchState) {
diff --git a/pkg/matcher/lib/src/description.dart b/pkg/matcher/lib/src/description.dart
index f8ebf09..f03934d 100644
--- a/pkg/matcher/lib/src/description.dart
+++ b/pkg/matcher/lib/src/description.dart
@@ -6,44 +6,39 @@
 
 import 'interfaces.dart';
 import 'pretty_print.dart';
-import 'utils.dart';
 
-/**
- * The default implementation of IDescription. This should rarely need
- * substitution, although conceivably it is a place where other languages
- * could be supported.
- */
+/// The default implementation of [Description]. This should rarely need
+/// substitution, although conceivably it is a place where other languages
+/// could be supported.
 class StringDescription implements Description {
-  var _out;
+  final StringBuffer _out = new StringBuffer();
 
-  /** Initialize the description with initial contents [init]. */
+  /// Initialize the description with initial contents [init].
   StringDescription([String init = '']) {
-    _out = init;
+    _out.write(init);
   }
 
   int get length => _out.length;
 
-  /** Get the description as a string. */
-  String toString() => _out;
+  /// Get the description as a string.
+  String toString() => _out.toString();
 
-  /** Append [text] to the description.  */
-  Description add(text) {
-    _out = '${_out}${text}';
+  /// Append [text] to the description.
+  Description add(String text) {
+    _out.write(text);
     return this;
   }
 
-  /** Change the value of the description. */
+  /// Change the value of the description.
   Description replace(String text) {
-    _out = text;
-    return this;
+    _out.clear();
+    return add(text);
   }
 
-  /**
-   * Appends a description of [value]. If it is an IMatcher use its
-   * describe method; if it is a string use its literal value after
-   * escaping any embedded control characters; otherwise use its
-   * toString() value and wrap it in angular "quotes".
-   */
+  /// Appends a description of [value]. If it is an IMatcher use its
+  /// describe method; if it is a string use its literal value after
+  /// escaping any embedded control characters; otherwise use its
+  /// toString() value and wrap it in angular "quotes".
   Description addDescriptionOf(value) {
     if (value is Matcher) {
       value.describe(this);
@@ -53,11 +48,9 @@
     return this;
   }
 
-  /**
-   * Append an [Iterable] [list] of objects to the description, using the
-   * specified [separator] and framing the list with [start]
-   * and [end].
-   */
+  /// Append an [Iterable] [list] of objects to the description, using the
+  /// specified [separator] and framing the list with [start]
+  /// and [end].
   Description addAll(String start, String separator, String end,
                        Iterable list) {
     var separate = false;
@@ -72,11 +65,4 @@
     add(end);
     return this;
   }
-
-  /** Escape the control characters in [string] so that they are visible. */
-  _addEscapedString(String string) {
-    add("'");
-    add(escapeString(string));
-    add("'");
-  }
 }
diff --git a/pkg/matcher/lib/src/expect.dart b/pkg/matcher/lib/src/expect.dart
index 2994163..073ef34 100644
--- a/pkg/matcher/lib/src/expect.dart
+++ b/pkg/matcher/lib/src/expect.dart
@@ -2,9 +2,13 @@
 // for 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 matcher;
+library matcher.expect;
 
-/** The objects thrown by the default failure handler. */
+import 'core_matchers.dart';
+import 'description.dart';
+import 'interfaces.dart';
+
+/// The objects thrown by the default failure handler.
 class TestFailure extends Error {
   final String message;
 
@@ -13,9 +17,7 @@
   String toString() => message;
 }
 
-/**
- * Useful utility for nesting match states.
- */
+/// Useful utility for nesting match states.
 
 void addStateInfo(Map matchState, Map values) {
   var innerState = new Map.from(matchState);
@@ -24,37 +26,33 @@
   matchState.addAll(values);
 }
 
-/**
- * Some matchers, like those for Futures and exception testing,
- * can fail in asynchronous sections, and throw exceptions.
- * A user of this library will typically want to catch and handle
- * such exceptions. The [wrapAsync] property is a function that
- * can wrap callbacks used by these Matchers so that they can be
- * used safely. For example, the unittest library will set this
- * to be `expectAsync`. By default this is an identity function.
- */
+/// Some matchers, like those for Futures and exception testing,
+/// can fail in asynchronous sections, and throw exceptions.
+/// A user of this library will typically want to catch and handle
+/// such exceptions. The [wrapAsync] property is a function that
+/// can wrap callbacks used by these Matchers so that they can be
+/// used safely. For example, the unittest library will set this
+/// to be `expectAsync`. By default this is an identity function.
 Function wrapAsync = (Function f, [id]) => f;
 
-/**
- * This is the main assertion function. It asserts that [actual]
- * matches the [matcher]. [reason] is optional and is typically not
- * supplied, as a reason is generated from the matcher; if [reason]
- * is included it is appended to the reason generated by the matcher.
- *
- * [matcher] can be a value in which case it will be wrapped in an
- * [equals] matcher.
- *
- * If the assertion fails, then the default behavior is to throw a
- * [TestFailure], but this behavior can be changed by calling
- * [configureExpectFailureHandler] and providing an alternative handler that
- * implements the [IFailureHandler] interface. It is also possible to
- * pass a [failureHandler] to [expect] as a final parameter for fine-
- * grained control.
- *
- * In some cases extra diagnostic info can be produced on failure (for
- * example, stack traces on mismatched exceptions). To enable these,
- * [verbose] should be specified as true;
- */
+/// This is the main assertion function. It asserts that [actual]
+/// matches the [matcher]. [reason] is optional and is typically not
+/// supplied, as a reason is generated from the matcher; if [reason]
+/// is included it is appended to the reason generated by the matcher.
+///
+/// [matcher] can be a value in which case it will be wrapped in an
+/// [equals] matcher.
+///
+/// If the assertion fails, then the default behavior is to throw a
+/// [TestFailure], but this behavior can be changed by calling
+/// [configureExpectFailureHandler] and providing an alternative handler that
+/// implements the [IFailureHandler] interface. It is also possible to
+/// pass a [failureHandler] to [expect] as a final parameter for fine-
+/// grained control.
+///
+/// In some cases extra diagnostic info can be produced on failure (for
+/// example, stack traces on mismatched exceptions). To enable these,
+/// [verbose] should be specified as true;
 void expect(actual, matcher, {String reason, FailureHandler failureHandler,
             bool verbose : false}) {
   matcher = wrapMatcher(matcher);
@@ -83,12 +81,10 @@
   failureHandler.fail(message);
 }
 
-/**
- * Takes an argument and returns an equivalent matcher.
- * If the argument is already a matcher this does nothing,
- * else if the argument is a function, it generates a predicate
- * function matcher, else it generates an equals matcher.
- */
+/// Takes an argument and returns an equivalent matcher.
+/// If the argument is already a matcher this does nothing,
+/// else if the argument is a function, it generates a predicate
+/// function matcher, else it generates an equals matcher.
 Matcher wrapMatcher(x) {
   if (x is Matcher) {
     return x;
@@ -118,12 +114,10 @@
   }
 }
 
-/**
- * Changes or resets to the default the failure handler for expect()
- * [handler] is a reference to the new handler; if this is omitted
- * or null then the failure handler is reset to the default, which
- * throws [TestFailure]s on [expect] assertion failures.
- */
+/// Changes or resets to the default the failure handler for expect()
+/// [handler] is a reference to the new handler; if this is omitted
+/// or null then the failure handler is reset to the default, which
+/// throws [TestFailure]s on [expect] assertion failures.
 void configureExpectFailureHandler([FailureHandler handler = null]) {
   if (handler == null) {
     handler = new DefaultFailureHandler();
@@ -160,17 +154,14 @@
   return description.toString();
 }
 
-/**
- * Changes or resets to default the failure message formatter for expect().
- * [formatter] is a reference to the new formatter; if this is omitted or
- * null then the failure formatter is reset to the default. The new
- * formatter is returned; this allows custom expect handlers to easily
- * get a reference to the default formatter.
- */
+/// Changes or resets to default the failure message formatter for expect().
+/// [formatter] is a reference to the new formatter; if this is omitted or
+/// null then the failure formatter is reset to the default. The new
+/// formatter is returned; this allows custom expect handlers to easily
+/// get a reference to the default formatter.
 ErrorFormatter configureExpectFormatter([ErrorFormatter formatter = null]) {
   if (formatter == null) {
     formatter = _defaultErrorFormatter;
   }
   return _assertErrorFormatter = formatter;
 }
-
diff --git a/pkg/matcher/lib/src/future_matchers.dart b/pkg/matcher/lib/src/future_matchers.dart
index c9e2742e..4c5a391 100644
--- a/pkg/matcher/lib/src/future_matchers.dart
+++ b/pkg/matcher/lib/src/future_matchers.dart
@@ -2,31 +2,33 @@
 // for 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 matcher;
+library matcher.future_matchers;
 
-/**
- * Matches a [Future] that completes successfully with a value. Note that this
- * creates an asynchronous expectation. The call to `expect()` that includes
- * this will return immediately and execution will continue. Later, when the
- * future completes, the actual expectation will run.
- *
- * To test that a Future completes with an exception, you can use [throws] and
- * [throwsA].
- */
+import 'dart:async';
+
+import 'core_matchers.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Matches a [Future] that completes successfully with a value. Note that this
+/// creates an asynchronous expectation. The call to `expect()` that includes
+/// this will return immediately and execution will continue. Later, when the
+/// future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
 final Matcher completes = const _Completes(null, '');
 
-/**
- * Matches a [Future] that completes succesfully with a value that matches
- * [matcher]. Note that this creates an asynchronous expectation. The call to
- * `expect()` that includes this will return immediately and execution will
- * continue. Later, when the future completes, the actual expectation will run.
- *
- * To test that a Future completes with an exception, you can use [throws] and
- * [throwsA].
- *
- * [id] is an optional tag that can be used to identify the completion matcher
- * in error messages.
- */
+/// Matches a [Future] that completes succesfully with a value that matches
+/// [matcher]. Note that this creates an asynchronous expectation. The call to
+/// `expect()` that includes this will return immediately and execution will
+/// continue. Later, when the future completes, the actual expectation will run.
+///
+/// To test that a Future completes with an exception, you can use [throws] and
+/// [throwsA].
+///
+/// [id] is an optional tag that can be used to identify the completion matcher
+/// in error messages.
 Matcher completion(matcher, [String id = '']) =>
     new _Completes(wrapMatcher(matcher), id);
 
diff --git a/pkg/matcher/lib/src/interfaces.dart b/pkg/matcher/lib/src/interfaces.dart
index 71079e5..9fc1107 100644
--- a/pkg/matcher/lib/src/interfaces.dart
+++ b/pkg/matcher/lib/src/interfaces.dart
@@ -7,97 +7,80 @@
 // To decouple the reporting of errors, and allow for extensibility of
 // matchers, we make use of some interfaces.
 
-/**
- * The ErrorFormatter type is used for functions that
- * can be used to build up error reports upon [expect] failures.
- * There is one built-in implementation ([defaultErrorFormatter])
- * which is used by the default failure handler. If the failure handler
- * is replaced it may be desirable to replace the [stringDescription]
- * error formatter with another.
- */
+/// The ErrorFormatter type is used for functions that
+/// can be used to build up error reports upon [expect] failures.
+/// There is one built-in implementation ([defaultErrorFormatter])
+/// which is used by the default failure handler. If the failure handler
+/// is replaced it may be desirable to replace the [stringDescription]
+/// error formatter with another.
 typedef String ErrorFormatter(actual, Matcher matcher, String reason,
     Map matchState, bool verbose);
 
-/**
- * Matchers build up their error messages by appending to
- * Description objects. This interface is implemented by
- * StringDescription. This interface is unlikely to need
- * other implementations, but could be useful to replace in
- * some cases - e.g. language conversion.
- */
+/// Matchers build up their error messages by appending to
+/// Description objects. This interface is implemented by
+/// StringDescription. This interface is unlikely to need
+/// other implementations, but could be useful to replace in
+/// some cases - e.g. language conversion.
 abstract class Description {
   int get length;
 
-  /** Change the value of the description. */
+  /// Change the value of the description.
   Description replace(String text);
 
-  /** This is used to add arbitrary text to the description. */
+  /// This is used to add arbitrary text to the description.
   Description add(String text);
 
-  /** This is used to add a meaningful description of a value. */
+  /// This is used to add a meaningful description of a value.
   Description addDescriptionOf(value);
 
-  /**
-   * This is used to add a description of an [Iterable] [list],
-   * with appropriate [start] and [end] markers and inter-element [separator].
-   */
+  /// This is used to add a description of an [Iterable] [list],
+  /// with appropriate [start] and [end] markers and inter-element [separator].
   Description addAll(String start, String separator, String end, Iterable list);
 }
 
-/**
- * [expect] Matchers must implement/extend the Matcher class.
- * The base Matcher class has a generic implementation of [describeMismatch]
- * so this does not need to be provided unless a more clear description is
- * required. The other two methods ([matches] and [describe])
- * must always be provided as they are highly matcher-specific.
- */
+/// [expect] Matchers must implement/extend the Matcher class.
+/// The base Matcher class has a generic implementation of [describeMismatch]
+/// so this does not need to be provided unless a more clear description is
+/// required. The other two methods ([matches] and [describe])
+/// must always be provided as they are highly matcher-specific.
 abstract class Matcher {
   const Matcher();
 
-  /**
-   * This does the matching of the actual vs expected values.
-   * [item] is the actual value. [matchState] can be supplied
-   * and may be used to add details about the mismatch that are too
-   * costly to determine in [describeMismatch].
-   */
+  /// This does the matching of the actual vs expected values.
+  /// [item] is the actual value. [matchState] can be supplied
+  /// and may be used to add details about the mismatch that are too
+  /// costly to determine in [describeMismatch].
   bool matches(item, Map matchState);
 
-  /** This builds a textual description of the matcher. */
+  /// This builds a textual description of the matcher.
   Description describe(Description description);
 
-  /**
-   * This builds a textual description of a specific mismatch. [item]
-   * is the value that was tested by [matches]; [matchState] is
-   * the [Map] that was passed to and supplemented by [matches]
-   * with additional information about the mismact, and [mismatchDescription]
-   * is the [Description] that is being built to decribe the mismatch.
-   * A few matchers make use of the [verbose] flag to provide detailed
-   * information that is not typically included but can be of help in
-   * diagnosing failures, such as stack traces.
-   */
+  /// This builds a textual description of a specific mismatch. [item]
+  /// is the value that was tested by [matches]; [matchState] is
+  /// the [Map] that was passed to and supplemented by [matches]
+  /// with additional information about the mismact, and [mismatchDescription]
+  /// is the [Description] that is being built to decribe the mismatch.
+  /// A few matchers make use of the [verbose] flag to provide detailed
+  /// information that is not typically included but can be of help in
+  /// diagnosing failures, such as stack traces.
   Description describeMismatch(item, Description mismatchDescription,
       Map matchState, bool verbose) => mismatchDescription;
 }
 
-/**
- * Failed matches are reported using a default IFailureHandler.
- * The default implementation simply throws [TestFailure]s;
- * this can be replaced by some other implementation of
- * IFailureHandler by calling configureExpectHandler.
- */
+/// Failed matches are reported using a default IFailureHandler.
+/// The default implementation simply throws [TestFailure]s;
+/// this can be replaced by some other implementation of
+/// IFailureHandler by calling configureExpectHandler.
 abstract class FailureHandler {
-  /** This handles failures given a textual decription */
+  /// This handles failures given a textual decription
   void fail(String reason);
 
-  /**
-   * This handles failures given the actual [value], the [matcher]
-   * the [reason] (argument from [expect]), some additonal [matchState]
-   * generated by the [matcher], and a verbose flag which controls in
-   * some cases how much [matchState] information is used. It will use
-   * these to create a detailed error message (typically by calling
-   * an [ErrorFormatter]) and then call [fail] with this message.
-   */
+  /// This handles failures given the actual [value], the [matcher]
+  /// the [reason] (argument from [expect]), some additonal [matchState]
+  /// generated by the [matcher], and a verbose flag which controls in
+  /// some cases how much [matchState] information is used. It will use
+  /// these to create a detailed error message (typically by calling
+  /// an [ErrorFormatter]) and then call [fail] with this message.
   void failMatch(actual, Matcher matcher, String reason,
                  Map matchState, bool verbose);
 }
-
diff --git a/pkg/matcher/lib/src/iterable_matchers.dart b/pkg/matcher/lib/src/iterable_matchers.dart
index 1922aa1..ef7afb0 100644
--- a/pkg/matcher/lib/src/iterable_matchers.dart
+++ b/pkg/matcher/lib/src/iterable_matchers.dart
@@ -2,16 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.iterable_matchers;
 
-/**
- * Returns a matcher which matches [Iterable]s in which all elements
- * match the given [matcher].
- */
+import 'core_matchers.dart';
+import 'description.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher which matches [Iterable]s in which all elements
+/// match the given [matcher].
 Matcher everyElement(matcher) => new _EveryElement(wrapMatcher(matcher));
 
 class _EveryElement extends _IterableMatcher {
-  Matcher _matcher;
+  final Matcher _matcher;
 
   _EveryElement(Matcher this._matcher);
 
@@ -41,10 +44,10 @@
       mismatchDescription.add('has value ').addDescriptionOf(element).
           add(' which ');
       var subDescription = new StringDescription();
-      _matcher.describeMismatch(element, subDescription,
-            matchState['state'], verbose);
+      _matcher.describeMismatch(element, subDescription, matchState['state'],
+          verbose);
       if (subDescription.length > 0) {
-        mismatchDescription.add(subDescription);
+        mismatchDescription.add(subDescription.toString());
       } else {
         mismatchDescription.add("doesn't match ");
         _matcher.describe(mismatchDescription);
@@ -57,14 +60,12 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s in which at least one
- * element matches the given [matcher].
- */
+/// Returns a matcher which matches [Iterable]s in which at least one
+/// element matches the given [matcher].
 Matcher anyElement(matcher) => new _AnyElement(wrapMatcher(matcher));
 
 class _AnyElement extends _IterableMatcher {
-  Matcher _matcher;
+  final Matcher _matcher;
 
   _AnyElement(this._matcher);
 
@@ -76,11 +77,9 @@
       description.add('some element ').addDescriptionOf(_matcher);
 }
 
-/**
- * Returns a matcher which matches [Iterable]s that have the same
- * length and the same elements as [expected], and in the same order.
- * This is equivalent to equals but does not recurse.
- */
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], and in the same order.
+/// This is equivalent to equals but does not recurse.
 
 Matcher orderedEquals(Iterable expected) => new _OrderedEquals(expected);
 
@@ -109,12 +108,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s that have the same
- * length and the same elements as [expected], but not necessarily in
- * the same order. Note that this is O(n^2) so should only be used on
- * small objects.
- */
+/// Returns a matcher which matches [Iterable]s that have the same
+/// length and the same elements as [expected], but not necessarily in
+/// the same order. Note that this is O(n^2) so should only be used on
+/// small objects.
 Matcher unorderedEquals(Iterable expected) => new _UnorderedEquals(expected);
 
 class _UnorderedEquals extends _UnorderedMatches {
@@ -131,10 +128,8 @@
         .add(' unordered');
 }
 
-/**
- * Iterable matchers match against [Iterable]s. We add this intermediate
- * class to give better mismatch error messages than the base Matcher class.
- */
+/// Iterable matchers match against [Iterable]s. We add this intermediate
+/// class to give better mismatch error messages than the base Matcher class.
 abstract class _IterableMatcher extends Matcher {
   const _IterableMatcher();
   Description describeMismatch(item, Description mismatchDescription,
@@ -150,12 +145,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches [Iterable]s whose elements match the matchers
- * in [expected], but not necessarily in the same order.
- *
- *  Note that this is `O(n^2)` and so should only be used on small objects.
- */
+/// Returns a matcher which matches [Iterable]s whose elements match the
+/// matchers in [expected], but not necessarily in the same order.
+///
+///  Note that this is `O(n^2)` and so should only be used on small objects.
 Matcher unorderedMatches(Iterable expected) => new _UnorderedMatches(expected);
 
 class _UnorderedMatches extends Matcher {
@@ -216,20 +209,20 @@
       mismatchDescription.add(_test(item));
 }
 
-/**
- * A pairwise matcher for iterable. You can pass an arbitrary [comparator]
- * function that takes an expected and actual argument which will be applied
- * to each pair in order. [description]  should be a meaningful name for
- * the comparator.
- */
-Matcher pairwiseCompare(Iterable expected, Function comparator,
+/// A pairwise matcher for iterable. You can pass an arbitrary [comparator]
+/// function that takes an expected and actual argument which will be applied
+/// to each pair in order. [description]  should be a meaningful name for
+/// the comparator.
+Matcher pairwiseCompare(Iterable expected, bool comparator(a, b),
     String description) =>
         new _PairwiseCompare(expected, comparator, description);
 
+typedef bool _Comparator(a, b);
+
 class _PairwiseCompare extends _IterableMatcher {
-  Iterable _expected;
-  Function _comparator;
-  String _description;
+  final Iterable _expected;
+  final _Comparator _comparator;
+  final String _description;
 
   _PairwiseCompare(this._expected, this._comparator, this._description);
 
@@ -270,4 +263,3 @@
     }
   }
 }
-
diff --git a/pkg/matcher/lib/src/map_matchers.dart b/pkg/matcher/lib/src/map_matchers.dart
index 033e906..a560e50 100644
--- a/pkg/matcher/lib/src/map_matchers.dart
+++ b/pkg/matcher/lib/src/map_matchers.dart
@@ -2,11 +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 matcher;
+library matcher.map_matchers;
 
-/**
- * Returns a matcher which matches maps containing the given [value].
- */
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// Returns a matcher which matches maps containing the given [value].
 Matcher containsValue(value) => new _ContainsValue(value);
 
 class _ContainsValue extends Matcher {
@@ -19,10 +20,8 @@
       description.add('contains value ').addDescriptionOf(_value);
 }
 
-/**
- * Returns a matcher which matches maps containing the key-value pair
- * with [key] => [value].
- */
+/// Returns a matcher which matches maps containing the key-value pair
+/// with [key] => [value].
 Matcher containsPair(key, value) =>
     new _ContainsMapping(key, wrapMatcher(value));
 
diff --git a/pkg/matcher/lib/src/numeric_matchers.dart b/pkg/matcher/lib/src/numeric_matchers.dart
index 507a682..ae0b0ad 100644
--- a/pkg/matcher/lib/src/numeric_matchers.dart
+++ b/pkg/matcher/lib/src/numeric_matchers.dart
@@ -2,73 +2,55 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.numeric_matchers;
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than the given [value].
- */
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is greater
+/// than the given [value].
 Matcher greaterThan(value) =>
   new _OrderingComparison(value, false, false, true, 'a value greater than');
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to the given [value].
- */
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to the given [value].
 Matcher greaterThanOrEqualTo(value) =>
   new _OrderingComparison(value, true, false, true,
       'a value greater than or equal to');
 
-/**
- * Returns a matcher which matches if the match argument is less
- * than the given [value].
- */
+/// Returns a matcher which matches if the match argument is less
+/// than the given [value].
 Matcher lessThan(value) =>
   new _OrderingComparison(value, false, true, false, 'a value less than');
 
-/**
- * Returns a matcher which matches if the match argument is less
- * than or equal to the given [value].
- */
+/// Returns a matcher which matches if the match argument is less
+/// than or equal to the given [value].
 Matcher lessThanOrEqualTo(value) =>
   new _OrderingComparison(value, true, true, false,
       'a value less than or equal to');
 
-/**
- * A matcher which matches if the match argument is zero.
- */
+/// A matcher which matches if the match argument is zero.
 const Matcher isZero =
   const _OrderingComparison(0, true, false, false, 'a value equal to');
 
 
-/**
- * A matcher which matches if the match argument is non-zero.
- */
+/// A matcher which matches if the match argument is non-zero.
 const Matcher isNonZero =
   const _OrderingComparison(0, false, true, true, 'a value not equal to');
 
-/**
- * A matcher which matches if the match argument is positive.
- */
+/// A matcher which matches if the match argument is positive.
 const Matcher isPositive =
   const _OrderingComparison(0, false, false, true, 'a positive value', false);
 
-/**
- * A matcher which matches if the match argument is zero or negative.
- */
+/// A matcher which matches if the match argument is zero or negative.
 const Matcher isNonPositive =
   const _OrderingComparison(0, true, true, false,
       'a non-positive value', false);
 
-/**
- * A matcher which matches if the match argument is negative.
- */
+/// A matcher which matches if the match argument is negative.
 const Matcher isNegative =
   const _OrderingComparison(0, false, true, false, 'a negative value', false);
 
-/**
- * A matcher which matches if the match argument is zero or positive.
- */
+/// A matcher which matches if the match argument is zero or positive.
 const Matcher isNonNegative =
   const _OrderingComparison(0, true, false, true,
       'a non-negative value', false);
@@ -77,18 +59,20 @@
   return value is num;
 }
 
+// TODO(kevmoo) Note that matchers that use _OrderingComparison only use
+// `==` and `<` operators to evaluate the match. Or change the matcher.
 class _OrderingComparison extends Matcher {
-  /** Expected value. */
+  /// Expected value.
   final _value;
-  /** What to return if actual == expected */
+  /// What to return if actual == expected
   final bool _equalValue;
-  /** What to return if actual < expected */
+  /// What to return if actual < expected
   final bool _lessThanValue;
-  /** What to return if actual > expected */
+  /// What to return if actual > expected
   final bool _greaterThanValue;
-  /** Textual name of the inequality */
+  /// Textual name of the inequality
   final String _comparisonDescription;
-  /** Whether to include the expected value in the description */
+  /// Whether to include the expected value in the description
   final bool _valueInDescription;
 
   const _OrderingComparison(
@@ -97,7 +81,7 @@
     this._lessThanValue,
     this._greaterThanValue,
     this._comparisonDescription,
-    [valueInDescription = true]) :
+    [bool valueInDescription = true]) :
       this._valueInDescription = valueInDescription;
 
   bool matches(item, Map matchState) {
@@ -126,12 +110,10 @@
   }
 }
 
-/**
- * Returns a matcher which matches if the match argument is within [delta]
- * of some [value]; i.e. if the match argument is greater than
- * than or equal [value]-[delta] and less than or equal to [value]+[delta].
- */
-Matcher closeTo(value, delta) => new _IsCloseTo(value, delta);
+/// Returns a matcher which matches if the match argument is within [delta]
+/// of some [value]; i.e. if the match argument is greater than
+/// than or equal [value]-[delta] and less than or equal to [value]+[delta].
+Matcher closeTo(num value, num delta) => new _IsCloseTo(value, delta);
 
 class _IsCloseTo extends Matcher {
   final num _value, _delta;
@@ -167,29 +149,25 @@
   }
 }
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to [low] and less than or equal to [high].
- */
-Matcher inInclusiveRange(low, high) => new _InRange(low, high, true, true);
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to [low] and less than or equal to [high].
+Matcher inInclusiveRange(num low, num high) =>
+    new _InRange(low, high, true, true);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than [low] and less than [high].
- */
-Matcher inExclusiveRange(low, high) => new _InRange(low, high, false, false);
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than [high].
+Matcher inExclusiveRange(num low, num high) =>
+    new _InRange(low, high, false, false);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than [low] and less than or equal to [high].
- */
-Matcher inOpenClosedRange(low, high) => new _InRange(low, high, false, true);
+/// Returns a matcher which matches if the match argument is greater
+/// than [low] and less than or equal to [high].
+Matcher inOpenClosedRange(num low, num high) =>
+    new _InRange(low, high, false, true);
 
-/**
- * Returns a matcher which matches if the match argument is greater
- * than or equal to a [low] and less than [high].
- */
-Matcher inClosedOpenRange(low, high) => new _InRange(low, high, true, false);
+/// Returns a matcher which matches if the match argument is greater
+/// than or equal to a [low] and less than [high].
+Matcher inClosedOpenRange(num low, num high) =>
+    new _InRange(low, high, true, false);
 
 class _InRange extends Matcher {
   final num _low, _high;
@@ -231,4 +209,3 @@
     }
   }
 }
-
diff --git a/pkg/matcher/lib/src/operator_matchers.dart b/pkg/matcher/lib/src/operator_matchers.dart
index fa17aba..fb79e8f 100644
--- a/pkg/matcher/lib/src/operator_matchers.dart
+++ b/pkg/matcher/lib/src/operator_matchers.dart
@@ -2,11 +2,13 @@
 // for 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 matcher;
+library matcher.operator_matchers;
 
-/**
- * This returns a matcher that inverts [matcher] to its logical negation.
- */
+import 'core_matchers.dart';
+import 'expect.dart';
+import 'interfaces.dart';
+
+/// This returns a matcher that inverts [matcher] to its logical negation.
 Matcher isNot(matcher) => new _IsNot(wrapMatcher(matcher));
 
 class _IsNot extends Matcher {
@@ -20,13 +22,11 @@
     description.add('not ').addDescriptionOf(_matcher);
 }
 
-/**
- * This returns a matcher that matches if all of the matchers passed as
- * arguments (up to 7) match. Instead of passing the matchers separately
- * they can be passed as a single List argument.
- * Any argument that is not a matcher is implicitly wrapped in a
- * Matcher to check for equality.
-*/
+/// This returns a matcher that matches if all of the matchers passed as
+/// arguments (up to 7) match. Instead of passing the matchers separately
+/// they can be passed as a single List argument.
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
 Matcher allOf(arg0,
              [arg1 = null,
               arg2 = null,
@@ -34,46 +34,11 @@
               arg4 = null,
               arg5 = null,
               arg6 = null]) {
-  if (arg0 is List) {
-    expect(arg1, isNull);
-    expect(arg2, isNull);
-    expect(arg3, isNull);
-    expect(arg4, isNull);
-    expect(arg5, isNull);
-    expect(arg6, isNull);
-    for (int i = 0; i < arg0.length; i++) {
-      arg0[i] = wrapMatcher(arg0[i]);
-    }
-    return new _AllOf(arg0);
-  } else {
-    List matchers = new List();
-    if (arg0 != null) {
-      matchers.add(wrapMatcher(arg0));
-    }
-    if (arg1 != null) {
-      matchers.add(wrapMatcher(arg1));
-    }
-    if (arg2 != null) {
-      matchers.add(wrapMatcher(arg2));
-    }
-    if (arg3 != null) {
-      matchers.add(wrapMatcher(arg3));
-    }
-    if (arg4 != null) {
-      matchers.add(wrapMatcher(arg4));
-    }
-    if (arg5 != null) {
-      matchers.add(wrapMatcher(arg5));
-    }
-    if (arg6 != null) {
-      matchers.add(wrapMatcher(arg6));
-    }
-    return new _AllOf(matchers);
-  }
+  return new _AllOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
 class _AllOf extends Matcher {
-  final Iterable<Matcher> _matchers;
+  final List<Matcher> _matchers;
 
   const _AllOf(this._matchers);
 
@@ -99,17 +64,15 @@
       description.addAll('(', ' and ', ')', _matchers);
 }
 
-/**
- * Matches if any of the given matchers evaluate to true. The
- * arguments can be a set of matchers as separate parameters
- * (up to 7), or a List of matchers.
- *
- * The matchers are evaluated from left to right using short-circuit
- * evaluation, so evaluation stops as soon as a matcher returns true.
- *
- * Any argument that is not a matcher is implicitly wrapped in a
- * Matcher to check for equality.
-*/
+/// Matches if any of the given matchers evaluate to true. The
+/// arguments can be a set of matchers as separate parameters
+/// (up to 7), or a List of matchers.
+///
+/// The matchers are evaluated from left to right using short-circuit
+/// evaluation, so evaluation stops as soon as a matcher returns true.
+///
+/// Any argument that is not a matcher is implicitly wrapped in a
+/// Matcher to check for equality.
 
 Matcher anyOf(arg0,
                [arg1 = null,
@@ -118,59 +81,62 @@
                 arg4 = null,
                 arg5 = null,
                 arg6 = null]) {
-  if (arg0 is List) {
-    expect(arg1, isNull);
-    expect(arg2, isNull);
-    expect(arg3, isNull);
-    expect(arg4, isNull);
-    expect(arg5, isNull);
-    expect(arg6, isNull);
-    for (int i = 0; i < arg0.length; i++) {
-      arg0[i] = wrapMatcher(arg0[i]);
-    }
-    return new _AnyOf(arg0);
-  } else {
-    List matchers = new List();
-    if (arg0 != null) {
-      matchers.add(wrapMatcher(arg0));
-    }
-    if (arg1 != null) {
-      matchers.add(wrapMatcher(arg1));
-    }
-    if (arg2 != null) {
-      matchers.add(wrapMatcher(arg2));
-    }
-    if (arg3 != null) {
-      matchers.add(wrapMatcher(arg3));
-    }
-    if (arg4 != null) {
-      matchers.add(wrapMatcher(arg4));
-    }
-    if (arg5 != null) {
-      matchers.add(wrapMatcher(arg5));
-    }
-    if (arg6 != null) {
-      matchers.add(wrapMatcher(arg6));
-    }
-    return new _AnyOf(matchers);
-  }
+  return new _AnyOf(_wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6));
 }
 
 class _AnyOf extends Matcher {
-  final Iterable<Matcher> _matchers;
+  final List<Matcher> _matchers;
 
   const _AnyOf(this._matchers);
 
   bool matches(item, Map matchState) {
-     for (var matcher in _matchers) {
-       if (matcher.matches(item, matchState)) {
-         return true;
-       }
-     }
-     return false;
+    for (var matcher in _matchers) {
+      if (matcher.matches(item, matchState)) {
+        return true;
+      }
+    }
+    return false;
   }
 
   Description describe(Description description) =>
     description.addAll('(', ' or ', ')', _matchers);
 }
 
+List<Matcher> _wrapArgs(arg0, arg1, arg2, arg3, arg4, arg5, arg6) {
+  if (arg0 is List) {
+    // TODO(kevmoo) throw a more helpful error here if any of these args is
+    // not null
+    expect(arg1, isNull);
+    expect(arg2, isNull);
+    expect(arg3, isNull);
+    expect(arg4, isNull);
+    expect(arg5, isNull);
+    expect(arg6, isNull);
+
+    return arg0.map((a) => wrapMatcher(a)).toList();
+  }
+
+  List matchers = new List();
+  if (arg0 != null) {
+    matchers.add(wrapMatcher(arg0));
+  }
+  if (arg1 != null) {
+    matchers.add(wrapMatcher(arg1));
+  }
+  if (arg2 != null) {
+    matchers.add(wrapMatcher(arg2));
+  }
+  if (arg3 != null) {
+    matchers.add(wrapMatcher(arg3));
+  }
+  if (arg4 != null) {
+    matchers.add(wrapMatcher(arg4));
+  }
+  if (arg5 != null) {
+    matchers.add(wrapMatcher(arg5));
+  }
+  if (arg6 != null) {
+    matchers.add(wrapMatcher(arg6));
+  }
+  return matchers;
+}
diff --git a/pkg/matcher/lib/src/pretty_print.dart b/pkg/matcher/lib/src/pretty_print.dart
index 7deae06..eb13448 100644
--- a/pkg/matcher/lib/src/pretty_print.dart
+++ b/pkg/matcher/lib/src/pretty_print.dart
@@ -6,19 +6,16 @@
 
 import 'description.dart';
 import 'interfaces.dart';
-import 'utils.dart';
 
-/**
- * Returns a pretty-printed representation of [object].
- *
- * If [maxLineLength] is passed, this will attempt to ensure that each line is
- * no longer than [maxLineLength] characters long. This isn't guaranteed, since
- * individual objects may have string representations that are too long, but
- * most lines will be less than [maxLineLength] long.
- *
- * If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
- * [maxItems] members or key/value pairs, respectively.
- */
+/// Returns a pretty-printed representation of [object].
+///
+/// If [maxLineLength] is passed, this will attempt to ensure that each line is
+/// no longer than [maxLineLength] characters long. This isn't guaranteed, since
+/// individual objects may have string representations that are too long, but
+/// most lines will be less than [maxLineLength] long.
+///
+/// If [maxItems] is passed, [Iterable]s and [Map]s will only print their first
+/// [maxItems] members or key/value pairs, respectively.
 String prettyPrint(object, {int maxLineLength, int maxItems}) {
   String _prettyPrint(object, int indent, Set seen, bool top) {
     // If the object is a matcher, use its description.
@@ -35,7 +32,7 @@
 
     if (object is Iterable) {
       // Print the type name for non-List iterables.
-      var type = object is List ? "" : typeName(object) + ":";
+      var type = object is List ? "" : _typeName(object) + ":";
 
       // Truncate the list of strings if it's longer than [maxItems].
       var strings = object.map(pp).toList();
@@ -83,7 +80,7 @@
     } else if (object is String) {
       // Escape strings and print each line on its own line.
       var lines = object.split("\n");
-      return "'" + lines.map(escapeString)
+      return "'" + lines.map(_escapeString)
           .join("\\n'\n${_indent(indent + 2)}'") + "'";
     } else {
       var value = object.toString().replaceAll("\n", _indent(indent) + "\n");
@@ -100,7 +97,7 @@
           object == null || defaultToString) {
         return value;
       } else {
-        return "${typeName(object)}:$value";
+        return "${_typeName(object)}:$value";
       }
     }
   }
@@ -109,3 +106,42 @@
 }
 
 String _indent(int length) => new List.filled(length, ' ').join('');
+
+/// Returns the name of the type of [x], or "Unknown" if the type name can't be
+/// determined.
+String _typeName(x) {
+  // dart2js blows up on some objects (e.g. window.navigator).
+  // So we play safe here.
+  try {
+    if (x == null) return "null";
+    var type = x.runtimeType.toString();
+    // TODO(nweiz): if the object's type is private, find a public superclass to
+    // display once there's a portable API to do that.
+    return type.startsWith("_") ? "?" : type;
+  } catch (e) {
+    return "?";
+  }
+}
+
+/// Returns [source] with any control characters replaced by their escape
+/// sequences.
+///
+/// This doesn't add quotes to the string, but it does escape single quote
+/// characters so that single quotes can be applied externally.
+String _escapeString(String source) =>
+  source.split("").map(_escapeChar).join("");
+
+/// Return the escaped form of a character [ch].
+String _escapeChar(String ch) {
+  if (ch == "'")
+    return "\\'";
+  else if (ch == '\n')
+    return '\\n';
+  else if (ch == '\r')
+    return '\\r';
+  else if (ch == '\t')
+    return '\\t';
+  else
+    return ch;
+}
+
diff --git a/pkg/matcher/lib/src/string_matchers.dart b/pkg/matcher/lib/src/string_matchers.dart
index f5e32ff..c498446 100644
--- a/pkg/matcher/lib/src/string_matchers.dart
+++ b/pkg/matcher/lib/src/string_matchers.dart
@@ -2,21 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-part of matcher;
+library matcher.string_matchers;
 
-/**
- * Returns a matcher which matches if the match argument is a string and
- * is equal to [value] when compared case-insensitively.
- */
+import 'interfaces.dart';
+
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared case-insensitively.
 Matcher equalsIgnoringCase(String value) => new _IsEqualIgnoringCase(value);
 
 class _IsEqualIgnoringCase extends _StringMatcher {
   final String _value;
-  String _matchValue;
+  final String _matchValue;
 
-  _IsEqualIgnoringCase(this._value) {
-    _matchValue = _value.toLowerCase();
-  }
+  _IsEqualIgnoringCase(String value)
+      : _value = value,
+        _matchValue = value.toLowerCase();
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == item.toLowerCase();
@@ -25,24 +25,22 @@
       description.addDescriptionOf(_value).add(' ignoring case');
 }
 
-/**
- * Returns a matcher which matches if the match argument is a string and
- * is equal to [value] when compared with all runs of whitespace
- * collapsed to single spaces and leading and trailing whitespace removed.
- *
- * For example, `equalsIgnoringCase("hello world")` will match
- * "hello   world", "  hello world" and "hello world  ".
- */
-Matcher equalsIgnoringWhitespace(_string) =>
-    new _IsEqualIgnoringWhitespace(_string);
+/// Returns a matcher which matches if the match argument is a string and
+/// is equal to [value] when compared with all runs of whitespace
+/// collapsed to single spaces and leading and trailing whitespace removed.
+///
+/// For example, `equalsIgnoringCase("hello world")` will match
+/// "hello   world", "  hello world" and "hello world  ".
+Matcher equalsIgnoringWhitespace(String string) =>
+    new _IsEqualIgnoringWhitespace(string);
 
 class _IsEqualIgnoringWhitespace extends _StringMatcher {
   final String _value;
-  String _matchValue;
+  final String _matchValue;
 
-  _IsEqualIgnoringWhitespace(this._value) {
-    _matchValue = collapseWhitespace(_value);
-  }
+  _IsEqualIgnoringWhitespace(String value)
+      : _value = value,
+        _matchValue = collapseWhitespace(value);
 
   bool matches(item, Map matchState) =>
       item is String && _matchValue == collapseWhitespace(item);
@@ -63,33 +61,8 @@
   }
 }
 
-/**
- * Utility function to collapse whitespace runs to single spaces
- * and strip leading/trailing whitespace.
- */
-String collapseWhitespace(_string) {
-  bool isWhitespace(String ch) => (' \n\r\t'.indexOf(ch) >= 0);
-  StringBuffer result = new StringBuffer();
-  bool skipSpace = true;
-  for (var i = 0; i < _string.length; i++) {
-    var character = _string[i];
-    if (isWhitespace(character)) {
-      if (!skipSpace) {
-        result.write(' ');
-        skipSpace = true;
-      }
-    } else {
-      result.write(character);
-      skipSpace = false;
-    }
-  }
-  return result.toString().trim();
-}
-
-/**
- * Returns a matcher that matches if the match argument is a string and
- * starts with [prefixString].
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// starts with [prefixString].
 Matcher startsWith(String prefixString) => new _StringStartsWith(prefixString);
 
 class _StringStartsWith extends _StringMatcher {
@@ -104,14 +77,11 @@
       description.add('a string starting with ').addDescriptionOf(_prefix);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * ends with [suffixString].
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// ends with [suffixString].
 Matcher endsWith(String suffixString) => new _StringEndsWith(suffixString);
 
 class _StringEndsWith extends _StringMatcher {
-
   final String _suffix;
 
   const _StringEndsWith(this._suffix);
@@ -123,19 +93,16 @@
       description.add('a string ending with ').addDescriptionOf(_suffix);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * contains a given list of [substrings] in relative order.
- *
- * For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
- * "abcdefghijklmnopqrstuvwxyz".
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// contains a given list of [substrings] in relative order.
+///
+/// For example, `stringContainsInOrder(["a", "e", "i", "o", "u"])` will match
+/// "abcdefghijklmnopqrstuvwxyz".
 
-Matcher stringContainsInOrder(substrings) =>
+Matcher stringContainsInOrder(List<String> substrings) =>
     new _StringContainsInOrder(substrings);
 
 class _StringContainsInOrder extends _StringMatcher {
-
   final List<String> _substrings;
 
   const _StringContainsInOrder(this._substrings);
@@ -147,8 +114,7 @@
     var from_index = 0;
     for (var s in _substrings) {
       from_index = item.indexOf(s, from_index);
-      if (from_index < 0)
-        return false;
+      if (from_index < 0) return false;
     }
     return true;
   }
@@ -158,12 +124,10 @@
                                                   _substrings);
 }
 
-/**
- * Returns a matcher that matches if the match argument is a string and
- * matches the regular expression given by [re]. [re] can be a RegExp
- * instance or a string; in the latter case it will be used to create
- * a RegExp instance.
- */
+/// Returns a matcher that matches if the match argument is a string and
+/// matches the regular expression given by [re]. [re] can be a [RegExp]
+/// instance or a [String]; in the latter case it will be used to create
+/// a RegExp instance.
 Matcher matches(re) => new _MatchesRegExp(re);
 
 class _MatchesRegExp extends _StringMatcher {
@@ -202,3 +166,26 @@
     }
   }
 }
+
+/// Utility function to collapse whitespace runs to single spaces
+/// and strip leading/trailing whitespace.
+String collapseWhitespace(String string) {
+  var result = new StringBuffer();
+  var skipSpace = true;
+  for (var i = 0; i < string.length; i++) {
+    var character = string[i];
+    if (_isWhitespace(character)) {
+      if (!skipSpace) {
+        result.write(' ');
+        skipSpace = true;
+      }
+    } else {
+      result.write(character);
+      skipSpace = false;
+    }
+  }
+  return result.toString().trim();
+}
+
+bool _isWhitespace(String ch) =>
+    ch == ' ' || ch == '\n' || ch == '\r' || ch == '\t';
diff --git a/pkg/matcher/pubspec.yaml b/pkg/matcher/pubspec.yaml
index 63f8191..6f6f277 100644
--- a/pkg/matcher/pubspec.yaml
+++ b/pkg/matcher/pubspec.yaml
@@ -1,5 +1,5 @@
 name: matcher
-version: 0.10.0
+version: 0.10.1+1
 author: Dart Team <misc@dartlang.org>
 description: Support for specifying test expectations
 homepage: http://www.dartlang.org
diff --git a/pkg/matcher/test/core_matchers_test.dart b/pkg/matcher/test/core_matchers_test.dart
index 3f694f3..7e9b246 100644
--- a/pkg/matcher/test/core_matchers_test.dart
+++ b/pkg/matcher/test/core_matchers_test.dart
@@ -47,6 +47,24 @@
     shouldPass(a, equals(b));
   });
 
+  test('equals with a set', () {
+    var numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10];
+    var set1 = numbers.toSet();
+    numbers.shuffle();
+    var set2 = numbers.toSet();
+
+    shouldPass(set2, equals(set1));
+    shouldPass(numbers, equals(set1));
+    shouldFail([1, 2, 3, 4, 5, 6, 7, 8, 9], equals(set1), matches(
+        r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9\]"
+        r"   Which: does not contain 10"));
+    shouldFail([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11], equals(set1), matches(
+        r"Expected: .*:\[1, 2, 3, 4, 5, 6, 7, 8, 9, 10\]"
+        r"  Actual: \[1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11\]"
+        r"   Which: larger than expected"));
+  });
+
   test('anything', () {
     var a = new Map();
     shouldPass(0, anything);
diff --git a/pkg/matcher/test/test_common.dart b/pkg/matcher/test/test_common.dart
index 562786d..93f45f3 100644
--- a/pkg/matcher/test/test_common.dart
+++ b/pkg/matcher/test/test_common.dart
@@ -13,13 +13,13 @@
 }
 
 class HasPrice extends CustomMatcher {
-  HasPrice(matcher) :
-    super("Widget with a price that is", "price", matcher);
+  HasPrice(matcher) : super("Widget with a price that is", "price", matcher);
   featureValueOf(actual) => actual.price;
 }
 
-class SimpleIterable extends IterableBase {
-  int count;
+class SimpleIterable extends IterableBase<int> {
+  final int count;
+
   SimpleIterable(this.count);
 
   bool contains(int val) => count < val ? false : true;
@@ -34,15 +34,15 @@
   String toString() => "<[$count]>";
 
   Iterator get iterator {
-    return new SimpleIterator(count);
+    return new _SimpleIterator(count);
   }
 }
 
-class SimpleIterator implements Iterator {
+class _SimpleIterator implements Iterator<int> {
   int _count;
   int _current;
 
-  SimpleIterator(this._count);
+  _SimpleIterator(this._count);
 
   bool moveNext() {
     if (_count > 0) {
@@ -54,6 +54,6 @@
     return false;
   }
 
-  get current => _current;
+  int get current => _current;
 }
 
diff --git a/pkg/pkg.gyp b/pkg/pkg.gyp
index dfea42a..6fb7f61 100644
--- a/pkg/pkg.gyp
+++ b/pkg/pkg.gyp
@@ -19,6 +19,9 @@
                 '"../third_party/pkg"])',
             '<!@(["python", "../tools/list_pkg_directories.py", '
                 '"polymer/e2e_test/"])',
+            '../sdk/lib/_internal/compiler',
+            '../sdk/lib/_internal/libraries.dart',
+            '../site/try',
           ],
           'outputs': [
             '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
diff --git a/pkg/pkg.status b/pkg/pkg.status
index a0b87f4..761516b 100644
--- a/pkg/pkg.status
+++ b/pkg/pkg.status
@@ -23,6 +23,7 @@
 [ $compiler == none && ($runtime == drt || $runtime == dartium) ]
 third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 polymer/example/component/news/test/news_index_test: Pass, RuntimeError # Issue 18931
+intl/test/date_time_format_http_request_test: Pass, Timeout # Issue 19544
 
 [ $compiler == none && ($runtime == dartium) ]
 polymer/test/attr_deserialize_test: Pass, RuntimeError # Issue 18931
@@ -48,25 +49,28 @@
 polymer/test/template_distribute_dynamic_test: Pass, RuntimeError # Issue 18931
 web_components/test/interop_test: Pass, RuntimeError # Issue 18931
 
+[ $compiler == none && ($runtime == dartium) && $mode == debug ]
+polymer/test/instance_attrs_test: Skip # Issue 19496
+
 [ $compiler == none && $runtime == dartium && $system == windows ]
 polymer/test/property_observe_test: Pass, Timeout # Issue 19326
 
 [ $runtime == vm && $mode == debug]
-analysis_server/test/analysis_server_test: Pass, Timeout
-analysis_server/test/domain_context_test: Pass, Timeout
-analysis_server/test/domain_server_test: Pass, Timeout
-analyzer/test/generated/element_test: Pass, Timeout
-analyzer/test/generated/parser_test: Pass, Timeout
-code_transformers/test/resolver_test: Pass, Timeout
+analysis_server/test/analysis_server_test: Skip  # Times out
+analysis_server/test/domain_context_test: Skip  # Times out
+analysis_server/test/domain_server_test: Skip  # Times out
+analyzer/test/generated/element_test: Skip  # Times out
+analyzer/test/generated/parser_test: Skip  # Times out
+code_transformers/test/resolver_test: Skip  # Times out
 docgen/test/*: Skip # Slow
 polymer/test/build/all_phases_test: Skip # Slow
-smoke/test/codegen/end_to_end_test: Pass, Timeout
-smoke/test/codegen/recorder_test: Pass, Timeout
-template_binding/test/template_binding_test: Pass, Timeout
-third_party/html5lib/test/tokenizer_test: Pass, Timeout
+smoke/test/codegen/end_to_end_test: Skip  # Times out
+smoke/test/codegen/recorder_test: Skip  # Times out
+template_binding/test/template_binding_test: Skip  # Times out
+third_party/html5lib/test/tokenizer_test: Skip  # Times out
+barback/test/package_graph/repetition_test: Skip  # Times out
 
 [ $runtime == vm && ( $arch == simarm || $arch == simmips ) ]
-analysis_server/test/*: Skip # Too slow
 barback/test/too_many_open_files_test: Skip # 14220
 code_transformers/test/resolver_test: Skip # Issue 17908
 docgen/test/*: Skip # Too slow
@@ -86,9 +90,11 @@
 typed_data/test/typed_buffers_test/01: Fail # Not supporting Int64List, Uint64List.
 
 [ $compiler == dart2js && $runtime == drt ]
+third_party/angular_tests/browser_test/core_dom/compiler: Fail # Issue 19329
+third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
+third_party/angular_tests/browser_test/core/templateurl: Fail # Issue 19329
 web_components/test/interop_test: Pass, Fail # Issue 19329
 web_components/test/interop2_test: Fail # Issue 19329
-third_party/angular_tests/browser_test/core_dom/shadow_root_options: Fail # Issue 19329
 
 [ $compiler == dart2js && $checked ]
 crypto/test/base64_test: Slow, Pass
@@ -111,8 +117,8 @@
 
 [ $runtime == jsshell ]
 async/test/stream_zip_test: RuntimeError, OK # Timers are not supported.
-scheduled_test/test/unittest_compatibility_test: RuntimeError # Issue 7728
-unittest/test/unittest_nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
+scheduled_test/test/unittest_compatibility_test: Fail # Issue 7728
+unittest/test/nested_groups_setup_teardown_test: RuntimeError # http://dartbug.com/10109
 
 [ $compiler == dart2js && $runtime == drt ]
 async/test/stream_zip_test: RuntimeError, Pass # Issue 18548
@@ -166,10 +172,8 @@
 mime/test/mime_multipart_transformer_test: Skip # No typed_data on IE9.
 typed_data/test/typed_buffers_test: Fail, Crash # No typed_data on IE9.
 polymer/test/instance_attrs_test: Pass, Fail # Issue 14167
-polymer/test/bind_mdv_test: Slow, Pass
-template_binding/test/custom_element_bindings_test: Fail, Timeout # Issue 16717
-polymer/test/bind_mdv_test: RuntimeError # Issue 14412, 13260
-matcher/test/matchers_test: RuntimeError # Issue 17762
+polymer/test/bind_mdv_test: Slow, Pass, RuntimeError # Issue 14412, 13260
+matcher/test/core_matchers_test: RuntimeError # Issue 17762
 polymer_expressions/test/bindings_test: RuntimeError # Issue 19265
 polymer_expressions/test/globals_test: RuntimeError # Issue 19265
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
@@ -186,9 +190,6 @@
 template_binding/test/template_binding_test: Pass, RuntimeError # Issue 19265
 polymer/test/event_handlers_test: Pass, Timeout # Issue 19327
 
-[ $runtime == ie11 ]
-polymer/test/event_handlers_test: RuntimeError, Timeout # Issue 19265
-
 [ $runtime == safari || $runtime == safarimobilesim ]
 # Unexplained errors only occuring on Safari.
 typed_data/test/typed_buffers_test: RuntimeError
@@ -266,6 +267,7 @@
 code_transformers/test/*: Skip # Uses dart:io.
 http/test/io/*: Fail, OK # Uses dart:io.
 http_parser/test/web_socket_test: Fail, OK # Uses dart:io
+http_multi_server/test/http_multi_server_test: Skip # Uses dart:io
 http_server/test/*: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_even_test: Fail, OK # Uses dart:io.
 intl/test/date_time_format_file_odd_test: Fail, OK # Uses dart:io.
@@ -326,30 +328,30 @@
 [ $compiler == none && ( $runtime == dartium || $runtime == drt ) ]
 serialization/test/no_library_test: Skip # Expected Failure
 serialization/test/serialization_test: Fail # 13921
-unittest/test/unittest_async_exception_test: Fail # 13921
-unittest/test/unittest_async_setup_teardown_test: Fail # 13921
-unittest/test/unittest_completion_test: Fail # 13921
-unittest/test/unittest_correct_callback_test: Fail # 13921
-unittest/test/unittest_exception_test: Fail # 13921
-unittest/test/unittest_excess_callback_test: Fail # 13921
-unittest/test/unittest_expect_async_args_test: Fail # 13921
-unittest/test/unittest_expect_async_test: Fail # 13921
-unittest/test/unittest_group_name_test: Fail # 13921
-unittest/test/unittest_invalid_ops_test: Fail # 13921
-unittest/test/unittest_late_exception_test: Fail # 13921
-unittest/test/unittest_middle_exception_test: Fail # 13921
-unittest/test/unittest_nested_groups_setup_teardown_test: Fail # 13921
-unittest/test/unittest_protect_async_test: Fail # 13921
-unittest/test/unittest_runtests_without_tests_test: Fail # 13921
-unittest/test/unittest_setup_and_teardown_test: Fail # 13921
-unittest/test/unittest_setup_test: Fail # 13921
-unittest/test/unittest_single_correct_test: Fail # 13921
-unittest/test/unittest_single_failing_test: Fail # 13921
-unittest/test/unittest_skipped_soloed_nested_test: Fail # 13921
-unittest/test/unittest_teardown_test: Fail # 13921
-unittest/test/unittest_test_returning_future_test: Fail # 13921
-unittest/test/unittest_test_returning_future_using_runasync_test: Fail # 13921
-unittest/test/unittest_testcases_immutable_test: Fail # 13921
+unittest/test/async_exception_test: RuntimeError # 13921
+unittest/test/async_setup_teardown_test: RuntimeError # 13921
+unittest/test/completion_test: RuntimeError # 13921
+unittest/test/correct_callback_test: RuntimeError # 13921
+unittest/test/exception_test: RuntimeError # 13921
+unittest/test/excess_callback_test: RuntimeError # 13921
+unittest/test/expect_async_args_test: RuntimeError # 13921
+unittest/test/expect_async_test: RuntimeError # 13921
+unittest/test/group_name_test: RuntimeError # 13921
+unittest/test/invalid_ops_test: RuntimeError # 13921
+unittest/test/late_exception_test: RuntimeError # 13921
+unittest/test/middle_exception_test: RuntimeError # 13921
+unittest/test/nested_groups_setup_teardown_test: RuntimeError # 13921
+unittest/test/protect_async_test: RuntimeError # 13921
+unittest/test/returning_future_test: RuntimeError # 13921
+unittest/test/returning_future_using_runasync_test: RuntimeError # 13921
+unittest/test/runtests_without_tests_test: RuntimeError # 13921
+unittest/test/setup_and_teardown_test: RuntimeError # 13921
+unittest/test/setup_test: RuntimeError # 13921
+unittest/test/single_correct_test: RuntimeError # 13921
+unittest/test/single_failing_test: RuntimeError # 13921
+unittest/test/skipped_soloed_nested_test: RuntimeError # 13921
+unittest/test/teardown_test: RuntimeError # 13921
+unittest/test/testcases_immutable_test: RuntimeError # 13921
 polymer/e2e_test/canonicalization/test/deploy1_test: Fail, OK # tests deploy only behavior
 polymer/e2e_test/canonicalization/test/deploy2_test: Fail, OK # tests deploy only behavior
 polymer/e2e_test/canonicalization/test/deploy3_test: Fail, OK # tests deploy only behavior
@@ -380,7 +382,7 @@
 source_maps/test/parser_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
 [ $compiler == dartanalyzer || $compiler == dart2analyzer ]
-matcher/test/matchers_test: StaticWarning, OK # testing error creating abstract class
+matcher/test/deprecated_matchers_test: StaticWarning # testing error creating abstract class
 third_party/angular_tests/vm_test: StaticWarning # Uses removed APIs. See issue 18733.
 
 [ $runtime == vm && ($system == windows || $system == macos) ]
@@ -396,6 +398,9 @@
 # Various issues due to limited browser testing in Angular.
 third_party/angular_tests/*: Skip
 
+[ $runtime == chrome ] # Note: this only fails on Chrome 35. They pass 36+
+polymer/test/entered_view_test: Fail # Chrome 35 
+
 [ $unchecked ]
 third_party/angular_tests/browser_test/angular: Skip # Requires checked mode.
 third_party/angular_tests/browser_test/core/scope: Skip # Requires checked mode.
diff --git a/pkg/polymer/CHANGELOG.md b/pkg/polymer/CHANGELOG.md
index f09744f..e051ed3 100644
--- a/pkg/polymer/CHANGELOG.md
+++ b/pkg/polymer/CHANGELOG.md
@@ -4,13 +4,25 @@
 package. We will also note important changes to the polyfill packages (observe,
 web_components, and template_binding) if they impact polymer.
 
-#### Pub version 0.11.0-dev
-  * **breaking change**: Event bindings with `@` are no longer supported.
-  * **breaking change**: enteredView/leftView were renamed to attached/detached
-  * **breaking change**: polymer.html is not required in entrypoints, but it is
-    required from files that use `<polymer-element>`.
+#### Pub version 0.11.0+3
+  * update readme
+
+#### Pub version 0.11.0+2
+  * bug fix: event listeners were not in the dirty-checking zone
+  * bug fix: dispatch event in auto-binding
+
+#### Pub version 0.11.0+1
+  * Added a workaround for bug in HTML imports (issue
+    [19650](https://code.google.com/p/dart/issues/detail?id=19650)).
+
+#### Pub version 0.11.0
   * **breaking change**: platform.js and dart_support.js must be specified in
     your entry points at the beginning of `<head>`.
+  * **breaking change**: polymer.html is not required in entrypoints, but it is
+    required from files that use `<polymer-element>`.
+  * **breaking change**: enteredView/leftView were renamed to attached/detached.
+    The old lifecycle methods will not be invoked.
+  * **breaking change**: Event bindings with `@` are no longer supported.
 
 #### Pub version 0.10.1
   * Reduce the analyzer work by mocking a small subset of the core libraries.
diff --git a/pkg/polymer/README.md b/pkg/polymer/README.md
index c71bb2ab..6aef5a5f 100644
--- a/pkg/polymer/README.md
+++ b/pkg/polymer/README.md
@@ -40,7 +40,7 @@
 
 ```yaml
 dependencies:
-  polymer: ">=0.10.0 <0.11.0"
+  polymer: ">=0.11.0 <0.12.0"
 ```
 
 Instead of using `any`, we recommend using version ranges to avoid getting your
diff --git a/pkg/polymer/lib/auto_binding.dart b/pkg/polymer/lib/auto_binding.dart
index 44dc1ca..1e1d0b6 100644
--- a/pkg/polymer/lib/auto_binding.dart
+++ b/pkg/polymer/lib/auto_binding.dart
@@ -9,18 +9,18 @@
 import 'package:template_binding/template_binding.dart';
 
 /**
- * The `d-auto-binding` element extends the template element. It provides a
+ * The `auto-binding-dart` element extends the template element. It provides a
  * quick and easy way to do data binding without the need to setup a binding
  * delegate or use the [templateBind] call. Both data and event handlers can be
  * bound using the [model].
  *
- * The `d-auto-binding` element acts just like a template that is bound to
+ * The `auto-binding-dart` 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="d-auto-binding">
+ *     <template is="auto-binding-dart">
  *       <div>Say something: <input value="{{value}}"></div>
  *       <div>You said: {{value}}</div>
  *       <button on-tap="{{buttonTap}}">Tap me!</button>
@@ -41,7 +41,7 @@
  *     </script>
  *
  */
-// Dart note: renamed to d-auto-binding to avoid conflict with JS auto-binding.
+// Dart note: renamed to avoid conflict with JS auto-binding.
 class AutoBindingElement extends TemplateElement with Polymer, Observable
     implements TemplateBindExtension {
 
@@ -89,29 +89,19 @@
 
   DocumentFragment createInstance([model, BindingDelegate delegate]) =>
       _self.createInstance(model, delegate);
+
+  @override
+  dispatchMethod(obj, method, args) {
+    // Dart note: make sure we dispatch to the model, not ourselves.
+    if (identical(obj, this)) obj = model;
+    return super.dispatchMethod(obj, method, args);
+  }
 }
 
 // Dart note: this is implemented a little differently to keep it in classic
-// OOP style. Instead of monkeypatching findController, we override
-// getEventHandler to do the right thing.
+// OOP style. Instead of monkeypatching findController, override it.
 class _AutoBindingSyntax extends PolymerExpressions {
   final AutoBindingElement _node;
-
   _AutoBindingSyntax(this._node) : super();
-
-  EventListener getEventHandler(controller, target, String method) => (e) {
-    if (controller == null || controller is! Polymer) controller = _node;
-
-    if (controller is Polymer) {
-      var args = [e, e.detail, e.currentTarget];
-
-      // Dart note: make sure we dispatch to the model, not the
-      // AutoBindingElement instance.
-      var obj = controller == _node ? _node.model : controller;
-      controller.dispatchMethod(obj, method, args);
-    } else {
-      throw new StateError('controller $controller is not a '
-          'Dart polymer-element.');
-    }
-  };
+  @override findController(_) => _node;
 }
diff --git a/pkg/polymer/lib/polymer.html b/pkg/polymer/lib/polymer.html
index 67c2556..3a3a688 100644
--- a/pkg/polymer/lib/polymer.html
+++ b/pkg/polymer/lib/polymer.html
@@ -10,6 +10,10 @@
 -->
 <!-- minified for deployment: -->
 <link rel="import" href="src/js/polymer/polymer.html">
+<script>
+// TODO(sigmund): remove this script tag (dartbug.com/19650). This empty
+// script tag is necessary to work around a bug in Chrome 36.
+</script>
 
 <!-- unminfied for debugging:
 <link rel="import" href="src/js/polymer/layout.html">
diff --git a/pkg/polymer/lib/src/build/polyfill_injector.dart b/pkg/polymer/lib/src/build/polyfill_injector.dart
index 2a3099a..2f20a52 100644
--- a/pkg/polymer/lib/src/build/polyfill_injector.dart
+++ b/pkg/polymer/lib/src/build/polyfill_injector.dart
@@ -59,6 +59,10 @@
         return;
       }
 
+      // Remove "packages/browser/dart.js". It is not needed in release mode,
+      // and in debug mode we want to ensure it is the last script on the page.
+      if (dartJs != null) dartJs.remove();
+
       // TODO(jmesserly): ideally we would generate an HTML that loads
       // dart2dart too. But for now dart2dart is not a supported deployment
       // target, so just inline the JS script. This has the nice side effect of
@@ -76,9 +80,7 @@
             script.attributes['src'] = '$src$csp.js';
           }
         }
-        // Remove "packages/browser/dart.js"
-        if (dartJs != null) dartJs.remove();
-      } else if (dartJs == null) {
+      } else {
         document.body.nodes.add(parseFragment(
               '<script src="packages/browser/dart.js"></script>'));
       }
diff --git a/pkg/polymer/lib/src/build/script_compactor.dart b/pkg/polymer/lib/src/build/script_compactor.dart
index 8127eda..91c50ca 100644
--- a/pkg/polymer/lib/src/build/script_compactor.dart
+++ b/pkg/polymer/lib/src/build/script_compactor.dart
@@ -16,7 +16,7 @@
 import 'package:analyzer/src/generated/element.dart' as analyzer show Element;
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:source_maps/span.dart' show SourceFile;
+import 'package:source_maps/span.dart' show SourceFile, Span;
 import 'package:smoke/codegen/generator.dart';
 import 'package:smoke/codegen/recorder.dart';
 import 'package:code_transformers/resolver.dart';
@@ -75,6 +75,10 @@
               const Deprecated(this.expires);
             }
             const Object deprecated = const Deprecated("next release");
+            class _Override { const _Override(); }
+            const Object override = const _Override();
+            class _Proxy { const _Proxy(); }
+            const Object proxy = const _Proxy();
 
             class List<V> extends Object {}
             class Map<K, V> extends Object {}
@@ -486,10 +490,10 @@
   final TransformLogger logger;
   bool _inTemplate = false;
 
-  _HtmlExtractor(this.logger, SmokeCodeGenerator generator,
+  _HtmlExtractor(TransformLogger logger, SmokeCodeGenerator generator,
       this.publishedAttributes)
-      : generator = generator,
-        visitor = new _SubExpressionVisitor(generator);
+      : logger = logger, generator = generator,
+        visitor = new _SubExpressionVisitor(generator, logger);
 
   void visitElement(Element node) {
     if (_inTemplate) _processNormalElement(node);
@@ -554,7 +558,7 @@
   }
 
   void _addExpression(String stringExpression, bool inEvent, bool isTwoWay,
-      span) {
+      Span span) {
 
     if (inEvent) {
       if (stringExpression.startsWith('@')) {
@@ -564,10 +568,15 @@
       }
 
       if (stringExpression == '') return;
+      if (stringExpression.startsWith('_')) {
+        logger.warning('private symbols cannot be used in event handlers',
+            span: span);
+        return;
+      }
       generator.addGetter(stringExpression);
       generator.addSymbol(stringExpression);
     }
-    visitor.run(pe.parse(stringExpression), isTwoWay);
+    visitor.run(pe.parse(stringExpression), isTwoWay, span);
   }
 }
 
@@ -575,21 +584,28 @@
 /// be needed to evaluate a single expression at runtime.
 class _SubExpressionVisitor extends pe.RecursiveVisitor {
   final SmokeCodeGenerator generator;
+  final TransformLogger logger;
   bool _includeSetter;
+  Span _currentSpan;
 
-  _SubExpressionVisitor(this.generator);
+  _SubExpressionVisitor(this.generator, this.logger);
 
   /// Visit [exp], and record getters and setters that are needed in order to
   /// evaluate it at runtime. [includeSetter] is only true if this expression
   /// occured in a context where it could be updated, for example in two-way
   /// bindings such as `<input value={{exp}}>`.
-  void run(pe.Expression exp, bool includeSetter) {
+  void run(pe.Expression exp, bool includeSetter, span) {
+    _currentSpan = span;
     _includeSetter = includeSetter;
     visit(exp);
   }
 
   /// Adds a getter and symbol for [name], and optionally a setter.
   _add(String name) {
+    if (name.startsWith('_')) {
+      logger.warning('private symbols are not supported', span: _currentSpan);
+      return;
+    }
     generator.addGetter(name);
     generator.addSymbol(name);
     if (_includeSetter) generator.addSetter(name);
diff --git a/pkg/polymer/lib/src/events.dart b/pkg/polymer/lib/src/events.dart
index 2ca037c..d41f199 100644
--- a/pkg/polymer/lib/src/events.dart
+++ b/pkg/polymer/lib/src/events.dart
@@ -82,22 +82,20 @@
 
     return (model, node, oneTime) {
       var handler = getEventHandler(null, node, path);
-      node.addEventListener(eventType, handler);
+      var sub = node.on[eventType].listen(handler);
 
       if (oneTime) return null;
-      return new _EventBindable(node, eventType, handler, path);
+      return new _EventBindable(sub, path);
     };
   }
 }
 
 
 class _EventBindable extends Bindable {
-  final Node _node;
-  final String _eventType;
-  final Function _handler;
+  StreamSubscription _sub;
   final String _path;
 
-  _EventBindable(this._node, this._eventType, this._handler, this._path);
+  _EventBindable(this._sub, this._path);
 
   // TODO(rafaelw): This is really pointless work. Aside from the cost
   // of these allocations, NodeBind is going to setAttribute back to its
@@ -107,7 +105,12 @@
 
   open(callback) => value;
 
-  void close() => _node.removeEventListener(_eventType, _handler);
+  void close() {
+    if (_sub != null) {
+      _sub.cancel();
+      _sub = null;
+    }
+  }
 }
 
 
diff --git a/pkg/polymer/lib/src/instance.dart b/pkg/polymer/lib/src/instance.dart
index ceb1119..3032e34 100644
--- a/pkg/polymer/lib/src/instance.dart
+++ b/pkg/polymer/lib/src/instance.dart
@@ -182,12 +182,16 @@
   CompoundObserver _propertyObserver;
   bool _readied = false;
 
+  JsObject _jsElem;
+
   /// Returns the object that should be used as the event controller for
   /// event bindings in this element's template. If set, this will override the
   /// normal controller lookup.
-  // TODO(jmesserly): type seems wrong here? I'm guessing this should be any
-  // kind of model object. Also, should it be writable by anyone?
-  Polymer eventController;
+  // TODO(jmesserly): we need to use a JS-writable property as our backing
+  // store, because of elements such as:
+  // https://github.com/Polymer/core-overlay/blob/eeb14853/core-overlay-layer.html#L78
+  get eventController => _jsElem['eventController'];
+  set eventController(value) { _jsElem['eventController'] = value; }
 
   bool get hasBeenAttached => _hasBeenAttached;
   bool _hasBeenAttached = false;
@@ -212,8 +216,7 @@
   // Note: this is observable to support $['someId'] being used in templates.
   // The template is stamped before $ is populated, so we need observation if
   // we want it to be usable in bindings.
-  @reflectable final Map<String, Element> $ =
-      new ObservableMap<String, Element>();
+  final Map<String, dynamic> $ = new ObservableMap<String, dynamic>();
 
   /// Use to override the default syntax for polymer-elements.
   /// By default this will be null, which causes [instanceTemplate] to use
@@ -264,6 +267,7 @@
       window.console.warn('Element already prepared: $_name');
       return;
     }
+    _initJsObject();
     // Dart note: get the corresponding <polymer-element> declaration.
     _element = _getDeclaration(_name);
     // install property storage
@@ -278,6 +282,12 @@
     addHostListeners();
   }
 
+  /// Initialize JS interop for this element. For now we just initialize the
+  // JsObject, but in the future we could also initialize JS APIs here.
+  _initJsObject() {
+    _jsElem = new JsObject.fromBrowserObject(this);
+  }
+
   makeElementReady() {
     if (_readied) return;
     _readied = true;
@@ -828,8 +838,7 @@
     // by default supports 1 thing being bound.
     events.forEach((type, methodName) {
       // Dart note: the getEventHandler method is on our PolymerExpressions.
-      var handler = element.syntax.getEventHandler(this, this, methodName);
-      addEventListener(type, handler);
+      on[type].listen(element.syntax.getEventHandler(this, this, methodName));
     });
   }
 
diff --git a/pkg/polymer/lib/src/js/polymer/layout.html b/pkg/polymer/lib/src/js/polymer/layout.html
index 4e1284b..679738b 100644
--- a/pkg/polymer/lib/src/js/polymer/layout.html
+++ b/pkg/polymer/lib/src/js/polymer/layout.html
@@ -237,7 +237,7 @@
 
 /* ie support for hidden */
 html /deep/ [hidden] {
-  display: none;
+  display: none !important;
 }
 
 html /deep/ [relative] {
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
index 2478c92..b217d9d 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js
@@ -7,7 +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
  */
-window.PolymerGestures = {};
+window.PolymerGestures = {
+  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)
+};
+PolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };
 
 /*
  * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.
@@ -19,6 +22,30 @@
  */
 
 (function(scope) {
+  var HAS_FULL_PATH = false;
+
+  // test for full event path support
+  var pathTest = document.createElement('meta');
+  if (!scope.hasSDPolyfill && 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) {
@@ -53,25 +80,18 @@
       return shadows;
     },
     searchRoot: function(inRoot, x, y) {
+      var t, st, sr, os;
       if (inRoot) {
-        var t = inRoot.elementFromPoint(x, y);
-        var st, sr, os;
-        // is element a shadow host?
-        sr = this.targetingShadow(t);
-        while (sr) {
-          // find the the element inside the shadow root
-          st = sr.elementFromPoint(x, y);
-          if (!st) {
-            // check for older shadows
-            sr = this.olderShadow(sr);
-          } else {
-            // shadowed element may contain a shadow root
-            var ssr = this.targetingShadow(st);
-            return this.searchRoot(ssr, x, y) || st;
-          }
+        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);
         }
-        // light dom element is the target
-        return t;
+        // search other roots, fall back to light dom element
+        return this.searchRoot(sr, x, y) || t;
       }
     },
     owner: function(element) {
@@ -90,6 +110,9 @@
       return s;
     },
     findTarget: function(inEvent) {
+      if (HAS_FULL_PATH && inEvent.path) {
+        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);
@@ -99,6 +122,26 @@
       }
       return this.searchRoot(s, x, y);
     },
+    findScrollAxis: function(inEvent) {
+      var n;
+      if (HAS_FULL_PATH && inEvent.path) {
+        var path = inEvent.path;
+        for (var i = 0; i < path.length; i++) {
+          n = path[i];
+          if (n._scrollType) {
+            return n._scrollType;
+          }
+        }
+      } else {
+        n = scope.wrap(inEvent.currentTarget);
+        while(n) {
+          if (n._scrollType) {
+            return n._scrollType;
+          }
+          n = n.parentNode || n.host;
+        }
+      }
+    },
     LCA: function(a, b) {
       if (a === b) {
         return a;
@@ -122,14 +165,14 @@
       var adepth = this.depth(a);
       var bdepth = this.depth(b);
       var d = adepth - bdepth;
-      if (d > 0) {
+      if (d >= 0) {
         a = this.walk(a, d);
       } else {
         b = this.walk(b, -d);
       }
-      while(a && b && a !== b) {
-        a = this.walk(a, 1);
-        b = this.walk(b, 1);
+      while (a && b && a !== b) {
+        a = a.parentNode || a.host;
+        b = b.parentNode || b.host;
       }
       return a;
     },
@@ -229,7 +272,8 @@
         'pan-x pan-y',
         'pan-y pan-x'
       ]
-    }
+    },
+    'manipulation'
   ];
   var styles = '';
   // only install stylesheet if the browser has touch action support
@@ -377,6 +421,7 @@
       e.pointerType = inDict.pointerType || '';
       e.hwTimestamp = inDict.hwTimestamp || 0;
       e.isPrimary = inDict.isPrimary || false;
+      e._source = inDict._source || '';
       return e;
     }
   };
@@ -500,7 +545,8 @@
     'timeStamp',
     // gesture addons
     'preventTap',
-    'tapPrevented'
+    'tapPrevented',
+    '_source'
   ];
 
   var CLONE_DEFAULTS = [
@@ -545,9 +591,11 @@
 
   var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
 
-  var wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };
-
   var eventFactory = scope.eventFactory;
+
+  var hasSDPolyfill = scope.hasSDPolyfill;
+  var wrap = scope.wrap;
+
   /**
    * This module is for normalizing events. Mouse and Touch events will be
    * collected here, and fire PointerEvents that have the same semantics, no
@@ -594,10 +642,6 @@
       this.gestures.push(source);
     },
     register: function(element) {
-      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill
-      if (window.ShadowDOMPolyfill && element !== document) {
-        return;
-      }
       var l = this.eventSourceList.length;
       for (var i = 0, es; (i < l) && (es = this.eventSourceList[i]); i++) {
         // call eventsource register
@@ -644,19 +688,19 @@
     },
     // set up event listeners
     listen: function(target, events) {
-      events.forEach(function(e) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
         this.addEvent(target, e);
-      }, this);
+      }
     },
     // remove event listeners
     unlisten: function(target, events) {
-      events.forEach(function(e) {
+      for (var i = 0, l = events.length, e; (i < l) && (e = events[i]); i++) {
         this.removeEvent(target, e);
-      }, this);
+      }
     },
     addEvent: function(target, eventName) {
       // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
+      if (hasSDPolyfill) {
         target.addEventListener_(eventName, this.boundHandler);
       } else {
         target.addEventListener(eventName, this.boundHandler);
@@ -664,7 +708,7 @@
     },
     removeEvent: function(target, eventName) {
       // NOTE: Work around for #4, use native event listener in SD Polyfill
-      if (window.ShadowDOMPolyfill) {
+      if (hasSDPolyfill) {
         target.removeEventListener_(eventName, this.boundHandler);
       } else {
         target.removeEventListener(eventName, this.boundHandler);
@@ -738,10 +782,11 @@
       // process the gesture queue
       for (var i = 0, e; i < this.gestureQueue.length; i++) {
         e = this.gestureQueue[i];
-        for (var j = 0, g; j < this.gestures.length; j++) {
+        for (var j = 0, g, fn; j < this.gestures.length; j++) {
           g = this.gestures[j];
-          if (g.events.indexOf(e.type) >= 0) {
-            g[e.type].call(g, e);
+          fn = g[e.type];
+          if (fn) {
+            fn.call(g, e);
           }
         }
       }
@@ -758,8 +803,11 @@
   dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
   dispatcher.boundGestureTrigger = dispatcher.gestureTrigger.bind(dispatcher);
   scope.dispatcher = dispatcher;
-  scope.register = dispatcher.register.bind(dispatcher);
+  scope.register = function(root) {
+    dispatcher.register(root);
+  };
   scope.unregister = dispatcher.unregister.bind(dispatcher);
+  scope.wrap = wrap;
 })(window.PolymerGestures);
 
 /*
@@ -916,9 +964,12 @@
     events: [
       'mousedown',
       'mousemove',
-      'mouseup',
+      'mouseup'
     ],
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -942,6 +993,7 @@
       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;
       }
@@ -956,6 +1008,7 @@
           this.mouseup(inEvent);
         }
         var e = this.prepareEvent(inEvent);
+        e.target = scope.wrap(scope.findTarget(inEvent));
         pointermap.set(this.POINTER_ID, e.target);
         dispatcher.down(e);
       }
@@ -970,7 +1023,7 @@
     mouseup: function(inEvent) {
       if (!this.isEventSimulatedFromTouch(inEvent)) {
         var e = this.prepareEvent(inEvent);
-        e.relatedTarget = e.target;
+        e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
         e.target = pointermap.get(this.POINTER_ID);
         dispatcher.up(e);
         this.cleanupMouse();
@@ -1001,9 +1054,12 @@
   // 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';
   var INSTALLER;
-  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';
+  // maybe one day...
+  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;
+  var CAN_USE_GLOBAL = false;
 
   // handler block for native touch events
   var touchEvents = {
@@ -1014,14 +1070,14 @@
       'touchcancel'
     ],
     register: function(target) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         dispatcher.listen(target, this.events);
       } else {
         INSTALLER.enableOnSubtree(target);
       }
     },
     unregister: function(target) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         dispatcher.unlisten(target, this.events);
       } else {
         // TODO(dfreedman): is it worth it to disconnect the MO?
@@ -1069,7 +1125,7 @@
       EMITTER: 'none',
       XSCROLLER: 'pan-x',
       YSCROLLER: 'pan-y',
-      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
+      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/
     },
     touchActionToScrollType: function(touchAction) {
       var t = touchAction;
@@ -1094,7 +1150,7 @@
       if (pointermap.pointers() === 0 || (pointermap.pointers() === 1 && pointermap.has(1))) {
         this.firstTouch = inTouch.identifier;
         this.firstXY = {X: inTouch.clientX, Y: inTouch.clientY};
-        this.scrolling = false;
+        this.scrolling = null;
         this.cancelResetClickCount();
       }
     },
@@ -1128,7 +1184,17 @@
     },
     findTarget: function(touch, id) {
       if (this.currentTouchEvent.type === 'touchstart') {
-        return scope.findTarget(touch);
+        if (this.isPrimaryTouch(touch)) {
+          var fastPath = {
+            clientX: touch.clientX,
+            clientY: touch.clientY,
+            path: this.currentTouchEvent.path,
+            target: scope.wrap(this.currentTouchEvent.target)
+          };
+          return scope.findTarget(fastPath);
+        } else {
+          return scope.findTarget(touch);
+        }
       }
       // reuse target we found in touchstart
       return pointermap.get(id);
@@ -1140,7 +1206,7 @@
       // 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.target = scope.wrap(this.findTarget(inTouch, id));
       e.bubbles = true;
       e.cancelable = true;
       e.detail = this.clickCount;
@@ -1150,6 +1216,7 @@
       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() {
@@ -1162,9 +1229,18 @@
     processTouches: function(inEvent, inFunction) {
       var tl = inEvent.changedTouches;
       this.currentTouchEvent = inEvent;
-      for (var i = 0, t; i < tl.length; i++) {
+      for (var i = 0, t, p; i < tl.length; i++) {
         t = tl[i];
-        inFunction.call(this, this.touchToPointer(t));
+        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
@@ -1172,7 +1248,7 @@
     shouldScroll: function(inEvent) {
       if (this.firstXY) {
         var ret;
-        var scrollAxis = inEvent.currentTarget._scrollType;
+        var scrollAxis = scope.targetFinding.findScrollAxis(inEvent);
         if (scrollAxis === 'none') {
           // this element is a touch-action: none, should never scroll
           ret = false;
@@ -1190,7 +1266,6 @@
           // making events
           ret = da >= doa;
         }
-        this.firstXY = null;
         return ret;
       }
     },
@@ -1218,11 +1293,14 @@
           // 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.out;
+            var p = value;
             d.push(p);
           }
         }, this);
-        d.forEach(this.cancelOut, this);
+        d.forEach(function(p) {
+          this.cancel(p);
+          pointermap.delete(p.pointerId);
+        });
       }
     },
     touchstart: function(inEvent) {
@@ -1235,30 +1313,34 @@
       }
     },
     down: function(inPointer) {
-      var p = pointermap.set(inPointer.pointerId, inPointer.target);
       dispatcher.down(inPointer);
     },
     touchmove: function(inEvent) {
-      if (HAS_TOUCH_ACTION) {
+      if (CAN_USE_GLOBAL) {
         this.processTouches(inEvent, this.move);
       } else {
         if (!this.scrolling) {
-          if (this.shouldScroll(inEvent)) {
+          if (this.scrolling === null && this.shouldScroll(inEvent)) {
             this.scrolling = true;
-            this.touchcancel(inEvent);
           } 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) {
-      var pointer = pointermap.get(inPointer.pointerId);
-      // a finger drifted off the screen, ignore it
-      if (!pointer) {
-        return;
-      }
       dispatcher.move(inPointer);
     },
     touchend: function(inEvent) {
@@ -1266,18 +1348,14 @@
       this.processTouches(inEvent, this.up);
     },
     up: function(inPointer) {
-      if (!this.scrolling) {
-        inPointer.relatedTarget = scope.findTarget(inPointer);
-        dispatcher.up(inPointer);
-      }
-      this.cleanUpPointer(inPointer);
+      inPointer.relatedTarget = scope.wrap(scope.findTarget(inPointer));
+      dispatcher.up(inPointer);
     },
     cancel: function(inPointer) {
-      inPointer.relatedTarget = scope.findTarget(inPointer);
       dispatcher.cancel(inPointer);
-      this.cleanUpPointer(inPointer);
     },
     touchcancel: function(inEvent) {
+      inEvent._cancel = true;
       this.processTouches(inEvent, this.cancel);
     },
     cleanUpPointer: function(inPointer) {
@@ -1304,7 +1382,7 @@
     }
   };
 
-  if (!HAS_TOUCH_ACTION) {
+  if (!CAN_USE_GLOBAL) {
     INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
   }
 
@@ -1332,6 +1410,9 @@
       'MSPointerCancel',
     ],
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1346,10 +1427,11 @@
     ],
     prepareEvent: function(inEvent) {
       var e = inEvent;
+      e = dispatcher.cloneEvent(inEvent);
       if (HAS_BITMAP_TYPE) {
-        e = dispatcher.cloneEvent(inEvent);
         e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
       }
+      e._source = 'ms';
       return e;
     },
     cleanup: function(id) {
@@ -1357,6 +1439,7 @@
     },
     MSPointerDown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
+      e.target = scope.wrap(scope.findTarget(inEvent));
       pointermap.set(inEvent.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1367,14 +1450,14 @@
     },
     MSPointerUp: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(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 = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1404,9 +1487,14 @@
       'pointercancel'
     ],
     prepareEvent: function(inEvent) {
-      return dispatcher.cloneEvent(inEvent);
+      var e = dispatcher.cloneEvent(inEvent);
+      e._source = 'pointer';
+      return e;
     },
     register: function(target) {
+      if (target !== document) {
+        return;
+      }
       dispatcher.listen(target, this.events);
     },
     unregister: function(target) {
@@ -1417,6 +1505,7 @@
     },
     pointerdown: function(inEvent) {
       var e = this.prepareEvent(inEvent);
+      e.target = scope.wrap(scope.findTarget(inEvent));
       pointermap.set(e.pointerId, e.target);
       dispatcher.down(e);
     },
@@ -1427,14 +1516,14 @@
     },
     pointerup: function(inEvent) {
       var e = this.prepareEvent(inEvent);
-      e.relatedTarget = e.target;
+      e.relatedTarget = scope.wrap(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 = e.target;
+      e.relatedTarget = scope.wrap(scope.findTarget(inEvent));
       e.target = pointermap.get(e.pointerId);
       dispatcher.cancel(e);
       this.cleanup(inEvent.pointerId);
@@ -1632,7 +1721,8 @@
          trackInfo: t.trackInfo,
          relatedTarget: inEvent.relatedTarget,
          pointerType: inEvent.pointerType,
-         pointerId: inEvent.pointerId
+         pointerId: inEvent.pointerId,
+         _source: 'track'
        });
        t.downTarget.dispatchEvent(e);
      },
@@ -1731,7 +1821,7 @@
 /**
  * This event is fired when a held pointer is released or moved.
  *
- * @class released
+ * @class release
  */
 
 (function(scope) {
@@ -1793,7 +1883,8 @@
         pointerType: this.heldPointer.pointerType,
         pointerId: this.heldPointer.pointerId,
         x: this.heldPointer.clientX,
-        y: this.heldPointer.clientY
+        y: this.heldPointer.clientY,
+        _source: 'hold'
       };
       if (inHoldTime) {
         p.holdTime = inHoldTime;
@@ -1886,7 +1977,8 @@
             altKey: inEvent.altKey,
             ctrlKey: inEvent.ctrlKey,
             metaKey: inEvent.metaKey,
-            shiftKey: inEvent.shiftKey
+            shiftKey: inEvent.shiftKey,
+            _source: 'tap'
           });
           t.dispatchEvent(e);
         }
@@ -2658,17 +2750,22 @@
     }
 
     function parseLeftHandSideExpression() {
-        var expr, property;
+        var expr, args, property;
 
         expr = parsePrimaryExpression();
 
-        while (match('.') || match('[')) {
+        while (true) {
             if (match('[')) {
                 property = parseComputedMember();
                 expr = delegate.createMemberExpression('[', expr, property);
-            } else {
+            } else if (match('.')) {
                 property = parseNonComputedMember();
                 expr = delegate.createMemberExpression('.', expr, property);
+            } else if (match('(')) {
+                args = parseArguments();
+                expr = delegate.createCallExpression(expr, args);
+            } else {
+                break;
             }
         }
 
@@ -3041,34 +3138,31 @@
   };
 
   function MemberExpression(object, property, accessor) {
+    this.computed = accessor == '[';
+
     this.dynamicDeps = typeof object == 'function' ||
                        object.dynamicDeps ||
-                       (accessor == '[' && !(property instanceof Literal));
-
-    // convert literal computed property access where literal value is a value
-    // path to ident dot-access.
-    if (accessor == '[' &&
-        property instanceof Literal &&
-        Path.get(property.value).valid) {
-      accessor = '.';
-      property = new IdentPath(property.value);
-    }
+                       (this.computed && !(property instanceof Literal));
 
     this.simplePath =
         !this.dynamicDeps &&
-        property instanceof IdentPath &&
+        (property instanceof IdentPath || property instanceof Literal) &&
         (object instanceof MemberExpression || object instanceof IdentPath);
 
     this.object = this.simplePath ? object : getFn(object);
-    this.property = accessor == '.' ? property : getFn(property);
+    this.property = !this.computed || this.simplePath ?
+        property : getFn(property);
   }
 
   MemberExpression.prototype = {
     get fullPath() {
       if (!this.fullPath_) {
-        var last = this.object instanceof IdentPath ?
-            this.object.name : this.object.fullPath;
-        this.fullPath_ = Path.get(last + '.' + this.property.name);
+
+        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_;
@@ -3087,11 +3181,11 @@
 
             return path.getValueFrom(model);
           };
-        } else if (this.property instanceof IdentPath) {
+        } else if (!this.computed) {
           var path = Path.get(this.property.name);
 
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
 
             if (observer)
               observer.addPath(context, path);
@@ -3102,11 +3196,11 @@
           // Computed property.
           var property = this.property;
 
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-            var propName = property(model, observer);
+          this.valueFn_ = function(model, observer, filterRegistry) {
+            var context = object(model, observer, filterRegistry);
+            var propName = property(model, observer, filterRegistry);
             if (observer)
-              observer.addPath(context, propName);
+              observer.addPath(context, [propName]);
 
             return context ? context[propName] : undefined;
           };
@@ -3137,8 +3231,8 @@
   }
 
   Filter.prototype = {
-    transform: function(value, toModelDirection, filterRegistry, model,
-                        observer) {
+    transform: function(model, observer, filterRegistry, toModelDirection,
+                        initialArgs) {
       var fn = filterRegistry[this.name];
       var context = model;
       if (fn) {
@@ -3146,7 +3240,7 @@
       } else {
         fn = context[this.name];
         if (!fn) {
-          console.error('Cannot find filter: ' + this.name);
+          console.error('Cannot find function or filter: ' + this.name);
           return;
         }
       }
@@ -3161,14 +3255,13 @@
       }
 
       if (typeof fn != 'function') {
-        console.error('No ' + (toModelDirection ? 'toModel' : 'toDOM') +
-                      ' found on' + this.name);
+        console.error('Cannot find function or filter: ' + this.name);
         return;
       }
 
-      var args = [value];
+      var args = initialArgs || [];
       for (var i = 0; i < this.args.length; i++) {
-        args[i + 1] = getFn(this.args[i])(model, observer);
+        args.push(getFn(this.args[i])(model, observer, filterRegistry));
       }
 
       return fn.apply(context, args);
@@ -3222,8 +3315,8 @@
 
       argument = getFn(argument);
 
-      return function(model, observer) {
-        return unaryOperators[op](argument(model, observer));
+      return function(model, observer, filterRegistry) {
+        return unaryOperators[op](argument(model, observer, filterRegistry));
       };
     },
 
@@ -3234,9 +3327,9 @@
       left = getFn(left);
       right = getFn(right);
 
-      return function(model, observer) {
-        return binaryOperators[op](left(model, observer),
-                                   right(model, observer));
+      return function(model, observer, filterRegistry) {
+        return binaryOperators[op](left(model, observer, filterRegistry),
+                                   right(model, observer, filterRegistry));
       };
     },
 
@@ -3245,9 +3338,10 @@
       consequent = getFn(consequent);
       alternate = getFn(alternate);
 
-      return function(model, observer) {
-        return test(model, observer) ?
-            consequent(model, observer) : alternate(model, observer);
+      return function(model, observer, filterRegistry) {
+        return test(model, observer, filterRegistry) ?
+            consequent(model, observer, filterRegistry) :
+            alternate(model, observer, filterRegistry);
       }
     },
 
@@ -3264,6 +3358,17 @@
       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);
     },
@@ -3272,10 +3377,10 @@
       for (var i = 0; i < elements.length; i++)
         elements[i] = getFn(elements[i]);
 
-      return function(model, observer) {
+      return function(model, observer, filterRegistry) {
         var arr = []
         for (var i = 0; i < elements.length; i++)
-          arr.push(elements[i](model, observer));
+          arr.push(elements[i](model, observer, filterRegistry));
         return arr;
       }
     },
@@ -3291,10 +3396,11 @@
       for (var i = 0; i < properties.length; i++)
         properties[i].value = getFn(properties[i].value);
 
-      return function(model, observer) {
+      return function(model, observer, filterRegistry) {
         var obj = {};
         for (var i = 0; i < properties.length; i++)
-          obj[properties[i].key] = properties[i].value(model, observer);
+          obj[properties[i].key] =
+              properties[i].value(model, observer, filterRegistry);
         return obj;
       }
     },
@@ -3385,10 +3491,10 @@
     },
 
     getValue: function(model, observer, filterRegistry) {
-      var value = getFn(this.expression)(model, observer);
+      var value = getFn(this.expression)(model, observer, filterRegistry);
       for (var i = 0; i < this.filters.length; i++) {
-        value = this.filters[i].transform(value, false, filterRegistry, model,
-                                          observer);
+        value = this.filters[i].transform(model, observer, filterRegistry,
+            false, [value]);
       }
 
       return value;
@@ -3397,8 +3503,8 @@
     setValue: function(model, newValue, filterRegistry) {
       var count = this.filters ? this.filters.length : 0;
       while (count-- > 0) {
-        newValue = this.filters[count].transform(newValue, true, filterRegistry,
-                                                 model);
+        newValue = this.filters[count].transform(model, undefined,
+            filterRegistry, true, [newValue]);
       }
 
       if (this.expression.setValue)
@@ -3510,19 +3616,33 @@
       var indexName = template.polymerExpressionIndexIdent_;
 
       return function(model) {
-        var scope = Object.create(parentScope);
-        scope[scopeName] = model;
-        scope[indexName] = undefined;
-        scope[parentScopeName] = parentScope;
-        return scope;
+        return createScopeObject(parentScope, model, scopeName, indexName);
       };
     }
   };
 
-  global.PolymerExpressions = PolymerExpressions;
-  if (global.exposeGetExpression)
-    global.getExpression_ = getExpression;
+  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);
 
 /*
@@ -3534,7 +3654,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 Polymer = {
-  version: '0.3.1-604ba08'
+  version: '0.3.3-0e73963'
 };
 
 /*
@@ -4013,7 +4133,7 @@
       this.async("fire", arguments);
     },
     /**
-      * Remove class from old, add class to anew, if they exist
+      * Remove class from old, add class to anew, if they exist.
       * @param classFollows
       * @param anew A node.
       * @param old A node
@@ -4026,6 +4146,22 @@
       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;
     }
   };
 
@@ -4222,15 +4358,44 @@
 
   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.registerObservers([o]);
+        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 
+        // 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);
@@ -4297,12 +4462,83 @@
         }
       }
     },
+    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_';
+
+      this[privateObservable] = observable;
+      var oldValue = this[privateName];
+
+      var self = this;
+      var value = observable.open(function(value, oldValue) {
+        self[privateName] = value;
+        self.emitPropertyChangeRecord(name, value, oldValue);
+      });
+
+      if (resolveFn && !areSameValue(oldValue, value)) {
+        var resolvedValue = resolveFn(oldValue, value);
+        if (!areSameValue(value, resolvedValue)) {
+          value = resolvedValue;
+          if (observable.setValue)
+            observable.setValue(value);
+        }
+      }
+
+      this[privateName] = value;
+      this.emitPropertyChangeRecord(name, value, oldValue);
+
+      var observer = {
+        close: function() {
+          observable.close();
+          self[privateObservable] = 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;
       }
-      return bindProperties(this, property, observable);
+      return this.bindToAccessor(property, observable, resolveBindingValue);
     },
     invokeMethod: function(method, args) {
       var fn = this[method] || method;
@@ -4310,27 +4546,29 @@
         fn.apply(this, args);
       }
     },
-    registerObservers: function(observers) {
-      this._observers = this._observers || [];
-      this._observers.push(observers);
+    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;
       }
-      for (var i=0, l=this._observers.length; i<l; i++) {
-        this.closeObserverArray(this._observers[i]);
-      }
-      this._observers = [];
-    },
-    closeObserverArray: function(observerArray) {
-      for (var i=0, l=observerArray.length, o; i<l; i++) {
-        o = observerArray[i];
-        if (o && o.close) {
-          o.close();
+
+      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) {
@@ -4355,23 +4593,6 @@
     }
   };
 
-  // property binding
-  // bind a property in A to a path in B by converting A[property] to a
-  // getter/setter pair that accesses B[...path...]
-  function bindProperties(a, property, observable) {
-    // apply Polymer two-way reference binding
-    return Observer.bindToInstance(a, property, observable, resolveBindingValue);
-  }
-
-  // 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;
-  }
-
   // logging
   var LOG_OBSERVE = '[%s] watching [%s]';
   var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';
@@ -4405,7 +4626,10 @@
       var syntax = this.syntax || (!template.bindingDelegate &&
           this.element.syntax);
       var dom = template.createInstance(this, syntax);
-      this.registerObservers(dom.bindings_);
+      var observers = dom.bindings_;
+      for (var i = 0; i < observers.length; i++) {
+        this.registerObserver(observers[i]);
+      }
       return dom;
     },
     bind: function(name, observable, oneTime) {
@@ -4558,6 +4782,7 @@
         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
@@ -4582,7 +4807,7 @@
       if (this.enteredView) {
         this.enteredView();
       }
-      // NOTE: domReady can be used to access elements in dom (descendants, 
+      // 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.
@@ -4647,7 +4872,7 @@
         // make a shadow root
         var root = this.createShadowRoot();
         // stamp template
-        // which includes parsing and applying MDV bindings before being 
+        // 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);
@@ -4664,17 +4889,17 @@
       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 
+        // 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 
+        // 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);          
+          this.insertBefore(dom, refNode);
         } else {
           this.appendChild(dom);
         }
@@ -4722,7 +4947,7 @@
 
   // true if object has own PolymerBase api
   function isBase(object) {
-    return object.hasOwnProperty('PolymerBase') 
+    return object.hasOwnProperty('PolymerBase')
   }
 
   // name a base constructor for dev tools
@@ -4730,13 +4955,13 @@
   function PolymerBase() {};
   PolymerBase.prototype = base;
   base.constructor = PolymerBase;
-  
+
   // exports
 
   scope.Base = PolymerBase;
   scope.isBase = isBase;
   scope.api.instance.base = base;
-  
+
 })(Polymer);
 
 /*
@@ -5401,6 +5626,13 @@
           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
@@ -5412,17 +5644,17 @@
         prototype._publishLC = this.lowerCaseMap(publish);
       }
     },
-    // sync prototype to property descriptors; 
-    // desriptor format contains default value and optionally a 
+    // sync prototype to property descriptors;
+    // desriptor format contains default value and optionally a
     // hint for reflecting the property to an attribute.
     // e.g. {foo: 5, bar: {value: true, reflect: true}}
     // reflect: {foo: true} is also supported
-    // 
+    //
     requireProperties: function(propertyDescriptors, prototype, base) {
       // reflected properties
       prototype.reflect = prototype.reflect || {};
       // ensure a prototype value for each property
-      // and update the property's reflect to attribute status 
+      // and update the property's reflect to attribute status
       for (var n in propertyDescriptors) {
         var propertyDescriptor = propertyDescriptors[n];
         var reflects = this.reflectHintForDescriptor(propertyDescriptor);
@@ -5430,12 +5662,12 @@
           prototype.reflect[n] = reflects;
         }
         if (prototype[n] === undefined) {
-          prototype[n] = this.valueForDescriptor(propertyDescriptor); 
+          prototype[n] = this.valueForDescriptor(propertyDescriptor);
         }
       }
     },
     valueForDescriptor: function(propertyDescriptor) {
-      var value = typeof propertyDescriptor === 'object' && 
+      var value = typeof propertyDescriptor === 'object' &&
           propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;
       return value !== undefined ? value : null;
     },
@@ -5453,13 +5685,52 @@
       }
       return map;
     },
+    createPropertyAccessor: function(name) {
+      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) {
+          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._publishNames;
       if (n$ && n$.length) {
         for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
-          Observer.createBindablePrototypeAccessor(prototype, n);
+          this.createPropertyAccessor(n);
         }
       }
+
+      var n$ = prototype._computedNames;
+      if (n$ && n$.length) {
+        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {
+          this.createPropertyAccessor(n);
+        }
+      }
+
     }
   };
 
@@ -5507,11 +5778,24 @@
         for (var i=0, l=names.length, n; i<l; i++) {
           // remove excess ws
           n = names[i].trim();
-          // do not override explicit entries
-          if (n && publish[n] === undefined && base[n] === undefined) {
+          // if the user hasn't specified a value, we want to use the
+          // default, unless a superclass has already chosen one
+          if (n && publish[n] === undefined) {
+            // TODO(sjmiles): querying native properties on IE11 (and possibly
+            // on other browsers) throws an exception because there is no actual
+            // instance.
+            // In fact, trying to publish native properties is known bad for this
+            // and other reasons, and we need to solve this problem writ large.
+            try {
+              var hasValue = (base[n] !== undefined);
+            } catch(x) {
+              hasValue = false;
+            }
             // supply an empty 'descriptor' object and let the publishProperties
             // code determine a default
-            publish[n] = Polymer.nob;
+            if (!hasValue) {
+              publish[n] = Polymer.nob;
+            }
           }
         }
       }
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
index 7be4339..886d173 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.concat.js.map
@@ -48,26 +48,26 @@
     "src/lib/auto-binding.js"
   ],
   "names": [],
-  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3LA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACpTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;AC5MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1HA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5gCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrkBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACtLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpFA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnOA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACvTA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9VA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AChEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC7MA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AClGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC5lBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACrCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3QA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACzGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AClPA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC3KA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;AC3PA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACxKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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",
   "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 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      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return 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      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    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 = this.walk(a, 1);\n        b = this.walk(b, 1);\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
-    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 'body /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  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\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      return e;\n    }\n  };\n\n  scope.eventFactory = eventFactory;\n})(window.PolymerGestures);\n",
+    "/**\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  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n",
+    "/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 'body /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 head = document.head;\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  ];\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 wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };\n\n  var eventFactory = scope.eventFactory;\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    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    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      this.gestures.push(source);\n    },\n    register: function(element) {\n      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill\n      if (window.ShadowDOMPolyfill && element !== document) {\n        return;\n      }\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);\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.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    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\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      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\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      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\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          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\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; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          if (g.events.indexOf(e.type) >= 0) {\n            g[e.type].call(g, e);\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      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  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\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  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    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    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      this.gestures.push(source);\n    },\n    register: 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.register.call(es, element);\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.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    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\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      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\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      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\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          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\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; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\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      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  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\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 uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\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    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      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        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = e.target;\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 ATTRIB = 'touch-action';\n  var INSTALLER;\n  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\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 = false;\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        return scope.findTarget(touch);\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      // 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; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\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 scrollAxis = inEvent.currentTarget._scrollType;\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        this.firstXY = null;\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.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\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      var p = pointermap.set(inPointer.pointerId, inPointer.target);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n            this.touchcancel(inEvent);\n          } else {\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      var pointer = pointermap.get(inPointer.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\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      if (!this.scrolling) {\n        inPointer.relatedTarget = scope.findTarget(inPointer);\n        dispatcher.up(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    cancel: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.cancel(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\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  if (!HAS_TOUCH_ACTION) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\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 = e.target;\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      return dispatcher.cloneEvent(inEvent);\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\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 = e.target;\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(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    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(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 e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(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  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\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: scope.wrap(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 = scope.wrap(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 scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\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 (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\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.wrap(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  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\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      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(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.wrap(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      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(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.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.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  dispatcher.register(document);\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     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       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId\n       });\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             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', 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 released\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    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      };\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    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          });\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, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\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.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (accessor == '[' && !(property instanceof Literal));\n\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\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.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\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) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\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(value, toModelDirection, filterRegistry, model,\n                        observer) {\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 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('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\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) {\n        return unaryOperators[op](argument(model, observer));\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      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\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    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) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\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) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\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);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\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(newValue, true, filterRegistry,\n                                                 model);\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        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\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 */\nPolymer = {\n  version: '0.3.1-604ba08'\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     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       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\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             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', 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    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    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      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      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.3.3-0e73963'\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(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  // exports\n\n  scope.extend = extend;\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",
@@ -75,19 +75,19 @@
     "/*\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  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\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      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = 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\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  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      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = 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        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 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})(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 properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObservers([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(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return bindProperties(this, property, observable);\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    registerObservers: function(observers) {\n      this._observers = this._observers || [];\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\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  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(a, property, observable) {\n    // apply Polymer two-way reference binding\n    return Observer.bindToInstance(a, property, observable, resolveBindingValue);\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  // 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 a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      this.registerObservers(dom.bindings_);\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      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\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      // TODO (sorvell): temporarily open observer when created\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      // 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      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\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      // set up polymer gestures\n      PolymerGestures.register(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\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(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n",
+    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(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      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\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      // TODO (sorvell): temporarily open observer when created\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      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\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      // set up polymer gestures\n      PolymerGestures.register(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  \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 (window.ShadowDOMPolyfill) {\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      scope._scopeStyles[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      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\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 (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\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})(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    Platform.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  // 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 Platform.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 (window.ShadowDOMPolyfill) {\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        node.addEventListener(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            node.removeEventListener(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    },\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    // sync prototype to property descriptors; \n    // desriptor format contains default value and optionally a \n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    // \n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // 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 propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor); \n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' && \n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\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    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          Observer.createBindablePrototypeAccessor(prototype, 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\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\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          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            publish[n] = Polymer.nob;\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  // 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    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // 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 propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\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\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\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          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\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 && Platform.templateContent(template);\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  // 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 (window.ShadowDOMPolyfill) {\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    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\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    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\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    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\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      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\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    waitToReady: true\n  };\n\n  var flushQueue = [];\n\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  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\n})(Polymer);\n",
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js b/pkg/polymer/lib/src/js/polymer/polymer.js
index 9691d8b..4882e7f 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js
@@ -7,7 +7,8 @@
  * 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.3.1-604ba08
-window.PolymerGestures={},function(a){var b={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){if(a){var d,e,f=a.elementFromPoint(b,c);for(e=this.targetingShadow(f);e;){if(d=e.elementFromPoint(b,c)){var g=this.targetingShadow(d);return this.searchRoot(g,b,c)||d}e=this.olderShadow(e)}return f}},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){var b=a.clientX,c=a.clientY,d=this.owner(a.target);return d.elementFromPoint(b,c)||(d=document),this.searchRoot(d,b,c)},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=this.walk(a,1),b=this.walk(b,1);return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=b,a.findTarget=b.findTarget.bind(b),a.deepContains=b.deepContains.bind(b),a.insideNode=b.insideNode}(window.PolymerGestures),function(){function a(a){return"body /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"]}],e="",f=(document.head,"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}};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=["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"],c=[!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],d="undefined"!=typeof SVGElementInstance,e=window.ShadowDOMPolyfill&&ShadowDOMPolyfill.wrapIfNeeded||function(a){return a},f=a.eventFactory,g={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],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){this.gestures.push(b)},register:function(a){if(!window.ShadowDOMPolyfill||a===document)for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},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.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){b.forEach(function(b){this.addEvent(a,b)},this)},unlisten:function(a,b){b.forEach(function(b){this.removeEvent(a,b)},this)},addEvent:function(a,b){window.ShadowDOMPolyfill?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){window.ShadowDOMPolyfill?a.removeEventListener_(b,this.boundHandler):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 f,g=Object.create(null),h=0;h<b.length;h++)f=b[h],g[f]=a[f]||c[h],("target"===f||"relatedTarget"===f)&&(d&&g[f]instanceof SVGElementInstance&&(g[f]=g[f].correspondingUseElement),g[f]=e(g[f]));return g.preventDefault=a.preventDefault,g},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=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d=0;d<this.gestures.length;d++)c=this.gestures[d],c.events.indexOf(a.type)>=0&&c[a.type].call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};g.boundHandler=g.eventHandler.bind(g),g.boundGestureTrigger=g.gestureTrigger.bind(g),a.dispatcher=g,a.register=g.register.bind(g),a.unregister=g.unregister.bind(g)}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(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"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,f||(c.buttons=e[c.which]||0),c},mousedown:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=c.has(this.POINTER_ID);d&&this.mouseup(a);var e=this.prepareEvent(a);c.set(this.POINTER_ID,e.target),b.down(e)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(this.POINTER_ID),b.up(d),this.cleanupMouse()}},cleanupMouse:function(){c["delete"](this.POINTER_ID)}};a.mouseEvents=h}(window.PolymerGestures),function(a){var b,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h="touch-action",i="string"==typeof document.head.style.touchAction,j={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){i?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){i&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(h),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(h),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.has(1))&&(this.firstTouch=a.identifier,this.firstXY={X:a.clientX,Y:a.clientY},this.scrolling=!1,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,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){return"touchstart"===this.currentTouchEvent.type?a.findTarget(b):e.get(c)},touchToPointer:function(a){var b=this.currentTouchEvent,d=c.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(b.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;var f=this;return d.preventDefault=function(){f.scrolling=!1,f.firstXY=null,b.preventDefault()},d},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,e=0;e<c.length;e++)d=c[e],b.call(this,this.touchToPointer(d))},shouldScroll:function(a){if(this.firstXY){var b,c=a.currentTarget._scrollType;if("none"===c)b=!1;else if("XY"===c)b=!0;else{var d=a.changedTouches[0],e=c,f="Y"===c?"X":"Y",g=Math.abs(d["client"+e]-this.firstXY[e]),h=Math.abs(d["client"+f]-this.firstXY[f]);b=g>=h}return this.firstXY=null,b}},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(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a.out;c.push(e)}},this),c.forEach(this.cancelOut,this)}},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){e.set(a.pointerId,a.target);c.down(a)},touchmove:function(a){i?this.processTouches(a,this.move):this.scrolling||(this.shouldScroll(a)?(this.scrolling=!0,this.touchcancel(a)):(a.preventDefault(),this.processTouches(a,this.move)))},move:function(a){var b=e.get(a.pointerId);b&&c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){this.scrolling||(b.relatedTarget=a.findTarget(b),c.up(b)),this.cleanUpPointer(b)},cancel:function(b){b.relatedTarget=a.findTarget(b),c.cancel(b),this.cleanUpPointer(b)},touchcancel:function(a){this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};i||(b=new a.Installer(j.elementAdded,j.elementRemoved,j.elementChanged,j)),a.touchEvents=j}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d=window.MSPointerEvent&&"number"==typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE,e={events:["MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel"],register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return d&&(c=b.cloneEvent(a),c.pointerType=this.POINTER_TYPES[a.pointerType]),c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(a){var d=this.prepareEvent(a);c.set(a.pointerId,d.target),b.down(d)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.up(d),this.cleanup(a.pointerId)},MSPointerCancel:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.cancel(d),this.cleanup(a.pointerId)}};a.msEvents=e}(window.PolymerGestures),function(a){var b=a.dispatcher,c=b.pointermap,d={events:["pointerdown","pointermove","pointerup","pointercancel"],prepareEvent:function(a){return b.cloneEvent(a)},register:function(a){b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(a){var d=this.prepareEvent(a);c.set(d.pointerId,d.target),b.down(d)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.up(d),this.cleanup(a.pointerId)},pointercancel:function(a){var d=this.prepareEvent(a);d.relatedTarget=d.target,d.target=c.get(d.pointerId),b.cancel(d),this.cleanup(a.pointerId)}};a.pointerEvents=d}(window.PolymerGestures),function(a){var b=a.dispatcher;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],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);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId});e.downTarget.dispatchEvent(h)},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)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",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"],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};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"],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});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;for(a=C();v(".")||v("[");)v("[")?(b=G(),a=Z.createMemberExpression("[",a,b)):(b=F(),a=Z.createMemberExpression(".",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.dynamicDeps="function"==typeof a||a.dynamicDeps||"["==c&&!(b instanceof d),"["==c&&b instanceof d&&Path.get(b.value).valid&&(c=".",b=new e(b.value)),this.simplePath=!this.dynamicDeps&&b instanceof e&&(a instanceof f||a instanceof e),this.object=this.simplePath?a:i(a),this.property="."==c?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 e?this.object.name:this.object.fullPath;this.fullPath_=Path.get(a+"."+this.property.name)}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.property instanceof e){var b=Path.get(this.property.name);this.valueFn_=function(c,d){var e=a(c,d);return d&&d.addPath(e,b),b.getValueFrom(e)}}else{var c=this.property;this.valueFn_=function(b,d){var e=a(b,d),f=c(b,d);return d&&d.addPath(e,f),e?e[f]:void 0}}}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=d;if(f)g=void 0;else if(f=g[this.name],!f)return void console.error("Cannot find filter: "+this.name);if(b?f=f.toModel:"function"==typeof f.toDOM&&(f=f.toDOM),"function"!=typeof f)return void console.error("No "+(b?"toModel":"toDOM")+" found on"+this.name);
-for(var h=[a],j=0;j<this.args.length;j++)h[j+1]=i(this.args[j])(d,e);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){return r[a](b(c,d))}},createBinaryExpression:function(a,b,c){if(!s[a])throw Error("Disallowed operator: "+a);return b=i(b),c=i(c),function(d,e){return s[a](b(d,e),c(d,e))}},createConditionalExpression:function(a,b,c){return a=i(a),b=i(b),c=i(c),function(d,e){return a(d,e)?b(d,e):c(d,e)}},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},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){for(var d=[],e=0;e<a.length;e++)d.push(a[e](b,c));return d}},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){for(var d={},e=0;e<a.length;e++)d[a[e].key]=a[e].value(b,c);return d}},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),e=0;e<this.filters.length;e++)d=this.filters[e].transform(d,!1,c,a,b);return d},setValue:function(a,b,c){for(var d=this.filters?this.filters.length:0;d-->0;)b=this.filters[d].transform(b,!0,c,a);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){var e=Object.create(c);return e[b]=a,e[d]=void 0,e[t]=c,e}}}},a.PolymerExpressions=p,a.exposeGetExpression&&(a.getExpression_=c)}(this),Polymer={version:"0.3.1-604ba08"},"function"==typeof window.Polymer&&(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}a.extend=b}(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(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(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,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},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=b}(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=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)}},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];this.addEventListener(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}(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,d){return Observer.bindToInstance(a,b,d,c)}function c(a,b){return void 0===b&&null===a?b:null===b||void 0===b?a:b}var d=window.logFlags||{},e={createPropertyObserver:function(){var a=this._observeNames;if(a&&a.length){var b=this._propertyObserver=new CompoundObserver(!0);this.registerObservers([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,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},bindProperty:function(a,c,d){return d?void(this[a]=c):b(this,a,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObservers:function(a){this._observers=this._observers||[],this._observers.push(a)},closeObservers:function(){if(this._observers){for(var a=0,b=this._observers.length;b>a;a++)this.closeObserverArray(this._observers[a]);this._observers=[]}},closeObserverArray:function(a){for(var b,c=0,d=a.length;d>c;c++)b=a[c],b&&b.close&&b.close()},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=e}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){var b=this.syntax||!a.bindingDelegate&&this.element.syntax,c=a.createInstance(this,b);return this.registerObservers(c.bindings_),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||window.ShadowDOMPolyfill)&&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.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),PolymerGestures.register(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||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,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(e),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,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.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),window.ShadowDOMPolyfill&&(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+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.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 p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={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 Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),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(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),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(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+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}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,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 d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(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)}},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],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)Observer.createBindablePrototypeAccessor(a,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,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)f=h[i].trim(),f&&void 0===g[f]&&void 0===d[f]&&(g[f]=Polymer.nob)},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&&Platform.templateContent(a)},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={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(),window.ShadowDOMPolyfill&&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),g[a]=b}return b},findBasePrototype:function(a){return g[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}},g={};f.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=f}(Polymer),function(a){function b(a){return document.contains(a)?h:g}function c(){return g.length?g[0]:h[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){var d=-1===this.indexOf(a)&&-1===f.indexOf(a);return d&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?g.length:1e9),c},go:function(a){var b=this.remove(a);b&&(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.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!g.length&&!h.length},addToFlushQueue:function(a){f.push(a)},flush:function(){for(var a;f.length;)a=f.shift(),a.__go.call(a),a.__check=a.__go=null},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&i.push(a)},flushReadyCallbacks:function(){if(i)for(var a;i.length;)(a=i.shift())()},waitToReady:!0},f=[],g=[],h=[],i=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(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(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.whenPolymerReady,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"),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){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(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(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
+// @version: 0.3.3-0e73963
+window.PolymerGestures={hasSDPolyfill:Boolean(window.ShadowDOMPolyfill)},PolymerGestures.wrap=PolymerGestures.hasSDPolyfill?ShadowDOMPolyfill.wrapIfNeeded:function(a){return a},function(a){var b=!1,c=document.createElement("meta");if(!a.hasSDPolyfill&&c.createShadowRoot){var d=c.createShadowRoot(),e=document.createElement("span");d.appendChild(e),c.addEventListener("testpath",function(a){a.path&&(b=a.path[0]===e),a.stopPropagation()});var f=new CustomEvent("testpath",{bubbles:!0});document.head.appendChild(c),e.dispatchEvent(f),c.parentNode.removeChild(c),d=e=null}c=null;var g={shadow:function(a){return a?a.shadowRoot||a.webkitShadowRoot:void 0},canTarget:function(a){return a&&Boolean(a.elementFromPoint)},targetingShadow:function(a){var b=this.shadow(a);return this.canTarget(b)?b:void 0},olderShadow:function(a){var b=a.olderShadowRoot;if(!b){var c=a.querySelector("shadow");c&&(b=c.olderShadowRoot)}return b},allShadows:function(a){for(var b=[],c=this.shadow(a);c;)b.push(c),c=this.olderShadow(c);return b},searchRoot:function(a,b,c){var d,e;return a?(d=a.elementFromPoint(b,c),d?e=this.targetingShadow(d):a!==document&&(e=this.olderShadow(a)),this.searchRoot(e,b,c)||d):void 0},owner:function(a){if(!a)return document;for(var b=a;b.parentNode;)b=b.parentNode;return b.nodeType!=Node.DOCUMENT_NODE&&b.nodeType!=Node.DOCUMENT_FRAGMENT_NODE&&(b=document),b},findTarget:function(a){if(b&&a.path)return a.path[0];var c=a.clientX,d=a.clientY,e=this.owner(a.target);return e.elementFromPoint(c,d)||(e=document),this.searchRoot(e,c,d)},findScrollAxis:function(c){var d;if(b&&c.path){for(var e=c.path,f=0;f<e.length;f++)if(d=e[f],d._scrollType)return d._scrollType}else for(d=a.wrap(c.currentTarget);d;){if(d._scrollType)return d._scrollType;d=d.parentNode||d.host}},LCA:function(a,b){if(a===b)return a;if(a&&!b)return a;if(b&&!a)return b;if(!b&&!a)return document;if(a.contains&&a.contains(b))return a;if(b.contains&&b.contains(a))return b;var c=this.depth(a),d=this.depth(b),e=c-d;for(e>=0?a=this.walk(a,e):b=this.walk(b,-e);a&&b&&a!==b;)a=a.parentNode||a.host,b=b.parentNode||b.host;return a},walk:function(a,b){for(var c=0;a&&b>c;c++)a=a.parentNode||a.host;return a},depth:function(a){for(var b=0;a;)b++,a=a.parentNode||a.host;return b},deepContains:function(a,b){var c=this.LCA(a,b);return c===a},insideNode:function(a,b,c){var d=a.getBoundingClientRect();return d.left<=b&&b<=d.right&&d.top<=c&&c<=d.bottom}};a.targetFinding=g,a.findTarget=g.findTarget.bind(g),a.deepContains=g.deepContains.bind(g),a.insideNode=g.insideNode}(window.PolymerGestures),function(){function a(a){return"body /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=(document.head,"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=["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"],c=[!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],d="undefined"!=typeof SVGElementInstance,e=a.eventFactory,f=a.hasSDPolyfill,g=a.wrap,h={pointermap:new a.PointerMap,eventMap:Object.create(null),eventSources:Object.create(null),eventSourceList:[],gestures:[],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){this.gestures.push(b)},register:function(a){for(var b,c=this.eventSourceList.length,d=0;c>d&&(b=this.eventSourceList[d]);d++)b.register.call(b,a)},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.fireEvent("down",a)},move:function(a){a.type="move",this.fillGestureQueue(a)},up:function(a){this.fireEvent("up",a)},cancel:function(a){a.tapPrevented=!0,this.fireEvent("up",a)},eventHandler:function(a){if(!a._handledByPG){var b=a.type,c=this.eventMap&&this.eventMap[b];c&&c(a),a._handledByPG=!0}},listen:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.addEvent(a,c)},unlisten:function(a,b){for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.removeEvent(a,c)},addEvent:function(a,b){f?a.addEventListener_(b,this.boundHandler):a.addEventListener(b,this.boundHandler)},removeEvent:function(a,b){f?a.removeEventListener_(b,this.boundHandler):a.removeEventListener(b,this.boundHandler)},makeEvent:function(a,b){var c=e.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 e,f=Object.create(null),h=0;h<b.length;h++)e=b[h],f[e]=a[e]||c[h],("target"===e||"relatedTarget"===e)&&(d&&f[e]instanceof SVGElementInstance&&(f[e]=f[e].correspondingUseElement),f[e]=g(f[e]));return f.preventDefault=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=0;b<this.gestureQueue.length;b++){a=this.gestureQueue[b];for(var c,d,e=0;e<this.gestures.length;e++)c=this.gestures[e],d=c[a.type],d&&d.call(c,a)}this.gestureQueue.length=0},fillGestureQueue:function(a){this.gestureQueue.length||requestAnimationFrame(this.boundGestureTrigger),this.gestureQueue.push(a)}};h.boundHandler=h.eventHandler.bind(h),h.boundGestureTrigger=h.gestureTrigger.bind(h),a.dispatcher=h,a.register=function(a){h.register(a)},a.unregister=h.unregister.bind(h),a.wrap=g}(window.PolymerGestures),function(a){function b(a,b,c,d){this.addCallback=a.bind(d),this.removeCallback=b.bind(d),this.changedCallback=c.bind(d),g&&(this.observer=new g(this.mutationWatcher.bind(this)))}var c=Array.prototype.forEach.call.bind(Array.prototype.forEach),d=Array.prototype.map.call.bind(Array.prototype.map),e=Array.prototype.slice.call.bind(Array.prototype.slice),f=Array.prototype.filter.call.bind(Array.prototype.filter),g=window.MutationObserver||window.WebKitMutationObserver,h="[touch-action]",i={subtree:!0,childList:!0,attributes:!0,attributeOldValue:!0,attributeFilter:["touch-action"]};b.prototype={watchSubtree:function(b){a.targetFinding.canTarget(b)&&this.observer.observe(b,i)},enableOnSubtree:function(a){this.watchSubtree(a),a===document&&"complete"!==document.readyState?this.installOnLoad():this.installNewSubtree(a)},installNewSubtree:function(a){c(this.findElements(a),this.addElement,this)},findElements:function(a){return a.querySelectorAll?a.querySelectorAll(h):[]},removeElement:function(a){this.removeCallback(a)},addElement:function(a){this.addCallback(a)},elementChanged:function(a,b){this.changedCallback(a,b)},concatLists:function(a,b){return a.concat(e(b))},installOnLoad:function(){document.addEventListener("readystatechange",function(){"complete"===document.readyState&&this.installNewSubtree(document)}.bind(this))},isElement:function(a){return a.nodeType===Node.ELEMENT_NODE},flattenMutationTree:function(a){var b=d(a,this.findElements,this);return b.push(f(a,this.isElement)),b.reduce(this.concatLists,[])},mutationWatcher:function(a){a.forEach(this.mutationHandler,this)},mutationHandler:function(a){if("childList"===a.type){var b=this.flattenMutationTree(a.addedNodes);b.forEach(this.addElement,this);var c=this.flattenMutationTree(a.removedNodes);c.forEach(this.removeElement,this)}else"attributes"===a.type&&this.elementChanged(a.target,a.oldValue)}},g||(b.prototype.watchSubtree=function(){console.warn("PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected")}),a.Installer=b}(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"],register:function(a){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},lastTouches:[],isEventSimulatedFromTouch:function(a){for(var b,c=this.lastTouches,e=a.clientX,f=a.clientY,g=0,h=c.length;h>g&&(b=c[g]);g++){var i=Math.abs(e-b.x),j=Math.abs(f-b.y);if(d>=i&&d>=j)return!0}},prepareEvent:function(a){var c=b.cloneEvent(a);return c.pointerId=this.POINTER_ID,c.isPrimary=!0,c.pointerType=this.POINTER_TYPE,c._source="mouse",f||(c.buttons=e[c.which]||0),c},mousedown:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=c.has(this.POINTER_ID);e&&this.mouseup(d);var f=this.prepareEvent(d);f.target=a.wrap(a.findTarget(d)),c.set(this.POINTER_ID,f.target),b.down(f)}},mousemove:function(a){if(!this.isEventSimulatedFromTouch(a)){var d=this.prepareEvent(a);d.target=c.get(this.POINTER_ID),b.move(d)}},mouseup:function(d){if(!this.isEventSimulatedFromTouch(d)){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(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,c=a.dispatcher,d=a.targetFinding.allShadows.bind(a.targetFinding),e=c.pointermap,f=(Array.prototype.map.call.bind(Array.prototype.map),2500),g=200,h=20,i="touch-action",j=!1,k={events:["touchstart","touchmove","touchend","touchcancel"],register:function(a){j?c.listen(a,this.events):b.enableOnSubtree(a)},unregister:function(a){j&&c.unlisten(a,this.events)},elementAdded:function(a){var b=a.getAttribute(i),e=this.touchActionToScrollType(b);e&&(a._scrollType=e,c.listen(a,this.events),d(a).forEach(function(a){a._scrollType=e,c.listen(a,this.events)},this))},elementRemoved:function(a){a._scrollType=void 0,c.unlisten(a,this.events),d(a).forEach(function(a){a._scrollType=void 0,c.unlisten(a,this.events)},this)},elementChanged:function(a,b){var c=a.getAttribute(i),e=this.touchActionToScrollType(c),f=this.touchActionToScrollType(b);e&&f?(a._scrollType=e,d(a).forEach(function(a){a._scrollType=e},this)):f?this.elementRemoved(a):e&&this.elementAdded(a)},scrollTypes:{EMITTER:"none",XSCROLLER:"pan-x",YSCROLLER:"pan-y",SCROLLER:/^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/},touchActionToScrollType:function(a){var b=a,c=this.scrollTypes;return"none"===b?"none":b===c.XSCROLLER?"X":b===c.YSCROLLER?"Y":c.SCROLLER.exec(b)?"XY":void 0},POINTER_TYPE:"touch",firstTouch:null,isPrimaryTouch:function(a){return this.firstTouch===a.identifier},setPrimaryTouch:function(a){(0===e.pointers()||1===e.pointers()&&e.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,g)},cancelResetClickCount:function(){this.resetId&&clearTimeout(this.resetId)},typeToButtons:function(a){var b=0;return("touchstart"===a||"touchmove"===a)&&(b=1),b},findTarget:function(b,c){if("touchstart"===this.currentTouchEvent.type){if(this.isPrimaryTouch(b)){var d={clientX:b.clientX,clientY:b.clientY,path:this.currentTouchEvent.path,target:a.wrap(this.currentTouchEvent.target)};return a.findTarget(d)}return a.findTarget(b)}return e.get(c)},touchToPointer:function(b){var d=this.currentTouchEvent,e=c.cloneEvent(b),f=e.pointerId=b.identifier+2;e.target=a.wrap(this.findTarget(b,f)),e.bubbles=!0,e.cancelable=!0,e.detail=this.clickCount,e.buttons=this.typeToButtons(d.type),e.width=b.webkitRadiusX||b.radiusX||0,e.height=b.webkitRadiusY||b.radiusY||0,e.pressure=b.webkitForce||b.force||.5,e.isPrimary=this.isPrimaryTouch(b),e.pointerType=this.POINTER_TYPE,e._source="touch";var g=this;return e.preventDefault=function(){g.scrolling=!1,g.firstXY=null,d.preventDefault()},e},processTouches:function(a,b){var c=a.changedTouches;this.currentTouchEvent=a;for(var d,f,g=0;g<c.length;g++)d=c[g],f=this.touchToPointer(d),"touchstart"===a.type&&e.set(f.pointerId,f.target),e.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.findScrollAxis(b);if("none"===d)c=!1;else if("XY"===d)c=!0;else{var e=b.changedTouches[0],f=d,g="Y"===d?"X":"Y",h=Math.abs(e["client"+f]-this.firstXY[f]),i=Math.abs(e["client"+g]-this.firstXY[g]);c=h>=i}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(e.pointers()>=b.length){var c=[];e.forEach(function(a,d){if(1!==d&&!this.findTouch(b,d-2)){var e=a;c.push(e)}},this),c.forEach(function(a){this.cancel(a),e.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){c.down(a)},touchmove:function(a){if(j)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>=h&&(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){c.move(a)},touchend:function(a){this.dedupSynthMouse(a),this.processTouches(a,this.up)},up:function(b){b.relatedTarget=a.wrap(a.findTarget(b)),c.up(b)},cancel:function(a){c.cancel(a)},touchcancel:function(a){a._cancel=!0,this.processTouches(a,this.cancel)},cleanUpPointer:function(a){e["delete"](a.pointerId),this.removePrimaryPointer(a)},dedupSynthMouse:function(b){var c=a.mouseEvents.lastTouches,d=b.changedTouches[0];if(this.isPrimaryTouch(d)){var e={x:d.clientX,y:d.clientY};c.push(e);var g=function(a,b){var c=a.indexOf(b);c>-1&&a.splice(c,1)}.bind(null,c,e);setTimeout(g,f)}}};j||(b=new a.Installer(k.elementAdded,k.elementRemoved,k.elementChanged,k)),a.touchEvents=k}(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){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},POINTER_TYPES:["","unavailable","touch","pen","mouse"],prepareEvent:function(a){var c=a;return c=b.cloneEvent(a),d&&(c.pointerType=this.POINTER_TYPES[a.pointerType]),c._source="ms",c},cleanup:function(a){c["delete"](a)},MSPointerDown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(d.pointerId,e.target),b.down(e)},MSPointerMove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},MSPointerUp:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(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.wrap(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){a===document&&b.listen(a,this.events)},unregister:function(a){b.unlisten(a,this.events)},cleanup:function(a){c["delete"](a)},pointerdown:function(d){var e=this.prepareEvent(d);e.target=a.wrap(a.findTarget(d)),c.set(e.pointerId,e.target),b.down(e)},pointermove:function(a){var d=this.prepareEvent(a);d.target=c.get(d.pointerId),b.move(d)},pointerup:function(d){var e=this.prepareEvent(d);e.relatedTarget=a.wrap(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.wrap(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;window.PointerEvent?b.registerSource("pointer",a.pointerEvents):window.navigator.msPointerEnabled?b.registerSource("ms",a.msEvents):(b.registerSource("mouse",a.mouseEvents),void 0!==window.ontouchstart&&b.registerSource("touch",a.touchEvents)),b.register(document)}(window.PolymerGestures),function(a){var b=a.dispatcher,c=a.eventFactory,d=new a.PointerMap,e={events:["down","move","up"],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);g.x&&(e.xDirection=this.clampDir(g.x)),g.y&&(e.yDirection=this.clampDir(g.y));var h=c.makeGestureEvent(a,{bubbles:!0,cancelable:!0,dx:f.x,dy:f.y,ddx:g.x,ddy:g.y,x:b.x,y:b.y,clientX:b.clientX,clientY:b.clientY,pageX:b.pageX,pageY:b.pageY,screenX:b.screenX,screenY:b.screenY,xDirection:e.xDirection,yDirection:e.yDirection,trackInfo:e.trackInfo,relatedTarget:b.relatedTarget,pointerType:b.pointerType,pointerId:b.pointerId,_source:"track"});e.downTarget.dispatchEvent(h)},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)this.fireTrack("track",a,b);else{var c=this.calcPositionDelta(b.downEvent,a),e=c.x*c.x+c.y*c.y;e>this.WIGGLE_THRESHOLD&&(b.tracking=!0,this.fireTrack("trackstart",b.downEvent,b),this.fireTrack("track",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"],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"],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);return b=i(b),c=i(c),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),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.3.3-0e73963"},"function"==typeof window.Polymer&&(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}a.extend=b}(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(){var a={};HTMLElement.register=function(b,c){a[b]=c},HTMLElement.getPrototypeForTag=function(b){var c=b?a[b]:HTMLElement.prototype;return c||Object.getPrototypeOf(document.createElement(b))};var b=Event.prototype.stopPropagation;Event.prototype.stopPropagation=function(){this.cancelBubble=!0,b.apply(this,arguments)}}(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,b){var d=typeof b;return b instanceof Date&&(d="date"),c[d](a,b)}var c={string:function(a){return a},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=b}(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=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];this.addEventListener(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}(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,b){this.invokeMethod(e,[b])},this),this.registerNamedObserver(a+"__array",f)}},emitPropertyChangeRecord:function(a,c,d){if(!b(c,d)&&(this.propertyChanged_(a,c,d),Observer.hasObjectObserve)){var f=this.notifier_;f||(f=this.notifier_=Object.getNotifier(this)),e.object=this,e.name=a,e.oldValue=d,f.notify(e)}},bindToAccessor:function(a,c,d){var e=a+"_",f=a+"Observable_";this[f]=c;var g=this[e],h=this,i=c.open(function(b,c){h[e]=b,h.emitPropertyChangeRecord(a,b,c)});if(d&&!b(g,i)){var j=d(g,i);b(i,j)||(i=j,c.setValue&&c.setValue(i))}this[e]=i,this.emitPropertyChangeRecord(a,i,g);var k={close:function(){c.close(),h[f]=void 0}};return this.registerObserver(k),k},createComputedProperties:function(){if(this._computedNames)for(var a=0;a<this._computedNames.length;a++){var b=this._computedNames[a],c=this.computed[b];try{var d=PolymerExpressions.getExpression(c),e=d.getBinding(this,this.element.syntax);this.bindToAccessor(b,e)}catch(f){console.error("Failed to create computed property",f)}}},bindProperty:function(a,b,d){return d?void(this[a]=b):this.bindToAccessor(a,b,c)},invokeMethod:function(a,b){var c=this[a]||a;"function"==typeof c&&c.apply(this,b)},registerObserver:function(a){return this._observers?void this._observers.push(a):void(this._observers=[a])},closeObservers:function(){if(this._observers){for(var a=this._observers,b=0;b<a.length;b++){var c=a[b];c&&"function"==typeof c.close&&c.close()}this._observers=[]}},registerNamedObserver:function(a,b){var c=this._namedObservers||(this._namedObservers={});c[a]=b},closeNamedObserver:function(a){var b=this._namedObservers;return b&&b[a]?(b[a].close(),b[a]=null,!0):void 0},closeNamedObservers:function(){if(this._namedObservers){for(var a in this._namedObservers)this.closeNamedObserver(a);this._namedObservers={}}}};a.api.instance.properties=g}(Polymer),function(a){var b=window.logFlags||0,c={instanceTemplate:function(a){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||window.ShadowDOMPolyfill)&&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),PolymerGestures.register(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||{},"element"),e="controller",f={STYLE_SCOPE_ATTRIBUTE:d,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(e),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,d){if(b=b||this.findStyleScope(),d=d||"",b){window.ShadowDOMPolyfill&&(a=c(a,b.host));var f=this.element.cssTextToScopeStyle(a,e);Polymer.applyStyleToScope(f,b),b._scopeStyles[this.localName+d]=!0}},findStyleScope:function(a){for(var b=a||this;b.parentNode;)b=b.parentNode;return b},scopeHasNamedStyle:function(a,b){return a._scopeStyles=a._scopeStyles||{},a._scopeStyles[b]}};a.api.instance.styles=f}(Polymer),function(a){function b(a,b){if(1===arguments.length&&"string"!=typeof arguments[0]){b=a;var c=document._currentScript;if(a=c&&c.parentNode&&c.parentNode.getAttribute?c.parentNode.getAttribute("name"):"",!a)throw"Element name could not be inferred."}if(f[a])throw"Already registered (Polymer) prototype for element "+a;e(a,b),d(a)}function c(a,b){h[a]=b}function d(a){h[a]&&(h[a].registerWhenReady(),delete h[a])}function e(a,b){return i[a]=b||{}}function f(a){return i[a]}var g=a.extend,h=(a.api,{}),i={};a.getRegisteredPrototype=f,a.waitingForPrototype=c,window.Polymer=b,g(Polymer,a);var j=Platform.deliverDeclarations();if(j)for(var k,l=0,m=j.length;m>l&&(k=j[l]);l++)b.apply(null,k)}(Polymer),function(a){var b={resolveElementPaths:function(a){Platform.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),window.ShadowDOMPolyfill&&(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+"]",i=document.head.querySelectorAll(g);i.length&&(f=i[i.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 p?p.call(a,b):void 0}var g=(window.logFlags||{},a.api.instance.styles),h=g.STYLE_SCOPE_ATTRIBUTE,i="style",j="@import",k="link[rel=stylesheet]",l="global",m="polymer-scope",n={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 Platform.styleResolver.loadStyles(d,e,a)}}a&&a()},convertSheetsToStyles:function(a){for(var c,e,f=a.querySelectorAll(k),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(i),e=0,f=d.length;f>e&&(c=d[e]);e++)c.textContent.match(j)&&b.push(c);return b},installSheets:function(){this.cacheSheets(),this.cacheStyles(),this.installLocalSheets(),this.installGlobalStyles()},cacheSheets:function(){this.sheets=this.findNodes(k),this.sheets.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},cacheStyles:function(){this.styles=this.findNodes(i+"["+m+"]"),this.styles.forEach(function(a){a.parentNode&&a.parentNode.removeChild(a)})},installLocalSheets:function(){var a=this.sheets.filter(function(a){return!a.hasAttribute(m)}),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(l);c(a,document.head)},cssTextForScope:function(a){var b="",c="["+m+"="+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}}},o=HTMLElement.prototype,p=o.matches||o.matchesSelector||o.webkitMatchesSelector||o.mozMatchesSelector;a.api.declaration.styles=n,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 d.addEventListener(c,h),f?void 0:{open:g,discardChanges:g,close:function(){d.removeEventListener(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],e=this.reflectHintForDescriptor(d);void 0===b.reflect[c]&&void 0!==e&&(b.reflect[c]=e),void 0===b[c]&&(b[c]=this.valueForDescriptor(d))}},valueForDescriptor:function(a){var b="object"==typeof a&&a?a.value:a;return void 0!==b?b:null},reflectHintForDescriptor:function(a){return"object"==typeof a&&a&&void 0!==a.reflect?a.reflect:void 0},lowerCaseMap:function(a){var b={};for(var c in a)b[c.toLowerCase()]=c;return b},createPropertyAccessor:function(a){var b=this.prototype,c=a+"_",d=a+"Observable_";b[c]=b[a],Object.defineProperty(b,a,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(b){var e=this[d];if(e)return void e.setValue(b);var f=this[c];return this[c]=b,this.emitPropertyChangeRecord(a,b,f),b},configurable:!0})},createPropertyAccessors:function(a){var b=a._publishNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c);var b=a._computedNames;if(b&&b.length)for(var c,d=0,e=b.length;e>d&&(c=b[d]);d++)this.createPropertyAccessor(c)}};a.api.declaration.properties=b}(Polymer),function(a){var b="attributes",c=/\s|,/,d={inheritAttributesObjects:function(a){this.inheritObject(a,"publishLC"),this.inheritObject(a,"_instanceAttributes")},publishAttributes:function(a,d){var e=this.getAttribute(b);if(e)for(var f,g=a.publish||(a.publish={}),h=e.split(c),i=0,j=h.length;j>i;i++)if(f=h[i].trim(),f&&void 0===g[f]){try{var k=void 0!==d[f]}catch(l){k=!1}k||(g[f]=Polymer.nob)}},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&&Platform.templateContent(a)},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={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(),window.ShadowDOMPolyfill&&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),g[a]=b}return b},findBasePrototype:function(a){return g[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}},g={};f.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=f}(Polymer),function(a){function b(a){return document.contains(a)?h:g}function c(){return g.length?g[0]:h[0]}function d(a){e.waitToReady=!0,CustomElements.ready=!1,HTMLImports.whenImportsReady(function(){e.addReadyCallback(a),e.waitToReady=!1,e.check()})}var e={wait:function(a,b,c){var d=-1===this.indexOf(a)&&-1===f.indexOf(a);return d&&(this.add(a),a.__check=b,a.__go=c),0!==this.indexOf(a)},add:function(a){b(a).push(a)},indexOf:function(a){var c=b(a).indexOf(a);return c>=0&&document.contains(a)&&(c+=HTMLImports.useNative||HTMLImports.ready?g.length:1e9),c},go:function(a){var b=this.remove(a);b&&(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.__check.call(a),this.canReady()?(this.ready(),!0):void 0},nextElement:function(){return c()},canReady:function(){return!this.waitToReady&&this.isEmpty()},isEmpty:function(){return!g.length&&!h.length},addToFlushQueue:function(a){f.push(a)},flush:function(){for(var a;f.length;)a=f.shift(),a.__go.call(a),a.__check=a.__go=null},ready:function(){this.flush(),CustomElements.ready===!1&&(CustomElements.upgradeDocumentTree(document),CustomElements.ready=!0),Platform.flush(),requestAnimationFrame(this.flushReadyCallbacks)},addReadyCallback:function(a){a&&i.push(a)},flushReadyCallbacks:function(){if(i)for(var a;i.length;)(a=i.shift())()
+},waitToReady:!0},f=[],g=[],h=[],i=[];document.addEventListener("WebComponentsReady",function(){CustomElements.ready=!1}),a.queue=e,a.whenPolymerReady=d}(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(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.whenPolymerReady,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"),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){if(this.hasAttribute("noscript")&&!this.noscript)if(this.noscript=!0,window.CustomElements&&!CustomElements.useNative)Polymer(a);else{var b=document.createElement("script");b.textContent="Polymer('"+a+"');",this.appendChild(b)}},waitingForResources:function(){return this._needsResources},waitingForQueue:function(){return f.wait(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(){var a=document.createElement("polymer-element");a.setAttribute("name","auto-binding"),a.setAttribute("extends","template"),a.init(),Polymer("auto-binding",{createdCallback:function(){this.syntax=this.bindingDelegate=this.makeSyntax(),Polymer.whenPolymerReady(function(){this.model=this,this.setAttribute("bind",""),this.async(function(){this.marshalNodeReferences(this.parentNode),this.fire("template-bound")})}.bind(this))},makeSyntax:function(){var a=Object.create(Polymer.api.declaration.events),b=this;a.findController=function(){return b.model};var c=new PolymerExpressions,d=c.prepareBinding;return c.prepareBinding=function(b,e,f){return a.prepareEventBinding(b,e,f)||d.call(c,b,e,f)},c}})}();
 //# sourceMappingURL=polymer.js.map
\ No newline at end of file
diff --git a/pkg/polymer/lib/src/js/polymer/polymer.js.map b/pkg/polymer/lib/src/js/polymer/polymer.js.map
index ed7b3a9..bd030a6 100644
--- a/pkg/polymer/lib/src/js/polymer/polymer.js.map
+++ b/pkg/polymer/lib/src/js/polymer/polymer.js.map
@@ -1 +1 @@
-{"version":3,"file":"polymer.js","sources":["../../polymer-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/installer.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","polymer-versioned.js","../src/boot.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/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","scope","target","shadow","inEl","shadowRoot","webkitShadowRoot","canTarget","Boolean","elementFromPoint","targetingShadow","s","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","st","sr","t","ssr","owner","document","parentNode","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","LCA","a","b","contains","adepth","depth","bdepth","d","walk","n","u","i","host","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","head","style","touchAction","hasShadowRoot","ShadowDOMPolyfill","createShadowRoot","forEach","r","String","map","el","createElement","textContent","appendChild","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","bubbles","cancelable","makeGestureEvent","Object","create","k","keys","length","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","wrap","wrapIfNeeded","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","addEventListener","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","dispatchEvent","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","ev","requestAnimationFrame","boundGestureTrigger","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","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","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","ATTRIB","HAS_TOUCH_ACTION","touchEvents","elementAdded","getAttribute","touchActionToScrollType","_scrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","firstTouch","isPrimaryTouch","inTouch","identifier","setPrimaryTouch","firstXY","X","Y","scrolling","cancelResetClickCount","removePrimaryPointer","inPointer","resetClickCount","clickCount","resetId","setTimeout","clearTimeout","typeToButtons","ret","touch","id","currentTouchEvent","touchToPointer","cte","detail","webkitRadiusX","radiusX","webkitRadiusY","radiusY","webkitForce","force","self","processTouches","inFunction","tl","changedTouches","shouldScroll","scrollAxis","currentTarget","oa","da","doa","findTouch","inTL","vacuumTouches","touches","value","key","out","cancelOut","touchstart","dedupSynthMouse","touchmove","touchcancel","pointer","touchend","cleanUpPointer","lt","HAS_BITMAP_TYPE","MSPointerEvent","MSPOINTER_TYPE_MOUSE","msEvents","POINTER_TYPES","cleanup","MSPointerDown","MSPointerMove","MSPointerUp","MSPointerCancel","pointerEvents","pointerdown","pointermove","pointerup","pointercancel","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","dd","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","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","index","charCodeAt","getIdentifier","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","match","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","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","model","oneTime","binding","getBinding","polymerExpressionScopeIdent_","indexIdent","polymerExpressionIndexIdent_","expressionParseCache","ASTDelegate","Expression","valueFn_","IdentPath","path","Path","object","accessor","dynamicDeps","valid","simplePath","getFn","Filter","notImplemented","arg","valueFn","filters","deps","currentPath","ConstantObservable","value_","convertStylePropertyName","c","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3741,"pos":3733,"col":8,"line":123,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3741,"pos":3733,"col":8,"line":123,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","last","context","propName","transform","toModelDirection","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","open","discardChanges","deliver","close","firstTime","firstValue","startReset","getValue","finishReset","setValueFn","CompoundObserver","ObserverTransform","count","random","toString","styleObject","parts","join","tokenList","tokens","prepareInstancePositionChanged","template","templateInstance","PathObserver","prepareInstanceModel","scopeName","parentScope","exposeGetExpression","getExpression_","Polymer","version","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","defineProperty","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","stopPropagation","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","__proto__","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","CustomEvent","asyncFire","classFollows","anew","old","className","classList","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","bindProperties","observable","Observer","bindToInstance","resolveBindingValue","createPropertyObserver","_observeNames","o","_propertyObserver","registerObservers","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","bindProperty","observers","_observers","closeObservers","closeObserverArray","observerArray","o$","_namedObservers","closeNamedObservers","mdv","instanceTemplate","syntax","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_elementPrepared","shadowRoots","_readied","parseDeclarations","attachedCallback","attached","enteredView","hasBeenAttached","domReady","detachedCallback","preventDispose","detached","leftView","enteredViewCallback","leftViewCallback","enteredDocumentCallback","leftDocumentCallback","parseDeclaration","elementElement","fetchTemplate","root","shadowFromTemplate","shadowRootReady","lightFromTemplate","refNode","eventController","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","removeChild","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessors","createBindablePrototypeAccessor","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":";;;;;;;;;;AASAA,OAAOC,mBCAP,SAAUC,GACR,GAAIC,IACFC,OAAQ,SAASC,GACf,MAAIA,GACKA,EAAKC,YAAcD,EAAKE,iBADjC,QAIFC,UAAW,SAASJ,GAClB,MAAOA,IAAUK,QAAQL,EAAOM,mBAElCC,gBAAiB,SAASN,GACxB,GAAIO,GAAIC,KAAKT,OAAOC,EACpB,OAAIQ,MAAKL,UAAUI,GACVA,EADT,QAIFE,YAAa,SAASV,GACpB,GAAIW,GAAKX,EAAOY,eAChB,KAAKD,EAAI,CACP,GAAIE,GAAKb,EAAOc,cAAc,SAC1BD,KACFF,EAAKE,EAAGD,iBAGZ,MAAOD,IAETI,WAAY,SAASC,GAEnB,IADA,GAAIC,MAAcT,EAAIC,KAAKT,OAAOgB,GAC5BR,GACJS,EAAQC,KAAKV,GACbA,EAAIC,KAAKC,YAAYF,EAEvB,OAAOS,IAETE,WAAY,SAASC,EAAQC,EAAGC,GAC9B,GAAIF,EAAQ,CACV,GACIG,GAAIC,EADJC,EAAIL,EAAOd,iBAAiBe,EAAGC,EAInC,KADAE,EAAKf,KAAKF,gBAAgBkB,GACnBD,GAAI,CAGT,GADAD,EAAKC,EAAGlB,iBAAiBe,EAAGC,GAIrB,CAEL,GAAII,GAAMjB,KAAKF,gBAAgBgB,EAC/B,OAAOd,MAAKU,WAAWO,EAAKL,EAAGC,IAAMC,EAJrCC,EAAKf,KAAKC,YAAYc,GAQ1B,MAAOC,KAGXE,MAAO,SAASX,GACd,IAAKA,EACH,MAAOY,SAIT,KAFA,GAAIpB,GAAIQ,EAEDR,EAAEqB,YACPrB,EAAIA,EAAEqB,UAMR,OAHIrB,GAAEsB,UAAYC,KAAKC,eAAiBxB,EAAEsB,UAAYC,KAAKE,yBACzDzB,EAAIoB,UAECpB,GAET0B,WAAY,SAASC,GACnB,GAAId,GAAIc,EAAQC,QAASd,EAAIa,EAAQE,QAEjC7B,EAAIC,KAAKkB,MAAMQ,EAAQpC,OAK3B,OAHKS,GAAEF,iBAAiBe,EAAGC,KACzBd,EAAIoB,UAECnB,KAAKU,WAAWX,EAAGa,EAAGC,IAE/BgB,IAAK,SAASC,EAAGC,GACf,GAAID,IAAMC,EACR,MAAOD,EAET,IAAIA,IAAMC,EACR,MAAOD,EAET,IAAIC,IAAMD,EACR,MAAOC,EAET,KAAKA,IAAMD,EACT,MAAOX,SAGT,IAAIW,EAAEE,UAAYF,EAAEE,SAASD,GAC3B,MAAOD,EAET,IAAIC,EAAEC,UAAYD,EAAEC,SAASF,GAC3B,MAAOC,EAET,IAAIE,GAASjC,KAAKkC,MAAMJ,GACpBK,EAASnC,KAAKkC,MAAMH,GACpBK,EAAIH,EAASE,CAMjB,KALIC,EAAI,EACNN,EAAI9B,KAAKqC,KAAKP,EAAGM,GAEjBL,EAAI/B,KAAKqC,KAAKN,GAAIK,GAEdN,GAAKC,GAAKD,IAAMC,GACpBD,EAAI9B,KAAKqC,KAAKP,EAAG,GACjBC,EAAI/B,KAAKqC,KAAKN,EAAG,EAEnB,OAAOD,IAETO,KAAM,SAASC,EAAGC,GAChB,IAAK,GAAIC,GAAI,EAAGF,GAAUC,EAAJC,EAAQA,IAC5BF,EAAIA,EAAElB,YAAckB,EAAEG,IAExB,OAAOH,IAETJ,MAAO,SAASI,GAEd,IADA,GAAIF,GAAI,EACFE,GACJF,IACAE,EAAIA,EAAElB,YAAckB,EAAEG,IAExB,OAAOL,IAETM,aAAc,SAASZ,EAAGC,GACxB,GAAIY,GAAS3C,KAAK6B,IAAIC,EAAGC,EAEzB,OAAOY,KAAWb,GAEpBc,WAAY,SAASC,EAAMjC,EAAGC,GAC5B,GAAIiC,GAAOD,EAAKE,uBAChB,OAAQD,GAAKE,MAAQpC,GAAOA,GAAKkC,EAAKG,OAAWH,EAAKI,KAAOrC,GAAOA,GAAKiC,EAAKK,QAGlF9D,GAAM+D,cAAgB9D,EAOtBD,EAAMoC,WAAanC,EAAOmC,WAAW4B,KAAK/D,GAS1CD,EAAMqD,aAAepD,EAAOoD,aAAaW,KAAK/D,GAqB9CD,EAAMuD,WAAatD,EAAOsD,YAEzBzD,OAAOC,iBCjLV,WACE,QAASkE,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,iBAIFC,EAAS,GAGTC,GADO1C,SAAS2C,KAC4C,gBAApC3C,UAAS2C,KAAKC,MAAMC,aAE5CC,GAAiB9E,OAAO+E,mBAAqB/C,SAAS2C,KAAKK,gBAE/D,IAAIN,EAAgB,CAClBH,EAAWU,QAAQ,SAASC,GACtBC,OAAOD,KAAOA,GAChBT,GAAUJ,EAASa,GAAKZ,EAAKY,GAAK,KAC9BJ,IACFL,GAAUN,EAAee,GAAKZ,EAAKY,GAAK,QAG1CT,GAAUS,EAAEV,UAAUY,IAAIf,GAAYC,EAAKY,EAAEZ,MAAQ,KACjDQ,IACFL,GAAUS,EAAEV,UAAUY,IAAIjB,GAAkBG,EAAKY,EAAEZ,MAAQ,QAKjE,IAAIe,GAAKrD,SAASsD,cAAc,QAChCD,GAAGE,YAAcd,EACjBzC,SAAS2C,KAAKa,YAAYH,OClC9B,SAAUnF,GAER,GAAIuF,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,GAAIjE,SAASkE,YAAY,QAG7B,OAFAD,GAAEE,UAAUJ,EAAQC,EAAOI,UAAW,EAAOJ,EAAOK,aAAc,GAClEJ,EAAEJ,WAAaD,EAAaC,WAAWI,GAChCA,GAETK,iBAAkB,SAASP,EAAQC,GACjCA,EAASA,GAAUO,OAAOC,OAAO,KAGjC,KAAK,GAAuCC,GADxCR,EAAIpF,KAAKiF,cAAcC,EAAQC,GAC1B3C,EAAI,EAAGqD,EAAOH,OAAOG,KAAKV,GAAY3C,EAAIqD,EAAKC,OAAQtD,IAC9DoD,EAAIC,EAAKrD,GACT4C,EAAEQ,GAAKT,EAAOS,EAEhB,OAAOR,IAETW,iBAAkB,SAASb,EAAQC,GACjCA,EAASA,GAAUO,OAAOC,OAAO,KAIjC,KAAI,GAAWK,GAFXZ,EAAIpF,KAAKiF,cAAcC,EAAQC,GAE3B3C,EAAI,EAAMA,EAAIoC,EAAYkB,OAAQtD,IACxCwD,EAAIpB,EAAYpC,GAChB4C,EAAEY,GAAKb,EAAOa,IAAMnB,EAAerC,EAErC4C,GAAEa,QAAUd,EAAOc,SAAW,CAI9B,IAAIC,GAAW,CAqBf,OAnBEA,GADEf,EAAOe,SACEf,EAAOe,SAEPd,EAAEa,QAAU,GAAM,EAI/Bb,EAAExE,EAAIwE,EAAEzD,QACRyD,EAAEvE,EAAIuE,EAAExD,QAGRwD,EAAEe,UAAYhB,EAAOgB,WAAa,EAClCf,EAAEgB,MAAQjB,EAAOiB,OAAS,EAC1BhB,EAAEiB,OAASlB,EAAOkB,QAAU,EAC5BjB,EAAEc,SAAWA,EACbd,EAAEkB,MAAQnB,EAAOmB,OAAS,EAC1BlB,EAAEmB,MAAQpB,EAAOoB,OAAS,EAC1BnB,EAAEoB,YAAcrB,EAAOqB,aAAe,GACtCpB,EAAEqB,YAActB,EAAOsB,aAAe,EACtCrB,EAAEsB,UAAYvB,EAAOuB,YAAa,EAC3BtB,GAIX/F,GAAM0F,aAAeA,GACpB5F,OAAOC,iBC/GV,SAAUC,GAGR,QAASsH,KACP,GAAIC,EAAS,CACX,GAAIC,GAAI,GAAIC,IAEZ,OADAD,GAAEE,SAAWC,EACNH,EAEP7G,KAAK6F,QACL7F,KAAKiH,UATT,GAAIL,GAAUzH,OAAO2H,KAAO3H,OAAO2H,IAAII,UAAU9C,QAC7C4C,EAAc,WAAY,MAAOhH,MAAKmH,KAY1CR,GAAWO,WACTE,IAAK,SAASC,EAAM3F,GAClB,GAAIc,GAAIxC,KAAK6F,KAAKyB,QAAQD,EACtB7E,GAAI,GACNxC,KAAKiH,OAAOzE,GAAKd,GAEjB1B,KAAK6F,KAAKpF,KAAK4G,GACfrH,KAAKiH,OAAOxG,KAAKiB,KAGrB6F,IAAK,SAASF,GACZ,MAAOrH,MAAK6F,KAAKyB,QAAQD,GAAQ,IAEnCG,SAAU,SAASH,GACjB,GAAI7E,GAAIxC,KAAK6F,KAAKyB,QAAQD,EACtB7E,GAAI,KACNxC,KAAK6F,KAAK4B,OAAOjF,EAAG,GACpBxC,KAAKiH,OAAOQ,OAAOjF,EAAG,KAG1BkF,IAAK,SAASL,GACZ,GAAI7E,GAAIxC,KAAK6F,KAAKyB,QAAQD,EAC1B,OAAOrH,MAAKiH,OAAOzE,IAErBmF,MAAO,WACL3H,KAAK6F,KAAKC,OAAS,EACnB9F,KAAKiH,OAAOnB,OAAS,GAGvB1B,QAAS,SAASwD,EAAUC,GAC1B7H,KAAKiH,OAAO7C,QAAQ,SAASb,EAAGf,GAC9BoF,EAASE,KAAKD,EAAStE,EAAGvD,KAAK6F,KAAKrD,GAAIxC,OACvCA,OAEL+G,SAAU,WACR,MAAO/G,MAAK6F,KAAKC,SAIrBzG,EAAMsH,WAAaA,GAClBxH,OAAOC,iBCzDV,SAAUC,GACR,GAAI0I,IAEF,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,gBAGEC,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,oBAE3BC,EAAOhJ,OAAO+E,mBAAqBA,kBAAkBkE,cAAgB,SAAShD,GAAI,MAAOA,IAEzFL,EAAe1F,EAAM0F,aAarBsD,GACFC,WAAY,GAAIjJ,GAAMsH,WACtB4B,SAAU7C,OAAOC,OAAO,MAGxB6C,aAAc9C,OAAOC,OAAO,MAC5B8C,mBACAC,YACAC,gBASAC,eAAgB,SAASC,EAAMC,GAC7B,GAAI/I,GAAI+I,EACJC,EAAYhJ,EAAEiJ,MACdD,KACFA,EAAU3E,QAAQ,SAASgB,GACrBrF,EAAEqF,KACJpF,KAAKuI,SAASnD,GAAKrF,EAAEqF,GAAG/B,KAAKtD,KAE9BC,MACHA,KAAKwI,aAAaK,GAAQ9I,EAC1BC,KAAKyI,gBAAgBhI,KAAKV,KAG9BkJ,gBAAiB,SAASJ,EAAMC,GAC9B9I,KAAK0I,SAASjI,KAAKqI,IAErBI,SAAU,SAAS3I,GAEjB,IAAIpB,OAAO+E,mBAAqB3D,IAAYY,SAI5C,IAAK,GAAWgI,GADZC,EAAIpJ,KAAKyI,gBAAgB3C,OACpBtD,EAAI,EAAY4G,EAAJ5G,IAAW2G,EAAKnJ,KAAKyI,gBAAgBjG,IAAKA,IAE7D2G,EAAGD,SAASpB,KAAKqB,EAAI5I,IAGzB8I,WAAY,SAAS9I,GAEnB,IAAK,GAAW4I,GADZC,EAAIpJ,KAAKyI,gBAAgB3C,OACpBtD,EAAI,EAAY4G,EAAJ5G,IAAW2G,EAAKnJ,KAAKyI,gBAAgBjG,IAAKA,IAE7D2G,EAAGE,WAAWvB,KAAKqB,EAAI5I,IAI3B+I,KAAM,SAAS5H,GACb1B,KAAKuJ,UAAU,OAAQ7H,IAEzB8H,KAAM,SAAS9H,GAEbA,EAAQ+H,KAAO,OACfzJ,KAAK0J,iBAAiBhI,IAExBiI,GAAI,SAASjI,GACX1B,KAAKuJ,UAAU,KAAM7H,IAEvBkI,OAAQ,SAASlI,GACfA,EAAQmI,cAAe,EACvB7J,KAAKuJ,UAAU,KAAM7H,IAGvBoI,aAAc,SAASpI,GAIrB,IAAIA,EAAQqI,aAAZ,CAGA,GAAIN,GAAO/H,EAAQ+H,KACfO,EAAKhK,KAAKuI,UAAYvI,KAAKuI,SAASkB,EACpCO,IACFA,EAAGtI,GAELA,EAAQqI,cAAe,IAGzBE,OAAQ,SAAS3K,EAAQ0J,GACvBA,EAAO5E,QAAQ,SAASgB,GACtBpF,KAAKkK,SAAS5K,EAAQ8F,IACrBpF,OAGLmK,SAAU,SAAS7K,EAAQ0J,GACzBA,EAAO5E,QAAQ,SAASgB,GACtBpF,KAAKoK,YAAY9K,EAAQ8F,IACxBpF,OAELkK,SAAU,SAAS5K,EAAQ+K,GAErBlL,OAAO+E,kBACT5E,EAAOgL,kBAAkBD,EAAWrK,KAAKuK,cAEzCjL,EAAOkL,iBAAiBH,EAAWrK,KAAKuK,eAG5CH,YAAa,SAAS9K,EAAQ+K,GAExBlL,OAAO+E,kBACT5E,EAAOmL,qBAAqBJ,EAAWrK,KAAKuK,cAE5CjL,EAAOoL,oBAAoBL,EAAWrK,KAAKuK,eAY/CI,UAAW,SAASzF,EAAQxD,GAC1B,GAAI0D,GAAIL,EAAagB,iBAAiBb,EAAQxD,EAI9C,OAHA0D,GAAEwF,eAAiBlJ,EAAQkJ,eAC3BxF,EAAEyE,aAAenI,EAAQmI,aACzBzE,EAAEyF,QAAUzF,EAAEyF,SAAWnJ,EAAQpC,OAC1B8F,GAGTmE,UAAW,SAASrE,EAAQxD,GAC1B,GAAI0D,GAAIpF,KAAK2K,UAAUzF,EAAQxD,EAC/B,OAAO1B,MAAK8K,cAAc1F,IAS5B2F,WAAY,SAASrJ,GAEnB,IAAK,GADgCsE,GAAjCgF,EAAYtF,OAAOC,OAAO,MACrBnD,EAAI,EAAGA,EAAIuF,EAAYjC,OAAQtD,IACtCwD,EAAI+B,EAAYvF,GAChBwI,EAAUhF,GAAKtE,EAAQsE,IAAMgC,EAAexF,IAIlC,WAANwD,GAAwB,kBAANA,KAChBiC,GAAoB+C,EAAUhF,YAAckC,sBAC9C8C,EAAUhF,GAAKgF,EAAUhF,GAAGiF,yBAE9BD,EAAUhF,GAAKmC,EAAK6C,EAAUhF,IAKlC,OADAgF,GAAUJ,eAAiBlJ,EAAQkJ,eAC5BI,GAQTF,cAAe,SAASpJ,GACtB,GAAIV,GAAIU,EAAQmJ,OAChB,IAAI7J,EAAG,CACLA,EAAE8J,cAAcpJ,EAGhB,IAAIwJ,GAAQlL,KAAK+K,WAAWrJ,EAC5BwJ,GAAM5L,OAAS0B,EACfhB,KAAK0J,iBAAiBwB,KAG1BC,eAAgB,WAEd,IAAK,GAAW/F,GAAP5C,EAAI,EAAMA,EAAIxC,KAAK2I,aAAa7C,OAAQtD,IAAK,CACpD4C,EAAIpF,KAAK2I,aAAanG,EACtB,KAAK,GAAW4I,GAAPC,EAAI,EAAMA,EAAIrL,KAAK0I,SAAS5C,OAAQuF,IAC3CD,EAAIpL,KAAK0I,SAAS2C,GACdD,EAAEpC,OAAO1B,QAAQlC,EAAEqE,OAAS,GAC9B2B,EAAEhG,EAAEqE,MAAM3B,KAAKsD,EAAGhG,GAIxBpF,KAAK2I,aAAa7C,OAAS,GAE7B4D,iBAAkB,SAAS4B,GAEpBtL,KAAK2I,aAAa7C,QACrByF,sBAAsBvL,KAAKwL,qBAE7BxL,KAAK2I,aAAalI,KAAK6K,IAG3BjD,GAAWkC,aAAelC,EAAWyB,aAAazG,KAAKgF,GACvDA,EAAWmD,oBAAsBnD,EAAW8C,eAAe9H,KAAKgF,GAChEhJ,EAAMgJ,WAAaA,EACnBhJ,EAAM6J,SAAWb,EAAWa,SAAS7F,KAAKgF,GAC1ChJ,EAAMgK,WAAahB,EAAWgB,WAAWhG,KAAKgF,IAC7ClJ,OAAOC,iBCpSV,SAAUC,GAeR,QAASoM,GAAUC,EAAKC,EAAQC,EAASC,GACvC7L,KAAK8L,YAAcJ,EAAIrI,KAAKwI,GAC5B7L,KAAK+L,eAAiBJ,EAAOtI,KAAKwI,GAClC7L,KAAKgM,gBAAkBJ,EAAQvI,KAAKwI,GAChCI,IACFjM,KAAKkM,SAAW,GAAID,GAAGjM,KAAKmM,gBAAgB9I,KAAKrD,QAnBrD,GAAIoE,GAAUgI,MAAMlF,UAAU9C,QAAQ0D,KAAKzE,KAAK+I,MAAMlF,UAAU9C,SAC5DG,EAAM6H,MAAMlF,UAAU3C,IAAIuD,KAAKzE,KAAK+I,MAAMlF,UAAU3C,KACpD8H,EAAUD,MAAMlF,UAAUoF,MAAMxE,KAAKzE,KAAK+I,MAAMlF,UAAUoF,OAC1DC,EAASH,MAAMlF,UAAUqF,OAAOzE,KAAKzE,KAAK+I,MAAMlF,UAAUqF,QAC1DN,EAAK9M,OAAOqN,kBAAoBrN,OAAOsN,uBACvCC,EAAW,iBACXC,GACFC,SAAS,EACTC,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,iBAAkB,gBAYpBvB,GAAUvE,WACR+F,aAAc,SAAS3N,GAQjBD,EAAM+D,cAAczD,UAAUL,IAChCU,KAAKkM,SAASgB,QAAQ5N,EAAQqN,IAGlCQ,gBAAiB,SAAS7N,GACxBU,KAAKiN,aAAa3N,GACdA,IAAW6B,UAAoC,aAAxBA,SAASiM,WAClCpN,KAAKqN,gBAELrN,KAAKsN,kBAAkBhO,IAG3BgO,kBAAmB,SAAShO,GAC1B8E,EAAQpE,KAAKuN,aAAajO,GAASU,KAAKwN,WAAYxN,OAEtDuN,aAAc,SAASjO,GACrB,MAAIA,GAAOmO,iBACFnO,EAAOmO,iBAAiBf,OAInCgB,cAAe,SAASlJ,GACtBxE,KAAK+L,eAAevH,IAEtBgJ,WAAY,SAAShJ,GACnBxE,KAAK8L,YAAYtH,IAEnBmJ,eAAgB,SAASnJ,EAAIoJ,GAC3B5N,KAAKgM,gBAAgBxH,EAAIoJ,IAE3BC,YAAa,SAASC,EAAOC,GAC3B,MAAOD,GAAME,OAAO3B,EAAQ0B,KAG9BV,cAAe,WACblM,SAASqJ,iBAAiB,mBAAoB,WAChB,aAAxBrJ,SAASiM,YACXpN,KAAKsN,kBAAkBnM,WAEzBkC,KAAKrD,QAETiO,UAAW,SAAS3L,GAClB,MAAOA,GAAEjB,WAAaC,KAAK4M,cAE7BC,oBAAqB,SAASC,GAE5B,GAAIC,GAAO9J,EAAI6J,EAASpO,KAAKuN,aAAcvN,KAI3C,OAFAqO,GAAK5N,KAAK8L,EAAO6B,EAASpO,KAAKiO,YAExBI,EAAKC,OAAOtO,KAAK6N,iBAE1B1B,gBAAiB,SAASoC,GACxBA,EAAUnK,QAAQpE,KAAKwO,gBAAiBxO,OAE1CwO,gBAAiB,SAAS3H,GACxB,GAAe,cAAXA,EAAE4C,KAAsB,CAC1B,GAAIgF,GAAQzO,KAAKmO,oBAAoBtH,EAAE6H,WACvCD,GAAMrK,QAAQpE,KAAKwN,WAAYxN,KAC/B,IAAI2O,GAAU3O,KAAKmO,oBAAoBtH,EAAE+H,aACzCD,GAAQvK,QAAQpE,KAAK0N,cAAe1N,UAChB,eAAX6G,EAAE4C,MACXzJ,KAAK2N,eAAe9G,EAAEvH,OAAQuH,EAAE+G,YAKjC3B,IACHR,EAAUvE,UAAU+F,aAAe,WACjC4B,QAAQC,KAAK,iGAIjBzP,EAAMoM,UAAYA,GACjBtM,OAAOC,iBClHV,SAAWC,GACT,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WAExByG,EAAa,GAEbC,GAAoB,EAAG,EAAG,EAAG,GAE7BC,GAAc,CAClB,KACEA,EAA+D,IAAjD,GAAIC,YAAW,QAASjJ,QAAS,IAAIA,QACnD,MAAOb,IAGT,GAAI+J,IACFC,WAAY,EACZC,aAAc,QACdrG,QACE,YACA,YACA,WAEFE,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCsG,eAEAC,0BAA2B,SAAS7N,GAGlC,IAAK,GAA2BV,GAF5BwO,EAAMxP,KAAKsP,YACX1O,EAAIc,EAAQC,QAASd,EAAIa,EAAQE,QAC5BY,EAAI,EAAG4G,EAAIoG,EAAI1J,OAAesD,EAAJ5G,IAAUxB,EAAIwO,EAAIhN,IAAKA,IAAK,CAE7D,GAAIiN,GAAKC,KAAKC,IAAI/O,EAAII,EAAEJ,GAAIgP,EAAKF,KAAKC,IAAI9O,EAAIG,EAAEH,EAChD,IAAUkO,GAANU,GAA0BV,GAANa,EACtB,OAAO,IAIbC,aAAc,SAASnO,GACrB,GAAI0D,GAAIiD,EAAW0C,WAAWrJ,EAO9B,OANA0D,GAAEe,UAAYnG,KAAKoP,WACnBhK,EAAEsB,WAAY,EACdtB,EAAEoB,YAAcxG,KAAKqP,aAChBJ,IACH7J,EAAEa,QAAU+I,EAAiB5J,EAAE0K,QAAU,GAEpC1K,GAET2K,UAAW,SAASrO,GAClB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAIsE,GAAIsC,EAAWf,IAAIvH,KAAKoP,WAGxBpJ,IACFhG,KAAKgQ,QAAQtO,EAEf,IAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAIpH,KAAKoP,WAAYhK,EAAE9F,QAClC+I,EAAWiB,KAAKlE,KAGpB6K,UAAW,SAASvO,GAClB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAI1H,KAAKoP,YAC/B/G,EAAWmB,KAAKpE,KAGpB4K,QAAS,SAAStO,GAChB,IAAK1B,KAAKuP,0BAA0B7N,GAAU,CAC5C,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAI1H,KAAKoP,YAC/B/G,EAAWsB,GAAGvE,GACdpF,KAAKmQ,iBAGTA,aAAc,WACZ7H,EAAW,UAAUtI,KAAKoP,aAI9B/P,GAAM8P,YAAcA,GACnBhQ,OAAOC,iBCtFV,SAAUC,GACR,GAQI+Q,GARA/H,EAAahJ,EAAMgJ,WACnB/H,EAAajB,EAAM+D,cAAc9C,WAAW+C,KAAKhE,EAAM+D,eACvDkF,EAAaD,EAAWC,WAGxB+H,GAFWjE,MAAMlF,UAAU3C,IAAIuD,KAAKzE,KAAK+I,MAAMlF,UAAU3C,KAEzC,MAChB+L,EAAsB,IACtBC,EAAS,eAETC,EAA8D,gBAApCrP,UAAS2C,KAAKC,MAAMC,YAG9CyM,GACFzH,QACE,aACA,YACA,WACA,eAEFE,SAAU,SAAS5J,GACbkR,EACFnI,EAAW4B,OAAO3K,EAAQU,KAAKgJ,QAE/BoH,EAAUjD,gBAAgB7N,IAG9B+J,WAAY,SAAS/J,GACfkR,GACFnI,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAKrC0H,aAAc,SAASlM,GACrB,GAAI1C,GAAI0C,EAAGmM,aAAaJ,GACpBzP,EAAKd,KAAK4Q,wBAAwB9O,EAClChB,KACF0D,EAAGqM,YAAc/P,EACjBuH,EAAW4B,OAAOzF,EAAIxE,KAAKgJ,QAE3B1I,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAc/P,EAChBuH,EAAW4B,OAAOlK,EAAGC,KAAKgJ,SACzBhJ,QAGP8Q,eAAgB,SAAStM,GACvBA,EAAGqM,YAAcE,OACjB1I,EAAW8B,SAAS3F,EAAIxE,KAAKgJ,QAE7B1I,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAcE,OAChB1I,EAAW8B,SAASpK,EAAGC,KAAKgJ,SAC3BhJ,OAEL2N,eAAgB,SAASnJ,EAAIoJ,GAC3B,GAAI9L,GAAI0C,EAAGmM,aAAaJ,GACpBzP,EAAKd,KAAK4Q,wBAAwB9O,GAClCkP,EAAQhR,KAAK4Q,wBAAwBhD,EAErC9M,IAAMkQ,GACRxM,EAAGqM,YAAc/P,EACjBR,EAAWkE,GAAIJ,QAAQ,SAASrE,GAC9BA,EAAE8Q,YAAc/P,GACfd,OACMgR,EACThR,KAAK8Q,eAAetM,GACX1D,GACTd,KAAK0Q,aAAalM,IAGtByM,aACEC,QAAS,OACTC,UAAW,QACXC,UAAW,QACXC,SAAU,0CAEZT,wBAAyB,SAAS5M,GAChC,GAAIhD,GAAIgD,EACJlD,EAAKd,KAAKiR,WACd,OAAU,SAANjQ,EACK,OACEA,IAAMF,EAAGqQ,UACX,IACEnQ,IAAMF,EAAGsQ,UACX,IACEtQ,EAAGuQ,SAASC,KAAKtQ,GACnB,KADF,QAITqO,aAAc,QACdkC,WAAY,KACZC,eAAgB,SAASC,GACvB,MAAOzR,MAAKuR,aAAeE,EAAQC,YAErCC,gBAAiB,SAASF,IAEM,IAA1BnJ,EAAWvB,YAA+C,IAA1BuB,EAAWvB,YAAoBuB,EAAWf,IAAI,MAChFvH,KAAKuR,WAAaE,EAAQC,WAC1B1R,KAAK4R,SAAWC,EAAGJ,EAAQ9P,QAASmQ,EAAGL,EAAQ7P,SAC/C5B,KAAK+R,WAAY,EACjB/R,KAAKgS,0BAGTC,qBAAsB,SAASC,GACzBA,EAAUxL,YACZ1G,KAAKuR,WAAa,KAClBvR,KAAK4R,QAAU,KACf5R,KAAKmS,oBAGTC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,GAAInI,GAAK,WACPhK,KAAKoS,WAAa,EAClBpS,KAAKqS,QAAU,MACfhP,KAAKrD,KACPA,MAAKqS,QAAUC,WAAWtI,EAAIsG,IAEhC0B,sBAAuB,WACjBhS,KAAKqS,SACPE,aAAavS,KAAKqS,UAGtBG,cAAe,SAAS/I,GACtB,GAAIgJ,GAAM,CAIV,QAHa,eAAThJ,GAAkC,cAATA,KAC3BgJ,EAAM,GAEDA,GAEThR,WAAY,SAASiR,EAAOC,GAC1B,MAAoC,eAAhC3S,KAAK4S,kBAAkBnJ,KAClBpK,EAAMoC,WAAWiR,GAGnBpK,EAAWZ,IAAIiL,IAExBE,eAAgB,SAASpB,GACvB,GAAIqB,GAAM9S,KAAK4S,kBACXxN,EAAIiD,EAAW0C,WAAW0G,GAI1BkB,EAAKvN,EAAEe,UAAYsL,EAAQC,WAAa,CAC5CtM,GAAE9F,OAASU,KAAKyB,WAAWgQ,EAASkB,GACpCvN,EAAEG,SAAU,EACZH,EAAEI,YAAa,EACfJ,EAAE2N,OAAS/S,KAAKoS,WAChBhN,EAAEa,QAAUjG,KAAKwS,cAAcM,EAAIrJ,MACnCrE,EAAEgB,MAAQqL,EAAQuB,eAAiBvB,EAAQwB,SAAW,EACtD7N,EAAEiB,OAASoL,EAAQyB,eAAiBzB,EAAQ0B,SAAW,EACvD/N,EAAEc,SAAWuL,EAAQ2B,aAAe3B,EAAQ4B,OAAS,GACrDjO,EAAEsB,UAAY1G,KAAKwR,eAAeC,GAClCrM,EAAEoB,YAAcxG,KAAKqP,YAErB,IAAIiE,GAAOtT,IAMX,OALAoF,GAAEwF,eAAiB,WACjB0I,EAAKvB,WAAY,EACjBuB,EAAK1B,QAAU,KACfkB,EAAIlI,kBAECxF,GAETmO,eAAgB,SAAS7R,EAAS8R,GAChC,GAAIC,GAAK/R,EAAQgS,cACjB1T,MAAK4S,kBAAoBlR,CACzB,KAAK,GAAWV,GAAPwB,EAAI,EAAMA,EAAIiR,EAAG3N,OAAQtD,IAChCxB,EAAIyS,EAAGjR,GACPgR,EAAW1L,KAAK9H,KAAMA,KAAK6S,eAAe7R,KAK9C2S,aAAc,SAASjS,GACrB,GAAI1B,KAAK4R,QAAS,CAChB,GAAIa,GACAmB,EAAalS,EAAQmS,cAAchD,WACvC,IAAmB,SAAf+C,EAEFnB,GAAM,MACD,IAAmB,OAAfmB,EAETnB,GAAM,MACD,CACL,GAAIzR,GAAIU,EAAQgS,eAAe,GAE3B5R,EAAI8R,EACJE,EAAoB,MAAfF,EAAqB,IAAM,IAChCG,EAAKrE,KAAKC,IAAI3O,EAAE,SAAWc,GAAK9B,KAAK4R,QAAQ9P,IAC7CkS,EAAMtE,KAAKC,IAAI3O,EAAE,SAAW8S,GAAM9T,KAAK4R,QAAQkC,GAGnDrB,GAAMsB,GAAMC,EAGd,MADAhU,MAAK4R,QAAU,KACRa,IAGXwB,UAAW,SAASC,EAAM7M,GACxB,IAAK,GAA4BrG,GAAxBwB,EAAI,EAAG4G,EAAI8K,EAAKpO,OAAesD,EAAJ5G,IAAUxB,EAAIkT,EAAK1R,IAAKA,IAC1D,GAAIxB,EAAE0Q,aAAerK,EACnB,OAAO,GAUb8M,cAAe,SAASzS,GACtB,GAAI+R,GAAK/R,EAAQ0S,OAGjB,IAAI9L,EAAWvB,YAAc0M,EAAG3N,OAAQ,CACtC,GAAI1D,KACJkG,GAAWlE,QAAQ,SAASiQ,EAAOC,GAIjC,GAAY,IAARA,IAActU,KAAKiU,UAAUR,EAAIa,EAAM,GAAI,CAC7C,GAAItO,GAAIqO,EAAME,GACdnS,GAAE3B,KAAKuF,KAERhG,MACHoC,EAAEgC,QAAQpE,KAAKwU,UAAWxU,QAG9ByU,WAAY,SAAS/S,GACnB1B,KAAKmU,cAAczS,GACnB1B,KAAK2R,gBAAgBjQ,EAAQgS,eAAe,IAC5C1T,KAAK0U,gBAAgBhT,GAChB1B,KAAK+R,YACR/R,KAAKoS,aACLpS,KAAKuT,eAAe7R,EAAS1B,KAAKsJ,QAGtCA,KAAM,SAAS4I,GACL5J,EAAWlB,IAAI8K,EAAU/L,UAAW+L,EAAU5S,OACtD+I,GAAWiB,KAAK4I,IAElByC,UAAW,SAASjT,GACd8O,EACFxQ,KAAKuT,eAAe7R,EAAS1B,KAAKwJ,MAE7BxJ,KAAK+R,YACJ/R,KAAK2T,aAAajS,IACpB1B,KAAK+R,WAAY,EACjB/R,KAAK4U,YAAYlT,KAEjBA,EAAQkJ,iBACR5K,KAAKuT,eAAe7R,EAAS1B,KAAKwJ,SAK1CA,KAAM,SAAS0I,GACb,GAAI2C,GAAUvM,EAAWZ,IAAIwK,EAAU/L,UAElC0O,IAGLxM,EAAWmB,KAAK0I,IAElB4C,SAAU,SAASpT,GACjB1B,KAAK0U,gBAAgBhT,GACrB1B,KAAKuT,eAAe7R,EAAS1B,KAAK2J,KAEpCA,GAAI,SAASuI,GACNlS,KAAK+R,YACRG,EAAUhC,cAAgB7Q,EAAMoC,WAAWyQ,GAC3C7J,EAAWsB,GAAGuI,IAEhBlS,KAAK+U,eAAe7C,IAEtBtI,OAAQ,SAASsI,GACfA,EAAUhC,cAAgB7Q,EAAMoC,WAAWyQ,GAC3C7J,EAAWuB,OAAOsI,GAClBlS,KAAK+U,eAAe7C,IAEtB0C,YAAa,SAASlT,GACpB1B,KAAKuT,eAAe7R,EAAS1B,KAAK4J,SAEpCmL,eAAgB,SAAS7C,GACvB5J,EAAW,UAAU4J,EAAU/L,WAC/BnG,KAAKiS,qBAAqBC,IAG5BwC,gBAAiB,SAAShT,GACxB,GAAI8N,GAAMnQ,EAAM8P,YAAYG,YACxBtO,EAAIU,EAAQgS,eAAe,EAE/B,IAAI1T,KAAKwR,eAAexQ,GAAI,CAE1B,GAAIgU,IAAMpU,EAAGI,EAAEW,QAASd,EAAGG,EAAEY,QAC7B4N,GAAI/O,KAAKuU,EACT,IAAIhL,GAAK,SAAUwF,EAAKwF,GACtB,GAAIxS,GAAIgN,EAAIlI,QAAQ0N,EAChBxS,GAAI,IACNgN,EAAI/H,OAAOjF,EAAG,IAEfa,KAAK,KAAMmM,EAAKwF,EACnB1C,YAAWtI,EAAIqG,KAKhBG,KACHJ,EAAY,GAAI/Q,GAAMoM,UAAUgF,EAAYC,aAAcD,EAAYK,eAAgBL,EAAY9C,eAAgB8C,IAGpHpR,EAAMoR,YAAcA,GACnBtR,OAAOC,iBC5TV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WACxB2M,EAAkB9V,OAAO+V,gBAAwE,gBAA/C/V,QAAO+V,eAAeC,qBACxEC,GACFpM,QACE,gBACA,gBACA,cACA,mBAEFE,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCqM,eACE,GACA,cACA,QACA,MACA,SAEFxF,aAAc,SAASnO,GACrB,GAAI0D,GAAI1D,CAKR,OAJIuT,KACF7P,EAAIiD,EAAW0C,WAAWrJ,GAC1B0D,EAAEoB,YAAcxG,KAAKqV,cAAc3T,EAAQ8E,cAEtCpB,GAETkQ,QAAS,SAAS3C,GAChBrK,EAAW,UAAUqK,IAEvB4C,cAAe,SAAS7T,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAI1F,EAAQyE,UAAWf,EAAE9F,QACpC+I,EAAWiB,KAAKlE,IAElBoQ,cAAe,SAAS9T,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWmB,KAAKpE,IAElBqQ,YAAa,SAAS/T,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWsB,GAAGvE,GACdpF,KAAKsV,QAAQ5T,EAAQyE,YAEvBuP,gBAAiB,SAAShU,GACxB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWuB,OAAOxE,GAClBpF,KAAKsV,QAAQ5T,EAAQyE,YAIzB9G,GAAM+V,SAAWA,GAChBjW,OAAOC,iBC9DV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBC,EAAaD,EAAWC,WACxBqN,GACF3M,QACE,cACA,cACA,YACA,iBAEF6G,aAAc,SAASnO,GACrB,MAAO2G,GAAW0C,WAAWrJ,IAE/BwH,SAAU,SAAS5J,GACjB+I,EAAW4B,OAAO3K,EAAQU,KAAKgJ,SAEjCK,WAAY,SAAS/J,GACnB+I,EAAW8B,SAAS7K,EAAQU,KAAKgJ,SAEnCsM,QAAS,SAAS3C,GAChBrK,EAAW,UAAUqK,IAEvBiD,YAAa,SAASlU,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B4G,GAAWlB,IAAIhC,EAAEe,UAAWf,EAAE9F,QAC9B+I,EAAWiB,KAAKlE,IAElByQ,YAAa,SAASnU,GACpB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWmB,KAAKpE,IAElB0Q,UAAW,SAASpU,GAClB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWsB,GAAGvE,GACdpF,KAAKsV,QAAQ5T,EAAQyE,YAEvB4P,cAAe,SAASrU,GACtB,GAAI0D,GAAIpF,KAAK6P,aAAanO,EAC1B0D,GAAE8K,cAAgB9K,EAAE9F,OACpB8F,EAAE9F,OAASgJ,EAAWZ,IAAItC,EAAEe,WAC5BkC,EAAWuB,OAAOxE,GAClBpF,KAAKsV,QAAQ5T,EAAQyE,YAIzB9G,GAAMsW,cAAgBA,GACrBxW,OAAOC,iBC5CV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,UAEnBlJ,QAAO6W,aACT3N,EAAWO,eAAe,UAAWvJ,EAAMsW,eAClCxW,OAAO8W,UAAUC,iBAC1B7N,EAAWO,eAAe,KAAMvJ,EAAM+V,WAEtC/M,EAAWO,eAAe,QAASvJ,EAAM8P,aACb4B,SAAxB5R,OAAOgX,cACT9N,EAAWO,eAAe,QAASvJ,EAAMoR,cAI7CpI,EAAWa,SAAS/H,WACnBhC,OAAOC,iBC4ET,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrBuD,EAAa,GAAIjJ,GAAMsH,WACvByP,GACFpN,QACE,OACA,OACA,MAEFqN,iBAAkB,EAClBC,SAAU,SAASC,GACjB,MAAOA,GAAU,EAAI,EAAI,IAE3BC,kBAAmB,SAASC,EAAKC,GAC/B,GAAI9V,GAAI,EAAGC,EAAI,CAKf,OAJI4V,IAAOC,IACT9V,EAAI8V,EAAIC,MAAQF,EAAIE,MACpB9V,EAAI6V,EAAIE,MAAQH,EAAIG,QAEdhW,EAAGA,EAAGC,EAAGA,IAEnBgW,UAAW,SAAS3R,EAAQxD,EAASoV,GACnC,GAAI9V,GAAI8V,EACJ1U,EAAIpC,KAAKwW,kBAAkBxV,EAAE+V,UAAWrV,GACxCsV,EAAKhX,KAAKwW,kBAAkBxV,EAAEiW,cAAevV,EAC7CsV,GAAGpW,IACLI,EAAEkW,WAAalX,KAAKsW,SAASU,EAAGpW,IAE9BoW,EAAGnW,IACLG,EAAEmW,WAAanX,KAAKsW,SAASU,EAAGnW,GAElC,IAAIuE,GAAIL,EAAaU,iBAAiBP,GACpCK,SAAS,EACTC,YAAY,EACZiK,GAAIrN,EAAExB,EACNgP,GAAIxN,EAAEvB,EACNuW,IAAKJ,EAAGpW,EACRyW,IAAKL,EAAGnW,EACRD,EAAGc,EAAQd,EACXC,EAAGa,EAAQb,EACXc,QAASD,EAAQC,QACjBC,QAASF,EAAQE,QACjB+U,MAAOjV,EAAQiV,MACfC,MAAOlV,EAAQkV,MACfU,QAAS5V,EAAQ4V,QACjBC,QAAS7V,EAAQ6V,QACjBL,WAAYlW,EAAEkW,WACdC,WAAYnW,EAAEmW,WACdK,UAAWxW,EAAEwW,UACbtH,cAAexO,EAAQwO,cACvB1J,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,WAErBnF,GAAEyW,WAAW3M,cAAc1F,IAE7BkE,KAAM,SAAS5H,GACb,GAAIA,EAAQgF,YAAsC,UAAxBhF,EAAQ8E,YAA8C,IAApB9E,EAAQuE,SAAgB,GAAO,CACzF,GAAID,IACF+Q,UAAWrV,EACX+V,WAAY/V,EAAQpC,OACpBkY,aACAP,cAAe,KACfC,WAAY,EACZC,WAAY,EACZO,UAAU,EAEZpP,GAAWlB,IAAI1F,EAAQyE,UAAWH,KAGtCwD,KAAM,SAAS9H,GACb,GAAIsE,GAAIsC,EAAWZ,IAAIhG,EAAQyE,UAC/B,IAAIH,EAAG,CACL,GAAKA,EAAE0R,SAUL1X,KAAK6W,UAAU,QAASnV,EAASsE,OAVlB,CACf,GAAI5D,GAAIpC,KAAKwW,kBAAkBxQ,EAAE+Q,UAAWrV,GACxC8H,EAAOpH,EAAExB,EAAIwB,EAAExB,EAAIwB,EAAEvB,EAAIuB,EAAEvB,CAE3B2I,GAAOxJ,KAAKqW,mBACdrQ,EAAE0R,UAAW,EACb1X,KAAK6W,UAAU,aAAc7Q,EAAE+Q,UAAW/Q,GAC1ChG,KAAK6W,UAAU,QAASnV,EAASsE,IAKrCA,EAAEiR,cAAgBvV,IAGtBiI,GAAI,SAASjI,GACX,GAAIsE,GAAIsC,EAAWZ,IAAIhG,EAAQyE,UAC3BH,KACEA,EAAE0R,UACJ1X,KAAK6W,UAAU,WAAYnV,EAASsE,GAEtCsC,EAAWd,OAAO9F,EAAQyE,aAIhCkC,GAAWY,gBAAgB,QAASmN,IACnCjX,OAAOC,iBCvJX,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrB4S,GAEFC,WAAY,IAEZvB,iBAAkB,GAClBrN,QACE,OACA,OACA,MAEF6O,YAAa,KACbC,QAAS,KACTC,MAAO,WACL,GAAIJ,GAAOK,KAAKC,MAAQjY,KAAK6X,YAAYK,UACrCzO,EAAOzJ,KAAKmY,KAAO,YAAc,MACrCnY,MAAKoY,SAAS3O,EAAMkO,GACpB3X,KAAKmY,MAAO,GAEdvO,OAAQ,WACNyO,cAAcrY,KAAK8X,SACf9X,KAAKmY,MACPnY,KAAKoY,SAAS,WAEhBpY,KAAKmY,MAAO,EACZnY,KAAK6X,YAAc,KACnB7X,KAAKV,OAAS,KACdU,KAAK8X,QAAU,MAEjBxO,KAAM,SAAS5H,GACTA,EAAQgF,YAAc1G,KAAK6X,cAC7B7X,KAAK6X,YAAcnW,EACnB1B,KAAKV,OAASoC,EAAQpC,OACtBU,KAAK8X,QAAUQ,YAAYtY,KAAK+X,MAAM1U,KAAKrD,MAAOA,KAAK4X,cAG3DjO,GAAI,SAASjI,GACP1B,KAAK6X,aAAe7X,KAAK6X,YAAY1R,YAAczE,EAAQyE,WAC7DnG,KAAK4J,UAGTJ,KAAM,SAAS9H,GACb,GAAI1B,KAAK6X,aAAe7X,KAAK6X,YAAY1R,YAAczE,EAAQyE,UAAW,CACxE,GAAIvF,GAAIc,EAAQC,QAAU3B,KAAK6X,YAAYlW,QACvCd,EAAIa,EAAQE,QAAU5B,KAAK6X,YAAYjW,OACtChB,GAAIA,EAAIC,EAAIA,EAAKb,KAAKqW,kBACzBrW,KAAK4J,WAIXwO,SAAU,SAASlT,EAAQqT,GACzB,GAAIvS,IACFT,SAAS,EACTC,YAAY,EACZgB,YAAaxG,KAAK6X,YAAYrR,YAC9BL,UAAWnG,KAAK6X,YAAY1R,UAC5BvF,EAAGZ,KAAK6X,YAAYlW,QACpBd,EAAGb,KAAK6X,YAAYjW,QAElB2W,KACFvS,EAAEwS,SAAWD,EAEf,IAAInT,GAAIL,EAAaU,iBAAiBP,EAAQc,EAC9ChG,MAAKV,OAAOwL,cAAc1F,IAG9BiD,GAAWY,gBAAgB,OAAQ0O,IAClCxY,OAAOC,iBCpFV,SAAUC,GACR,GAAIgJ,GAAahJ,EAAMgJ,WACnBtD,EAAe1F,EAAM0F,aACrBuD,EAAa,GAAIjJ,GAAMsH,WACvB8R,GACFzP,QACE,OACA,MAEFM,KAAM,SAAS5H,GACTA,EAAQgF,YAAchF,EAAQmI,cAChCvB,EAAWlB,IAAI1F,EAAQyE,WACrB7G,OAAQoC,EAAQpC,OAChB2G,QAASvE,EAAQuE,QACjBrF,EAAGc,EAAQC,QACXd,EAAGa,EAAQE,WAIjB8W,UAAW,SAAStT,EAAGuT,GACrB,MAAsB,UAAlBvT,EAAEoB,YAEyB,IAAtBmS,EAAU1S,SAEXb,EAAEyE,cAEZF,GAAI,SAASjI,GACX,GAAIkX,GAAQtQ,EAAWZ,IAAIhG,EAAQyE,UACnC,IAAIyS,GAAS5Y,KAAK0Y,UAAUhX,EAASkX,GAAQ,CAE3C,GAAI5X,GAAI3B,EAAM+D,cAAcvB,IAAI+W,EAAMtZ,OAAQoC,EAAQwO,cACtD,IAAIlP,EAAG,CACL,GAAIoE,GAAIL,EAAaU,iBAAiB,OACpCF,SAAS,EACTC,YAAY,EACZ5E,EAAGc,EAAQC,QACXd,EAAGa,EAAQE,QACXmR,OAAQrR,EAAQqR,OAChBvM,YAAa9E,EAAQ8E,YACrBL,UAAWzE,EAAQyE,UACnB0S,OAAQnX,EAAQmX,OAChBC,QAASpX,EAAQoX,QACjBC,QAASrX,EAAQqX,QACjBC,SAAUtX,EAAQsX,UAEpBhY,GAAE8J,cAAc1F,IAGpBkD,EAAWd,OAAO9F,EAAQyE,YAI9BpB,GAAaC,WAAa,SAASI,GACjC,MAAO,YACLA,EAAEyE,cAAe,EACjBvB,EAAWd,OAAOpC,EAAEe,aAGxBkC,EAAWY,gBAAgB,MAAOwP,IACjCtZ,OAAOC,iBCjEV,SAAW6Z,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,yGAAyGjS,QAAQhD,OAAOmV,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,GAAUlH,GACf,MAAe,SAAPA,EAKZ,QAASmH,KACL,KAAehU,EAARiU,GAAkBP,EAAa1Q,EAAOkR,WAAWD,OACnDA,EAIT,QAASE,KACL,GAAIrB,GAAOW,CAGX,KADAX,EAAQmB,IACOjU,EAARiU,IACHR,EAAKzQ,EAAOkR,WAAWD,GACnBH,EAAiBL,OACfQ,CAMV,OAAOjR,GAAOwD,MAAMsM,EAAOmB,GAG/B,QAASG,KACL,GAAItB,GAAOjG,EAAIlJ,CAoBf,OAlBAmP,GAAQmB,EAERpH,EAAKsH,IAKDxQ,EADc,IAAdkJ,EAAG7M,OACIqU,EAAMC,WACNP,EAAUlH,GACVwH,EAAME,QACC,SAAP1H,EACAwH,EAAMG,YACC,SAAP3H,GAAwB,UAAPA,EACjBwH,EAAMI,eAENJ,EAAMC,YAIb3Q,KAAMA,EACN4K,MAAO1B,EACP6H,OAAQ5B,EAAOmB,IAOvB,QAASU,KACL,GAEIC,GAEAC,EAJA/B,EAAQmB,EACRa,EAAO9R,EAAOkR,WAAWD,GAEzBc,EAAM/R,EAAOiR,EAGjB,QAAQa,GAGR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAED,QADEb,GAEEtQ,KAAM0Q,EAAMW,WACZzG,MAAO/P,OAAOmV,aAAamB,GAC3BJ,OAAQ5B,EAAOmB,GAGvB,SAII,GAHAW,EAAQ5R,EAAOkR,WAAWD,EAAQ,GAGpB,KAAVW,EACA,OAAQE,GACR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAED,MADAb,IAAS,GAELtQ,KAAM0Q,EAAMW,WACZzG,MAAO/P,OAAOmV,aAAamB,GAAQtW,OAAOmV,aAAaiB,GACvDF,OAAQ5B,EAAOmB,GAGvB,KAAK,IACL,IAAK,IAOD,MANAA,IAAS,EAGwB,KAA7BjR,EAAOkR,WAAWD,MAChBA,GAGFtQ,KAAM0Q,EAAMW,WACZzG,MAAOvL,EAAOwD,MAAMsM,EAAOmB,GAC3BS,OAAQ5B,EAAOmB,KAe/B,MAJAY,GAAM7R,EAAOiR,EAAQ,GAIjBc,IAAQF,GAAQ,KAAKrT,QAAQuT,IAAQ,GACrCd,GAAS,GAELtQ,KAAM0Q,EAAMW,WACZzG,MAAOwG,EAAMF,EACbH,OAAQ5B,EAAOmB,KAInB,eAAezS,QAAQuT,IAAQ,KAC7Bd,GAEEtQ,KAAM0Q,EAAMW,WACZzG,MAAOwG,EACPL,OAAQ5B,EAAOmB,SAIvBgB,MAAeC,EAASC,gBAAiB,WAI7C,QAASC,KACL,GAAIC,GAAQvC,EAAOW,CAQnB,IANAA,EAAKzQ,EAAOiR,GACZb,EAAOI,EAAeC,EAAGS,WAAW,KAAe,MAAPT,EACxC,sEAEJX,EAAQmB,EACRoB,EAAS,GACE,MAAP5B,EAAY,CAaZ,IAZA4B,EAASrS,EAAOiR,KAChBR,EAAKzQ,EAAOiR,GAIG,MAAXoB,GAEI5B,GAAMD,EAAeC,EAAGS,WAAW,KACnCe,KAAeC,EAASC,gBAAiB,WAI1C3B,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,IAErBR,GAAKzQ,EAAOiR,GAGhB,GAAW,MAAPR,EAAY,CAEZ,IADA4B,GAAUrS,EAAOiR,KACVT,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,IAErBR,GAAKzQ,EAAOiR,GAGhB,GAAW,MAAPR,GAAqB,MAAPA,EAOd,GANA4B,GAAUrS,EAAOiR,KAEjBR,EAAKzQ,EAAOiR,IACD,MAAPR,GAAqB,MAAPA,KACd4B,GAAUrS,EAAOiR,MAEjBT,EAAexQ,EAAOkR,WAAWD,IACjC,KAAOT,EAAexQ,EAAOkR,WAAWD,KACpCoB,GAAUrS,EAAOiR,SAGrBgB,MAAeC,EAASC,gBAAiB,UAQjD,OAJItB,GAAkB7Q,EAAOkR,WAAWD,KACpCgB,KAAeC,EAASC,gBAAiB,YAIzCxR,KAAM0Q,EAAMiB,eACZ/G,MAAOgH,WAAWF,GAClBX,OAAQ5B,EAAOmB,IAMvB,QAASuB,KACL,GAAcC,GAAO3C,EAAOW,EAAxBiC,EAAM,GAAsBC,GAAQ,CASxC,KAPAF,EAAQzS,EAAOiR,GACfb,EAAkB,MAAVqC,GAA4B,MAAVA,EACtB,2CAEJ3C,EAAQmB,IACNA,EAEajU,EAARiU,GAAgB,CAGnB,GAFAR,EAAKzQ,EAAOiR,KAERR,IAAOgC,EAAO,CACdA,EAAQ,EACR,OACG,GAAW,OAAPhC,EAEP,GADAA,EAAKzQ,EAAOiR,KACPR,GAAOG,EAAiBH,EAAGS,WAAW,IA0B3B,OAART,GAAkC,OAAlBzQ,EAAOiR,MACrBA,MA1BN,QAAQR,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,EAAGS,WAAW,IACtC,KAEAwB,IAAOjC,GAQf,MAJc,KAAVgC,GACAR,KAAeC,EAASC,gBAAiB,YAIzCxR,KAAM0Q,EAAMuB,cACZrH,MAAOmH,EACPC,MAAOA,EACPjB,OAAQ5B,EAAOmB,IAIvB,QAAS4B,GAAiBC,GACtB,MAAOA,GAAMnS,OAAS0Q,EAAMC,YACxBwB,EAAMnS,OAAS0Q,EAAME,SACrBuB,EAAMnS,OAAS0Q,EAAMI,gBACrBqB,EAAMnS,OAAS0Q,EAAMG,YAG7B,QAASuB,KACL,GAAItC,EAIJ,OAFAO,KAEIC,GAASjU,GAEL2D,KAAM0Q,EAAM2B,IACZtB,OAAQT,EAAOA,KAIvBR,EAAKzQ,EAAOkR,WAAWD,GAGZ,KAAPR,GAAoB,KAAPA,GAAoB,KAAPA,EACnBkB,IAIA,KAAPlB,GAAoB,KAAPA,EACN+B,IAGP3B,EAAkBJ,GACXW,IAKA,KAAPX,EACID,EAAexQ,EAAOkR,WAAWD,EAAQ,IAClCmB,IAEJT,IAGPnB,EAAeC,GACR2B,IAGJT,KAGX,QAASsB,KACL,GAAIH,EASJ,OAPAA,GAAQI,EACRjC,EAAQ6B,EAAMpB,MAAM,GAEpBwB,EAAYH,IAEZ9B,EAAQ6B,EAAMpB,MAAM,GAEboB,EAGX,QAASK,KACL,GAAIC,EAEJA,GAAMnC,EACNiC,EAAYH,IACZ9B,EAAQmC,EAKZ,QAASnB,GAAWa,EAAOO,GACvB,GAAIC,GACAC,EAAOjQ,MAAMlF,UAAUoF,MAAMxE,KAAKwU,UAAW,GAC7CC,EAAMJ,EAAcK,QAChB,SACA,SAAUC,EAAO1C,GAEb,MADAb,GAAOa,EAAQsC,EAAKvW,OAAQ,sCACrBuW,EAAKtC,IAOxB,MAHAqC,GAAQ,GAAI/C,OAAMkD,GAClBH,EAAMrC,MAAQA,EACdqC,EAAMM,YAAcH,EACdH,EAKV,QAASO,GAAgBf,GACrBb,EAAWa,EAAOZ,EAASC,gBAAiBW,EAAMvH,OAMtD,QAASuI,GAAOvI,GACZ,GAAIuH,GAAQG,KACRH,EAAMnS,OAAS0Q,EAAMW,YAAcc,EAAMvH,QAAUA,IACnDsI,EAAgBf,GAMxB,QAASiB,GAAMxI,GACX,MAAO2H,GAAUvS,OAAS0Q,EAAMW,YAAckB,EAAU3H,QAAUA,EAKtE,QAASyI,GAAaC,GAClB,MAAOf,GAAUvS,OAAS0Q,EAAME,SAAW2B,EAAU3H,QAAU0I,EAwBnE,QAASC,KACL,GAAIC,KAIJ,KAFAL,EAAO,MAECC,EAAM,MACNA,EAAM,MACNd,IACAkB,EAASxc,KAAK,QAEdwc,EAASxc,KAAKyc,MAETL,EAAM,MACPD,EAAO,KAOnB,OAFAA,GAAO,KAEAO,EAASC,sBAAsBH,GAK1C,QAASI,KACL,GAAIzB,EAOJ,OALA9B,KACA8B,EAAQG,IAIJH,EAAMnS,OAAS0Q,EAAMuB,eAAiBE,EAAMnS,OAAS0Q,EAAMiB,eACpD+B,EAASG,cAAc1B,GAG3BuB,EAASI,iBAAiB3B,EAAMvH,OAG3C,QAASmJ,KACL,GAAI5B,GAAOtH,CAWX,OATAsH,GAAQI,EACRlC,KAEI8B,EAAMnS,OAAS0Q,EAAM2B,KAAOF,EAAMnS,OAAS0Q,EAAMW,aACjD6B,EAAgBf,GAGpBtH,EAAM+I,IACNT,EAAO,KACAO,EAASM,eAAe,OAAQnJ,EAAK4I,MAGhD,QAASQ,KACL,GAAIC,KAIJ,KAFAf,EAAO,MAECC,EAAM,MACVc,EAAWld,KAAK+c,KAEXX,EAAM,MACPD,EAAO,IAMf,OAFAA,GAAO,KAEAO,EAASS,uBAAuBD,GAK3C,QAASE,KACL,GAAIC,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAMX,QAASC,KACL,GAAItU,GAAMmS,EAAOkC,CAEjB,OAAIjB,GAAM,KACCgB,KAGXpU,EAAOuS,EAAUvS,KAEbA,IAAS0Q,EAAMC,WACf0D,EAAOX,EAASI,iBAAiBxB,IAAM1H,OAChC5K,IAAS0Q,EAAMuB,eAAiBjS,IAAS0Q,EAAMiB,eACtD0C,EAAOX,EAASG,cAAcvB,KACvBtS,IAAS0Q,EAAME,QAClByC,EAAa,UACbf,IACA+B,EAAOX,EAASa,wBAEbvU,IAAS0Q,EAAMI,gBACtBqB,EAAQG,IACRH,EAAMvH,MAAyB,SAAhBuH,EAAMvH,MACrByJ,EAAOX,EAASG,cAAc1B,IACvBnS,IAAS0Q,EAAMG,aACtBsB,EAAQG,IACRH,EAAMvH,MAAQ,KACdyJ,EAAOX,EAASG,cAAc1B,IACvBiB,EAAM,KACbiB,EAAOd,IACAH,EAAM,OACbiB,EAAOJ,KAGPI,EACOA,MAGXnB,GAAgBZ,MAKpB,QAASkC,KACL,GAAI5B,KAIJ,IAFAO,EAAO,MAEFC,EAAM,KACP,KAAe/W,EAARiU,IACHsC,EAAK5b,KAAKyc,OACNL,EAAM,OAGVD,EAAO,IAMf,OAFAA,GAAO,KAEAP,EAGX,QAAS6B,KACL,GAAItC,EAQJ,OANAA,GAAQG,IAEHJ,EAAiBC,IAClBe,EAAgBf,GAGbuB,EAASI,iBAAiB3B,EAAMvH,OAG3C,QAAS8J,KAGL,MAFAvB,GAAO,KAEAsB,IAGX,QAASE,KACL,GAAIN,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAGX,QAASO,KACL,GAAIP,GAAMQ,CAIV,KAFAR,EAAOC,IAEAlB,EAAM,MAAQA,EAAM,MACnBA,EAAM,MACNyB,EAAWF,IACXN,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,KAElDA,EAAWH,IACXL,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,GAI1D,OAAOR,GASX,QAASU,KACL,GAAI5C,GAAOkC,CAcX,OAZI9B,GAAUvS,OAAS0Q,EAAMW,YAAckB,EAAUvS,OAAS0Q,EAAME,QAChEyD,EAAOW,KACA5B,EAAM,MAAQA,EAAM,MAAQA,EAAM,MACzCjB,EAAQG,IACR+B,EAAOU,IACPV,EAAOX,EAASuB,sBAAsB9C,EAAMvH,MAAOyJ,IAC5ChB,EAAa,WAAaA,EAAa,SAAWA,EAAa,UACtE/B,KAAeC,EAASC,iBAExB6C,EAAOW,KAGJX,EAGX,QAASa,GAAiB/C,GACtB,GAAIgD,GAAO,CAEX,IAAIhD,EAAMnS,OAAS0Q,EAAMW,YAAcc,EAAMnS,OAAS0Q,EAAME,QACxD,MAAO,EAGX,QAAQuB,EAAMvH,OACd,IAAK,KACDuK,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,GAAIf,GAAMlC,EAAOgD,EAAME,EAAO7b,EAAO8b,EAAU/b,EAAMR,CAMrD,IAJAQ,EAAOwb,IAEP5C,EAAQI,EACR4C,EAAOD,EAAiB/C,GACX,IAATgD,EACA,MAAO5b,EASX,KAPA4Y,EAAMgD,KAAOA,EACb7C,IAEA9Y,EAAQub,IAERM,GAAS9b,EAAM4Y,EAAO3Y,IAEd2b,EAAOD,EAAiB3C,IAAc,GAAG,CAG7C,KAAQ8C,EAAMhZ,OAAS,GAAO8Y,GAAQE,EAAMA,EAAMhZ,OAAS,GAAG8Y,MAC1D3b,EAAQ6b,EAAME,MACdD,EAAWD,EAAME,MAAM3K,MACvBrR,EAAO8b,EAAME,MACblB,EAAOX,EAAS8B,uBAAuBF,EAAU/b,EAAMC,GACvD6b,EAAMre,KAAKqd,EAIflC,GAAQG,IACRH,EAAMgD,KAAOA,EACbE,EAAMre,KAAKmb,GACXkC,EAAOU,IACPM,EAAMre,KAAKqd,GAMf,IAFAtb,EAAIsc,EAAMhZ,OAAS,EACnBgY,EAAOgB,EAAMtc,GACNA,EAAI,GACPsb,EAAOX,EAAS8B,uBAAuBH,EAAMtc,EAAI,GAAG6R,MAAOyK,EAAMtc,EAAI,GAAIsb,GACzEtb,GAAK,CAGT,OAAOsb,GAMX,QAASoB,KACL,GAAIpB,GAAMqB,EAAYC,CAatB,OAXAtB,GAAOe,IAEHhC,EAAM,OACNd,IACAoD,EAAaD,IACbtC,EAAO,KACPwC,EAAYF,IAEZpB,EAAOX,EAASkC,4BAA4BvB,EAAMqB,EAAYC,IAG3DtB,EAaX,QAASwB,KACL,GAAI5N,GAAY2K,CAUhB,OARA3K,GAAaqK,IAETrK,EAAWjI,OAAS0Q,EAAMC,YAC1BuC,EAAgBjL,GAGpB2K,EAAOQ,EAAM,KAAOoB,OAEbd,EAASoC,aAAa7N,EAAW2C,MAAOgI,GAOnD,QAASmD,KACL,KAAO3C,EAAM,MACTd,IACAuD,IAqBR,QAASG,KACL3F,IACAmC,GAEA,IAAI6B,GAAOZ,IACPY,KACwB,MAApB9B,EAAU3H,OAAoC,MAAnB2H,EAAU3H,OAC9ByJ,EAAKrU,OAASiW,EAAOtF,WAC5BuF,EAAkB7B,IAElB0B,IACwB,OAApBxD,EAAU3H,MACVuL,EAAkB9B,GAElBX,EAAS0C,eAAe/B,KAKhC9B,EAAUvS,OAAS0Q,EAAM2B,KACzBa,EAAgBX,GAIxB,QAAS4D,GAAkB9B,GACvB/B,GACA,IAAIrK,GAAaqK,IAAM1H,KACvB8I,GAAS2C,mBAAmBhC,EAAMpM,GAGtC,QAASiO,GAAkBjO,GACvB,GAAIqO,EACoB,OAApB/D,EAAU3H,QACV0H,IACIC,EAAUvS,OAAS0Q,EAAMC,YACzBuC,EAAgBX,GACpB+D,EAAYhE,IAAM1H,OAGtB0H,GACA,IAAI+B,GAAOZ,IACXsC,KACArC,EAAS6C,mBAAmBtO,EAAW7I,KAAMkX,EAAWjC,GAG5D,QAASmC,GAAMrF,EAAMsF,GAUjB,MATA/C,GAAW+C,EACXpX,EAAS8R,EACTb,EAAQ,EACRjU,EAASgD,EAAOhD,OAChBkW,EAAY,KACZmE,GACIC,aAGGX,IAn+BX,GAAItF,GACAkG,EACAX,EACA1E,EACAlS,EACAiR,EACAjU,EACAqX,EACAnB,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,oCA2qBnB,IAAI7C,IAAyBJ,EAuJzBnB,GAAkBgC,CA6GtBjG,GAAOsI,SACHtB,MAAOA,IAEZjgB,MCrgCH,SAAWiZ,GACT,YAEA,SAASuI,GAAeC,EAAgB5Y,EAAMhG,EAAM6e,GAClD,GAAIC,EACJ,KAEE,GADAA,EAAaC,EAAcH,GACvBE,EAAWE,aACVhf,EAAKxB,WAAaC,KAAK4M,cACN,aAAjBrL,EAAKif,SACK,SAATjZ,GAA4B,WAATA,GACvB,KAAMwQ,OAAM,4DAEd,MAAO0I,GAEP,WADAlT,SAAQuN,MAAM,8BAAgCqF,EAAgBM,GAIhE,MAAO,UAASC,EAAOnf,EAAMof,GAC3B,GAAIC,GAAUP,EAAWQ,WAAWH,EAAON,EAAgBO,EAO3D,OANIN,GAAWE,YAAcK,IAC3Brf,EAAKuf,6BAA+BT,EAAWE,WAC3CF,EAAWU,aACbxf,EAAKyf,6BAA+BX,EAAWU,aAG5CH,GAOX,QAASN,GAAcH,GACrB,GAAIE,GAAaY,EAAqBd,EACtC,KAAKE,EAAY,CACf,GAAIxE,GAAW,GAAIqF,EACnBjB,SAAQtB,MAAMwB,EAAgBtE,GAC9BwE,EAAa,GAAIc,GAAWtF,GAC5BoF,EAAqBd,GAAkBE,EAEzC,MAAOA,GAGT,QAASf,GAAQvM,GACfrU,KAAKqU,MAAQA,EACbrU,KAAK0iB,SAAW3R,OAgBlB,QAAS4R,GAAU9Z,GACjB7I,KAAK6I,KAAOA,EACZ7I,KAAK4iB,KAAOC,KAAKnb,IAAImB,GA2BvB,QAASkY,GAAiB+B,EAAQxE,EAAUyE,GAC1C/iB,KAAKgjB,YAA+B,kBAAVF,IACPA,EAAOE,aACM,KAAZD,KAAqBzE,YAAoBsC,IAI7C,KAAZmC,GACAzE,YAAoBsC,IACpBiC,KAAKnb,IAAI4W,EAASjK,OAAO4O,QAC3BF,EAAW,IACXzE,EAAW,GAAIqE,GAAUrE,EAASjK,QAGpCrU,KAAKkjB,YACAljB,KAAKgjB,aACN1E,YAAoBqE,KACnBG,YAAkB/B,IAAoB+B,YAAkBH,IAE7D3iB,KAAK8iB,OAAS9iB,KAAKkjB,WAAaJ,EAASK,EAAML,GAC/C9iB,KAAKse,SAAuB,KAAZyE,EAAkBzE,EAAW6E,EAAM7E,GAoErD,QAAS8E,GAAOva,EAAMwT,GACpBrc,KAAK6I,KAAOA,EACZ7I,KAAKqc,OACL,KAAK,GAAI7Z,GAAI,EAAGA,EAAI6Z,EAAKvW,OAAQtD,IAC/BxC,KAAKqc,KAAK7Z,GAAK2gB,EAAM9G,EAAK7Z,IA2C9B,QAAS6gB,KAAmB,KAAMhK,OAAM,mBA0BxC,QAAS8J,GAAMG,GACb,MAAqB,kBAAPA,GAAoBA,EAAMA,EAAIC,UAG9C,QAASf,KACPxiB,KAAK2hB,WAAa,KAClB3hB,KAAKwjB,WACLxjB,KAAKyjB,QACLzjB,KAAK0jB,YAAc3S,OACnB/Q,KAAK6hB,WAAa9Q,OAClB/Q,KAAKqiB,WAAatR,OAClB/Q,KAAKgjB,aAAc,EA6GrB,QAASW,GAAmBtP,GAC1BrU,KAAK4jB,OAASvP,EAUhB,QAASoO,GAAWtF,GAIlB,GAHAnd,KAAK6hB,WAAa1E,EAAS0E,WAC3B7hB,KAAKqiB,WAAalF,EAASkF,YAEtBlF,EAASwE,WACZ,KAAMtI,OAAM,uBAEdrZ,MAAK2hB,WAAaxE,EAASwE,WAC3BwB,EAAMnjB,KAAK2hB,YAEX3hB,KAAKwjB,QAAUrG,EAASqG,QACxBxjB,KAAKgjB,YAAc7F,EAAS6F,YAmE9B,QAASa,GAAyBhb,GAChC,MAAOvE,QAAOuE,GAAM2T,QAAQ,SAAU,SAASsH,GAC7C,MAAO,IAAMA,EAAEC,gBASnB,QAASC,GAAUhC,EAAOiC,GACxB,KAAOjC,EAAMkC,KACLxe,OAAOwB,UAAUid,eAAerc,KAAKka,EAAOiC,IAClDjC,EAAQA,EAAMkC,EAGhB,OAAOlC,GAGT,QAASoC,GAAoBC,GAC3B,OAAQA,GACN,IAAK,GACH,OAAO,CAET,KAAK,QACL,IAAK,OACL,IAAK,OACH,OAAO,EAGX,MAAKC,OAAMC,OAAOF,KAGX,GAFE,EAKX,QAASG,MAndT,GAAIjC,GAAuB7c,OAAOC,OAAO,KAkBzCib,GAAQ1Z,WACNqc,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GAAIrO,GAAQrU,KAAKqU,KACjBrU,MAAK0iB,SAAW,WACd,MAAOrO,IAIX,MAAOrU,MAAK0iB,WAShBC,EAAUzb,WACRqc,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GACIE,IADO5iB,KAAK6I,KACL7I,KAAK4iB,KAChB5iB,MAAK0iB,SAAW,SAASV,EAAO9V,GAI9B,MAHIA,IACFA,EAASuY,QAAQzC,EAAOY,GAEnBA,EAAK8B,aAAa1C,IAI7B,MAAOhiB,MAAK0iB,UAGdiC,SAAU,SAAS3C,EAAO4C,GAIxB,MAHwB,IAApB5kB,KAAK4iB,KAAK9c,OACZkc,EAAQgC,EAAUhC,EAAOhiB,KAAK4iB,KAAK,IAE9B5iB,KAAK4iB,KAAKiC,aAAa7C,EAAO4C,KA2BzC7D,EAAiB7Z,WACf4d,GAAIC,YACF,IAAK/kB,KAAKglB,UAAW,CACnB,GAAIC,GAAOjlB,KAAK8iB,iBAAkBH,GAC9B3iB,KAAK8iB,OAAOja,KAAO7I,KAAK8iB,OAAOiC,QACnC/kB,MAAKglB,UAAYnC,KAAKnb,IAAIud,EAAO,IAAMjlB,KAAKse,SAASzV,MAGvD,MAAO7I,MAAKglB,WAGdzB,QAAS,WACP,IAAKvjB,KAAK0iB,SAAU,CAClB,GAAII,GAAS9iB,KAAK8iB,MAElB,IAAI9iB,KAAKkjB,WAAY,CACnB,GAAIN,GAAO5iB,KAAK+kB,QAEhB/kB,MAAK0iB,SAAW,SAASV,EAAO9V,GAI9B,MAHIA,IACFA,EAASuY,QAAQzC,EAAOY,GAEnBA,EAAK8B,aAAa1C,QAEtB,IAAIhiB,KAAKse,mBAAoBqE,GAAW,CAC7C,GAAIC,GAAOC,KAAKnb,IAAI1H,KAAKse,SAASzV,KAElC7I,MAAK0iB,SAAW,SAASV,EAAO9V,GAC9B,GAAIgZ,GAAUpC,EAAOd,EAAO9V,EAK5B,OAHIA,IACFA,EAASuY,QAAQS,EAAStC,GAErBA,EAAK8B,aAAaQ,QAEtB,CAEL,GAAI5G,GAAWte,KAAKse,QAEpBte,MAAK0iB,SAAW,SAASV,EAAO9V,GAC9B,GAAIgZ,GAAUpC,EAAOd,EAAO9V,GACxBiZ,EAAW7G,EAAS0D,EAAO9V,EAI/B,OAHIA,IACFA,EAASuY,QAAQS,EAASC,GAErBD,EAAUA,EAAQC,GAAYpU,SAI3C,MAAO/Q,MAAK0iB,UAGdiC,SAAU,SAAS3C,EAAO4C,GACxB,GAAI5kB,KAAKkjB,WAEP,MADAljB,MAAK+kB,SAASF,aAAa7C,EAAO4C,GAC3BA,CAGT,IAAI9B,GAAS9iB,KAAK8iB,OAAOd,GACrBmD,EAAWnlB,KAAKse,mBAAoBqE,GAAY3iB,KAAKse,SAASzV,KAC9D7I,KAAKse,SAAS0D,EAClB,OAAOc,GAAOqC,GAAYP,IAY9BxB,EAAOlc,WACLke,UAAW,SAAS/Q,EAAOgR,EAAkB3D,EAAgBM,EACzC9V,GAClB,GAAIlC,GAAK0X,EAAe1hB,KAAK6I,MACzBqc,EAAUlD,CACd,IAAIhY,EACFkb,EAAUnU,WAGV,IADA/G,EAAKkb,EAAQllB,KAAK6I,OACbmB,EAEH,WADA6E,SAAQuN,MAAM,uBAAyBpc,KAAK6I,KAchD,IANIwc,EACFrb,EAAKA,EAAGsb,QACoB,kBAAZtb,GAAGub,QACnBvb,EAAKA,EAAGub,OAGO,kBAANvb,GAGT,WAFA6E,SAAQuN,MAAM,OAASiJ,EAAmB,UAAY,SACxC,YAAcrlB,KAAK6I,KAKnC;IAAK,GADDwT,IAAQhI,GACH7R,EAAI,EAAGA,EAAIxC,KAAKqc,KAAKvW,OAAQtD,IACpC6Z,EAAK7Z,EAAI,GAAK2gB,EAAMnjB,KAAKqc,KAAK7Z,IAAIwf,EAAO9V,EAG3C,OAAOlC,GAAGwb,MAAMN,EAAS7I,IAM7B,IAAIoJ,IACFC,IAAK,SAASniB,GAAK,OAAQA,GAC3BoiB,IAAK,SAASpiB,GAAK,OAAQA,GAC3BqiB,IAAK,SAASriB,GAAK,OAAQA,IAGzBsiB,GACFH,IAAK,SAAStc,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/BshB,IAAK,SAASvc,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/ByhB,IAAK,SAAS1c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B0hB,IAAK,SAAS3c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B2hB,IAAK,SAAS5c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B4hB,IAAK,SAAS7c,EAAG/E,GAAK,MAASA,GAAF+E,GAC7B8c,IAAK,SAAS9c,EAAG/E,GAAK,MAAO+E,GAAE/E,GAC/B8hB,KAAM,SAAS/c,EAAG/E,GAAK,MAAUA,IAAH+E,GAC9Bgd,KAAM,SAAShd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCgiB,KAAM,SAASjd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCiiB,KAAM,SAASld,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCkiB,MAAO,SAASnd,EAAG/E,GAAK,MAAO+E,KAAI/E,GACnCmiB,MAAO,SAASpd,EAAG/E,GAAK,MAAO+E,KAAI/E,GACnCoiB,KAAM,SAASrd,EAAG/E,GAAK,MAAO+E,IAAG/E,GACjCqiB,KAAM,SAAStd,EAAG/E,GAAK,MAAO+E,IAAG/E,GAiBnCme,GAAYtb,WACVwX,sBAAuB,SAASiI,EAAIC,GAClC,IAAKnB,EAAekB,GAClB,KAAMtN,OAAM,wBAA0BsN,EAIxC,OAFAC,GAAWzD,EAAMyD,GAEV,SAAS5E,EAAO9V,GACrB,MAAOuZ,GAAekB,GAAIC,EAAS5E,EAAO9V,MAI9C+S,uBAAwB,SAAS0H,EAAI3jB,EAAMC,GACzC,IAAK4iB,EAAgBc,GACnB,KAAMtN,OAAM,wBAA0BsN,EAKxC,OAHA3jB,GAAOmgB,EAAMngB,GACbC,EAAQkgB,EAAMlgB,GAEP,SAAS+e,EAAO9V,GACrB,MAAO2Z,GAAgBc,GAAI3jB,EAAKgf,EAAO9V,GACZjJ,EAAM+e,EAAO9V,MAI5CmT,4BAA6B,SAASwH,EAAM1H,EAAYC,GAKtD,MAJAyH,GAAO1D,EAAM0D,GACb1H,EAAagE,EAAMhE,GACnBC,EAAY+D,EAAM/D,GAEX,SAAS4C,EAAO9V,GACrB,MAAO2a,GAAK7E,EAAO9V,GACfiT,EAAW6C,EAAO9V,GAAYkT,EAAU4C,EAAO9V,KAIvDqR,iBAAkB,SAAS1U,GACzB,GAAIie,GAAQ,GAAInE,GAAU9Z,EAE1B,OADAie,GAAMrd,KAAO,aACNqd,GAGTvI,uBAAwB,SAASwE,EAAUD,EAAQxE,GACjD,GAAIyD,GAAK,GAAIhB,GAAiB+B,EAAQxE,EAAUyE,EAGhD,OAFIhB,GAAGiB,cACLhjB,KAAKgjB,aAAc,GACdjB,GAGTzE,cAAe,SAAS1B,GACtB,MAAO,IAAIgF,GAAQhF,EAAMvH,QAG3B+I,sBAAuB,SAASH,GAC9B,IAAK,GAAIza,GAAI,EAAGA,EAAIya,EAASnX,OAAQtD,IACnCya,EAASza,GAAK2gB,EAAMlG,EAASza,GAE/B,OAAO,UAASwf,EAAO9V,GAErB,IAAK,GADD6a,MACKvkB,EAAI,EAAGA,EAAIya,EAASnX,OAAQtD,IACnCukB,EAAItmB,KAAKwc,EAASza,GAAGwf,EAAO9V,GAC9B,OAAO6a,KAIXtJ,eAAgB,SAASuJ,EAAM1S,EAAKD,GAClC,OACEC,IAAKA,YAAeqO,GAAYrO,EAAIzL,KAAOyL,EAAID,MAC/CA,MAAOA,IAIXuJ,uBAAwB,SAASD,GAC/B,IAAK,GAAInb,GAAI,EAAGA,EAAImb,EAAW7X,OAAQtD,IACrCmb,EAAWnb,GAAG6R,MAAQ8O,EAAMxF,EAAWnb,GAAG6R,MAE5C,OAAO,UAAS2N,EAAO9V,GAErB,IAAK,GADD+a,MACKzkB,EAAI,EAAGA,EAAImb,EAAW7X,OAAQtD,IACrCykB,EAAItJ,EAAWnb,GAAG8R,KAAOqJ,EAAWnb,GAAG6R,MAAM2N,EAAO9V,EACtD,OAAO+a,KAIX1H,aAAc,SAAS1W,EAAMwT,GAC3Brc,KAAKwjB,QAAQ/iB,KAAK,GAAI2iB,GAAOva,EAAMwT,KAGrCyD,mBAAoB,SAAS6B,EAAYE,GACvC7hB,KAAK2hB,WAAaA,EAClB3hB,KAAK6hB,WAAaA,GAGpB7B,mBAAoB,SAAS6B,EAAYQ,EAAYV,GACnD3hB,KAAK2hB,WAAaA,EAClB3hB,KAAK6hB,WAAaA,EAClB7hB,KAAKqiB,WAAaA,GAGpBxC,eAAgB,SAAS8B,GACvB3hB,KAAK2hB,WAAaA,GAGpB3D,qBAAsBqF,GAOxBM,EAAmBzc,WACjBggB,KAAM,WAAa,MAAOlnB,MAAK4jB,QAC/BuD,eAAgB,WAAa,MAAOnnB,MAAK4jB,QACzCwD,QAAS,aACTC,MAAO,cAiBT5E,EAAWvb,WACTib,WAAY,SAASH,EAAON,EAAgBO,GAU1C,QAASsB,KAEP,GAAI+D,EAEF,MADAA,IAAY,EACLC,CAGLjU,GAAK0P,aACP9W,EAASsb,YAEX,IAAInT,GAAQf,EAAKmU,SAASzF,EACA1O,EAAK0P,YAAc9W,EAAW6E,OAC9B2Q,EAI1B,OAHIpO,GAAK0P,aACP9W,EAASwb,cAEJrT,EAGT,QAASsT,GAAW/C,GAElB,MADAtR,GAAKqR,SAAS3C,EAAO4C,EAAUlD,GACxBkD,EA9BT,GAAI3C,EACF,MAAOjiB,MAAKynB,SAASzF,EAAOjR,OAAW2Q,EAEzC,IAAIxV,GAAW,GAAI0b,kBAEfL,EAAavnB,KAAKynB,SAASzF,EAAO9V,EAAUwV,GAC5C4F,GAAY,EACZhU,EAAOtT,IA0BX,OAAO,IAAI6nB,mBAAkB3b,EAAUqX,EAASoE,GAAY,IAG9DF,SAAU,SAASzF,EAAO9V,EAAUwV,GAElC,IAAK,GADDrN,GAAQ8O,EAAMnjB,KAAK2hB,YAAYK,EAAO9V,GACjC1J,EAAI,EAAGA,EAAIxC,KAAKwjB,QAAQ1d,OAAQtD,IACvC6R,EAAQrU,KAAKwjB,QAAQhhB,GAAG4iB,UAAU/Q,GAAO,EAAOqN,EAAgBM,EAC9B9V,EAGpC,OAAOmI,IAGTsQ,SAAU,SAAS3C,EAAO4C,EAAUlD,GAElC,IADA,GAAIoG,GAAQ9nB,KAAKwjB,QAAUxjB,KAAKwjB,QAAQ1d,OAAS,EAC1CgiB,IAAU,GACflD,EAAW5kB,KAAKwjB,QAAQsE,GAAO1C,UAAUR,GAAU,EAAMlD,EAChBM,EAG3C,OAAIhiB,MAAK2hB,WAAWgD,SACX3kB,KAAK2hB,WAAWgD,SAAS3C,EAAO4C,GADzC,QAeJ,IAAIV,GAAkB,IAAMxU,KAAKqY,SAASC,SAAS,IAAI1b,MAAM,EAiC7DkY,GAAmBtd,WAEjB+gB,YAAa,SAAS5T,GACpB,GAAI6T,KACJ,KAAK,GAAI5T,KAAOD,GACd6T,EAAMznB,KAAKojB,EAAyBvP,GAAO,KAAOD,EAAMC,GAE1D,OAAO4T,GAAMC,KAAK,OAGpBC,UAAW,SAAS/T,GAClB,GAAIgU,KACJ,KAAK,GAAI/T,KAAOD,GACVA,EAAMC,IACR+T,EAAO5nB,KAAK6T,EAEhB,OAAO+T,GAAOF,KAAK,MAIrBG,+BAAgC,SAASC,GACvC,GAAIlG,GAAakG,EAASjG,4BAC1B,IAAKD,EAGL,MAAO,UAASmG,EAAkBzO,GAChCyO,EAAiBxG,MAAMK,GAActI,IAIzCyH,eAAgB,SAAS6C,EAAYxb,EAAMhG,GACzC,GAAI+f,GAAOC,KAAKnb,IAAI2c,EAEpB,EAAA,GAAKD,EAAoBC,KAAezB,EAAKK,MAa7C,MAAOzB,GAAe6C,EAAYxb,EAAMhG,EAAM7C,KAZ5C,IAAmB,GAAf4iB,EAAK9c,OACP,MAAO,UAASkc,EAAOnf,EAAMof,GAC3B,GAAIA,EACF,MAAOW,GAAK8B,aAAa1C,EAE3B,IAAI3iB,GAAQ2kB,EAAUhC,EAAOY,EAAK,GAClC,OAAO,IAAI6F,cAAappB,EAAOujB,MASvC8F,qBAAsB,SAASH,GAC7B,GAAII,GAAYJ,EAASnG,4BACzB,IAAKuG,EAAL,CAGA,GAAIC,GAAcL,EAASC,iBACvBD,EAASC,iBAAiBxG,MAC1BuG,EAASvG,MAETjC,EAAYwI,EAASjG,4BAEzB,OAAO,UAASN,GACd,GAAI3iB,GAAQqG,OAAOC,OAAOijB,EAI1B,OAHAvpB,GAAMspB,GAAa3G,EACnB3iB,EAAM0gB,GAAahP,OACnB1R,EAAM6kB,GAAmB0E,EAClBvpB,MAKb4Z,EAAOuL,mBAAqBA,EACxBvL,EAAO4P,sBACT5P,EAAO6P,eAAiBlH,IAEzB5hB,MC7jBH+oB,SACEC,QAAS,iBCGmB,kBAAnB7pB,QAAO4pB,UAChBA,YCJF,SAAU1pB,GAGR,QAAS4pB,GAAO/hB,EAAWgiB,GAiBzB,MAhBIhiB,IAAagiB,GAEfxjB,OAAOyjB,oBAAoBD,GAAK9kB,QAAQ,SAAS9B,GAE/C,GAAI8mB,GAAK1jB,OAAO2jB,yBAAyBH,EAAK5mB,EAC1C8mB,KAEF1jB,OAAO4jB,eAAepiB,EAAW5E,EAAG8mB,GAEb,kBAAZA,GAAG/U,QAEZ+U,EAAG/U,MAAMkV,IAAMjnB,MAKhB4E,EAKT7H,EAAM4pB,OAASA,GAEdF,SC3BH,SAAU1pB,GA6CR,QAASmqB,GAAIA,EAAK5hB,EAAU6hB,GAO1B,MANID,GACFA,EAAIE,OAEJF,EAAM,GAAIG,GAAI3pB,MAEhBwpB,EAAII,GAAGhiB,EAAU6hB,GACVD,EAzCT,GAAIG,GAAM,SAASE,GACjB7pB,KAAKklB,QAAU2E,EACf7pB,KAAK8pB,cAAgB9pB,KAAK+pB,SAAS1mB,KAAKrD,MAE1C2pB,GAAIziB,WACF0iB,GAAI,SAAShiB,EAAU6hB,GACrBzpB,KAAK4H,SAAWA,CAChB,IAAIoiB,EACCP,IAMHO,EAAI1X,WAAWtS,KAAK8pB,cAAeL,GACnCzpB,KAAKiqB,OAAS,WACZ1X,aAAayX,MAPfA,EAAIze,sBAAsBvL,KAAK8pB,eAC/B9pB,KAAKiqB,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACA1pB,KAAKiqB,SACPjqB,KAAKiqB,SACLjqB,KAAKiqB,OAAS,OAGlBF,SAAU,WACJ/pB,KAAKiqB,SACPjqB,KAAK0pB,OACL1pB,KAAK4H,SAASE,KAAK9H,KAAKklB,YAiB9B7lB,EAAMmqB,IAAMA,GAEXT,SC3DH,WAEE,GAAIoB,KAEJC,aAAYlhB,SAAW,SAASmhB,EAAKnjB,GACnCijB,EAASE,GAAOnjB,GAIlBkjB,YAAYE,mBAAqB,SAASD,GACxC,GAAInjB,GAAamjB,EAA8BF,EAASE,GAAjCD,YAAYljB,SAEnC,OAAOA,IAAaxB,OAAO6kB,eAAeppB,SAASsD,cAAc4lB,IAInE,IAAIG,GAA0BC,MAAMvjB,UAAUwjB,eAC9CD,OAAMvjB,UAAUwjB,gBAAkB,WAChC1qB,KAAK2qB,cAAe,EACpBH,EAAwBhF,MAAMxlB,KAAMsc,aASrCyM,SC5BF,SAAU1pB,GAgBP,QAASurB,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBvB,EAAMuB,EAAOvB,IAEbwB,EAASD,EAAOC,MACfA,KACExB,IACHA,EAAMuB,EAAOvB,IAAMyB,EAAWljB,KAAK9H,KAAM8qB,IAEtCvB,GACH1a,QAAQC,KAAK,iFAQfic,EAASE,EAAaH,EAAQvB,EAAKgB,EAAevqB,OAGpD,IAAIgK,GAAK+gB,EAAOxB,EAChB,OAAIvf,IAEGA,EAAG+gB,QAENE,EAAajhB,EAAIuf,EAAKwB,GAIjB/gB,EAAGwb,MAAMxlB,KAAM6qB,QARxB,OAYF,QAASG,GAAW3W,GAElB,IADA,GAAIrO,GAAIhG,KAAKkrB,UACNllB,GAAKA,IAAMokB,YAAYljB,WAAW,CAGvC,IAAK,GAAsB5E,GADvB6oB,EAAKzlB,OAAOyjB,oBAAoBnjB,GAC3BxD,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAasD,EAAF5G,IAAQF,EAAE6oB,EAAG3oB,IAAKA,IAAK,CACnD,GAAIJ,GAAIsD,OAAO2jB,yBAAyBrjB,EAAG1D,EAC3C,IAAuB,kBAAZF,GAAEiS,OAAwBjS,EAAEiS,QAAUA,EAC/C,MAAO/R,GAGX0D,EAAIA,EAAEklB,WAIV,QAASD,GAAaG,EAAQviB,EAAMwiB,GAIlC,GAAItrB,GAAIurB,EAAUD,EAAOxiB,EAAMuiB,EAM/B,OALIrrB,GAAE8I,KAGJ9I,EAAE8I,GAAM0gB,IAAM1gB,GAETuiB,EAAOL,OAAShrB,EAGzB,QAASurB,GAAUD,EAAOxiB,EAAMiiB,GAE9B,KAAOO,GAAO,CACZ,GAAKA,EAAMxiB,KAAUiiB,GAAWO,EAAMxiB,GACpC,MAAOwiB,EAETA,GAAQd,EAAec,GAMzB,MAAO3lB,QAMT,QAAS6kB,GAAerjB,GACtB,MAAOA,GAAUgkB,UAkBnB7rB,EAAMksB,MAAQX,GAEf7B,SC3HH,SAAU1pB,GA8CR,QAASmsB,GAAiBnX,EAAOoX,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwBzT,QAC1B0T,EAAe,QAGVC,EAAaD,GAAcrX,EAAOoX,GApD3C,GAAIE,IACFC,OAAQ,SAASvX,GACf,MAAOA,IAETwX,KAAM,SAASxX,GACb,MAAO,IAAI2D,MAAKA,KAAKiI,MAAM5L,IAAU2D,KAAKC,QAE5C6T,UAAS,SAASzX,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvC8G,OAAQ,SAAS9G,GACf,GAAI/R,GAAI+Y,WAAWhH,EAKnB,OAHU,KAAN/R,IACFA,EAAIypB,SAAS1X,IAERiQ,MAAMhiB,GAAK+R,EAAQ/R,GAK5BwgB,OAAQ,SAASzO,EAAOoX,GACtB,GAAqB,OAAjBA,EACF,MAAOpX,EAET,KAIE,MAAO2X,MAAK/L,MAAM5L,EAAMmI,QAAQ,KAAM,MACtC,MAAMpX,GAEN,MAAOiP,KAIX4X,WAAY,SAAS5X,EAAOoX,GAC1B,MAAOA,IAiBXpsB,GAAMmsB,iBAAmBA,GAExBzC,SC9DH,SAAU1pB,GAIR,GAAI4pB,GAAS5pB,EAAM4pB,OAIfC,IAEJA,GAAIgD,eACJhD,EAAIiD,YAEJjD,EAAIkD,QAAU,SAASC,EAAMnlB,GAC3B,IAAK,GAAI5E,KAAK+pB,GACZpD,EAAO/hB,EAAWmlB,EAAK/pB,KAM3BjD,EAAM6pB,IAAMA,GAEXH,SCtBH,SAAU1pB,GAER,GAAIitB,IASFC,MAAO,SAASnB,EAAQ/O,EAAMmQ,GAG5BC,SAASC,QAETrQ,EAAQA,GAAQA,EAAKvW,OAAUuW,GAAQA,EAEvC,IAAIrS,GAAK,YACNhK,KAAKorB,IAAWA,GAAQ5F,MAAMxlB,KAAMqc,IACrChZ,KAAKrD,MAEHiqB,EAASuC,EAAUla,WAAWtI,EAAIwiB,GAClCjhB,sBAAsBvB,EAE1B,OAAOwiB,GAAUvC,GAAUA,GAE7B0C,YAAa,SAAS1C,GACP,EAATA,EACFC,sBAAsBD,GAEtB1X,aAAa0X,IAWjB2C,KAAM,SAASnjB,EAAMsJ,EAAQ8Z,EAAQtnB,EAASC,GAC5C,GAAI3C,GAAOgqB,GAAU7sB,KACjB+S,EAASA,MACT+Z,EAAQ,GAAIC,aAAYtjB,GAC1BlE,QAAsBwL,SAAZxL,EAAwBA,GAAU,EAC5CC,WAA4BuL,SAAfvL,EAA2BA,GAAa,EACrDuN,OAAQA,GAGV,OADAlQ,GAAKiI,cAAcgiB,GACZA,GASTE,UAAW,WACThtB,KAAKusB,MAAM,OAAQjQ,YASrB2Q,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAU1hB,OAAOyhB,GAEnBF,GACFA,EAAKG,UAAU3hB,IAAI0hB,KAMrBE,EAAM,aAGNC,IAIJjB,GAAMkB,YAAclB,EAAMC,MAI1BltB,EAAM6pB,IAAIiD,SAASG,MAAQA,EAC3BjtB,EAAMiuB,IAAMA,EACZjuB,EAAMkuB,IAAMA,GAEXxE,SChGH,SAAU1pB,GAIR,GAAIouB,GAAMtuB,OAAOuuB,aACbC,EAAe,MAGf3kB,GAEF2kB,aAAcA,EAEdC,iBAAkB,WAChB,GAAI5kB,GAAShJ,KAAK6tB,cAClBJ,GAAIzkB,QAAWtD,OAAOG,KAAKmD,GAAQlD,OAAS,GAAM+I,QAAQ4e,IAAI,yBAA0BztB,KAAK8tB,UAAW9kB,EAKxG,KAAK,GAAIS,KAAQT,GAAQ,CACvB,GAAI+kB,GAAa/kB,EAAOS,EACxBzJ,MAAKwK,iBAAiBf,EAAMzJ,KAAKO,QAAQytB,gBAAgBhuB,KAAMA,KACN+tB,MAI7DE,eAAgB,SAAShH,EAAKmE,EAAQ/O,GACpC,GAAI4K,EAAK,CACPwG,EAAIzkB,QAAU6F,QAAQqf,MAAM,qBAAsBjH,EAAI6G,UAAW1C,EACjE,IAAIphB,GAAuB,kBAAXohB,GAAwBA,EAASnE,EAAImE,EACjDphB,IACFA,EAAGqS,EAAO,QAAU,QAAQ4K,EAAK5K,GAEnCoR,EAAIzkB,QAAU6F,QAAQsf,WACtB1B,SAASC,UAOfrtB,GAAM6pB,IAAIiD,SAASnjB,OAASA,GAE3B+f,SC3CH,SAAU1pB,GAIR,GAAIyN,IACFshB,uBAAwB,WACtB,GAAIC,GAAKruB,KAAKsuB,mBACd,KAAK,GAAI1oB,KAAKyoB,GACPruB,KAAKuuB,aAAa3oB,IACrB5F,KAAKwuB,aAAa5oB,EAAGyoB,EAAGzoB,KAK9B6oB,eAAgB,WAGd,GAAIzuB,KAAK0uB,WACP,IAAK,GAA0C5sB,GAAtCU,EAAE,EAAG6rB,EAAGruB,KAAK8M,WAAY1D,EAAEilB,EAAGvoB,QAAYhE,EAAEusB,EAAG7rB,KAAS4G,EAAF5G,EAAKA,IAClExC,KAAK2uB,oBAAoB7sB,EAAE+G,KAAM/G,EAAEuS,QAMzCsa,oBAAqB,SAAS9lB,EAAMwL,GAGlC,GAAIxL,GAAO7I,KAAK4uB,qBAAqB/lB,EACrC,IAAIA,EAAM,CAIR,GAAIwL,GAASA,EAAMwa,OAAOxvB,EAAMyvB,cAAgB,EAC9C,MAGF,IAAIrD,GAAezrB,KAAK6I,GAEpBwL,EAAQrU,KAAKwrB,iBAAiBnX,EAAOoX,EAErCpX,KAAUoX,IAEZzrB,KAAK6I,GAAQwL,KAKnBua,qBAAsB,SAAS/lB,GAC7B,GAAIgU,GAAQ7c,KAAK0uB,YAAc1uB,KAAK0uB,WAAW7lB,EAE/C,OAAOgU,IAGT2O,iBAAkB,SAASuD,EAAatD,GACtC,MAAOpsB,GAAMmsB,iBAAiBuD,EAAatD,IAE7CuD,eAAgB,SAAS3a,EAAOqX,GAC9B,MAAqB,YAAjBA,EACKrX,EAAQ,GAAKtD,OACM,WAAjB2a,GAA8C,aAAjBA,GACvB3a,SAAVsD,EACEA,EAFF,QAKT4a,2BAA4B,SAASpmB,GACnC,GAAI6iB,SAAsB1rB,MAAK6I,GAE3BqmB,EAAkBlvB,KAAKgvB,eAAehvB,KAAK6I,GAAO6iB,EAE9B3a,UAApBme,EACFlvB,KAAKwuB,aAAa3lB,EAAMqmB,GAME,YAAjBxD,GACT1rB,KAAKmvB,gBAAgBtmB,IAO3BxJ,GAAM6pB,IAAIiD,SAASrf,WAAaA,GAE/Bic,SCvFH,SAAU1pB,GAsJR,QAAS+vB,GAAettB,EAAGwc,EAAU+Q,GAEnC,MAAOC,UAASC,eAAeztB,EAAGwc,EAAU+Q,EAAYG,GAK1D,QAASA,GAAoB5hB,EAAUyG,GACrC,MAActD,UAAVsD,GAAoC,OAAbzG,EAClByG,EAES,OAAVA,GAA4BtD,SAAVsD,EAAuBzG,EAAWyG,EA7J9D,GAAIoZ,GAAMtuB,OAAOuuB,aAUb/P,GACF8R,uBAAwB,WACtB,GAAItE,GAAKnrB,KAAK0vB,aACd,IAAIvE,GAAMA,EAAGrlB,OAAQ,CACnB,GAAI6pB,GAAI3vB,KAAK4vB,kBAAoB,GAAIhI,mBAAiB,EACtD5nB,MAAK6vB,mBAAmBF,GAKxB,KAAK,GAAsBrtB,GAAlBE,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAcsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IAChDmtB,EAAElL,QAAQzkB,KAAMsC,GAChBtC,KAAK8vB,kBAAkBxtB,EAAGtC,KAAKsC,GAAI,QAIzCytB,qBAAsB,WAChB/vB,KAAK4vB,mBACP5vB,KAAK4vB,kBAAkB1I,KAAKlnB,KAAKgwB,sBAAuBhwB,OAG5DgwB,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAItnB,GAAMuiB,EAAQgF,IAClB,KAAK,GAAI5tB,KAAK0tB,GAIZ,GAFArnB,EAAOsnB,EAAM,EAAI3tB,EAAI,GACrB4oB,EAASprB,KAAKkN,QAAQrE,GACV,CACV,GAAIwnB,GAAKH,EAAU1tB,GAAI8tB,EAAKL,EAAUztB,EAEtCxC,MAAK8vB,kBAAkBjnB,EAAMynB,EAAID,GAC5BD,EAAOhF,KAEEra,SAAPsf,GAA2B,OAAPA,GAAwBtf,SAAPuf,GAA2B,OAAPA,KAC5DF,EAAOhF,IAAU,EAKjBprB,KAAKuwB,aAAanF,GAASiF,EAAIC,EAAIhU,eAM7CkU,eAAgB,WACVxwB,KAAK4vB,mBACP5vB,KAAK4vB,kBAAkBxI,WAG3BqJ,iBAAkB,SAAS5nB,GACrB7I,KAAK0wB,QAAQ7nB,IACf7I,KAAKivB,2BAA2BpmB,IAGpCinB,kBAAmB,SAASjnB,EAAMwL,EAAO8Y,GAEvC,GAAIwD,GAAe3wB,KAAKkN,QAAQrE,EAChC,IAAI8nB,IAEEvkB,MAAMwkB,QAAQzD,KAChBM,EAAIvgB,SAAW2B,QAAQ4e,IAAI,mDAAoDztB,KAAK8tB,UAAWjlB,GAC/F7I,KAAK6wB,mBAAmBhoB,EAAO,YAG7BuD,MAAMwkB,QAAQvc,IAAQ,CACxBoZ,EAAIvgB,SAAW2B,QAAQ4e,IAAI,iDAAkDztB,KAAK8tB,UAAWjlB,EAAMwL,EACnG,IAAInI,GAAW,GAAI4kB,eAAczc,EACjCnI,GAASgb,KAAK,SAAS7S,EAAO8Y,GAC5BntB,KAAKuwB,aAAaI,GAAexD,KAChCntB,MACHA,KAAK+wB,sBAAsBloB,EAAO,UAAWqD,KAInD8kB,aAAc,SAAS1S,EAAU+Q,EAAYpN,GAC3C,MAAIA,QACFjiB,KAAKse,GAAY+Q,GAGZD,EAAepvB,KAAMse,EAAU+Q,IAExCkB,aAAc,SAASnF,EAAQ/O,GAC7B,GAAIrS,GAAKhK,KAAKorB,IAAWA,CACP,mBAAPphB,IACTA,EAAGwb,MAAMxlB,KAAMqc,IAGnBwT,kBAAmB,SAASoB,GAC1BjxB,KAAKkxB,WAAalxB,KAAKkxB,eACvBlxB,KAAKkxB,WAAWzwB,KAAKwwB,IAGvBE,eAAgB,WACd,GAAKnxB,KAAKkxB,WAAV,CAGA,IAAK,GAAI1uB,GAAE,EAAG4G,EAAEpJ,KAAKkxB,WAAWprB,OAAUsD,EAAF5G,EAAKA,IAC3CxC,KAAKoxB,mBAAmBpxB,KAAKkxB,WAAW1uB,GAE1CxC,MAAKkxB,gBAEPE,mBAAoB,SAASC,GAC3B,IAAK,GAAiC1B,GAA7BntB,EAAE,EAAG4G,EAAEioB,EAAcvrB,OAAasD,EAAF5G,EAAKA,IAC5CmtB,EAAI0B,EAAc7uB,GACdmtB,GAAKA,EAAEtI,OACTsI,EAAEtI,SAKR0J,sBAAuB,SAASloB,EAAMqD,GACpC,GAAIolB,GAAKtxB,KAAKuxB,kBAAoBvxB,KAAKuxB,mBACvCD,GAAGzoB,GAAQqD,GAEb2kB,mBAAoB,SAAShoB,GAC3B,GAAIyoB,GAAKtxB,KAAKuxB,eACd,OAAID,IAAMA,EAAGzoB,IACXyoB,EAAGzoB,GAAMwe,QACTiK,EAAGzoB,GAAQ,MACJ,GAHT,QAMF2oB,oBAAqB,WACnB,GAAIxxB,KAAKuxB,gBAAiB,CACxB,IAAK,GAAI/uB,KAAKxC,MAAKuxB,gBACjBvxB,KAAK6wB,mBAAmBruB,EAE1BxC,MAAKuxB,qBA6BXlyB,GAAM6pB,IAAIiD,SAASxO,WAAaA,GAE/BoL,SC7KH,SAAU1pB,GAIR,GAAIouB,GAAMtuB,OAAOuuB,UAAY,EAGzB+D,GACFC,iBAAkB,SAASnJ,GAEzB,GAAIoJ,GAAS3xB,KAAK2xB,SAAYpJ,EAASqJ,iBACnC5xB,KAAKO,QAAQoxB,OACbE,EAAMtJ,EAASuJ,eAAe9xB,KAAM2xB,EAExC,OADA3xB,MAAK6vB,kBAAkBgC,EAAIE,WACpBF,GAETxuB,KAAM,SAASwF,EAAMwmB,EAAYpN,GAC/B,GAAI3D,GAAWte,KAAK4uB,qBAAqB/lB,EACzC,IAAKyV,EAIE,CAEL,GAAIpS,GAAWlM,KAAKgxB,aAAa1S,EAAU+Q,EAAYpN,EAUvD,OAPIwK,UAASuF,0BAA4B9lB,IACvCA,EAAS0W,KAAOyM,EAAW4C,MAC3BjyB,KAAKkyB,eAAe5T,EAAUpS,IAE5BlM,KAAK0wB,QAAQpS,IACfte,KAAKivB,2BAA2B3Q,GAE3BpS,EAbP,MAAOlM,MAAKmyB,WAAW7V,YAgB3B8V,aAAc,WACZpyB,KAAKqyB,oBAEPH,eAAgB,SAASrpB,EAAMqD,GAC7BlM,KAAK+xB,UAAY/xB,KAAK+xB,cACtB/xB,KAAK+xB,UAAUlpB,GAAQqD,GAKzBomB,eAAgB,WACTtyB,KAAKuyB,WACR9E,EAAI+E,QAAU3jB,QAAQ4e,IAAI,sBAAuBztB,KAAK8tB,WACtD9tB,KAAKyyB,cAAgBzyB,KAAKwpB,IAAIxpB,KAAKyyB,cAAezyB,KAAK0yB,UAAW,KAGtEA,UAAW,WACJ1yB,KAAKuyB,WACRvyB,KAAKmxB,iBACLnxB,KAAKwxB,sBACLxxB,KAAKuyB,UAAW,IAGpBI,gBAAiB,WACf,MAAI3yB,MAAKuyB,cACP9E,EAAI+E,QAAU3jB,QAAQC,KAAK,gDAAiD9O,KAAK8tB,aAGnFL,EAAI+E,QAAU3jB,QAAQ4e,IAAI,uBAAwBztB,KAAK8tB,gBACnD9tB,KAAKyyB,gBACPzyB,KAAKyyB,cAAgBzyB,KAAKyyB,cAAc/I,YAsB1CkJ,EAAkB,gBAItBvzB,GAAMyvB,YAAc8D,EACpBvzB,EAAM6pB,IAAIiD,SAASsF,IAAMA,GAExB1I,SChGH,SAAU1pB,GA8NR,QAASwzB,GAAO/P,GACd,MAAOA,GAAOqB,eAAe,eAK/B,QAAS2O,MAlOT,GAAIC,IACFD,aAAa,EACbtJ,IAAK,SAASA,EAAK5hB,EAAU6hB,GAC3B,GAAmB,gBAARD,GAIT,MAAOT,SAAQS,IAAI1hB,KAAK9H,KAAMwpB,EAAK5hB,EAAU6hB,EAH7C,IAAInnB,GAAI,MAAQknB,CAChBxpB,MAAKsC,GAAKymB,QAAQS,IAAI1hB,KAAK9H,KAAMA,KAAKsC,GAAIsF,EAAU6hB,IAKxD8B,QAAOxC,QAAQwC,MAEfyH,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACXlzB,KAAKwoB,kBAAoBxoB,KAAKwoB,iBAAiBxG,OACjDnT,QAAQC,KAAK,iBAAmB9O,KAAK8tB,UAAY,wGAInD9tB,KAAKgzB,UACLhzB,KAAKmzB,mBAGAnzB,KAAKozB,cAAcC,mBAAqBl0B,OAAO+E,oBAClDlE,KAAKqyB,oBAITc,eAAgB,WACd,MAAInzB,MAAKszB,qBACPzkB,SAAQC,KAAK,2BAA4B9O,KAAK8tB,YAGhD9tB,KAAKszB,kBAAmB,EAExBtzB,KAAKuzB,eAELvzB,KAAKyvB,yBAELzvB,KAAK+vB,uBAEL/vB,KAAKouB,yBAELpuB,KAAKyuB,qBAELzuB,MAAK4tB,qBAEPyE,iBAAkB,WACZryB,KAAKwzB,WAGTxzB,KAAKwzB,UAAW,EAIhBxzB,KAAKyzB,kBAAkBzzB,KAAKkrB,WAI5BlrB,KAAKmvB,gBAAgB,cAErBnvB,KAAKizB,UAKPS,iBAAkB,WAChB1zB,KAAK2yB,kBAED3yB,KAAK2zB,UACP3zB,KAAK2zB,WAGH3zB,KAAK4zB,aACP5zB,KAAK4zB,cAMF5zB,KAAK6zB,kBACR7zB,KAAK6zB,iBAAkB,EACnB7zB,KAAK8zB,UACP9zB,KAAKusB,MAAM,cAIjBwH,iBAAkB,WACX/zB,KAAKg0B,gBACRh0B,KAAKsyB,iBAGHtyB,KAAKi0B,UACPj0B,KAAKi0B,WAGHj0B,KAAKk0B,UACPl0B,KAAKk0B,YAITC,oBAAqB,WACnBn0B,KAAK0zB,oBAGPU,iBAAkB,WAChBp0B,KAAK+zB,oBAGPM,wBAAyB,WACvBr0B,KAAK0zB,oBAGPY,qBAAsB,WACpBt0B,KAAK+zB,oBAGPN,kBAAmB,SAASztB,GACtBA,GAAKA,EAAEzF,UACTP,KAAKyzB,kBAAkBztB,EAAEklB,WACzBllB,EAAEuuB,iBAAiBzsB,KAAK9H,KAAMgG,EAAEzF,WAIpCg0B,iBAAkB,SAASC,GACzB,GAAIjM,GAAWvoB,KAAKy0B,cAAcD,EAClC,IAAIjM,EAAU,CACZ,GAAImM,GAAO10B,KAAK20B,mBAAmBpM,EACnCvoB,MAAKuzB,YAAYiB,EAAe3rB,MAAQ6rB,IAI5CD,cAAe,SAASD,GACtB,MAAOA,GAAen0B,cAAc,aAGtCs0B,mBAAoB,SAASpM,GAC3B,GAAIA,EAAU,CAEZ,GAAImM,GAAO10B,KAAKmE,mBAKZ0tB,EAAM7xB,KAAK0xB,iBAAiBnJ,EAMhC,OAJAmM,GAAK/vB,YAAYktB,GAEjB7xB,KAAK40B,gBAAgBF,EAAMnM,GAEpBmM,IAIXG,kBAAmB,SAAStM,EAAUuM,GACpC,GAAIvM,EAAU,CAKZvoB,KAAK+0B,gBAAkB/0B,IAKvB,IAAI6xB,GAAM7xB,KAAK0xB,iBAAiBnJ,EAUhC,OARIuM,GACF90B,KAAKg1B,aAAanD,EAAKiD,GAEvB90B,KAAK2E,YAAYktB,GAGnB7xB,KAAK40B,gBAAgB50B,MAEd6xB,IAGX+C,gBAAiB,SAASF,GAExB10B,KAAKi1B,sBAAsBP,GAE3Bt1B,gBAAgB8J,SAASwrB,IAG3BO,sBAAuB,SAASP,GAE9B,GAAIQ,GAAIl1B,KAAKk1B,EAAIl1B,KAAKk1B,KAEtB,IAAIR,EAEF,IAAK,GAAsBpyB,GADvB6oB,EAAKuJ,EAAKjnB,iBAAiB,QACtBjL,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAcsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IAChD0yB,EAAE5yB,EAAEqQ,IAAMrQ,GAIhB6yB,yBAA0B,SAAStsB,GAEpB,UAATA,GAA6B,UAATA,GACtB7I,KAAK2uB,oBAAoB9lB,EAAM7I,KAAK2Q,aAAa9H,IAE/C7I,KAAKo1B,kBACPp1B,KAAKo1B,iBAAiB5P,MAAMxlB,KAAMsc,YAGtC+Y,WAAY,SAASxyB,EAAMyyB,GACzB,GAAIppB,GAAW,GAAIM,kBAAiB,SAAS+B,GAC3C+mB,EAASxtB,KAAK9H,KAAMkM,EAAUqC,GAC9BrC,EAASqpB,cACTlyB,KAAKrD,MACPkM,GAASgB,QAAQrK,GAAOgK,WAAW,EAAMD,SAAS,KAYtDkmB,GAAY5rB,UAAY6rB,EACxBA,EAAKyC,YAAc1C,EAInBzzB,EAAMo2B,KAAO3C,EACbzzB,EAAMwzB,OAASA,EACfxzB,EAAM6pB,IAAIiD,SAAS4G,KAAOA,GAEzBhK,SC9OH,SAAU1pB,GA8ER,QAASkrB,GAAerjB,GACtB,MAAOA,GAAUgkB,UAGnB,QAASwK,GAAYC,EAASlzB,GAC5B,GAAIoG,GAAO,GAAI+sB,GAAK,CAChBnzB,KACFoG,EAAOpG,EAAKqrB,UACZ8H,EAAKnzB,EAAK8rB,aAAa,MAEzB,IAAI/qB,GAAWipB,SAASoJ,UAAUC,kBAAkBjtB,EAAM+sB,EAC1D,OAAOnJ,UAASoJ,UAAUH,YAAYC,EAASnyB,GArFjD,GAIIuyB,IAJM52B,OAAOuuB,aAIW,WACxBsI,EAAyB,aAEzBpyB,GACFmyB,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAI52B,GAAQW,KAAKk2B,gBACjB,IAAI72B,IAAUW,KAAKm2B,mBAAmB92B,EAAOW,KAAK8tB,WAAY,CAG5D,IADA,GAAIzC,GAAQd,EAAevqB,MAAO21B,EAAU,GACrCtK,GAASA,EAAM9qB,SACpBo1B,GAAWtK,EAAM9qB,QAAQ61B,gBAAgBJ,GACzC3K,EAAQd,EAAec,EAErBsK,IACF31B,KAAKq2B,oBAAoBV,EAASt2B,KAIxCi3B,kBAAmB,SAASvyB,EAAO8E,EAAMxJ,GACvC,GAAIA,GAAQA,GAASW,KAAKk2B,iBAAkBrtB,EAAOA,GAAQ,EAC3D,IAAIxJ,IAAUW,KAAKm2B,mBAAmB92B,EAAOW,KAAK8tB,UAAYjlB,GAAO,CACnE,GAAI8sB,GAAU,EACd,IAAI5xB,YAAiBqI,OACnB,IAAK,GAAyBrM,GAArByC,EAAE,EAAG4G,EAAErF,EAAM+B,OAAcsD,EAAF5G,IAASzC,EAAEgE,EAAMvB,IAAKA,IACtDmzB,GAAW51B,EAAE2E,YAAc,WAG7BixB,GAAU5xB,EAAMW,WAElB1E,MAAKq2B,oBAAoBV,EAASt2B,EAAOwJ,KAG7CwtB,oBAAqB,SAASV,EAASt2B,EAAOwJ,GAG5C,GAFAxJ,EAAQA,GAASW,KAAKk2B,iBACtBrtB,EAAOA,GAAQ,GACVxJ,EAAL,CAGIF,OAAO+E,oBACTyxB,EAAUD,EAAYC,EAASt2B,EAAMoD,MAEvC,IAAIsB,GAAQ/D,KAAKO,QAAQg2B,oBAAoBZ,EACzCK,EACJjN,SAAQyN,kBAAkBzyB,EAAO1E,GAEjCA,EAAMo3B,aAAaz2B,KAAK8tB,UAAYjlB,IAAQ,IAE9CqtB,eAAgB,SAASrzB,GAGvB,IADA,GAAIP,GAAIO,GAAQ7C,KACTsC,EAAElB,YACPkB,EAAIA,EAAElB,UAER,OAAOkB,IAET6zB,mBAAoB,SAAS92B,EAAOwJ,GAElC,MADAxJ,GAAMo3B,aAAep3B,EAAMo3B,iBACpBp3B,EAAMo3B,aAAa5tB,IAsB9BxJ,GAAM6pB,IAAIiD,SAASvoB,OAASA,GAE3BmlB,SChGH,SAAU1pB,GAUR,QAASkB,GAAQsI,EAAM3B,GACrB,GAAyB,IAArBoV,UAAUxW,QAAwC,gBAAjBwW,WAAU,GAAiB,CAC9DpV,EAAY2B,CACZ,IAAI6tB,GAASv1B,SAASw1B,cAGtB,IAFA9tB,EAAO6tB,GAAUA,EAAOt1B,YAAcs1B,EAAOt1B,WAAWuP,aACpD+lB,EAAOt1B,WAAWuP,aAAa,QAAU,IACxC9H,EACH,KAAM,sCAGV,GAAI+tB,EAAuB/tB,GACzB,KAAM,sDAAwDA,CAGhEguB,GAAkBhuB,EAAM3B,GAExB4vB,EAAgBjuB,GAKlB,QAASkuB,GAAoBluB,EAAMmuB,GACjCC,EAAcpuB,GAAQmuB,EAKxB,QAASF,GAAgBjuB,GACnBouB,EAAcpuB,KAChBouB,EAAcpuB,GAAMquB,0BACbD,GAAcpuB,IAgBzB,QAASguB,GAAkBhuB,EAAM3B,GAC/B,MAAOiwB,GAAiBtuB,GAAQ3B,MAGlC,QAAS0vB,GAAuB/tB,GAC9B,MAAOsuB,GAAiBtuB,GAzD1B,GAAIogB,GAAS5pB,EAAM4pB,OA+BfgO,GA9BM53B,EAAM6pB,QAiDZiO,IAYJ93B,GAAMu3B,uBAAyBA,EAC/Bv3B,EAAM03B,oBAAsBA,EAO5B53B,OAAO4pB,QAAUxoB,EAKjB0oB,EAAOF,QAAS1pB,EAOhB,IAAI+3B,GAAe3K,SAAS4K,qBAC5B,IAAID,EACF,IAAK,GAAgCh1B,GAA5BI,EAAE,EAAG4G,EAAEguB,EAAatxB,OAAcsD,EAAF5G,IAASJ,EAAEg1B,EAAa50B,IAAKA,IACpEjC,EAAQilB,MAAM,KAAMpjB,IAIvB2mB,SC7FH,SAAU1pB,GAEV,GAAIujB,IACF0U,oBAAqB,SAASz0B,GAC5B4pB,SAAS8K,YAAYC,WAAW30B,IAElC40B,kBAAmB,WAEjB,GAAIC,GAAY13B,KAAK2Q,aAAa,cAAgB,GAC9C+jB,EAAO,GAAIiD,KAAID,EAAW13B,KAAKozB,cAAcwE,QACjD53B,MAAKkH,UAAU2wB,YAAc,SAASC,EAAS/E,GAC7C,GAAIxwB,GAAI,GAAIo1B,KAAIG,EAAS/E,GAAQ2B,EACjC,OAAOnyB,GAAEw1B,OAMf14B,GAAM6pB,IAAIgD,YAAYtJ,KAAOA,GAE1BmG,SCpBH,SAAU1pB,GA0KR,QAAS24B,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIJ,KAAIM,EAAMtnB,aAAa,QAASunB,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASvB,GAAkBzyB,EAAO1E,GAChC,GAAI0E,EAAO,CACL1E,IAAU8B,WACZ9B,EAAQ8B,SAAS2C,MAEf3E,OAAO+E,oBACT7E,EAAQ8B,SAAS2C,KAOnB,IAAIoH,GAAQitB,EAAmBp0B,EAAMW,aACjC0zB,EAAOr0B,EAAM4M,aAAaolB,EAC1BqC,IACFltB,EAAMsjB,aAAauH,EAAuBqC,EAI5C,IAAItD,GAAUz1B,EAAMg5B,iBACpB,IAAIh5B,IAAU8B,SAAS2C,KAAM,CAC3B,GAAIN,GAAW,SAAWuyB,EAAwB,IAC9CuC,EAAKn3B,SAAS2C,KAAK2J,iBAAiBjK,EACpC80B,GAAGxyB,SACLgvB,EAAUwD,EAAGA,EAAGxyB,OAAO,GAAGyyB,oBAG9Bl5B,EAAM21B,aAAa9pB,EAAO4pB,IAI9B,QAASqD,GAAmBxC,EAASt2B,GACnCA,EAAQA,GAAS8B,SACjB9B,EAAQA,EAAMoF,cAAgBpF,EAAQA,EAAM+zB,aAC5C,IAAIrvB,GAAQ1E,EAAMoF,cAAc,QAEhC,OADAV,GAAMW,YAAcixB,EACb5xB,EAGT,QAASy0B,GAAiBP,GACxB,MAAQA,IAASA,EAAMQ,YAAe,GAGxC,QAASC,GAAgB71B,EAAM81B,GAC7B,MAAIC,GACKA,EAAQ9wB,KAAKjF,EAAM81B,GAD5B,OAxNF,GACIzP,IADM/pB,OAAOuuB,aACPruB,EAAM6pB,IAAIiD,SAASvoB,QACzBmyB,EAAwB7M,EAAI6M,sBAI5B8C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEbr1B,GAEFs1B,WAAY,SAAStxB,GACnB,GAAI2gB,GAAWvoB,KAAKy0B,gBAChB0E,EAAU5Q,GAAYvoB,KAAKo5B,iBAC/B,IAAID,EAAS,CACXn5B,KAAKq5B,sBAAsBF,EAC3B,IAAIv1B,GAAS5D,KAAKs5B,mBAAmBH,EACrC,IAAIv1B,EAAOkC,OAAQ,CACjB,GAAIyzB,GAAchR,EAAS6K,cAAcwE,OACzC,OAAOnL,UAAS+M,cAAcN,WAAWt1B,EAAQ21B,EAAa3xB,IAG9DA,GACFA,KAGJyxB,sBAAuB,SAAS3E,GAE9B,IAAK,GAAsB30B,GAAG+jB,EAD1BwU,EAAK5D,EAAKjnB,iBAAiBsrB,GACtBv2B,EAAE,EAAG4G,EAAEkvB,EAAGxyB,OAAiBsD,EAAF5G,IAASzC,EAAEu4B,EAAG91B,IAAKA,IACnDshB,EAAIqU,EAAmBH,EAAmBj4B,EAAGC,KAAKozB,cAAcwE,SAC5D53B,KAAKozB,eACTpzB,KAAKy5B,oBAAoB3V,EAAG/jB,GAC5BA,EAAEqB,WAAWs4B,aAAa5V,EAAG/jB,IAGjC05B,oBAAqB,SAAS11B,EAAO41B,GACnC,IAAK,GAA0C73B,GAAtCU,EAAE,EAAG6rB,EAAGsL,EAAK7sB,WAAY1D,EAAEilB,EAAGvoB,QAAYhE,EAAEusB,EAAG7rB,KAAS4G,EAAF5G,EAAKA,IACnD,QAAXV,EAAE+G,MAA6B,SAAX/G,EAAE+G,MACxB9E,EAAMyqB,aAAa1sB,EAAE+G,KAAM/G,EAAEuS,QAInCilB,mBAAoB,SAAS5E,GAC3B,GAAIkF,KACJ,IAAIlF,EAEF,IAAK,GAAsB30B,GADvBu4B,EAAK5D,EAAKjnB,iBAAiBorB,GACtBr2B,EAAE,EAAG4G,EAAEkvB,EAAGxyB,OAAcsD,EAAF5G,IAASzC,EAAEu4B,EAAG91B,IAAKA,IAC5CzC,EAAE2E,YAAYmY,MAAMic,IACtBc,EAAUn5B,KAAKV,EAIrB,OAAO65B,IAOTC,cAAe,WACb75B,KAAK85B,cACL95B,KAAK+5B,cACL/5B,KAAKg6B,qBACLh6B,KAAKi6B,uBAKPH,YAAa,WACX95B,KAAKk6B,OAASl6B,KAAKm6B,UAAUpB,GAC7B/4B,KAAKk6B,OAAO91B,QAAQ,SAASrE,GACvBA,EAAEqB,YACJrB,EAAEqB,WAAWg5B,YAAYr6B,MAI/Bg6B,YAAa,WACX/5B,KAAK4D,OAAS5D,KAAKm6B,UAAUtB,EAAiB,IAAMI,EAAa,KACjEj5B,KAAK4D,OAAOQ,QAAQ,SAASrE,GACvBA,EAAEqB,YACJrB,EAAEqB,WAAWg5B,YAAYr6B,MAa/Bi6B,mBAAoB,WAClB,GAAIE,GAASl6B,KAAKk6B,OAAO3tB,OAAO,SAASxM,GACvC,OAAQA,EAAEwuB,aAAa0K,KAErBE,EAAUn5B,KAAKo5B,iBACnB,IAAID,EAAS,CACX,GAAIxD,GAAU,EAId,IAHAuE,EAAO91B,QAAQ,SAAS6zB,GACtBtC,GAAW6C,EAAiBP,GAAS,OAEnCtC,EAAS,CACX,GAAI5xB,GAAQo0B,EAAmBxC,EAAS31B,KAAKozB,cAC7C+F,GAAQnE,aAAajxB,EAAOo1B,EAAQkB,eAI1CF,UAAW,SAAS32B,EAAU82B,GAC5B,GAAIC,GAAQv6B,KAAKyN,iBAAiBjK,GAAUg3B,QACxCrB,EAAUn5B,KAAKo5B,iBACnB,IAAID,EAAS,CACX,GAAIsB,GAAgBtB,EAAQ1rB,iBAAiBjK,GAAUg3B,OACvDD,GAAQA,EAAMvsB,OAAOysB,GAEvB,MAAOH,GAAUC,EAAMhuB,OAAO+tB,GAAWC,GAW3CN,oBAAqB,WACnB,GAAIl2B,GAAQ/D,KAAK06B,cAAc1B,EAC/BxC,GAAkBzyB,EAAO5C,SAAS2C,OAEpCsyB,gBAAiB,SAASuE,GACxB,GAAIhF,GAAU,GAEVnyB,EAAW,IAAMy1B,EAAa,IAAM0B,EAAkB,IACtDL,EAAU,SAASv6B,GACrB,MAAO24B,GAAgB34B,EAAGyD,IAExB02B,EAASl6B,KAAKk6B,OAAO3tB,OAAO+tB,EAChCJ,GAAO91B,QAAQ,SAAS6zB,GACtBtC,GAAW6C,EAAiBP,GAAS,QAGvC,IAAIr0B,GAAS5D,KAAK4D,OAAO2I,OAAO+tB,EAIhC,OAHA12B,GAAOQ,QAAQ,SAASL,GACtB4xB,GAAW5xB,EAAMW,YAAc,SAE1BixB,GAET+E,cAAe,SAASC,GACtB,GAAIhF,GAAU31B,KAAKo2B,gBAAgBuE,EACnC,OAAO36B,MAAKu2B,oBAAoBZ,EAASgF,IAE3CpE,oBAAqB,SAASZ,EAASgF,GACrC,GAAIhF,EAAS,CACX,GAAI5xB,GAAQo0B,EAAmBxC,EAG/B,OAFA5xB,GAAMyqB,aAAauH,EAAuB/1B,KAAK2Q,aAAa,QACxD,IAAMgqB,GACH52B,KA2DTiC,EAAIokB,YAAYljB,UAChB0xB,EAAU5yB,EAAE4yB,SAAW5yB,EAAE0yB,iBAAmB1yB,EAAE40B,uBAC3C50B,EAAE60B,kBAITx7B,GAAM6pB,IAAIgD,YAAYtoB,OAASA,EAC/BvE,EAAMm3B,kBAAoBA,GAEzBzN,SCzOH,SAAU1pB,GAIR,GACI6pB,IADM/pB,OAAOuuB,aACPruB,EAAM6pB,IAAIiD,SAASnjB,QACzB2kB,EAAezE,EAAIyE,aAGnBmN,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACA12B,QAAQ,SAASgB,GACjB01B,EAAoB11B,EAAE2e,eAAiB3e,GAGzC,IAAI4D,IACF+xB,gBAAiB,WAEf,GAAIC,GAAYh7B,KAAKkH,UAAU2mB,cAE/B7tB,MAAKi7B,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAASl5B,GAALU,EAAE,EAAMV,EAAE9B,KAAK8M,WAAWtK,GAAIA,IAEjCxC,KAAKk7B,eAAep5B,EAAE+G,QAExBmyB,EAAUh7B,KAAKm7B,kBAAkBr5B,EAAE+G,OAAS/G,EAAEuS,MAAMmI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI4e,SAK7BF,eAAgB,SAAU54B,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD64B,kBAAmB,SAAS74B,GAC1B,MAAOA,GAAEgK,MAAM+uB,IAEjBC,eAAgB,SAASz4B,GACvB,KAAOA,EAAKzB,YAAY,CACtB,GAAIyB,EAAKkyB,gBACP,MAAOlyB,GAAKkyB,eAEdlyB,GAAOA,EAAKzB,WAEd,MAAOyB,GAAKJ,MAEdurB,gBAAiB,SAASuN,EAAYj8B,EAAQ8rB,GAC5C,GAAIpiB,GAAShJ,IACb,OAAO,UAASoF,GACTm2B,GAAeA,EAAWzI,cAC7ByI,EAAavyB,EAAOsyB,eAAeh8B,GAGrC,IAAI+c,IAAQjX,EAAGA,EAAE2N,OAAQ3N,EAAEyO,cAC3B0nB,GAAWtN,eAAesN,EAAYnQ,EAAQ/O,KAGlDmf,oBAAqB,SAASnX,EAAYxb,GACxC,GAAK7I,KAAKk7B,eAAeryB,GAAzB,CAGA,GAAI4yB,GAAYz7B,KAAKm7B,kBAAkBtyB,EACvC4yB,GAAYX,EAAoBW,IAAcA,CAE9C,IAAIzyB,GAAShJ,IAEb,OAAO,UAASgiB,EAAOnf,EAAMof,GAW3B,QAASyZ,KACP,MAAO,MAAQrX,EAAa,MAX9B,GAAIsX,GAAU3yB,EAAOglB,gBAAgBjd,OAAWlO,EAAMwhB,EAGtD,OAFAxhB,GAAK2H,iBAAiBixB,EAAWE,GAE7B1Z,EAAJ,QAYEiF,KAAMwU,EACNvU,eAAgBuU,EAChBrU,MAAO,WACLxkB,EAAK6H,oBAAoB+wB,EAAWE,SAO1CN,EAAe1N,EAAa7nB,MAGhCzG,GAAM6pB,IAAIgD,YAAYljB,OAASA,GAE9B+f,SC1GH,SAAU1pB,GAIR,GAAIse,IACFie,eAAgB,SAAS10B,GAEvB,GAAiCoX,GAA7BpR,EAAUhG,EAAUgG,OACxB,KAAK,GAAI5K,KAAK4E,GACQ,YAAhB5E,EAAEgK,MAAM,MACLY,IACHA,EAAYhG,EAAUgG,YAExBoR,EAAWhc,EAAEgK,MAAM,EAAG,IACtBY,EAAQoR,GAAYpR,EAAQoR,IAAahc,IAI/Cu5B,iBAAkB,SAAS30B,GAEzB,GAAIyoB,GAAIzoB,EAAUgG,OAClB,IAAIyiB,EAAG,CACL,GAAImM,KACJ,KAAK,GAAIx5B,KAAKqtB,GAEZ,IAAK,GAASoM,GADVC,EAAQ15B,EAAE25B,MAAM,KACXz5B,EAAE,EAAOu5B,EAAGC,EAAMx5B,GAAIA,IAC7Bs5B,EAASC,GAAMpM,EAAErtB,EAGrB4E,GAAUgG,QAAU4uB,IAGxBI,qBAAsB,SAASh1B,GAC7B,GAAIA,EAAUgG,QAAS,CAErB,GAAIpL,GAAIoF,EAAUwoB,gBAClB,KAAK,GAAIptB,KAAK4E,GAAUgG,QAEtB,IAAK,GAAS6uB,GADVC,EAAQ15B,EAAE25B,MAAM,KACXz5B,EAAE,EAAOu5B,EAAGC,EAAMx5B,GAAIA,IAC7BV,EAAErB,KAAKs7B,GAIb,GAAI70B,EAAUklB,QAAS,CAErB,GAAItqB,GAAIoF,EAAUi1B,gBAClB,KAAK,GAAI75B,KAAK4E,GAAUklB,QACtBtqB,EAAErB,KAAK6B,KAIb85B,kBAAmB,SAASl1B,EAAW6rB,GAErC,GAAI3G,GAAUllB,EAAUklB,OACpBA,KAEFpsB,KAAKq8B,kBAAkBjQ,EAASllB,EAAW6rB,GAE3C7rB,EAAUwnB,WAAa1uB,KAAKs8B,aAAalQ,KAS7CiQ,kBAAmB,SAASE,EAAqBr1B,GAE/CA,EAAUwpB,QAAUxpB,EAAUwpB,WAG9B,KAAK,GAAIpuB,KAAKi6B,GAAqB,CACjC,GAAIC,GAAqBD,EAAoBj6B,GACzCm6B,EAAWz8B,KAAK08B,yBAAyBF,EAChBzrB,UAAzB7J,EAAUwpB,QAAQpuB,IAAiCyO,SAAb0rB,IACxCv1B,EAAUwpB,QAAQpuB,GAAKm6B,GAEJ1rB,SAAjB7J,EAAU5E,KACZ4E,EAAU5E,GAAKtC,KAAK28B,mBAAmBH,MAI7CG,mBAAoB,SAASH,GAC3B,GAAInoB,GAAsC,gBAAvBmoB,IACfA,EAAqBA,EAAmBnoB,MAAQmoB,CACpD,OAAiBzrB,UAAVsD,EAAsBA,EAAQ,MAGvCqoB,yBAA0B,SAASF,GACjC,MAAkC,gBAAvBA,IACPA,GAAqDzrB,SAA/ByrB,EAAmB9L,QACpC8L,EAAmB9L,QAF5B,QAKF4L,aAAc,SAAS3e,GACrB,GAAIpZ,KACJ,KAAK,GAAIjC,KAAKqb,GACZpZ,EAAIjC,EAAEyhB,eAAiBzhB,CAEzB,OAAOiC,IAETq4B,wBAAyB,SAAS11B,GAChC,GAAIikB,GAAKjkB,EAAUi1B,aACnB,IAAIhR,GAAMA,EAAGrlB,OACX,IAAK,GAAsBxD,GAAlBE,EAAE,EAAG4G,EAAE+hB,EAAGrlB,OAAkBsD,EAAF5G,IAASF,EAAE6oB,EAAG3oB,IAAKA,IACpD8sB,SAASuN,gCAAgC31B,EAAW5E,IAQ5DjD,GAAM6pB,IAAIgD,YAAYvO,WAAaA,GAElCoL,SCrHH,SAAU1pB,GAIR,GAAIy9B,GAAuB,aACvBC,EAAmB,OAInBjwB,GAEFkwB,yBAA0B,SAAS91B,GAEjClH,KAAKi9B,cAAc/1B,EAAW,aAE9BlH,KAAKi9B,cAAc/1B,EAAW,wBAGhCg2B,kBAAmB,SAASh2B,EAAW6rB,GAErC,GAAIjmB,GAAa9M,KAAK2Q,aAAamsB,EACnC,IAAIhwB,EAMF,IAAK,GAAyBxK,GAJ1B8pB,EAAUllB,EAAUklB,UAAYllB,EAAUklB,YAE1C4P,EAAQlvB,EAAWmvB,MAAMc,GAEpBv6B,EAAE,EAAG4G,EAAE4yB,EAAMl2B,OAAasD,EAAF5G,EAAKA,IAEpCF,EAAI05B,EAAMx5B,GAAG44B,OAET94B,GAAoByO,SAAfqb,EAAQ9pB,IAAgCyO,SAAZgiB,EAAKzwB,KAGxC8pB,EAAQ9pB,GAAKymB,QAAQwE,MAO7B4P,6BAA8B,WAK5B,IAAK,GAAsBr7B,GAHvBs7B,EAAWp9B,KAAKkH,UAAUonB,oBAE1BD,EAAKruB,KAAK8M,WACLtK,EAAE,EAAG4G,EAAEilB,EAAGvoB,OAAcsD,EAAF5G,IAASV,EAAEusB,EAAG7rB,IAAKA,IAC5CxC,KAAKq9B,oBAAoBv7B,EAAE+G,QAC7Bu0B,EAASt7B,EAAE+G,MAAQ/G,EAAEuS,QAK3BgpB,oBAAqB,SAASx0B,GAC5B,OAAQ7I,KAAKs9B,UAAUz0B,IAA6B,QAApBA,EAAKyD,MAAM,EAAE,IAI/CgxB,WACEz0B,KAAM,EACN00B,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrB5wB,GAAWwwB,UAAUR,GAAwB,EAI7Cz9B,EAAM6pB,IAAIgD,YAAYpf,WAAaA,GAElCic,SC3EH,SAAU1pB,GAGR,GAAI2J,GAAS3J,EAAM6pB,IAAIgD,YAAYljB,OAE/B2oB,EAAS,GAAInN,oBACbhD,EAAiBmQ,EAAOnQ,cAI5BmQ,GAAOnQ,eAAiB,SAAS6C,EAAYxb,EAAMhG,GACjD,MAAOmG,GAAOwyB,oBAAoBnX,EAAYxb,EAAMhG,IAC7C2e,EAAe1Z,KAAK6pB,EAAQtN,EAAYxb,EAAMhG,GAIvD,IAAI4uB,IACFE,OAAQA,EACR8C,cAAe,WACb,MAAOz0B,MAAKK,cAAc,aAE5B+4B,gBAAiB,WACf,GAAI7Q,GAAWvoB,KAAKy0B,eACpB,OAAOlM,IAAYkE,SAAS2M,gBAAgB7Q,IAE9CoV,uBAAwB,SAASpV,GAC3BA,IACFA,EAASqJ,gBAAkB5xB,KAAK2xB,SAMtCtyB,GAAM6pB,IAAIgD,YAAYuF,IAAMA,GAE3B1I,SCnCH,SAAU1pB,GAoOR,QAASu+B,GAAyB12B,GAChC,IAAKxB,OAAOwlB,UAAW,CACrB,GAAI2S,GAAWn4B,OAAO6kB,eAAerjB,EACrCA,GAAUgkB,UAAY2S,EAClBhL,EAAOgL,KACTA,EAAS3S,UAAYxlB,OAAO6kB,eAAesT,KArOjD,GAAI3U,GAAM7pB,EAAM6pB,IACZ2J,EAASxzB,EAAMwzB,OACf5J,EAAS5pB,EAAM4pB,OAIf/hB,GAEFgC,SAAU,SAASL,EAAMi1B,GAEvB99B,KAAK+9B,eAAel1B,EAAMi1B,GAE1B99B,KAAK62B,kBAAkBhuB,EAAMi1B,GAE7B99B,KAAKg+B,sBAGPD,eAAgB,SAASl1B,EAAMi1B,GAE7B,GAAIG,GAAY5+B,EAAMu3B,uBAAuB/tB,GAEzCkqB,EAAO/yB,KAAKk+B,sBAAsBJ,EAEtC99B,MAAKm+B,sBAAsBF,EAAWlL,GAEtC/yB,KAAKkH,UAAYlH,KAAKo+B,gBAAgBH,EAAWlL,GAEjD/yB,KAAKq+B,qBAAqBx1B,EAAMi1B,IAGlCK,sBAAuB,SAASj3B,EAAW6rB,GAGzC7rB,EAAU3G,QAAUP,KAEpBA,KAAKk9B,kBAAkBh2B,EAAW6rB,GAElC/yB,KAAKo8B,kBAAkBl1B,EAAW6rB,GAElC/yB,KAAK47B,eAAe10B,GAEpBlH,KAAK67B,iBAAiB30B,IAGxBk3B,gBAAiB,SAASl3B,EAAW6rB,GAEnC/yB,KAAKs+B,gBAAgBp3B,EAAW6rB,EAEhC,IAAIwL,GAAUv+B,KAAKw+B,YAAYt3B,EAAW6rB,EAG1C,OADA6K,GAAyBW,GAClBA,GAGTD,gBAAiB,SAASp3B,EAAW6rB,GAEnC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,UAAW/1B,EAAW6rB,GAEzC/yB,KAAKi9B,cAAc,aAAc/1B,EAAW6rB,GAE5C/yB,KAAKi9B,cAAc,sBAAuB/1B,EAAW6rB,GAErD/yB,KAAKi9B,cAAc,iBAAkB/1B,EAAW6rB,IAIlDsL,qBAAsB,SAASx1B,EAAM41B,GAEnCz+B,KAAKk8B,qBAAqBl8B,KAAKkH,WAC/BlH,KAAK48B,wBAAwB58B,KAAKkH,WAElClH,KAAK29B,uBAAuB39B,KAAKy0B,iBAEjCz0B,KAAK65B,gBAEL75B,KAAKs3B,oBAAoBt3B,MAEzBA,KAAKm9B,+BAELn9B,KAAK+6B,kBAKL/6B,KAAKy3B,oBAEDt4B,OAAO+E,mBACTuoB,SAASoJ,UAAU6I,YAAY1+B,KAAKo5B,kBAAmBvwB,EAAM41B,GAG3Dz+B,KAAKkH,UAAUy3B,kBACjB3+B,KAAKkH,UAAUy3B,iBAAiB3+B,OAMpCg+B,mBAAoB,WAClB,GAAIY,GAAS5+B,KAAK2Q,aAAa,cAC3BiuB,KACFz/B,OAAOy/B,GAAU5+B,KAAK6+B,OAK1BX,sBAAuB,SAASY,GAC9B,GAAI53B,GAAYlH,KAAK++B,kBAAkBD,EACvC,KAAK53B,EAAW,CAEd,GAAIA,GAAYkjB,YAAYE,mBAAmBwU,EAE/C53B,GAAYlH,KAAKg/B,cAAc93B,GAE/B+3B,EAAcH,GAAU53B,EAE1B,MAAOA,IAGT63B,kBAAmB,SAASl2B,GAC1B,MAAOo2B,GAAcp2B,IAIvBm2B,cAAe,SAAS93B,GACtB,GAAIA,EAAU4rB,YACZ,MAAO5rB,EAET,IAAIg4B,GAAWx5B,OAAOC,OAAOuB,EAkB7B,OAfAgiB,GAAIkD,QAAQlD,EAAIiD,SAAU+S,GAa1Bl/B,KAAKm/B,YAAYD,EAAUh4B,EAAWgiB,EAAIiD,SAASsF,IAAK,QAEjDyN,GAGTC,YAAa,SAASD,EAAUh4B,EAAWgiB,EAAKrgB,GAC9C,GAAI+hB,GAAS,SAASvO,GACpB,MAAOnV,GAAU2B,GAAM2c,MAAMxlB,KAAMqc,GAErC6iB,GAASr2B,GAAQ,WAEf,MADA7I,MAAKmyB,WAAavH,EACX1B,EAAIrgB,GAAM2c,MAAMxlB,KAAMsc,aAKjC2gB,cAAe,SAASp0B,EAAM3B,EAAW6rB,GAEvC,GAAIjqB,GAAS5B,EAAU2B,MAEvB3B,GAAU2B,GAAQ7I,KAAKw+B,YAAY11B,EAAQiqB,EAAKlqB,KAIlDguB,kBAAmB,SAAShuB,EAAM41B,GAChC,GAAIW,IACFl4B,UAAWlH,KAAKkH,WAGdm4B,EAAgBr/B,KAAKs/B,kBAAkBb,EACvCY,KACFD,EAAK7B,QAAU8B,GAGjBjV,YAAYlhB,SAASL,EAAM7I,KAAKkH,WAEhClH,KAAK6+B,KAAO19B,SAASo+B,gBAAgB12B,EAAMu2B,IAG7CE,kBAAmB,SAASz2B,GAC1B,GAAIA,GAAQA,EAAKvB,QAAQ,KAAO,EAC9B,MAAOuB,EAEP,IAAI7C,GAAIhG,KAAK++B,kBAAkBl2B,EAC/B,OAAI7C,GAAEzF,QACGP,KAAKs/B,kBAAkBt5B,EAAEzF,QAAQg9B,SAD1C,SASF0B,IAIF/3B,GAAUs3B,YADR94B,OAAOwlB,UACe,SAASpI,EAAQ0c,GAIvC,MAHI1c,IAAU0c,GAAa1c,IAAW0c,IACpC1c,EAAOoI,UAAYsU,GAEd1c,GAGe,SAASA,EAAQ0c,GACvC,GAAI1c,GAAU0c,GAAa1c,IAAW0c,EAAW,CAC/C,GAAIjB,GAAU74B,OAAOC,OAAO65B,EAC5B1c,GAASmG,EAAOsV,EAASzb,GAE3B,MAAOA,IAoBXoG,EAAIgD,YAAYhlB,UAAYA,GAE3B6hB,SClPH,SAAU1pB,GAoIR,QAASogC,GAAgBl/B,GACvB,MAAOY,UAASa,SAASzB,GAAWm/B,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAY75B,OAAS65B,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiBj4B,GACxBk4B,EAAMC,aAAc,EACpBC,eAAe/M,OAAQ,EACvBgN,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiBv4B,GACvBk4B,EAAMC,aAAc,EACpBD,EAAMM,UAjIV,GAAIN,IAEFrW,KAAM,SAASlpB,EAAS6/B,EAAOxW,GAC7B,GAAIyW,GAAuC,KAA1BrgC,KAAKsH,QAAQ/G,IACM,KAAhC+/B,EAAWh5B,QAAQ/G,EAMvB,OALI8/B,KACFrgC,KAAK0L,IAAInL,GACTA,EAAQggC,QAAUH,EAClB7/B,EAAQigC,KAAO5W,GAEiB,IAA1B5pB,KAAKsH,QAAQ/G,IAEvBmL,IAAK,SAASnL,GAEZk/B,EAAgBl/B,GAASE,KAAKF,IAEhC+G,QAAS,SAAS/G,GAChB,GAAIiC,GAAIi9B,EAAgBl/B,GAAS+G,QAAQ/G,EAKzC,OAJIiC,IAAK,GAAKrB,SAASa,SAASzB,KAC9BiC,GAAMy9B,YAAYQ,WAAaR,YAAYhN,MACzC0M,EAAY75B,OAAS,KAElBtD,GAGTonB,GAAI,SAASrpB,GACX,GAAImgC,GAAU1gC,KAAK2L,OAAOpL,EACtBmgC,KACF1gC,KAAK2gC,gBAAgBD,GACrB1gC,KAAKogC,UAGTz0B,OAAQ,SAASpL,GACf,GAAIiC,GAAIxC,KAAKsH,QAAQ/G,EACrB,IAAU,IAANiC,EAIJ,MAAOi9B,GAAgBl/B,GAASqgC,SAElCR,MAAO,WAEL,GAAI7/B,GAAUP,KAAK6gC,aAInB,OAHItgC,IACFA,EAAQggC,QAAQz4B,KAAKvH,GAEnBP,KAAK8gC,YACP9gC,KAAKizB,SACE,GAFT,QAKF4N,YAAa,WACX,MAAOjB,MAETkB,SAAU,WACR,OAAQ9gC,KAAK+/B,aAAe//B,KAAK+gC,WAEnCA,QAAS,WACP,OAAQpB,EAAY75B,SAAW45B,EAAU55B,QAE3C66B,gBAAiB,SAASpgC,GACxB+/B,EAAW7/B,KAAKF,IAElBmsB,MAAO,WAEL,IADA,GAAInsB,GACG+/B,EAAWx6B,QAChBvF,EAAU+/B,EAAWM,QACrBrgC,EAAQigC,KAAK14B,KAAKvH,GAClBA,EAAQggC,QAAUhgC,EAAQigC,KAAO,MAGrCvN,MAAO,WACLjzB,KAAK0sB,QAODsT,eAAe/M,SAAU,IAC3B+M,eAAegB,oBAAoB7/B,UACnC6+B,eAAe/M,OAAQ,GAEzBxG,SAASC,QACTnhB,sBAAsBvL,KAAKihC,sBAE7Bd,iBAAkB,SAASv4B,GACrBA,GACFs5B,EAAezgC,KAAKmH,IAGxBq5B,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAIl3B,GACGk3B,EAAep7B,SACpBkE,EAAKk3B,EAAeN,YAK1Bb,aAAa,GAGXO,KAEAX,KACAD,KACAwB,IAYJ//B,UAASqJ,iBAAiB,qBAAsB,WAC9Cw1B,eAAe/M,OAAQ,IAczB5zB,EAAMygC,MAAQA,EACdzgC,EAAMwgC,iBAAmBA,GACxB9W,SC/JH,SAAU1pB,GAIR,QAAS8hC,GAAeC,EAAmBx5B,GACrCw5B,GACFjgC,SAAS2C,KAAKa,YAAYy8B,GAC1BvB,EAAiBj4B,IACRA,GACTA,IAIJ,QAASy5B,GAAWC,EAAM15B,GACxB,GAAI05B,GAAQA,EAAKx7B,OAAQ,CAErB,IAAK,GAAwBy7B,GAAK5H,EAD9B6H,EAAOrgC,SAASsgC,yBACXj/B,EAAE,EAAG4G,EAAEk4B,EAAKx7B,OAAsBsD,EAAF5G,IAAS++B,EAAID,EAAK9+B,IAAKA,IAC9Dm3B,EAAOx4B,SAASsD,cAAc,QAC9Bk1B,EAAK+H,IAAM,SACX/H,EAAK5B,KAAOwJ,EACZC,EAAK78B,YAAYg1B,EAEnBwH,GAAeK,EAAM55B,OACdA,IACTA,IAtBJ,GAAIi4B,GAAmBxgC,EAAMwgC,gBA2B7BxgC,GAAMsiC,OAASN,EACfhiC,EAAM8hC,eAAiBA,GAEtBpY,SChCH,SAAU1pB,GAuHR,QAASuiC,GAAa/4B,GACpB,MAAOjJ,SAAQwqB,YAAYE,mBAAmBzhB,IAGhD,QAASg5B,GAAYh5B,GACnB,MAAQA,IAAQA,EAAKvB,QAAQ,MAAQ,EAxHvC,GAAI2hB,GAAS5pB,EAAM4pB,OACfC,EAAM7pB,EAAM6pB,IACZ4W,EAAQzgC,EAAMygC,MACdD,EAAmBxgC,EAAMwgC,iBACzBjJ,EAAyBv3B,EAAMu3B,uBAC/BG,EAAsB13B,EAAM03B,oBAI5B7vB,EAAY+hB,EAAOvjB,OAAOC,OAAOykB,YAAYljB,YAE/CgsB,gBAAiB,WACXlzB,KAAK2Q,aAAa,SACpB3Q,KAAK8hC,QAITA,KAAM,WAEJ9hC,KAAK6I,KAAO7I,KAAK2Q,aAAa,QAC9B3Q,KAAKu9B,QAAUv9B,KAAK2Q,aAAa,WAEjC3Q,KAAK+hC,gBAEL/hC,KAAKk3B,qBAGPA,kBAAmB,WACdl3B,KAAKgiC,YACJhiC,KAAK+2B,oBAAoB/2B,KAAK6I,OAC9B7I,KAAKiiC,mBACLjiC,KAAKkiC,uBAKTpC,EAAMlW,GAAG5pB,OAKXmiC,UAAW,WAILN,EAAY7hC,KAAKu9B,WAAaqE,EAAa5hC,KAAKu9B,UAClD1uB,QAAQC,KAAK,sGACuC9O,KAAK6I,KACrD7I,KAAKu9B,SAEXv9B,KAAKkJ,SAASlJ,KAAK6I,KAAM7I,KAAKu9B,SAC9Bv9B,KAAKgiC,YAAa,GAIpBjL,oBAAqB,SAASluB,GAC5B,MAAK+tB,GAAuB/tB,GAA5B,QAEEkuB,EAAoBluB,EAAM7I,MAE1BA,KAAKoiC,eAAev5B,IAEb,IAIXu5B,eAAgB,SAASv5B,GAEvB,GAAI7I,KAAKuuB,aAAa,cAAgBvuB,KAAKw9B,SAQzC,GAPAx9B,KAAKw9B,UAAW,EAOZr+B,OAAO6gC,iBAAmBA,eAAeS,UAC3C1X,QAAQlgB,OACH,CACL,GAAI6tB,GAASv1B,SAASsD,cAAc,SACpCiyB,GAAOhyB,YAAc,YAAemE,EAAO,MAC3C7I,KAAK2E,YAAY+xB,KAKvBwL,oBAAqB,WACnB,MAAOliC,MAAKqiC,iBAMdJ,gBAAiB,WACf,MAAOnC,GAAMrW,KAAKzpB,KAAMA,KAAKk3B,kBAAmBl3B,KAAKmiC,YAGvDJ,cAAe,WACb/hC,KAAKqiC,iBAAkB,EACvBriC,KAAKk5B,WAAW,WACdl5B,KAAKqiC,iBAAkB,EACvBriC,KAAKk3B,qBACL7zB,KAAKrD,SASXkpB,GAAIkD,QAAQlD,EAAIgD,YAAahlB,GAc7B24B,EAAiB,WACf1+B,SAASmhC,KAAKnT,gBAAgB,cAC9BhuB,SAAS2J,cACP,GAAIiiB,aAAY,iBAAkBxnB,SAAS,OAM/CpE,SAASo+B,gBAAgB,mBAAoBr4B,UAAWA,KAEvD6hB,SC/GH,WAEE,GAAIxoB,GAAUY,SAASsD,cAAc,kBACrClE,GAAQiuB,aAAa,OAAQ,gBAC7BjuB,EAAQiuB,aAAa,UAAW,YAChCjuB,EAAQuhC,OAER/Y,QAAQ,gBAENmK,gBAAiB,WACflzB,KAAK2xB,OAAS3xB,KAAK4xB,gBAAkB5xB,KAAKuiC,aAG1CxZ,QAAQ8W,iBAAiB,WACvB7/B,KAAKgiB,MAAQhiB,KACbA,KAAKwuB,aAAa,OAAQ,IAG1BxuB,KAAKusB,MAAM,WAITvsB,KAAKi1B,sBAAsBj1B,KAAKoB,YAGhCpB,KAAK4sB,KAAK,qBAEZvpB,KAAKrD,QAGTuiC,WAAY,WACV,GAAIv5B,GAAStD,OAAOC,OAAOojB,QAAQG,IAAIgD,YAAYljB,QAC/CsK,EAAOtT,IACXgJ,GAAOsyB,eAAiB,WAAa,MAAOhoB,GAAK0O,MAEjD,IAAI2P,GAAS,GAAInN,oBACbhD,EAAiBmQ,EAAOnQ,cAK5B,OAJAmQ,GAAOnQ,eAAiB,SAAS6C,EAAYxb,EAAMhG,GACjD,MAAOmG,GAAOwyB,oBAAoBnX,EAAYxb,EAAMhG,IAC7C2e,EAAe1Z,KAAK6pB,EAAQtN,EAAYxb,EAAMhG,IAEhD8uB","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 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      if (inRoot) {\n        var t = inRoot.elementFromPoint(x, y);\n        var st, sr, os;\n        // is element a shadow host?\n        sr = this.targetingShadow(t);\n        while (sr) {\n          // find the the element inside the shadow root\n          st = sr.elementFromPoint(x, y);\n          if (!st) {\n            // check for older shadows\n            sr = this.olderShadow(sr);\n          } else {\n            // shadowed element may contain a shadow root\n            var ssr = this.targetingShadow(st);\n            return this.searchRoot(ssr, x, y) || st;\n          }\n        }\n        // light dom element is the target\n        return 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      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    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 = this.walk(a, 1);\n        b = this.walk(b, 1);\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 'body /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  ];\n  var styles = '';\n  // only install stylesheet if the browser has touch action support\n  var head = document.head;\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      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  ];\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 wrap = window.ShadowDOMPolyfill && ShadowDOMPolyfill.wrapIfNeeded || function(e){ return e; };\n\n  var eventFactory = scope.eventFactory;\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    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    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      this.gestures.push(source);\n    },\n    register: function(element) {\n      // NOTE: Work around for #4, don't add listeners to individual Polymer elmenets in SD Polyfill\n      if (window.ShadowDOMPolyfill && element !== document) {\n        return;\n      }\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);\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.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    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\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      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\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      events.forEach(function(e) {\n        this.addEvent(target, e);\n      }, this);\n    },\n    // remove event listeners\n    unlisten: function(target, events) {\n      events.forEach(function(e) {\n        this.removeEvent(target, e);\n      }, this);\n    },\n    addEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (window.ShadowDOMPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\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          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\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; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          if (g.events.indexOf(e.type) >= 0) {\n            g[e.type].call(g, e);\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      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  scope.register = dispatcher.register.bind(dispatcher);\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\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 uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\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    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      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        pointermap.set(this.POINTER_ID, e.target);\n        dispatcher.down(e);\n      }\n    },\n    mousemove: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = e.target;\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 ATTRIB = 'touch-action';\n  var INSTALLER;\n  var HAS_TOUCH_ACTION = typeof document.head.style.touchAction === 'string';\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (HAS_TOUCH_ACTION) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\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 = false;\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        return scope.findTarget(touch);\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      // 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; i < tl.length; i++) {\n        t = tl[i];\n        inFunction.call(this, this.touchToPointer(t));\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 scrollAxis = inEvent.currentTarget._scrollType;\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        this.firstXY = null;\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.out;\n            d.push(p);\n          }\n        }, this);\n        d.forEach(this.cancelOut, this);\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      var p = pointermap.set(inPointer.pointerId, inPointer.target);\n      dispatcher.down(inPointer);\n    },\n    touchmove: function(inEvent) {\n      if (HAS_TOUCH_ACTION) {\n        this.processTouches(inEvent, this.move);\n      } else {\n        if (!this.scrolling) {\n          if (this.shouldScroll(inEvent)) {\n            this.scrolling = true;\n            this.touchcancel(inEvent);\n          } else {\n            inEvent.preventDefault();\n            this.processTouches(inEvent, this.move);\n          }\n        }\n      }\n    },\n    move: function(inPointer) {\n      var pointer = pointermap.get(inPointer.pointerId);\n      // a finger drifted off the screen, ignore it\n      if (!pointer) {\n        return;\n      }\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      if (!this.scrolling) {\n        inPointer.relatedTarget = scope.findTarget(inPointer);\n        dispatcher.up(inPointer);\n      }\n      this.cleanUpPointer(inPointer);\n    },\n    cancel: function(inPointer) {\n      inPointer.relatedTarget = scope.findTarget(inPointer);\n      dispatcher.cancel(inPointer);\n      this.cleanUpPointer(inPointer);\n    },\n    touchcancel: function(inEvent) {\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  if (!HAS_TOUCH_ACTION) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\n  }\n\n  scope.touchEvents = touchEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n  var pointermap = dispatcher.pointermap;\n  var HAS_BITMAP_TYPE = window.MSPointerEvent && typeof window.MSPointerEvent.MSPOINTER_TYPE_MOUSE === 'number';\n  var msEvents = {\n    events: [\n      'MSPointerDown',\n      'MSPointerMove',\n      'MSPointerUp',\n      'MSPointerCancel',\n    ],\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      if (HAS_BITMAP_TYPE) {\n        e = dispatcher.cloneEvent(inEvent);\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\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 = e.target;\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      return dispatcher.cloneEvent(inEvent);\n    },\n    register: function(target) {\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = e.target;\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 = e.target;\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.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  dispatcher.register(document);\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     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       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId\n       });\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             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', 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 released\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    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      };\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    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          });\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, property;\n\n        expr = parsePrimaryExpression();\n\n        while (match('.') || match('[')) {\n            if (match('[')) {\n                property = parseComputedMember();\n                expr = delegate.createMemberExpression('[', expr, property);\n            } else {\n                property = parseNonComputedMember();\n                expr = delegate.createMemberExpression('.', expr, property);\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.dynamicDeps = typeof object == 'function' ||\n                       object.dynamicDeps ||\n                       (accessor == '[' && !(property instanceof Literal));\n\n    // convert literal computed property access where literal value is a value\n    // path to ident dot-access.\n    if (accessor == '[' &&\n        property instanceof Literal &&\n        Path.get(property.value).valid) {\n      accessor = '.';\n      property = new IdentPath(property.value);\n    }\n\n    this.simplePath =\n        !this.dynamicDeps &&\n        property instanceof IdentPath &&\n        (object instanceof MemberExpression || object instanceof IdentPath);\n\n    this.object = this.simplePath ? object : getFn(object);\n    this.property = accessor == '.' ? property : getFn(property);\n  }\n\n  MemberExpression.prototype = {\n    get fullPath() {\n      if (!this.fullPath_) {\n        var last = this.object instanceof IdentPath ?\n            this.object.name : this.object.fullPath;\n        this.fullPath_ = Path.get(last + '.' + this.property.name);\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.property instanceof IdentPath) {\n          var path = Path.get(this.property.name);\n\n          this.valueFn_ = function(model, observer) {\n            var context = object(model, observer);\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) {\n            var context = object(model, observer);\n            var propName = property(model, observer);\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(value, toModelDirection, filterRegistry, model,\n                        observer) {\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 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('No ' + (toModelDirection ? 'toModel' : 'toDOM') +\n                      ' found on' + this.name);\n        return;\n      }\n\n      var args = [value];\n      for (var i = 0; i < this.args.length; i++) {\n        args[i + 1] = getFn(this.args[i])(model, observer);\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) {\n        return unaryOperators[op](argument(model, observer));\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      return function(model, observer) {\n        return binaryOperators[op](left(model, observer),\n                                   right(model, observer));\n      };\n    },\n\n    createConditionalExpression: function(test, consequent, alternate) {\n      test = getFn(test);\n      consequent = getFn(consequent);\n      alternate = getFn(alternate);\n\n      return function(model, observer) {\n        return test(model, observer) ?\n            consequent(model, observer) : alternate(model, observer);\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    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) {\n        var arr = []\n        for (var i = 0; i < elements.length; i++)\n          arr.push(elements[i](model, observer));\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) {\n        var obj = {};\n        for (var i = 0; i < properties.length; i++)\n          obj[properties[i].key] = properties[i].value(model, observer);\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);\n      for (var i = 0; i < this.filters.length; i++) {\n        value = this.filters[i].transform(value, false, filterRegistry, model,\n                                          observer);\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(newValue, true, filterRegistry,\n                                                 model);\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        var scope = Object.create(parentScope);\n        scope[scopeName] = model;\n        scope[indexName] = undefined;\n        scope[parentScopeName] = parentScope;\n        return scope;\n      };\n    }\n  };\n\n  global.PolymerExpressions = PolymerExpressions;\n  if (global.exposeGetExpression)\n    global.getExpression_ = getExpression;\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 */\nPolymer = {\n  version: '0.3.1-604ba08'\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(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  // exports\n\n  scope.extend = extend;\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  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\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  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\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      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = 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\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        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 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})(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 properties = {\n    createPropertyObserver: function() {\n      var n$ = this._observeNames;\n      if (n$ && n$.length) {\n        var o = this._propertyObserver = new CompoundObserver(true);\n        this.registerObservers([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(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return bindProperties(this, property, observable);\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    registerObservers: function(observers) {\n      this._observers = this._observers || [];\n      this._observers.push(observers);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n      for (var i=0, l=this._observers.length; i<l; i++) {\n        this.closeObserverArray(this._observers[i]);\n      }\n      this._observers = [];\n    },\n    closeObserverArray: function(observerArray) {\n      for (var i=0, l=observerArray.length, o; i<l; i++) {\n        o = observerArray[i];\n        if (o && o.close) {\n          o.close();\n        }\n      }\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  // property binding\n  // bind a property in A to a path in B by converting A[property] to a\n  // getter/setter pair that accesses B[...path...]\n  function bindProperties(a, property, observable) {\n    // apply Polymer two-way reference binding\n    return Observer.bindToInstance(a, property, observable, resolveBindingValue);\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  // 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 a default bindingDelegate\n      var syntax = this.syntax || (!template.bindingDelegate &&\n          this.element.syntax);\n      var dom = template.createInstance(this, syntax);\n      this.registerObservers(dom.bindings_);\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      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\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      // TODO (sorvell): temporarily open observer when created\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      // 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      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\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      // set up polymer gestures\n      PolymerGestures.register(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  \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 (window.ShadowDOMPolyfill) {\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      scope._scopeStyles[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      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\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 (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\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})(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    Platform.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  // 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 Platform.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 (window.ShadowDOMPolyfill) {\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        node.addEventListener(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            node.removeEventListener(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    },\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    // sync prototype to property descriptors; \n    // desriptor format contains default value and optionally a \n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    // \n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // 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 propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor); \n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' && \n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\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    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          Observer.createBindablePrototypeAccessor(prototype, 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\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\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          // do not override explicit entries\n          if (n && publish[n] === undefined && base[n] === undefined) {\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            publish[n] = Polymer.nob;\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 && Platform.templateContent(template);\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  // 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 (window.ShadowDOMPolyfill) {\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    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\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    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\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    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\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      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\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    waitToReady: true\n  };\n\n  var flushQueue = [];\n\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  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\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(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\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      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('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      //console.groupEnd();\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        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\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.wait(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  whenPolymerReady(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/**\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
+{"version":3,"file":"polymer.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/installer.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","polymer-versioned.js","../src/boot.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/import.js","../src/declaration/polymer-element.js","../src/lib/auto-binding.js"],"names":["window","PolymerGestures","hasSDPolyfill","Boolean","ShadowDOMPolyfill","wrap","wrapIfNeeded","a","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","elementFromPoint","targetingShadow","this","olderShadow","os","olderShadowRoot","se","querySelector","allShadows","element","shadows","push","searchRoot","inRoot","x","y","t","owner","nodeType","Node","DOCUMENT_NODE","DOCUMENT_FRAGMENT_NODE","findTarget","inEvent","clientX","clientY","findScrollAxis","n","i","length","_scrollType","currentTarget","host","LCA","b","contains","adepth","depth","bdepth","d","walk","u","deepContains","common","insideNode","node","rect","getBoundingClientRect","left","right","top","bottom","targetFinding","bind","shadowSelector","v","selector","rule","attrib2css","selectors","styles","hasTouchAction","style","touchAction","hasShadowRoot","forEach","r","String","map","el","textContent","MOUSE_PROPS","MOUSE_DEFAULTS","NOP_FACTORY","eventFactory","preventTap","makeBaseEvent","inType","inDict","e","createEvent","initEvent","cancelable","makeGestureEvent","Object","create","k","keys","makePointerEvent","p","buttons","pressure","pointerId","width","height","tiltX","tiltY","pointerType","hwTimestamp","isPrimary","_source","PointerMap","USE_MAP","m","Map","pointers","POINTERS_FN","values","prototype","size","set","inId","indexOf","has","delete","splice","get","clear","callback","thisArg","call","CLONE_PROPS","CLONE_DEFAULTS","HAS_SVG_INSTANCE","SVGElementInstance","dispatcher","pointermap","eventMap","eventSources","eventSourceList","gestures","gestureQueue","registerSource","name","source","newEvents","events","registerGesture","register","es","l","unregister","down","fireEvent","move","type","fillGestureQueue","up","cancel","tapPrevented","eventHandler","_handledByPG","fn","listen","addEvent","unlisten","removeEvent","eventName","addEventListener_","boundHandler","removeEventListener_","removeEventListener","makeEvent","preventDefault","_target","cloneEvent","eventCopy","correspondingUseElement","clone","gestureTrigger","g","j","requestAnimationFrame","boundGestureTrigger","root","Installer","add","remove","changed","binder","addCallback","removeCallback","changedCallback","MO","observer","mutationWatcher","Array","toArray","slice","filter","MutationObserver","WebKitMutationObserver","SELECTOR","OBSERVER_INIT","subtree","childList","attributes","attributeOldValue","attributeFilter","watchSubtree","observe","enableOnSubtree","readyState","installOnLoad","installNewSubtree","findElements","addElement","querySelectorAll","removeElement","elementChanged","oldValue","concatLists","accum","list","concat","isElement","ELEMENT_NODE","flattenMutationTree","inNodes","tree","reduce","mutations","mutationHandler","added","addedNodes","removed","removedNodes","console","warn","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","relatedTarget","cleanupMouse","INSTALLER","DEDUP_TIMEOUT","CLICK_COUNT_TIMEOUT","HYSTERESIS","ATTRIB","CAN_USE_GLOBAL","touchEvents","elementAdded","getAttribute","st","touchActionToScrollType","elementRemoved","undefined","oldSt","scrollTypes","EMITTER","XSCROLLER","YSCROLLER","SCROLLER","exec","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","PointerEvent","navigator","msPointerEnabled","ontouchstart","track","WIGGLE_THRESHOLD","clampDir","inDelta","calcPositionDelta","inA","inB","pageX","pageY","fireTrack","inTrackingData","downEvent","lastMoveEvent","xDirection","yDirection","ddx","ddy","screenX","screenY","trackInfo","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","index","charCodeAt","getIdentifier","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","match","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","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","toLowerCase","findScope","prop","parentScopeName","hasOwnProperty","isLiteralExpression","pathString","isNaN","Number","PolymerExpressions","addPath","getValueFrom","setValue","newValue","setValueFrom",{"end":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"start":{"file":"../../polymer-expressions/src/polymer-expressions.js","comments_before":[],"nlb":false,"endpos":3539,"pos":3531,"col":8,"line":117,"value":"fullPath","type":"name"},"name":"fullPath"},"fullPath","fullPath_","parts","context","propName","transform","toModelDirection","initialArgs","toModel","toDOM","apply","unaryOperators","+","-","!","binaryOperators","*","/","%","<",">","<=",">=","==","!=","===","!==","&&","||","op","argument","test","ident","arr","kind","obj","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","extend","api","getOwnPropertyNames","pd","getOwnPropertyDescriptor","nom","job","wait","stop","Job","go","inContext","boundComplete","complete","h","handle","cancelAnimationFrame","registry","HTMLElement","tag","getPrototypeForTag","getPrototypeOf","originalStopPropagation","Event","cancelBubble","$super","arrayOfArgs","caller","_super","nameInThis","memoizeSuper","n$","method","proto","nextSuper","super","deserializeValue","currentValue","inferredType","typeHandlers","string","date","boolean","parseInt","JSON","function","declaration","instance","publish","apis","utils","async","timeout","Platform","flush","cancelAsync","fire","onNode","event","asyncFire","classFollows","anew","old","className","classList","injectBoundHTML","html","innerHTML","fragment","instanceTemplate","nop","nob","asyncMethod","log","logFlags","EVENT_PREFIX","addHostListeners","eventDelegates","localName","methodName","getEventHandler","dispatchMethod","group","groupEnd","copyInstanceAttributes","a$","_instanceAttributes","hasAttribute","setAttribute","takeAttributes","_publishLC","attributeToProperty","propertyForAttribute","search","bindPattern","stringValue","serializeValue","reflectPropertyToAttribute","serializedValue","removeAttribute","areSameValue","numberIsNaN","resolveBindingValue","updateRecord","createPropertyObserver","_observeNames","o","_propertyObserver","registerObserver","observeArrayValue","openPropertyObserver","notifyPropertyChanges","newValues","oldValues","paths","called","ov","nv","invokeMethod","deliverChanges","propertyChanged_","reflect","callbackName","isArray","closeNamedObserver","ArrayObserver","registerNamedObserver","emitPropertyChangeRecord","Observer","hasObjectObserve","notifier","notifier_","getNotifier","notify","bindToAccessor","observable","resolveFn","privateName","privateObservable","resolvedValue","createComputedProperties","_computedNames","syntax","bindProperty","_observers","closeObservers","observers","o$","_namedObservers","closeNamedObservers","mdv","bindingDelegate","dom","createInstance","bindings_","enableBindingsReflection","path_","_recordBinding","mixinSuper","bindFinished","makeElementReady","asyncUnbindAll","_unbound","unbind","_unbindAllJob","unbindAll","cancelUnbindAll","mustachePattern","isBase","PolymerBase","base","created","ready","createdCallback","prepareElement","ownerDocument","isStagingDocument","_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","insertBefore","marshalNodeReferences","$","attributeChangedCallback","attributeChanged","onMutation","listener","disconnect","constructor","Base","shimCssText","cssText","is","ShadowCSS","makeScopeSelector","STYLE_SCOPE_ATTRIBUTE","STYLE_CONTROLLER_SCOPE","installControllerStyles","findStyleScope","scopeHasNamedStyle","cssTextForScope","installScopeCssText","installScopeStyle","cssTextToScopeStyle","applyStyleToScope","_scopeStyles","script","_currentScript","getRegisteredPrototype","registerPrototype","notifyPrototype","waitingForPrototype","client","waitPrototype","registerWhenReady","prototypesByName","declarations","deliverDeclarations","resolveElementPaths","urlResolver","resolveDom","addResolvePathApi","assetPath","URL","baseURI","resolvePath","urlPath","href","importRuleForSheet","sheet","baseUrl","createStyleElement","attr","firstElementChild","s$","nextElementSibling","cssTextFromSheet","__resource","matchesSelector","inSelector","matches","STYLE_SELECTOR","STYLE_LOADABLE_MATCH","SHEET_SELECTOR","STYLE_GLOBAL_SCOPE","SCOPE_ATTR","loadStyles","content","templateContent","convertSheetsToStyles","findLoadableStyles","templateUrl","styleResolver","copySheetAttributes","replaceChild","link","loadables","installSheets","cacheSheets","cacheStyles","installLocalSheets","installGlobalStyles","sheets","findNodes","firstChild","matcher","nodes","array","templateNodes","styleForScope","scopeDescriptor","webkitMatchesSelector","mozMatchesSelector","mixedCaseEventTypes","parseHostEvents","delegates","addAttributeDelegates","hasEventPrefix","removeEventPrefix","trim","prefixLength","findController","controller","prepareEventBinding","eventType","bindingValue","handler","inferObservers","explodeObservers","exploded","ni","names","split","optimizePropertyMaps","_publishNames","publishProperties","requireProperties","lowerCaseMap","propertyDescriptors","propertyDescriptor","reflects","reflectHintForDescriptor","valueForDescriptor","createPropertyAccessor","createPropertyAccessors","ATTRIBUTES_ATTRIBUTE","ATTRIBUTES_REGEX","inheritAttributesObjects","inheritObject","publishAttributes","hasValue","accumulateInstanceAttributes","clonable","isInstanceAttribute","blackList","extends","noscript","assetpath","cache-csstext","installBindingDelegate","ensurePrototypeTraversal","ancestor","extendeeName","buildPrototype","publishConstructor","extension","generateBasePrototype","desugarBeforeChaining","chainPrototypes","desugarAfterChaining","inheritMetaData","chained","chainObject","extendee","shimStyling","registerCallback","symbol","ctor","extnds","findBasePrototype","ensureBaseApi","memoizedBases","extended","mixinMethod","info","typeExtension","findTypeExtension","registerElement","inherited","queueForElement","mainQueue","importQueue","nextQueued","whenPolymerReady","queue","waitToReady","CustomElements","HTMLImports","whenImportsReady","addReadyCallback","check","shouldAdd","flushQueue","__check","__go","useNative","readied","addToFlushQueue","shift","nextElement","canReady","isEmpty","upgradeDocumentTree","flushReadyCallbacks","readyCallbacks","importElements","elementOrFragment","importUrls","urls","url","frag","createDocumentFragment","rel","import","isRegistered","isCustomTag","init","loadResources","registered","waitingForQueue","waitingForResources","_register","handleNoScript","_needsResources","body","makeSyntax"],"mappings":";;;;;;;;;;AASAA,OAAOC,iBACLC,cAAeC,QAAQH,OAAOI,oBAEhCH,gBAAgBI,KAAOJ,gBAAgBC,cAAgBE,kBAAkBE,aAAe,SAASC,GAAI,MAAOA,ICH5G,SAAUC,GACR,GAAIC,IAAgB,EAGhBC,EAAWC,SAASC,cAAc,OACtC,KAAKJ,EAAMN,eAAiBQ,EAASG,iBAAkB,CACrD,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,IAAUzB,QAAQyB,EAAOK,mBAElCC,gBAAiB,SAASL,GACxB,GAAId,GAAIoB,KAAKP,OAAOC,EACpB,OAAIM,MAAKH,UAAUjB,GACVA,EADT,QAIFqB,YAAa,SAASR,GACpB,GAAIS,GAAKT,EAAOU,eAChB,KAAKD,EAAI,CACP,GAAIE,GAAKX,EAAOY,cAAc,SAC1BD,KACFF,EAAKE,EAAGD,iBAGZ,MAAOD,IAETI,WAAY,SAASC,GAEnB,IADA,GAAIC,MAAc5B,EAAIoB,KAAKP,OAAOc,GAC5B3B,GACJ4B,EAAQC,KAAK7B,GACbA,EAAIoB,KAAKC,YAAYrB,EAEvB,OAAO4B,IAETE,WAAY,SAASC,EAAQC,EAAGC,GAC9B,GAAIC,GAAOnC,CACX,OAAIgC,IACFG,EAAIH,EAAOb,iBAAiBc,EAAGC,GAC3BC,EAEFnC,EAAKqB,KAAKD,gBAAgBe,GACjBH,IAAWnC,WAEpBG,EAAKqB,KAAKC,YAAYU,IAGjBX,KAAKU,WAAW/B,EAAIiC,EAAGC,IAAMC,GAVtC,QAaFC,MAAO,SAASR,GACd,IAAKA,EACH,MAAO/B,SAIT,KAFA,GAAII,GAAI2B,EAED3B,EAAEU,YACPV,EAAIA,EAAEU,UAMR,OAHIV,GAAEoC,UAAYC,KAAKC,eAAiBtC,EAAEoC,UAAYC,KAAKE,yBACzDvC,EAAIJ,UAECI,GAETwC,WAAY,SAASC,GACnB,GAAI/C,GAAiB+C,EAAQrC,KAC3B,MAAOqC,GAAQrC,KAAK,EAEtB,IAAI4B,GAAIS,EAAQC,QAAST,EAAIQ,EAAQE,QAEjC3C,EAAIoB,KAAKe,MAAMM,EAAQ7B,OAK3B,OAHKZ,GAAEkB,iBAAiBc,EAAGC,KACzBjC,EAAIJ,UAECwB,KAAKU,WAAW9B,EAAGgC,EAAGC,IAE/BW,eAAgB,SAASH,GACvB,GAAII,EACJ,IAAInD,GAAiB+C,EAAQrC,MAE3B,IAAK,GADDA,GAAOqC,EAAQrC,KACV0C,EAAI,EAAGA,EAAI1C,EAAK2C,OAAQD,IAE/B,GADAD,EAAIzC,EAAK0C,GACLD,EAAEG,YACJ,MAAOH,GAAEG,gBAKb,KADAH,EAAIpD,EAAMH,KAAKmD,EAAQQ,eACjBJ,GAAG,CACP,GAAIA,EAAEG,YACJ,MAAOH,GAAEG,WAEXH,GAAIA,EAAEnC,YAAcmC,EAAEK,OAI5BC,IAAK,SAAS3D,EAAG4D,GACf,GAAI5D,IAAM4D,EACR,MAAO5D,EAET,IAAIA,IAAM4D,EACR,MAAO5D,EAET,IAAI4D,IAAM5D,EACR,MAAO4D,EAET,KAAKA,IAAM5D,EACT,MAAOI,SAGT,IAAIJ,EAAE6D,UAAY7D,EAAE6D,SAASD,GAC3B,MAAO5D,EAET,IAAI4D,EAAEC,UAAYD,EAAEC,SAAS7D,GAC3B,MAAO4D,EAET,IAAIE,GAASlC,KAAKmC,MAAM/D,GACpBgE,EAASpC,KAAKmC,MAAMH,GACpBK,EAAIH,EAASE,CAMjB,KALIC,GAAK,EACPjE,EAAI4B,KAAKsC,KAAKlE,EAAGiE,GAEjBL,EAAIhC,KAAKsC,KAAKN,GAAIK,GAEbjE,GAAK4D,GAAK5D,IAAM4D,GACrB5D,EAAIA,EAAEkB,YAAclB,EAAE0D,KACtBE,EAAIA,EAAE1C,YAAc0C,EAAEF,IAExB,OAAO1D,IAETkE,KAAM,SAASb,EAAGc,GAChB,IAAK,GAAIb,GAAI,EAAGD,GAAUc,EAAJb,EAAQA,IAC5BD,EAAIA,EAAEnC,YAAcmC,EAAEK,IAExB,OAAOL,IAETU,MAAO,SAASV,GAEd,IADA,GAAIY,GAAI,EACFZ,GACJY,IACAZ,EAAIA,EAAEnC,YAAcmC,EAAEK,IAExB,OAAOO,IAETG,aAAc,SAASpE,EAAG4D,GACxB,GAAIS,GAASzC,KAAK+B,IAAI3D,EAAG4D,EAEzB,OAAOS,KAAWrE,GAEpBsE,WAAY,SAASC,EAAM/B,EAAGC,GAC5B,GAAI+B,GAAOD,EAAKE,uBAChB,OAAQD,GAAKE,MAAQlC,GAAOA,GAAKgC,EAAKG,OAAWH,EAAKI,KAAOnC,GAAOA,GAAK+B,EAAKK,QAGlF5E,GAAM6E,cAAgB1D,EAOtBnB,EAAM+C,WAAa5B,EAAO4B,WAAW+B,KAAK3D,GAS1CnB,EAAMmE,aAAehD,EAAOgD,aAAaW,KAAK3D,GAqB9CnB,EAAMqE,WAAalD,EAAOkD,YAEzB7E,OAAOC,iBCzNV,WACE,QAASsF,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,GAGTC,GADOnF,SAASY,KAC4C,gBAApCZ,UAASY,KAAKwE,MAAMC,aAE5CC,GAAiBjG,OAAOI,mBAAqBO,SAASY,KAAKV,gBAE/D,IAAIiF,EAAgB,CAClBH,EAAWO,QAAQ,SAASC,GACtBC,OAAOD,KAAOA,GAChBN,GAAUJ,EAASU,GAAKT,EAAKS,GAAK,KAC9BF,IACFJ,GAAUN,EAAeY,GAAKT,EAAKS,GAAK,QAG1CN,GAAUM,EAAEP,UAAUS,IAAIZ,GAAYC,EAAKS,EAAET,MAAQ,KACjDO,IACFJ,GAAUM,EAAEP,UAAUS,IAAId,GAAkBG,EAAKS,EAAET,MAAQ,QAKjE,IAAIY,GAAK3F,SAASC,cAAc,QAChC0F,GAAGC,YAAcV,EACjBlF,SAASY,KAAKP,YAAYsF,OCnC9B,SAAU9F,GAER,GAAIgG,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,GAAIrG,SAASsG,YAAY,QAG7B,OAFAD,GAAEE,UAAUJ,EAAQC,EAAOzF,UAAW,EAAOyF,EAAOI,aAAc,GAClEH,EAAEJ,WAAaD,EAAaC,WAAWI,GAChCA,GAETI,iBAAkB,SAASN,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAGjC,KAAK,GAAuCC,GADxCP,EAAI7E,KAAK0E,cAAcC,EAAQC,GAC1BlD,EAAI,EAAG2D,EAAOH,OAAOG,KAAKT,GAAYlD,EAAI2D,EAAK1D,OAAQD,IAC9D0D,EAAIC,EAAK3D,GACTmD,EAAEO,GAAKR,EAAOQ,EAEhB,OAAOP,IAETS,iBAAkB,SAASX,EAAQC,GACjCA,EAASA,GAAUM,OAAOC,OAAO,KAIjC,KAAI,GAAWI,GAFXV,EAAI7E,KAAK0E,cAAcC,EAAQC,GAE3BlD,EAAI,EAAMA,EAAI2C,EAAY1C,OAAQD,IACxC6D,EAAIlB,EAAY3C,GAChBmD,EAAEU,GAAKX,EAAOW,IAAMjB,EAAe5C,EAErCmD,GAAEW,QAAUZ,EAAOY,SAAW,CAI9B,IAAIC,GAAW,CAsBf,OApBEA,GADEb,EAAOa,SACEb,EAAOa,SAEPZ,EAAEW,QAAU,GAAM,EAI/BX,EAAEjE,EAAIiE,EAAEvD,QACRuD,EAAEhE,EAAIgE,EAAEtD,QAGRsD,EAAEa,UAAYd,EAAOc,WAAa,EAClCb,EAAEc,MAAQf,EAAOe,OAAS,EAC1Bd,EAAEe,OAAShB,EAAOgB,QAAU,EAC5Bf,EAAEY,SAAWA,EACbZ,EAAEgB,MAAQjB,EAAOiB,OAAS,EAC1BhB,EAAEiB,MAAQlB,EAAOkB,OAAS,EAC1BjB,EAAEkB,YAAcnB,EAAOmB,aAAe,GACtClB,EAAEmB,YAAcpB,EAAOoB,aAAe,EACtCnB,EAAEoB,UAAYrB,EAAOqB,YAAa,EAClCpB,EAAEqB,QAAUtB,EAAOsB,SAAW,GACvBrB,GAIXxG,GAAMmG,aAAeA,GACpB3G,OAAOC,iBChHV,SAAUO,GAGR,QAAS8H,KACP,GAAIC,EAAS,CACX,GAAIC,GAAI,GAAIC,IAEZ,OADAD,GAAEE,SAAWC,EACNH,EAEPrG,KAAKqF,QACLrF,KAAKyG,UATT,GAAIL,GAAUvI,OAAOyI,KAAOzI,OAAOyI,IAAII,UAAU3C,QAC7CyC,EAAc,WAAY,MAAOxG,MAAK2G,KAY1CR,GAAWO,WACTE,IAAK,SAASC,EAAMxF,GAClB,GAAIK,GAAI1B,KAAKqF,KAAKyB,QAAQD,EACtBnF,GAAI,GACN1B,KAAKyG,OAAO/E,GAAKL,GAEjBrB,KAAKqF,KAAK5E,KAAKoG,GACf7G,KAAKyG,OAAOhG,KAAKY,KAGrB0F,IAAK,SAASF,GACZ,MAAO7G,MAAKqF,KAAKyB,QAAQD,GAAQ,IAEnCG,SAAU,SAASH,GACjB,GAAInF,GAAI1B,KAAKqF,KAAKyB,QAAQD,EACtBnF,GAAI,KACN1B,KAAKqF,KAAK4B,OAAOvF,EAAG,GACpB1B,KAAKyG,OAAOQ,OAAOvF,EAAG,KAG1BwF,IAAK,SAASL,GACZ,GAAInF,GAAI1B,KAAKqF,KAAKyB,QAAQD,EAC1B,OAAO7G,MAAKyG,OAAO/E,IAErByF,MAAO,WACLnH,KAAKqF,KAAK1D,OAAS,EACnB3B,KAAKyG,OAAO9E,OAAS,GAGvBoC,QAAS,SAASqD,EAAUC,GAC1BrH,KAAKyG,OAAO1C,QAAQ,SAASV,EAAG3B,GAC9B0F,EAASE,KAAKD,EAAShE,EAAGrD,KAAKqF,KAAK3D,GAAI1B,OACvCA,OAELuG,SAAU,WACR,MAAOvG,MAAKqF,KAAK1D,SAIrBtD,EAAM8H,WAAaA,GAClBtI,OAAOC,iBCzDV,SAAUO,GACR,GAAIkJ,IAEF,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,EAAenG,EAAMmG,aAErBzG,EAAgBM,EAAMN,cACtBG,EAAOG,EAAMH,KAcbyJ,GACFC,WAAY,GAAIvJ,GAAM8H,WACtB0B,SAAU3C,OAAOC,OAAO,MAGxB2C,aAAc5C,OAAOC,OAAO,MAC5B4C,mBACAC,YACAC,gBASAC,eAAgB,SAASC,EAAMC,GAC7B,GAAIxJ,GAAIwJ,EACJC,EAAYzJ,EAAE0J,MACdD,KACFA,EAAUtE,QAAQ,SAASc,GACrBjG,EAAEiG,KACJ7E,KAAK6H,SAAShD,GAAKjG,EAAEiG,GAAG1B,KAAKvE,KAE9BoB,MACHA,KAAK8H,aAAaK,GAAQvJ,EAC1BoB,KAAK+H,gBAAgBtH,KAAK7B,KAG9B2J,gBAAiB,SAASJ,EAAMC,GAC9BpI,KAAKgI,SAASvH,KAAK2H,IAErBI,SAAU,SAASjI,GAEjB,IAAK,GAAWkI,GADZC,EAAI1I,KAAK+H,gBAAgBpG,OACpBD,EAAI,EAAYgH,EAAJhH,IAAW+G,EAAKzI,KAAK+H,gBAAgBrG,IAAKA,IAE7D+G,EAAGD,SAASlB,KAAKmB,EAAIlI,IAGzBoI,WAAY,SAASpI,GAEnB,IAAK,GAAWkI,GADZC,EAAI1I,KAAK+H,gBAAgBpG,OACpBD,EAAI,EAAYgH,EAAJhH,IAAW+G,EAAKzI,KAAK+H,gBAAgBrG,IAAKA,IAE7D+G,EAAGE,WAAWrB,KAAKmB,EAAIlI,IAI3BqI,KAAM,SAASvH,GACbrB,KAAK6I,UAAU,OAAQxH,IAEzByH,KAAM,SAASzH,GAEbA,EAAQ0H,KAAO,OACf/I,KAAKgJ,iBAAiB3H,IAExB4H,GAAI,SAAS5H,GACXrB,KAAK6I,UAAU,KAAMxH,IAEvB6H,OAAQ,SAAS7H,GACfA,EAAQ8H,cAAe,EACvBnJ,KAAK6I,UAAU,KAAMxH,IAGvB+H,aAAc,SAAS/H,GAIrB,IAAIA,EAAQgI,aAAZ,CAGA,GAAIN,GAAO1H,EAAQ0H,KACfO,EAAKtJ,KAAK6H,UAAY7H,KAAK6H,SAASkB,EACpCO,IACFA,EAAGjI,GAELA,EAAQgI,cAAe,IAGzBE,OAAQ,SAAS/J,EAAQ8I,GACvB,IAAK,GAA8BzD,GAA1BnD,EAAI,EAAGgH,EAAIJ,EAAO3G,OAAgB+G,EAAJhH,IAAWmD,EAAIyD,EAAO5G,IAAKA,IAChE1B,KAAKwJ,SAAShK,EAAQqF,IAI1B4E,SAAU,SAASjK,EAAQ8I,GACzB,IAAK,GAA8BzD,GAA1BnD,EAAI,EAAGgH,EAAIJ,EAAO3G,OAAgB+G,EAAJhH,IAAWmD,EAAIyD,EAAO5G,IAAKA,IAChE1B,KAAK0J,YAAYlK,EAAQqF,IAG7B2E,SAAU,SAAShK,EAAQmK,GAErB5L,EACFyB,EAAOoK,kBAAkBD,EAAW3J,KAAK6J,cAEzCrK,EAAOV,iBAAiB6K,EAAW3J,KAAK6J,eAG5CH,YAAa,SAASlK,EAAQmK,GAExB5L,EACFyB,EAAOsK,qBAAqBH,EAAW3J,KAAK6J,cAE5CrK,EAAOuK,oBAAoBJ,EAAW3J,KAAK6J,eAY/CG,UAAW,SAASrF,EAAQtD,GAC1B,GAAIwD,GAAIL,EAAac,iBAAiBX,EAAQtD,EAI9C,OAHAwD,GAAEoF,eAAiB5I,EAAQ4I,eAC3BpF,EAAEsE,aAAe9H,EAAQ8H,aACzBtE,EAAEqF,QAAUrF,EAAEqF,SAAW7I,EAAQ7B,OAC1BqF,GAGTgE,UAAW,SAASlE,EAAQtD,GAC1B,GAAIwD,GAAI7E,KAAKgK,UAAUrF,EAAQtD,EAC/B,OAAOrB,MAAKX,cAAcwF,IAS5BsF,WAAY,SAAS9I,GAEnB,IAAK,GADgCkE,GAAjC6E,EAAYlF,OAAOC,OAAO,MACrBzD,EAAI,EAAGA,EAAI6F,EAAY5F,OAAQD,IACtC6D,EAAIgC,EAAY7F,GAChB0I,EAAU7E,GAAKlE,EAAQkE,IAAMiC,EAAe9F,IAIlC,WAAN6D,GAAwB,kBAANA,KAChBkC,GAAoB2C,EAAU7E,YAAcmC,sBAC9C0C,EAAU7E,GAAK6E,EAAU7E,GAAG8E,yBAE9BD,EAAU7E,GAAKrH,EAAKkM,EAAU7E,IAKlC,OADA6E,GAAUH,eAAiB5I,EAAQ4I,eAC5BG,GAQT/K,cAAe,SAASgC,GACtB,GAAIP,GAAIO,EAAQ6I,OAChB,IAAIpJ,EAAG,CACLA,EAAEzB,cAAcgC,EAGhB,IAAIiJ,GAAQtK,KAAKmK,WAAW9I,EAC5BiJ,GAAM9K,OAASsB,EACfd,KAAKgJ,iBAAiBsB,KAG1BC,eAAgB,WAEd,IAAK,GAAW1F,GAAPnD,EAAI,EAAMA,EAAI1B,KAAKiI,aAAatG,OAAQD,IAAK,CACpDmD,EAAI7E,KAAKiI,aAAavG,EACtB,KAAK,GAAW8I,GAAGlB,EAAVmB,EAAI,EAAUA,EAAIzK,KAAKgI,SAASrG,OAAQ8I,IAC/CD,EAAIxK,KAAKgI,SAASyC,GAClBnB,EAAKkB,EAAE3F,EAAEkE,MACLO,GACFA,EAAGhC,KAAKkD,EAAG3F,GAIjB7E,KAAKiI,aAAatG,OAAS,GAE7BqH,iBAAkB,SAASjK,GAEpBiB,KAAKiI,aAAatG,QACrB+I,sBAAsB1K,KAAK2K,qBAE7B3K,KAAKiI,aAAaxH,KAAK1B,IAG3B4I,GAAWkC,aAAelC,EAAWyB,aAAajG,KAAKwE,GACvDA,EAAWgD,oBAAsBhD,EAAW4C,eAAepH,KAAKwE,GAChEtJ,EAAMsJ,WAAaA,EACnBtJ,EAAMmK,SAAW,SAASoC,GACxBjD,EAAWa,SAASoC,IAEtBvM,EAAMsK,WAAahB,EAAWgB,WAAWxF,KAAKwE,GAC9CtJ,EAAMH,KAAOA,GACZL,OAAOC,iBCvSV,SAAUO,GAeR,QAASwM,GAAUC,EAAKC,EAAQC,EAASC,GACvCjL,KAAKkL,YAAcJ,EAAI3H,KAAK8H,GAC5BjL,KAAKmL,eAAiBJ,EAAO5H,KAAK8H,GAClCjL,KAAKoL,gBAAkBJ,EAAQ7H,KAAK8H,GAChCI,IACFrL,KAAKsL,SAAW,GAAID,GAAGrL,KAAKuL,gBAAgBpI,KAAKnD,QAnBrD,GAAI+D,GAAUyH,MAAM9E,UAAU3C,QAAQuD,KAAKnE,KAAKqI,MAAM9E,UAAU3C,SAC5DG,EAAMsH,MAAM9E,UAAUxC,IAAIoD,KAAKnE,KAAKqI,MAAM9E,UAAUxC,KACpDuH,EAAUD,MAAM9E,UAAUgF,MAAMpE,KAAKnE,KAAKqI,MAAM9E,UAAUgF,OAC1DC,EAASH,MAAM9E,UAAUiF,OAAOrE,KAAKnE,KAAKqI,MAAM9E,UAAUiF,QAC1DN,EAAKxN,OAAO+N,kBAAoB/N,OAAOgO,uBACvCC,EAAW,iBACXC,GACFC,SAAS,EACTC,WAAW,EACXC,YAAY,EACZC,mBAAmB,EACnBC,iBAAkB,gBAYpBvB,GAAUnE,WACR2F,aAAc,SAAS7M,GAQjBnB,EAAM6E,cAAcrD,UAAUL,IAChCQ,KAAKsL,SAASgB,QAAQ9M,EAAQuM,IAGlCQ,gBAAiB,SAAS/M,GACxBQ,KAAKqM,aAAa7M,GACdA,IAAWhB,UAAoC,aAAxBA,SAASgO,WAClCxM,KAAKyM,gBAELzM,KAAK0M,kBAAkBlN,IAG3BkN,kBAAmB,SAASlN,GAC1BuE,EAAQ/D,KAAK2M,aAAanN,GAASQ,KAAK4M,WAAY5M,OAEtD2M,aAAc,SAASnN,GACrB,MAAIA,GAAOqN,iBACFrN,EAAOqN,iBAAiBf,OAInCgB,cAAe,SAAS3I,GACtBnE,KAAKmL,eAAehH,IAEtByI,WAAY,SAASzI,GACnBnE,KAAKkL,YAAY/G,IAEnB4I,eAAgB,SAAS5I,EAAI6I,GAC3BhN,KAAKoL,gBAAgBjH,EAAI6I,IAE3BC,YAAa,SAASC,EAAOC,GAC3B,MAAOD,GAAME,OAAO3B,EAAQ0B,KAG9BV,cAAe,WACbjO,SAASM,iBAAiB,mBAAoB,WAChB,aAAxBN,SAASgO,YACXxM,KAAK0M,kBAAkBlO,WAEzB2E,KAAKnD,QAETqN,UAAW,SAAS5L,GAClB,MAAOA,GAAET,WAAaC,KAAKqM,cAE7BC,oBAAqB,SAASC,GAE5B,GAAIC,GAAOvJ,EAAIsJ,EAASxN,KAAK2M,aAAc3M,KAI3C,OAFAyN,GAAKhN,KAAKkL,EAAO6B,EAASxN,KAAKqN,YAExBI,EAAKC,OAAO1N,KAAKiN,iBAE1B1B,gBAAiB,SAASoC,GACxBA,EAAU5J,QAAQ/D,KAAK4N,gBAAiB5N,OAE1C4N,gBAAiB,SAASvH,GACxB,GAAe,cAAXA,EAAE0C,KAAsB,CAC1B,GAAI8E,GAAQ7N,KAAKuN,oBAAoBlH,EAAEyH,WACvCD,GAAM9J,QAAQ/D,KAAK4M,WAAY5M,KAC/B,IAAI+N,GAAU/N,KAAKuN,oBAAoBlH,EAAE2H,aACzCD,GAAQhK,QAAQ/D,KAAK8M,cAAe9M,UAChB,eAAXqG,EAAE0C,MACX/I,KAAK+M,eAAe1G,EAAE7G,OAAQ6G,EAAE2G,YAKjC3B,IACHR,EAAUnE,UAAU2F,aAAe,WACjC4B,QAAQC,KAAK,iGAIjB7P,EAAMwM,UAAYA,GACjBhN,OAAOC,iBClHV,SAAWO,GACT,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WAExBuG,EAAa,GAEbC,GAAoB,EAAG,EAAG,EAAG,GAE7BC,GAAc,CAClB,KACEA,EAA+D,IAAjD,GAAIC,YAAW,QAAS9I,QAAS,IAAIA,QACnD,MAAOX,IAGT,GAAI0J,IACFC,WAAY,EACZC,aAAc,QACdnG,QACE,YACA,YACA,WAEFE,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCoG,eAEAC,0BAA2B,SAAStN,GAGlC,IAAK,GAA2BP,GAF5B8N,EAAM5O,KAAK0O,YACX9N,EAAIS,EAAQC,QAAST,EAAIQ,EAAQE,QAC5BG,EAAI,EAAGgH,EAAIkG,EAAIjN,OAAe+G,EAAJhH,IAAUZ,EAAI8N,EAAIlN,IAAKA,IAAK,CAE7D,GAAImN,GAAKC,KAAKC,IAAInO,EAAIE,EAAEF,GAAIoO,EAAKF,KAAKC,IAAIlO,EAAIC,EAAED,EAChD,IAAUsN,GAANU,GAA0BV,GAANa,EACtB,OAAO,IAIbC,aAAc,SAAS5N,GACrB,GAAIwD,GAAI8C,EAAWwC,WAAW9I,EAQ9B,OAPAwD,GAAEa,UAAY1F,KAAKwO,WACnB3J,EAAEoB,WAAY,EACdpB,EAAEkB,YAAc/F,KAAKyO,aACrB5J,EAAEqB,QAAU,QACPmI,IACHxJ,EAAEW,QAAU4I,EAAiBvJ,EAAEqK,QAAU,GAEpCrK,GAETsK,UAAW,SAAS9N,GAClB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIkE,GAAIqC,EAAWb,IAAI/G,KAAKwO,WAGxBjJ,IACFvF,KAAKoP,QAAQ/N,EAEf,IAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAI5G,KAAKwO,WAAY3J,EAAErF,QAClCmI,EAAWiB,KAAK/D,KAGpBwK,UAAW,SAAShO,GAClB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIlH,KAAKwO,YAC/B7G,EAAWmB,KAAKjE,KAGpBuK,QAAS,SAAS/N,GAChB,IAAKrB,KAAK2O,0BAA0BtN,GAAU,CAC5C,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIlH,KAAKwO,YAC/B7G,EAAWsB,GAAGpE,GACd7E,KAAKuP,iBAGTA,aAAc,WACZ3H,EAAW,UAAU5H,KAAKwO,aAI9BnQ,GAAMkQ,YAAcA,GACnB1Q,OAAOC,iBC3FV,SAAUO,GACR,GASImR,GATA7H,EAAatJ,EAAMsJ,WACnBrH,EAAajC,EAAM6E,cAAc5C,WAAW6C,KAAK9E,EAAM6E,eACvD0E,EAAaD,EAAWC,WAGxB6H,GAFWjE,MAAM9E,UAAUxC,IAAIoD,KAAKnE,KAAKqI,MAAM9E,UAAUxC,KAEzC,MAChBwL,EAAsB,IACtBC,EAAa,GACbC,EAAS,eAITC,GAAiB,EAGjBC,GACFxH,QACE,aACA,YACA,WACA,eAEFE,SAAU,SAAShJ,GACbqQ,EACFlI,EAAW4B,OAAO/J,EAAQQ,KAAKsI,QAE/BkH,EAAUjD,gBAAgB/M,IAG9BmJ,WAAY,SAASnJ,GACfqQ,GACFlI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAKrCyH,aAAc,SAAS5L,GACrB,GAAI/F,GAAI+F,EAAG6L,aAAaJ,GACpBK,EAAKjQ,KAAKkQ,wBAAwB9R,EAClC6R,KACF9L,EAAGvC,YAAcqO,EACjBtI,EAAW4B,OAAOpF,EAAInE,KAAKsI,QAE3BhI,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcqO,EAChBtI,EAAW4B,OAAO3K,EAAGoB,KAAKsI,SACzBtI,QAGPmQ,eAAgB,SAAShM,GACvBA,EAAGvC,YAAcwO,OACjBzI,EAAW8B,SAAStF,EAAInE,KAAKsI,QAE7BhI,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcwO,OAChBzI,EAAW8B,SAAS7K,EAAGoB,KAAKsI,SAC3BtI,OAEL+M,eAAgB,SAAS5I,EAAI6I,GAC3B,GAAI5O,GAAI+F,EAAG6L,aAAaJ,GACpBK,EAAKjQ,KAAKkQ,wBAAwB9R,GAClCiS,EAAQrQ,KAAKkQ,wBAAwBlD,EAErCiD,IAAMI,GACRlM,EAAGvC,YAAcqO,EACjB3P,EAAW6D,GAAIJ,QAAQ,SAASnF,GAC9BA,EAAEgD,YAAcqO,GACfjQ,OACMqQ,EACTrQ,KAAKmQ,eAAehM,GACX8L,GACTjQ,KAAK+P,aAAa5L,IAGtBmM,aACEC,QAAS,OACTC,UAAW,QACXC,UAAW,QACXC,SAAU,uDAEZR,wBAAyB,SAASrM,GAChC,GAAI/C,GAAI+C,EACJoM,EAAKjQ,KAAKsQ,WACd,OAAU,SAANxP,EACK,OACEA,IAAMmP,EAAGO,UACX,IACE1P,IAAMmP,EAAGQ,UACX,IACER,EAAGS,SAASC,KAAK7P,GACnB,KADF,QAIT2N,aAAc,QACdmC,WAAY,KACZC,eAAgB,SAASC,GACvB,MAAO9Q,MAAK4Q,aAAeE,EAAQC,YAErCC,gBAAiB,SAASF,IAEM,IAA1BlJ,EAAWrB,YAA+C,IAA1BqB,EAAWrB,YAAoBqB,EAAWb,IAAI,MAChF/G,KAAK4Q,WAAaE,EAAQC,WAC1B/Q,KAAKiR,SAAWC,EAAGJ,EAAQxP,QAAS6P,EAAGL,EAAQvP,SAC/CvB,KAAKoR,UAAY,KACjBpR,KAAKqR,0BAGTC,qBAAsB,SAASC,GACzBA,EAAUtL,YACZjG,KAAK4Q,WAAa,KAClB5Q,KAAKiR,QAAU,KACfjR,KAAKwR,oBAGTC,WAAY,EACZC,QAAS,KACTF,gBAAiB,WACf,GAAIlI,GAAK,WACPtJ,KAAKyR,WAAa,EAClBzR,KAAK0R,QAAU,MACfvO,KAAKnD,KACPA,MAAK0R,QAAUC,WAAWrI,EAAIoG,IAEhC2B,sBAAuB,WACjBrR,KAAK0R,SACPE,aAAa5R,KAAK0R,UAGtBG,cAAe,SAAS9I,GACtB,GAAI+I,GAAM,CAIV,QAHa,eAAT/I,GAAkC,cAATA,KAC3B+I,EAAM,GAEDA,GAET1Q,WAAY,SAAS2Q,EAAOC,GAC1B,GAAoC,eAAhChS,KAAKiS,kBAAkBlJ,KAAuB,CAChD,GAAI/I,KAAK6Q,eAAekB,GAAQ,CAC9B,GAAIG,IACF5Q,QAASyQ,EAAMzQ,QACfC,QAASwQ,EAAMxQ,QACfvC,KAAMgB,KAAKiS,kBAAkBjT,KAC7BQ,OAAQnB,EAAMH,KAAK8B,KAAKiS,kBAAkBzS,QAE5C,OAAOnB,GAAM+C,WAAW8Q,GAExB,MAAO7T,GAAM+C,WAAW2Q,GAI5B,MAAOnK,GAAWV,IAAI8K,IAExBG,eAAgB,SAASrB,GACvB,GAAIsB,GAAMpS,KAAKiS,kBACXpN,EAAI8C,EAAWwC,WAAW2G,GAI1BkB,EAAKnN,EAAEa,UAAYoL,EAAQC,WAAa,CAC5ClM,GAAErF,OAASnB,EAAMH,KAAK8B,KAAKoB,WAAW0P,EAASkB,IAC/CnN,EAAE1F,SAAU,EACZ0F,EAAEG,YAAa,EACfH,EAAEwN,OAASrS,KAAKyR,WAChB5M,EAAEW,QAAUxF,KAAK6R,cAAcO,EAAIrJ,MACnClE,EAAEc,MAAQmL,EAAQwB,eAAiBxB,EAAQyB,SAAW,EACtD1N,EAAEe,OAASkL,EAAQ0B,eAAiB1B,EAAQ2B,SAAW,EACvD5N,EAAEY,SAAWqL,EAAQ4B,aAAe5B,EAAQ6B,OAAS,GACrD9N,EAAEoB,UAAYjG,KAAK6Q,eAAeC,GAClCjM,EAAEkB,YAAc/F,KAAKyO,aACrB5J,EAAEqB,QAAU,OAEZ,IAAI0M,GAAO5S,IAMX,OALA6E,GAAEoF,eAAiB,WACjB2I,EAAKxB,WAAY,EACjBwB,EAAK3B,QAAU,KACfmB,EAAInI,kBAECpF,GAETgO,eAAgB,SAASxR,EAASyR,GAChC,GAAIC,GAAK1R,EAAQ2R,cACjBhT,MAAKiS,kBAAoB5Q,CACzB,KAAK,GAAWP,GAAGyE,EAAV7D,EAAI,EAASA,EAAIqR,EAAGpR,OAAQD,IACnCZ,EAAIiS,EAAGrR,GACP6D,EAAIvF,KAAKmS,eAAerR,GACH,eAAjBO,EAAQ0H,MACVnB,EAAWhB,IAAIrB,EAAEG,UAAWH,EAAE/F,QAE5BoI,EAAWb,IAAIxB,EAAEG,YACnBoN,EAAWxL,KAAKtH,KAAMuF,IAEH,aAAjBlE,EAAQ0H,MAAuB1H,EAAQ4R,UACzCjT,KAAKkT,eAAe3N,IAM1B4N,aAAc,SAAS9R,GACrB,GAAIrB,KAAKiR,QAAS,CAChB,GAAIa,GACAsB,EAAa/U,EAAM6E,cAAc1B,eAAeH,EACpD,IAAmB,SAAf+R,EAEFtB,GAAM,MACD,IAAmB,OAAfsB,EAETtB,GAAM,MACD,CACL,GAAIhR,GAAIO,EAAQ2R,eAAe,GAE3B5U,EAAIgV,EACJC,EAAoB,MAAfD,EAAqB,IAAM,IAChCE,EAAKxE,KAAKC,IAAIjO,EAAE,SAAW1C,GAAK4B,KAAKiR,QAAQ7S,IAC7CmV,EAAMzE,KAAKC,IAAIjO,EAAE,SAAWuS,GAAMrT,KAAKiR,QAAQoC,GAGnDvB,GAAMwB,GAAMC,EAEd,MAAOzB,KAGX0B,UAAW,SAASC,EAAM5M,GACxB,IAAK,GAA4B/F,GAAxBY,EAAI,EAAGgH,EAAI+K,EAAK9R,OAAe+G,EAAJhH,IAAUZ,EAAI2S,EAAK/R,IAAKA,IAC1D,GAAIZ,EAAEiQ,aAAelK,EACnB,OAAO,GAUb6M,cAAe,SAASrS,GACtB,GAAI0R,GAAK1R,EAAQsS,OAGjB,IAAI/L,EAAWrB,YAAcwM,EAAGpR,OAAQ,CACtC,GAAIU,KACJuF,GAAW7D,QAAQ,SAAS6P,EAAOC,GAIjC,GAAY,IAARA,IAAc7T,KAAKwT,UAAUT,EAAIc,EAAM,GAAI,CAC7C,GAAItO,GAAIqO,CACRvR,GAAE5B,KAAK8E,KAERvF,MACHqC,EAAE0B,QAAQ,SAASwB,GACjBvF,KAAKkJ,OAAO3D,GACZqC,EAAWZ,OAAOzB,EAAEG,eAI1BoO,WAAY,SAASzS,GACnBrB,KAAK0T,cAAcrS,GACnBrB,KAAKgR,gBAAgB3P,EAAQ2R,eAAe,IAC5ChT,KAAK+T,gBAAgB1S,GAChBrB,KAAKoR,YACRpR,KAAKyR,aACLzR,KAAK6S,eAAexR,EAASrB,KAAK4I,QAGtCA,KAAM,SAAS2I,GACb5J,EAAWiB,KAAK2I,IAElByC,UAAW,SAAS3S,GAClB,GAAIwO,EACF7P,KAAK6S,eAAexR,EAASrB,KAAK8I,UAElC,IAAK9I,KAAKoR,WAQH,GAAIpR,KAAKiR,QAAS,CACvB,GAAInQ,GAAIO,EAAQ2R,eAAe,GAC3BnE,EAAK/N,EAAEQ,QAAUtB,KAAKiR,QAAQC,EAC9BlC,EAAKlO,EAAES,QAAUvB,KAAKiR,QAAQE,EAC9B8C,EAAKnF,KAAKoF,KAAKrF,EAAKA,EAAKG,EAAKA,EAC9BiF,IAAMtE,IACR3P,KAAKmU,YAAY9S,GACjBrB,KAAKoR,WAAY,EACjBpR,KAAKiR,QAAU,WAfM,QAAnBjR,KAAKoR,WAAsBpR,KAAKmT,aAAa9R,GAC/CrB,KAAKoR,WAAY,GAEjBpR,KAAKoR,WAAY,EACjB/P,EAAQ4I,iBACRjK,KAAK6S,eAAexR,EAASrB,KAAK8I,QAe1CA,KAAM,SAASyI,GACb5J,EAAWmB,KAAKyI,IAElB6C,SAAU,SAAS/S,GACjBrB,KAAK+T,gBAAgB1S,GACrBrB,KAAK6S,eAAexR,EAASrB,KAAKiJ,KAEpCA,GAAI,SAASsI,GACXA,EAAUjC,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWmQ,IACtD5J,EAAWsB,GAAGsI,IAEhBrI,OAAQ,SAASqI,GACf5J,EAAWuB,OAAOqI,IAEpB4C,YAAa,SAAS9S,GACpBA,EAAQ4R,SAAU,EAClBjT,KAAK6S,eAAexR,EAASrB,KAAKkJ,SAEpCgK,eAAgB,SAAS3B,GACvB3J,EAAW,UAAU2J,EAAU7L,WAC/B1F,KAAKsR,qBAAqBC,IAG5BwC,gBAAiB,SAAS1S,GACxB,GAAIuN,GAAMvQ,EAAMkQ,YAAYG,YACxB5N,EAAIO,EAAQ2R,eAAe,EAE/B,IAAIhT,KAAK6Q,eAAe/P,GAAI,CAE1B,GAAIuT,IAAMzT,EAAGE,EAAEQ,QAAST,EAAGC,EAAES,QAC7BqN,GAAInO,KAAK4T,EACT,IAAI/K,GAAK,SAAUsF,EAAKyF,GACtB,GAAI3S,GAAIkN,EAAI9H,QAAQuN,EAChB3S,GAAI,IACNkN,EAAI3H,OAAOvF,EAAG,IAEfyB,KAAK,KAAMyL,EAAKyF,EACnB1C,YAAWrI,EAAImG,KAKhBI,KACHL,EAAY,GAAInR,GAAMwM,UAAUiF,EAAYC,aAAcD,EAAYK,eAAgBL,EAAY/C,eAAgB+C,IAGpHzR,EAAMyR,YAAcA,GACnBjS,OAAOC,iBCrVV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WACxB0M,EAAkBzW,OAAO0W,gBAAwE,gBAA/C1W,QAAO0W,eAAeC,qBACxEC,GACFnM,QACE,gBACA,gBACA,cACA,mBAEFE,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCoM,eACE,GACA,cACA,QACA,MACA,SAEFzF,aAAc,SAAS5N,GACrB,GAAIwD,GAAIxD,CAMR,OALAwD,GAAI8C,EAAWwC,WAAW9I,GACtBiT,IACFzP,EAAEkB,YAAc/F,KAAK0U,cAAcrT,EAAQ0E,cAE7ClB,EAAEqB,QAAU,KACLrB,GAET8P,QAAS,SAAS3C,GAChBpK,EAAW,UAAUoK,IAEvB4C,cAAe,SAASvT,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAIvF,EAAQqE,UAAWb,EAAErF,QACpCmI,EAAWiB,KAAK/D,IAElBgQ,cAAe,SAASxT,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWmB,KAAKjE,IAElBiQ,YAAa,SAASzT,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWsB,GAAGpE,GACd7E,KAAK2U,QAAQtT,EAAQqE,YAEvBqP,gBAAiB,SAAS1T,GACxB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWuB,OAAOrE,GAClB7E,KAAK2U,QAAQtT,EAAQqE,YAIzBrH,GAAMoW,SAAWA,GAChB5W,OAAOC,iBCnEV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBC,EAAaD,EAAWC,WACxBoN,GACF1M,QACE,cACA,cACA,YACA,iBAEF2G,aAAc,SAAS5N,GACrB,GAAIwD,GAAI8C,EAAWwC,WAAW9I,EAE9B,OADAwD,GAAEqB,QAAU,UACLrB,GAET2D,SAAU,SAAShJ,GACbA,IAAWhB,UAGfmJ,EAAW4B,OAAO/J,EAAQQ,KAAKsI,SAEjCK,WAAY,SAASnJ,GACnBmI,EAAW8B,SAASjK,EAAQQ,KAAKsI,SAEnCqM,QAAS,SAAS3C,GAChBpK,EAAW,UAAUoK,IAEvBiD,YAAa,SAAS5T,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASnB,EAAMH,KAAKG,EAAM+C,WAAWC,IACvCuG,EAAWhB,IAAI/B,EAAEa,UAAWb,EAAErF,QAC9BmI,EAAWiB,KAAK/D,IAElBqQ,YAAa,SAAS7T,GACpB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWmB,KAAKjE,IAElBsQ,UAAW,SAAS9T,GAClB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWsB,GAAGpE,GACd7E,KAAK2U,QAAQtT,EAAQqE,YAEvB0P,cAAe,SAAS/T,GACtB,GAAIwD,GAAI7E,KAAKiP,aAAa5N,EAC1BwD,GAAEyK,cAAgBjR,EAAMH,KAAKG,EAAM+C,WAAWC,IAC9CwD,EAAErF,OAASoI,EAAWV,IAAIrC,EAAEa,WAC5BiC,EAAWuB,OAAOrE,GAClB7E,KAAK2U,QAAQtT,EAAQqE,YAIzBrH,GAAM2W,cAAgBA,GACrBnX,OAAOC,iBClDV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,UAEnB9J,QAAOwX,aACT1N,EAAWO,eAAe,UAAW7J,EAAM2W,eAClCnX,OAAOyX,UAAUC,iBAC1B5N,EAAWO,eAAe,KAAM7J,EAAMoW,WAEtC9M,EAAWO,eAAe,QAAS7J,EAAMkQ,aACb6B,SAAxBvS,OAAO2X,cACT7N,EAAWO,eAAe,QAAS7J,EAAMyR,cAI7CnI,EAAWa,SAAShK,WACnBX,OAAOC,iBC4ET,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBoD,EAAa,GAAIvJ,GAAM8H,WACvBsP,GACFnN,QACE,OACA,OACA,MAEFoN,iBAAkB,EAClBC,SAAU,SAASC,GACjB,MAAOA,GAAU,EAAI,EAAI,IAE3BC,kBAAmB,SAASC,EAAKC,GAC/B,GAAInV,GAAI,EAAGC,EAAI,CAKf,OAJIiV,IAAOC,IACTnV,EAAImV,EAAIC,MAAQF,EAAIE,MACpBnV,EAAIkV,EAAIE,MAAQH,EAAIG,QAEdrV,EAAGA,EAAGC,EAAGA,IAEnBqV,UAAW,SAASvR,EAAQtD,EAAS8U,GACnC,GAAIrV,GAAIqV,EACJ9T,EAAIrC,KAAK6V,kBAAkB/U,EAAEsV,UAAW/U,GACxC4S,EAAKjU,KAAK6V,kBAAkB/U,EAAEuV,cAAehV,EAC7C4S,GAAGrT,IACLE,EAAEwV,WAAatW,KAAK2V,SAAS1B,EAAGrT,IAE9BqT,EAAGpT,IACLC,EAAEyV,WAAavW,KAAK2V,SAAS1B,EAAGpT,GAElC,IAAIgE,GAAIL,EAAaS,iBAAiBN,GACpCxF,SAAS,EACT6F,YAAY,EACZ6J,GAAIxM,EAAEzB,EACNoO,GAAI3M,EAAExB,EACN2V,IAAKvC,EAAGrT,EACR6V,IAAKxC,EAAGpT,EACRD,EAAGS,EAAQT,EACXC,EAAGQ,EAAQR,EACXS,QAASD,EAAQC,QACjBC,QAASF,EAAQE,QACjByU,MAAO3U,EAAQ2U,MACfC,MAAO5U,EAAQ4U,MACfS,QAASrV,EAAQqV,QACjBC,QAAStV,EAAQsV,QACjBL,WAAYxV,EAAEwV,WACdC,WAAYzV,EAAEyV,WACdK,UAAW9V,EAAE8V,UACbtH,cAAejO,EAAQiO,cACvBvJ,YAAa1E,EAAQ0E,YACrBL,UAAWrE,EAAQqE,UACnBQ,QAAS,SAEXpF,GAAE+V,WAAWxX,cAAcwF,IAE7B+D,KAAM,SAASvH,GACb,GAAIA,EAAQ4E,YAAsC,UAAxB5E,EAAQ0E,YAA8C,IAApB1E,EAAQmE,SAAgB,GAAO,CACzF,GAAID,IACF6Q,UAAW/U,EACXwV,WAAYxV,EAAQ7B,OACpBoX,aACAP,cAAe,KACfC,WAAY,EACZC,WAAY,EACZO,UAAU,EAEZlP,GAAWhB,IAAIvF,EAAQqE,UAAWH,KAGtCuD,KAAM,SAASzH,GACb,GAAIkE,GAAIqC,EAAWV,IAAI7F,EAAQqE,UAC/B,IAAIH,EAAG,CACL,GAAKA,EAAEuR,SAUL9W,KAAKkW,UAAU,QAAS7U,EAASkE,OAVlB,CACf,GAAIlD,GAAIrC,KAAK6V,kBAAkBtQ,EAAE6Q,UAAW/U,GACxCyH,EAAOzG,EAAEzB,EAAIyB,EAAEzB,EAAIyB,EAAExB,EAAIwB,EAAExB,CAE3BiI,GAAO9I,KAAK0V,mBACdnQ,EAAEuR,UAAW,EACb9W,KAAKkW,UAAU,aAAc3Q,EAAE6Q,UAAW7Q,GAC1CvF,KAAKkW,UAAU,QAAS7U,EAASkE,IAKrCA,EAAE8Q,cAAgBhV,IAGtB4H,GAAI,SAAS5H,GACX,GAAIkE,GAAIqC,EAAWV,IAAI7F,EAAQqE,UAC3BH,KACEA,EAAEuR,UACJ9W,KAAKkW,UAAU,WAAY7U,EAASkE,GAEtCqC,EAAWZ,OAAO3F,EAAQqE,aAIhCiC,GAAWY,gBAAgB,QAASkN,IACnC5X,OAAOC,iBCxJX,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBuS,GAEFC,WAAY,IAEZtB,iBAAkB,GAClBpN,QACE,OACA,OACA,MAEF2O,YAAa,KACbC,QAAS,KACTC,MAAO,WACL,GAAIJ,GAAOK,KAAKC,MAAQrX,KAAKiX,YAAYK,UACrCvO,EAAO/I,KAAKuX,KAAO,YAAc,MACrCvX,MAAKwX,SAASzO,EAAMgO,GACpB/W,KAAKuX,MAAO,GAEdrO,OAAQ,WACNuO,cAAczX,KAAKkX,SACflX,KAAKuX,MACPvX,KAAKwX,SAAS,WAEhBxX,KAAKuX,MAAO,EACZvX,KAAKiX,YAAc,KACnBjX,KAAKR,OAAS,KACdQ,KAAKkX,QAAU,MAEjBtO,KAAM,SAASvH,GACTA,EAAQ4E,YAAcjG,KAAKiX,cAC7BjX,KAAKiX,YAAc5V,EACnBrB,KAAKR,OAAS6B,EAAQ7B,OACtBQ,KAAKkX,QAAUQ,YAAY1X,KAAKmX,MAAMhU,KAAKnD,MAAOA,KAAKgX,cAG3D/N,GAAI,SAAS5H,GACPrB,KAAKiX,aAAejX,KAAKiX,YAAYvR,YAAcrE,EAAQqE,WAC7D1F,KAAKkJ,UAGTJ,KAAM,SAASzH,GACb,GAAIrB,KAAKiX,aAAejX,KAAKiX,YAAYvR,YAAcrE,EAAQqE,UAAW,CACxE,GAAI9E,GAAIS,EAAQC,QAAUtB,KAAKiX,YAAY3V,QACvCT,EAAIQ,EAAQE,QAAUvB,KAAKiX,YAAY1V,OACtCX,GAAIA,EAAIC,EAAIA,EAAKb,KAAK0V,kBACzB1V,KAAKkJ,WAIXsO,SAAU,SAAS7S,EAAQgT,GACzB,GAAIpS,IACFpG,SAAS,EACT6F,YAAY,EACZe,YAAa/F,KAAKiX,YAAYlR,YAC9BL,UAAW1F,KAAKiX,YAAYvR,UAC5B9E,EAAGZ,KAAKiX,YAAY3V,QACpBT,EAAGb,KAAKiX,YAAY1V,QACpB2E,QAAS,OAEPyR,KACFpS,EAAEqS,SAAWD,EAEf,IAAI9S,GAAIL,EAAaS,iBAAiBN,EAAQY,EAC9CvF,MAAKR,OAAOH,cAAcwF,IAG9B8C,GAAWY,gBAAgB,OAAQwO,IAClClZ,OAAOC,iBCrFV,SAAUO,GACR,GAAIsJ,GAAatJ,EAAMsJ,WACnBnD,EAAenG,EAAMmG,aACrBoD,EAAa,GAAIvJ,GAAM8H,WACvB0R,GACFvP,QACE,OACA,MAEFM,KAAM,SAASvH,GACTA,EAAQ4E,YAAc5E,EAAQ8H,cAChCvB,EAAWhB,IAAIvF,EAAQqE,WACrBlG,OAAQ6B,EAAQ7B,OAChBgG,QAASnE,EAAQmE,QACjB5E,EAAGS,EAAQC,QACXT,EAAGQ,EAAQE,WAIjBuW,UAAW,SAASjT,EAAGkT,GACrB,MAAsB,UAAlBlT,EAAEkB,YAEyB,IAAtBgS,EAAUvS,SAEXX,EAAEsE,cAEZF,GAAI,SAAS5H,GACX,GAAI2W,GAAQpQ,EAAWV,IAAI7F,EAAQqE,UACnC,IAAIsS,GAAShY,KAAK8X,UAAUzW,EAAS2W,GAAQ,CAE3C,GAAIlX,GAAIzC,EAAM6E,cAAcnB,IAAIiW,EAAMxY,OAAQ6B,EAAQiO,cACtD,IAAIxO,EAAG,CACL,GAAI+D,GAAIL,EAAaS,iBAAiB,OACpC9F,SAAS,EACT6F,YAAY,EACZpE,EAAGS,EAAQC,QACXT,EAAGQ,EAAQE,QACX8Q,OAAQhR,EAAQgR,OAChBtM,YAAa1E,EAAQ0E,YACrBL,UAAWrE,EAAQqE,UACnBuS,OAAQ5W,EAAQ4W,OAChBC,QAAS7W,EAAQ6W,QACjBC,QAAS9W,EAAQ8W,QACjBC,SAAU/W,EAAQ+W,SAClBlS,QAAS,OAEXpF,GAAEzB,cAAcwF,IAGpB+C,EAAWZ,OAAO3F,EAAQqE,YAI9BlB,GAAaC,WAAa,SAASI,GACjC,MAAO,YACLA,EAAEsE,cAAe,EACjBvB,EAAWZ,OAAOnC,EAAEa,aAGxBiC,EAAWY,gBAAgB,MAAOsP,IACjCha,OAAOC,iBClEV,SAAWua,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,yGAAyG7R,QAAQ7C,OAAO4U,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,GAAUjH,GACf,MAAe,SAAPA,EAKZ,QAASkH,KACL,KAAevX,EAARwX,GAAkBP,EAAaxQ,EAAOgR,WAAWD,OACnDA,EAIT,QAASE,KACL,GAAIrB,GAAOW,CAGX,KADAX,EAAQmB,IACOxX,EAARwX,IACHR,EAAKvQ,EAAOgR,WAAWD,GACnBH,EAAiBL,OACfQ,CAMV,OAAO/Q,GAAOsD,MAAMsM,EAAOmB,GAG/B,QAASG,KACL,GAAItB,GAAOhG,EAAIjJ,CAoBf,OAlBAiP,GAAQmB,EAERnH,EAAKqH,IAKDtQ,EADc,IAAdiJ,EAAGrQ,OACI4X,EAAMC,WACNP,EAAUjH,GACVuH,EAAME,QACC,SAAPzH,EACAuH,EAAMG,YACC,SAAP1H,GAAwB,UAAPA,EACjBuH,EAAMI,eAENJ,EAAMC,YAIbzQ,KAAMA,EACN6K,MAAO5B,EACP4H,OAAQ5B,EAAOmB,IAOvB,QAASU,KACL,GAEIC,GAEAC,EAJA/B,EAAQmB,EACRa,EAAO5R,EAAOgR,WAAWD,GAEzBc,EAAM7R,EAAO+Q,EAGjB,QAAQa,GAGR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KACL,IAAK,KACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IAED,QADEb,GAEEpQ,KAAMwQ,EAAMW,WACZtG,MAAO3P,OAAO4U,aAAamB,GAC3BJ,OAAQ5B,EAAOmB,GAGvB,SAII,GAHAW,EAAQ1R,EAAOgR,WAAWD,EAAQ,GAGpB,KAAVW,EACA,OAAQE,GACR,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,IACL,IAAK,KAED,MADAb,IAAS,GAELpQ,KAAMwQ,EAAMW,WACZtG,MAAO3P,OAAO4U,aAAamB,GAAQ/V,OAAO4U,aAAaiB,GACvDF,OAAQ5B,EAAOmB,GAGvB,KAAK,IACL,IAAK,IAOD,MANAA,IAAS,EAGwB,KAA7B/Q,EAAOgR,WAAWD,MAChBA,GAGFpQ,KAAMwQ,EAAMW,WACZtG,MAAOxL,EAAOsD,MAAMsM,EAAOmB,GAC3BS,OAAQ5B,EAAOmB,KAe/B,MAJAY,GAAM3R,EAAO+Q,EAAQ,GAIjBc,IAAQF,GAAQ,KAAKjT,QAAQmT,IAAQ,GACrCd,GAAS,GAELpQ,KAAMwQ,EAAMW,WACZtG,MAAOqG,EAAMF,EACbH,OAAQ5B,EAAOmB,KAInB,eAAerS,QAAQmT,IAAQ,KAC7Bd,GAEEpQ,KAAMwQ,EAAMW,WACZtG,MAAOqG,EACPL,OAAQ5B,EAAOmB,SAIvBgB,MAAeC,EAASC,gBAAiB,WAI7C,QAASC,KACL,GAAIC,GAAQvC,EAAOW,CAQnB,IANAA,EAAKvQ,EAAO+Q,GACZb,EAAOI,EAAeC,EAAGS,WAAW,KAAe,MAAPT,EACxC,sEAEJX,EAAQmB,EACRoB,EAAS,GACE,MAAP5B,EAAY,CAaZ,IAZA4B,EAASnS,EAAO+Q,KAChBR,EAAKvQ,EAAO+Q,GAIG,MAAXoB,GAEI5B,GAAMD,EAAeC,EAAGS,WAAW,KACnCe,KAAeC,EAASC,gBAAiB,WAI1C3B,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,IAErBR,GAAKvQ,EAAO+Q,GAGhB,GAAW,MAAPR,EAAY,CAEZ,IADA4B,GAAUnS,EAAO+Q,KACVT,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,IAErBR,GAAKvQ,EAAO+Q,GAGhB,GAAW,MAAPR,GAAqB,MAAPA,EAOd,GANA4B,GAAUnS,EAAO+Q,KAEjBR,EAAKvQ,EAAO+Q,IACD,MAAPR,GAAqB,MAAPA,KACd4B,GAAUnS,EAAO+Q,MAEjBT,EAAetQ,EAAOgR,WAAWD,IACjC,KAAOT,EAAetQ,EAAOgR,WAAWD,KACpCoB,GAAUnS,EAAO+Q,SAGrBgB,MAAeC,EAASC,gBAAiB,UAQjD,OAJItB,GAAkB3Q,EAAOgR,WAAWD,KACpCgB,KAAeC,EAASC,gBAAiB,YAIzCtR,KAAMwQ,EAAMiB,eACZ5G,MAAO6G,WAAWF,GAClBX,OAAQ5B,EAAOmB,IAMvB,QAASuB,KACL,GAAcC,GAAO3C,EAAOW,EAAxBiC,EAAM,GAAsBC,GAAQ,CASxC,KAPAF,EAAQvS,EAAO+Q,GACfb,EAAkB,MAAVqC,GAA4B,MAAVA,EACtB,2CAEJ3C,EAAQmB,IACNA,EAEaxX,EAARwX,GAAgB,CAGnB,GAFAR,EAAKvQ,EAAO+Q,KAERR,IAAOgC,EAAO,CACdA,EAAQ,EACR,OACG,GAAW,OAAPhC,EAEP,GADAA,EAAKvQ,EAAO+Q,KACPR,GAAOG,EAAiBH,EAAGS,WAAW,IA0B3B,OAART,GAAkC,OAAlBvQ,EAAO+Q,MACrBA,MA1BN,QAAQR,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,EAAGS,WAAW,IACtC,KAEAwB,IAAOjC,GAQf,MAJc,KAAVgC,GACAR,KAAeC,EAASC,gBAAiB,YAIzCtR,KAAMwQ,EAAMuB,cACZlH,MAAOgH,EACPC,MAAOA,EACPjB,OAAQ5B,EAAOmB,IAIvB,QAAS4B,GAAiBC,GACtB,MAAOA,GAAMjS,OAASwQ,EAAMC,YACxBwB,EAAMjS,OAASwQ,EAAME,SACrBuB,EAAMjS,OAASwQ,EAAMI,gBACrBqB,EAAMjS,OAASwQ,EAAMG,YAG7B,QAASuB,KACL,GAAItC,EAIJ,OAFAO,KAEIC,GAASxX,GAELoH,KAAMwQ,EAAM2B,IACZtB,OAAQT,EAAOA,KAIvBR,EAAKvQ,EAAOgR,WAAWD,GAGZ,KAAPR,GAAoB,KAAPA,GAAoB,KAAPA,EACnBkB,IAIA,KAAPlB,GAAoB,KAAPA,EACN+B,IAGP3B,EAAkBJ,GACXW,IAKA,KAAPX,EACID,EAAetQ,EAAOgR,WAAWD,EAAQ,IAClCmB,IAEJT,IAGPnB,EAAeC,GACR2B,IAGJT,KAGX,QAASsB,KACL,GAAIH,EASJ,OAPAA,GAAQI,EACRjC,EAAQ6B,EAAMpB,MAAM,GAEpBwB,EAAYH,IAEZ9B,EAAQ6B,EAAMpB,MAAM,GAEboB,EAGX,QAASK,KACL,GAAIC,EAEJA,GAAMnC,EACNiC,EAAYH,IACZ9B,EAAQmC,EAKZ,QAASnB,GAAWa,EAAOO,GACvB,GAAIC,GACAC,EAAOjQ,MAAM9E,UAAUgF,MAAMpE,KAAKoU,UAAW,GAC7CC,EAAMJ,EAAcK,QAChB,SACA,SAAUC,EAAO1C,GAEb,MADAb,GAAOa,EAAQsC,EAAK9Z,OAAQ,sCACrB8Z,EAAKtC,IAOxB,MAHAqC,GAAQ,GAAI/C,OAAMkD,GAClBH,EAAMrC,MAAQA,EACdqC,EAAMM,YAAcH,EACdH,EAKV,QAASO,GAAgBf,GACrBb,EAAWa,EAAOZ,EAASC,gBAAiBW,EAAMpH,OAMtD,QAASoI,GAAOpI,GACZ,GAAIoH,GAAQG,KACRH,EAAMjS,OAASwQ,EAAMW,YAAcc,EAAMpH,QAAUA,IACnDmI,EAAgBf,GAMxB,QAASiB,GAAMrI,GACX,MAAOwH,GAAUrS,OAASwQ,EAAMW,YAAckB,EAAUxH,QAAUA,EAKtE,QAASsI,GAAaC,GAClB,MAAOf,GAAUrS,OAASwQ,EAAME,SAAW2B,EAAUxH,QAAUuI,EAwBnE,QAASC,KACL,GAAIC,KAIJ,KAFAL,EAAO,MAECC,EAAM,MACNA,EAAM,MACNd,IACAkB,EAAS5b,KAAK,QAEd4b,EAAS5b,KAAK6b,MAETL,EAAM,MACPD,EAAO,KAOnB,OAFAA,GAAO,KAEAO,EAASC,sBAAsBH,GAK1C,QAASI,KACL,GAAIzB,EAOJ,OALA9B,KACA8B,EAAQG,IAIJH,EAAMjS,OAASwQ,EAAMuB,eAAiBE,EAAMjS,OAASwQ,EAAMiB,eACpD+B,EAASG,cAAc1B,GAG3BuB,EAASI,iBAAiB3B,EAAMpH,OAG3C,QAASgJ,KACL,GAAI5B,GAAOnH,CAWX,OATAmH,GAAQI,EACRlC,KAEI8B,EAAMjS,OAASwQ,EAAM2B,KAAOF,EAAMjS,OAASwQ,EAAMW,aACjD6B,EAAgBf,GAGpBnH,EAAM4I,IACNT,EAAO,KACAO,EAASM,eAAe,OAAQhJ,EAAKyI,MAGhD,QAASQ,KACL,GAAIC,KAIJ,KAFAf,EAAO,MAECC,EAAM,MACVc,EAAWtc,KAAKmc,KAEXX,EAAM,MACPD,EAAO,IAMf,OAFAA,GAAO,KAEAO,EAASS,uBAAuBD,GAK3C,QAASE,KACL,GAAIC,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAMX,QAASC,KACL,GAAIpU,GAAMiS,EAAOkC,CAEjB,OAAIjB,GAAM,KACCgB,KAGXlU,EAAOqS,EAAUrS,KAEbA,IAASwQ,EAAMC,WACf0D,EAAOX,EAASI,iBAAiBxB,IAAMvH,OAChC7K,IAASwQ,EAAMuB,eAAiB/R,IAASwQ,EAAMiB,eACtD0C,EAAOX,EAASG,cAAcvB,KACvBpS,IAASwQ,EAAME,QAClByC,EAAa,UACbf,IACA+B,EAAOX,EAASa,wBAEbrU,IAASwQ,EAAMI,gBACtBqB,EAAQG,IACRH,EAAMpH,MAAyB,SAAhBoH,EAAMpH,MACrBsJ,EAAOX,EAASG,cAAc1B,IACvBjS,IAASwQ,EAAMG,aACtBsB,EAAQG,IACRH,EAAMpH,MAAQ,KACdsJ,EAAOX,EAASG,cAAc1B,IACvBiB,EAAM,KACbiB,EAAOd,IACAH,EAAM,OACbiB,EAAOJ,KAGPI,EACOA,MAGXnB,GAAgBZ,MAKpB,QAASkC,KACL,GAAI5B,KAIJ,IAFAO,EAAO,MAEFC,EAAM,KACP,KAAeta,EAARwX,IACHsC,EAAKhb,KAAK6b,OACNL,EAAM,OAGVD,EAAO,IAMf,OAFAA,GAAO,KAEAP,EAGX,QAAS6B,KACL,GAAItC,EAQJ,OANAA,GAAQG,IAEHJ,EAAiBC,IAClBe,EAAgBf,GAGbuB,EAASI,iBAAiB3B,EAAMpH,OAG3C,QAAS2J,KAGL,MAFAvB,GAAO,KAEAsB,IAGX,QAASE,KACL,GAAIN,EAQJ,OANAlB,GAAO,KAEPkB,EAAOZ,KAEPN,EAAO,KAEAkB,EAGX,QAASO,KACL,GAAIP,GAAMzB,EAAMiC,CAIhB,KAFAR,EAAOC,MAGH,GAAIlB,EAAM,KACNyB,EAAWF,IACXN,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,IAAIzB,EAAM,KACbyB,EAAWH,IACXL,EAAOX,EAASoB,uBAAuB,IAAKT,EAAMQ,OAC/C,CAAA,IAAIzB,EAAM,KAIb,KAHAR,GAAO4B,IACPH,EAAOX,EAASqB,qBAAqBV,EAAMzB,GAMnD,MAAOyB,GASX,QAASW,KACL,GAAI7C,GAAOkC,CAcX,OAZI9B,GAAUrS,OAASwQ,EAAMW,YAAckB,EAAUrS,OAASwQ,EAAME,QAChEyD,EAAOY,KACA7B,EAAM,MAAQA,EAAM,MAAQA,EAAM,MACzCjB,EAAQG,IACR+B,EAAOW,IACPX,EAAOX,EAASwB,sBAAsB/C,EAAMpH,MAAOsJ,IAC5ChB,EAAa,WAAaA,EAAa,SAAWA,EAAa,UACtE/B,KAAeC,EAASC,iBAExB6C,EAAOY,KAGJZ,EAGX,QAASc,GAAiBhD,GACtB,GAAIiD,GAAO,CAEX,IAAIjD,EAAMjS,OAASwQ,EAAMW,YAAcc,EAAMjS,OAASwQ,EAAME,QACxD,MAAO,EAGX,QAAQuB,EAAMpH,OACd,IAAK,KACDqK,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,GAAMlC,EAAOiD,EAAME,EAAOpb,EAAOqb,EAAUtb,EAAMpB,CAMrD,IAJAoB,EAAO+a,IAEP7C,EAAQI,EACR6C,EAAOD,EAAiBhD,GACX,IAATiD,EACA,MAAOnb,EASX,KAPAkY,EAAMiD,KAAOA,EACb9C,IAEApY,EAAQ8a,IAERM,GAASrb,EAAMkY,EAAOjY,IAEdkb,EAAOD,EAAiB5C,IAAc,GAAG,CAG7C,KAAQ+C,EAAMxc,OAAS,GAAOsc,GAAQE,EAAMA,EAAMxc,OAAS,GAAGsc,MAC1Dlb,EAAQob,EAAME,MACdD,EAAWD,EAAME,MAAMzK,MACvB9Q,EAAOqb,EAAME,MACbnB,EAAOX,EAAS+B,uBAAuBF,EAAUtb,EAAMC,GACvDob,EAAM1d,KAAKyc,EAIflC,GAAQG,IACRH,EAAMiD,KAAOA,EACbE,EAAM1d,KAAKua,GACXkC,EAAOW,IACPM,EAAM1d,KAAKyc,GAMf,IAFAxb,EAAIyc,EAAMxc,OAAS,EACnBub,EAAOiB,EAAMzc,GACNA,EAAI,GACPwb,EAAOX,EAAS+B,uBAAuBH,EAAMzc,EAAI,GAAGkS,MAAOuK,EAAMzc,EAAI,GAAIwb,GACzExb,GAAK,CAGT,OAAOwb,GAMX,QAASqB,KACL,GAAIrB,GAAMsB,EAAYC,CAatB,OAXAvB,GAAOgB,IAEHjC,EAAM,OACNd,IACAqD,EAAaD,IACbvC,EAAO,KACPyC,EAAYF,IAEZrB,EAAOX,EAASmC,4BAA4BxB,EAAMsB,EAAYC,IAG3DvB,EAaX,QAASyB,KACL,GAAI5N,GAAY0K,CAUhB,OARA1K,GAAaoK,IAETpK,EAAWhI,OAASwQ,EAAMC,YAC1BuC,EAAgBhL,GAGpB0K,EAAOQ,EAAM,KAAOoB,OAEbd,EAASqC,aAAa7N,EAAW6C,MAAO6H,GAOnD,QAASoD,KACL,KAAO5C,EAAM,MACTd,IACAwD,IAqBR,QAASG,KACL5F,IACAmC,GAEA,IAAI6B,GAAOZ,IACPY,KACwB,MAApB9B,EAAUxH,OAAoC,MAAnBwH,EAAUxH,OAC9BsJ,EAAKnU,OAASgW,EAAOvF,WAC5BwF,EAAkB9B,IAElB2B,IACwB,OAApBzD,EAAUxH,MACVqL,EAAkB/B,GAElBX,EAAS2C,eAAehC,KAKhC9B,EAAUrS,OAASwQ,EAAM2B,KACzBa,EAAgBX,GAIxB,QAAS6D,GAAkB/B,GACvB/B,GACA,IAAIpK,GAAaoK,IAAMvH,KACvB2I,GAAS4C,mBAAmBjC,EAAMnM,GAGtC,QAASiO,GAAkBjO,GACvB,GAAIqO,EACoB,OAApBhE,EAAUxH,QACVuH,IACIC,EAAUrS,OAASwQ,EAAMC,YACzBuC,EAAgBX,GACpBgE,EAAYjE,IAAMvH,OAGtBuH,GACA,IAAI+B,GAAOZ,IACXuC,KACAtC,EAAS8C,mBAAmBtO,EAAW5I,KAAMiX,EAAWlC,GAG5D,QAASoC,GAAMtF,EAAMuF,GAUjB,MATAhD,GAAWgD,EACXnX,EAAS4R,EACTb,EAAQ,EACRxX,EAASyG,EAAOzG,OAChByZ,EAAY,KACZoE,GACIC,aAGGX,IAx+BX,GAAIvF,GACAmG,EACAX,EACA3E,EACAhS,EACA+Q,EACAxX,EACA4a,EACAnB,EACAoE,CAEJjG,IACII,eAAgB,EAChBuB,IAAK,EACL1B,WAAY,EACZC,QAAS,EACTC,YAAa,EACbc,eAAgB,EAChBN,WAAY,EACZY,cAAe,GAGnB4E,KACAA,EAAUnG,EAAMI,gBAAkB,UAClC+F,EAAUnG,EAAM2B,KAAO,QACvBwE,EAAUnG,EAAMC,YAAc,aAC9BkG,EAAUnG,EAAME,SAAW,UAC3BiG,EAAUnG,EAAMG,aAAe,OAC/BgG,EAAUnG,EAAMiB,gBAAkB,UAClCkF,EAAUnG,EAAMW,YAAc,aAC9BwF,EAAUnG,EAAMuB,eAAiB,SAEjCiE,GACIY,gBAAiB,kBACjBC,iBAAkB,mBAClBC,eAAgB,iBAChBC,sBAAuB,wBACvBC,eAAgB,iBAChBC,oBAAqB,sBACrBxG,WAAY,aACZyG,QAAS,UACTC,iBAAkB,mBAClBC,kBAAmB,oBACnBC,iBAAkB,mBAClBC,iBAAkB,mBAClBC,QAAS,UACTC,SAAU,WACVC,eAAgB,iBAChBC,gBAAiB,mBAIrBrG,GACIC,gBAAkB,sBAClBqG,aAAc,uBACdC,cAAe,oCAgrBnB,IAAI7C,IAAyBL,EAuJzBnB,GAAkBiC,CA6GtBlG,GAAOuI,SACHtB,MAAOA,IAEZtf,MC1gCH,SAAWqY,GACT,YAEA,SAASwI,GAAeC,EAAgB3Y,EAAMxF,EAAMoe,GAClD,GAAIC,EACJ,KAEE,GADAA,EAAaC,EAAcH,GACvBE,EAAWE,aACVve,EAAK3B,WAAaC,KAAKqM,cACN,aAAjB3K,EAAKwe,SACK,SAAThZ,GAA4B,WAATA,GACvB,KAAMsQ,OAAM,4DAEd,MAAO2I,GAEP,WADAnT,SAAQuN,MAAM,8BAAgCsF,EAAgBM,GAIhE,MAAO,UAASC,EAAO1e,EAAM2e,GAC3B,GAAIC,GAAUP,EAAWQ,WAAWH,EAAON,EAAgBO,EAO3D,OANIN,GAAWE,YAAcK,IAC3B5e,EAAK8e,6BAA+BT,EAAWE,WAC3CF,EAAWU,aACb/e,EAAKgf,6BAA+BX,EAAWU,aAG5CH,GAOX,QAASN,GAAcH,GACrB,GAAIE,GAAaY,EAAqBd,EACtC,KAAKE,EAAY,CACf,GAAIzE,GAAW,GAAIsF,EACnBjB,SAAQtB,MAAMwB,EAAgBvE,GAC9ByE,EAAa,GAAIc,GAAWvF,GAC5BqF,EAAqBd,GAAkBE,EAEzC,MAAOA,GAGT,QAASf,GAAQrM,GACf5T,KAAK4T,MAAQA,EACb5T,KAAK+hB,SAAW3R,OAgBlB,QAAS4R,GAAU7Z,GACjBnI,KAAKmI,KAAOA,EACZnI,KAAKhB,KAAOijB,KAAK/a,IAAIiB,GA2BvB,QAASiY,GAAiB8B,EAAQxE,EAAUyE,GAC1CniB,KAAKoiB,SAAuB,KAAZD,EAEhBniB,KAAKqiB,YAA+B,kBAAVH,IACPA,EAAOG,aACNriB,KAAKoiB,YAAc1E,YAAoBuC,IAE3DjgB,KAAKsiB,YACAtiB,KAAKqiB,cACL3E,YAAoBsE,IAAatE,YAAoBuC,MACrDiC,YAAkB9B,IAAoB8B,YAAkBF,IAE7DhiB,KAAKkiB,OAASliB,KAAKsiB,WAAaJ,EAASK,EAAML,GAC/CliB,KAAK0d,UAAY1d,KAAKoiB,UAAYpiB,KAAKsiB,WACnC5E,EAAW6E,EAAM7E,GAuEvB,QAAS8E,GAAOra,EAAMsT,GACpBzb,KAAKmI,KAAOA,EACZnI,KAAKyb,OACL,KAAK,GAAI/Z,GAAI,EAAGA,EAAI+Z,EAAK9Z,OAAQD,IAC/B1B,KAAKyb,KAAK/Z,GAAK6gB,EAAM9G,EAAK/Z,IA0C9B,QAAS+gB,KAAmB,KAAMhK,OAAM,mBA0BxC,QAAS8J,GAAMG,GACb,MAAqB,kBAAPA,GAAoBA,EAAMA,EAAIC,UAG9C,QAASd,KACP7hB,KAAKghB,WAAa,KAClBhhB,KAAK4iB,WACL5iB,KAAK6iB,QACL7iB,KAAK8iB,YAAc1S,OACnBpQ,KAAKkhB,WAAa9Q,OAClBpQ,KAAK0hB,WAAatR,OAClBpQ,KAAKqiB,aAAc,EA0HrB,QAASU,GAAmBnP,GAC1B5T,KAAKgjB,OAASpP,EAUhB,QAASkO,GAAWvF,GAIlB,GAHAvc,KAAKkhB,WAAa3E,EAAS2E,WAC3BlhB,KAAK0hB,WAAanF,EAASmF,YAEtBnF,EAASyE,WACZ,KAAMvI,OAAM,uBAEdzY,MAAKghB,WAAazE,EAASyE,WAC3BuB,EAAMviB,KAAKghB,YAEXhhB,KAAK4iB,QAAUrG,EAASqG,QACxB5iB,KAAKqiB,YAAc9F,EAAS8F,YAmE9B,QAASY,GAAyB9a,GAChC,MAAOlE,QAAOkE,GAAMyT,QAAQ,SAAU,SAASsH,GAC7C,MAAO,IAAMA,EAAEC,gBASnB,QAASC,GAAU/B,EAAOgC,GACxB,KAAOhC,EAAMiC,KACLpe,OAAOwB,UAAU6c,eAAejc,KAAK+Z,EAAOgC,IAClDhC,EAAQA,EAAMiC,EAGhB,OAAOjC,GAGT,QAASmC,GAAoBC,GAC3B,OAAQA,GACN,IAAK,GACH,OAAO,CAET,KAAK,QACL,IAAK,OACL,IAAK,OACH,OAAO,EAGX,MAAKC,OAAMC,OAAOF,KAGX,GAFE,EAKX,QAASG,MA5dT,GAAIhC,GAAuB1c,OAAOC,OAAO,KAkBzC8a;EAAQvZ,WACNic,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GAAInO,GAAQ5T,KAAK4T,KACjB5T,MAAK+hB,SAAW,WACd,MAAOnO,IAIX,MAAO5T,MAAK+hB,WAShBC,EAAUtb,WACRic,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GACI/iB,IADOgB,KAAKmI,KACLnI,KAAKhB,KAChBgB,MAAK+hB,SAAW,SAASV,EAAO/V,GAI9B,MAHIA,IACFA,EAASuY,QAAQxC,EAAOriB,GAEnBA,EAAK8kB,aAAazC,IAI7B,MAAOrhB,MAAK+hB,UAGdgC,SAAU,SAAS1C,EAAO2C,GAIxB,MAHwB,IAApBhkB,KAAKhB,KAAK2C,OACZ0f,EAAQ+B,EAAU/B,EAAOrhB,KAAKhB,KAAK,IAE9BgB,KAAKhB,KAAKilB,aAAa5C,EAAO2C,KAqBzC5D,EAAiB1Z,WACfwd,GAAIC,YACF,IAAKnkB,KAAKokB,UAAW,CAEnB,GAAIC,GAAQrkB,KAAKkiB,iBAAkB9B,GAC/BpgB,KAAKkiB,OAAOiC,SAASzY,SAAW1L,KAAKkiB,OAAO/Z,KAChDkc,GAAM5jB,KAAKT,KAAK0d,mBAAoBsE,GAChChiB,KAAK0d,SAASvV,KAAOnI,KAAK0d,SAAS9J,OACvC5T,KAAKokB,UAAYnC,KAAK/a,IAAImd,GAG5B,MAAOrkB,MAAKokB,WAGdzB,QAAS,WACP,IAAK3iB,KAAK+hB,SAAU,CAClB,GAAIG,GAASliB,KAAKkiB,MAElB,IAAIliB,KAAKsiB,WAAY,CACnB,GAAItjB,GAAOgB,KAAKmkB,QAEhBnkB,MAAK+hB,SAAW,SAASV,EAAO/V,GAI9B,MAHIA,IACFA,EAASuY,QAAQxC,EAAOriB,GAEnBA,EAAK8kB,aAAazC,QAEtB,IAAKrhB,KAAKoiB,SAWV,CAEL,GAAI1E,GAAW1d,KAAK0d,QAEpB1d,MAAK+hB,SAAW,SAASV,EAAO/V,EAAUyV,GACxC,GAAIuD,GAAUpC,EAAOb,EAAO/V,EAAUyV,GAClCwD,EAAW7G,EAAS2D,EAAO/V,EAAUyV,EAIzC,OAHIzV,IACFA,EAASuY,QAAQS,GAAUC,IAEtBD,EAAUA,EAAQC,GAAYnU,YArBd,CACzB,GAAIpR,GAAOijB,KAAK/a,IAAIlH,KAAK0d,SAASvV,KAElCnI,MAAK+hB,SAAW,SAASV,EAAO/V,EAAUyV,GACxC,GAAIuD,GAAUpC,EAAOb,EAAO/V,EAAUyV,EAKtC,OAHIzV,IACFA,EAASuY,QAAQS,EAAStlB,GAErBA,EAAK8kB,aAAaQ,KAgB/B,MAAOtkB,MAAK+hB,UAGdgC,SAAU,SAAS1C,EAAO2C,GACxB,GAAIhkB,KAAKsiB,WAEP,MADAtiB,MAAKmkB,SAASF,aAAa5C,EAAO2C,GAC3BA,CAGT,IAAI9B,GAASliB,KAAKkiB,OAAOb,GACrBkD,EAAWvkB,KAAK0d,mBAAoBsE,GAAYhiB,KAAK0d,SAASvV,KAC9DnI,KAAK0d,SAAS2D,EAClB,OAAOa,GAAOqC,GAAYP,IAY9BxB,EAAO9b,WACL8d,UAAW,SAASnD,EAAO/V,EAAUyV,EAAgB0D,EACjCC,GAClB,GAAIpb,GAAKyX,EAAe/gB,KAAKmI,MACzBmc,EAAUjD,CACd,IAAI/X,EACFgb,EAAUlU,WAGV,IADA9G,EAAKgb,EAAQtkB,KAAKmI,OACbmB,EAEH,WADA2E,SAAQuN,MAAM,mCAAqCxb,KAAKmI,KAc5D,IANIsc,EACFnb,EAAKA,EAAGqb,QACoB,kBAAZrb,GAAGsb,QACnBtb,EAAKA,EAAGsb,OAGO,kBAANtb,GAET,WADA2E,SAAQuN,MAAM,mCAAqCxb,KAAKmI,KAK1D,KAAK,GADDsT,GAAOiJ,MACFhjB,EAAI,EAAGA,EAAI1B,KAAKyb,KAAK9Z,OAAQD,IACpC+Z,EAAKhb,KAAK8hB,EAAMviB,KAAKyb,KAAK/Z,IAAI2f,EAAO/V,EAAUyV,GAGjD,OAAOzX,GAAGub,MAAMP,EAAS7I,IAM7B,IAAIqJ,IACFC,IAAK,SAAS1hB,GAAK,OAAQA,GAC3B2hB,IAAK,SAAS3hB,GAAK,OAAQA,GAC3B4hB,IAAK,SAAS5hB,GAAK,OAAQA,IAGzB6hB,GACFH,IAAK,SAASrc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BghB,IAAK,SAAStc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BmhB,IAAK,SAASzc,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BohB,IAAK,SAAS1c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BqhB,IAAK,SAAS3c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BshB,IAAK,SAAS5c,EAAG1E,GAAK,MAASA,GAAF0E,GAC7B6c,IAAK,SAAS7c,EAAG1E,GAAK,MAAO0E,GAAE1E,GAC/BwhB,KAAM,SAAS9c,EAAG1E,GAAK,MAAUA,IAAH0E,GAC9B+c,KAAM,SAAS/c,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC0hB,KAAM,SAAShd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC2hB,KAAM,SAASjd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC4hB,MAAO,SAASld,EAAG1E,GAAK,MAAO0E,KAAI1E,GACnC6hB,MAAO,SAASnd,EAAG1E,GAAK,MAAO0E,KAAI1E,GACnC8hB,KAAM,SAASpd,EAAG1E,GAAK,MAAO0E,IAAG1E,GACjC+hB,KAAM,SAASrd,EAAG1E,GAAK,MAAO0E,IAAG1E,GAiBnC6d,GAAYnb,WACVqX,sBAAuB,SAASiI,EAAIC,GAClC,IAAKnB,EAAekB,GAClB,KAAMvN,OAAM,wBAA0BuN,EAIxC,OAFAC,GAAW1D,EAAM0D,GAEV,SAAS5E,EAAO/V,EAAUyV,GAC/B,MAAO+D,GAAekB,GAAIC,EAAS5E,EAAO/V,EAAUyV,MAIxDzC,uBAAwB,SAAS0H,EAAIljB,EAAMC,GACzC,IAAKmiB,EAAgBc,GACnB,KAAMvN,OAAM,wBAA0BuN,EAKxC,OAHAljB,GAAOyf,EAAMzf,GACbC,EAAQwf,EAAMxf,GAEP,SAASse,EAAO/V,EAAUyV,GAC/B,MAAOmE,GAAgBc,GAAIljB,EAAKue,EAAO/V,EAAUyV,GACtBhe,EAAMse,EAAO/V,EAAUyV,MAItDrC,4BAA6B,SAASwH,EAAM1H,EAAYC,GAKtD,MAJAyH,GAAO3D,EAAM2D,GACb1H,EAAa+D,EAAM/D,GACnBC,EAAY8D,EAAM9D,GAEX,SAAS4C,EAAO/V,EAAUyV,GAC/B,MAAOmF,GAAK7E,EAAO/V,EAAUyV,GACzBvC,EAAW6C,EAAO/V,EAAUyV,GAC5BtC,EAAU4C,EAAO/V,EAAUyV,KAInCpE,iBAAkB,SAASxU,GACzB,GAAIge,GAAQ,GAAInE,GAAU7Z,EAE1B,OADAge,GAAMpd,KAAO,aACNod,GAGTxI,uBAAwB,SAASwE,EAAUD,EAAQxE,GACjD,GAAI0D,GAAK,GAAIhB,GAAiB8B,EAAQxE,EAAUyE,EAGhD,OAFIf,GAAGiB,cACLriB,KAAKqiB,aAAc,GACdjB,GAGTxD,qBAAsB,SAASoD,EAAYvF,GACzC,KAAMuF,YAAsBgB,IAC1B,KAAMvJ,OAAM,mDAEd,IAAI9M,GAAS,GAAI6W,GAAOxB,EAAW7Y,KAAMsT,EAEzC,OAAO,UAAS4F,EAAO/V,EAAUyV,GAC/B,MAAOpV,GAAO6Y,UAAUnD,EAAO/V,EAAUyV,GAAgB,KAI7DrE,cAAe,SAAS1B,GACtB,MAAO,IAAIiF,GAAQjF,EAAMpH,QAG3B4I,sBAAuB,SAASH,GAC9B,IAAK,GAAI3a,GAAI,EAAGA,EAAI2a,EAAS1a,OAAQD,IACnC2a,EAAS3a,GAAK6gB,EAAMlG,EAAS3a,GAE/B,OAAO,UAAS2f,EAAO/V,EAAUyV,GAE/B,IAAK,GADDqF,MACK1kB,EAAI,EAAGA,EAAI2a,EAAS1a,OAAQD,IACnC0kB,EAAI3lB,KAAK4b,EAAS3a,GAAG2f,EAAO/V,EAAUyV,GACxC,OAAOqF,KAIXvJ,eAAgB,SAASwJ,EAAMxS,EAAKD,GAClC,OACEC,IAAKA,YAAemO,GAAYnO,EAAI1L,KAAO0L,EAAID,MAC/CA,MAAOA,IAIXoJ,uBAAwB,SAASD,GAC/B,IAAK,GAAIrb,GAAI,EAAGA,EAAIqb,EAAWpb,OAAQD,IACrCqb,EAAWrb,GAAGkS,MAAQ2O,EAAMxF,EAAWrb,GAAGkS,MAE5C,OAAO,UAASyN,EAAO/V,EAAUyV,GAE/B,IAAK,GADDuF,MACK5kB,EAAI,EAAGA,EAAIqb,EAAWpb,OAAQD,IACrC4kB,EAAIvJ,EAAWrb,GAAGmS,KACdkJ,EAAWrb,GAAGkS,MAAMyN,EAAO/V,EAAUyV,EAC3C,OAAOuF,KAIX1H,aAAc,SAASzW,EAAMsT,GAC3Bzb,KAAK4iB,QAAQniB,KAAK,GAAI+hB,GAAOra,EAAMsT,KAGrC0D,mBAAoB,SAAS6B,EAAYE,GACvClhB,KAAKghB,WAAaA,EAClBhhB,KAAKkhB,WAAaA,GAGpB7B,mBAAoB,SAAS6B,EAAYQ,EAAYV,GACnDhhB,KAAKghB,WAAaA,EAClBhhB,KAAKkhB,WAAaA,EAClBlhB,KAAK0hB,WAAaA,GAGpBxC,eAAgB,SAAS8B,GACvBhhB,KAAKghB,WAAaA,GAGpB5D,qBAAsBqF,GAOxBM,EAAmBrc,WACjB6f,KAAM,WAAa,MAAOvmB,MAAKgjB,QAC/BwD,eAAgB,WAAa,MAAOxmB,MAAKgjB,QACzCyD,QAAS,aACTC,MAAO,cAiBT5E,EAAWpb,WACT8a,WAAY,SAASH,EAAON,EAAgBO,GAU1C,QAASqB,KAEP,GAAIgE,EAEF,MADAA,IAAY,EACLC,CAGLhU,GAAKyP,aACP/W,EAASub,YAEX,IAAIjT,GAAQhB,EAAKkU,SAASzF,EACAzO,EAAKyP,YAAc/W,EAAW8E,OAC9B2Q,EAI1B,OAHInO,GAAKyP,aACP/W,EAASyb,cAEJnT,EAGT,QAASoT,GAAWhD,GAElB,MADApR,GAAKmR,SAAS1C,EAAO2C,EAAUjD,GACxBiD,EA9BT,GAAI1C,EACF,MAAOthB,MAAK8mB,SAASzF,EAAOjR,OAAW2Q,EAEzC,IAAIzV,GAAW,GAAI2b,kBAEfL,EAAa5mB,KAAK8mB,SAASzF,EAAO/V,EAAUyV,GAC5C4F,GAAY,EACZ/T,EAAO5S,IA0BX,OAAO,IAAIknB,mBAAkB5b,EAAUqX,EAASqE,GAAY,IAG9DF,SAAU,SAASzF,EAAO/V,EAAUyV,GAElC,IAAK,GADDnN,GAAQ2O,EAAMviB,KAAKghB,YAAYK,EAAO/V,EAAUyV,GAC3Crf,EAAI,EAAGA,EAAI1B,KAAK4iB,QAAQjhB,OAAQD,IACvCkS,EAAQ5T,KAAK4iB,QAAQlhB,GAAG8iB,UAAUnD,EAAO/V,EAAUyV,GAC/C,GAAQnN,GAGd,OAAOA,IAGTmQ,SAAU,SAAS1C,EAAO2C,EAAUjD,GAElC,IADA,GAAIoG,GAAQnnB,KAAK4iB,QAAU5iB,KAAK4iB,QAAQjhB,OAAS,EAC1CwlB,IAAU,GACfnD,EAAWhkB,KAAK4iB,QAAQuE,GAAO3C,UAAUnD,EAAOjR,OAC5C2Q,GAAgB,GAAOiD,GAG7B,OAAIhkB,MAAKghB,WAAW+C,SACX/jB,KAAKghB,WAAW+C,SAAS1C,EAAO2C,GADzC,QAeJ,IAAIV,GAAkB,IAAMxU,KAAKsY,SAASC,SAAS,IAAI3b,MAAM,EAiC7DkY,GAAmBld,WAEjB4gB,YAAa,SAAS1T,GACpB,GAAIyQ,KACJ,KAAK,GAAIxQ,KAAOD,GACdyQ,EAAM5jB,KAAKwiB,EAAyBpP,GAAO,KAAOD,EAAMC,GAE1D,OAAOwQ,GAAMkD,KAAK,OAGpBC,UAAW,SAAS5T,GAClB,GAAI6T,KACJ,KAAK,GAAI5T,KAAOD,GACVA,EAAMC,IACR4T,EAAOhnB,KAAKoT,EAEhB,OAAO4T,GAAOF,KAAK,MAIrBG,+BAAgC,SAASC,GACvC,GAAIjG,GAAaiG,EAAShG,4BAC1B,IAAKD,EAGL,MAAO,UAASkG,EAAkBzO,GAChCyO,EAAiBvG,MAAMK,GAAcvI,IAIzC0H,eAAgB,SAAS4C,EAAYtb,EAAMxF,GACzC,GAAI3D,GAAOijB,KAAK/a,IAAIuc,EAEpB,EAAA,GAAKD,EAAoBC,KAAezkB,EAAK6oB,MAa7C,MAAOhH,GAAe4C,EAAYtb,EAAMxF,EAAM3C,KAZ5C,IAAmB,GAAfhB,EAAK2C,OACP,MAAO,UAAS0f,EAAO1e,EAAM2e,GAC3B,GAAIA,EACF,MAAOtiB,GAAK8kB,aAAazC,EAE3B,IAAIhjB,GAAQ+kB,EAAU/B,EAAOriB,EAAK,GAClC,OAAO,IAAI8oB,cAAazpB,EAAOW,MASvC+oB,qBAAsB,SAASJ,GAC7B,GAAIK,GAAYL,EAASlG,4BACzB,IAAKuG,EAAL,CAGA,GAAIC,GAAcN,EAASC,iBACvBD,EAASC,iBAAiBvG,MAC1BsG,EAAStG,MAETjC,EAAYuI,EAAShG,4BAEzB,OAAO,UAASN,GACd,MAAO6G,GAAkBD,EAAa5G,EAAO2G,EAAW5I,MAK9D,IAAI8I,GAAqB,gBACvB,SAASD,EAAa5G,EAAO2G,EAAW5I,GACtC,GAAI/gB,KAKJ,OAJAA,GAAM2pB,GAAa3G,EACnBhjB,EAAM+gB,GAAahP,OACnB/R,EAAMilB,GAAmB2E,EACzB5pB,EAAM8pB,UAAYF,EACX5pB,GAET,SAAS4pB,EAAa5G,EAAO2G,EAAW5I,GACtC,GAAI/gB,GAAQ6G,OAAOC,OAAO8iB,EAO1B,OANA/iB,QAAOkjB,eAAe/pB,EAAO2pB,GACvBpU,MAAOyN,EAAOgH,cAAc,EAAMC,UAAU,IAClDpjB,OAAOkjB,eAAe/pB,EAAO+gB,GACvBxL,MAAOxD,OAAWiY,cAAc,EAAMC,UAAU,IACtDpjB,OAAOkjB,eAAe/pB,EAAOilB,GACvB1P,MAAOqU,EAAaI,cAAc,EAAMC,UAAU,IACjDjqB,EAGXga,GAAOuL,mBAAqBA,EAC5BA,EAAmB3C,cAAgBA,GAClCjhB,MCplBHuoB,SACEC,QAAS,iBCGmB,kBAAnB3qB,QAAO0qB,UAChBA,YCJF,SAAUlqB,GAGR,QAASoqB,GAAO/hB,EAAWgiB,GAiBzB,MAhBIhiB,IAAagiB,GAEfxjB,OAAOyjB,oBAAoBD,GAAK3kB,QAAQ,SAAStC,GAE/C,GAAImnB,GAAK1jB,OAAO2jB,yBAAyBH,EAAKjnB,EAC1CmnB,KAEF1jB,OAAOkjB,eAAe1hB,EAAWjF,EAAGmnB,GAEb,kBAAZA,GAAGhV,QAEZgV,EAAGhV,MAAMkV,IAAMrnB,MAKhBiF,EAKTrI,EAAMoqB,OAASA,GAEdF,SC3BH,SAAUlqB,GA6CR,QAAS0qB,GAAIA,EAAK3hB,EAAU4hB,GAO1B,MANID,GACFA,EAAIE,OAEJF,EAAM,GAAIG,GAAIlpB,MAEhB+oB,EAAII,GAAG/hB,EAAU4hB,GACVD,EAzCT,GAAIG,GAAM,SAASE,GACjBppB,KAAKskB,QAAU8E,EACfppB,KAAKqpB,cAAgBrpB,KAAKspB,SAASnmB,KAAKnD,MAE1CkpB,GAAIxiB,WACFyiB,GAAI,SAAS/hB,EAAU4hB,GACrBhpB,KAAKoH,SAAWA,CAChB,IAAImiB,EACCP,IAMHO,EAAI5X,WAAW3R,KAAKqpB,cAAeL,GACnChpB,KAAKwpB,OAAS,WACZ5X,aAAa2X,MAPfA,EAAI7e,sBAAsB1K,KAAKqpB,eAC/BrpB,KAAKwpB,OAAS,WACZC,qBAAqBF,MAS3BN,KAAM,WACAjpB,KAAKwpB,SACPxpB,KAAKwpB,SACLxpB,KAAKwpB,OAAS,OAGlBF,SAAU,WACJtpB,KAAKwpB,SACPxpB,KAAKipB,OACLjpB,KAAKoH,SAASE,KAAKtH,KAAKskB,YAiB9BjmB,EAAM0qB,IAAMA,GAEXR,SC3DH,WAEE,GAAImB,KAEJC,aAAYnhB,SAAW,SAASohB,EAAKljB,GACnCgjB,EAASE,GAAOljB,GAIlBijB,YAAYE,mBAAqB,SAASD,GACxC,GAAIljB,GAAakjB,EAA8BF,EAASE,GAAjCD,YAAYjjB,SAEnC,OAAOA,IAAaxB,OAAO4kB,eAAetrB,SAASC,cAAcmrB,IAInE,IAAIG,GAA0BC,MAAMtjB,UAAUzH,eAC9C+qB,OAAMtjB,UAAUzH,gBAAkB,WAChCe,KAAKiqB,cAAe,EACpBF,EAAwBlF,MAAM7kB,KAAM0b,aASrC6M,SC5BF,SAAUlqB,GAgBP,QAAS6rB,GAAOC,GAMd,GAAIC,GAASF,EAAOE,OAEhBtB,EAAMsB,EAAOtB,IAEbuB,EAASD,EAAOC,MACfA,KACEvB,IACHA,EAAMsB,EAAOtB,IAAMwB,EAAWhjB,KAAKtH,KAAMoqB,IAEtCtB,GACH7a,QAAQC,KAAK,iFAQfmc,EAASE,EAAaH,EAAQtB,EAAKgB,EAAe9pB,OAGpD,IAAIsJ,GAAK+gB,EAAOvB,EAChB,OAAIxf,IAEGA,EAAG+gB,QAENE,EAAajhB,EAAIwf,EAAKuB,GAIjB/gB,EAAGub,MAAM7kB,KAAMmqB,QARxB,OAYF,QAASG,GAAW1W,GAElB,IADA,GAAIrO,GAAIvF,KAAKmoB,UACN5iB,GAAKA,IAAMokB,YAAYjjB,WAAW,CAGvC,IAAK,GAAsBjF,GADvB+oB,EAAKtlB,OAAOyjB,oBAAoBpjB,GAC3B7D,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAa+G,EAAFhH,IAAQD,EAAE+oB,EAAG9oB,IAAKA,IAAK,CACnD,GAAIW,GAAI6C,OAAO2jB,yBAAyBtjB,EAAG9D,EAC3C,IAAuB,kBAAZY,GAAEuR,OAAwBvR,EAAEuR,QAAUA,EAC/C,MAAOnS,GAGX8D,EAAIA,EAAE4iB,WAIV,QAASoC,GAAaE,EAAQtiB,EAAMuiB,GAIlC,GAAI9rB,GAAI+rB,EAAUD,EAAOviB,EAAMsiB,EAM/B,OALI7rB,GAAEuJ,KAGJvJ,EAAEuJ,GAAM2gB,IAAM3gB,GAETsiB,EAAOJ,OAASzrB,EAGzB,QAAS+rB,GAAUD,EAAOviB,EAAMiiB,GAE9B,KAAOM,GAAO,CACZ,GAAKA,EAAMviB,KAAUiiB,GAAWM,EAAMviB,GACpC,MAAOuiB,EAETA,GAAQZ,EAAeY,GAMzB,MAAOxlB,QAMT,QAAS4kB,GAAepjB,GACtB,MAAOA,GAAUyhB,UAkBnB9pB,EAAMusB,MAAQV,GAEf3B,SC3HH,SAAUlqB,GA8CR,QAASwsB,GAAiBjX,EAAOkX,GAE/B,GAAIC,SAAsBD,EAM1B,OAJIA,aAAwB1T,QAC1B2T,EAAe,QAGVC,EAAaD,GAAcnX,EAAOkX,GApD3C,GAAIE,IACFC,OAAQ,SAASrX,GACf,MAAOA,IAETsX,KAAM,SAAStX,GACb,MAAO,IAAIwD,MAAKA,KAAKkI,MAAM1L,IAAUwD,KAAKC,QAE5C8T,UAAS,SAASvX,GAChB,MAAc,KAAVA,GACK,EAEQ,UAAVA,GAAoB,IAAUA,GAEvC2G,OAAQ,SAAS3G,GACf,GAAInS,GAAIgZ,WAAW7G,EAKnB,OAHU,KAANnS,IACFA,EAAI2pB,SAASxX,IAER8P,MAAMjiB,GAAKmS,EAAQnS,GAK5BygB,OAAQ,SAAStO,EAAOkX,GACtB,GAAqB,OAAjBA,EACF,MAAOlX,EAET,KAIE,MAAOyX,MAAK/L,MAAM1L,EAAMgI,QAAQ,KAAM,MACtC,MAAM/W,GAEN,MAAO+O,KAIX0X,WAAY,SAAS1X,EAAOkX,GAC1B,MAAOA,IAiBXzsB,GAAMwsB,iBAAmBA,GAExBtC,SC9DH,SAAUlqB,GAIR,GAAIoqB,GAASpqB,EAAMoqB,OAIfC,IAEJA,GAAI6C,eACJ7C,EAAI8C,YAEJ9C,EAAI+C,QAAU,SAASC,EAAMhlB,GAC3B,IAAK,GAAIjF,KAAKiqB,GACZjD,EAAO/hB,EAAWglB,EAAKjqB,KAM3BpD,EAAMqqB,IAAMA,GAEXH,SCtBH,SAAUlqB,GAER,GAAIstB,IASFC,MAAO,SAASnB,EAAQhP,EAAMoQ,GAG5BC,SAASC,QAETtQ,EAAQA,GAAQA,EAAK9Z,OAAU8Z,GAAQA,EAEvC,IAAInS,GAAK,YACNtJ,KAAKyqB,IAAWA,GAAQ5F,MAAM7kB,KAAMyb,IACrCtY,KAAKnD,MAEHwpB,EAASqC,EAAUla,WAAWrI,EAAIuiB,GAClCnhB,sBAAsBpB,EAE1B,OAAOuiB,GAAUrC,GAAUA,GAE7BwC,YAAa,SAASxC,GACP,EAATA,EACFC,sBAAsBD,GAEtB5X,aAAa4X,IAWjByC,KAAM,SAASljB,EAAMsJ,EAAQ6Z,EAAQ/sB,EAAS6F,GAC5C,GAAIrC,GAAOupB,GAAUlsB,KACjBqS,EAASA,MACT8Z,EAAQ,GAAIjtB,aAAY6J,GAC1B5J,QAAsBiR,SAAZjR,EAAwBA,GAAU,EAC5C6F,WAA4BoL,SAAfpL,EAA2BA,GAAa,EACrDqN,OAAQA,GAGV,OADA1P,GAAKtD,cAAc8sB,GACZA,GASTC,UAAW,WACTpsB,KAAK4rB,MAAM,OAAQlQ,YASrB2Q,aAAc,SAASC,EAAMC,EAAKC,GAC5BD,GACFA,EAAIE,UAAU1hB,OAAOyhB,GAEnBF,GACFA,EAAKG,UAAU3hB,IAAI0hB,IASvBE,gBAAiB,SAASC,EAAMpsB,GAC9B,GAAIonB,GAAWnpB,SAASC,cAAc,WACtCkpB,GAASiF,UAAYD,CACrB,IAAIE,GAAW7sB,KAAK8sB,iBAAiBnF,EAKrC,OAJIpnB,KACFA,EAAQ6D,YAAc,GACtB7D,EAAQ1B,YAAYguB,IAEfA,IAKPE,EAAM,aAGNC,IAIJrB,GAAMsB,YAActB,EAAMC,MAI1BvtB,EAAMqqB,IAAI8C,SAASG,MAAQA,EAC3BttB,EAAM0uB,IAAMA,EACZ1uB,EAAM2uB,IAAMA,GAEXzE,SChHH,SAAUlqB,GAIR,GAAI6uB,GAAMrvB,OAAOsvB,aACbC,EAAe,MAGf9kB,GAEF8kB,aAAcA,EAEdC,iBAAkB,WAChB,GAAI/kB,GAAStI,KAAKstB,cAClBJ,GAAI5kB,QAAWpD,OAAOG,KAAKiD,GAAQ3G,OAAS,GAAMsM,QAAQif,IAAI,yBAA0BltB,KAAKutB,UAAWjlB,EAKxG,KAAK,GAAIS,KAAQT,GAAQ,CACvB,GAAIklB,GAAallB,EAAOS,EACxB/I,MAAKlB,iBAAiBiK,EAAM/I,KAAKO,QAAQktB,gBAAgBztB,KAAMA,KACNwtB,MAI7DE,eAAgB,SAASpH,EAAKmE,EAAQhP,GACpC,GAAI6K,EAAK,CACP4G,EAAI5kB,QAAU2F,QAAQ0f,MAAM,qBAAsBrH,EAAIiH,UAAW9C,EACjE,IAAInhB,GAAuB,kBAAXmhB,GAAwBA,EAASnE,EAAImE,EACjDnhB,IACFA,EAAGmS,EAAO,QAAU,QAAQ6K,EAAK7K,GAEnCyR,EAAI5kB,QAAU2F,QAAQ2f,WACtB9B,SAASC,UAOf1tB,GAAMqqB,IAAI8C,SAASljB,OAASA,GAE3BigB,SC3CH,SAAUlqB,GAIR,GAAI6N,IACF2hB,uBAAwB,WACtB,GAAIC,GAAK9tB,KAAK+tB,mBACd,KAAK,GAAI3oB,KAAK0oB,GACP9tB,KAAKguB,aAAa5oB,IACrBpF,KAAKiuB,aAAa7oB,EAAG0oB,EAAG1oB,KAK9B8oB,eAAgB,WAGd,GAAIluB,KAAKmuB,WACP,IAAK,GAA0C/vB,GAAtCsD,EAAE,EAAGosB,EAAG9tB,KAAKkM,WAAYxD,EAAEolB,EAAGnsB,QAAYvD,EAAE0vB,EAAGpsB,KAASgH,EAAFhH,EAAKA,IAClE1B,KAAKouB,oBAAoBhwB,EAAE+J,KAAM/J,EAAEwV,QAMzCwa,oBAAqB,SAASjmB,EAAMyL,GAGlC,GAAIzL,GAAOnI,KAAKquB,qBAAqBlmB,EACrC,IAAIA,EAAM,CAIR,GAAIyL,GAASA,EAAM0a,OAAOjwB,EAAMkwB,cAAgB,EAC9C,MAGF,IAAIzD,GAAe9qB,KAAKmI,GAEpByL,EAAQ5T,KAAK6qB,iBAAiBjX,EAAOkX,EAErClX,KAAUkX,IAEZ9qB,KAAKmI,GAAQyL,KAKnBya,qBAAsB,SAASlmB,GAC7B,GAAI8T,GAAQjc,KAAKmuB,YAAcnuB,KAAKmuB,WAAWhmB,EAE/C,OAAO8T,IAGT4O,iBAAkB,SAAS2D,EAAa1D,GACtC,MAAOzsB,GAAMwsB,iBAAiB2D,EAAa1D,IAE7C2D,eAAgB,SAAS7a,EAAOmX,GAC9B,MAAqB,YAAjBA,EACKnX,EAAQ,GAAKxD,OACM,WAAjB2a,GAA8C,aAAjBA,GACvB3a,SAAVwD,EACEA,EAFF,QAKT8a,2BAA4B,SAASvmB,GACnC,GAAI4iB,SAAsB/qB,MAAKmI,GAE3BwmB,EAAkB3uB,KAAKyuB,eAAezuB,KAAKmI,GAAO4iB,EAE9B3a,UAApBue,EACF3uB,KAAKiuB,aAAa9lB,EAAMwmB,GAME,YAAjB5D,GACT/qB,KAAK4uB,gBAAgBzmB,IAO3B9J,GAAMqqB,IAAI8C,SAAStf,WAAaA,GAE/Bqc,SCvFH,SAAUlqB,GAyBR,QAASwwB,GAAa/rB,EAAMC,GAC1B,MAAID,KAASC,EACK,IAATD,GAAc,EAAIA,IAAS,EAAIC,EACpC+rB,EAAYhsB,IAASgsB,EAAY/rB,IAC5B,EAEFD,IAASA,GAAQC,IAAUA,EAKpC,QAASgsB,GAAoB/hB,EAAU4G,GACrC,MAAcxD,UAAVwD,GAAoC,OAAb5G,EAClB4G,EAES,OAAVA,GAA4BxD,SAAVwD,EAAuB5G,EAAW4G,EApC9D,GAAIsZ,GAAMrvB,OAAOsvB,aAUb6B,GACF9M,OAAQ9R,OACRrH,KAAM,SACNZ,KAAMiI,OACNpD,SAAUoD,QAGR0e,EAAcnL,OAAOD,OAAS,SAAS9P,GACzC,MAAwB,gBAAVA,IAAsB8P,MAAM9P,IAqBxCmJ,GACFkS,uBAAwB,WACtB,GAAIzE,GAAKxqB,KAAKkvB,aACd,IAAI1E,GAAMA,EAAG7oB,OAAQ,CACnB,GAAIwtB,GAAInvB,KAAKovB,kBAAoB,GAAInI,mBAAiB,EACtDjnB,MAAKqvB,iBAAiBF,EAKtB,KAAK,GAAsB1tB,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAc+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IAChDytB,EAAEtL,QAAQ7jB,KAAMyB,GAChBzB,KAAKsvB,kBAAkB7tB,EAAGzB,KAAKyB,GAAI,QAIzC8tB,qBAAsB,WAChBvvB,KAAKovB,mBACPpvB,KAAKovB,kBAAkB7I,KAAKvmB,KAAKwvB,sBAAuBxvB,OAG5DwvB,sBAAuB,SAASC,EAAWC,EAAWC,GACpD,GAAIxnB,GAAMsiB,EAAQmF,IAClB,KAAK,GAAIluB,KAAKguB,GAIZ,GAFAvnB,EAAOwnB,EAAM,EAAIjuB,EAAI,GACrB+oB,EAASzqB,KAAKsM,QAAQnE,GACV,CACV,GAAI0nB,GAAKH,EAAUhuB,GAAIouB,EAAKL,EAAU/tB,EAEtC1B,MAAKsvB,kBAAkBnnB,EAAM2nB,EAAID,GAC5BD,EAAOnF,KAEEra,SAAPyf,GAA2B,OAAPA,GAAwBzf,SAAP0f,GAA2B,OAAPA,KAC5DF,EAAOnF,IAAU,EAKjBzqB,KAAK+vB,aAAatF,GAASoF,EAAIC,EAAIpU,eAM7CsU,eAAgB,WACVhwB,KAAKovB,mBACPpvB,KAAKovB,kBAAkB3I,WAG3BwJ,iBAAkB,SAAS9nB,GACrBnI,KAAKkwB,QAAQ/nB,IACfnI,KAAK0uB,2BAA2BvmB,IAGpCmnB,kBAAmB,SAASnnB,EAAMyL,EAAO2Y,GAEvC,GAAI4D,GAAenwB,KAAKsM,QAAQnE,EAChC,IAAIgoB,IAEE3kB,MAAM4kB,QAAQ7D,KAChBW,EAAI5gB,SAAW2B,QAAQif,IAAI,mDAAoDltB,KAAKutB,UAAWplB,GAC/FnI,KAAKqwB,mBAAmBloB,EAAO,YAG7BqD,MAAM4kB,QAAQxc,IAAQ,CACxBsZ,EAAI5gB,SAAW2B,QAAQif,IAAI,iDAAkDltB,KAAKutB,UAAWplB,EAAMyL,EACnG,IAAItI,GAAW,GAAIglB,eAAc1c,EACjCtI,GAASib,KAAK,SAAS3S,EAAO2Y,GAC5BvsB,KAAK+vB,aAAaI,GAAe5D,KAChCvsB,MACHA,KAAKuwB,sBAAsBpoB,EAAO,UAAWmD,KAInDklB,yBAA0B,SAASroB,EAAMyL,EAAO5G,GAE9C,IAAI6hB,EAAajb,EAAO5G,KAGxBhN,KAAKiwB,iBAAiB9nB,EAAMyL,EAAO5G,GAE9ByjB,SAASC,kBAAd,CAGA,GAAIC,GAAW3wB,KAAK4wB,SACfD,KACHA,EAAW3wB,KAAK4wB,UAAY1rB,OAAO2rB,YAAY7wB,OAEjDgvB,EAAa9M,OAASliB,KACtBgvB,EAAa7mB,KAAOA,EACpB6mB,EAAahiB,SAAWA,EAExB2jB,EAASG,OAAO9B,KAElB+B,eAAgB,SAAS5oB,EAAM6oB,EAAYC,GACzC,GAAIC,GAAc/oB,EAAO,IACrBgpB,EAAqBhpB,EAAO,aAEhCnI,MAAKmxB,GAAqBH,CAC1B,IAAIhkB,GAAWhN,KAAKkxB,GAEhBte,EAAO5S,KACP4T,EAAQod,EAAWzK,KAAK,SAAS3S,EAAO5G,GAC1C4F,EAAKse,GAAetd,EACpBhB,EAAK4d,yBAAyBroB,EAAMyL,EAAO5G,IAG7C,IAAIikB,IAAcpC,EAAa7hB,EAAU4G,GAAQ,CAC/C,GAAIwd,GAAgBH,EAAUjkB,EAAU4G,EACnCib,GAAajb,EAAOwd,KACvBxd,EAAQwd,EACJJ,EAAWjN,UACbiN,EAAWjN,SAASnQ,IAI1B5T,KAAKkxB,GAAetd,EACpB5T,KAAKwwB,yBAAyBroB,EAAMyL,EAAO5G,EAE3C,IAAI1B,IACFob,MAAO,WACLsK,EAAWtK,QACX9T,EAAKue,GAAqB/gB,QAI9B,OADApQ,MAAKqvB,iBAAiB/jB,GACfA,GAET+lB,yBAA0B,WACxB,GAAKrxB,KAAKsxB,eAIV,IAAK,GAAI5vB,GAAI,EAAGA,EAAI1B,KAAKsxB,eAAe3vB,OAAQD,IAAK,CACnD,GAAIyG,GAAOnI,KAAKsxB,eAAe5vB,GAC3Bof,EAAiB9gB,KAAKoiB,SAASja,EACnC,KACE,GAAI6Y,GAAa4C,mBAAmB3C,cAAcH,GAC9CkQ,EAAahQ,EAAWQ,WAAWxhB,KAAMA,KAAKO,QAAQgxB,OAC1DvxB,MAAK+wB,eAAe5oB,EAAM6oB,GAC1B,MAAO5P,GACPnT,QAAQuN,MAAM,qCAAsC4F,MAI1DoQ,aAAc,SAAS9T,EAAUsT,EAAY1P,GAC3C,MAAIA,QACFthB,KAAK0d,GAAYsT,GAGZhxB,KAAK+wB,eAAerT,EAAUsT,EAAYjC,IAEnDgB,aAAc,SAAStF,EAAQhP,GAC7B,GAAInS,GAAKtJ,KAAKyqB,IAAWA,CACP,mBAAPnhB,IACTA,EAAGub,MAAM7kB,KAAMyb,IAGnB4T,iBAAkB,SAAS/jB,GACzB,MAAKtL,MAAKyxB,eAKVzxB,MAAKyxB,WAAWhxB,KAAK6K,QAJnBtL,KAAKyxB,YAAcnmB,KAOvBomB,eAAgB,WACd,GAAK1xB,KAAKyxB,WAAV,CAKA,IAAK,GADDE,GAAY3xB,KAAKyxB,WACZ/vB,EAAI,EAAGA,EAAIiwB,EAAUhwB,OAAQD,IAAK,CACzC,GAAI4J,GAAWqmB,EAAUjwB,EACrB4J,IAAqC,kBAAlBA,GAASob,OAC9Bpb,EAASob,QAIb1mB,KAAKyxB,gBAGPlB,sBAAuB,SAASpoB,EAAMmD,GACpC,GAAIsmB,GAAK5xB,KAAK6xB,kBAAoB7xB,KAAK6xB,mBACvCD,GAAGzpB,GAAQmD,GAEb+kB,mBAAoB,SAASloB,GAC3B,GAAIypB,GAAK5xB,KAAK6xB,eACd,OAAID,IAAMA,EAAGzpB,IACXypB,EAAGzpB,GAAMue,QACTkL,EAAGzpB,GAAQ,MACJ,GAHT,QAMF2pB,oBAAqB,WACnB,GAAI9xB,KAAK6xB,gBAAiB,CACxB,IAAK,GAAInwB,KAAK1B,MAAK6xB,gBACjB7xB,KAAKqwB,mBAAmB3uB,EAE1B1B,MAAK6xB,qBAYXxzB,GAAMqqB,IAAI8C,SAASzO,WAAaA,GAE/BwL,SClQH,SAAUlqB,GAIR,GAAI6uB,GAAMrvB,OAAOsvB,UAAY,EAGzB4E,GACFjF,iBAAkB,SAASnF,GAMzB,IAAK,GAJD4J,GAASvxB,KAAKuxB,SAAY5J,EAASqK,iBACnChyB,KAAKO,QAAQgxB,OACbU,EAAMtK,EAASuK,eAAelyB,KAAMuxB,GACpCI,EAAYM,EAAIE,UACXzwB,EAAI,EAAGA,EAAIiwB,EAAUhwB,OAAQD,IACpC1B,KAAKqvB,iBAAiBsC,EAAUjwB,GAElC,OAAOuwB,IAET9uB,KAAM,SAASgF,EAAM6oB,EAAY1P,GAC/B,GAAI5D,GAAW1d,KAAKquB,qBAAqBlmB,EACzC,IAAKuV,EAIE,CAEL,GAAIpS,GAAWtL,KAAKwxB,aAAa9T,EAAUsT,EAAY1P,EAUvD,OAPIwK,UAASsG,0BAA4B9mB,IACvCA,EAAStM,KAAOgyB,EAAWqB,MAC3BryB,KAAKsyB,eAAe5U,EAAUpS,IAE5BtL,KAAKkwB,QAAQxS,IACf1d,KAAK0uB,2BAA2BhR,GAE3BpS,EAbP,MAAOtL,MAAKuyB,WAAW7W,YAgB3B8W,aAAc,WACZxyB,KAAKyyB,oBAEPH,eAAgB,SAASnqB,EAAMmD,GAC7BtL,KAAKmyB,UAAYnyB,KAAKmyB,cACtBnyB,KAAKmyB,UAAUhqB,GAAQmD,GAKzBonB,eAAgB,WACT1yB,KAAK2yB,WACRzF,EAAI0F,QAAU3kB,QAAQif,IAAI,sBAAuBltB,KAAKutB,WACtDvtB,KAAK6yB,cAAgB7yB,KAAK+oB,IAAI/oB,KAAK6yB,cAAe7yB,KAAK8yB,UAAW,KAGtEA,UAAW,WACJ9yB,KAAK2yB,WACR3yB,KAAK0xB,iBACL1xB,KAAK8xB,sBACL9xB,KAAK2yB,UAAW,IAGpBI,gBAAiB,WACf,MAAI/yB,MAAK2yB,cACPzF,EAAI0F,QAAU3kB,QAAQC,KAAK,gDAAiDlO,KAAKutB,aAGnFL,EAAI0F,QAAU3kB,QAAQif,IAAI,uBAAwBltB,KAAKutB,gBACnDvtB,KAAK6yB,gBACP7yB,KAAK6yB,cAAgB7yB,KAAK6yB,cAAc5J,YAsB1C+J,EAAkB,gBAItB30B,GAAMkwB,YAAcyE,EACpB30B,EAAMqqB,IAAI8C,SAASuG,IAAMA,GAExBxJ,SCnGH,SAAUlqB,GA+NR,QAAS40B,GAAO/Q,GACd,MAAOA,GAAOqB,eAAe,eAK/B,QAAS2P,MAnOT,GAAIC,IACFD,aAAa,EACbnK,IAAK,SAASA,EAAK3hB,EAAU4hB,GAC3B,GAAmB,gBAARD,GAIT,MAAOR,SAAQQ,IAAIzhB,KAAKtH,KAAM+oB,EAAK3hB,EAAU4hB,EAH7C,IAAIvnB,GAAI,MAAQsnB,CAChB/oB,MAAKyB,GAAK8mB,QAAQQ,IAAIzhB,KAAKtH,KAAMA,KAAKyB,GAAI2F,EAAU4hB,IAKxD4B,QAAOrC,QAAQqC,MAEfwI,QAAS,aAITC,MAAO,aAEPC,gBAAiB,WACXtzB,KAAK4nB,kBAAoB5nB,KAAK4nB,iBAAiBvG,OACjDpT,QAAQC,KAAK,iBAAmBlO,KAAKutB,UAAY,wGAInDvtB,KAAKozB,UACLpzB,KAAKuzB,mBAGAvzB,KAAKwzB,cAAcC,mBAAqB51B,OAAOI,oBAClD+B,KAAKyyB,oBAITc,eAAgB,WACd,MAAIvzB,MAAK0zB,qBACPzlB,SAAQC,KAAK,2BAA4BlO,KAAKutB,YAGhDvtB,KAAK0zB,kBAAmB,EAExB1zB,KAAK2zB,eAEL3zB,KAAKivB,yBAELjvB,KAAKuvB,uBAELvvB,KAAK6tB,yBAEL7tB,KAAKkuB,qBAELluB,MAAKqtB,qBAEPoF,iBAAkB,WACZzyB,KAAK4zB,WAGT5zB,KAAK4zB,UAAW,EAChB5zB,KAAKqxB,2BAILrxB,KAAK6zB,kBAAkB7zB,KAAKmoB,WAI5BnoB,KAAK4uB,gBAAgB,cAErB5uB,KAAKqzB,UAKPS,iBAAkB,WAChB9zB,KAAK+yB,kBAED/yB,KAAK+zB,UACP/zB,KAAK+zB,WAGH/zB,KAAKg0B,aACPh0B,KAAKg0B,cAMFh0B,KAAKi0B,kBACRj0B,KAAKi0B,iBAAkB,EACnBj0B,KAAKk0B,UACPl0B,KAAK4rB,MAAM,cAIjBuI,iBAAkB,WACXn0B,KAAKo0B,gBACRp0B,KAAK0yB,iBAGH1yB,KAAKq0B,UACPr0B,KAAKq0B,WAGHr0B,KAAKs0B,UACPt0B,KAAKs0B,YAITC,oBAAqB,WACnBv0B,KAAK8zB,oBAGPU,iBAAkB,WAChBx0B,KAAKm0B,oBAGPM,wBAAyB,WACvBz0B,KAAK8zB,oBAGPY,qBAAsB,WACpB10B,KAAKm0B,oBAGPN,kBAAmB,SAAStuB,GACtBA,GAAKA,EAAEhF,UACTP,KAAK6zB,kBAAkBtuB,EAAE4iB,WACzB5iB,EAAEovB,iBAAiBrtB,KAAKtH,KAAMuF,EAAEhF,WAIpCo0B,iBAAkB,SAASC,GACzB,GAAIjN,GAAW3nB,KAAK60B,cAAcD,EAClC,IAAIjN,EAAU,CACZ,GAAI/c,GAAO5K,KAAK80B,mBAAmBnN,EACnC3nB,MAAK2zB,YAAYiB,EAAezsB,MAAQyC,IAI5CiqB,cAAe,SAASD,GACtB,MAAOA,GAAev0B,cAAc,aAGtCy0B,mBAAoB,SAASnN,GAC3B,GAAIA,EAAU,CAEZ,GAAI/c,GAAO5K,KAAKtB,mBAKZuzB,EAAMjyB,KAAK8sB,iBAAiBnF,EAMhC,OAJA/c,GAAK/L,YAAYozB,GAEjBjyB,KAAK+0B,gBAAgBnqB,EAAM+c,GAEpB/c,IAIXoqB,kBAAmB,SAASrN,EAAUsN,GACpC,GAAItN,EAAU,CAKZ3nB,KAAKk1B,gBAAkBl1B,IAKvB,IAAIiyB,GAAMjyB,KAAK8sB,iBAAiBnF,EAUhC,OARIsN,GACFj1B,KAAKm1B,aAAalD,EAAKgD,GAEvBj1B,KAAKnB,YAAYozB,GAGnBjyB,KAAK+0B,gBAAgB/0B,MAEdiyB,IAGX8C,gBAAiB,SAASnqB,GAExB5K,KAAKo1B,sBAAsBxqB,GAE3B9M,gBAAgB0K,SAASoC,IAG3BwqB,sBAAuB,SAASxqB,GAE9B,GAAIyqB,GAAIr1B,KAAKq1B,EAAIr1B,KAAKq1B,KAEtB,IAAIzqB,EAEF,IAAK,GAAsBnJ,GADvB+oB,EAAK5f,EAAKiC,iBAAiB,QACtBnL,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAc+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IAChD2zB,EAAE5zB,EAAEuQ,IAAMvQ,GAIhB6zB,yBAA0B,SAASntB,GAEpB,UAATA,GAA6B,UAATA,GACtBnI,KAAKouB,oBAAoBjmB,EAAMnI,KAAKgQ,aAAa7H,IAE/CnI,KAAKu1B,kBACPv1B,KAAKu1B,iBAAiB1Q,MAAM7kB,KAAM0b,YAGtC8Z,WAAY,SAAS7yB,EAAM8yB,GACzB,GAAInqB,GAAW,GAAIM,kBAAiB,SAAS+B,GAC3C8nB,EAASnuB,KAAKtH,KAAMsL,EAAUqC,GAC9BrC,EAASoqB,cACTvyB,KAAKnD,MACPsL,GAASgB,QAAQ3J,GAAOsJ,WAAW,EAAMD,SAAS,KAYtDknB,GAAYxsB,UAAYysB,EACxBA,EAAKwC,YAAczC,EAInB70B,EAAMu3B,KAAO1C,EACb70B,EAAM40B,OAASA,EACf50B,EAAMqqB,IAAI8C,SAAS2H,KAAOA,GAEzB5K,SC/OH,SAAUlqB,GA8ER,QAASyrB,GAAepjB,GACtB,MAAOA,GAAUyhB,UAGnB,QAAS0N,GAAYC,EAASh0B,GAC5B,GAAIqG,GAAO,GAAI4tB,GAAK,CAChBj0B,KACFqG,EAAOrG,EAAKyrB,UACZwI,EAAKj0B,EAAKksB,aAAa,MAEzB,IAAI1qB,GAAWwoB,SAASkK,UAAUC,kBAAkB9tB,EAAM4tB,EAC1D,OAAOjK,UAASkK,UAAUH,YAAYC,EAASxyB,GArFjD,GAII4yB,IAJMr4B,OAAOsvB,aAIW,WACxBgJ,EAAyB,aAEzBzyB,GACFwyB,sBAAuBA,EAMvBE,wBAAyB,WAEvB,GAAI/3B,GAAQ2B,KAAKq2B,gBACjB,IAAIh4B,IAAU2B,KAAKs2B,mBAAmBj4B,EAAO2B,KAAKutB,WAAY,CAG5D,IADA,GAAI7C,GAAQZ,EAAe9pB,MAAO81B,EAAU,GACrCpL,GAASA,EAAMnqB,SACpBu1B,GAAWpL,EAAMnqB,QAAQg2B,gBAAgBJ,GACzCzL,EAAQZ,EAAeY,EAErBoL,IACF91B,KAAKw2B,oBAAoBV,EAASz3B,KAIxCo4B,kBAAmB,SAAS7yB,EAAOuE,EAAM9J,GACvC,GAAIA,GAAQA,GAAS2B,KAAKq2B,iBAAkBluB,EAAOA,GAAQ,EAC3D,IAAI9J,IAAU2B,KAAKs2B,mBAAmBj4B,EAAO2B,KAAKutB,UAAYplB,GAAO,CACnE,GAAI2tB,GAAU,EACd,IAAIlyB,YAAiB4H,OACnB,IAAK,GAAyB5M,GAArB8C,EAAE,EAAGgH,EAAE9E,EAAMjC,OAAc+G,EAAFhH,IAAS9C,EAAEgF,EAAMlC,IAAKA,IACtDo0B,GAAWl3B,EAAEwF,YAAc,WAG7B0xB,GAAUlyB,EAAMQ,WAElBpE,MAAKw2B,oBAAoBV,EAASz3B,EAAO8J,KAG7CquB,oBAAqB,SAASV,EAASz3B,EAAO8J,GAG5C,GAFA9J,EAAQA,GAAS2B,KAAKq2B,iBACtBluB,EAAOA,GAAQ,GACV9J,EAAL,CAGIR,OAAOI,oBACT63B,EAAUD,EAAYC,EAASz3B,EAAMyD,MAEvC,IAAI8B,GAAQ5D,KAAKO,QAAQm2B,oBAAoBZ,EACzCK,EACJ5N,SAAQoO,kBAAkB/yB,EAAOvF,GAEjCA,EAAMu4B,aAAa52B,KAAKutB,UAAYplB,IAAQ,IAE9CkuB,eAAgB,SAAS1zB,GAGvB,IADA,GAAIlB,GAAIkB,GAAQ3C,KACTyB,EAAEnC,YACPmC,EAAIA,EAAEnC,UAER,OAAOmC,IAET60B,mBAAoB,SAASj4B,EAAO8J,GAElC,MADA9J,GAAMu4B,aAAev4B,EAAMu4B,iBACpBv4B,EAAMu4B,aAAazuB,IAsB9B9J,GAAMqqB,IAAI8C,SAAS9nB,OAASA,GAE3B6kB,SChGH,SAAUlqB,GAUR,QAASkC,GAAQ4H,EAAMzB,GACrB,GAAyB,IAArBgV,UAAU/Z,QAAwC,gBAAjB+Z,WAAU,GAAiB,CAC9DhV,EAAYyB,CACZ,IAAI0uB,GAASr4B,SAASs4B,cAGtB,IAFA3uB,EAAO0uB,GAAUA,EAAOv3B,YAAcu3B,EAAOv3B,WAAW0Q,aACpD6mB,EAAOv3B,WAAW0Q,aAAa,QAAU,IACxC7H,EACH,KAAM,sCAGV,GAAI4uB,EAAuB5uB,GACzB,KAAM,sDAAwDA,CAGhE6uB,GAAkB7uB,EAAMzB,GAExBuwB,EAAgB9uB,GAKlB,QAAS+uB,GAAoB/uB,EAAMgvB,GACjCC,EAAcjvB,GAAQgvB,EAKxB,QAASF,GAAgB9uB,GACnBivB,EAAcjvB,KAChBivB,EAAcjvB,GAAMkvB,0BACbD,GAAcjvB,IAgBzB,QAAS6uB,GAAkB7uB,EAAMzB,GAC/B,MAAO4wB,GAAiBnvB,GAAQzB,MAGlC,QAASqwB,GAAuB5uB,GAC9B,MAAOmvB,GAAiBnvB,GAzD1B,GAAIsgB,GAASpqB,EAAMoqB,OA+Bf2O,GA9BM/4B,EAAMqqB,QAiDZ4O,IAYJj5B,GAAM04B,uBAAyBA,EAC/B14B,EAAM64B,oBAAsBA,EAO5Br5B,OAAO0qB,QAAUhoB,EAKjBkoB,EAAOF,QAASlqB,EAOhB,IAAIk5B,GAAezL,SAAS0L,qBAC5B,IAAID,EACF,IAAK,GAAgCl1B,GAA5BX,EAAE,EAAGgH,EAAE6uB,EAAa51B,OAAc+G,EAAFhH,IAASW,EAAEk1B,EAAa71B,IAAKA,IACpEnB,EAAQskB,MAAM,KAAMxiB,IAIvBkmB,SC7FH,SAAUlqB,GAEV,GAAIW,IACFy4B,oBAAqB,SAAS90B,GAC5BmpB,SAAS4L,YAAYC,WAAWh1B,IAElCi1B,kBAAmB,WAEjB,GAAIC,GAAY73B,KAAKgQ,aAAa,cAAgB,GAC9CpF,EAAO,GAAIktB,KAAID,EAAW73B,KAAKwzB,cAAcuE,QACjD/3B,MAAK0G,UAAUsxB,YAAc,SAASC,EAAS9E,GAC7C,GAAI5wB,GAAI,GAAIu1B,KAAIG,EAAS9E,GAAQvoB,EACjC,OAAOrI,GAAE21B,OAMf75B,GAAMqqB,IAAI6C,YAAYvsB,KAAOA,GAE1BupB,SCpBH,SAAUlqB,GA0KR,QAAS85B,GAAmBC,EAAOC,GACjC,GAAIH,GAAO,GAAIJ,KAAIM,EAAMpoB,aAAa,QAASqoB,GAASH,IACxD,OAAO,YAAeA,EAAO,KAG/B,QAASvB,GAAkB/yB,EAAOvF,GAChC,GAAIuF,EAAO,CACLvF,IAAUG,WACZH,EAAQG,SAASY,MAEfvB,OAAOI,oBACTI,EAAQG,SAASY,KAOnB,IAAIkL,GAAQguB,EAAmB10B,EAAMQ,aACjCm0B,EAAO30B,EAAMoM,aAAakmB,EAC1BqC,IACFjuB,EAAM2jB,aAAaiI,EAAuBqC,EAI5C,IAAItD,GAAU52B,EAAMm6B,iBACpB,IAAIn6B,IAAUG,SAASY,KAAM,CAC3B,GAAIkE,GAAW,SAAW4yB,EAAwB,IAC9CuC,EAAKj6B,SAASY,KAAKyN,iBAAiBvJ,EACpCm1B,GAAG92B,SACLszB,EAAUwD,EAAGA,EAAG92B,OAAO,GAAG+2B,oBAG9Br6B,EAAM82B,aAAa7qB,EAAO2qB,IAI9B,QAASqD,GAAmBxC,EAASz3B,GACnCA,EAAQA,GAASG,SACjBH,EAAQA,EAAMI,cAAgBJ,EAAQA,EAAMm1B,aAC5C,IAAI5vB,GAAQvF,EAAMI,cAAc,QAEhC,OADAmF,GAAMQ,YAAc0xB,EACblyB,EAGT,QAAS+0B,GAAiBP,GACxB,MAAQA,IAASA,EAAMQ,YAAe,GAGxC,QAASC,GAAgBl2B,EAAMm2B,GAC7B,MAAIC,GACKA,EAAQzxB,KAAK3E,EAAMm2B,GAD5B,OAxNF,GACIpQ,IADM7qB,OAAOsvB,aACP9uB,EAAMqqB,IAAI8C,SAAS9nB,QACzBwyB,EAAwBxN,EAAIwN,sBAI5B8C,EAAiB,QACjBC,EAAuB,UACvBC,EAAiB,uBACjBC,EAAqB,SACrBC,EAAa,gBAEb11B,GAEF21B,WAAY,SAASjyB,GACnB,GAAIugB,GAAW3nB,KAAK60B,gBAChByE,EAAU3R,GAAY3nB,KAAKu5B,iBAC/B,IAAID,EAAS,CACXt5B,KAAKw5B,sBAAsBF,EAC3B,IAAI51B,GAAS1D,KAAKy5B,mBAAmBH,EACrC,IAAI51B,EAAO/B,OAAQ,CACjB,GAAI+3B,GAAc/R,EAAS6L,cAAcuE,OACzC,OAAOjM,UAAS6N,cAAcN,WAAW31B,EAAQg2B,EAAatyB,IAG9DA,GACFA,KAGJoyB,sBAAuB,SAAS5uB,GAE9B,IAAK,GAAsBhM,GAAGskB,EAD1BuV,EAAK7tB,EAAKiC,iBAAiBqsB,GACtBx3B,EAAE,EAAGgH,EAAE+vB,EAAG92B,OAAiB+G,EAAFhH,IAAS9C,EAAE65B,EAAG/2B,IAAKA,IACnDwhB,EAAIoV,EAAmBH,EAAmBv5B,EAAGoB,KAAKwzB,cAAcuE,SAC5D/3B,KAAKwzB,eACTxzB,KAAK45B,oBAAoB1W,EAAGtkB,GAC5BA,EAAEU,WAAWu6B,aAAa3W,EAAGtkB,IAGjCg7B,oBAAqB,SAASh2B,EAAOk2B,GACnC,IAAK,GAA0C17B,GAAtCsD,EAAE,EAAGosB,EAAGgM,EAAK5tB,WAAYxD,EAAEolB,EAAGnsB,QAAYvD,EAAE0vB,EAAGpsB,KAASgH,EAAFhH,EAAKA,IACnD,QAAXtD,EAAE+J,MAA6B,SAAX/J,EAAE+J,MACxBvE,EAAMqqB,aAAa7vB,EAAE+J,KAAM/J,EAAEwV,QAInC6lB,mBAAoB,SAAS7uB,GAC3B,GAAImvB,KACJ,IAAInvB,EAEF,IAAK,GAAsBhM,GADvB65B,EAAK7tB,EAAKiC,iBAAiBmsB,GACtBt3B,EAAE,EAAGgH,EAAE+vB,EAAG92B,OAAc+G,EAAFhH,IAAS9C,EAAE65B,EAAG/2B,IAAKA,IAC5C9C,EAAEwF,YAAY6X,MAAMgd,IACtBc,EAAUt5B,KAAK7B,EAIrB,OAAOm7B,IAOTC,cAAe,WACbh6B,KAAKi6B,cACLj6B,KAAKk6B,cACLl6B,KAAKm6B,qBACLn6B,KAAKo6B,uBAKPH,YAAa,WACXj6B,KAAKq6B,OAASr6B,KAAKs6B,UAAUpB,GAC7Bl5B,KAAKq6B,OAAOt2B,QAAQ,SAASnF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAI/Bs7B,YAAa,WACXl6B,KAAK0D,OAAS1D,KAAKs6B,UAAUtB,EAAiB,IAAMI,EAAa,KACjEp5B,KAAK0D,OAAOK,QAAQ,SAASnF,GACvBA,EAAEU,YACJV,EAAEU,WAAWC,YAAYX,MAa/Bu7B,mBAAoB,WAClB,GAAIE,GAASr6B,KAAKq6B,OAAO1uB,OAAO,SAAS/M,GACvC,OAAQA,EAAEovB,aAAaoL,KAErBE,EAAUt5B,KAAKu5B,iBACnB,IAAID,EAAS,CACX,GAAIxD,GAAU,EAId,IAHAuE,EAAOt2B,QAAQ,SAASq0B,GACtBtC,GAAW6C,EAAiBP,GAAS,OAEnCtC,EAAS,CACX,GAAIlyB,GAAQ00B,EAAmBxC,EAAS91B,KAAKwzB,cAC7C8F,GAAQnE,aAAavxB,EAAO01B,EAAQiB,eAI1CD,UAAW,SAASh3B,EAAUk3B,GAC5B,GAAIC,GAAQz6B,KAAK6M,iBAAiBvJ,GAAUo3B,QACxCpB,EAAUt5B,KAAKu5B,iBACnB,IAAID,EAAS,CACX,GAAIqB,GAAgBrB,EAAQzsB,iBAAiBvJ,GAAUo3B,OACvDD,GAAQA,EAAMrtB,OAAOutB,GAEvB,MAAOH,GAAUC,EAAM9uB,OAAO6uB,GAAWC,GAW3CL,oBAAqB,WACnB,GAAIx2B,GAAQ5D,KAAK46B,cAAczB,EAC/BxC,GAAkB/yB,EAAOpF,SAASY,OAEpCm3B,gBAAiB,SAASsE,GACxB,GAAI/E,GAAU,GAEVxyB,EAAW,IAAM81B,EAAa,IAAMyB,EAAkB,IACtDL,EAAU,SAAS57B,GACrB,MAAOi6B,GAAgBj6B,EAAG0E,IAExB+2B,EAASr6B,KAAKq6B,OAAO1uB,OAAO6uB,EAChCH,GAAOt2B,QAAQ,SAASq0B,GACtBtC,GAAW6C,EAAiBP,GAAS,QAGvC,IAAI10B,GAAS1D,KAAK0D,OAAOiI,OAAO6uB,EAIhC,OAHA92B,GAAOK,QAAQ,SAASH,GACtBkyB,GAAWlyB,EAAMQ,YAAc,SAE1B0xB,GAET8E,cAAe,SAASC,GACtB,GAAI/E,GAAU91B,KAAKu2B,gBAAgBsE,EACnC,OAAO76B,MAAK02B,oBAAoBZ,EAAS+E,IAE3CnE,oBAAqB,SAASZ,EAAS+E,GACrC,GAAI/E,EAAS,CACX,GAAIlyB,GAAQ00B,EAAmBxC,EAG/B,OAFAlyB,GAAMqqB,aAAaiI,EAAuBl2B,KAAKgQ,aAAa,QACxD,IAAM6qB,GACHj3B,KA2DT2B,EAAIokB,YAAYjjB,UAChBqyB,EAAUxzB,EAAEwzB,SAAWxzB,EAAEszB,iBAAmBtzB,EAAEu1B,uBAC3Cv1B,EAAEw1B,kBAIT18B,GAAMqqB,IAAI6C,YAAY7nB,OAASA,EAC/BrF,EAAMs4B,kBAAoBA,GAEzBpO,SCzOH,SAAUlqB,GAIR,GACIqqB,IADM7qB,OAAOsvB,aACP9uB,EAAMqqB,IAAI8C,SAASljB,QACzB8kB,EAAe1E,EAAI0E,aAGnB4N,MAEF,uBACA,qBACA,sBACA,cACA,aACA,kBACAj3B,QAAQ,SAASc,GACjBm2B,EAAoBn2B,EAAEse,eAAiBte,GAGzC,IAAIyD,IACF2yB,gBAAiB,WAEf,GAAIC,GAAYl7B,KAAK0G,UAAU4mB,cAE/BttB,MAAKm7B,sBAAsBD,IAE7BC,sBAAuB,SAASD,GAE9B,IAAK,GAAS98B,GAALsD,EAAE,EAAMtD,EAAE4B,KAAKkM,WAAWxK,GAAIA,IAEjC1B,KAAKo7B,eAAeh9B,EAAE+J,QAExB+yB,EAAUl7B,KAAKq7B,kBAAkBj9B,EAAE+J,OAAS/J,EAAEwV,MAAMgI,QAAQ,KAAM,IAC7DA,QAAQ,KAAM,IAAI0f,SAK7BF,eAAgB,SAAU35B,GACxB,MAAOA,IAAe,MAATA,EAAE,IAAyB,MAATA,EAAE,IAAyB,MAATA,EAAE,IAErD45B,kBAAmB,SAAS55B,GAC1B,MAAOA,GAAEiK,MAAM6vB,IAEjBC,eAAgB,SAAS74B,GACvB,KAAOA,EAAKrD,YAAY,CACtB,GAAIqD,EAAKuyB,gBACP,MAAOvyB,GAAKuyB,eAEdvyB,GAAOA,EAAKrD,WAEd,MAAOqD,GAAKb,MAEd2rB,gBAAiB,SAASgO,EAAYj8B,EAAQirB,GAC5C,GAAIniB,GAAStI,IACb,OAAO,UAAS6E,GACT42B,GAAeA,EAAWvI,cAC7BuI,EAAanzB,EAAOkzB,eAAeh8B,GAGrC,IAAIic,IAAQ5W,EAAGA,EAAEwN,OAAQxN,EAAEhD,cAC3B45B,GAAW/N,eAAe+N,EAAYhR,EAAQhP,KAGlDigB,oBAAqB,SAASjY,EAAYtb,GACxC,GAAKnI,KAAKo7B,eAAejzB,GAAzB,CAGA,GAAIwzB,GAAY37B,KAAKq7B,kBAAkBlzB,EACvCwzB,GAAYX,EAAoBW,IAAcA,CAE9C,IAAIrzB,GAAStI,IAEb,OAAO,UAASqhB,EAAO1e,EAAM2e,GAW3B,QAASsa,KACP,MAAO,MAAQnY,EAAa,MAX9B,GAAIoY,GAAUvzB,EAAOmlB,gBAAgBrd,OAAWzN,EAAM8gB,EAGtD,OAFA9gB,GAAK7D,iBAAiB68B,EAAWE,GAE7Bva,EAAJ,QAYEiF,KAAMqV,EACNpV,eAAgBoV,EAChBlV,MAAO,WACL/jB,EAAKoH,oBAAoB4xB,EAAWE,SAO1CN,EAAenO,EAAazrB,MAGhCtD,GAAMqqB,IAAI6C,YAAYjjB,OAASA,GAE9BigB,SC1GH,SAAUlqB,GAIR,GAAI0e,IACF+e,eAAgB,SAASp1B,GAEvB,GAAiCgX,GAA7BpR,EAAU5F,EAAU4F,OACxB,KAAK,GAAI7K,KAAKiF,GACQ,YAAhBjF,EAAEiK,MAAM,MACLY,IACHA,EAAY5F,EAAU4F,YAExBoR,EAAWjc,EAAEiK,MAAM,EAAG,IACtBY,EAAQoR,GAAYpR,EAAQoR,IAAajc,IAI/Cs6B,iBAAkB,SAASr1B,GAEzB,GAAIyoB,GAAIzoB,EAAU4F,OAClB,IAAI6iB,EAAG,CACL,GAAI6M,KACJ,KAAK,GAAIv6B,KAAK0tB,GAEZ,IAAK,GAAS8M,GADVC,EAAQz6B,EAAE06B,MAAM,KACXz6B,EAAE,EAAOu6B,EAAGC,EAAMx6B,GAAIA,IAC7Bs6B,EAASC,GAAM9M,EAAE1tB,EAGrBiF,GAAU4F,QAAU0vB,IAGxBI,qBAAsB,SAAS11B,GAC7B,GAAIA,EAAU4F,QAAS,CAErB,GAAIlO,GAAIsI,EAAUwoB,gBAClB,KAAK,GAAIztB,KAAKiF,GAAU4F,QAEtB,IAAK,GAAS2vB,GADVC,EAAQz6B,EAAE06B,MAAM,KACXz6B,EAAE,EAAOu6B,EAAGC,EAAMx6B,GAAIA,IAC7BtD,EAAEqC,KAAKw7B,GAIb,GAAIv1B,EAAU+kB,QAAS,CAErB,GAAIrtB,GAAIsI,EAAU21B,gBAClB,KAAK,GAAI56B,KAAKiF,GAAU+kB,QACtBrtB,EAAEqC,KAAKgB,GAGX,GAAIiF,EAAU0b,SAAU,CAEtB,GAAIhkB,GAAIsI,EAAU4qB,iBAClB,KAAK,GAAI7vB,KAAKiF,GAAU0b,SACtBhkB,EAAEqC,KAAKgB,KAIb66B,kBAAmB,SAAS51B,EAAWysB,GAErC,GAAI1H,GAAU/kB,EAAU+kB,OACpBA,KAEFzrB,KAAKu8B,kBAAkB9Q,EAAS/kB,EAAWysB,GAE3CzsB,EAAUynB,WAAanuB,KAAKw8B,aAAa/Q,KAS7C8Q,kBAAmB,SAASE,EAAqB/1B,GAE/CA,EAAUwpB,QAAUxpB,EAAUwpB,WAG9B,KAAK,GAAIzuB,KAAKg7B,GAAqB,CACjC,GAAIC,GAAqBD,EAAoBh7B,GACzCk7B,EAAW38B,KAAK48B,yBAAyBF,EAChBtsB,UAAzB1J,EAAUwpB,QAAQzuB,IAAiC2O,SAAbusB,IACxCj2B,EAAUwpB,QAAQzuB,GAAKk7B,GAEJvsB,SAAjB1J,EAAUjF,KACZiF,EAAUjF,GAAKzB,KAAK68B,mBAAmBH,MAI7CG,mBAAoB,SAASH,GAC3B,GAAI9oB,GAAsC,gBAAvB8oB,IACfA,EAAqBA,EAAmB9oB,MAAQ8oB,CACpD,OAAiBtsB,UAAVwD,EAAsBA,EAAQ,MAGvCgpB,yBAA0B,SAASF,GACjC,MAAkC,gBAAvBA,IACPA,GAAqDtsB,SAA/BssB,EAAmBxM,QACpCwM,EAAmBxM,QAF5B,QAKFsM,aAAc,SAASzf,GACrB,GAAI7Y,KACJ,KAAK,GAAIzC,KAAKsb,GACZ7Y,EAAIzC,EAAE0hB,eAAiB1hB,CAEzB,OAAOyC,IAET44B,uBAAwB,SAAS30B,GAC/B,GAAIuiB,GAAQ1qB,KAAK0G,UAEbwqB,EAAc/oB,EAAO,IACrBgpB,EAAqBhpB,EAAO,aAChCuiB,GAAMwG,GAAexG,EAAMviB,GAE3BjD,OAAOkjB,eAAesC,EAAOviB,GAC3BjB,IAAK,WACH,GAAI8pB,GAAahxB,KAAKmxB,EAItB,OAHIH,IACFA,EAAWvK,UAENzmB,KAAKkxB,IAEdtqB,IAAK,SAASgN,GACZ,GAAIod,GAAahxB,KAAKmxB,EACtB,IAAIH,EAEF,WADAA,GAAWjN,SAASnQ,EAItB,IAAI5G,GAAWhN,KAAKkxB,EAIpB,OAHAlxB,MAAKkxB,GAAetd,EACpB5T,KAAKwwB,yBAAyBroB,EAAMyL,EAAO5G,GAEpC4G,GAETyU,cAAc,KAGlB0U,wBAAyB,SAASr2B,GAChC,GAAI8jB,GAAK9jB,EAAU21B,aACnB,IAAI7R,GAAMA,EAAG7oB,OACX,IAAK,GAAsBF,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAkB+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IACpD1B,KAAK88B,uBAAuBr7B,EAIhC,IAAI+oB,GAAK9jB,EAAU4qB,cACnB,IAAI9G,GAAMA,EAAG7oB,OACX,IAAK,GAAsBF,GAAlBC,EAAE,EAAGgH,EAAE8hB,EAAG7oB,OAAkB+G,EAAFhH,IAASD,EAAE+oB,EAAG9oB,IAAKA,IACpD1B,KAAK88B,uBAAuBr7B,IASpCpD,GAAMqqB,IAAI6C,YAAYxO,WAAaA,GAElCwL,SCnKH,SAAUlqB,GAIR,GAAI2+B,GAAuB,aACvBC,EAAmB,OAInB/wB,GAEFgxB,yBAA0B,SAASx2B,GAEjC1G,KAAKm9B,cAAcz2B,EAAW,aAE9B1G,KAAKm9B,cAAcz2B,EAAW,wBAGhC02B,kBAAmB,SAAS12B,EAAWysB,GAErC,GAAIjnB,GAAalM,KAAKgQ,aAAagtB,EACnC,IAAI9wB,EAMF,IAAK,GAAyBzK,GAJ1BgqB,EAAU/kB,EAAU+kB,UAAY/kB,EAAU+kB,YAE1CyQ,EAAQhwB,EAAWiwB,MAAMc,GAEpBv7B,EAAE,EAAGgH,EAAEwzB,EAAMv6B,OAAa+G,EAAFhH,EAAKA,IAKpC,GAHAD,EAAIy6B,EAAMx6B,GAAG45B,OAGT75B,GAAoB2O,SAAfqb,EAAQhqB,GAAkB,CAMjC,IACE,GAAI47B,GAAwBjtB,SAAZ+iB,EAAK1xB,GACrB,MAAMb,GACNy8B,GAAW,EAIRA,IACH5R,EAAQhqB,GAAK8mB,QAAQyE,OAQ/BsQ,6BAA8B,WAK5B,IAAK,GAAsBl/B,GAHvBm/B,EAAWv9B,KAAK0G,UAAUqnB,oBAE1BD,EAAK9tB,KAAKkM,WACLxK,EAAE,EAAGgH,EAAEolB,EAAGnsB,OAAc+G,EAAFhH,IAAStD,EAAE0vB,EAAGpsB,IAAKA,IAC5C1B,KAAKw9B,oBAAoBp/B,EAAE+J,QAC7Bo1B,EAASn/B,EAAE+J,MAAQ/J,EAAEwV,QAK3B4pB,oBAAqB,SAASr1B,GAC5B,OAAQnI,KAAKy9B,UAAUt1B,IAA6B,QAApBA,EAAKuD,MAAM,EAAE,IAI/C+xB,WACEt1B,KAAM,EACNu1B,UAAW,EACX/H,YAAa,EACbgI,SAAU,EACVC,UAAW,EACXC,gBAAiB,GAMrB3xB,GAAWuxB,UAAUT,GAAwB,EAI7C3+B,EAAMqqB,IAAI6C,YAAYrf,WAAaA,GAElCqc,SCxFH,SAAUlqB,GAGR,GAAIiK,GAASjK,EAAMqqB,IAAI6C,YAAYjjB,OAE/BipB,EAAS,GAAI3N,oBACb/C,EAAiB0Q,EAAO1Q,cAI5B0Q,GAAO1Q,eAAiB,SAAS4C,EAAYtb,EAAMxF,GACjD,MAAO2F,GAAOozB,oBAAoBjY,EAAYtb,EAAMxF,IAC7Cke,EAAevZ,KAAKiqB,EAAQ9N,EAAYtb,EAAMxF,GAIvD,IAAIovB,IACFR,OAAQA,EACRsD,cAAe,WACb,MAAO70B,MAAKK,cAAc,aAE5Bk5B,gBAAiB,WACf,GAAI5R,GAAW3nB,KAAK60B,eACpB,OAAOlN,IAAYmE,SAASyN,gBAAgB5R,IAE9CmW,uBAAwB,SAASnW,GAC3BA,IACFA,EAASqK,gBAAkBhyB,KAAKuxB,SAMtClzB,GAAMqqB,IAAI6C,YAAYwG,IAAMA,GAE3BxJ,SCnCH,SAAUlqB,GAoOR,QAAS0/B,GAAyBr3B,GAChC,IAAKxB,OAAOijB,UAAW,CACrB,GAAI6V,GAAW94B,OAAO4kB,eAAepjB,EACrCA,GAAUyhB,UAAY6V,EAClB/K,EAAO+K,KACTA,EAAS7V,UAAYjjB,OAAO4kB,eAAekU,KArOjD,GAAItV,GAAMrqB,EAAMqqB,IACZuK,EAAS50B,EAAM40B,OACfxK,EAASpqB,EAAMoqB,OAIf/hB,GAEF8B,SAAU,SAASL,EAAM81B,GAEvBj+B,KAAKk+B,eAAe/1B,EAAM81B,GAE1Bj+B,KAAKg3B,kBAAkB7uB,EAAM81B,GAE7Bj+B,KAAKm+B,sBAGPD,eAAgB,SAAS/1B,EAAM81B,GAE7B,GAAIG,GAAY//B,EAAM04B,uBAAuB5uB,GAEzCgrB,EAAOnzB,KAAKq+B,sBAAsBJ,EAEtCj+B,MAAKs+B,sBAAsBF,EAAWjL,GAEtCnzB,KAAK0G,UAAY1G,KAAKu+B,gBAAgBH,EAAWjL,GAEjDnzB,KAAKw+B,qBAAqBr2B,EAAM81B,IAGlCK,sBAAuB,SAAS53B,EAAWysB,GAGzCzsB,EAAUnG,QAAUP,KAEpBA,KAAKo9B,kBAAkB12B,EAAWysB,GAElCnzB,KAAKs8B,kBAAkB51B,EAAWysB,GAElCnzB,KAAK87B,eAAep1B,GAEpB1G,KAAK+7B,iBAAiBr1B,IAGxB63B,gBAAiB,SAAS73B,EAAWysB,GAEnCnzB,KAAKy+B,gBAAgB/3B,EAAWysB,EAEhC,IAAIuL,GAAU1+B,KAAK2+B,YAAYj4B,EAAWysB,EAG1C,OADA4K,GAAyBW,GAClBA,GAGTD,gBAAiB,SAAS/3B,EAAWysB,GAEnCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,UAAWz2B,EAAWysB,GAEzCnzB,KAAKm9B,cAAc,aAAcz2B,EAAWysB,GAE5CnzB,KAAKm9B,cAAc,sBAAuBz2B,EAAWysB,GAErDnzB,KAAKm9B,cAAc,iBAAkBz2B,EAAWysB,IAIlDqL,qBAAsB,SAASr2B,EAAMy2B,GAEnC5+B,KAAKo8B,qBAAqBp8B,KAAK0G,WAC/B1G,KAAK+8B,wBAAwB/8B,KAAK0G,WAElC1G,KAAK89B,uBAAuB99B,KAAK60B,iBAEjC70B,KAAKg6B,gBAELh6B,KAAKy3B,oBAAoBz3B,MAEzBA,KAAKs9B,+BAELt9B,KAAKi7B,kBAKLj7B,KAAK43B,oBAED/5B,OAAOI,mBACT6tB,SAASkK,UAAU6I,YAAY7+B,KAAKu5B,kBAAmBpxB,EAAMy2B,GAG3D5+B,KAAK0G,UAAUo4B,kBACjB9+B,KAAK0G,UAAUo4B,iBAAiB9+B,OAMpCm+B,mBAAoB,WAClB,GAAIY,GAAS/+B,KAAKgQ,aAAa,cAC3B+uB,KACFlhC,OAAOkhC,GAAU/+B,KAAKg/B,OAK1BX,sBAAuB,SAASY,GAC9B,GAAIv4B,GAAY1G,KAAKk/B,kBAAkBD,EACvC,KAAKv4B,EAAW,CAEd,GAAIA,GAAYijB,YAAYE,mBAAmBoV,EAE/Cv4B,GAAY1G,KAAKm/B,cAAcz4B,GAE/B04B,EAAcH,GAAUv4B,EAE1B,MAAOA,IAGTw4B,kBAAmB,SAAS/2B,GAC1B,MAAOi3B,GAAcj3B,IAIvBg3B,cAAe,SAASz4B,GACtB,GAAIA,EAAUwsB,YACZ,MAAOxsB,EAET,IAAI24B,GAAWn6B,OAAOC,OAAOuB,EAkB7B,OAfAgiB,GAAI+C,QAAQ/C,EAAI8C,SAAU6T,GAa1Br/B,KAAKs/B,YAAYD,EAAU34B,EAAWgiB,EAAI8C,SAASuG,IAAK,QAEjDsN,GAGTC,YAAa,SAASD,EAAU34B,EAAWgiB,EAAKvgB,GAC9C,GAAI+hB,GAAS,SAASzO,GACpB,MAAO/U,GAAUyB,GAAM0c,MAAM7kB,KAAMyb,GAErC4jB,GAASl3B,GAAQ,WAEf,MADAnI,MAAKuyB,WAAarI,EACXxB,EAAIvgB,GAAM0c,MAAM7kB,KAAM0b,aAKjCyhB,cAAe,SAASh1B,EAAMzB,EAAWysB,GAEvC,GAAI/qB,GAAS1B,EAAUyB,MAEvBzB,GAAUyB,GAAQnI,KAAK2+B,YAAYv2B,EAAQ+qB,EAAKhrB,KAIlD6uB,kBAAmB,SAAS7uB,EAAMy2B,GAChC,GAAIW,IACF74B,UAAW1G,KAAK0G,WAGd84B,EAAgBx/B,KAAKy/B,kBAAkBb,EACvCY,KACFD,EAAK7B,QAAU8B,GAGjB7V,YAAYnhB,SAASL,EAAMnI,KAAK0G,WAEhC1G,KAAKg/B,KAAOxgC,SAASkhC,gBAAgBv3B,EAAMo3B,IAG7CE,kBAAmB,SAASt3B,GAC1B,GAAIA,GAAQA,EAAKrB,QAAQ,KAAO,EAC9B,MAAOqB,EAEP,IAAI5C,GAAIvF,KAAKk/B,kBAAkB/2B,EAC/B,OAAI5C,GAAEhF,QACGP,KAAKy/B,kBAAkBl6B,EAAEhF,QAAQm9B,SAD1C,SASF0B,IAIF14B,GAAUi4B,YADRz5B,OAAOijB,UACe,SAASjG,EAAQyd,GAIvC,MAHIzd,IAAUyd,GAAazd,IAAWyd,IACpCzd,EAAOiG,UAAYwX,GAEdzd,GAGe,SAASA,EAAQyd,GACvC,GAAIzd,GAAUyd,GAAazd,IAAWyd,EAAW,CAC/C,GAAIjB,GAAUx5B,OAAOC,OAAOw6B,EAC5Bzd,GAASuG,EAAOiW,EAASxc,GAE3B,MAAOA,IAoBXwG,EAAI6C,YAAY7kB,UAAYA,GAE3B6hB,SClPH,SAAUlqB,GAoIR,QAASuhC,GAAgBr/B,GACvB,MAAO/B,UAASyD,SAAS1B,GAAWs/B,EAAYC,EAGlD,QAASC,KACP,MAAOD,GAAYn+B,OAASm+B,EAAY,GAAKD,EAAU,GASzD,QAASG,GAAiB54B,GACxB64B,EAAMC,aAAc,EACpBC,eAAe9M,OAAQ,EACvB+M,YAAYC,iBAAiB,WAC3BJ,EAAMK,iBAAiBl5B,GACvB64B,EAAMC,aAAc,EACpBD,EAAMM,UAjIV,GAAIN,IAEFjX,KAAM,SAASzoB,EAASggC,EAAOpX,GAC7B,GAAIqX,GAAuC,KAA1BxgC,KAAK8G,QAAQvG,IACM,KAAhCkgC,EAAW35B,QAAQvG,EAMvB,OALIigC,KACFxgC,KAAK8K,IAAIvK,GACTA,EAAQmgC,QAAUH,EAClBhgC,EAAQogC,KAAOxX,GAEiB,IAA1BnpB,KAAK8G,QAAQvG,IAEvBuK,IAAK,SAASvK,GAEZq/B,EAAgBr/B,GAASE,KAAKF,IAEhCuG,QAAS,SAASvG,GAChB,GAAImB,GAAIk+B,EAAgBr/B,GAASuG,QAAQvG,EAKzC,OAJImB,IAAK,GAAKlD,SAASyD,SAAS1B,KAC9BmB,GAAM0+B,YAAYQ,WAAaR,YAAY/M,MACzCyM,EAAYn+B,OAAS,KAElBD,GAGTynB,GAAI,SAAS5oB,GACX,GAAIsgC,GAAU7gC,KAAK+K,OAAOxK,EACtBsgC,KACF7gC,KAAK8gC,gBAAgBD,GACrB7gC,KAAKugC,UAGTx1B,OAAQ,SAASxK,GACf,GAAImB,GAAI1B,KAAK8G,QAAQvG,EACrB,IAAU,IAANmB,EAIJ,MAAOk+B,GAAgBr/B,GAASwgC,SAElCR,MAAO,WAEL,GAAIhgC,GAAUP,KAAKghC,aAInB,OAHIzgC,IACFA,EAAQmgC,QAAQp5B,KAAK/G,GAEnBP,KAAKihC,YACPjhC,KAAKqzB,SACE,GAFT,QAKF2N,YAAa,WACX,MAAOjB,MAETkB,SAAU,WACR,OAAQjhC,KAAKkgC,aAAelgC,KAAKkhC,WAEnCA,QAAS,WACP,OAAQpB,EAAYn+B,SAAWk+B,EAAUl+B,QAE3Cm/B,gBAAiB,SAASvgC,GACxBkgC,EAAWhgC,KAAKF,IAElBwrB,MAAO,WAEL,IADA,GAAIxrB,GACGkgC,EAAW9+B,QAChBpB,EAAUkgC,EAAWM,QACrBxgC,EAAQogC,KAAKr5B,KAAK/G,GAClBA,EAAQmgC,QAAUngC,EAAQogC,KAAO,MAGrCtN,MAAO,WACLrzB,KAAK+rB,QAODoU,eAAe9M,SAAU,IAC3B8M,eAAegB,oBAAoB3iC,UACnC2hC,eAAe9M,OAAQ,GAEzBvH,SAASC,QACTrhB,sBAAsB1K,KAAKohC,sBAE7Bd,iBAAkB,SAASl5B,GACrBA,GACFi6B,EAAe5gC,KAAK2G,IAGxBg6B,oBAAqB,WACnB,GAAIC,EAEF,IADA,GAAI/3B,GACG+3B,EAAe1/B,SACpB2H,EAAK+3B,EAAeN;EAK1Bb,aAAa,GAGXO,KAEAX,KACAD,KACAwB,IAYJ7iC,UAASM,iBAAiB,qBAAsB,WAC9CqhC,eAAe9M,OAAQ,IAczBh1B,EAAM4hC,MAAQA,EACd5hC,EAAM2hC,iBAAmBA,GACxBzX,SC/JH,SAAUlqB,GAIR,QAASijC,GAAeC,EAAmBn6B,GACrCm6B,GACF/iC,SAASY,KAAKP,YAAY0iC,GAC1BvB,EAAiB54B,IACRA,GACTA,IAIJ,QAASo6B,GAAWC,EAAMr6B,GACxB,GAAIq6B,GAAQA,EAAK9/B,OAAQ,CAErB,IAAK,GAAwB+/B,GAAK5H,EAD9B6H,EAAOnjC,SAASojC,yBACXlgC,EAAE,EAAGgH,EAAE+4B,EAAK9/B,OAAsB+G,EAAFhH,IAASggC,EAAID,EAAK//B,IAAKA,IAC9Do4B,EAAOt7B,SAASC,cAAc,QAC9Bq7B,EAAK+H,IAAM,SACX/H,EAAK5B,KAAOwJ,EACZC,EAAK9iC,YAAYi7B,EAEnBwH,GAAeK,EAAMv6B,OACdA,IACTA,IAtBJ,GAAI44B,GAAmB3hC,EAAM2hC,gBA2B7B3hC,GAAMyjC,OAASN,EACfnjC,EAAMijC,eAAiBA,GAEtB/Y,SChCH,SAAUlqB,GAuHR,QAAS0jC,GAAa55B,GACpB,MAAOnK,SAAQ2rB,YAAYE,mBAAmB1hB,IAGhD,QAAS65B,GAAY75B,GACnB,MAAQA,IAAQA,EAAKrB,QAAQ,MAAQ,EAxHvC,GAAI2hB,GAASpqB,EAAMoqB,OACfC,EAAMrqB,EAAMqqB,IACZuX,EAAQ5hC,EAAM4hC,MACdD,EAAmB3hC,EAAM2hC,iBACzBjJ,EAAyB14B,EAAM04B,uBAC/BG,EAAsB74B,EAAM64B,oBAI5BxwB,EAAY+hB,EAAOvjB,OAAOC,OAAOwkB,YAAYjjB,YAE/C4sB,gBAAiB,WACXtzB,KAAKgQ,aAAa,SACpBhQ,KAAKiiC,QAITA,KAAM,WAEJjiC,KAAKmI,KAAOnI,KAAKgQ,aAAa,QAC9BhQ,KAAK09B,QAAU19B,KAAKgQ,aAAa,WAEjChQ,KAAKkiC,gBAELliC,KAAKq3B,qBAGPA,kBAAmB,WACdr3B,KAAKmiC,YACJniC,KAAKk3B,oBAAoBl3B,KAAKmI,OAC9BnI,KAAKoiC,mBACLpiC,KAAKqiC,uBAKTpC,EAAM9W,GAAGnpB,OAKXsiC,UAAW,WAILN,EAAYhiC,KAAK09B,WAAaqE,EAAa/hC,KAAK09B,UAClDzvB,QAAQC,KAAK,sGACuClO,KAAKmI,KACrDnI,KAAK09B,SAEX19B,KAAKwI,SAASxI,KAAKmI,KAAMnI,KAAK09B,SAC9B19B,KAAKmiC,YAAa,GAIpBjL,oBAAqB,SAAS/uB,GAC5B,MAAK4uB,GAAuB5uB,GAA5B,QAEE+uB,EAAoB/uB,EAAMnI,MAE1BA,KAAKuiC,eAAep6B,IAEb,IAIXo6B,eAAgB,SAASp6B,GAEvB,GAAInI,KAAKguB,aAAa,cAAgBhuB,KAAK29B,SAQzC,GAPA39B,KAAK29B,UAAW,EAOZ9/B,OAAOsiC,iBAAmBA,eAAeS,UAC3CrY,QAAQpgB,OACH,CACL,GAAI0uB,GAASr4B,SAASC,cAAc,SACpCo4B,GAAOzyB,YAAc,YAAe+D,EAAO,MAC3CnI,KAAKnB,YAAYg4B,KAKvBwL,oBAAqB,WACnB,MAAOriC,MAAKwiC,iBAMdJ,gBAAiB,WACf,MAAOnC,GAAMjX,KAAKhpB,KAAMA,KAAKq3B,kBAAmBr3B,KAAKsiC,YAGvDJ,cAAe,WACbliC,KAAKwiC,iBAAkB,EACvBxiC,KAAKq5B,WAAW,WACdr5B,KAAKwiC,iBAAkB,EACvBxiC,KAAKq3B,qBACLl0B,KAAKnD,SASX0oB,GAAI+C,QAAQ/C,EAAI6C,YAAa7kB,GAc7Bs5B,EAAiB,WACfxhC,SAASikC,KAAK7T,gBAAgB,cAC9BpwB,SAASa,cACP,GAAIH,aAAY,iBAAkBC,SAAS,OAM/CX,SAASkhC,gBAAgB,mBAAoBh5B,UAAWA,KAEvD6hB,SC/GH,WAEE,GAAIhoB,GAAU/B,SAASC,cAAc,kBACrC8B,GAAQ0tB,aAAa,OAAQ,gBAC7B1tB,EAAQ0tB,aAAa,UAAW,YAChC1tB,EAAQ0hC,OAER1Z,QAAQ,gBAEN+K,gBAAiB,WACftzB,KAAKuxB,OAASvxB,KAAKgyB,gBAAkBhyB,KAAK0iC,aAG1Cna,QAAQyX,iBAAiB,WACvBhgC,KAAKqhB,MAAQrhB,KACbA,KAAKiuB,aAAa,OAAQ,IAG1BjuB,KAAK4rB,MAAM,WAIT5rB,KAAKo1B,sBAAsBp1B,KAAKV,YAGhCU,KAAKisB,KAAK,qBAEZ9oB,KAAKnD,QAGT0iC,WAAY,WACV,GAAIp6B,GAASpD,OAAOC,OAAOojB,QAAQG,IAAI6C,YAAYjjB,QAC/CsK,EAAO5S,IACXsI,GAAOkzB,eAAiB,WAAa,MAAO5oB,GAAKyO,MAEjD,IAAIkQ,GAAS,GAAI3N,oBACb/C,EAAiB0Q,EAAO1Q,cAK5B,OAJA0Q,GAAO1Q,eAAiB,SAAS4C,EAAYtb,EAAMxF,GACjD,MAAO2F,GAAOozB,oBAAoBjY,EAAYtb,EAAMxF,IAC7Cke,EAAevZ,KAAKiqB,EAAQ9N,EAAYtb,EAAMxF,IAEhD4uB","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  hasSDPolyfill: Boolean(window.ShadowDOMPolyfill)\n};\nPolymerGestures.wrap = PolymerGestures.hasSDPolyfill ? ShadowDOMPolyfill.wrapIfNeeded : function(a){ return a; };\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 (!scope.hasSDPolyfill && pathTest.createShadowRoot) {\n    var sr = pathTest.createShadowRoot();\n    var s = document.createElement('span');\n    sr.appendChild(s);\n    pathTest.addEventListener('testpath', function(ev) {\n      if (ev.path) {\n        // if the span is in the event path, then path[0] is the real source for all events\n        HAS_FULL_PATH = ev.path[0] === s;\n      }\n      ev.stopPropagation();\n    });\n    var ev = new CustomEvent('testpath', {bubbles: true});\n    // must add node to DOM to trigger event listener\n    document.head.appendChild(pathTest);\n    s.dispatchEvent(ev);\n    pathTest.parentNode.removeChild(pathTest);\n    sr = s = null;\n  }\n  pathTest = null;\n\n  var target = {\n    shadow: function(inEl) {\n      if (inEl) {\n        return inEl.shadowRoot || inEl.webkitShadowRoot;\n      }\n    },\n    canTarget: function(shadow) {\n      return shadow && Boolean(shadow.elementFromPoint);\n    },\n    targetingShadow: function(inEl) {\n      var s = this.shadow(inEl);\n      if (this.canTarget(s)) {\n        return s;\n      }\n    },\n    olderShadow: function(shadow) {\n      var os = shadow.olderShadowRoot;\n      if (!os) {\n        var se = shadow.querySelector('shadow');\n        if (se) {\n          os = se.olderShadowRoot;\n        }\n      }\n      return os;\n    },\n    allShadows: function(element) {\n      var shadows = [], s = this.shadow(element);\n      while(s) {\n        shadows.push(s);\n        s = this.olderShadow(s);\n      }\n      return shadows;\n    },\n    searchRoot: function(inRoot, x, y) {\n      var t, st, sr, os;\n      if (inRoot) {\n        t = inRoot.elementFromPoint(x, y);\n        if (t) {\n          // found element, check if it has a ShadowRoot\n          sr = this.targetingShadow(t);\n        } else if (inRoot !== document) {\n          // check for sibling roots\n          sr = this.olderShadow(inRoot);\n        }\n        // search other roots, fall back to light dom element\n        return this.searchRoot(sr, x, y) || t;\n      }\n    },\n    owner: function(element) {\n      if (!element) {\n        return document;\n      }\n      var s = element;\n      // walk up until you hit the shadow root or document\n      while (s.parentNode) {\n        s = s.parentNode;\n      }\n      // the owner element is expected to be a Document or ShadowRoot\n      if (s.nodeType != Node.DOCUMENT_NODE && s.nodeType != Node.DOCUMENT_FRAGMENT_NODE) {\n        s = document;\n      }\n      return s;\n    },\n    findTarget: function(inEvent) {\n      if (HAS_FULL_PATH && inEvent.path) {\n        return inEvent.path[0];\n      }\n      var x = inEvent.clientX, y = inEvent.clientY;\n      // if the listener is in the shadow root, it is much faster to start there\n      var s = this.owner(inEvent.target);\n      // if x, y is not in this root, fall back to document search\n      if (!s.elementFromPoint(x, y)) {\n        s = document;\n      }\n      return this.searchRoot(s, x, y);\n    },\n    findScrollAxis: function(inEvent) {\n      var n;\n      if (HAS_FULL_PATH && inEvent.path) {\n        var path = inEvent.path;\n        for (var i = 0; i < path.length; i++) {\n          n = path[i];\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n        }\n      } else {\n        n = scope.wrap(inEvent.currentTarget);\n        while(n) {\n          if (n._scrollType) {\n            return n._scrollType;\n          }\n          n = n.parentNode || n.host;\n        }\n      }\n    },\n    LCA: function(a, b) {\n      if (a === b) {\n        return a;\n      }\n      if (a && !b) {\n        return a;\n      }\n      if (b && !a) {\n        return b;\n      }\n      if (!b && !a) {\n        return document;\n      }\n      // fast case, a is a direct descendant of b or vice versa\n      if (a.contains && a.contains(b)) {\n        return a;\n      }\n      if (b.contains && b.contains(a)) {\n        return b;\n      }\n      var adepth = this.depth(a);\n      var bdepth = this.depth(b);\n      var d = adepth - bdepth;\n      if (d >= 0) {\n        a = this.walk(a, d);\n      } else {\n        b = this.walk(b, -d);\n      }\n      while (a && b && a !== b) {\n        a = a.parentNode || a.host;\n        b = b.parentNode || b.host;\n      }\n      return a;\n    },\n    walk: function(n, u) {\n      for (var i = 0; n && (i < u); i++) {\n        n = n.parentNode || n.host;\n      }\n      return n;\n    },\n    depth: function(n) {\n      var d = 0;\n      while(n) {\n        d++;\n        n = n.parentNode || n.host;\n      }\n      return d;\n    },\n    deepContains: function(a, b) {\n      var common = this.LCA(a, b);\n      // if a is the common ancestor, it must \"deeply\" contain b\n      return common === a;\n    },\n    insideNode: function(node, x, y) {\n      var rect = node.getBoundingClientRect();\n      return (rect.left <= x) && (x <= rect.right) && (rect.top <= y) && (y <= rect.bottom);\n    }\n  };\n  scope.targetFinding = target;\n  /**\n   * Given an event, finds the \"deepest\" node that could have been the original target before ShadowDOM retargetting\n   *\n   * @param {Event} Event An event object with clientX and clientY properties\n   * @return {Element} The probable event origninator\n   */\n  scope.findTarget = target.findTarget.bind(target);\n  /**\n   * Determines if the \"container\" node deeply contains the \"containee\" node, including situations where the \"containee\" is contained by one or more ShadowDOM\n   * roots.\n   *\n   * @param {Node} container\n   * @param {Node} containee\n   * @return {Boolean}\n   */\n  scope.deepContains = target.deepContains.bind(target);\n\n  /**\n   * Determines if the x/y position is inside the given node.\n   *\n   * Example:\n   *\n   *     function upHandler(event) {\n   *       var innode = PolymerGestures.insideNode(event.target, event.clientX, event.clientY);\n   *       if (innode) {\n   *         // wait for tap?\n   *       } else {\n   *         // tap will never happen\n   *       }\n   *     }\n   *\n   * @param {Node} node\n   * @param {Number} x Screen X position\n   * @param {Number} y screen Y position\n   * @return {Boolean}\n   */\n  scope.insideNode = target.insideNode;\n\n})(window.PolymerGestures);\n","/*\n *\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 'body /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 head = document.head;\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  var hasSDPolyfill = scope.hasSDPolyfill;\n  var wrap = scope.wrap;\n\n  /**\n   * This module is for normalizing events. Mouse and Touch events will be\n   * collected here, and fire PointerEvents that have the same semantics, no\n   * matter the source.\n   * Events fired:\n   *   - pointerdown: a pointing is added\n   *   - pointerup: a pointer is removed\n   *   - pointermove: a pointer is moved\n   *   - pointerover: a pointer crosses into an element\n   *   - pointerout: a pointer leaves an element\n   *   - pointercancel: a pointer will no longer generate events\n   */\n  var dispatcher = {\n    pointermap: new scope.PointerMap(),\n    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    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      this.gestures.push(source);\n    },\n    register: 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.register.call(es, element);\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.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    },\n    cancel: function(inEvent) {\n      inEvent.tapPrevented = true;\n      this.fireEvent('up', inEvent);\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      if (inEvent._handledByPG) {\n        return;\n      }\n      var type = inEvent.type;\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      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.addEventListener_(eventName, this.boundHandler);\n      } else {\n        target.addEventListener(eventName, this.boundHandler);\n      }\n    },\n    removeEvent: function(target, eventName) {\n      // NOTE: Work around for #4, use native event listener in SD Polyfill\n      if (hasSDPolyfill) {\n        target.removeEventListener_(eventName, this.boundHandler);\n      } else {\n        target.removeEventListener(eventName, this.boundHandler);\n      }\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          eventCopy[p] = wrap(eventCopy[p]);\n        }\n      }\n      // keep the semantics of preventDefault\n      eventCopy.preventDefault = inEvent.preventDefault;\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; i < this.gestureQueue.length; i++) {\n        e = this.gestureQueue[i];\n        for (var j = 0, g, fn; j < this.gestures.length; j++) {\n          g = this.gestures[j];\n          fn = g[e.type];\n          if (fn) {\n            fn.call(g, e);\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      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  scope.register = function(root) {\n    dispatcher.register(root);\n  };\n  scope.unregister = dispatcher.unregister.bind(dispatcher);\n  scope.wrap = wrap;\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 uses Mutation Observers to dynamically adjust which nodes will\n * generate Pointer Events.\n *\n * All nodes that wish to generate Pointer Events must have the attribute\n * `touch-action` set to `none`.\n */\n(function(scope) {\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n  var map = Array.prototype.map.call.bind(Array.prototype.map);\n  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);\n  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);\n  var MO = window.MutationObserver || window.WebKitMutationObserver;\n  var SELECTOR = '[touch-action]';\n  var OBSERVER_INIT = {\n    subtree: true,\n    childList: true,\n    attributes: true,\n    attributeOldValue: true,\n    attributeFilter: ['touch-action']\n  };\n\n  function Installer(add, remove, changed, binder) {\n    this.addCallback = add.bind(binder);\n    this.removeCallback = remove.bind(binder);\n    this.changedCallback = changed.bind(binder);\n    if (MO) {\n      this.observer = new MO(this.mutationWatcher.bind(this));\n    }\n  }\n\n  Installer.prototype = {\n    watchSubtree: function(target) {\n      // Only watch scopes that can target find, as these are top-level.\n      // Otherwise we can see duplicate additions and removals that add noise.\n      //\n      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see\n      // a removal without an insertion when a node is redistributed among\n      // shadows. Since it all ends up correct in the document, watching only\n      // the document will yield the correct mutations to watch.\n      if (scope.targetFinding.canTarget(target)) {\n        this.observer.observe(target, OBSERVER_INIT);\n      }\n    },\n    enableOnSubtree: function(target) {\n      this.watchSubtree(target);\n      if (target === document && document.readyState !== 'complete') {\n        this.installOnLoad();\n      } else {\n        this.installNewSubtree(target);\n      }\n    },\n    installNewSubtree: function(target) {\n      forEach(this.findElements(target), this.addElement, this);\n    },\n    findElements: function(target) {\n      if (target.querySelectorAll) {\n        return target.querySelectorAll(SELECTOR);\n      }\n      return [];\n    },\n    removeElement: function(el) {\n      this.removeCallback(el);\n    },\n    addElement: function(el) {\n      this.addCallback(el);\n    },\n    elementChanged: function(el, oldValue) {\n      this.changedCallback(el, oldValue);\n    },\n    concatLists: function(accum, list) {\n      return accum.concat(toArray(list));\n    },\n    // register all touch-action = none nodes on document load\n    installOnLoad: function() {\n      document.addEventListener('readystatechange', function() {\n        if (document.readyState === 'complete') {\n          this.installNewSubtree(document);\n        }\n      }.bind(this));\n    },\n    isElement: function(n) {\n      return n.nodeType === Node.ELEMENT_NODE;\n    },\n    flattenMutationTree: function(inNodes) {\n      // find children with touch-action\n      var tree = map(inNodes, this.findElements, this);\n      // make sure the added nodes are accounted for\n      tree.push(filter(inNodes, this.isElement));\n      // flatten the list\n      return tree.reduce(this.concatLists, []);\n    },\n    mutationWatcher: function(mutations) {\n      mutations.forEach(this.mutationHandler, this);\n    },\n    mutationHandler: function(m) {\n      if (m.type === 'childList') {\n        var added = this.flattenMutationTree(m.addedNodes);\n        added.forEach(this.addElement, this);\n        var removed = this.flattenMutationTree(m.removedNodes);\n        removed.forEach(this.removeElement, this);\n      } else if (m.type === 'attributes') {\n        this.elementChanged(m.target, m.oldValue);\n      }\n    }\n  };\n\n  if (!MO) {\n    Installer.prototype.watchSubtree = function(){\n      console.warn('PolymerGestures: MutationObservers not found, touch-action will not be dynamically detected');\n    };\n  }\n\n  scope.Installer = Installer;\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    register: function(target) {\n      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    lastTouches: [],\n    // collide with the global mouse listener\n    isEventSimulatedFromTouch: function(inEvent) {\n      var lts = this.lastTouches;\n      var x = inEvent.clientX, y = inEvent.clientY;\n      for (var i = 0, l = lts.length, t; i < l && (t = lts[i]); i++) {\n        // simulated mouse events will be swallowed near a primary touchend\n        var dx = Math.abs(x - t.x), dy = Math.abs(y - t.y);\n        if (dx <= DEDUP_DIST && dy <= DEDUP_DIST) {\n          return true;\n        }\n      }\n    },\n    prepareEvent: function(inEvent) {\n      var e = dispatcher.cloneEvent(inEvent);\n      e.pointerId = this.POINTER_ID;\n      e.isPrimary = true;\n      e.pointerType = this.POINTER_TYPE;\n      e._source = 'mouse';\n      if (!HAS_BUTTONS) {\n        e.buttons = WHICH_TO_BUTTONS[e.which] || 0;\n      }\n      return e;\n    },\n    mousedown: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var p = pointermap.has(this.POINTER_ID);\n        // TODO(dfreedman) workaround for some elements not sending mouseup\n        // http://crbug/149091\n        if (p) {\n          this.mouseup(inEvent);\n        }\n        var e = this.prepareEvent(inEvent);\n        e.target = scope.wrap(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 e = this.prepareEvent(inEvent);\n        e.target = pointermap.get(this.POINTER_ID);\n        dispatcher.move(e);\n      }\n    },\n    mouseup: function(inEvent) {\n      if (!this.isEventSimulatedFromTouch(inEvent)) {\n        var e = this.prepareEvent(inEvent);\n        e.relatedTarget = scope.wrap(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  var INSTALLER;\n  // maybe one day...\n  // var CAN_USE_GLOBAL = ATTRIB in document.head.style;\n  var CAN_USE_GLOBAL = false;\n\n  // handler block for native touch events\n  var touchEvents = {\n    events: [\n      'touchstart',\n      'touchmove',\n      'touchend',\n      'touchcancel'\n    ],\n    register: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.listen(target, this.events);\n      } else {\n        INSTALLER.enableOnSubtree(target);\n      }\n    },\n    unregister: function(target) {\n      if (CAN_USE_GLOBAL) {\n        dispatcher.unlisten(target, this.events);\n      } else {\n        // TODO(dfreedman): is it worth it to disconnect the MO?\n      }\n    },\n    elementAdded: function(el) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      if (st) {\n        el._scrollType = st;\n        dispatcher.listen(el, this.events);\n        // set touch-action on shadows as well\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n          dispatcher.listen(s, this.events);\n        }, this);\n      }\n    },\n    elementRemoved: function(el) {\n      el._scrollType = undefined;\n      dispatcher.unlisten(el, this.events);\n      // remove touch-action from shadow\n      allShadows(el).forEach(function(s) {\n        s._scrollType = undefined;\n        dispatcher.unlisten(s, this.events);\n      }, this);\n    },\n    elementChanged: function(el, oldValue) {\n      var a = el.getAttribute(ATTRIB);\n      var st = this.touchActionToScrollType(a);\n      var oldSt = this.touchActionToScrollType(oldValue);\n      // simply update scrollType if listeners are already established\n      if (st && oldSt) {\n        el._scrollType = st;\n        allShadows(el).forEach(function(s) {\n          s._scrollType = st;\n        }, this);\n      } else if (oldSt) {\n        this.elementRemoved(el);\n      } else if (st) {\n        this.elementAdded(el);\n      }\n    },\n    scrollTypes: {\n      EMITTER: 'none',\n      XSCROLLER: 'pan-x',\n      YSCROLLER: 'pan-y',\n      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto|manipulation$/\n    },\n    touchActionToScrollType: function(touchAction) {\n      var t = touchAction;\n      var st = this.scrollTypes;\n      if (t === 'none') {\n        return 'none';\n      } else if (t === st.XSCROLLER) {\n        return 'X';\n      } else if (t === st.YSCROLLER) {\n        return 'Y';\n      } else if (st.SCROLLER.exec(t)) {\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: scope.wrap(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 = scope.wrap(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 scrollAxis = scope.targetFinding.findScrollAxis(inEvent);\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 (CAN_USE_GLOBAL) {\n        this.processTouches(inEvent, this.move);\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.wrap(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  if (!CAN_USE_GLOBAL) {\n    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);\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      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    POINTER_TYPES: [\n      '',\n      'unavailable',\n      'touch',\n      'pen',\n      'mouse'\n    ],\n    prepareEvent: function(inEvent) {\n      var e = inEvent;\n      e = dispatcher.cloneEvent(inEvent);\n      if (HAS_BITMAP_TYPE) {\n        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];\n      }\n      e._source = 'ms';\n      return e;\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    MSPointerDown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(inEvent.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    MSPointerMove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    MSPointerUp: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(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.wrap(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      if (target !== document) {\n        return;\n      }\n      dispatcher.listen(target, this.events);\n    },\n    unregister: function(target) {\n      dispatcher.unlisten(target, this.events);\n    },\n    cleanup: function(id) {\n      pointermap['delete'](id);\n    },\n    pointerdown: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = scope.wrap(scope.findTarget(inEvent));\n      pointermap.set(e.pointerId, e.target);\n      dispatcher.down(e);\n    },\n    pointermove: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.move(e);\n    },\n    pointerup: function(inEvent) {\n      var e = this.prepareEvent(inEvent);\n      e.relatedTarget = scope.wrap(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.wrap(scope.findTarget(inEvent));\n      e.target = pointermap.get(e.pointerId);\n      dispatcher.cancel(e);\n      this.cleanup(inEvent.pointerId);\n    }\n  };\n\n  scope.pointerEvents = pointerEvents;\n})(window.PolymerGestures);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n/**\n * This module contains the handlers for native platform events.\n * From here, the dispatcher is called to create unified pointer events.\n * Included are touch events (v1), mouse events, and MSPointerEvents.\n */\n(function(scope) {\n  var dispatcher = scope.dispatcher;\n\n  if (window.PointerEvent) {\n    dispatcher.registerSource('pointer', scope.pointerEvents);\n  } else if (window.navigator.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  dispatcher.register(document);\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     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       }\n       if (dd.y) {\n         t.yDirection = this.clampDir(dd.y);\n       }\n       var e = eventFactory.makeGestureEvent(inType, {\n         bubbles: true,\n         cancelable: true,\n         dx: d.x,\n         dy: d.y,\n         ddx: dd.x,\n         ddy: dd.y,\n         x: inEvent.x,\n         y: inEvent.y,\n         clientX: inEvent.clientX,\n         clientY: inEvent.clientY,\n         pageX: inEvent.pageX,\n         pageY: inEvent.pageY,\n         screenX: inEvent.screenX,\n         screenY: inEvent.screenY,\n         xDirection: t.xDirection,\n         yDirection: t.yDirection,\n         trackInfo: t.trackInfo,\n         relatedTarget: inEvent.relatedTarget,\n         pointerType: inEvent.pointerType,\n         pointerId: inEvent.pointerId,\n         _source: 'track'\n       });\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             this.fireTrack('trackstart', p.downEvent, p);\n             this.fireTrack('track', inEvent, p);\n           }\n         } else {\n           this.fireTrack('track', 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    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    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      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      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.3.3-0e73963'\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(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  // exports\n\n  scope.extend = extend;\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  // TODO(sorvell): remove when we're sure imports does not need\n  // to load stylesheets\n  /*\n  HTMLImports.importer.preloadSelectors += \n      ', polymer-element link[rel=stylesheet]';\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  var typeHandlers = {\n    string: function(value) {\n      return value;\n    },\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      */\n    fire: function(type, detail, onNode, bubbles, cancelable) {\n      var node = onNode || this;\n      var detail = 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        this.addEventListener(type, this.element.getEventHandler(this, this,\n                                                                 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})(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(value, old) {\n            this.invokeMethod(callbackName, [old]);\n          }, this);\n          this.registerNamedObserver(name + '__array', observer);\n        }\n      }\n    },\n    emitPropertyChangeRecord: function(name, value, oldValue) {\n      var object = this;\n      if (areSameValue(value, oldValue))\n        return;\n\n      this.propertyChanged_(name, value, oldValue);\n\n      if (!Observer.hasObjectObserve)\n        return;\n\n      var notifier = this.notifier_;\n      if (!notifier)\n        notifier = this.notifier_ = Object.getNotifier(this);\n\n      updateRecord.object = this;\n      updateRecord.name = name;\n      updateRecord.oldValue = oldValue;\n\n      notifier.notify(updateRecord);\n    },\n    bindToAccessor: function(name, observable, resolveFn) {\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n\n      this[privateObservable] = observable;\n      var oldValue = this[privateName];\n\n      var self = this;\n      var value = observable.open(function(value, oldValue) {\n        self[privateName] = value;\n        self.emitPropertyChangeRecord(name, value, oldValue);\n      });\n\n      if (resolveFn && !areSameValue(oldValue, value)) {\n        var resolvedValue = resolveFn(oldValue, value);\n        if (!areSameValue(value, resolvedValue)) {\n          value = resolvedValue;\n          if (observable.setValue)\n            observable.setValue(value);\n        }\n      }\n\n      this[privateName] = value;\n      this.emitPropertyChangeRecord(name, value, oldValue);\n\n      var observer = {\n        close: function() {\n          observable.close();\n          self[privateObservable] = undefined;\n        }\n      };\n      this.registerObserver(observer);\n      return observer;\n    },\n    createComputedProperties: function() {\n      if (!this._computedNames) {\n        return;\n      }\n\n      for (var i = 0; i < this._computedNames.length; i++) {\n        var name = this._computedNames[i];\n        var expressionText = this.computed[name];\n        try {\n          var expression = PolymerExpressions.getExpression(expressionText);\n          var observable = expression.getBinding(this, this.element.syntax);\n          this.bindToAccessor(name, observable);\n        } catch (ex) {\n          console.error('Failed to create computed property', ex);\n        }\n      }\n    },\n    bindProperty: function(property, observable, oneTime) {\n      if (oneTime) {\n        this[property] = observable;\n        return;\n      }\n      return this.bindToAccessor(property, observable, resolveBindingValue);\n    },\n    invokeMethod: function(method, args) {\n      var fn = this[method] || method;\n      if (typeof fn === 'function') {\n        fn.apply(this, args);\n      }\n    },\n    registerObserver: function(observer) {\n      if (!this._observers) {\n        this._observers = [observer];\n        return;\n      }\n\n      this._observers.push(observer);\n    },\n    // observer array items are arrays of observers.\n    closeObservers: function() {\n      if (!this._observers) {\n        return;\n      }\n\n      var observers = this._observers;\n      for (var i = 0; i < observers.length; i++) {\n        var observer = observers[i];\n        if (observer && typeof observer.close == 'function') {\n          observer.close();\n        }\n      }\n\n      this._observers = [];\n    },\n    // bookkeeping observers for memory management\n    registerNamedObserver: function(name, observer) {\n      var o$ = this._namedObservers || (this._namedObservers = {});\n      o$[name] = observer;\n    },\n    closeNamedObserver: function(name) {\n      var o$ = this._namedObservers;\n      if (o$ && o$[name]) {\n        o$[name].close();\n        o$[name] = null;\n        return true;\n      }\n    },\n    closeNamedObservers: function() {\n      if (this._namedObservers) {\n        for (var i in this._namedObservers) {\n          this.closeNamedObserver(i);\n        }\n        this._namedObservers = {};\n      }\n    }\n  };\n\n  // logging\n  var LOG_OBSERVE = '[%s] watching [%s]';\n  var LOG_OBSERVED = '[%s#%s] watch: [%s] now [%s] was [%s]';\n  var LOG_CHANGED = '[%s#%s] propertyChanged: [%s] now [%s] was [%s]';\n\n  // exports\n\n  scope.api.instance.properties = properties;\n\n})(Polymer);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // imports\n\n  var log = window.logFlags || 0;\n\n  // element api supporting mdv\n  var mdv = {\n    instanceTemplate: function(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      // TODO(sorvell): replace when ShadowDOMPolyfill issue is corrected\n      // https://github.com/Polymer/ShadowDOM/issues/420\n      if (!this.ownerDocument.isStagingDocument || window.ShadowDOMPolyfill) {\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      // TODO (sorvell): temporarily open observer when created\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      // TODO (sorvell): temporarily open observer when created\n      // turn on property observation and take any initial changes\n      //this.openPropertyObserver();\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      // set up polymer gestures\n      PolymerGestures.register(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  \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 (window.ShadowDOMPolyfill) {\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      scope._scopeStyles[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      scope._scopeStyles = scope._scopeStyles || {};\n      return scope._scopeStyles[name];\n    }\n  };\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 (arguments.length === 1 && typeof arguments[0] !== 'string') {\n      prototype = name;\n      var script = document._currentScript;\n      name = script && script.parentNode && script.parentNode.getAttribute ?\n          script.parentNode.getAttribute('name') : '';\n      if (!name) {\n        throw 'Element name could not be inferred.';\n      }\n    }\n    if (getRegisteredPrototype[name]) {\n      throw 'Already registered (Polymer) prototype for element ' + name;\n    }\n    // cache the prototype\n    registerPrototype(name, prototype);\n    // notify the registrar waiting for 'name', if any\n    notifyPrototype(name);\n  }\n\n  // async prototype source\n\n  function waitingForPrototype(name, client) {\n    waitPrototype[name] = client;\n  }\n\n  var waitPrototype = {};\n\n  function notifyPrototype(name) {\n    if (waitPrototype[name]) {\n      waitPrototype[name].registerWhenReady();\n      delete waitPrototype[name];\n    }\n  }\n\n  // utility and bookkeeping\n\n  // maps tag names to prototypes, as registered with\n  // Polymer. Prototypes associated with a tag name\n  // using document.registerElement are available from\n  // HTMLElement.getPrototypeForTag().\n  // If an element was fully registered by Polymer, then\n  // Polymer.getRegisteredPrototype(name) === \n  //   HTMLElement.getPrototypeForTag(name)\n\n  var prototypesByName = {};\n\n  function registerPrototype(name, prototype) {\n    return prototypesByName[name] = prototype || {};\n  }\n\n  function getRegisteredPrototype(name) {\n    return prototypesByName[name];\n  }\n\n  // exports\n\n  scope.getRegisteredPrototype = getRegisteredPrototype;\n  scope.waitingForPrototype = waitingForPrototype;\n\n  // namespace shenanigans so we can expose our scope on the registration \n  // function\n\n  // make window.Polymer reference `element()`\n\n  window.Polymer = element;\n\n  // TODO(sjmiles): find a way to do this that is less terrible\n  // copy window.Polymer properties onto `element()`\n\n  extend(Polymer, scope);\n\n  // Under the HTMLImports polyfill, scripts in the main document\n  // do not block on imports; we want to allow calls to Polymer in the main\n  // document. Platform collects those calls until we can process them, which\n  // we do here.\n\n  var declarations = Platform.deliverDeclarations();\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})(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    Platform.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  // 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 Platform.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 (window.ShadowDOMPolyfill) {\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        node.addEventListener(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            node.removeEventListener(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    // sync prototype to property descriptors;\n    // desriptor format contains default value and optionally a\n    // hint for reflecting the property to an attribute.\n    // e.g. {foo: 5, bar: {value: true, reflect: true}}\n    // reflect: {foo: true} is also supported\n    //\n    requireProperties: function(propertyDescriptors, prototype, base) {\n      // 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 propertyDescriptors) {\n        var propertyDescriptor = propertyDescriptors[n];\n        var reflects = this.reflectHintForDescriptor(propertyDescriptor);\n        if (prototype.reflect[n] === undefined && reflects !== undefined) {\n          prototype.reflect[n] = reflects;\n        }\n        if (prototype[n] === undefined) {\n          prototype[n] = this.valueForDescriptor(propertyDescriptor);\n        }\n      }\n    },\n    valueForDescriptor: function(propertyDescriptor) {\n      var value = typeof propertyDescriptor === 'object' &&\n          propertyDescriptor ? propertyDescriptor.value : propertyDescriptor;\n      return value !== undefined ? value : null;\n    },\n    // returns the value of the descriptor's 'reflect' property or undefined\n    reflectHintForDescriptor: function(propertyDescriptor) {\n      if (typeof propertyDescriptor === 'object' &&\n          propertyDescriptor && propertyDescriptor.reflect !== undefined) {\n        return propertyDescriptor.reflect;\n      }\n    },\n    lowerCaseMap: function(properties) {\n      var map = {};\n      for (var n in properties) {\n        map[n.toLowerCase()] = n;\n      }\n      return map;\n    },\n    createPropertyAccessor: function(name) {\n      var proto = this.prototype;\n\n      var privateName = name + '_';\n      var privateObservable  = name + 'Observable_';\n      proto[privateName] = proto[name];\n\n      Object.defineProperty(proto, name, {\n        get: function() {\n          var observable = this[privateObservable];\n          if (observable)\n            observable.deliver();\n\n          return this[privateName];\n        },\n        set: function(value) {\n          var observable = this[privateObservable];\n          if (observable) {\n            observable.setValue(value);\n            return;\n          }\n\n          var oldValue = this[privateName];\n          this[privateName] = value;\n          this.emitPropertyChangeRecord(name, value, oldValue);\n\n          return value;\n        },\n        configurable: true\n      });\n    },\n    createPropertyAccessors: function(prototype) {\n      var n$ = prototype._publishNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n      var n$ = prototype._computedNames;\n      if (n$ && n$.length) {\n        for (var i=0, l=n$.length, n, fn; (i<l) && (n=n$[i]); i++) {\n          this.createPropertyAccessor(n);\n        }\n      }\n\n    }\n  };\n\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\n      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);\n      if (attributes) {\n        // get properties to publish\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          // if the user hasn't specified a value, we want to use the\n          // default, unless a superclass has already chosen one\n          if (n && publish[n] === undefined) {\n            // TODO(sjmiles): querying native properties on IE11 (and possibly\n            // on other browsers) throws an exception because there is no actual\n            // instance.\n            // In fact, trying to publish native properties is known bad for this\n            // and other reasons, and we need to solve this problem writ large.\n            try {\n              var hasValue = (base[n] !== undefined);\n            } catch(x) {\n              hasValue = false;\n            }\n            // supply an empty 'descriptor' object and let the publishProperties\n            // code determine a default\n            if (!hasValue) {\n              publish[n] = Polymer.nob;\n            }\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 && Platform.templateContent(template);\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  // 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 (window.ShadowDOMPolyfill) {\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    // tell the queue to wait for an element to be ready\n    wait: function(element, check, go) {\n      var shouldAdd = (this.indexOf(element) === -1 && \n          flushQueue.indexOf(element) === -1);\n      if (shouldAdd) {\n        this.add(element);\n        element.__check = check;\n        element.__go = go;\n      }\n      return (this.indexOf(element) !== 0);\n    },\n    add: function(element) {\n      //console.log('queueing', element.name);\n      queueForElement(element).push(element);\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    // tell the queue an element is ready to be registered\n    go: function(element) {\n      var readied = this.remove(element);\n      if (readied) {\n        this.addToFlushQueue(readied);\n        this.check();\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    check: function() {\n      // next\n      var element = this.nextElement();\n      if (element) {\n        element.__check.call(element);\n      }\n      if (this.canReady()) {\n        this.ready();\n        return true;\n      }\n    },\n    nextElement: function() {\n      return nextQueued();\n    },\n    canReady: function() {\n      return !this.waitToReady && this.isEmpty();\n    },\n    isEmpty: function() {\n      return !importQueue.length && !mainQueue.length;\n    },\n    addToFlushQueue: function(element) {\n      flushQueue.push(element);  \n    },\n    flush: function() {\n      var element;\n      while (flushQueue.length) {\n        element = flushQueue.shift();\n        element.__go.call(element);\n        element.__check = element.__go = null;\n      }\n    },\n    ready: function() {\n      this.flush();\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      if (CustomElements.ready === false) {\n        CustomElements.upgradeDocumentTree(document);\n        CustomElements.ready = true;\n      }\n      Platform.flush();\n      requestAnimationFrame(this.flushReadyCallbacks);\n    },\n    addReadyCallback: function(callback) {\n      if (callback) {\n        readyCallbacks.push(callback);\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    waitToReady: true\n  };\n\n  var flushQueue = [];\n\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  var polymerReadied = false; \n\n  document.addEventListener('WebComponentsReady', function() {\n    CustomElements.ready = false;\n  });\n  \n  function whenPolymerReady(callback) {\n    queue.waitToReady = true;\n    CustomElements.ready = false;\n    HTMLImports.whenImportsReady(function() {\n      queue.addReadyCallback(callback);\n      queue.waitToReady = false;\n      queue.check();\n    });\n  }\n\n  // exports\n  scope.queue = queue;\n  scope.whenPolymerReady = whenPolymerReady;\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(function(scope) {\n\n  // imports\n\n  var extend = scope.extend;\n  var api = scope.api;\n  var queue = scope.queue;\n  var whenPolymerReady = scope.whenPolymerReady;\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      // initiate any async resource fetches\n      this.loadResources();\n      // register when all constraints are met\n      this.registerWhenReady();\n    },\n\n    registerWhenReady: function() {\n     if (this.registered\n       || this.waitingForPrototype(this.name)\n       || this.waitingForQueue()\n       || this.waitingForResources()) {\n          return;\n      }\n      // TODO(sorvell): ends up calling '_register' by virtue\n      // of `waitingForQueue` (see below)\n      queue.go(this);\n    },\n\n    // TODO(sorvell): refactor, this method is private-ish, but it's being\n    // called by the queue object.\n    _register: function() {\n      //console.log('registering', this.name);\n      //console.group('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      //console.groupEnd();\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        // TODO(sorvell): CustomElements polyfill awareness:\n        // noscript elements should upgrade in logical order\n        // script injection ensures this under native custom elements;\n        // under imports + ce polyfills, scripts run before upgrades.\n        // dependencies should be ready at upgrade time so register\n        // prototype at this time.\n        if (window.CustomElements && !CustomElements.useNative) {\n          Polymer(name);\n        } else {\n          var script = document.createElement('script');\n          script.textContent = 'Polymer(\\'' + name + '\\');';\n          this.appendChild(script);\n        }\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.wait(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  whenPolymerReady(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/**\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/use_native_dartium_shadowdom.js b/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
deleted file mode 100644
index 7b492b7..0000000
--- a/pkg/polymer/lib/src/js/use_native_dartium_shadowdom.js
+++ /dev/null
@@ -1,29 +0,0 @@
-// Prevent polyfilled JS Shadow DOM in Dartium
-// We need this if we want Dart code to be able to interoperate with Polymer.js
-// code that also uses Shadow DOM.
-// TODO(jmesserly): we can remove this code once platform.js is correctly
-// feature detecting Shadow DOM in Dartium.
-if (navigator.userAgent.indexOf('(Dart)') !== -1) {
-  window.Platform = window.Platform || {};
-  Platform.flags = Platform.flags || {};
-  Platform.flags.shadow = 'native';
-
-  // Note: Dartium 34 hasn't turned on the unprefixed Shadow DOM
-  // (this happens in Chrome 35), so unless "enable experimental platform
-  // features" is enabled, things will break. So we expose them as unprefixed
-  // names instead.
-  var proto = Element.prototype;
-  if (!proto.createShadowRoot) {
-    proto.createShadowRoot = proto.webkitCreateShadowRoot;
-
-    Object.defineProperty(proto, 'shadowRoot', {
-      get: function() {
-        return this.webkitShadowRoot;
-      },
-      set: function(value) {
-        this.webkitShadowRoot = value;
-      },
-      configurable: true
-    });
-  }
-}
diff --git a/pkg/polymer/lib/src/loader.dart b/pkg/polymer/lib/src/loader.dart
index 5737200..33a6a68 100644
--- a/pkg/polymer/lib/src/loader.dart
+++ b/pkg/polymer/lib/src/loader.dart
@@ -61,7 +61,7 @@
         'is correct. If you are using pub-serve, you may need to restart it.';
   }
 
-  Polymer.registerSync('d-auto-binding', AutoBindingElement,
+  Polymer.registerSync('auto-binding-dart', AutoBindingElement,
       extendsTag: 'template');
 
   for (var initializer in initializers) {
diff --git a/pkg/polymer/pubspec.yaml b/pkg/polymer/pubspec.yaml
index 4deef24..990a58b 100644
--- a/pkg/polymer/pubspec.yaml
+++ b/pkg/polymer/pubspec.yaml
@@ -1,5 +1,5 @@
 name: polymer
-version: 0.11.0-dev.3
+version: 0.11.0+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
@@ -19,8 +19,8 @@
   polymer_expressions: '>=0.11.0 <0.12.0'
   smoke: '>=0.1.0 <0.2.0'
   source_maps: '>=0.9.0 <0.10.0'
-  template_binding: '>=0.11.0-dev <0.12.0'
-  web_components: '>=0.3.5-dev <0.4.0'
+  template_binding: '>=0.11.0 <0.12.0'
+  web_components: '>=0.3.5 <0.4.0'
   yaml: '>=0.9.0 <2.0.0'
 dev_dependencies:
   unittest: '>=0.10.0 <0.11.0'
diff --git a/pkg/polymer/test/auto_binding_test.html b/pkg/polymer/test/auto_binding_test.html
index b724b0c..ba1f13f 100644
--- a/pkg/polymer/test/auto_binding_test.html
+++ b/pkg/polymer/test/auto_binding_test.html
@@ -17,11 +17,11 @@
 
     <div>top</div>
 
-    <template id="one" is="d-auto-binding">
+    <template id="one" is="auto-binding-dart">
       <h2 id="h" on-tap="{{eventAction}}">{{greeting}}</h2>
     </template>
 
-    <template id="two" is="d-auto-binding">
+    <template id="two" is="auto-binding-dart">
       <div>Say something: <input value="{{value}}"></div>
       <div>You said: {{value}}</div>
     </template>
diff --git a/pkg/scheduled_test/CHANGELOG.md b/pkg/scheduled_test/CHANGELOG.md
index a745c63..953019f 100644
--- a/pkg/scheduled_test/CHANGELOG.md
+++ b/pkg/scheduled_test/CHANGELOG.md
@@ -1,3 +1,12 @@
+## 0.11.0+7
+
+* A `nothing()` descriptor will fail if a broken symlink is present.
+
+## 0.11.0+6
+
+* Use `http_multi_server` to bind to both the IPv4 and IPv6 loopback addresses
+  for scheduled_test.
+
 ## 0.11.0+5
 
 * Widen the version constraint for `stack_trace`.
diff --git a/pkg/scheduled_test/lib/scheduled_server.dart b/pkg/scheduled_test/lib/scheduled_server.dart
index e04817a..2d9aba0 100644
--- a/pkg/scheduled_test/lib/scheduled_server.dart
+++ b/pkg/scheduled_test/lib/scheduled_server.dart
@@ -8,6 +8,7 @@
 import 'dart:collection';
 import 'dart:io';
 
+import 'package:http_multi_server/http_multi_server.dart';
 import 'package:shelf/shelf.dart' as shelf;
 import 'package:shelf/shelf_io.dart' as shelf_io;
 
@@ -39,16 +40,17 @@
   ScheduledServer._(this._server, this.description);
 
   /// Creates a new server listening on an automatically-allocated port on
-  /// 127.0.0.1. [description] is used to refer to the server in debugging
-  /// messages.
+  /// localhost (both IPv4 and IPv6, if available).
+  ///
+  /// [description] is used to refer to the server in debugging messages.
   factory ScheduledServer([String description]) {
     var id = _count++;
     if (description == null) description = 'scheduled server $id';
 
     var scheduledServer;
     scheduledServer = new ScheduledServer._(schedule(() {
-      return shelf_io.serve(scheduledServer._handleRequest, "127.0.0.1", 0)
-          .then((server) {
+      return HttpMultiServer.loopback(0).then((server) {
+        shelf_io.serveRequests(server, scheduledServer._handleRequest);
         currentSchedule.onComplete.schedule(() => server.close(force: true));
         return server;
       });
@@ -60,7 +62,7 @@
   Future<int> get port => _server.then((s) => s.port);
 
   /// The base URL of the server, including its port.
-  Future<Uri> get url => port.then((p) => Uri.parse("http://127.0.0.1:$p"));
+  Future<Uri> get url => port.then((p) => Uri.parse("http://localhost:$p"));
 
   /// Schedules [handler] to handle a request to the server with [method] and
   /// [path]. The schedule will wait until an HTTP request is received. If that
diff --git a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
index 8303117..a60840f 100644
--- a/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
+++ b/pkg/scheduled_test/lib/src/descriptor/nothing_descriptor.dart
@@ -31,6 +31,8 @@
       fail("Expected nothing to exist at '$fullPath', but found a file.");
     } else if (new Directory(fullPath).existsSync()) {
       fail("Expected nothing to exist at '$fullPath', but found a directory.");
+    } else if (new Link(fullPath).existsSync()) {
+      fail("Expected nothing to exist at '$fullPath', but found a link.");
     } else {
       return;
     }
diff --git a/pkg/scheduled_test/pubspec.yaml b/pkg/scheduled_test/pubspec.yaml
index 9eb8ec1..bc99431 100644
--- a/pkg/scheduled_test/pubspec.yaml
+++ b/pkg/scheduled_test/pubspec.yaml
@@ -1,5 +1,5 @@
 name: scheduled_test
-version: 0.11.0+5
+version: 0.11.0+7
 author: Dart Team <misc@dartlang.org>
 description: >
   A package for writing readable tests of asynchronous behavior.
@@ -12,6 +12,7 @@
 environment:
   sdk: '>=1.3.0 <2.0.0'
 dependencies:
+  http_multi_server: '>=1.0.0 <2.0.0'
   http: '>=0.9.0 <0.12.0'
   path: '>=0.9.0 <2.0.0'
   shelf: '>=0.4.0 <0.6.0'
diff --git a/pkg/scheduled_test/test/descriptor/nothing_test.dart b/pkg/scheduled_test/test/descriptor/nothing_test.dart
index 34d02e9..68acccb 100644
--- a/pkg/scheduled_test/test/descriptor/nothing_test.dart
+++ b/pkg/scheduled_test/test/descriptor/nothing_test.dart
@@ -42,45 +42,38 @@
     });
   });
 
-  expectTestsPass("nothing().validate() fails if there's a file", () {
-    var errors;
-    test('test 1', () {
-      scheduleSandbox();
+  expectTestFails("nothing().validate() fails if there's a file", () {
+    scheduleSandbox();
+    d.file('name.txt', 'contents').create();
+    d.nothing('name.txt').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]name.txt', but "
+                r"found a file\.$"));
+  });
 
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
+  expectTestFails("nothing().validate() fails if there's a directory", () {
+    scheduleSandbox();
+    d.dir('dir').create();
+    d.nothing('dir').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]dir', but found a "
+            r"directory\.$"));
+  });
 
-      d.file('name.txt', 'contents').create();
-      d.nothing('name.txt').validate();
+  expectTestFails("nothing().validate() fails if there's a broken link", () {
+    scheduleSandbox();
+    schedule(() {
+      new Link(path.join(sandbox, 'link')).createSync('nonexistent');
     });
-
-    test('test 2', () {
-      expect(errors.single, new isInstanceOf<ScheduleError>());
-      expect(errors.single.error.toString(),
-          matches(r"^Expected nothing to exist at '[^']+[\\/]name.txt', but "
-                  r"found a file\.$"));
-    });
-  }, passing: ['test 2']);
-
-  expectTestsPass("nothing().validate() fails if there's a directory", () {
-    var errors;
-    test('test 1', () {
-      scheduleSandbox();
-
-      currentSchedule.onException.schedule(() {
-        errors = currentSchedule.errors;
-      });
-
-      d.dir('dir').create();
-      d.nothing('dir').validate();
-    });
-
-    test('test 2', () {
-      expect(errors.single, new isInstanceOf<ScheduleError>());
-      expect(errors.single.error.toString(),
-          matches(r"^Expected nothing to exist at '[^']+[\\/]dir', but found a "
-              r"directory\.$"));
-    });
-  }, passing: ['test 2']);
+    d.nothing('link').validate();
+  }, (errors) {
+    expect(errors.single, new isInstanceOf<ScheduleError>());
+    expect(errors.single.error.toString(),
+        matches(r"^Expected nothing to exist at '[^']+[\\/]link', but found "
+            r"a link\.$"));
+  });
 }
diff --git a/pkg/shelf/lib/src/message.dart b/pkg/shelf/lib/src/message.dart
index 1522e13..514eb48 100644
--- a/pkg/shelf/lib/src/message.dart
+++ b/pkg/shelf/lib/src/message.dart
@@ -37,6 +37,12 @@
   /// This can be read via [read] or [readAsString].
   final Stream<List<int>> _body;
 
+  /// This boolean indicates whether [_body] has been read.
+  ///
+  /// After calling [read], or [readAsString] (which internally calls [read]),
+  /// this will be `true`.
+  bool _bodyWasRead = false;
+
   /// Creates a new [Message].
   ///
   /// If [headers] is `null`, it is treated as empty.
@@ -98,7 +104,14 @@
   /// Returns a [Stream] representing the body.
   ///
   /// Can only be called once.
-  Stream<List<int>> read() => _body;
+  Stream<List<int>> read() {
+    if (_bodyWasRead) {
+      throw new StateError("The 'read' method can only be called once on a "
+                           "shelf.Request/shelf.Response object.");
+    }
+    _bodyWasRead = true;
+    return _body;
+  }
 
   /// Returns a [Future] containing the body as a String.
   ///
diff --git a/pkg/shelf/test/message_test.dart b/pkg/shelf/test/message_test.dart
index d393388..1d84110 100644
--- a/pkg/shelf/test/message_test.dart
+++ b/pkg/shelf/test/message_test.dart
@@ -131,6 +131,26 @@
           ..close();
       });
     });
+
+    test("throws when calling read()/readAsString() multiple times", () {
+      var request;
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.readAsString(), completion(isEmpty));
+      expect(() => request.read(), throwsStateError);
+
+      request = _createMessage();
+      expect(request.read().toList(), completion(isEmpty));
+      expect(() => request.readAsString(), throwsStateError);
+    });
   });
 
   group("contentLength", () {
diff --git a/pkg/source_maps/CHANGELOG.md b/pkg/source_maps/CHANGELOG.md
index e278458..f40a16d 100644
--- a/pkg/source_maps/CHANGELOG.md
+++ b/pkg/source_maps/CHANGELOG.md
@@ -1,3 +1,16 @@
+## 0.9.2+2
+
+* Fix a bug in `FixedSpan.getLocationMessage`.
+
+## 0.9.2+1
+
+* Minor readability improvements to `FixedSpan.getLocationMessage` and
+  `SpanException.toString`.
+
+## 0.9.2
+
+* Add `SpanException` and `SpanFormatException` classes.
+
 ## 0.9.1
 
 * Support unmapped areas in source maps.
diff --git a/pkg/source_maps/lib/span.dart b/pkg/source_maps/lib/span.dart
index f47e08e..600506e 100644
--- a/pkg/source_maps/lib/span.dart
+++ b/pkg/source_maps/lib/span.dart
@@ -64,7 +64,10 @@
 
   String getLocationMessage(String message,
       {bool useColors: false, String color}) {
-    return '$formatLocation: $message';
+    var source = start.sourceUrl == null ? '' :
+        ' of ${p.prettyUri(start.sourceUrl)}';
+    return 'line ${start.line + 1}, column ${start.column + 1}$source: ' +
+        message;
   }
 
   bool operator ==(Span other) =>
@@ -360,3 +363,28 @@
   String getText(int start, [int end]) =>
     super.getText(start - _baseOffset, end == null ? null : end - _baseOffset);
 }
+
+/// A class for exceptions that have source span information attached.
+class SpanException implements Exception {
+  /// A message describing the exception.
+  final String message;
+
+  /// The span associated with this exception.
+  ///
+  /// This may be `null` if the source location can't be determined.
+  final Span span;
+
+  SpanException(this.message, this.span);
+
+  String toString({bool useColors: false, String color}) {
+    if (span == null) return message;
+    return "Error on " + span.getLocationMessage(message,
+        useColors: useColors, color: color);
+  }
+}
+
+/// A [SpanException] that's also a [FormatException].
+class SpanFormatException extends SpanException implements FormatException {
+  SpanFormatException(String message, Span span)
+      : super(message, span);
+}
diff --git a/pkg/source_maps/pubspec.yaml b/pkg/source_maps/pubspec.yaml
index 3c946e0..80c7e7f 100644
--- a/pkg/source_maps/pubspec.yaml
+++ b/pkg/source_maps/pubspec.yaml
@@ -1,5 +1,5 @@
 name: source_maps
-version: 0.9.1
+version: 0.9.2+2
 author: Dart Team <misc@dartlang.org>
 description: Library to programmatically manipulate source map files.
 homepage: http://www.dartlang.org
diff --git a/pkg/stack_trace/CHANGELOG.md b/pkg/stack_trace/CHANGELOG.md
index 0b3553f..a58190f 100644
--- a/pkg/stack_trace/CHANGELOG.md
+++ b/pkg/stack_trace/CHANGELOG.md
@@ -1,3 +1,7 @@
+## 1.0.1
+
+* Synchronous errors in the [Chain.capture] callback are now handled correctly.
+
 ## 1.0.0
 
 * No API changes, just declared stable.
diff --git a/pkg/stack_trace/lib/src/chain.dart b/pkg/stack_trace/lib/src/chain.dart
index a097bba..78c6ae4 100644
--- a/pkg/stack_trace/lib/src/chain.dart
+++ b/pkg/stack_trace/lib/src/chain.dart
@@ -90,7 +90,14 @@
   /// [15105]: https://code.google.com/p/dart/issues/detail?id=15105
   static capture(callback(), {ChainHandler onError}) {
     var spec = new StackZoneSpecification(onError);
-    return runZoned(callback, zoneSpecification: spec.toSpec(), zoneValues: {
+    return runZoned(() {
+      try {
+        return callback();
+      } catch (error, stackTrace) {
+        // TODO(nweiz): Don't special-case this when issue 19566 is fixed.
+        return Zone.current.handleUncaughtError(error, stackTrace);
+      }
+    }, zoneSpecification: spec.toSpec(), zoneValues: {
       #stack_trace.stack_zone.spec: spec
     });
   }
diff --git a/pkg/stack_trace/pubspec.yaml b/pkg/stack_trace/pubspec.yaml
index ddad7f9..1c43efd 100644
--- a/pkg/stack_trace/pubspec.yaml
+++ b/pkg/stack_trace/pubspec.yaml
@@ -1,5 +1,5 @@
 name: stack_trace
-version: 1.0.0
+version: 1.0.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
diff --git a/pkg/stack_trace/test/chain_test.dart b/pkg/stack_trace/test/chain_test.dart
index 3347deb..beb4721 100644
--- a/pkg/stack_trace/test/chain_test.dart
+++ b/pkg/stack_trace/test/chain_test.dart
@@ -14,6 +14,15 @@
 
 void main() {
   group('capture() with onError catches exceptions', () {
+    test('thrown synchronously', () {
+      return captureFuture(() => throw 'error')
+          .then((chain) {
+        expect(chain.traces, hasLength(1));
+        expect(chain.traces.single.frames.first,
+            frameMember(startsWith('main')));
+      });
+    });
+
     test('thrown in a microtask', () {
       return captureFuture(() => inMicrotask(() => throw 'error'))
           .then((chain) {
diff --git a/pkg/string_scanner/CHANGELOG.md b/pkg/string_scanner/CHANGELOG.md
index 2c41c9d..a5d5518 100644
--- a/pkg/string_scanner/CHANGELOG.md
+++ b/pkg/string_scanner/CHANGELOG.md
@@ -1,3 +1,10 @@
+## 0.0.3
+
+* Make `StringScannerException` inherit from source_map's
+  [`SpanFormatException`][].
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
 ## 0.0.2
 
 * `new StringScanner()` now takes an optional `sourceUrl` argument that provides
diff --git a/pkg/string_scanner/lib/src/exception.dart b/pkg/string_scanner/lib/src/exception.dart
index c398687..44ec9a3 100644
--- a/pkg/string_scanner/lib/src/exception.dart
+++ b/pkg/string_scanner/lib/src/exception.dart
@@ -7,10 +7,7 @@
 import 'package:source_maps/source_maps.dart';
 
 /// An exception thrown by a [StringScanner] that failed to parse a string.
-class StringScannerException implements FormatException {
-  /// The error message.
-  final String message;
-
+class StringScannerException extends SpanFormatException {
   /// The source string being parsed.
   final String string;
 
@@ -19,19 +16,6 @@
   /// This may be `null`, indicating that the source URL is unknown.
   final Uri sourceUrl;
 
-  /// The span within [string] that caused the exception.
-  final Span span;
-
-  StringScannerException(this.message, this.string, this.sourceUrl, this.span);
-
-  /// Returns a detailed description of this exception.
-  ///
-  /// If [useColors] is true, the section of the source that caused the
-  /// exception will be colored using ANSI color codes. By default, it's colored
-  /// red, but a different ANSI code may passed via [color].
-  String toString({bool useColors: false, String color}) {
-    return "Error on " + span.getLocationMessage(
-        message, useColors: useColors, color: color);
-  }
+  StringScannerException(String message, this.string, this.sourceUrl, Span span)
+      : super(message, span);
 }
-
diff --git a/pkg/string_scanner/pubspec.yaml b/pkg/string_scanner/pubspec.yaml
index 86ae238..f6d7ab9 100644
--- a/pkg/string_scanner/pubspec.yaml
+++ b/pkg/string_scanner/pubspec.yaml
@@ -1,12 +1,12 @@
 name: string_scanner
-version: 0.0.2
+version: 0.0.3
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: >
   A class for parsing strings using a sequence of patterns.
 dependencies:
   path: ">=1.2.0 <2.0.0"
-  source_maps: ">=0.9.0 <0.10.0"
+  source_maps: ">=0.9.2 <0.10.0"
 dev_dependencies:
   unittest: ">=0.10.0 <0.11.0"
 environment:
diff --git a/pkg/template_binding/CHANGELOG.md b/pkg/template_binding/CHANGELOG.md
index 5e8d985..7df9ea5 100644
--- a/pkg/template_binding/CHANGELOG.md
+++ b/pkg/template_binding/CHANGELOG.md
@@ -3,7 +3,7 @@
 This file contains highlights of what changes on each version of the
 template_binding package.
 
-#### Pub version 0.11.0-dev
+#### Pub version 0.11.0
   * Ported up to commit [TemplateBinding#1cee02][5b9a3b] and
     [NodeBind#c47bc1][c47bc1].
 
diff --git a/pkg/template_binding/pubspec.yaml b/pkg/template_binding/pubspec.yaml
index c84d4f5..acb2c24 100644
--- a/pkg/template_binding/pubspec.yaml
+++ b/pkg/template_binding/pubspec.yaml
@@ -1,5 +1,5 @@
 name: template_binding
-version: 0.11.0-dev
+version: 0.11.0
 author: Polymer.dart Team <web-ui-dev@dartlang.org>
 description: >
   Extends the capabilities of the HTML Template Element by enabling it to
diff --git a/pkg/typed_mock/lib/typed_mock.dart b/pkg/typed_mock/lib/typed_mock.dart
index eb9ae73..180ff27 100644
--- a/pkg/typed_mock/lib/typed_mock.dart
+++ b/pkg/typed_mock/lib/typed_mock.dart
@@ -39,6 +39,14 @@
   }
 }
 
+
+/// Clears all interactions remembered so far.
+resetInteractions(TypedMock mock) {
+  mock._invocations.clear();
+  mock._verifiedInvocations.clear();
+}
+
+
 /// Verifies certain behavior happened a specified number of times.
 Verifier verify(_ignored) {
   try {
@@ -364,6 +372,8 @@
 /// [ArgumentMatcher] checks whether the given argument satisfies some
 /// condition.
 abstract class ArgumentMatcher {
+  const ArgumentMatcher();
+
   /// Checks whether this matcher accepts the given argument.
   bool matches(val);
 }
@@ -372,7 +382,7 @@
 class _ArgumentMatcher_equals extends ArgumentMatcher {
   final expected;
 
-  _ArgumentMatcher_equals(this.expected);
+  const _ArgumentMatcher_equals(this.expected);
 
   @override
   bool matches(val) {
@@ -382,6 +392,8 @@
 
 
 class _ArgumentMatcher_anyBool extends ArgumentMatcher {
+  const _ArgumentMatcher_anyBool();
+
   @override
   bool matches(val) {
     return val is bool;
@@ -389,10 +401,12 @@
 }
 
 /// Matches any [bool] value.
-final anyBool = new _ArgumentMatcher_anyBool() as dynamic;
+final anyBool = const _ArgumentMatcher_anyBool() as dynamic;
 
 
 class _ArgumentMatcher_anyInt extends ArgumentMatcher {
+  const _ArgumentMatcher_anyInt();
+
   @override
   bool matches(val) {
     return val is int;
@@ -400,10 +414,12 @@
 }
 
 /// Matches any [int] value.
-final anyInt = new _ArgumentMatcher_anyInt() as dynamic;
+final anyInt = const _ArgumentMatcher_anyInt() as dynamic;
 
 
 class _ArgumentMatcher_anyObject extends ArgumentMatcher {
+  const _ArgumentMatcher_anyObject();
+
   @override
   bool matches(val) {
     return true;
@@ -411,10 +427,12 @@
 }
 
 /// Matches any [Object] (or subclass) value.
-final anyObject = new _ArgumentMatcher_anyObject() as dynamic;
+final anyObject = const _ArgumentMatcher_anyObject() as dynamic;
 
 
 class _ArgumentMatcher_anyString extends ArgumentMatcher {
+  const _ArgumentMatcher_anyString();
+
   @override
   bool matches(val) {
     return val is String;
@@ -422,4 +440,4 @@
 }
 
 /// Matches any [String] value.
-final anyString = new _ArgumentMatcher_anyString() as dynamic;
+final anyString = const _ArgumentMatcher_anyString() as dynamic;
diff --git a/pkg/typed_mock/pubspec.yaml b/pkg/typed_mock/pubspec.yaml
index 209860c..937b128 100644
--- a/pkg/typed_mock/pubspec.yaml
+++ b/pkg/typed_mock/pubspec.yaml
@@ -1,5 +1,5 @@
 name: typed_mock
-version: 0.0.2
+version: 0.0.4
 author: Dart Team <misc@dartlang.org>
 description: A library for mocking classes using Mockito-like syntax
 homepage: http://www.dartlang.org
diff --git a/pkg/typed_mock/test/typed_mock_test.dart b/pkg/typed_mock/test/typed_mock_test.dart
index c2dc907..9585673 100644
--- a/pkg/typed_mock/test/typed_mock_test.dart
+++ b/pkg/typed_mock/test/typed_mock_test.dart
@@ -183,6 +183,14 @@
     });
   });
 
+  test('resetInteractions', () {
+    TestInterfaceMock obj = new TestInterfaceMock();
+    obj.testProperty;
+    obj.testMethod0();
+    resetInteractions(obj);
+    verifyZeroInteractions(obj);
+  });
+
   group('verify', () {
     TestInterfaceMock obj;
     setUp(() {
diff --git a/pkg/unittest/CHANGELOG.md b/pkg/unittest/CHANGELOG.md
index b9c36f2..d8171f9 100644
--- a/pkg/unittest/CHANGELOG.md
+++ b/pkg/unittest/CHANGELOG.md
@@ -1,4 +1,8 @@
-##0.11.1+1
+##0.11.0+2
+
+*  Removed unused files from tests and standardized remaining test file names.
+
+##0.11.0+1
 
 * Widen the version constraint for `stack_trace`.
 
@@ -55,5 +59,3 @@
 * `runTests`, `tearDown`, `setUp`, `test`, `group`, `solo_test`, and
   `solo_group` now throw a `StateError` if called while tests are running.
 * `rerunTests` has been removed.
-
-##0.9.3 - 2014-01-13
diff --git a/pkg/unittest/pubspec.yaml b/pkg/unittest/pubspec.yaml
index fc05836..c5b04ca 100644
--- a/pkg/unittest/pubspec.yaml
+++ b/pkg/unittest/pubspec.yaml
@@ -1,5 +1,5 @@
 name: unittest
-version: 0.11.0+1
+version: 0.11.0+2
 author: Dart Team <misc@dartlang.org>
 description: A library for writing dart unit tests.
 homepage: http://www.dartlang.org
diff --git a/pkg/unittest/test/unittest_async_exception_test.dart b/pkg/unittest/test/async_exception_test.dart
similarity index 81%
rename from pkg/unittest/test/unittest_async_exception_test.dart
rename to pkg/unittest/test/async_exception_test.dart
index cc35116..8574416 100644
--- a/pkg/unittest/test/unittest_async_exception_test.dart
+++ b/pkg/unittest/test/async_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'async exception test';
 
@@ -18,4 +20,4 @@
   });
 };
 
-var expected = buildStatusString(0, 1, 0, testName, message: 'Caught error!');
+final expected = buildStatusString(0, 1, 0, testName, message: 'Caught error!');
diff --git a/pkg/unittest/test/unittest_async_setup_teardown_test.dart b/pkg/unittest/test/async_setup_teardown_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_async_setup_teardown_test.dart
rename to pkg/unittest/test/async_setup_teardown_test.dart
index 067dbf9..56e7c12 100644
--- a/pkg/unittest/test/unittest_async_setup_teardown_test.dart
+++ b/pkg/unittest/test/async_setup_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'async setup teardown test';
 
@@ -53,7 +55,7 @@
   test('post groups', () {});
 };
 
-var expected = buildStatusString(2, 0, 3,
+final expected = buildStatusString(2, 0, 3,
     'good setup/good teardown foo1::'
     'good setup/bad teardown foo2:'
     'Teardown failed: Caught Failed to complete tearDown:'
diff --git a/pkg/unittest/test/breath_test.dart b/pkg/unittest/test/breath_test.dart
index 84435a6..7b0a038 100644
--- a/pkg/unittest/test/breath_test.dart
+++ b/pkg/unittest/test/breath_test.dart
@@ -2,11 +2,13 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+library unittest.breath_test;
+
 import 'dart:async';
 
 import 'package:unittest/unittest.dart';
 
-main() {
+void main() {
   // Test the sync test 'breath' feature of unittest.
 
   group('breath', () {
@@ -31,4 +33,3 @@
     });
   });
 }
-
diff --git a/pkg/unittest/test/unittest_completion_test.dart b/pkg/unittest/test/completion_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_completion_test.dart
rename to pkg/unittest/test/completion_test.dart
index 037dee1..c1ed574 100644
--- a/pkg/unittest/test/unittest_completion_test.dart
+++ b/pkg/unittest/test/completion_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'completion test';
 
diff --git a/pkg/unittest/test/unittest_correct_callback_test.dart b/pkg/unittest/test/correct_callback_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_correct_callback_test.dart
rename to pkg/unittest/test/correct_callback_test.dart
index 43b40ea..a5689b9 100644
--- a/pkg/unittest/test/unittest_correct_callback_test.dart
+++ b/pkg/unittest/test/correct_callback_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'correct callback test';
 
diff --git a/pkg/unittest/test/unittest_exception_test.dart b/pkg/unittest/test/exception_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_exception_test.dart
rename to pkg/unittest/test/exception_test.dart
index 23d302d..f84ac18 100644
--- a/pkg/unittest/test/unittest_exception_test.dart
+++ b/pkg/unittest/test/exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'exception test';
 
diff --git a/pkg/unittest/test/unittest_excess_callback_test.dart b/pkg/unittest/test/excess_callback_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_excess_callback_test.dart
rename to pkg/unittest/test/excess_callback_test.dart
index 76a3a9e..0bd985e 100644
--- a/pkg/unittest/test/unittest_excess_callback_test.dart
+++ b/pkg/unittest/test/excess_callback_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'excess callback test';
 
diff --git a/pkg/unittest/test/unittest_expect_async_args_test.dart b/pkg/unittest/test/expect_async_args_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_expect_async_args_test.dart
rename to pkg/unittest/test/expect_async_args_test.dart
index 0fd7517..82702b3 100644
--- a/pkg/unittest/test/unittest_expect_async_args_test.dart
+++ b/pkg/unittest/test/expect_async_args_test.dart
@@ -4,11 +4,12 @@
 
 library unittestTest;
 
-import 'dart:isolate';
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (TestConfiguration testConfig) {
   List<int> _getArgs([a = 0, b = 0, c = 0, d = 0, e = 0, f = 0]) {
diff --git a/pkg/unittest/test/unittest_expect_async_test.dart b/pkg/unittest/test/expect_async_test.dart
similarity index 98%
rename from pkg/unittest/test/unittest_expect_async_test.dart
rename to pkg/unittest/test/expect_async_test.dart
index a8bbde5..cd771b1 100644
--- a/pkg/unittest/test/unittest_expect_async_test.dart
+++ b/pkg/unittest/test/expect_async_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (TestConfiguration testConfig) {
   test('expectAsync zero params', () {
diff --git a/pkg/unittest/test/unittest_group_name_test.dart b/pkg/unittest/test/group_name_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_group_name_test.dart
rename to pkg/unittest/test/group_name_test.dart
index 8f6b87b..c0fdfa0 100644
--- a/pkg/unittest/test/unittest_group_name_test.dart
+++ b/pkg/unittest/test/group_name_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'group name test';
 
diff --git a/pkg/unittest/test/instance_test.dart b/pkg/unittest/test/instance_test.dart
deleted file mode 100644
index 287744c..0000000
--- a/pkg/unittest/test/instance_test.dart
+++ /dev/null
@@ -1,29 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library unittestTests;
-import 'package:unittest/unittest.dart';
-
-import 'test_utils.dart';
-
-main() {
-  initUtils();
-
-  group('Type Matchers', () {
-    test('isInstanceOf', () {
-      shouldFail(0, new isInstanceOf<String>('String'),
-          "Expected: an instance of String Actual: <0>");
-      shouldPass('cow', new isInstanceOf<String>('String'));
-    });
-
-    test('throwsA', () {
-      shouldPass(doesThrow, throwsA(equals('X')));
-      shouldFail(doesThrow, throwsA(equals('Y')),
-          matches("Expected: throws 'Y'.*"
-          "Actual: <Closure.*"
-          "Which: threw 'X'"));
-    });
-  });
-}
-
diff --git a/pkg/unittest/test/unittest_invalid_ops_test.dart b/pkg/unittest/test/invalid_ops_test.dart
similarity index 96%
rename from pkg/unittest/test/unittest_invalid_ops_test.dart
rename to pkg/unittest/test/invalid_ops_test.dart
index 4f1091c..a1c5190 100644
--- a/pkg/unittest/test/unittest_invalid_ops_test.dart
+++ b/pkg/unittest/test/invalid_ops_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'invalid ops throw while test is running';
 
diff --git a/pkg/unittest/test/unittest_late_exception_test.dart b/pkg/unittest/test/late_exception_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_late_exception_test.dart
rename to pkg/unittest/test/late_exception_test.dart
index c80de12..4fec977 100644
--- a/pkg/unittest/test/unittest_late_exception_test.dart
+++ b/pkg/unittest/test/late_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'late exception test';
 
diff --git a/pkg/unittest/test/unittest_middle_exception_test.dart b/pkg/unittest/test/middle_exception_test.dart
similarity index 90%
rename from pkg/unittest/test/unittest_middle_exception_test.dart
rename to pkg/unittest/test/middle_exception_test.dart
index ba77514..6fb1b7b 100644
--- a/pkg/unittest/test/unittest_middle_exception_test.dart
+++ b/pkg/unittest/test/middle_exception_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'late exception test';
 
@@ -23,5 +25,5 @@
   });
 };
 
-var expected = buildStatusString(2, 1, 0,
+final expected = buildStatusString(2, 1, 0,
     'testOne::testTwo:Expected: false Actual: <true>:testThree');
diff --git a/pkg/unittest/test/missing_tick_test.dart b/pkg/unittest/test/missing_tick_test.dart
index 19c5b89..bc7bd58 100644
--- a/pkg/unittest/test/missing_tick_test.dart
+++ b/pkg/unittest/test/missing_tick_test.dart
@@ -2,10 +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.
 
+library unittest.missing_tick_test;
+
 import 'package:unittest/unittest.dart';
 
 // TODO(gram): Convert to a shouldFail passing test.
-main() {
+void main() {
   SimpleConfiguration config = unittestConfiguration;
   config.timeout = const Duration(seconds: 2);
   group('Broken', () {
diff --git a/pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart
rename to pkg/unittest/test/nested_groups_setup_teardown_test.dart
index 1cb16a0..fdd851a 100644
--- a/pkg/unittest/test/unittest_nested_groups_setup_teardown_test.dart
+++ b/pkg/unittest/test/nested_groups_setup_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'nested groups setup/teardown';
 
diff --git a/pkg/unittest/test/unittest_protect_async_test.dart b/pkg/unittest/test/protect_async_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_protect_async_test.dart
rename to pkg/unittest/test/protect_async_test.dart
index 15d3394..8fd6765 100644
--- a/pkg/unittest/test/unittest_protect_async_test.dart
+++ b/pkg/unittest/test/protect_async_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testFunction = (_) {
   test('protectAsync0', () {
diff --git a/pkg/unittest/test/unittest_test_returning_future_test.dart b/pkg/unittest/test/returning_future_test.dart
similarity index 97%
rename from pkg/unittest/test/unittest_test_returning_future_test.dart
rename to pkg/unittest/test/returning_future_test.dart
index 83c4a5d..97faf8e 100644
--- a/pkg/unittest/test/unittest_test_returning_future_test.dart
+++ b/pkg/unittest/test/returning_future_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'test returning future';
 
diff --git a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart b/pkg/unittest/test/returning_future_using_runasync_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
rename to pkg/unittest/test/returning_future_using_runasync_test.dart
index e5fc304..0ba0b48 100644
--- a/pkg/unittest/test/unittest_test_returning_future_using_runasync_test.dart
+++ b/pkg/unittest/test/returning_future_using_runasync_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'test returning future using scheduleMicrotask';
 
@@ -64,7 +66,7 @@
   });
 };
 
-var expected = buildStatusString(2, 4, 0,
+final expected = buildStatusString(2, 4, 0,
     'successful::'
     'fail1:Expected: <false> Actual: <true>:'
     'error1:Callback called more times than expected (1).:'
diff --git a/pkg/unittest/test/unittest_runtests_without_tests_test.dart b/pkg/unittest/test/runtests_without_tests_test.dart
similarity index 93%
rename from pkg/unittest/test/unittest_runtests_without_tests_test.dart
rename to pkg/unittest/test/runtests_without_tests_test.dart
index e8c26f8..b4c95122 100644
--- a/pkg/unittest/test/unittest_runtests_without_tests_test.dart
+++ b/pkg/unittest/test/runtests_without_tests_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'runTests() without tests';
 
diff --git a/pkg/unittest/test/unittest_setup_and_teardown_test.dart b/pkg/unittest/test/setup_and_teardown_test.dart
similarity index 95%
rename from pkg/unittest/test/unittest_setup_and_teardown_test.dart
rename to pkg/unittest/test/setup_and_teardown_test.dart
index 0c20cf3..4b3a7f8 100644
--- a/pkg/unittest/test/unittest_setup_and_teardown_test.dart
+++ b/pkg/unittest/test/setup_and_teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'setup and teardown test';
 
diff --git a/pkg/unittest/test/unittest_setup_test.dart b/pkg/unittest/test/setup_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_setup_test.dart
rename to pkg/unittest/test/setup_test.dart
index 0050f64..dfb5ee1 100644
--- a/pkg/unittest/test/unittest_setup_test.dart
+++ b/pkg/unittest/test/setup_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'setup test';
 
@@ -20,5 +22,3 @@
 
 var expected = buildStatusString(1, 0, 0, 'a $testName',
     count: 0, setup: 'setup');
-
-
diff --git a/pkg/unittest/test/unittest_single_correct_test.dart b/pkg/unittest/test/single_correct_test.dart
similarity index 93%
rename from pkg/unittest/test/unittest_single_correct_test.dart
rename to pkg/unittest/test/single_correct_test.dart
index 23c31fd..f10ff0c 100644
--- a/pkg/unittest/test/unittest_single_correct_test.dart
+++ b/pkg/unittest/test/single_correct_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'single correct test';
 
diff --git a/pkg/unittest/test/unittest_single_failing_test.dart b/pkg/unittest/test/single_failing_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_single_failing_test.dart
rename to pkg/unittest/test/single_failing_test.dart
index c965e7a..0ba648e 100644
--- a/pkg/unittest/test/unittest_single_failing_test.dart
+++ b/pkg/unittest/test/single_failing_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'single failing test';
 
diff --git a/pkg/unittest/test/unittest_skipped_soloed_nested_test.dart b/pkg/unittest/test/skipped_soloed_nested_test.dart
similarity index 98%
rename from pkg/unittest/test/unittest_skipped_soloed_nested_test.dart
rename to pkg/unittest/test/skipped_soloed_nested_test.dart
index 3cbd09d..cf32f2c 100644
--- a/pkg/unittest/test/unittest_skipped_soloed_nested_test.dart
+++ b/pkg/unittest/test/skipped_soloed_nested_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'skipped/soloed nested groups with setup/teardown';
 
diff --git a/pkg/unittest/test/unittest_teardown_test.dart b/pkg/unittest/test/teardown_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_teardown_test.dart
rename to pkg/unittest/test/teardown_test.dart
index c01bdaf..8d23398 100644
--- a/pkg/unittest/test/unittest_teardown_test.dart
+++ b/pkg/unittest/test/teardown_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'teardown test';
 
diff --git a/pkg/unittest/test/test_common.dart b/pkg/unittest/test/test_common.dart
deleted file mode 100644
index da9e9e5..0000000
--- a/pkg/unittest/test/test_common.dart
+++ /dev/null
@@ -1,59 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_common;
-
-import 'dart:collection';
-
-import 'package:unittest/unittest.dart';
-
-class Widget {
-  int price;
-}
-
-class HasPrice extends CustomMatcher {
-  HasPrice(matcher) :
-    super("Widget with a price that is", "price", matcher);
-  featureValueOf(actual) => actual.price;
-}
-
-class SimpleIterable extends IterableBase {
-  int count;
-  SimpleIterable(this.count);
-
-  bool contains(int val) => count < val ? false : true;
-
-  bool any(bool f(element)) {
-    for (var i = 0; i <= count; i++) {
-      if (f(i)) return true;
-    }
-    return false;
-  }
-
-  String toString() => "<[$count]>";
-
-  Iterator get iterator {
-    return new SimpleIterator(count);
-  }
-}
-
-class SimpleIterator implements Iterator {
-  int _count;
-  int _current;
-
-  SimpleIterator(this._count);
-
-  bool moveNext() {
-    if (_count > 0) {
-      _current = _count;
-      _count--;
-      return true;
-    }
-    _current = null;
-    return false;
-  }
-
-  get current => _current;
-}
-
diff --git a/pkg/unittest/test/test_utils.dart b/pkg/unittest/test/test_utils.dart
deleted file mode 100644
index 783f71b..0000000
--- a/pkg/unittest/test/test_utils.dart
+++ /dev/null
@@ -1,81 +0,0 @@
-// Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library test_utils;
-
-import 'package:unittest/unittest.dart';
-
-import 'dart:async';
-
-int errorCount;
-String errorString;
-var _testHandler = null;
-
-class MyFailureHandler extends DefaultFailureHandler {
-  void fail(String reason) {
-    ++errorCount;
-    errorString = reason;
-  }
-}
-
-void initUtils() {
-  if (_testHandler == null) {
-    _testHandler = new MyFailureHandler();
-  }
-}
-
-void shouldFail(value, Matcher matcher, expected, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  errorCount = 0;
-  errorString = '';
-  expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(errorCount, equals(1));
-    if (expected is String) {
-      expect(errorString, equalsIgnoringWhitespace(expected));
-    } else {
-      expect(errorString.replaceAll('\n', ''), expected);
-    }
-  }
-
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
-}
-
-void shouldPass(value, Matcher matcher, {bool isAsync: false}) {
-  configureExpectFailureHandler(_testHandler);
-  errorCount = 0;
-  errorString = '';
-  expect(value, matcher);
-  afterTest() {
-    configureExpectFailureHandler(null);
-    expect(errorCount, equals(0));
-  }
-  if (isAsync) {
-    Timer.run(expectAsync(afterTest));
-  } else {
-    afterTest();
-  }
-}
-
-doesNotThrow() {}
-doesThrow() { throw 'X'; }
-
-class PrefixMatcher extends Matcher {
-  final String _prefix;
-  const PrefixMatcher(this._prefix);
-  bool matches(item, Map matchState) {
-    return item is String &&
-        (collapseWhitespace(item)).startsWith(collapseWhitespace(_prefix));
-  }
-
-  Description describe(Description description) =>
-    description.add('a string starting with ').
-        addDescriptionOf(collapseWhitespace(_prefix)).
-        add(' ignoring whitespace');
-}
diff --git a/pkg/unittest/test/unittest_testcases_immutable_test.dart b/pkg/unittest/test/testcases_immutable_test.dart
similarity index 94%
rename from pkg/unittest/test/unittest_testcases_immutable_test.dart
rename to pkg/unittest/test/testcases_immutable_test.dart
index 891ea3a..ddd42d2 100644
--- a/pkg/unittest/test/unittest_testcases_immutable_test.dart
+++ b/pkg/unittest/test/testcases_immutable_test.dart
@@ -3,11 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library unittestTest;
-import 'dart:isolate';
+
 import 'dart:async';
+import 'dart:isolate';
+
 import 'package:unittest/unittest.dart';
 
-part 'unittest_test_utils.dart';
+part 'utils.dart';
 
 var testName = 'testcases immutable';
 
diff --git a/pkg/unittest/test/unittest_test_utils.dart b/pkg/unittest/test/utils.dart
similarity index 100%
rename from pkg/unittest/test/unittest_test_utils.dart
rename to pkg/unittest/test/utils.dart
diff --git a/pkg/watcher/lib/src/directory_watcher/windows.dart b/pkg/watcher/lib/src/directory_watcher/windows.dart
index ddcf897..4f41d33 100644
--- a/pkg/watcher/lib/src/directory_watcher/windows.dart
+++ b/pkg/watcher/lib/src/directory_watcher/windows.dart
@@ -28,11 +28,8 @@
   final List<FileSystemEvent> events = [];
   Timer timer;
 
-  void addEvent(FileSystemEvent event) {
+  void addEvent(FileSystemEvent event, void callback()) {
     events.add(event);
-  }
-
-  void startTimer(void callback()) {
     if (timer != null) {
       timer.cancel();
     }
@@ -78,18 +75,19 @@
   /// the directory to determine its initial state.
   StreamSubscription<FileSystemEntity> _initialListSubscription;
 
-  /// The subscriptions to the [Directory.list] call for listing the contents of
-  /// subdirectories that was moved into the watched directory.
+  /// The subscriptions to the [Directory.list] calls for listing the contents
+  /// of subdirectories that were moved into the watched directory.
   final Set<StreamSubscription<FileSystemEntity>> _listSubscriptions
       = new HashSet<StreamSubscription<FileSystemEntity>>();
 
   _WindowsDirectoryWatcher(String directory)
       : directory = directory, _files = new PathSet(directory) {
-    _startWatch();
-    _startParentWatcher();
-
     // Before we're ready to emit events, wait for [_listDir] to complete.
-    _listDir().then(_readyCompleter.complete);
+    _listDir().then((_) {
+      _startWatch();
+      _startParentWatcher();
+      _readyCompleter.complete();
+    });
   }
 
   void close() {
@@ -111,13 +109,13 @@
   }
 
   /// On Windows, if [directory] is deleted, we will not receive any event.
+  ///
   /// Instead, we add a watcher on the parent folder (if any), that can notify
-  /// us about [directory].
-  /// This also includes events such as moves.
+  /// us about [directory]. This also includes events such as moves.
   void _startParentWatcher() {
     var absoluteDir = p.absolute(directory);
     var parent = p.dirname(absoluteDir);
-    // Check if we [directory] is already the root directory.
+    // Check if [directory] is already the root directory.
     if (FileSystemEntity.identicalSync(parent, directory)) return;
     var parentStream = Chain.track(
         new Directory(parent).watch(recursive: false));
@@ -140,26 +138,19 @@
         close();
       }
     }, onError: (error) {
-      // Ignore errors, simply close the stream.
+      // Ignore errors, simply close the stream. The user listens on
+      // [directory], and while it can fail to listen on the parent, we may
+      // still be able to listen on the path requested.
       _parentWatchSubscription.cancel();
       _parentWatchSubscription = null;
     });
   }
 
   void _onEvent(FileSystemEvent event) {
-    // If we get a event before we're ready to begin emitting events,
-    // ignore those events and re-list the directory.
-    if (!isReady) {
-      _listDir().then((_) {
-       _readyCompleter.complete();
-      });
-      return;
-    }
-
-    _EventBatcher batcher = _eventBatchers.putIfAbsent(
+    assert(isReady);
+    final batcher = _eventBatchers.putIfAbsent(
         event.path, () => new _EventBatcher());
-    batcher.addEvent(event);
-    batcher.startTimer(() {
+    batcher.addEvent(event, () {
       _eventBatchers.remove(event.path);
       _onBatch(batcher.events);
     });
@@ -246,8 +237,7 @@
 
     for (var event in batch) {
       if (event is FileSystemMoveEvent) {
-        FileSystemMoveEvent moveEvent = event;
-        addEvent(moveEvent.destination, event);
+        addEvent(event.destination, event);
       }
       addEvent(event.path, event);
     }
@@ -366,7 +356,7 @@
   void _onDone() {
     _watchSubscription = null;
 
-    // Emit remove-events for any remaining files.
+    // Emit remove events for any remaining files.
     for (var file in _files.toSet()) {
       _emitEvent(ChangeType.REMOVE, file);
     }
@@ -376,7 +366,7 @@
 
   /// Start or restart the underlying [Directory.watch] stream.
   void _startWatch() {
-    // Batch the events changes together so that we can dedup events.
+    // Batch the events together so that we can dedup events.
     var innerStream =
         Chain.track(new Directory(directory).watch(recursive: true));
     _watchSubscription = innerStream.listen(_onEvent,
diff --git a/pkg/watcher/test/directory_watcher/shared.dart b/pkg/watcher/test/directory_watcher/shared.dart
index 849cea00..d3575ea 100644
--- a/pkg/watcher/test/directory_watcher/shared.dart
+++ b/pkg/watcher/test/directory_watcher/shared.dart
@@ -78,6 +78,20 @@
     ]);
   });
 
+  test('when the watched directory is moved, removes all files', () {
+    writeFile("dir/a.txt");
+    writeFile("dir/b.txt");
+
+    startWatcher(dir: "dir");
+
+    renameDir("dir", "moved_dir");
+    createDir("dir");
+    inAnyOrder([
+      isRemoveEvent("dir/a.txt"),
+      isRemoveEvent("dir/b.txt")
+    ]);
+  });
+
   group("moves", () {
     test('notifies when a file is moved within the watched directory', () {
       writeFile("old.txt");
diff --git a/pkg/watcher/test/directory_watcher/windows_test.dart b/pkg/watcher/test/directory_watcher/windows_test.dart
index 3e9a854..6bfb88b 100644
--- a/pkg/watcher/test/directory_watcher/windows_test.dart
+++ b/pkg/watcher/test/directory_watcher/windows_test.dart
@@ -23,19 +23,5 @@
     expect(new DirectoryWatcher('.'),
         new isInstanceOf<WindowsDirectoryWatcher>());
   });
-
-  test('when the watched directory is moved, removes all files', () {
-    writeFile("dir/a.txt");
-    writeFile("dir/b.txt");
-
-    startWatcher(dir: "dir");
-
-    renameDir("dir", "moved_dir");
-    createDir("dir");
-    inAnyOrder([
-      isRemoveEvent("dir/a.txt"),
-      isRemoveEvent("dir/b.txt")
-    ]);
-  });
 }
 
diff --git a/pkg/web_components/CHANGELOG.md b/pkg/web_components/CHANGELOG.md
new file mode 100644
index 0000000..87f77b6
--- /dev/null
+++ b/pkg/web_components/CHANGELOG.md
@@ -0,0 +1,10 @@
+# changelog
+
+This file contains highlights of what changes on each version of this package.
+
+#### Pub version 0.3.5
+  * Added `registerDartType` to register a Dart API for a custom-element written
+    in Javascript.
+
+#### Pub version 0.3.4
+  * Updated to platform 0.2.4 (see lib/build.log for details)
diff --git a/pkg/web_components/lib/interop.dart b/pkg/web_components/lib/interop.dart
index 415c7fe..de1ef2f 100644
--- a/pkg/web_components/lib/interop.dart
+++ b/pkg/web_components/lib/interop.dart
@@ -29,7 +29,17 @@
 
   var upgrader = document.createElementUpgrader(
       dartType, extendsTag: extendsTag);
-  _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgrader.upgrade]);
+
+  // Unfortunately the dart:html upgrader will throw on an already-upgraded
+  // element, so we need to duplicate the type check to prevent that.
+  // An element can be upgraded twice if it extends another element and calls
+  // createdCallback on the superclass. Since that's a valid use case we must
+  // wrap at both levels, and guard against it here.
+  upgradeElement(e) {
+    if (e.runtimeType != dartType) upgrader.upgrade(e);
+  }
+
+  _doc.callMethod('_registerDartTypeUpgrader', [tagName, upgradeElement]);
 }
 
 /// This function is mainly used to save resources. By default, we save a log of
diff --git a/pkg/web_components/lib/platform.concat.js b/pkg/web_components/lib/platform.concat.js
index be0db90..2044ee3 100644
--- a/pkg/web_components/lib/platform.concat.js
+++ b/pkg/web_components/lib/platform.concat.js
@@ -192,7 +192,7 @@
     return obj === Object(obj);
   }
 
-  var numberIsNaN = global.Number.isNaN || function isNaN(value) {
+  var numberIsNaN = global.Number.isNaN || function(value) {
     return typeof value === 'number' && global.isNaN(value);
   }
 
@@ -221,45 +221,194 @@
 
   var identStart = '[\$_a-zA-Z]';
   var identPart = '[\$_a-zA-Z0-9]';
-  var ident = identStart + '+' + identPart + '*';
-  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
-  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';
-  var path = '(?:' + identOrElementIndex + ')(?:\\s*\\.\\s*' + identOrElementIndex + ')*';
-  var pathRegExp = new RegExp('^' + path + '$');
+  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');
 
-  function isPathValid(s) {
-    if (typeof s != 'string')
-      return false;
-    s = s.trim();
+  function getPathCharType(char) {
+    if (char === undefined)
+      return 'eof';
 
-    if (s == '')
-      return true;
+    var code = char.charCodeAt(0);
 
-    if (s[0] == '.')
-      return false;
+    switch(code) {
+      case 0x5B: // [
+      case 0x5D: // ]
+      case 0x2E: // .
+      case 0x22: // "
+      case 0x27: // '
+      case 0x30: // 0
+        return char;
 
-    return pathRegExp.test(s);
+      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(s, privateToken) {
+  function Path(parts, privateToken) {
     if (privateToken !== constructorIsPrivate)
       throw Error('Use Path.get to retrieve path objects');
 
-    if (s.trim() == '')
-      return this;
-
-    if (isIndex(s)) {
-      this.push(s);
-      return this;
-    }
-
-    s.split(/\s*\.\s*/).filter(function(part) {
-      return part;
-    }).forEach(function(part) {
-      this.push(part);
-    }, this);
+    if (parts.length)
+      Array.prototype.push.apply(this, parts.slice());
 
     if (hasEval && this.length) {
       this.getValueFrom = this.compiledGetValueFromFn();
@@ -273,30 +422,57 @@
     if (pathString instanceof Path)
       return pathString;
 
-    if (pathString == null)
+    if (pathString == null || pathString.length == 0)
       pathString = '';
 
-    if (typeof pathString !== 'string')
+    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;
-    if (!isPathValid(pathString))
+
+    var parts = parsePath(pathString);
+    if (!parts)
       return invalidPath;
-    var path = new Path(pathString, constructorIsPrivate);
+
+    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() {
-      return this.join('.');
+      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) {
@@ -319,22 +495,20 @@
     },
 
     compiledGetValueFromFn: function() {
-      var accessors = this.map(function(ident) {
-        return isIndex(ident) ? '["' + ident + '"]' : '.' + ident;
-      });
-
       var str = '';
       var pathString = 'obj';
       str += 'if (obj != null';
       var i = 0;
+      var key;
       for (; i < (this.length - 1); i++) {
-        var ident = this[i];
-        pathString += accessors[i];
+        key = this[i];
+        pathString += isIdent(key) ? '.' + key : formatAccessor(key);
         str += ' &&\n     ' + pathString + ' != null';
       }
       str += ')\n';
 
-      pathString += accessors[i];
+      var key = this[i];
+      pathString += isIdent(key) ? '.' + key : formatAccessor(key);
 
       str += '  return ' + pathString + ';\nelse\n  return undefined;';
       return new Function('obj', str);
@@ -935,6 +1109,10 @@
   PathObserver.prototype = createObject({
     __proto__: Observer.prototype,
 
+    get path() {
+      return this.path_;
+    },
+
     connect_: function() {
       if (hasObserve)
         this.directObserver_ = getObservedSet(this, this.object_);
@@ -961,7 +1139,7 @@
       if (skipChanges || areSameValue(this.value_, oldValue))
         return false;
 
-      this.report_([this.value_, oldValue]);
+      this.report_([this.value_, oldValue, this]);
       return true;
     },
 
@@ -1171,98 +1349,6 @@
     delete: true
   };
 
- var updateRecord = {
-    object: undefined,
-    type: 'update',
-    name: undefined,
-    oldValue: undefined
-  };
-
-  function notify(object, name, value, oldValue) {
-    if (areSameValue(value, oldValue))
-      return;
-
-    // TODO(rafaelw): Hack hack hack. This entire code really needs to move
-    // out of observe-js into polymer.
-    if (typeof object.propertyChanged_ == 'function')
-      object.propertyChanged_(name, value, oldValue);
-
-    if (!hasObserve)
-      return;
-
-    var notifier = object.notifier_;
-    if (!notifier)
-      notifier = object.notifier_ = Object.getNotifier(object);
-
-    updateRecord.object = object;
-    updateRecord.name = name;
-    updateRecord.oldValue = oldValue;
-
-    notifier.notify(updateRecord);
-  }
-
-  Observer.createBindablePrototypeAccessor = function(proto, name) {
-    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) {
-        var observable = this[privateObservable];
-        if (observable) {
-          observable.setValue(value);
-          return;
-        }
-
-        var oldValue = this[privateName];
-        this[privateName] = value;
-        notify(this, name, value, oldValue);
-
-        return value;
-      },
-      configurable: true
-    });
-  }
-
-  Observer.bindToInstance = function(instance, name, observable, resolveFn) {
-    var privateName = name + '_';
-    var privateObservable  = name + 'Observable_';
-
-    instance[privateObservable] = observable;
-    var oldValue = instance[privateName];
-    var value = observable.open(function(value, oldValue) {
-      instance[privateName] = value;
-      notify(instance, name, value, oldValue);
-    });
-
-    if (resolveFn && !areSameValue(oldValue, value)) {
-      var resolvedValue = resolveFn(oldValue, value);
-      if (!areSameValue(value, resolvedValue)) {
-        value = resolvedValue;
-        if (observable.setValue)
-          observable.setValue(value);
-      }
-    }
-
-    instance[privateName] = value;
-    notify(instance, name, value, oldValue);
-
-    return {
-      close: function() {
-        observable.close();
-        instance[privateObservable] = undefined;
-      }
-    };
-  }
-
   function diffObjectFromChangeRecords(object, changeRecords, oldValues) {
     var added = {};
     var removed = {};
@@ -3044,7 +3130,11 @@
     targetTable.set(event, target);
     currentTargetTable.set(event, currentTarget);
 
-    for (var i = 0; i < listeners.length; i++) {
+    // 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;
@@ -3072,7 +3162,9 @@
       }
     }
 
-    if (anyRemoved) {
+    listeners.depth--;
+
+    if (anyRemoved && listeners.depth === 0) {
       var copy = listeners.slice();
       listeners.length = 0;
       for (var i = 0; i < copy.length; i++) {
@@ -3137,25 +3229,11 @@
       return eventPhaseTable.get(this);
     },
     get path() {
-      var nodeList = new wrappers.NodeList();
       var eventPath = eventPathTable.get(this);
-      if (eventPath) {
-        var index = 0;
-        var lastIndex = eventPath.length - 1;
-        var baseRoot = getTreeScope(currentTargetTable.get(this));
-
-        for (var i = 0; i <= lastIndex; i++) {
-          var currentTarget = eventPath[i];
-          var currentRoot = getTreeScope(currentTarget);
-          if (currentRoot.contains(baseRoot) &&
-              // Make sure we do not add Window to the path.
-              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
-            nodeList[index++] = currentTarget;
-          }
-        }
-        nodeList.length = index;
-      }
-      return nodeList;
+      if (!eventPath)
+        return [];
+      // TODO(arv): Event path should contain window.
+      return eventPath.slice();
     },
     stopPropagation: function() {
       stopPropagationTable.set(this, true);
@@ -3383,6 +3461,7 @@
       var listeners = listenersTable.get(this);
       if (!listeners) {
         listeners = [];
+        listeners.depth = 0;
         listenersTable.set(this, listeners);
       } else {
         // Might have a duplicate.
@@ -3491,6 +3570,15 @@
     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);
   }
 
@@ -4448,7 +4536,7 @@
         } else {
           if (modNode && remNodes.length) {
             modNode.data += s;
-            cleanUpNodes(remNodes);
+            cleanupNodes(remNodes);
           }
           remNodes = [];
           s = '';
@@ -4766,6 +4854,53 @@
   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';
+
+  function invalidateClass(el) {
+    scope.invalidateRendererBasedOnAttribute(el, 'class');
+  }
+
+  function DOMTokenList(impl, ownerElement) {
+    this.impl = impl;
+    this.ownerElement_ = ownerElement;
+  }
+
+  DOMTokenList.prototype = {
+    get length() {
+      return this.impl.length;
+    },
+    item: function(index) {
+      return this.impl.item(index);
+    },
+    contains: function(token) {
+      return this.impl.contains(token);
+    },
+    add: function() {
+      this.impl.add.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+    },
+    remove: function() {
+      this.impl.remove.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+    },
+    toggle: function(token) {
+      var rv = this.impl.toggle.apply(this.impl, arguments);
+      invalidateClass(this.ownerElement_);
+      return rv;
+    },
+    toString: function() {
+      return this.impl.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.
@@ -4776,6 +4911,7 @@
   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;
@@ -4783,6 +4919,7 @@
   var mixin = scope.mixin;
   var oneOf = scope.oneOf;
   var registerWrapper = scope.registerWrapper;
+  var unwrap = scope.unwrap;
   var wrappers = scope.wrappers;
 
   var OriginalElement = window.Element;
@@ -4822,6 +4959,8 @@
     });
   }
 
+  var classListTable = new WeakMap();
+
   function Element(node) {
     Node.call(this, node);
   }
@@ -4859,6 +4998,31 @@
 
     matches: function(selector) {
       return originalMatches.call(this.impl, selector);
+    },
+
+    get classList() {
+      var list = classListTable.get(this);
+      if (!list) {
+        classListTable.set(this,
+            list = new DOMTokenList(unwrap(this).classList, this));
+      }
+      return list;
+    },
+
+    get className() {
+      return unwrap(this).className;
+    },
+
+    set className(v) {
+      this.setAttribute('class', v);
+    },
+
+    get id() {
+      return unwrap(this).id;
+    },
+
+    set id(v) {
+      this.setAttribute('id', v);
     }
   });
 
@@ -4875,28 +5039,6 @@
         Element.prototype.createShadowRoot;
   }
 
-  /**
-   * Useful for generating the accessor pair for a property that reflects an
-   * attribute.
-   */
-  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {
-    var attrName = opt_attrName || propertyName;
-    Object.defineProperty(prototype, propertyName, {
-      get: function() {
-        return this.impl[propertyName];
-      },
-      set: function(v) {
-        this.impl[propertyName] = v;
-        invalidateRendererBasedOnAttribute(this, attrName);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  setterDirtiesAttribute(Element.prototype, 'id');
-  setterDirtiesAttribute(Element.prototype, 'className', 'class');
-
   mixin(Element.prototype, ChildNodeInterface);
   mixin(Element.prototype, GetElementsByInterface);
   mixin(Element.prototype, ParentNodeInterface);
@@ -4905,8 +5047,7 @@
   registerWrapper(OriginalElement, Element,
                   document.createElementNS(null, 'x'));
 
-  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings
-  // that reflect attributes.
+  scope.invalidateRendererBasedOnAttribute = invalidateRendererBasedOnAttribute;
   scope.matchesNames = matchesNames;
   scope.wrappers.Element = Element;
 })(window.ShadowDOMPolyfill);
@@ -5802,6 +5943,8 @@
 (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';
@@ -5809,6 +5952,16 @@
   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);
 
@@ -7100,6 +7253,10 @@
     getSelection: function() {
       renderAllPending();
       return new Selection(originalGetSelection.call(unwrap(this)));
+    },
+    getElementsByName: function(name) {
+      return SelectorsInterface.querySelectorAll.call(this,
+          '[name=' + JSON.stringify(String(name)) + ']');
     }
   });
 
@@ -7244,6 +7401,7 @@
     'createTextNode',
     'elementFromPoint',
     'getElementById',
+    'getElementsByName',
     'getSelection',
   ]);
 
@@ -7534,7 +7692,7 @@
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
 
-(function() {
+(function(scope) {
 
   // convenient global
   window.wrap = ShadowDOMPolyfill.wrapIfNeeded;
@@ -7567,7 +7725,62 @@
   };
 
   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.
@@ -7969,7 +8182,7 @@
     var cssText = '';
     if (cssRules) {
       Array.prototype.forEach.call(cssRules, function(rule) {
-        if (rule.selectorText && (rule.style && rule.style.cssText)) {
+        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';
@@ -7977,8 +8190,23 @@
           cssText += '@media ' + rule.media.mediaText + ' {\n';
           cssText += this.scopeRules(rule.cssRules, scopeSelector);
           cssText += '\n}\n\n';
-        } else if (rule.cssText) {
-          cssText += rule.cssText + '\n\n';
+        } else {
+          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText
+          // 'cssText' in rule returns true, but rule.cssText throws anyway
+          // We can test the rule type, e.g.
+          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {
+          // but this will prevent cssText propagation in other browsers which
+          // support it.
+          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed
+          // from that collection; this would be a proper fix.
+          // For now, I'm trapping the exception so IE11 is unblocked in other areas.
+          try {
+            if (rule.cssText) {
+              cssText += rule.cssText + '\n\n';
+            }
+          } catch(x) {
+            // squelch
+          }
         }
       }, this);
     }
@@ -8306,6 +8534,7 @@
         }
         style.__importParsed = true;
         this.markParsingComplete(elt);
+        this.parseNext();
       }
 
       var hasResource = HTMLImports.parser.hasResource;
@@ -9420,9 +9649,11 @@
         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;
     }
@@ -9444,7 +9675,8 @@
   // exports
 
   scope.marshal = marshal;
-  scope.module = module;
+  // `module` confuses commonjs detectors
+  scope.modularize = module;
   scope.using = using;
 
 })(window);
@@ -9551,7 +9783,7 @@
       var replacement;
       if (value && value.search(URL_TEMPLATE_SEARCH) < 0) {
         if (v === 'style') {
-          replacement = replaceUrlsInCssText(value, url, CSS_URL_REGEXP);
+          replacement = replaceUrlsInCssText(value, url, false, CSS_URL_REGEXP);
         } else {
           replacement = resolveRelativeUrl(url, value);
         }
@@ -9563,7 +9795,7 @@
 
 var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
 var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action', 'style'];
+var URL_ATTRS = ['href', 'src', 'action', 'style', 'url'];
 var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
 var URL_TEMPLATE_SEARCH = '{{.*}}';
 
@@ -10261,8 +10493,8 @@
             this.receive(url, elt, null, body);
         }.bind(this), 0);
       } else {
-        var receiveXhr = function(err, resource) {
-          this.receive(url, elt, err, resource);
+        var receiveXhr = function(err, resource, redirectedUrl) {
+          this.receive(url, elt, err, resource, redirectedUrl);
         }.bind(this);
         xhr.load(url, receiveXhr);
         // TODO(sorvell): blocked on)
@@ -10280,16 +10512,25 @@
         */
       }
     },
-    receive: function(url, elt, err, resource) {
+    receive: function(url, elt, err, resource, redirectedUrl) {
       this.cache[url] = resource;
       var $p = this.pending[url];
+      if ( redirectedUrl && redirectedUrl !== url ) {
+        this.cache[redirectedUrl] = resource;
+        $p = $p.concat(this.pending[redirectedUrl]);
+      }
       for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
         //if (!err) {
-          this.onload(url, p, resource);
+          // If url was redirected, use the redirected location so paths are
+          // calculated relative to that.
+          this.onload(redirectedUrl || url, p, resource);
         //}
         this.tail();
       }
       this.pending[url] = null;
+      if ( redirectedUrl && redirectedUrl !== url ) {
+        this.pending[redirectedUrl] = null;
+      }
     },
     tail: function() {
       --this.inflight;
@@ -10317,8 +10558,17 @@
       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
+              : redirectedUrl;                    // Full path
+          }
           next.call(nextContext, !xhr.ok(request) && request,
-              request.response || request.responseText, url);
+              request.response || request.responseText, redirectedUrl);
         }
       });
       request.send();
@@ -10392,9 +10642,14 @@
       fn.call(this, elt);
     }
   },
-  // only 1 element may be parsed at a time; parsing is async so, each
+  // 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;
@@ -10406,16 +10661,31 @@
     }
     this.parsingElement = null;
     flags.parse && console.log('completed', elt);
-    this.parseNext();
+  },
+  invalidateParse: function(doc) {
+    if (doc && doc.__importLink) {
+      doc.__importParsed = doc.__importLink.__importParsed = false;
+      this.parseSoon();
+    }
+  },
+  parseSoon: function() {
+    if (this._parseSoon) {
+      cancelAnimationFrame(this._parseDelay);
+    }
+    var parser = this;
+    this._parseSoon = requestAnimationFrame(function() {
+      parser.parseNext();
+    });
   },
   parseImport: function(elt) {
-    elt.import.__importParsed = true;
     // 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);
     }
+    elt.import.__importParsed = true;
+    this.markParsingComplete(elt);
     // fire load event
     if (elt.__resource) {
       elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    
@@ -10433,7 +10703,7 @@
         }
       }
     }
-    this.markParsingComplete(elt);
+    this.parseNext();
   },
   parseLink: function(linkElt) {
     if (nodeIsImport(linkElt)) {
@@ -10463,6 +10733,7 @@
         callback(e);
       }
       self.markParsingComplete(elt);
+      self.parseNext();
     };
     elt.addEventListener('load', done);
     elt.addEventListener('error', done);
@@ -10934,6 +11205,7 @@
 var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
 var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
 var importer = scope.importer;
+var parser = scope.parser;
 
 // we track mutations for addedNodes, looking for imports
 function handler(mutations) {
@@ -10946,7 +11218,9 @@
 
 // find loadable elements and add them to the importer
 function addedNodes(nodes) {
+  var owner;
   for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
+    owner = owner || n.ownerDocument;
     if (shouldLoadNode(n)) {
       importer.loadNode(n);
     }
@@ -10954,6 +11228,14 @@
       addedNodes(n.children);
     }
   }
+  // TODO(sorvell): This is not the right approach here. We shouldn't need to
+  // invalidate parsing when an element is added. Disabling this code 
+  // until a better approach is found.
+  /*
+  if (owner) {
+    parser.invalidateParse(owner);
+  }
+  */
 }
 
 function shouldLoadNode(node) {
@@ -11418,12 +11700,9 @@
 // native document.registerElement?
 
 var hasNative = Boolean(document.registerElement);
-// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399
-// we'll address this by defaulting to CE polyfill in the presence of the SD
-// polyfill. This will avoid spamming excess attached/detached callbacks.
-// If there is a compelling need to run CE native with SD polyfill,
-// we'll need to fix this issue.
-var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;
+// 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) {
 
@@ -11713,6 +11992,7 @@
   // 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);
@@ -13193,9 +13473,6 @@
       };
     },
 
-    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may
-    // make sense to issue a warning or even throw if the template is already
-    // "activated", since this would be a strange thing to do.
     set bindingDelegate(bindingDelegate) {
       if (this.delegate_) {
         throw Error('Template must be cleared before a new bindingDelegate ' +
diff --git a/pkg/web_components/lib/platform.concat.js.map b/pkg/web_components/lib/platform.concat.js.map
index df7b0d1..9abc6b5 100644
--- a/pkg/web_components/lib/platform.concat.js.map
+++ b/pkg/web_components/lib/platform.concat.js.map
@@ -19,6 +19,7 @@
     "../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",
@@ -83,26 +84,27 @@
     "src/patches-mdv.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;;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;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9lDA;AACA;;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;;AC/ZA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACnXA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACj4BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC/CA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC9tBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;;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;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC/IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC1TA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;ACtEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACrBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;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;;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;;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;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;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;;ACvCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;AC9FA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9oBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;;ACrUA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpvBA,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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5CA,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;;ACpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvDA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACpKA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACtSA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;ACvVA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;AC7dA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;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;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;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;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;;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;;ACzuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA",
+  "mappings": "AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CClEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;CCprDA;AACA;CCDA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC/ZA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCnXA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CChFA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCn4BA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,C;AC5HA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC/CA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCdA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9tBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCjHA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC1EA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CC5CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;CCrJA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;CC1TA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC1CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCzBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCtEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCrBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CCzCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;CC9DA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CC/DA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCnCA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCpCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CC9BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;CC3BA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CC7CA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCvCA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC9FA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCzEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9oBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCrDA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CClEA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CC1UA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCvBA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;CC3GA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCjGA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CCpwBA,Q;ACAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC5CA,C;ACAA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CCpjBA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;CC7DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CC5IA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;CCdA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;CCpMA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CC9BA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CC1DA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,C;ACnCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;CChIA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;CCjiBA;AACA;AACA;AACA;AACA;AACA,sD;ACLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;CCtLA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCvTA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCtSA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;CCpEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCvDA;AACA;AACA;AACA;AACA;AACA,4D;ACLA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,EACA;AACA;AACA,EACA;AACA,EACA;CCvVA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;CC3dA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA,0B;AC/DA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;CCnEA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;CChCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;CCjHA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;CCtEA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;CCtVA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;CCtuCA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA,CACA;AACA;AACA,CACA;AACA,C",
   "sourcesContent": [
     "/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n",
     "/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n",
-    "// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // 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    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(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 ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\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)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\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 accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\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 (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.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    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]);\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 var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  function notify(object, name, value, oldValue) {\n    if (areSameValue(value, oldValue))\n      return;\n\n    // TODO(rafaelw): Hack hack hack. This entire code really needs to move\n    // out of observe-js into polymer.\n    if (typeof object.propertyChanged_ == 'function')\n      object.propertyChanged_(name, value, oldValue);\n\n    if (!hasObserve)\n      return;\n\n    var notifier = object.notifier_;\n    if (!notifier)\n      notifier = object.notifier_ = Object.getNotifier(object);\n\n    updateRecord.object = object;\n    updateRecord.name = name;\n    updateRecord.oldValue = oldValue;\n\n    notifier.notify(updateRecord);\n  }\n\n  Observer.createBindablePrototypeAccessor = function(proto, name) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    proto[privateName] = proto[name];\n\n    Object.defineProperty(proto, name, {\n      get: function() {\n        var observable = this[privateObservable];\n        if (observable)\n          observable.deliver();\n\n        return this[privateName];\n      },\n      set: function(value) {\n        var observable = this[privateObservable];\n        if (observable) {\n          observable.setValue(value);\n          return;\n        }\n\n        var oldValue = this[privateName];\n        this[privateName] = value;\n        notify(this, name, value, oldValue);\n\n        return value;\n      },\n      configurable: true\n    });\n  }\n\n  Observer.bindToInstance = function(instance, name, observable, resolveFn) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    instance[privateObservable] = observable;\n    var oldValue = instance[privateName];\n    var value = observable.open(function(value, oldValue) {\n      instance[privateName] = value;\n      notify(instance, name, value, oldValue);\n    });\n\n    if (resolveFn && !areSameValue(oldValue, value)) {\n      var resolvedValue = resolveFn(oldValue, value);\n      if (!areSameValue(value, resolvedValue)) {\n        value = resolvedValue;\n        if (observable.setValue)\n          observable.setValue(value);\n      }\n    }\n\n    instance[privateName] = value;\n    notify(instance, name, value, oldValue);\n\n    return {\n      close: function() {\n        observable.close();\n        instance[privateObservable] = undefined;\n      }\n    };\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 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // 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    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\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 (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.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",
     "// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\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    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  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\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.polymerWrapper_ ||\n        (impl.polymerWrapper_ = 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.impl;\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.polymerWrapper_ = 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.impl[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.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 (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    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n",
     "/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n",
-    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; 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    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\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 nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i];\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\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        this.impl = type;\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 this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.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    this.impl = impl;\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        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 = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\n    return eventRetargetting(path, self);\n  }\n\n  /**\n   * Returns a function that is to be used as a getter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerGetter(name) {\n    return function() {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      return inlineEventHandlers && inlineEventHandlers[name] &&\n          inlineEventHandlers[name].value || null;\n     };\n  }\n\n  /**\n   * Returns a function that is to be used as a setter for `onfoo` properties.\n   * @param {string} name\n   * @return {Function}\n   */\n  function getEventHandlerSetter(name) {\n    var eventType = name.slice(2);\n    return function(value) {\n      var inlineEventHandlers = eventHandlersTable.get(this);\n      if (!inlineEventHandlers) {\n        inlineEventHandlers = Object.create(null);\n        eventHandlersTable.set(this, inlineEventHandlers);\n      }\n\n      var old = inlineEventHandlers[name];\n      if (old)\n        this.removeEventListener(eventType, old.wrapped, false);\n\n      if (typeof value === 'function') {\n        var wrapped = function(e) {\n          var rv = value.call(this, e);\n          if (rv === false)\n            e.preventDefault();\n          else if (name === 'onbeforeunload' && typeof rv === 'string')\n            e.returnValue = rv;\n          // mouseover uses true for preventDefault but preventDefault for\n          // mouseover is ignored by browsers these day.\n        };\n\n        this.addEventListener(eventType, wrapped, false);\n        inlineEventHandlers[name] = {\n          value: value,\n          wrapped: wrapped\n        };\n      }\n    };\n  }\n\n  scope.elementFromPoint = elementFromPoint;\n  scope.getEventHandlerGetter = getEventHandlerGetter;\n  scope.getEventHandlerSetter = getEventHandlerSetter;\n  scope.wrapEventTargetMethods = wrapEventTargetMethods;\n  scope.wrappers.BeforeUnloadEvent = BeforeUnloadEvent;\n  scope.wrappers.CustomEvent = CustomEvent;\n  scope.wrappers.Event = Event;\n  scope.wrappers.EventTarget = EventTarget;\n  scope.wrappers.FocusEvent = FocusEvent;\n  scope.wrappers.MouseEvent = MouseEvent;\n  scope.wrappers.UIEvent = UIEvent;\n\n})(window.ShadowDOMPolyfill);\n",
+    "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\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        this.impl = type;\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 this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.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    this.impl = impl;\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 = wrap(originalElementFromPoint.call(document.impl, 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 unwrap = scope.unwrap;\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    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.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 this.impl[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(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(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 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(this.impl[name].apply(this.impl, 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 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, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, 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(this.impl, 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 : this.impl;\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(this.impl, 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(this.impl, 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(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.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 this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.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(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
+    "/**\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  var EventTarget = scope.wrappers.EventTarget;\n  var NodeList = scope.wrappers.NodeList;\n  var TreeScope = scope.TreeScope;\n  var assert = scope.assert;\n  var defineWrapGetter = scope.defineWrapGetter;\n  var enqueueMutation = scope.enqueueMutation;\n  var getTreeScope = scope.getTreeScope;\n  var isWrapper = scope.isWrapper;\n  var mixin = scope.mixin;\n  var registerTransientObservers = scope.registerTransientObservers;\n  var registerWrapper = scope.registerWrapper;\n  var setTreeScope = scope.setTreeScope;\n  var 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, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, 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(this.impl, 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 : this.impl;\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(this.impl, 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(this.impl, 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(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.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 this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.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(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n",
     "// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\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 matchesLocalName(el, 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, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\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  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\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\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\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\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 this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.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 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 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 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  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      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\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  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\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  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\n  scope.matchesNames = matchesNames;\n  scope.wrappers.Element = Element;\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  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.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 unwrap = scope.unwrap;\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      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(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 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        this.impl.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\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 this.impl[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        this.impl[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 this.impl[name].apply(this.impl, 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 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 = this.impl.getContext.apply(this.impl, 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    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",
@@ -117,7 +119,7 @@
     "/*\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    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 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  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 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 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(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.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(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.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 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    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, arguments);\n    }\n  });\n\n  registerWrapper(OriginalCanvasRenderingContext2D, CanvasRenderingContext2D,\n                  document.createElement('canvas').getContext('2d'));\n\n  scope.wrappers.CanvasRenderingContext2D = CanvasRenderingContext2D;\n})(window.ShadowDOMPolyfill);\n",
@@ -128,12 +130,12 @@
     "// 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 unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.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  var selectorStartCharRe = /^[*.#[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 = this.impl.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    this.impl.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 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    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.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 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(this.impl, 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(doc.impl, 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, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\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        this.impl = node;\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    '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    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, 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 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 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(this.impl, 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(doc.impl, 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, this.impl);\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        this.impl = node;\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    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, 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 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  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.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  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  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\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() {\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",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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.convertCombinators(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 ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[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)) {\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 if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\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]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\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    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//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 = style.sheet.cssRules;\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 = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\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            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\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  // 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.convertCombinators(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 ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[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          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\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]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\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    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//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 = style.sheet.cssRules;\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 = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\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            head.appendChild(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  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n",
     "}",
@@ -143,26 +145,26 @@
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\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  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n",
     "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n",
-    "/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\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  scope.module = 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  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\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\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, 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'];\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})(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\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})(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 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 */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};",
-    "/*\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\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource) {\n          this.receive(url, elt, err, resource);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource) {\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 (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
-    "/*\n * Copyright 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\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\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    // fire load event\n    if (elt.__resource) {\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.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\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    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    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    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
+    "/*\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\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n",
+    "/*\n * Copyright 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\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    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    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n",
     "/*\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\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\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      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n",
-    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\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\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",
+    " /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n",
     "/*\n * Copyright 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(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (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// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\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 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 */\nwindow.CustomElements = window.CustomElements || {flags:{}};",
     " /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n",
-    "/*\n * Copyright 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\n/**\n * Implements `document.register`\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// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\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    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\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    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 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\n/**\n * Implements `document.register`\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    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\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 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\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 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\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  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\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    // 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  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\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  var endOfMicrotask = scope.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})(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\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})(window.Platform);\n",
     "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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();\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    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\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      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, 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      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\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      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\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",
+    "// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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();\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      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, 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      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\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      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\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\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"
   ]
 }
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js b/pkg/web_components/lib/platform.js
index f937545..2e3f9d6 100644
--- a/pkg/web_components/lib/platform.js
+++ b/pkg/web_components/lib/platform.js
@@ -7,11 +7,11 @@
  * Code distributed by Google as part of the polymer project is also
  * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt
  */
-// @version: 0.2.4-15e4e51
+// @version: 0.3.3-29065bc
 
-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){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function isPathValid(a){return"string"!=typeof a?!1:(a=a.trim(),""==a?!0:"."==a[0]?!1:pathRegExp.test(a))}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");return""==a.trim()?this:isIndex(a)?(this.push(a),this):(a.split(/\s*\.\s*/).filter(function(a){return a}).forEach(function(a){this.push(a)},this),void(hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())))}function getPath(a){if(a instanceof Path)return a;null==a&&(a=""),"string"!=typeof a&&(a=String(a));var b=pathCache[a];if(b)return b;if(!isPathValid(a))return invalidPath;var b=new Path(a,constructorIsPrivate);return pathCache[a]=b,b}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function notify(a,b,c,d){if(!areSameValue(c,d)&&("function"==typeof a.propertyChanged_&&a.propertyChanged_(b,c,d),hasObserve)){var e=a.notifier_;e||(e=a.notifier_=Object.getNotifier(a)),updateRecord.object=a,updateRecord.name=b,updateRecord.oldValue=d,e.notify(updateRecord)}}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",ident=identStart+"+"+identPart+"*",elementIndex="(?:[0-9]|[1-9]+[0-9]+)",identOrElementIndex="(?:"+ident+"|"+elementIndex+")",path="(?:"+identOrElementIndex+")(?:\\s*\\.\\s*"+identOrElementIndex+")*",pathRegExp=new RegExp("^"+path+"$"),constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){return this.join(".")},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a=this.map(function(a){return isIndex(a)?'["'+a+'"]':"."+a}),b="",c="obj";b+="if (obj != null";for(var d=0;d<this.length-1;d++){{this[d]}c+=a[d],b+=" &&\n     "+c+" != null"}return b+=")\n",c+=a[d],b+="  return "+c+";\nelse\n  return undefined;",new Function("obj",b)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},updateRecord={object:void 0,type:"update",name:void 0,oldValue:void 0};Observer.createBindablePrototypeAccessor=function(a,b){var c=b+"_",d=b+"Observable_";a[c]=a[b],Object.defineProperty(a,b,{get:function(){var a=this[d];return a&&a.deliver(),this[c]},set:function(a){var e=this[d];if(e)return void e.setValue(a);var f=this[c];return this[c]=a,notify(this,b,a,f),a},configurable:!0})},Observer.bindToInstance=function(a,b,c,d){var e=b+"_",f=b+"Observable_";a[f]=c;var g=a[e],h=c.open(function(c,d){a[e]=c,notify(a,b,c,d)});if(d&&!areSameValue(g,h)){var i=d(g,h);areSameValue(h,i)||(h=i,c.setValue&&c.setValue(h))}return a[e]=h,notify(a,b,h,g),{close:function(){c.close(),a[f]=void 0}}};var EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)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=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(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}K(a,e,M(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){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.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 J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(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===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.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 instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(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(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}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 o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&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,o.push(this)}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={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 Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.set(b,a);for(var p=0;p<f.length;p++){var q=f[p];if(q.removed)o=!0;else if(!(q.type!==n||!q.capture&&c===bb||q.capture&&c===db))try{if("function"==typeof q.handler?q.handler.call(a,b):q.handler.handleEvent(b),Z.get(b))return!1
-}catch(r){J||(J=r)}}if(o){var s=f.slice();f.length=0;for(var p=0;p<s.length;p++)s[p].removed||f.push(s[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null);return h(i,b)}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=new Q.NodeList,b=_.get(this);if(b){for(var c=0,d=b.length-1,e=L(V.get(this)),f=0;d>=f;f++){var g=b[f],h=L(g);h.contains(e)&&(f!==d||g instanceof Q.Node)&&(a[c++]=g)}a.length=c}return a},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}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.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),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,g)}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]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={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);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!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 J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(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=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.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=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.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 R),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.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.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=J(c):(d=c,c=L(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),U.call(this.impl,J(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:this.impl;j?U.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=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(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),Y(this.impl,f);return O||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=J(d):(e=d,d=L(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),W.call(this.impl,J(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&&W.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_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.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=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.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,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(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,cleanUpNodes(d)),d=[],e="",a=null,b.childNodes.length&&b.normalize());a&&d.length&&(a.data+=e,t(d))}}),B(w,"ownerDocument"),H(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(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=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 this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,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,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){h.call(this,a)}function e(a,c,d){var e=d||c;Object.defineProperty(a,c,{get:function(){return this.impl[c]},set:function(a){this.impl[c]=a,b(this,e)},configurable:!0,enumerable:!0})}var f=a.ChildNodeInterface,g=a.GetElementsByInterface,h=a.wrappers.Node,i=a.ParentNodeInterface,j=a.SelectorsInterface,k=(a.addWrapNodeListMethod,a.enqueueMutation),l=a.mixin,m=(a.oneOf,a.registerWrapper),n=a.wrappers,o=window.Element,p=["matches","mozMatchesSelector","msMatchesSelector","webkitMatchesSelector"].filter(function(a){return o.prototype[a]}),q=p[0],r=o.prototype[q];d.prototype=Object.create(h.prototype),l(d.prototype,{createShadowRoot:function(){var b=new n.ShadowRoot(this);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return r.call(this.impl,a)}}),p.forEach(function(a){"matches"!==a&&(d.prototype[a]=function(a){return this.matches(a)})}),o.prototype.webkitCreateShadowRoot&&(d.prototype.webkitCreateShadowRoot=d.prototype.createShadowRoot),e(d.prototype,"id"),e(d.prototype,"className","class"),l(d.prototype,f),l(d.prototype,g),l(d.prototype,i),l(d.prototype,j),m(o,d,document.createElementNS(null,"x")),a.matchesNames=p,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(z,b)}function d(a){return a.replace(A,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+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[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 y.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=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[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(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,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.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.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)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,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.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,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,{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){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),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,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;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;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,{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.registerObject,c="http://www.w3.org/2000/svg",d=document.createElementNS(c,"title"),e=b(d),f=Object.getPrototypeOf(e.prototype).constructor;a.wrappers.SVGElement=f}(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.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)
-},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.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=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.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.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.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<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.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=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.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(!O.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.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(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(G(b)),h=a||new WeakMap,i=N.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=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(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){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.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)),this.impl.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){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.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 A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(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){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,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.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(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 D=document.adoptNode,E=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,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):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(){A(this)instanceof d||y(this),b.apply(A(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);F.call(z(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","getSelection"]),v(b.prototype,j),v(b.prototype,l),v(b.prototype,n),v(b.prototype,{get implementation(){var a=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([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.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,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(m.call(h(this)))},get document(){return j(h(this).document)}}),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;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=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(){window.wrap=ShadowDOMPolyfill.wrapIfNeeded,window.unwrap=ShadowDOMPolyfill.unwrapIfNeeded,Object.defineProperty(Element.prototype,"webkitShadowRoot",Object.getOwnPropertyDescriptor(Element.prototype,"shadowRoot"));var a=Element.prototype.createShadowRoot;Element.prototype.createShadowRoot=function(){var b=a.call(this);return CustomElements.watchShadow(this),b},Element.prototype.webkitCreateShadowRoot=Element.prototype.createShadowRoot}(),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=g.sheet.cssRules,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.convertCombinators(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},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[b]," ");return a},scopeRules:function(a,b){var c="";return a&&Array.prototype.forEach.call(a,function(a){a.selectorText&&a.style&&a.style.cssText?(c+=this.scopeSelector(a.selectorText,b,this.strictStyling)+" {\n	",c+=this.propertiesFromRule(a)+"\n}\n\n"):a.type===CSSRule.MEDIA_RULE?(c+="@media "+a.media.mediaText+" {\n",c+=this.scopeRules(a.cssRules,b),c+="\n}\n\n"):a.cssText&&(c+=a.cssText+"\n\n")},this),c},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]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\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"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//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(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a)}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.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}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(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"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}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)}}),a.mixin=b}(window.Platform),function(a){"use strict";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=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.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 e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}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 h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.module=c,a.using=e}(window),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(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,g):c(d,i),h.value=f)})}},g=/(url\()([^)]*)(\))/g,h=/(@import[\s]+(?!url\())([^;]*)(;)/g,i=["href","src","action","style"],j="["+i.join("],[")+"]",k="{{.*}}";a.urlResolver=f}(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){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){this.receive(a,d,b,c)}.bind(this);b.load(a,h)}},receive:function(a,b,c,d){this.cache[a]=d;for(var e,f=this.pending[a],g=0,h=f.length;h>g&&(e=f[g]);g++)this.onload(a,e,d),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(){4===f.readyState&&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,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+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=/Trident/.test(navigator.userAgent),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),this.parseNext()},parseImport:function(a){if(a.import.__importParsed=!0,HTMLImports.__importsParsingHook&&HTMLImports.__importsParsingHook(a),a.dispatchEvent(a.__resource?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.markParsingComplete(a)},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),document.head.appendChild(a)},trackElement:function(a,b){var c=this,d=function(d){b&&b(d),c.markParsingComplete(a)};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}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){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)&&!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,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}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(q)),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}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(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=0,g=a.length;g>e&&(b=a[e]);e++)d(b)&&f.loadNode(b),b.children&&b.children.length&&c(b.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=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)}"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});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),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){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;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);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"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){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.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}(window.Platform),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}(window.Platform),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())},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_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,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)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},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(){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);
+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){this.set(a,void 0)}},window.WeakMap=c}(),function(global){"use strict";function detectObjectObserve(){function a(a){b=a}if("function"!=typeof Object.observe||"function"!=typeof Array.observe)return!1;var b=[],c={},d=[];return Object.observe(c,a),Array.observe(d,a),c.id=1,c.id=2,delete c.id,d.push(1,2),d.length=0,Object.deliverChangeRecords(a),5!==b.length?!1:"add"!=b[0].type||"update"!=b[1].type||"delete"!=b[2].type||"splice"!=b[3].type||"splice"!=b[4].type?!1:(Object.unobserve(c,a),Array.unobserve(d,a),!0)}function detectEval(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)return!1;try{var a=new Function("","return true;");return a()}catch(b){return!1}}function isIndex(a){return+a===a>>>0}function toNumber(a){return+a}function isObject(a){return a===Object(a)}function areSameValue(a,b){return a===b?0!==a||1/a===1/b:numberIsNaN(a)&&numberIsNaN(b)?!0:a!==a&&b!==b}function getPathCharType(a){if(void 0===a)return"eof";var b=a.charCodeAt(0);switch(b){case 91:case 93:case 46:case 34:case 39:case 48:return a;case 95:case 36:return"ident";case 32:case 9:case 10:case 13:case 160:case 65279:case 8232:case 8233:return"ws"}return b>=97&&122>=b||b>=65&&90>=b?"ident":b>=49&&57>=b?"number":"else"}function noop(){}function parsePath(a){function b(){if(!(k>=a.length)){var b=a[k+1];return"inSingleQuote"==l&&"'"==b||"inDoubleQuote"==l&&'"'==b?(k++,d=b,m.append(),!0):void 0}}for(var c,d,e,f,g,h,i,j=[],k=-1,l="beforePath",m={push:function(){void 0!==e&&(j.push(e),e=void 0)},append:function(){void 0===e?e=d:e+=d}};l;)if(k++,c=a[k],"\\"!=c||!b(l)){if(f=getPathCharType(c),i=pathStateMachine[l],g=i[f]||i["else"]||"error","error"==g)return;if(l=g[0],h=m[g[1]]||noop,d=void 0===g[2]?c:g[2],h(),"afterPath"===l)return j}}function isIdent(a){return identRegExp.test(a)}function Path(a,b){if(b!==constructorIsPrivate)throw Error("Use Path.get to retrieve path objects");a.length&&Array.prototype.push.apply(this,a.slice()),hasEval&&this.length&&(this.getValueFrom=this.compiledGetValueFromFn())}function getPath(a){if(a instanceof Path)return a;if((null==a||0==a.length)&&(a=""),"string"!=typeof a){if(isIndex(a.length))return new Path(a,constructorIsPrivate);a=String(a)}var b=pathCache[a];if(b)return b;var c=parsePath(a);if(!c)return invalidPath;var b=new Path(c,constructorIsPrivate);return pathCache[a]=b,b}function formatAccessor(a){return isIndex(a)?"["+a+"]":'["'+a.replace(/"/g,'\\"')+'"]'}function dirtyCheck(a){for(var b=0;MAX_DIRTY_CHECK_CYCLES>b&&a.check_();)b++;return global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=b),b>0}function objectIsEmpty(a){for(var b in a)return!1;return!0}function diffIsEmpty(a){return objectIsEmpty(a.added)&&objectIsEmpty(a.removed)&&objectIsEmpty(a.changed)}function diffObjectFromOldObject(a,b){var c={},d={},e={};for(var f in b){var g=a[f];(void 0===g||g!==b[f])&&(f in a?g!==b[f]&&(e[f]=g):d[f]=void 0)}for(var f in a)f in b||(c[f]=a[f]);return Array.isArray(a)&&a.length!==b.length&&(e.length=a.length),{added:c,removed:d,changed:e}}function runEOMTasks(){if(!eomTasks.length)return!1;for(var a=0;a<eomTasks.length;a++)eomTasks[a]();return eomTasks.length=0,!0}function newObservedObject(){function a(a){b&&b.state_===OPENED&&!d&&b.check_(a)}var b,c,d=!1,e=!0;return{open:function(c){if(b)throw Error("ObservedObject in use");e||Object.deliverChangeRecords(a),b=c,e=!1},observe:function(b,d){c=b,d?Array.observe(c,a):Object.observe(c,a)},deliver:function(b){d=b,Object.deliverChangeRecords(a),d=!1},close:function(){b=void 0,Object.unobserve(c,a),observedObjectCache.push(this)}}}function getObservedObject(a,b,c){var d=observedObjectCache.pop()||newObservedObject();return d.open(a),d.observe(b,c),d}function newObservedSet(){function a(b,f){b&&(b===d&&(e[f]=!0),h.indexOf(b)<0&&(h.push(b),Object.observe(b,c)),a(Object.getPrototypeOf(b),f))}function b(a){for(var b=0;b<a.length;b++){var c=a[b];if(c.object!==d||e[c.name]||"setPrototype"===c.type)return!1}return!0}function c(c){if(!b(c)){for(var d,e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.iterateObjects_(a);for(var e=0;e<g.length;e++)d=g[e],d.state_==OPENED&&d.check_()}}var d,e,f=0,g=[],h=[],i={object:void 0,objects:h,open:function(b,c){d||(d=c,e={}),g.push(b),f++,b.iterateObjects_(a)},close:function(){if(f--,!(f>0)){for(var a=0;a<h.length;a++)Object.unobserve(h[a],c),Observer.unobservedCount++;g.length=0,h.length=0,d=void 0,e=void 0,observedSetCache.push(this)}}};return i}function getObservedSet(a,b){return lastObservedSet&&lastObservedSet.object===b||(lastObservedSet=observedSetCache.pop()||newObservedSet(),lastObservedSet.object=b),lastObservedSet.open(a,b),lastObservedSet}function Observer(){this.state_=UNOPENED,this.callback_=void 0,this.target_=void 0,this.directObserver_=void 0,this.value_=void 0,this.id_=nextObserverId++}function addToAll(a){Observer._allObserversCount++,collectObservers&&allObservers.push(a)}function removeFromAll(){Observer._allObserversCount--}function ObjectObserver(a){Observer.call(this),this.value_=a,this.oldObject_=void 0}function ArrayObserver(a){if(!Array.isArray(a))throw Error("Provided object is not an Array");ObjectObserver.call(this,a)}function PathObserver(a,b){Observer.call(this),this.object_=a,this.path_=getPath(b),this.directObserver_=void 0}function CompoundObserver(a){Observer.call(this),this.reportChangesOnOpen_=a,this.value_=[],this.directObserver_=void 0,this.observed_=[]}function identFn(a){return a}function ObserverTransform(a,b,c,d){this.callback_=void 0,this.target_=void 0,this.value_=void 0,this.observable_=a,this.getValueFn_=b||identFn,this.setValueFn_=c||identFn,this.dontPassThroughSet_=d}function diffObjectFromChangeRecords(a,b,c){for(var d={},e={},f=0;f<b.length;f++){var g=b[f];expectedRecordTypes[g.type]?(g.name in c||(c[g.name]=g.oldValue),"update"!=g.type&&("add"!=g.type?g.name in d?(delete d[g.name],delete c[g.name]):e[g.name]=!0:g.name in e?delete e[g.name]:d[g.name]=!0)):(console.error("Unknown changeRecord type: "+g.type),console.error(g))}for(var h in d)d[h]=a[h];for(var h in e)e[h]=void 0;var i={};for(var h in c)if(!(h in d||h in e)){var j=a[h];c[h]!==j&&(i[h]=j)}return{added:d,removed:e,changed:i}}function newSplice(a,b,c){return{index:a,removed:b,addedCount:c}}function ArraySplice(){}function calcSplices(a,b,c,d,e,f){return arraySplice.calcSplices(a,b,c,d,e,f)}function intersect(a,b,c,d){return c>b||a>d?-1:b==c||d==a?0:c>a?d>b?b-c:d-c:b>d?d-a:b-a}function mergeSplice(a,b,c,d){for(var e=newSplice(b,c,d),f=!1,g=0,h=0;h<a.length;h++){var i=a[h];if(i.index+=g,!f){var j=intersect(e.index,e.index+e.removed.length,i.index,i.index+i.addedCount);if(j>=0){a.splice(h,1),h--,g-=i.addedCount-i.removed.length,e.addedCount+=i.addedCount-j;var k=e.removed.length+i.removed.length-j;if(e.addedCount||k){var c=i.removed;if(e.index<i.index){var l=e.removed.slice(0,i.index-e.index);Array.prototype.push.apply(l,c),c=l}if(e.index+e.removed.length>i.index+i.addedCount){var m=e.removed.slice(i.index+i.addedCount-e.index);Array.prototype.push.apply(c,m)}e.removed=c,i.index<e.index&&(e.index=i.index)}else f=!0}else if(e.index<i.index){f=!0,a.splice(h,0,e),h++;var n=e.addedCount-e.removed.length;i.index+=n,g+=n}}}f||a.push(e)}function createInitialSplices(a,b){for(var c=[],d=0;d<b.length;d++){var e=b[d];switch(e.type){case"splice":mergeSplice(c,e.index,e.removed.slice(),e.addedCount);break;case"add":case"update":case"delete":if(!isIndex(e.name))continue;var f=toNumber(e.name);if(0>f)continue;mergeSplice(c,f,[e.oldValue],1);break;default:console.error("Unexpected record type: "+JSON.stringify(e))}}return c}function projectArraySplices(a,b){var c=[];return createInitialSplices(a,b).forEach(function(b){return 1==b.addedCount&&1==b.removed.length?void(b.removed[0]!==a[b.index]&&c.push(b)):void(c=c.concat(calcSplices(a,b.index,b.index+b.addedCount,b.removed,0,b.removed.length)))}),c}var hasObserve=detectObjectObserve(),hasEval=detectEval(),numberIsNaN=global.Number.isNaN||function(a){return"number"==typeof a&&global.isNaN(a)},createObject="__proto__"in{}?function(a){return a}:function(a){var b=a.__proto__;if(!b)return a;var c=Object.create(b);return Object.getOwnPropertyNames(a).forEach(function(b){Object.defineProperty(c,b,Object.getOwnPropertyDescriptor(a,b))}),c},identStart="[$_a-zA-Z]",identPart="[$_a-zA-Z0-9]",identRegExp=new RegExp("^"+identStart+"+"+identPart+"*$"),pathStateMachine={beforePath:{ws:["beforePath"],ident:["inIdent","append"],"[":["beforeElement"],eof:["afterPath"]},inPath:{ws:["inPath"],".":["beforeIdent"],"[":["beforeElement"],eof:["afterPath"]},beforeIdent:{ws:["beforeIdent"],ident:["inIdent","append"]},inIdent:{ident:["inIdent","append"],0:["inIdent","append"],number:["inIdent","append"],ws:["inPath","push"],".":["beforeIdent","push"],"[":["beforeElement","push"],eof:["afterPath","push"]},beforeElement:{ws:["beforeElement"],0:["afterZero","append"],number:["inIndex","append"],"'":["inSingleQuote","append",""],'"':["inDoubleQuote","append",""]},afterZero:{ws:["afterElement","push"],"]":["inPath","push"]},inIndex:{0:["inIndex","append"],number:["inIndex","append"],ws:["afterElement"],"]":["inPath","push"]},inSingleQuote:{"'":["afterElement"],eof:["error"],"else":["inSingleQuote","append"]},inDoubleQuote:{'"':["afterElement"],eof:["error"],"else":["inDoubleQuote","append"]},afterElement:{ws:["afterElement"],"]":["inPath","push"]}},constructorIsPrivate={},pathCache={};Path.get=getPath,Path.prototype=createObject({__proto__:[],valid:!0,toString:function(){for(var a="",b=0;b<this.length;b++){var c=this[b];a+=isIdent(c)?b?"."+c:c:formatAccessor(c)}return a},getValueFrom:function(a){for(var b=0;b<this.length;b++){if(null==a)return;a=a[this[b]]}return a},iterateObjects:function(a,b){for(var c=0;c<this.length;c++){if(c&&(a=a[this[c-1]]),!isObject(a))return;b(a,this[0])}},compiledGetValueFromFn:function(){var a="",b="obj";a+="if (obj != null";for(var c,d=0;d<this.length-1;d++)c=this[d],b+=isIdent(c)?"."+c:formatAccessor(c),a+=" &&\n     "+b+" != null";a+=")\n";var c=this[d];return b+=isIdent(c)?"."+c:formatAccessor(c),a+="  return "+b+";\nelse\n  return undefined;",new Function("obj",a)},setValueFrom:function(a,b){if(!this.length)return!1;for(var c=0;c<this.length-1;c++){if(!isObject(a))return!1;a=a[this[c]]}return isObject(a)?(a[this[c]]=b,!0):!1}});var invalidPath=new Path("",constructorIsPrivate);invalidPath.valid=!1,invalidPath.getValueFrom=invalidPath.setValueFrom=function(){};var MAX_DIRTY_CHECK_CYCLES=1e3,eomTasks=[],runEOM=hasObserve?function(){var a={pingPong:!0},b=!1;return Object.observe(a,function(){runEOMTasks(),b=!1}),function(c){eomTasks.push(c),b||(b=!0,a.pingPong=!a.pingPong)}}():function(){return function(a){eomTasks.push(a)}}(),observedObjectCache=[],observedSetCache=[],lastObservedSet,UNOPENED=0,OPENED=1,CLOSED=2,RESETTING=3,nextObserverId=1;Observer.prototype={open:function(a,b){if(this.state_!=UNOPENED)throw Error("Observer has already been opened.");return addToAll(this),this.callback_=a,this.target_=b,this.connect_(),this.state_=OPENED,this.value_},close:function(){this.state_==OPENED&&(removeFromAll(this),this.disconnect_(),this.value_=void 0,this.callback_=void 0,this.target_=void 0,this.state_=CLOSED)},deliver:function(){this.state_==OPENED&&dirtyCheck(this)},report_:function(a){try{this.callback_.apply(this.target_,a)}catch(b){Observer._errorThrownDuringCallback=!0,console.error("Exception caught during observer callback: "+(b.stack||b))}},discardChanges:function(){return this.check_(void 0,!0),this.value_}};var collectObservers=!hasObserve,allObservers;Observer._allObserversCount=0,collectObservers&&(allObservers=[]);var runningMicrotaskCheckpoint=!1,hasDebugForceFullDelivery=hasObserve&&function(){try{return eval("%RunMicrotasks()"),!0}catch(ex){return!1}}();global.Platform=global.Platform||{},global.Platform.performMicrotaskCheckpoint=function(){if(!runningMicrotaskCheckpoint){if(hasDebugForceFullDelivery)return void eval("%RunMicrotasks()");if(collectObservers){runningMicrotaskCheckpoint=!0;var cycles=0,anyChanged,toCheck;do{cycles++,toCheck=allObservers,allObservers=[],anyChanged=!1;for(var i=0;i<toCheck.length;i++){var observer=toCheck[i];observer.state_==OPENED&&(observer.check_()&&(anyChanged=!0),allObservers.push(observer))}runEOMTasks()&&(anyChanged=!0)}while(MAX_DIRTY_CHECK_CYCLES>cycles&&anyChanged);global.testingExposeCycleCount&&(global.dirtyCheckCycleCount=cycles),runningMicrotaskCheckpoint=!1}}},collectObservers&&(global.Platform.clearObservers=function(){allObservers=[]}),ObjectObserver.prototype=createObject({__proto__:Observer.prototype,arrayObserve:!1,connect_:function(){hasObserve?this.directObserver_=getObservedObject(this,this.value_,this.arrayObserve):this.oldObject_=this.copyObject(this.value_)},copyObject:function(a){var b=Array.isArray(a)?[]:{};for(var c in a)b[c]=a[c];return Array.isArray(a)&&(b.length=a.length),b},check_:function(a){var b,c;if(hasObserve){if(!a)return!1;c={},b=diffObjectFromChangeRecords(this.value_,a,c)}else c=this.oldObject_,b=diffObjectFromOldObject(this.value_,this.oldObject_);return diffIsEmpty(b)?!1:(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b.added||{},b.removed||{},b.changed||{},function(a){return c[a]}]),!0)},disconnect_:function(){hasObserve?(this.directObserver_.close(),this.directObserver_=void 0):this.oldObject_=void 0},deliver:function(){this.state_==OPENED&&(hasObserve?this.directObserver_.deliver(!1):dirtyCheck(this))},discardChanges:function(){return this.directObserver_?this.directObserver_.deliver(!0):this.oldObject_=this.copyObject(this.value_),this.value_}}),ArrayObserver.prototype=createObject({__proto__:ObjectObserver.prototype,arrayObserve:!0,copyObject:function(a){return a.slice()},check_:function(a){var b;if(hasObserve){if(!a)return!1;b=projectArraySplices(this.value_,a)}else b=calcSplices(this.value_,0,this.value_.length,this.oldObject_,0,this.oldObject_.length);return b&&b.length?(hasObserve||(this.oldObject_=this.copyObject(this.value_)),this.report_([b]),!0):!1}}),ArrayObserver.applySplices=function(a,b,c){c.forEach(function(c){for(var d=[c.index,c.removed.length],e=c.index;e<c.index+c.addedCount;)d.push(b[e]),e++;Array.prototype.splice.apply(a,d)})},PathObserver.prototype=createObject({__proto__:Observer.prototype,get path(){return this.path_},connect_:function(){hasObserve&&(this.directObserver_=getObservedSet(this,this.object_)),this.check_(void 0,!0)},disconnect_:function(){this.value_=void 0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},iterateObjects_:function(a){this.path_.iterateObjects(this.object_,a)},check_:function(a,b){var c=this.value_;return this.value_=this.path_.getValueFrom(this.object_),b||areSameValue(this.value_,c)?!1:(this.report_([this.value_,c,this]),!0)},setValue:function(a){this.path_&&this.path_.setValueFrom(this.object_,a)}});var observerSentinel={};CompoundObserver.prototype=createObject({__proto__:Observer.prototype,connect_:function(){if(hasObserve){for(var a,b=!1,c=0;c<this.observed_.length;c+=2)if(a=this.observed_[c],a!==observerSentinel){b=!0;break}b&&(this.directObserver_=getObservedSet(this,a))}this.check_(void 0,!this.reportChangesOnOpen_)},disconnect_:function(){for(var a=0;a<this.observed_.length;a+=2)this.observed_[a]===observerSentinel&&this.observed_[a+1].close();this.observed_.length=0,this.value_.length=0,this.directObserver_&&(this.directObserver_.close(this),this.directObserver_=void 0)},addPath:function(a,b){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add paths once started.");var b=getPath(b);if(this.observed_.push(a,b),this.reportChangesOnOpen_){var c=this.observed_.length/2-1;this.value_[c]=b.getValueFrom(a)}},addObserver:function(a){if(this.state_!=UNOPENED&&this.state_!=RESETTING)throw Error("Cannot add observers once started.");if(this.observed_.push(observerSentinel,a),this.reportChangesOnOpen_){var b=this.observed_.length/2-1;this.value_[b]=a.open(this.deliver,this)}},startReset:function(){if(this.state_!=OPENED)throw Error("Can only reset while open");this.state_=RESETTING,this.disconnect_()},finishReset:function(){if(this.state_!=RESETTING)throw Error("Can only finishReset after startReset");return this.state_=OPENED,this.connect_(),this.value_},iterateObjects_:function(a){for(var b,c=0;c<this.observed_.length;c+=2)b=this.observed_[c],b!==observerSentinel&&this.observed_[c+1].iterateObjects(b,a)},check_:function(a,b){for(var c,d=0;d<this.observed_.length;d+=2){var e,f=this.observed_[d],g=this.observed_[d+1];if(f===observerSentinel){var h=g;e=this.state_===UNOPENED?h.open(this.deliver,this):h.discardChanges()}else e=g.getValueFrom(f);b?this.value_[d/2]=e:areSameValue(e,this.value_[d/2])||(c=c||[],c[d/2]=this.value_[d/2],this.value_[d/2]=e)}return c?(this.report_([this.value_,c,this.observed_]),!0):!1}}),ObserverTransform.prototype={open:function(a,b){return this.callback_=a,this.target_=b,this.value_=this.getValueFn_(this.observable_.open(this.observedCallback_,this)),this.value_},observedCallback_:function(a){if(a=this.getValueFn_(a),!areSameValue(a,this.value_)){var b=this.value_;this.value_=a,this.callback_.call(this.target_,this.value_,b)}},discardChanges:function(){return this.value_=this.getValueFn_(this.observable_.discardChanges()),this.value_},deliver:function(){return this.observable_.deliver()},setValue:function(a){return a=this.setValueFn_(a),!this.dontPassThroughSet_&&this.observable_.setValue?this.observable_.setValue(a):void 0},close:function(){this.observable_&&this.observable_.close(),this.callback_=void 0,this.target_=void 0,this.observable_=void 0,this.value_=void 0,this.getValueFn_=void 0,this.setValueFn_=void 0}};var expectedRecordTypes={add:!0,update:!0,"delete":!0},EDIT_LEAVE=0,EDIT_UPDATE=1,EDIT_ADD=2,EDIT_DELETE=3;ArraySplice.prototype={calcEditDistances:function(a,b,c,d,e,f){for(var g=f-e+1,h=c-b+1,i=new Array(g),j=0;g>j;j++)i[j]=new Array(h),i[j][0]=j;for(var k=0;h>k;k++)i[0][k]=k;for(var j=1;g>j;j++)for(var k=1;h>k;k++)if(this.equals(a[b+k-1],d[e+j-1]))i[j][k]=i[j-1][k-1];else{var l=i[j-1][k]+1,m=i[j][k-1]+1;i[j][k]=m>l?l:m}return i},spliceOperationsFromEditDistances:function(a){for(var b=a.length-1,c=a[0].length-1,d=a[b][c],e=[];b>0||c>0;)if(0!=b)if(0!=c){var f,g=a[b-1][c-1],h=a[b-1][c],i=a[b][c-1];f=i>h?g>h?h:g:g>i?i:g,f==g?(g==d?e.push(EDIT_LEAVE):(e.push(EDIT_UPDATE),d=g),b--,c--):f==h?(e.push(EDIT_DELETE),b--,d=h):(e.push(EDIT_ADD),c--,d=i)}else e.push(EDIT_DELETE),b--;else e.push(EDIT_ADD),c--;return e.reverse(),e},calcSplices:function(a,b,c,d,e,f){var g=0,h=0,i=Math.min(c-b,f-e);if(0==b&&0==e&&(g=this.sharedPrefix(a,d,i)),c==a.length&&f==d.length&&(h=this.sharedSuffix(a,d,i-g)),b+=g,e+=g,c-=h,f-=h,c-b==0&&f-e==0)return[];if(b==c){for(var j=newSplice(b,[],0);f>e;)j.removed.push(d[e++]);return[j]}if(e==f)return[newSplice(b,[],c-b)];for(var k=this.spliceOperationsFromEditDistances(this.calcEditDistances(a,b,c,d,e,f)),j=void 0,l=[],m=b,n=e,o=0;o<k.length;o++)switch(k[o]){case EDIT_LEAVE:j&&(l.push(j),j=void 0),m++,n++;break;case EDIT_UPDATE:j||(j=newSplice(m,[],0)),j.addedCount++,m++,j.removed.push(d[n]),n++;break;case EDIT_ADD:j||(j=newSplice(m,[],0)),j.addedCount++,m++;break;case EDIT_DELETE:j||(j=newSplice(m,[],0)),j.removed.push(d[n]),n++}return j&&l.push(j),l},sharedPrefix:function(a,b,c){for(var d=0;c>d;d++)if(!this.equals(a[d],b[d]))return d;return c},sharedSuffix:function(a,b,c){for(var d=a.length,e=b.length,f=0;c>f&&this.equals(a[--d],b[--e]);)f++;return f},calculateSplices:function(a,b){return this.calcSplices(a,0,a.length,b,0,b.length)},equals:function(a,b){return a===b}};var arraySplice=new ArraySplice;global.Observer=Observer,global.Observer.runEOM_=runEOM,global.Observer.observerSentinel_=observerSentinel,global.Observer.hasObjectObserve=hasObserve,global.ArrayObserver=ArrayObserver,global.ArrayObserver.calculateSplices=function(a,b){return arraySplice.calculateSplices(a,b)},global.ArraySplice=ArraySplice,global.ObjectObserver=ObjectObserver,global.PathObserver=PathObserver,global.CompoundObserver=CompoundObserver,global.Path=Path,global.ObserverTransform=ObserverTransform}("undefined"!=typeof global&&global&&"undefined"!=typeof module&&module?global:this||window),Platform.flags.shadow?(window.ShadowDOMPolyfill={},function(a){"use strict";function b(){if("undefined"!=typeof chrome&&chrome.app&&chrome.app.runtime)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=L(b),d=0;d<c.length;d++){var e=c[d];K(a,e,M(b,e))}return a}function e(a,b){for(var c=L(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}K(a,e,M(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){N.value=c,K(a,b,N)}function h(a){var b=a.__proto__||Object.getPrototypeOf(a),c=G.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 J&&l(a)?new Function("return this.impl."+a):function(){return this.impl[a]}}function n(a){return J&&l(a)?new Function("v","this.impl."+a+" = v"):function(b){this.impl[a]=b}}function o(a){return J&&l(a)?new Function("return this.impl."+a+".apply(this.impl, arguments)"):function(){return this.impl[a].apply(this.impl,arguments)}}function p(a,b){try{return Object.getOwnPropertyDescriptor(a,b)}catch(c){return P}}function q(b,c,d){for(var e=L(b),f=0;f<e.length;f++){var g=e[f];if("polymerBlackList_"!==g&&!(g in c||b.polymerBlackList_&&b.polymerBlackList_[g])){O&&b.__lookupGetter__(g);var h,i,j=p(b,g);if(d&&"function"==typeof j.value)c[g]=o(g);else{var l=k(g);h=l?a.getEventHandlerGetter(g):m(g),(j.writable||j.set)&&(i=l?a.getEventHandlerSetter(g):n(g)),K(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===G.get(a)),G.set(a,b),H.set(e,a),i(a,e),d&&j(e,d),g(e,"constructor",b),b.prototype=e}function t(a,b){return G.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 instanceof I.EventTarget||a instanceof I.Event||a instanceof I.Range||a instanceof I.DOMImplementation||a instanceof I.CanvasRenderingContext2D||I.WebGLRenderingContext&&a instanceof I.WebGLRenderingContext}function x(a){return R&&a instanceof R||a instanceof T||a instanceof S||a instanceof U||a instanceof V||a instanceof Q||a instanceof W||X&&a instanceof X||Y&&a instanceof Y}function y(a){return null===a?null:(c(x(a)),a.polymerWrapper_||(a.polymerWrapper_=new(h(a))(a)))}function z(a){return null===a?null:(c(w(a)),a.impl)}function A(a){return a&&w(a)?z(a):a}function B(a){return a&&!w(a)?y(a):a}function C(a,b){null!==b&&(c(x(a)),c(void 0===b||w(b)),a.polymerWrapper_=b)}function D(a,b,c){Z.get=c,K(a.prototype,b,Z)}function E(a,b){D(a,b,function(){return y(this.impl[b])})}function F(a,b){a.forEach(function(a){b.forEach(function(b){a.prototype[b]=function(){var a=B(this);return a[b].apply(a,arguments)}})})}var G=new WeakMap,H=new WeakMap,I=Object.create(null),J=b(),K=Object.defineProperty,L=Object.getOwnPropertyNames,M=Object.getOwnPropertyDescriptor,N={value:void 0,configurable:!0,enumerable:!1,writable:!0};L(window);var O=/Firefox/.test(navigator.userAgent),P={get:function(){},set:function(){},configurable:!0,enumerable:!0},Q=window.DOMImplementation,R=window.EventTarget,S=window.Event,T=window.Node,U=window.Window,V=window.Range,W=window.CanvasRenderingContext2D,X=window.WebGLRenderingContext,Y=window.SVGElementInstance,Z={get:void 0,configurable:!0,enumerable:!0};a.assert=c,a.constructorTable=G,a.defineGetter=D,a.defineWrapGetter=E,a.forwardMethodsToWrapper=F,a.isWrapper=w,a.isWrapperFor=t,a.mixin=d,a.nativePrototypeTable=H,a.oneOf=f,a.registerObject=u,a.registerWrapper=r,a.rewrap=C,a.unwrap=z,a.unwrapIfNeeded=A,a.wrap=y,a.wrapIfNeeded=B,a.wrappers=I}(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(){p=!1;do for(var a=o.slice(),b=!1,c=0;c<a.length;c++){var d=a[c],e=d.takeRecords();f(d),e.length&&(d.callback_(e,d),b=!0)}while(b)}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 o=!1;for(var p in f){var m=f[p],q=new d(c,a);"name"in e&&"namespace"in e&&(q.attributeName=e.name,q.attributeNamespace=e.namespace),e.addedNodes&&(q.addedNodes=e.addedNodes),e.removedNodes&&(q.removedNodes=e.removedNodes),e.previousSibling&&(q.previousSibling=e.previousSibling),e.nextSibling&&(q.nextSibling=e.nextSibling),void 0!==g[p]&&(q.oldValue=g[p]),m.records_.push(q),o=!0}o&&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,o.push(this)}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={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 Q.ShadowRoot}function c(a){return L(a).root}function d(a,d){var h=[],i=a;for(h.push(i);i;){var j=g(i);if(j&&j.length>0){for(var k=0;k<j.length;k++){var m=j[k];if(f(m)){var n=c(m),o=n.olderShadowRoot;o&&h.push(o)}h.push(m)}i=j[j.length-1]}else if(b(i)){if(l(a,i)&&e(d))break;i=i.host,h.push(i)}else i=i.parentNode,i&&h.push(i)}return h}function e(a){if(!a)return!1;switch(a.type){case"abort":case"error":case"select":case"change":case"load":case"reset":case"resize":case"scroll":case"selectstart":return!0}return!1}function f(a){return a instanceof HTMLShadowElement}function g(b){return a.getDestinationInsertionPoints(b)}function h(a,b){if(0===a.length)return b;b instanceof Q.Window&&(b=b.document);for(var c=L(b),d=a[0],e=L(d),f=j(c,e),g=0;g<a.length;g++){var h=a[g];if(L(h)===f)return h}return a[a.length-1]}function i(a){for(var b=[];a;a=a.parent)b.push(a);return b}function j(a,b){for(var c=i(a),d=i(b),e=null;c.length>0&&d.length>0;){var f=c.pop(),g=d.pop();if(f!==g)break;e=f}return e}function k(a,b,c){b instanceof Q.Window&&(b=b.document);var e,f=L(b),g=L(c),h=d(c,a),e=j(f,g);e||(e=g.root);for(var i=e;i;i=i.parent)for(var k=0;k<h.length;k++){var l=h[k];if(L(l)===i)return l}return null}function l(a,b){return L(a)===L(b)}function m(a){if(!S.get(a)&&(S.set(a,!0),n(P(a),P(a.target)),J)){var b=J;throw J=null,b}}function n(b,c){if(T.get(b))throw new Error("InvalidStateError");T.set(b,!0),a.renderAllPending();var e,f,g,h=b.type;if("load"===h&&!b.bubbles){var i=c;i instanceof Q.Document&&(g=i.defaultView)&&(f=i,e=[])}if(!e)if(c instanceof Q.Window)g=c,e=[];else if(e=d(c,b),"load"!==b.type){var i=e[e.length-1];i instanceof Q.Document&&(g=i.defaultView)}return _.set(b,e),o(b,e,g,f)&&p(b,e,g,f)&&q(b,e,g,f),X.set(b,ab),V.delete(b,null),T.delete(b),b.defaultPrevented
+}function o(a,b,c,d){var e=bb;if(c&&!r(c,a,e,b,d))return!1;for(var f=b.length-1;f>0;f--)if(!r(b[f],a,e,b,d))return!1;return!0}function p(a,b,c,d){var e=cb,f=b[0]||c;return r(f,a,e,b,d)}function q(a,b,c,d){for(var e=db,f=1;f<b.length;f++)if(!r(b[f],a,e,b,d))return;c&&b.length>0&&r(c,a,e,b,d)}function r(a,b,c,d,e){var f=R.get(a);if(!f)return!0;var g=e||h(d,a);if(g===a){if(c===bb)return!0;c===db&&(c=cb)}else if(c===db&&!b.bubbles)return!0;if("relatedTarget"in b){var i=O(b),j=i.relatedTarget;if(j){if(j instanceof Object&&j.addEventListener){var l=P(j),m=k(b,a,l);if(m===g)return!0}else m=null;W.set(b,m)}}X.set(b,c);var n=b.type,o=!1;U.set(b,g),V.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===bb||r.capture&&c===db))try{if("function"==typeof r.handler?r.handler.call(a,b):r.handler.handleEvent(b),Z.get(b))return!1}catch(s){J||(J=s)}}if(f.depth--,o&&0===f.depth){var t=f.slice();f.length=0;for(var p=0;p<t.length;p++)t[p].removed||f.push(t[p])}return!Y.get(b)}function s(a,b,c){this.type=a,this.handler=b,this.capture=Boolean(c)}function t(a,b){if(!(a instanceof eb))return P(x(eb,"Event",a,b));var c=a;return pb||"beforeunload"!==c.type?void(this.impl=c):new y(c)}function u(a){return a&&a.relatedTarget?Object.create(a,{relatedTarget:{value:O(a.relatedTarget)}}):a}function v(a,b,c){var d=window[a],e=function(b,c){return b instanceof d?void(this.impl=b):P(x(d,a,b,c))};if(e.prototype=Object.create(b.prototype),c&&M(e.prototype,c),d)try{N(d,e,new d("temp"))}catch(f){N(d,e,document.createEvent(a))}return e}function w(a,b){return function(){arguments[b]=O(arguments[b]);var c=O(this);c[a].apply(c,arguments)}}function x(a,b,c,d){if(nb)return new a(c,u(d));var e=O(document.createEvent(b)),f=mb[b],g=[c];return Object.keys(f).forEach(function(a){var b=null!=d&&a in d?d[a]:f[a];"relatedTarget"===a&&(b=O(b)),g.push(b)}),e["init"+b].apply(e,g),e}function y(a){t.call(this,a)}function z(a){return"function"==typeof a?!0:a&&a.handleEvent}function A(a){switch(a){case"DOMAttrModified":case"DOMAttributeNameChanged":case"DOMCharacterDataModified":case"DOMElementNameChanged":case"DOMNodeInserted":case"DOMNodeInsertedIntoDocument":case"DOMNodeRemoved":case"DOMNodeRemovedFromDocument":case"DOMSubtreeModified":return!0}return!1}function B(a){this.impl=a}function C(a){return a instanceof Q.ShadowRoot&&(a=a.host),O(a)}function D(a,b){var c=R.get(a);if(c)for(var d=0;d<c.length;d++)if(!c[d].removed&&c[d].type===b)return!0;return!1}function E(a,b){for(var c=O(a);c;c=c.parentNode)if(D(P(c),b))return!0;return!1}function F(a){K(a,rb)}function G(b,c,e,f){a.renderAllPending();var g=P(sb.call(c.impl,e,f));if(!g)return null;var i=d(g,null),j=i.lastIndexOf(b);return-1==j?null:(i=i.slice(0,j),h(i,b))}function H(a){return function(){var b=$.get(this);return b&&b[a]&&b[a].value||null}}function I(a){var b=a.slice(2);return function(c){var d=$.get(this);d||(d=Object.create(null),$.set(this,d));var e=d[a];if(e&&this.removeEventListener(b,e.wrapped,!1),"function"==typeof c){var f=function(b){var d=c.call(this,b);d===!1?b.preventDefault():"onbeforeunload"===a&&"string"==typeof d&&(b.returnValue=d)};this.addEventListener(b,f,!1),d[a]={value:c,wrapped:f}}}}var J,K=a.forwardMethodsToWrapper,L=a.getTreeScope,M=a.mixin,N=a.registerWrapper,O=a.unwrap,P=a.wrap,Q=a.wrappers,R=(new WeakMap,new WeakMap),S=new WeakMap,T=new WeakMap,U=new WeakMap,V=new WeakMap,W=new WeakMap,X=new WeakMap,Y=new WeakMap,Z=new WeakMap,$=new WeakMap,_=new WeakMap,ab=0,bb=1,cb=2,db=3;s.prototype={equals:function(a){return this.handler===a.handler&&this.type===a.type&&this.capture===a.capture},get removed(){return null===this.handler},remove:function(){this.handler=null}};var eb=window.Event;eb.prototype.polymerBlackList_={returnValue:!0,keyLocation:!0},t.prototype={get target(){return U.get(this)},get currentTarget(){return V.get(this)},get eventPhase(){return X.get(this)},get path(){var a=_.get(this);return a?a.slice():[]},stopPropagation:function(){Y.set(this,!0)},stopImmediatePropagation:function(){Y.set(this,!0),Z.set(this,!0)}},N(eb,t,document.createEvent("Event"));var fb=v("UIEvent",t),gb=v("CustomEvent",t),hb={get relatedTarget(){var a=W.get(this);return void 0!==a?a:P(O(this).relatedTarget)}},ib=M({initMouseEvent:w("initMouseEvent",14)},hb),jb=M({initFocusEvent:w("initFocusEvent",5)},hb),kb=v("MouseEvent",fb,ib),lb=v("FocusEvent",fb,jb),mb=Object.create(null),nb=function(){try{new window.FocusEvent("focus")}catch(a){return!1}return!0}();if(!nb){var ob=function(a,b,c){if(c){var d=mb[c];b=M(M({},d),b)}mb[a]=b};ob("Event",{bubbles:!1,cancelable:!1}),ob("CustomEvent",{detail:null},"Event"),ob("UIEvent",{view:null,detail:0},"Event"),ob("MouseEvent",{screenX:0,screenY:0,clientX:0,clientY:0,ctrlKey:!1,altKey:!1,shiftKey:!1,metaKey:!1,button:0,relatedTarget:null},"UIEvent"),ob("FocusEvent",{relatedTarget:null},"UIEvent")}var pb=window.BeforeUnloadEvent;y.prototype=Object.create(t.prototype),M(y.prototype,{get returnValue(){return this.impl.returnValue},set returnValue(a){this.impl.returnValue=a}}),pb&&N(pb,y);var qb=window.EventTarget,rb=["addEventListener","removeEventListener","dispatchEvent"];[Node,Window].forEach(function(a){var b=a.prototype;rb.forEach(function(a){Object.defineProperty(b,a+"_",{value:b[a]})})}),B.prototype={addEventListener:function(a,b,c){if(z(b)&&!A(a)){var d=new s(a,b,c),e=R.get(this);if(e){for(var f=0;f<e.length;f++)if(d.equals(e[f]))return}else e=[],e.depth=0,R.set(this,e);e.push(d);var g=C(this);g.addEventListener_(a,m,!0)}},removeEventListener:function(a,b,c){c=Boolean(c);var d=R.get(this);if(d){for(var e=0,f=!1,g=0;g<d.length;g++)d[g].type===a&&d[g].capture===c&&(e++,d[g].handler===b&&(f=!0,d[g].remove()));if(f&&1===e){var h=C(this);h.removeEventListener_(a,m,!0)}}},dispatchEvent:function(b){var c=O(b),d=c.type;S.set(c,!1),a.renderAllPending();var e;E(this,d)||(e=function(){},this.addEventListener(d,e,!0));try{return O(this).dispatchEvent_(c)}finally{e&&this.removeEventListener(d,e,!0)}}},qb&&N(qb,B);var sb=document.elementFromPoint;a.elementFromPoint=G,a.getEventHandlerGetter=H,a.getEventHandlerSetter=I,a.wrapEventTargetMethods=F,a.wrappers.BeforeUnloadEvent=y,a.wrappers.CustomEvent=gb,a.wrappers.Event=t,a.wrappers.EventTarget=B,a.wrappers.FocusEvent=lb,a.wrappers.MouseEvent=kb,a.wrappers.UIEvent=fb}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,b){Object.defineProperty(a,b,o)}function c(a){this.impl=a}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.unwrap,k=a.wrap,l=window.TouchEvent;if(l){var m;try{m=document.createEvent("TouchEvent")}catch(n){return}var o={enumerable:!1};c.prototype={get target(){return k(this.impl.target)}};var p={configurable:!0,enumerable:!0,get:null};["clientX","clientY","screenX","screenY","pageX","pageY","identifier","webkitRadiusX","webkitRadiusY","webkitRotationAngle","webkitForce"].forEach(function(a){p.get=function(){return this.impl[a]},Object.defineProperty(c.prototype,a,p)}),d.prototype={item:function(a){return this[a]}},f.prototype=Object.create(g.prototype),h(f.prototype,{get touches(){return e(j(this).touches)},get targetTouches(){return e(j(this).targetTouches)},get changedTouches(){return e(j(this).changedTouches)},initTouchEvent:function(){throw new Error("Not implemented")}}),i(l,f,m),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,g)}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]=f(a[d]);return b.length=e,b}function e(a,b){a.prototype[b]=function(){return d(this.impl[b].apply(this.impl,arguments))}}var f=a.wrap,g={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);O=!0;for(var g=f.length-1;g>=0;g--)a.removeChild(f[g]),f[g].parentNode_=b;O=!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 J(b[0]);for(var d=J(a.ownerDocument.createDocumentFragment()),e=0;c>e;e++)d.appendChild(J(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=J(b),e=d.parentNode;e&&V.call(e,d),b.previousSibling_=b.nextSibling_=b.parentNode_=null,b=c}a.firstChild_=a.lastChild_=null}else for(var c,f=J(a),g=f.firstChild;g;)c=g.nextSibling,V.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=L(c?P.call(c,a.impl,!1):Q.call(a.impl,!1)),b){for(var e=a.firstChild;e;e=e.nextSibling)d.appendChild(u(e,!0,c));if(a instanceof N.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 R),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.unwrap,K=a.unwrapIfNeeded,L=a.wrap,M=a.wrapIfNeeded,N=a.wrappers,O=!1,P=document.importNode,Q=window.Node.prototype.cloneNode,R=window.Node,S=window.DocumentFragment,T=(R.prototype.appendChild,R.prototype.compareDocumentPosition),U=R.prototype.insertBefore,V=R.prototype.removeChild,W=R.prototype.replaceChild,X=/Trident/.test(navigator.userAgent),Y=X?function(a,b){try{V.call(a,b)}catch(c){if(!(a instanceof S))throw c}}:function(a,b){V.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=J(c):(d=c,c=L(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),U.call(this.impl,J(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:this.impl;j?U.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=J(a),g=a.nextSibling,h=a.previousSibling;if(this.invalidateShadowRenderer()){var i=this.firstChild,j=this.lastChild,k=f.parentNode;k&&Y(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),Y(this.impl,f);return O||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=J(d):(e=d,d=L(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),W.call(this.impl,J(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&&W.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_:L(this.impl.parentNode)},get firstChild(){return void 0!==this.firstChild_?this.firstChild_:L(this.impl.firstChild)},get lastChild(){return void 0!==this.lastChild_?this.lastChild_:L(this.impl.lastChild)},get nextSibling(){return void 0!==this.nextSibling_?this.nextSibling_:L(this.impl.nextSibling)},get previousSibling(){return void 0!==this.previousSibling_?this.previousSibling_:L(this.impl.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=this.impl.ownerDocument.createTextNode(a);this.appendChild(c)}}else q(this),this.impl.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,M(a))},compareDocumentPosition:function(a){return T.call(this.impl,K(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(R,w,document.createDocumentFragment()),delete w.prototype.querySelector,delete w.prototype.querySelectorAll,w.prototype=F(Object.create(x.prototype),w.prototype),a.cloneNode=u,a.nodeWasAdded=j,a.nodeWasRemoved=l,a.nodesWereAdded=k,a.nodesWereRemoved=m,a.snapshotNodeList=i,a.wrappers.Node=w}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a,c){for(var d,e=a.firstElementChild;e;){if(e.matches(c))return e;if(d=b(e,c))return d;e=e.nextElementSibling}return null}function c(a,b){return a.matches(b)}function d(a,b,c){var d=a.localName;return d===b||d===c&&a.namespaceURI===l}function e(){return!0}function f(a,b){return a.localName===b}function g(a,b){return a.namespaceURI===b}function h(a,b,c){return a.namespaceURI===b&&a.localName===c}function i(a,b,c,d,e){for(var f=a.firstElementChild;f;)c(f,d,e)&&(b[b.length++]=f),i(f,b,c,d,e),f=f.nextElementSibling;return b}var j=a.wrappers.HTMLCollection,k=a.wrappers.NodeList,l="http://www.w3.org/1999/xhtml",m={querySelector:function(a){return b(this,a)},querySelectorAll:function(a){return i(this,new k,c,a)}},n={getElementsByTagName:function(a){var b=new j;return"*"===a?i(this,b,e):i(this,b,d,a,a.toLowerCase())},getElementsByClassName:function(a){return this.querySelectorAll("."+a)},getElementsByTagNameNS:function(a,b){var c=new j;if(""===a)a=null;else if("*"===a)return"*"===b?i(this,c,e):i(this,c,f,b);return"*"===b?i(this,c,g,a):i(this,c,h,a,b)}};a.GetElementsByInterface=n,a.SelectorsInterface=m}(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=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 this.impl.data},set data(a){var b=this.impl.data;e(this,"characterData",{oldValue:b}),this.impl.data=a}}),f(b.prototype,c),g(h,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){this.impl=a,this.ownerElement_=b}c.prototype={get length(){return this.impl.length},item:function(a){return this.impl.item(a)},contains:function(a){return this.impl.contains(a)},add:function(){this.impl.add.apply(this.impl,arguments),b(this.ownerElement_)},remove:function(){this.impl.remove.apply(this.impl,arguments),b(this.ownerElement_)},toggle:function(){var a=this.impl.toggle.apply(this.impl,arguments);return b(this.ownerElement_),a},toString:function(){return this.impl.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.unwrap,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);this.impl.polymerShadowRoot_=b;var c=a.getRendererForHost(this);return c.invalidate(),b},get shadowRoot(){return this.impl.polymerShadowRoot_||null},setAttribute:function(a,d){var e=this.impl.getAttribute(a);this.impl.setAttribute(a,d),c(this,a,e),b(this,a)},removeAttribute:function(a){var d=this.impl.getAttribute(a);this.impl.removeAttribute(a),c(this,a,d),b(this,a)},matches:function(a){return s.call(this.impl,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(z,b)}function d(a){return a.replace(A,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+=">",B[f]?h:h+g(a)+"</"+f+">";case Node.TEXT_NODE:var k=a.data;return b&&C[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 y.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=w(a.ownerDocument.createElement(d));e.innerHTML=b;for(var f;f=e.firstChild;)a.appendChild(x(f))}function i(a){o.call(this,a)}function j(a,b){var c=w(a.cloneNode(!1));c.innerHTML=b;for(var d,e=w(document.createDocumentFragment());d=c.firstChild;)e.appendChild(d);return x(e)}function k(b){return function(){return a.renderAllPending(),this.impl[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(),this.impl[b]=c},configurable:!0,enumerable:!0})}function n(b){Object.defineProperty(i.prototype,b,{value:function(){return a.renderAllPending(),this.impl[b].apply(this.impl,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.unwrap,x=a.wrap,y=a.wrappers,z=/[&\u00A0"]/g,A=/[&\u00A0<>]/g,B=e(["area","base","br","col","command","embed","hr","img","input","keygen","link","meta","param","source","track","wbr"]),C=e(["style","script","xmp","iframe","noembed","noframes","plaintext","noscript"]),D=/MSIE/.test(navigator.userAgent),E=window.HTMLElement,F=window.HTMLTemplateElement;i.prototype=Object.create(o.prototype),r(i.prototype,{get innerHTML(){return g(this)},set innerHTML(a){if(D&&C[this.localName])return void(this.textContent=a);var b=v(this.childNodes);this.invalidateShadowRenderer()?this instanceof y.HTMLTemplateElement?h(this.content,a):h(this,a,this.tagName):!F&&this instanceof y.HTMLTemplateElement?h(this.content,a):this.impl.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)}}),["clientHeight","clientLeft","clientTop","clientWidth","offsetHeight","offsetLeft","offsetTop","offsetWidth","scrollHeight","scrollWidth"].forEach(l),["scrollLeft","scrollTop"].forEach(m),["getBoundingClientRect","getClientRects","scrollIntoView"].forEach(n),u(E,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.wrap,g=window.HTMLCanvasElement;b.prototype=Object.create(c.prototype),d(b.prototype,{getContext:function(){var a=this.impl.getContext.apply(this.impl,arguments);return a&&f(a)}}),e(g,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,{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){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),e&&d(e,b),a.wrappers.HTMLShadowElement=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){if(!a.defaultView)return a;var b=k.get(a);if(!b){for(b=a.implementation.createHTMLDocument("");b.lastChild;)b.removeChild(b.lastChild);k.set(a,b)}return b}function c(a){for(var c,d=b(a.ownerDocument),e=h(d.createDocumentFragment());c=a.firstChild;)e.appendChild(c);return e}function d(a){if(e.call(this,a),!l){var b=c(a);j.set(this,i(b))}}var e=a.wrappers.HTMLElement,f=a.mixin,g=a.registerWrapper,h=a.unwrap,i=a.wrap,j=new WeakMap,k=new WeakMap,l=window.HTMLTemplateElement;d.prototype=Object.create(e.prototype),f(d.prototype,{get content(){return l?i(this.impl.content):j.get(this)}}),l&&g(l,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;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;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,{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.wrap,g=window.SVGElementInstance;g&&(b.prototype=Object.create(c.prototype),d(b.prototype,{get correspondingElement(){return f(this.impl.correspondingElement)},get correspondingUseElement(){return f(this.impl.correspondingUseElement)},get parentNode(){return f(this.impl.parentNode)},get childNodes(){throw new Error("Not implemented")},get firstChild(){return f(this.impl.firstChild)},get lastChild(){return f(this.impl.lastChild)},get previousSibling(){return f(this.impl.previousSibling)},get nextSibling(){return f(this.impl.nextSibling)}}),e(g,b),a.wrappers.SVGElementInstance=b)}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrap,f=a.unwrapIfNeeded,g=a.wrap,h=window.CanvasRenderingContext2D;c(b.prototype,{get canvas(){return g(this.impl.canvas)},drawImage:function(){arguments[0]=f(arguments[0]),this.impl.drawImage.apply(this.impl,arguments)},createPattern:function(){return arguments[0]=e(arguments[0]),this.impl.createPattern.apply(this.impl,arguments)}}),d(h,b,document.createElement("canvas").getContext("2d")),a.wrappers.CanvasRenderingContext2D=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.mixin,d=a.registerWrapper,e=a.unwrapIfNeeded,f=a.wrap,g=window.WebGLRenderingContext;if(g){c(b.prototype,{get canvas(){return f(this.impl.canvas)},texImage2D:function(){arguments[5]=e(arguments[5]),this.impl.texImage2D.apply(this.impl,arguments)},texSubImage2D:function(){arguments[6]=e(arguments[6]),this.impl.texSubImage2D.apply(this.impl,arguments)}});var h=/WebKit/.test(navigator.userAgent)?{drawingBufferHeight:null,drawingBufferWidth:null}:{};d(g,b,h),a.wrappers.WebGLRenderingContext=b}}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){this.impl=a}var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap,g=window.Range;b.prototype={get startContainer(){return f(this.impl.startContainer)},get endContainer(){return f(this.impl.endContainer)},get commonAncestorContainer(){return f(this.impl.commonAncestorContainer)},setStart:function(a,b){this.impl.setStart(e(a),b)},setEnd:function(a,b){this.impl.setEnd(e(a),b)},setStartBefore:function(a){this.impl.setStartBefore(e(a))},setStartAfter:function(a){this.impl.setStartAfter(e(a))},setEndBefore:function(a){this.impl.setEndBefore(e(a))},setEndAfter:function(a){this.impl.setEndAfter(e(a))},selectNode:function(a){this.impl.selectNode(e(a))},selectNodeContents:function(a){this.impl.selectNodeContents(e(a))},compareBoundaryPoints:function(a,b){return this.impl.compareBoundaryPoints(a,d(b))},extractContents:function(){return f(this.impl.extractContents())},cloneContents:function(){return f(this.impl.cloneContents())},insertNode:function(a){this.impl.insertNode(e(a))},surroundContents:function(a){this.impl.surroundContents(e(a))},cloneRange:function(){return f(this.impl.cloneRange())},isPointInRange:function(a,b){return this.impl.isPointInRange(e(a),b)},comparePoint:function(a,b){return this.impl.comparePoint(e(a),b)},intersectsNode:function(a){return this.impl.intersectsNode(e(a))},toString:function(){return this.impl.toString()}},g.prototype.createContextualFragment&&(b.prototype.createContextualFragment=function(a){return f(this.impl.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=k(a.impl.ownerDocument.createDocumentFragment());c.call(this,b),i(b,this);var e=a.shadowRoot;m.set(this,e),this.treeScope_=new d(this,g(e||a)),l.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.unwrap,l=new WeakMap,m=new WeakMap,n=/[ \t\n\r\f]/;b.prototype=Object.create(c.prototype),h(b.prototype,{get innerHTML(){return f(this)},set innerHTML(a){j(this,a),this.invalidateShadowRenderer()},get olderShadowRoot(){return m.get(this)||null},get host(){return l.get(this)||null},invalidateShadowRenderer:function(){return l.get(this).invalidateShadowRenderer()},elementFromPoint:function(a,b){return e(this,this.ownerDocument,a,b)},getElementById:function(a){return n.test(a)?null:this.querySelector('[id="'+a+'"]')}}),a.wrappers.ShadowRoot=b}(window.ShadowDOMPolyfill),function(a){"use strict";function b(a){a.previousSibling_=a.previousSibling,a.nextSibling_=a.nextSibling,a.parentNode_=a.parentNode}function c(a,c,e){var f=G(a),g=G(c),h=e?G(e):null;if(d(c),b(c),e)a.firstChild===e&&(a.firstChild_=e),e.previousSibling_=e.previousSibling;else{a.lastChild_=a.lastChild,a.lastChild===a.firstChild&&(a.firstChild_=a.firstChild);var i=H(f.lastChild);i&&(i.nextSibling_=i.nextSibling)}f.insertBefore(g,h)}function d(a){var c=G(a),d=c.parentNode;if(d){var e=H(d);b(a),a.previousSibling&&(a.previousSibling.nextSibling_=a),a.nextSibling&&(a.nextSibling.previousSibling_=a),e.lastChild===a&&(e.lastChild_=a),e.firstChild===a&&(e.firstChild_=a),d.removeChild(c)}}function e(a){I.set(a,[])}function f(a){var b=I.get(a);return b||I.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<M.length;a++){var b=M[a],c=b.parentRenderer;c&&c.dirty||b.render()}M=[]}function i(){y=null,h()}function j(a){var b=K.get(a);return b||(b=new n(a),K.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=J.get(a);c?c.push(b):J.set(a,[b])}function r(a){return J.get(a)}function s(a){J.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(!O.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.unwrap,H=a.wrap,I=new WeakMap,J=new WeakMap,K=new WeakMap,L=F(window,["requestAnimationFrame","mozRequestAnimationFrame","webkitRequestAnimationFrame","setTimeout"]),M=[],N=new ArraySplice;N.equals=function(a,b){return G(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(G(b)),h=a||new WeakMap,i=N.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=H(f[k++]);h.get(q)||d(q)}for(var r=n.addedCount,s=f[k]&&H(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){if(this.dirty=!0,M.push(this),y)return;y=window[L](i,0)}},distribution:function(a){this.resetAll(a),this.distributionResolution(a)},resetAll:function(a){v(a)?e(a):s(a);for(var b=a.firstChild;b;b=b.nextSibling)this.resetAll(b);a.shadowRoot&&this.resetAll(a.shadowRoot),a.olderShadowRoot&&this.resetAll(a.olderShadowRoot)},distributionResolution:function(a){if(w(a)){for(var b=a,c=o(b),d=x(b),e=0;e<d.length;e++)this.poolDistribution(d[e],c);for(var e=d.length-1;e>=0;e--){var f=d[e],g=p(f);if(g){var h=f.olderShadowRoot;h&&(c=o(h));for(var i=0;i<c.length;i++)q(c[i],g)}this.distributionResolution(f)}}for(var j=a.firstChild;j;j=j.nextSibling)this.distributionResolution(j)},poolDistribution:function(a,b){if(!(a instanceof B))if(a instanceof A){var c=a;this.updateDependentAttributes(c.getAttribute("select"));for(var d=!1,e=0;e<b.length;e++){var a=b[e];a&&t(a,c)&&(q(a,c),b[e]=void 0,d=!0)}if(!d)for(var f=c.firstChild;f;f=f.nextSibling)q(f,c)}else for(var f=a.firstChild;f;f=f.nextSibling)this.poolDistribution(f,b)},buildRenderTree:function(a,b){for(var c=this.compose(b),d=0;d<c.length;d++){var e=c[d],f=a.append(e);this.buildRenderTree(f,e)}if(w(b)){var g=j(b);g.dirty=!1}},compose:function(a){for(var b=[],c=a.shadowRoot||a,d=c.firstChild;d;d=d.nextSibling)if(v(d)){this.associateNode(c);for(var e=f(d),g=0;g<e.length;g++){var h=e[g];u(d,h)&&b.push(h)}}else b.push(d);return b},invalidateAttributes:function(){this.attributes=Object.create(null)},updateDependentAttributes:function(a){if(a){var b=this.attributes;/\.\w+/.test(a)&&(b["class"]=!0),/#\w+/.test(a)&&(b.id=!0),a.replace(/\[\s*([^\s=\|~\]]+)/g,function(a,c){b[c]=!0})}},dependsOnAttribute:function(a){return this.attributes[a]},associateNode:function(a){a.impl.polymerShadowRenderer_=this}};var O=/^[*.#[a-zA-Z_|]/;C.prototype.invalidateShadowRenderer=function(){var a=this.impl.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)),this.impl.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){this.impl=a}{var c=a.registerWrapper,d=a.unwrap,e=a.unwrapIfNeeded,f=a.wrap;window.Selection}b.prototype={get anchorNode(){return f(this.impl.anchorNode)},get focusNode(){return f(this.impl.focusNode)},addRange:function(a){this.impl.addRange(d(a))},collapse:function(a,b){this.impl.collapse(e(a),b)},containsNode:function(a,b){return this.impl.containsNode(e(a),b)},extend:function(a,b){this.impl.extend(e(a),b)},getRangeAt:function(a){return f(this.impl.getRangeAt(a))},removeRange:function(a){this.impl.removeRange(d(a))},selectAllChildren:function(a){this.impl.selectAllChildren(e(a))},toString:function(){return this.impl.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 A(c.apply(this.impl,arguments))}}function d(a,b){D.call(b.impl,z(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){this.impl=a}function h(a,b){var c=document.implementation[b];a.prototype[b]=function(){return A(c.apply(this.impl,arguments))}}function i(a,b){var c=document.implementation[b];a.prototype[b]=function(){return c.apply(this.impl,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.unwrap,A=a.wrap,B=a.wrapEventTargetMethods,C=(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 D=document.adoptNode,E=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,this.impl)},getSelection:function(){return x(),new m(E.call(z(this)))},getElementsByName:function(a){return n.querySelectorAll.call(this,"[name="+JSON.stringify(String(a))+"]")}}),document.registerElement){var F=document.registerElement;b.prototype.registerElement=function(b,c){function d(a){return a?void(this.impl=a):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(){A(this)instanceof d||y(this),b.apply(A(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);F.call(z(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=C.get(this);return a?a:(a=new g(z(this).implementation),C.set(this,a),a)},get defaultView(){return A(z(this).defaultView)}}),w(window.Document,b,document.implementation.createHTMLDocument("")),window.HTMLDocument&&w(window.HTMLDocument,b),B([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.getSelection;b.prototype=Object.create(c.prototype),k.prototype.getComputedStyle=function(a,b){return j(this||window).getComputedStyle(i(a),b)},k.prototype.getSelection=function(){return j(this||window).getSelection()},delete window.getComputedStyle,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(m.call(h(this)))},get document(){return j(h(this).document)}}),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;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=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=g.sheet.cssRules,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.convertCombinators(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},convertCombinators:function(a){for(var b=0;b<combinatorsRe.length;b++)a=a.replace(combinatorsRe[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){}},this),c},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]*'([^']*)'[^}]*}([^{]*?){/gim,o=/\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,p=/(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,q=/\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,r=/(polyfill-unscoped-rule)[^}]*(content\:[\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"),combinatorsRe=[/\^\^/g,/\^/g,/\/shadow\//g,/\/shadow-deep\//g,/::shadow/g,/\/deep\//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(){var b=a.urlResolver;if(window.HTMLImports&&!HTMLImports.useNative){var c="link[rel=stylesheet]["+y+"]",d="style["+y+"]";HTMLImports.importer.documentPreloadSelectors+=","+c,HTMLImports.importer.importsPreloadSelectors+=","+c,HTMLImports.parser.documentSelectors=[HTMLImports.parser.documentSelectors,c,d].join(",");var e=HTMLImports.parser.parseGeneric;HTMLImports.parser.parseGeneric=function(a){if(!a[z]){var c=a.__importElement||a;if(!c.hasAttribute(y))return void e.call(this,a);a.__resource?(c=a.ownerDocument.createElement("style"),c.textContent=b.resolveCssText(a.__resource,a.href)):b.resolveStyle(c),c.textContent=k.shimStyle(c),c.removeAttribute(y,""),c.setAttribute(z,""),c[z]=!0,c.parentNode!==C&&(a.parentNode===C?C.replaceChild(c,a):C.appendChild(c)),c.__importParsed=!0,this.markParsingComplete(a),this.parseNext()}};var f=HTMLImports.parser.hasResource;HTMLImports.parser.hasResource=function(a){return"link"===a.localName&&"stylesheet"===a.rel&&a.hasAttribute(y)?a.__resource:f.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}}}),Platform.templateContent=function(a){if(window.HTMLTemplateElement&&HTMLTemplateElement.bootstrap&&HTMLTemplateElement.bootstrap(a),!a.content&&!a._content){for(var b=document.createDocumentFragment();a.firstChild;)b.appendChild(a.firstChild);a._content=b}return a.content||a._content}}(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"))}},a.URL=i}}(window),function(a){function b(a){for(var b=a||{},d=1;d<arguments.length;d++){var e=arguments[d];try{for(var f in e)c(f,e,b)}catch(g){}}return b}function c(a,b,c){var e=d(b,a);Object.defineProperty(c,a,e)}function d(a,b){if(a){var c=Object.getOwnPropertyDescriptor(a,b);return c||d(Object.getPrototypeOf(a),b)}}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)}}),a.mixin=b}(window.Platform),function(a){"use strict";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=DOMTokenList.prototype.add,d=DOMTokenList.prototype.remove;DOMTokenList.prototype.add=function(){for(var a=0;a<arguments.length;a++)c.call(this,arguments[a])},DOMTokenList.prototype.remove=function(){for(var a=0;a<arguments.length;a++)d.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 e=function(){return Array.prototype.slice.call(this)},f=window.NamedNodeMap||window.MozNamedAttrMap||{};if(NodeList.prototype.array=e,f.prototype.array=e,HTMLCollection.prototype.array=e,!window.performance){var g=Date.now();window.performance={now:function(){return Date.now()-g}}}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 h=[],i=function(){h.push(arguments)};window.Polymer=i,a.deliverDeclarations=function(){return a.deliverDeclarations=function(){throw"Possible attempt to load Polymer twice"},h},window.addEventListener("DOMContentLoaded",function(){window.Polymer===i&&(window.Polymer=function(){console.error('You tried to use polymer without loading it first. To load polymer, <link rel="import" href="components/polymer/polymer.html">')})}),a.createDOM=b}(window.Platform),function(a){a.templateContent=a.templateContent||function(a){return a.content}}(window.Platform),function(a){a=a||(window.Inspector={});var b;window.sinspect=function(a,d){b||(b=window.open("","ShadowDOM Inspector",null,!0),b.document.write(c),b.api={shadowize:shadowize}),f(a||wrap(document.body),d)};var c=["<!DOCTYPE html>","<html>","  <head>","    <title>ShadowDOM Inspector</title>","    <style>","      body {","      }","      pre {",'        font: 9pt "Courier New", monospace;',"        line-height: 1.5em;","      }","      tag {","        color: purple;","      }","      ul {","         margin: 0;","         padding: 0;","         list-style: none;","      }","      li {","         display: inline-block;","         background-color: #f1f1f1;","         padding: 4px 6px;","         border-radius: 4px;","         margin-right: 4px;","      }","    </style>","  </head>","  <body>",'    <ul id="crumbs">',"    </ul>",'    <div id="tree"></div>',"  </body>","</html>"].join("\n"),d=[],e=function(){var a=b.document,c=a.querySelector("#crumbs");c.textContent="";for(var e,g=0;e=d[g];g++){var h=a.createElement("a");h.href="#",h.textContent=e.localName,h.idx=g,h.onclick=function(a){for(var b;d.length>this.idx;)b=d.pop();f(b.shadow||b,b),a.preventDefault()},c.appendChild(a.createElement("li")).appendChild(h)}},f=function(a,c){var f=b.document;k=[];var g=c||a;d.push(g),e(),f.body.querySelector("#tree").innerHTML="<pre>"+j(a,a.childNodes)+"</pre>"},g=Array.prototype.forEach.call.bind(Array.prototype.forEach),h={STYLE:1,SCRIPT:1,"#comment":1,TEMPLATE:1},i=function(a){return h[a.nodeName]},j=function(a,b,c){if(i(a))return"";var d=c||"";if(a.localName||11==a.nodeType){var e=a.localName||"shadow-root",f=d+l(a);"content"==e&&(b=a.getDistributedNodes()),f+="<br/>";var h=d+"&nbsp;&nbsp;";g(b,function(a){f+=j(a,a.childNodes,h)}),f+=d,{br:1}[e]||(f+="<tag>&lt;/"+e+"&gt;</tag>",f+="<br/>")}else{var k=a.textContent.trim();f=k?d+'"'+k+'"<br/>':""}return f},k=[],l=function(a){var b="<tag>&lt;",c=a.localName||"shadow-root";return a.webkitShadowRoot||a.shadowRoot?(b+=' <button idx="'+k.length+'" onclick="api.shadowize.call(this)">'+c+"</button>",k.push(a)):b+=c||"shadow-root",a.attributes&&g(a.attributes,function(a){b+=" "+a.name+(a.value?'="'+a.value+'"':"")}),b+="&gt;</tag>"};shadowize=function(){var a=Number(this.attributes.idx.value),b=k[a];b?f(b.webkitShadowRoot||b.shadowRoot,b):(console.log("bad shadowize node"),console.dir(this))},a.output=j}(window.Inspector),function(){var a=document.createElement("style");a.textContent="body {transition: opacity ease-in 0.2s; } \nbody[unresolved] {opacity: 0; display: block; overflow: hidden; } \n";var b=document.querySelector("head");b.insertBefore(a,b.firstChild)}(Platform),function(a){function b(a,b){return b=b||[],b.map||(b=[b]),a.apply(this,b.map(d))}function c(a,c,d){var e;switch(arguments.length){case 0:return;case 1:e=null;break;case 2:e=c.apply(this);break;default:e=b(d,c)}f[a]=e}function d(a){return f[a]}function e(a,c){HTMLImports.whenImportsReady(function(){b(c,a)})}var f={};a.marshal=d,a.modularize=c,a.using=e}(window),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(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}(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){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;var f=this.pending[a];e&&e!==a&&(this.cache[e]=d,f=f.concat(this.pending[e]));for(var g,h=0,i=f.length;i>h&&(g=f[h]);h++)this.onload(e||a,g,d),this.tail();this.pending[a]=null,e&&e!==a&&(this.pending[e]=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:c;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,c=d(a);try{b=btoa(c)}catch(e){b=btoa(unescape(encodeURIComponent(c))),console.warn("Script contained non-latin characters that were forced to latin. Some characters may be wrong.",a)}return"data:text/javascript;base64,"+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=/Trident/.test(navigator.userAgent),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.__importParsed=!0,this.markParsingComplete(a),a.dispatchEvent(a.__resource?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),document.head.appendChild(a)},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}),document.head.appendChild(d)},nextToParse:function(){return!this.parsingElement&&this.nextToParseInDoc(j)},nextToParseInDoc:function(a,c){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)&&!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,a.isIE=i}(HTMLImports),function(a){function b(a){return c(a,q)}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(q)),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}function e(a,b){b=b||r,g(function(){h(a,b)},b)}function f(a){return"complete"===a.readyState||a.readyState===y}function g(a,b){if(f(b))a&&a();else{var c=function(){("complete"===b.readyState||b.readyState===y)&&(b.removeEventListener(z,c),g(a,b))};b.addEventListener(z,c)}}function h(a,b){function c(){f==g&&a&&a()}function d(){f++,c()}var e=b.querySelectorAll("link[rel=import]"),f=0,g=e.length;if(g)for(var h,j=0;g>j&&(h=e[j]);j++)i(h)?d.call(h):(h.addEventListener("load",d),h.addEventListener("error",d));else c()}function i(a){return o?a.import&&"loading"!==a.import.readyState||a.__loaded:a.__importParsed}function j(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)k(b)&&l(b)}function k(a){return"link"===a.localName&&"import"===a.rel}function l(a){var b=a.import;b?m({target:a}):(a.addEventListener("load",m),a.addEventListener("error",m))}function m(a){a.target.__loaded=!0}var n="import"in document.createElement("link"),o=n,p=a.flags,q="import",r=window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(document):document;if(o)var s={};else var t=(a.xhr,a.Loader),u=a.parser,s={documents:{},documentPreloadSelectors:"link[rel="+q+"]",importsPreloadSelectors:["link[rel="+q+"]"].join(","),loadNode:function(a){v.addNode(a)},loadSubtree:function(a){var b=this.marshalNodes(a);v.addNodes(b)},marshalNodes:function(a){return a.querySelectorAll(this.loadSelectorsForNode(a))},loadSelectorsForNode:function(a){var b=a.ownerDocument||a;return b===r?this.documentPreloadSelectors:this.importsPreloadSelectors},loaded:function(a,c,e){if(p.load&&console.log("loaded",a,c),c.__resource=e,b(c)){var f=this.documents[a];f||(f=d(e,a),f.__importLink=c,this.bootDocument(f),this.documents[a]=f),c.import=f}u.parseNext()},bootDocument:function(a){this.loadSubtree(a),this.observe(a),u.parseNext()},loadedAll:function(){u.parseNext()}},v=new t(s.loaded.bind(s),s.loadedAll.bind(s));var w={get:function(){return HTMLImports.currentScript||document.currentScript},configurable:!0};if(Object.defineProperty(document,"_currentScript",w),Object.defineProperty(r,"_currentScript",w),!document.baseURI){var x={get:function(){return window.location.href},configurable:!0};Object.defineProperty(document,"baseURI",x),Object.defineProperty(r,"baseURI",x)}var y=HTMLImports.isIE?"complete":"interactive",z="readystatechange";o&&new MutationObserver(function(a){for(var b,c=0,d=a.length;d>c&&(b=a[c]);c++)b.addedNodes&&j(b.addedNodes)}).observe(document.head,{childList:!0}),a.hasNative=n,a.useNative=o,a.importer=s,a.whenImportsReady=e,a.IMPORT_LINK_TYPE=q,a.isImportLoaded=i,a.importLoader=v}(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)}"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});var b=window.ShadowDOMPolyfill?window.ShadowDOMPolyfill.wrapIfNeeded(document):document;HTMLImports.whenImportsReady(function(){HTMLImports.ready=!0,HTMLImports.readyTime=(new Date).getTime(),b.dispatchEvent(new CustomEvent("HTMLImportsLoaded",{bubbles:!0}))}),HTMLImports.useNative||("complete"===document.readyState||"interactive"===document.readyState&&!window.attachEvent?a():document.addEventListener("DOMContentLoaded",a))}(),window.CustomElements=window.CustomElements||{flags:{}},function(a){function b(a,c,d){var e=a.firstElementChild;if(!e)for(e=a.firstChild;e&&e.nodeType!==Node.ELEMENT_NODE;)e=e.nextSibling;for(;e;)c(e,d)!==!0&&b(e,c,d),e=e.nextElementSibling;return null}function c(a,b){for(var c=a.shadowRoot;c;)d(c,b),c=c.olderShadowRoot}function d(a,d){b(a,function(a){return d(a)?!0:void c(a,d)}),c(a,d)}function e(a){return h(a)?(i(a),!0):void l(a)}function f(a){d(a,function(a){return e(a)?!0:void 0})}function g(a){return e(a)||f(a)}function h(b){if(!b.__upgraded__&&b.nodeType===Node.ELEMENT_NODE){var c=b.getAttribute("is")||b.localName,d=a.registry[c];if(d)return A.dom&&console.group("upgrade:",b.localName),a.upgrade(b),A.dom&&console.groupEnd(),!0}}function i(a){l(a),r(a)&&d(a,function(a){l(a)})}function j(a){if(E.push(a),!D){D=!0;var b=window.Platform&&window.Platform.endOfMicrotask||setTimeout;b(k)}}function k(){D=!1;for(var a,b=E,c=0,d=b.length;d>c&&(a=b[c]);c++)a();E=[]}function l(a){C?j(function(){m(a)}):m(a)}function m(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("inserted:",a.localName),r(a)&&(a.__inserted=(a.__inserted||0)+1,a.__inserted<1&&(a.__inserted=1),a.__inserted>1?A.dom&&console.warn("inserted:",a.localName,"insert/remove count:",a.__inserted):a.attachedCallback&&(A.dom&&console.log("inserted:",a.localName),a.attachedCallback())),A.dom&&console.groupEnd())}function n(a){o(a),d(a,function(a){o(a)})}function o(a){C?j(function(){p(a)}):p(a)}function p(a){(a.attachedCallback||a.detachedCallback||a.__upgraded__&&A.dom)&&(A.dom&&console.group("removed:",a.localName),r(a)||(a.__inserted=(a.__inserted||0)-1,a.__inserted>0&&(a.__inserted=0),a.__inserted<0?A.dom&&console.warn("removed:",a.localName,"insert/remove count:",a.__inserted):a.detachedCallback&&a.detachedCallback()),A.dom&&console.groupEnd())}function q(a){return window.ShadowDOMPolyfill?ShadowDOMPolyfill.wrapIfNeeded(a):a}function r(a){for(var b=a,c=q(document);b;){if(b==c)return!0;b=b.parentNode||b.host}}function s(a){if(a.shadowRoot&&!a.shadowRoot.__watched){A.dom&&console.log("watching shadow-root for: ",a.localName);for(var b=a.shadowRoot;b;)t(b),b=b.olderShadowRoot}}function t(a){a.__watched||(w(a),a.__watched=!0)}function u(a){if(A.dom){var b=a[0];if(b&&"childList"===b.type&&b.addedNodes&&b.addedNodes){for(var c=b.addedNodes[0];c&&c!==document&&!c.host;)c=c.parentNode;var d=c&&(c.URL||c._URL||c.host&&c.host.localName)||"";d=d.split("/?").shift().split("/").pop()}console.group("mutations (%d) [%s]",a.length,d||"")}a.forEach(function(a){"childList"===a.type&&(G(a.addedNodes,function(a){a.localName&&g(a)}),G(a.removedNodes,function(a){a.localName&&n(a)}))}),A.dom&&console.groupEnd()}function v(){u(F.takeRecords()),k()}function w(a){F.observe(a,{childList:!0,subtree:!0})}function x(a){w(a)}function y(a){A.dom&&console.group("upgradeDocument: ",a.baseURI.split("/").pop()),g(a),A.dom&&console.groupEnd()}function z(a){a=q(a);for(var b,c=a.querySelectorAll("link[rel="+B+"]"),d=0,e=c.length;e>d&&(b=c[d]);d++)b.import&&b.import.__parsed&&z(b.import);y(a)}var A=window.logFlags||{},B=window.HTMLImports?HTMLImports.IMPORT_LINK_TYPE:"none",C=!window.MutationObserver||window.MutationObserver===window.JsMutationObserver;a.hasPolyfillMutations=C;var D=!1,E=[],F=new MutationObserver(u),G=Array.prototype.forEach.call.bind(Array.prototype.forEach);a.IMPORT_LINK_TYPE=B,a.watchShadow=s,a.upgradeDocumentTree=z,a.upgradeAll=g,a.upgradeSubtree=f,a.insertedNode=i,a.observeDocument=x,a.upgradeDocument=y,a.takeRecords=v}(window.CustomElements),function(a){function b(b,g){var h=g||{};if(!b)throw new Error("document.registerElement: first argument `name` must not be empty");if(b.indexOf("-")<0)throw new Error("document.registerElement: first argument ('name') must contain a dash ('-'). Argument provided was '"+String(b)+"'.");if(c(b))throw new Error("Failed to execute 'registerElement' on 'Document': Registration failed for type '"+String(b)+"'. The type name is invalid.");if(n(b))throw new Error("DuplicateDefinitionError: a type with name '"+String(b)+"' is already registered");if(!h.prototype)throw new Error("Options missing required prototype property");return h.__name=b.toLowerCase(),h.lifecycle=h.lifecycle||{},h.ancestry=d(h.extends),e(h),f(h),l(h.prototype),o(h.__name,h),h.ctor=p(h),h.ctor.prototype=h.prototype,h.prototype.constructor=h.ctor,a.ready&&a.upgradeDocumentTree(document),h.ctor
+}function c(a){for(var b=0;b<y.length;b++)if(a===y[b])return!0}function d(a){var b=n(a);return b?d(b.extends).concat([b]):[]}function e(a){for(var b,c=a.extends,d=0;b=a.ancestry[d];d++)c=b.is&&b.tag;a.tag=c||a.__name,c&&(a.is=a.__name)}function f(a){if(!Object.__proto__){var b=HTMLElement.prototype;if(a.is){var c=document.createElement(a.tag),d=Object.getPrototypeOf(c);d===a.prototype&&(b=d)}for(var e,f=a.prototype;f&&f!==b;)e=Object.getPrototypeOf(f),f.__proto__=e,f=e;a.native=b}}function g(a){return h(B(a.tag),a)}function h(b,c){return c.is&&b.setAttribute("is",c.is),b.removeAttribute("unresolved"),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);var a=window.Platform&&Platform.endOfMicrotask?Platform.endOfMicrotask:setTimeout;a(function(){CustomElements.ready=!0,CustomElements.readyTime=Date.now(),window.HTMLImports&&(CustomElements.elapsed=CustomElements.readyTime-HTMLImports.readyTime),document.dispatchEvent(new CustomEvent("WebComponentsReady",{bubbles:!0})),window.HTMLImports&&(HTMLImports.__importsParsingHook=function(a){CustomElements.parser.parse(a.import)})})}if("function"!=typeof window.CustomEvent&&(window.CustomEvent=function(a){var b=document.createEvent("HTMLEvents");return b.initEvent(a,!0,!0),b}),"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){function b(a){this.cache=Object.create(null),this.map=Object.create(null),this.requests=0,this.regex=a}var c=a.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}(window.Platform),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}(window.Platform),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())},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_;if(a.if){if(c.hasIf=!0,c.ifOneTime=a.if.onlyOneTime,c.ifValue=v(J,a.if,d,b),c.ifOneTime&&!c.ifValue)return void this.updateIteratedValue();c.ifOneTime||c.ifValue.open(this.updateIteratedValue,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)),c.oneTime||c.value.open(this.updateIteratedValue,this),this.updateIteratedValue()},updateIteratedValue:function(){if(this.deps.hasIf){var a=this.deps.ifValue;if(this.deps.ifOneTime||(a=a.discardChanges()),!a)return void this.valueChanged()}var b=this.deps.value;this.deps.oneTime||(b=b.discardChanges()),this.deps.repeat||(b=[b]);var c=this.deps.repeat&&!this.deps.oneTime&&Array.isArray(b);this.valueChanged(b,c)},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(){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);
 //# sourceMappingURL=platform.js.map
\ No newline at end of file
diff --git a/pkg/web_components/lib/platform.js.map b/pkg/web_components/lib/platform.js.map
index de4213d..e0e09db 100644
--- a/pkg/web_components/lib/platform.js.map
+++ b/pkg/web_components/lib/platform.js.map
@@ -1 +1 @@
-{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","build/if-poly.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/Element.js","../ShadowDOM/src/wrappers/HTMLElement.js","../ShadowDOM/src/wrappers/HTMLCanvasElement.js","../ShadowDOM/src/wrappers/HTMLContentElement.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/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/lang.js","src/dom.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","src/url.js","../MutationObservers/MutationObserver.js","../HTMLImports/src/scope.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/loader.js","src/styleloader.js","../NodeBind/src/NodeBind.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.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,KAAA,mIAMA,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,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAEA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,EACA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KCnBA,SAAA,QACA,YAGA,SAAA,uBAQA,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,cAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAGA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAOA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAEA,IAAA,GAAA,IAAA,EAyBA,QAAA,aAAA,GACA,MAAA,gBAAA,IACA,GACA,EAAA,EAAA,OAEA,IAAA,GACA,EAEA,KAAA,EAAA,IACA,EAEA,WAAA,KAAA,IAKA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,OAAA,IAAA,EAAA,OACA,KAEA,QAAA,IACA,KAAA,KAAA,GACA,OAGA,EAAA,MAAA,YAAA,OAAA,SAAA,GACA,MAAA,KACA,QAAA,SAAA,GACA,KAAA,KAAA,IACA,WAEA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,4BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAEA,OAAA,IACA,EAAA,IAEA,gBAAA,KACA,EAAA,OAAA,GAEA,IAAA,GAAA,UAAA,EACA,IAAA,EACA,MAAA,EACA,KAAA,YAAA,GACA,MAAA,YACA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAEA,OADA,WAAA,GAAA,EACA,EA8EA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAGA,QAAA,yBAAA,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,eACA,IAAA,SAAA,OACA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IACA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EA4BA,QAAA,qBAMA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,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,oBAAA,KAAA,QA2BA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAKA,QAAA,kBAOA,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,QACA,EAAA,gBAAA,EAIA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,QAAA,QACA,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,SAAA,iBAGA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,iBAAA,KAAA,QAIA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAMA,MALA,kBAAA,gBAAA,SAAA,IACA,gBAAA,iBAAA,OAAA,iBACA,gBAAA,OAAA,GAEA,gBAAA,KAAA,EAAA,GACA,gBAUA,QAAA,YACA,KAAA,OAAA,SACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA2DA,QAAA,UAAA,GACA,SAAA,qBACA,kBAGA,aAAA,KAAA,GAGA,QAAA,iBACA,SAAA,qBAiEA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA0FA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAgDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,QAAA,GACA,KAAA,gBAAA,OA0CA,QAAA,kBAAA,GACA,SAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OACA,KAAA,aAgIA,QAAA,SAAA,GAAA,MAAA,GAEA,QAAA,mBAAA,EAAA,EAAA,EACA,GACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EACA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAGA,KAAA,oBAAA,EA6DA,QAAA,QAAA,EAAA,EAAA,EAAA,GACA,IAAA,aAAA,EAAA,KAKA,kBAAA,GAAA,kBACA,EAAA,iBAAA,EAAA,EAAA,GAEA,YAAA,CAGA,GAAA,GAAA,EAAA,SACA,KACA,EAAA,EAAA,UAAA,OAAA,YAAA,IAEA,aAAA,OAAA,EACA,aAAA,KAAA,EACA,aAAA,SAAA,EAEA,EAAA,OAAA,eAiEA,QAAA,6BAAA,EAAA,EAAA,GAIA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,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,WAAA,EAAA,EAAA,GACA,OACA,MAAA,EACA,QAAA,EACA,WAAA,GASA,QAAA,gBA0OA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAGA,QAAA,WAAA,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,aAAA,EAAA,EAAA,EAAA,GAOA,IAAA,GALA,GAAA,UAAA,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,UAAA,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,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MACA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MACA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAKA,MAAA,GAGA,QAAA,qBAAA,EAAA,GACA,GAAA,KAcA,OAZA,sBAAA,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,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,EAlhDA,GAAA,YAAA,sBAiBA,QAAA,aAcA,YAAA,OAAA,OAAA,OAAA,SAAA,GACA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAYA,aAAA,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,WAAA,aACA,UAAA,gBACA,MAAA,WAAA,IAAA,UAAA,IACA,aAAA,yBACA,oBAAA,MAAA,MAAA,IAAA,aAAA,IACA,KAAA,MAAA,oBAAA,kBAAA,oBAAA,KACA,WAAA,GAAA,QAAA,IAAA,KAAA,KAgBA,wBA0BA,YAsBA,MAAA,IAAA,QAEA,KAAA,UAAA,cACA,aACA,OAAA,EAEA,SAAA,WACA,MAAA,MAAA,KAAA,MAGA,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,SAAA,GACA,MACA,GAAA,EAAA,KAAA,MAIA,uBAAA,WACA,GAAA,GAAA,KAAA,IAAA,SAAA,GACA,MAAA,SAAA,GAAA,KAAA,EAAA,KAAA,IAAA,IAGA,EAAA,GACA,EAAA,KACA,IAAA,iBAEA,KADA,GAAA,GAAA,EACA,EAAA,KAAA,OAAA,EAAA,IAAA,CACA,CAAA,KAAA,GACA,GAAA,EAAA,GACA,GAAA,aAAA,EAAA,WAOA,MALA,IAAA,MAEA,GAAA,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,SAAA,GACA,OAAA,CACA,GAAA,EAAA,KAAA,IAGA,MAAA,UAAA,IAGA,EAAA,KAAA,IAAA,GACA,IAHA,IAOA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAEA,IAAA,wBAAA,IA8DA,YAYA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CAOA,OALA,QAAA,QAAA,EAAA,WACA,cACA,GAAA,IAGA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAIA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAIA,uBAyEA,oBA2FA,gBAWA,SAAA,EACA,OAAA,EACA,OAAA,EACA,UAAA,EAEA,eAAA,CAWA,UAAA,WACA,KAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAOA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,OACA,KAAA,QAGA,MAAA,WACA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,SAGA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAGA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GACA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CACA,EAAA,OAAA,MAIA,eAAA,WAEA,MADA,MAAA,OAAA,QAAA,GACA,KAAA,QAIA,IAAA,mBAAA,WACA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAeA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IACA,OAAA,KAIA,QAAA,SAAA,OAAA,aAEA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAGA,GAAA,0BAEA,WADA,MAAA,mBAIA,IAAA,iBAAA,CAGA,4BAAA,CAEA,IAAA,QAAA,EACA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aACA,gBACA,YAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAGA,SAAA,WACA,YAAA,GAEA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAEA,QAAA,0BACA,OAAA,qBAAA,QAEA,4BAAA,KAGA,mBACA,OAAA,SAAA,eAAA,WACA,kBAUA,eAAA,UAAA,cACA,UAAA,SAAA,UAEA,cAAA,EAEA,SAAA,WACA,WACA,KAAA,gBAAA,kBAAA,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,WAAA,CACA,IAAA,EACA,OAAA,CAEA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAGA,OAAA,aAAA,IACA,GAEA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YACA,EAAA,YACA,SAAA,GACA,MAAA,GAAA,OAIA,IAGA,YAAA,WACA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAEA,WAAA,QAGA,eAAA,WAMA,MALA,MAAA,gBACA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAEA,KAAA,UAUA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GACA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAGA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SAAA,KACA,IANA,KAUA,cAAA,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,aAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WACA,aACA,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,aAAA,KAAA,OAAA,IACA,GAEA,KAAA,SAAA,KAAA,OAAA,KACA,IAGA,SAAA,SAAA,GACA,KAAA,OACA,KAAA,MAAA,aAAA,KAAA,QAAA,KAaA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAEA,SAAA,WACA,GAAA,WAAA,CAGA,IAAA,GAFA,GACA,GAAA,EACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAEA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,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,kBACA,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,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,IAAA,GAAA,QAAA,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,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,iBAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,eAGA,YAAA,WACA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAIA,OAHA,MAAA,OAAA,OACA,KAAA,WAEA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,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,iBAAA,CACA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,SACA,EAAA,KAAA,KAAA,QAAA,MACA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,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,kBAAA,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,aAAA,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,sBACA,KAAA,EACA,QAAA,EACA,UAAA,GAGA,cACA,OAAA,OACA,KAAA,SACA,KAAA,OACA,SAAA,OA0BA,UAAA,gCAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,GAAA,GAAA,EAAA,GAEA,OAAA,eAAA,EAAA,GACA,IAAA,WACA,GAAA,GAAA,KAAA,EAIA,OAHA,IACA,EAAA,UAEA,KAAA,IAEA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,EACA,IAAA,EAEA,WADA,GAAA,SAAA,EAIA,IAAA,GAAA,KAAA,EAIA,OAHA,MAAA,GAAA,EACA,OAAA,KAAA,EAAA,EAAA,GAEA,GAEA,cAAA,KAIA,SAAA,eAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,IACA,EAAA,EAAA,aAEA,GAAA,GAAA,CACA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,KAAA,SAAA,EAAA,GACA,EAAA,GAAA,EACA,OAAA,EAAA,EAAA,EAAA,IAGA,IAAA,IAAA,aAAA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,cAAA,EAAA,KACA,EAAA,EACA,EAAA,UACA,EAAA,SAAA,IAOA,MAHA,GAAA,GAAA,EACA,OAAA,EAAA,EAAA,EAAA,IAGA,MAAA,WACA,EAAA,QACA,EAAA,GAAA,SAwEA,IAAA,YAAA,EACA,YAAA,EACA,SAAA,EACA,YAAA,CAIA,aAAA,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,aAEA,EAAA,KAAA,aACA,EAAA,GAEA,IACA,KACA,GAAA,GACA,EAAA,KAAA,aACA,IACA,EAAA,IAEA,EAAA,KAAA,UACA,IACA,EAAA,OA9BA,GAAA,KAAA,aACA,QANA,GAAA,KAAA,UACA,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,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAEA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,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,YACA,IACA,EAAA,KAAA,GACA,EAAA,QAGA,IACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MACA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,GACA,MACA,KAAA,aACA,IACA,EAAA,UAAA,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,aAAA,GAAA,YAuJA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,kBAAA,iBACA,OAAA,SAAA,iBAAA,WACA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAGA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBACA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QC7lDA,SAAA,MAAA,QCGA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAGA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,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,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAIA,MAAA,IAIA,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,OAEA,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,EAaA,QAAA,GAAA,GACA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GACA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IACA,GACA,YAAA,IACA,GACA,YAAA,GASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAEA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KAQA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MAQA,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,gBAAA,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,KAAA,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,gBA7XA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAiBA,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,GAoJA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,mBAqFA,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,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBCzZA,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,KACA,IAEA,EAAA,GACA,GAAA,GAIA,QAAA,KACA,GAAA,CAEA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GAQA,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,YAKA,GAAA,IAAA,CAGA,KAAA,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,SAAA,KAAA,GAEA,GAAA,EAGA,GACA,IASA,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,EAGA,EAAA,KAAA,MAiEA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BAzTA,GAAA,GAAA,EAAA,kBACA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAgLA,EAAA,MAAA,UAAA,MAgDA,EAAA,CAiBA,GAAA,WAEA,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,CAGA,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,mBC7WA,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,YAuBA,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,GAIA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAEA,GAAA,IAAA,GAAA,GAGA,EAAA,kBACA,IAAA,GAOA,EACA,EACA,EAAA,EAAA,IAKA,IAAA,SAAA,IAAA,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,GAEA,SAAA,EAAA,KAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAiBA,MAZA,GAAA,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,CAEA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,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,EAAA,IAAA,GACA,OAAA;CAEA,MAAA,GACA,IACA,EAAA,IAIA,GAAA,EAAA,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,KAMA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GALA,IAAA,GAAA,CACA,OAAA,KAAA,iBAAA,EAAA,UAEA,KAAA,KAAA,GADA,GAAA,GAAA,GA+CA,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,QACA,KAAA,KAAA,GAEA,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,KAAA,KAAA,EAkBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAqFA,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,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,GACA,KAAA,EACA,MAAA,KACA,IAAA,GAAA,EAAA,EAAA,KACA,OAAA,GAAA,EAAA,GAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MASA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KACA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,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,KAx2BA,GAuNA,GAvNA,EAAA,EAAA,wBACA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,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,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SA4LA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CAoNA,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,GAmBA,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,GAAA,SACA,EAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAKA,IAAA,GAJA,GAAA,EACA,EAAA,EAAA,OAAA,EACA,EAAA,EAAA,EAAA,IAAA,OAEA,EAAA,EAAA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EACA,GAAA,SAAA,KAEA,IAAA,GAAA,YAAA,GAAA,QACA,EAAA,KAAA,GAGA,EAAA,OAAA,EAEA,MAAA,IAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAEA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,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,MAAA,KAAA,aAEA,GAAA,aAAA,GACA,KAAA,KAAA,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,GAKA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WANA,MACA,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,gBA+DA,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,mBC33BA,SAAA,GACA,YAwBA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,KAAA,KAAA,EAkCA,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,GAlFA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,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,KAAA,KAAA,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,MAAA,KAAA,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,mBCvHA,SAAA,GACA,YAMA,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,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aAhCA,GAAA,GAAA,EAAA,KAEA,GAAA,YAAA,EAUA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAmBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBCzCA,SAAA,GACA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAEA,OAAA,mBCRA,SAAA,GACA,YAoBA,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,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,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,OArUA,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,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,KAAA,KAAA,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,KAAA,IAGA,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,KAAA,KAAA,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,KAAA,KAAA,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,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAIA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,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,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAGA,GAAA,MACA,KAAA,KAAA,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,KAAA,KACA,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,aAAA,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,iBAAA,EACA,EAAA,SAAA,KAAA,GAEA,OAAA,mBC1tBA,SAAA,GACA,YAKA,SAAA,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,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,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GApDA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SAmBA,EAAA,+BAuCA,GACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,GAAA,GAAA,EAAA,KAIA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,EACA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,EACA,EACA,EACA,EAAA,gBAGA,uBAAA,SAAA,GAEA,MAAA,MAAA,iBAAA,IAAA,IAGA,uBAAA,SAAA,EAAA,GACA,GAAA,GAAA,GAAA,EAEA,IAAA,KAAA,EACA,EAAA,SACA,IAAA,MAAA,EACA,MAAA,MAAA,EACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAGA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAAA,IAIA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAEA,OAAA,mBC7GA,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,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,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,MAAA,KAAA,MAEA,GAAA,MAAA,GACA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBACA,SAAA,IAEA,KAAA,KAAA,KAAA,KAIA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,eAAA,KAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBCxCA,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,YA6BA,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,IAIA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwDA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,CACA,QAAA,eAAA,EAAA,GACA,IAAA,WACA,MAAA,MAAA,KAAA,IAEA,IAAA,SAAA,GACA,KAAA,KAAA,GAAA,EACA,EAAA,KAAA,IAEA,cAAA,EACA,YAAA,IArHA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,oBACA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAEA,GADA,EAAA,MACA,EAAA,iBACA,EAAA,EAAA,SAEA,EAAA,OAAA,QAEA,GACA,UACA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAGA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,EA2BA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAEA,IAAA,GAAA,EAAA,mBAAA,KAGA,OAFA,GAAA,aAEA,GAGA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAKA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,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,kBAsBA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,UAAA,YAAA,SAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAIA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBC3IA,SAAA,GACA,YAqBA,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,GAwFA,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,KAAA,KAAA,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,KAAA,KAAA,GAAA,GAEA,cAAA,EACA,YAAA,IASA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,MAAA,WAEA,MADA,GAAA,mBACA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,IAhSA,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,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,KAAA,KAAA,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,OA4BA,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,mBCtTA,SAAA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAIA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBC1BA,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,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,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,WAIA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBCrBA,SAAA,GACA,YAYA,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,KA3CA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,GAAA,SACA,EAAA,GAAA,SA8BA,EAAA,OAAA,mBASA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SAOA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GACA,OAAA,mBClEA,SAAA,GACA,YAOA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GANA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GACA,OAAA,mBCjBA,SAAA,GACA,YASA,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,GA3BA,GAAA,GAAA,EAAA,SAAA,iBACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EACA,SAAA,cAAA,UAiBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBCrCA,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,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,mBC7BA,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,eAEA,EAAA,6BACA,EAAA,SAAA,gBAAA,EAAA,SACA,EAAA,EAAA,GACA,EAAA,OAAA,eAAA,EAAA,WAAA,WAEA,GAAA,SAAA,WAAA,GACA,OAAA,mBCXA,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,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAIA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAIA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAIA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAIA,EAAA,EAAA,GAEA,EAAA,SAAA,mBAAA,IACA,OAAA,mBC9DA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAMA,GAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAIA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBCnCA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAGA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA;EAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAEA,GAAA,EAAA,EACA,GAEA,EAAA,SAAA,sBAAA,IACA,OAAA,mBC7CA,SAAA,GACA,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,KAKA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAEA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAEA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAEA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GACA,KAAA,KAAA,aAAA,EAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GACA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KAEA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAEA,cAAA,WACA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAEA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAEA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAKA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA,MAIA,EAAA,OAAA,MAAA,EAAA,SAAA,eAEA,EAAA,SAAA,MAAA,GAEA,OAAA,mBC1FA,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,YAiBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,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,GA7BA,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,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,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,mBCrEA,SAAA,GACA,YAoBA,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,aAAA,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,YAAA,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,GAyOA,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,QAWA,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,GAlkBA,GA2HA,GA3HA,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,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,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,SAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,EAEA,KAAA,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,KAAA,uBAAA,MAsDA,IAAA,GAAA,iBAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,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,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAGA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBC1oBA,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,YASA,SAAA,GAAA,GACA,KAAA,KAAA,EARA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,IAEA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAEA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAgBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAEA,OAAA,mBC9DA,SAAA,GACA,YAyBA,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,KAAA,KAAA,aAkBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,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,GA0MA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YAtSA,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,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,YAqBA,IAnBA,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,KAAA,OAEA,aAAA,WAEA,MADA,KACA,GAAA,GAAA,EAAA,KAAA,EAAA,WAIA,SAAA,gBAAA,CACA,GAAA,GAAA,SAAA,eACA,GAAA,UAAA,gBAAA,SAAA,EAAA,GAyEA,QAAA,GAAA,GACA,MAAA,QAOA,KAAA,KAAA,GANA,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,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,mBCjUA,SAAA,GACA,YAeA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,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,YAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAGA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,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,aAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAEA,OAAA,mBC9DA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAMA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBCnBA,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,WAGA,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,oBCkFA,SAAA,GA0bA,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,EAAA,MAAA,SACA,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,EAviBA,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,mBAAA,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,GAKA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAgBA,OAfA,IACA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GACA,EAAA,cAAA,EAAA,OAAA,EAAA,MAAA,SACA,GAAA,KAAA,cAAA,EAAA,aAAA,EACA,KAAA,eAAA,QACA,GAAA,KAAA,mBAAA,GAAA,WACA,EAAA,OAAA,QAAA,YACA,GAAA,UAAA,EAAA,MAAA,UAAA,OACA,GAAA,KAAA,WAAA,EAAA,SAAA,GACA,GAAA,WACA,EAAA,UACA,GAAA,EAAA,QAAA,SAEA,MAEA,GAEA,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,uEAEA,EAAA,sDACA,EAAA,+DAEA,EAAA,+DACA,EAAA,wEAIA,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,eACA,QACA,MACA,cACA,mBACA,YACA,YAyCA,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,GAAA,GAAA,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,YACA,EAAA,EAAA,cAAA,cAAA,SACA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAEA,EAAA,aAAA,GAEA,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,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,IAGA,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,YC3uBA,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,MAKA,SAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAEA,GAAA,SAAA,EAEA,MAAA,GAAA,SAAA,EAAA,WAGA,OAAA,UCzCA,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,YACA,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;KAEA,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,eAIA,EAAA,IAAA,IAEA,QC3iBA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,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,MAuCA,EAAA,MAAA,GAEA,OAAA,UCpDA,SAAA,GAEA,YAiFA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAEA,IADA,EAAA,UAAA,EACA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAGA,OAAA,GAnFA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAKA,IAAA,GAAA,WACA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBAQA,IANA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAIA,OAAA,YAAA,CACA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,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,OAwBA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UClIA,SAAA,GACA,EAAA,gBAAA,EAAA,iBAAA,SAAA,GACA,MAAA,GAAA,UAEA,OAAA,UCLA,SAAA,GAEA,EAAA,IAAA,OAAA,aAEA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GACA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAEA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CACA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YACA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAEA,EAAA,EAAA,cAAA,UAEA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EACA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KACA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAEA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAEA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GACA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAEA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAEA,MAAA,IAWA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAcA,OAbA,GAAA,kBAAA,EAAA,YACA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAEA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aAMA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAEA,QAAA,IAAA,sBACA,QAAA,IAAA,QAMA,EAAA,OAAA,GAEA,OAAA,WC3LA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAEA,UCrBA,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,GACA,EAAA,EAAA,MAAA,KACA,MACA,SACA,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,EACA,EAAA,OAAA,EACA,EAAA,MAAA,GAEA,QC9CA,SAAA,GAMA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAGA,QAAA,KACA,KAAA,EAAA,QACA,EAAA,UAXA,GAAA,GAAA,EACA,KACA,EAAA,SAAA,eAAA,GAaA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UCzBA,SAAA,GAwEA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAEA,OADA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,MAAA,EAAA,GACA,MAAA,EAEA,IAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,KAAA,EAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MACA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,SACA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KAAA,EAAA,OAAA,EAAA,KA/GA,GAAA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAKA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAEA,eAAA,SAAA,EAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAEA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAIA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAEA,GAFA,EAAA,EAAA,WAAA,GACA,EAAA,GAAA,EAAA,KAEA,IAAA,EAAA,OAAA,GAAA,IAEA,EADA,UAAA,EACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,GAEA,EAAA,MAAA,OAMA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,SAAA,SACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QA+CA,GAAA,YAAA,GAEA,UC1HA,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,MC5hBA,OAAA,YAAA,OAAA,cAAA,UCCA,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,WACA,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,aAEA,QAAA,SAAA,GAEA,KAAA,WAEA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,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,IAEA,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,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,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,IAEA,KAAA,OAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,MAEA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KACA,MAAA,EAAA,QACA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eAYA,QAXA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OACA,EAAA,iBAAA,mBAAA,WACA,IAAA,EAAA,YACA,EAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,KAGA,EAAA,OACA,GAEA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAEA,OAAA,aC9JA,SAAA,GA4MA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KACA,EAAA,KAAA,GACA,MAAA,GACA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAEA,MAAA,+BAAA,EAGA,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,EAvPA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAUA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IACA,uBACA,QACA,qBACA,kCACA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAGA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,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,KAMA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAEA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,GACA,KAAA,aAEA,YAAA,SAAA,GAgBA,GAfA,EAAA,OAAA,gBAAA,EAIA,YAAA,sBACA,YAAA,qBAAA,GAIA,EAAA,cADA,EAAA,WACA,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,oBAAA,IAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GAOA,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,OAUA,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,SAAA,KAAA,YAAA,IAGA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,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,MAKA,OAAA,IAGA,sBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QACA,GAEA,IAsDA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GACA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAEA,OADA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GACA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAEA,OADA,GAAA,KAAA,YAAA,EAAA,EAAA,IAGA,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,KAMA,GAAA,OAAA,EACA,EAAA,KAAA,EACA,EAAA,KAAA,GAEA,aC5RA,SAAA,GA0FA,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,EAsCA,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,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GACA,GAAA,IAGA,QAAA,KACA,IACA,IATA,GAAA,GAAA,EAAA,iBAAA,oBACA,EAAA,EAAA,EAAA,EAAA,MAUA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,GACA,EAAA,KAAA,IAEA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,QAIA,KAIA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,YAAA,EAAA,SACA,EAAA,eAeA,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,IAIA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EAhRA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EAkIA,GAAA,UA/HA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OAQA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAEA,GAAA,SAAA,IAEA,aAAA,SAAA,GAEA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAGA,qBAAA,SAAA,GACA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAMA,GALA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAIA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAEA,KAEA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAEA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAEA,UAAA,WACA,EAAA,cAKA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GA4DA,IAAA,IACA,IAAA,WACA,MAAA,aAAA,eAAA,SAAA,eAEA,cAAA,EAOA,IAJA,OAAA,eAAA,SAAA,iBAAA,GACA,OAAA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WACA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAgBA,GAAA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAyDA,IACA,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,IA+BA,EAAA,UAAA,EACA,EAAA,UAAA,EACA,EAAA,SAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aChSA,SAAA,GAOA,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,YAMA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAKA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAaA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAzCA,GAEA,IAFA,EAAA,iBAEA,EAAA,UA6BA,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,aCpDA,WAmCA,QAAA,KACA,YAAA,SAAA,aAAA,GA/BA,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,GAKA,IAAA,GAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,QAMA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAMA,YAAA,YAQA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YACA,IAEA,SAAA,iBAAA,mBAAA,OC9CA,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,YACA,EAAA,GACA,EAAA,WAAA,GAIA,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,WAKA,QAAA,KAEA,EAAA,EAAA,eACA,IAKA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QAAA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QAAA,GAAA,GACA,EAAA,EAAA,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,GA/TA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAiGA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAEA,IAAA,IAAA,EACA,KAsLA,EAAA,GAAA,kBAAA,GAQA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA8BA,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,gBCvUA,SAAA,GA8EA,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,GAkBA,MAhBA,GAAA,IACA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAEA,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,GAAA,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,EAtYA,IACA,EAAA,OAAA,gBAAA,UAEA,IAAA,GAAA,EAAA,MAIA,EAAA,QAAA,SAAA,iBAMA,GAAA,EAAA,UAAA,IAAA,OAAA,iBAEA,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,iBAwKA,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;EAEA,OAAA,gBCvdA,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,SAEA,IAAA,GAAA,OAAA,UAAA,SAAA,eACA,SAAA,eACA,UACA,GAAA,WAGA,eAAA,OAAA,EAEA,eAAA,UAAA,KAAA,MACA,OAAA,cACA,eAAA,QAAA,eAAA,UAAA,YAAA,WAGA,SAAA,cACA,GAAA,aAAA,sBAAA,SAAA,KAIA,OAAA,cACA,YAAA,qBAAA,SAAA,GACA,eAAA,OAAA,MAAA,EAAA,YAkBA,GAXA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAEA,OADA,GAAA,UAAA,GAAA,GAAA,GACA,IAOA,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,gBC1DA,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,GAIA,QAAA,GAAA,GACA,KAAA,MAAA,OAAA,OAAA,MACA,KAAA,IAAA,OAAA,OAAA,MACA,KAAA,SAAA,EACA,KAAA,MAAA,EAPA,GAAA,GAAA,EAAA,cASA,GAAA,WAIA,YAAA,SAAA,EAAA,GAGA,IAFA,GACA,GAAA,EADA,KAEA,EAAA,KAAA,MAAA,KAAA,IACA,EAAA,GAAA,KAAA,EAAA,GAAA,GACA,EAAA,MAAA,QAAA,EAAA,GAAA,IAAA,EAAA,MAEA,OAAA,IAIA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,GAGA,EAAA,EAAA,KAAA,KAAA,KAAA,IACA,MAAA,MAAA,EAAA,IAGA,MAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,MAGA,KAAA,EACA,MAAA,IAYA,KAAA,GADA,GAAA,EAAA,EAPA,EAAA,WACA,MAAA,GACA,KAMA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IACA,EAAA,KAAA,MAAA,GAEA,IACA,EAAA,KAAA,IAAA,GACA,EAAA,MAAA,EACA,KAAA,MAAA,GAAA,GAGA,EAAA,KAAA,IAGA,UAAA,SAAA,GACA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,IAGA,EAAA,EAAA,UAAA,EAAA,cAAA,EACA,MAAA,IAAA,GAAA,EACA,KAAA,MAAA,KAAA,YAAA,EAAA,GAAA,EAAA,UAEA,IAAA,SAAA,GACA,KAAA,UACA,IAAA,GAAA,GAAA,eAwBA,OAvBA,GAAA,KAAA,MAAA,GAAA,GACA,EAAA,OACA,EAAA,QAAA,EAAA,OAAA,KAAA,UAAA,KAAA,KAAA,GAGA,EAAA,WACA,EAAA,QAAA,WAEA,IAAA,GADA,GAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,IAEA,GAAA,QAAA,MAIA,EAAA,KAAA,SAAA,GACA,EAAA,QACA,EAAA,QAAA,KAAA,GAEA,EAAA,IAIA,IAIA,EAAA,OAAA,GACA,OAAA,UCxGA,SAAA,GAKA,QAAA,KACA,KAAA,OAAA,GAAA,GAAA,KAAA,OAJA,GAAA,GAAA,EAAA,YACA,EAAA,EAAA,MAKA,GAAA,WACA,MAAA,+CAEA,QAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,SAAA,GACA,EAAA,KAAA,QAAA,EAAA,EAAA,KACA,KAAA,KACA,MAAA,OAAA,QAAA,EAAA,EAAA,IAGA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,YACA,EAAA,SAAA,GACA,EAAA,YAAA,EACA,EAAA,GAEA,MAAA,QAAA,EAAA,EAAA,IAGA,QAAA,SAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,EAAA,EADA,EAAA,KAAA,OAAA,YAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAAA,eAAA,EAAA,GAAA,GAAA,GAEA,EAAA,KAAA,QAAA,EAAA,EAAA,GACA,EAAA,EAAA,QAAA,EAAA,QAAA,EAEA,OAAA,IAEA,WAAA,SAAA,EAAA,EAAA,GAGA,QAAA,KACA,IACA,IAAA,GAAA,GACA,IAGA,IAAA,GAAA,GARA,EAAA,EAAA,EAAA,EAAA,OAQA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,YAAA,EAAA,EAAA,IAKA,IAAA,GAAA,GAAA,EAGA,GAAA,cAAA,GAEA,OAAA,UC/DA,WACA,YAIA,SAAA,GAAA,GACA,KAAA,EAAA,YACA,EAAA,EAAA,UAGA,OAAA,kBAAA,GAAA,eAAA,EAAA,KASA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,SAOA,OANA,KACA,EAAA,EAAA,cAEA,EAAA,IACA,EAAA,GAAA,QAEA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAGA,QAAA,GAAA,GACA,MAAA,OAAA,EAAA,GAAA,EAGA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAGA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,IA6BA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,QACA,EACA,EAAA,aAAA,EAAA,IAEA,EAAA,gBAAA,QAIA,GAAA,aAAA,EAAA,EAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAiDA,QAAA,GAAA,GACA,OAAA,EAAA,MACA,IAAA,WACA,MAAA,EACA,KAAA,QACA,IAAA,kBACA,IAAA,aACA,MAAA,QACA,KAAA,QACA,GAAA,eAAA,KAAA,UAAA,WACA,MAAA,QACA,SACA,MAAA,SAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,IAAA,GAAA,GAAA,GAGA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,UAAA,GACA,MAAA,GAAA,EAAA,EAAA,EAAA,IAIA,QAAA,MAEA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,QAAA,KACA,EAAA,SAAA,EAAA,IACA,EAAA,kBACA,GAAA,GAAA,GACA,SAAA,6BANA,GAAA,GAAA,EAAA,EAUA,OAFA,GAAA,iBAAA,EAAA,IAGA,MAAA,WACA,EAAA,oBAAA,EAAA,GACA,EAAA,SAGA,YAAA,GAIA,QAAA,GAAA,GACA,MAAA,SAAA,GAYA,QAAA,GAAA,GACA,GAAA,EAAA,KACA,MAAA,GAAA,EAAA,KAAA,SAAA,SAAA,GACA,MAAA,IAAA,GACA,SAAA,EAAA,SACA,SAAA,EAAA,MACA,EAAA,MAAA,EAAA,MAGA,IAAA,GAAA,EAAA,EACA,KAAA,EACA,QACA,IAAA,GAAA,EAAA,iBACA,6BAAA,EAAA,KAAA,KACA,OAAA,GAAA,EAAA,SAAA,GACA,MAAA,IAAA,IAAA,EAAA,OAKA,QAAA,GAAA,GAIA,UAAA,EAAA,SACA,UAAA,EAAA,MACA,EAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,UAAA,OACA,IAEA,EAAA,YAAA,UAAA,KA4CA,QAAA,GAAA,EAAA,GACA,GACA,GACA,EACA,EAHA,EAAA,EAAA,UAIA,aAAA,oBACA,EAAA,WACA,EAAA,UAAA,QACA,EAAA,EACA,EAAA,EAAA,UAAA,MACA,EAAA,EAAA,OAGA,EAAA,MAAA,EAAA,GAEA,GAAA,EAAA,OAAA,IACA,EAAA,YAAA,SAAA,EAAA,OACA,EAAA,YAAA,iBACA,SAAA,8BAIA,QAAA,GAAA,GACA,MAAA,UAAA,GACA,EAAA,EAAA,IArSA,GAAA,GAAA,MAAA,UAAA,OAAA,KAAA,KAAA,MAAA,UAAA,OAUA,MAAA,UAAA,KAAA,SAAA,EAAA,GACA,QAAA,MAAA,8BAAA,KAAA,EAAA,IAGA,KAAA,UAAA,aAAA,YA+BA,IAAA,GAAA,CAEA,QAAA,eAAA,SAAA,4BACA,IAAA,WACA,MAAA,KAAA,GAEA,IAAA,SAAA,GAEA,MADA,GAAA,EAAA,EAAA,EACA,GAEA,cAAA,IAGA,KAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,gBAAA,EACA,MAAA,MAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,CAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAqBA,QAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,EAAA,EAAA,OAAA,EAMA,IALA,IACA,KAAA,gBAAA,GACA,EAAA,EAAA,MAAA,EAAA,KAGA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,CAIA,OAHA,GAAA,KAAA,EAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,KAEA,EAAA,KAAA,EAAA,GAGA,IAAA,IACA,WAGA,GAAA,GAAA,SAAA,cAAA,OACA,EAAA,EAAA,YAAA,SAAA,cAAA,SACA,GAAA,aAAA,OAAA,WACA,IAAA,GACA,EAAA,CACA,GAAA,iBAAA,QAAA,WACA,IACA,EAAA,GAAA,UAEA,EAAA,iBAAA,SAAA,WACA,IACA,EAAA,GAAA,UAGA,IAAA,GAAA,SAAA,YAAA,aACA,GAAA,eAAA,SAAA,GAAA,EAAA,OAAA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,MACA,EAAA,cAAA,GAGA,EAAA,GAAA,EAAA,SAAA,KAqGA,iBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,GAAA,YAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,MAAA,gBAAA,EACA,IAAA,GAAA,WAAA,EAAA,EAAA,EACA,EAAA,WAAA,EAAA,EAAA,CAEA,IAAA,EACA,MAAA,GAAA,KAAA,EAAA,EAAA,EAGA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAMA,OALA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,GAGA,EAAA,KAAA,EAAA,IAGA,oBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,QAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAGA,OAFA,GAAA,KAAA,QACA,EAAA,KAAA,EAAA,KAAA,QAAA,KACA,EAAA,KAAA,EAAA,IA+BA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,SAEA,EACA,MAAA,GAAA,KAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,QAAA,EAEA,OADA,GAAA,KAAA,EAAA,KAAA,EAAA,QACA,EAAA,KAAA,EAAA,IAGA,kBAAA,UAAA,KAAA,SAAA,EAAA,EAAA,GAIA,GAHA,kBAAA,IACA,EAAA,iBAEA,kBAAA,GAAA,UAAA,EACA,MAAA,aAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAIA,IAFA,KAAA,gBAAA,GAEA,EACA,MAAA,GAAA,KAAA,EAAA,EAEA,IAAA,GAAA,EACA,EAAA,EAAA,KAAA,EAAA,EAKA,OAJA,GAAA,KAAA,EACA,EAAA,KAAA,EAAA,KAAA,KAGA,EAAA,KAAA,EAAA,KAEA,MC/UA,SAAA,GACA,YAEA,SAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBAKA,QAAA,GAAA,GAEA,IADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,CAGA,OAAA,GAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAKA,IAFA,GAAA,GACA,EAAA,IAAA,GACA,IACA,EAAA,EAAA,GAEA,EAAA,cACA,EAAA,EAAA,cAAA,cAAA,GACA,EAAA,iBACA,EAAA,EAAA,eAAA,KAEA,GAAA,EAAA,mBAGA,EAAA,EAAA,gBAGA,OAAA,IAiIA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,8BAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,YAAA,EAAA,SACA,gCAAA,EAAA,aAGA,QAAA,GAAA,GACA,MAAA,SAAA,EAAA,EAAA,UACA,EAAA,aAAA,aAGA,QAAA,GAAA,GAIA,MAHA,UAAA,EAAA,cACA,EAAA,YAAA,YAAA,EAAA,SAAA,EAAA,IAEA,EAAA,YAYA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,EAEA,GAAA,IACA,EAAA,GACA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,QAAA,GAAA,GACA,oBAAA,SAAA,IACA,EAAA,EAAA,SAGA,EAAA,EAAA,GAgBA,QAAA,GAAA,EAAA,GACA,OAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAKA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,sBACA,KAAA,EAAA,CAIA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,uBAAA,EAEA,MAAA,GAGA,QAAA,GAAA,GACA,IAAA,EAAA,iBAAA,CACA,GAAA,GAAA,EAAA,aACA,KAAA,EAAA,iBAAA,CACA,EAAA,iBAAA,EAAA,eAAA,mBAAA,IACA,EAAA,iBAAA,mBAAA,CAIA,IAAA,GAAA,EAAA,iBAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,iBAAA,KAAA,YAAA,GAEA,EAAA,iBAAA,iBAAA,EAAA,iBAGA,EAAA,iBAAA,EAAA,iBAGA,MAAA,GAAA,iBAgBA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,QACA,aAAA,EAAA,MACA,EAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,OAIA,MAAA,GAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,WACA,GAAA,WAAA,aAAA,EAAA,EAIA,KAFA,GAAA,GAAA,EAAA,WACA,EAAA,EAAA,OACA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,KAAA,EAAA,OACA,EAAA,gBAAA,EAAA,MAIA,MADA,GAAA,WAAA,YAAA,GACA,EAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OACA,IAAA,EAEA,WADA,GAAA,YAAA,EAKA,KADA,GAAA,GACA,EAAA,EAAA,YACA,EAAA,YAAA,GA4FA,QAAA,GAAA,GACA,EACA,EAAA,UAAA,oBAAA,UAEA,EAAA,EAAA,oBAAA,WAGA,QAAA,GAAA,GACA,EAAA,cACA,EAAA,YAAA,WACA,EAAA,sBAAA,CACA,IAAA,GAAA,EAAA,EACA,EAAA,WAAA,EAAA,UAAA,eACA,GAAA,EAAA,EAAA,EAAA,UAIA,EAAA,uBACA,EAAA,sBAAA,EACA,SAAA,QAAA,EAAA,cA4MA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,OAAA,CAOA,IAJA,GAAA,GACA,EAAA,EAAA,OACA,EAAA,EAAA,EAAA,EAAA,EAAA,EACA,GAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,EAAA,QAAA,KAAA,GACA,EAAA,EAAA,QAAA,KAAA,GACA,GAAA,EACA,EAAA,IAWA,IATA,GAAA,IACA,EAAA,GAAA,EAAA,KACA,EAAA,EACA,GAAA,EACA,EAAA,MAGA,EAAA,EAAA,EAAA,GAAA,EAAA,QAAA,EAAA,EAAA,GAEA,EAAA,EAAA,CACA,IAAA,EACA,MAEA,GAAA,KAAA,EAAA,MAAA,GACA,OAGA,EAAA,MACA,EAAA,KAAA,EAAA,MAAA,EAAA,GACA,IAAA,GAAA,EAAA,MAAA,EAAA,EAAA,GAAA,MACA,GAAA,KAAA,GACA,EAAA,GAAA,CACA,IAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAGA,GAAA,KADA,MAAA,EACA,KAAA,IAAA,GAEA,MAEA,EAAA,KAAA,GACA,EAAA,EAAA,EAyBA,MAtBA,KAAA,GACA,EAAA,KAAA,IAEA,EAAA,WAAA,IAAA,EAAA,OACA,EAAA,aAAA,EAAA,YACA,IAAA,EAAA,IACA,IAAA,EAAA,GACA,EAAA,YAAA,EAEA,EAAA,WAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,WAAA,EAAA,GAAA,EAAA,GAAA,EACA,UAAA,IACA,GAAA,GACA,GAAA,EAAA,EAAA,GAGA,MAAA,IAGA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,GAAA,aAAA,EACA,OAAA,GAAA,aAAA,EAAA,EAAA,WAAA,GAIA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EACA,IAAA,EAAA,GAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAAA,aAAA,GAGA,MAAA,GAAA,WAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,GACA,GAAA,cAAA,EAAA,EAAA,GAEA,OAAA,GAAA,aAAA,EACA,GAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,EAAA,YACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,WACA,MAAA,GAAA,EAAA,EAAA,EAAA,EAIA,KAAA,GAFA,GAAA,GAAA,kBAEA,EAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAEA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,GAEA,EAAA,YAAA,OALA,CASA,GAAA,GAAA,EAAA,EAAA,EACA,GACA,EAAA,QAAA,EAAA,aAAA,IAEA,EAAA,QAAA,EAAA,IAGA,MAAA,IAAA,mBAAA,EAAA,EAAA,YAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,KAAA,EAAA,EAAA,EAAA,YACA,IAAA,GACA,EAAA,KAAA,GAIA,GADA,EAAA,eACA,EAAA,WAAA,CAGA,EAAA,OAAA,CACA,IAAA,GAAA,EAAA,0BAAA,EACA,IAAA,GACA,EAAA,KAAA,IAGA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,aAAA,EACA,OAAA,GAAA,IAAA,EAAA,OAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,EAMA,KAAA,GAJA,MAIA,EAAA,EAAA,EAAA,EAAA,WAAA,OAAA,IAAA,CAUA,IATA,GAAA,GAAA,EAAA,WAAA,GACA,EAAA,EAAA,KACA,EAAA,EAAA,MAOA,MAAA,EAAA,IACA,EAAA,EAAA,UAAA,EAGA,KAAA,EAAA,IACA,IAAA,GAAA,IAAA,GAAA,IAAA,EADA,CAKA,GAAA,GAAA,EAAA,EAAA,EAAA,EACA,EACA,IAGA,EAAA,KAAA,EAAA,IAaA,MAVA,GAAA,KACA,EAAA,YAAA,EACA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,KAAA,EAAA,EAAA,EAAA,GACA,EAAA,OAAA,EAAA,EAAA,EAAA,IAEA,EAAA,IAAA,EAAA,MAAA,EAAA,SACA,EAAA,KAAA,EAAA,OAAA,EAAA,EAAA,KAGA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,WAAA,KAAA,aACA,MAAA,GAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,UAAA,CACA,GAAA,GAAA,EAAA,EAAA,KAAA,cAAA,EACA,EACA,IAAA,EACA,OAAA,cAAA,GAGA,SAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,EACA,EACA,GAKA,IAAA,GAHA,GAAA,EAAA,YAAA,EAAA,WAAA,GAAA,IAEA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAUA,OAPA,GAAA,aACA,oBAAA,SAAA,EAAA,GACA,GACA,EAAA,aAAA,IAGA,EAAA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,WAEA,KAAA,GADA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,SAAA,KAAA,EAAA,EAAA,EAGA,OAAA,GAOA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAGA,OAFA,KACA,EAAA,EAAA,IAAA,KACA,EAUA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,YAAA,EAKA,OAJA,KACA,EAAA,EAAA,YAAA,GACA,EAAA,EAAA,EAAA,qBAEA,EAGA,GAAA,GAAA,EAAA,WAKA,OAJA,KACA,EAAA,EAAA,YACA,EAAA,EAAA,aAEA,EAeA,QAAA,GAAA,GACA,KAAA,QAAA,EACA,KAAA,iBAAA,EACA,KAAA,aACA,KAAA,KAAA,OACA,KAAA,iBACA,KAAA,aAAA,OACA,KAAA,cAAA,OAr7BA,GAyCA,GAzCA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QA0CA,GAAA,KAAA,kBAAA,GAAA,IAAA,UAAA,QACA,EAAA,EAAA,KAEA,EAAA,WACA,KAAA,QACA,KAAA,WAGA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,GAAA,GACA,KAAA,KAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAEA,KAAA,OAAA,GAAA,GAIA,IAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,MAAA,EAAA,GAGA,MAAA,MAAA,OAAA,IAGA,SAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,QAAA,EACA,OAAA,GAAA,GACA,GAEA,KAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,OAAA,EAAA,IACA,IAGA,QAAA,SAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,KAAA,OAAA,IACA,EAAA,KAAA,GAAA,KAAA,KAAA,OAAA,GAAA,KAAA,KAAA,GAAA,QAyBA,mBAAA,UAAA,WACA,SAAA,UAAA,SAAA,SAAA,GACA,MAAA,KAAA,MAAA,EAAA,aAAA,MACA,EACA,KAAA,gBAAA,SAAA,IAIA,IAAA,GAAA,OACA,EAAA,SACA,EAAA,KAEA,GACA,UAAA,EACA,QAAA,EACA,MAAA,EACA,KAAA,GAGA,GACA,OAAA,EACA,OAAA,EACA,OAAA,EACA,IAAA,EACA,IAAA,EACA,IAAA,EACA,UAAA,EACA,KAAA,EACA,SAAA,EACA,QAAA,EACA,UAAA,GAGA,EAAA,mBAAA,oBACA,KAIA,WACA,GAAA,GAAA,SAAA,cAAA,YACA,EAAA,EAAA,QAAA,cACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,YAAA,EAAA,cAAA,SACA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QACA,EAAA,YAAA,KAIA,IAAA,GAAA,aACA,OAAA,KAAA,GAAA,IAAA,SAAA,GACA,MAAA,GAAA,cAAA,eACA,KAAA,KA2BA,UAAA,iBAAA,mBAAA,WACA,EAAA,UAEA,SAAA,+BACA,GAmBA,IAMA,EAAA,oBAAA,WACA,KAAA,WAAA,wBAIA,IA6GA,GA7GA,EAAA,eA8GA,mBAAA,oBACA,EAAA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,iBAWA,oBAAA,SAAA,SAAA,EAAA,GACA,GAAA,EAAA,qBACA,OAAA,CAEA,IAAA,GAAA,CACA,GAAA,sBAAA,CAEA,IAAA,GAAA,EAAA,IACA,EACA,EAAA,EACA,GAAA,EACA,GAAA,CAgBA,IAdA,IACA,EAAA,IACA,GAAA,GACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,EACA,GAAA,GACA,EAAA,KACA,EAAA,EAAA,GACA,EAAA,sBAAA,EACA,EAAA,KAIA,EAAA,CACA,EAAA,EACA,IAAA,GAAA,EAAA,EACA,GAAA,SAAA,EAAA,yBAeA,MAZA,GAGA,EAAA,aAAA,EACA,EACA,EAAA,EACA,EACA,GACA,GACA,EAAA,EAAA,UAGA,GAOA,oBAAA,UAAA,CAEA,IAAA,GAAA,EAAA,oBAAA,YAEA,GACA,IAAA,WACA,MAAA,MAAA,UAEA,YAAA,EACA,cAAA,EAGA,KAGA,oBAAA,UAAA,OAAA,OAAA,EAAA,WAEA,OAAA,eAAA,oBAAA,UAAA,UACA,IA0BA,EAAA,oBAAA,WACA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,OAAA,EACA,MAAA,SAAA,UAAA,KAAA,KAAA,KAAA,EAAA,EAAA,EAEA,IAAA,GAAA,KACA,EAAA,EAAA,EAAA,EAAA,KAAA,SAAA,GACA,EAAA,aAAA,MAAA,GACA,EAAA,eAKA,OAFA,MAAA,aAAA,MAAA,GACA,KAAA,cACA,EAAA,QAGA,KAAA,UAGA,KAAA,UAAA,IAAA,EAFA,KAAA,WAAA,IAAA,GAKA,IAGA,0BAAA,SAAA,GAIA,MAHA,MAAA,WACA,KAAA,UAAA,YAEA,EAAA,IAAA,EAAA,MAAA,EAAA,QASA,KAAA,YACA,KAAA,UAAA,GAAA,GAAA,OAGA,KAAA,UAAA,mBAAA,EAAA,KAAA,QAEA,GACA,EAAA,QAAA,MAAA,YAAA,EACA,iBAAA,SAGA,KAAA,gBAnBA,KAAA,YACA,KAAA,UAAA,QACA,KAAA,UAAA,UAoBA,eAAA,SAAA,EAAA,EAAA,GACA,EACA,EAAA,KAAA,aAAA,GACA,IACA,EAAA,KAAA,WAEA,KAAA,cACA,KAAA,YAAA,KAAA,KAAA,QACA,IAAA,GAAA,KAAA,WACA,IAAA,OAAA,EAAA,WACA,MAAA,EAEA,IAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,MACA,EAAA,EAAA,wBACA,GAAA,iBAAA,KACA,EAAA,cAAA,EACA,EAAA,aACA,EAAA,YAAA,IASA,KAAA,GARA,GAAA,EAAA,mBACA,UAAA,KACA,SAAA,KACA,MAAA,GAGA,EAAA,EACA,GAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAAA,CAKA,OAAA,EAAA,cACA,GAAA,EAEA,IAAA,GAAA,EAAA,EAAA,EAAA,EACA,EAAA,SAAA,KACA,EACA,EACA,EAAA,UACA,GAAA,kBAAA,EACA,IACA,EAAA,YAAA,GAOA,MAJA,GAAA,UAAA,EAAA,WACA,EAAA,SAAA,EAAA,UACA,EAAA,iBAAA,OACA,EAAA,cAAA,OACA,GAGA,GAAA,SACA,MAAA,MAAA,QAGA,GAAA,OAAA,GACA,KAAA,OAAA,EACA,EAAA,OAGA,GAAA,mBACA,MAAA,MAAA,WAAA,KAAA,UAAA,KAGA,YAAA,WACA,KAAA,WAAA,KAAA,cAAA,KAAA,KAAA,UAGA,KAAA,YAAA,OACA,KAAA,UAAA,eACA,KAAA,UAAA,wBAGA,MAAA,WACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,WAAA,KAAA,UAAA,KACA,KAAA,UAAA,IAAA,QACA,KAAA,YAAA,OACA,KAAA,YAEA,KAAA,UAAA,eACA,KAAA,UAAA,QACA,KAAA,UAAA,SAGA,aAAA,SAAA,GACA,KAAA,UAAA,EACA,KAAA,YAAA,OACA,KAAA,YACA,KAAA,UAAA,2BAAA,OACA,KAAA,UAAA,iBAAA,SAIA,aAAA,SAAA,GAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAAA,EACA,IAAA,kBAAA,GAGA,MAAA,YACA,MAAA,GAAA,MAAA,EAAA,YATA,GAAA,EAaA,OACA,eACA,IAAA,EACA,eAAA,EAAA,kBACA,qBAAA,EAAA,wBACA,+BACA,EAAA,oCAOA,GAAA,iBAAA,GACA,GAAA,KAAA,UACA,KAAA,OAAA,wEAIA,MAAA,aAAA,KAAA,aAAA,KAGA,GAAA,QACA,GAAA,GAAA,EAAA,KAAA,KAAA,aAAA,OAIA,IAHA,IACA,EAAA,KAAA,eAEA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,IACA,OAAA,GAAA,EAAA,IAqQA,IAAA,GAAA,CAqCA,QAAA,eAAA,KAAA,UAAA,oBACA,IAAA,WACA,GAAA,GAAA,KAAA,iBACA,OAAA,GAAA,EACA,KAAA,WAAA,KAAA,WAAA,iBAAA,SAIA,IAAA,GAAA,SAAA,wBACA,GAAA,aACA,EAAA,YAAA,KAYA,EAAA,WACA,UAAA,WACA,GAAA,GAAA,KAAA,IACA,KACA,EAAA,aAAA,GACA,EAAA,QAAA,QACA,EAAA,WAAA,GACA,EAAA,MAAA,UAIA,mBAAA,SAAA,EAAA,GACA,KAAA,WAEA,IAAA,GAAA,KAAA,QACA,EAAA,KAAA,gBAEA,IAAA,EAAA,GAAA,CAMA,GALA,EAAA,OAAA,EACA,EAAA,UAAA,EAAA,GAAA,YACA,EAAA,QAAA,EAAA,EAAA,EAAA,GAAA,EAAA,GAGA,EAAA,YAAA,EAAA,QAEA,WADA,MAAA,qBAIA,GAAA,WACA,EAAA,QAAA,KAAA,KAAA,oBAAA,MAGA,EAAA,QACA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,OAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,OAAA,EAAA,KAEA,EAAA,QAAA,EACA,EAAA,QAAA,EAAA,KAAA,YACA,EAAA,MAAA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,EAAA,SACA,EAAA,MAAA,KAAA,KAAA,oBAAA,MAEA,KAAA,uBAGA,oBAAA,WACA,GAAA,KAAA,KAAA,MAAA,CACA,GAAA,GAAA,KAAA,KAAA,OAGA,IAFA,KAAA,KAAA,YACA,EAAA,EAAA,mBACA,EAEA,WADA,MAAA,eAKA,GAAA,GAAA,KAAA,KAAA,KACA,MAAA,KAAA,UACA,EAAA,EAAA,kBACA,KAAA,KAAA,SACA,GAAA,GACA,IAAA,GAAA,KAAA,KAAA,SACA,KAAA,KAAA,SACA,MAAA,QAAA,EACA,MAAA,aAAA,EAAA,IAGA,aAAA,SAAA,EAAA,GACA,MAAA,QAAA,KACA,MAEA,IAAA,KAAA,gBAGA,KAAA,YACA,KAAA,aAAA,EACA,IACA,KAAA,cAAA,GAAA,eAAA,KAAA,cACA,KAAA,cAAA,KAAA,KAAA,cAAA,OAGA,KAAA,cAAA,cAAA,iBAAA,KAAA,aACA,KAAA,kBAGA,oBAAA,SAAA,GACA,GAAA,IAAA,EACA,MAAA,MAAA,gBACA,IAAA,GAAA,KAAA,UAAA,GACA,EAAA,EAAA,WACA,KAAA,EACA,MAAA,MAAA,oBAAA,EAAA,EAEA,IAAA,EAAA,WAAA,KAAA,cACA,KAAA,mBAAA,EACA,MAAA,EAGA,IAAA,GAAA,EAAA,SACA,OAAA,GAGA,EAAA,sBAFA,GAKA,oBAAA,WACA,MAAA,MAAA,oBAAA,KAAA,UAAA,OAAA,IAGA,iBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,iBAAA,UACA,MAAA,UAAA,OAAA,EAAA,EAAA,GAEA,EAAA,aAAA,EAAA,EAAA,cAGA,kBAAA,SAAA,GAMA,IALA,GAAA,GAAA,KAAA,oBAAA,EAAA,GACA,EAAA,KAAA,oBAAA,GACA,EAAA,KAAA,iBAAA,WACA,EAAA,KAAA,UAAA,OAAA,EAAA,GAAA,GAEA,IAAA,GAAA,CACA,GAAA,GAAA,EAAA,WACA,IAAA,IACA,EAAA,GAEA,EAAA,YAAA,EAAA,YAAA,IAGA,MAAA,IAGA,cAAA,SAAA,GAEA,MADA,GAAA,GAAA,EAAA,KAAA,kBACA,kBAAA,GAAA,EAAA,MAGA,cAAA,SAAA,GACA,IAAA,KAAA,QAAA,EAAA,OAAA,CAGA,GAAA,GAAA,KAAA,gBAEA,KAAA,EAAA,WAEA,WADA,MAAA,OAIA,eAAA,aAAA,KAAA,cAAA,KAAA,aACA,EAEA,IAAA,GAAA,EAAA,SACA,UAAA,KAAA,mBACA,KAAA,iBACA,KAAA,cAAA,GAAA,EAAA,uBAGA,SAAA,KAAA,6BACA,KAAA,2BACA,KAAA,cAAA,GACA,EAAA,gCAMA,KAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAGA,IAAA,GAFA,GAAA,EAAA,GACA,EAAA,EAAA,QACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,KAAA,kBAAA,EAAA,MAAA,EACA,KAAA,GACA,EAAA,IAAA,EAAA,GAIA,GAAA,EAAA,WAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAGA,IAFA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,WAAA,IAAA,CACA,GAAA,GAAA,KAAA,cAAA,GACA,EAAA,EAAA,IAAA,EACA,GACA,EAAA,OAAA,IAEA,KAAA,mBACA,EAAA,KAAA,iBAAA,IAIA,EADA,SAAA,EACA,EAEA,EAAA,eAAA,EAAA,OAAA,IAIA,KAAA,iBAAA,EAAA,GAIA,EAAA,QAAA,SAAA,GACA,KAAA,sBAAA,IACA,MAEA,KAAA,4BACA,KAAA,qBAAA,KAGA,oBAAA,SAAA,GACA,GAAA,GAAA,KAAA,UAAA,EACA,KAAA,GAGA,KAAA,2BAAA,EAAA,kBAAA,IAGA,qBAAA,SAAA,GAGA,IAAA,GAFA,GAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,EACA,KAAA,EAAA,EAAA,OACA,KAAA,oBAAA,GACA,QAGA,GAAA,EAAA,KAGA,MAAA,EAAA,EAAA,MAAA,EAAA,YACA,KAAA,oBAAA,GACA,GAGA,IAAA,EAAA,WAAA,EAAA,QAAA,OAGA,GAAA,GAAA,EAIA,IADA,GAAA,GAAA,KAAA,UAAA,OACA,EAAA,GACA,KAAA,oBAAA,GACA,KAIA,sBAAA,SAAA,GAEA,IAAA,GADA,GAAA,EAAA,UACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAIA,UAAA,WACA,KAAA,gBAGA,KAAA,cAAA,QACA,KAAA,cAAA,SAGA,MAAA,WACA,IAAA,KAAA,OAAA,CAEA,KAAA,WACA,KAAA,GAAA,GAAA,EAAA,EAAA,KAAA,UAAA,OAAA,IACA,KAAA,sBAAA,KAAA,UAAA,GAGA,MAAA,UAAA,OAAA,EACA,KAAA,YACA,KAAA,iBAAA,UAAA,OACA,KAAA,QAAA,KAKA,oBAAA,qBAAA,GACA,MChuCA,SAAA,GAUA,QAAA,KACA,IACA,GAAA,EACA,EAAA,eAAA,WACA,GAAA,EACA,SAAA,MAAA,QAAA,MAAA,oBACA,EAAA,6BACA,SAAA,MAAA,QAAA,cAdA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,oEACA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,WAGA,IAAA,EAeA,IAAA,SAAA,iBAQA,EAAA,iBARA,CACA,GAAA,GAAA,GACA,QAAA,iBAAA,qBAAA,WACA,IACA,EAAA,UAAA,YAAA,EAAA,KAOA,GAAA,OAAA,iBAAA,eAAA,UAAA,CACA,GAAA,GAAA,SAAA,UAAA,UACA,UAAA,UAAA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,KAAA,KAAA,EAAA,EAEA,OADA,gBAAA,WAAA,GACA,GAKA,EAAA,MAAA,GAEA,OAAA","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // 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    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function isNaN(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 ident = identStart + '+' + identPart + '*';\n  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';\n  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';\n  var path = '(?:' + identOrElementIndex + ')(?:\\\\s*\\\\.\\\\s*' + identOrElementIndex + ')*';\n  var pathRegExp = new RegExp('^' + path + '$');\n\n  function isPathValid(s) {\n    if (typeof s != 'string')\n      return false;\n    s = s.trim();\n\n    if (s == '')\n      return true;\n\n    if (s[0] == '.')\n      return false;\n\n    return pathRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(s, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (s.trim() == '')\n      return this;\n\n    if (isIndex(s)) {\n      this.push(s);\n      return this;\n    }\n\n    s.split(/\\s*\\.\\s*/).filter(function(part) {\n      return part;\n    }).forEach(function(part) {\n      this.push(part);\n    }, this);\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)\n      pathString = '';\n\n    if (typeof pathString !== 'string')\n      pathString = String(pathString);\n\n    var path = pathCache[pathString];\n    if (path)\n      return path;\n    if (!isPathValid(pathString))\n      return invalidPath;\n    var path = new Path(pathString, constructorIsPrivate);\n    pathCache[pathString] = path;\n    return path;\n  }\n\n  Path.get = getPath;\n\n  Path.prototype = createObject({\n    __proto__: [],\n    valid: true,\n\n    toString: function() {\n      return this.join('.');\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 accessors = this.map(function(ident) {\n        return isIndex(ident) ? '[\"' + ident + '\"]' : '.' + ident;\n      });\n\n      var str = '';\n      var pathString = 'obj';\n      str += 'if (obj != null';\n      var i = 0;\n      for (; i < (this.length - 1); i++) {\n        var ident = this[i];\n        pathString += accessors[i];\n        str += ' &&\\n     ' + pathString + ' != null';\n      }\n      str += ')\\n';\n\n      pathString += accessors[i];\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 (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.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    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]);\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 var updateRecord = {\n    object: undefined,\n    type: 'update',\n    name: undefined,\n    oldValue: undefined\n  };\n\n  function notify(object, name, value, oldValue) {\n    if (areSameValue(value, oldValue))\n      return;\n\n    // TODO(rafaelw): Hack hack hack. This entire code really needs to move\n    // out of observe-js into polymer.\n    if (typeof object.propertyChanged_ == 'function')\n      object.propertyChanged_(name, value, oldValue);\n\n    if (!hasObserve)\n      return;\n\n    var notifier = object.notifier_;\n    if (!notifier)\n      notifier = object.notifier_ = Object.getNotifier(object);\n\n    updateRecord.object = object;\n    updateRecord.name = name;\n    updateRecord.oldValue = oldValue;\n\n    notifier.notify(updateRecord);\n  }\n\n  Observer.createBindablePrototypeAccessor = function(proto, name) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    proto[privateName] = proto[name];\n\n    Object.defineProperty(proto, name, {\n      get: function() {\n        var observable = this[privateObservable];\n        if (observable)\n          observable.deliver();\n\n        return this[privateName];\n      },\n      set: function(value) {\n        var observable = this[privateObservable];\n        if (observable) {\n          observable.setValue(value);\n          return;\n        }\n\n        var oldValue = this[privateName];\n        this[privateName] = value;\n        notify(this, name, value, oldValue);\n\n        return value;\n      },\n      configurable: true\n    });\n  }\n\n  Observer.bindToInstance = function(instance, name, observable, resolveFn) {\n    var privateName = name + '_';\n    var privateObservable  = name + 'Observable_';\n\n    instance[privateObservable] = observable;\n    var oldValue = instance[privateName];\n    var value = observable.open(function(value, oldValue) {\n      instance[privateName] = value;\n      notify(instance, name, value, oldValue);\n    });\n\n    if (resolveFn && !areSameValue(oldValue, value)) {\n      var resolvedValue = resolveFn(oldValue, value);\n      if (!areSameValue(value, resolvedValue)) {\n        value = resolvedValue;\n        if (observable.setValue)\n          observable.setValue(value);\n      }\n    }\n\n    instance[privateName] = value;\n    notify(instance, name, value, oldValue);\n\n    return {\n      close: function() {\n        observable.close();\n        instance[privateObservable] = undefined;\n      }\n    };\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","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\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    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  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\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.polymerWrapper_ ||\n        (impl.polymerWrapper_ = 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.impl;\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.polymerWrapper_ = 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.impl[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.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 (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    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    for (var i = 0; i < listeners.length; 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    if (anyRemoved) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\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 nodeList = new wrappers.NodeList();\n      var eventPath = eventPathTable.get(this);\n      if (eventPath) {\n        var index = 0;\n        var lastIndex = eventPath.length - 1;\n        var baseRoot = getTreeScope(currentTargetTable.get(this));\n\n        for (var i = 0; i <= lastIndex; i++) {\n          var currentTarget = eventPath[i];\n          var currentRoot = getTreeScope(currentTarget);\n          if (currentRoot.contains(baseRoot) &&\n              // Make sure we do not add Window to the path.\n              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {\n            nodeList[index++] = currentTarget;\n          }\n        }\n        nodeList.length = index;\n      }\n      return nodeList;\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        this.impl = type;\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 this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.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    this.impl = impl;\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        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 = wrap(originalElementFromPoint.call(document.impl, x, y));\n    if (!element)\n      return null;\n    var path = getEventPath(element, null);\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 unwrap = scope.unwrap;\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    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.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 this.impl[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(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(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 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(this.impl[name].apply(this.impl, 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 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, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, 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(this.impl, 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 : this.impl;\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(this.impl, 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(this.impl, 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(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.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 this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.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(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanUpNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\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 matchesLocalName(el, 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, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\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  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\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\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\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\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 this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.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 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 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 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  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      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\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  /**\n   * Useful for generating the accessor pair for a property that reflects an\n   * attribute.\n   */\n  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {\n    var attrName = opt_attrName || propertyName;\n    Object.defineProperty(prototype, propertyName, {\n      get: function() {\n        return this.impl[propertyName];\n      },\n      set: function(v) {\n        this.impl[propertyName] = v;\n        invalidateRendererBasedOnAttribute(this, attrName);\n      },\n      configurable: true,\n      enumerable: true\n    });\n  }\n\n  setterDirtiesAttribute(Element.prototype, 'id');\n  setterDirtiesAttribute(Element.prototype, 'className', 'class');\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  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings\n  // that reflect attributes.\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 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        this.impl.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\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 this.impl[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        this.impl[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 this.impl[name].apply(this.impl, 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 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 = this.impl.getContext.apply(this.impl, 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    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","// 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\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 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    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.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  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  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    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 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  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 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(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.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(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.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 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    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, 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 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    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, 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 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    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.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 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(hostWrapper.impl.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    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 unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.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  var selectorStartCharRe = /^[*.#[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 = this.impl.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    this.impl.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 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    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.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 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(this.impl, 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(doc.impl, 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, this.impl);\n    },\n    getSelection: function() {\n      renderAllPending();\n      return new Selection(originalGetSelection.call(unwrap(this)));\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        this.impl = node;\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    '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    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, 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 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  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.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  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  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\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() {\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","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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.convertCombinators(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 ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[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)) {\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 if (rule.cssText) {\n          cssText += rule.cssText + '\\n\\n';\n        }\n      }, this);\n    }\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]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\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    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//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 = style.sheet.cssRules;\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 = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\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            head.appendChild(style);\n          }\n        }\n        style.__importParsed = true;\n        this.markParsingComplete(elt);\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  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\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// 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// mixin\n\n// copy all properties from inProps (et al) to inObj\nfunction 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\nfunction 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\nfunction 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// export\n\nscope.mixin = mixin;\n\n})(window.Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  'use strict';\n\n  // polyfill 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  // 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  // 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  // 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    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\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// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\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  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\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  scope.module = 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\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\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, 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'];\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})(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 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 */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\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\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource) {\n          this.receive(url, elt, err, resource);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource) {\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 (!err) {\n          this.onload(url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, url);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 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\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so, each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n    this.parseNext();\n  },\n  parseImport: function(elt) {\n    elt.import.__importParsed = true;\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    // fire load event\n    if (elt.__resource) {\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.markParsingComplete(elt);\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\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    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    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    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\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\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\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      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\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\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 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(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (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// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\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 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 */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 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\n/**\n * Implements `document.register`\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// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399\n// we'll address this by defaulting to CE polyfill in the presence of the SD\n// polyfill. This will avoid spamming excess attached/detached callbacks.\n// If there is a compelling need to run CE native with SD polyfill,\n// we'll need to fix this issue.\nvar useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;\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    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\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    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 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\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 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\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  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\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    // 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  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\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  var endOfMicrotask = scope.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})(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\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})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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();\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    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may\n    // make sense to issue a warning or even throw if the template is already\n    // \"activated\", since this would be a strange thing to do.\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      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, 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      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\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      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\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\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"]}
\ No newline at end of file
+{"version":3,"file":"platform.js","sources":["build/boot.js","../WeakMap/weakmap.js","../observe-js/src/observe.js","../ShadowDOM/src/wrappers.js","build/if-poly.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/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/ShadowRoot.js","../ShadowDOM/src/ShadowRenderer.js","../ShadowDOM/src/wrappers/generic.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/override-constructors.js","src/patches-shadowdom-polyfill.js","src/ShadowCSS.js","src/patches-shadowdom-native.js","../URL/url.js","src/dom.js","src/url.js","../MutationObservers/MutationObserver.js","src/template.js","src/inspector.js","src/unresolved.js","src/module.js","src/microtask.js","../HTMLImports/src/scope.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/loader.js","../NodeBind/src/NodeBind.js","src/styleloader.js","../TemplateBinding/src/TemplateBinding.js","src/patches-mdv.js"],"names":[],"mappings":";;;;;;;;;;;AAUA,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,iBAIA,EAAA,QAAA,SAAA,iBAAA,UAAA,OAAA,GACA,QAAA,KAAA,mIAOA,EAAA,WAEA,OAAA,eAAA,OAAA,iBAAA,UACA,OAAA,eAAA,MAAA,SAAA,EAAA,UAIA,EAAA,UACA,OAAA,YAAA,OAAA,cAAA,UACA,OAAA,YAAA,MAAA,QAAA,EAAA,SC/DA,EAAA,MAAA,GACA,UAWA,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,KACA,IAAA,EAAA,KAAA,EACA,EAAA,GAAA,EAEA,EAAA,EAAA,KAAA,MAAA,OAAA,EAAA,GAAA,UAAA,KAGA,IAAA,SAAA,GACA,GAAA,EACA,QAAA,EAAA,EAAA,KAAA,QAAA,EAAA,KAAA,ECnCA,EAAA,GAAA,QAEA,SAAA,SAAA,GACA,KAAA,IAAA,EAAA,UAIA,OAAA,QAAA,KAsBA,SACA,QACA,YAGA,SAAA,uBAUA,QAAA,GAAA,GACA,EAAA,EAVA,GAAA,kBAAA,QAAA,SACA,kBAAA,OAAA,QACA,OAAA,CAIA,IAAA,MAOA,KACA,IAcA,OAbA,QAAA,QAAA,EAAA,GAEA,MAAA,QAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,GAAA,QACA,GAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,OAAA,EAEA,OAAA,qBAAA,GACA,IAAA,EAAA,QACA,EAGA,OAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,UAAA,EAAA,GAAA,MACA,GAKA,OAAA,UAAA,EAAA,GACA,MAAA,UAAA,EAAA,IAGA,GAMA,QAAA,cAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QAEA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,GAAA,eAEA,OAAA,KACA,MAAA,GAEA,OAAA,GAMA,QAAA,SAAA,GACA,OAAA,IAAA,IAAA,EAGA,QAAA,UAAA,GACA,OAAA,EAIA,QAAA,UAAA,GACA,MAAA,KAAA,OAAA,GAUA,QAAA,cAAA,EAAA,GACA,MAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EAAA,EACA,YAAA,IAAA,YAAA,IACA,EAGA,IAAA,GAAA,IAAA,EA0BA,QAAA,iBAAA,GACA,GAAA,SAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,WAAA,EAEA,QAAA,GAEA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IACA,IAAA,IAEA,MAAA,EAEA,KAAA,IACA,IAAA,IAEA,MAAA,OAEA,KAAA,IACA,IAAA,GACA,IAAA,IACA,IAAA,IACA,IAAA,KACA,IAAA,OACA,IAAA,MAEA,IAAA,MACA,MAAA,KAIA,MAAA,IAAA,IAAA,KAAA,GAAA,GAAA,IAAA,IAAA,EACA,QAIA,GAAA,IAAA,IAAA,EACA,SAGA,OAyFA,QAAA,SAEA,QAAA,WAAA,GA8BA,QAAA,KAEA,KAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EAAA,EACA,OAAA,iBAAA,GAAA,KAAA,GAEA,iBAAA,GAAA,KAAA,GACA,IACA,EAAA,EAEA,EAAA,UACA,GAPA,QAaA,IAhDA,GAGA,GAAA,EAAA,EAAA,EAAA,EAAA,EAAA,EAHA,KAEA,EAAA,GACA,EAAA,aAGA,GACA,KAAA,WAEA,SAAA,IAGA,EAAA,KAAA,GAEA,EAAA,SAIA,OAAA,WACA,SAAA,EAEA,EAAA,EAGA,GAAA,IAwBA,GAIA,GAHA,IACA,EAAA,EAAA,GAEA,MAAA,IAAA,EAAA,GAAA,CASA,GALA,EAAA,gBAAA,GACA,EAAA,iBAAA,GACA,EAAA,EAAA,IAAA,EAAA,SAAA,QAGA,SAAA,EACA,MAOA,IALA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,KAAA,KACA,EAAA,SAAA,EAAA,GAAA,EAAA,EAAA,GACA,IAEA,cAAA,EAEA,MAAA,IAQA,QAAA,SAAA,GACA,MAAA,aAAA,KAAA,GAMA,QAAA,MAAA,EAAA,GACA,GAAA,IAAA,qBACA,KAAA,OAAA,wCAEA,GAAA,QACA,MAAA,UAAA,KAAA,MAAA,KAAA,EAAA,SAGA,SAAA,KAAA,SACA,KAAA,aAAA,KAAA,0BAOA,QAAA,SAAA,GACA,GAAA,YAAA,MACA,MAAA,EAOA,KAJA,MAAA,GAAA,GAAA,EAAA,UAEA,EAAA,IAEA,gBAAA,GAAA,CAEA,GAAA,QAAA,EAAA,QAEA,MAAA,IAAA,MAAA,EAAA,qBAIA,GAAA,OAAA,GAIA,GAAA,GAAA,UAAA,EACA,IAAA,EAEA,MAAA,EAEA,IAAA,GAAA,UAAA,EACA,KAAA,EAEA,MAAA,YAEA,IAAA,GAAA,GAAA,MAAA,EAAA,qBAIA,OAFA,WAAA,GAAA,EAEA,EAKA,QAAA,gBAAA,GACA,MAAA,SAAA,GAEA,IAAA,EAAA,IAGA,KAAA,EAAA,QAAA,KAAA,OAAA,KA0GA,QAAA,YAAA,GAEA,IADA,GAAA,GAAA,EACA,uBAAA,GAAA,EAAA,UACA,GAKA,OAHA,QAAA,0BACA,OAAA,qBAAA,GAEA,EAAA,EAGA,QAAA,eAAA,GACA,IAAA,GAAA,KAAA,GACA,OAAA,CACA,QAAA,EAGA,QAAA,aAAA,GACA,MAAA,eAAA,EAAA,QACA,cAAA,EAAA,UACA,cAAA,EAAA,SAIA,QAAA,yBAAA,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,QASA,IAAA,GAAA,KAAA,GACA,IAAA,KAGA,EAAA,GAAA,EAAA,GAQA,OAHA,OAAA,QAAA,IAAA,EAAA,SAAA,EAAA,SACA,EAAA,OAAA,EAAA,SAGA,MAAA,EAEA,QAAA,EACA,QAAA,GAOA,QAAA,eACA,IAAA,SAAA,OACA,OAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,SAAA,OAAA,IAEA,SAAA,IAGA,OADA,UAAA,OAAA,GACA,EAgCA,QAAA,qBAOA,QAAA,GAAA,GACA,GAAA,EAAA,SAAA,SAAA,GACA,EAAA,OAAA,GARA,GAAA,GACA,EACA,GAAA,EACA,GAAA,CAQA,QACA,KAAA,SAAA,GACA,GAAA,EAEA,KAAA,OAAA,wBAEA,IACA,OAAA,qBAAA,GAGA,EAAA,EACA,GAAA,GAEA,QAAA,SAAA,EAAA,GACA,EAAA,EACA,EAEA,MAAA,QAAA,EAAA,GAGA,OAAA,QAAA,EAAA,IAGA,QAAA,SAAA,GACA,EAAA,EACA,OAAA,qBAAA,GACA,GAAA,GAEA,MAAA,WACA,EAAA,OAEA,OAAA,UAAA,EAAA,GACA,oBAAA,KAAA,QAiCA,QAAA,mBAAA,EAAA,EAAA,GACA,GAAA,GAAA,oBAAA,OAAA,mBAGA,OAFA,GAAA,KAAA,GACA,EAAA,QAAA,EAAA,GACA,EAOA,QAAA,kBAQA,QAAA,GAAA,EAAA,GACA,IAIA,IAAA,IACA,EAAA,IAAA,GAEA,EAAA,QAAA,GAAA,IACA,EAAA,KAAA,GAEA,OAAA,QAAA,EAAA,IAIA,EAAA,OAAA,eAAA,GAAA,IAIA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,SAAA,GAEA,EAAA,EAAA,OACA,iBAAA,EAAA,KAEA,OAAA,EAIA,OAAA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,GAAA,CAIA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,gBAAA,EAKA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,GAEA,EAAA,QAAA,QACA,EAAA,UA7DA,GAIA,GACA,EALA,EAAA,EAEA,KACA,KAkEA,GACA,OAAA,OACA,QAAA,EACA,KAAA,SAAA,EAAA,GAEA,IACA,EAAA,EACA,MAIA,EAAA,KAAA,GAEA,IACA,EAAA,gBAAA,IAEA,MAAA,WAGA,GAFA,MAEA,EAAA,GAAA,CAMA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,OAAA,UAAA,EAAA,GAAA,GACA,SAAA,iBAIA,GAAA,OAAA,EACA,EAAA,OAAA,EACA,EAAA,OACA,EAAA,OACA,iBAAA,KAAA,QAOA,OAAA,GAKA,QAAA,gBAAA,EAAA,GAQA,MAPA,kBAAA,gBAAA,SAAA,IAEA,gBAAA,iBAAA,OAAA,iBAEA,gBAAA,OAAA,GAEA,gBAAA,KAAA,EAAA,GACA,gBAWA,QAAA,YACA,KAAA,OAAA,SAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,gBAAA,OACA,KAAA,OAAA,OACA,KAAA,IAAA,iBA0EA,QAAA,UAAA,GACA,SAAA,qBACA,kBAKA,aAAA,KAAA,GAIA,QAAA,iBACA,SAAA,qBAoFA,QAAA,gBAAA,GACA,SAAA,KAAA,MACA,KAAA,OAAA,EACA,KAAA,WAAA,OA6GA,QAAA,eAAA,GACA,IAAA,MAAA,QAAA,GACA,KAAA,OAAA,kCACA,gBAAA,KAAA,KAAA,GAwDA,QAAA,cAAA,EAAA,GACA,SAAA,KAAA,MAEA,KAAA,QAAA,EACA,KAAA,MAAA,QAAA,GAEA,KAAA,gBAAA,OA0DA,QAAA,kBAAA,GACA,SAAA,KAAA,MAEA,KAAA,qBAAA,EACA,KAAA,UACA,KAAA,gBAAA,OAEA,KAAA,aA+IA,QAAA,SAAA,GAAA,MAAA,GAGA,QAAA,mBAAA,EAAA,EAAA,EACA,GAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,EAEA,KAAA,YAAA,GAAA,QACA,KAAA,YAAA,GAAA,QAIA,KAAA,oBAAA,EAgEA,QAAA,6BAAA,EAAA,EAAA,GAKA,IAAA,GAHA,MACA,KAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,qBAAA,EAAA,OAQA,EAAA,OAAA,KAEA,EAAA,EAAA,MAAA,EAAA,UAEA,UAAA,EAAA,OAKA,OAAA,EAAA,KAYA,EAAA,OAAA,UACA,GAAA,EAAA,YAEA,GAAA,EAAA,OAEA,EAAA,EAAA,OAAA,EAhBA,EAAA,OAAA,SACA,GAAA,EAAA,MAEA,EAAA,EAAA,OAAA,KAnBA,QAAA,MAAA,8BAAA,EAAA,MACA,QAAA,MAAA,IAmCA,IAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAEA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,MAEA,IAAA,KACA,KAAA,GAAA,KAAA,GAEA,KAAA,IAAA,IAAA,IAAA,IAAA,CAKA,GAAA,GAAA,EAAA,EAEA,GAAA,KAAA,IACA,EAAA,GAAA,GAIA,OAEA,MAAA,EACA,QAAA,EACA,QAAA,GAMA,QAAA,WAAA,EAAA,EAAA,GACA,OAEA,MAAA,EAEA,QAAA,EACA,WAAA,GAWA,QAAA,gBC55CA,QAAA,aAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,MAAA,aAAA,YAAA,EAAA,EAAA,EACA,EAAA,EAAA,GAIA,QAAA,WAAA,EAAA,EAAA,EAAA,GAEA,MAAA,GAAA,GAAA,EAAA,EACA,GAIA,GAAA,GAAA,GAAA,EACA,EAGA,EAAA,EACA,EAAA,EACA,EAAA,EAGA,EAAA,EAGA,EAAA,EACA,EAAA,EAEA,EAAA,EAKA,QAAA,aAAA,EAAA,EAAA,EAAA,GASA,IAAA,GAPA,GAAA,UAAA,EAAA,EAAA,GAGA,GAAA,EAEA,EAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EAGA,IAFA,EAAA,OAAA,GAEA,EAAA,CAIA,GAAA,GAAA,UAAA,EAAA,MACA,EAAA,MAAA,EAAA,QAAA,OACA,EAAA,MAEA,EAAA,MAAA,EAAA,WAEA,IAAA,GAAA,EAAA,CAGA,EAAA,OAAA,EAAA,GACA,IAGA,GAAA,EAAA,WAAA,EAAA,QAAA,OAEA,EAAA,YAAA,EAAA,WAAA,CAEA,IAAA,GAAA,EAAA,QAAA,OACA,EAAA,QAAA,OAAA,CAGA,IAAA,EAAA,YAAA,EAGA,CACA,GAAA,GAAA,EAAA,OAGA,IAAA,EAAA,MAAA,EAAA,MAAA,CAGA,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,GAIA,EAAA,QAAA,EACA,EAAA,MAAA,EAAA,QACA,EAAA,MAAA,EAAA,WAtBA,IAAA,MAyBA,IAAA,EAAA,MAAA,EAAA,MAAA,CAIA,GAAA,EAEA,EAAA,OAAA,EAAA,EAAA,GACA,GAEA,IAAA,GAAA,EAAA,WAAA,EAAA,QAAA,MACA,GAAA,OAAA,EACA,GAAA,IAIA,GAEA,EAAA,KAAA,GAGA,QAAA,sBAAA,EAAA,GAGA,IAAA,GAFA,MAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,EAAA,MAEA,IAAA,SACA,YAAA,EAAA,EAAA,MAAA,EAAA,QAAA,QAAA,EAAA,WACA,MACA,KAAA,MAEA,IAAA,SACA,IAAA,SACA,IAAA,QAAA,EAAA,MACA,QACA,IAAA,GAAA,SAAA,EAAA,KACA,IAAA,EAAA,EACA,QACA,aAAA,EAAA,GAAA,EAAA,UAAA,EACA,MACA,SACA,QAAA,MAAA,2BAAA,KAAA,UAAA,KAMA,MAAA,GAGA,QAAA,qBAAA,EAAA,GAEA,GAAA,KAeA,OAbA,sBAAA,EAAA,GAAA,QAAA,SAAA,GACA,MAAA,IAAA,EAAA,YAAA,GAAA,EAAA,QAAA,YACA,EAAA,QAAA,KAAA,EAAA,EAAA,QACA,EAAA,KAAA,SAMA,EAAA,EAAA,OAAA,YAAA,EAAA,EAAA,MAAA,EAAA,MAAA,EAAA,WACA,EAAA,QAAA,EAAA,EAAA,QAAA,YAGA,ED5QA,GAAA,YAAA,sBAqBA,QAAA,aAgBA,YAAA,OAAA,OAAA,OAAA,SAAA,GAEA,MAAA,gBAAA,IAAA,OAAA,MAAA,IAeA,aAAA,gBACA,SAAA,GAAA,MAAA,IACA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,KAAA,EACA,MAAA,EACA,IAAA,GAAA,OAAA,OAAA,EAMA,OALA,QAAA,oBAAA,GAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EACA,OAAA,yBAAA,EAAA,MAGA,GAIA,WAAA,aACA,UAAA,gBAEA,YAAA,GAAA,QAAA,IAAA,WAAA,IAAA,UAAA,MAkDA,kBACA,YAEA,IAAA,cACA,OAAA,UAAA,UACA,KAAA,iBACA,KAAA,cAIA,QACA,IAAA,UACA,KAAA,eACA,KAAA,iBAEA,KAAA,cAGA,aACA,IAAA,eAEA,OAAA,UAAA,WAIA,SACA,OAAA,UAAA,UAEA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,SAAA,QACA,KAAA,cAAA,QAEA,KAAA,gBAAA,QACA,KAAA,YAAA,SAIA,eACA,IAAA,iBACA,GAAA,YAAA,UACA,QAAA,UAAA,UACA,KAAA,gBAAA,SAAA,IACA,KAAA,gBAAA,SAAA,KAIA,WAEA,IAAA,eAAA,QACA,KAAA,SAAA,SAGA,SACA,GAAA,UAAA,UACA,QAAA,UAAA,UACA,IAAA,gBACA,KAAA,SAAA,SAIA,eAEA,KAAA,gBACA,KAAA,SAEA,QAAA,gBAAA,WAIA,eACA,KAAA,gBAEA,KAAA,SACA,QAAA,gBAAA,WAIA,cACA,IAAA,gBACA,KAAA,SAAA,UA8FA,wBAgBA,YAwCA,MAAA,IAAA,QAYA,KAAA,UAAA,cAEA,aACA,OAAA,EAEA,SAAA,WAGA,IAAA,GAFA,GAAA,GAEA,EAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,GAAA,KAAA,EAEA,IADA,QAAA,GACA,EAAA,IAAA,EAAA,EAGA,eAAA,GAMA,MAAA,IAIA,aAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CACA,GAAA,MAAA,EAEA,MACA,GAAA,EAAA,KAAA,IAGA,MAAA,IAIA,eAAA,SAAA,EAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,KAAA,OAAA,IAAA,CAGA,GAFA,IACA,EAAA,EAAA,KAAA,EAAA,MACA,SAAA,GACA,MACA,GAAA,EAAA,KAAA,MAKA,uBAAA,WAEA,GAAA,GAAA,GACA,EAAA,KACA,IAAA,iBAGA,KAFA,GACA,GADA,EAAA,EAEA,EAAA,KAAA,OAAA,EAAA,IAEA,EAAA,KAAA,GACA,GAAA,QAAA,GAAA,IAAA,EAAA,eAAA,GACA,GAAA,aAAA,EAAA,UAGA,IAAA,KAEA,IAAA,GAAA,KAAA,EAKA,OAHA,IAAA,QAAA,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,SAAA,GACA,OAAA,CAEA,GAAA,EAAA,KAAA,IAIA,MAAA,UAAA,IAIA,EAAA,KAAA,IAAA,GACA,IAJA,IASA,IAAA,aAAA,GAAA,MAAA,GAAA,qBACA,aAAA,OAAA,EACA,YAAA,aAAA,YAAA,aAAA,YAGA,IAAA,wBAAA,IAsEA,YAcA,OAAA,WAAA,WACA,GAAA,IAAA,UAAA,GACA,GAAA,CASA,OAPA,QAAA,QAAA,EAAA,WAEA,cACA,GAAA,IAIA,SAAA,GACA,SAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,UAAA,EAAA,cAKA,WACA,MAAA,UAAA,GACA,SAAA,KAAA,OAKA,uBAuFA,oBAsHA,gBAaA,SAAA,EACA,OAAA,EACA,OAAA,EAEA,UAAA,EAEA,eAAA,CAaA,UAAA,WACA,KAAA,SAAA,EAAA,GAEA,GAAA,KAAA,QAAA,SACA,KAAA,OAAA,oCAQA,OALA,UAAA,MACA,KAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,WACA,KAAA,OAAA,OACA,KAAA,QAIA,MAAA,WAEA,KAAA,QAAA,SAGA,cAAA,MACA,KAAA,cACA,KAAA,OAAA,OACA,KAAA,UAAA,OACA,KAAA,QAAA,OAEA,KAAA,OAAA,SAIA,QAAA,WACA,KAAA,QAAA,QAGA,WAAA,OAIA,QAAA,SAAA,GACA,IACA,KAAA,UAAA,MAAA,KAAA,QAAA,GAEA,MAAA,GACA,SAAA,4BAAA,EACA,QAAA,MAAA,+CAEA,EAAA,OAAA,MAIA,eAAA,WAIA,MAFA,MAAA,OAAA,QAAA,GAEA,KAAA,QAMA,IAAA,mBAAA,WAEA,YACA,UAAA,mBAAA,EAEA,mBACA,gBAmBA,IAAA,6BAAA,EAEA,0BAAA,YAAA,WACA,IAEA,MADA,MAAA,qBACA,EACA,MAAA,IAEA,OAAA,KAKA,QAAA,SAAA,OAAA,aAGA,OAAA,SAAA,2BAAA,WACA,IAAA,2BAAA,CAIA,GAAA,0BAGA,WADA,MAAA,mBAKA,IAAA,iBAAA,CAIA,4BAAA,CAGA,IAAA,QAAA,EAEA,WAAA,OAEA,GAAA,CACA,SACA,QAAA,aAEA,gBACA,YAAA,CAGA,KAAA,GAAA,GAAA,EAAA,EAAA,QAAA,OAAA,IAAA,CACA,GAAA,UAAA,QAAA,EACA,UAAA,QAAA,SAIA,SAAA,WACA,YAAA,GAGA,aAAA,KAAA,WAEA,gBACA,YAAA,SACA,uBAAA,QAAA,WAGA,QAAA,0BAEA,OAAA,qBAAA,QAEA,4BAAA,KAIA,mBAEA,OAAA,SAAA,eAAA,WACA,kBAWA,eAAA,UAAA,cACA,UAAA,SAAA,UAGA,cAAA,EAGA,SAAA,WACA,WAEA,KAAA,gBAAA,kBAAA,KAAA,KAAA,OACA,KAAA,cAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAMA,WAAA,SAAA,GACA,GAAA,GAAA,MAAA,QAAA,QACA,KAAA,GAAA,KAAA,GACA,EAAA,GAAA,EAAA,EAMA,OAHA,OAAA,QAAA,KACA,EAAA,OAAA,EAAA,QAEA,GAGA,OAAA,SAAA,GACA,GAAA,GACA,CACA,IAAA,WAAA,CAEA,IAAA,EACA,OAAA,CAGA,MACA,EAAA,4BAAA,KAAA,OAAA,EACA,OAEA,GAAA,KAAA,WACA,EAAA,wBAAA,KAAA,OAAA,KAAA,WAIA,OAAA,aAAA,IAEA,GAEA,aAEA,KAAA,WAAA,KAAA,WAAA,KAAA,SAEA,KAAA,SACA,EAAA,UACA,EAAA,YAEA,EAAA,YACA,SAAA,GAEA,MAAA,GAAA,OAIA,IAGA,YAAA,WAEA,YACA,KAAA,gBAAA,QACA,KAAA,gBAAA,QAEA,KAAA,WAAA,QAIA,QAAA,WACA,KAAA,QAAA,SAGA,WACA,KAAA,gBAAA,SAAA,GAGA,WAAA,QAIA,eAAA,WAQA,MAPA,MAAA,gBAEA,KAAA,gBAAA,SAAA,GAEA,KAAA,WAAA,KAAA,WAAA,KAAA,QAGA,KAAA,UAaA,cAAA,UAAA,cAEA,UAAA,eAAA,UAEA,cAAA,EAEA,WAAA,SAAA,GACA,MAAA,GAAA,SAGA,OAAA,SAAA,GAEA,GAAA,EACA,IAAA,WAAA,CACA,IAAA,EACA,OAAA,CACA,GAAA,oBAAA,KAAA,OAAA,OAEA,GAAA,YAAA,KAAA,OAAA,EAAA,KAAA,OAAA,OACA,KAAA,WAAA,EAAA,KAAA,WAAA,OAIA,OAAA,IAAA,EAAA,QAGA,aACA,KAAA,WAAA,KAAA,WAAA,KAAA,SAGA,KAAA,SAAA,KACA,IAPA,KAYA,cAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,QAAA,SAAA,GAIA,IAFA,GAAA,IAAA,EAAA,MAAA,EAAA,QAAA,QACA,EAAA,EAAA,MACA,EAAA,EAAA,MAAA,EAAA,YACA,EAAA,KAAA,EAAA,IACA,GAIA,OAAA,UAAA,OAAA,MAAA,EAAA,MAaA,aAAA,UAAA,cACA,UAAA,SAAA,UAGA,GAAA,QACA,MAAA,MAAA,OAIA,SAAA,WACA,aACA,KAAA,gBAAA,eAAA,KAAA,KAAA,UAEA,KAAA,OAAA,QAAA,IAKA,YAAA,WACA,KAAA,OAAA,OAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAMA,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,aAAA,KAAA,OAAA,IAEA,GAGA,KAAA,SAAA,KAAA,OAAA,EAAA,QACA,IAIA,SAAA,SAAA,GACA,KAAA,OAEA,KAAA,MAAA,aAAA,KAAA,QAAA,KAeA,IAAA,oBAEA,kBAAA,UAAA,cACA,UAAA,SAAA,UAGA,SAAA,WACA,GAAA,WAAA,CAKA,IAAA,GAJA,GAEA,GAAA,EAEA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EAGA,GADA,EAAA,KAAA,UAAA,GACA,IAAA,iBAAA,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,kBAEA,KAAA,UAAA,EAAA,GAAA,OAEA,MAAA,UAAA,OAAA,EACA,KAAA,OAAA,OAAA,EAGA,KAAA,kBACA,KAAA,gBAAA,MAAA,MACA,KAAA,gBAAA,SAKA,QAAA,SAAA,EAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,iCAEA,IAAA,GAAA,QAAA,EAEA,IADA,KAAA,UAAA,KAAA,EAAA,GACA,KAAA,qBAAA,CAGA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,aAAA,KAIA,YAAA,SAAA,GACA,GAAA,KAAA,QAAA,UAAA,KAAA,QAAA,UACA,KAAA,OAAA,qCAGA,IADA,KAAA,UAAA,KAAA,iBAAA,GACA,KAAA,qBAAA,CAEA,GAAA,GAAA,KAAA,UAAA,OAAA,EAAA,CACA,MAAA,OAAA,GAAA,EAAA,KAAA,KAAA,QAAA,QAGA,WAAA,WACA,GAAA,KAAA,QAAA,OACA,KAAA,OAAA,4BAEA,MAAA,OAAA,UACA,KAAA,eAGA,YAAA,WAEA,GAAA,KAAA,QAAA,UACA,KAAA,OAAA,wCAKA,OAJA,MAAA,OAAA,OACA,KAAA,WAGA,KAAA,QAGA,gBAAA,SAAA,GAEA,IAAA,GADA,GACA,EAAA,EAAA,EAAA,KAAA,UAAA,OAAA,GAAA,EACA,EAAA,KAAA,UAAA,GACA,IAAA,kBACA,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,iBAAA,CAEA,GAAA,GAAA,CACA,GAAA,KAAA,SAAA,SACA,EAAA,KAAA,KAAA,QAAA,MAEA,EAAA,qBAEA,GAAA,EAAA,aAAA,EAGA,GACA,KAAA,OAAA,EAAA,GAAA,EAIA,aAAA,EAAA,KAAA,OAAA,EAAA,MAIA,EAAA,MACA,EAAA,EAAA,GAAA,KAAA,OAAA,EAAA,GACA,KAAA,OAAA,EAAA,GAAA,GAGA,MAAA,IAKA,KAAA,SAAA,KAAA,OAAA,EAAA,KAAA,aACA,IALA,KA8BA,kBAAA,WACA,KAAA,SAAA,EAAA,GAOA,MALA,MAAA,UAAA,EACA,KAAA,QAAA,EACA,KAAA,OAEA,KAAA,YAAA,KAAA,YAAA,KAAA,KAAA,kBAAA,OACA,KAAA,QAGA,kBAAA,SAAA,GAEA,GADA,EAAA,KAAA,YAAA,IACA,aAAA,EAAA,KAAA,QAAA,CAEA,GAAA,GAAA,KAAA,MACA,MAAA,OAAA,EACA,KAAA,UAAA,KAAA,KAAA,QAAA,KAAA,OAAA,KAIA,eAAA,WAEA,MADA,MAAA,OAAA,KAAA,YAAA,KAAA,YAAA,kBACA,KAAA,QAIA,QAAA,WAEA,MAAA,MAAA,YAAA,WAGA,SAAA,SAAA,GAEA,MADA,GAAA,KAAA,YAAA,IACA,KAAA,qBAAA,KAAA,YAAA,SAEA,KAAA,YAAA,SAAA,GAFA,QAKA,MAAA,WACA,KAAA,aACA,KAAA,YAAA,QAEA,KAAA,UAAA,OACA,KAAA,QAAA,OACA,KAAA,YAAA,OACA,KAAA,OAAA,OACA,KAAA,YAAA,OAEA,KAAA,YAAA,QAIA,IAAA,sBAEA,KAAA,EACA,QAAA,EACA,UAAA,GA0FA,WAAA,EACA,YAAA,EACA,SAAA,EAEA,YAAA,CAIA,aAAA,WAeA,kBAAA,SAAA,EAAA,EAAA,EAEA,EAAA,EAAA,GASA,IAAA,GANA,GAAA,EAAA,EAAA,EAEA,EAAA,EAAA,EAAA,EACA,EAAA,GAAA,OAAA,GAGA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,GAAA,GAAA,OAAA,GACA,EAAA,GAAA,GAAA,CAMA,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,IAOA,kCAAA,SAAA,GAOA,IANA,GAAA,GAAA,EAAA,OAAA,EAEA,EAAA,EAAA,GAAA,OAAA,EACA,EAAA,EAAA,GAAA,GAEA,KACA,EAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAOA,GAAA,GAAA,EAAA,CAOA,GAIA,GAJA,EAAA,EAAA,EAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,GACA,EAAA,EAAA,GAAA,EAAA,EAIA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAGA,EAAA,EAAA,EAAA,EAEA,GAAA,GACA,GAAA,EACA,EAAA,KAAA,aEnrDA,EAAA,KAAA,aACA,EAAA,GDAA,IACA,KAEA,GAAA,GAEA,EAAA,KAAA,aACA,IAEA,EAAA,IAEA,EAAA,KAAA,UAEA,IACA,EAAA,ODkpDA,GAAA,KAAA,aAEA,QATA,GAAA,KAAA,UAEA,GCvoDA,OAFA,GAAA,UAEA,GAgCA,YAAA,SAAA,EAAA,EAAA,EACA,EAAA,EAAA,GACA,GAAA,GAAA,EACA,EAAA,EAEA,EAAA,KAAA,IAAA,EAAA,EAAA,EAAA,EAaA,IAZA,GAAA,GAAA,GAAA,IACA,EAAA,KAAA,aAAA,EAAA,EAAA,IAEA,GAAA,EAAA,QAAA,GAAA,EAAA,SACA,EAAA,KAAA,aAAA,EAAA,EAAA,EAAA,IAEA,GAAA,EAEA,GAAA,EACA,GAAA,EACA,GAAA,EAEA,EAAA,GAAA,GAAA,EAAA,GAAA,EACA,QAGA,IAAA,GAAA,EAAA,CAEA,IADA,GAAA,GAAA,UAAA,KAAA,GACA,EAAA,GACA,EAAA,QAAA,KAAA,EAAA,KAGA,QAAA,GACA,GAAA,GAAA,EACA,OAAA,UAAA,KAAA,EAAA,GAYA,KAAA,GATA,GAAA,KAAA,kCACA,KAAA,kBAAA,EAAA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,OACA,KACA,EAAA,EACA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,OAAA,EAAA,IAEA,IAAA,YACA,IAEA,EAAA,KAAA,GACA,EAAA,QAIA,IAEA,GACA,MACA,KAAA,aAEA,IAEA,EAAA,UAAA,KAAA,IAEA,EAAA,aACA,IAEA,EAAA,QAAA,KAAA,EAAA,IACA,GACA,MAEA,KAAA,UACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,aACA,GAEA,MACA,KAAA,aACA,IACA,EAAA,UAAA,KAAA,IAGA,EAAA,QAAA,KAAA,EAAA,IACA,IASA,MAHA,IACA,EAAA,KAAA,GAEA,GAIA,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,GAKA,IAJA,GAAA,GAAA,EAAA,OAEA,EAAA,EAAA,OACA,EAAA,EACA,EAAA,GAAA,KAAA,OAAA,IAAA,GAAA,IAAA,KACA,GAEA,OAAA,IAKA,iBAAA,SAAA,EAAA,GACA,MAAA,MAAA,YAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAEA,EAAA,SAGA,OAAA,SAAA,EAAA,GACA,MAAA,KAAA,GAIA,IAAA,aAAA,GAAA,YA8KA,QAAA,SAAA,SACA,OAAA,SAAA,QAAA,OACA,OAAA,SAAA,kBAAA,iBACA,OAAA,SAAA,iBAAA,WAEA,OAAA,cAAA,cACA,OAAA,cAAA,iBAAA,SAAA,EAAA,GACA,MAAA,aAAA,iBAAA,EAAA,IAIA,OAAA,YAAA,YACA,OAAA,eAAA,eACA,OAAA,aAAA,aACA,OAAA,iBAAA,iBAEA,OAAA,KAAA,KACA,OAAA,kBAAA,mBACA,mBAAA,SAAA,QAAA,mBAAA,SAAA,OAAA,OAAA,MAAA,QAIA,SAAA,MAAA,QAMA,OAAA,qBAEA,SAAA,GACA,YAMA,SAAA,KAIA,GAAA,mBAAA,SAAA,OAAA,KAAA,OAAA,IAAA,QACA,OAAA,CAGA,KACA,GAAA,GAAA,GAAA,UAAA,eACA,OAAA,KACA,MAAA,GACA,OAAA,GAMA,QAAA,GAAA,GACA,IAAA,EACA,KAAA,IAAA,OAAA,oBEvZA,QAAA,GAAA,EAAA,GAGA,IAAA,GAFA,GAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,GAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAGA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,YACA,IAAA,SACA,IAAA,SACA,IAAA,OACA,IAAA,YAEA,IAAA,WACA,SAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAGA,MAAA,GAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,IAAA,GACA,MAAA,GAAA,GCnCA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,MAAA,EACA,EAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,OAAA,eAAA,GACA,EAAA,EAAA,IAAA,EAEA,IAAA,EACA,MAAA,EAGA,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,GAeA,QAAA,GAAA,GACA,MAAA,aAAA,KAAA,GAIA,QAAA,GAAA,GACA,MAAA,oBAAA,KAAA,GAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,GACA,WAAA,MAAA,MAAA,KAAA,IAGA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,IAAA,aAAA,EAAA,QACA,SAAA,GAAA,KAAA,KAAA,GAAA,GAGA,QAAA,GAAA,GAEA,MAAA,IAAA,EAAA,GACA,GAAA,UAAA,oBAAA,EACA,gCACA,WAAA,MAAA,MAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAGA,QAAA,GAAA,EAAA,GACA,IACA,MAAA,QAAA,yBAAA,EAAA,GACA,MAAA,GAKA,MAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAGA,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,CAIA,GAEA,EAAA,iBAAA,EAGA,IACA,GAAA,EADA,EAAA,EAAA,EAAA,EAEA,IAAA,GAAA,kBAAA,GAAA,MACA,EAAA,GAAA,EAAA,OADA,CAMA,GAAA,GAAA,EAAA,EAEA,GADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,UAAA,EAAA,OAEA,EADA,EACA,EAAA,sBAAA,GAGA,EAAA,IAGA,EAAA,EAAA,GACA,IAAA,EACA,IAAA,EACA,aAAA,EAAA,aACA,WAAA,EAAA,gBAcA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,GAAA,SAAA,EAAA,IAAA,IAGA,EAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAGA,EAAA,EAAA,GACA,GACA,EAAA,EAAA,GAGA,EAEA,EAAA,cAAA,GAGA,EAAA,UAAA,EAIA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,IAAA,EAAA,aACA,EAUA,QAAA,GAAA,GACA,GAAA,GAAA,OAAA,eAAA,GAEA,EAAA,EAAA,GACA,EAAA,EAAA,EAIA,OAFA,GAAA,EAAA,EAAA,GAEA,EAGA,QAAA,GAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAEA,GAAA,GAAA,OAAA,OAAA,EAAA,UAKA,OAJA,GAAA,YAAA,EACA,EAAA,UAAA,EAGA,EAcA,QAAA,GAAA,GAEA,MAAA,aAAA,GAAA,aACA,YAAA,GAAA,OACA,YAAA,GAAA,OACA,YAAA,GAAA,mBACA,YAAA,GAAA,0BACA,EAAA,uBACA,YAAA,GAAA,sBAGA,QAAA,GAAA,GAEA,MAAA,IAAA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,YAAA,IACA,YAAA,IACA,YAAA,IACA,YAAA,IAEA,GAEA,YAAA,IACA,GACA,YAAA,GAUA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MAGA,EAAA,EAAA,IACA,EAAA,kBACA,EAAA,gBAAA,IAAA,EAAA,IAAA,KASA,QAAA,GAAA,GACA,MAAA,QAAA,EACA,MACA,EAAA,EAAA,IACA,EAAA,MASA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,GAAA,EAAA,GAAA,EASA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,GAAA,EAAA,GAAA,EAUA,QAAA,GAAA,EAAA,GACA,OAAA,IAEA,EAAA,EAAA,IACA,EAAA,SAAA,GAAA,EAAA,IACA,EAAA,gBAAA,GAUA,QAAA,GAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EACA,EAAA,EAAA,UAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,WACA,MAAA,GAAA,KAAA,KAAA,MAYA,QAAA,GAAA,EAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,QAAA,SAAA,GACA,EAAA,UAAA,GAAA,WAEA,GAAA,GAAA,EAAA,KACA,OAAA,GAAA,GAAA,MAAA,EAAA,gBHsBA,GAAA,GAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,OAAA,OAAA,MAkBA,EAAA,IExZA,EAAA,OAAA,eACA,EAAA,OAAA,oBACA,EAAA,OAAA,yBA6CA,GChDA,MAAA,OACA,cAAA,EACA,YAAA,EACA,UAAA,EAeA,GAAA,OA2BA,IAAA,GAAA,UAAA,KAAA,UAAA,WAIA,GACA,IAAA,aACA,IAAA,aACA,cAAA,EACA,YAAA,GA+KA,EAAA,OAAA,kBACA,EAAA,OAAA,YACA,EAAA,OAAA,MACA,EAAA,OAAA,KACA,EAAA,OAAA,OACA,EAAA,OAAA,MACA,EAAA,OAAA,yBACA,EAAA,OAAA,sBACA,EAAA,OAAA,mBAiGA,GACA,IAAA,OACA,cAAA,EAEA,YAAA,EC/UA,GAAA,OAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EAEA,EAAA,iBAAA,EACA,EAAA,wBAAA,EAEA,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,OAAA,EACA,EAAA,eAAA,EACA,EAAA,KAAA,EACA,EAAA,aAAA,EACA,EAAA,SAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAQA,SAAA,KACA,GAAA,CACA,IAAA,GAAA,EAAA,MAAA,EACA,KACA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,KAqBA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IAEA,GAAA,EACA,EAAA,EAAA,IAtCA,GAIA,GAJA,EAAA,OAAA,iBACA,KAEA,GAAA,CAaA,IAAA,EAAA,CACA,GAAA,GAAA,EACA,EAAA,GAAA,GAAA,GACA,EAAA,SAAA,eAAA,EACA,GAAA,QAAA,GAAA,eAAA,IAEA,EAAA,WAEA,GAAA,EAAA,GAAA,EACA,EAAA,KAAA,OAKA,GAAA,OAAA,cAAA,OAAA,UAYA,GAAA,kBAAA,GC9EA,OAAA,mBAUA,SAAA,GACA,YAWA,SAAA,KACA,IAEA,EAAA,GACA,GAAA,GAMA,QAAA,KACA,GAAA,CAGA,GAGA,KAAA,GAFA,GAAA,EAAA,QACA,GAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,GAAA,GACA,EAAA,SACA,EAAA,UAAA,EAAA,GACA,GAAA,SAGA,GASA,QAAA,GAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EAEA,KAAA,WAAA,GAAA,GAAA,SACA,KAAA,aAAA,GAAA,GAAA,SACA,KAAA,gBAAA,KAEA,KAAA,YAAA,KACA,KAAA,cAAA,KACA,KAAA,mBAAA,KACA,KAAA,SAAA,KAUA,QAAA,GAAA,EAAA,GACA,KAAA,EAAA,EAAA,EAAA,WAAA,CACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EAEA,GAAA,QAAA,SACA,EAAA,qBAAA,KAMA,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,6BAOA,QAAA,GAAA,EAAA,EAAA,GAQA,IAAA,GANA,GAAA,OAAA,OAAA,MAEA,EAAA,OAAA,OAAA,MAIA,EAAA,EAAA,EAAA,EAAA,EAAA,WAAA,CAEA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAGA,KAAA,IAAA,GAAA,EAAA,YAKA,eAAA,IAAA,EAAA,YAOA,eAAA,GAAA,EAAA,kBAEA,OAAA,EAAA,WACA,KAAA,EAAA,gBAAA,QAAA,EAAA,QAKA,kBAAA,IAAA,EAAA,eAMA,cAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,QACA,GAAA,EAAA,MAAA,GAOA,eAAA,GAAA,EAAA,mBACA,kBAAA,GAAA,EAAA,yBACA,EAAA,EAAA,MAAA,EAAA,YAMA,GAAA,IAAA,CAIA,KAAA,GAAA,KAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,GAAA,GAAA,EAAA,EAKA,SAAA,IAAA,aAAA,KACA,EAAA,cAAA,EAAA,KAEA,EAAA,mBAAA,EAAA,WAKA,EAAA,aACA,EAAA,WAAA,EAAA,YAGA,EAAA,eACA,EAAA,aAAA,EAAA,cAGA,EAAA,kBACA,EAAA,gBAAA,EAAA,iBAIA,EAAA,cAEA,EAAA,YAAA,EAAA,aAIA,SAAA,EAAA,KACA,EAAA,SAAA,EAAA,IAIA,EAAA,SAAA,KAAA,GAEA,GAAA,EAIA,GACA,IASA,QAAA,GAAA,GA2BA,GAzBA,KAAA,YAAA,EAAA,UACA,KAAA,UAAA,EAAA,QAWA,KAAA,WALA,cAAA,MACA,qBAAA,IAAA,mBAAA,MAIA,EAAA,YAFA,EAUA,KAAA,cADA,yBAAA,MAAA,iBAAA,KACA,IAEA,EAAA,eAGA,KAAA,aACA,EAAA,mBAAA,mBAAA,MAEA,KAAA,eAAA,EAAA,sBAEA,KAAA,IAAA,UAOA,IAJA,KAAA,gBAAA,EAAA,cACA,KAAA,oBAAA,EAAA,kBACA,KAAA,wBAAA,EAAA,sBAEA,mBAAA,GAAA,CACA,GAAA,MAAA,EAAA,iBACA,gBAAA,GAAA,gBACA,KAAA,IAAA,UAEA,MAAA,gBAAA,EAAA,KAAA,EAAA,qBAGA,MAAA,gBAAA,KAeA,QAAA,GAAA,GACA,KAAA,UAAA,EAEA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,EAIA,EAAA,KAAA,MAgFA,QAAA,GAAA,EAAA,EAAA,GAEA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BA1XA,GAAA,GAAA,EAAA,kBAEA,EAAA,EAAA,aACA,EAAA,EAAA,SAEA,EAAA,GAAA,SACA,KACA,GAAA,EAiNA,EAAA,MAAA,UAAA,MA0DA,EAAA,CAuBA,GAAA,WAGA,QAAA,SAAA,EAAA,GACA,EAAA,EAAA,EAEA,IAIA,GAJA,EAAA,GAAA,GAAA,GAKA,EAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,WAAA,OACA,EAAA,EAAA,GAGA,EAAA,2BAEA,EAAA,QAAA,EAOA,KAEA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GAEA,KAAA,OAAA,KAAA,KAMA,WAAA,WAEA,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,UAIA,MACA,KAAA,aAGA,YAAA,WACA,GAAA,GAAA,KAAA,QAEA,OADA,MAAA,YACA,IAuBA,EAAA,WAOA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAKA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IACA,EAAA,IAAA,EAAA,MAMA,EAAA,KAAA,QAGA,yBAAA,WACA,GAAA,GAAA,KAAA,sBACA,MAAA,yBAGA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAIA,IAAA,GAHA,GAAA,EAAA,GAEA,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,GAGA,OAAA,mBASA,SAAA,GACA,YAgBA,SAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EAGA,KAAA,OAAA,EAqBA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,aAAA,EAAA,CACA,EAAA,WAAA,CACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,gBACA,EAAA,WAAA,OAAA,CAGA,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,EA5CA,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,IAkCA,EAAA,UAAA,EACA,EAAA,aAAA,EACA,EAAA,aAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA6BA,SAAA,GAAA,GACA,MAAA,aAAA,GAAA,WAGA,QAAA,GAAA,GACA,MAAA,GAAA,GAAA,KAKA,QAAA,GAAA,EAAA,GACA,GAAA,MACA,EAAA,CAGA,KAFA,EAAA,KAAA,GAEA,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,GAKA,EAAA,KAAA,GAKA,EAAA,EAEA,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,GAMA,MAAA,GAKA,QAAA,GAAA,GACA,IAAA,EACA,OAAA,CAEA,QAAA,EAAA,MACA,IAAA,QACA,IAAA,QACA,IAAA,SACA,IAAA,SAEA,IAAA,OACA,IAAA,QAEA,IAAA,SACA,IAAA,SACA,IAAA,cACA,OAAA,EAGA,OAAA,EAIA,QAAA,GAAA,GACA,MAAA,aAAA,mBAKA,QAAA,GAAA,GACA,MAAA,GAAA,8BAAA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,IAAA,EAAA,OACA,MAAA,EAIA,aAAA,GAAA,SACA,EAAA,EAAA,SASA,KAAA,GANA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,GACA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CAEA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EACA,MAAA,GAGA,MAAA,GAAA,EAAA,OAAA,GAIA,QAAA,GAAA,GAEA,IADA,GAAA,MACA,EAAA,EAAA,EAAA,OAEA,EAAA,KAAA,EAEA,OAAA,GAIA,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,EAMA,MAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAGA,YAAA,GAAA,SACA,EAAA,EAAA,SAEA,IAMA,GANA,EAAA,EAAA,GACA,EAAA,EAAA,GAGA,EAAA,EAAA,EAAA,GAKA,EACA,EAAA,EAAA,EAGA,KACA,EAAA,EAAA,KAGA,KAAA,GAAA,GAAA,EACA,EAEA,EAAA,EAAA,OAIA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,KAAA,EAEA,MAAA,GAKA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,KAAA,EAAA,GAcA,QAAA,GAAA,GAEA,IAAA,EAAA,IAAA,KAEA,EAAA,IAAA,GAAA,GAEA,EAAA,EAAA,GAAA,EAAA,EAAA,SACA,GAAA,CACA,GAAA,GAAA,CAEA,MADA,GAAA,KACA,GAKA,QAAA,GAAA,EAAA,GAEA,GAAA,EAAA,IAAA,GACA,KAAA,IAAA,OAAA,oBAGA,GAAA,IAAA,GAAA,GAKA,EAAA,kBACA,IAAA,GAQA,EACA,EAEA,EAAA,EAAA,IAMA,IAAA,SAAA,IAAA,EAAA,QAAA,CACA,GAAA,GAAA,CACA,aAAA,GAAA,WAAA,EAAA,EAAA,eACA,EAAA,EACA,MAIA,IAAA,EACA,GAAA,YAAA,GAAA,OAEA,EAAA,EACA,SAIA,IAFA,EAAA,EAAA,EAAA,GAEA,SAAA,EAAA,KAAA,CACA,GAAA,GAAA,EAAA,EAAA,OAAA,EACA,aAAA,GAAA,WACA,EAAA,EAAA,aAmBA,MAbA,GAAA,IAAA,EAAA,GAEA,EAAA,EAAA,EAAA,EAAA,IAEA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,EAAA,EAAA,EAAA,GAIA,EAAA,IAAA,EAAA,IACA,EAAA,OAAA,EAAA,MACA,EAAA,OAAA,GAEA,EAAA;CAIA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAEA,IAAA,IACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,OAAA,CAIA,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,GAEA,GAAA,GAAA,GCn4BA,EAAA,EAAA,IAAA,CACA,OAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,EAAA,EAAA,GAGA,IAAA,GADA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,EAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAGA,IAAA,EAAA,OAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,GAKA,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,CAEA,GAAA,IAAA,GAEA,OAAA,CAEA,KAAA,KAEA,EAAA,QAEA,IAAA,IAAA,KAAA,EAAA,QAEA,OAAA,CAGA,IAAA,iBAAA,GAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,aAOA,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,IAKA,EAAA,IAAA,EAAA,EACA,IAAA,GAAA,EAAA,KAGA,GAAA,CAEA,GAAA,IAAA,EAAA,GACA,EAAA,IAAA,EAAA,GAKA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,EAAA,QAEA,GAAA,MAMA,MAAA,EAAA,OAAA,IACA,EAAA,SAAA,IAAA,IACA,EAAA,SAAA,IAAA,IAKA,IAQA,GANA,kBAAA,GAAA,QACA,EAAA,QAAA,KAAA,EAAA,GAGA,EAAA,QAAA,YAAA,GAEA,EAAA,IAAA,GACA,OAAA,EAEA,MAAA,GACA,IAEA,EAAA,ICrHA,GD2HA,EAAA,QC3HA,GAAA,IAAA,EAAA,MAAA,CACA,GAAA,GAAA,EAAA,OACA,GAAA,OAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,SAEA,EAAA,KAAA,EAAA,IAMA,OAAA,EAAA,IAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,KAAA,EACA,KAAA,QAAA,EACA,KAAA,QAAA,QAAA,GCdA,QAAA,GAAA,EAAA,GACA,KAAA,YAAA,KCNA,MAAA,GAAA,EAAA,GAAA,QAAA,EAAA,GDQA,IAAA,GAAA,CAEA,OAAA,KAAA,iBAAA,EAAA,UAGA,KAAA,KAAA,GAFA,GAAA,GAAA,GCuBA,QAAA,GAAA,GACA,MAAA,IAAA,EAAA,cAIA,OAAA,OAAA,GACA,eAAA,MAAA,EAAA,EAAA,kBAHA,EAOA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,OAAA,GACA,EAAA,SAAA,EAAA,GACA,MAAA,aAAA,QACA,KAAA,KAAA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,IAMA,IAJA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,GACA,EAAA,EAAA,UAAA,GACA,EAOA,IACA,EAAA,EAAA,EAAA,GAAA,GAAA,SACA,MAAA,GACA,EAAA,EAAA,EACA,SAAA,YAAA,IAIA,MAAA,GAoBA,QAAA,GAAA,EAAA,GACA,MAAA,YACA,UAAA,GAAA,EAAA,UAAA,GACA,IAAA,GAAA,EAAA,KACA,GAAA,GAAA,MAAA,EAAA,YAsCA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAEA,MAAA,IAAA,GAAA,EAAA,EAAA,GAGA,IAAA,GAAA,EAAA,SAAA,YAAA,IACA,EAAA,GAAA,GAEA,GAAA,EAUA,OATA,QAAA,KAAA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,MAAA,GAAA,IAAA,GACA,EAAA,GAAA,EAAA,EACA,mBAAA,IACA,EAAA,EAAA,IAEA,EAAA,KAAA,KAEA,EAAA,OAAA,GAAA,MAAA,EAAA,GACA,EA+CA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAgBA,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,EAGA,OAAA,EAYA,QAAA,GAAA,GAEA,KAAA,KAAA,EAoBA,QAAA,GAAA,GAGA,MAFA,aAAA,GAAA,aACA,EAAA,EAAA,MACA,EAAA,GAwGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,IAAA,EACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAEA,IAAA,EAAA,GAAA,SAAA,EAAA,GAAA,OAAA,EACA,OAAA,CAIA,QAAA,EAIA,QAAA,GAAA,EAAA,GACA,IAAA,GAAA,GAAA,EAAA,GAAA,EAAA,EAAA,EAAA,WAEA,GAAA,EAAA,EAAA,GAAA,GACA,OAAA,CAEA,QAAA,EAMA,QAAA,GAAA,GACA,EAAA,EAAA,IAOA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,EAAA,kBAEA,IAAA,GAAA,EAAA,GAAA,KAAA,EAAA,KAAA,EAAA,GACA,KAAA,EACA,MAAA,KAEA,IAAA,GAAA,EAAA,EAAA,MAGA,EAAA,EAAA,YAAA,EACA,OAAA,IAAA,EAEA,MAGA,EAAA,EAAA,MAAA,EAAA,GAIA,EAAA,EAAA,IAQA,QAAA,GAAA,GACA,MAAA,YACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,IAAA,EAAA,IACA,EAAA,GAAA,OAAA,MAWA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,OAAA,UAAA,GACA,GAAA,GAAA,EAAA,IAAA,KAEA,KACA,EAAA,OAAA,OAAA,MACA,EAAA,IAAA,KAAA,GAIA,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,EAEA,EAAA,iBACA,mBAAA,GAAA,gBAAA,KACA,EAAA,YAAA,GAMA,MAAA,iBAAA,EAAA,GAAA,GACA,EAAA,IACA,MAAA,EACA,QAAA,KJ0DA,GAuPA,GAvPA,EAAA,EAAA,wBAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SAIA,GADA,GAAA,SACA,GAAA,UACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SAsNA,GAAA,EACA,GAAA,EACA,GAAA,EACA,GAAA,CE5vBA,GAAA,WACA,OAAA,SAAA,GACA,MAAA,MAAA,UAAA,EAAA,SAAA,KAAA,OAAA,EAAA,MAEA,KAAA,UAAA,EAAA,SAEA,GAAA,WACA,MAAA,QAAA,KAAA,SAEA,OAAA,WACA,KAAA,QAAA,MAKA,IAAA,IAAA,OAAA,KACA,IAAA,UAAA,mBACA,aAAA,EAIA,aAAA,GEvCA,EAAA,WAEA,GAAA,UACA,MAAA,GAAA,IAAA,OAGA,GAAA,iBACA,MAAA,GAAA,IAAA,OAEA,GAAA,cACA,MAAA,GAAA,IAAA,OAEA,GAAA,QACA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GAGA,EAAA,YAEA,gBAAA,WACA,EAAA,IAAA,MAAA,IAGA,yBAAA,WACA,EAAA,IAAA,MAAA,GACA,EAAA,IAAA,MAAA,KAIA,EAAA,GAAA,EAAA,SAAA,YAAA,SA0CA,IAAA,IAAA,EAAA,UAAA,GACA,GAAA,EAAA,cAAA,GAGA,IACA,GAAA,iBACA,GAAA,GAAA,EAAA,IAAA,KAGA,OAAA,UAAA,EACA,EACA,EAAA,EAAA,MAAA,iBAeA,GAAA,GACA,eAAA,EAAA,iBAAA,KACA,IAEA,GAAA,GAEA,eAAA,EAAA,iBAAA,IACA,IAGA,GAAA,EAAA,aAAA,GAAA,IACA,GAAA,EAAA,aAAA,GAAA,IAMA,GAAA,OAAA,OAAA,MAGA,GAAA,WACA,IACA,GAAA,QAAA,WAAA,SACA,MAAA,GACA,OAAA,EAEA,OAAA,IA8BA,KAAA,GAAA,CACA,GAAA,IAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,CAEA,GAAA,GAAA,GAAA,EACA,GAAA,EAAA,KAAA,GAAA,GAGA,GAAA,GAAA,EAOA,IAAA,SAAA,SAAA,EAAA,YAAA,IAEA,GAAA,eAAA,OAAA,MAAA,SACA,GAAA,WAAA,KAAA,KAAA,OAAA,GAAA,SACA,GAAA,cAEA,QAAA,EACA,QAAA,EACA,QAAA,EACA,QAAA,EAEA,SAAA,EACA,QAAA,EACA,UAAA,EAEA,SAAA,EACA,OAAA,EAEA,cAAA,MACA,WACA,GAAA,cAAA,cAAA,MAAA,WAMA,GAAA,IAAA,OAAA,iBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,KAAA,aAGA,GAAA,aAAA,GACA,KAAA,KAAA,YAAA,KAIA,IACA,EAAA,GAAA,EA0BA,IAAA,IAAA,OAAA,YAeA,IAEA,mBACA,sBACA,kBAIA,KAAA,QAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,SACA,IAAA,QAAA,SAAA,GACA,OAAA,eAAA,EAAA,EAAA,KAAA,MAAA,EAAA,SAWA,EAAA,WAEA,iBAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,KAAA,EAAA,GAAA,CAGA,GAAA,GAAA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,IAAA,KAEA,IAAA,GAOA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,OAAA,EAAA,IACA,WAPA,MACA,EAAA,MAAA,EACA,EAAA,IAAA,KAAA,EAWA,GAAA,KAAA,EAGA,IAAA,GAAA,EAAA,KACA,GAAA,kBAAA,EAAA,GAAA,KAEA,oBAAA,SAAA,EAAA,EAAA,GAEA,EAAA,QAAA,EACA,IAAA,GAAA,EAAA,IAAA,KACA,IAAA,EAAA,CAIA,IAAA,GAFA,GAAA,EAAA,GAAA,EAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,OAAA,GAAA,EAAA,GAAA,UAAA,IACA,IACA,EAAA,GAAA,UAAA,IACA,GAAA,EAEA,EAAA,GAAA,UAMA,IAAA,GAAA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KACA,GAAA,qBAAA,EAAA,GAAA,MAIA,cAAA,SAAA,GAcA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,IAKA,GAAA,IAAA,GAAA,GAIA,EAAA,kBAGA,IAAA,EACA,GAAA,KAAA,KACA,EAAA,aACA,KAAA,iBAAA,EAAA,GAAA,GAKA,KACA,MAAA,GAAA,MAAA,eAAA,GACA,QACA,GACA,KAAA,oBAAA,EAAA,GAAA,MA6BA,IACA,EAAA,GAAA,EAQA,IAAA,IAAA,SAAA,gBAqFA,GAAA,iBAAA,EACA,EAAA,sBAAA,EAEA,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,GAEA,EAAA,SAAA,WAAA,GACA,EAAA,SAAA,QAAA,IAEA,OAAA,mBAWA,SAAA,GACA,YA4BA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAGA,QAAA,GAAA,GACA,KAAA,KAAA,EA0CA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAWA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,GAAA,GAAA,EAAA,GAIA,OAFA,GAAA,OAAA,EAEA,EAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAjGA,GAAA,GAAA,EAAA,SAAA,QACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAIA,EAAA,OAAA,UACA,IAAA,EAAA,CAIA,GAAA,EACA,KACA,EAAA,SAAA,YAAA,cACA,MAAA,GAGA,OAGA,GAAA,IAAA,YAAA,EAaA,GAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAIA,IAAA,IACA,cAAA,EACA,YAAA,EACA,IAAA,OAKA,UACA,UAEA,UACA,UACA,QACA,QACA,aACA,gBAEA,gBACA,sBACA,eACA,QAAA,SAAA,GACA,EAAA,IAAA,WAEA,MAAA,MAAA,KAAA,IAEA,OAAA,eAAA,EAAA,UAAA,EAAA,KAUA,EAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAmBA,EAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAIA,GAAA,iBACA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,kBACA,MAAA,GAAA,EAAA,MAAA,iBAGA,eAAA,WAMA,KAAA,IAAA,OAAA,sBAKA,EAAA,EAAA,EAAA,GAGA,EAAA,SAAA,MAAA,EACA,EAAA,SAAA,WAAA,EACA,EAAA,SAAA,UAAA,IAEA,OAAA,mBAQA,SACA,GACA,YAOA,SAAA,GAAA,EAAA,GACA,OAAA,eAAA,EAAA,EAAA,GAIA,QAAA,KACA,KAAA,OAAA,EACA,EAAA,KAAA,UAUA,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,GAAA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,aAlCA,GAAA,GAAA,EAAA,KAEA,GAAA,YAAA,EAYA,GAAA,WACA,KAAA,SAAA,GACA,MAAA,MAAA,KAGA,EAAA,EAAA,UAAA,QAoBA,EAAA,SAAA,SAAA,EACA,EAAA,sBAAA,EACA,EAAA,aAAA,GAEA,OAAA,mBAUA,SAAA,GAEA,YAIA,GAAA,mBAAA,EAAA,aACA,EAAA,SAAA,eAAA,EAAA,SAAA,UAGA,OAAA,mBCrtBA,SACA,GACA,YAwBA,SAAA,GAAA,GACA,EAAA,YAAA,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,EAIA,OAFA,GAAA,GAAA,EACA,EAAA,OAAA,EACA,EAcA,QAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,aAEA,aAAA,EACA,gBAAA,EAAA,gBACA,YAAA,EAAA,cAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,aACA,aAAA,IAYA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,GAAA,YAAA,kBAAA,CACA,GAAA,GAAA,EAAA,EAIA,IAAA,CACA,KAAA,GAAA,GAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,EAAA,YAAA,EAAA,IACA,EAAA,GAAA,YAAA,CAGA,IAAA,CAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,GAAA,iBAAA,EAAA,EAAA,IAAA,EACA,EAAA,GAAA,aAAA,EAAA,EAAA,IAAA,CAWA,OAPA,KAEA,EAAA,aAAA,EAAA,IACA,IACA,EAAA,iBAAA,EAAA,EAAA,OAAA,IAGA,EC9GA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAkBA,OAhBA,IAGA,EAAA,YAAA,GAIA,EAAA,YAAA,EACA,EAAA,iBAAA,EACA,EAAA,aAAA,EACA,IAEA,EAAA,aAAA,GACA,IACA,EAAA,iBAAA,GAEA,EAIA,QAAA,GAAA,GACA,GAAA,YAAA,kBACA,MAAA,GAAA,EAGA,IAAA,GAAA,EAAA,GACA,EAAA,EAAA,UAIA,OAFA,IACA,EAAA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAGA,IAAA,GAFA,GAAA,GAAA,GACA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,KAAA,CAIA,OAFA,GAAA,OAAA,EACA,EAAA,EAAA,GACA,EAGA,QAAA,GAAA,GAEA,MAAA,GAKA,QAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,kBAIA,QAAA,GAAA,EAAA,GAEA,IAAA,GADA,GAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GAAA,GAMA,QAAA,GAAA,GAEA,EAAA,EAAA,GAAA,GAAA,EAAA,OCxEA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,EAAA,EAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,WAAA,EAAA,cAEA,EAAA,EAAA,aAEA,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,MAIA,IAAA,IAAA,EACA,MAAA,GAAA,EAAA,GCzCA,KAAA,GD4CA,GAAA,EAAA,EAAA,cAAA,0BC5CA,EAAA,EAAA,EAAA,EAAA,IACA,EAAA,YAAA,EAAA,EAAA,IAGA,OAAA,GAIA,QAAA,GAAA,GACA,GAAA,SAAA,EAAA,YAGA,IAFA,GAAA,GAAA,EAAA,YAEA,GAAA,CACA,GAAA,GAAA,CACA,GAAA,EAAA,aAEA,EAAA,YAAA,EAAA,iBAAA,EAAA,aAAA,OAIA,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,EAGA,EAAA,YAAA,EAAA,WAAA,SCpCA,KDuCA,GCxCA,GDwCA,EAAA,EAAA,GCzCA,EAAA,EAAA,WAEA,GAEA,EAAA,EAAA,YACA,EAAA,KAAA,EAAA,GAEA,EAAA,EAMA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,UAEA,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,MAAA,GAEA,EAAA,KAAA,EAAA,MAAA,IAEA,EAAA,CACA,IAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,GAGA,IAAA,YAAA,GAAA,oBAGA,IAAA,GAFA,GAAA,EAAA,QAEA,EAAA,EAAA,QAAA,WACA,EC7CA,EAAA,EAAA,YACA,EAAA,YAAA,EAAA,GAAA,EAAA,IAOA,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,EAeA,QAAA,GAAA,GAEA,EAAA,YAAA,IAEA,EAAA,KAAA,KAAA,GAYA,KAAA,YAAA,OAMA,KAAA,YAAA,OAQA,KAAA,WAAA,OAQA,KAAA,aAAA,OASA,KAAA,iBAAA,OAEA,KAAA,WAAA,OLtEA,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,MAEA,EAAA,EAAA,2BACA,EAAA,EAAA,gBACA,EAAA,EAAA,aAEA,EAAA,EAAA,OAEA,EAAA,EAAA,eACA,EAAA,EAAA,KACA,EAAA,EAAA,aACA,EAAA,EAAA,SAiBA,GAAA,EIvBA,EAAA,SAAA,WACA,EAAA,OAAA,KAAA,UAAA,UCHA,EAAA,OAAA,KA8DA,EAAA,OAAA,iBAGA,GADA,EAAA,UAAA,YAEA,EAAA,UAAA,yBACA,EAAA,EAAA,UAAA,aACA,EAAA,EAAA,UAAA,YACA,EAAA,EAAA,UAAA,aAGA,EAAA,UAAA,KAAA,UAAA,WAGA,EAAA,EACA,SAAA,EAAA,GACA,IACA,EAAA,KAAA,EAAA,GACA,MAAA,GACA,KAAA,YAAA,IACA,KAAA,KAIA,SAAA,EAAA,GACA,EAAA,KAAA,EAAA,GAIA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,YAAA,SAAA,GACA,MAAA,MAAA,aAAA,EAAA,OAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAGA,IAAA,EACA,GACA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EAEA,EAAA,EAAA,KAGA,EAAA,KAEA,EAAA,MAGA,GAAA,EAAA,EAAA,aAAA,KAGA,IAAA,GAEA,EACA,EAAA,EAAA,gBAAA,KAAA,UAEA,GAAA,KAAA,6BCrJA,EAAA,EASA,IALA,EAFA,EAEA,EAAA,GAGA,EAAA,EAAA,KAAA,EAAA,GAEA,EACA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GAAA,OACA,CACA,IACA,KAAA,YAAA,EAAA,IACA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,GAEA,SAAA,KAAA,cACA,KAAA,YAAA,KAAA,YAIA,IAAA,GAAA,EAAA,EAAA,WAAA,KAAA,IAIA,GACA,EAAA,KAAA,EACA,EAAA,KAAA,GAAA,GAEA,EAAA,KAAA,GAcA,MAVA,GAAA,KAAA,aACA,WAAA,EACA,YAAA,EACA,gBAAA,IAIA,EAAA,EAAA,MAGA,GAIA,YAAA,SAAA,GAEA,GADA,EAAA,GACA,EAAA,aAAA,KAAA,CAKA,IAAA,GAHA,IAAA,EAGA,GAFA,KAAA,WAEA,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,CAKA,GAAA,GAAA,KAAA,WACA,EAAA,KAAA,UAEA,EAAA,EAAA,UACA,IACA,EAAA,EAAA,GAEA,IAAA,IAEA,KAAA,YAAA,GACA,IAAA,IACA,KAAA,WAAA,GACA,IACA,EAAA,aAAA,GACA,IACA,EAAA,iBACA,GAGA,EAAA,iBAAA,EAAA,aACA,EAAA,YAAA,WAIA,GAAA,MACA,EAAA,KAAA,KAAA,EAgBA,OAbA,IAEA,EAAA,KAAA,aACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAKA,EAAA,KAAA,GAEA,GAIA,aAAA,SAAA,EAAA,GACA,EAAA,EAEA,IAAA,EASA,IAPA,EAAA,GACA,EAAA,EAAA,IAEA,EAAA,EACA,EAAA,EAAA,IAGA,EAAA,aAAA,KAEA,KAAA,IAAA,OAAA,gBAKA,IAGA,GAHA,EAAA,EAAA,YACA,EAAA,EAAA,gBAIA,GAAA,KAAA,6BACA,EAAA,EAkDA,OAhDA,GACA,EAAA,EAAA,IAEA,IAAA,IACA,EAAA,EAAA,aACA,EAAA,EAAA,EAAA,KAAA,EAAA,IAGA,GAoBA,EAAA,KAAA,GACA,EAAA,MACA,EAAA,KAAA,KAAA,KAAA,EAAA,GACA,KAtBA,KAAA,aAAA,IACA,KAAA,YAAA,EAAA,IACA,KAAA,YAAA,IACA,KAAA,WAAA,EAAA,EAAA,OAAA,IAGA,EAAA,iBAAA,EAAA,aAEA,EAAA,YAAA,OAGA,EAAA,YACA,EAAA,KAEA,EAAA,WACA,EAAA,KAAA,GACA,IAWA,EAAA,KAAA,aACA,WAAA,EACA,aAAA,EAAA,GAEA,YAAA,EACA,gBAAA,IAIA,EAAA,GACA,EAAA,EAAA,MAEA,GASA,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,KAAA,KAAA,aAIA,GAAA,cACA,MAAA,UAAA,KAAA,YACA,KAAA,YAAA,EAAA,KAAA,KAAA,aAKA,GAAA,aAEA,MAAA,UAAA,KAAA,WACA,KAAA,WAAA,EAAA,KAAA,KAAA,YAIA,GAAA,eACA,MAAA,UAAA,KAAA,aACA,KAAA,aAAA,EAAA,KAAA,KAAA,cAKA,GAAA,mBACA,MAAA,UAAA,KAAA,iBACA,KAAA,iBAAA,EAAA,KAAA,KAAA,kBAGA,GAAA,iBAGA,IADA,GAAA,GAAA,KAAA,WACA,GAAA,EAAA,WAAA,EAAA,cACA,EAAA,EAAA,UAGA,OAAA,IAGA,GAAA,eAIA,IAAA,GADA,GAAA,GACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,UAAA,EAAA,eACA,GAAA,EAAA,YAIA,OAAA,IAEA,GAAA,aAAA,GACA,GAAA,GAAA,EAAA,KAAA,WAEA,IAAA,KAAA,4BAEA,GADA,EAAA,MACA,KAAA,EAAA,CACA,GAAA,GAAA,KAAA,KAAA,cAAA,eAAA,EACA,MAAA,YAAA,QAIA,GAAA,MACA,KAAA,KAAA,YAAA,CAIA,IAAA,GAAA,EAAA,KAAA,WAEA,GAAA,KAAA,aACA,WAAA,EACA,aAAA,IAGA,EAAA,GAEA,EAAA,EAAA,OAGA,GAAA,cAIA,IAAA,GAHA,GAAA,GAAA,GAEA,EAAA,EACA,EAAA,KAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAKA,OADA,GAAA,OAAA,EACA,GCxTA,UAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAIA,SAAA,SAAA,GAEA,MAAA,GAAA,KAAA,EAAA,KAGA,wBAAA,SAAA,GAKA,MAAA,GAAA,KAAA,KAAA,KACA,EAAA,KAIA,UAAA,WAOA,IAAA,GAHA,GAGA,EANA,EAAA,EAAA,KAAA,YACA,KACA,EAAA,GAIA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,GACA,EAAA,WAAA,EAAA,UC9BA,GAAA,EAAA,KAAA,OAEA,GAKA,GAAA,EAAA,KACA,EAAA,KAAA,IAJA,EAAA,EAHA,KAAA,WAAA,IAYA,GAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,IAEA,KACA,EAAA,GACA,EAAA,KACA,EAAA,WAAA,QACA,EAAA,YAMA,IAAA,EAAA,SACA,EAAA,MAAA,EACA,EAAA,OAQA,EAAA,EAAA,iBCjCA,EAAA,EAAA,EAAA,SAAA,gCACA,GAAA,UAAA,oBAEA,GAAA,UAAA,iBACA,EAAA,UAAA,EAAA,OAAA,OAAA,EAAA,WAAA,EAAA,WAEA,EAAA,UAAA,EAEA,EAAA,aAAA,EAEA,EAAA,eAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EACA,EAAA,iBAAA,EAEA,EAAA,SAAA,KAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YAMA,SAAA,GAAA,EAAA,GAIA,IAFA,GAAA,GAAA,EAAA,EAAA,kBAEA,GAAA,CACA,GAAA,EAAA,QAAA,GACA,MAAA,ECzCA,IADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,QAAA,GAOA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,EAAA,SACA,OAAA,KAAA,GAEA,IAAA,GAAA,EAAA,eAAA,ECvBA,QAAA,KACA,OAAA,EAKA,QAAA,GAAA,EAAA,GACA,MAAA,GAAA,YAAA,EAGA,QAAA,GAAA,EAAA,GAEA,MAAA,GAAA,eAAA,EAIA,QAAA,GAAA,EAAA,EAAA,GACA,MAAA,GAAA,eAAA,GAAA,EAAA,YAAA,EAGA,QAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,kBACA,GACA,EAAA,EAAA,EAAA,KACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,kBAEA,OAAA,GFIA,GAAA,GAAA,EAAA,SAAA,eACA,EAAA,EAAA,SAAA,SClBA,EAAA,+BCqBA,GACA,cAAA,SAAA,GACA,MAAA,GAAA,KAAA,IAEA,iBAAA,SAAA,GACA,MAAA,GAAA,KAAA,GAAA,GAAA,EAAA,KAMA,GACA,qBAAA,SAAA,GACA,GAAA,GAAA,GAAA,EACA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAGA,EAAA,KAAA,EACA,EACA,EACA,EAAA,gBAIA,uBAAA,SAAA,GAIA,MAAA,MAAA,iBAAA,IAAA,IAIA,uBAAA,SAAA,EAAA,GCtEA,GAAA,GAAA,GAAA,EAEA,IAAA,KAAA,EAEA,EAAA,SACA,IAAA,MAAA,EAEA,MAAA,MAAA,EACA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,EAAA,EAAA,EAIA,OAAA,MAAA,EACA,EAAA,KAAA,EAAA,EAAA,GAGA,EAAA,KAAA,EAAA,EAAA,EAAA,ICjBA,GAAA,uBAAA,EACA,EAAA,mBAAA,GAGA,OAAA,mBAQA,SACA,GACA,YAKA,SAAA,GAAA,GAEA,KAAA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAEA,OAAA,GAIA,QAAA,GAAA,GACA,KAAA,GAAA,EAAA,WAAA,KAAA,cAEA,EAAA,EAAA,eAEA,OAAA,GAjBA,GAAA,GAAA,EAAA,SAAA,SAsBA,GACA,GAAA,qBACA,MAAA,GAAA,KAAA,aCvCA,GAAA,oBAEA,MAAA,GAAA,KAAA,YAIA,GAAA,qBAEA,IAAA,GADA,GAAA,EACA,EAAA,KAAA,kBACA,EACA,EAAA,EAAA,mBAEA,GAGA,OAAA,IAIA,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,UAEA,IACA,EAAA,YAAA,QAKA,GACA,GAAA,sBAEA,MAAA,GAAA,KAAA,cAIA,GAAA,0BACA,MAAA,GAAA,KAAA,kBAIA,GAAA,mBAAA,EACA,EAAA,oBAAA,GAGA,OAAA,mBCxDA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,gBACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAIA,EAAA,OAAA,aAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,eACA,MAAA,MAAA,MAGA,GAAA,aAAA,GACA,KAAA,KAAA,GAEA,GAAA,QACA,MAAA,MAAA,KAAA,MAEA,GAAA,MAAA,GAEA,GAAA,GAAA,KAAA,KAAA,IACA,GAAA,KAAA,iBAEA,SAAA,IAGA,KAAA,KAAA,KAAA,KAKA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,eAAA,KChDA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GACA,MAAA,KAAA,EAKA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAdA,GAAA,GAAA,EAAA,SAAA,cAGA,GAFA,EAAA,gBAEA,EAAA,OAEA,EAAA,EAAA,gBAMA,EAAA,OAAA,IAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,UAAA,SAAA,GACA,EAAA,EAAA,EACA,IAAA,GAAA,KAAA,IACA,IAAA,EAAA,EAAA,OAEA,KAAA,IAAA,OAAA,iBACA,IAAA,GAAA,EAAA,MAAA,EAAA,GACA,EAAA,EAAA,MAAA,EACA,MAAA,KAAA,CACA,IAAA,GAAA,KAAA,cAAA,eAAA,EAIA,OAHA,MAAA,YAEA,KAAA,WAAA,aAAA,EAAA,KAAA,aACA,KAIA,EAAA,EAAA,EAAA,SAAA,eAAA,KAGA,EAAA,SAAA,KAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YC9DA,SAAA,GAAA,GACA,EAAA,mCAAA,EAAA,SAGA,QAAA,GAAA,EAAA,GAEA,KAAA,KAAA,EACA,KAAA,cAAA,EAIA,EAAA,WACA,GAAA,UACA,MAAA,MAAA,KAAA,QAGA,KAAA,SAAA,GAEA,MAAA,MAAA,KAAA,KAAA,IAEA,SAAA,SAAA,GACA,MAAA,MAAA,KAAA,SAAA,IAEA,IAAA,WACA,KAAA,KAAA,IAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAEA,OAAA,WACA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,WACA,EAAA,KAAA,gBAGA,OAAA,WAEA,GAAA,GAAA,KAAA,KAAA,OAAA,MAAA,KAAA,KAAA,UClCA,ODmCA,GAAA,KAAA,eCnCA,GAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAMA,EAAA,SAAA,aAAA,GACA,OAAA,mBAOA,SACA,GACA,YCCA,SAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,UACA,IAAA,GAAA,EAAA,WAAA,CAGA,GAAA,GAAA,EAAA,mBAAA,EACA,GAAA,mBAAA,IACA,EAAA,cC5BA,QAAA,GAAA,EAAA,EAAA,GAKA,EAAA,EAAA,cAEA,KAAA,EACA,UAAA,KACA,SAAA,IAQA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GFGA,GAAA,GAAA,EAAA,mBACA,EAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KACA,EAAA,EAAA,SAAA,aACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,GADA,EAAA,sBACA,EAAA,iBACA,EAAA,EAAA,MAGA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,SCnCA,EAAA,OAAA,QAGA,GACA,UAEA,qBACA,oBACA,yBACA,OAAA,SAAA,GACA,MAAA,GAAA,UAAA,KAKA,EAAA,EAAA,GAEA,EAAA,EAAA,UAAA,GCJA,EAAA,GAAA,QAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,iBAAA,WACA,GAAA,GAAA,GAAA,GAAA,WAAA,KACA,MAAA,KAAA,mBAAA,CAGA,IAAA,GAAA,EAAA,mBAAA,KCzBA,OAFA,GAAA,aAEA,GAKA,GAAA,cACA,MAAA,MAAA,KAAA,oBAAA,MAOA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,aAAA,EAAA,GACA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,IAIA,gBAAA,SAAA,GACA,GAAA,GAAA,KAAA,KAAA,aAAA,EACA,MAAA,KAAA,gBAAA,GAEA,EAAA,KAAA,EAAA,GAEA,EAAA,KAAA,IAGA,QAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,KAAA,IAGA,GAAA,aACA,GAAA,GAAA,EAAA,IAAA,KAOA,OANA,IACA,EAAA,IAAA,KAEA,EAAA,GAAA,GAAA,EAAA,MAAA,UAAA,OAGA,GC3CA,GAAA,aAEA,MAAA,GAAA,MAAA,WAIA,GAAA,WAAA,GACA,KAAA,aAAA,QAAA,IAIA,GAAA,MACA,MAAA,GAAA,MAAA,IAIA,GAAA,IAAA,GAEA,KAAA,aAAA,KAAA,MAIA,EAAA,QAAA,SAAA,GACA,YAAA,IAEA,EAAA,UAAA,GAAA,SAAA,GACA,MAAA,MAAA,QAAA,OAMA,EAAA,UAAA,yBACA,EAAA,UAAA,uBAEA,EAAA,UAAA,kBAGA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAGA,EAAA,EAAA,EACA,SAAA,gBAAA,KAAA,MAEA,EAAA,mCAAA,EAEA,EAAA,aAAA,EACA,EAAA,SAAA,QAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,OAAA,GACA,IAAA,IACA,MAAA,OAEA,KAAA,IACA,MAAA,MACA,KAAA,IACA,MAAA,MACA,KAAA,IAEA,MAAA,QACA,KAAA,OAEA,MAAA,UCpCA,QAAA,GAAA,GAEA,MAAA,GAAA,QAAA,EAAA,GAIA,QAAA,GAAA,GACA,MAAA,GAAA,QAAA,EAAA,GAKA,QAAA,GAAA,GAEA,IAAA,GADA,MACA,EAAA,EAAA,EAAA,EAAA,OAAA,IAEA,EAAA,EAAA,KAAA,CAEA,OAAA,GCNA,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,GCPA,QAAA,GAAA,EAAA,GAEA,GAAA,GAAA,EAAA,EAAA,WAAA,GACA,GAAA,UAAA,CCrEA,KDuEA,GAEA,GAFA,EAAA,EAAA,SAAA,0BCvEA,EAAA,EAAA,YACA,EAAA,YAAA,EAGA,OAAA,GAAA,GAIA,QAAA,GAAA,GACA,MAAA,YAEA,MADA,GAAA,mBACA,KAAA,KAAA,IAIA,QAAA,GAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAkBA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GACA,IAAA,EAAA,GACA,IAAA,SAAA,GACA,EAAA,mBACA,KAAA,KAAA,GAAA,GAGA,cAAA,EACA,YAAA,IAUA,QAAA,GAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAEA,MAAA,WAGA,MAFA,GAAA,mBAEA,KAAA,KAAA,GAAA,MAAA,KAAA,KAAA,YAEA,cAAA,EACA,YAAA,ILIA,GAAA,GAAA,EAAA,SAAA,QClEA,EAAA,EAAA,aACA,EAAA,EAAA,gBACA,EAAA,EAAA,MAEA,EAAA,EAAA,eACA,EAAA,EAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,iBACA,EAAA,EAAA,OACA,EAAA,EAAA,KACA,EAAA,EAAA,SASA,EAAA,cACA,EAAA,eCIA,EAAA,GAEA,OACA,OACA,KACA,MAEA,UACA,QACA,KACA,MACA,QAEA,SACA,OACA,OACA,QACA,SACA,QAEA,QAIA,EAAA,GCjDA,QACA,SACA,MAEA,SACA,UAEA,WACA,YACA,aA0DA,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,GAQA,GAAA,GAAA,EAAA,KAAA,WAIA,YAFA,KAAA,YAAA,EGzFA,IAAA,GAAA,EAAA,KAAA,WAGA,MAAA,2BACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAEA,EAAA,KAAA,EAAA,KAAA,UAMA,GACA,eAAA,GAAA,oBAEA,EAAA,KAAA,QAAA,GAGA,KAAA,KAAA,UAAA,CFpBA,IAAA,GAAA,EAAA,KAAA,WAGA,GAAA,KAAA,aACA,WAAA,EAEA,aAAA,IAGA,EAAA,GACA,EAAA,EAAA,OAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,WAAA,GAEA,GAAA,GAAA,KAAA,UAEA,IAAA,EAAA,CACA,EAAA,0BACA,IAAA,GAAA,EAAA,EAAA,EAEA,GAAA,aAAA,EAAA,QAKA,mBAAA,SAAA,EAAA,GAEA,GAAA,GAAA,CACA,QAAA,OAAA,GAAA,eAEA,IAAA,cACA,EAAA,KAAA,WACA,EAAA,IACA,MACA,KAAA,WACA,EAAA,KAAA,WACA,EAAA,KAAA,WACA,MACA,KAAA,aACA,EAAA,KACA,EAAA,KAAA,UAEA,MACA,KAAA,YACA,EAAA,KAEA,EAAA,IACA,MACA,SAEA,OAIA,GAAA,GAAA,EAAA,EAAA,EACA,GAAA,aAAA,EAAA,OCxCA,eACA,aACA,YACA,cACA,eACA,aACA,YACA,cACA,eAEA,eACA,QAAA,IAgBA,aACA,aAEA,QAAA,IAiBA,wBACA,iBAEA,kBACA,QAAA,GAKA,EAAA,EAAA,EACA,SAAA,cAAA,MAEA,EAAA,SAAA,YAAA,EAIA,EAAA,aAAA,EAEA,EAAA,aAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,WAAA,WACA,GAAA,GAAA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,UACA,OAAA,IAAA,EAAA,MAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GACA,OAAA,mBAQA,SAAA,GACA,YASA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GATA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,OAAA,kBAOA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,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,MAOA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,GACA,OAAA,mBAOA,SACA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAQA,QAAA,GAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,OAEA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,SAAA,IACA,EAAA,MAAA,GACA,SAAA,IACA,EAAA,OAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,EAEA,SAAA,cAAA,QAsBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAOA,SAAA,GACA,YAaA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YAIA,GAHA,EAAA,MAEA,EAAA,SAAA,SACA,EAAA,iBAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAKA,GACA,EAAA,EAAA,GAGA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAQA,SACA,GACA,YAgBA,SAAA,GAAA,GACA,IAAA,EAAA,YACA,MAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,KAAA,EAAA,CAKA,IADA,EAAA,EAAA,eAAA,mBAAA,IACA,EAAA,WACA,EAAA,YAAA,EAAA,UAEA,GAAA,IAAA,EAAA,GAGA,MAAA,GAGA,QAAA,GAAA,GAOA,IAJA,GAGA,GAHA,EAAA,EAAA,EAAA,eACA,EAAA,EAAA,EAAA,0BAGA,EAAA,EAAA,YAEA,EAAA,YAAA,EAEA,OAAA,GAMA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,KAAA,IAEA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,IAAA,KAAA,EAAA,KAtDA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,GAAA,SACA,EAAA,GAAA,SAqCA,EAAA,OAAA,mBAWA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,WACA,GAAA,WAEA,MAAA,GACA,EAAA,KAAA,KAAA,SACA,EAAA,IAAA,SASA,GACA,EAAA,EAAA,GAEA,EAAA,SAAA,oBAAA,GAEA,OAAA,mBAMA,SACA,GACA,YASA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GARA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,gBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAIA,EAAA,SAAA,iBAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GASA,QAAA,GAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAGA,IAAA,GAAA,EAAA,SAAA,cAAA,SACA,GAAA,KAAA,KAAA,GAEA,EAAA,EAAA,MAEA,EAAA,aAAA,UAAA,QACA,SAAA,GAEA,EAAA,aAAA,MAAA,GAjCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,OAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAGA,EAAA,EAAA,EACA,SAAA,cAAA,UAqBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,iBAAA,EACA,EAAA,SAAA,MAAA,GACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GAEA,MAAA,GAAA,QAAA,OAAA,KAAA,OAGA,QAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAwBA,QAAA,GAAA,EAAA,EAAA,EAAA,GAEA,KAAA,eAAA,IACA,KAAA,IAAA,WACA,yDAIA,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,EA1DA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,OAAA,iBAUA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QAEA,MAAA,GAAA,KAAA,cAEA,GAAA,MAAA,GAEA,KAAA,YAAA,EAAA,OAAA,KAEA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EAEA,SAAA,cAAA,WAwBA,EAAA,UAAA,EAAA,UAEA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,OAAA,GACA,OAAA,mBAMA,SACA,GACA,YAYA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAXA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,iBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WACA,IAAA,SAAA,EAAA,GACA,gBAAA,KACA,EAAA,EAAA,IACA,EAAA,MAAA,IAAA,EAAA,GAAA,IAIA,OAAA,SAAA,GAGA,MAAA,UAAA,MAEA,GAAA,UAAA,OAAA,KAAA,OAKA,gBAAA,KACA,EAAA,EAAA,QAGA,GAAA,MAAA,OAAA,KAIA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,EAAA,EACA,SAAA,cAAA,WAEA,EAAA,SAAA,kBAAA,GAEA,OAAA,mBAUA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAEA,EAAA,EAAA,mBAEA,EAAA,OAAA,gBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAGA,cAAA,WACA,MAAA,GAAA,EAAA,MAAA,kBAGA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAEA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAKA,YAAA,WACA,MAAA,GAAA,EAAA,MAAA,gBAEA,GAAA,SACA,MAAA,GAAA,EAAA,MAAA,QAIA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,UAEA,YAAA,WAEA,MAAA,GAAA,EAAA,MAAA,gBAGA,GAAA,QAEA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAIA,EAAA,EAAA,EAEA,SAAA,cAAA,UAEA,EAAA,SAAA,iBAAA,GAEA,OAAA,mBEroBA,SAAA,GACA,YAcA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAZA,GAAA,GAAA,EAAA,SAAA,YAEA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,mBACA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,uBAKA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,OAEA,UAAA,SAAA,GACA,MAAA,GAAA,EAAA,MAAA,UAAA,OAKA,EAAA,EAAA,EAEA,SAAA,cAAA,UAGA,EAAA,SAAA,wBAAA,GACA,OAAA,mBAQA,SAAA,GAEA,YCvCA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GDwCA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MAEA,EAAA,EAAA,gBAEA,EAAA,EAAA,mBCrDA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,mBAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,EAAA,WAEA,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,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,OAAA,EAAA,WACA,IAAA,UACA,MAAA,IAAA,GAAA,EAEA,KAAA,SACA,MAAA,IAAA,GAAA,EACA,KAAA,WACA,MAAA,IAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAnBA,GAAA,GAAA,EAAA,SAAA,mBACA,EAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,kBACA,EAAA,EAAA,SAAA,oBAEA,GADA,EAAA,MACA,EAAA,iBAEA,EAAA,OAAA,kBAcA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,GACA,EAAA,SAAA,mBAAA,GACA,OAAA,mBC1DA,SAAA,GAEA,YAGA,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,GAEA,OAAA,mBAOA,SACA,GAEA,YAsBA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GArBA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBAEA,EAAA,EAAA,OACA,EAAA,EAAA,KAGA,EAAA,OAAA,cAMA,EAAA,6BACA,EAAA,EAAA,SAAA,gBAAA,EAAA,MACA,EAAA,SAAA,gBAAA,EAAA,OACA,EAAA,EAAA,YACA,EAAA,OAAA,eAAA,EAAA,WACA,EAAA,EAAA,WAOA;EAAA,UAAA,OAAA,OAAA,GAIA,gBAAA,IACA,EAAA,EAAA,WAEA,GAAA,gBACA,MAAA,GAAA,EAAA,MAAA,eAEA,GAAA,wBACA,MAAA,GAAA,EAAA,MAAA,yBAMA,EAAA,EAAA,EAAA,GAEA,EAAA,SAAA,cAAA,GACA,OAAA,mBAQA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GAVA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,KAEA,EAAA,OAAA,kBACA,KAOA,EAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAGA,GAAA,wBACA,MAAA,GAAA,KAAA,KAAA,uBAIA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAMA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,cACA,KAAA,IAAA,OAAA,oBAKA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAIA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAKA,GAAA,mBACA,MAAA,GAAA,KAAA,KAAA,kBAKA,GAAA,eACA,MAAA,GAAA,KAAA,KAAA,gBAKA,EAAA,EAAA,GAGA,EAAA,SAAA,mBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAUA,SAAA,GAAA,GACA,KAAA,KAAA,EATA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,wBAOA,GAAA,EAAA,WACA,GAAA,UAEA,MAAA,GAAA,KAAA,KAAA,SAGA,UAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,UAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WAEA,MADA,WAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,cAMA,EAAA,EAAA,EACA,SAAA,cAAA,UAAA,WAAA,OAEA,EAAA,SAAA,yBAAA,GACA,OAAA,mBAOA,SAAA,GAEA,YAaA,SAAA,GAAA,GACA,KAAA,KAAA,EAZA,GAAA,GAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,qBAGA,IAAA,EAAA,CAOA,EAAA,EAAA,WACA,GAAA,UACA,MAAA,GAAA,KAAA,KAAA,SAIA,WAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,WAAA,MAAA,KAAA,KAAA,YAGA,cAAA,WACA,UAAA,GAAA,EAAA,UAAA,IACA,KAAA,KAAA,cAAA,MAAA,KAAA,KAAA,aAQA,IAAA,GAAA,SAAA,KAAA,UAAA,YACA,oBAAA,KAAA,mBAAA,QAGA,GAAA,EAAA,EACA,GAGA,EAAA,SAAA,sBAAA,IACA,OAAA,mBAMA,SAAA,GACA,YAYA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,KAGA,EAAA,OAAA,KAMA,GAAA,WACA,GAAA,kBACA,MAAA,GAAA,KAAA,KAAA,iBAGA,GAAA,gBACA,MAAA,GAAA,KAAA,KAAA,eAGA,GAAA,2BACA,MAAA,GAAA,KAAA,KAAA,0BAEA,SAAA,SAAA,EAAA,GACA,KAAA,KAAA,SAAA,EAAA,GAAA,IAGA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GACA,KAAA,KAAA,eAAA,EAAA,KAGA,cAAA,SAAA,GACA,KAAA,KAAA,cAAA,EAAA,KAEA,aAAA,SAAA,GAEA,KAAA,KAAA,aAAA,EAAA,KAGA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,mBAAA,SAAA,GAEA,KAAA,KAAA,mBAAA,EAAA,KAEA,sBAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,sBAAA,EAAA,EAAA,KCzUA,gBAAA,WACA,MAAA,GAAA,KAAA,KAAA,oBAGA,cAAA,WAEA,MAAA,GAAA,KAAA,KAAA,kBAEA,WAAA,SAAA,GACA,KAAA,KAAA,WAAA,EAAA,KAEA,iBAAA,SAAA,GACA,KAAA,KAAA,iBAAA,EAAA,KAGA,WAAA,WACA,MAAA,GAAA,KAAA,KAAA,eAGA,eAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,eAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GAEA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,eAAA,SAAA,GAEA,MAAA,MAAA,KAAA,eAAA,EAAA,KAEA,SAAA,WAEA,MAAA,MAAA,KAAA,aAMA,EAAA,UAAA,2BACA,EAAA,UAAA,yBAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,yBAAA,MAKA,EAAA,OAAA,MAAA,EAAA,SAAA,eAGA,EAAA,SAAA,MAAA,GAEA,OAAA,mBAMA,SAAA,GAEA,YAEA,IAAA,GAAA,EAAA,uBACA,EAAA,EAAA,oBAEA,EAAA,EAAA,mBAEA,EAAA,EAAA,MAEA,EAAA,EAAA,eCnEA,EAAA,EAAA,SAAA,yBACA,GAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,EAGA,IAAA,GAAA,EAAA,SAAA,cAAA,IAIA,GAAA,SAAA,QAAA,EACA,EAAA,SAAA,iBAAA,GAGA,OAAA,mBAOA,SACA,GCvBA,YAoBA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,KAAA,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,GAhCA,GAAA,GAAA,EAAA,SAAA,iBAEA,EAAA,EAAA,UACA,EAAA,EAAA,iBAEA,EAAA,EAAA,aAEA,EAAA,EAAA,aACA,EAAA,EAAA,MACA,EAAA,EAAA,OACA,EAAA,EAAA,aACA,EAAA,EAAA,OAEA,EAAA,GAAA,SACA,EAAA,GAAA,SAEA,EAAA,aAkBA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WACA,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,mBAMA,SAAA,GACA,YAqBA,SAAA,GAAA,GAEA,EAAA,iBAAA,EAAA,gBAEA,EAAA,aAAA,EAAA,YACA,EAAA,YAAA,EAAA,WCjFA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,GAAA,IAMA,IAJA,EAAA,GAEA,EAAA,GAEA,EAYA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,iBAAA,EAAA,oBAfA,CAEA,EAAA,WAAA,EAAA,UACA,EAAA,YAAA,EAAA,aACA,EAAA,YAAA,EAAA,WAEA,IAAA,GAAA,EAAA,EAAA,UACA,KAEA,EAAA,aAAA,EAAA,aASA,EAAA,aAAA,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,GAGA,EAAA,YAAA,IACA,EAAA,WAAA,GACA,EAAA,aAAA,IACA,EAAA,YAAA,GAEA,EAAA,YAAA,IAOA,QAAA,GAAA,GACA,EAAA,IAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,IAAA,EAGA,OAFA,IACA,EAAA,IAAA,EAAA,MACA,EAIA,QAAA,GAAA,GAEA,IAAA,GADA,MAAA,EAAA,EACA,EAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YACA,EAAA,KAAA,CAEA,OAAA,GCpFA,QAAA,KAGA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GAEA,EAAA,EAAA,cACA,IAAA,EAAA,OAIA,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,EAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,GAAA,IACA,OAAA,aAAA,GACA,EAEA,KAGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,MAcA,QAAA,GAAA,GACA,KAAA,MAAA,EACA,KAAA,KAAA,EACA,KAAA,cAkEA,QAAA,GAAA,GACA,KAAA,KAAA,EACA,KAAA,OAAA,EACA,KAAA,uBACA,KAAA,cAAA,GA0OA,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,QAWA,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,GF7YA,GErEA,GFqEA,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,OAEA,EAAA,EAAA,KCfA,EAAA,GAAA,SACA,EAAA,GAAA,SACA,EAAA,GAAA,SC5EA,EAAA,EAAA,QACA,wBACA,2BACA,8BACA,eAIA,KAqDA,EAAA,GAAA,YACA,GAAA,OAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,GAeA,EAAA,WAEA,OAAA,SAAA,GACA,GAAA,GAAA,GAAA,GAAA,EAGA,OAFA,MAAA,WAAA,KAAA,GAEA,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,GAKA,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,CAGA,GAFA,KAAA,OAAA,EACA,EAAA,KAAA,MACA,EACA,MACA,GAAA,OAAA,GAAA,EAAA,KAKA,aAAA,SAAA,GACA,KAAA,SAAA,GACA,KAAA,uBAAA,IAGA,SAAA,SAAA,GACA,EAAA,GACA,EAAA,GAEA,EAAA,EAEA,KAAA,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,IAKA,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,KAAA,uBAAA,MAsDA,IAAA,GAAA,iBAoEA,GAAA,UAAA,yBAAA,WACA,GAAA,GAAA,KAAA,KAAA,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,KAAA,KAAA,uBAAA,EACA,GACA,EAAA,cAGA,EAAA,mBAAA,EACA,EAAA,eAAA,EACA,EAAA,iBAAA,EAEA,EAAA,8BAAA,EAIA,EAAA,QACA,aAAA,EACA,OAAA,IAGA,OAAA,mBAMA,SAAA,GACA,YAuBA,SAAA,GAAA,GACA,GAAA,OAAA,GAAA,CAKA,GAAA,EAAA,SAAA,GAEA,IAAA,GAAA,SAAA,GAEA,EAAA,KAAA,KAAA,GAEA,GAAA,UAAA,OAAA,OAAA,EAAA,WACA,EAAA,EAAA,WAEA,GAAA,QACA,MAAA,GAAA,EAAA,MAAA,SAKA,EAAA,OAAA,GAAA,EACA,SAAA,cAAA,EAAA,MAAA,EAAA,MACA,EAAA,SAAA,GAAA,GA5CA,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,sBA6BA,GAAA,QAAA,IAEA,OAAA,mBAMA,SAAA,GACA,YAWA,SAAA,GAAA,GACA,KAAA,KAAA,EAVA,CAAA,GAAA,GAAA,EAAA,gBACA,EAAA,EAAA,OACA,EAAA,EAAA,eAEA,EAAA,EAAA,IAGA,QAAA,UAKA,EAAA,WACA,GAAA,cACA,MAAA,GAAA,KAAA,KAAA,aAGA,GAAA,aACA,MAAA,GAAA,KAAA,KAAA,YAEA,SAAA,SAAA,GACA,KAAA,KAAA,SAAA,EAAA,KAEA,SAAA,SAAA,EAAA,GAEA,KAAA,KAAA,SAAA,EAAA,GAAA,IAEA,aAAA,SAAA,EAAA,GACA,MAAA,MAAA,KAAA,aAAA,EAAA,GAAA,IAEA,OAAA,SAAA,EAAA,GACA,KAAA,KAAA,OAAA,EAAA,GAAA,IAEA,WAAA,SAAA,GACA,MAAA,GAAA,KAAA,KAAA,WAAA,KAEA,YAAA,SAAA,GACA,KAAA,KAAA,YAAA,EAAA,KAEA,kBAAA,SAAA,GACA,KAAA,KAAA,kBAAA,EAAA,KAEA,SAAA,WACA,MAAA,MAAA,KAAA,aAmBA,EAAA,OAAA,UAAA,EAAA,OAAA,gBAEA,EAAA,SAAA,UAAA,GAGA,OAAA,mBAOA,SAAA,GACA,YA4BA,SAAA,GAAA,GACA,EAAA,KAAA,KAAA,GACA,KAAA,WAAA,GAAA,GAAA,KAAA,MAeA,QAAA,GAAA,GACA,GAAA,GAAA,SAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAmBA,QAAA,GAAA,EAAA,GACA,EAAA,KAAA,EAAA,KAAA,EAAA,IACA,EAAA,EAAA,GAGA,QAAA,GAAA,EAAA,GACA,EAAA,YACA,EAAA,UAAA,EAAA,YAEA,YAAA,IACA,EAAA,EAAA,EACA,KAAA,GAAA,GAAA,EAAA,WAAA,EAAA,EAAA,EAAA,YAEA,EAAA,EAAA,GCjwBA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,eACA,IACA,EAAA,UAAA,GC0LA,QAAA,GAAA,GACA,KAAA,KAAA,EAGA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,EAAA,MAAA,KAAA,KAAA,aAIA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,SAAA,eAAA,EACA,GAAA,UAAA,GAAA,WACA,MAAA,GAAA,MAAA,KAAA,KAAA,YFweA,GAAA,GAAA,EAAA,uBACA,EAAA,EAAA,SAAA,KAEA,EAAA,EAAA,oBACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,mBACA,EAAA,EAAA,SAAA,WACA,EAAA,EAAA,UACA,EAAA,EAAA,UAEA,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,OACA,EAAA,EAAA,KACA,EAAA,EAAA,uBAIA,GAFA,EAAA,aAEA,GAAA,SAOA,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,UC3uBA,EAAA,SAAA,YA6BA,IA1BA,EAAA,EAAA,WAEA,UAAA,SAAA,GAKA,MAJA,GAAA,YACA,EAAA,WAAA,YAAA,GACA,EAAA,EAAA,MAEA,GAEA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,KAAA,EAAA,IAEA,WAAA,SAAA,EAAA,GACA,MAAA,GAAA,EAAA,EAAA,KAAA,OAEA,aAAA,WAGA,MAFA,KAEA,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,GCwCA,QAAA,GAAA,GACA,MAAA,QASA,KAAA,KAAA,GARA,EAEA,SAAA,cAAA,EAAA,GAEA,SAAA,cAAA,GD7CA,GAAA,GAAA,CC/BA,IDgCA,SAAA,IACA,EAAA,EAAA,UACA,EAAA,EAAA,aCzCA,EAAA,OAAA,OAAA,YAAA,YAOA,EAAA,qBAAA,IAAA,GAEA,KAAA,IAAA,OAAA,oBAWA,KAJA,GAEA,GAFA,EAAA,OAAA,eAAA,GAGA,KACA,KACA,EAAA,EAAA,qBAAA,IAAA,KAGA,EAAA,KAAA,GACA,EAAA,OAAA,eAAA,EAIA,KAAA,EAEA,KAAA,IAAA,OAAA,oBAWA,KAAA,GAFA,GAAA,OAAA,OAAA,GAEA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IACA,EAAA,OAAA,OAAA,IASA,kBACA,mBACA,mBACA,4BACA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,EACA,KAEA,EAAA,GAAA,WAIA,EAAA,eAAA,IAEA,EAAA,MAEA,EAAA,MAAA,EAAA,MAAA,cAIA,IAAA,IAAA,UAAA,EACA,KACA,EAAA,QAAA,GAeA,EAAA,UAAA,EACA,EAAA,UAAA,YAAA,EAGA,EAAA,iBAAA,IAAA,EAAA,GACA,EAAA,qBAAA,IAAA,EAAA,EAGA,GAAA,KAAA,EAAA,MACA,EAAA,EACA,OAAA,IAGA,GACA,OAAA,cAAA,OAAA,WAEA,oBAOA,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,gBAEA,cACA,iBACA,mBACA,iBACA,oBACA,iBAGA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GACA,EAAA,EAAA,UAAA,GAEA,EAAA,EAAA,WACA,GAAA,kBAEA,GAAA,GAAA,EAAA,IAAA,KACA,OAAA,GACA,GACA,EACA,GAAA,GAAA,EAAA,MAAA,gBACA,EAAA,IAAA,KAAA,GACA,IAIA,GAAA,eACA,MAAA,GAAA,EAAA,MAAA,gBAIA,EAAA,OAAA,SAAA,EACA,SAAA,eAAA,mBAAA,KAKA,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,eAIA,EAAA,kBAAA,EACA,EAAA,SAAA,kBAAA,EACA,EAAA,SAAA,SAAA,GAEA,OAAA,mBAMA,SAAA,GACA,YAgBA,SAAA,GAAA,GAEA,EAAA,KAAA,KAAA,GAhBA,GAAA,GAAA,EAAA,SAAA,YACA,EAAA,EAAA,SAAA,UACA,EAAA,EAAA,MACA,EAAA,EAAA,gBACA,EAAA,EAAA,iBAEA,EAAA,EAAA,OACA,EAAA,EAAA,eACA,EAAA,EAAA,KAEA,EAAA,OAAA,OACA,EAAA,OAAA,iBACA,EAAA,OAAA,YAMA,GAAA,UAAA,OAAA,OAAA,EAAA,WAEA,EAAA,UAAA,iBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,QAAA,iBAAA,EAAA,GAAA,IAIA,EAAA,UAAA,aAAA,WACA,MAAA,GAAA,MAAA,QAAA,sBAIA,QAAA,uBACA,QAAA,cAGA,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,aAIA,EAAA,EAAA,EAAA,QAEA,EAAA,SAAA,OAAA,GAGA,OAAA,mBAQA,SAAA,GACA,YAEA,IAAA,GAAA,EAAA,OAOA,EAAA,OAAA,cAAA,OAAA,UACA,EACA,EAAA,UAAA,YAEA,GAAA,UAAA,aAAA,SAAA,EAAA,EAAA,GACA,EAAA,KAAA,KAAA,EAAA,GAAA,EAAA,KAGA,OAAA,mBAMA,SAAA,GACA,YA2FA,SAAA,GAAA,GACA,GAAA,GAAA,EAAA,GACA,EAAA,OAAA,EACA,IAAA,EAAA,CAEA,GAAA,GAAA,SAAA,cAAA,GAEA,EAAA,EAAA,WACA,QAAA,GAAA,GAjGA,GAIA,IAJA,EAAA,cAKA,EAAA,oBAKA,KAAA,kBACA,MAAA,mBAEA,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,qBAEA,KAAA,kBACA,GAAA,gBACA,KAAA,kBACA,OAAA,oBACA,IAAA,mBACA,MAAA,mBACA,OAAA,oBACA,MAAA,mBAEA,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,0BAEA,KAAA,kBACA,MAAA,mBACA,GAAA,sBACA,MAAA,mBACA,GAAA,mBACA,MAAA,oBAgBA,QAAA,KAAA,GAAA,QAAA,GAEA,OAAA,oBAAA,EAAA,UAAA,QAAA,SAAA,GACA,OAAA,GAAA,EAAA,SAAA,MAGA,OAAA,mBAYA,SACA,GAyCA,QAAA,GAAA,EAAA,GACA,GAAA,GACA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GAEA,EAAA,KAAA,GACA,EAAA,EAAA,eAEA,KAAA,EAAA,EAAA,OAAA,EAAA,GAAA,EAAA,IAEA,GADA,EAAA,EAAA,GAAA,cAAA,GAEA,MAAA,EAIA,MAAA,GAAA,CAEA,GADA,EAAA,EAAA,EAAA,GAEA,MAAA,EAEA,GAAA,EAAA,mBAGA,MAAA,MAGA,QAAA,GAAA,EAAA,EAAA,GACA,GACA,GAAA,EAAA,EAAA,EAAA,EADA,EAAA,EAAA,iBAIA,KAFA,KACA,EAAA,EAAA,WACA,GACA,EAAA,KAAA,GAEA,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,kBAGA,OAAA,GAtFA,OAAA,KAAA,kBAAA,aAEA,OAAA,OAAA,kBAAA,eAqBA,OAAA,eAAA,QAAA,UAAA,mBAEA,OAAA,yBAAA,QAAA,UAAA,cAEA,IAAA,GAAA,QAAA,UAAA,gBACA,SAAA,UAAA,iBAAA,WACA,GAAA,GAAA,EAAA,KAAA,KAEA,OADA,gBAAA,YAAA,MACA,GAIA,QAAA,UAAA,uBAAA,QAAA,UAAA,iBAsDA,EAAA,gBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GACA,EAAA,EAAA,MAEA,EAAA,EAAA,KAGA,OAAA,UC5dA,SAAA,GC0BA,QACA,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,QAGA,OAFA,GAAA,YAAA,EAEA,UC7HA,GAAA,GACA,GAAA,GAAA,EAAA,EACA,UAAA,KAAA,YAAA,EACA,IAAA,KACA,IAAA,EAAA,MAOA,IAEA,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,gBAEA,EAAA,EAAA,cAAA,OACA,GAAA,KAAA,SAAA,QAEA,EAAA,KAAA,YAAA,GAIA,QAAA,GAAA,GACA,EAAA,aACA,IAEA,SAAA,KAAA,YAAA,GACA,EAAA,EAAA,iBACA,SAAA,KAAA,YAAA,GAOA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CAIA,GAAA,EAEA,IAAA,EAAA,MAAA,YAAA,EAAA,CAEA,GAAA,GAAA,EAAA,EACA,GAAA,SAAA,GACA,EAAA,KAAA,YAAA,EAAA,MACA,EAAA,EAAA,MAAA,SACA,EAAA,SAIA,GAAA,EAAA,GAEA,EAAA,IAaA,QAAA,GAAA,GACA,GACA,IAAA,YAAA,SAAA,eAAA,IAKA,QAAA,GAAA,EAAA,GACA,GAAA,GAAA,EAAA,EACA,GAAA,aAAA,EAAA,IACA,EAAA,aAAA,EAAA,IACA,SAAA,KAAA,YAAA,GASA,QAAA,KAMA,MALA,KACA,EAAA,SAAA,cAAA,SACA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,GAEA,EF1BA,GAAA,IACA,eAAA,EACA,YAQA,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,IAOA,UAAA,SAAA,EAAA,GAEA,MAAA,MAAA,YAAA,EAAA,YAAA,IAMA,YAAA,SAAA,EAAA,GAGA,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,GAGA,YAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAAA,EAAA,EGpIA,OHsIA,MAAA,oBAAA,EAAA,WAAA,KAAA,kBG3IA,KAAA,aAAA,EAAA,EAAA,YAEA,KAAA,eACA,KAAA,oBAAA,EAAA,GAEA,EAAA,aAGA,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,GCdA,GAAA,GAAA,KAAA,SAAA,IACA,KAAA,EACA,KAAA,EACA,YAAA,GAEA,EAAA,KAAA,WAAA,EACA,GAAA,WAAA,EACA,EAAA,YAAA,EAAA,UAEA,IAAA,GAAA,KAAA,SAAA,EAAA,YAIA,OAHA,KACA,EAAA,YAAA,EAAA,YAAA,OAAA,EAAA,cAEA,GAGA,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,GAEA,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,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,IAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,GACA,MAAA,GAAA,QAkBA,6BAAA,SAAA,GAOA,MALA,GAAA,EAAA,QAAA,EAAA,SAAA,EAAA,GAEA,MAAA,GAAA,MAAA,EAAA,MAGA,EAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,EAAA,IAAA,QAAA,EAAA,GACA,OAAA,GAAA,KAYA,aAAA,SAAA,EAAA,GAEA,GAAA,GAAA,KAAA,gCAAA,EAMA,IALA,EAAA,KAAA,4BAAA,GACA,EAAA,KAAA,iBAAA,GACA,EAAA,KAAA,wBAAA,GAEA,EAAA,KAAA,mBAAA,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,IAYA,iBAAA,SAAA,GACA,MAAA,MAAA,iBAAA,EAAA,eACA,KAAA,wBAmBA,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,KCjMA,6BAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,MAAA,GACA,KAAA,sBAAA,EAAA,EAAA,GAEA,EAAA,EAAA,EAAA,KAAA,EAAA,IAAA,EAAA,GAKA,sBAAA,SAAA,EAAA,EAAA,GACA,MAAA,GAAA,EAAA,QAAA,EAAA,IAAA,GAMA,mBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,cAAA,OAAA,IACA,EAAA,EAAA,QAAA,cAAA,GAAA,IAEA,OAAA,IAGA,WAAA,SAAA,EAAA,GACA,GAAA,GAAA,ECIA,ODHA,IAEA,MAAA,UAAA,QAAA,KAAA,EAAA,SAAA,GC9BA,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,cAcA,KACA,EAAA,UACA,GAAA,EAAA,QAAA,QAEA,MAAA,MAIA,MAEA,GAEA,cAAA,SAAA,EAAA,EAAA,GACA,GAAA,MAAA,EAAA,EAAA,MAAA,IAaA,OAZA,GAAA,QAAA,SAAA,GACA,EAAA,EAAA,OACA,KAAA,qBAAA,EAAA,KAEA,EAAA,IAAA,EAAA,MAAA,0BACA,KAAA,yBAAA,EAAA,GACA,KAAA,mBAAA,EAAA,IAIA,EAAA,KAAA,IACA,MACA,EAAA,KAAA,OAEA,qBAAA,SAAA,EAAA,GAEA,GAAA,MAAA,QAAA,GAEA,OAAA,CAEA,IAAA,GAAA,KAAA,iBAAA,EACA,QAAA,EAAA,MAAA,ICxDA,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,IAKA,uBAAA,SAAA,EAAA,GAGA,IAAA,GAAA,GAFA,KAEA,EAAA,EAAA,EAAA,EAAA,GAAA,IACA,EAAA,KAAA,KAAA,yBAAA,EAAA,GAEA,OAAA,GAAA,KAAA,OAIA,yBAAA,SAAA,EAAA,GACA,MAAA,GAAA,MAAA,iBACA,EAAA,EAAA,QAAA,yBAAA,GAEA,EAAA,QAAA,eAAA,EAAA,MAEA,EAAA,IAAA,GN5BA,yBAAA,SAAA,EAAA,GACA,EAAA,EAAA,QAAA,mBAAA,KACA,IAAA,IAAA,IAAA,IAAA,IAAA,KACA,EAAA,EACA,EAAA,IAAA,EAAA,GAcA,OAbA,GAAA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,MAAA,EACA,GAAA,EAAA,IAAA,SAAA,GAIA,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,uEAEA,EAAA,sDACA,EAAA,+DAGA,EAAA,+DACA,EAAA,wEAKA,EAAA,iBAEA,EAAA,oBACA,EAAA,iDAIA,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,OAEA,sBAAA,GAAA,QAAA,EAAA,OACA,eACA,QACA,MACA,cACA,mBACA,YACA,YCjFA,IAAA,GAAA,SAAA,cAAA,SACA,GAAA,MAAA,QAAA,MA0BA,IAoDA,GApDA,EAAA,UAAA,UAAA,MAAA,UA+CA,EAAA,iBAEA,EAAA,qBACA,EAAA,SAaA,IAAA,OAAA,kBAAA,CAEA,EAAA,wCACA,IAAA,GAAA,KAAA,UACA,EAAA,EAAA,cAAA,OACA,GAAA,aAAA,IAAA,EAAA,WAAA,IAMA,SAAA,iBAAA,mBAAA,WACA,GAAA,GAAA,EAAA,WAEA,IAAA,OAAA,cAAA,YAAA,UAAA,CACA,GAAA,GAAA,wBACA,EAAA,IACA,EAAA,SAAA,EAAA,GAEA,aAAA,SAAA,0BAAA,IAAA,EAEA,YAAA,SAAA,yBAAA,IAAA,EAEA,YAAA,OAAA,mBACA,YAAA,OAAA,kBACA,EACA,GACA,KAAA,IAEA,IAAA,GAAA,YAAA,OAAA,YAEA,aAAA,OAAA,aAAA,SAAA,GAEA,IAAA,EAAA,GAAA,CAIA,GAAA,GAAA,EAAA,iBAAA,CACA,KAAA,EAAA,aAAA,GAGA,WADA,GAAA,KAAA,KAAA,EAIA,GAAA,YACA,EAAA,EAAA,cAAA,cAAA,SAEA,EAAA,YAAA,EAAA,eACA,EAAA,WAAA,EAAA,OAGA,EAAA,aAAA,GAGA,EAAA,YAAA,EAAA,UAAA,GACA,EAAA,gBAAA,EAAA,IAEA,EAAA,aAAA,EAAA,IACA,EAAA,IAAA,EAEA,EAAA,aAAA,IAEA,EAAA,aAAA,EACA,EAAA,aAAA,EAAA,GAEA,EAAA,YAAA,IAGA,EAAA,gBAAA,EACA,KAAA,oBAAA,GAEA,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,OAWA,EAAA,UAAA,GAEA,OAAA,YAaA,WAIA,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,MAMA,SAAA,gBAAA,SAAA,GAOA,GALA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,IAIA,EAAA,UAAA,EAAA,SAAA,CAEA,IADA,GAAA,GAAA,SAAA,yBACA,EAAA,YACA,EAAA,YAAA,EAAA,WAGA,GAAA,SAAA,EAGA,MAAA,GAAA,SAAA,EAAA,WAGA,OAAA,UAOA,SAAA,GACA,YAgCA,SAAA,GAAA,GACA,MAAA,UAAA,EAAA,GAIA,QAAA,KACA,EAAA,KAAA,MACA,KAAA,YAAA,EAKA,QAAA,GAAA,GAKA,MAJA,IAAA,GACA,EAAA,KAAA,MAGA,EAAA,cAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAGA,KAAA,GAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GAGA,QAAA,GAAA,GAIA,GAAA,GAAA,EAAA,WAAA,EACA,OAAA,GAAA,IACA,IAAA,GAEA,KAAA,GAAA,GAAA,GAAA,GAAA,IAAA,QAAA,GAEA,EAGA,mBAAA,GASA,QAAA,GAAA,EAAA,EAAA,GAEA,QAAA,GAAA,GACA,EAAA,KAAA,GAKA,GAAA,GAAA,GAAA,eACA,EAAA,EACA,EAAA,GAEA,GAAA,EACA,GAAA,EACA,IAGA,GAAA,MAAA,EAAA,EAAA,IAAA,GAAA,GAAA,KAAA,KAAA,YAAA,CACA,GAAA,GAAA,EAAA,EACA,QAAA,GAEA,IAAA,eACA,IAAA,IAAA,EAAA,KAAA,GAKA,CAAA,GAAA,EAKA,CACA,EAAA,kBACA,MAAA,GANA,EAAA,GACA,EAAA,WAEA,UAPA,GAAA,EAAA,cACA,EAAA,QAWA,MAEA,KAAA,SACA,GAAA,GAAA,EAAA,KAAA,GACA,GAAA,EAAA,kBAEA,CAAA,GAAA,KAAA,EAsBA,CAAA,GAAA,EAKA,CAAA,GAAA,GAAA,EACA,KAAA,EAGA,GAAA,qCAAA,EACA,MAAA,GATA,EAAA,GACA,EAAA,EACA,EAAA,WACA,UAvBA,GAFA,KAAA,QAAA,EACA,EAAA,GACA,EACA,KAAA,EAGA,GAAA,KAAA,WACA,KAAA,aAAA,GAIA,EADA,QAAA,KAAA,QACA,WACA,KAAA,aAAA,GAAA,EAAA,SAAA,KAAA,QAEA,wBACA,KAAA,YACA,wBAGA,cAcA,KAGA,KAAA,cACA,KAAA,GACA,MAAA,IAEA,EAAA,SACA,KAAA,GACA,KAAA,UAAA,IAEA,EAAA,YAGA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IAEA,KAAA,aAAA,EAAA,GAIA,MAEA,KAAA,YACA,GAAA,GAAA,EAAA,EAAA,SAIA,CACA,EAAA,UACA,UAJA,EAAA,mBACA,EAAA,KAAA,KAKA,MAEA,KAAA,wBAEA,GAAA,KAAA,GAAA,KAAA,EAAA,EAAA,GAEA,CAEA,EAAA,oBAAA,GAEA,EAAA,UACA,UANA,EAAA,0BASA,MAGA,KAAA,WAKA,GAJA,KAAA,aAAA,EAEA,QAAA,KAAA,UACA,KAAA,QAAA,EAAA,SACA,GAAA,EAAA,CACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAEA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,MACA,MAAA,GAEA,GAAA,KAAA,GAAA,MAAA,EACA,MAAA,GACA,EAAA,gCAEA,EAAA,qBAEA,IAAA,KAAA,EACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,IACA,EAAA,YACA,CAAA,GAAA,KAAA,EAQA,CACA,GAAA,GAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,IAGA,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,QAEA,KAAA,MAAA,OAEA,EAAA,eACA,UAtBA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,MAAA,QACA,KAAA,OAAA,EAAA,OACA,KAAA,UAAA,IAEA,EAAA,WAmBA,KAGA,KAAA,iBAEA,GAAA,KAAA,GAAA,MAAA,EMthBA,CACA,QAAA,KAAA,UACA,KAAA,MAAA,EAAA,MACA,KAAA,MAAA,EAAA,OCJA,EAAA,eACA;SPuhBA,MAAA,GACA,EAAA,gCAKA,EADA,QAAA,KAAA,QACA,YAGA,0BO9hBA,MAGA,KAAA,wBAEA,GAAA,KAAA,EAEA,CACA,EAAA,sBAAA,GAEA,EAAA,0BACA,UALA,EAAA,wBAOA,MAEA,KAAA,yBAEA,GADA,EAAA,2BACA,KAAA,EAAA,CACA,EAAA,sBAAA,EACA,UAGA,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,sBAKA,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,GA+BA,KAAA,GAAA,MAAA,GAAA,MAAA,ICtLA,GAAA,EAAA,QDuJA,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,IAEA,KAAA,UAAA,IACA,EAAA,YCjLA,KAEA,KAAA,QAEA,GAAA,KAAA,EAIA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,QAAA,EAAA,KAHA,KAAA,UAAA,IACA,EAAA,WAIA,MAGA,KAAA,WACA,GAAA,GAAA,KAAA,GAAA,MAAA,GAAA,MAAA,IACA,KAAA,WAAA,GAMA,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,GRwNA,GAAA,IAAA,CACA,KAAA,EAAA,UACA,IACA,GAAA,GAAA,GAAA,KAAA,IAAA,WACA,GAAA,eAAA,EAAA,KACA,MAAA,IAIA,IAAA,EAAA,CAIA,GAAA,GAAA,OAAA,OAAA,KACA,GAAA,IAAA,GACA,EAAA,KAAA,EACA,EAAA,OAAA,GACA,EAAA,KAAA,GACA,EAAA,MAAA,IACA,EAAA,GAAA,GAEA,EAAA,IAAA,GAEA,IAAA,GAAA,OAAA,OAAA,KACA,GAAA,OAAA,IACA,EAAA,QAAA,KACA,EAAA,QAAA,KACA,EAAA,UAAA,IAqDA,IAAA,GAAA,OAEA,EAAA,WACA,EAAA,mBQxSA,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,eAKA,EAAA,IAAA,IAEA,QAWA,SAAA,GAmBA,QAAA,GAAA,GAEA,IAAA,GADA,GAAA,MACA,EAAA,EAAA,EAAA,UAAA,OAAA,IAAA,CACA,GAAA,GAAA,UAAA,EACA,KACA,IAAA,GAAA,KAAA,GACA,EAAA,EAAA,EAAA,GAEA,MAAA,KAGA,MAAA,GAIA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,QAAA,eAAA,EAAA,EAAA,GAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,CACA,GAAA,GAAA,OAAA,yBAAA,EAAA,EACA,OAAA,IAAA,EAAA,OAAA,eAAA,GAAA,IAxCA,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,MAuCA,EAAA,MAAA,GAEA,OAAA,UAWA,SAAA,GAGA,YC3NA,SAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,gBAAA,GACA,SAAA,cAAA,GAAA,EAAA,WAAA,EAIA,IAFA,EAAA,UAAA,EAEA,EACA,IAAA,GAAA,KAAA,GACA,EAAA,aAAA,EAAA,EAAA,GAIA,OAAA,GDuNA,GAAA,GAAA,aAAA,UAAA,IACA,EAAA,aAAA,UAAA,MACA,cAAA,UAAA,IAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IACA,EAAA,KAAA,KAAA,UAAA,KAIA,aAAA,UAAA,OAAA,WACA,IAAA,GAAA,GAAA,EAAA,EAAA,UAAA,OAAA,IAEA,EAAA,KAAA,KAAA,UAAA,KAGA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,UAAA,SACA,GAAA,KAAA,SAAA,IAEA,EAAA,KAAA,IAAA,GAAA,KAAA,OAAA,IAEA,aAAA,UAAA,OAAA,SAAA,EAAA,GACA,GAAA,KAAA,OAAA,GACA,GAAA,KAAA,IAAA,GAMA,IAAA,GAAA,WAEA,MAAA,OAAA,UAAA,MAAA,KAAA,OAGA,EAAA,OAAA,cAAA,OAAA,mBASA,IAPA,SAAA,UAAA,MAAA,EACA,EAAA,UAAA,MAAA,EACA,eAAA,UAAA,MAAA,GAKA,OAAA,YAAA,CAEA,GAAA,GAAA,KAAA,KAEA,QAAA,aAAA,IAAA,WAAA,MAAA,MAAA,MAAA,IAKA,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,SAMA,OAAA,uBAEA,OAAA,qBAAA,WCvTA,MAAA,QAAA,4BACA,OAAA,yBACA,SAAA,GACA,aAAA,OAgCA,IAAA,MAEA,EAAA,WACA,EAAA,KAAA,WAEA,QAAA,QAAA,EAGA,EAAA,oBAAA,WAIA,MAHA,GAAA,oBAAA,WACA,KAAA,0CAEA,GAMA,OAAA,iBAAA,mBAAA,WACA,OAAA,UAAA,IACA,OAAA,QAAA,WACA,QAAA,MAAA,sIAQA,EAAA,UAAA,GAEA,OAAA,UAYA,SAAA,GACA,EAAA,gBAAA,EAAA,iBAAA,SAAA,GACA,MAAA,GAAA,UAEA,OAAA,UAYA,SAAA,GAGA,EAAA,IAAA,OAAA,aAGA,IAAA,EAEA,QAAA,SAAA,SAAA,EAAA,GAEA,IACA,EAAA,OAAA,KAAA,GAAA,sBAAA,MAAA,GACA,EAAA,SAAA,MAAA,GAGA,EAAA,KACA,UAAA,YAGA,EAAA,GAAA,KAAA,SAAA,MAAA,GAGA,IAAA,IACA,kBACA,SACA,WACA,yCACA,cACA,eACA,UACA,cACA,8CAEA,8BACA,UACA,cACA,yBACA,UACA,aACA,sBACA,uBACA,6BACA,UACA,aACA,kCACA,sCACA,6BACA,+BACA,8BACA,UACA,eACA,YACA,WACA,uBACA,YAEA,4BACA,YACA,WACA,KAAA,MAEA,KAEA,EAAA,WAEA,GAAA,GAAA,EAAA,SAGA,EAAA,EAAA,cAAA,UAGA,GAAA,YAAA,EAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,GAAA,IAAA,CACA,GAAA,GAAA,EAAA,cAAA,IACA,GAAA,KAAA,IACA,EAAA,YAAA,EAAA,UACA,EAAA,IAAA,EAEA,EAAA,QAAA,SAAA,GAEA,IADA,GAAA,GACA,EAAA,OAAA,KAAA,KAEA,EAAA,EAAA,KAEA,GAAA,EAAA,QAAA,EAAA,GACA,EAAA,kBAEA,EAAA,YAAA,EAAA,cAAA,OAAA,YAAA,KAIA,EAAA,SAAA,EAAA,GAGA,GAAA,GAAA,EAAA,QAEA,KAEA,IAAA,GAAA,GAAA,CACA,GAAA,KAAA,GAGA,IAEA,EAAA,KAAA,cAAA,SAAA,UACA,QAAA,EAAA,EAAA,EAAA,YAAA,UAGA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,SAEA,GAAA,MAAA,EAAA,OAAA,EAAA,WAAA,EAAA,SAAA,GACA,EAAA,SAAA,GACA,MAAA,GAAA,EAAA,WAGA,EAAA,SAAA,EAAA,EAAA,GACA,GAAA,EAAA,GAEA,MAAA,EAEA,IAAA,GAAA,GAAA,EACA,IAAA,EAAA,WAAA,IAAA,EAAA,SAAA,CACA,GAAA,GAAA,EAAA,WAAA,cAEA,EAAA,EAAA,EAAA,EAOA,YAAA,IACA,EAAA,EAAA,uBAEA,GAAA,OACA,IAAA,GAAA,EAAA,cACA,GAAA,EAAA,SAAA,GACA,GAAA,EAAA,EAAA,EAAA,WAAA,KAEA,GAAA,GAEA,GAAA,GAAA,KACA,GAAA,aAAA,EAAA,aACA,GAAA,aAGA,CACA,GAAA,GAAA,EAAA,YAAA,MACA,GAAA,EAAA,EAAA,IAAA,EAAA,SAAA,GAGA,MAAA,IAYA,KAEA,EAAA,SAAA,GACA,GAAA,GAAA,YACA,EAAA,EAAA,WAAA,aAiBA,OAhBA,GAAA,kBAAA,EAAA,YAEA,GAAA,iBAAA,EAAA,OACA,wCAAA,EAAA,YACA,EAAA,KAAA,IAGA,GAAA,GAAA,cAEA,EAAA,YACA,EAAA,EAAA,WAAA,SAAA,GACA,GAAA,IAAA,EAAA,MAAA,EAAA,MAAA,KAAA,EAAA,MAAA,IAAA,MAGA,GAAA,aASA,WAAA,WACA,GAAA,GAAA,OAAA,KAAA,WAAA,IAAA,OAEA,EAAA,EAAA,EACA,GACA,EAAA,EAAA,kBAAA,EAAA,WAAA,IAGA,QAAA,IAAA,sBCtSA,QAAA,IAAA,QAQA,EAAA,OAAA,GAEA,OAAA,WAaA,WASA,GAAA,GAAA,SAAA,cAAA,QACA,GAAA,YAAA,kHAQA,IAAA,GAAA,SAAA,cAAA,OACA,GAAA,aAAA,EAAA,EAAA,aAGA,UAcA,SAAA,GAEA,QAAA,GAAA,EAAA,GAOA,MALA,GAAA,MACA,EAAA,MACA,GAAA,IAGA,EAAA,MAAA,KAAA,EAAA,IAAA,IClEA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,EACA,QAAA,UAAA,QACA,IAAA,GAEA,MAEA,KAAA,GACA,EAAA,IACA,MACA,KAAA,GAEA,EAAA,EAAA,MAAA,KACA,MACA,SAEA,EAAA,EAAA,EAAA,GAIA,EAAA,GAAA,EAIA,QAAA,GAAA,GACA,MAAA,GAAA,GAKA,QAAA,GAAA,EAAA,GACA,YAAA,iBAAA,WACA,EAAA,EAAA,KAJA,GAAA,KAWA,GAAA,QAAA,EAEA,EAAA,WAAA,EACA,EAAA,MAAA,GAEA,QC5CA,SAAA,GCAA,QAAA,GAAA,GACA,EAAA,YAAA,IACA,EAAA,KAAA,GAKA,QAAA,KAEA,KAAA,EAAA,QACA,EAAA,UDRA,GAAA,GAAA,EACA,KCLA,EAAA,SAAA,eAAA,GAgBA,KAAA,OAAA,kBAAA,oBAAA,GACA,QAAA,GAAA,eAAA,IAKA,EAAA,eAAA,GAEA,UAaA,SAAA,GAgFA,QAAA,GAAA,EAAA,EAAA,EAAA,GACA,MAAA,GAAA,QAAA,EAAA,SAAA,EAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,QAAA,QAAA,GAGA,OAFA,GAAA,EAAA,EAAA,EAAA,GAEA,EAAA,IAAA,EAAA,IAAA,IAIA,QAAA,GAAA,EAAA,EAAA,GAEA,GAAA,GAAA,MAAA,EAAA,GACA,MAAA,EAGA,IAAA,GAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,EAAA,KAAA,EAAA,EAAA,MAGA,QAAA,GAAA,GACA,GAAA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,GAAA,KAAA,EAAA,EACA,OAAA,GAAA,OAAA,EAAA,MAAA,EAAA,OAAA,EAAA,MAEA,EAAA,WAAA,EAAA,SACA,EAAA,EAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAKA,IAJA,GAAA,GAAA,EAAA,SACA,EAAA,EAAA,SACA,EAAA,EAAA,MAAA,KACA,EAAA,EAAA,MAAA,KACA,EAAA,QAAA,EAAA,KAAA,EAAA,IACA,EAAA,QACA,EAAA,OAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,EAAA,EAAA,EAAA,IACA,EAAA,QAAA,KAEA,OAAA,GAAA,KAAA,KAAA,EAAA,OAAA,EAAA,KA1HA,GACA,IACA,WAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,KAAA,kBAAA,EAAA,GACA,KAAA,cAAA,EAAA,EAEA,IAAA,GAAA,EAAA,iBAAA,WACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,SACA,KAAA,WAAA,EAAA,QAAA,IAMA,gBAAA,SAAA,GACA,KAAA,WAAA,EAAA,QAAA,EAAA,cAAA,UAEA,cAAA,SAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBAAA,QACA,IAAA,EAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,aAAA,EAAA,IAIA,aAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,YAAA,KAAA,eAAA,EAAA,YAAA,IAGA,eAAA,SAAA,EAAA,EAAA,GAEA,MADA,GAAA,EAAA,EAAA,EAAA,EAAA,GACA,EAAA,EAAA,EAAA,EAAA,IAGA,kBAAA,SAAA,EAAA,GACA,EAAA,eAAA,EAAA,iBACA,KAAA,yBAAA,EAAA,EAGA,IAAA,GAAA,GAAA,EAAA,iBAAA,EACA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,yBAAA,EAAA,IAKA,yBAAA,SAAA,EAAA,GACA,EAAA,GAAA,EAAA,cAAA,QACA,EAAA,QAAA,SAAA,GACA,GAEA,GAFA,EAAA,EAAA,WAAA,GACA,EAAA,GAAA,EAAA,KAEA,IAAA,EAAA,OAAA,GAAA,IAGA,EAFA,UAAA,EAEA,EAAA,EAAA,GAAA,EAAA,GAEA,EAAA,EAAA,GAEA,EAAA,MAAA,OAOA,EAAA,sBACA,EAAA,qCACA,GAAA,OAAA,MAAA,SAAA,QAAA,OACA,EAAA,IAAA,EAAA,KAAA,OAAA,IACA,EAAA,QAkDA,GAAA,YAAA,GAEA,UASA,SAAA,GAuCA,QAAA,GAAA,GACA,EAAA,KAAA,GACA,IACA,GAAA,EACA,EAAA,IAKA,QAAA,GAAA,GACA,MAAA,QAAA,mBACA,OAAA,kBAAA,aAAA,IACA,EAGA,QAAA,KAIA,GAAA,CAEA,IAAA,GAAA,CACA,MAEA,EAAA,KAAA,SAAA,EAAA,GACA,MAAA,GAAA,KAAA,EAAA,MAIA,IAAA,IAAA,CACA,GAAA,QAAA,SAAA,GAGA,GAAA,GAAA,EAAA,aAGA,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,EAIA,IAAA,EACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IAAA,CACA,GAAA,GAAA,EAAA,GACA,EAAA,EAAA,OAKA,IAAA,IAAA,GAAA,EAAA,QAAA,CAIA,GAAA,GAAA,EAAA,EACA,IACA,EAAA,QAAA,MAeA,QAAA,GAAA,GACA,KAAA,UAAA,EACA,KAAA,UACA,KAAA,YACA,KAAA,OAAA,ECnPA,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,EAYA,QAAA,GAAA,EAAA,GACA,MAAA,KAAA,EACA,EAKA,GAAA,EAAA,GAEA,EAEA,KAWA,QAAA,GAAA,EAAA,EAAA,GACA,KAAA,SAAA,EACA,KAAA,OAAA,EACA,KAAA,QAAA,EACA,KAAA,0BDLA,GAAA,GAAA,GAAA,SAIA,EAAA,OAAA,cAGA,KAAA,EAAA,CACA,GAAA,MACA,EAAA,OAAA,KAAA,SACA,QAAA,iBAAA,UAAA,SAAA,GACA,GAAA,EAAA,OAAA,EAAA,CAEA,GAAA,GAAA,CACA,MACA,EAAA,QAAA,SAAA,GACA,SAIA,EAAA,SAAA,GACA,EAAA,KAAA,GACA,OAAA,YAAA,EAAA,MAKA,GAAA,IAAA,EAGA,KA6GA,EAAA,CAeA,GAAA,WACA,QAAA,SAAA,EAAA,GAKA,GAJA,EAAA,EAAA,IAIA,EAAA,YAAA,EAAA,aAAA,EAAA,eAKA,EAAA,oBAAA,EAAA,YCrVA,EAAA,iBAAA,EAAA,gBAAA,SACA,EAAA,YAIA,EAAA,wBAAA,EAAA,cAEA,KAAA,IAAA,YAIA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,EAAA,IAAA,EAAA,KAWA,KAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,EAAA,GAAA,WAAA,KAAA,CACA,EAAA,EAAA,GACA,EAAA,kBAEA,EAAA,QAAA,CAEA,OAWA,IACA,EAAA,GAAA,GAAA,KAAA,EAAA,GACA,EAAA,KAAA,GACA,KAAA,OAAA,KAAA,IAKA,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,CA4EA,GAAA,WACA,QAAA,SAAA,GACA,GAAA,GAAA,KAAA,SAAA,SACA,EAAA,EAAA,MAOA,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,GAIA,EAAA,WACA,EAAA,iBAAA,kBAAA,MAAA,IAEA,EAAA,WAAA,EAAA,UACA,EAAA,iBAAA,iBAAA,MAAA,IAGA,gBAAA,WACA,KAAA,iBAAA,KAAA,SAIA,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,IASA,qBAAA,SAAA,GAGA,GAAA,IAAA,KAAA,OAAA,CAGA,KAAA,cAAA,GACA,KAAA,uBAAA,KAAA,EACA,IAAA,GAAA,EAAA,IAAA,EACA,IAEA,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,EAIA,SAGA,OAIA,YAAA,SAAA,GAOA,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,CAIA,IAAA,GACA,EAAA,aAAA,cAAA,SAAA,KAAA,EAAA,SAEA,GAAA,EAAA,SAAA,GAEA,OAAA,EAAA,YAIA,EAAA,iBAAA,EAAA,gBAAA,QAEA,KAAA,EAAA,gBAAA,QAAA,IAEA,KAAA,EAAA,gBAAA,QAAA,GARA,OAaA,EAAA,kBACA,EAAA,GAIA,GAIA,MAEA,KAAA,2BAGA,GAAA,GAAA,EAAA,OAGA,EAAA,EAAA,gBAAA,GAGA,EAAA,EAAA,SAIA,GAAA,EAAA,SAAA,GAEA,MAAA,GAAA,cAIA,EAAA,sBACA,EAAA,GAGA,EARA,QAYA,MAEA,KAAA,iBACA,KAAA,qBAAA,EAAA,OAEA,KAAA,kBAEA,GAEA,GAAA,EAFA,EAAA,EAAA,YACA,EAAA,EAAA,MAEA,qBAAA,EAAA,MACA,GAAA,GAEA,OAGA,KACA,GAAA,GAEA,IAAA,GAAA,EAAA,gBACA,EAAA,EAAA,YAGA,EAAA,EAAA,YAAA,EACA,GAAA,WAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,YAAA,EAEA,EAAA,EAAA,SAAA,GAEA,MAAA,GAAA,UAKA,EALA,SAcA,MAKA,EAAA,mBAAA,EAGA,EAAA,mBACA,EAAA,iBAAA,IAGA,MAOA,OAAA,YAAA,OAAA,cAAA,UAQA,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,EAEA,KAAA,WAIA,GAAA,WACA,SAAA,SAAA,GAGA,KAAA,UAAA,EAAA,MCzdA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,KAAA,QAAA,EAGA,MAAA,aAIA,QAAA,SAAA,GAIA,KAAA,WAGA,KAAA,QAAA,GAEA,KAAA,aAEA,QAAA,SAAA,GACA,GAAA,GAAA,EAAA,KAAA,EAAA,IAIA,GAAA,UAAA,EAEA,KAAA,OAAA,EAAA,IAEA,KAAA,MAAA,EAAA,IAGA,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,CAIA,GAAA,GAAA,EAAA,MAAA,KAEA,EAAA,EAAA,GACA,EAAA,EAAA,EC7DA,GD+DA,EAAA,QAAA,cC/DA,KAAA,GAEA,mBAAA,GAEA,WAAA,WACA,KAAA,QAAA,EAAA,EAAA,KAAA,IAEA,KAAA,MAAA,OACA,CACA,GAAA,GAAA,SAAA,EAAA,EAAA,GACA,KAAA,QAAA,EAAA,EAAA,EAAA,EAAA,IACA,KAAA,KACA,GAAA,KAAA,EAAA,KAgBA,QAAA,SAAA,EAAA,EAAA,EAAA,EAAA,GACA,KAAA,MAAA,GAAA,CAEA,IAAA,GAAA,KAAA,QAAA,EACA,IAAA,IAAA,IACA,KAAA,MAAA,GAAA,EACA,EAAA,EAAA,OAAA,KAAA,QAAA,IAEA,KAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAKA,KAAA,OAAA,GAAA,EAAA,EAAA,GAEA,KAAA,MAEA,MAAA,QAAA,GAAA,KACA,GAAA,IAAA,IACA,KAAA,QAAA,GAAA,OAIA,KAAA,aACA,KAAA,SACA,KAAA,aAEA,UAAA,WACA,KAAA,UACA,KAAA,eAKA,EAAA,IACA,OAAA,EACA,GAAA,SAAA,GACA,MAAA,GAAA,QAAA,KAAA,EAAA,OAAA,KAEA,MAAA,EAAA,QCnEA,IAAA,EAAA,QAEA,KAAA,SAAA,EAAA,EAAA,GACA,GAAA,GAAA,GAAA,eA2BA,QA1BA,EAAA,MAAA,OAAA,EAAA,MAAA,QACA,GAAA,IAAA,KAAA,UAEA,EAAA,KAAA,MAAA,EAAA,EAAA,OAEA,EAAA,iBAAA,mBAAA,WAEA,GAAA,IAAA,EAAA,WAAA,CAIA,GAAA,GAAA,EAAA,kBAAA,YAEA,EAAA,IACA,IAAA,EACA,GAAA,GAAA,MAAA,EAAA,OAAA,EAAA,GACA,SAAA,OAAA,EACA,CAGA,GAAA,KAAA,GAAA,EAAA,GAAA,IAAA,EACA,EAAA,UAAA,EAAA,aAAA,MAGA,EAAA,OAEA,GC9BA,aAAA,SAAA,EAAA,EAAA,GACA,KAAA,KAAA,EAAA,EAAA,GAAA,aAAA,aAKA,EAAA,IAAA,EACA,EAAA,OAAA,GAGA,OAAA,aASA,SAAA,GC6EA,QAAA,GAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,MAAA,EAGA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,EAAA,EACA,KAEA,EAAA,KAAA,GACA,MAAA,GAEA,EAAA,KAAA,SAAA,mBAAA,KACA,QAAA,KAAA,iGACA,GAGA,MAAA,+BAAA,EAIA,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,EAGA,GAAA,IAAA,EAAA,MAEA,MAAA,mBAAA,EAAA,KAQA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,cAAA,cAAA,QAGA,OAFA,GAAA,YAAA,EAAA,YACA,EAAA,mBAAA,GACA,ED9HA,GAAA,GAAA,SACA,EAAA,EAAA,MACA,EAAA,UAAA,KAAA,UAAA,WAEA,EAAA,OAAA,kBACA,OAAA,kBAAA,aAAA,UAAA,SAWA,GAEA,kBAAA,YAAA,EAAA,IAEA,kBACA,YAAA,EAAA,IAEA,uBACA,QACA,qBACA,kCAEA,KAAA,KACA,KACA,KAAA,YACA,OAAA,cACA,MAAA,cAIA,UAAA,WACA,GAAA,GAAA,KAAA,aACA,IACA,KAAA,MAAA,IAGA,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,KAYA,YAAA,SAAA,GACA,EAAA,OAAA,QAAA,IAAA,UAAA,GACA,KAAA,eAAA,GAGA,oBAAA,SAAA,GACA,EAAA,gBAAA,EACA,EAAA,kBACA,EAAA,gBAAA,gBAAA,GAEA,KAAA,eAAA,KACA,EAAA,OAAA,QAAA,IAAA,YAAA,IAEA,gBAAA,SAAA,GAEA,GAAA,EAAA,eACA,EAAA,eAAA,EAAA,aAAA,gBAAA,EACA,KAAA,cAGA,UAAA,WACA,KAAA,YACA,qBAAA,KAAA,YAGA,IAAA,GAAA,IACA,MAAA,WAAA,sBAAA,WAEA,EAAA,eE/GA,YAAA,SAAA,GAoBA,GAhBA,YAAA,sBACA,YAAA,qBAAA,GAGA,EAAA,OAAA,gBAAA,EAEA,KAAA,oBAAA,GAIA,EAAA,cADA,EAAA,WACA,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,aAEA,UAAA,SAAA,GACA,EAAA,GACA,KAAA,YAAA,IAGA,EAAA,KAAA,EAAA,KACA,KAAA,aAAA,KAGA,WAAA,SAAA,GAEA,GAAA,GAAA,CACA,GAAA,EAAA,GACA,EAAA,gBAAA,EACA,KAAA,aAAA,IAEA,aAAA,SAAA,GACA,KAAA,aAAA,GACA,SAAA,KAAA,YAAA,IAGA,aAAA,SAAA,EAAA,GACA,GAAA,GAAA,KACA,EAAA,SAAA,GACA,GACA,EAAA,GAEA,EAAA,oBAAA,GACA,EAAA,YAUA,IARA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,GAOA,GAAA,UAAA,EAAA,UAAA,CDtEA,GAAA,IAAA,CAEA,IAAA,IAAA,EAAA,YAAA,QAAA,WACA,GAAA,MAEA,IAAA,EAAA,MAAA,CAEA,GAAA,CAMA,KAAA,GAAA,GALA,EAAA,EAAA,MAAA,SAEA,EAAA,EAAA,EAAA,OAAA,EAGA,EAAA,EAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,OAAA,QAAA,cAGA,EAAA,GAAA,QAAA,EAAA,aAOA,GAEA,EAAA,cAAA,GAAA,aAAA,QAAA,SAAA,OAaA,YAAA,SAAA,GAEA,GAAA,GAAA,SAAA,cAAA,SACA,GAAA,gBAAA,EACA,EAAA,IAAA,EAAA,IAAA,EAAA,IAEA,EAAA,GACA,EAAA,cAAA,EACA,KAAA,aAAA,EAAA,WAEA,EAAA,WAAA,YAAA,GACA,EAAA,cAAA,OAEA,SAAA,KAAA,YAAA,IAKA,YAAA,WACA,OAAA,KAAA,gBAAA,KAAA,iBAAA,IAEA,iBAAA,SAAA,EAAA,GAEA,IAAA,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,EAGA,MAOA,OAAA,IAGA,sBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,kBAAA,KAAA,kBAEA,SAAA,SAAA,GACA,MAAA,GAAA,gBAEA,YAAA,SAAA,GACA,MAAA,GAAA,KAAA,EAAA,QAEA,GAGA,IA6DA,EAAA,sBACA,EAAA,qCAEA,GACA,mBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,cACA,EAAA,EAAA,cAAA,IAGA,OAFA,GAAA,YAAA,KAAA,qBAAA,EAAA,YAAA,GAEA,GAEA,qBAAA,SAAA,EAAA,GACA,GAAA,GAAA,KAAA,YAAA,EAAA,EAAA,EAGA,OAFA,GAAA,KAAA,YAAA,EAAA,EAAA,IAKA,YAAA,SAAA,EAAA,EAAA,GAEA,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,EACA,EACA,KAAA,GAEA,aAUA,SAAA,GAwGA,QAAA,GAAA,GACA,MAAA,GAAA,EAAA,GAIA,QAAA,GAAA,EAAA,GAEA,MAAA,SAAA,EAAA,WAAA,EAAA,aAAA,SAAA,EASA,QAAA,GAAA,EAAA,GAGA,GAAA,GAAA,CACA,aAAA,YAEA,EAAA,SAAA,eAAA,mBAAA,IAKA,EAAA,KAAA,CAGA,IAAA,GAAA,EAAA,cAAA,OACA,GAAA,aAAA,OAAA,GAEA,EAAA,UAEA,EAAA,QAAA,EAGA,IAAA,GAAA,EAAA,cAAA,OE/TA,OAvBA,GAAA,aAAA,UAAA,SAEA,EAAA,KAAA,YAAA,GACA,EAAA,KAAA,YAAA,GAQA,YAAA,YAEA,EAAA,KAAA,UAAA,GAMA,OAAA,qBAAA,oBAAA,WACA,oBAAA,UAAA,GAGA,EA+CA,QAAA,GAAA,EAAA,GACA,EAAA,GAAA,EAEA,EAAA,WACA,EAAA,EAAA,IAEA,GAOA,QACA,GAAA,GACA,MAAA,aAAA,EAAA,YACA,EAAA,aAAA,EAKA,QAAA,GAAA,EAAA,GACA,GAAA,EAAA,GAWA,GACA,QAZA,CAEA,GAAA,GAAA,YACA,aAAA,EAAA,YACA,EAAA,aAAA,KACA,EAAA,oBAAA,EAAA,GACA,EAAA,EAAA,IAIA,GAAA,iBAAA,EAAA,IAOA,QAAA,GAAA,EAAA,GAGA,QAAA,KACA,GAAA,GACA,GAAA,IAGA,QAAA,KACA,IAEA,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,IAEA,EAAA,iBAAA,OAAA,GAEA,EAAA,iBAAA,QAAA,QAKA,KAIA,QAAA,GAAA,GAEA,MAAA,GAAA,EAAA,QAAA,YAAA,EAAA,OAAA,YAAA,EAAA,SACA,EAAA,eAgBA,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,IAIA,QAAA,GAAA,GACA,GAAA,GAAA,EAAA,MACA,GACA,GAAA,OAAA,KAGA,EAAA,iBAAA,OAAA,GACA,EAAA,iBAAA,QAAA,IAKA,QAAA,GAAA,GACA,EAAA,OAAA,UAAA,EFmBA,GAAA,GAAA,UAAA,UAAA,cAAA,QACA,EAAA,EACA,EAAA,EAAA,MACA,EAAA,SAGA,EAAA,OAAA,kBACA,kBAAA,aAAA,UAAA,QAEA,IAAA,EEvLA,GAAA,UF0LA,IACA,IADA,EAAA,IACA,EAAA,QACA,EAAA,EAAA,OASA,GACA,aAEA,yBAAA,YAAA,EAAA,IAEA,yBACA,YAAA,EAAA,KACA,KAAA,KACA,SAAA,SAAA,GACA,EAAA,QAAA,IAGA,YAAA,SAAA,GACA,GAAA,GAAA,KAAA,aAAA,EAGA,GAAA,SAAA,IAEA,aAAA,SAAA,GAGA,MAAA,GAAA,iBAAA,KAAA,qBAAA,KAIA,qBAAA,SAAA,GAEA,GAAA,GAAA,EAAA,eAAA,CACA,OAAA,KAAA,EAAA,KAAA,yBACA,KAAA,yBAEA,OAAA,SAAA,EAAA,EAAA,GAQA,GAPA,EAAA,MAAA,QAAA,IAAA,SAAA,EAAA,GAMA,EAAA,WAAA,EACA,EAAA,GAAA,CACA,GAAA,GAAA,KAAA,UAAA,EAIA,KAGA,EAAA,EAAA,EAAA,GACA,EAAA,aAAA,EAGA,KAAA,aAAA,GAGA,KAAA,UAAA,GAAA,GAIA,EAAA,OAAA,EAEA,EAAA,aAEA,aAAA,SAAA,GACA,KAAA,YAAA,GACA,KAAA,QAAA,GACA,EAAA,aAIA,UAAA,WACA,EAAA,cAMA,EAAA,GAAA,GAAA,EAAA,OAAA,KAAA,GACA,EAAA,UAAA,KAAA,GEzQA,IAAA,IACA,IAAA,WAEA,MAAA,aAAA,eAAA,SAAA,eAGA,cAAA,EASA,IALA,OAAA,eAAA,SAAA,iBAAA,GACA,OACA,eAAA,EAAA,iBAAA,IAGA,SAAA,QAAA,CACA,GAAA,IACA,IAAA,WAEA,MAAA,QAAA,SAAA,MAEA,cAAA,EAGA,QAAA,eAAA,SAAA,UAAA,GACA,OAAA,eAAA,EAAA,UAAA,GAkBA,GACA,GAAA,YAAA,KAAA,WAAA,cACA,EAAA,kBAiEA,IACA,GAAA,kBAAA,SAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,EAAA,YACA,EAAA,EAAA,cAIA,QAAA,SAAA,MAAA,WAAA,IAoCA,EAAA,UAAA,EACA,EAAA,UAAA,EACA,EACA,SAAA,EACA,EAAA,iBAAA,EACA,EACA,iBAAA,EACA,EAAA,eAAA,EACA,EAAA,aAAA,GAEA,OAAA,aAUA,SAAA,GAUA,QAAA,GAAA,GAEA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IACA,cAAA,EAAA,MAAA,EAAA,WAAA,QACA,EAAA,EAAA,YAMA,QAAA,GAAA,GAGA,IAAA,GAFA,GAEA,EAAA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,GAAA,EAAA,cACA,EAAA,IACA,EAAA,SAAA,GAEA,EAAA,UAAA,EAAA,SAAA,QACA,EAAA,EAAA,UAcA,QAAA,GAAA,GACA,MAAA,KAAA,EAAA,UAAA,EAAA,KAAA,EACA,EAAA,qBAAA,IAcA,QAAA,GAAA,GACA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IA3DA,GAGA,IAFA,EAAA,iBAEA,EAAA,UA8CA,GA7CA,EAAA,OA6CA,YAAA,UAAA,SACA,YAAA,UAAA,iBACA,YAAA,UAAA,uBACA,YAAA,UAAA,oBACA,YAAA,UAAA,mBAEA,EAAA,GAAA,kBAAA,EAWA,GACA,QAAA,EACA,EAAA,QAAA,GAGA,aAOA,WAyCA,QAAA,KACA,YAAA,SAAA,aAAA,GArCA,kBAAA,QAAA,cACA,OAAA,YAAA,SAAA,EAAA,GACA,GAAA,GAAA,SAAA,YAAA,aAMA,OAJA,GAAA,UAAA,EACA,EAAA,WAAA,GAAA,GAAA,EACA,EAAA,cAAA,GAAA,GAAA,EACA,EAAA,QACA,GAKA,IAAA,GAAA,OAAA,kBAEA,OAAA,kBAAA,aAAA,UAAA,QAQA,aAAA,iBAAA,WACA,YAAA,OAAA,EACA,YAAA,WAAA,GAAA,OAAA,UACA,EAAA,cACA,GAAA,aAAA,qBAAA,SAAA,OAQA,YAAA,YASA,aAAA,SAAA,YACA,gBAAA,SAAA,aAAA,OAAA,YAEA,IAEA,SAAA,iBAAA,mBAAA,OAYA,OAAA,eAAA,OAAA,iBAAA,UASA,SAAA,GASA,QAAA,GAAA,EAAA,EAAA,GACA,GAAA,GAAA,EAAA,iBACA,KAAA,EAEA,IADA,EAAA,EAAA,WACA,GAAA,EAAA,WAAA,KAAA,cACA,EAAA,EAAA,WAGA,MAAA,GAEA,EAAA,EAAA,MAAA,GACA,EAAA,EAAA,EAAA,GAEA,EAAA,EAAA,kBAGA,OAAA,MAIA,QAAA,GAAA,EAAA,GAEA,IADA,GAAA,GAAA,EAAA,WACA,GACA,EAAA,EAAA,GACA,EAAA,EAAA,gBAQA,QAAA,GAAA,EAAA,GAEA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,MAGA,GAAA,EAAA,KAEA,EAAA,EAAA,GAMA,QAAA,GAAA,GACA,MAAA,GAAA,IACA,EAAA,IAEA,OAEA,GAAA,GAKA,QAAA,GAAA,GACA,EAAA,EAAA,SAAA,GACA,MAAA,GAAA,IAEA,EAFA,SAQA,QAAA,GAAA,GACA,MAAA,GAAA,IAAA,EAAA,GAKA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,OAAA,EAAA,UAEA,EAAA,EAAA,SAAA,EACA,IAAA,EAKA,MAJA,GAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WACA,EAAA,QAAA,GAEA,EAAA,KAAA,QAAA,YACA,GAMA,QAAA,GAAA,GACA,EAAA,GACA,EAAA,IAEA,EAAA,EAAA,SAAA,GACA,EAAA,KAsBA,QAAA,GAAA,GAGA,GAFA,EAAA,KAAA,IAEA,EAAA,CAEA,GAAA,CACA,IAAA,GAAA,OAAA,UAAA,OAAA,SAAA,gBACA,UACA,GAAA,IAMA,QAAA,KACA,GAAA,CAEA,KAAA,GAAA,GADA,EAAA,EACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,GAEA,MAGA,QACA,GAAA,GACA,EACA,EAAA,WACA,EAAA,KAGA,EAAA,GAKA,QAAA,GAAA,IAaA,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,GAIA,EAAA,WAAA,EACA,EAAA,KAAA,QAAA,KAAA,YAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,mBACA,EAAA,KAAA,QAAA,IAAA,YAAA,EAAA,WAEA,EAAA,qBAIA,EAAA,KAAA,QAAA,YAIA,QACA,GAAA,GACA,EAAA,GACA,EAAA,EAAA,SAAA,GAEA,EAAA,KAKA,QAAA,GAAA,GACA,EACA,EAAA,WAEA,EAAA,KAGA,EAAA,GAIA,QAAA,GAAA,IAGA,EAAA,kBAAA,EAAA,kBAAA,EAAA,cAAA,EAAA,OACA,EAAA,KAAA,QAAA,MAAA,WAAA,EAAA,WAEA,EAAA,KACA,EAAA,YAAA,EAAA,YAAA,GAAA,EAEA,EAAA,WAAA,IACA,EAAA,WAAA,GAGA,EAAA,WAAA,EAEA,EAAA,KAAA,QAAA,KAAA,WAAA,EAAA,UACA,uBAAA,EAAA,YACA,EAAA,kBAEA,EAAA,oBAGA,EAAA,KAAA,QAAA,YAQA,QAAA,GAAA,GACA,MAAA,QAAA,kBAAA,kBAAA,aAAA,GACA,EAGA,QAAA,GAAA,GAIA,IAHA,GAAA,GAAA,EACA,EAAA,EAAA,UAEA,GAAA,CACA,GAAA,GAAA,EACA,OAAA,CAEA,GAAA,EAAA,YAAA,EAAA,MAMA,QAAA,GAAA,GACA,GAAA,EAAA,aAAA,EAAA,WAAA,UAAA,CACA,EAAA,KAAA,QAAA,IAAA,6BAAA,EAAA,UAKA,KAFA,GAAA,GAAA,EAAA,WAEA,GACA,EAAA,GACA,EAAA,EAAA,iBAMA,QAAA,GAAA,GACA,EAAA,YACA,EAAA,GAEA,EAAA,WAAA,GAIA,QAAA,GAAA,GAEA,GAAA,EAAA,IAAA,CACA,GAAA,GAAA,EAAA,EACA,IAAA,GAAA,cAAA,EAAA,MAAA,EAAA,YAEA,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,EAEA,GAAA,EAAA,MAAA,MAAA,QAAA,MAAA,KAAA,MAIA,QAAA,MAAA,sBAAA,EAAA,OAAA,GAAA,IAIA,EAAA,QAAA,SAAA,GAGA,cAAA,EAAA,OACA,EAAA,EAAA,WAAA,SAAA,GAEA,EAAA,WAIA,EAAA,KAGA,EAAA,EAAA,aAAA,SAAA,GAEA,EAAA,WAIA,EAAA,QAMA,EAAA,KAAA,QAAA,WAOA,QAAA,KAEA,EAAA,EAAA,eACA,IAOA,QAAA,GAAA,GAEA,EAAA,QAAA,GAAA,WAAA,EAAA,SAAA,IAGA,QAAA,GAAA,GACA,EAAA,GAGA,QACA,GAAA,GACA,EAAA,KAAA,QAAA,MAAA,oBAAA,EAAA,QAAA,MAAA,KAAA,OACA,EAAA,GACA,EAAA,KAAA,QAAA,WAGA,QACA,GAAA,GACA,EAAA,EAAA,EAKA,KAAA,GAAA,GADA,EAAA,EAAA,iBAAA,YAAA,EAAA,KACA,EAAA,EAAA,EAAA,EAAA,OAAA,EAAA,IAAA,EAAA,EAAA,IAAA,IAEA,EAAA,QAAA,EAAA,OAAA,UACA,EAAA,EAAA,OAIA,GAAA,GAhYA,GAAA,GAAA,OAAA,aACA,EAAA,OAAA,YAAA,YAAA,iBAAA,OAoHA,GAAA,OAAA,kBACA,OAAA,mBAAA,OAAA,kBACA,GAAA,qBAAA,CAGA,IAAA,IAAA,EAEA,KAyNA,EAAA,GAAA,kBAAA,GAUA,EAAA,MAAA,UAAA,QAAA,KAAA,KAAA,MAAA,UAAA,QAsCA,GACA,iBAAA,EACA,EACA,YAAA,EACA,EAAA,oBAAA,EACA,EAAA,WAAA,EACA,EACA,eAAA,EACA,EAAA,aAAA,EAEA,EAAA,gBAAA,EACA,EAAA,gBAAA,EAEA,EAAA,YAAA,GAGA,OAAA,gBAqBA,SAAA,GA6FA,QAAA,GAAA,EAAA,GAKA,GAAA,GAAA,KAEA,KAAA,EAGA,KAAA,IAAA,OAAA,oEAEA,IAAA,EAAA,QAAA,KAAA,EAIA,KAAA,IAAA,OAAA,uGAAA,OAAA,GAAA,KAKA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,oFAAA,OAAA,GAAA,+BAGA,IAAA,EAAA,GACA,KAAA,IAAA,OAAA,+CAAA,OAAA,GAAA,0BAKA,KAAA,EAAA,UAGA,KAAA,IAAA,OAAA,8CAmCA,OAhCA,GAAA,OAAA,EAAA,cAEA,EAAA,UAAA,EAAA,cAIA,EAAA,SAAA,EAAA,EAAA,SAIA,EAAA,GAGA,EAAA,GAEA,EAAA,EAAA,WAGA,EAAA,EAAA,OAAA,GAGA,EAAA,KAAA,EAAA,GACA,EAAA,KAAA,UAAA,EAAA,UAEA,EAAA,UAAA,YAAA,EAAA,KAGA,EAAA,OAGA,EAAA,oBAAA,UAEA,EAAA;CAGA,QAAA,GAAA,GACA,IAAA,GAAA,GAAA,EAAA,EAAA,EAAA,OAAA,IACA,GAAA,IAAA,EAAA,GACA,OAAA,EAWA,QAAA,GAAA,GAEA,GAAA,GAAA,EAAA,EACA,OAAA,GAEA,EAAA,EAAA,SAAA,QAAA,OAMA,QAAA,GAAA,GAQA,IAAA,GAAA,GAJA,EAAA,EAAA,QAIA,EAAA,EAAA,EAAA,EAAA,SAAA,GAAA,IACA,EAAA,EAAA,IAAA,EAAA,GAIA,GAAA,IAAA,GAAA,EAAA,OACA,IAEA,EAAA,GAAA,EAAA,QAIA,QAAA,GAAA,GAKA,IAAA,OAAA,UAAA,CAGA,GAAA,GAAA,YAAA,SAEA,IAAA,EAAA,GAAA,CACA,GAAA,GAAA,SAAA,cAAA,EAAA,KACA,EAAA,OAAA,eAAA,EAEA,KAAA,EAAA,YACA,EAAA,GAUA,IADA,GAAA,GAAA,EAAA,EAAA,UACA,GAAA,IAAA,GACA,EAAA,OAAA,eAAA,GACA,EAAA,UAAA,EACA,EAAA,CAIA,GAAA,OAAA,GAQA,QAAA,GAAA,GASA,MAAA,GAAA,EAAA,EAAA,KAAA,GAGA,QAAA,GAAA,EAAA,GAuBA,MArBA,GAAA,IAEA,EAAA,aAAA,KAAA,EAAA,IAGA,EAAA,gBAAA,cAGA,EAAA,EAAA,GAGA,EAAA,cAAA,EAGA,EAAA,GAEA,EAAA,aAAA,GAGA,EAAA,eAAA,GAEA,EAKA,QAAA,GAAA,EAAA,GAEA,OAAA,UACA,EAAA,UAAA,EAAA,WAMA,EAAA,EAAA,EAAA,UAAA,EAAA,QAEA,EAAA,UAAA,EAAA,WAMA,QAAA,GAAA,EAAA,EAAA,GAYA,IAPA,GAAA,MAEA,EAAA,EAKA,IAAA,GAAA,IAAA,YAAA,WAAA,CAEA,IAAA,GAAA,GADA,EAAA,OAAA,oBAAA,GACA,EAAA,EAAA,EAAA,EAAA,GAAA,IAEA,EAAA,KACA,OAAA,eAAA,EAAA,EAEA,OAAA,yBAAA,EAAA,IACA,EAAA,GAAA,EAGA,GAAA,OAAA,eAAA,IAKA,QAAA,GAAA,GAGA,EAAA,iBACA,EAAA,kBAMA,QAAA,GAAA,GAIA,IAAA,EAAA,aAAA,YAAA,CAIA,GAAA,GAAA,EAAA,YAEA,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,GAEA,EAAA,EAAA,aACA,IAAA,GAAA,KAAA,aAAA,EACA,GAAA,MAAA,KAAA,UACA,IAAA,GAAA,KAAA,aAAA,EACA,MAAA,0BACA,IAAA,GAEA,KAAA,yBAAA,EAAA,EAAA,GAUA,QAAA,GAAA,GAEA,MAAA,GACA,EAAA,EAAA,eADA,OAMA,QAAA,GAAA,EAAA,GAEA,EAAA,GAAA,EAGA,QAAA,GAAA,GACA,MAAA,YACA,MAAA,GAAA,IAKA,QAAA,GAAA,EAAA,EAAA,GAIA,MAAA,KAAA,EACA,EAAA,EAAA,GAEA,EAAA,EAAA,GAMA,QAAA,GAAA,EAAA,GAIA,GAAA,GAAA,EAAA,GAAA,EACA,IAAA,EAAA,CACA,GAAA,GAAA,EAAA,KAAA,GAAA,EAAA,GACA,MAAA,IAAA,GAAA,IAIA,KAAA,IAAA,EAAA,GACA,MAAA,IAAA,GAAA,KAKA,GAAA,EAAA,CACA,GAAA,GAAA,EAAA,EAGA,OADA,GAAA,aAAA,KAAA,GACA,EAGA,GAAA,GAAA,EAAA,EAKA,OAHA,GAAA,QAAA,MAAA,GACA,EAAA,EAAA,aAEA,EAIA,QAAA,GAAA,GACA,IAAA,EAAA,cAAA,EAAA,WAAA,KAAA,aAAA,CACA,GAAA,GAAA,EAAA,aAAA,MACA,EAAA,EAAA,GAAA,EAAA,UACA,IAAA,EAAA,CAEA,GAAA,GAAA,EAAA,KAAA,EAAA,UACA,MAAA,GAAA,EAAA,EACA,KAAA,IAAA,EAAA,QCtuCA,MAAA,GAAA,EAAA,KAMA,QAAA,GAAA,GAGA,GAAA,GAAA,EAAA,KAAA,KAAA,EAKA,OAFA,GAAA,WAAA,GAEA,EDixBA,IACA,EAAA,OAAA,gBAAA,UAEA,IACA,GAAA,EAAA,MAKA,EAAA,QAAA,SAAA,iBAIA,GAAA,EAAA,UAAA,IAAA,OAAA,qBAAA,OAAA,aAAA,YAAA,UAEA,IACA,EAAA,CAGA,GAAA,GAAA,YAIA,GAAA,YACA,EAAA,eAAA,EAEA,EAAA,YAAA,EACA,EAAA,QAAA,EACA,EAAA,WAAA,EAEA,EAAA,eAAA,EACA,EAAA,gBAAA,EACA,EAAA,gBAAA,EACA,EAAA,oBAAA,EAEA,EAAA,YAAA,EACA,EAAA,uBAEA,CAmIA,GAAA,IACA,iBAAA,gBAAA,YAAA,gBACA,gBAAA,mBAAA,iBAAA,iBAgNA,KAqBA,EAAA,+BC5pCA,EAAA,SAAA,cAAA,KAAA,UACA,EAAA,SAAA,gBAAA,KAAA,UAIA,EAAA,KAAA,UAAA,SAIA,UAAA,gBAAA,EACA,SAAA,cAAA,EAEA,SAAA,gBAAA,EACA,KAAA,UAAA,UAAA,EAEA,EAAA,SAAA,EAcA,EAAA,QAAA,EAMA,GAAA,KAEA,OAAA,WAAA","sourcesContent":["/**\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\nwindow.Platform = window.Platform || {};\n// prepopulate window.logFlags if necessary\nwindow.logFlags = window.logFlags || {};\n// process flags\n(function(scope){\n  // import\n  var flags = scope.flags || {};\n  // populate flags from location\n  location.search.slice(1).split('&').forEach(function(o) {\n    o = o.split('=');\n    o[0] && (flags[o[0]] = o[1] || true);\n  });\n  var entryPoint = document.currentScript ||\n      document.querySelector('script[src*=\"platform.js\"]');\n  if (entryPoint) {\n    var a = entryPoint.attributes;\n    for (var i = 0, n; i < a.length; i++) {\n      n = a[i];\n      if (n.name !== 'src') {\n        flags[n.name] = n.value || true;\n      }\n    }\n  }\n  if (flags.log) {\n    flags.log.split(',').forEach(function(f) {\n      window.logFlags[f] = true;\n    });\n  }\n  // If any of these flags match 'native', then force native ShadowDOM; any\n  // other truthy value, or failure to detect native\n  // ShadowDOM, results in polyfill\n  flags.shadow = flags.shadow || flags.shadowdom || flags.polyfill;\n  if (flags.shadow === 'native') {\n    flags.shadow = false;\n  } else {\n    flags.shadow = flags.shadow || !HTMLElement.prototype.createShadowRoot;\n  }\n\n  if (flags.shadow && document.querySelectorAll('script').length > 1) {\n    console.warn('platform.js is not the first script on the page. ' +\n        'See http://www.polymer-project.org/docs/start/platform.html#setup ' +\n        'for details.');\n  }\n\n  // CustomElements polyfill flag\n  if (flags.register) {\n    window.CustomElements = window.CustomElements || {flags: {}};\n    window.CustomElements.flags.register = flags.register;\n  }\n\n  if (flags.imports) {\n    window.HTMLImports = window.HTMLImports || {flags: {}};\n    window.HTMLImports.flags.imports = flags.imports;\n  }\n\n  // export\n  scope.flags = flags;\n})(Platform);\n","/*\n * Copyright 2012 The Polymer Authors. All rights reserved.\n * Use of this source code is governed by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\nif (typeof WeakMap === 'undefined') {\n  (function() {\n    var defineProperty = Object.defineProperty;\n    var counter = Date.now() % 1e9;\n\n    var WeakMap = function() {\n      this.name = '__st' + (Math.random() * 1e9 >>> 0) + (counter++ + '__');\n    };\n\n    WeakMap.prototype = {\n      set: function(key, value) {\n        var entry = key[this.name];\n        if (entry && entry[0] === key)\n          entry[1] = value;\n        else\n          defineProperty(key, this.name, {value: [key, value], writable: true});\n      },\n      get: function(key) {\n        var entry;\n        return (entry = key[this.name]) && entry[0] === key ?\n            entry[1] : undefined;\n      },\n      delete: function(key) {\n        this.set(key, undefined);\n      }\n    };\n\n    window.WeakMap = WeakMap;\n  })();\n}\n","// Copyright 2012 Google Inc.\n//\n// Licensed under the Apache License, Version 2.0 (the \"License\");\n// you may not use this file except in compliance with the License.\n// You may obtain a copy of the License at\n//\n//     http://www.apache.org/licenses/LICENSE-2.0\n//\n// Unless required by applicable law or agreed to in writing, software\n// distributed under the License is distributed on an \"AS IS\" BASIS,\n// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.\n// See the License for the specific language governing permissions and\n// limitations under the License.\n\n(function(global) {\n  'use strict';\n\n  // 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    try {\n      var f = new Function('', 'return true;');\n      return f();\n    } catch (ex) {\n      return false;\n    }\n  }\n\n  var hasEval = detectEval();\n\n  function isIndex(s) {\n    return +s === s >>> 0;\n  }\n\n  function toNumber(s) {\n    return +s;\n  }\n\n  function isObject(obj) {\n    return obj === Object(obj);\n  }\n\n  var numberIsNaN = global.Number.isNaN || function(value) {\n    return typeof value === 'number' && global.isNaN(value);\n  }\n\n  function areSameValue(left, right) {\n    if (left === right)\n      return left !== 0 || 1 / left === 1 / right;\n    if (numberIsNaN(left) && numberIsNaN(right))\n      return true;\n\n    return left !== left && right !== right;\n  }\n\n  var createObject = ('__proto__' in {}) ?\n    function(obj) { return obj; } :\n    function(obj) {\n      var proto = obj.__proto__;\n      if (!proto)\n        return obj;\n      var newObject = Object.create(proto);\n      Object.getOwnPropertyNames(obj).forEach(function(name) {\n        Object.defineProperty(newObject, name,\n                             Object.getOwnPropertyDescriptor(obj, name));\n      });\n      return newObject;\n    };\n\n  var identStart = '[\\$_a-zA-Z]';\n  var identPart = '[\\$_a-zA-Z0-9]';\n  var identRegExp = new RegExp('^' + identStart + '+' + identPart + '*' + '$');\n\n  function getPathCharType(char) {\n    if (char === undefined)\n      return 'eof';\n\n    var code = char.charCodeAt(0);\n\n    switch(code) {\n      case 0x5B: // [\n      case 0x5D: // ]\n      case 0x2E: // .\n      case 0x22: // \"\n      case 0x27: // '\n      case 0x30: // 0\n        return char;\n\n      case 0x5F: // _\n      case 0x24: // $\n        return 'ident';\n\n      case 0x20: // Space\n      case 0x09: // Tab\n      case 0x0A: // Newline\n      case 0x0D: // Return\n      case 0xA0:  // No-break space\n      case 0xFEFF:  // Byte Order Mark\n      case 0x2028:  // Line Separator\n      case 0x2029:  // Paragraph Separator\n        return 'ws';\n    }\n\n    // a-z, A-Z\n    if ((0x61 <= code && code <= 0x7A) || (0x41 <= code && code <= 0x5A))\n      return 'ident';\n\n    // 1-9\n    if (0x31 <= code && code <= 0x39)\n      return 'number';\n\n    return 'else';\n  }\n\n  var pathStateMachine = {\n    'beforePath': {\n      'ws': ['beforePath'],\n      'ident': ['inIdent', 'append'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'inPath': {\n      'ws': ['inPath'],\n      '.': ['beforeIdent'],\n      '[': ['beforeElement'],\n      'eof': ['afterPath']\n    },\n\n    'beforeIdent': {\n      'ws': ['beforeIdent'],\n      'ident': ['inIdent', 'append']\n    },\n\n    'inIdent': {\n      'ident': ['inIdent', 'append'],\n      '0': ['inIdent', 'append'],\n      'number': ['inIdent', 'append'],\n      'ws': ['inPath', 'push'],\n      '.': ['beforeIdent', 'push'],\n      '[': ['beforeElement', 'push'],\n      'eof': ['afterPath', 'push']\n    },\n\n    'beforeElement': {\n      'ws': ['beforeElement'],\n      '0': ['afterZero', 'append'],\n      'number': ['inIndex', 'append'],\n      \"'\": ['inSingleQuote', 'append', ''],\n      '\"': ['inDoubleQuote', 'append', '']\n    },\n\n    'afterZero': {\n      'ws': ['afterElement', 'push'],\n      ']': ['inPath', 'push']\n    },\n\n    'inIndex': {\n      '0': ['inIndex', 'append'],\n      'number': ['inIndex', 'append'],\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    },\n\n    'inSingleQuote': {\n      \"'\": ['afterElement'],\n      'eof': ['error'],\n      'else': ['inSingleQuote', 'append']\n    },\n\n    'inDoubleQuote': {\n      '\"': ['afterElement'],\n      'eof': ['error'],\n      'else': ['inDoubleQuote', 'append']\n    },\n\n    'afterElement': {\n      'ws': ['afterElement'],\n      ']': ['inPath', 'push']\n    }\n  }\n\n  function noop() {}\n\n  function parsePath(path) {\n    var keys = [];\n    var index = -1;\n    var c, newChar, key, type, transition, action, typeMap, mode = 'beforePath';\n\n    var actions = {\n      push: function() {\n        if (key === undefined)\n          return;\n\n        keys.push(key);\n        key = undefined;\n      },\n\n      append: function() {\n        if (key === undefined)\n          key = newChar\n        else\n          key += newChar;\n      }\n    };\n\n    function maybeUnescapeQuote() {\n      if (index >= path.length)\n        return;\n\n      var nextChar = path[index + 1];\n      if ((mode == 'inSingleQuote' && nextChar == \"'\") ||\n          (mode == 'inDoubleQuote' && nextChar == '\"')) {\n        index++;\n        newChar = nextChar;\n        actions.append();\n        return true;\n      }\n    }\n\n    while (mode) {\n      index++;\n      c = path[index];\n\n      if (c == '\\\\' && maybeUnescapeQuote(mode))\n        continue;\n\n      type = getPathCharType(c);\n      typeMap = pathStateMachine[mode];\n      transition = typeMap[type] || typeMap['else'] || 'error';\n\n      if (transition == 'error')\n        return; // parse error;\n\n      mode = transition[0];\n      action = actions[transition[1]] || noop;\n      newChar = transition[2] === undefined ? c : transition[2];\n      action();\n\n      if (mode === 'afterPath') {\n        return keys;\n      }\n    }\n\n    return; // parse error\n  }\n\n  function isIdent(s) {\n    return identRegExp.test(s);\n  }\n\n  var constructorIsPrivate = {};\n\n  function Path(parts, privateToken) {\n    if (privateToken !== constructorIsPrivate)\n      throw Error('Use Path.get to retrieve path objects');\n\n    if (parts.length)\n      Array.prototype.push.apply(this, parts.slice());\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 (global.testingExposeCycleCount)\n      global.dirtyCheckCycleCount = cycles;\n\n    return cycles > 0;\n  }\n\n  function objectIsEmpty(object) {\n    for (var prop in object)\n      return false;\n    return true;\n  }\n\n  function diffIsEmpty(diff) {\n    return objectIsEmpty(diff.added) &&\n           objectIsEmpty(diff.removed) &&\n           objectIsEmpty(diff.changed);\n  }\n\n  function diffObjectFromOldObject(object, oldObject) {\n    var added = {};\n    var removed = {};\n    var changed = {};\n\n    for (var prop in oldObject) {\n      var newValue = object[prop];\n\n      if (newValue !== undefined && newValue === oldObject[prop])\n        continue;\n\n      if (!(prop in object)) {\n        removed[prop] = undefined;\n        continue;\n      }\n\n      if (newValue !== oldObject[prop])\n        changed[prop] = newValue;\n    }\n\n    for (var prop in object) {\n      if (prop in oldObject)\n        continue;\n\n      added[prop] = object[prop];\n    }\n\n    if (Array.isArray(object) && object.length !== oldObject.length)\n      changed.length = object.length;\n\n    return {\n      added: added,\n      removed: removed,\n      changed: changed\n    };\n  }\n\n  var eomTasks = [];\n  function runEOMTasks() {\n    if (!eomTasks.length)\n      return false;\n\n    for (var i = 0; i < eomTasks.length; i++) {\n      eomTasks[i]();\n    }\n    eomTasks.length = 0;\n    return true;\n  }\n\n  var runEOM = hasObserve ? (function(){\n    var eomObj = { pingPong: true };\n    var eomRunScheduled = false;\n\n    Object.observe(eomObj, function() {\n      runEOMTasks();\n      eomRunScheduled = false;\n    });\n\n    return function(fn) {\n      eomTasks.push(fn);\n      if (!eomRunScheduled) {\n        eomRunScheduled = true;\n        eomObj.pingPong = !eomObj.pingPong;\n      }\n    };\n  })() :\n  (function() {\n    return function(fn) {\n      eomTasks.push(fn);\n    };\n  })();\n\n  var observedObjectCache = [];\n\n  function newObservedObject() {\n    var observer;\n    var object;\n    var discardRecords = false;\n    var first = true;\n\n    function callback(records) {\n      if (observer && observer.state_ === OPENED && !discardRecords)\n        observer.check_(records);\n    }\n\n    return {\n      open: function(obs) {\n        if (observer)\n          throw Error('ObservedObject in use');\n\n        if (!first)\n          Object.deliverChangeRecords(callback);\n\n        observer = obs;\n        first = false;\n      },\n      observe: function(obj, arrayObserve) {\n        object = obj;\n        if (arrayObserve)\n          Array.observe(object, callback);\n        else\n          Object.observe(object, callback);\n      },\n      deliver: function(discard) {\n        discardRecords = discard;\n        Object.deliverChangeRecords(callback);\n        discardRecords = false;\n      },\n      close: function() {\n        observer = undefined;\n        Object.unobserve(object, callback);\n        observedObjectCache.push(this);\n      }\n    };\n  }\n\n  /*\n   * The observedSet abstraction is a perf optimization which reduces the total\n   * number of Object.observe observations of a set of objects. The idea is that\n   * groups of Observers will have some object dependencies in common and this\n   * observed set ensures that each object in the transitive closure of\n   * dependencies is only observed once. The observedSet acts as a write barrier\n   * such that whenever any change comes through, all Observers are checked for\n   * changed values.\n   *\n   * Note that this optimization is explicitly moving work from setup-time to\n   * change-time.\n   *\n   * TODO(rafaelw): Implement \"garbage collection\". In order to move work off\n   * the critical path, when Observers are closed, their observed objects are\n   * not Object.unobserve(d). As a result, it's possible that if the observedSet\n   * is kept open, but some Observers have been closed, it could cause \"leaks\"\n   * (prevent otherwise collectable objects from being collected). At some\n   * point, we should implement incremental \"gc\" which keeps a list of\n   * observedSets which may need clean-up and does small amounts of cleanup on a\n   * timeout until all is clean.\n   */\n\n  function getObservedObject(observer, object, arrayObserve) {\n    var dir = observedObjectCache.pop() || newObservedObject();\n    dir.open(observer);\n    dir.observe(object, arrayObserve);\n    return dir;\n  }\n\n  var observedSetCache = [];\n\n  function newObservedSet() {\n    var observerCount = 0;\n    var observers = [];\n    var objects = [];\n    var rootObj;\n    var rootObjProps;\n\n    function observe(obj, prop) {\n      if (!obj)\n        return;\n\n      if (obj === rootObj)\n        rootObjProps[prop] = true;\n\n      if (objects.indexOf(obj) < 0) {\n        objects.push(obj);\n        Object.observe(obj, callback);\n      }\n\n      observe(Object.getPrototypeOf(obj), prop);\n    }\n\n    function allRootObjNonObservedProps(recs) {\n      for (var i = 0; i < recs.length; i++) {\n        var rec = recs[i];\n        if (rec.object !== rootObj ||\n            rootObjProps[rec.name] ||\n            rec.type === 'setPrototype') {\n          return false;\n        }\n      }\n      return true;\n    }\n\n    function callback(recs) {\n      if (allRootObjNonObservedProps(recs))\n        return;\n\n      var observer;\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.iterateObjects_(observe);\n        }\n      }\n\n      for (var i = 0; i < observers.length; i++) {\n        observer = observers[i];\n        if (observer.state_ == OPENED) {\n          observer.check_();\n        }\n      }\n    }\n\n    var record = {\n      object: undefined,\n      objects: objects,\n      open: function(obs, object) {\n        if (!rootObj) {\n          rootObj = object;\n          rootObjProps = {};\n        }\n\n        observers.push(obs);\n        observerCount++;\n        obs.iterateObjects_(observe);\n      },\n      close: function(obs) {\n        observerCount--;\n        if (observerCount > 0) {\n          return;\n        }\n\n        for (var i = 0; i < objects.length; i++) {\n          Object.unobserve(objects[i], callback);\n          Observer.unobservedCount++;\n        }\n\n        observers.length = 0;\n        objects.length = 0;\n        rootObj = undefined;\n        rootObjProps = undefined;\n        observedSetCache.push(this);\n      }\n    };\n\n    return record;\n  }\n\n  var lastObservedSet;\n\n  function getObservedSet(observer, obj) {\n    if (!lastObservedSet || lastObservedSet.object !== obj) {\n      lastObservedSet = observedSetCache.pop() || newObservedSet();\n      lastObservedSet.object = obj;\n    }\n    lastObservedSet.open(observer, obj);\n    return lastObservedSet;\n  }\n\n  var UNOPENED = 0;\n  var OPENED = 1;\n  var CLOSED = 2;\n  var RESETTING = 3;\n\n  var nextObserverId = 1;\n\n  function Observer() {\n    this.state_ = UNOPENED;\n    this.callback_ = undefined;\n    this.target_ = undefined; // TODO(rafaelw): Should be WeakRef\n    this.directObserver_ = undefined;\n    this.value_ = undefined;\n    this.id_ = nextObserverId++;\n  }\n\n  Observer.prototype = {\n    open: function(callback, target) {\n      if (this.state_ != UNOPENED)\n        throw Error('Observer has already been opened.');\n\n      addToAll(this);\n      this.callback_ = callback;\n      this.target_ = target;\n      this.connect_();\n      this.state_ = OPENED;\n      return this.value_;\n    },\n\n    close: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      removeFromAll(this);\n      this.disconnect_();\n      this.value_ = undefined;\n      this.callback_ = undefined;\n      this.target_ = undefined;\n      this.state_ = CLOSED;\n    },\n\n    deliver: function() {\n      if (this.state_ != OPENED)\n        return;\n\n      dirtyCheck(this);\n    },\n\n    report_: function(changes) {\n      try {\n        this.callback_.apply(this.target_, changes);\n      } catch (ex) {\n        Observer._errorThrownDuringCallback = true;\n        console.error('Exception caught during observer callback: ' +\n                       (ex.stack || ex));\n      }\n    },\n\n    discardChanges: function() {\n      this.check_(undefined, true);\n      return this.value_;\n    }\n  }\n\n  var collectObservers = !hasObserve;\n  var allObservers;\n  Observer._allObserversCount = 0;\n\n  if (collectObservers) {\n    allObservers = [];\n  }\n\n  function addToAll(observer) {\n    Observer._allObserversCount++;\n    if (!collectObservers)\n      return;\n\n    allObservers.push(observer);\n  }\n\n  function removeFromAll(observer) {\n    Observer._allObserversCount--;\n  }\n\n  var runningMicrotaskCheckpoint = false;\n\n  var hasDebugForceFullDelivery = hasObserve && (function() {\n    try {\n      eval('%RunMicrotasks()');\n      return true;\n    } catch (ex) {\n      return false;\n    }\n  })();\n\n  global.Platform = global.Platform || {};\n\n  global.Platform.performMicrotaskCheckpoint = function() {\n    if (runningMicrotaskCheckpoint)\n      return;\n\n    if (hasDebugForceFullDelivery) {\n      eval('%RunMicrotasks()');\n      return;\n    }\n\n    if (!collectObservers)\n      return;\n\n    runningMicrotaskCheckpoint = true;\n\n    var cycles = 0;\n    var anyChanged, toCheck;\n\n    do {\n      cycles++;\n      toCheck = allObservers;\n      allObservers = [];\n      anyChanged = false;\n\n      for (var i = 0; i < toCheck.length; i++) {\n        var observer = toCheck[i];\n        if (observer.state_ != OPENED)\n          continue;\n\n        if (observer.check_())\n          anyChanged = true;\n\n        allObservers.push(observer);\n      }\n      if (runEOMTasks())\n        anyChanged = true;\n    } while (cycles < MAX_DIRTY_CHECK_CYCLES && anyChanged);\n\n    if (global.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    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  function getGetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name) :\n        function() { return this.impl[name]; };\n  }\n\n  function getSetter(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('v', 'this.impl.' + name + ' = v') :\n        function(v) { this.impl[name] = v; };\n  }\n\n  function getMethod(name) {\n    return hasEval && isIdentifierName(name) ?\n        new Function('return this.impl.' + name +\n                     '.apply(this.impl, arguments)') :\n        function() { return this.impl[name].apply(this.impl, arguments); };\n  }\n\n  function getDescriptor(source, name) {\n    try {\n      return Object.getOwnPropertyDescriptor(source, name);\n    } catch (ex) {\n      // JSC and V8 both use data properties instead of accessors which can\n      // cause getting the property desciptor to throw an exception.\n      // https://bugs.webkit.org/show_bug.cgi?id=49739\n      return dummyDescriptor;\n    }\n  }\n\n  function installProperty(source, target, allowMethod, opt_blacklist) {\n    var names = getOwnPropertyNames(source);\n    for (var i = 0; i < names.length; i++) {\n      var name = names[i];\n      if (name === 'polymerBlackList_')\n        continue;\n\n      if (name in target)\n        continue;\n\n      if (source.polymerBlackList_ && source.polymerBlackList_[name])\n        continue;\n\n      if (isFirefox) {\n        // Tickle Firefox's old bindings.\n        source.__lookupGetter__(name);\n      }\n      var descriptor = getDescriptor(source, name);\n      var getter, setter;\n      if (allowMethod && typeof descriptor.value === 'function') {\n        target[name] = getMethod(name);\n        continue;\n      }\n\n      var isEvent = isEventHandlerName(name);\n      if (isEvent)\n        getter = scope.getEventHandlerGetter(name);\n      else\n        getter = getGetter(name);\n\n      if (descriptor.writable || descriptor.set) {\n        if (isEvent)\n          setter = scope.getEventHandlerSetter(name);\n        else\n          setter = getSetter(name);\n      }\n\n      defineProperty(target, name, {\n        get: getter,\n        set: setter,\n        configurable: descriptor.configurable,\n        enumerable: descriptor.enumerable\n      });\n    }\n  }\n\n  /**\n   * @param {Function} nativeConstructor\n   * @param {Function} wrapperConstructor\n   * @param {Object=} opt_instance If present, this is used to extract\n   *     properties from an instance object.\n   */\n  function register(nativeConstructor, wrapperConstructor, opt_instance) {\n    var nativePrototype = nativeConstructor.prototype;\n    registerInternal(nativePrototype, wrapperConstructor, opt_instance);\n    mixinStatics(wrapperConstructor, nativeConstructor);\n  }\n\n  function registerInternal(nativePrototype, wrapperConstructor, opt_instance) {\n    var wrapperPrototype = wrapperConstructor.prototype;\n    assert(constructorTable.get(nativePrototype) === undefined);\n\n    constructorTable.set(nativePrototype, wrapperConstructor);\n    nativePrototypeTable.set(wrapperPrototype, nativePrototype);\n\n    addForwardingProperties(nativePrototype, wrapperPrototype);\n    if (opt_instance)\n      registerInstanceProperties(wrapperPrototype, opt_instance);\n\n    defineNonEnumerableDataProperty(\n        wrapperPrototype, 'constructor', wrapperConstructor);\n    // Set it again. Some VMs optimizes objects that are used as prototypes.\n    wrapperConstructor.prototype = wrapperPrototype;\n  }\n\n  function isWrapperFor(wrapperConstructor, nativeConstructor) {\n    return constructorTable.get(nativeConstructor.prototype) ===\n        wrapperConstructor;\n  }\n\n  /**\n   * Creates a generic wrapper constructor based on |object| and its\n   * constructor.\n   * @param {Node} object\n   * @return {Function} The generated constructor.\n   */\n  function registerObject(object) {\n    var nativePrototype = Object.getPrototypeOf(object);\n\n    var superWrapperConstructor = getWrapperConstructor(nativePrototype);\n    var GeneratedWrapper = createWrapperConstructor(superWrapperConstructor);\n    registerInternal(nativePrototype, GeneratedWrapper, object);\n\n    return GeneratedWrapper;\n  }\n\n  function createWrapperConstructor(superWrapperConstructor) {\n    function GeneratedWrapper(node) {\n      superWrapperConstructor.call(this, node);\n    }\n    var p = Object.create(superWrapperConstructor.prototype);\n    p.constructor = GeneratedWrapper;\n    GeneratedWrapper.prototype = p;\n\n    return GeneratedWrapper;\n  }\n\n  var OriginalDOMImplementation = window.DOMImplementation;\n  var OriginalEventTarget = window.EventTarget;\n  var OriginalEvent = window.Event;\n  var OriginalNode = window.Node;\n  var OriginalWindow = window.Window;\n  var OriginalRange = window.Range;\n  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;\n  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;\n  var OriginalSVGElementInstance = window.SVGElementInstance;\n\n  function isWrapper(object) {\n    return object instanceof wrappers.EventTarget ||\n           object instanceof wrappers.Event ||\n           object instanceof wrappers.Range ||\n           object instanceof wrappers.DOMImplementation ||\n           object instanceof wrappers.CanvasRenderingContext2D ||\n           wrappers.WebGLRenderingContext &&\n               object instanceof wrappers.WebGLRenderingContext;\n  }\n\n  function isNative(object) {\n    return OriginalEventTarget && object instanceof OriginalEventTarget ||\n           object instanceof OriginalNode ||\n           object instanceof OriginalEvent ||\n           object instanceof OriginalWindow ||\n           object instanceof OriginalRange ||\n           object instanceof OriginalDOMImplementation ||\n           object instanceof OriginalCanvasRenderingContext2D ||\n           OriginalWebGLRenderingContext &&\n               object instanceof OriginalWebGLRenderingContext ||\n           OriginalSVGElementInstance &&\n               object instanceof OriginalSVGElementInstance;\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.polymerWrapper_ ||\n        (impl.polymerWrapper_ = 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.impl;\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.polymerWrapper_ = 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.impl[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.unwrap = unwrap;\n  scope.unwrapIfNeeded = unwrapIfNeeded;\n  scope.wrap = wrap;\n  scope.wrapIfNeeded = wrapIfNeeded;\n  scope.wrappers = wrappers;\n\n})(window.ShadowDOMPolyfill);\n","// select ShadowDOM impl\r\nif (Platform.flags.shadow) {\r\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 (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    do {\n      var notifyList = globalMutationObservers.slice();\n      var anyNonEmpty = false;\n      for (var i = 0; i < notifyList.length; i++) {\n        var mo = notifyList[i];\n        var queue = mo.takeRecords();\n        removeTransientObserversFor(mo);\n        if (queue.length) {\n          mo.callback_(queue, mo);\n          anyNonEmpty = true;\n        }\n      }\n    } while (anyNonEmpty);\n  }\n\n  /**\n   * @param {string} type\n   * @param {Node} target\n   * @constructor\n   */\n  function MutationRecord(type, target) {\n    this.type = type;\n    this.target = target;\n    this.addedNodes = new wrappers.NodeList();\n    this.removedNodes = new wrappers.NodeList();\n    this.previousSibling = null;\n    this.nextSibling = null;\n    this.attributeName = null;\n    this.attributeNamespace = null;\n    this.oldValue = null;\n  }\n\n  /**\n   * Registers transient observers to ancestor and its ancesors for the node\n   * which was removed.\n   * @param {!Node} ancestor\n   * @param {!Node} node\n   */\n  function registerTransientObservers(ancestor, node) {\n    for (; ancestor; ancestor = ancestor.parentNode) {\n      var registrations = registrationsTable.get(ancestor);\n      if (!registrations)\n        continue;\n      for (var i = 0; i < registrations.length; i++) {\n        var registration = registrations[i];\n        if (registration.options.subtree)\n          registration.addTransientObserver(node);\n      }\n    }\n  }\n\n  function removeTransientObserversFor(observer) {\n    for (var i = 0; i < observer.nodes_.length; i++) {\n      var node = observer.nodes_[i];\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        return;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        if (registration.observer === observer)\n          registration.removeTransientObservers();\n      }\n    }\n  }\n\n  // http://dom.spec.whatwg.org/#queue-a-mutation-record\n  function enqueueMutation(target, type, data) {\n    // 1.\n    var interestedObservers = Object.create(null);\n    var associatedStrings = Object.create(null);\n\n    // 2.\n    for (var node = target; node; node = node.parentNode) {\n      // 3.\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        continue;\n      for (var j = 0; j < registrations.length; j++) {\n        var registration = registrations[j];\n        var options = registration.options;\n        // 1.\n        if (node !== target && !options.subtree)\n          continue;\n\n        // 2.\n        if (type === 'attributes' && !options.attributes)\n          continue;\n\n        // 3. If type is \"attributes\", options's attributeFilter is present, and\n        // either options's attributeFilter does not contain name or namespace\n        // is non-null, continue.\n        if (type === 'attributes' && options.attributeFilter &&\n            (data.namespace !== null ||\n             options.attributeFilter.indexOf(data.name) === -1)) {\n          continue;\n        }\n\n        // 4.\n        if (type === 'characterData' && !options.characterData)\n          continue;\n\n        // 5.\n        if (type === 'childList' && !options.childList)\n          continue;\n\n        // 6.\n        var observer = registration.observer;\n        interestedObservers[observer.uid_] = observer;\n\n        // 7. If either type is \"attributes\" and options's attributeOldValue is\n        // true, or type is \"characterData\" and options's characterDataOldValue\n        // is true, set the paired string of registered observer's observer in\n        // interested observers to oldValue.\n        if (type === 'attributes' && options.attributeOldValue ||\n            type === 'characterData' && options.characterDataOldValue) {\n          associatedStrings[observer.uid_] = data.oldValue;\n        }\n      }\n    }\n\n    var anyRecordsEnqueued = false;\n\n    // 4.\n    for (var uid in interestedObservers) {\n      var observer = interestedObservers[uid];\n      var record = new MutationRecord(type, target);\n\n      // 2.\n      if ('name' in data && 'namespace' in data) {\n        record.attributeName = data.name;\n        record.attributeNamespace = data.namespace;\n      }\n\n      // 3.\n      if (data.addedNodes)\n        record.addedNodes = data.addedNodes;\n\n      // 4.\n      if (data.removedNodes)\n        record.removedNodes = data.removedNodes;\n\n      // 5.\n      if (data.previousSibling)\n        record.previousSibling = data.previousSibling;\n\n      // 6.\n      if (data.nextSibling)\n        record.nextSibling = data.nextSibling;\n\n      // 7.\n      if (associatedStrings[uid] !== undefined)\n        record.oldValue = associatedStrings[uid];\n\n      // 8.\n      observer.records_.push(record);\n\n      anyRecordsEnqueued = true;\n    }\n\n    if (anyRecordsEnqueued)\n      scheduleCallback();\n  }\n\n  var slice = Array.prototype.slice;\n\n  /**\n   * @param {!Object} options\n   * @constructor\n   */\n  function MutationObserverOptions(options) {\n    this.childList = !!options.childList;\n    this.subtree = !!options.subtree;\n\n    // 1. If either options' attributeOldValue or attributeFilter is present\n    // and options' attributes is omitted, set options' attributes to true.\n    if (!('attributes' in options) &&\n        ('attributeOldValue' in options || 'attributeFilter' in options)) {\n      this.attributes = true;\n    } else {\n      this.attributes = !!options.attributes;\n    }\n\n    // 2. If options' characterDataOldValue is present and options'\n    // characterData is omitted, set options' characterData to true.\n    if ('characterDataOldValue' in options && !('characterData' in options))\n      this.characterData = true;\n    else\n      this.characterData = !!options.characterData;\n\n    // 3. & 4.\n    if (!this.attributes &&\n        (options.attributeOldValue || 'attributeFilter' in options) ||\n        // 5.\n        !this.characterData && options.characterDataOldValue) {\n      throw new TypeError();\n    }\n\n    this.characterData = !!options.characterData;\n    this.attributeOldValue = !!options.attributeOldValue;\n    this.characterDataOldValue = !!options.characterDataOldValue;\n    if ('attributeFilter' in options) {\n      if (options.attributeFilter == null ||\n          typeof options.attributeFilter !== 'object') {\n        throw new TypeError();\n      }\n      this.attributeFilter = slice.call(options.attributeFilter);\n    } else {\n      this.attributeFilter = null;\n    }\n  }\n\n  var uidCounter = 0;\n\n  /**\n   * The class that maps to the DOM MutationObserver interface.\n   * @param {Function} callback.\n   * @constructor\n   */\n  function MutationObserver(callback) {\n    this.callback_ = callback;\n    this.nodes_ = [];\n    this.records_ = [];\n    this.uid_ = ++uidCounter;\n\n    // This will leak. There is no way to implement this without WeakRefs :'(\n    globalMutationObservers.push(this);\n  }\n\n  MutationObserver.prototype = {\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-observe\n    observe: function(target, options) {\n      target = wrapIfNeeded(target);\n\n      var newOptions = new MutationObserverOptions(options);\n\n      // 6.\n      var registration;\n      var registrations = registrationsTable.get(target);\n      if (!registrations)\n        registrationsTable.set(target, registrations = []);\n\n      for (var i = 0; i < registrations.length; i++) {\n        if (registrations[i].observer === this) {\n          registration = registrations[i];\n          // 6.1.\n          registration.removeTransientObservers();\n          // 6.2.\n          registration.options = newOptions;\n        }\n      }\n\n      // 7.\n      if (!registration) {\n        registration = new Registration(this, target, newOptions);\n        registrations.push(registration);\n        this.nodes_.push(target);\n      }\n    },\n\n    // http://dom.spec.whatwg.org/#dom-mutationobserver-disconnect\n    disconnect: function() {\n      this.nodes_.forEach(function(node) {\n        var registrations = registrationsTable.get(node);\n        for (var i = 0; i < registrations.length; i++) {\n          var registration = registrations[i];\n          if (registration.observer === this) {\n            registrations.splice(i, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }, this);\n      this.records_ = [];\n    },\n\n    takeRecords: function() {\n      var copyOfRecords = this.records_;\n      this.records_ = [];\n      return copyOfRecords;\n    }\n  };\n\n  /**\n   * Class used to represent a registered observer.\n   * @param {MutationObserver} observer\n   * @param {Node} target\n   * @param {MutationObserverOptions} options\n   * @constructor\n   */\n  function Registration(observer, target, options) {\n    this.observer = observer;\n    this.target = target;\n    this.options = options;\n    this.transientObservedNodes = [];\n  }\n\n  Registration.prototype = {\n    /**\n     * Adds a transient observer on node. The transient observer gets removed\n     * next time we deliver the change records.\n     * @param {Node} node\n     */\n    addTransientObserver: function(node) {\n      // Don't add transient observers on the target itself. We already have all\n      // the required listeners set up on the target.\n      if (node === this.target)\n        return;\n\n      this.transientObservedNodes.push(node);\n      var registrations = registrationsTable.get(node);\n      if (!registrations)\n        registrationsTable.set(node, registrations = []);\n\n      // We know that registrations does not contain this because we already\n      // checked if node === this.target.\n      registrations.push(this);\n    },\n\n    removeTransientObservers: function() {\n      var transientObservedNodes = this.transientObservedNodes;\n      this.transientObservedNodes = [];\n\n      for (var i = 0; i < transientObservedNodes.length; i++) {\n        var node = transientObservedNodes[i];\n        var registrations = registrationsTable.get(node);\n        for (var j = 0; j < registrations.length; j++) {\n          if (registrations[j] === this) {\n            registrations.splice(j, 1);\n            // Each node can only have one registered observer associated with\n            // this observer.\n            break;\n          }\n        }\n      }\n    }\n  };\n\n  scope.enqueueMutation = enqueueMutation;\n  scope.registerTransientObservers = registerTransientObservers;\n  scope.wrappers.MutationObserver = MutationObserver;\n  scope.wrappers.MutationRecord = MutationRecord;\n\n})(window.ShadowDOMPolyfill);\n","/**\n * Copyright 2014 The Polymer Authors. All rights reserved.\n * Use of this source code is goverened by a BSD-style\n * license that can be found in the LICENSE file.\n */\n\n(function(scope) {\n  'use strict';\n\n  /**\n   * A tree scope represents the root of a tree. All nodes in a tree point to\n   * the same TreeScope object. The tree scope of a node get set the first time\n   * it is accessed or when a node is added or remove to a tree.\n   *\n   * The root is a Node that has no parent.\n   *\n   * The parent is another TreeScope. For ShadowRoots, it is the TreeScope of\n   * the host of the ShadowRoot.\n   *\n   * @param {!Node} root\n   * @param {TreeScope} parent\n   * @constructor\n   */\n  function TreeScope(root, parent) {\n    /** @type {!Node} */\n    this.root = root;\n\n    /** @type {TreeScope} */\n    this.parent = parent;\n  }\n\n  TreeScope.prototype = {\n    get renderer() {\n      if (this.root instanceof scope.wrappers.ShadowRoot) {\n        return scope.getRendererForHost(this.root.host);\n      }\n      return null;\n    },\n\n    contains: function(treeScope) {\n      for (; treeScope; treeScope = treeScope.parent) {\n        if (treeScope === this)\n          return true;\n      }\n      return false;\n    }\n  };\n\n  function setTreeScope(node, treeScope) {\n    if (node.treeScope_ !== treeScope) {\n      node.treeScope_ = treeScope;\n      for (var sr = node.shadowRoot; sr; sr = sr.olderShadowRoot) {\n        sr.treeScope_.parent = treeScope;\n      }\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        setTreeScope(child, treeScope);\n      }\n    }\n  }\n\n  function getTreeScope(node) {\n    if (node instanceof scope.wrappers.Window) {\n      debugger;\n    }\n\n    if (node.treeScope_)\n      return node.treeScope_;\n    var parent = node.parentNode;\n    var treeScope;\n    if (parent)\n      treeScope = getTreeScope(parent);\n    else\n      treeScope = new TreeScope(node, null);\n    return node.treeScope_ = treeScope;\n  }\n\n  scope.TreeScope = TreeScope;\n  scope.getTreeScope = getTreeScope;\n  scope.setTreeScope = setTreeScope;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is goverened by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var forwardMethodsToWrapper = scope.forwardMethodsToWrapper;\n  var getTreeScope = scope.getTreeScope;\n  var mixin = scope.mixin;\n  var registerWrapper = scope.registerWrapper;\n  var unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n  var wrappers = scope.wrappers;\n\n  var wrappedFuns = new WeakMap();\n  var listenersTable = new WeakMap();\n  var handledEventsTable = new WeakMap();\n  var currentlyDispatchingEvents = new WeakMap();\n  var targetTable = new WeakMap();\n  var currentTargetTable = new WeakMap();\n  var relatedTargetTable = new WeakMap();\n  var eventPhaseTable = new WeakMap();\n  var stopPropagationTable = new WeakMap();\n  var stopImmediatePropagationTable = new WeakMap();\n  var eventHandlersTable = new WeakMap();\n  var eventPathTable = new WeakMap();\n\n  function isShadowRoot(node) {\n    return node instanceof wrappers.ShadowRoot;\n  }\n\n  function rootOfNode(node) {\n    return getTreeScope(node).root;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-paths\n  function getEventPath(node, event) {\n    var path = [];\n    var current = node;\n    path.push(current);\n    while (current) {\n      // 4.1.\n      var destinationInsertionPoints = getDestinationInsertionPoints(current);\n      if (destinationInsertionPoints && destinationInsertionPoints.length > 0) {\n        // 4.1.1\n        for (var i = 0; i < destinationInsertionPoints.length; i++) {\n          var insertionPoint = destinationInsertionPoints[i];\n          // 4.1.1.1\n          if (isShadowInsertionPoint(insertionPoint)) {\n            var shadowRoot = rootOfNode(insertionPoint);\n            // 4.1.1.1.2\n            var olderShadowRoot = shadowRoot.olderShadowRoot;\n            if (olderShadowRoot)\n              path.push(olderShadowRoot);\n          }\n\n          // 4.1.1.2\n          path.push(insertionPoint);\n        }\n\n        // 4.1.2\n        current = destinationInsertionPoints[\n            destinationInsertionPoints.length - 1];\n\n      // 4.2\n      } else {\n        if (isShadowRoot(current)) {\n          if (inSameTree(node, current) && eventMustBeStopped(event)) {\n            // Stop this algorithm\n            break;\n          }\n          current = current.host;\n          path.push(current);\n\n        // 4.2.2\n        } else {\n          current = current.parentNode;\n          if (current)\n            path.push(current);\n        }\n      }\n    }\n\n    return path;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-events-always-stopped\n  function eventMustBeStopped(event) {\n    if (!event)\n      return false;\n\n    switch (event.type) {\n      case 'abort':\n      case 'error':\n      case 'select':\n      case 'change':\n      case 'load':\n      case 'reset':\n      case 'resize':\n      case 'scroll':\n      case 'selectstart':\n        return true;\n    }\n    return false;\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#dfn-shadow-insertion-point\n  function isShadowInsertionPoint(node) {\n    return node instanceof HTMLShadowElement;\n    // and make sure that there are no shadow precing this?\n    // and that there is no content ancestor?\n  }\n\n  function getDestinationInsertionPoints(node) {\n    return scope.getDestinationInsertionPoints(node);\n  }\n\n  // http://w3c.github.io/webcomponents/spec/shadow/#event-retargeting\n  function eventRetargetting(path, currentTarget) {\n    if (path.length === 0)\n      return currentTarget;\n\n    // The currentTarget might be the window object. Use its document for the\n    // purpose of finding the retargetted node.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var originalTarget = path[0];\n    var originalTargetTree = getTreeScope(originalTarget);\n    var relativeTargetTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, originalTargetTree);\n\n    for (var i = 0; i < path.length; i++) {\n      var node = path[i];\n      if (getTreeScope(node) === relativeTargetTree)\n        return node;\n    }\n\n    return path[path.length - 1];\n  }\n\n  function getTreeScopeAncestors(treeScope) {\n    var ancestors = [];\n    for (;treeScope; treeScope = treeScope.parent) {\n      ancestors.push(treeScope);\n    }\n    return ancestors;\n  }\n\n  function lowestCommonInclusiveAncestor(tsA, tsB) {\n    var ancestorsA = getTreeScopeAncestors(tsA);\n    var ancestorsB = getTreeScopeAncestors(tsB);\n\n    var result = null;\n    while (ancestorsA.length > 0 && ancestorsB.length > 0) {\n      var a = ancestorsA.pop();\n      var b = ancestorsB.pop();\n      if (a === b)\n        result = a;\n      else\n        break;\n    }\n    return result;\n  }\n\n  function getTreeScopeRoot(ts) {\n    if (!ts.parent)\n      return ts;\n    return getTreeScopeRoot(ts.parent);\n  }\n\n  function relatedTargetResolution(event, currentTarget, relatedTarget) {\n    // In case the current target is a window use its document for the purpose\n    // of retargetting the related target.\n    if (currentTarget instanceof wrappers.Window)\n      currentTarget = currentTarget.document;\n\n    var currentTargetTree = getTreeScope(currentTarget);\n    var relatedTargetTree = getTreeScope(relatedTarget);\n\n    var relatedTargetEventPath = getEventPath(relatedTarget, event);\n\n    var lowestCommonAncestorTree;\n\n    // 4\n    var lowestCommonAncestorTree =\n        lowestCommonInclusiveAncestor(currentTargetTree, relatedTargetTree);\n\n    // 5\n    if (!lowestCommonAncestorTree)\n      lowestCommonAncestorTree = relatedTargetTree.root;\n\n    // 6\n    for (var commonAncestorTree = lowestCommonAncestorTree;\n         commonAncestorTree;\n         commonAncestorTree = commonAncestorTree.parent) {\n      // 6.1\n      var adjustedRelatedTarget;\n      for (var i = 0; i < relatedTargetEventPath.length; i++) {\n        var node = relatedTargetEventPath[i];\n        if (getTreeScope(node) === commonAncestorTree)\n          return node;\n      }\n    }\n\n    return null;\n  }\n\n  function inSameTree(a, b) {\n    return getTreeScope(a) === getTreeScope(b);\n  }\n\n  var NONE = 0;\n  var CAPTURING_PHASE = 1;\n  var AT_TARGET = 2;\n  var BUBBLING_PHASE = 3;\n\n  // pendingError is used to rethrow the first error we got during an event\n  // dispatch. The browser actually reports all errors but to do that we would\n  // need to rethrow the error asynchronously.\n  var pendingError;\n\n  function dispatchOriginalEvent(originalEvent) {\n    // Make sure this event is only dispatched once.\n    if (handledEventsTable.get(originalEvent))\n      return;\n    handledEventsTable.set(originalEvent, true);\n    dispatchEvent(wrap(originalEvent), wrap(originalEvent.target));\n    if (pendingError) {\n      var err = pendingError;\n      pendingError = null;\n      throw err;\n    }\n  }\n\n  function dispatchEvent(event, originalWrapperTarget) {\n    if (currentlyDispatchingEvents.get(event))\n      throw new Error('InvalidStateError');\n\n    currentlyDispatchingEvents.set(event, true);\n\n    // Render to ensure that the event path is correct.\n    scope.renderAllPending();\n    var eventPath;\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/webappapis.html#events-and-the-window-object\n    // All events dispatched on Nodes with a default view, except load events,\n    // should propagate to the Window.\n\n    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end\n    var overrideTarget;\n    var win;\n    var type = event.type;\n\n    // Should really be not cancelable too but since Firefox has a bug there\n    // we skip that check.\n    // https://bugzilla.mozilla.org/show_bug.cgi?id=999456\n    if (type === 'load' && !event.bubbles) {\n      var doc = originalWrapperTarget;\n      if (doc instanceof wrappers.Document && (win = doc.defaultView)) {\n        overrideTarget = doc;\n        eventPath = [];\n      }\n    }\n\n    if (!eventPath) {\n      if (originalWrapperTarget instanceof wrappers.Window) {\n        win = originalWrapperTarget;\n        eventPath = [];\n      } else {\n        eventPath = getEventPath(originalWrapperTarget, event);\n\n        if (event.type !== 'load') {\n          var doc = eventPath[eventPath.length - 1];\n          if (doc instanceof wrappers.Document)\n            win = doc.defaultView;\n        }\n      }\n    }\n\n    eventPathTable.set(event, eventPath);\n\n    if (dispatchCapturing(event, eventPath, win, overrideTarget)) {\n      if (dispatchAtTarget(event, eventPath, win, overrideTarget)) {\n        dispatchBubbling(event, eventPath, win, overrideTarget);\n      }\n    }\n\n    eventPhaseTable.set(event, NONE);\n    currentTargetTable.delete(event, null);\n    currentlyDispatchingEvents.delete(event);\n\n    return event.defaultPrevented;\n  }\n\n  function dispatchCapturing(event, eventPath, win, overrideTarget) {\n    var phase = CAPTURING_PHASE;\n\n    if (win) {\n      if (!invoke(win, event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    for (var i = eventPath.length - 1; i > 0; i--) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return false;\n    }\n\n    return true;\n  }\n\n  function dispatchAtTarget(event, eventPath, win, overrideTarget) {\n    var phase = AT_TARGET;\n    var currentTarget = eventPath[0] || win;\n    return invoke(currentTarget, event, phase, eventPath, overrideTarget);\n  }\n\n  function dispatchBubbling(event, eventPath, win, overrideTarget) {\n    var phase = BUBBLING_PHASE;\n    for (var i = 1; i < eventPath.length; i++) {\n      if (!invoke(eventPath[i], event, phase, eventPath, overrideTarget))\n        return;\n    }\n\n    if (win && eventPath.length > 0) {\n      invoke(win, event, phase, eventPath, overrideTarget);\n    }\n  }\n\n  function invoke(currentTarget, event, phase, eventPath, overrideTarget) {\n    var listeners = listenersTable.get(currentTarget);\n    if (!listeners)\n      return true;\n\n    var target = overrideTarget || eventRetargetting(eventPath, currentTarget);\n\n    if (target === currentTarget) {\n      if (phase === CAPTURING_PHASE)\n        return true;\n\n      if (phase === BUBBLING_PHASE)\n         phase = AT_TARGET;\n\n    } else if (phase === BUBBLING_PHASE && !event.bubbles) {\n      return true;\n    }\n\n    if ('relatedTarget' in event) {\n      var originalEvent = unwrap(event);\n      var unwrappedRelatedTarget = originalEvent.relatedTarget;\n\n      // X-Tag sets relatedTarget on a CustomEvent. If they do that there is no\n      // way to have relatedTarget return the adjusted target but worse is that\n      // the originalEvent might not have a relatedTarget so we hit an assert\n      // when we try to wrap it.\n      if (unwrappedRelatedTarget) {\n        // In IE we can get objects that are not EventTargets at this point.\n        // Safari does not have an EventTarget interface so revert to checking\n        // for addEventListener as an approximation.\n        if (unwrappedRelatedTarget instanceof Object &&\n            unwrappedRelatedTarget.addEventListener) {\n          var relatedTarget = wrap(unwrappedRelatedTarget);\n\n          var adjusted =\n              relatedTargetResolution(event, currentTarget, relatedTarget);\n          if (adjusted === target)\n            return true;\n        } else {\n          adjusted = null;\n        }\n        relatedTargetTable.set(event, adjusted);\n      }\n    }\n\n    eventPhaseTable.set(event, phase);\n    var type = event.type;\n\n    var anyRemoved = false;\n    // targetTable.set(event, target);\n    targetTable.set(event, target);\n    currentTargetTable.set(event, currentTarget);\n\n    // Keep track of the invoke depth so that we only clean up the removed\n    // listeners if we are in the outermost invoke.\n    listeners.depth++;\n\n    for (var i = 0, len = listeners.length; i < len; i++) {\n      var listener = listeners[i];\n      if (listener.removed) {\n        anyRemoved = true;\n        continue;\n      }\n\n      if (listener.type !== type ||\n          !listener.capture && phase === CAPTURING_PHASE ||\n          listener.capture && phase === BUBBLING_PHASE) {\n        continue;\n      }\n\n      try {\n        if (typeof listener.handler === 'function')\n          listener.handler.call(currentTarget, event);\n        else\n          listener.handler.handleEvent(event);\n\n        if (stopImmediatePropagationTable.get(event))\n          return false;\n\n      } catch (ex) {\n        if (!pendingError)\n          pendingError = ex;\n      }\n    }\n\n    listeners.depth--;\n\n    if (anyRemoved && listeners.depth === 0) {\n      var copy = listeners.slice();\n      listeners.length = 0;\n      for (var i = 0; i < copy.length; i++) {\n        if (!copy[i].removed)\n          listeners.push(copy[i]);\n      }\n    }\n\n    return !stopPropagationTable.get(event);\n  }\n\n  function Listener(type, handler, capture) {\n    this.type = type;\n    this.handler = handler;\n    this.capture = Boolean(capture);\n  }\n  Listener.prototype = {\n    equals: function(that) {\n      return this.handler === that.handler && this.type === that.type &&\n          this.capture === that.capture;\n    },\n    get removed() {\n      return this.handler === null;\n    },\n    remove: function() {\n      this.handler = null;\n    }\n  };\n\n  var OriginalEvent = window.Event;\n  OriginalEvent.prototype.polymerBlackList_ = {\n    returnValue: true,\n    // TODO(arv): keyLocation is part of KeyboardEvent but Firefox does not\n    // support constructable KeyboardEvent so we keep it here for now.\n    keyLocation: true\n  };\n\n  /**\n   * Creates a new Event wrapper or wraps an existin native Event object.\n   * @param {string|Event} type\n   * @param {Object=} options\n   * @constructor\n   */\n  function Event(type, options) {\n    if (type instanceof OriginalEvent) {\n      var impl = type;\n      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')\n        return new BeforeUnloadEvent(impl);\n      this.impl = impl;\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        this.impl = type;\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 this.impl.returnValue;\n    },\n    set returnValue(v) {\n      this.impl.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    this.impl = impl;\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 = wrap(originalElementFromPoint.call(document.impl, 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 unwrap = scope.unwrap;\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    this.impl = impl;\n  }\n\n  Touch.prototype = {\n    get target() {\n      return wrap(this.impl.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 this.impl[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(unwrap(this).touches);\n    },\n\n    get targetTouches() {\n      return wrapTouchList(unwrap(this).targetTouches);\n    },\n\n    get changedTouches() {\n      return wrapTouchList(unwrap(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 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(this.impl[name].apply(this.impl, 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 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, node.impl, false));\n    else\n      clone = wrap(originalCloneNode.call(node.impl, 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(this.impl, 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 : this.impl;\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(this.impl, 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(this.impl, 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(this.impl.parentNode);\n    },\n\n    /** @type {Node} */\n    get firstChild() {\n      return this.firstChild_ !== undefined ?\n          this.firstChild_ : wrap(this.impl.firstChild);\n    },\n\n    /** @type {Node} */\n    get lastChild() {\n      return this.lastChild_ !== undefined ?\n          this.lastChild_ : wrap(this.impl.lastChild);\n    },\n\n    /** @type {Node} */\n    get nextSibling() {\n      return this.nextSibling_ !== undefined ?\n          this.nextSibling_ : wrap(this.impl.nextSibling);\n    },\n\n    /** @type {Node} */\n    get previousSibling() {\n      return this.previousSibling_ !== undefined ?\n          this.previousSibling_ : wrap(this.impl.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 this.impl.textContent if there\n      // are no shadow trees below or above the context node.\n      var s = '';\n      for (var child = this.firstChild; child; child = child.nextSibling) {\n        if (child.nodeType != Node.COMMENT_NODE) {\n          s += child.textContent;\n        }\n      }\n      return s;\n    },\n    set textContent(textContent) {\n      var removedNodes = snapshotNodeList(this.childNodes);\n\n      if (this.invalidateShadowRenderer()) {\n        removeAllChildNodes(this);\n        if (textContent !== '') {\n          var textNode = this.impl.ownerDocument.createTextNode(textContent);\n          this.appendChild(textNode);\n        }\n      } else {\n        clearChildNodes(this);\n        this.impl.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(this.impl,\n                                                  unwrapIfNeeded(otherNode));\n    },\n\n    normalize: function() {\n      var nodes = snapshotNodeList(this.childNodes);\n      var remNodes = [];\n      var s = '';\n      var modNode;\n\n      for (var i = 0, n; i < nodes.length; i++) {\n        n = nodes[i];\n        if (n.nodeType === Node.TEXT_NODE) {\n          if (!modNode && !n.data.length)\n            this.removeNode(n);\n          else if (!modNode)\n            modNode = n;\n          else {\n            s += n.data;\n            remNodes.push(n);\n          }\n        } else {\n          if (modNode && remNodes.length) {\n            modNode.data += s;\n            cleanupNodes(remNodes);\n          }\n          remNodes = [];\n          s = '';\n          modNode = null;\n          if (n.childNodes.length)\n            n.normalize();\n        }\n      }\n\n      // handle case where >1 text nodes are the last children\n      if (modNode && remNodes.length) {\n        modNode.data += s;\n        cleanupNodes(remNodes);\n      }\n    }\n  });\n\n  defineWrapGetter(Node, 'ownerDocument');\n\n  // We use a DocumentFragment as a base and then delete the properties of\n  // DocumentFragment.prototype from the wrapper Node. Since delete makes\n  // objects slow in some JS engines we recreate the prototype object.\n  registerWrapper(OriginalNode, Node, document.createDocumentFragment());\n  delete Node.prototype.querySelector;\n  delete Node.prototype.querySelectorAll;\n  Node.prototype = mixin(Object.create(EventTarget.prototype), Node.prototype);\n\n  scope.cloneNode = cloneNode;\n  scope.nodeWasAdded = nodeWasAdded;\n  scope.nodeWasRemoved = nodeWasRemoved;\n  scope.nodesWereAdded = nodesWereAdded;\n  scope.nodesWereRemoved = nodesWereRemoved;\n  scope.snapshotNodeList = snapshotNodeList;\n  scope.wrappers.Node = Node;\n\n})(window.ShadowDOMPolyfill);\n","// Copyright 2013 The Polymer Authors. All rights reserved.\n// Use of this source code is governed by a BSD-style\n// license that can be found in the LICENSE file.\n\n(function(scope) {\n  'use strict';\n\n  var HTMLCollection = scope.wrappers.HTMLCollection;\n  var NodeList = scope.wrappers.NodeList;\n\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 matchesLocalName(el, 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, result, p, arg0, arg1) {\n    var el = node.firstElementChild;\n    while (el) {\n      if (p(el, arg0, arg1))\n        result[result.length++] = el;\n      findElements(el, result, p, arg0, arg1);\n      el = el.nextElementSibling;\n    }\n    return result;\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  var SelectorsInterface = {\n    querySelector: function(selector) {\n      return findOne(this, selector);\n    },\n    querySelectorAll: function(selector) {\n      return findElements(this, new NodeList(), matchesSelector, selector);\n    }\n  };\n\n  var GetElementsByInterface = {\n    getElementsByTagName: function(localName) {\n      var result = new HTMLCollection();\n      if (localName === '*')\n        return findElements(this, result, matchesEveryThing);\n\n      return findElements(this, result,\n          matchesTagName,\n          localName,\n          localName.toLowerCase());\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\n      if (ns === '') {\n        ns = null;\n      } else if (ns === '*') {\n        if (localName === '*')\n          return findElements(this, result, matchesEveryThing);\n        return findElements(this, result, matchesLocalName, localName);\n      }\n\n      if (localName === '*')\n        return findElements(this, result, matchesNameSpace, ns);\n\n      return findElements(this, result, matchesLocalNameNS, ns, localName);\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\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 this.impl.data;\n    },\n    set data(value) {\n      var oldValue = this.impl.data;\n      enqueueMutation(this, 'characterData', {\n        oldValue: oldValue\n      });\n      this.impl.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  function invalidateClass(el) {\n    scope.invalidateRendererBasedOnAttribute(el, 'class');\n  }\n\n  function DOMTokenList(impl, ownerElement) {\n    this.impl = impl;\n    this.ownerElement_ = ownerElement;\n  }\n\n  DOMTokenList.prototype = {\n    get length() {\n      return this.impl.length;\n    },\n    item: function(index) {\n      return this.impl.item(index);\n    },\n    contains: function(token) {\n      return this.impl.contains(token);\n    },\n    add: function() {\n      this.impl.add.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    remove: function() {\n      this.impl.remove.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n    },\n    toggle: function(token) {\n      var rv = this.impl.toggle.apply(this.impl, arguments);\n      invalidateClass(this.ownerElement_);\n      return rv;\n    },\n    toString: function() {\n      return this.impl.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 unwrap = scope.unwrap;\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      this.impl.polymerShadowRoot_ = newShadowRoot;\n\n      var renderer = scope.getRendererForHost(this);\n      renderer.invalidate();\n\n      return newShadowRoot;\n    },\n\n    get shadowRoot() {\n      return this.impl.polymerShadowRoot_ || null;\n    },\n\n    // getDestinationInsertionPoints added in ShadowRenderer.js\n\n    setAttribute: function(name, value) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.setAttribute(name, value);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    removeAttribute: function(name) {\n      var oldValue = this.impl.getAttribute(name);\n      this.impl.removeAttribute(name);\n      enqueAttributeChange(this, name, oldValue);\n      invalidateRendererBasedOnAttribute(this, name);\n    },\n\n    matches: function(selector) {\n      return originalMatches.call(this.impl, selector);\n    },\n\n    get classList() {\n      var list = classListTable.get(this);\n      if (!list) {\n        classListTable.set(this,\n            list = new DOMTokenList(unwrap(this).classList, this));\n      }\n      return list;\n    },\n\n    get className() {\n      return unwrap(this).className;\n    },\n\n    set className(v) {\n      this.setAttribute('class', v);\n    },\n\n    get id() {\n      return unwrap(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 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        this.impl.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\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 this.impl[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        this.impl[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 this.impl[name].apply(this.impl, 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 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 = this.impl.getContext.apply(this.impl, 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    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","// 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\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 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    get content() {\n      if (OriginalHTMLTemplateElement)\n        return wrap(this.impl.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  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  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    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 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(this.impl.correspondingElement);\n    },\n\n    /** @type {SVGUseElement} */\n    get correspondingUseElement() {\n      return wrap(this.impl.correspondingUseElement);\n    },\n\n    /** @type {SVGElementInstance} */\n    get parentNode() {\n      return wrap(this.impl.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(this.impl.firstChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get lastChild() {\n      return wrap(this.impl.lastChild);\n    },\n\n    /** @type {SVGElementInstance} */\n    get previousSibling() {\n      return wrap(this.impl.previousSibling);\n    },\n\n    /** @type {SVGElementInstance} */\n    get nextSibling() {\n      return wrap(this.impl.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 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    this.impl = impl;\n  }\n\n  mixin(CanvasRenderingContext2D.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    drawImage: function() {\n      arguments[0] = unwrapIfNeeded(arguments[0]);\n      this.impl.drawImage.apply(this.impl, arguments);\n    },\n\n    createPattern: function() {\n      arguments[0] = unwrap(arguments[0]);\n      return this.impl.createPattern.apply(this.impl, 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 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    this.impl = impl;\n  }\n\n  mixin(WebGLRenderingContext.prototype, {\n    get canvas() {\n      return wrap(this.impl.canvas);\n    },\n\n    texImage2D: function() {\n      arguments[5] = unwrapIfNeeded(arguments[5]);\n      this.impl.texImage2D.apply(this.impl, arguments);\n    },\n\n    texSubImage2D: function() {\n      arguments[6] = unwrapIfNeeded(arguments[6]);\n      this.impl.texSubImage2D.apply(this.impl, 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 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    this.impl = impl;\n  }\n  Range.prototype = {\n    get startContainer() {\n      return wrap(this.impl.startContainer);\n    },\n    get endContainer() {\n      return wrap(this.impl.endContainer);\n    },\n    get commonAncestorContainer() {\n      return wrap(this.impl.commonAncestorContainer);\n    },\n    setStart: function(refNode,offset) {\n      this.impl.setStart(unwrapIfNeeded(refNode), offset);\n    },\n    setEnd: function(refNode,offset) {\n      this.impl.setEnd(unwrapIfNeeded(refNode), offset);\n    },\n    setStartBefore: function(refNode) {\n      this.impl.setStartBefore(unwrapIfNeeded(refNode));\n    },\n    setStartAfter: function(refNode) {\n      this.impl.setStartAfter(unwrapIfNeeded(refNode));\n    },\n    setEndBefore: function(refNode) {\n      this.impl.setEndBefore(unwrapIfNeeded(refNode));\n    },\n    setEndAfter: function(refNode) {\n      this.impl.setEndAfter(unwrapIfNeeded(refNode));\n    },\n    selectNode: function(refNode) {\n      this.impl.selectNode(unwrapIfNeeded(refNode));\n    },\n    selectNodeContents: function(refNode) {\n      this.impl.selectNodeContents(unwrapIfNeeded(refNode));\n    },\n    compareBoundaryPoints: function(how, sourceRange) {\n      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));\n    },\n    extractContents: function() {\n      return wrap(this.impl.extractContents());\n    },\n    cloneContents: function() {\n      return wrap(this.impl.cloneContents());\n    },\n    insertNode: function(node) {\n      this.impl.insertNode(unwrapIfNeeded(node));\n    },\n    surroundContents: function(newParent) {\n      this.impl.surroundContents(unwrapIfNeeded(newParent));\n    },\n    cloneRange: function() {\n      return wrap(this.impl.cloneRange());\n    },\n    isPointInRange: function(node, offset) {\n      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);\n    },\n    comparePoint: function(node, offset) {\n      return this.impl.comparePoint(unwrapIfNeeded(node), offset);\n    },\n    intersectsNode: function(node) {\n      return this.impl.intersectsNode(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.toString();\n    }\n  };\n\n  // IE9 does not have createContextualFragment.\n  if (OriginalRange.prototype.createContextualFragment) {\n    Range.prototype.createContextualFragment = function(html) {\n      return wrap(this.impl.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 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 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(hostWrapper.impl.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    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 unwrap = scope.unwrap;\n  var wrap = scope.wrap;\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Up means parentNode\n   * Sideways means previous and next sibling.\n   * @param {!Node} wrapper\n   */\n  function updateWrapperUpAndSideways(wrapper) {\n    wrapper.previousSibling_ = wrapper.previousSibling;\n    wrapper.nextSibling_ = wrapper.nextSibling;\n    wrapper.parentNode_ = wrapper.parentNode;\n  }\n\n  /**\n   * Updates the fields of a wrapper to a snapshot of the logical DOM as needed.\n   * Down means first and last child\n   * @param {!Node} wrapper\n   */\n  function updateWrapperDown(wrapper) {\n    wrapper.firstChild_ = wrapper.firstChild;\n    wrapper.lastChild_ = wrapper.lastChild;\n  }\n\n  function updateAllChildNodes(parentNodeWrapper) {\n    assert(parentNodeWrapper instanceof Node);\n    for (var childWrapper = parentNodeWrapper.firstChild;\n         childWrapper;\n         childWrapper = childWrapper.nextSibling) {\n      updateWrapperUpAndSideways(childWrapper);\n    }\n    updateWrapperDown(parentNodeWrapper);\n  }\n\n  function insertBefore(parentNodeWrapper, newChildWrapper, refChildWrapper) {\n    var parentNode = unwrap(parentNodeWrapper);\n    var newChild = unwrap(newChildWrapper);\n    var refChild = refChildWrapper ? unwrap(refChildWrapper) : null;\n\n    remove(newChildWrapper);\n    updateWrapperUpAndSideways(newChildWrapper);\n\n    if (!refChildWrapper) {\n      parentNodeWrapper.lastChild_ = parentNodeWrapper.lastChild;\n      if (parentNodeWrapper.lastChild === parentNodeWrapper.firstChild)\n        parentNodeWrapper.firstChild_ = parentNodeWrapper.firstChild;\n\n      var lastChildWrapper = wrap(parentNode.lastChild);\n      if (lastChildWrapper)\n        lastChildWrapper.nextSibling_ = lastChildWrapper.nextSibling;\n    } else {\n      if (parentNodeWrapper.firstChild === refChildWrapper)\n        parentNodeWrapper.firstChild_ = refChildWrapper;\n\n      refChildWrapper.previousSibling_ = refChildWrapper.previousSibling;\n    }\n\n    parentNode.insertBefore(newChild, refChild);\n  }\n\n  function remove(nodeWrapper) {\n    var node = unwrap(nodeWrapper)\n    var parentNode = node.parentNode;\n    if (!parentNode)\n      return;\n\n    var parentNodeWrapper = wrap(parentNode);\n    updateWrapperUpAndSideways(nodeWrapper);\n\n    if (nodeWrapper.previousSibling)\n      nodeWrapper.previousSibling.nextSibling_ = nodeWrapper;\n    if (nodeWrapper.nextSibling)\n      nodeWrapper.nextSibling.previousSibling_ = nodeWrapper;\n\n    if (parentNodeWrapper.lastChild === nodeWrapper)\n      parentNodeWrapper.lastChild_ = nodeWrapper;\n    if (parentNodeWrapper.firstChild === nodeWrapper)\n      parentNodeWrapper.firstChild_ = nodeWrapper;\n\n    parentNode.removeChild(node);\n  }\n\n  var distributedNodesTable = new WeakMap();\n  var destinationInsertionPointsTable = new WeakMap();\n  var rendererForHostTable = new WeakMap();\n\n  function resetDistributedNodes(insertionPoint) {\n    distributedNodesTable.set(insertionPoint, []);\n  }\n\n  function getDistributedNodes(insertionPoint) {\n    var rv = distributedNodesTable.get(insertionPoint);\n    if (!rv)\n      distributedNodesTable.set(insertionPoint, rv = []);\n    return rv;\n  }\n\n  function getChildNodesSnapshot(node) {\n    var result = [], i = 0;\n    for (var child = node.firstChild; child; child = child.nextSibling) {\n      result[i++] = child;\n    }\n    return result;\n  }\n\n  var request = oneOf(window, [\n    'requestAnimationFrame',\n    'mozRequestAnimationFrame',\n    'webkitRequestAnimationFrame',\n    'setTimeout'\n  ]);\n\n  var pendingDirtyRenderers = [];\n  var renderTimer;\n\n  function renderAllPending() {\n    // TODO(arv): Order these in document order. That way we do not have to\n    // render something twice.\n    for (var i = 0; i < pendingDirtyRenderers.length; i++) {\n      var renderer = pendingDirtyRenderers[i];\n      var parentRenderer = renderer.parentRenderer;\n      if (parentRenderer && parentRenderer.dirty)\n        continue;\n      renderer.render();\n    }\n\n    pendingDirtyRenderers = [];\n  }\n\n  function handleRequestAnimationFrame() {\n    renderTimer = null;\n    renderAllPending();\n  }\n\n  /**\n   * Returns existing shadow renderer for a host or creates it if it is needed.\n   * @params {!Element} host\n   * @return {!ShadowRenderer}\n   */\n  function getRendererForHost(host) {\n    var renderer = rendererForHostTable.get(host);\n    if (!renderer) {\n      renderer = new ShadowRenderer(host);\n      rendererForHostTable.set(host, renderer);\n    }\n    return renderer;\n  }\n\n  function getShadowRootAncestor(node) {\n    var root = getTreeScope(node).root;\n    if (root instanceof ShadowRoot)\n      return root;\n    return null;\n  }\n\n  function getRendererForShadowRoot(shadowRoot) {\n    return getRendererForHost(shadowRoot.host);\n  }\n\n  var spliceDiff = new ArraySplice();\n  spliceDiff.equals = function(renderNode, rawNode) {\n    return unwrap(renderNode.node) === rawNode;\n  };\n\n  /**\n   * RenderNode is used as an in memory \"render tree\". When we render the\n   * composed tree we create a tree of RenderNodes, then we diff this against\n   * the real DOM tree and make minimal changes as needed.\n   */\n  function RenderNode(node) {\n    this.skip = false;\n    this.node = node;\n    this.childNodes = [];\n  }\n\n  RenderNode.prototype = {\n    append: function(node) {\n      var rv = new RenderNode(node);\n      this.childNodes.push(rv);\n      return rv;\n    },\n\n    sync: function(opt_added) {\n      if (this.skip)\n        return;\n\n      var nodeWrapper = this.node;\n      // plain array of RenderNodes\n      var newChildren = this.childNodes;\n      // plain array of real nodes.\n      var oldChildren = getChildNodesSnapshot(unwrap(nodeWrapper));\n      var added = opt_added || new WeakMap();\n\n      var splices = spliceDiff.calculateSplices(newChildren, oldChildren);\n\n      var newIndex = 0, oldIndex = 0;\n      var lastIndex = 0;\n      for (var i = 0; i < splices.length; i++) {\n        var splice = splices[i];\n        for (; lastIndex < splice.index; lastIndex++) {\n          oldIndex++;\n          newChildren[newIndex++].sync(added);\n        }\n\n        var removedCount = splice.removed.length;\n        for (var j = 0; j < removedCount; j++) {\n          var wrapper = wrap(oldChildren[oldIndex++]);\n          if (!added.get(wrapper))\n            remove(wrapper);\n        }\n\n        var addedCount = splice.addedCount;\n        var refNode = oldChildren[oldIndex] && wrap(oldChildren[oldIndex]);\n        for (var j = 0; j < addedCount; j++) {\n          var newChildRenderNode = newChildren[newIndex++];\n          var newChildWrapper = newChildRenderNode.node;\n          insertBefore(nodeWrapper, newChildWrapper, refNode);\n\n          // Keep track of added so that we do not remove the node after it\n          // has been added.\n          added.set(newChildWrapper, true);\n\n          newChildRenderNode.sync(added);\n        }\n\n        lastIndex += addedCount;\n      }\n\n      for (var i = lastIndex; i < newChildren.length; i++) {\n        newChildren[i].sync(added);\n      }\n    }\n  };\n\n  function ShadowRenderer(host) {\n    this.host = host;\n    this.dirty = false;\n    this.invalidateAttributes();\n    this.associateNode(host);\n  }\n\n  ShadowRenderer.prototype = {\n\n    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-trees\n    render: function(opt_renderNode) {\n      if (!this.dirty)\n        return;\n\n      this.invalidateAttributes();\n\n      var host = this.host;\n\n      this.distribution(host);\n      var renderNode = opt_renderNode || new RenderNode(host);\n      this.buildRenderTree(renderNode, host);\n\n      var topMostRenderer = !opt_renderNode;\n      if (topMostRenderer)\n        renderNode.sync();\n\n      this.dirty = false;\n    },\n\n    get parentRenderer() {\n      return getTreeScope(this.host).renderer;\n    },\n\n    invalidate: function() {\n      if (!this.dirty) {\n        this.dirty = true;\n        pendingDirtyRenderers.push(this);\n        if (renderTimer)\n          return;\n        renderTimer = window[request](handleRequestAnimationFrame, 0);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-algorithms\n    distribution: function(root) {\n      this.resetAll(root);\n      this.distributionResolution(root);\n    },\n\n    resetAll: function(node) {\n      if (isInsertionPoint(node))\n        resetDistributedNodes(node);\n      else\n        resetDestinationInsertionPoints(node);\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.resetAll(child);\n      }\n\n      if (node.shadowRoot)\n        this.resetAll(node.shadowRoot);\n\n      if (node.olderShadowRoot)\n        this.resetAll(node.olderShadowRoot);\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#distribution-results\n    distributionResolution: function(node) {\n      if (isShadowHost(node)) {\n        var shadowHost = node;\n        // 1.1\n        var pool = poolPopulation(shadowHost);\n\n        var shadowTrees = getShadowTrees(shadowHost);\n\n        // 1.2\n        for (var i = 0; i < shadowTrees.length; i++) {\n          // 1.2.1\n          this.poolDistribution(shadowTrees[i], pool);\n        }\n\n        // 1.3\n        for (var i = shadowTrees.length - 1; i >= 0; i--) {\n          var shadowTree = shadowTrees[i];\n\n          // 1.3.1\n          // TODO(arv): We should keep the shadow insertion points on the\n          // shadow root (or renderer) so we don't have to search the tree\n          // every time.\n          var shadow = getShadowInsertionPoint(shadowTree);\n\n          // 1.3.2\n          if (shadow) {\n\n            // 1.3.2.1\n            var olderShadowRoot = shadowTree.olderShadowRoot;\n            if (olderShadowRoot) {\n              // 1.3.2.1.1\n              pool = poolPopulation(olderShadowRoot);\n            }\n\n            // 1.3.2.2\n            for (var j = 0; j < pool.length; j++) {\n              // 1.3.2.2.1\n              destributeNodeInto(pool[j], shadow);\n            }\n          }\n\n          // 1.3.3\n          this.distributionResolution(shadowTree);\n        }\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.distributionResolution(child);\n      }\n    },\n\n    // http://w3c.github.io/webcomponents/spec/shadow/#dfn-pool-distribution-algorithm\n    poolDistribution: function (node, pool) {\n      if (node instanceof HTMLShadowElement)\n        return;\n\n      if (node instanceof HTMLContentElement) {\n        var content = node;\n        this.updateDependentAttributes(content.getAttribute('select'));\n\n        var anyDistributed = false;\n\n        // 1.1\n        for (var i = 0; i < pool.length; i++) {\n          var node = pool[i];\n          if (!node)\n            continue;\n          if (matches(node, content)) {\n            destributeNodeInto(node, content);\n            pool[i] = undefined;\n            anyDistributed = true;\n          }\n        }\n\n        // 1.2\n        // Fallback content\n        if (!anyDistributed) {\n          for (var child = content.firstChild;\n               child;\n               child = child.nextSibling) {\n            destributeNodeInto(child, content);\n          }\n        }\n\n        return;\n      }\n\n      for (var child = node.firstChild; child; child = child.nextSibling) {\n        this.poolDistribution(child, pool);\n      }\n    },\n\n    buildRenderTree: function(renderNode, node) {\n      var children = this.compose(node);\n      for (var i = 0; i < children.length; i++) {\n        var child = children[i];\n        var childRenderNode = renderNode.append(child);\n        this.buildRenderTree(childRenderNode, child);\n      }\n\n      if (isShadowHost(node)) {\n        var renderer = getRendererForHost(node);\n        renderer.dirty = false;\n      }\n\n    },\n\n    compose: function(node) {\n      var children = [];\n      var p = node.shadowRoot || node;\n      for (var child = p.firstChild; child; child = child.nextSibling) {\n        if (isInsertionPoint(child)) {\n          this.associateNode(p);\n          var distributedNodes = getDistributedNodes(child);\n          for (var j = 0; j < distributedNodes.length; j++) {\n            var distributedNode = distributedNodes[j];\n            if (isFinalDestination(child, distributedNode))\n              children.push(distributedNode);\n          }\n        } else {\n          children.push(child);\n        }\n      }\n      return children;\n    },\n\n    /**\n     * Invalidates the attributes used to keep track of which attributes may\n     * cause the renderer to be invalidated.\n     */\n    invalidateAttributes: function() {\n      this.attributes = Object.create(null);\n    },\n\n    /**\n     * Parses the selector and makes this renderer dependent on the attribute\n     * being used in the selector.\n     * @param {string} selector\n     */\n    updateDependentAttributes: function(selector) {\n      if (!selector)\n        return;\n\n      var attributes = this.attributes;\n\n      // .class\n      if (/\\.\\w+/.test(selector))\n        attributes['class'] = true;\n\n      // #id\n      if (/#\\w+/.test(selector))\n        attributes['id'] = true;\n\n      selector.replace(/\\[\\s*([^\\s=\\|~\\]]+)/g, function(_, name) {\n        attributes[name] = true;\n      });\n\n      // Pseudo selectors have been removed from the spec.\n    },\n\n    dependsOnAttribute: function(name) {\n      return this.attributes[name];\n    },\n\n    associateNode: function(node) {\n      node.impl.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  var selectorStartCharRe = /^[*.#[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 = this.impl.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    this.impl.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 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 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 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    this.impl = impl;\n  }\n  Selection.prototype = {\n    get anchorNode() {\n      return wrap(this.impl.anchorNode);\n    },\n    get focusNode() {\n      return wrap(this.impl.focusNode);\n    },\n    addRange: function(range) {\n      this.impl.addRange(unwrap(range));\n    },\n    collapse: function(node, index) {\n      this.impl.collapse(unwrapIfNeeded(node), index);\n    },\n    containsNode: function(node, allowPartial) {\n      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);\n    },\n    extend: function(node, offset) {\n      this.impl.extend(unwrapIfNeeded(node), offset);\n    },\n    getRangeAt: function(index) {\n      return wrap(this.impl.getRangeAt(index));\n    },\n    removeRange: function(range) {\n      this.impl.removeRange(unwrap(range));\n    },\n    selectAllChildren: function(node) {\n      this.impl.selectAllChildren(unwrapIfNeeded(node));\n    },\n    toString: function() {\n      return this.impl.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 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(this.impl, 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(doc.impl, 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, this.impl);\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        this.impl = node;\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    this.impl = impl;\n  }\n\n  function wrapImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return wrap(original.apply(this.impl, arguments));\n    };\n  }\n\n  function forwardImplMethod(constructor, name) {\n    var original = document.implementation[name];\n    constructor.prototype[name] = function() {\n      return original.apply(this.impl, 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 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  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.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  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  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {\n    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);\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.convertCombinators(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 ^ and ^^ combinators by replacing with space.\n  */\n  convertCombinators: function(cssText) {\n    for (var i=0; i < combinatorsRe.length; i++) {\n      cssText = cssText.replace(combinatorsRe[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          // TODO(sjmiles): KEYFRAMES_RULE in IE11 throws when we query cssText\n          // 'cssText' in rule returns true, but rule.cssText throws anyway\n          // We can test the rule type, e.g.\n          //   else if (rule.type !== CSSRule.KEYFRAMES_RULE && rule.cssText) {\n          // but this will prevent cssText propagation in other browsers which\n          // support it.\n          // KEYFRAMES_RULE has a CSSRuleSet, so the text can probably be reconstructed\n          // from that collection; this would be a proper fix.\n          // For now, I'm trapping the exception so IE11 is unblocked in other areas.\n          try {\n            if (rule.cssText) {\n              cssText += rule.cssText + '\\n\\n';\n            }\n          } catch(x) {\n            // squelch\n          }\n        }\n      }, this);\n    }\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]*'([^']*)'[^}]*}([^{]*?){/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentRuleRe = /\\/\\*\\s@polyfill-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentRuleRe = /(polyfill-rule)[^}]*(content\\:[\\s]*'([^']*)'[^;]*;)[^}]*}/gim,\n    // TODO(sorvell): remove either content or comment\n    cssCommentUnscopedRuleRe = /\\/\\*\\s@polyfill-unscoped-rule([^*]*\\*+([^/*][^*]*\\*+)*)\\//gim,\n    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\\:[\\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    combinatorsRe = [\n      /\\^\\^/g,\n      /\\^/g,\n      /\\/shadow\\//g,\n      /\\/shadow-deep\\//g,\n      /::shadow/g,\n      /\\/deep\\//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 = style.sheet.cssRules;\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 = urlResolver.resolveCssText(\n              elt.__resource, elt.href);\n        } else {\n          urlResolver.resolveStyle(style);  \n        }\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            head.appendChild(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  Platform.templateContent = function(inTemplate) {\n    // if MDV exists, it may need to boostrap this template to reveal content\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(inTemplate);\n    }\n    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no\n    // native template support\n    if (!inTemplate.content && !inTemplate._content) {\n      var frag = document.createDocumentFragment();\n      while (inTemplate.firstChild) {\n        frag.appendChild(inTemplate.firstChild);\n      }\n      inTemplate._content = frag;\n    }\n    return inTemplate.content || inTemplate._content;\n  };\n\n})(window.Platform);\n","/* Any copyright is dedicated to the Public Domain.\n * http://creativecommons.org/publicdomain/zero/1.0/ */\n\n(function(scope) {\n  'use strict';\n\n  // feature detect for URL constructor\n  var hasWorkingUrl = false;\n  if (!scope.forceJURL) {\n    try {\n      var u = new URL('b', 'http://a');\n      hasWorkingUrl = u.href === 'http://a/b';\n    } catch(e) {}\n  }\n\n  if (hasWorkingUrl)\n    return;\n\n  var relative = Object.create(null);\n  relative['ftp'] = 21;\n  relative['file'] = 0;\n  relative['gopher'] = 70;\n  relative['http'] = 80;\n  relative['https'] = 443;\n  relative['ws'] = 80;\n  relative['wss'] = 443;\n\n  var relativePathDotMapping = Object.create(null);\n  relativePathDotMapping['%2e'] = '.';\n  relativePathDotMapping['.%2e'] = '..';\n  relativePathDotMapping['%2e.'] = '..';\n  relativePathDotMapping['%2e%2e'] = '..';\n\n  function isRelativeScheme(scheme) {\n    return relative[scheme] !== undefined;\n  }\n\n  function invalid() {\n    clear.call(this);\n    this._isInvalid = true;\n  }\n\n  function IDNAToASCII(h) {\n    if ('' == h) {\n      invalid.call(this)\n    }\n    // XXX\n    return h.toLowerCase()\n  }\n\n  function percentEscape(c) {\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ? `\n       [0x22, 0x23, 0x3C, 0x3E, 0x3F, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  function percentEscapeQuery(c) {\n    // XXX This actually needs to encode c using encoding and then\n    // convert the bytes one-by-one.\n\n    var unicode = c.charCodeAt(0);\n    if (unicode > 0x20 &&\n       unicode < 0x7F &&\n       // \" # < > ` (do not escape '?')\n       [0x22, 0x23, 0x3C, 0x3E, 0x60].indexOf(unicode) == -1\n      ) {\n      return c;\n    }\n    return encodeURIComponent(c);\n  }\n\n  var EOF = undefined,\n      ALPHA = /[a-zA-Z]/,\n      ALPHANUMERIC = /[a-zA-Z0-9\\+\\-\\.]/;\n\n  function parse(input, stateOverride, base) {\n    function err(message) {\n      errors.push(message)\n    }\n\n    var state = stateOverride || 'scheme start',\n        cursor = 0,\n        buffer = '',\n        seenAt = false,\n        seenBracket = false,\n        errors = [];\n\n    loop: while ((input[cursor - 1] != EOF || cursor == 0) && !this._isInvalid) {\n      var c = input[cursor];\n      switch (state) {\n        case 'scheme start':\n          if (c && ALPHA.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n            state = 'scheme';\n          } else if (!stateOverride) {\n            buffer = '';\n            state = 'no scheme';\n            continue;\n          } else {\n            err('Invalid scheme.');\n            break loop;\n          }\n          break;\n\n        case 'scheme':\n          if (c && ALPHANUMERIC.test(c)) {\n            buffer += c.toLowerCase(); // ASCII-safe\n          } else if (':' == c) {\n            this._scheme = buffer;\n            buffer = '';\n            if (stateOverride) {\n              break loop;\n            }\n            if (isRelativeScheme(this._scheme)) {\n              this._isRelative = true;\n            }\n            if ('file' == this._scheme) {\n              state = 'relative';\n            } else if (this._isRelative && base && base._scheme == this._scheme) {\n              state = 'relative or authority';\n            } else if (this._isRelative) {\n              state = 'authority first slash';\n            } else {\n              state = 'scheme data';\n            }\n          } else if (!stateOverride) {\n            buffer = '';\n            cursor = 0;\n            state = 'no scheme';\n            continue;\n          } else if (EOF == c) {\n            break loop;\n          } else {\n            err('Code point not allowed in scheme: ' + c)\n            break loop;\n          }\n          break;\n\n        case 'scheme data':\n          if ('?' == c) {\n            query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            // XXX error handling\n            if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n              this._schemeData += percentEscape(c);\n            }\n          }\n          break;\n\n        case 'no scheme':\n          if (!base || !(isRelativeScheme(base._scheme))) {\n            err('Missing scheme.');\n            invalid.call(this);\n          } else {\n            state = 'relative';\n            continue;\n          }\n          break;\n\n        case 'relative or authority':\n          if ('/' == c && '/' == input[cursor+1]) {\n            state = 'authority ignore slashes';\n          } else {\n            err('Expected /, got: ' + c);\n            state = 'relative';\n            continue\n          }\n          break;\n\n        case 'relative':\n          this._isRelative = true;\n          if ('file' != this._scheme)\n            this._scheme = base._scheme;\n          if (EOF == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            break loop;\n          } else if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c)\n              err('\\\\ is an invalid code point.');\n            state = 'relative slash';\n          } else if ('?' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = '?';\n            state = 'query';\n          } else if ('#' == c) {\n            this._host = base._host;\n            this._port = base._port;\n            this._path = base._path.slice();\n            this._query = base._query;\n            this._fragment = '#';\n            state = 'fragment';\n          } else {\n            var nextC = input[cursor+1]\n            var nextNextC = input[cursor+2]\n            if (\n              'file' != this._scheme || !ALPHA.test(c) ||\n              (nextC != ':' && nextC != '|') ||\n              (EOF != nextNextC && '/' != nextNextC && '\\\\' != nextNextC && '?' != nextNextC && '#' != nextNextC)) {\n              this._host = base._host;\n              this._port = base._port;\n              this._path = base._path.slice();\n              this._path.pop();\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'relative slash':\n          if ('/' == c || '\\\\' == c) {\n            if ('\\\\' == c) {\n              err('\\\\ is an invalid code point.');\n            }\n            if ('file' == this._scheme) {\n              state = 'file host';\n            } else {\n              state = 'authority ignore slashes';\n            }\n          } else {\n            if ('file' != this._scheme) {\n              this._host = base._host;\n              this._port = base._port;\n            }\n            state = 'relative path';\n            continue;\n          }\n          break;\n\n        case 'authority first slash':\n          if ('/' == c) {\n            state = 'authority second slash';\n          } else {\n            err(\"Expected '/', got: \" + c);\n            state = 'authority ignore slashes';\n            continue;\n          }\n          break;\n\n        case 'authority second slash':\n          state = 'authority ignore slashes';\n          if ('/' != c) {\n            err(\"Expected '/', got: \" + c);\n            continue;\n          }\n          break;\n\n        case 'authority ignore slashes':\n          if ('/' != c && '\\\\' != c) {\n            state = 'authority';\n            continue;\n          } else {\n            err('Expected authority, got: ' + c);\n          }\n          break;\n\n        case 'authority':\n          if ('@' == c) {\n            if (seenAt) {\n              err('@ already seen.');\n              buffer += '%40';\n            }\n            seenAt = true;\n            for (var i = 0; i < buffer.length; i++) {\n              var cp = buffer[i];\n              if ('\\t' == cp || '\\n' == cp || '\\r' == cp) {\n                err('Invalid whitespace in authority.');\n                continue;\n              }\n              // XXX check URL code points\n              if (':' == cp && null === this._password) {\n                this._password = '';\n                continue;\n              }\n              var tempC = percentEscape(cp);\n              (null !== this._password) ? this._password += tempC : this._username += tempC;\n            }\n            buffer = '';\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            cursor -= buffer.length;\n            buffer = '';\n            state = 'host';\n            continue;\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'file host':\n          if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            if (buffer.length == 2 && ALPHA.test(buffer[0]) && (buffer[1] == ':' || buffer[1] == '|')) {\n              state = 'relative path';\n            } else if (buffer.length == 0) {\n              state = 'relative path start';\n            } else {\n              this._host = IDNAToASCII.call(this, buffer);\n              buffer = '';\n              state = 'relative path start';\n            }\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid whitespace in file host.');\n          } else {\n            buffer += c;\n          }\n          break;\n\n        case 'host':\n        case 'hostname':\n          if (':' == c && !seenBracket) {\n            // XXX host parsing\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'port';\n            if ('hostname' == stateOverride) {\n              break loop;\n            }\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c) {\n            this._host = IDNAToASCII.call(this, buffer);\n            buffer = '';\n            state = 'relative path start';\n            if (stateOverride) {\n              break loop;\n            }\n            continue;\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            if ('[' == c) {\n              seenBracket = true;\n            } else if (']' == c) {\n              seenBracket = false;\n            }\n            buffer += c;\n          } else {\n            err('Invalid code point in host/hostname: ' + c);\n          }\n          break;\n\n        case 'port':\n          if (/[0-9]/.test(c)) {\n            buffer += c;\n          } else if (EOF == c || '/' == c || '\\\\' == c || '?' == c || '#' == c || stateOverride) {\n            if ('' != buffer) {\n              var temp = parseInt(buffer, 10);\n              if (temp != relative[this._scheme]) {\n                this._port = temp + '';\n              }\n              buffer = '';\n            }\n            if (stateOverride) {\n              break loop;\n            }\n            state = 'relative path start';\n            continue;\n          } else if ('\\t' == c || '\\n' == c || '\\r' == c) {\n            err('Invalid code point in port: ' + c);\n          } else {\n            invalid.call(this);\n          }\n          break;\n\n        case 'relative path start':\n          if ('\\\\' == c)\n            err(\"'\\\\' not allowed in path.\");\n          state = 'relative path';\n          if ('/' != c && '\\\\' != c) {\n            continue;\n          }\n          break;\n\n        case 'relative path':\n          if (EOF == c || '/' == c || '\\\\' == c || (!stateOverride && ('?' == c || '#' == c))) {\n            if ('\\\\' == c) {\n              err('\\\\ not allowed in relative path.');\n            }\n            var tmp;\n            if (tmp = relativePathDotMapping[buffer.toLowerCase()]) {\n              buffer = tmp;\n            }\n            if ('..' == buffer) {\n              this._path.pop();\n              if ('/' != c && '\\\\' != c) {\n                this._path.push('');\n              }\n            } else if ('.' == buffer && '/' != c && '\\\\' != c) {\n              this._path.push('');\n            } else if ('.' != buffer) {\n              if ('file' == this._scheme && this._path.length == 0 && buffer.length == 2 && ALPHA.test(buffer[0]) && buffer[1] == '|') {\n                buffer = buffer[0] + ':';\n              }\n              this._path.push(buffer);\n            }\n            buffer = '';\n            if ('?' == c) {\n              this._query = '?';\n              state = 'query';\n            } else if ('#' == c) {\n              this._fragment = '#';\n              state = 'fragment';\n            }\n          } else if ('\\t' != c && '\\n' != c && '\\r' != c) {\n            buffer += percentEscape(c);\n          }\n          break;\n\n        case 'query':\n          if (!stateOverride && '#' == c) {\n            this._fragment = '#';\n            state = 'fragment';\n          } else if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._query += percentEscapeQuery(c);\n          }\n          break;\n\n        case 'fragment':\n          if (EOF != c && '\\t' != c && '\\n' != c && '\\r' != c) {\n            this._fragment += c;\n          }\n          break;\n      }\n\n      cursor++;\n    }\n  }\n\n  function clear() {\n    this._scheme = '';\n    this._schemeData = '';\n    this._username = '';\n    this._password = null;\n    this._host = '';\n    this._port = '';\n    this._path = [];\n    this._query = '';\n    this._fragment = '';\n    this._isInvalid = false;\n    this._isRelative = false;\n  }\n\n  // Does not process domain names or IP addresses.\n  // Does not handle encoding for the query parameter.\n  function jURL(url, base /* , encoding */) {\n    if (base !== undefined && !(base instanceof jURL))\n      base = new jURL(String(base));\n\n    this._url = url;\n    clear.call(this);\n\n    var input = url.replace(/^[ \\t\\r\\n\\f]+|[ \\t\\r\\n\\f]+$/g, '');\n    // encoding = encoding || 'utf-8'\n\n    parse.call(this, input, null, base);\n  }\n\n  jURL.prototype = {\n    get href() {\n      if (this._isInvalid)\n        return this._url;\n\n      var authority = '';\n      if ('' != this._username || null != this._password) {\n        authority = this._username +\n            (null != this._password ? ':' + this._password : '') + '@';\n      }\n\n      return this.protocol +\n          (this._isRelative ? '//' + authority + this.host : '') +\n          this.pathname + this._query + this._fragment;\n    },\n    set href(href) {\n      clear.call(this);\n      parse.call(this, href);\n    },\n\n    get protocol() {\n      return this._scheme + ':';\n    },\n    set protocol(protocol) {\n      if (this._isInvalid)\n        return;\n      parse.call(this, protocol + ':', 'scheme start');\n    },\n\n    get host() {\n      return this._isInvalid ? '' : this._port ?\n          this._host + ':' + this._port : this._host;\n    },\n    set host(host) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, host, 'host');\n    },\n\n    get hostname() {\n      return this._host;\n    },\n    set hostname(hostname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, hostname, 'hostname');\n    },\n\n    get port() {\n      return this._port;\n    },\n    set port(port) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      parse.call(this, port, 'port');\n    },\n\n    get pathname() {\n      return this._isInvalid ? '' : this._isRelative ?\n          '/' + this._path.join('/') : this._schemeData;\n    },\n    set pathname(pathname) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._path = [];\n      parse.call(this, pathname, 'relative path start');\n    },\n\n    get search() {\n      return this._isInvalid || !this._query || '?' == this._query ?\n          '' : this._query;\n    },\n    set search(search) {\n      if (this._isInvalid || !this._isRelative)\n        return;\n      this._query = '?';\n      if ('?' == search[0])\n        search = search.slice(1);\n      parse.call(this, search, 'query');\n    },\n\n    get hash() {\n      return this._isInvalid || !this._fragment || '#' == this._fragment ?\n          '' : this._fragment;\n    },\n    set hash(hash) {\n      if (this._isInvalid)\n        return;\n      this._fragment = '#';\n      if ('#' == hash[0])\n        hash = hash.slice(1);\n      parse.call(this, hash, 'fragment');\n    }\n  };\n\n  scope.URL = jURL;\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  'use strict';\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  // 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  // 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  // 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    elementDeclarations.push(arguments);\n  }\n  window.Polymer = polymerStub;\n\n  // deliver queued delcarations\n  scope.deliverDeclarations = function() {\n    scope.deliverDeclarations = function() {\n     throw 'Possible attempt to load Polymer twice';\n    };\n    return elementDeclarations;\n  }\n\n  // Once DOMContent has loaded, any main document scripts that depend on\n  // Polymer() should have run. Calling Polymer() now is an error until\n  // polymer is imported.\n  window.addEventListener('DOMContentLoaded', function() {\n    if (window.Polymer === polymerStub) {\n      window.Polymer = function() {\n        console.error('You tried to use polymer without loading it first. To ' +\n          'load polymer, <link rel=\"import\" href=\"' + \n          'components/polymer/polymer.html\">');\n      };\n    }\n  });\n\n  // exports\n  scope.createDOM = createDOM;\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\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})(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 */\n\n// poor man's adapter for template.content on various platform scenarios\n(function(scope) {\n  scope.templateContent = scope.templateContent || function(inTemplate) {\n    return inTemplate.content;\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  scope = scope || (window.Inspector = {});\n  \n  var inspector;\n\n  window.sinspect = function(inNode, inProxy) {\n    if (!inspector) {\n      inspector = window.open('', 'ShadowDOM Inspector', null, true);\n      inspector.document.write(inspectorHTML);\n      //inspector.document.close();\n      inspector.api = {\n        shadowize: shadowize\n      };\n    }\n    inspect(inNode || wrap(document.body), inProxy);\n  };\n\n  var inspectorHTML = [\n    '<!DOCTYPE html>',\n    '<html>',\n    '  <head>',\n    '    <title>ShadowDOM Inspector</title>',\n    '    <style>',\n    '      body {',\n    '      }',\n    '      pre {',\n    '        font: 9pt \"Courier New\", monospace;',\n    '        line-height: 1.5em;',\n    '      }',\n    '      tag {',\n    '        color: purple;',\n    '      }',\n    '      ul {',\n    '         margin: 0;',\n    '         padding: 0;',\n    '         list-style: none;',\n    '      }',\n    '      li {',\n    '         display: inline-block;',\n    '         background-color: #f1f1f1;',\n    '         padding: 4px 6px;',\n    '         border-radius: 4px;',\n    '         margin-right: 4px;',\n    '      }',\n    '    </style>',\n    '  </head>',\n    '  <body>',\n    '    <ul id=\"crumbs\">',\n    '    </ul>',\n    '    <div id=\"tree\"></div>',\n    '  </body>',\n    '</html>'\n  ].join('\\n');\n  \n  var crumbs = [];\n\n  var displayCrumbs = function() {\n    // alias our document\n    var d = inspector.document;\n    // get crumbbar\n    var cb = d.querySelector('#crumbs');\n    // clear crumbs\n    cb.textContent = '';\n    // build new crumbs\n    for (var i=0, c; c=crumbs[i]; i++) {\n      var a = d.createElement('a');\n      a.href = '#';\n      a.textContent = c.localName;\n      a.idx = i;\n      a.onclick = function(event) {\n        var c;\n        while (crumbs.length > this.idx) {\n          c = crumbs.pop();\n        }\n        inspect(c.shadow || c, c);\n        event.preventDefault();\n      };\n      cb.appendChild(d.createElement('li')).appendChild(a);\n    }\n  };\n\n  var inspect = function(inNode, inProxy) {\n    // alias our document\n    var d = inspector.document;\n    // reset list of drillable nodes\n    drillable = [];\n    // memoize our crumb proxy\n    var proxy = inProxy || inNode;\n    crumbs.push(proxy);\n    // update crumbs\n    displayCrumbs();\n    // reflect local tree\n    d.body.querySelector('#tree').innerHTML =\n        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';\n  };\n\n  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\n\n  var blacklisted = {STYLE:1, SCRIPT:1, \"#comment\": 1, TEMPLATE: 1};\n  var blacklist = function(inNode) {\n    return blacklisted[inNode.nodeName];\n  };\n\n  var output = function(inNode, inChildNodes, inIndent) {\n    if (blacklist(inNode)) {\n      return '';\n    }\n    var indent = inIndent || '';\n    if (inNode.localName || inNode.nodeType == 11) {\n      var name = inNode.localName || 'shadow-root';\n      //inChildNodes = ShadowDOM.localNodes(inNode);\n      var info = indent + describe(inNode);\n      // if only textNodes\n      // TODO(sjmiles): make correct for ShadowDOM\n      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {\n        info += catTextContent(inChildNodes);\n      } else*/ {\n        // TODO(sjmiles): native <shadow> has no reference to its projection\n        if (name == 'content' /*|| name == 'shadow'*/) {\n          inChildNodes = inNode.getDistributedNodes();\n        }\n        info += '<br/>';\n        var ind = indent + '&nbsp;&nbsp;';\n        forEach(inChildNodes, function(n) {\n          info += output(n, n.childNodes, ind);\n        });\n        info += indent;\n      }\n      if (!({br:1}[name])) {\n        info += '<tag>&lt;/' + name + '&gt;</tag>';\n        info += '<br/>';\n      }\n    } else {\n      var text = inNode.textContent.trim();\n      info = text ? indent + '\"' + text + '\"' + '<br/>' : '';\n    }\n    return info;\n  };\n\n  var catTextContent = function(inChildNodes) {\n    var info = '';\n    forEach(inChildNodes, function(n) {\n      info += n.textContent.trim();\n    });\n    return info;\n  };\n\n  var drillable = [];\n\n  var describe = function(inNode) {\n    var tag = '<tag>' + '&lt;';\n    var name = inNode.localName || 'shadow-root';\n    if (inNode.webkitShadowRoot || inNode.shadowRoot) {\n      tag += ' <button idx=\"' + drillable.length +\n        '\" onclick=\"api.shadowize.call(this)\">' + name + '</button>';\n      drillable.push(inNode);\n    } else {\n      tag += name || 'shadow-root';\n    }\n    if (inNode.attributes) {\n      forEach(inNode.attributes, function(a) {\n        tag += ' ' + a.name + (a.value ? '=\"' + a.value + '\"' : '');\n      });\n    }\n    tag += '&gt;'+ '</tag>';\n    return tag;\n  };\n\n  // remote api\n\n  shadowize = function() {\n    var idx = Number(this.attributes.idx.value);\n    //alert(idx);\n    var node = drillable[idx];\n    if (node) {\n      inspect(node.webkitShadowRoot || node.shadowRoot, node)\n    } else {\n      console.log(\"bad shadowize node\");\n      console.dir(this);\n    }\n  };\n  \n  // export\n  \n  scope.output = output;\n  \n})(window.Inspector);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  // TODO(sorvell): It's desireable to provide a default stylesheet \n  // that's convenient for styling unresolved elements, but\n  // it's cumbersome to have to include this manually in every page.\n  // It would make sense to put inside some HTMLImport but \n  // the HTMLImports polyfill does not allow loading of stylesheets \n  // that block rendering. Therefore this injection is tolerated here.\n\n  var style = document.createElement('style');\n  style.textContent = ''\n      + 'body {'\n      + 'transition: opacity ease-in 0.2s;' \n      + ' } \\n'\n      + 'body[unresolved] {'\n      + 'opacity: 0; display: block; overflow: hidden;' \n      + ' } \\n'\n      ;\n  var head = document.querySelector('head');\n  head.insertBefore(style, head.firstChild);\n\n})(Platform);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of the polymer project is also\n * subject to an additional IP rights grant found at http://polymer.github.io/PATENTS.txt\n */\n\n(function(scope) {\n\n  function withDependencies(task, depends) {\n    depends = depends || [];\n    if (!depends.map) {\n      depends = [depends];\n    }\n    return task.apply(this, depends.map(marshal));\n  }\n\n  function module(name, dependsOrFactory, moduleFactory) {\n    var module;\n    switch (arguments.length) {\n      case 0:\n        return;\n      case 1:\n        module = null;\n        break;\n      case 2:\n        // dependsOrFactory is `factory` in this case\n        module = dependsOrFactory.apply(this);\n        break;\n      default:\n        // dependsOrFactory is `depends` in this case\n        module = withDependencies(moduleFactory, dependsOrFactory);\n        break;\n    }\n    modules[name] = module;\n  };\n\n  function marshal(name) {\n    return modules[name];\n  }\n\n  var modules = {};\n\n  function using(depends, task) {\n    HTMLImports.whenImportsReady(function() {\n      withDependencies(task, depends);\n    });\n  };\n\n  // exports\n\n  scope.marshal = marshal;\n  // `module` confuses commonjs detectors\n  scope.modularize = module;\n  scope.using = using;\n\n})(window);\n","/*\n * Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n * This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n * The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n * The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n * Code distributed by Google as part of 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 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 */\nwindow.HTMLImports = window.HTMLImports || {flags:{}};","/*\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\n(function(scope) {\n\n  // imports\n  var path = scope.path;\n  var xhr = scope.xhr;\n  var flags = scope.flags;\n\n  // TODO(sorvell): this loader supports a dynamic list of urls\n  // and an oncomplete callback that is called when the loader is done.\n  // The polyfill currently does *not* need this dynamism or the onComplete\n  // concept. Because of this, the loader could be simplified quite a bit.\n  var Loader = function(onLoad, onComplete) {\n    this.cache = {};\n    this.onload = onLoad;\n    this.oncomplete = onComplete;\n    this.inflight = 0;\n    this.pending = {};\n  };\n\n  Loader.prototype = {\n    addNodes: function(nodes) {\n      // number of transactions to complete\n      this.inflight += nodes.length;\n      // commence transactions\n      for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n        this.require(n);\n      }\n      // anything to do?\n      this.checkDone();\n    },\n    addNode: function(node) {\n      // number of transactions to complete\n      this.inflight++;\n      // commence transactions\n      this.require(node);\n      // anything to do?\n      this.checkDone();\n    },\n    require: function(elt) {\n      var url = elt.src || elt.href;\n      // ensure we have a standard url that can be used\n      // reliably for deduping.\n      // TODO(sjmiles): ad-hoc\n      elt.__nodeUrl = url;\n      // deduplication\n      if (!this.dedupe(url, elt)) {\n        // fetch this resource\n        this.fetch(url, elt);\n      }\n    },\n    dedupe: function(url, elt) {\n      if (this.pending[url]) {\n        // add to list of nodes waiting for inUrl\n        this.pending[url].push(elt);\n        // don't need fetch\n        return true;\n      }\n      var resource;\n      if (this.cache[url]) {\n        this.onload(url, elt, this.cache[url]);\n        // finished this transaction\n        this.tail();\n        // don't need fetch\n        return true;\n      }\n      // first node waiting for inUrl\n      this.pending[url] = [elt];\n      // need fetch (not a dupe)\n      return false;\n    },\n    fetch: function(url, elt) {\n      flags.load && console.log('fetch', url, elt);\n      if (url.match(/^data:/)) {\n        // Handle Data URI Scheme\n        var pieces = url.split(',');\n        var header = pieces[0];\n        var body = pieces[1];\n        if(header.indexOf(';base64') > -1) {\n          body = atob(body);\n        } else {\n          body = decodeURIComponent(body);\n        }\n        setTimeout(function() {\n            this.receive(url, elt, null, body);\n        }.bind(this), 0);\n      } else {\n        var receiveXhr = function(err, resource, redirectedUrl) {\n          this.receive(url, elt, err, resource, redirectedUrl);\n        }.bind(this);\n        xhr.load(url, receiveXhr);\n        // TODO(sorvell): blocked on)\n        // https://code.google.com/p/chromium/issues/detail?id=257221\n        // xhr'ing for a document makes scripts in imports runnable; otherwise\n        // they are not; however, it requires that we have doctype=html in\n        // the import which is unacceptable. This is only needed on Chrome\n        // to avoid the bug above.\n        /*\n        if (isDocumentLink(elt)) {\n          xhr.loadDocument(url, receiveXhr);\n        } else {\n          xhr.load(url, receiveXhr);\n        }\n        */\n      }\n    },\n    receive: function(url, elt, err, resource, redirectedUrl) {\n      this.cache[url] = resource;\n      var $p = this.pending[url];\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.cache[redirectedUrl] = resource;\n        $p = $p.concat(this.pending[redirectedUrl]);\n      }\n      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\n        //if (!err) {\n          // If url was redirected, use the redirected location so paths are\n          // calculated relative to that.\n          this.onload(redirectedUrl || url, p, resource);\n        //}\n        this.tail();\n      }\n      this.pending[url] = null;\n      if ( redirectedUrl && redirectedUrl !== url ) {\n        this.pending[redirectedUrl] = null;\n      }\n    },\n    tail: function() {\n      --this.inflight;\n      this.checkDone();\n    },\n    checkDone: function() {\n      if (!this.inflight) {\n        this.oncomplete();\n      }\n    }\n  };\n\n  xhr = xhr || {\n    async: true,\n    ok: function(request) {\n      return (request.status >= 200 && request.status < 300)\n          || (request.status === 304)\n          || (request.status === 0);\n    },\n    load: function(url, next, nextContext) {\n      var request = new XMLHttpRequest();\n      if (scope.flags.debug || scope.flags.bust) {\n        url += '?' + Math.random();\n      }\n      request.open('GET', url, xhr.async);\n      request.addEventListener('readystatechange', function(e) {\n        if (request.readyState === 4) {\n          // Servers redirecting an import can add a Location header to help us\n          // polyfill correctly.\n          var locationHeader = request.getResponseHeader(\"Location\");\n          var redirectedUrl = null;\n          if (locationHeader) {\n            var redirectedUrl = (locationHeader.substr( 0, 1 ) === \"/\")\n              ? location.origin + locationHeader  // Location is a relative path\n              : redirectedUrl;                    // Full path\n          }\n          next.call(nextContext, !xhr.ok(request) && request,\n              request.response || request.responseText, redirectedUrl);\n        }\n      });\n      request.send();\n      return request;\n    },\n    loadDocument: function(url, next, nextContext) {\n      this.load(url, next, nextContext).responseType = 'document';\n    }\n  };\n\n  // exports\n  scope.xhr = xhr;\n  scope.Loader = Loader;\n\n})(window.HTMLImports);\n","/*\n * Copyright 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\n(function(scope) {\n\nvar IMPORT_LINK_TYPE = 'import';\nvar flags = scope.flags;\nvar isIe = /Trident/.test(navigator.userAgent);\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// importParser\n// highlander object to manage parsing of imports\n// parses import related elements\n// and ensures proper parse order\n// parse order is enforced by crawling the tree and monitoring which elements\n// have been parsed; async parsing is also supported.\n\n// highlander object for parsing a document tree\nvar importParser = {\n  // parse selectors for main document elements\n  documentSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n  // parse selectors for import document elements\n  importsSelectors: [\n    'link[rel=' + IMPORT_LINK_TYPE + ']',\n    'link[rel=stylesheet]',\n    'style',\n    'script:not([type])',\n    'script[type=\"text/javascript\"]'\n  ].join(','),\n  map: {\n    link: 'parseLink',\n    script: 'parseScript',\n    style: 'parseStyle'\n  },\n  // try to parse the next import in the tree\n  parseNext: function() {\n    var next = this.nextToParse();\n    if (next) {\n      this.parse(next);\n    }\n  },\n  parse: function(elt) {\n    if (this.isParsed(elt)) {\n      flags.parse && console.log('[%s] is already parsed', elt.localName);\n      return;\n    }\n    var fn = this[this.map[elt.localName]];\n    if (fn) {\n      this.markParsing(elt);\n      fn.call(this, elt);\n    }\n  },\n  // only 1 element may be parsed at a time; parsing is async so each\n  // parsing implementation must inform the system that parsing is complete\n  // via markParsingComplete.\n  // To prompt the system to parse the next element, parseNext should then be\n  // called.\n  // Note, parseNext used to be included at the end of markParsingComplete, but\n  // we must not do this so that, for example, we can (1) mark parsing complete \n  // then (2) fire an import load event, and then (3) parse the next resource.\n  markParsing: function(elt) {\n    flags.parse && console.log('parsing', elt);\n    this.parsingElement = elt;\n  },\n  markParsingComplete: function(elt) {\n    elt.__importParsed = true;\n    if (elt.__importElement) {\n      elt.__importElement.__importParsed = true;\n    }\n    this.parsingElement = null;\n    flags.parse && console.log('completed', elt);\n  },\n  invalidateParse: function(doc) {\n    if (doc && doc.__importLink) {\n      doc.__importParsed = doc.__importLink.__importParsed = false;\n      this.parseSoon();\n    }\n  },\n  parseSoon: function() {\n    if (this._parseSoon) {\n      cancelAnimationFrame(this._parseDelay);\n    }\n    var parser = this;\n    this._parseSoon = requestAnimationFrame(function() {\n      parser.parseNext();\n    });\n  },\n  parseImport: function(elt) {\n    // TODO(sorvell): consider if there's a better way to do this;\n    // expose an imports parsing hook; this is needed, for example, by the\n    // CustomElements polyfill.\n    if (HTMLImports.__importsParsingHook) {\n      HTMLImports.__importsParsingHook(elt);\n    }\n    elt.import.__importParsed = true;\n    this.markParsingComplete(elt);\n    // fire load event\n    if (elt.__resource) {\n      elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));    \n    } else {\n      elt.dispatchEvent(new CustomEvent('error', {bubbles: false}));\n    }\n    // TODO(sorvell): workaround for Safari addEventListener not working\n    // for elements not in the main document.\n    if (elt.__pending) {\n      var fn;\n      while (elt.__pending.length) {\n        fn = elt.__pending.shift();\n        if (fn) {\n          fn({target: elt});\n        }\n      }\n    }\n    this.parseNext();\n  },\n  parseLink: function(linkElt) {\n    if (nodeIsImport(linkElt)) {\n      this.parseImport(linkElt);\n    } else {\n      // make href absolute\n      linkElt.href = linkElt.href;\n      this.parseGeneric(linkElt);\n    }\n  },\n  parseStyle: function(elt) {\n    // TODO(sorvell): style element load event can just not fire so clone styles\n    var src = elt;\n    elt = cloneStyle(elt);\n    elt.__importElement = src;\n    this.parseGeneric(elt);\n  },\n  parseGeneric: function(elt) {\n    this.trackElement(elt);\n    document.head.appendChild(elt);\n  },\n  // tracks when a loadable element has loaded\n  trackElement: function(elt, callback) {\n    var self = this;\n    var done = function(e) {\n      if (callback) {\n        callback(e);\n      }\n      self.markParsingComplete(elt);\n      self.parseNext();\n    };\n    elt.addEventListener('load', done);\n    elt.addEventListener('error', done);\n\n    // NOTE: IE does not fire \"load\" event for styles that have already loaded\n    // This is in violation of the spec, so we try our hardest to work around it\n    if (isIe && elt.localName === 'style') {\n      var fakeLoad = false;\n      // If there's not @import in the textContent, assume it has loaded\n      if (elt.textContent.indexOf('@import') == -1) {\n        fakeLoad = true;\n      // if we have a sheet, we have been parsed\n      } else if (elt.sheet) {\n        fakeLoad = true;\n        var csr = elt.sheet.cssRules;\n        var len = csr ? csr.length : 0;\n        // search the rules for @import's\n        for (var i = 0, r; (i < len) && (r = csr[i]); i++) {\n          if (r.type === CSSRule.IMPORT_RULE) {\n            // if every @import has resolved, fake the load\n            fakeLoad = fakeLoad && Boolean(r.styleSheet);\n          }\n        }\n      }\n      // dispatch a fake load event and continue parsing\n      if (fakeLoad) {\n        elt.dispatchEvent(new CustomEvent('load', {bubbles: false}));\n      }\n    }\n  },\n  // NOTE: execute scripts by injecting them and watching for the load/error\n  // event. Inline scripts are handled via dataURL's because browsers tend to\n  // provide correct parsing errors in this case. If this has any compatibility\n  // issues, we can switch to injecting the inline script with textContent.\n  // Scripts with dataURL's do not appear to generate load events and therefore\n  // we assume they execute synchronously.\n  parseScript: function(scriptElt) {\n    var script = document.createElement('script');\n    script.__importElement = scriptElt;\n    script.src = scriptElt.src ? scriptElt.src : \n        generateScriptDataUrl(scriptElt);\n    scope.currentScript = scriptElt;\n    this.trackElement(script, function(e) {\n      script.parentNode.removeChild(script);\n      scope.currentScript = null;  \n    });\n    document.head.appendChild(script);\n  },\n  // determine the next element in the tree which should be parsed\n  nextToParse: function() {\n    return !this.parsingElement && this.nextToParseInDoc(mainDoc);\n  },\n  nextToParseInDoc: function(doc, link) {\n    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    // all nodes have been parsed, ready to parse import, if any\n    return link;\n  },\n  // return the set of parse selectors relevant for this node.\n  parseSelectorsForNode: function(node) {\n    var doc = node.ownerDocument || node;\n    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;\n  },\n  isParsed: function(node) {\n    return node.__importParsed;\n  },\n  hasResource: function(node) {\n    if (nodeIsImport(node) && !node.import) {\n      return false;\n    }\n    return true;\n  }\n};\n\nfunction nodeIsImport(elt) {\n  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);\n}\n\nfunction generateScriptDataUrl(script) {\n  var scriptContent = generateScriptContent(script), b64;\n  try {\n    b64 = btoa(scriptContent);\n  } catch(e) {\n    b64 = btoa(unescape(encodeURIComponent(scriptContent)));\n    console.warn('Script contained non-latin characters that were forced ' +\n      'to latin. Some characters may be wrong.', script);\n  }\n  return 'data:text/javascript;base64,' + b64;\n}\n\nfunction generateScriptContent(script) {\n  return script.textContent + generateSourceMapHint(script);\n}\n\n// calculate source map hint\nfunction generateSourceMapHint(script) {\n  var moniker = script.__nodeUrl;\n  if (!moniker) {\n    moniker = script.ownerDocument.baseURI;\n    // there could be more than one script this url\n    var tag = '[' + Math.floor((Math.random()+1)*1000) + ']';\n    // TODO(sjmiles): Polymer hack, should be pluggable if we need to allow \n    // this sort of thing\n    var matches = script.textContent.match(/Polymer\\(['\"]([^'\"]*)/);\n    tag = matches && matches[1] || tag;\n    // tag the moniker\n    moniker += '/' + tag + '.js';\n  }\n  return '\\n//# sourceURL=' + moniker + '\\n';\n}\n\n// style/stylesheet handling\n\n// clone style with proper path resolution for main document\n// NOTE: styles are the only elements that require direct path fixup.\nfunction cloneStyle(style) {\n  var clone = style.ownerDocument.createElement('style');\n  clone.textContent = style.textContent;\n  path.resolveUrlsInStyle(clone);\n  return clone;\n}\n\n// path fixup: style elements in imports must be made relative to the main \n// document. We fixup url's in url() and @import.\nvar CSS_URL_REGEXP = /(url\\()([^)]*)(\\))/g;\nvar CSS_IMPORT_REGEXP = /(@import[\\s]+(?!url\\())([^;]*)(;)/g;\n\nvar path = {\n  resolveUrlsInStyle: function(style) {\n    var doc = style.ownerDocument;\n    var resolver = doc.createElement('a');\n    style.textContent = this.resolveUrlsInCssText(style.textContent, resolver);\n    return style;  \n  },\n  resolveUrlsInCssText: function(cssText, urlObj) {\n    var r = this.replaceUrls(cssText, urlObj, CSS_URL_REGEXP);\n    r = this.replaceUrls(r, urlObj, CSS_IMPORT_REGEXP);\n    return r;\n  },\n  replaceUrls: function(text, urlObj, regexp) {\n    return text.replace(regexp, function(m, pre, url, post) {\n      var urlPath = url.replace(/[\"']/g, '');\n      urlObj.href = urlPath;\n      urlPath = urlObj.href;\n      return pre + '\\'' + urlPath + '\\'' + post;\n    });    \n  }\n}\n\n// exports\nscope.parser = importParser;\nscope.path = path;\nscope.isIE = isIe;\n\n})(HTMLImports);\n","/*\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\n(function(scope) {\n\nvar hasNative = ('import' in document.createElement('link'));\nvar useNative = hasNative;\nvar flags = scope.flags;\nvar IMPORT_LINK_TYPE = 'import';\n\n// TODO(sorvell): SD polyfill intrusion\nvar mainDoc = window.ShadowDOMPolyfill ? \n    ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\nif (!useNative) {\n\n  // imports\n  var xhr = scope.xhr;\n  var Loader = scope.Loader;\n  var parser = scope.parser;\n\n  // importer\n  // highlander object to manage loading of imports\n\n  // for any document, importer:\n  // - loads any linked import documents (with deduping)\n\n  var importer = {\n    documents: {},\n    // nodes to load in the mian document\n    documentPreloadSelectors: 'link[rel=' + IMPORT_LINK_TYPE + ']',\n    // nodes to load in imports\n    importsPreloadSelectors: [\n      'link[rel=' + IMPORT_LINK_TYPE + ']'\n    ].join(','),\n    loadNode: function(node) {\n      importLoader.addNode(node);\n    },\n    // load all loadable elements within the parent element\n    loadSubtree: function(parent) {\n      var nodes = this.marshalNodes(parent);\n      // add these nodes to loader's queue\n      importLoader.addNodes(nodes);\n    },\n    marshalNodes: function(parent) {\n      // all preloadable nodes in inDocument\n      return parent.querySelectorAll(this.loadSelectorsForNode(parent));\n    },\n    // find the proper set of load selectors for a given node\n    loadSelectorsForNode: function(node) {\n      var doc = node.ownerDocument || node;\n      return doc === mainDoc ? this.documentPreloadSelectors :\n          this.importsPreloadSelectors;\n    },\n    loaded: function(url, elt, resource) {\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      if (isDocumentLink(elt)) {\n        var doc = this.documents[url];\n        // if we've never seen a document at this url\n        if (!doc) {\n          // generate an HTMLDocument from data\n          doc = makeDocument(resource, url);\n          doc.__importLink = elt;\n          // TODO(sorvell): we cannot use MO to detect parsed nodes because\n          // SD polyfill does not report these as mutations.\n          this.bootDocument(doc);\n          // cache document\n          this.documents[url] = doc;\n        }\n        // don't store import record until we're actually loaded\n        // store document resource\n        elt.import = doc;\n      }\n      parser.parseNext();\n    },\n    bootDocument: function(doc) {\n      this.loadSubtree(doc);\n      this.observe(doc);\n      parser.parseNext();\n    },\n    loadedAll: function() {\n      parser.parseNext();\n    }\n  };\n\n  // loader singleton\n  var importLoader = new Loader(importer.loaded.bind(importer), \n      importer.loadedAll.bind(importer));\n\n  function isDocumentLink(elt) {\n    return isLinkRel(elt, IMPORT_LINK_TYPE);\n  }\n\n  function isLinkRel(elt, rel) {\n    return elt.localName === 'link' && elt.getAttribute('rel') === rel;\n  }\n\n  function isScript(elt) {\n    return elt.localName === 'script';\n  }\n\n  function makeDocument(resource, url) {\n    // create a new HTML document\n    var doc = resource;\n    if (!(doc instanceof Document)) {\n      doc = document.implementation.createHTMLDocument(IMPORT_LINK_TYPE);\n    }\n    // cache the new document's source url\n    doc._URL = url;\n    // establish a relative path via <base>\n    var base = doc.createElement('base');\n    base.setAttribute('href', url);\n    // add baseURI support to browsers (IE) that lack it.\n    if (!doc.baseURI) {\n      doc.baseURI = url;\n    }\n    // ensure UTF-8 charset\n    var meta = doc.createElement('meta');\n    meta.setAttribute('charset', 'utf-8');\n\n    doc.head.appendChild(meta);\n    doc.head.appendChild(base);\n    // install HTML last as it may trigger CustomElement upgrades\n    // TODO(sjmiles): problem wrt to template boostrapping below,\n    // template bootstrapping must (?) come before element upgrade\n    // but we cannot bootstrap templates until they are in a document\n    // which is too late\n    if (!(resource instanceof Document)) {\n      // install html\n      doc.body.innerHTML = resource;\n    }\n    // TODO(sorvell): ideally this code is not aware of Template polyfill,\n    // but for now the polyfill needs help to bootstrap these templates\n    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {\n      HTMLTemplateElement.bootstrap(doc);\n    }\n    return doc;\n  }\n} else {\n  // do nothing if using native imports\n  var importer = {};\n}\n\n// NOTE: We cannot polyfill document.currentScript because it's not possible\n// both to override and maintain the ability to capture the native value;\n// therefore we choose to expose _currentScript both when native imports\n// and the polyfill are in use.\nvar currentScriptDescriptor = {\n  get: function() {\n    return HTMLImports.currentScript || document.currentScript;\n  },\n  configurable: true\n};\n\nObject.defineProperty(document, '_currentScript', currentScriptDescriptor);\nObject.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);\n\n// Polyfill document.baseURI for browsers without it.\nif (!document.baseURI) {\n  var baseURIDescriptor = {\n    get: function() {\n      return window.location.href;\n    },\n    configurable: true\n  };\n\n  Object.defineProperty(document, 'baseURI', baseURIDescriptor);\n  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);\n}\n\n// call a callback when all HTMLImports in the document at call (or at least\n//  document ready) time have loaded.\n// 1. ensure the document is in a ready state (has dom), then \n// 2. watch for loading of imports and call callback when done\nfunction whenImportsReady(callback, doc) {\n  doc = doc || mainDoc;\n  // if document is loading, wait and try again\n  whenDocumentReady(function() {\n    watchImportsLoad(callback, doc);\n  }, doc);\n}\n\n// call the callback when the document is in a ready state (has dom)\nvar requiredReadyState = HTMLImports.isIE ? 'complete' : 'interactive';\nvar READY_EVENT = 'readystatechange';\nfunction isDocumentReady(doc) {\n  return (doc.readyState === 'complete' ||\n      doc.readyState === requiredReadyState);\n}\n\n// call <callback> when we ensure the document is in a ready state\nfunction whenDocumentReady(callback, doc) {\n  if (!isDocumentReady(doc)) {\n    var checkReady = function() {\n      if (doc.readyState === 'complete' || \n          doc.readyState === requiredReadyState) {\n        doc.removeEventListener(READY_EVENT, checkReady);\n        whenDocumentReady(callback, doc);\n      }\n    }\n    doc.addEventListener(READY_EVENT, checkReady);\n  } else if (callback) {\n    callback();\n  }\n}\n\n// call <callback> when we ensure all imports have loaded\nfunction watchImportsLoad(callback, doc) {\n  var imports = doc.querySelectorAll('link[rel=import]');\n  var loaded = 0, l = imports.length;\n  function checkDone(d) { \n    if (loaded == l) {\n      callback && callback();\n    }\n  }\n  function loadedImport(e) {\n    loaded++;\n    checkDone();\n  }\n  if (l) {\n    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {\n      if (isImportLoaded(imp)) {\n        loadedImport.call(imp);\n      } else {\n        imp.addEventListener('load', loadedImport);\n        imp.addEventListener('error', loadedImport);\n      }\n    }\n  } else {\n    checkDone();\n  }\n}\n\nfunction isImportLoaded(link) {\n  return useNative ? (link.import && (link.import.readyState !== 'loading')) || link.__loaded :\n      link.__importParsed;\n}\n\n// TODO(sorvell): install a mutation observer to see if HTMLImports have loaded\n// this is a workaround for https://www.w3.org/Bugs/Public/show_bug.cgi?id=25007\n// and should be removed when this bug is addressed.\nif (useNative) {\n  new MutationObserver(function(mxns) {\n    for (var i=0, l=mxns.length, m; (i < l) && (m=mxns[i]); i++) {\n      if (m.addedNodes) {\n        handleImports(m.addedNodes);\n      }\n    }\n  }).observe(document.head, {childList: true});\n\n  function handleImports(nodes) {\n    for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n      if (isImport(n)) {\n        handleImport(n);  \n      }\n    }\n  }\n\n  function isImport(element) {\n    return element.localName === 'link' && element.rel === 'import';\n  }\n\n  function handleImport(element) {\n    var loaded = element.import;\n    if (loaded) {\n      markTargetLoaded({target: element});\n    } else {\n      element.addEventListener('load', markTargetLoaded);\n      element.addEventListener('error', markTargetLoaded);\n    }\n  }\n\n  function markTargetLoaded(event) {\n    event.target.__loaded = true;\n  }\n\n}\n\n// exports\nscope.hasNative = hasNative;\nscope.useNative = useNative;\nscope.importer = importer;\nscope.whenImportsReady = whenImportsReady;\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\nscope.isImportLoaded = isImportLoaded;\nscope.importLoader = importLoader;\n\n})(window.HTMLImports);\n"," /*\nCopyright 2013 The Polymer Authors. All rights reserved.\nUse of this source code is governed by a BSD-style\nlicense that can be found in the LICENSE file.\n*/\n\n(function(scope){\n\nvar IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;\nvar importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';\nvar importer = scope.importer;\nvar parser = scope.parser;\n\n// we track mutations for addedNodes, looking for imports\nfunction handler(mutations) {\n  for (var i=0, l=mutations.length, m; (i<l) && (m=mutations[i]); i++) {\n    if (m.type === 'childList' && m.addedNodes.length) {\n      addedNodes(m.addedNodes);\n    }\n  }\n}\n\n// find loadable elements and add them to the importer\nfunction addedNodes(nodes) {\n  var owner;\n  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {\n    owner = owner || n.ownerDocument;\n    if (shouldLoadNode(n)) {\n      importer.loadNode(n);\n    }\n    if (n.children && n.children.length) {\n      addedNodes(n.children);\n    }\n  }\n  // TODO(sorvell): This is not the right approach here. We shouldn't need to\n  // invalidate parsing when an element is added. Disabling this code \n  // until a better approach is found.\n  /*\n  if (owner) {\n    parser.invalidateParse(owner);\n  }\n  */\n}\n\nfunction shouldLoadNode(node) {\n  return (node.nodeType === 1) && matches.call(node,\n      importer.loadSelectorsForNode(node));\n}\n\n// x-plat matches\nvar matches = HTMLElement.prototype.matches || \n    HTMLElement.prototype.matchesSelector || \n    HTMLElement.prototype.webkitMatchesSelector ||\n    HTMLElement.prototype.mozMatchesSelector ||\n    HTMLElement.prototype.msMatchesSelector;\n\nvar observer = new MutationObserver(handler);\n\n// observe the given root for loadable elements\nfunction observe(root) {\n  observer.observe(root, {childList: true, subtree: true});\n}\n\n// exports\n// TODO(sorvell): factor so can put on scope\nscope.observe = observe;\nimporter.observe = observe;\n\n})(HTMLImports);\n","/*\n * Copyright 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(){\n\n// bootstrap\n\n// IE shim for CustomEvent\nif (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// TODO(sorvell): SD polyfill intrusion\nvar doc = window.ShadowDOMPolyfill ? \n    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;\n\n// Fire the 'HTMLImportsLoaded' event when imports in document at load time \n// have loaded. This event is required to simulate the script blocking \n// behavior of native imports. A main document script that needs to be sure\n// imports have loaded should wait for this event.\nHTMLImports.whenImportsReady(function() {\n  HTMLImports.ready = true;\n  HTMLImports.readyTime = new Date().getTime();\n  doc.dispatchEvent(\n    new CustomEvent('HTMLImportsLoaded', {bubbles: true})\n  );\n});\n\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 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 */\nwindow.CustomElements = window.CustomElements || {flags:{}};"," /*\r\nCopyright 2013 The Polymer Authors. All rights reserved.\r\nUse of this source code is governed by a BSD-style\r\nlicense that can be found in the LICENSE file.\r\n*/\r\n\r\n(function(scope){\r\n\r\nvar logFlags = window.logFlags || {};\r\nvar IMPORT_LINK_TYPE = window.HTMLImports ? HTMLImports.IMPORT_LINK_TYPE : 'none';\r\n\r\n// walk the subtree rooted at node, applying 'find(element, data)' function\r\n// to each element\r\n// if 'find' returns true for 'element', do not search element's subtree\r\nfunction findAll(node, find, data) {\r\n  var e = node.firstElementChild;\r\n  if (!e) {\r\n    e = node.firstChild;\r\n    while (e && e.nodeType !== Node.ELEMENT_NODE) {\r\n      e = e.nextSibling;\r\n    }\r\n  }\r\n  while (e) {\r\n    if (find(e, data) !== true) {\r\n      findAll(e, find, data);\r\n    }\r\n    e = e.nextElementSibling;\r\n  }\r\n  return null;\r\n}\r\n\r\n// walk all shadowRoots on a given node.\r\nfunction forRoots(node, cb) {\r\n  var root = node.shadowRoot;\r\n  while(root) {\r\n    forSubtree(root, cb);\r\n    root = root.olderShadowRoot;\r\n  }\r\n}\r\n\r\n// walk the subtree rooted at node, including descent into shadow-roots,\r\n// applying 'cb' to each element\r\nfunction forSubtree(node, cb) {\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.group('subTree: ', node);\r\n  findAll(node, function(e) {\r\n    if (cb(e)) {\r\n      return true;\r\n    }\r\n    forRoots(e, cb);\r\n  });\r\n  forRoots(node, cb);\r\n  //logFlags.dom && node.childNodes && node.childNodes.length && console.groupEnd();\r\n}\r\n\r\n// manage lifecycle on added node\r\nfunction added(node) {\r\n  if (upgrade(node)) {\r\n    insertedNode(node);\r\n    return true;\r\n  }\r\n  inserted(node);\r\n}\r\n\r\n// manage lifecycle on added node's subtree only\r\nfunction addedSubtree(node) {\r\n  forSubtree(node, function(e) {\r\n    if (added(e)) {\r\n      return true;\r\n    }\r\n  });\r\n}\r\n\r\n// manage lifecycle on added node and it's subtree\r\nfunction addedNode(node) {\r\n  return added(node) || addedSubtree(node);\r\n}\r\n\r\n// upgrade custom elements at node, if applicable\r\nfunction upgrade(node) {\r\n  if (!node.__upgraded__ && node.nodeType === Node.ELEMENT_NODE) {\r\n    var type = node.getAttribute('is') || node.localName;\r\n    var definition = scope.registry[type];\r\n    if (definition) {\r\n      logFlags.dom && console.group('upgrade:', node.localName);\r\n      scope.upgrade(node);\r\n      logFlags.dom && console.groupEnd();\r\n      return true;\r\n    }\r\n  }\r\n}\r\n\r\nfunction insertedNode(node) {\r\n  inserted(node);\r\n  if (inDocument(node)) {\r\n    forSubtree(node, function(e) {\r\n      inserted(e);\r\n    });\r\n  }\r\n}\r\n\r\n// TODO(sorvell): on platforms without MutationObserver, mutations may not be\r\n// reliable and therefore attached/detached are not reliable.\r\n// To make these callbacks less likely to fail, we defer all inserts and removes\r\n// to give a chance for elements to be inserted into dom.\r\n// This ensures attachedCallback fires for elements that are created and\r\n// immediately added to dom.\r\nvar hasPolyfillMutations = (!window.MutationObserver ||\r\n    (window.MutationObserver === window.JsMutationObserver));\r\nscope.hasPolyfillMutations = hasPolyfillMutations;\r\n\r\nvar isPendingMutations = false;\r\nvar pendingMutations = [];\r\nfunction deferMutation(fn) {\r\n  pendingMutations.push(fn);\r\n  if (!isPendingMutations) {\r\n    isPendingMutations = true;\r\n    var async = (window.Platform && window.Platform.endOfMicrotask) ||\r\n        setTimeout;\r\n    async(takeMutations);\r\n  }\r\n}\r\n\r\nfunction takeMutations() {\r\n  isPendingMutations = false;\r\n  var $p = pendingMutations;\r\n  for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {\r\n    p();\r\n  }\r\n  pendingMutations = [];\r\n}\r\n\r\nfunction inserted(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _inserted(element);\r\n    });\r\n  } else {\r\n    _inserted(element);\r\n  }\r\n}\r\n\r\n// TODO(sjmiles): if there are descents into trees that can never have inDocument(*) true, fix this\r\nfunction _inserted(element) {\r\n  // TODO(sjmiles): it's possible we were inserted and removed in the space\r\n  // of one microtask, in which case we won't be 'inDocument' here\r\n  // But there are other cases where we are testing for inserted without\r\n  // specific knowledge of mutations, and must test 'inDocument' to determine\r\n  // whether to call inserted\r\n  // If we can factor these cases into separate code paths we can have\r\n  // better diagnostics.\r\n  // TODO(sjmiles): when logging, do work on all custom elements so we can\r\n  // track behavior even when callbacks not defined\r\n  //console.log('inserted: ', element.localName);\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('inserted:', element.localName);\r\n    if (inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) + 1;\r\n      // if we are in a 'removed' state, bluntly adjust to an 'inserted' state\r\n      if (element.__inserted < 1) {\r\n        element.__inserted = 1;\r\n      }\r\n      // if we are 'over inserted', squelch the callback\r\n      if (element.__inserted > 1) {\r\n        logFlags.dom && console.warn('inserted:', element.localName,\r\n          'insert/remove count:', element.__inserted)\r\n      } else if (element.attachedCallback) {\r\n        logFlags.dom && console.log('inserted:', element.localName);\r\n        element.attachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\nfunction removedNode(node) {\r\n  removed(node);\r\n  forSubtree(node, function(e) {\r\n    removed(e);\r\n  });\r\n}\r\n\r\nfunction removed(element) {\r\n  if (hasPolyfillMutations) {\r\n    deferMutation(function() {\r\n      _removed(element);\r\n    });\r\n  } else {\r\n    _removed(element);\r\n  }\r\n}\r\n\r\nfunction _removed(element) {\r\n  // TODO(sjmiles): temporary: do work on all custom elements so we can track\r\n  // behavior even when callbacks not defined\r\n  if (element.attachedCallback || element.detachedCallback || (element.__upgraded__ && logFlags.dom)) {\r\n    logFlags.dom && console.group('removed:', element.localName);\r\n    if (!inDocument(element)) {\r\n      element.__inserted = (element.__inserted || 0) - 1;\r\n      // if we are in a 'inserted' state, bluntly adjust to an 'removed' state\r\n      if (element.__inserted > 0) {\r\n        element.__inserted = 0;\r\n      }\r\n      // if we are 'over removed', squelch the callback\r\n      if (element.__inserted < 0) {\r\n        logFlags.dom && console.warn('removed:', element.localName,\r\n            'insert/remove count:', element.__inserted)\r\n      } else if (element.detachedCallback) {\r\n        element.detachedCallback();\r\n      }\r\n    }\r\n    logFlags.dom && console.groupEnd();\r\n  }\r\n}\r\n\r\n// SD polyfill intrustion due mainly to the fact that 'document'\r\n// is not entirely wrapped\r\nfunction wrapIfNeeded(node) {\r\n  return window.ShadowDOMPolyfill ? ShadowDOMPolyfill.wrapIfNeeded(node)\r\n      : node;\r\n}\r\n\r\nfunction inDocument(element) {\r\n  var p = element;\r\n  var doc = wrapIfNeeded(document);\r\n  while (p) {\r\n    if (p == doc) {\r\n      return true;\r\n    }\r\n    p = p.parentNode || p.host;\r\n  }\r\n}\r\n\r\nfunction watchShadow(node) {\r\n  if (node.shadowRoot && !node.shadowRoot.__watched) {\r\n    logFlags.dom && console.log('watching shadow-root for: ', node.localName);\r\n    // watch all unwatched roots...\r\n    var root = node.shadowRoot;\r\n    while (root) {\r\n      watchRoot(root);\r\n      root = root.olderShadowRoot;\r\n    }\r\n  }\r\n}\r\n\r\nfunction watchRoot(root) {\r\n  if (!root.__watched) {\r\n    observe(root);\r\n    root.__watched = true;\r\n  }\r\n}\r\n\r\nfunction handler(mutations) {\r\n  //\r\n  if (logFlags.dom) {\r\n    var mx = mutations[0];\r\n    if (mx && mx.type === 'childList' && mx.addedNodes) {\r\n        if (mx.addedNodes) {\r\n          var d = mx.addedNodes[0];\r\n          while (d && d !== document && !d.host) {\r\n            d = d.parentNode;\r\n          }\r\n          var u = d && (d.URL || d._URL || (d.host && d.host.localName)) || '';\r\n          u = u.split('/?').shift().split('/').pop();\r\n        }\r\n    }\r\n    console.group('mutations (%d) [%s]', mutations.length, u || '');\r\n  }\r\n  //\r\n  mutations.forEach(function(mx) {\r\n    //logFlags.dom && console.group('mutation');\r\n    if (mx.type === 'childList') {\r\n      forEach(mx.addedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        // nodes added may need lifecycle management\r\n        addedNode(n);\r\n      });\r\n      // removed nodes may need lifecycle management\r\n      forEach(mx.removedNodes, function(n) {\r\n        //logFlags.dom && console.log(n.localName);\r\n        if (!n.localName) {\r\n          return;\r\n        }\r\n        removedNode(n);\r\n      });\r\n    }\r\n    //logFlags.dom && console.groupEnd();\r\n  });\r\n  logFlags.dom && console.groupEnd();\r\n};\r\n\r\nvar observer = new MutationObserver(handler);\r\n\r\nfunction takeRecords() {\r\n  // TODO(sjmiles): ask Raf why we have to call handler ourselves\r\n  handler(observer.takeRecords());\r\n  takeMutations();\r\n}\r\n\r\nvar forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);\r\n\r\nfunction observe(inRoot) {\r\n  observer.observe(inRoot, {childList: true, subtree: true});\r\n}\r\n\r\nfunction observeDocument(doc) {\r\n  observe(doc);\r\n}\r\n\r\nfunction upgradeDocument(doc) {\r\n  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());\r\n  addedNode(doc);\r\n  logFlags.dom && console.groupEnd();\r\n}\r\n\r\nfunction upgradeDocumentTree(doc) {\r\n  doc = wrapIfNeeded(doc);\r\n  //console.log('upgradeDocumentTree: ', (doc.baseURI).split('/').pop());\r\n  // upgrade contained imported documents\r\n  var imports = doc.querySelectorAll('link[rel=' + IMPORT_LINK_TYPE + ']');\r\n  for (var i=0, l=imports.length, n; (i<l) && (n=imports[i]); i++) {\r\n    if (n.import && n.import.__parsed) {\r\n      upgradeDocumentTree(n.import);\r\n    }\r\n  }\r\n  upgradeDocument(doc);\r\n}\r\n\r\n// exports\r\nscope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;\r\nscope.watchShadow = watchShadow;\r\nscope.upgradeDocumentTree = upgradeDocumentTree;\r\nscope.upgradeAll = addedNode;\r\nscope.upgradeSubtree = addedSubtree;\r\nscope.insertedNode = insertedNode;\r\n\r\nscope.observeDocument = observeDocument;\r\nscope.upgradeDocument = upgradeDocument;\r\n\r\nscope.takeRecords = takeRecords;\r\n\r\n})(window.CustomElements);\r\n","/*\n * Copyright 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\n/**\n * Implements `document.register`\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    // remove 'unresolved' attr, which is a standin for :unresolved.\n    element.removeAttribute('unresolved');\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 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\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 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\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  // choose async\n  var async = window.Platform && Platform.endOfMicrotask ? \n    Platform.endOfMicrotask :\n    setTimeout;\n  async(function() {\n    // set internal 'ready' flag, now document.registerElement will trigger \n    // synchronous upgrades\n    CustomElements.ready = true;\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    // 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  });\n}\n\n// CustomEvent shim for IE\nif (typeof window.CustomEvent !== 'function') {\n  window.CustomEvent = function(inType) {\n    var e = document.createEvent('HTMLEvents');\n    e.initEvent(inType, true, true);\n    return e;\n  };\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  var endOfMicrotask = scope.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})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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\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})(window.Platform);\n","// Copyright (c) 2014 The Polymer Project Authors. All rights reserved.\n// This code may only be used under the BSD style license found at http://polymer.github.io/LICENSE.txt\n// The complete set of authors may be found at http://polymer.github.io/AUTHORS.txt\n// The complete set of contributors may be found at http://polymer.github.io/CONTRIBUTORS.txt\n// Code distributed by Google as part 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();\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      if (directives.if) {\n        deps.hasIf = true;\n        deps.ifOneTime = directives.if.onlyOneTime;\n        deps.ifValue = processBinding(IF, directives.if, template, model);\n\n        // oneTime if & predicate is false. nothing else to do.\n        if (deps.ifOneTime && !deps.ifValue) {\n          this.updateIteratedValue();\n          return;\n        }\n\n        if (!deps.ifOneTime)\n          deps.ifValue.open(this.updateIteratedValue, 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      if (!deps.oneTime)\n        deps.value.open(this.updateIteratedValue, this);\n\n      this.updateIteratedValue();\n    },\n\n    updateIteratedValue: function() {\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      var value = this.deps.value;\n      if (!this.deps.oneTime)\n        value = value.discardChanges();\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\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"]}
\ No newline at end of file
diff --git a/pkg/web_components/pubspec.yaml b/pkg/web_components/pubspec.yaml
index b8f0bc5..1cc75cd 100644
--- a/pkg/web_components/pubspec.yaml
+++ b/pkg/web_components/pubspec.yaml
@@ -1,5 +1,5 @@
 name: web_components
-version: 0.3.5-dev.2
+version: 0.3.5
 author: Polymer.dart Authors <web-ui-dev@dartlang.org>
 homepage: https://www.dartlang.org/polymer-dart/
 description: >
diff --git a/pkg/web_components/test/interop_test.dart b/pkg/web_components/test/interop_test.dart
index cbad6e1..20cce29 100644
--- a/pkg/web_components/test/interop_test.dart
+++ b/pkg/web_components/test/interop_test.dart
@@ -120,6 +120,16 @@
     expect(c.x, 7);
     expect(c.wrapperCount, 6);
   });
+
+  test('element can extend another element', () {
+    registerDartType('x-e', XEWrapper);
+    context.callMethod('addE');
+
+    var e = document.querySelector('x-e');
+    expect(e is XEWrapper, isTrue);
+    expect(e.x, 8);
+    expect(e.y, 9);
+  });
 }
 int _count = 0;
 
@@ -145,3 +155,9 @@
 class XDWrapper extends HtmlElement with Wrapper {
   XDWrapper.created() : super.created();
 }
+
+class XEWrapper extends HtmlElement with Wrapper {
+  XEWrapper.created() : super.created();
+
+  int get y => new JsObject.fromBrowserObject(this)['y'];
+}
diff --git a/pkg/web_components/test/interop_test.html b/pkg/web_components/test/interop_test.html
index 036c7ef..d49dcb9 100644
--- a/pkg/web_components/test/interop_test.html
+++ b/pkg/web_components/test/interop_test.html
@@ -32,13 +32,23 @@
     D.prototype.inc = function() { this.x = counter++; };
     D.prototype.createdCallback = function() { this.inc(); };
 
+    var E = { prototype: Object.create(D.prototype) };
+    E.prototype.inc2 = function() {
+      this.y = counter++;
+    };
+    E.prototype.createdCallback = function() {
+      D.prototype.createdCallback.call(this);
+      this.inc2();
+    };
+
     document.registerElement('x-a', A);
     document.registerElement('x-b', B);
     document.registerElement('x-d', D);
+    document.registerElement('x-e', E);
 
     function registerC() {
       var proto = Object.create(HTMLElement.prototype, {
-        inc: { value: function() { this.x = counter++; } }, 
+        inc: { value: function() { this.x = counter++; } },
         createdCallback: {
           value: function() { this.inc(); },
           configurable: true},
@@ -57,6 +67,9 @@
     function addD() {
       document.body.appendChild(document.createElement('x-d'));
     }
+    function addE() {
+      document.body.appendChild(document.createElement('x-e'));
+    }
   </script>
   <x-a id="i1"></x-a>
   <div is="x-b" id="i2"></div>
diff --git a/pkg/yaml/CHANGELOG.md b/pkg/yaml/CHANGELOG.md
index 261a666..e4f532c 100644
--- a/pkg/yaml/CHANGELOG.md
+++ b/pkg/yaml/CHANGELOG.md
@@ -1,3 +1,21 @@
+## 1.1.1
+
+* Fix broken type arguments that caused breakage on dart2js.
+
+* Fix an analyzer warning in `yaml_node_wrapper.dart`.
+
+## 1.1.0
+
+* Add new publicly-accessible constructors for `YamlNode` subclasses. These
+  constructors make it possible to use the same API to access non-YAML data as
+  YAML data.
+
+* Make `YamlException` inherit from source_map's [`SpanFormatException`][]. This
+  improves the error formatting and allows callers access to source range
+  information.
+
+[SpanFormatException]: (http://www.dartdocs.org/documentation/source_maps/0.9.2/index.html#source_maps/source_maps.SpanFormatException)
+
 ## 1.0.0+1
 
 * Fix a variable name typo.
diff --git a/pkg/yaml/lib/src/composer.dart b/pkg/yaml/lib/src/composer.dart
index 1a23bc6..8612067 100644
--- a/pkg/yaml/lib/src/composer.dart
+++ b/pkg/yaml/lib/src/composer.dart
@@ -34,7 +34,8 @@
   /// Returns the anchor to which an alias node refers.
   Node visitAlias(AliasNode alias) {
     if (!_anchors.containsKey(alias.anchor)) {
-      throw new YamlException("No anchor for alias ${alias.anchor}.");
+      throw new YamlException("No anchor for alias ${alias.anchor}.",
+          alias.span);
     }
     return _anchors[alias.anchor];
   }
@@ -56,8 +57,8 @@
 
     var result = _parseByTag(scalar);
     if (result != null) return setAnchor(scalar, result);
-    throw new YamlException('Invalid literal for ${scalar.tag}: '
-        '"${scalar.content}".');
+    throw new YamlException('Invalid literal for ${scalar.tag}.',
+        scalar.span);
   }
 
   ScalarNode _parseByTag(ScalarNode scalar) {
@@ -68,14 +69,15 @@
       case "float": return parseFloat(scalar);
       case "str": return parseString(scalar);
     }
-    throw new YamlException('Undefined tag: ${scalar.tag}.');
+    throw new YamlException('Undefined tag: ${scalar.tag}.', scalar.span);
   }
 
   /// Assigns a tag to the sequence and recursively composes its contents.
   Node visitSequence(SequenceNode seq) {
     var tagName = seq.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("seq")) {
-      throw new YamlException("Invalid tag for sequence: ${seq.tag}.");
+      throw new YamlException("Invalid tag for sequence: ${seq.tag}.",
+          seq.span);
     }
 
     var result = setAnchor(seq,
@@ -88,7 +90,8 @@
   Node visitMapping(MappingNode map) {
     var tagName = map.tag.name;
     if (tagName != "!" && tagName != "?" && tagName != Tag.yaml("map")) {
-      throw new YamlException("Invalid tag for mapping: ${map.tag}.");
+      throw new YamlException("Invalid tag for mapping: ${map.tag}.",
+          map.span);
     }
 
     var result = setAnchor(map,
diff --git a/pkg/yaml/lib/src/constructor.dart b/pkg/yaml/lib/src/constructor.dart
index 5cf23c7..5931dae 100644
--- a/pkg/yaml/lib/src/constructor.dart
+++ b/pkg/yaml/lib/src/constructor.dart
@@ -26,14 +26,14 @@
 
   /// Returns the value of a scalar.
   YamlScalar visitScalar(ScalarNode scalar) =>
-      new YamlScalar(scalar.value, scalar.span);
+      new YamlScalar.internal(scalar.value, scalar.span);
 
   /// Converts a sequence into a List of Dart objects.
   YamlList visitSequence(SequenceNode seq) {
     var anchor = getAnchor(seq);
     if (anchor != null) return anchor;
     var nodes = [];
-    var dartSeq = setAnchor(seq, new YamlList(nodes, seq.span));
+    var dartSeq = setAnchor(seq, new YamlList.internal(nodes, seq.span));
     nodes.addAll(super.visitSequence(seq));
     return dartSeq;
   }
@@ -43,7 +43,7 @@
     var anchor = getAnchor(map);
     if (anchor != null) return anchor;
     var nodes = deepEqualsMap();
-    var dartMap = setAnchor(map, new YamlMap(nodes, map.span));
+    var dartMap = setAnchor(map, new YamlMap.internal(nodes, map.span));
     super.visitMapping(map).forEach((k, v) => nodes[k] = v);
     return dartMap;
   }
@@ -57,10 +57,14 @@
 
     // Re-wrap [value]'s contents so that it's associated with the span of the
     // anchor rather than its original definition.
-    if (value is YamlMap) return new YamlMap(value.nodes, anchored.span);
-    if (value is YamlList) return new YamlList(value.nodes, anchored.span);
-    assert(value is YamlScalar);
-    return new YamlScalar(value.value, anchored.span);
+    if (value is YamlMap) {
+      return new YamlMap.internal(value.nodes, anchored.span);
+    } else if (value is YamlList) {
+      return new YamlList.internal(value.nodes, anchored.span);
+    } else {
+      assert(value is YamlScalar);
+      return new YamlScalar.internal(value.value, anchored.span);
+    }
   }
 
   /// Records that [value] is the Dart object representing [anchored].
diff --git a/pkg/yaml/lib/src/model.dart b/pkg/yaml/lib/src/model.dart
index f0e839c..0973769 100644
--- a/pkg/yaml/lib/src/model.dart
+++ b/pkg/yaml/lib/src/model.dart
@@ -208,7 +208,7 @@
       return '"${escapedValue.join()}"';
     }
 
-    throw new YamlException('Unknown scalar value: "$value".');
+    throw new YamlException('Unknown scalar value.', span);
   }
 
   String toString() => '$tag "$content"';
diff --git a/pkg/yaml/lib/src/null_span.dart b/pkg/yaml/lib/src/null_span.dart
new file mode 100644
index 0000000..b3e3254
--- /dev/null
+++ b/pkg/yaml/lib/src/null_span.dart
@@ -0,0 +1,47 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.null_span;
+
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart';
+
+/// A [Span] with no location information.
+///
+/// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
+/// accessing a non-YAML map that behaves transparently like a map parsed from
+/// YAML.
+class NullSpan extends Span {
+  Location get end => start;
+  final text = "";
+
+  NullSpan(String sourceUrl)
+      : this._(new NullLocation(sourceUrl));
+
+  NullSpan._(Location location)
+      : super(location, location, false);
+
+  String formatLocationMessage(String message, {bool useColors: false,
+      String color}) {
+    var locationMessage = sourceUrl == null ? "in an unknown location" :
+        "in ${p.prettyUri(sourceUrl)}";
+    return "$locationMessage: $message";
+  }
+}
+
+/// A [Location] with no location information.
+///
+/// This is used with [YamlMap.wrap] and [YamlList.wrap] to provide means of
+/// accessing a non-YAML map that behaves transparently like a map parsed from
+/// YAML.
+class NullLocation extends Location {
+  final String sourceUrl;
+  final line = 0;
+  final column = 0;
+
+  String get formatString => sourceUrl == null ? "unknown location" : sourceUrl;
+
+  NullLocation(this.sourceUrl)
+      : super(0);
+}
diff --git a/pkg/yaml/lib/src/yaml_exception.dart b/pkg/yaml/lib/src/yaml_exception.dart
index a863274..9d43717 100644
--- a/pkg/yaml/lib/src/yaml_exception.dart
+++ b/pkg/yaml/lib/src/yaml_exception.dart
@@ -4,12 +4,11 @@
 
 library yaml.exception;
 
+import 'package:source_maps/source_maps.dart';
+
 /// An error thrown by the YAML processor.
-class YamlException implements Exception {
-  final String _msg;
-
-  YamlException(this._msg);
-
-  String toString() => _msg;
+class YamlException extends SpanFormatException {
+  YamlException(String message, Span span)
+      : super(message, span);
 }
 
diff --git a/pkg/yaml/lib/src/yaml_node.dart b/pkg/yaml/lib/src/yaml_node.dart
index d0e0578..1aded2b 100644
--- a/pkg/yaml/lib/src/yaml_node.dart
+++ b/pkg/yaml/lib/src/yaml_node.dart
@@ -2,13 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library yaml.map;
+library yaml.yaml_node;
 
 import 'dart:collection' as collection;
 
 import 'package:collection/collection.dart';
 import 'package:source_maps/source_maps.dart';
 
+import 'null_span.dart';
+import 'yaml_node_wrapper.dart';
+
 /// An interface for parsed nodes from a YAML source tree.
 ///
 /// [YamlMap]s and [YamlList]s implement this interface in addition to the
@@ -37,14 +40,40 @@
 class YamlMap extends YamlNode with collection.MapMixin, UnmodifiableMapMixin  {
   final Span span;
 
+  /// A view of [this] where the keys and values are guaranteed to be
+  /// [YamlNode]s.
+  ///
+  /// The key type is `dynamic` to allow values to be accessed using
+  /// non-[YamlNode] keys, but [Map.keys] and [Map.forEach] will always expose
+  /// them as [YamlNode]s. For example, for `{"foo": [1, 2, 3]}` [nodes] will be
+  /// a map from a [YamlScalar] to a [YamlList], but since the key type is
+  /// `dynamic` `map.nodes["foo"]` will still work.
   final Map<dynamic, YamlNode> nodes;
 
   Map get value => this;
 
   Iterable get keys => nodes.keys.map((node) => node.value);
 
-  /// Users of the library should not construct [YamlMap]s manually.
-  YamlMap(Map<dynamic, YamlNode> nodes, this.span)
+  /// Creates an empty YamlMap.
+  ///
+  /// This map's [span] won't have useful location information. However, it will
+  /// have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  factory YamlMap({String sourceName}) =>
+      new YamlMapWrapper(const {}, sourceName);
+
+  /// Wraps a Dart map so that it can be accessed (recursively) like a
+  /// [YamlMap].
+  ///
+  /// Any [Span]s returned by this map or its children will be dummies without
+  /// useful location information. However, they will have a reasonable
+  /// implementation of [Span.getLocationMessage]. If [sourceName] is passed,
+  /// it's used as the [Span.sourceUrl].
+  factory YamlMap.wrap(Map dartMap, {String sourceName}) =>
+      new YamlMapWrapper(dartMap, sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlMap.internal(Map<dynamic, YamlNode> nodes, this.span)
       : nodes = new UnmodifiableMapView<dynamic, YamlNode>(nodes);
 
   operator [](key) {
@@ -68,8 +97,26 @@
     throw new UnsupportedError("Cannot modify an unmodifiable List");
   }
 
-  /// Users of the library should not construct [YamlList]s manually.
-  YamlList(List<YamlNode> nodes, this.span)
+  /// Creates an empty YamlList.
+  ///
+  /// This list's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  factory YamlList({String sourceName}) =>
+      new YamlListWrapper(const [], sourceName);
+
+  /// Wraps a Dart list so that it can be accessed (recursively) like a
+  /// [YamlList].
+  ///
+  /// Any [Span]s returned by this list or its children will be dummies without
+  /// useful location information. However, they will have a reasonable
+  /// implementation of [Span.getLocationMessage]. If [sourceName] is passed,
+  /// it's used as the [Span.sourceUrl].
+  factory YamlList.wrap(List dartList, {String sourceName}) =>
+      new YamlListWrapper(dartList, sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlList.internal(List<YamlNode> nodes, this.span)
       : nodes = new UnmodifiableListView<YamlNode>(nodes);
 
   operator [](int index) => nodes[index].value;
@@ -85,8 +132,16 @@
 
   final value;
 
-  /// Users of the library should not construct [YamlScalar]s manually.
-  YamlScalar(this.value, this.span);
+  /// Wraps a Dart value in a [YamlScalar].
+  ///
+  /// This scalar's [span] won't have useful location information. However, it
+  /// will have a reasonable implementation of [Span.getLocationMessage]. If
+  /// [sourceName] is passed, it's used as the [Span.sourceUrl].
+  YamlScalar.wrap(this.value, {String sourceName})
+      : span = new NullSpan(sourceName);
+
+  /// Users of the library should not use this constructor.
+  YamlScalar.internal(this.value, this.span);
 
   String toString() => value.toString();
 }
diff --git a/pkg/yaml/lib/src/yaml_node_wrapper.dart b/pkg/yaml/lib/src/yaml_node_wrapper.dart
new file mode 100644
index 0000000..2dcaa23
--- /dev/null
+++ b/pkg/yaml/lib/src/yaml_node_wrapper.dart
@@ -0,0 +1,150 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library yaml.yaml_node_wrapper;
+
+import 'dart:collection';
+
+import 'package:collection/collection.dart' as pkg_collection;
+import 'package:source_maps/source_maps.dart';
+
+import 'null_span.dart';
+import 'yaml_node.dart';
+
+/// A wrapper that makes a normal Dart map behave like a [YamlMap].
+class YamlMapWrapper extends MapBase
+    with pkg_collection.UnmodifiableMapMixin
+    implements YamlMap {
+  final Map _dartMap;
+
+  final Span span;
+
+  final Map<dynamic, YamlNode> nodes;
+
+  Map get value => this;
+
+  Iterable get keys => _dartMap.keys;
+
+  YamlMapWrapper(Map dartMap, String sourceName)
+      : this._(dartMap, new NullSpan(sourceName));
+
+  YamlMapWrapper._(Map dartMap, Span span)
+      : _dartMap = dartMap,
+        span = span,
+        nodes = new _YamlMapNodes(dartMap, span);
+
+  operator [](Object key) {
+    var value = _dartMap[key];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlMapWrapper && other._dartMap == _dartMap;
+}
+
+/// The implementation of [YamlMapWrapper.nodes] as a wrapper around the Dart
+/// map.
+class _YamlMapNodes extends MapBase<dynamic, YamlNode>
+    with pkg_collection.UnmodifiableMapMixin<dynamic, YamlNode> {
+  final Map _dartMap;
+
+  final Span _span;
+
+  Iterable get keys =>
+      _dartMap.keys.map((key) => new YamlScalar.internal(key, _span));
+
+  _YamlMapNodes(this._dartMap, this._span);
+
+  YamlNode operator [](Object key) {
+    // Use "as" here because key being assigned to invalidates type propagation.
+    if (key is YamlScalar) key = (key as YamlScalar).value;
+    if (!_dartMap.containsKey(key)) return null;
+    return _nodeForValue(_dartMap[key], _span);
+  }
+
+  int get hashCode => _dartMap.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlMapNodes && other._dartMap == _dartMap;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// A wrapper that makes a normal Dart list behave like a [YamlList].
+class YamlListWrapper extends ListBase implements YamlList {
+  final List _dartList;
+
+  final Span span;
+
+  final List<YamlNode> nodes;
+
+  List get value => this;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  YamlListWrapper(List dartList, String sourceName)
+      : this._(dartList, new NullSpan(sourceName));
+
+  YamlListWrapper._(List dartList, Span span)
+      : _dartList = dartList,
+        span = span,
+        nodes = new _YamlListNodes(dartList, span);
+
+  operator [](int index) {
+    var value = _dartList[index];
+    if (value is Map) return new YamlMapWrapper._(value, span);
+    if (value is List) return new YamlListWrapper._(value, span);
+    return value;
+  }
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is YamlListWrapper && other._dartList == _dartList;
+}
+
+// TODO(nweiz): Use UnmodifiableListMixin when issue 18970 is fixed.
+/// The implementation of [YamlListWrapper.nodes] as a wrapper around the Dart
+/// list.
+class _YamlListNodes extends ListBase<YamlNode> {
+  final List _dartList;
+
+  final Span _span;
+
+  int get length => _dartList.length;
+
+  set length(int index) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  _YamlListNodes(this._dartList, this._span);
+
+  YamlNode operator [](int index) => _nodeForValue(_dartList[index], _span);
+
+  operator []=(int index, value) {
+    throw new UnsupportedError("Cannot modify an unmodifiable List.");
+  }
+
+  int get hashCode => _dartList.hashCode;
+
+  operator ==(Object other) =>
+      other is _YamlListNodes && other._dartList == _dartList;
+}
+
+YamlNode _nodeForValue(value, Span span) {
+  if (value is Map) return new YamlMapWrapper._(value, span);
+  if (value is List) return new YamlListWrapper._(value, span);
+  return new YamlScalar.internal(value, span);
+}
diff --git a/pkg/yaml/lib/yaml.dart b/pkg/yaml/lib/yaml.dart
index f59719d..0afc2cc 100644
--- a/pkg/yaml/lib/yaml.dart
+++ b/pkg/yaml/lib/yaml.dart
@@ -4,6 +4,8 @@
 
 library yaml;
 
+import 'package:string_scanner/string_scanner.dart';
+
 import 'src/composer.dart';
 import 'src/constructor.dart';
 import 'src/parser.dart';
@@ -40,7 +42,8 @@
 YamlNode loadYamlNode(String yaml, {String sourceName}) {
   var stream = loadYamlStream(yaml, sourceName: sourceName);
   if (stream.length != 1) {
-    throw new YamlException("Expected 1 document, were ${stream.length}.");
+    throw new YamlException("Expected 1 document, were ${stream.length}.",
+        stream.span);
   }
   return stream.nodes[0];
 }
@@ -62,12 +65,12 @@
   var pair;
   try {
     pair = new Parser(yaml, sourceName).l_yamlStream();
-  } on FormatException catch (error) {
-    throw new YamlException(error.toString());
+  } on StringScannerException catch (error) {
+    throw new YamlException(error.message, error.span);
   }
 
   var nodes = pair.first
       .map((doc) => new Constructor(new Composer(doc).compose()).construct())
       .toList();
-  return new YamlList(nodes, pair.last);
+  return new YamlList.internal(nodes, pair.last);
 }
diff --git a/pkg/yaml/pubspec.yaml b/pkg/yaml/pubspec.yaml
index 50fc3db..c160482 100644
--- a/pkg/yaml/pubspec.yaml
+++ b/pkg/yaml/pubspec.yaml
@@ -1,12 +1,14 @@
 name: yaml
-version: 1.0.0+1
+version: 1.1.1
 author: "Dart Team <misc@dartlang.org>"
 homepage: http://www.dartlang.org
 description: A parser for YAML.
 dependencies:
   collection: ">=0.9.2 <0.10.0"
+  path: ">=1.2.0 <2.0.0"
   string_scanner: ">=0.0.2 <0.1.0"
+  source_maps: ">=0.9.2 <0.10.0"
 dev_dependencies:
   unittest: ">=0.9.0 <0.12.0"
 environment:
-  sdk: ">=0.8.10+6 <2.0.0"
+  sdk: ">=1.5.0-dev.0.0 <2.0.0"
diff --git a/pkg/yaml/test/yaml_node_wrapper_test.dart b/pkg/yaml/test/yaml_node_wrapper_test.dart
new file mode 100644
index 0000000..8bf4761
--- /dev/null
+++ b/pkg/yaml/test/yaml_node_wrapper_test.dart
@@ -0,0 +1,163 @@
+// 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 yaml.node_wrapper_test;
+
+import 'package:source_maps/source_maps.dart';
+import 'package:unittest/unittest.dart';
+import 'package:yaml/yaml.dart';
+
+main() {
+  test("YamlMap() with no sourceName", () {
+    var map = new YamlMap();
+    expect(map, isEmpty);
+    expect(map.nodes, isEmpty);
+    expect(map.span, isNullSpan(isNull));
+  });
+
+  test("YamlMap() with a sourceName", () {
+    var map = new YamlMap(sourceName: "source");
+    expect(map.span, isNullSpan("source"));
+  });
+
+  test("YamlList() with no sourceName", () {
+    var list = new YamlList();
+    expect(list, isEmpty);
+    expect(list.nodes, isEmpty);
+    expect(list.span, isNullSpan(isNull));
+  });
+
+  test("YamlList() with a sourceName", () {
+    var list = new YamlList(sourceName: "source");
+    expect(list.span, isNullSpan("source"));
+  });
+
+  test("YamlMap.wrap() with no sourceName", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    });
+
+    expect(map, equals({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }));
+
+    expect(map.span, isNullSpan(isNull));
+    expect(map["list"], new isInstanceOf<YamlList>());
+    expect(map["list"].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(map["list"].span, isNullSpan(isNull));
+    expect(map["map"], new isInstanceOf<YamlMap>());
+    expect(map["map"].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(map["map"]["nested"], new isInstanceOf<YamlList>());
+    expect(map["map"].span, isNullSpan(isNull));
+    expect(map.nodes["scalar"], new isInstanceOf<YamlScalar>());
+    expect(map.nodes["scalar"].value, "value");
+    expect(map.nodes["scalar"].span, isNullSpan(isNull));
+    expect(map["scalar"], "value");
+    expect(map.keys, unorderedEquals(["list", "map", "scalar"]));
+    expect(map.nodes.keys, everyElement(new isInstanceOf<YamlScalar>()));
+    expect(map.nodes[new YamlScalar.wrap("list")], equals([1, 2, 3]));
+  });
+
+  test("YamlMap.wrap() with a sourceName", () {
+    var map = new YamlMap.wrap({
+      "list": [1, 2, 3],
+      "map": {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "scalar": "value"
+    }, sourceName: "source");
+
+    expect(map.span, isNullSpan("source"));
+    expect(map["list"].span, isNullSpan("source"));
+    expect(map["map"].span, isNullSpan("source"));
+    expect(map.nodes["scalar"].span, isNullSpan("source"));
+  });
+
+  test("YamlList.wrap() with no sourceName", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list, equals([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]));
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0], new isInstanceOf<YamlList>());
+    expect(list[0].nodes[0], new isInstanceOf<YamlScalar>());
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1], new isInstanceOf<YamlMap>());
+    expect(list[1].nodes["foo"], new isInstanceOf<YamlScalar>());
+    expect(list[1]["nested"], new isInstanceOf<YamlList>());
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2], new isInstanceOf<YamlScalar>());
+    expect(list.nodes[2].value, "value");
+    expect(list.nodes[2].span, isNullSpan(isNull));
+    expect(list[2], "value");
+  });
+
+  test("YamlList.wrap() with a sourceName", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {
+        "foo": "bar",
+        "nested": [4, 5, 6]
+      },
+      "value"
+    ]);
+
+    expect(list.span, isNullSpan(isNull));
+    expect(list[0].span, isNullSpan(isNull));
+    expect(list[1].span, isNullSpan(isNull));
+    expect(list.nodes[2].span, isNullSpan(isNull));
+  });
+
+  solo_test("re-wrapped objects equal one another", () {
+    var list = new YamlList.wrap([
+      [1, 2, 3],
+      {"foo": "bar"}
+    ]);
+
+    expect(list[0] == list[0], isTrue);
+    expect(list[0].nodes == list[0].nodes, isTrue);
+    expect(list[0] == new YamlList.wrap([1, 2, 3]), isFalse);
+    expect(list[1] == list[1], isTrue);
+    expect(list[1].nodes == list[1].nodes, isTrue);
+    expect(list[1] == new YamlMap.wrap({"foo": "bar"}), isFalse);
+  });
+}
+
+Matcher isNullSpan(sourceUrl) => predicate((span) {
+  expect(span, new isInstanceOf<Span>());
+  expect(span.length, equals(0));
+  expect(span.text, isEmpty);
+  expect(span.isIdentifier, isFalse);
+  expect(span.start, equals(span.end));
+  expect(span.start.offset, equals(0));
+  expect(span.start.line, equals(0));
+  expect(span.start.column, equals(0));
+  expect(span.sourceUrl, sourceUrl);
+  return true;
+});
diff --git a/runtime/bin/bin.gypi b/runtime/bin/bin.gypi
index 2d498e2..3be7164 100644
--- a/runtime/bin/bin.gypi
+++ b/runtime/bin/bin.gypi
@@ -41,7 +41,7 @@
             '--input_cc', '<(builtin_in_cc_file)',
             '--include', 'bin/builtin.h',
             '--var_name', 'dart::bin::Builtin::builtin_source_paths_',
-            '--library_name', 'dart:builtin',
+            '--library_name', 'dart:_builtin',
             '<@(_sources)',
           ],
           'message': 'Generating ''<(builtin_cc_file)'' file.'
diff --git a/runtime/bin/builtin.dart b/runtime/bin/builtin.dart
index c20f7d1..8f6ea77 100644
--- a/runtime/bin/builtin.dart
+++ b/runtime/bin/builtin.dart
@@ -308,9 +308,34 @@
 }
 
 
-void _loadScript(String uri, List<int> data) native "Builtin_LoadScript";
+int _numOutstandingLoadRequests = 0;
 
-void _asyncLoadError(uri, error) native "Builtin_AsyncLoadError";
+void _signalDoneLoading() native "Builtin_DoneLoading";
+
+void _loadScriptCallback(String uri, List<int> data) native "Builtin_LoadScript";
+
+void _loadScript(String uri, List<int> data) {
+  // TODO: Currently a compilation error while loading the script is
+  // fatal for the isolate. _loadScriptCallback() does not return and
+  // the _numOutstandingLoadRequests counter remains out of sync.
+  _loadScriptCallback(uri, data);
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _logResolution("native Builtin_LoadScript($uri) completed, "
+                 "${_numOutstandingLoadRequests} requests remaining");
+  if (_numOutstandingLoadRequests == 0) {
+    _signalDoneLoading();
+  }
+}
+
+
+void _asyncLoadErrorCallback(uri, error) native "Builtin_AsyncLoadError";
+
+void _asyncLoadError(uri, error) {
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _asyncLoadErrorCallback(uri, error);
+}
 
 
 // Asynchronously loads script data (source or snapshot) through
@@ -318,32 +343,50 @@
 _loadDataAsync(String uri) {
   uri = _resolveScriptUri(uri);
   Uri sourceUri = Uri.parse(uri);
+  _numOutstandingLoadRequests++;
+  _logResolution("_loadDataAsync($uri), "
+                 "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
     _httpGet(sourceUri, (data) {
       _loadScript(uri, data);
     });
   } else {
-    _loadDataFromFileAsync(uri);
+    var sourceFile = new File(_filePathFromUri(uri));
+    sourceFile.readAsBytes().then((data) {
+      _loadScript(uri, data);
+    },
+    onError: (e) {
+      _asyncLoadError(uri, e);
+    });
   }
 }
 
-_loadDataFromFileAsync(String uri) {
-  var sourceFile = new File(_filePathFromUri(uri));
-  sourceFile.readAsBytes().then((data) {
-    _loadScript(uri, data);
-  },
-  onError: (e) {
-    _asyncLoadError(uri, e);
-  });
+
+void _loadLibrarySourceCallback(tag, uri, libraryUri, text)
+    native "Builtin_LoadLibrarySource";
+
+void _loadLibrarySource(tag, uri, libraryUri, text) {
+  // TODO: Currently a compilation error while loading the library is
+  // fatal for the isolate. _loadLibraryCallback() does not return and
+  // the _numOutstandingLoadRequests counter remains out of sync.
+  _loadLibrarySourceCallback(tag, uri, libraryUri, text);
+  assert(_numOutstandingLoadRequests > 0);
+  _numOutstandingLoadRequests--;
+  _logResolution("native Builtin_LoadLibrarySource($uri) completed, "
+                 "${_numOutstandingLoadRequests} requests remaining");
+  if (_numOutstandingLoadRequests == 0) {
+    _signalDoneLoading();
+  }
 }
 
 
-void _loadLibrarySource(tag, uri, libraryUri, text)
-    native "Builtin_LoadLibrarySource";
-
+// Asynchronously loads source code through an http or file uri.
 _loadSourceAsync(int tag, String uri, String libraryUri) {
   var filePath = _filePathFromUri(uri);
   Uri sourceUri = Uri.parse(filePath);
+  _numOutstandingLoadRequests++;
+  _logResolution("_loadLibrarySource($uri), "
+                 "${_numOutstandingLoadRequests} requests outstanding");
   if (sourceUri.scheme == 'http') {
     _httpGet(sourceUri, (data) {
       var text = UTF8.decode(data);
diff --git a/runtime/bin/builtin_impl_sources.gypi b/runtime/bin/builtin_impl_sources.gypi
index 2d997bc..1c38b33 100644
--- a/runtime/bin/builtin_impl_sources.gypi
+++ b/runtime/bin/builtin_impl_sources.gypi
@@ -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.
 
-# This file contains all C++ sources for the dart:builtin library and
+# This file contains all C++ sources for the dart:_builtin library and
 # some of the C++ sources for the dart:io library.  The rest are in
 # io_impl_sources.gypi.
 {
diff --git a/runtime/bin/builtin_natives.cc b/runtime/bin/builtin_natives.cc
index 8298b97..6068f4d 100644
--- a/runtime/bin/builtin_natives.cc
+++ b/runtime/bin/builtin_natives.cc
@@ -67,6 +67,7 @@
   V(Builtin_LoadScript, 2)                                                     \
   V(Builtin_LoadLibrarySource, 4)                                              \
   V(Builtin_AsyncLoadError, 2)                                                 \
+  V(Builtin_DoneLoading, 0)                                                    \
 
 
 BUILTIN_NATIVE_LIST(DECLARE_FUNCTION);
diff --git a/runtime/bin/builtin_sources.gypi b/runtime/bin/builtin_sources.gypi
index cbfd1f0..fbf642e 100644
--- a/runtime/bin/builtin_sources.gypi
+++ b/runtime/bin/builtin_sources.gypi
@@ -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.
 
-# This file contains all dart sources for the dart:builtin library.
+# This file contains all dart sources for the dart:_builtin library.
 {
   'sources': [
     'builtin.dart',
diff --git a/runtime/bin/dartutils.cc b/runtime/bin/dartutils.cc
index 8ec584f..c8cf522 100644
--- a/runtime/bin/dartutils.cc
+++ b/runtime/bin/dartutils.cc
@@ -25,7 +25,7 @@
 const char* DartUtils::kDartScheme = "dart:";
 const char* DartUtils::kDartExtensionScheme = "dart-ext:";
 const char* DartUtils::kAsyncLibURL = "dart:async";
-const char* DartUtils::kBuiltinLibURL = "dart:builtin";
+const char* DartUtils::kBuiltinLibURL = "dart:_builtin";
 const char* DartUtils::kCoreLibURL = "dart:core";
 const char* DartUtils::kInternalLibURL = "dart:_internal";
 const char* DartUtils::kIsolateLibURL = "dart:isolate";
@@ -679,7 +679,9 @@
 
   intptr_t num_bytes = 0;
   Dart_Handle result = Dart_ListLength(data, &num_bytes);
-  DART_CHECK_VALID(result);
+  if (Dart_IsError(result)) {
+    Dart_PropagateError(result);
+  }
 
   uint8_t* buffer = reinterpret_cast<uint8_t*>(malloc(num_bytes));
   Dart_ListGetAsBytes(data, 0, buffer, num_bytes);
@@ -739,6 +741,16 @@
 }
 
 
+// Callback function that gets called from dartutils when there are
+// no more outstanding load requests.
+void FUNCTION_NAME(Builtin_DoneLoading)(Dart_NativeArguments args) {
+  Dart_Handle res = Dart_FinalizeLoading();
+  if (Dart_IsError(res)) {
+    Dart_PropagateError(res);
+  }
+}
+
+
 Dart_Handle DartUtils::LoadSource(Dart_Handle library,
                                   Dart_Handle url,
                                   Dart_LibraryTag tag,
diff --git a/runtime/bin/eventhandler_win.cc b/runtime/bin/eventhandler_win.cc
index 4ab57c3..a67e249 100644
--- a/runtime/bin/eventhandler_win.cc
+++ b/runtime/bin/eventhandler_win.cc
@@ -606,7 +606,7 @@
 }
 
 
-int Handle::Available() {
+intptr_t Handle::Available() {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
   ASSERT(!data_ready_->IsEmpty());
@@ -614,10 +614,11 @@
 }
 
 
-int Handle::Read(void* buffer, int num_bytes) {
+intptr_t Handle::Read(void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
-  num_bytes = data_ready_->Read(buffer, num_bytes);
+  num_bytes = data_ready_->Read(
+      buffer, Utils::Minimum<intptr_t>(num_bytes, INT_MAX));
   if (data_ready_->IsEmpty()) {
     OverlappedBuffer::DisposeBuffer(data_ready_);
     data_ready_ = NULL;
@@ -627,11 +628,12 @@
 }
 
 
-int Handle::RecvFrom(
-    void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
+intptr_t Handle::RecvFrom(
+    void* buffer, intptr_t num_bytes, struct sockaddr* sa, socklen_t sa_len) {
   ScopedLock lock(this);
   if (data_ready_ == NULL) return 0;
-  num_bytes = data_ready_->Read(buffer, num_bytes);
+  num_bytes = data_ready_->Read(
+      buffer, Utils::Minimum<intptr_t>(num_bytes, INT_MAX));
   if (data_ready_->from()->sa_family == AF_INET) {
     ASSERT(sa_len >= sizeof(struct sockaddr_in));
     memmove(sa, data_ready_->from(), sizeof(struct sockaddr_in));
@@ -649,21 +651,24 @@
 }
 
 
-int Handle::Write(const void* buffer, int num_bytes) {
+intptr_t Handle::Write(const void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
   ASSERT(SupportsOverlappedIO());
   if (completion_port_ == INVALID_HANDLE_VALUE) return 0;
-  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes);
-  pending_write_->Write(buffer, num_bytes);
+  int truncated_bytes = Utils::Minimum<intptr_t>(num_bytes, INT_MAX);
+  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(truncated_bytes);
+  pending_write_->Write(buffer, truncated_bytes);
   if (!IssueWrite()) return -1;
-  return num_bytes;
+  return truncated_bytes;
 }
 
 
-int Handle::SendTo(
-    const void* buffer, int num_bytes, struct sockaddr* sa, socklen_t sa_len) {
+intptr_t Handle::SendTo(const void* buffer,
+                        intptr_t num_bytes,
+                        struct sockaddr* sa,
+                        socklen_t sa_len) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
@@ -725,7 +730,7 @@
   }
 }
 
-int StdHandle::Write(const void* buffer, int num_bytes) {
+intptr_t StdHandle::Write(const void* buffer, intptr_t num_bytes) {
   ScopedLock lock(this);
   if (pending_write_ != NULL) return 0;
   if (num_bytes > kBufferSize) num_bytes = kBufferSize;
@@ -752,9 +757,11 @@
       locker.Wait(Monitor::kNoTimeout);
     }
   }
+  // Only queue up to INT_MAX bytes.
+  int truncated_bytes = Utils::Minimum<intptr_t>(num_bytes, INT_MAX);
   // Create buffer and notify thread about the new handle.
-  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(num_bytes);
-  pending_write_->Write(buffer, num_bytes);
+  pending_write_ = OverlappedBuffer::AllocateWriteBuffer(truncated_bytes);
+  pending_write_->Write(buffer, truncated_bytes);
   locker.Notify();
   return 0;
 }
diff --git a/runtime/bin/eventhandler_win.h b/runtime/bin/eventhandler_win.h
index 4bac8f4..fc6af0d 100644
--- a/runtime/bin/eventhandler_win.h
+++ b/runtime/bin/eventhandler_win.h
@@ -189,15 +189,17 @@
   virtual ~Handle();
 
   // Socket interface exposing normal socket operations.
-  int Available();
-  int Read(void* buffer, int num_bytes);
-  int RecvFrom(
-      void* buffer, int num_bytes, struct sockaddr* sa, socklen_t addr_len);
-  virtual int Write(const void* buffer, int num_bytes);
-  virtual int SendTo(const void* buffer,
-                     int num_bytes,
-                     struct sockaddr* sa,
-                     socklen_t sa_len);
+  intptr_t Available();
+  intptr_t Read(void* buffer, intptr_t num_bytes);
+  intptr_t RecvFrom(void* buffer,
+                    intptr_t num_bytes,
+                    struct sockaddr* sa,
+                    socklen_t addr_len);
+  virtual intptr_t Write(const void* buffer, intptr_t num_bytes);
+  virtual intptr_t SendTo(const void* buffer,
+                          intptr_t num_bytes,
+                          struct sockaddr* sa,
+                          socklen_t sa_len);
 
   // Internal interface used by the event handler.
   virtual bool IssueRead();
@@ -324,7 +326,7 @@
   }
 
   virtual void DoClose();
-  virtual int Write(const void* buffer, int num_bytes);
+  virtual intptr_t Write(const void* buffer, intptr_t num_bytes);
 
   void WriteSyncCompleteAsync();
   void RunWriteLoop();
diff --git a/runtime/bin/file_system_watcher_macos.cc b/runtime/bin/file_system_watcher_macos.cc
index 88d98d4..93177f2 100644
--- a/runtime/bin/file_system_watcher_macos.cc
+++ b/runtime/bin/file_system_watcher_macos.cc
@@ -113,7 +113,7 @@
           array,
           kFSEventStreamEventIdSinceNow,
           0.10,
-          kFSEventStreamCreateFlagNoDefer | kFSEventStreamCreateFlagFileEvents);
+          kFSEventStreamCreateFlagFileEvents);
       CFRelease(array);
 
       node->set_ref(ref);
diff --git a/runtime/bin/main.cc b/runtime/bin/main.cc
index 13b7938..2c0047a 100644
--- a/runtime/bin/main.cc
+++ b/runtime/bin/main.cc
@@ -65,12 +65,14 @@
 static bool has_print_script = false;
 
 
+static const char* DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
+static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
 // VM Service options.
 static bool start_vm_service = false;
-static const char *vm_service_server_ip = NULL;
-static int vm_service_server_port = -1;
-static const char *DEFAULT_VM_SERVICE_SERVER_IP = "127.0.0.1";
-static const int DEFAULT_VM_SERVICE_SERVER_PORT = 8181;
+static const char* vm_service_server_ip = DEFAULT_VM_SERVICE_SERVER_IP;
+// The 0 port is a magic value which results in the first available port
+// being allocated.
+static int vm_service_server_port = 0;
 
 // The environment provided through the command line using -D options.
 static dart::HashMap* environment = NULL;
@@ -434,19 +436,30 @@
             break;
           }
         }
+        i++;
+        continue;  // '-p' is not a VM flag so don't add to vm options.
       } else if (strncmp(argv[i], kChecked, strlen(kChecked)) == 0) {
         vm_options->AddArgument("--checked");
+        i++;
+        continue;  // '-c' is not a VM flag so don't add to vm options.
       } else if (!IsValidFlag(argv[i], kPrefix, kPrefixLen)) {
         break;
       }
+      // The following two flags are processed by both the embedder and
+      // the VM.
       const char* kPrintFlags1 = "--print-flags";
       const char* kPrintFlags2 = "--print_flags";
+      const char* kVerboseDebug1 = "--verbose_debug";
+      const char* kVerboseDebug2 = "--verbose-debug";
       if ((strncmp(argv[i], kPrintFlags1, strlen(kPrintFlags1)) == 0) ||
           (strncmp(argv[i], kPrintFlags2, strlen(kPrintFlags2)) == 0)) {
         *print_flags_seen = true;
-      }
-      const char* kVerboseDebug = "--verbose_debug";
-      if (strncmp(argv[i], kVerboseDebug, strlen(kVerboseDebug)) == 0) {
+      } else if ((strncmp(argv[i],
+                          kVerboseDebug1,
+                          strlen(kVerboseDebug1)) == 0) ||
+                 (strncmp(argv[i],
+                          kVerboseDebug2,
+                          strlen(kVerboseDebug2)) == 0)) {
         *verbose_debug_seen = true;
       }
       vm_options->AddArgument(argv[i]);
@@ -938,6 +951,7 @@
   bool print_flags_seen = false;
   bool verbose_debug_seen = false;
 
+  vm_options.AddArgument("--no_write_protect_code");
   // Perform platform specific initialization.
   if (!Platform::Initialize()) {
     Log::PrintErr("Initialization failed\n");
@@ -1013,8 +1027,7 @@
     if (!start_debugger) {
       DebuggerConnectionHandler::InitForVmService();
     }
-    ASSERT(vm_service_server_ip != NULL && vm_service_server_port >= 0);
-    bool r = VmService::Start(vm_service_server_ip , vm_service_server_port);
+    bool r = VmService::Start(vm_service_server_ip, vm_service_server_port);
     if (!r) {
       Log::PrintErr("Could not start VM Service isolate %s\n",
                     VmService::GetErrorMessage());
diff --git a/runtime/bin/net/nss.gyp b/runtime/bin/net/nss.gyp
index c811f31..cbd86a8 100644
--- a/runtime/bin/net/nss.gyp
+++ b/runtime/bin/net/nss.gyp
@@ -50,21 +50,10 @@
       },
       # Added by Dart.
       'Dart_x64_Base': {
-        'conditions': [
-          # On Windows, Dart is always built as a 32-bit version,
-          # even if a 64-bit build is requested.
-          ['OS=="win"', {
-            'defines': [
-              'NSS_X86_OR_X64',
-              'NSS_X86',
-              '_X86_',
-              ],
-            }, {
-            'defines': [
-              'NSS_X86_OR_X64',
-              'NSS_X64',
-              'NSS_USE_64',
-          ]}],
+        'defines': [
+          'NSS_X86_OR_X64',
+          'NSS_X64',
+          'NSS_USE_64',
         ],
       },
       # Added by Dart.
@@ -89,7 +78,32 @@
               # Do not compile NSPR and NSS with /D _UNICODE /D UNICODE.
               'CharacterSet': '0'
             }
-          }
+          },
+          # Added by Dart. All target_arch specific defines are taken
+          # from below.
+          'Dart_ia32_Base': {
+            'defines': [
+              'NSS_X86_OR_X64',
+              'NSS_X86',
+              '_X86_',
+              'MP_ASSEMBLY_MULTIPLY',
+              'MP_ASSEMBLY_SQUARE',
+              'MP_ASSEMBLY_DIV_2DX1D',
+              'MP_USE_UINT_DIGIT',
+              'MP_NO_MP_WORD',
+            ],
+          },
+          'Dart_x64_Base': {
+            'defines': [
+              'NSS_USE_64',
+              'NSS_X86_OR_X64',
+              'NSS_X64',
+              '_AMD64_',
+              'MP_CHAR_STORE_SLOW',
+              'MP_IS_LITTLE_ENDIAN',
+              'WIN64',
+            ],
+          },
         },
         'defines!': [
           'WIN32_LEAN_AND_MEAN',
@@ -433,13 +447,14 @@
             ['exclude', 'nspr/pr/src/md/unix/'],
             ['exclude', 'nspr/pr/src/pthreads/'],
           ],
-          'conditions': [
-            ['target_arch=="ia32"', {
-              'defines': [
-                '_X86_',
-              ],
-            }],
-          ],
+          # Changed by Dart. We don't use target_arch.
+          # 'conditions': [
+          #  ['target_arch=="ia32"', {
+          #    'defines': [
+          #      '_X86_',
+          #    ],
+          #  }],
+          # ],
         }],
         ['component == "static_library"', {
           'defines': [
@@ -594,6 +609,7 @@
       # should be on 'nss'.
       'suppress_wildcard': 1,
       'sources': [
+        'os_windows.c',
         '<(nss_directory)/nss/lib/base/arena.c',
         '<(nss_directory)/nss/lib/base/base.h',
         '<(nss_directory)/nss/lib/base/baset.h',
@@ -1306,38 +1322,43 @@
           },
           'sources!': [
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+            # If needed it will be included by os_windows.c.
+            '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
-          'conditions': [
-            ['target_arch=="ia32"', {
-              'defines': [
-                'NSS_X86_OR_X64',
-                'NSS_X86',
-                '_X86_',
-                'MP_ASSEMBLY_MULTIPLY',
-                'MP_ASSEMBLY_SQUARE',
-                'MP_ASSEMBLY_DIV_2DX1D',
-                'MP_USE_UINT_DIGIT',
-                'MP_NO_MP_WORD',
-              ],
-            }],
-            ['target_arch=="x64"', {
-              'defines': [
-                'NSS_USE_64',
-                'NSS_X86_OR_X64',
-                'NSS_X64',
-                '_AMD64_',
-                'MP_CHAR_STORE_SLOW',
-                'MP_IS_LITTLE_ENDIAN',
-                'WIN64',
-              ],
-              'sources!': [
-                '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
-                '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
-              ],
-            }],
-          ],
+          # Changed by Dart. We don't use target_arch. This was moved into
+          # configurations instead.
+          # 'conditions': [
+          #   ['target_arch=="ia32"', {
+          #     'defines': [
+          #       'NSS_X86_OR_X64',
+          #       'NSS_X86',
+          #       '_X86_',
+          #       'MP_ASSEMBLY_MULTIPLY',
+          #       'MP_ASSEMBLY_SQUARE',
+          #       'MP_ASSEMBLY_DIV_2DX1D',
+          #       'MP_USE_UINT_DIGIT',
+          #       'MP_NO_MP_WORD',
+          #     ],
+          #   }],
+          #   ['target_arch=="x64"', {
+          #     'defines': [
+          #       'NSS_USE_64',
+          #       'NSS_X86_OR_X64',
+          #       'NSS_X64',
+          #       '_AMD64_',
+          #       'MP_CHAR_STORE_SLOW',
+          #       'MP_IS_LITTLE_ENDIAN',
+          #       'WIN64',
+          #     ],
+          #     'sources!': [
+          #       '<(nss_directory)/nss/lib/freebl/mpi/mpi_amd64.c',
+          #       '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
+          #     ],
+          #    }],
+          # ],
         }, { # else: OS!="win"
           'sources!': [
+            'os_windows.c',
             # mpi_x86_asm.c contains MSVC inline assembly code.
             '<(nss_directory)/nss/lib/freebl/mpi/mpi_x86_asm.c',
           ],
diff --git a/runtime/bin/platform_win.cc b/runtime/bin/platform_win.cc
index 85b6694..0d3cb11 100644
--- a/runtime/bin/platform_win.cc
+++ b/runtime/bin/platform_win.cc
@@ -59,8 +59,10 @@
 }
 
 
-void Platform::FreeEnvironment(char** env, int count) {
-  for (int i = 0; i < count; i++) free(env[i]);
+void Platform::FreeEnvironment(char** env, intptr_t count) {
+  for (intptr_t i = 0; i < count; i++) {
+    free(env[i]);
+  }
   delete[] env;
 }
 
diff --git a/runtime/bin/run_vm_tests.cc b/runtime/bin/run_vm_tests.cc
index 586d6d4..213d446 100644
--- a/runtime/bin/run_vm_tests.cc
+++ b/runtime/bin/run_vm_tests.cc
@@ -47,7 +47,8 @@
   if ((run_filter == kAllBenchmarks) ||
       (strcmp(run_filter, this->name()) == 0)) {
     this->Run();
-    OS::Print("%s(RunTime): %" Pd "\n", this->name(), this->score());
+    OS::Print("%s(%s): %" Pd "\n",
+              this->name(), this->score_kind(), this->score());
     run_matches++;
   } else if (run_filter == kList) {
     fprintf(stdout, "%s\n", this->name());
diff --git a/runtime/bin/service_object_patch.dart b/runtime/bin/service_object_patch.dart
index b714971..348e3b2 100644
--- a/runtime/bin/service_object_patch.dart
+++ b/runtime/bin/service_object_patch.dart
@@ -6,6 +6,7 @@
 final Map _servicePathMap = {
   'http' : {
     'servers' : _httpServersServiceObject,
+    'serverconnections' : _httpServerConnectionsServiceObject,
   },
   'sockets' : _socketsServiceObject,
   'websockets' : _webSocketsServiceObject,
@@ -15,6 +16,8 @@
   'processes' : _processesServiceObject,
 };
 
+String _getServicePath(obj) => obj._servicePath;
+
 String _serviceObjectHandler(List<String> paths,
                              List<String> keys,
                              List<String> values) {
@@ -85,6 +88,17 @@
   };
 }
 
+Map _httpServerConnectionsServiceObject(args) {
+  if (args.length == 1) {
+    var connection = _HttpConnection._connections[int.parse(args.first)];
+    if (connection == null) {
+      return {};
+    }
+    return connection._toJSON(false);
+  }
+  return _makeServiceError("http/serverconnections can not be listed");
+}
+
 Map _socketsServiceObject(args) {
   if (args.length == 1) {
     var socket = _NativeSocket._sockets[int.parse(args.first)];
diff --git a/runtime/bin/socket.h b/runtime/bin/socket.h
index 926cc31..9471c5a 100644
--- a/runtime/bin/socket.h
+++ b/runtime/bin/socket.h
@@ -221,11 +221,11 @@
 
   static bool Initialize();
   static intptr_t Available(intptr_t fd);
-  static int Read(intptr_t fd, void* buffer, intptr_t num_bytes);
-  static int Write(intptr_t fd, const void* buffer, intptr_t num_bytes);
-  static int SendTo(
+  static intptr_t Read(intptr_t fd, void* buffer, intptr_t num_bytes);
+  static intptr_t Write(intptr_t fd, const void* buffer, intptr_t num_bytes);
+  static intptr_t SendTo(
       intptr_t fd, const void* buffer, intptr_t num_bytes, RawAddr addr);
-  static int RecvFrom(
+  static intptr_t RecvFrom(
       intptr_t fd, void* buffer, intptr_t num_bytes, RawAddr* addr);
   static intptr_t Create(RawAddr addr);
   static intptr_t Connect(intptr_t fd, RawAddr addr, const intptr_t port);
diff --git a/runtime/bin/socket_android.cc b/runtime/bin/socket_android.cc
index 56a065d..96175cf 100644
--- a/runtime/bin/socket_android.cc
+++ b/runtime/bin/socket_android.cc
@@ -101,7 +101,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -114,7 +114,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -129,7 +129,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -142,7 +142,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_linux.cc b/runtime/bin/socket_linux.cc
index aaff4d9..6e8b4aa 100644
--- a/runtime/bin/socket_linux.cc
+++ b/runtime/bin/socket_linux.cc
@@ -94,7 +94,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -107,7 +107,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -122,7 +122,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -135,7 +135,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_macos.cc b/runtime/bin/socket_macos.cc
index 04a1413..db39707 100644
--- a/runtime/bin/socket_macos.cc
+++ b/runtime/bin/socket_macos.cc
@@ -103,7 +103,7 @@
 }
 
 
-int Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Read(intptr_t fd, void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t read_bytes = TEMP_FAILURE_RETRY(read(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -116,7 +116,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   ASSERT(fd >= 0);
   socklen_t addr_len = sizeof(addr->ss);
@@ -131,7 +131,7 @@
 }
 
 
-int Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
+intptr_t Socket::Write(intptr_t fd, const void* buffer, intptr_t num_bytes) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(write(fd, buffer, num_bytes));
   ASSERT(EAGAIN == EWOULDBLOCK);
@@ -144,7 +144,7 @@
 }
 
 
-int Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
+intptr_t Socket::SendTo(intptr_t fd, const void* buffer, intptr_t num_bytes,
                    RawAddr addr) {
   ASSERT(fd >= 0);
   ssize_t written_bytes = TEMP_FAILURE_RETRY(
diff --git a/runtime/bin/socket_patch.dart b/runtime/bin/socket_patch.dart
index 4f28550..7cb36c8 100644
--- a/runtime/bin/socket_patch.dart
+++ b/runtime/bin/socket_patch.dart
@@ -286,6 +286,7 @@
   // Handlers and receive port for socket events from the event handler.
   final List eventHandlers = new List(EVENT_COUNT + 1);
   RawReceivePort eventPort;
+  bool flagsSent = false;
 
   // The type flags for this socket.
   final int typeFlags;
@@ -457,6 +458,7 @@
                                       port: port);
           }
           if (port != 0) socket.localPort = port;
+          socket.connectToEventHandler();
           return socket;
         });
   }
@@ -759,7 +761,8 @@
   }
 
   void returnTokens(int tokenBatchSize) {
-    if (eventPort != null && !isClosing && !isClosed) {
+    if (!isClosing && !isClosed) {
+      assert(eventPort != null);
       // Return in batches.
       if (tokens == tokenBatchSize) {
         assert(tokens < (1 << FIRST_COMMAND));
@@ -782,7 +785,8 @@
     sendWriteEvents = write;
     if (read) issueReadEvent();
     if (write) issueWriteEvent();
-    if (eventPort == null && !isClosing) {
+    if (!flagsSent && !isClosing) {
+      flagsSent = true;
       int flags = typeFlags & TYPE_TYPE_MASK;
       if (!isClosedRead) flags |= 1 << READ_EVENT;
       if (!isClosedWrite) flags |= 1 << WRITE_EVENT;
diff --git a/runtime/bin/socket_win.cc b/runtime/bin/socket_win.cc
index 5ec7f1f..18156e6 100644
--- a/runtime/bin/socket_win.cc
+++ b/runtime/bin/socket_win.cc
@@ -76,7 +76,7 @@
 }
 
 
-int Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
+intptr_t Socket::RecvFrom(intptr_t fd, void* buffer, intptr_t num_bytes,
                      RawAddr* addr) {
   Handle* handle = reinterpret_cast<Handle*>(fd);
   socklen_t addr_len = sizeof(addr->ss);
@@ -90,7 +90,7 @@
 }
 
 
-int Socket::SendTo(
+intptr_t Socket::SendTo(
     intptr_t fd, const void* buffer, intptr_t num_bytes, RawAddr addr) {
   Handle* handle = reinterpret_cast<Handle*>(fd);
   return handle->SendTo(
diff --git a/runtime/bin/vmservice/client/deploy.sh b/runtime/bin/vmservice/client/deploy.sh
index 1990bd6..930f86e 100755
--- a/runtime/bin/vmservice/client/deploy.sh
+++ b/runtime/bin/vmservice/client/deploy.sh
@@ -15,6 +15,7 @@
 
 EXCLUDE="--exclude bootstrap_css"
 EXCLUDE="$EXCLUDE --exclude *.map"
+EXCLUDE="$EXCLUDE --exclude *.concat.js"
 EXCLUDE="$EXCLUDE --exclude *.scriptUrls"
 EXCLUDE="$EXCLUDE --exclude *.precompiled.js"
 EXCLUDE="$EXCLUDE --exclude main.*"
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html b/runtime/bin/vmservice/client/deployed/web/index.html
index 0e36a6c..5994639 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html
+++ b/runtime/bin/vmservice/client/deployed/web/index.html
@@ -3850,11 +3850,30 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -16525,4 +16544,4 @@
 
   <observatory-application></observatory-application>
 
-<script src="index.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
+<script type="application/dart" src="index.html_bootstrap.dart"></script><script src="packages/browser/dart.js"></script></body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
index 150a063..bccc6ae 100644
--- a/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index.html_bootstrap.dart.js
@@ -1,19320 +1,35820 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
-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 $$={}
-;(function(a){"use strict"
-function map(b){b={x:b}
-delete b.x
-return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
-if(h==="^")continue
-var g=a3[h]
-var f=h.substring(0,1)
-var e
-if(f==="+"){v[e]=h.substring(1)
-var d=a3[h]
-if(d>0)a3[e].$reflectable=d
-if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
-$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
-var c=a3.$methodsWithOptionalArguments
-if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
-i.push(h)
-init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
-var b={}
-var a0
-for(var a1 in g){if(!u.call(g,a1))continue
-f=a1.substring(0,1)
-if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
-var d=g[a1]
-if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
-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.wh("+"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.wh("+"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.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(this,b,c,false,[],d)
-return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
-return d?function(){if(h===void 0)h=H.wh(this,b,c,true,[],e).prototype
-return h}:y(b,c,e,f)}var z=0
-var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
-if(!init.libraries)init.libraries=[]
-if(!init.mangledNames)init.mangledNames=map()
-if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
-if(!init.statics)init.statics=map()
-if(!init.typeInformation)init.typeInformation=map()
-if(!init.globalFunctions)init.globalFunctions=map()
-if(!init.interceptedNames)init.interceptedNames=map()
-var x=init.libraries
-var w=init.mangledNames
-var v=init.mangledGlobalNames
-var u=Object.prototype.hasOwnProperty
-var t=a.length
-for(var s=0;s<t;s++){var r=a[s]
-var q=r[0]
-var p=r[1]
-var o=r[2]
-var n=r[3]
-var m=r[4]
-var l=!!r[5]
-var k=m&&m["^"]
-if(k instanceof Array)k=k[0]
-var j=[]
-var i=[]
-processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
-"^":"",
-FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
-"^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0: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
-if(!1===y)return z.i
-if(!0===y)return a
-x=Object.getPrototypeOf(a)
-if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("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
-else return C.vB}return w},
-TZ:function(a){var z,y,x,w
-z=$.Au
-if(z==null)return
-y=z
-for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
-z=J.TZ(a)
-if(z==null)return
-y=$.Au
-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.TZ(a)
-if(z==null)return
-y=$.Au
-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.eQ(a)},
-bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
-gbx:function(a){return new H.cu(H.dJ(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
-bu:function(a){return String(a)},
-giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isa2:true},
-CDU:{
-"^":"Gv;",
-n:function(a,b){return null==b},
-bu:function(a){return"null"},
-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","gxK",2,0,null,68]},
-Ue1:{
-"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.lU}},
-Ai:{
-"^":"Ue1;"},
-kdQ:{
-"^":"Ue1;"},
-Q:{
-"^":"Gv;",
-h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},
-KI: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"))
-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"))
-a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(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)
-return!0}return!1},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},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.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},31],
-zV:function(a,b){var z,y,x,w
-z=a.length
-y=Array(z)
-y.fixed$length=init
-for(x=0;x<a.length;++x){w=H.d(a[x])
-if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},
-eR:function(a,b){return H.q9(a,b,null,null)},
-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.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.q9(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("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))
-H.tb(a,c,a,b,z-c)
-this.sB(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"))
-H.rd(a,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
-cn:function(a,b){return this.Pk(a,b,null)},
-tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
-return!1},
-gl0:function(a){return a.length===0},
-gor:function(a){return a.length!==0},
-bu:function(a){return P.WE(a,"[","]")},
-tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.Kp(a,0)])
-else{z=H.VM(a.slice(),[H.Kp(a,0)])
-z.fixed$length=init
-return z}},
-br:function(a){return this.tt(a,!0)},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
-giO:function(a){return H.eQ(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
-a.length=b},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-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))
-a[b]=c},
-$isQ:true,
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
-P:{
-"^":"Gv;",
-iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a<b)return-1
-else if(a>b)return 1
-else if(a===b){if(a===0){z=this.gzP(b)
-if(this.gzP(a)===z)return 0
-if(this.gzP(a))return-1
-return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},
-gzP:function(a){return a===0?1/a<0:a<0},
-gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
-JV:function(a,b){return a%b},
-Vy:function(a){return Math.abs(a)},
-yu:function(a){var z
-if(a>=-2147483648&&a<=2147483647)return a|0
-if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-UD:function(a){if(a<0)return-Math.round(-a)
-else return Math.round(a)},
-Sy:function(a,b){var z
-if(b>20)throw H.b(P.KP(b))
-z=a.toFixed(b)
-if(a===0&&this.gzP(a))return"-"+z
-return z},
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
-return a.toString(b)},
-bu:function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},
-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))
-return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(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))
-return this.yu(a/b)}},
-cU: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))
-return b>31?0:a<<b>>>0},
-W4: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))
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-GG:function(a,b){var z
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
-static:{"^":"Ng,N6l"}},
-imn:{
-"^":"P;",
-gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
-$isKN:true},
-Yn:{
-"^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
-O:{
-"^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
-z=a.length
-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.Vo(c,b,a)},
-g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
-return a+b},
-Tc:function(a,b){var z,y
-z=b.length
-y=a.length
-if(z>y)return!1
-return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
-if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
-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))
-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)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
-return a.substring(b,c)},
-yn:function(a,b){return this.Nj(a,b,null)},
-hc:function(a){return a.toLowerCase()},
-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(x===y)return""}else x=0
-w=y-1
-v=this.j(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)
-if(0>=b)return""
-if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.Eq)
-for(z=a,y="";!0;){if((b&1)===1)y=z+y
-b=b>>>1
-if(b===0)break
-z+=z}return y},
-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(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=a.length
-z=b.length
-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))
-return H.b0(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(a===b)z=0
-else z=a<b?-1:1
-return z},
-bu:function(a){return a},
-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.Db},
-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))
-return a[b]},
-$isqU: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}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
-"^":"",
-dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
-return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=b
-b=b
-z.a=b
-if(b==null){b=[]
-z.a=b
-y=b}else y=b
-if(!J.x(y).$isWO)throw H.b(P.u("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.qi(a)
-init.globalState=y
-if(init.globalState.EF===!0)return
-y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-w.h(0,0)
-u.O9(0,v)
-init.globalState.Nr=u
-init.globalState.N0=u
-y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-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.mf()
-if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mf()
-return},
-mf:function(){var z,y
-z=new Error().stack
-if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
-if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
-if(y!=null)return y[1]
-y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
-if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
-Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=H.Hh(b.data)
-y=J.U6(z)
-switch(y.t(z,"command")){case"start":init.globalState.oL=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.Hh(y.t(z,"msg"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
-y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-p.h(0,0)
-n.O9(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
-break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
-break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
-a.terminate()
-init.globalState.Xz.bL()
-break
-case"log":H.ZF(y.t(z,"msg"))
-break
-case"print":if(init.globalState.EF===!0){y=init.globalState.rj
-q=H.t0(P.EF(["command","print","msg",z],null,null))
-y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
-break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","nW",4,0,null,0,1],
-ZF:function(a){var z,y,x,w
-if(init.globalState.EF===!0){y=init.globalState.rj
-x=H.t0(P.EF(["command","log","msg",a],null,null))
-y.toString
-self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.XO(w,null)
-throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.VT(b,".dart"))b=J.ew(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gtH(z).ml(new H.WK(y))
-x=new H.ws(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.tZ(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.Mg,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
-Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
-y=z.EE
-x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.ws(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
-t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.Qt(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.BV(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"},
-PK:{
-"^":"Tp:69;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
-JO:{
-"^":"Tp:69;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-pq:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Vr()==null
-y=$.rm()
-x=z&&$.ey()===!0
-this.EF=x
-if(!x)y=y!=null&&$.Zt()!=null
-else y=!0
-this.ji=y
-this.Ai=z&&!x
-y=H.IY
-x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=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
-w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
-aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lw,CN,M2,mf,pa,ir",
-V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.lw
-z.Rz(0,a)
-if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
-x=z.pop()
-y=init.globalState.Xz.Rk
-w=y.av
-v=y.v5
-u=v.length
-w=(w-1&u-1)>>>0
-y.av=w
-if(w<0||w>=u)return H.e(v,w)
-v[w]=x
-if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
-if(z==null){z=[]
-this.CN=z}if(J.x5(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
-if(z==null)return
-J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
-ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){J.H4(a,null)
-return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,y)},
-bc: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.mf
-else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
-y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(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=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.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.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
-vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
-y=null
-this.mf=!0
-try{y=b.$0()}catch(v){u=H.Ru(v)
-x=u
-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.mf=!1
-init.globalState.N0=z
-if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,70,71],
-Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
-break
-case"resume":this.NR(z.t(a,1))
-break
-case"add-ondone":this.iK(z.t(a,1))
-break
-case"remove-ondone":this.IB(z.t(a,1))
-break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
-break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
-break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
-break
-case"getErrors":this.ir.h(0,z.t(a,1))
-break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
-break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
-z=this.M2
-if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.pr()
-z.V1(0)
-this.fW.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-this.ir.V1(0)
-z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
-$isaX:true},
-NY:{
-"^":"Tp:18;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-cC:{
-"^":"a;Rk,GL",
-mj:function(){var z=this.Rk
-if(z.av===z.eZ)return
-return z.AR()},
-xB:function(){var z,y,x
-z=this.mj()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
-y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
-x=H.t0(P.EF(["command","close"],null,null))
-y.toString
-self.postMessage(x)}return!1}J.R1(z)
-return!0},
-oV:function(){if($.Vr()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
-bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-w=init.globalState.rj
-v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
-w.toString
-self.postMessage(v)}}},
-Rm:{
-"^":"Tp:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
-IY:{
-"^":"a;od*,i3,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
-$isIY:true},
-JH:{
-"^":"a;"},
-mN:{
-"^":"Tp:69;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},
-xn:{
-"^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-WK:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-tZ:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-hI:{
-"^":"Tp:69;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Tp:18;a,b,c,d,e",
-$0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
-y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
-if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
-Iy4:{
-"^":"a;",
-$isbC:true,
-$isXY:true},
-ws:{
-"^":"Iy4;JE,tv",
-wR:function(a,b){var z,y,x,w,v
-z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
-if(x==null)return
-w=this.JE
-if(w.gKS())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
-z.a=b
-if(v)z.a=H.t0(b)
-if(x.gEE()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
-w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isws&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isws:true,
-$isbC:true,
-$isXY:true},
-Ua:{
-"^":"Tp:69;a,b,c",
-$0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-bM:{
-"^":"Iy4;ZU,bv,tv",
-wR:function(a,b){var z,y
-z=H.t0(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.ZU)
-if(y!=null)y.postMessage(z)}},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
-giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
-x=this.bv
-if(typeof x!=="number")return H.s(x)
-return(z^y^x)>>>0},
-$isbM:true,
-$isbC:true,
-$isXY:true},
-yo:{
-"^":"a;qK>,D1,KS<",
-aV:function(a){return this.D1.$1(a)},
-pr:function(){this.KS=!0
-this.D1=null},
-S6:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.D1=null
-z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.aV(b)},
-$isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"cb;vl,da",
-KR:function(a,b,c,d){var z=this.da
-z.toString
-return H.VM(new P.O9(z),[null]).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)},
-S6:[function(a){this.vl.S6(0)
-this.da.S6(0)},"$0","gJK",0,0,18],
-TL:function(a){var z=P.x2(this.gJK(this),null,null,null,!0,null)
-this.da=z
-this.vl.D1=z.ght(z)},
-$ascb:function(){return[null]},
-$iscb:true},
-NA:{
-"^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
-throw H.b("Capability not serializable: "+a.bu(0))}},
-Qt:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-BV:{
-"^":"fPc;RZ",
-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.oL)){v=init.globalState.iR.t(0,x)
-if(v==null)return
-u=v.hV(w)
-if(u==null)return
-return new H.ws(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
-m3:{
-"^":"a;MD",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.MD=[]},
-no:function(){var z,y,x
-for(z=this.MD.length,y=0;y<z;++y){x=this.MD
-if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-cx:{
-"^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
-CH:function(a){},
-no:function(){}},
-BB:{
-"^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.Pq(a)
-this.mR.CH(0)
-z=null
-try{z=this.Q9(a)}finally{this.mR.no()}return z},
-Q9:function(a){var z
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
-z=J.x(a)
-if(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
-if(!!z.$isbC)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-ooy:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
-if(z!=null)return z
-y=J.U6(a)
-x=y.gB(a)
-z=Array(x)
-z.fixed$length=init
-this.mR.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
-return z},
-TI:function(a){var z,y
-z={}
-y=this.mR.t(0,a)
-z.a=y
-if(y!=null)return y
-y=P.L5(null,null,null,null,null)
-z.a=y
-this.mR.u(0,a,y)
-a.aN(0,new H.OW(z,this))
-return z.a},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-OW:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,75,76,"call"],
-$isEH:true},
-jP1:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y
-z=this.mR.t(0,a)
-if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["list",y,this.mE(a)]},
-TI:function(a){var z,y
-z=this.mR.t(0,a)
-if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
-mE:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=[]
-C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.Q9(z.t(a,w))
-if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
-"^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-return this.D5(a)},
-D5: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.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.Vf(a)
-case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.RZ.u(0,y,x)
-z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
-v=0
-for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
-return x},
-GD: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.RZ.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
-y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-t=J.U6(v)
-s=0
-for(;s<u;++s)z.u(0,this.D5(y.t(w,s)),this.D5(t.t(v,s)))
-return z},
-PR:function(a){throw H.b("Unexpected serialized object")}},
-Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
-H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
-Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
-else z=!1
-if(z){this.p9=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.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}}},
-Av:{
-"^":"Tp:18;a,b",
-$0:[function(){this.a.p9=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-vt:{
-"^":"Tp:18;c,d",
-$0:[function(){this.c.p9=null
-H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-iV:{
-"^":"a;qK>",
-giO:function(a){var z,y,x
-z=this.qK
-y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(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
-if(b==null)return!1
-if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
-return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["_js_helper","dart:_js_helper",,H,{
-"^":"",
-Gp:function(a,b){var z
-if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(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))
-return z},
-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))},"$1","kk",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))
-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)
-if(z[2]!=null)return parseInt(a,16)
-if(3>=y)return H.e(z,3)
-if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.KP("Radix "+H.d(b)+" not in range 2..36"))
-if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
-y=z[3]!=null}else y=!1
-if(y)return parseInt(a,10)
-if(!(b<10)){if(3>=z.length)return H.e(z,3)
-y=z[3]==null}else y=!0
-if(y){x=b<=10?48+b-1:97+b-10-1
-if(1>=z.length)return H.e(z,1)
-w=z[1]
-y=J.U6(w)
-v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(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)
-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()
-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(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))
-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.xB.j(z,0)===36)z=C.xB.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)+"'"},
-Ms:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
-Cb: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
-else{u=w+500
-u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
-z=[]
-z.$builtinTypeInfo=[P.KN]
-y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Kp(a,0)]
-for(;y.G();){x=y.lo
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
-if(x<=65535)z.push(x)
-else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
-if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.Cb(a)},
-Lw:function(a){var z
-if(typeof a!=="number")return H.s(a)
-if(0<=a){if(a<=65535)return String.fromCharCode(a)
-if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-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)
-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)throw H.b(P.u(null))
-x=J.Wx(a)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
-if(h)w.setUTCFullYear(a)
-else w.setFullYear(a)
-return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},
-wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},
-zo:function(a,b,c){var z,y,x
-z={}
-z.a=0
-y=[]
-x=[]
-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))},
-im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
-z={}
-if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
-if(y==null)return H.zo(a,b,c)
-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(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
-c.aN(0,new H.u8(z,v))
-if(z.a)return H.zo(a,b,c)
-C.Nm.FV(b,v.gUQ(v))
-return y.apply(a,b)}r=[]
-if(b!=null){q=b.length
-C.Nm.FV(r,b)}else q=0
-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))},
-b:function(a){var z
-if(a==null)a=new P.LK()
-z=new Error()
-z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
-z.name=""}else z.toString=H.tM
-return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
-if(a==null)return
-if(typeof a!=="object")return a
-if("dartException" in a)return z.$1(a.dartException)
-else if(!("message" in a))return a
-y=a.message
-if("number" in a&&typeof a.number=="number"){x=a.number
-w=x&65535
-if((C.jn.GG(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.Zo(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.Up()
-t=$.PH()
-s=$.D1()
-r=$.rx()
-q=$.kQ()
-p=$.W6()
-$.Bi()
-o=$.eA()
-n=$.ko()
-m=v.qS(y)
-if(m!=null)return z.$1(H.T3(y,m))
-else{m=u.qS(y)
-if(m!=null){m.method="call"
-return z.$1(H.T3(y,m))}else{m=t.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=r.qS(y)
-if(m==null){m=q.qS(y)
-if(m==null){m=p.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=o.qS(y)
-if(m==null){m=n.qS(y)
-v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
-if(v){v=m==null?null:m.method
-return z.$1(new H.Zo(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.AT(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.eQ(a)},
-B7:function(a,b){var z,y,x,w
-z=a.length
-for(y=0;y<z;y=w){x=y+1
-w=x+1
-b.u(0,a[y],a[x])}return b},
-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.dr(a))
-else if(z.n(c,1))return H.dB(b,new H.TL(a,d))
-else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,6,7,8,9,10,11,12],
-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)
-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
-z=b[0]
-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)
-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)}
-v=u}else{u=$.OK
-$.OK=J.ew(u,1)
-u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
-v=u}w.constructor=v
-v.prototype=w
-u=!d
-if(u){t=e.length==1&&!0
-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)
-else if(u&&typeof x=="function"){q=t?H.HY:H.uj
-r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
-w.$signature=r
-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.SD(a,o,t)
-w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.uj
-switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
-case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
-case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
-case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
-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)}},
-SD:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(a,b)
-z=b.$stubName
-y=b.length
-x=a[z]
-w=b==null?x==null:b===x
-if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
-if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
-v=$.OK
-$.OK=J.ew(v,1)
-return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
-w="return function("+u+"){return this."
-v=$.bf
-if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
-w=$.OK
-$.OK=J.ew(w,1)
-return new Function(v+H.d(w)+"}")()},
-Zq:function(a,b,c,d){var z,y
-z=H.uj
-y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Pa("Intercepted function with no arguments."))
-case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
-case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
-case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
-case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
-case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
-case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
-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)}},
-Hf:function(a,b){var z,y,x,w,v,u,t,s
-z=H.bO()
-y=$.P4
-if(y==null){y=H.B3("receiver")
-$.P4=y}x=b.$stubName
-w=b.length
-v=typeof dart_precompiled=="function"
-u=a[x]
-t=b==null?u==null:b===u
-if(v||!t||w>=28)return H.Zq(w,!t,x,b)
-if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
-t=$.OK
-$.OK=J.ew(t,1)
-return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
-y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
-t=$.OK
-$.OK=J.ew(t,1)
-return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
-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))))},
-Go:function(a,b){var z
-if(a!=null)z=typeof a==="object"&&J.x(a)[b]
-else z=!0
-if(z)return a
-H.aE(a,b)},
-ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-KT:function(a,b,c){return new H.GN(a,b,c,null)},
-Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.Fp(z)
-return new H.KEA(z,b,null)},
-G3:function(){return C.KZ},
-Kx:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-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 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.vM+=", "
-v=a[y]
-if(v!=null)w=!1
-u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(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
-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)
-if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
-if(a==null||b==null)return!0
-z=a.length
-for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-IU:function(a,b){var z,y
-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)
-if(z!=null){y=z.slice()
-y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
-if(a===b)return!0
-if(a==null||b==null)return!0
-if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
-z=a.$signature
-if(z==null)return!1
-a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
-y=typeof a==="object"&&a!==null&&a.constructor===Array
-x=y?a[0]:a
-w=typeof b==="object"&&b!==null&&b.constructor===Array
-v=w?b[0]:b
-u=H.Ko(v,null)
-if(v!==x){if(!("$is"+H.d(u) in x))return!1
-t=x["$as"+H.d(H.Ko(v,null))]}else t=null
-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)},
-Hc:function(a,b,c){var z,y,x,w,v
-if(b==null&&a==null)return!0
-if(b==null)return c
-if(a==null)return!1
-z=a.length
-y=b.length
-if(c){if(z<y)return!1}else if(z!==y)return!1
-for(x=0;x<y;++x){w=a[x]
-v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
-if(b==null)return!0
-if(a==null)return!1
-z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
-y=z
-for(z=y.length,x=0;x<z;++x){w=y[x]
-if(!Object.hasOwnProperty.call(a,w))return!1
-v=b[w]
-u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(!("func" in a))return!1
-if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
-y=b.ret
-if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
-w=b.args
-v=a.opt
-u=b.opt
-t=x!=null?x.length:0
-s=w!=null?w.length:0
-r=v!=null?v.length:0
-q=u!=null?u.length:0
-if(t>s)return!1
-if(t+r<s+q)return!1
-if(t===s){if(!H.Hc(x,w,!1))return!1
-if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
-n=w[p]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
-n=w[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
-n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-ml:function(a,b,c){return a.apply(b,c)},
-Pq:function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-wzi:function(a){return H.eQ(a)},
-bm: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=$.NF.$1(a)
-y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]
-if(w==null){z=$.TX.$2(a,z)
-if(z!=null){y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]}}if(w==null)return
-x=w.prototype
-v=z[0]
-if(v==="!"){y=H.Va(x)
-$.q4[z]=y
-Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}if(v==="~"){$.vv[z]=x
-return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.B1(a,x)
-if(v==="*")throw H.b(P.SY(z))
-if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-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.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
-$.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
-$.vv=Object.create(null)
-H.kO()
-z=init.interceptorsByTag
-y=Object.getOwnPropertyNames(z)
-if(typeof window!="undefined"){window
-x=function(){}
-for(w=0;w<y.length;++w){v=y[w]
-u=$.x7.$1(v)
-if(u!=null){t=H.ow(v,z[v],u)
-if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
-x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
-if(/^[A-Za-z_]/.test(v)){s=z[v]
-z["!"+v]=s
-z["~"+v]=s
-z["-"+v]=s
-z["+"+v]=s
-z["*"+v]=s}}},
-kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
-z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
-if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
-if(typeof y=="function")y=[y]
-if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
-if(typeof w=="function")z=w(z)||z}}v=z.getTag
-u=z.getUnknownTag
-t=z.prototypeForTag
-$.NF=new H.dC(v)
-$.TX=new H.VX(u)
-$.x7=new H.vZ(t)},
-ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
-z=H.VM([],[P.ns])
-y=b.length
-x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
-b0:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
-y=b.Ej
-return y.test(z)}else return J.yx(z.dd(b,C.xB.yn(a,c)))}},
-ys:function(a,b,c){var z,y,x,w
-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.vM+=w
-z.vM=w+c}return z.vM}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)},
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
-$isZ0:true},
-Px:{
-"^":"ysD;B>,HV,tc",
-x4:function(a){if(typeof a!=="string")return!1
-if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},
-t:function(a,b){if(!this.x4(b))return
-return this.TZ(b)},
-TZ:function(a){return this.HV[a]},
-aN:function(a,b){var z,y,x
-z=this.tc
-for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
-gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
-$isyN:true},
-hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-XR:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
-LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
-gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
-if(y===0)return C.dn
-x=[]
-for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
-x.push(z[w])}x.immutable$list=!0
-x.fixed$length=!0
-return x},
-gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.GD,null)
-z=this.FX
-y=z.length
-x=this.rq
-w=x.length-y
-if(y===0)return P.Fl(P.GD,null)
-v=P.L5(null,null,null,P.GD,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.IN(t),x[s])}return v},
-static:{"^":"hAw,oY,Y8"}},
-FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[a+this.hG+3]
-return init.metadata[z]},
-BX:function(a,b){var z=this.Rv
-if(typeof b!=="number")return b.C()
-if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},
-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
-y=x.gvc()
-y=P.F(y,!0,H.ip(y,"mW",0))
-H.rd(y,null)
-H.bQ(y,new H.uV(z,this,x))}z=this.NE
-if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},
-static:{"^":"t4,FV,OcN,H6",zh:function(a){var z,y,x
-z=a.$reflectionInfo
-if(z==null)return
-z.fixed$length=init
-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)}}},
-uV:{
-"^":"Tp:5;a,b,c",
-$1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
-if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
-Cj:{
-"^":"Tp:78;a,b,c",
-$2:function(a,b){var z=this.a
-z.b=z.b+"$"+H.d(a)
-this.c.push(a)
-this.b.push(b);++z.a},
-$isEH:true},
-u8:{
-"^":"Tp:78;a,b",
-$2:function(a,b){var z=this.b
-if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
-Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
-qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
-if(z==null)return
-y={}
-x=this.rq
-if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
-if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
-if(x!==-1)y.expr=z[x+1]
-x=this.Ga
-if(x!==-1)y.method=z[x+1]
-x=this.cR
-if(x!==-1)y.receiver=z[x+1]
-return y},
-static:{"^":"lm,k1,Re,fN,qi,cz,BX,tt,dt,A7",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=[]
-y=z.indexOf("\\$arguments\\$")
-x=z.indexOf("\\$argumentsExpr\\$")
-w=z.indexOf("\\$expr\\$")
-v=z.indexOf("\\$method\\$")
-u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},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)}}},
-Zo:{
-"^":"XS;K9,Ga",
-bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$isJS:true,
-$isXS:true},
-u0:{
-"^":"XS;K9,Ga,cR",
-bu:function(a){var z,y
-z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
-$isJS:true,
-$isXS:true,
-static:{T3:function(a,b){var z,y
-z=b==null
-y=z?null:b.method
-z=z?null:b.receiver
-return new H.u0(a,y,z)}}},
-vV:{
-"^":"XS;K9",
-bu:function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z}},
-Am:{
-"^":"Tp:13;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-XO:{
-"^":"a;lA,ui",
-bu:function(a){var z,y
-z=this.ui
-if(z!=null)return z
-z=this.lA
-y=typeof z==="object"?z.stack:null
-z=y==null?"":y
-this.ui=z
-return z}},
-dr:{
-"^":"Tp:69;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
-TL:{
-"^":"Tp:69;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
-uZ:{
-"^":"Tp:69;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
-OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
-Qx:{
-"^":"Tp:69;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-Tp:{
-"^":"a;",
-bu:function(a){return"Closure"},
-$isEH:true,
-gKu:function(){return this}},
-Bp:{
-"^":"Tp;"},
-v:{
-"^":"Bp;nw,jm,cR,RA",
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
-giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
-else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
-$isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},B3:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
-y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
-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},
-$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))}}},
-bb:{
-"^":"XS;G1>",
-bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Pa:function(a){return new H.bb(a)}}},
-lbp:{
-"^":"a;"},
-GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
-return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(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)
-if(!!x.$isnr)z.void=true
-else if(!x.$ishJ)z.ret=y.za()
-y=this.Iq
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
-if(y!=null){w={}
-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
-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
-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.p6
-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))},
-static:{"^":"Ot",Dz:function(a){var z,y,x
-a=a
-z=[]
-for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
-hJ:{
-"^":"lbp;",
-bu:function(a){return"dynamic"},
-za:function(){return},
-$ishJ:true},
-Fp:{
-"^":"lbp;oc>",
-za:function(){var z,y
-z=this.oc
-y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},
-bu:function(a){return this.oc}},
-KEA:{
-"^":"lbp;oc>,re,Et",
-za:function(){var z,y
-z=this.Et
-if(z!=null)return z
-z=this.oc
-y=[init.allClasses[z]]
-if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
-this.Et=y
-return y},
-bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
-cu:{
-"^":"a;LU,ke",
-bu:function(a){var z,y
-z=this.ke
-if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},
-giO:function(a){return J.v1(this.LU)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
-$iscu:true,
-$isuq:true},
-dC:{
-"^":"Tp:13;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
-VX:{
-"^":"Tp:79;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
-vZ:{
-"^":"Tp:5;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
-VR:{
-"^":"a;zO,Ej,BT,xJ",
-gF4:function(){var z=this.BT
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
-return z},
-gAT:function(){var z=this.xJ
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.xJ=z
-return z},
-ej:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
-if(z==null)return
-return H.Mr(this,z)},
-zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Ej.test(a)},
-dd:function(a,b){return new H.KW(this,b)},
-yk:function(a,b){var z,y
-z=this.gF4()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-return H.Mr(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-x=y.length
-w=x-1
-if(w<0)return H.e(y,w)
-if(y[w]!=null)return
-C.Nm.sB(y,w)
-return H.Mr(this,y)},
-wL:function(a,b,c){var z
-if(c>=0){z=J.q8(b)
-if(typeof z!=="number")return H.s(z)
-z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
-R4:function(a,b){return this.wL(a,b,0)},
-$isVR:true,
-$isSP:true,
-static:{ol:function(a,b,c,d){var z,y,x,w,v
-z=b?"m":""
-y=c?"":"i"
-x=d?"g":""
-w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
-if(w instanceof RegExp)return w
-v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
-AX:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-VO:function(a,b){},
-$isns:true,
-static:{Mr:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
-return z}}},
-KW:{
-"^":"mW;rN,rv",
-gA:function(a){return new H.Pb(this.rN,this.rv,null)},
-$asmW:function(){return[P.ns]},
-$asQV:function(){return[P.ns]}},
-Pb:{
-"^":"a;xz,rv,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.rv==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
-y=z.index
-if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.rv,x)
-this.Wh=z
-if(z==null){this.rv=null
-return!1}return!0}},
-Vo:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
-"^":"",
-hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-F6:[function(a,b,c,d){var z=a.fi
-if(z===!0)return
-if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).Qy(new X.jE(a))}},"$3","gNa",6,0,80,46,47,81],
-static:{zy:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Df.ZL(a)
-C.Df.XI(a)
-return a}}},
-LPc:{
-"^":"xc+Pi;",
-$isd3:true},
-jE:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
-"^":"",
-m7:[function(a){var z
-N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Si(),"google"),"visualization")
-$.BY=z
-return z},"$1","vN",2,0,13,14],
-dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
-o1:function(a,b){var z
-for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-le:[function(a){var z,y,x
-z=J.Wx(a)
-if(z.C(a,1000))return z.bu(a)
-y=z.Y(a,1000)
-a=z.Z(a,1000)
-x=G.o1(y,3)
-for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,15],
-P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
-z=C.jn.Y(z,1000)
-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)},
-As:[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","YN",2,0,15,16],
-mG:function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(a,1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(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"},
-uG:{
-"^":"Pi;",
-gFL:function(a){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){if(J.xC(a,""))return
-this.MR.wv.cv(a).ml(new G.zv(this))},
-VU:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("class-tree",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){this.MR.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-VU:function(a){return J.co(a,"class-tree/")},
-static:{"^":"o9x"}},
-yk:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-f2:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.MR.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-VU:function(a){return J.co(a,"error/")}},
-mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,bn,EC,AP,fn",
-god:function(a){return this.Eb},
-sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-Da:function(){var z,y
-this.om()
-z=this.wv
-y=z.G2
-H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.Li
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())
-z=this.Z6
-$.W5=z
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gjU()),y.Sg),[H.Kp(y,0)]).Zz()
-z.Cy()},
-om:function(){var z,y
-if(this.Lh!=null)return
-z=this.cE
-z.push(new G.Ez(this,null,null,null))
-z.push(new G.f2(this,null,null,null))
-y=new G.cZ(this,null,null,null)
-this.Lh=y
-z.push(y)},
-kj:[function(a){this.EC=a
-this.og("error/",null)},"$1","gbf",2,0,84,24],
-kI:[function(a){this.EC=a
-this.og("error/",null)},"$1","gXa",2,0,85,86],
-og:function(a,b){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.VU(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.EY())},
-lJ:function(a){var z,y,x
-z="Installing "+J.AG(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-y=this.cL
-if(y==null?a==null:y===a)return
-if(y!=null){x=y.yF
-if(y.gnz(y)&&x!=null){x=new T.qI(y,C.GP,x,null)
-x.$builtinTypeInfo=[null]
-y.nq(y,x)}y.yF=null}a.zw()
-y=this.bn
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
-Kf:{
-"^":"a;Yb",
-goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
-B7:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
-C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
-qu:{
-"^":"a;vR,bG",
-W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){var z,y,x
-if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.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)
-x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
-Bs:function(a,b,c){var z,y,x,w
-z=J.Vs(c).MW.getAttribute("href")
-y=J.RE(a)
-x=y.gpL(a)
-if(typeof x!=="number")return x.D()
-if(x>1||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gGU(a)===!0)return
-x=$.W5
-w=x.c5
-if(w==null?z!=null:w!==z){N.QM("").To("Navigated to "+H.d(z))
-window.history.pushState(z,document.title,z)
-x.c5=z}x.lU(z)
-y.e6(a)}},
-OR:{
-"^":"yVe;hS,ec,c5,ro,dUC,pt",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.hS
-window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gjU",2,0,87,14]},
-Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
-gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
-if(!z){z=this.PU
-if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
-$isY2:true},
-XN:{
-"^":"Pi;vp>,AP,fn",
-rT:function(a){var z,y
-z=this.vp
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
-qU:function(a){var z,y,x
-z=this.vp
-y=J.U6(z)
-x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.u8(z,x)+1,J.Mx(x))
-else this.FS(x)},
-FS:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.q8(z.gks(a))
-if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
-z.soE(a,!1)
-z=this.vp
-w=J.U6(z)
-v=w.u8(z,a)+1
-w.UZ(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,OV<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
-Vz0:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
-F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
-F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.oE(this.eE(b,this.pT),z)},"$2","gCS",4,0,88],
-zF:[function(a,b){return J.oE(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gAZ",4,0,88],
-Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
-z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gAZ()
-H.rd(z,y)}},
-B7: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)
-z.push(b)},
-Gu:function(a,b){var z,y
-z=this.vp
-if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
-z=this.oH
-if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
-Qs:[function(a){var z
-if(!J.xC(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.ew(J.Q4(z[a]),"\u2003")}z=this.oH
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Q4(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,89]}}],["app_bootstrap","index.html_bootstrap.dart",,E,{
-"^":"",
-Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.ET,new E.Cv(),C.WC,new E.ed(),C.S4,new E.wa(),C.Ro,new E.Or(),C.hN,new E.YL(),C.AV,new E.wf(),C.bV,new E.Oa(),C.C0,new E.emv(),C.eZ,new E.Lbd(),C.bk,new E.QAa(),C.lH,new E.CvS(),C.kG,new E.edy(),C.OI,new E.waE(),C.To,new E.Ore(),C.XA,new E.YLa(),C.i4,new E.wfa(),C.qt,new E.Oaa(),C.p1,new E.e0(),C.yL,new E.e1(),C.bJ,new E.e2(),C.ox,new E.e3(),C.Je,new E.e4(),C.iE,new E.e5(),C.f4,new E.e6(),C.VK,new E.e7(),C.aH,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.vs,new E.e11(),C.Gr,new E.e12(),C.TU,new E.e13(),C.tP,new E.e14(),C.yh,new E.e15(),C.Zb,new E.e16(),C.u7,new E.e17(),C.ne,new E.e18(),C.B0,new E.e19(),C.r1,new E.e20(),C.mr,new E.e21(),C.Ek,new E.e22(),C.Pn,new E.e23(),C.YT,new E.e24(),C.h7,new E.e25(),C.R3,new E.e26(),C.WQ,new E.e27(),C.fV,new E.e28(),C.jU,new E.e29(),C.Gd,new E.e30(),C.OO,new E.e31(),C.Mc,new E.e32(),C.FP,new E.e33(),C.kF,new E.e34(),C.UD,new E.e35(),C.Aq,new E.e36(),C.DS,new E.e37(),C.C9,new E.e38(),C.VF,new E.e39(),C.uU,new E.e40(),C.YJ,new E.e41(),C.eF,new E.e42(),C.oI,new E.e43(),C.ST,new E.e44(),C.QH,new E.e45(),C.qX,new E.e46(),C.rE,new E.e47(),C.nf,new E.e48(),C.pO,new E.e49(),C.EI,new E.e50(),C.JB,new E.e51(),C.d4,new E.e52(),C.cF,new E.e53(),C.Ql,new E.e54(),C.SI,new E.e55(),C.zS,new E.e56(),C.YA,new E.e57(),C.ak,new E.e58(),C.Ge,new E.e59(),C.He,new E.e60(),C.Ss,new E.e61(),C.k6,new E.e62(),C.oj,new E.e63(),C.PJ,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.yB,new E.e69(),C.eJ,new E.e70(),C.iG,new E.e71(),C.Py,new E.e72(),C.pC,new E.e73(),C.uu,new E.e74(),C.qs,new E.e75(),C.XH,new E.e76(),C.I9,new E.e77(),C.C1,new E.e78(),C.a0,new E.e79(),C.Yg,new E.e80(),C.bR,new E.e81(),C.ai,new E.e82(),C.ob,new E.e83(),C.Iv,new E.e84(),C.Wg,new E.e85(),C.tD,new E.e86(),C.nZ,new E.e87(),C.Of,new E.e88(),C.pY,new E.e89(),C.XL,new E.e90(),C.LA,new E.e91(),C.Lk,new E.e92(),C.dK,new E.e93(),C.xf,new E.e94(),C.rB,new E.e95(),C.bz,new E.e96(),C.Jx,new E.e97(),C.b5,new E.e98(),C.Lc,new E.e99(),C.hf,new E.e100(),C.uk,new E.e101(),C.Zi,new E.e102(),C.TN,new E.e103(),C.kA,new E.e104(),C.GI,new E.e105(),C.Wn,new E.e106(),C.ur,new E.e107(),C.VN,new E.e108(),C.EV,new E.e109(),C.VI,new E.e110(),C.eh,new E.e111(),C.r6,new E.e112(),C.MW,new E.e113(),C.SA,new E.e114(),C.kV,new E.e115(),C.vp,new E.e116(),C.cc,new E.e117(),C.DY,new E.e118(),C.Lx,new E.e119(),C.M3,new E.e120(),C.wT,new E.e121(),C.SR,new E.e122(),C.t6,new E.e123(),C.rP,new E.e124(),C.pX,new E.e125(),C.VD,new E.e126(),C.NN,new E.e127(),C.UX,new E.e128(),C.YS,new E.e129(),C.pu,new E.e130(),C.BJ,new E.e131(),C.td,new E.e132(),C.Gn,new E.e133(),C.zO,new E.e134(),C.vg,new E.e135(),C.Ys,new E.e136(),C.zm,new E.e137(),C.XM,new E.e138(),C.Ic,new E.e139(),C.yG,new E.e140(),C.uI,new E.e141(),C.tW,new E.e142(),C.CG,new E.e143(),C.Wj,new E.e144(),C.vb,new E.e145(),C.UL,new E.e146(),C.AY,new E.e147(),C.QK,new E.e148(),C.AO,new E.e149(),C.I7,new E.e150(),C.xP,new E.e151(),C.Wm,new E.e152(),C.GR,new E.e153(),C.KX,new E.e154(),C.ja,new E.e155(),C.Dj,new E.e156(),C.ir,new E.e157(),C.dx,new E.e158(),C.ni,new E.e159(),C.X2,new E.e160(),C.F3,new E.e161(),C.UY,new E.e162(),C.Aa,new E.e163(),C.nY,new E.e164(),C.tg,new E.e165(),C.HD,new E.e166(),C.iU,new E.e167(),C.eN,new E.e168(),C.ue,new E.e169(),C.nh,new E.e170(),C.L2,new E.e171(),C.Gs,new E.e172(),C.bE,new E.e173(),C.YD,new E.e174(),C.PX,new E.e175(),C.N8,new E.e176(),C.EA,new E.e177(),C.oW,new E.e178(),C.hd,new E.e179(),C.pH,new E.e180(),C.Ve,new E.e181(),C.jM,new E.e182(),C.nt,new E.e183(),C.PM,new E.e184(),C.xA,new E.e185(),C.k5,new E.e186(),C.Nv,new E.e187(),C.Cw,new E.e188(),C.TW,new E.e189(),C.xS,new E.e190(),C.mi,new E.e191(),C.zz,new E.e192(),C.hO,new E.e193(),C.ei,new E.e194(),C.HK,new E.e195(),C.je,new E.e196(),C.Ef,new E.e197(),C.Q1,new E.e198(),C.ID,new E.e199(),C.z6,new E.e200(),C.bc,new E.e201(),C.kw,new E.e202(),C.ep,new E.e203(),C.J2,new E.e204(),C.zU,new E.e205(),C.bn,new E.e206(),C.mh,new E.e207(),C.Fh,new E.e208(),C.LP,new E.e209(),C.jh,new E.e210(),C.fj,new E.e211(),C.xw,new E.e212(),C.zn,new E.e213(),C.RJ,new E.e214(),C.Tc,new E.e215(),C.YE,new E.e216(),C.Uy,new E.e217()],null,null)
-y=P.EF([C.aP,new E.e218(),C.cg,new E.e219(),C.S4,new E.e220(),C.AV,new E.e221(),C.bk,new E.e222(),C.lH,new E.e223(),C.kG,new E.e224(),C.XA,new E.e225(),C.i4,new E.e226(),C.yL,new E.e227(),C.bJ,new E.e228(),C.VK,new E.e229(),C.aH,new E.e230(),C.vs,new E.e231(),C.Gr,new E.e232(),C.tP,new E.e233(),C.yh,new E.e234(),C.Zb,new E.e235(),C.ne,new E.e236(),C.B0,new E.e237(),C.mr,new E.e238(),C.YT,new E.e239(),C.WQ,new E.e240(),C.jU,new E.e241(),C.Gd,new E.e242(),C.OO,new E.e243(),C.Mc,new E.e244(),C.QH,new E.e245(),C.rE,new E.e246(),C.nf,new E.e247(),C.Ql,new E.e248(),C.ak,new E.e249(),C.Ge,new E.e250(),C.He,new E.e251(),C.oj,new E.e252(),C.d2,new E.e253(),C.fn,new E.e254(),C.Py,new E.e255(),C.uu,new E.e256(),C.qs,new E.e257(),C.a0,new E.e258(),C.rB,new E.e259(),C.Lc,new E.e260(),C.hf,new E.e261(),C.uk,new E.e262(),C.Zi,new E.e263(),C.TN,new E.e264(),C.kA,new E.e265(),C.ur,new E.e266(),C.EV,new E.e267(),C.eh,new E.e268(),C.SA,new E.e269(),C.kV,new E.e270(),C.vp,new E.e271(),C.SR,new E.e272(),C.t6,new E.e273(),C.UX,new E.e274(),C.YS,new E.e275(),C.td,new E.e276(),C.zO,new E.e277(),C.Ys,new E.e278(),C.XM,new E.e279(),C.Ic,new E.e280(),C.tW,new E.e281(),C.Wj,new E.e282(),C.vb,new E.e283(),C.QK,new E.e284(),C.AO,new E.e285(),C.xP,new E.e286(),C.GR,new E.e287(),C.KX,new E.e288(),C.ja,new E.e289(),C.Dj,new E.e290(),C.X2,new E.e291(),C.UY,new E.e292(),C.Aa,new E.e293(),C.nY,new E.e294(),C.tg,new E.e295(),C.HD,new E.e296(),C.iU,new E.e297(),C.eN,new E.e298(),C.Gs,new E.e299(),C.bE,new E.e300(),C.YD,new E.e301(),C.PX,new E.e302(),C.pH,new E.e303(),C.Ve,new E.e304(),C.jM,new E.e305(),C.nt,new E.e306(),C.PM,new E.e307(),C.Nv,new E.e308(),C.Cw,new E.e309(),C.TW,new E.e310(),C.mi,new E.e311(),C.zz,new E.e312(),C.z6,new E.e313(),C.kw,new E.e314(),C.zU,new E.e315(),C.RJ,new E.e316(),C.YE,new E.e317()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,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.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,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.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.jw,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.hR,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.xY,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.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],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.hR,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,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,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.dq,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,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.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.DZ,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,C.CM,C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,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.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.m2,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.ET,"assertsEnabled",C.WC,"bpt",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.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",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.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",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.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",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.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",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.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
-$.j8=new O.fH(z,y,C.CM)
-$.Yv=new O.bY(x,w,!1)
-$.qe=v
-$.M6=[new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391()]
-$.UG=!0
-F.E2()},"$0","V7",0,0,18],
-em:{
-"^":"Tp:13;",
-$1:function(a){return J.Jp(a)},
-$isEH:true},
-Lb:{
-"^":"Tp:13;",
-$1:function(a){return a.gYu()},
-$isEH:true},
-QA:{
-"^":"Tp:13;",
-$1:function(a){return J.Ln(a)},
-$isEH:true},
-Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
-$isEH:true},
-ed:{
-"^":"Tp:13;",
-$1:function(a){return a.gqr()},
-$isEH:true},
-wa:{
-"^":"Tp:13;",
-$1:function(a){return J.nG(a)},
-$isEH:true},
-Or:{
-"^":"Tp:13;",
-$1:function(a){return J.aA(a)},
-$isEH:true},
-YL:{
-"^":"Tp:13;",
-$1:function(a){return a.gfj()},
-$isEH:true},
-wf:{
-"^":"Tp:13;",
-$1:function(a){return J.WT(a)},
-$isEH:true},
-Oa:{
-"^":"Tp:13;",
-$1:function(a){return a.gCs()},
-$isEH:true},
-emv:{
-"^":"Tp:13;",
-$1:function(a){return J.Wp(a)},
-$isEH:true},
-Lbd:{
-"^":"Tp:13;",
-$1:function(a){return J.n9(a)},
-$isEH:true},
-QAa:{
-"^":"Tp:13;",
-$1:function(a){return J.K0(a)},
-$isEH:true},
-CvS:{
-"^":"Tp:13;",
-$1:function(a){return J.hn(a)},
-$isEH:true},
-edy:{
-"^":"Tp:13;",
-$1:function(a){return J.yz(a)},
-$isEH:true},
-waE:{
-"^":"Tp:13;",
-$1:function(a){return J.pP(a)},
-$isEH:true},
-Ore:{
-"^":"Tp:13;",
-$1:function(a){return a.gaP()},
-$isEH:true},
-YLa:{
-"^":"Tp:13;",
-$1:function(a){return J.E3(a)},
-$isEH:true},
-wfa:{
-"^":"Tp:13;",
-$1:function(a){return J.on(a)},
-$isEH:true},
-Oaa:{
-"^":"Tp:13;",
-$1:function(a){return J.SM(a)},
-$isEH:true},
-e0:{
-"^":"Tp:13;",
-$1:function(a){return a.goH()},
-$isEH:true},
-e1:{
-"^":"Tp:13;",
-$1:function(a){return J.xe(a)},
-$isEH:true},
-e2:{
-"^":"Tp:13;",
-$1:function(a){return J.OT(a)},
-$isEH:true},
-e3:{
-"^":"Tp:13;",
-$1:function(a){return J.Ok(a)},
-$isEH:true},
-e4:{
-"^":"Tp:13;",
-$1:function(a){return a.gl()},
-$isEH:true},
-e5:{
-"^":"Tp:13;",
-$1:function(a){return a.gSL()},
-$isEH:true},
-e6:{
-"^":"Tp:13;",
-$1:function(a){return a.guH()},
-$isEH:true},
-e7:{
-"^":"Tp:13;",
-$1:function(a){return J.mP(a)},
-$isEH:true},
-e8:{
-"^":"Tp:13;",
-$1:function(a){return J.BT(a)},
-$isEH:true},
-e9:{
-"^":"Tp:13;",
-$1:function(a){return J.vi(a)},
-$isEH:true},
-e10:{
-"^":"Tp:13;",
-$1:function(a){return J.nq(a)},
-$isEH:true},
-e11:{
-"^":"Tp:13;",
-$1:function(a){return J.k0(a)},
-$isEH:true},
-e12:{
-"^":"Tp:13;",
-$1:function(a){return J.rw(a)},
-$isEH:true},
-e13:{
-"^":"Tp:13;",
-$1:function(a){return J.wt(a)},
-$isEH:true},
-e14:{
-"^":"Tp:13;",
-$1:function(a){return a.gw2()},
-$isEH:true},
-e15:{
-"^":"Tp:13;",
-$1:function(a){return J.w8(a)},
-$isEH:true},
-e16:{
-"^":"Tp:13;",
-$1:function(a){return J.is(a)},
-$isEH:true},
-e17:{
-"^":"Tp:13;",
-$1:function(a){return J.yi(a)},
-$isEH:true},
-e18:{
-"^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
-$isEH:true},
-e19:{
-"^":"Tp:13;",
-$1:function(a){return J.kE(a)},
-$isEH:true},
-e20:{
-"^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
-$isEH:true},
-e21:{
-"^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
-$isEH:true},
-e22:{
-"^":"Tp:13;",
-$1:function(a){return J.nb(a)},
-$isEH:true},
-e23:{
-"^":"Tp:13;",
-$1:function(a){return a.gty()},
-$isEH:true},
-e24:{
-"^":"Tp:13;",
-$1:function(a){return J.yn(a)},
-$isEH:true},
-e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gMX()},
-$isEH:true},
-e26:{
-"^":"Tp:13;",
-$1:function(a){return a.gkE()},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
-$1:function(a){return J.pm(a)},
-$isEH:true},
-e28:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
-$isEH:true},
-e29:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e30:{
-"^":"Tp:13;",
-$1:function(a){return a.ghY()},
-$isEH:true},
-e31:{
-"^":"Tp:13;",
-$1:function(a){return J.ra(a)},
-$isEH:true},
-e32:{
-"^":"Tp:13;",
-$1:function(a){return J.QZ(a)},
-$isEH:true},
-e33:{
-"^":"Tp:13;",
-$1:function(a){return J.WX(a)},
-$isEH:true},
-e34:{
-"^":"Tp:13;",
-$1:function(a){return J.JD(a)},
-$isEH:true},
-e35:{
-"^":"Tp:13;",
-$1:function(a){return a.gZd()},
-$isEH:true},
-e36:{
-"^":"Tp:13;",
-$1:function(a){return J.lT(a)},
-$isEH:true},
-e37:{
-"^":"Tp:13;",
-$1:function(a){return J.M4(a)},
-$isEH:true},
-e38:{
-"^":"Tp:13;",
-$1:function(a){return a.gkA()},
-$isEH:true},
-e39:{
-"^":"Tp:13;",
-$1:function(a){return a.gGK()},
-$isEH:true},
-e40:{
-"^":"Tp:13;",
-$1:function(a){return a.gan()},
-$isEH:true},
-e41:{
-"^":"Tp:13;",
-$1:function(a){return a.gcQ()},
-$isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return a.gS7()},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
-$1:function(a){return a.gJz()},
-$isEH:true},
-e44:{
-"^":"Tp:13;",
-$1:function(a){return J.PY(a)},
-$isEH:true},
-e45:{
-"^":"Tp:13;",
-$1:function(a){return J.bu(a)},
-$isEH:true},
-e46:{
-"^":"Tp:13;",
-$1:function(a){return J.VL(a)},
-$isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.zN(a)},
-$isEH:true},
-e48:{
-"^":"Tp:13;",
-$1:function(a){return J.m4(a)},
-$isEH:true},
-e49:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
-$isEH:true},
-e50:{
-"^":"Tp:13;",
-$1:function(a){return a.gmu()},
-$isEH:true},
-e51:{
-"^":"Tp:13;",
-$1:function(a){return a.gCO()},
-$isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.DB(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
-$1:function(a){return J.wO(a)},
-$isEH:true},
-e55:{
-"^":"Tp:13;",
-$1:function(a){return a.gGf()},
-$isEH:true},
-e56:{
-"^":"Tp:13;",
-$1:function(a){return a.gUa()},
-$isEH:true},
-e57:{
-"^":"Tp:13;",
-$1:function(a){return a.gMp()},
-$isEH:true},
-e58:{
-"^":"Tp:13;",
-$1:function(a){return J.u1(a)},
-$isEH:true},
-e59:{
-"^":"Tp:13;",
-$1:function(a){return J.z3(a)},
-$isEH:true},
-e60:{
-"^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
-$isEH:true},
-e61:{
-"^":"Tp:13;",
-$1:function(a){return a.gu9()},
-$isEH:true},
-e62:{
-"^":"Tp:13;",
-$1:function(a){return J.fA(a)},
-$isEH:true},
-e63:{
-"^":"Tp:13;",
-$1:function(a){return J.cd(a)},
-$isEH:true},
-e64:{
-"^":"Tp:13;",
-$1:function(a){return a.gL4()},
-$isEH:true},
-e65:{
-"^":"Tp:13;",
-$1:function(a){return a.gaj()},
-$isEH:true},
-e66:{
-"^":"Tp:13;",
-$1:function(a){return a.giq()},
-$isEH:true},
-e67:{
-"^":"Tp:13;",
-$1:function(a){return a.gBm()},
-$isEH:true},
-e68:{
-"^":"Tp:13;",
-$1:function(a){return J.xR(a)},
-$isEH:true},
-e69:{
-"^":"Tp:13;",
-$1:function(a){return a.gWt()},
-$isEH:true},
-e70:{
-"^":"Tp:13;",
-$1:function(a){return a.gNI()},
-$isEH:true},
-e71:{
-"^":"Tp:13;",
-$1:function(a){return a.gva()},
-$isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gKt()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e74:{
-"^":"Tp:13;",
-$1:function(a){return J.UU(a)},
-$isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
-$isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
-$1:function(a){return J.Ja(a)},
-$isEH:true},
-e78:{
-"^":"Tp:13;",
-$1:function(a){return a.gUB()},
-$isEH:true},
-e79:{
-"^":"Tp:13;",
-$1:function(a){return J.pd(a)},
-$isEH:true},
-e80:{
-"^":"Tp:13;",
-$1:function(a){return a.gkU()},
-$isEH:true},
-e81:{
-"^":"Tp:13;",
-$1:function(a){return J.wz(a)},
-$isEH:true},
-e82:{
-"^":"Tp:13;",
-$1:function(a){return J.FN(a)},
-$isEH:true},
-e83:{
-"^":"Tp:13;",
-$1:function(a){return J.ls(a)},
-$isEH:true},
-e84:{
-"^":"Tp:13;",
-$1:function(a){return J.yq(a)},
-$isEH:true},
-e85:{
-"^":"Tp:13;",
-$1:function(a){return J.SZ(a)},
-$isEH:true},
-e86:{
-"^":"Tp:13;",
-$1:function(a){return J.DL(a)},
-$isEH:true},
-e87:{
-"^":"Tp:13;",
-$1:function(a){return J.yx(a)},
-$isEH:true},
-e88:{
-"^":"Tp:13;",
-$1:function(a){return J.cU(a)},
-$isEH:true},
-e89:{
-"^":"Tp:13;",
-$1:function(a){return a.gYG()},
-$isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
-$1:function(a){return a.gHY()},
-$isEH:true},
-e92:{
-"^":"Tp:13;",
-$1:function(a){return J.UM(a)},
-$isEH:true},
-e93:{
-"^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
-$isEH:true},
-e94:{
-"^":"Tp:13;",
-$1:function(a){return J.xa(a)},
-$isEH:true},
-e95:{
-"^":"Tp:13;",
-$1:function(a){return J.aT(a)},
-$isEH:true},
-e96:{
-"^":"Tp:13;",
-$1:function(a){return J.hb(a)},
-$isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
-$isEH:true},
-e98:{
-"^":"Tp:13;",
-$1:function(a){return a.gEB()},
-$isEH:true},
-e99:{
-"^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
-$isEH:true},
-e100:{
-"^":"Tp:13;",
-$1:function(a){return J.Q4(a)},
-$isEH:true},
-e101:{
-"^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
-$isEH:true},
-e102:{
-"^":"Tp:13;",
-$1:function(a){return J.tx(a)},
-$isEH:true},
-e103:{
-"^":"Tp:13;",
-$1:function(a){return J.IR(a)},
-$isEH:true},
-e104:{
-"^":"Tp:13;",
-$1:function(a){return a.gSK()},
-$isEH:true},
-e105:{
-"^":"Tp:13;",
-$1:function(a){return a.gPE()},
-$isEH:true},
-e106:{
-"^":"Tp:13;",
-$1:function(a){return J.q8(a)},
-$isEH:true},
-e107:{
-"^":"Tp:13;",
-$1:function(a){return a.ghX()},
-$isEH:true},
-e108:{
-"^":"Tp:13;",
-$1:function(a){return a.gvU()},
-$isEH:true},
-e109:{
-"^":"Tp:13;",
-$1:function(a){return J.jl(a)},
-$isEH:true},
-e110:{
-"^":"Tp:13;",
-$1:function(a){return a.gRd()},
-$isEH:true},
-e111:{
-"^":"Tp:13;",
-$1:function(a){return J.zY(a)},
-$isEH:true},
-e112:{
-"^":"Tp:13;",
-$1:function(a){return J.Fd(a)},
-$isEH:true},
-e113:{
-"^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
-$isEH:true},
-e114:{
-"^":"Tp:13;",
-$1:function(a){return J.de(a)},
-$isEH:true},
-e115:{
-"^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
-$isEH:true},
-e116:{
-"^":"Tp:13;",
-$1:function(a){return J.cO(a)},
-$isEH:true},
-e117:{
-"^":"Tp:13;",
-$1:function(a){return a.gzM()},
-$isEH:true},
-e118:{
-"^":"Tp:13;",
-$1:function(a){return a.gjz()},
-$isEH:true},
-e119:{
-"^":"Tp:13;",
-$1:function(a){return a.giP()},
-$isEH:true},
-e120:{
-"^":"Tp:13;",
-$1:function(a){return a.gLw()},
-$isEH:true},
-e121:{
-"^":"Tp:13;",
-$1:function(a){return a.geH()},
-$isEH:true},
-e122:{
-"^":"Tp:13;",
-$1:function(a){return J.Yf(a)},
-$isEH:true},
-e123:{
-"^":"Tp:13;",
-$1:function(a){return J.kv(a)},
-$isEH:true},
-e124:{
-"^":"Tp:13;",
-$1:function(a){return J.ih(a)},
-$isEH:true},
-e125:{
-"^":"Tp:13;",
-$1:function(a){return J.z2(a)},
-$isEH:true},
-e126:{
-"^":"Tp:13;",
-$1:function(a){return J.ZL(a)},
-$isEH:true},
-e127:{
-"^":"Tp:13;",
-$1:function(a){return J.ba(a)},
-$isEH:true},
-e128:{
-"^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
-$isEH:true},
-e129:{
-"^":"Tp:13;",
-$1:function(a){return J.O6(a)},
-$isEH:true},
-e130:{
-"^":"Tp:13;",
-$1:function(a){return J.HO(a)},
-$isEH:true},
-e131:{
-"^":"Tp:13;",
-$1:function(a){return a.gUY()},
-$isEH:true},
-e132:{
-"^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
-$isEH:true},
-e133:{
-"^":"Tp:13;",
-$1:function(a){return J.t8(a)},
-$isEH:true},
-e134:{
-"^":"Tp:13;",
-$1:function(a){return a.gL1()},
-$isEH:true},
-e135:{
-"^":"Tp:13;",
-$1:function(a){return a.gxQ()},
-$isEH:true},
-e136:{
-"^":"Tp:13;",
-$1:function(a){return J.EC(a)},
-$isEH:true},
-e137:{
-"^":"Tp:13;",
-$1:function(a){return J.JG(a)},
-$isEH:true},
-e138:{
-"^":"Tp:13;",
-$1:function(a){return J.AF(a)},
-$isEH:true},
-e139:{
-"^":"Tp:13;",
-$1:function(a){return J.LB(a)},
-$isEH:true},
-e140:{
-"^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
-$isEH:true},
-e141:{
-"^":"Tp:13;",
-$1:function(a){return a.gU6()},
-$isEH:true},
-e142:{
-"^":"Tp:13;",
-$1:function(a){return J.io(a)},
-$isEH:true},
-e143:{
-"^":"Tp:13;",
-$1:function(a){return J.fy(a)},
-$isEH:true},
-e144:{
-"^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
-$isEH:true},
-e145:{
-"^":"Tp:13;",
-$1:function(a){return J.ks(a)},
-$isEH:true},
-e146:{
-"^":"Tp:13;",
-$1:function(a){return J.CN(a)},
-$isEH:true},
-e147:{
-"^":"Tp:13;",
-$1:function(a){return J.WM(a)},
-$isEH:true},
-e148:{
-"^":"Tp:13;",
-$1:function(a){return J.ul(a)},
-$isEH:true},
-e149:{
-"^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
-$isEH:true},
-e150:{
-"^":"Tp:13;",
-$1:function(a){return a.gm8()},
-$isEH:true},
-e151:{
-"^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
-$isEH:true},
-e152:{
-"^":"Tp:13;",
-$1:function(a){return J.Dd(a)},
-$isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
-$isEH:true},
-e154:{
-"^":"Tp:13;",
-$1:function(a){return J.fU(a)},
-$isEH:true},
-e155:{
-"^":"Tp:13;",
-$1:function(a){return J.GH(a)},
-$isEH:true},
-e156:{
-"^":"Tp:13;",
-$1:function(a){return J.QX(a)},
-$isEH:true},
-e157:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
-$isEH:true},
-e158:{
-"^":"Tp:13;",
-$1:function(a){return a.gNS()},
-$isEH:true},
-e159:{
-"^":"Tp:13;",
-$1:function(a){return a.guh()},
-$isEH:true},
-e160:{
-"^":"Tp:13;",
-$1:function(a){return J.iL(a)},
-$isEH:true},
-e161:{
-"^":"Tp:13;",
-$1:function(a){return J.k7(a)},
-$isEH:true},
-e162:{
-"^":"Tp:13;",
-$1:function(a){return J.uW(a)},
-$isEH:true},
-e163:{
-"^":"Tp:13;",
-$1:function(a){return J.W2(a)},
-$isEH:true},
-e164:{
-"^":"Tp:13;",
-$1:function(a){return J.UT(a)},
-$isEH:true},
-e165:{
-"^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
-$isEH:true},
-e166:{
-"^":"Tp:13;",
-$1:function(a){return J.pU(a)},
-$isEH:true},
-e167:{
-"^":"Tp:13;",
-$1:function(a){return J.jo(a)},
-$isEH:true},
-e168:{
-"^":"Tp:13;",
-$1:function(a){return a.gVc()},
-$isEH:true},
-e169:{
-"^":"Tp:13;",
-$1:function(a){return a.gpF()},
-$isEH:true},
-e170:{
-"^":"Tp:13;",
-$1:function(a){return J.TY(a)},
-$isEH:true},
-e171:{
-"^":"Tp:13;",
-$1:function(a){return a.gA6()},
-$isEH:true},
-e172:{
-"^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
-$isEH:true},
-e173:{
-"^":"Tp:13;",
-$1:function(a){return J.UP(a)},
-$isEH:true},
-e174:{
-"^":"Tp:13;",
-$1:function(a){return J.fw(a)},
-$isEH:true},
-e175:{
-"^":"Tp:13;",
-$1:function(a){return J.zH(a)},
-$isEH:true},
-e176:{
-"^":"Tp:13;",
-$1:function(a){return J.Vi(a)},
-$isEH:true},
-e177:{
-"^":"Tp:13;",
-$1:function(a){return a.gXR()},
-$isEH:true},
-e178:{
-"^":"Tp:13;",
-$1:function(a){return J.P5(a)},
-$isEH:true},
-e179:{
-"^":"Tp:13;",
-$1:function(a){return a.gzS()},
-$isEH:true},
-e180:{
-"^":"Tp:13;",
-$1:function(a){return J.U8(a)},
-$isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.oN(a)},
-$isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gV8()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
-$1:function(a){return J.HB(a)},
-$isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
-$1:function(a){return J.J0(a)},
-$isEH:true},
-e186:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e187:{
-"^":"Tp:13;",
-$1:function(a){return a.gDo()},
-$isEH:true},
-e188:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e189:{
-"^":"Tp:13;",
-$1:function(a){return J.j1(a)},
-$isEH:true},
-e190:{
-"^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
-$isEH:true},
-e191:{
-"^":"Tp:13;",
-$1:function(a){return J.dY(a)},
-$isEH:true},
-e192:{
-"^":"Tp:13;",
-$1:function(a){return J.OL(a)},
-$isEH:true},
-e193:{
-"^":"Tp:13;",
-$1:function(a){return a.gki()},
-$isEH:true},
-e194:{
-"^":"Tp:13;",
-$1:function(a){return a.gZn()},
-$isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return a.gvs()},
-$isEH:true},
-e196:{
-"^":"Tp:13;",
-$1:function(a){return a.gVh()},
-$isEH:true},
-e197:{
-"^":"Tp:13;",
-$1:function(a){return a.gZX()},
-$isEH:true},
-e198:{
-"^":"Tp:13;",
-$1:function(a){return J.SG(a)},
-$isEH:true},
-e199:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
-$isEH:true},
-e200:{
-"^":"Tp:13;",
-$1:function(a){return a.gVF()},
-$isEH:true},
-e201:{
-"^":"Tp:13;",
-$1:function(a){return a.gkw()},
-$isEH:true},
-e202:{
-"^":"Tp:13;",
-$1:function(a){return J.K2(a)},
-$isEH:true},
-e203:{
-"^":"Tp:13;",
-$1:function(a){return J.uy(a)},
-$isEH:true},
-e204:{
-"^":"Tp:13;",
-$1:function(a){return a.gEy()},
-$isEH:true},
-e205:{
-"^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
-$isEH:true},
-e206:{
-"^":"Tp:13;",
-$1:function(a){return J.Sl(a)},
-$isEH:true},
-e207:{
-"^":"Tp:13;",
-$1:function(a){return a.gJk()},
-$isEH:true},
-e208:{
-"^":"Tp:13;",
-$1:function(a){return J.Nl(a)},
-$isEH:true},
-e209:{
-"^":"Tp:13;",
-$1:function(a){return a.gSU()},
-$isEH:true},
-e210:{
-"^":"Tp:13;",
-$1:function(a){return a.gFc()},
-$isEH:true},
-e211:{
-"^":"Tp:13;",
-$1:function(a){return a.gYY()},
-$isEH:true},
-e212:{
-"^":"Tp:13;",
-$1:function(a){return a.gZ3()},
-$isEH:true},
-e213:{
-"^":"Tp:13;",
-$1:function(a){return J.ry(a)},
-$isEH:true},
-e214:{
-"^":"Tp:13;",
-$1:function(a){return J.I2(a)},
-$isEH:true},
-e215:{
-"^":"Tp:13;",
-$1:function(a){return a.gdN()},
-$isEH:true},
-e216:{
-"^":"Tp:13;",
-$1:function(a){return J.tp(a)},
-$isEH:true},
-e217:{
-"^":"Tp:13;",
-$1:function(a){return a.gaU()},
-$isEH:true},
-e218:{
-"^":"Tp:77;",
-$2:function(a,b){J.RX(a,b)},
-$isEH:true},
-e219:{
-"^":"Tp:77;",
-$2:function(a,b){J.a8(a,b)},
-$isEH:true},
-e220:{
-"^":"Tp:77;",
-$2:function(a,b){J.l7(a,b)},
-$isEH:true},
-e221:{
-"^":"Tp:77;",
-$2:function(a,b){J.kB(a,b)},
-$isEH:true},
-e222:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ae(a,b)},
-$isEH:true},
-e223:{
-"^":"Tp:77;",
-$2:function(a,b){J.IX(a,b)},
-$isEH:true},
-e224:{
-"^":"Tp:77;",
-$2:function(a,b){J.WI(a,b)},
-$isEH:true},
-e225:{
-"^":"Tp:77;",
-$2:function(a,b){J.NZ(a,b)},
-$isEH:true},
-e226:{
-"^":"Tp:77;",
-$2:function(a,b){J.T5(a,b)},
-$isEH:true},
-e227:{
-"^":"Tp:77;",
-$2:function(a,b){J.i0(a,b)},
-$isEH:true},
-e228:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sf(a,b)},
-$isEH:true},
-e229:{
-"^":"Tp:77;",
-$2:function(a,b){J.LM(a,b)},
-$isEH:true},
-e230:{
-"^":"Tp:77;",
-$2:function(a,b){J.qq(a,b)},
-$isEH:true},
-e231:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ac(a,b)},
-$isEH:true},
-e232:{
-"^":"Tp:77;",
-$2:function(a,b){J.Yz(a,b)},
-$isEH:true},
-e233:{
-"^":"Tp:77;",
-$2:function(a,b){a.sw2(b)},
-$isEH:true},
-e234:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qr(a,b)},
-$isEH:true},
-e235:{
-"^":"Tp:77;",
-$2:function(a,b){J.xW(a,b)},
-$isEH:true},
-e236:{
-"^":"Tp:77;",
-$2:function(a,b){J.BC(a,b)},
-$isEH:true},
-e237:{
-"^":"Tp:77;",
-$2:function(a,b){J.pB(a,b)},
-$isEH:true},
-e238:{
-"^":"Tp:77;",
-$2:function(a,b){J.NO(a,b)},
-$isEH:true},
-e239:{
-"^":"Tp:77;",
-$2:function(a,b){J.WB(a,b)},
-$isEH:true},
-e240:{
-"^":"Tp:77;",
-$2:function(a,b){J.JZ(a,b)},
-$isEH:true},
-e241:{
-"^":"Tp:77;",
-$2:function(a,b){J.fR(a,b)},
-$isEH:true},
-e242:{
-"^":"Tp:77;",
-$2:function(a,b){a.shY(b)},
-$isEH:true},
-e243:{
-"^":"Tp:77;",
-$2:function(a,b){J.uP(a,b)},
-$isEH:true},
-e244:{
-"^":"Tp:77;",
-$2:function(a,b){J.vJ(a,b)},
-$isEH:true},
-e245:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nf(a,b)},
-$isEH:true},
-e246:{
-"^":"Tp:77;",
-$2:function(a,b){J.Pl(a,b)},
-$isEH:true},
-e247:{
-"^":"Tp:77;",
-$2:function(a,b){J.C3(a,b)},
-$isEH:true},
-e248:{
-"^":"Tp:77;",
-$2:function(a,b){J.xH(a,b)},
-$isEH:true},
-e249:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nh(a,b)},
-$isEH:true},
-e250:{
-"^":"Tp:77;",
-$2:function(a,b){J.AI(a,b)},
-$isEH:true},
-e251:{
-"^":"Tp:77;",
-$2:function(a,b){J.nA(a,b)},
-$isEH:true},
-e252:{
-"^":"Tp:77;",
-$2:function(a,b){J.fb(a,b)},
-$isEH:true},
-e253:{
-"^":"Tp:77;",
-$2:function(a,b){a.siq(b)},
-$isEH:true},
-e254:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qy(a,b)},
-$isEH:true},
-e255:{
-"^":"Tp:77;",
-$2:function(a,b){a.sKt(b)},
-$isEH:true},
-e256:{
-"^":"Tp:77;",
-$2:function(a,b){J.cV(a,b)},
-$isEH:true},
-e257:{
-"^":"Tp:77;",
-$2:function(a,b){J.mU(a,b)},
-$isEH:true},
-e258:{
-"^":"Tp:77;",
-$2:function(a,b){J.Kz(a,b)},
-$isEH:true},
-e259:{
-"^":"Tp:77;",
-$2:function(a,b){J.uM(a,b)},
-$isEH:true},
-e260:{
-"^":"Tp:77;",
-$2:function(a,b){J.Er(a,b)},
-$isEH:true},
-e261:{
-"^":"Tp:77;",
-$2:function(a,b){J.uX(a,b)},
-$isEH:true},
-e262:{
-"^":"Tp:77;",
-$2:function(a,b){J.hS(a,b)},
-$isEH:true},
-e263:{
-"^":"Tp:77;",
-$2:function(a,b){J.mz(a,b)},
-$isEH:true},
-e264:{
-"^":"Tp:77;",
-$2:function(a,b){J.pA(a,b)},
-$isEH:true},
-e265:{
-"^":"Tp:77;",
-$2:function(a,b){a.sSK(b)},
-$isEH:true},
-e266:{
-"^":"Tp:77;",
-$2:function(a,b){a.shX(b)},
-$isEH:true},
-e267:{
-"^":"Tp:77;",
-$2:function(a,b){J.cl(a,b)},
-$isEH:true},
-e268:{
-"^":"Tp:77;",
-$2:function(a,b){J.Jb(a,b)},
-$isEH:true},
-e269:{
-"^":"Tp:77;",
-$2:function(a,b){J.xQ(a,b)},
-$isEH:true},
-e270:{
-"^":"Tp:77;",
-$2:function(a,b){J.MX(a,b)},
-$isEH:true},
-e271:{
-"^":"Tp:77;",
-$2:function(a,b){J.A4(a,b)},
-$isEH:true},
-e272:{
-"^":"Tp:77;",
-$2:function(a,b){J.wD(a,b)},
-$isEH:true},
-e273:{
-"^":"Tp:77;",
-$2:function(a,b){J.wJ(a,b)},
-$isEH:true},
-e274:{
-"^":"Tp:77;",
-$2:function(a,b){J.oJ(a,b)},
-$isEH:true},
-e275:{
-"^":"Tp:77;",
-$2:function(a,b){J.DF(a,b)},
-$isEH:true},
-e276:{
-"^":"Tp:77;",
-$2:function(a,b){J.h9(a,b)},
-$isEH:true},
-e277:{
-"^":"Tp:77;",
-$2:function(a,b){a.sL1(b)},
-$isEH:true},
-e278:{
-"^":"Tp:77;",
-$2:function(a,b){J.XF(a,b)},
-$isEH:true},
-e279:{
-"^":"Tp:77;",
-$2:function(a,b){J.SF(a,b)},
-$isEH:true},
-e280:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qv(a,b)},
-$isEH:true},
-e281:{
-"^":"Tp:77;",
-$2:function(a,b){J.Xg(a,b)},
-$isEH:true},
-e282:{
-"^":"Tp:77;",
-$2:function(a,b){J.aw(a,b)},
-$isEH:true},
-e283:{
-"^":"Tp:77;",
-$2:function(a,b){J.CJ(a,b)},
-$isEH:true},
-e284:{
-"^":"Tp:77;",
-$2:function(a,b){J.P2(a,b)},
-$isEH:true},
-e285:{
-"^":"Tp:77;",
-$2:function(a,b){J.fv(a,b)},
-$isEH:true},
-e286:{
-"^":"Tp:77;",
-$2:function(a,b){J.PP(a,b)},
-$isEH:true},
-e287:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sj(a,b)},
-$isEH:true},
-e288:{
-"^":"Tp:77;",
-$2:function(a,b){J.tv(a,b)},
-$isEH:true},
-e289:{
-"^":"Tp:77;",
-$2:function(a,b){J.w7(a,b)},
-$isEH:true},
-e290:{
-"^":"Tp:77;",
-$2:function(a,b){J.ME(a,b)},
-$isEH:true},
-e291:{
-"^":"Tp:77;",
-$2:function(a,b){J.kX(a,b)},
-$isEH:true},
-e292:{
-"^":"Tp:77;",
-$2:function(a,b){J.q0(a,b)},
-$isEH:true},
-e293:{
-"^":"Tp:77;",
-$2:function(a,b){J.EJ(a,b)},
-$isEH:true},
-e294:{
-"^":"Tp:77;",
-$2:function(a,b){J.iH(a,b)},
-$isEH:true},
-e295:{
-"^":"Tp:77;",
-$2:function(a,b){J.SO(a,b)},
-$isEH:true},
-e296:{
-"^":"Tp:77;",
-$2:function(a,b){J.B9(a,b)},
-$isEH:true},
-e297:{
-"^":"Tp:77;",
-$2:function(a,b){J.PN(a,b)},
-$isEH:true},
-e298:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVc(b)},
-$isEH:true},
-e299:{
-"^":"Tp:77;",
-$2:function(a,b){J.By(a,b)},
-$isEH:true},
-e300:{
-"^":"Tp:77;",
-$2:function(a,b){J.jd(a,b)},
-$isEH:true},
-e301:{
-"^":"Tp:77;",
-$2:function(a,b){J.Rx(a,b)},
-$isEH:true},
-e302:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZI(a,b)},
-$isEH:true},
-e303:{
-"^":"Tp:77;",
-$2:function(a,b){J.fa(a,b)},
-$isEH:true},
-e304:{
-"^":"Tp:77;",
-$2:function(a,b){J.Cu(a,b)},
-$isEH:true},
-e305:{
-"^":"Tp:77;",
-$2:function(a,b){a.sV8(b)},
-$isEH:true},
-e306:{
-"^":"Tp:77;",
-$2:function(a,b){J.Hn(a,b)},
-$isEH:true},
-e307:{
-"^":"Tp:77;",
-$2:function(a,b){J.Tx(a,b)},
-$isEH:true},
-e308:{
-"^":"Tp:77;",
-$2:function(a,b){a.sDo(b)},
-$isEH:true},
-e309:{
-"^":"Tp:77;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e310:{
-"^":"Tp:77;",
-$2:function(a,b){J.H3(a,b)},
-$isEH:true},
-e311:{
-"^":"Tp:77;",
-$2:function(a,b){J.t3(a,b)},
-$isEH:true},
-e312:{
-"^":"Tp:77;",
-$2:function(a,b){J.my(a,b)},
-$isEH:true},
-e313:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVF(b)},
-$isEH:true},
-e314:{
-"^":"Tp:77;",
-$2:function(a,b){J.yO(a,b)},
-$isEH:true},
-e315:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZU(a,b)},
-$isEH:true},
-e316:{
-"^":"Tp:77;",
-$2:function(a,b){J.tQ(a,b)},
-$isEH:true},
-e317:{
-"^":"Tp:77;",
-$2:function(a,b){J.tH(a,b)},
-$isEH:true},
-e318:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e319:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e322:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e323:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e324:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e325:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e326:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e329:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e330:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e331:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e332:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e333:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e334:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e335:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e336:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e337:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e338:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e339:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e340:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e341:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e342:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e343:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e344:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e345:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e346:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e347:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e348:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e349:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e350:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e351:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e352:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e353:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e354:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e355:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e356:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e357:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e358:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e359:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e360:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e361:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e362:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e363:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e364:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e365:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e366:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e367:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e368:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e369:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e371:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e372:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e373:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e374:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e375:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e376:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e377:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e378:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e379:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e387:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e388:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e389:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e390:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e391:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
-"^":"",
-G6:{
-"^":"Vc;BW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-grs:function(a){return a.BW},
-srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.r0(a.BW).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dw:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.C8.ZL(a)
-C.C8.XI(a)
-return a}}},
-Vc:{
-"^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
-"^":"",
-eW:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rt:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.YZz.ZL(a)
-C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
-z=this.ks
-if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!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;")
-u.$builtinTypeInfo=[null]
-t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
-eo:{
-"^":"Vfx;CA,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(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","gQ1",2,0,13,57],
-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)
-u.k7(null)
-z=u
-w=J.Mx(z)
-v=a.CA
-t=z
-s=H.VM([],[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.k7(t)
-w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
-y=w
-x=new H.XO(q,null)
-N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
-z=J.Lp(d)
-if(!!J.x(z).$istV)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{l0:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
-return a}}},
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true},
-nc:{
-"^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
-"^":"",
-aC:{
-"^":"Dsd;yB,mN,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gRu:function(a){return a.yB},
-sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gCF:function(a){return a.mN},
-sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,99,100],
-RF:[function(a,b){J.r0(a.yB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{lW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ka.ZL(a)
-C.ka.XI(a)
-return a}}},
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true},
-SS:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
-"^":"",
-VY:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,13,57],
-static:{On:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IK.ZL(a)
-C.IK.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
-"^":"",
-Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtT:function(a){return a.Xx},
-stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
-if(z==null)return
-J.SK(z).ml(new F.Bc())},
-RF:[function(a,b){J.r0(a.Xx).Qy(b)},"$1","gvC",2,0,20,90],
-m2:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
-if(z==="")return
-y=H.BU(z,null,null)
-x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
-if(x==null)return
-return x},
-YI:[function(a,b,c,d){var z=this.m2(a,d)
-if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,102,1,94,95],
-Lk:[function(a,b,c,d){var z=this.m2(a,d)
-if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,102,1,94,95],
-static:{f9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ux.ZL(a)
-C.ux.XI(a)
-return a}}},
-tuj:{
-"^":"uL+Pi;",
-$isd3:true},
-Bc:{
-"^":"Tp:103;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,81,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
-"^":"",
-JI:{
-"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-goE:function(a){return a.GV},
-soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
-gv8:function(a){return a.uo},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
-gFR:function(a){return a.nx},
-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.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,20,57],
-WM:[function(a){var z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
-ko:[function(a,b,c,d){var z=a.uo
-if(z===!0)return
-if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
-this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,80,46,47,81],
-static:{U9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.GV=!1
-a.uo=!1
-a.nx=null
-a.oM=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.O0.ZL(a)
-C.O0.XI(a)
-return a}}},
-Xfs:{
-"^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
-"^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!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.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-rd: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)
-if(!!y.$isWO){x=e
-w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.z8(J.ew(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)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("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())}},
-vf: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())}},
-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.ew(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.ew(x,1))C.Nm.u(c,x,w.t(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(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},
-ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
-else H.wR(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)
-w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
-v=w-1
-y.u(a,w,y.t(a,v))
-w=v}y.u(a,w,x)}},
-wR: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.cU(c-b+1,6)
-y=b+z
-x=c-z
-w=C.jn.cU(b+c,2)
-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.z8(d.$2(s,r),0)){n=r
-r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
-o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
-q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
-p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
-p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
-o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(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))
-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)
-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.Wx(i)
-if(h.D(i,0)){--l
-continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(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.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
-h=l+1
-t.u(a,c,t.t(a,h))
-t.u(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(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(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.ip(this,"aL",0)])},
-aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(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)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
-return this.Zv(0,J.bI(this.gB(this),1))},
-tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(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},
-Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(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""
-x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
-w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
-v=1
-for(;v<z;++v){w.vM+=b
-u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
-v=0
-for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
-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.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},31],
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(this,"aL",0)])
-C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(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)},
-$isyN:true},
-bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-if(y==null||J.z8(y,z))return z
-return y},
-gjX:function(){var z,y
-z=J.q8(this.l6)
-y=this.SH
-if(J.z8(y,z))return z
-return y},
-gB:function(a){var z,y,x
-z=J.q8(this.l6)
-y=this.SH
-if(J.J5(y,z))return 0
-x=this.AN
-if(x==null||J.J5(x,z))return J.bI(z,y)
-return J.bI(x,y)},
-Zv:function(a,b){var z=J.ew(this.gjX(),b)
-if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i9(this.l6,z)},
-eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.q9(this.l6,J.ew(this.SH,b),this.AN,null)},
-qZ:function(a,b){var z,y,x
-if(b<0)throw H.b(P.N(b))
-z=this.AN
-y=this.SH
-if(z==null)return H.q9(this.l6,y,J.ew(y,b),null)
-else{x=J.ew(y,b)
-if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
-Hd:function(a,b,c,d){var z,y,x
-z=this.SH
-y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
-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:{q9:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
-z.Hd(a,b,c,d)
-return z}}},
-a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
-G:function(){var z,y,x,w
-z=this.l6
-y=J.U6(z)
-x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
-if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
-return!0}},
-i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.MQ(this.l6))},
-$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])}}},
-xy:{
-"^":"i1;l6,T6",
-$isyN:true},
-MH:{
-"^":"Dk;lo,OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){var z=this.OI
-if(z.G()){this.lo=this.mb(z.gl())
-return!0}this.lo=null
-return!1},
-gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
-A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
-$asaL:function(a,b){return[b]},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-Mo:{
-"^":"Dk;OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
-return!1},
-gl:function(){return this.OI.gl()}},
-oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Wy(J.mY(this.l6),this.T6,C.Gw,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
-Wy:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
-G:function(){var z,y
-z=this.e0
-if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
-return!0}},
-FuS:{
-"^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-SU7:{
-"^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ark+Zl;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y,x
-z=this.CR
-y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
-return y.Zv(z,x-1-b)}},
-IN:{
-"^":"a;fN>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
-if(typeof z!=="number")return H.s(z)
-return 536870911&664597*z},
-bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
-$isIN:true,
-$isGD:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
-"^":"",
-kU:function(a){var z=H.VM(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
-return z}}],["dart.async","dart:async",,P,{
-"^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
-return P.K7()},
-ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
-VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.wY(a)},
-Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
-return z},
-YZ:function(a,b){var z,y,x,w,v
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
-y=z.c
-if(y===0)return P.Ab(C.dn,null)
-w=Array(y)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=v
-return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
-$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.Gh(b,c,d,a,null,0,null),[f])},
-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.HX(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=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
-return}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-SN:[function(a){},"$1","Ax",2,0,20,21],
-vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,22,23,24,25],
-p0:[function(){},"$0","od",0,0,18],
-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.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.dR(b,c,d))
-else b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.Q0(b,c))
-else b.rX(c)},
-rT:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
-z=$.X3
-return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},
-Us:function(a){var z=$.X3
-$.X3=a
-return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
-T8:[function(a,b,c,d){var z,y
-if(J.xC($.X3,c))return d.$0()
-z=P.Us(c)
-try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
-yv:[function(a,b,c,d,e){var z,y
-if(J.xC($.X3,c))return d.$1(e)
-z=P.Us(c)
-try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","Un",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)
-z=P.Us(c)
-try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-dL:[function(a,b,c,d){return d},"$4","v3",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-UA:[function(a,b,c,d,e){var z
-$.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Is",10,0,44],
-C6:{
-"^":"Tp:69;a",
-$0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
-Ik:{
-"^":"O9;Y8"},
-LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
-gY8:function(){return this.Y8},
-uR:function(a){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&1)===a},
-Ac:function(){var z=this.Ae
-if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&2)!==0},
-dK:function(){var z=this.Ae
-if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-static:{"^":"E2b,PR,id"}},
-Ks:{
-"^":"a;iE@,SJ@",
-gUF:function(){return!1},
-im:function(){var z=this.yx
-if(z!=null)return z
-z=P.Dt(null)
-this.yx=z
-return z},
-p1:function(a){var z,y
-z=a.gSJ()
-y=a.giE()
-z.siE(y)
-y.sSJ(z)
-a.sSJ(a)
-a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.od())
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
-return z}z=$.X3
-y=a?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
-x.$builtinTypeInfo=this.$builtinTypeInfo
-x.SJ=x
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
-y.siE(x)
-this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
-return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
-return new P.lj("Cannot add new events while doing an addStream")},
-h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},104],
-js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,105,23,24,25],
-S6:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.im()
-this.Pl()
-return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-YB:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-FW:function(a){var z,y,x,w
-z=this.Gv
-if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
-y=this.iE
-if(y===this)return
-x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
-if(typeof z!=="number")return z.k()
-y.sAe(z|2)
-a.$1(y)
-y.Ac()
-w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
-if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
-y=w}else y=y.giE()
-this.Gv&=4294967293
-if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.Ym)}},
-zW:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z=this.iE
-if(z===this)return
-if(z.giE()===this){this.Gv|=2
-this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.FW(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.FW(new P.ORH(this,a,b))},
-Pl:function(){if(this.iE!==this)this.FW(new P.eB(this))
-else this.yx.OH(null)}},
-tK:{
-"^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-ORH:{
-"^":"Tp;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-eB:{
-"^":"Tp;a",
-$1:function(a){a.YB()},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
-HX:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
-y.$builtinTypeInfo=[null]
-z.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
-Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
-b8:{
-"^":"a;",
-$isb8:true},
-w4:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y,x,w
-try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-mQ:{
-"^":"Tp:77;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,106,107,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:108;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.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-oh:{
-"^":"a;",
-$isoh:true},
-Pf0:{
-"^":"a;",
-$isoh:true},
-Zf:{
-"^":"Pf0;MM",
-j3:[function(a,b){var z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,109,23,21],
-w0:[function(a,b){var z
-if(a==null)throw H.b(P.u("Error must not be null"))
-z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gyr",2,2,105,23,24,25]},
-Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
-gcg:function(){return this.Gv>=4},
-gWj:function(){return this.Gv===4},
-gNm:function(){return this.Gv===8},
-swG:function(a){if(a)this.Gv=2
-else this.Gv=0},
-gO1:function(){return this.Gv===2?null:this.OY},
-gyK:function(){return this.Gv===2?null:this.As},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
-Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
-this.au(y)
-return y},
-ml:function(a){return this.Rx(a,null)},
-co: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.wY(b),y,null),[null])
-this.au(x)
-return x},
-OA:function(a){return this.co(a,null)},
-Qy:function(a){var z,y
-z=$.X3
-y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
-y.$builtinTypeInfo=this.$builtinTypeInfo
-this.au(y)
-return y},
-gDL:function(){return this.jk},
-gcG:function(){return this.jk},
-Am:function(a){this.Gv=4
-this.jk=a},
-E6:function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},
-au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
-else{a.sBQ(this.jk)
-this.jk=a}},
-L3:function(){var z,y,x
-z=this.jk
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
-z=J.x(a)
-if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
-else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
-P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-this.Am(a)
-P.HZ(this,z)},
-K5:[function(a,b){var z=this.L3()
-this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,22,23,24,25],
-OH:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.eX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.iX(this,a,b))},
-J9:function(a,b){this.OH(a)},
-X8:function(a,b,c){this.CG(a,b)},
-$isGc:true,
-$isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,dh",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},Vu: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.swG(!0)
-a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
-if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},yE:function(a,b){var z
-do{z=b.gBQ()
-b.sBQ(null)
-P.HZ(a,b)
-if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z={}
-z.e=a
-for(y=a;!0;){x={}
-if(!y.gcg())return
-w=z.e.gNm()
-if(w&&b==null){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}if(b==null)return
-if(b.gBQ()!=null){P.yE(z.e,b)
-return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
-x.d=!1
-y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
-if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}s=$.X3
-if(s==null?t!=null:s!==t)$.X3=t
-else s=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
-if(s!=null)$.X3=s
-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.Gv>=4){b.swG(!0)
-z.e=r
-y=r
-continue}else P.A9(r,b)
-else P.k3(r,b)
-return}}if(x.b===!0){q=b.L3()
-b.Am(x.c)}else{q=b.L3()
-v=x.c
-b.E6(J.w8(v),v.gI4())}z.e=b
-y=b
-b=q}}}},
-da:{
-"^":"Tp:69;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-U7:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-vr:{
-"^":"Tp:110;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-cX:{
-"^":"Tp:69;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-eX:{
-"^":"Tp:69;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-iX:{
-"^":"Tp:69;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-rq:{
-"^":"Tp:111;b,d,e,f",
-$0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
-return!0}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-this.b.c=new P.Ca(z,y)
-return!1}},
-$isEH:true},
-RW:{
-"^":"Tp:18;c,b,UI,bK",
-$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.c.e.gcG()
-r=this.UI
-y=r.gyK()
-x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
-w=r
-v=new H.XO(q,null)
-r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
-r.c=o
-r.b=!1
-return}u=r.go7()
-if(x===!0&&u!=null){try{r=u
-p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
-m=this.b
-if(p)m.c=n.mg(u,J.w8(z),z.gI4())
-else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
-t=r
-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
-r.c=o
-r.b=!1
-return}this.b.b=!0}else{r=this.b
-r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
-z={}
-z.a=null
-try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
-u=y
-u=v==null?u==null:v===u
-v=u}else v=!1
-u=this.b
-if(v)u.c=this.c.e.gcG()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
-this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
-$isEH:true},
-jZ:{
-"^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,112,"call"],
-$isEH:true},
-FZ:{
-"^":"Tp:110;a,mG",
-$2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){y=P.Dt(null)
-z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-OM:{
-"^":"a;FR>,aw@",
-Ki:function(a){return this.FR.$0()}},
-cb:{
-"^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},113],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},113],
-tg:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.kb(y),y.gaq())
-return y},
-aN:function(a,b){var z,y
-z={}
-y=P.Dt(null)
-z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.ib(y),y.gaq())
-return y},
-Vr:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
-return y},
-gB:function(a){var z,y
-z={}
-y=P.Dt(P.KN)
-z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
-return y},
-gl0:function(a){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
-return y},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
-grZ:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
-return y},
-$iscb:true},
-Sd:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Oh:{
-"^":"Tp:69;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-jvH:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-kb:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lz:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-at:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-mj:{
-"^":"Tp:13;",
-$1:function(a){},
-$isEH:true},
-ib:{
-"^":"Tp:69;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ia:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-WN:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-XPB:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-BSd:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-PI:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-uO:{
-"^":"Tp:69;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qg:{
-"^":"Tp:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Wd:{
-"^":"Tp:69;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
-xp:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-OC:{
-"^":"Tp:69;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-UH:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.a
-z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Z5:{
-"^":"Tp:69;a,c",
-$0:[function(){var z=this.a
-if(z.b){this.c.rX(z.a)
-return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-Oy:{
-"^":"a;",
-$isOy:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.qm(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-im:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-S6:function(a){var z=this.Gv
-if((z&4)!==0)return this.im()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.Pl()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.im()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.WG(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gYm()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.Qy(this.gYm())
-v=new P.A1(this)
-if(z!=null)z=z.Qy(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-A1:{
-"^":"Tp:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-Pl:function(){this.gEe().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.WG(a,b,null))},
-Pl:function(){this.gEe().w6(C.ZB)}},
-Gh:{
-"^":"ZzD;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"pe;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-pe:{
-"^":"nR+TT;"},
-O9:{
-"^":"ez;Y8",
-w4:function(a){return this.Y8.ET(a)},
-giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isO9)return!1
-return b.Y8===this.Y8},
-$isO9:true},
-yU:{
-"^":"KA;Y8<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gY8().m4(this)},"$0","gZ9",0,0,18]},
-NOT:{
-"^":"a;"},
-KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-yl:function(a){this.pN=this.Lj.wY(a)},
-fm:function(a,b){if(b==null)b=P.Mm()
-this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.od()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
-if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.Qy(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.FK()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if((z&8)!==0)return
-if(z>=128){z-=128
-this.Gv=z
-if(z<128){if((z&64)!==0){z=this.Ri
-z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.FK()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.WG(a,b,null))},
-YB:function(){var z=this.Gv
-if((z&8)!==0)return
-z=(z|2)>>>0
-this.Gv=z
-if(z<32)this.Pl()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
-if(z==null){z=new P.qm(null,null,0)
-this.Ri=z}z.h(0,a)
-y=this.Gv
-if((y&64)===0){y=(y|64)>>>0
-this.Gv=y
-if(y<128)this.Ri.t2(this)}},
-Iv:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-this.Lj.M8(this.pN,a)
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-pb:function(a,b){var z,y
-z=this.Gv
-y=new P.x1(this,a,b)
-if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.Qy(y)
-else y.$0()}else{y.$0()
-this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.Qy(z)
-else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-Kl:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
-z=z==null||z.gl0(z)}else z=!1
-else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
-return}y=(z&4)!==0
-if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
-$isOy:true,
-static:{"^":"Xx,bG,zC,Ir,nav,Dr,JAK,N3S,bsZ"}},
-x1:{
-"^":"Tp:18;a,b,c",
-$0:[function(){var z,y,x,w,v,u
-z=this.a
-y=z.Gv
-if((y&8)!==0&&(y&16)===0)return
-z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-ez:{
-"^":"cb;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.yl(a)
-z.fm(0,d)
-z.y5(c)
-return z},
-yI:function(a){return this.KR(a,null,null,null)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
-ti:{
-"^":"a;aw@"},
-fZ:{
-"^":"ti;P>,aw",
-dP:function(a){a.Iv(this.P)}},
-WG:{
-"^":"ti;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
-yRf:{
-"^":"a;",
-dP:function(a){a.Pl()},
-gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
-B3P:{
-"^":"a;",
-t2:function(a){var z=this.Gv
-if(z===1)return
-if(z>=1){this.Gv=1
-return}P.rb(new P.lg(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
-lg:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-z.Gv=0
-if(y===3)return
-z.TO(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qm:{
-"^":"B3P;zR,N6,Gv",
-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}},
-TO:function(a){var z,y
-z=this.zR
-y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
-z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
-this.N6=null
-this.zR=null}},
-EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-yl:function(a){},
-fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-Pl:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
-if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
-$isOy:true,
-static:{"^":"D4,ED7,Yi"}},
-dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-uR:{
-"^":"Tp:118;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-Q0:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"cb;",
-KR:function(a,b,c,d){var z,y,x,w,v
-b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
-x=$.X3
-w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.yl(a)
-v.fm(0,d)
-v.y5(c)
-return v},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-ut:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
-fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
-if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
-if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.ut(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},104],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,119,24,25],
-nn:[function(){this.YB()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
-$asKA:function(a,b){return[b]},
-$asOy:function(a,b){return[b]}},
-nO:{
-"^":"og;qs,Sb",
-wW:function(a){return this.qs.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.wW(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}if(z===!0)J.z4(b,a)},
-$asog:function(a){return[a,a]},
-$ascb:null},
-c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}J.z4(b,z)}},
-Bg:{
-"^":"og;pK,Sb",
-GW:function(a){return this.pK.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
-J.z4(b,z)}}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
-Xa:{
-"^":"a;"},
-Ob:{
-"^":"a;"},
-yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,il<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
-mg:function(a,b,c){return this.eo.$3(a,b,c)},
-Al:function(a){return this.Ka.$1(a)},
-wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$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.Zq.$2(a,b)},
-Ch:function(a,b){return this.JS.$1(b)},
-qp:function(a){return this.il.$1$specification(a)}},
-AN:{
-"^":"a;"},
-dl:{
-"^":"a;"},
-Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-x5:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().gcP()==null;)z=z.geT(z)
-return z.gtp().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().geo()==null;)z=z.geT(z)
-return z.gtp().geo().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-xO:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gil()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
-"^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
-bH:function(a){var z,y,x,w
-try{x=this.Gr(a)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-M8:function(a,b){var z,y,x,w
-try{x=this.FI(a,b)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-z8:function(a,b,c){var z,y,x,w
-try{x=this.mg(a,b,c)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
-ce:function(a){return this.xi(a,!0)},
-Nf:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
-up:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.wd(this,z)}},
-TF:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Tp:69;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Tp:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-wd:{
-"^":"Tp:77;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
-z=this.Se
-y=z.t(0,b)
-if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).x5(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).qG(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).xO(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
-Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
-FO:{
-"^":"Tp:69;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
-eM:{
-"^":"Tp:69;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Uez:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-gcP:function(){return P.lw()},
-Gr:function(a){return this.gcP().$1(a)},
-gOt:function(){return P.Un()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-geo:function(){return P.iy()},
-mg:function(a,b,c){return this.geo().$3(a,b,c)},
-gKa:function(){return P.Qk()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.v3()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.KF()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.aW()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gil:function(){return P.Is()},
-qp:function(a){return this.gil().$1$specification(a)}},
-R81:{
-"^":"fZi;",
-geT:function(a){return},
-gtp:function(){return C.dS},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
-t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.UA(this,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.T8(this,null,this,a)},
-FI:function(a,b){return P.yv(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
-Al:function(a){return a},
-wY:function(a){return a},
-O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
-"^":"",
-EF:function(a,b,c){return H.B7(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])},
-R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
-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.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
-l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
-Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
-return b+"..."+c}z=[]
-y=$.Ex()
-y.push(a)
-try{P.T4(a,z)}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}y=P.p9(b)
-y.We(z,", ")
-y.KF(c)
-return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(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.gvM()},
-nH:function(a){var z,y
-for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
-return!1},
-T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
-y=0
-x=0
-while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
-b.push(w)
-y+=w.length+2;++x}if(!z.G()){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))
-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
-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("...")
-return}}u=H.d(t)
-v=H.d(s)
-y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-q="..."}else q=null
-while(!0){if(!(y>80&&b.length>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2
-if(q==null){y+=5
-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])},
-vW:function(a){var z,y
-z={}
-if(P.nH(a))return"{...}"
-y=P.p9("")
-try{$.Ex().push(a)
-y.KF("{")
-z.a=!0
-J.Me(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
-if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
-bA:{
-"^":"a;X5,vv,OX,OB,wV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-return y==null?!1:y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
-t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-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.OX
-if(w==null)y=null
-else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(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.vv
-if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
-if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return;--this.X5
-this.wV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-aN:function(a,b){var z,y,x,w
-z=this.Ig()
-for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-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.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-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.wV=y
-return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
-if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.wV=null
-return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isZ0:true,
-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},SQ:function(){var z=Object.create(null)
-P.cW(z,"<non-identifier-key>",z)
-delete z["<non-identifier-key>"]
-return z}}},
-oi:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-DJ:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
-PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1}},
-Fq:{
-"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.bA.prototype.Zt.call(this,a)},
-Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},
-bu:function(a){return P.vW(this)},
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
-jG:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
-for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
-$isyN:true},
-EQ:{
-"^":"a;Fb,wV,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-if(y==null)return!1
-return y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(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.vv
-if(z==null)return
-y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null)return
-y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return y[x].gcA()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
-to:function(a,b){var z
-if(this.x4(a))return this.t(0,a)
-z=b.$0()
-this.u(0,a,z)
-return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
-if(a==null)return
-z=a[b]
-if(z==null)return
-this.Vb(z)
-delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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].gkh(),b))return y
-return-1},
-bu:function(a){return P.vW(this)},
-$isFo:true,
-$isZ0:true,
-static:{Jc:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-a1:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-pk:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
-"^":"a;kh<,cA@,DG@,zQ@"},
-i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
-return y},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh())
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
-$isyN:true},
-N6:{
-"^":"a;Fb,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh()
-this.zq=this.zq.gDG()
-return!0}}}},
-jg:{
-"^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),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},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV: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.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.UQ(y,x)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.V5()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.DM=null
-return!0},
-FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1;--this.X5
-this.DM=null
-y.splice(x,1)
-return!0},
-V1:function(a){if(this.X5>0){this.DM=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-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.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-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.DM=y
-return y},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.DM=null
-return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
-return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{V5:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-cN:{
-"^":"a;O2,DM,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.DM
-y=this.zi
-x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-D0:{
-"^":"lN;X5,vv,OX,OB,H9,lX,zN",
-gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV: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.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.Nq(J.UQ(y,x))},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
-return!0},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
-return!0},
-Nv:function(a,b){var z
-if(a==null)return!1
-z=a[b]
-if(z==null)return!1
-this.Vb(z)
-delete a[b]
-return!0},
-xf:function(a){var z,y
-z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-tj:{
-"^":"a;Gc>,DG@,zQ@"},
-zQ:{
-"^":"a;O2,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
-return!0}}}},
-Yp:{
-"^":"w2Y;G4",
-gB:function(a){return this.G4.length},
-t:function(a,b){var z=this.G4
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]}},
-lN:{
-"^":"Vj;"},
-mW:{
-"^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
-return!1},
-aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
-zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
-br:function(a){return this.tt(a,!0)},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
-return y},
-gl0:function(a){return!this.gA(this).G()},
-gor:function(a){return this.gl0(this)!==!0},
-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())
-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.Ix(this,"(",")")},
-$isQV:true,
-$asQV:null},
-ark:{
-"^":"E9h;"},
-E9h:{
-"^":"a+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-lD:{
-"^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:function(a,b){return this.t(a,b)},
-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},
-gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
-return this.t(a,this.gB(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},
-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=P.p9("")
-z.We(a,b)
-return z.vM},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
-eR:function(a,b){return H.q9(a,b,null,null)},
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y}return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
-FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
-V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
-Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
-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)))
-z=c-b
-if(z===0)return
-if(e<0)throw H.b(P.u(e))
-y=J.x(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))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-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
-return-1},
-u8: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
-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)},
-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)
-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)
-this.Mh(a,b,c)},
-Mh:function(a,b,c){var z,y
-z=J.x(c)
-if(!!z.$isWO)this.vg(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,"[","]")},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-W0:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
-z.a=!1
-z=this.b
-z.KF(a)
-z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,121,64,"call"],
-$isEH:true},
-Sw:{
-"^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
-if(y<0||y>=x.length)return H.e(x,y)
-b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
-z=this.av
-y=this.eZ
-if(z===y)throw H.b(H.DU())
-z=this.v5
-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.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
-return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
-FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
-w=this.v5
-v=w.length
-if(x>=v){u=P.Pd(x)
-if(typeof u!=="number")return H.s(u)
-w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.GP(t)
-this.v5=t
-this.av=0
-H.qG(t,y,x,b,0)
-this.eZ+=z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ+=z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}++this.qT},
-V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.eZ=0
-this.av=0;++this.qT}},
-bu:function(a){return P.WE(this,"{","}")},
-AR:function(){var z,y,x,w
-z=this.av
-if(z===this.eZ)throw H.b(H.DU());++this.qT
-y=this.v5
-x=y.length
-if(z>=x)return H.e(y,z)
-w=y[z]
-y[z]=null
-this.av=(z+1&x-1)>>>0
-return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
-z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.M9();++this.qT},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.Kp(this,0)])
-z=this.v5
-x=this.av
-w=z.length-x
-H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
-H.qG(y,w,w+z,x,0)
-this.av=0
-this.eZ=this.v5.length
-this.v5=y},
-GP:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
-z=this.eZ
-y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},
-Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.v5=H.VM(z,[b])},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"TNe",Pd:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
-for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
-KG:{
-"^":"a;Lz,pP,qT,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.v5
-x=z.length
-if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
-return!0}},
-lfu:{
-"^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(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())},
-Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
-tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
-v=x+1
-if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},
-br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:function(a){return P.WE(this,"{","}")},
-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.Kp(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
-aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
-zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-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())
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:null},
-Vj:{
-"^":"lfu;"},
-oz:{
-"^":"a;G3>,Bb>,T8>",
-$isoz:true},
-jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
-Xt:{
-"^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
-if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
-u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(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
-x=z
-z=s}else{if(u.C(v,0)){u=z.T8
-if(u==null)break
-v=this.yV(u.G3,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
-w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.aY=z
-y.T8=null
-y.Bb=null;++this.bb
-return v},
-K8:function(a,b){var z,y;++this.J0;++this.qT
-if(this.aY==null){this.aY=a
-return}z=J.u6(b,0)
-y=this.aY
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
-Ba:{
-"^":"Xt;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Ef:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
-return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(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.aY==null},
-gor:function(a){return this.aY!=null},
-aN:function(a,b){var z,y,x
-z=H.Kp(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
-for(;y.G();){x=y.gl()
-z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-this.J0=0;++this.qT},
-gvc:function(){return H.VM(new P.nF(this),[H.Kp(this,0)])},
-gUQ:function(a){var z=new P.ro(this)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-bu:function(a){return P.vW(this)},
-$isBa:true,
-$asXt:function(a,b){return[a]},
-$asZ0:null,
-$isZ0: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])}}},
-An:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"Ba")}},
-S6B:{
-"^":"a;",
-gl:function(){var z=this.ya
-if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
-C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
-z=y.pop()
-this.ya=z
-this.Az(z.T8)
-return!0},
-Qf:function(a,b){this.Az(a.aY)}},
-nF:{
-"^":"mW;lT",
-gB:function(a){return this.lT.J0},
-gl0:function(a){return this.lT.J0===0},
-gA:function(a){var z,y
-z=this.lT
-y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,0))
-return y},
-$isyN:true},
-ro:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.J0},
-gl0:function(a){return this.Fb.J0===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,1))
-return y},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
-ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
-$asS6B:function(a,b){return[b]}},
-HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
-"^":"",
-VQ:function(a,b){var z=b==null?new P.hW():b
-return z.$2(null,new P.f1(z).$1(a))},
-jc:function(a,b){var z,y,x,w
-x=a
-if(typeof x!=="string")throw H.b(P.u(a))
-z=null
-try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-NC:[function(a){return a.Lt()},"$1","bx",2,0,49,50],
-hW:{
-"^":"Tp:77;",
-$2:function(a,b){return b},
-$isEH:true},
-f1:{
-"^":"Tp:13;a",
-$1:function(a){var z,y,x,w,v,u,t
-if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){z=a
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
-$isEH:true},
-Ukr:{
-"^":"a;"},
-zF:{
-"^":"a;"},
-Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-AJ:{
-"^":"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."},
-static:{Gy:function(a,b){return new P.AJ(a,b)}}},
-K8:{
-"^":"AJ;Ct,FN",
-bu:function(a){return"Cyclic error in JSON stringify"},
-static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
-"^":"Ukr;qa<,fO",
-pW:function(a,b){return P.jc(a,this.gHe().qa)},
-kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
-gZE:function(){return C.Sr},
-gHe:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
-ojF:{
-"^":"zF;UM,SI",
-$aszF:function(){return[P.a,P.qU]}},
-c5:{
-"^":"zF;qa<",
-$aszF:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"a;fO,p8,ol",
-iY:function(a){return this.fO.$1(a)},
-Ip:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=z.gB(a)
-if(typeof y!=="number")return H.s(y)
-x=this.p8
-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.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-switch(u){case 8:t=H.Lw(98)
-x.vM+=t
-break
-case 9:t=H.Lw(116)
-x.vM+=t
-break
-case 10:t=H.Lw(110)
-x.vM+=t
-break
-case 12:t=H.Lw(102)
-x.vM+=t
-break
-case 13:t=H.Lw(114)
-x.vM+=t
-break
-default:t=H.Lw(117)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=u>>>4&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-t=u&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-t=H.Lw(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
-WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
-if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-C7:function(a){var z,y,x,w
-if(!this.IS(a)){this.WD(a)
-try{z=this.iY(a)
-if(!this.IS(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
-if(0>=x.length)return H.e(x,0)
-x.pop()}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.Gy(a,y))}}},
-IS:function(a){var z,y,x,w,v,u
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.p8.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.p8.KF("true")
-return!0}else if(a===!1){this.p8.KF("false")
-return!0}else if(a==null){this.p8.KF("null")
-return!0}else if(typeof a==="string"){z=this.p8
-z.KF("\"")
-this.Ip(a)
-z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.p8
-y.KF("[")
-if(z.gB(a)>0){this.C7(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.C7(z.t(a,x))}}y.KF("]")
-this.pg(a)
-return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.p8
-y.KF("{")
-for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
-this.pg(a)
-return!0}else return!1}},
-pg:function(a){var z=this.ol
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,NoV,HVe,tF,BLm,KQz,i6,ql,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.bx()
-z=P.p9("")
-P.xl(z,b,c).C7(a)
-return z.vM}}},
-u5F:{
-"^":"Ziv;Iy",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"zF;",
-WJ:function(a){var z,y,x
-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.Yu(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
-$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
-Yu:{
-"^":"a;aQ,L8,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.L8
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.L8=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.L8=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
-this.L8=y+1
-if(y>=v)return H.e(z,y)
-z[y]=128|a&63
-return!1}},
-rw: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.IT
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
-if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
-t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
-s=u+1
-if(s>=y)break
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
-if(u+2>=y)break
-s=u+1
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.L8=u
-if(s>=y)return H.e(z,s)
-z[s]=128|v>>>6&63
-this.L8=u+1
-if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
-"^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,51,46,47],
-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.vM="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
-v-=16}w=H.Lw(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
-else{w=H.Lw(v)
-w=z.vM+=w}}y=w+"\""
-z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},
-FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-xv:[function(a){return H.CU(a)},"$1","J2K",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
-F:function(a,b,c){var z,y
-z=H.VM([],[c])
-for(y=J.mY(a);y.G();)z.push(y.gl())
-if(b)return z
-z.fixed$length=init
-return z},
-FL:function(a){var z,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},
-qa:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
-$isEH:true},
-CL:{
-"^":"Tp:122;a",
-$2:function(a,b){var z=this.a
-if(z.b>0)z.a.KF(", ")
-z.a.KF(J.GL(a))
-z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
-a2:{
-"^":"a;",
-$isa2:true},
-"+bool":0,
-Rz:{
-"^":"a;"},
-iP:{
-"^":"a;y3<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.oE(this.y3,b.gy3())},
-giO:function(a){return this.y3},
-bu:function(a){var z,y,x,w,v,u,t,s
-z=this.aL
-y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
-x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
-w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
-v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
-u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
-t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-s=P.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},
-h:function(a,b){return P.Wu(J.ew(this.y3,b.gVs()),this.aL)},
-EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
-$isiP:true,
-static:{"^":"bS,Vp8,Hq,Kw,h2,KL,EQe,NXt,Hm,Xs,Fz,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",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,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
-if(z!=null){y=new P.MF()
-x=z.QK
-if(1>=x.length)return H.e(x,1)
-w=H.BU(x[1],null,null)
-if(2>=x.length)return H.e(x,2)
-v=H.BU(x[2],null,null)
-if(3>=x.length)return H.e(x,3)
-u=H.BU(x[3],null,null)
-if(4>=x.length)return H.e(x,4)
-t=y.$1(x[4])
-if(5>=x.length)return H.e(x,5)
-s=y.$1(x[5])
-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.LL(J.vX(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(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)
-l=J.ew(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(s,n*l)}k=!0}else k=!1
-j=H.fu(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},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)
-y=a<0?"-":""
-if(z>=1000)return""+a
-if(z>=100)return y+"0"+H.d(z)
-if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},pV:function(a){if(a>=100)return""+a
-if(a>=10)return"0"+a
-return"00"+a},h0:function(a){if(a>=10)return""+a
-return"0"+a}}},
-MF:{
-"^":"Tp:123;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
-Rq:{
-"^":"Tp:124;",
-$1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
-"+double":0,
-a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),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.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
-bu:function(a){var z,y,x,w,v
-z=new P.DW()
-y=this.Fq
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
-v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
-$isa6:true,
-static:{"^":"Bp7,v7,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,MV,IJZ,D9,Wr,fm,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
-P7:{
-"^":"Tp:15;",
-$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},
-DW:{
-"^":"Tp:15;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
-XS:{
-"^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isXS:true},
-LK:{
-"^":"XS;",
-bu:function(a){return"Throw of null."}},
-AT:{
-"^":"XS;G1>",
-bu:function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},
-static:{u:function(a){return new P.AT(a)}}},
-Sn:{
-"^":"AT;G1",
-bu:function(a){return"RangeError: "+H.d(this.G1)},
-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))}}},
-Np:{
-"^":"XS;",
-static:{EY:function(){return new P.Np()}}},
-JS:{
-"^":"XS;uF,UP,mP,SA,vG",
-bu: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.vM+=", "}v=z.a
-if(x<0)return H.e(y,x)
-u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
-$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},
-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"},
-$isXS:true,
-static:{SY:function(a){return new P.rM(a)}}},
-lj:{
-"^":"XS;G1>",
-bu:function(a){return"Bad state: "+this.G1},
-static:{w:function(a){return new P.lj(a)}}},
-UV:{
-"^":"XS;YA",
-bu:function(a){var z=this.YA
-if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
-static:{a4:function(a){return new P.UV(a)}}},
-qn:{
-"^":"a;",
-bu:function(a){return"Out of Memory"},
-gI4:function(){return},
-$isXS:true},
-KY:{
-"^":"a;",
-bu:function(a){return"Stack Overflow"},
-gI4:function(){return},
-$isXS:true},
-t7:{
-"^":"XS;Wo",
-bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
-static:{Gz:function(a){return new P.t7(a)}}},
-HG:{
-"^":"a;G1>",
-bu:function(a){var z=this.G1
-if(z==null)return"Exception"
-return"Exception: "+H.d(z)}},
-oe:{
-"^":"a;G1>",
-bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.oe(a)}}},
-eV:{
-"^":"a;",
-bu:function(a){return"IntegerDivisionByZeroException"},
-static:{ts:function(){return new P.eV()}}},
-qo:{
-"^":"a;oc>",
-bu:function(a){return"Expando:"+H.d(this.oc)},
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
-u: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.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
-z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
-EH:{
-"^":"a;",
-$isEH:true},
-KN:{
-"^":"FK;",
-$isKN:true},
-"+int":0,
-QV:{
-"^":"a;",
-$isQV:true,
-$asQV:null},
-Dk:{
-"^":"a;"},
-WO:{
-"^":"a;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
-Z0:{
-"^":"a;",
-$isZ0:true},
-c8:{
-"^":"a;",
-bu:function(a){return"null"}},
-"+Null":0,
-FK:{
-"^":"a;",
-$isFK:true},
-"+num":0,
-a:{
-"^":";",
-n:function(a,b){return this===b},
-giO:function(a){return H.eQ(this)},
-bu:function(a){return H.a5(this)},
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
-$isa:true},
-ns:{
-"^":"a;",
-$isns:true},
-mE:{
-"^":"a;"},
-VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.Ms()
-else{z=H.Ms()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
-WU:{
-"^":"a;Cb,R7,C3,Wn",
-gl:function(){return this.Wn},
-G:function(){var z,y,x,w,v,u
-z=this.C3
-this.R7=z
-y=this.Cb
-x=y.length
-if(z===x){this.Wn=null
-return!1}w=C.xB.j(y,z)
-v=this.R7+1
-if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
-return!0}},
-Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=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.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
-y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:function(a){return this.vM},
-PD:function(a){if(typeof a==="string")this.vM=a
-else this.KF(a)},
-static:{p9:function(a){var z=new P.Rn("")
-z.PD(a)
-return z}}},
-GD:{
-"^":"a;",
-$isGD:true},
-uq:{
-"^":"a;",
-$isuq:true},
-q5:{
-"^":"a;Bo,IE,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.IE,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.IE},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.uF()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.R7(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.xC(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.xC(z[0],"")}else v=!0
-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
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.IE,0)){z.KF(":")
-z.KF(J.AG(this.IE))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.IE=0
-else if(h==="https"&&J.xC(e,443))this.IE=0
-else this.IE=e
-this.pO=this.x6(c,d)},
-$isq5:true,
-static:{"^":"QqF,q7,rU,v5,vI,ilf,Imi,IL,Bd,XrJ,G9,fC,O5i,FsP,j3,mo,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,Sp,GPf,JA7,wo,xd,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.NL,q)
-q=(C.NL[q]&C.jn.W4(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.Wf(h)
-z=new P.q5(P.mA(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},mA:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},Wf:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.NL,u)
-u=(C.NL[u]&C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.KM()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.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.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-r=J.q8(s)
-if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
-s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
-p=J.xC(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(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.lf(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.$1("invalid end of IPv6 address.")}}if(u){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=new H.oA(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
-if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM}}},
-jY:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-Uo:{
-"^":"Tp:126;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
-$isEH:true},
-QU:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.rs,z)
-z=(C.rs[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-uF:{
-"^":"Tp:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
-$isEH:true},
-yZ:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
-Al:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Tp:125;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-KM:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Tp:126;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"Tp:126;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"Tp:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
-XZ:{
-"^":"Tp:127;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
-$isEH:true},
-JV:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
-$isEH:true},
-Nw:{
-"^":"Tp:13;a",
-$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,128,"call"],
-$isEH:true},
-x8:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
-$isEH:true},
-JT:{
-"^":"Tp:88;a,b",
-$2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
-$isEH:true},
-d9:{
-"^":"Tp:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
-rI:{
-"^":"Tp:77;",
-$2:function(a,b){var z=J.Wx(a)
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
-"^":"",
-H9:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.QD(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isZ0){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.bL(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
-return z},
-r3:function(a,b){return document.createElement(a)},
-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.kP(x,"GET",a,!0)
-e.aN(0,new W.bU(x))
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.Tf(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
-z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(y.gyr()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
-ED:function(a){var z,y
-z=document.createElement("input",null)
-if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
-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("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-ju:function(a){return a},
-Z9:function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},
-Gi:function(a,b){return new W.uY(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,13,54],
-Hx:[function(a){return J.Z2(a)},"$1","HM",2,0,13,54],
-zI:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","QN",8,0,55,54,56,57,58],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(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.m0(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.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.B4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.QN(),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)},
-aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
-return $.X3.Nf(a,!0)},
-Fs:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.up(a,!0)},
-Bo:{
-"^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ao|xc|LPc|hV|uL|Vc|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V4|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|ou|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|F1|V42|ov|oEY|kn|V43|fI|V44|zM|V45|Rk|V46|Ti|KAf|CY|V47|nm|V48|uw|I5|V49|el"},
-Yyn:{
-"^":"Gv;",
-$isWO:true,
-$asWO:function(){return[W.QI]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.QI]},
-"%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target=,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAreaElement"},
-rZg:{
-"^":"Bo;mH:href%,N:target=",
-"%":"HTMLBaseElement"},
-O4:{
-"^":"Gv;t5:type=",
-$isO4:true,
-"%":";Blob"},
-Fy:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLBodyElement"},
-Ox:{
-"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
-"%":"HTMLButtonElement"},
-Ny:{
-"^":"Bo;fg:height},R:width}",
-gVE:function(a){return a.getContext("2d")},
-"%":"HTMLCanvasElement"},
-Oi:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
-Gcw:{
-"^":"Oi;",
-A8:function(a,b,c,d,e,f,g,h){var z
-if(g!=null)z=!0
-else z=!1
-if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
-"%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
-"%":"Comment;CharacterData"},
-QQS:{
-"^":"ea;tT:code=",
-"%":"CloseEvent"},
-di:{
-"^":"w6O;Rn:data=",
-"%":"CompositionEvent"},
-eC:{
-"^":"ea;M3:_dartDetail}",
-gey:function(a){var z=a._dartDetail
-if(z!=null)return z
-return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$iseC:true,
-"%":"CustomEvent"},
-Q3:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDetailsElement"},
-rV:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDialogElement"},
-QF:{
-"^":"KV;",
-Xf:function(a){return a.createDocumentFragment()},
-Kb:function(a,b){return a.getElementById(b)},
-ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.RO(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isQF:true,
-"%":"XMLDocument;Document"},
-Aj:{
-"^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
-return a._docChildren},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
-"%":";DocumentFragment"},
-rz:{
-"^":"Gv;G1:message=,oc:name=",
-"%":";DOMError"},
-BK:{
-"^":"Gv;G1:message=",
-goc:function(a){var z=a.name
-if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
-if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
-return z},
-bu:function(a){return a.toString()},
-$isBK:true,
-"%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
-gQg:function(a){return new W.E9(a)},
-gks: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.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
-Es:function(a){},
-dQ:function(a){},
-wN:function(a,b,c,d){},
-gqn:function(a){return a.localName},
-gKD:function(a){return a.namespaceURI},
-bu:function(a){return a.localName},
-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"))},
-X3:function(a,b){var z=a
-do{if(J.RF(z,b))return!0
-z=z.parentElement}while(z!=null)
-return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
-Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
-lC:{
-"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLEmbedElement"},
-Ty:{
-"^":"ea;kc:error=,G1:message=",
-"%":"ErrorEvent"},
-ea:{
-"^":"Gv;It:_selector},Ii:path=,t5:type=",
-gCa:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
-$isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
-PZ:{
-"^":"Gv;",
-gI:function(a){return new W.Jn(a)},
-YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-BG:function(a,b,c){c=H.tR(c,1)
-return a.addEventListener(b,c)},
-H2:function(a,b){return a.dispatchEvent(b)},
-Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
-"%":";EventTarget"},
-hD:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLFieldSetElement"},
-hH:{
-"^":"O4;oc:name=",
-$ishH:true,
-"%":"File"},
-nS:{
-"^":"rz;tT:code=",
-"%":"FileError"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target=",
-"%":"HTMLFormElement"},
-c4:{
-"^":"Gv;B: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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"QF;",
-gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
-"%":"HTMLDocument"},
-fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
-gbA:function(a){return W.Z9(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
-kP:function(a,b,c,d){return a.open(b,c,d)},
-wR:function(a,b){return a.send(b)},
-$isfJ:true,
-"%":"XMLHttpRequest"},
-rk:{
-"^":"PZ;",
-"%":";XMLHttpRequestEventTarget"},
-GJ:{
-"^":"Bo;fg:height},oc:name%,R:width}",
-"%":"HTMLIFrameElement"},
-Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
-$isSg:true,
-"%":"ImageData"},
-SL:{
-"^":"Bo;fg:height},R:width}",
-j3:function(a,b){return a.complete.$1(b)},
-"%":"HTMLImageElement"},
-Mi:{
-"^":"Bo;d4:checked%,MB:form=,fg:height},jx:list=,oc:name%,t5:type%,P:value%,R:width}",
-RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true,
-"%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLKeygenElement"},
-Gx:{
-"^":"Bo;P:value%",
-"%":"HTMLLIElement"},
-xT:{
-"^":"Bo;MB:form=",
-"%":"HTMLLabelElement"},
-mF:{
-"^":"Bo;MB:form=",
-"%":"HTMLLegendElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type%",
-"%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;mH:href=,yv:protocol=",
-RE:function(a){return a.reload()},
-bu:function(a){return a.toString()},
-"%":"Location"},
-p8:{
-"^":"Bo;oc:name%",
-"%":"HTMLMapElement"},
-eL:{
-"^":"Bo;kc:error=",
-xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"TH<"}},
-mCi:{
-"^":"Gv;tT:code=",
-"%":"MediaError"},
-Br:{
-"^":"Gv;tT:code=",
-"%":"MediaKeyError"},
-wq:{
-"^":"ea;G1:message=",
-"%":"MediaKeyEvent"},
-W7:{
-"^":"ea;G1:message=",
-"%":"MediaKeyMessageEvent"},
-Rv:{
-"^":"PZ;jO:id=,ph:label=",
-"%":"MediaStream"},
-AW:{
-"^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-$isAW:true,
-"%":"MessageEvent"},
-EeC:{
-"^":"Bo;jb:content=,oc:name%",
-"%":"HTMLMetaElement"},
-tJ:{
-"^":"Bo;P:value%",
-"%":"HTMLMeterElement"},
-Hw:{
-"^":"ea;Rn:data=",
-"%":"MIDIMessageEvent"},
-yt:{
-"^":"Imr;",
-fZ: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=",
-"%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.ju(p))
-return},
-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.Yq(J.tG(z)))
-return H.VM(new P.hL(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
-"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.tN(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-y.$2("attributeFilter",c)
-a.observe(b,z)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
-"%":"MutationObserver|WebKitMutationObserver"},
-Vv:{
-"^":"Gv;N:target=,t5:type=",
-"%":"MutationRecord"},
-qT:{
-"^":"Gv;G1:message=,oc:name=",
-"%":"NavigatorUserMediaError"},
-KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
-try{z=a.parentNode
-J.ky(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.NL
-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)},
-pj: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},
-mx:function(a,b){return a.appendChild(b)},
-tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-dR: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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"NodeList|RadioNodeList"},
-VSm:{
-"^":"Bo;t5:type%",
-"%":"HTMLOListElement"},
-G77:{
-"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLObjectElement"},
-l9:{
-"^":"Bo;ph:label%",
-"%":"HTMLOptGroupElement"},
-Qlt:{
-"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isQlt:true,
-"%":"HTMLOptionElement"},
-wL2:{
-"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
-"%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
-"%":"HTMLParamElement"},
-f5:{
-"^":"ea;",
-$isf5:true,
-"%":"PopStateEvent"},
-mg:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"PositionError"},
-qW:{
-"^":"nx;N:target=",
-"%":"ProcessingInstruction"},
-KR:{
-"^":"Bo;P:value%",
-"%":"HTMLProgressElement"},
-kf:{
-"^":"ea;ox:loaded=",
-$iskf:true,
-"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
-"^":"kf;O3:url=",
-"%":"ResourceProgressEvent"},
-j2:{
-"^":"Bo;t5:type%",
-"%":"HTMLScriptElement"},
-Eag:{
-"^":"ea;i6:lineNumber=",
-"%":"SecurityPolicyViolationEvent"},
-bs:{
-"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$isbs:true,
-"%":"HTMLSelectElement"},
-I0:{
-"^":"Aj;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
-"%":"ShadowRoot"},
-yNV:{
-"^":"Bo;t5:type%",
-"%":"HTMLSourceElement"},
-S2:{
-"^":"ea;kc:error=,G1:message=",
-"%":"SpeechRecognitionError"},
-r5:{
-"^":"ea;Cf:results=",
-"%":"SpeechRecognitionEvent"},
-vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
-"%":"SpeechRecognitionResult"},
-G5:{
-"^":"ea;oc:name=",
-"%":"SpeechSynthesisEvent"},
-kI:{
-"^":"ea;G3:key=,O3:url=",
-"%":"StorageEvent"},
-fqq:{
-"^":"Bo;t5:type%",
-"%":"HTMLStyleElement"},
-v6:{
-"^":"Bo;",
-$isv6:true,
-"%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-inA:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableElement"},
-tV:{
-"^":"Bo;RH:rowIndex=",
-iF:function(a,b){return a.insertCell(b)},
-$istV:true,
-"%":"HTMLTableRowElement"},
-BTK:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
-"^":"nx;",
-$ismw:true,
-"%":"CDATASection|Text"},
-AE:{
-"^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
-$isAE:true,
-"%":"HTMLTextAreaElement"},
-R0:{
-"^":"w6O;Rn:data=",
-"%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
-"^":"Bo;fY:kind%,ph:label%",
-"%":"HTMLTrackElement"},
-w6O:{
-"^":"ea;ey:detail=",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"eL;fg:height},R:width}",
-"%":"HTMLVideoElement"},
-K5:{
-"^":"PZ;oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr: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)},
-S6:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},
-D9:function(a,b,c){return this.kr(a,b,c,null)},
-bu:function(a){return a.toString()},
-gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-$isK5:true,
-$isPZ:true,
-"%":"DOMWindow|Window"},
-Bn:{
-"^":"KV;oc:name=,P:value%",
-"%":"Attr"},
-o5:{
-"^":"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)},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(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)
-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
-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)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
-$istn:true,
-$astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
-NfA:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLFrameSetElement"},
-rh:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-IT:{
-"^":"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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]},
-$isXj:true,
-"%":"SpeechRecognitionResultList"},
-VG:{
-"^":"ark;MW,wM",
-tg:function(a,b){return J.x5(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
-return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
-y=z.length
-x=this.MW
-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.SY(null))},
-V1:function(a){J.r4(this.MW)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
-return z},
-grZ:function(a){var z=this.MW.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-$asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
-TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
-sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
-Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
-gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
-nJ:function(a,b){var z=C.t5.ad(this.Sn,new W.HU())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.nJ(a,b)
-return z}}},
-HU:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
-"^":"Gv;"},
-Jn:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
-DM:{
-"^":"Jn;WK:YO<,WK",
-t:function(a,b){var z,y
-z=$.Vp()
-y=J.rY(b)
-if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
-RAp:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
-"^":"RAp+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-Tf:{
-"^":"Tp:13;b,c",
-$1:[function(a){var z,y,x
-z=this.c
-y=z.status
-if(typeof y!=="number")return y.F()
-y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-tN:{
-"^":"Tp:77;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-h:function(a,b){this.NL.appendChild(b)},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
-xe:function(a,b,c){var z,y,x
-if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.NL
-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.NL
-y=z.childNodes
-if(b<0||b>=y.length)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"))},
-V1:function(a){J.r4(this.NL)},
-u:function(a,b,c){var z,y
-z=this.NL
-y=z.childNodes
-if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-$iswi:true,
-$asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
-nNL:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-w1p:{
-"^":"nNL+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-yoo:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-kEI:{
-"^":"yoo+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-zLC:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-x5e:{
-"^":"zLC+Gm;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-a7B:{
-"^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
-V1:function(a){var z
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
-aN:function(a,b){var z,y
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.$2(y,this.t(0,y))}},
-gvc:function(){var z,y,x,w
-z=this.MW.attributes
-y=H.VM([],[P.qU])
-for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
-y.push(J.O6(z[w]))}}return y},
-gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
-y=H.VM([],[P.qU])
-for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.FJ(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},
-$isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-E9:{
-"^":"a7B;MW",
-x4:function(a){return this.MW.hasAttribute(a)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
-Rz:function(a,b){var z,y
-z=this.MW
-y=z.getAttribute(b)
-z.removeAttribute(b)
-return y},
-gB:function(a){return this.gvc().length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.Siz(z))
-return z},
-p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
-OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
-return z}}},
-Xw:{
-"^":"Tp:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Siz:{
-"^":"Tp:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
-$isEH:true},
-Jt:{
-"^":"Tp:13;a",
-$1:function(a){return a.OS(this.a)},
-$isEH:true},
-I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-if(x.length!==0)z.h(0,x)}return z},
-p5:function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))}},
-FkO:{
-"^":"a;Ph",
-ly:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.ly(a,!1)}},
-RO:{
-"^":"cb;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
-return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"RO;DK,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"cb",0),null])},
-$iscb:true},
-ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-rg:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Uc:{
-"^":"cb;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"cb",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.cb,null],[P.Oy,null])),[null])
-z.xd(null)
-for(y=this.Qx,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
-v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.pY
-y.toString
-return H.VM(new P.Ik(y),[H.Kp(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)},
-$iscb:true},
-i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-Hb:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Ov:{
-"^":"Oy;VP,DK,Ph,G9,Sg",
-ed:function(){if(this.DK==null)return
-this.Jc()
-this.DK=null
-this.G9=null
-return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
-this.Jc()
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.FI(this.DK,this.Ph,z,this.Sg)},
-Jc:function(){var z=this.G9
-if(z!=null)J.pW(this.DK,this.Ph,z,this.Sg)}},
-qO:{
-"^":"a;pY,uZ",
-h:function(a,b){var z,y
-z=this.uZ
-if(z.x4(b))return
-y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.pY.gGj()))},
-Rz:function(a,b){var z=this.uZ.Rz(0,b)
-if(z!=null)z.ed()},
-S6:[function(a){var z,y
-for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-z.V1(0)
-this.pY.S6(0)},"$0","gJK",0,0,18],
-xd:function(a){this.pY=P.bK(this.gJK(this),null,!0,a)}},
-rC:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Gm:{
-"^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-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."))},
-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."))},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-V1:function(a){J.U2(this.xa)},
-t:function(a,b){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},
-sB:function(a,b){J.wg(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(this.xa,b,c)},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xa,b,c)},
-cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.O2(this.xa,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
-W9:{
-"^":"a;nj,vN,Nq,QZ",
-G:function(){var z,y
-z=this.Nq+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
-return!0}this.QZ=null
-this.Nq=y
-return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
-a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
-$isEH:true},
-dW:{
-"^":"a;Ui",
-geT:function(a){return W.P1(this.Ui.parent)},
-S6:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
-D9:function(a,b,c){return this.kr(a,b,c,null)},
-gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Si:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isPZ:true,
-static:{P1:function(a){if(a===window)return a
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
-"^":"",
-hF:{
-"^":"Gv;",
-$ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
-"^":"",
-Y0Y:{
-"^":"tpr;N:target=,mH:href=",
-"%":"SVGAElement"},
-nI:{
-"^":"Rc;mH:href=",
-"%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEBlendElement"},
-bd:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
-"%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFECompositeElement"},
-W1:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEConvolveMatrixElement"},
-mCz:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDisplacementMapElement"},
-ha:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEFloodElement"},
-ym:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEGaussianBlurElement"},
-meI:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
-"%":"SVGFEImageElement"},
-oBW:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEOffsetElement"},
-Ubr:{
-"^":"d5;x=,y=",
-"%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFESpecularLightingElement"},
-pQ:{
-"^":"d5;x=,y=",
-"%":"SVGFESpotLightElement"},
-Qya:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFETileElement"},
-Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
-"%":"SVGFETurbulenceElement"},
-OE5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGFilterElement"},
-N9:{
-"^":"tpr;x=,y=",
-"%":"SVGForeignObjectElement"},
-d0D:{
-"^":"tpr;",
-"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
-"^":"d5;",
-"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-pAv:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGImageElement"},
-NBZ:{
-"^":"d5;x=,y=",
-"%":"SVGMaskElement"},
-Gr5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGPatternElement"},
-MU:{
-"^":"d0D;x=,y=",
-"%":"SVGRectElement"},
-j24:{
-"^":"d5;t5:type%,mH:href=",
-"%":"SVGScriptElement"},
-EUL:{
-"^":"d5;t5:type%",
-smk:function(a,b){a.title=b},
-"%":"SVGStyleElement"},
-d5:{
-"^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
-return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-$isPZ:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"JQ<"}},
-hy:{
-"^":"tpr;x=,y=",
-Kb:function(a,b){return a.getElementById(b)},
-$ishy:true,
-"%":"SVGSVGElement"},
-mHq:{
-"^":"tpr;",
-"%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
-"%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
-"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-ci:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGUseElement"},
-cuU:{
-"^":"d5;mH:href=",
-"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
-lF:function(){var z,y,x,w
-z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
-if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
-if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
-"^":"",
-QmI:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
-"^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
-XY:{
-"^":"a;",
-$isXY:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
-"^":"",
-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.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
-Dm:function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
-wY:[function(a){var z
-if(a==null)return
-else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-else{z=J.x(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.eh
-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,13,61],
-hE:function(a,b,c){var z=P.Om(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)
-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,49,61],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
-if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},
-E4:{
-"^":"a;eh",
-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.eh[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.eh[b]=P.wY(c)},
-giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
-bu:function(a){var z,y
-try{z=String(this.eh)
-return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
-z=this.eh
-y=b==null?null:P.F(H.VM(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)},
-$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]))
-x=z.bind.apply(z,y)
-String(x)
-return P.ND(new x())},Cq:function(a){if(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(P.RN(null,null)).$1(a)}}},
-Xb:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.x4(a))return z.t(0,a)
-y=J.x(a)
-if(!!y.$isZ0){x={}
-z.u(0,a,x)
-for(z=J.mY(a.gvc());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)
-C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,61,"call"],
-$isEH:true},
-r7:{
-"^":"E4;eh",
-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.eh.apply(z,y))},
-PO:function(a){return this.qP(a,null)},
-$isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
-Tz:{
-"^":"Wk;eh",
-t:function(a,b){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-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)
-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.eh.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])},
-UZ:function(a,b,c){P.BE(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).qZ(0,y))
-this.V7("splice",x)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-Jd:function(a){return this.GT(a,null)},
-static:{BE: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))}}},
-Wk:{
-"^":"E4+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-DV:{
-"^":"Tp:13;",
-$1:function(a){var z=P.xZ(a,!1)
-P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
-Hp:{
-"^":"Tp:13;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
-Nz:{
-"^":"Tp:13;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
-Jd:{
-"^":"Tp:13;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
-$isEH:true},
-QS:{
-"^":"Tp:13;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
-"^":"",
-Zm:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-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))
-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
-if(a===0)z=b===0?1/b<0:b<0
-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))
-if(a>b)return a
-if(a<b)return b
-if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
-if(C.YI.gG0(b))return b
-return a}if(b===0&&C.CD.gzP(a))return b
-return a},
-mgb:{
-"^":"a;",
-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}},
-vY:{
-"^":"a;Pd,Ak",
-Ad:function(){var z,y,x,w,v,u
-z=this.Pd
-y=4294901760*z
-x=(y&4294967295)>>>0
-w=55905*z
-v=(w&4294967295)>>>0
-u=v+x+this.Ak
-z=(u&4294967295)>>>0
-this.Pd=z
-this.Ak=(C.jn.cU(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.Ad()
-return(this.Pd&z)>>>0}do{this.Ad()
-y=this.Pd
-x=y%a}while(y-x+a>=4294967296)
-return x},
-qR:function(a){var z,y,x,w,v,u,t,s
-z=J.u6(a,0)?-1:0
-do{y=J.Wx(a)
-x=y.i(a,4294967295)
-a=J.Ts(y.W(a,x),4294967296)
-y=J.Wx(a)
-w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
-v=((~x&4294967295)>>>0)+(x<<21>>>0)
-u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
-v=((u^(u>>>24|w<<8))>>>0)*265
-x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
-v=((x^(x>>>14|w<<18))>>>0)*21
-x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
-x=(x^(x>>>28|w<<4))>>>0
-w=(w^w>>>28)>>>0
-v=(x<<31>>>0)+x
-u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Pd*1037
-t=(v&4294967295)>>>0
-this.Pd=t
-s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.Ak=s
-this.Pd=(t^u)>>>0
-this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.Ak===0&&this.Pd===0)this.Pd=23063
-this.Ad()
-this.Ad()
-this.Ad()
-this.Ad()},
-static:{"^":"tgM,PZi,JYU",r2:function(a){var z=new P.vY(0,0)
-z.qR(a)
-return z}}},
-hL:{
-"^":"a;x>,y>",
-bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
-n: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
-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)
-return P.xk(P.Zm(P.Zm(0,z),y))},
-g:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(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
-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
-y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(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()
-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},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(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
-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))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
-$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])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx+cw;",
-$isZ0:true},
-cw:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true},
-Nx:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(){var z=this.Rp
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
-$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
-"^":"",
-ic:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-WZ:{
-"^":"Gv;",
-gbx:function(a){return C.E0},
-$isWZ:true,
-"%":"ArrayBuffer"},
-eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
-$iseH:true,
-$isAS:true,
-"%":";ArrayBufferView;we|Ui|Ip|Dg|ObS|GVy|Pg"},
-dfL:{
-"^":"eH;",
-gbx:function(a){return C.dP},
-$isAS:true,
-"%":"DataView"},
-zU7:{
-"^":"Dg;",
-gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float32Array"},
-fS:{
-"^":"Dg;",
-gbx:function(a){return C.lk},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float64Array"},
-PS:{
-"^":"Pg;",
-gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int16Array"},
-dE:{
-"^":"Pg;",
-gbx:function(a){return C.XI},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int32Array"},
-Eb:{
-"^":"Pg;",
-gbx:function(a){return C.la},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int8Array"},
-wfF:{
-"^":"Pg;",
-gbx:function(a){return C.M5},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint16Array"},
-Pqh:{
-"^":"Pg;",
-gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint32Array"},
-eEV:{
-"^":"Pg;",
-gbx:function(a){return C.Fe},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
-"^":"Pg;",
-gbx:function(a){return C.HC},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":";Uint8Array"},
-we:{
-"^":"eH;",
-gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
-z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
-y=c-b
-if(e<0)throw H.b(P.u(e))
-x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
-if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},
-$isXj:true},
-Dg:{
-"^":"Ip;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ui:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ip:{
-"^":"Ui+SU7;"},
-Pg:{
-"^":"GVy;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,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]}},
-ObS:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-GVy:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
-"^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
-return}if(typeof window=="object")return
-if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
-"^":"",
-ZP:{
-"^":"Vct;Py,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OD.ZL(a)
-C.OD.XI(a)
-return a}}},
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
-"^":"",
-nJ:{
-"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-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)},
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").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,102,1,94,95],
-Z1:[function(a,b,c,d){var z,y,x
-J.Kr(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
-if(a.Ln!=null){y=P.Fl(null,null)
-x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,102,1,94,95],
-o5:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,129,1],
-static:{Rp:function(a){var z,y,x
-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])
-a.Ek="1-line"
-a.y4=z
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.tT.ZL(a)
-C.tT.XI(a)
-return a}}},
-D13:{
-"^":"uL+Pi;",
-$isd3:true},
-YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
-"^":"",
-Eg:{
-"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gv8:function(a){return a.fe},
-sv8: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},
-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)},
-wB:[function(a,b,c,d){var z=a.fe
-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.uv(a)).Qy(new R.Ou(a))}},"$3","gbN",6,0,80,46,47,81],
-static:{fL:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.UF.ZL(a)
-C.UF.XI(a)
-return a}}},
-SaM:{
-"^":"xc+Pi;",
-$isd3:true},
-uv:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ou:{
-"^":"Tp:69;b",
-$0:[function(){var z=this.b
-z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
-"^":"",
-i7:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{hSW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MC.ZL(a)
-C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
-"^":"",
-Gk:{
-"^":"WZq;KV,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gt0:function(a){return a.KV},
-st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.r0(a.KV).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.by.ZL(a)
-C.by.XI(a)
-return a}}},
-WZq:{
-"^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
-"^":"",
-Nr:{
-"^":"pva;DC,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gpM:function(a){return a.DC},
-spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-RF:[function(a,b){J.r0(a.DC).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ak:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Mh.ZL(a)
-C.Mh.XI(a)
-return a}}},
-pva:{
-"^":"uL+Pi;",
-$isd3:true},
-MJ:{
-"^":"cda;Zc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
-static:{IfX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Cl.ZL(a)
-C.Cl.XI(a)
-return a}}},
-cda:{
-"^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
-"^":"",
-DK:{
-"^":"T53;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gU4:function(a){return a.lh},
-sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
-Qj:[function(a,b){var z,y,x
-Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.ak,0,1)
-this.ct(a,C.Ql,0,1)
-z=a.tY
-y=z!=null
-if(y){x=J.U6(z)
-x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
-a.Fs=this.ct(a,C.a0,a.Fs,x)
-x=y&&J.UQ(z,"parent")!=null
-a.Qz=this.ct(a,C.ak,a.Qz,x)
-if(y){y=J.U6(z)
-y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.Ql,a.zg,y)},"$1","gLe",2,0,20,57],
-gSY:function(a){return a.Qz},
-sSY:function(a,b){a.Qz=this.ct(a,C.ak,a.Qz,b)},
-gE7:function(a){return a.zg},
-sE7:function(a,b){a.zg=this.ct(a,C.Ql,a.zg,b)},
-gni:function(a){return a.Fs},
-sni:function(a,b){a.Fs=this.ct(a,C.a0,a.Fs,b)},
-static:{v9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.lh=!0
-a.Qz=!1
-a.zg=!1
-a.Fs=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Xo.ZL(a)
-C.Xo.XI(a)
-return a}}},
-T53:{
-"^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
-"^":"",
-BS:{
-"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gig:function(a){return a.P6},
-sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-gUx:function(a){return a.Sq},
-sUx:function(a,b){a.Sq=this.ct(a,C.AO,a.Sq,b)},
-gfY:function(a){return a.ZZ},
-sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
-W7:function(a,b){var z,y,x
-z=b!=null
-y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
-if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
-x=z?J.UQ(b,"owner"):null
-if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},
-jC:[function(a,b){var z,y
-this.ct(a,C.AO,0,1)
-this.ct(a,C.Lc,0,1)
-z=this.W7(a,a.P6)
-a.Sq=this.ct(a,C.AO,a.Sq,z)
-z=J.UQ(a.P6,"kind")
-y=a.ZZ
-switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
-break
-case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
-break
-case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
-break
-case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
-break
-case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
-break
-case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
-break
-case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
-break
-case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
-break
-case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
-break
-case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
-break
-case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
-break
-case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
-break
-default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
-break}},"$1","gnp",2,0,20,57],
-RF:[function(a,b){J.r0(a.P6).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nz:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
-return a}}},
-waa:{
-"^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
-"^":"",
-Hz:{
-"^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,132],
-gvH:function(a){return C.CD.cU(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z,y,x
-z=b.gy(b)
-y=J.DO(a)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
-if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
-uc:{
-"^":"a;Yu<,tL"},
-Vb:{
-"^":"V4;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
-z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
-z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
-if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},
-fJ:function(a,b,c,d){var z=J.uH(c,"@")
-if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Ge.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,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.uH(v.r0,"/")),null,null)
-t=u==null?C.pr:P.r2(u)
-s=[t.j1(128),t.j1(128),t.j1(128),255]
-r=J.uH(v.px,"@")
-if(0>=r.length)return H.e(r,0)
-y.u(0,u,r[0])
-x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.Rl())
-this.fJ(a,0,"",$.Qg())},
-WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.dW
-y=J.DO(a.An)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=z*y
-w=C.CD.cU(O.x6(a.An,b).mS,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)
-z=v>=z}else z=!0
-if(z)return
-s=J.UQ(t,v)
-z=J.U6(s)
-r=z.t(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)
-if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(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.uc(J.ew(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
-U8:[function(a,b){var z,y,x,w,v
-z=J.RE(b)
-y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
-z=z.gD7(b)
-z=O.x6(a.An,z)
-w=z.mS
-v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.yp.Mu(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","gmo",2,0,129,2],
-X7:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,129,2],
-My:function(a){var z,y,x,w,v
-z=a.oj
-if(z==null||a.hi==null)return
-this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
-y=J.UQ(a.oj,"pages")
-z=a.hi.parentElement
-z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(z.clientHeight)),null).R
-z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
-if(typeof z!=="number")return H.s(z)
-z=4+z
-a.dW=z
-w=J.q8(y)
-if(typeof w!=="number")return H.s(w)
-v=P.J(z*w,6000)
-w=P.J3(J.Vf(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.DO(w))
-J.OE(a.hi,J.OB(a.An))
-this.ps(a,0)},
-ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=J.UQ(a.oj,"pages")
-y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
-if(typeof x!=="number")return H.s(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.An)
-if(typeof x!=="number")return H.s(x)
-x=v>x}else x=!0
-if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
-y=J.U6(t)
-x=a.rM
-s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(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.mS
-m=n+4
-C.yp.vg(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.mS
-x=C.CD.cU(y,4)
-r=u.zE
-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)
-new P.hL(m,l).$builtinTypeInfo=[null]
-if(!(l<v))break
-x=$.Qg()
-m=y+4
-C.yp.vg(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Vf(a.hi)
-x=a.An
-J.kZ(y,x,0,0,0,w,J.DO(x),v)
-P.Iw(new O.R5(a,b),null)},
-RF:[function(a,b){var z=a.oj
-if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.wx()).Qy(b)},"$1","gvC",2,0,20,90],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
-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])
-a.rM=z
-a.Ge=y
-a.UL=x
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=w
-a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
-return a}}},
-V4:{
-"^":"uL+Pi;",
-$isd3:true},
-R5:{
-"^":"Tp:69;a,b",
-$0:function(){J.EK(this.a,this.b+1)},
-$isEH:true},
-aG:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-wx:{
-"^":"Tp:77;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,134,"call"],
-$isEH:true},
-oc:{
-"^":"Tp:69;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
-"^":"",
-UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
-if(b===0){z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
-Ly:{
-"^":"V10;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,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)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Og:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,"class")
-if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.B7()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
-if(y==null)continue
-if(y.gMp())continue
-x=y.gUY().gbi().yg
-w=y.gUY().gbi().wf
-v=y.gUY().gl().yg
-u=y.gUY().gl().wf
-t=y.gxQ().gbi().yg
-s=y.gxQ().gbi().wf
-r=y.gxQ().gl().yg
-q=y.gxQ().gl().wf
-J.Jr(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),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))
-w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(C.Nm.tg(C.NG,w))break c$0
-u=J.UQ(y.gks(b),w)
-v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
-v=z-w.gB(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))
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
-if(x>=z.length)return H.e(z,x)
-s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
-y=d.cellIndex
-x=a.nc
-if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,93,1,94,95],
-RF:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).Qy(b)},"$1","gvC",2,0,20,90],
-zT:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).Qy(b)},"$1","gyW",2,0,20,90],
-eJ:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).Qy(b)},"$1","gNb",2,0,20,90],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,135,136],
-n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
-if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-z.WU(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.GQ.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
-z=a.GQ
-w=x.gUY().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.GQ
-z=J.bI(x.gUY().gCs(),x.gUY().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.GQ
-v=x.gUY().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
-w=x.gxQ().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc
-z=J.bI(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.Oc
-v=x.gxQ().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-this.Og(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
-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,20,57],
-Ar:[function(a,b){var z,y,x
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,137,138],
-uW:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,137,138],
-F9:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,137,138],
-Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.GQ.Yb.V7("addColumn",["number","Size"])
-z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Oc=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Q8()),new G.Kt("",G.Q8()),new G.Kt("Accumulated Size (New)",G.YN()),new G.Kt("Accumulated Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh()),new G.Kt("",G.Q8()),new G.Kt("Accumulator Size (Old)",G.YN()),new G.Kt("Accumulator Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(2)},
-static:{US:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.MF="---"
-a.uY="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.xu.ZL(a)
-C.xu.XI(a)
-C.xu.Zy(a)
-return a}}},
-V10:{
-"^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
-"^":"",
-bL:function(a){var z,y
-z=[]
-y=new P.Tm(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
-new P.uS().$0()
-return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.a9([],z),new P.D6(z),new P.KC(z)).$1(a)},
-J3:function(a){var z,y
-z=J.x(a)
-if(!!z.$isSg){y=z.gRn(a)
-if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
-return a},
-F7:function(){var z=$.R6
-if(z==null){z=$.Qz
-if(z==null){z=J.NT(window.navigator.userAgent,"Opera",0)
-$.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
-$.R6=z}return z},
-wF:{
-"^":"Tp:48;b,c",
-$1:function(a){var z,y,x
-z=this.b
-y=z.length
-for(x=0;x<y;++x)if(z[x]===a)return x
-z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
-rG:{
-"^":"Tp:139;d",
-$1:function(a){var z=this.d
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-fh:{
-"^":"Tp:140;e",
-$2:function(a,b){var z=this.e
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-uS:{
-"^":"Tp:69;",
-$0:function(){},
-$isEH:true},
-Tm:{
-"^":"Tp:13;f,UI,bK",
-$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.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(!!y.$ishH)return a
-if(!!y.$isO4)return a
-if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
-if(!!y.$iseH)return a
-if(!!y.$isZ0){x=this.f.$1(a)
-w=this.UI.$1(x)
-z.a=w
-if(w!=null)return w
-w={}
-z.a=w
-this.bK.$2(x,w)
-y.aN(a,new P.q1(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$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))
-if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
-$isEH:true},
-q1:{
-"^":"Tp:77;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-a9:{
-"^":"Tp:48;a,b",
-$1:function(a){var z,y,x,w
-z=this.a
-y=z.length
-for(x=0;x<y;++x){w=z[x]
-if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
-D6:{
-"^":"Tp:139;c",
-$1:function(a){var z=this.c
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-KC:{
-"^":"Tp:140;d",
-$2:function(a,b){var z=this.d
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-xL:{
-"^":"Tp:13;e,f,UI,bK",
-$1:function(a){var z,y,x,w,v,u,t
-if(a==null)return a
-if(typeof a==="boolean")return a
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-if(a instanceof Date)return P.Wu(a.getTime(),!0)
-if(a instanceof RegExp)throw H.b(P.SY("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$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.Kp(x,0)]);x.G();){w=x.lo
-y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-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)
-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,
-$isSg:true},
-As3:{
-"^":"a;",
-bu:function(a){return this.lF().zV(0," ")},
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,141,31],
-ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,142,31],
-Vr:function(a,b){return this.lF().Vr(0,b)},
-gl0:function(a){return this.lF().X5===0},
-gor:function(a){return this.lF().X5!==0},
-gB:function(a){return this.lF().X5},
-tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
-Rz:function(a,b){var z,y
-z=this.lF()
-y=z.Rz(0,b)
-this.p5(z)
-return y},
-FV:function(a,b){this.OS(new P.rl(b))},
-grZ:function(a){var z=this.lF().lX
-if(z==null)H.vh(P.w("No elements"))
-return z.gGc(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
-br:function(a){return this.tt(a,!0)},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
-y=a.$1(z)
-this.p5(z)
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.qU]}},
-GE:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-rl:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-uQ:{
-"^":"Tp:13;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-D7:{
-"^":"ark;Yn,iz",
-gye:function(){var z=this.iz
-return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
-if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.NL.appendChild(b)},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
-tg:function(a,b){return!1},
-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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
-return z},
-xe:function(a,b,c){this.iz.xe(0,b,c)},
-UG:function(a,b,c){var z,y
-z=this.iz.NL
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-gB:function(a){return this.gye().length},
-t:function(a,b){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
-hT:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-GS:{
-"^":"Tp:13;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
-"^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.r0(z).ml(new B.qB(a)).Qy(c)
-else{y=J.w1(z)
-y.u(z,"fields",null)
-y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,144,145,90],
-static:{lu:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.EL.ZL(a)
-C.EL.XI(a)
-return a}}},
-qB:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
-a.sdN(z.t(a,"valueAsString"))}z=this.a
-y=J.RE(z)
-z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
-"^":"",
-hx:{
-"^":"V11;Xh,f2,Rr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-ghf:function(a){return a.Xh},
-shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
-gIi:function(a){return a.f2},
-sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-gCF:function(a){return a.Rr},
-sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,99,100],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,99,33],
-RF:[function(a,b){J.r0(a.Xh).Qy(b)},"$1","gvC",2,0,20,90],
-static:{CoW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Rr=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.yd.ZL(a)
-C.yd.XI(a)
-return a}}},
-V11:{
-"^":"uL+Pi;",
-$isd3:true},
-wU:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-cL:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
-"^":"",
-L4:{
-"^":"V12;PM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkm:function(a){return a.PM},
-skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.r0(a.PM).Qy(b)},"$1","gvC",2,0,20,90],
-static:{MB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.za.ZL(a)
-C.za.XI(a)
-return a}}},
-V12:{
-"^":"uL+Pi;",
-$isd3:true},
-Mb:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{RVI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ag.ZL(a)
-C.Ag.XI(a)
-return a}}},
-mO:{
-"^":"V13;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ch:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ie.ZL(a)
-C.Ie.XI(a)
-return a}}},
-V13:{
-"^":"uL+Pi;",
-$isd3:true},
-DE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{oB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ig.ZL(a)
-C.Ig.XI(a)
-return a}}},
-U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gql:function(a){return a.yR},
-sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.r0(a.yR).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.yR).Qy(new E.Kv(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{hm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.VLs.ZL(a)
-C.VLs.XI(a)
-return a}}},
-V14:{
-"^":"uL+Pi;",
-$isd3:true},
-Kv:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-H8:{
-"^":"V15;vd,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-RF:[function(a,b){J.r0(a.vd).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.vd).Qy(new E.uN(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZhX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.hh.ZL(a)
-C.hh.XI(a)
-return a}}},
-V15:{
-"^":"uL+Pi;",
-$isd3:true},
-uN:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-WS:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{jS:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bP.ZL(a)
-C.bP.XI(a)
-return a}}},
-qh:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Sc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wK.ZL(a)
-C.wK.XI(a)
-return a}}},
-oF:{
-"^":"V16;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{UE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Tl.ZL(a)
-C.Tl.XI(a)
-return a}}},
-V16:{
-"^":"uL+Pi;",
-$isd3:true},
-Q6:{
-"^":"V17;uv,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gj4:function(a){return a.uv},
-sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-RF:[function(a,b){J.r0(a.uv).Qy(b)},"$1","gvC",2,0,20,90],
-static:{chF:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
-return a}}},
-V17:{
-"^":"uL+Pi;",
-$isd3:true},
-uE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{P3:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Rr.ZL(a)
-C.Rr.XI(a)
-return a}}},
-Zn:{
-"^":"V18;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{xK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ij.ZL(a)
-C.ij.XI(a)
-return a}}},
-V18:{
-"^":"uL+Pi;",
-$isd3:true},
-n5:{
-"^":"V19;h1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gHy:function(a){return a.h1},
-sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-RF:[function(a,b){J.r0(a.h1).Qy(b)},"$1","gvC",2,0,20,90],
-static:{iOo:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.aV.ZL(a)
-C.aV.XI(a)
-return a}}},
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-Ma:{
-"^":"V20;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ii:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.iR.ZL(a)
-C.iR.XI(a)
-return a}}},
-V20:{
-"^":"uL+Pi;",
-$isd3:true},
-wN:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{ML:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
-return a}}},
-ds:{
-"^":"V21;wT,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gMZ:function(a){return a.wT},
-sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-RF:[function(a,b){J.r0(a.wT).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.wT).Qy(new E.Gf(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{pI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wP.ZL(a)
-C.wP.XI(a)
-return a}}},
-V21:{
-"^":"uL+Pi;",
-$isd3:true},
-Gf:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-ou:{
-"^":"V22;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{tX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.lX.ZL(a)
-C.lX.XI(a)
-return a}}},
-V22:{
-"^":"uL+Pi;",
-$isd3:true},
-av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
-static:{Ci:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.CB=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
-return a}}},
-ZzR:{
-"^":"xI+Pi;",
-$isd3:true},
-uz:{
-"^":"V23;RX,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gNN:function(a){return a.RX},
-Fn:function(a){return this.gNN(a).$0()},
-sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-RF:[function(a,b){J.r0(a.RX).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.RX).Qy(new E.Cc(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{z1:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bZ.ZL(a)
-C.bZ.XI(a)
-return a}}},
-V23:{
-"^":"uL+Pi;",
-$isd3:true},
-Cc:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
-"^":"",
-Se:{
-"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
-z=this.B1
-y=J.UQ(z,"threshold")
-x=this.ks
-if(x.length>0)return
-for(w=this.H,v=J.mY(J.Mx(w)),u=this.YK;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.on(t).gDu(),u.Av)>y))continue
-x.push(X.SJ(z,u,t,this))}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.H))>0},
-mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
-y=J.RE(z)
-if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
-if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
-else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.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.dj(z.gAv(),this.YK.Av)
-else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.ki)},
-static:{SJ:function(a,b,c,d){var z,y
-z=H.VM([],[G.Y2])
-y=d!=null?d.yt+1:0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
-z.k7(d)
-z.mW(a,b,c,d)
-return z}}},
-kK:{
-"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-gEl:function(a){return a.Ik},
-sEl: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
-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)
-z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(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,20,57],
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-this.Zb(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
-RF:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).Qy(b)},"$1","gvC",2,0,20,90],
-Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
-if(z==null)return
-try{a.Hm.rT(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
-z=J.Lp(d)
-if(!!J.x(z).$istV)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{"^":"B6",jD:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.WC="#tableTree"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kS.ZL(a)
-C.kS.XI(a)
-return a}}},
-V24:{
-"^":"uL+Pi;",
-$isd3:true},
-Xy:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,146,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oa:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{IB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.LN.ZL(a)
-C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-St:{
-"^":"V25;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ow},
-sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{N5:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OoF.ZL(a)
-C.OoF.XI(a)
-return a}}},
-V25:{
-"^":"uL+Pi;",
-$isd3:true},
-IW:{
-"^":"V26;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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 a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,147,14],
-static:{zr:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
-return a}}},
-V26:{
-"^":"uL+Pi;",
-$isd3:true},
-GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Qh:{
-"^":"V27;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kd.ZL(a)
-C.kd.XI(a)
-return a}}},
-V27:{
-"^":"uL+Pi;",
-$isd3:true},
-Oz:{
-"^":"V28;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ow},
-sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{RP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ji.ZL(a)
-C.Ji.XI(a)
-return a}}},
-V28:{
-"^":"uL+Pi;",
-$isd3:true},
-vT:{
-"^":"a;Y0,WL",
-eC:function(a){var z,y,x,w,v,u
-z=this.Y0.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.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
-v=J.uH(x.t(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.Tz(u)
-u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
-Z4:{
-"^":"V29;wd,iw,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gXE:function(a){return a.wd},
-sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ci:[function(a,b){var z,y,x
-if(a.wd==null)return
-if($.Ib().MM.Gv!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
-z=a.iw
-if(z==null)return
-z.eC(a.wd)
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-x=z.WL
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
-x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
-static:{d7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wQ.ZL(a)
-C.wQ.XI(a)
-return a}}},
-V29:{
-"^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
-"^":"",
-If:{
-"^":"a;X6,YT",
-eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.X6.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.lo
-if(J.xC(x,"Idle"))continue
-z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.R7(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-t=y[u].SP
-s=[]
-if(t>0){if(typeof v!=="number")return H.s(v)
-s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-r=y[u].wZ
-if(r===0){q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-y=y[u].XE
-if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
-C.Nm.FV(y,C.Nm.ez(s,P.En()))
-y=new P.Tz(y)
-y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}}},
-qk:{
-"^":"V30;ck,ts,LR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ck},
-sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
-vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.r0(a.ck).Qy(b)},"$1","gvC",2,0,20,90],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,147,14],
-static:{Qtp:function(a){var z,y,x
-z=P.zV(J.UQ($.BY,"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])
-a.LR=new L.If(new G.Kf(z),null)
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.Xe.ZL(a)
-C.Xe.XI(a)
-return a}}},
-V30:{
-"^":"uL+Pi;",
-$isd3:true},
-LX:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-y=z.LR
-y.eC(a)
-x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null){if(y.YT==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
-v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
-y.YT=v
-w.u(0,"isStacked",!0)
-y.YT.bG.u(0,"connectSteps",!1)
-y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,148,"call"],
-$isEH:true},
-CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
-"^":"",
-xh:{
-"^":"a;ue,GO",
-LE:function(a,b){var z,y,x,w,v,u,t,s
-z=this.GO
-if(z.tg(0,a))return
-z.h(0,a)
-for(y=J.mY(a.gvc()),x=this.ue,w=J.U6(a),v=b+1;y.G();){u=y.gl()
-t=w.t(a,u)
-s=J.x(t)
-if(!!s.$isZ0){s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": {\n"
-x.vM+=s
-this.LE(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": [\n"
-x.vM+=s
-this.QC(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": "+H.d(t)
-s=x.vM+=s
-x.vM=s+"\n"}}z.Rz(0,a)},
-QC:function(a,b){var z,y,x,w,v,u
-z=this.GO
-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.$isZ0){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"{\n"
-this.LE(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"[\n"
-this.QC(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
-vj:{
-"^":"V31;Ly,cs,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIr:function(a){return a.Ly},
-ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
-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
-z=P.p9("")
-y=P.Ls(null,null,null,null)
-x=a.Ly
-z.vM=""
-z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
-z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yt.ZL(a)
-C.Yt.XI(a)
-return a}}},
-V31:{
-"^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
-"^":"",
-LU:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rA:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Z3.ZL(a)
-C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
-"^":"",
-CX:{
-"^":"V32;iI,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gHt:function(a){return a.iI},
-sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-RF:[function(a,b){J.r0(a.iI).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MG.ZL(a)
-C.MG.XI(a)
-return a}}},
-V32:{
-"^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
-"^":"",
-Rw:{
-"^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
-gB8:function(){var z,y,x
-z=this.eT
-y=z==null||J.xC(J.O6(z),"")
-x=this.oc
-return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.n2
-if(z!=null)return z
-z=this.eT
-if(z!=null)return z.gOR()}return $.Y4},
-sOR:function(a){if($.RL&&this.eT!=null)this.n2=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."))
-$.Y4=a}},
-gSZ:function(){return this.tQ()},
-mL:function(a){return a.P>=this.gOR().P},
-Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
-y=new P.iP(Date.now(),!1)
-y.EK()
-x=$.xO
-$.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){v.cB(w)
-v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.D8,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.xH(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
-tQ:function(){if($.RL||this.eT==null){var z=this.Gs
-if(z==null){z=P.bK(null,null,!0,N.HV)
-this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.QM("").tQ()},
-cB:function(a){var z=this.Gs
-if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)}},
-QL:function(a,b,c){var z=this.eT
-if(z!=null)J.Tr(z).u(0,this.oc,this)},
-$isRw:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.aO(a))}}},
-aO:{
-"^":"Tp:69;a",
-$0:function(){var z,y,x,w,v
-z=this.a
-if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
-y=C.xB.cn(z,".")
-if(y===-1)x=z!==""?N.QM(""):null
-else{x=N.QM(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.Rw)
-v=new N.Rw(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
-v.QL(z,x,w)
-return v},
-$isEH:true},
-qV:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&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},
-$isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
-HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-$isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
-"^":"",
-E2:function(){var z,y
-N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e392())
-N.QM("").To("Starting Observatory")
-N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"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.e393())},
-e392:{
-"^":"Tp:150;",
-$1:[function(a){var z
-if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(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.z2(a)))},"$1",null,2,0,null,149,"call"],
-$isEH:true},
-e393:{
-"^":"Tp:13;",
-$1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-md:{
-"^":"V33;i4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-giC:function(a){return a.i4},
-siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{DCi:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.i4=!0
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kD.ZL(a)
-C.kD.XI(a)
-return a}}},
-V33:{
-"^":"uL+Pi;",
-$isd3:true},
-Bm:{
-"^":"V34;KU,V4,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPj:function(a){return a.KU},
-sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU: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:{AJm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IG.ZL(a)
-C.IG.XI(a)
-return a}}},
-V34:{
-"^":"uL+Pi;",
-$isd3:true},
-Ya:{
-"^":"V35;KU,V4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPj:function(a){return a.KU},
-sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{vn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.nn.ZL(a)
-C.nn.XI(a)
-return a}}},
-V35:{
-"^":"uL+Pi;",
-$isd3:true},
-Ww:{
-"^":"V36;rU,SB,z2,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gFR:function(a){return a.rU},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
-gjl:function(a){return a.SB},
-sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-W1:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,102,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.SB=!1
-a.z2="Refresh"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.J7.ZL(a)
-C.J7.XI(a)
-return a}}},
-V36:{
-"^":"uL+Pi;",
-$isd3:true},
-ye:{
-"^":"uL;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Fv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.br.ZL(a)
-C.br.XI(a)
-return a}}},
-G1:{
-"^":"V37;Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-grZ:function(a){return a.Jo},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{J8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
-return a}}},
-V37:{
-"^":"uL+Pi;",
-$isd3:true},
-fl:{
-"^":"V38;Jo,iy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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","gQ1",2,0,20,57],
-gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
-else return""},
-su6:function(a,b){},
-static:{zf:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RRl.ZL(a)
-C.RRl.XI(a)
-return a}}},
-V38:{
-"^":"uL+Pi;",
-$isd3:true},
-UK:{
-"^":"V39;VW,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-static:{IV:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ct.ZL(a)
-C.ct.XI(a)
-return a}}},
-V39:{
-"^":"uL+Pi;",
-$isd3:true},
-wM:{
-"^":"V40;Au,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-static:{GO:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HR.ZL(a)
-C.HR.XI(a)
-return a}}},
-V40:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
-"^":"",
-F1:{
-"^":"V41;qC,MR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.ho(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!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,!1,null,null,null,null,null)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.E0(a)
-a.MR=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!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,!1,null,null,null,null,null)
-y.md()
-y.eY()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.Ty(a)
-a.MR=y}},
-static:{JT8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.qC=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
-return a}}},
-V41:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
-"^":"",
-uL:{
-"^":"xc;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-Es:function(a){A.zs.prototype.Es.call(this,a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)},
-aR:function(a){A.zs.prototype.aR.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,151,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gn0",2,0,152,153],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,154,155],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,156,157],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,156,157],
-OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,156,157],
-GA:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,156,157],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,156,157],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,156,157],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,156,157],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,156,157],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,156,157],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,156,157],
-static:{EE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
-return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
-"^":"",
-Ap:{
-"^":"a;",
-sP:function(a,b){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
-"^":"",
-Pi:{
-"^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-z=P.bK(this.gym(a),z,!0,null)
-a.AP=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
-HC:[function(a){var z,y,x
-z=a.fn
-a.fn=null
-if(this.gnz(a)&&z!=null){y=a.AP
-x=H.VM(new P.Yp(z),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,111],
-gnz:function(a){var z,y
-z=a.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,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)+">"},
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
-"^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
-if($.Td)return
-if($.Oo==null)return
-$.Td=!0
-z=0
-y=null
-do{++z
-if(z===1000)y=[]
-x=$.Oo
-w=[]
-w.$builtinTypeInfo=[F.d3]
-$.Oo=w
-for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-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()
-w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
-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))+".")}}$.ax=$.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.u3(z),new O.bF(z),null,null,null,null,null,null)},
-YC:{
-"^":"Tp:158;a",
-$2:function(a,b){var z=this.a
-if(z.a)return
-z.a=!0
-a.RK(b,new O.c1(z))},
-$isEH:true},
-c1:{
-"^":"Tp:69;a",
-$0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-u3:{
-"^":"Tp:30;b",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
-$isEH:true},
-yJ:{
-"^":"Tp:69;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},
-bF:{
-"^":"Tp:159;UI",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
-$isEH:true},
-f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
-"^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=f-e+1
-y=J.ew(J.bI(c,b),1)
-x=Array(z)
-for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(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)
-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)))
-o=x[v]
-n=x[r]
-m=t-1
-if(p){if(v>=w)return H.e(x,v)
-if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
-if(t>=n.length)return H.e(n,t)
-p=n[t]
-if(typeof p!=="number")return p.g()
-if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
-if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.length
-y=z-1
-if(0>=z)return H.e(a,0)
-x=a[0].length-1
-if(y<0)return H.e(a,y)
-w=a[y]
-if(x<0||x>=w.length)return H.e(w,x)
-v=w[x]
-u=[]
-while(!0){if(!(y>0||x>0))break
-c$0:{if(y===0){u.push(2);--x
-break c$0}if(x===0){u.push(3);--y
-break c$0}w=y-1
-if(w<0)return H.e(a,w)
-t=a[w]
-s=x-1
-r=t.length
-if(s<0||s>=r)return H.e(t,s)
-q=t[s]
-if(x<0||x>=r)return H.e(t,x)
-p=t[x]
-if(y<0)return H.e(a,y)
-t=a[y]
-if(s>=t.length)return H.e(t,s)
-o=t[s]
-n=P.J(P.J(p,o),q)
-if(n===q){if(q==null?v==null:q===v)u.push(0)
-else{u.push(1)
-v=q}x=s
-y=w}else if(n===p){u.push(3)
-v=p
-y=w}else{u.push(2)
-v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
-rN:function(a,b,c){var z,y,x
-for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
-xU:function(a,b,c){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=b.length
-w=0
-while(!0){if(w<c){--y
-v=z.t(a,y);--x
-if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(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
-b=x.g(b,w)
-e+=w
-c=z.W(c,v)
-f-=v
-z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.dn
-if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
-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)
-u=[]
-x=new P.Yp(u)
-x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
-q=[]
-q.$builtinTypeInfo=[G.DA]
-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.ew(o,1);++p
-break
-case 1:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break
-case 2:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-break
-case 3:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break}if(t!=null)q.push(t)
-return q},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.RE(b)
-y=z.gWA(b)
-z=z.gvH(b)
-x=J.qA(b.gem())
-w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
-v.$builtinTypeInfo=[null]
-u=new G.DA(y,v,x,z,w)
-for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
-q=a[r]
-q.Ft=J.ew(q.Ft,s)
-if(t)continue
-z=u.Ft
-y=J.ew(z,u.VD.G4.length)
-x=q.Ft
-p=P.J(y,J.ew(x,q.Ld))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.bI(q.Ld,q.VD.G4.length)
-if(typeof z!=="number")return H.s(z)
-s-=z
-z=J.ew(u.Ld,J.bI(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.bI(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
-if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.Ld,u.VD.G4.length)
-q.Ft=J.ew(q.Ft,n)
-if(typeof n!=="number")return H.s(n)
-s+=n
-t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-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.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
-if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
-if(0>=v.length)return H.e(v,0)
-v=v[0]
-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)
-continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.ew(v.gvH(w),w.gNg()),w.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"a;WA>,VD,em<,Ft,Ld",
-gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-XP:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
-if(typeof z!=="number")return H.s(z)
-z=a<z}else z=!0
-if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.ew(this.Ft,this.Ld))},
-bu:function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},
-$isDA:true,
-static:{K6:function(a,b,c,d){var z
-if(d==null)d=[]
-if(c==null)c=0
-z=new P.Yp(d)
-z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
-"^":"",
-nd:{
-"^":"a;"},
-vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
-"^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
-Wi:function(a,b,c,d){var z=J.RE(a)
-if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},
-d3:{
-"^":"a;R9:ro%,V2:dUC%,me:pt%",
-gqh:function(a){var z
-if(this.gR9(a)==null){z=this.glZ(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
-z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-W7Y:[function(a){var z,y,x,w
-z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
-$.Oo=z}z.push(a)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().eA.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","glZ",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
-HC:function(a){var z,y
-z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
-if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
-$isd3:true},
-X6:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y,x,w,v
-z=this.b
-y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
-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.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
-"^":"",
-Sk:{
-"^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.Ha,this.DA,b)},
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.DA)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
-"^":"",
-wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
-if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.ao.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.ao
-y=z.length
-if(y===b)return
-this.ct(this,C.Wn,y,b)
-x=y===0
-w=b===0
-this.ct(this,C.ai,x,w)
-this.ct(this,C.nZ,!x,!w)
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){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))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
-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))
-x=x.br(0)
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
-x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
-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.ao
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-y=z[b]
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x){x=[y]
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},
-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)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.iT
-if(z!=null){x=z.iE
-z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
-H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.q9(z,b,y,null).br(0)))}H.vf(this.ao,b,c)},
-h:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-this.On(y,y+1)
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
-C.Nm.h(z,b)},
-FV:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-C.Nm.FV(z,b)
-this.On(y,z.length)
-x=z.length-y
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
-UZ:function(a,b,c){var z,y,x,w,v,u,t
-z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
-y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.ao
-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.iT
-if(u!=null){t=u.iE
-u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>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=[null]
-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.Yp(z)
-y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=J.x(c)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.ao
-x=z.length
-C.Nm.sB(z,x+y)
-w=z.length
-H.qG(z,b+y,w,this,b)
-H.vf(z,b,c)
-this.On(x,z.length)
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
-xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
-y=z.length
-if(b===y){this.h(0,c)
-return}C.Nm.sB(z,y+1)
-y=z.length
-H.qG(z,b+1,y,this,b)
-y=z.length
-this.On(y-1,y)
-y=this.iT
-if(y!=null){x=y.iE
-y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
-if(b>=z.length)return H.e(z,b)
-z[b]=c},
-iH:function(a){var z,y
-z=this.iT
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
-this.ct(this,C.Wn,a,b)
-z=a===0
-y=b===0
-this.ct(this,C.ai,z,y)
-this.ct(this,C.nZ,!z,!y)},
-Lu:[function(){var z,y,x
-z=this.b3
-if(z==null)return!1
-y=G.Qi(this,z)
-this.b3=null
-z=this.iT
-if(z!=null){x=z.iE
-x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,111],
-$iswn:true,
-static:{ch:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(a===b)throw H.b(P.u("can't use same list for previous and current"))
-for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
-w=J.RE(x)
-v=J.ew(w.gvH(x),x.gNg())
-u=J.ew(w.gvH(x),x.gRt().G4.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
-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)
-H.qG(a,n,l,a,u)
-H.qG(a,w,n,t,0)}}}}},
-uFU:{
-"^":"ark+Pi;",
-$isd3:true},
-cj:{
-"^":"Tp:69;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
-"^":"",
-ya:{
-"^":"yj;G3>,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.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isya:true},
-qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(){return this.Zp.gvc()},
-gUQ:function(a){var z=this.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Zp
-return z.gB(z)},
-gl0:function(a){var z=this.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Zp
-return z.gB(z)!==0},
-t:function(a,b){return this.Zp.t(0,b)},
-u:function(a,b,c){var z,y,x,w
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
-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.G8()}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.Uq,null,null),[null]))}},
-FV:function(a,b){J.Me(b,new V.zT(this))},
-V1:function(a){var z,y,x,w
-z=this.Zp
-y=z.gB(z)
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)
-this.G8()}z.V1(0)},
-aN:function(a,b){return this.Zp.aN(0,b)},
-bu:function(a){return P.vW(this)},
-G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
-this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
-$isqC:true,
-$isZ0:true,
-static:{AB:function(a,b,c){var z
-if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else z=!!a.$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])
-return z}}},
-zT:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
-Lo:{
-"^":"Tp:77;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}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
-"^":"",
-Qw:{
-"^":"Ap;TA,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
-TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.TA,this.gqy()))
-this.Cg=z
-return z},
-cf:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gqy",2,0,13,58],
-S6:function(a){var z=this.TA
-if(z!=null)J.x0(z)
-this.TA=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.TA))
-this.Cg=z
-return z},
-sP:function(a,b){J.ta(this.TA,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
-"^":"",
-Hj: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 if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-if(!y){z=a
-y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z)return J.UQ(a,$.b7().ep.t(0,b))
-try{z=a
-y=b
-x=$.cp().eA.t(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.Lm(a)
-v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
-return},
-iu: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).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-if(!y){z=a
-y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z){J.kW(a,$.b7().ep.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.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-cB:function(a){a=J.rr(a)
-if(a==="")return!0
-if(0>=a.length)return H.e(a,0)
-if(a[0]===".")return!1
-return $.uC().zD(a)},
-WR:{
-"^":"qK;HS,XF,xE,cX,GX,vA,Wf",
-gqc:function(){return this.HS==null},
-sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){this.xE=L.SE(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
-this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
-if(a||J.xC(y,z))return!1
-this.zc(this.Wf,z)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-Tv:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
-gPu:function(){return!0},
-bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},
-n:function(a,b){var z,y,x,w,v
-if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isTv)return!1
-if(this.gPu()!==b.gPu())return!1
-z=this.OK
-y=z.length
-x=b.OK
-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},
-giO:function(a){var z,y,x,w,v
-for(z=this.OK,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)
-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)},
-Tl:function(a){var z,y
-if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(a==null)return
-a=L.Hj(a,y)}return a},
-rL:function(a,b){var z,y,x
-z=this.OK
-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.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
-y=z.length-1
-for(x=0;a!=null;x=w){b.$1(a)
-if(x>=y)break
-w=x+1
-if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
-$isTv:true,
-static:{hk:function(a){var z,y,x,w,v,u,t,s
-if(!!J.x(a).$isWO){z=P.F(a,!1,null)
-y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Kp(z,0)]
-for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isGD)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
-w=$.aB().t(0,a)
-if(w!=null)return w
-if(!L.cB(a))return $.V6()
-v=[]
-y=J.rr(a).split(".")
-u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-for(;u.G();){x=u.lo
-if(J.xC(x,""))continue
-t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.b7().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
-if(y.X5>=100){y.toString
-u=new P.i5(y)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-s=u.gA(u)
-if(!s.G())H.vh(H.DU())
-y.Rz(0,s.gl())}y.u(0,a,w)
-return w}}},
-oq:{
-"^":"Tp:13;",
-$1:function(a){return},
-$isEH:true},
-f7:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.b7().ep.t(0,a):a},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-vH:{
-"^":"Tv;OK",
-gPu:function(){return!1},
-static:{"^":"qr"}},
-YJG:{
-"^":"Tp:69;",
-$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
-$isEH:true},
-ww:{
-"^":"qK;xE,cb,cX,GX,vA,Wf",
-gqc:function(){return this.cb==null},
-gIn:function(){return 3},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){var z,y,x,w
-this.hQ(!0)
-for(z=this.cb,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
-if(z!=null){y=z.IU
-y=y==null?w!=null:y!==w}else y=!0
-if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.yj.u(0,this.cX,this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}},
-kH:function(){var z,y,x,w
-this.Wf=null
-for(z=0;y=this.cb,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
-if(w>=x)return H.e(y,w)
-J.x0(y[w])}this.cb=null},
-yN:function(a,b){var z
-if(this.GX!=null||this.cb==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.cb
-z.push(a)
-z.push(b)},
-ti:function(a){return this.yN(a,null)},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.cb,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.dV){v=z+1
-if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.cb.length,2))
-for(z=!1,y=null,x=0;w=this.cb,v=w.length,x<v;x+=2){u=x+1
-if(u>=v)return H.e(w,u)
-t=w[u]
-s=w[x]
-if(s===C.dV){H.Go(t,"$isAp")
-r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
-continue}w=this.Wf
-v=C.jn.cU(x,2)
-if(J.xC(r,J.UQ(w,v)))continue
-w=this.vA
-if(typeof w!=="number")return w.F()
-if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
-z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-iNc:{
-"^":"a;"},
-qK:{
-"^":"Ap;cX<",
-CC:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8:function(){return this.GX!=null},
-TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.vA=P.J(this.gIn(),X.RI(b))
-this.NJ()
-return this.Wf},
-gP:function(a){this.hQ(!0)
-return this.Wf},
-S6:function(a){if(this.GX==null)return
-this.kH()
-this.Wf=null
-this.GX=null},
-xV:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,20,14],
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
-break
-case 1:this.K0(a)
-break
-case 2:this.cF(a,b)
-break
-case 3:this.Mm(a,b,c)
-break}}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-zc:function(a,b){return this.Aw(a,b,null)}},
-zG:{
-"^":"a;IU,yj,rS,HN,op",
-TR:function(a,b){this.yj.u(0,b.gcX(),b)
-b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,160,82],
-wq:function(a){var z,y
-if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
-z=this.HN
-y=z!=null?z.Rz(0,a):null
-if(y!=null)this.rS.u(0,a,y)
-else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
-CH:[function(a){var z,y,x,w,v
-if(!this.op)return
-z=this.HN
-if(z==null)z=P.YM(null,null,null,null,null)
-this.HN=this.rS
-this.rS=z
-for(y=this.yj,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.HN=null},"$0","gTh",0,0,18],
-t9:[function(a){var z,y
-for(z=this.yj,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,161],
-static:{"^":"xG",SE:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.IU
-y=y==null?b!=null:y!==b}else y=!0
-if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.yj.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
-"^":"",
-tB:[function(a){var z,y,x
-z=J.x(a)
-if(!!z.$isd3)return a
-if(!!z.$isZ0){y=V.AB(a,null,null)
-z.aN(a,new R.Qe(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
-x=Q.ch(null,null)
-x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
-Qe:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,121,64,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
-"^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
-q3: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).MW.getAttribute("href")
-try{w=new XMLHttpRequest()
-C.W3.kP(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.XO(v,null)
-$.Es().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=$.b7().ep.t(0,a)
-if(z==null)return!1
-y=J.rY(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
-Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-h6:function(a,b){var z,y,x,w
-if(a==null)return
-document
-if($.op()===!0)b=document.head
-z=document.createElement("style",null)
-J.t3(z,J.dY(a))
-y=a.getAttribute("element")
-if(y!=null)z.setAttribute("element",y)
-x=b.firstChild
-if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
-YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
-z.Gr(new A.mS())
-return z},
-X1:function(a,b){var z,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!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("d-auto-binding",C.Jm)
-z=document.createElement("polymer-element",null)
-z.setAttribute("name","d-auto-binding")
-z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,74,0,null),[H.Kp(a,0)]);y.G();)y.lo.$0()},
-JP:function(){var z,y,x,w
-z=$.Si()
-if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
-y=J.UQ(z,"Polymer")
-if(y==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."))
-x=$.X3
-y.V7("whenPolymerReady",[x.ce(new A.hp())])
-w=J.UQ($.XX(),"register")
-if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,Ve,t4",
-gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-else y=null
-return y},
-Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gP1()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
-if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
-Zw:function(a){var z,y,x,w,v,u,t,s,r
-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.gBj()!=null){z=a.gBj()
-y=P.Ls(null,null,null,null)
-y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.pI(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
-if(v==="")continue
-u=$.b7().Nz.t(0,v)
-t=L.hk([u])
-s=this.Q7
-if(s!=null&&s.x4(t))continue
-r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
-s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
-if(typeof console!="undefined")console.warn(s)
-continue}s=this.Q7
-if(s==null){s=P.Fl(null,null)
-this.Q7=s}s.u(0,t,r)}},
-pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-x=J.RE(y)
-if(x.gV5(y)===!0)continue
-w=this.Q7
-if(w==null){w=P.Fl(null,null)
-this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
-if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.b7().ep.t(0,x))}}},
-Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.P1
-if(y!=null)z.FV(0,y.gkK())
-J.Vs(this.FL).aN(0,new A.eY(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-m1:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
-z.toString
-y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf()
-if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
-J.t3(s,H.d(w))
-z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
-oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
-y=z.br(z)
-x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
-return y},
-Bg:function(a){return this.oP(a,null)},
-kO:function(a){var z,y,x,w,v,u
-z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
-u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
-w=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=w+"\n\n"}return z.vM},
-J3:function(a,b){var z
-if(a==="")return
-z=document.createElement("style",null)
-J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
-return z},
-rH:function(){var z,y,x,w,v
-for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
-x=J.RE(y)
-w=x.goc(y)
-v=$.b7().ep.t(0,w)
-w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
-x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.Kp(y,0)]
-for(;x.G();)continue}},
-Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.Tj(z))
-return z},
-$isXP:true,
-static:{"^":"Kb"}},
-Zd:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ishG},
-$isEH:true},
-Da:{
-"^":"Tp:13;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-eY:{
-"^":"Tp:77;a",
-$2:function(a,b){if(C.n7.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
-$isEH:true},
-BO:{
-"^":"Tp:77;a",
-$2:function(a,b){var z,y,x
-z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
-x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
-$isEH:true},
-ZG:{
-"^":"Tp:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ua:{
-"^":"Tp:13;a",
-$1:function(a){return J.RF(a,this.a)},
-$isEH:true},
-ix:{
-"^":"Tp:69;",
-$0:function(){return[]},
-$isEH:true},
-Tj:{
-"^":"Tp:162;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-Li:{
-"^":"BG9;Mn,cJ",
-US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.US(a,b,c)}},
-BG9:{
-"^":"vE+vA;"},
-vA:{
-"^":"a;",
-XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
-z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
-z={}
-y=J.rY(b)
-if(!y.nC(b,"on-"))return
-x=y.yn(b,3)
-z.a=x
-w=C.fE.t(0,x)
-z.a=w!=null?w:z.a
-return new A.li(z,this,a)}},
-l5:{
-"^":"Tp:13;a,b,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
-z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$iseC){w=y.gey(a)
-if(w==null)w=J.UQ(P.Cq(a),"detail")}else w=null
-y=y.gCa(a)
-z=z.a
-J.Pj(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,1,"call"],
-$isEH:true},
-li:{
-"^":"Tp:166;a,b,c",
-$3:[function(a,b,c){var z,y,x,w
-z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
-w.Zz()
-if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-d6:{
-"^":"Ap;Jq,ED",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
-xc:{
-"^":"Ao;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-XI:function(a){this.Pa(a)},
-static:{G7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ki.ZL(a)
-C.Ki.XI(a)
-return a}}},
-jpR:{
-"^":"Bo+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-Ao:{
-"^":"jpR+Pi;",
-$isd3:true},
-zs:{
-"^":"a;XG:SD=",
-gFL:function(a){return a.IX},
-gUj:function(a){return},
-gRT:function(a){var z,y
-z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
-return y==null||y===""?this.gqn(a):y},
-Pa:function(a){var z,y
-z=this.gCn(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
-if(typeof console!="undefined")console.warn(y)}this.es(a)
-y=this.gM0(a)
-if(!J.xC($.AA().t(0,y),!0)||$.op()===!0)this.rf(a)},
-es:function(a){var z,y
-if(a.IX!=null){window
-z="Element already prepared: "+H.d(this.gRT(a))
-if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.Cq(a)
-z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
-z=a.Wz
-if(z!=null){y=this.gnu(a)
-z.toString
-L.qK.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gqY(a))
-this.oR(a)
-this.fk(a)
-this.Uc(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
-this.Oh(a,a.IX)
-this.gQg(a).Rz(0,"unresolved")
-this.aR(a)},
-aR:function(a){},
-Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
-this.oW(a)
-if(!a.XN){a.XN=!0
-this.rW(a,new A.bl(a))}},
-dQ:function(a){this.x3(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
-this.aI(a,J.nq(b))}},
-aI:function(a,b){var z,y,x,w
-z=J.RE(b)
-y=z.Wk(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
-if(w==null)return
-a.Xy.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.er(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.Ky(b)
-w=J.MO(x,a,y==null&&J.Xp(x)==null?J.xq(a.IX):y)
-v=$.It().t(0,w)
-u=v!=null?v.gu2():v
-a.Sa.push(u)
-z.appendChild(w)
-this.Ec(a,z)
-u=$.dg()
-if(u!=null)u.V7("register",[z])
-return z},
-Ec:function(a,b){var z,y,x
-if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
-y.u(0,J.F8(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.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.ghW(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.x5(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.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Lm(w):v)
-if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,167],
-B2:function(a,b){var z=a.IX.gNF()
-if(z==null)return
-return z.t(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},
-JY:function(a,b){var z,y,x
-z=L.hk(b).Tl(a)
-y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
-else if(typeof z==="boolean"){x=this.gQg(a).MW
-x.getAttribute(b)
-x.removeAttribute(b)}},
-nR:function(a,b,c,d){var z,y,x,w,v,u,t
-z=this.B2(a,b)
-if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{y=J.RE(z)
-x=y.goc(z)
-w=$.QX5()
-if(w.mL(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
-w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
-v=new A.lK(a,x,c,null,null)
-v.Jq=this.gqh(a).yI(v.gXQ())
-w=J.mu(c,v.gap())
-v.dY=w
-$.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.Ky(a))==null){x=P.Fl(null,null)
-J.nC(M.Ky(a),x)}J.kW(J.C5(M.Ky(a)),b,v)}u=a.IX.gBj()
-y=y.goc(z)
-t=$.b7().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
-return v}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.Ky(a))},
-sCd:function(a,b){J.nC(M.Ky(a),b)},
-gCn:function(a){return J.fe(M.Ky(a))},
-x3:function(a){var z,y
-if(a.Uk===!0)return
-$.UW().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gJg(a)
-if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Sa,this.ghb(a))
-a.Sa=[]
-this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
-oW:function(a){var z
-if(a.Uk===!0){$.UW().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
-if(z!=null){z.TP(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=$.ps
-$.ps=y+1
-x=new L.ww(null,[],y,null,null,null)
-x.Wf=[]
-a.Wz=x
-a.Sa.push([x])
-for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
-x.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.n1(a,b,c,d,J.JR(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,168],
-hu:[function(a,b){var z,y,x,w,v
-for(z=J.mY(b);z.G();){y=z.gl()
-if(!J.x(y).$isqI)continue
-x=y.oc
-w=$.b7().ep.t(0,x)
-v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,169,161],
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z==null)return
-y=z.t(0,b)
-if(y==null)return
-if(!!J.x(d).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.yl(new A.R8(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
-if(v==null){v=P.L5(null,null,null,P.qU,P.Oy)
-a.q9=v}v.u(0,x,w)}},
-dvq:[function(a,b){var z,y
-for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.x0(y)}},"$1","ghb",2,0,170],
-iQ:function(a,b){var z=a.q9.Rz(0,b)
-if(z==null)return!1
-z.ed()
-return!0},
-Uq:function(a){var z,y
-z=a.q9
-if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-Uc:function(a){var z,y
-z=a.IX.gPS()
-if(z.gl0(z))return
-y=$.eS()
-if(y.mL(C.eI))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.eS()
-y=z.mL(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(c)
-if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
-C.Nm.sB(d,x)
-H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().Nz.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
-P.rb(F.Jy())
-$.Kc().nQ("flush")
-z=window
-C.ma.hr(z)
-return C.ma.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
-this.H2(a,z)
-return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-bl:{
-"^":"Tp:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Sv:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=J.Vs(this.a)
-if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},
-$isEH:true},
-Xi:{
-"^":"Tp:69;b",
-$0:function(){return this.b},
-$isEH:true},
-n1:{
-"^":"Tp:77;a,b,c,d,e,f",
-$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=2*a+1
-if(w>>>0!==w||w>=x.length)return H.e(x,w)
-v=x[w]
-w=this.e
-if(w==null)return
-u=w.t(0,v)
-if(u==null)return
-for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
-if(!q.h(0,p))continue
-s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,83,57,"call"],
-$isEH:true},
-R8:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w
-for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-SX:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=this.a
-J.mZ(z,a,J.xq(z.IX).Y2(z,z,b))},
-$isEH:true},
-lK:{
-"^":"Ap;I6,iU,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
-ho:[function(a){var z,y,x,w,v
-for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
-if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().eA.t(0,y)
-if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
-v=w.$1(z)
-z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,169,161],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.ta(this.q0,b)
-return b},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.x0(this.q0)}},
-FT:{
-"^":"a;jd,ih,lS",
-Ws:function(){return this.jd.$0()},
-t6:function(a,b,c){var z
-this.TP(0)
-this.jd=b
-z=window
-C.ma.hr(z)
-this.lS=C.ma.oB(z,W.aF(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.lS
-if(z!=null){y=window
-C.ma.hr(y)
-y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
-if(z!=null){z.ed()
-this.ih=null}}},
-K3:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.TP(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-mS:{
-"^":"Tp:69;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-hp:{
-"^":"Tp:69;",
-$0:[function(){var z=$.iF().MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(null)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-k2:{
-"^":"Tp:174;a,b",
-$3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,172,56,173,"call"],
-$isEH:true},
-v4:{
-"^":"Tp:69;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=$.Rs()
-u=P.Fl(null,null)
-t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
-$.RA().u(0,y,t)
-t.Zw(w)
-s=t.Q7
-if(s!=null)t.NF=t.Yl(s)
-t.rH()
-t.I9()
-s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.Ky(r),v)
-t.Mi()
-t.f6()
-t.m1()
-A.h6(t.J3(t.kO("global"),"global"),document.head)
-t.Cw(z)
-t.Vk()
-t.W3(u)
-q=s.gQg(z).MW.getAttribute("assetpath")
-if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
-z=P.hK(q)
-o=z.Fi
-if(o!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
-if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.Ky(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
-z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
-if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
-t.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-Md:{
-"^":"Tp:69;",
-$0:function(){var z=J.UQ(P.Cq(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.Cq(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
-"^":"",
-q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
-dX:function(a){var z
-this.Pa(a)
-a.Hf=M.Ky(a)
-z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
-$.iF().MM.ml(new Y.lkK(a))},
-$isDT:true,
-$isvy:true,
-static:{zE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Gkp.ZL(a)
-C.Gkp.dX(a)
-return a}}},
-GLL:{
-"^":"OH+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
-$isd3:true},
-lkK:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-z.setAttribute("bind","")
-J.mI(z,new Y.oO(z))},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-oO:{
-"^":"Tp:13;b",
-$1:[function(a){var z,y
-z=this.b
-y=J.RE(z)
-y.Ec(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-zp:{
-"^":"Li;dq,Mn,cJ",
-Y2:function(a,b,c){var z={}
-z.a=a
-return new Y.PA(z,this,c)}},
-PA:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w,v,u
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.dq
-z.a=x
-y=x}w=J.x(y)
-if(!!w.$iszs){y=J.RE(a)
-w=y.gey(a)
-y=y.gCa(a)
-v=z.a
-u=this.b.dq
-if(v===u)v=J.ZH(u.Hf)
-J.Pj(z.a,v,this.c,[a,w,y])}else throw H.b(P.w("controller "+w.bu(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
-$isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
-"^":"",
-Zh:function(a,b,c){var z,y,x
-z=$.QL().t(0,c)
-if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
-return y}catch(x){H.Ru(x)
-return a}},
-lP:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Uf:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Ra:{
-"^":"Tp:77;",
-$2:function(a,b){var z,y
-try{z=P.zu(a)
-return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-wJY:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-zOQ:{
-"^":"Tp:77;",
-$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
-$isEH:true},
-fT:{
-"^":"Tp:13;a",
-$1:function(a){return this.a},
-$isEH:true},
-W6o:{
-"^":"Tp:77;",
-$2:function(a,b){return H.RR(a,new Z.Lf(b))},
-$isEH:true},
-Lf:{
-"^":"Tp:13;b",
-$1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
-"^":"",
-dA:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.zg(a.gvc(),new T.Fi(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.k9(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","m9",2,0,13,65],
-Fi:{
-"^":"Tp:13;a",
-$1:function(a){return J.xC(this.a.t(0,a),!0)},
-$isEH:true},
-k9:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-QB:{
-"^":"vE;uc,jw,YD,zA,cJ",
-US:function(a,b,c){var z,y,x,w
-z={}
-y=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-x=new U.tu()
-x=new T.FX(x,y,null,null)
-y=y.zl()
-x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)])
-x.Bp()
-w=x.Te()
-if(M.CF(c)){y=J.x(b)
-y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
-if(y){z=J.x(w)
-if(!!z.$isb4)return new T.H1(this,w.gF5(),z.gkZ(w))
-else return new T.kj(this,w)}z.a=null
-y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.qb(z,this,w)},
-CE:function(a){var z=this.zA.t(0,a)
-if(z==null)return new T.uK(this,a)
-return new T.Wb(this,a,z)},
-qF:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=z.gBy(a)
-if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Ky(a)
-z=J.RE(x)
-w=z.gCn(x)
-v=w==null?z.gk8(x):w.k8
-if(!!J.x(v).$isGK)return v
-else return this.YD.t(0,a)}return this.qF(y)},
-hm:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.YD
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.b8(z.gBy(a),b)
-else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.b8(a,b)}},
-b8:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Ky(a)
-y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
-return this.YD.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.YD.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.b8(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
-z=H.VM(new P.qo(null),[K.GK])
-y=H.VM(new P.qo(null),[P.qU])
-x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.QB(b,x,z,y,null)}}},
-H1:{
-"^":"Tp:175;b,c,d",
-$3:[function(a,b,c){var z,y
-z=this.b
-z.zA.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-z=T.m9()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-kj:{
-"^":"Tp:175;e,f",
-$3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-z=T.m9()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-qb:{
-"^":"Tp:175;a,UI,bK",
-$3:[function(a,b,c){var z,y
-z=this.UI.hm(b,a)
-if(c===!0)return T.rD(this.bK,z,this.a.a)
-y=this.a.a
-if(y==null)y=T.m9()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-uK:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.YD.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.hm(y,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-Wb:{
-"^":"Tp:13;c,d,e",
-$1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.YD.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.qF(y).t1(w,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;FT,pk,oF,RU,EU,q5,pU",
-Qv:function(a){return this.pk.$1(a)},
-ZW:function(a){return this.RU.$1(a)},
-LZ:[function(a,b){var z,y
-z=this.pU
-y=this.Qv(a)
-this.pU=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.pU)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,176,177,64,178],
-gP:function(a){if(this.RU!=null)return this.pU
-return T.rD(this.oF,this.FT,this.pk)},
-sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.oF,b,this.FT,!1)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.oF)+"': "+H.d(y),x)}},
-TR:function(a,b){var z,y,x,w,v
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Eo(null,null)
-w=this.oF.RR(0,new K.rdH(x))
-this.q5=w
-x=w.glr().yI(this.gTJ())
-x.fm(0,new T.Tg(this))
-this.EU=x
-try{x=this.q5
-J.NV(x,new K.Ed(this.FT))
-x.gXr()
-this.LZ(this.q5.gXr(),!0)}catch(v){x=H.Ru(v)
-z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.q5)+"': "+H.d(z),y)}return this.pU},
-S6:function(a){var z,y
-if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.RU=null
-z=$.Pk()
-y=this.q5
-z.toString
-J.NV(y,z)
-this.q5=null},
-static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=J.NV(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.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-Tg:{
-"^":"Tp:77;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.q5)+"': "+H.d(a),b)},"$2",null,4,0,null,1,143,"call"],
-$isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
-"^":"",
-De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
-z.vb(a,b)
-return z}}},
-fg:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.Ha,z.DA,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
-"^":"",
-jX:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.hw])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(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.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isx9){w=a.gTf()
-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.Kp(z,0)]);y.G();){u=y.lo
-J.NV(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.NV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.NV(x,new K.GQ(c)),b)
-else{y=$.b7().Nz.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-dZ:function(a,b){var z,y,x
-z=new K.nk(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.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w10:{
-"^":"Tp:77;",
-$2:function(a,b){return J.ew(a,b)},
-$isEH:true},
-w11:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
-w12:{
-"^":"Tp:77;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
-w13:{
-"^":"Tp:77;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
-w14:{
-"^":"Tp:77;",
-$2:function(a,b){return J.jO(a,b)},
-$isEH:true},
-w15:{
-"^":"Tp:77;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
-w16:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
-w17:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
-w18:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
-w19:{
-"^":"Tp:77;",
-$2:function(a,b){return J.z8(a,b)},
-$isEH:true},
-w20:{
-"^":"Tp:77;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
-w21:{
-"^":"Tp:77;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
-w22:{
-"^":"Tp:77;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w23:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w24:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w25:{
-"^":"Tp:77;",
-$2:function(a,b){var z=H.Og(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
-$isEH:true},
-Raa:{
-"^":"Tp:13;",
-$1:function(a){return a},
-$isEH:true},
-w0:{
-"^":"Tp:13;",
-$1:function(a){return J.jzo(a)},
-$isEH:true},
-w5:{
-"^":"Tp:13;",
-$1:function(a){return a!==!0},
-$isEH:true},
-GK:{
-"^":"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."))
-return new K.PO(this,a,b)},
-$isGK:true,
-$isab:true,
-$asab:function(){return[P.qU,P.a]}},
-nk:{
-"^":"GK;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.b7().Nz.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
-NX:function(a){return!J.xC(a,"this")},
-bu:function(a){return"[model: "+H.d(this.k8)+"]"}},
-PO:{
-"^":"GK;eT>,Z0,P>",
-gk8:function(a){var z=this.eT
-z=z.gk8(z)
-return z},
-t:function(a,b){var z
-if(J.xC(this.Z0,b)){z=this.P
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-NX:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.NX(a)},
-bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-Ph:{
-"^":"GK;eT>,Z3<",
-gk8:function(a){return this.eT.k8},
-t:function(a,b){var z=this.Z3
-if(z.x4(b)){z=z.t(0,b)
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-NX:function(a){if(this.Z3.x4(a))return!1
-return!J.xC(a,"this")},
-bu:function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Kp(z,0)]),"(",")")+"]"}},
-Ay0:{
-"^":"a;NV?,Y4<",
-glr:function(){var z=this.Zj
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gXr:function(){return this.Y4},
-ab:function(a){},
-tf:function(a){var z
-this.Ra(0,a)
-z=this.NV
-if(z!=null)z.tf(a)},
-PK:function(){var z=this.a9
-if(z!=null){z.ed()
-this.a9=null}},
-Ra:function(a,b){var z,y,x
-this.PK()
-z=this.Y4
-this.ab(b)
-y=this.Y4
-if(y==null?z!=null:y!==z){x=this.Zj
-if(x.Gv>=4)H.vh(x.q7())
-x.Iv(y)}},
-bu:function(a){return this.r3.bu(0)},
-$ishw:true},
-Ed:{
-"^":"cfS;qu",
-xn:function(a){a.Ra(0,this.qu)}},
-me:{
-"^":"cfS;",
-xn:function(a){a.PK()},
-static:{"^":"jC"}},
-GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-if(z==null)return
-y=a.goc(a)
-x=$.b7().Nz.t(0,y)
-return $.cp().jD(z,x)},
-CU:function(a){var z=J.NV(a.gTf(),this)
-if(z==null)return
-return J.UQ(z,J.NV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(z==null)return
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.im(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.b7().Nz.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
-o0:function(a){var z,y,x
-z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-z.u(0,J.NV(J.A6(x),this),J.NV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
-qv:function(a){return J.UQ(this.qu,a.gP(a))},
-ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
-y=J.NV(a.gBb(a),this)
-x=J.NV(a.gT8(a),this)
-w=$.Rab().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)
-else if(y==null||x==null)return
-return w.$2(y,x)},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=$.qL().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
-return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.NV(a.gdc(),this),!0)?J.NV(a.gSl(),this):J.NV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
-rdH:{
-"^":"P55;lk",
-W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y
-z=J.NV(a.gTf(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(v)
-if(y!=null)H.bQ(y,new K.zD(v))
-return v},
-oD: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.ghL(),this.gay()),[null,null]).tt(0,!1)
-y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
-return y},
-o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.B8(y))
-return y},
-YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-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.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-RD:function(a){var z,y,x,w
-z=J.NV(a.gdc(),this)
-y=J.NV(a.gSl(),this)
-x=J.NV(a.gru(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(w)
-y.sNV(w)
-x.sNV(w)
-return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-XV:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-B8:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-uD:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=J.ZH(a)},
-RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
-z0:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z=this.r3
-this.Y4=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
-$ishw:true},
-kL:{
-"^":"Ay0;hL<,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
-RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$ishw:true},
-Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-ev:{
-"^":"Ay0;Rl>,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
-RR:function(a,b){return b.o0(this)},
-$asAy0:function(){return[U.Qb]},
-$isQb:true,
-$ishw:true},
-Ku:{
-"^":"Tp:77;",
-$2:function(a,b){J.kW(a,J.A6(b).gY4(),b.gv4().gY4())
-return a},
-$isEH:true},
-qR:{
-"^":"Ay0;G3>,v4<,r3,NV,a9,Y4,Zj",
-RR:function(a,b){return b.YV(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
-$ishw:true},
-ek:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z,y,x,w
-z=this.r3
-y=J.U6(a)
-this.Y4=y.t(a,z.gP(z))
-if(!a.NX(z.gP(z)))return
-x=y.gk8(a)
-y=J.x(x)
-if(!y.$isd3)return
-z=z.gP(z)
-w=$.b7().Nz.t(0,z)
-this.a9=y.gqh(x).yI(new K.j9(this,a,w))},
-RR:function(a,b){return b.qv(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
-$ishw:true},
-j9:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GC:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-mv:{
-"^":"Ay0;wz<,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y
-z=this.r3
-y=$.qL().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gY4()
-this.Y4=y.$1(z==null?!1:z)}else{z=this.wz
-this.Y4=z.gY4()==null?null:y.$1(z.gY4())}},
-RR:function(a,b){return b.Hx(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
-$ishw:true},
-kyp:{
-"^":"Ay0;Bb>,T8>,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y,x
-z=this.r3
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gY4()
-if(z==null)z=!1
-x=this.T8.gY4()
-this.Y4=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Y4=y.$2(this.Bb.gY4(),this.T8.gY4())
-else{x=this.Bb
-if(x.gY4()==null||this.T8.gY4()==null)this.Y4=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gY4()).$iswn)this.a9=H.Go(x.gY4(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Y4=y.$2(x.gY4(),this.T8.gY4())}}},
-RR:function(a,b){return b.ex(this)},
-$asAy0:function(){return[U.uku]},
-$isuku:true,
-$ishw:true},
-P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.tf(this.b)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-WW:{
-"^":"Ay0;dc<,Sl<,ru<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z=this.dc.gY4()
-this.Y4=(z==null?!1:z)===!0?this.Sl.gY4():this.ru.gY4()},
-RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
-$ishw:true},
-vl:{
-"^":"Ay0;Tf<,r3,NV,a9,Y4,Zj",
-goc:function(a){var z=this.r3
-return z.goc(z)},
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.r3
-y=y.goc(y)
-x=$.b7().Nz.t(0,y)
-this.Y4=$.cp().jD(z,x)
-y=J.x(z)
-if(!!y.$isd3)this.a9=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
-$asAy0:function(){return[U.x9]},
-$isx9:true,
-$ishw:true},
-fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-WKb:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.Jn.gY4()
-x=J.U6(z)
-this.Y4=x.t(z,y)
-if(!!x.$iswn)this.a9=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.a9=x.gqh(z).yI(new K.na(this,a,y))},
-RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
-$ishw:true},
-tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GST:{
-"^":"Tp:13;d",
-$1:[function(a){return a.XP(this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.zw(this.UI))===!0)this.e.tf(this.f)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-zw:{
-"^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-c3:{
-"^":"Ay0;Tf<,re<,r3,NV,a9,Y4,Zj",
-gSf:function(a){var z=this.r3
-return z.gSf(z)},
-ab:function(a){var z,y,x,w
-z=this.re
-z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gY4()
-if(x==null){this.Y4=null
-return}z=this.r3
-if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.Y4=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
-w=$.b7().Nz.t(0,z)
-this.Y4=$.cp().Ck(x,w,y,!1,null)
-z=J.x(x)
-if(!!z.$isd3)this.a9=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy0:function(){return[U.Nb]},
-$isNb:true,
-$ishw:true},
-Xh:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,46,"call"],
-$isEH:true},
-BGc:{
-"^":"Tp:179;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-vk:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-nD:{
-"^":"a;G1>",
-bu:function(a){return"EvalException: "+this.G1},
-static:{zq:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
-"^":"",
-Pu:function(a,b){var z,y
-if(a==null?b==null:a===b)return!0
-if(a==null||b==null)return!1
-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},
-b1:function(a){a.toString
-return U.Le(H.n3(a,0,new U.xs()))},
-C0C:function(a,b){var z=J.ew(a,b)
-if(typeof z!=="number")return H.s(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)
-a=536870911&a+((67108863&a)<<3>>>0)
-a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},
-tu:{
-"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,180,1,46]},
-hw:{
-"^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
-RR:function(a,b){return b.W9(this)},
-$isEO:true},
-no:{
-"^":"hw;P>",
-RR:function(a,b){return b.oD(this)},
-bu:function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
-n:function(a,b){var z
-if(b==null)return!1
-z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.xC(J.Vm(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isno:true},
-c0:{
-"^":"hw;hL<",
-RR:function(a,b){return b.Zh(this)},
-bu:function(a){return H.d(this.hL)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.b1(this.hL)},
-$isc0:true},
-Qb:{
-"^":"hw;Rl>",
-RR:function(a,b){return b.o0(this)},
-bu:function(a){return"{"+H.d(this.Rl)+"}"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.b1(this.Rl)},
-$isQb:true},
-ae:{
-"^":"hw;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
-bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
-giO:function(a){var z,y
-z=J.v1(this.G3.P)
-y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
-XC:{
-"^":"hw;wz",
-RR:function(a,b){return b.LT(this)},
-bu:function(a){return"("+H.d(this.wz)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
-giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-fp:{
-"^":"hw;P>",
-RR:function(a,b){return b.qv(this)},
-bu:function(a){return this.P},
-n: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)},
-$isfp:true},
-cJ:{
-"^":"hw;kp>,wz<",
-RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
-giO:function(a){var z,y
-z=J.v1(this.kp)
-y=J.v1(this.wz)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
-uku:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.ex(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
-giO:function(a){var z,y,x
-z=J.v1(this.kp)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isuku:true},
-mc:{
-"^":"hw;dc<,Sl<,ru<",
-RR:function(a,b){return b.RD(this)},
-bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
-giO:function(a){var z,y,x
-z=J.v1(this.dc)
-y=J.v1(this.Sl)
-x=J.v1(this.ru)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
-K9:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5: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)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isK9&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
-giO:function(a){var z,y
-z=this.Bb
-z=z.giO(z)
-y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isK9:true,
-$isb4:true},
-px:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
-gF5: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)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
-giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
-y=y.giO(y)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$ispx:true,
-$isb4:true},
-zX:{
-"^":"hw;Tf<,Jn<",
-RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.Jn)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
-Nb:{
-"^":"hw;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
-giO:function(a){var z,y,x
-z=J.v1(this.Tf)
-y=J.v1(this.Sf)
-x=U.b1(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isNb:true},
-xs:{
-"^":"Tp:77;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
-"^":"",
-FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
-lx:function(a,b){var z
-if(a!=null){z=this.vi.lo
-z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.vi.lo
-z=z==null||!J.xC(J.Vm(z),b)}else z=!1
-else z=!0
-if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
-Bp:function(){return this.lx(null,null)},
-GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5:function(a,b){var z,y,x,w,v,u
-for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
-this.rp.toString
-a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
-this.rp.toString
-a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
-a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rp.toString
-a=new U.K9(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
-a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
-if(typeof z!=="number")return z.F()
-if(typeof b!=="number")return H.s(b)
-z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
-v=this.Te()
-this.GI(5)
-u=this.Te()
-this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
-else break}return a},
-j6:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
-y=b.gre()
-this.rp.toString
-return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.vi.lo
-y=J.RE(z)
-if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gP9()
-v=z.gP9()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
-v=w>v
-w=v}else w=!1
-else w=!1
-if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
-this.rp.toString
-return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
-y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
-y.toString
-z=new U.no(x)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.G5(this.LL(),11)
-y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
-this.rp.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
-LL:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,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.jf()
-case 1:return this.ef()
-case 6:return this.DS()
-case 7:return this.Xk()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
-return
-case 5:throw H.b(Y.RV("unexpected token \":\""))
-default:return}},
-S9:function(){var z,y
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
-z.push(this.Te())
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
-return new U.c0(z)},
-pH:function(){var z,y,x
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
-x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
-return new U.Qb(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
-this.Bp()
-this.rp.toString
-y=new U.fp(z)
-x=this.rD()
-if(x==null)return y
-else return new U.Nb(y,null,x)},
-rD:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
-y.push(this.Te())
-z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
-return y}return},
-Ew:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
-y=this.Te()
-this.lx(9,"]")
-return y}return},
-ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Bu:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-DS:function(){return this.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
-"^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
-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)+")"},
-$isAep:true},
-Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
-grZ:function(a){var z,y
-z=this.YR
-y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
-vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
-return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:function(a){switch(a){case 102:return 12
-case 110:return 10
-case 114:return 13
-case 116:return 9
-case 118:return 11
-default:return a}},
-qS:{
-"^":"a;fY>,P>,P9<",
-bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isqS:true},
-pa:{
-"^":"a;MV,zy,jI,x0",
-zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.MV;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
-else{if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
-else w=!0
-if(w)this.zI()
-else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.Wn:null
-this.x0=x
-if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.oz()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.x0
-x=z.G()?z.Wn:null
-this.x0=x
-if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
-if(C.Nm.tg(C.G8,u)){x=z.G()?z.Wn:null
-this.x0=x
-if(x===61)x=v===33||v===61
-else x=!1
-if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
-y.push(new Y.qS(9,s,C.lx.t(0,s)))
-this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
-WG:function(){var z,y,x,w
-z=this.x0
-y=this.jI
-x=y.G()?y.Wn:null
-this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
-this.x0=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
-w.vM+=x}else{x=H.Lw(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(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.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
-z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
-y.vM=""},
-jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
-this.x0=z
-if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.oz()
-else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-oz:function(){var z,y,x,w
-z=this.zy
-z.KF(H.Lw(46))
-y=this.jI
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
-hA:{
-"^":"a;G1>",
-bu:function(a){return"ParseException: "+this.G1},
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
-"^":"",
-P55:{
-"^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,181,143]},
-cfS:{
-"^":"P55;",
-xn:function(a){},
-W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
-this.xn(a)},
-fV:function(a){J.NV(a.gTf(),this)
-this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
-this.xn(a)},
-ZR:function(a){var z
-J.NV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-oD:function(a){this.xn(a)},
-Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
-this.xn(a)},
-qv:function(a){this.xn(a)},
-ex:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
-this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
-this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
-"^":"",
-ov:{
-"^":"V42;oX,GR,cI,Bi=,xo,ZJ,Kf,Oq,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
-gBV:function(a){return a.GR},
-sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
-gMl:function(a){return a.cI},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,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)},
-gGd:function(a){return a.Kf},
-sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Es:function(a){Z.uL.prototype.Es.call(this,a)},
-rh:[function(a,b){this.mC(a)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.mC(a)},"$1","gIF",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gP3",2,0,20,57],
-DJ:[function(a,b){if(b==null)return"min-width:32px;"
-else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,182],
-mC:function(a){var z,y,x
-if(a.Oq!=null)return
-if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.FW(a))
-return}z=a.GR
-z=z!=null?J.bI(a.oX.q6(z),1):0
-a.xo=this.ct(a,C.nt,a.xo,z)
-z=a.cI
-y=a.oX
-z=z!=null?y.q6(z):J.q8(J.de(y))
-a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-z=a.Bi
-z.V1(z)
-for(x=a.xo;y=J.Wx(x),y.C(x,a.ZJ);x=y.g(x,1))z.h(0,x)},
-static:{"^":"bN,MRW,VnP",T5i:function(a){var z,y,x,w
-z=Q.ch(null,P.KN)
-y=R.tB([])
-x=P.L5(null,null,null,P.qU,W.I0)
-w=P.qU
-w=H.VM(new V.qC(P.YM(null,null,null,w,null),null,null),[w,null])
-a.Bi=z
-a.Kf=y
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=x
-a.ZQ=w
-C.Fa.ZL(a)
-C.Fa.XI(a)
-return a}}},
-V42:{
-"^":"uL+Pi;",
-$isd3:true},
-FW:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
-"^":"",
-kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gBV:function(a){return a.jJ},
-sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
-gJp:function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gdN()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-r6:[function(a,b){var z=a.tY
-if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
-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.gvo(a))}return Q.xI.prototype.goc.call(this,a)},
-gO3:function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0)){z=J.iS(a.tY)
-y=a.tY
-if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
-static:{D2:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.jJ=-1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yj.ZL(a)
-C.Yj.XI(a)
-return a}}},
-oEY:{
-"^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
-"^":"",
-fI:{
-"^":"V43;Uz,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
-if(z==null)return
-J.SK(z)},
-RF:[function(a,b){J.r0(a.Uz).Qy(b)},"$1","gvC",2,0,20,90],
-Ur:[function(a,b){J.eg(J.aT(a.Uz)).Qy(b)},"$1","gDX",2,0,20,90],
-static:{dI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.FH.ZL(a)
-C.FH.XI(a)
-return a}}},
-V43:{
-"^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
-"^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
-if(b==null)return
-z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.dy
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.vO
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-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)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
-z.$builtinTypeInfo=[D.Fc]
-x=[]
-x.$builtinTypeInfo=[D.Fc]
-w=D.DP
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
-z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,P.qU,D.af)
-w=[]
-w.$builtinTypeInfo=[P.qU]
-v=[]
-v.$builtinTypeInfo=[D.ER]
-u=D.dy
-t=[]
-t.$builtinTypeInfo=[u]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[u]
-u=D.U4
-r=[]
-r.$builtinTypeInfo=[u]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
-u=R.tB(u)
-s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,r,null,null,null,null,null,u,new D.eK(0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,null,null),null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Library":z=D.U4
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.vx
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.dy
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.vO
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Script":z=D.c2
-x=[]
-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,null,null,null,a,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,!1,null,null,null,null,null)
-break
-default: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,!1,null,null,null,null,null)}s.eC(b)
-return s},
-D5:function(a){var z
-if(a!=null){z=J.U6(a)
-z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},
-kT:function(a,b){var z=J.x(a)
-if(!!z.$isvO)return
-if(!!z.$isqC)D.yX(a,b)
-else if(!!z.$iswn)D.f3(a,b)},
-yX: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.ao,y=0;y<z.length;++y){x=z[y]
-w=J.x(x)
-v=!!w.$isqC
-if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
-else u=!1
-if(u)a.u(0,y,b.Qn(x))
-else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.yX(x,b)}},
-af:{
-"^":"Pi;px@,t7@",
-gwv:function(a){var z=this.Q4
-return z.gwv(z)},
-god:function(a){var z=this.Q4
-return z.god(z)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.Q4.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
-gfS:function(){return!1},
-goc:function(a){return this.gpx()},
-soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
-gdN:function(){return this.gt7()},
-sdN:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gfS())return P.Ab(this,null)
-z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.JM(this)).Qy(new D.Bf(this))
-this.VR=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.rY(x)
-if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-$isaf:true},
-JM:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.rY(z)
-if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.mQ))return D.hi(y.Q4,a)
-y.eC(a)
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Bf:{
-"^":"Tp:69;b",
-$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-xm:{
-"^":"af;"},
-wv:{
-"^":"O1w;",
-gwv:function(a){return this},
-god:function(a){return},
-giR:function(){var z=this.z7
-return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,152,185],
-gYe:function(a){return this.Ox},
-gJk:function(){return this.RW},
-gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gU6:function(){return this.bQ},
-gPE:function(){return this.l7},
-jq:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},
-TV:function(a){var z,y,x
-z=$.vo().R4(0,a)
-if(z==null)return""
-y=z.QK
-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)
-return J.Nj(a,0,x+y)},
-Qn:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
-z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
-cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.TV(a)
-y=this.jq(a)
-return this.Tn(z).ml(new D.it(this,y))}x=this.yM.t(0,a)
-if(x!=null)return J.r0(x)
-return this.HL(a).ml(new D.lb(this,a))},
-nJm:[function(a,b){return b},"$2","ge1",4,0,77],
-ng:function(a){var z,y,x
-z=null
-try{y=new P.c5(this.ge1())
-z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
-return}return R.tB(z)},
-N7:function(a){var z
-if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.Vu(D.hi(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
-return P.Ab(a,null)},
-HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
-bF:function(a,b,c){var z,y
-if(c)return
-this.kT=!0
-z=J.U6(b)
-y=z.t(b,"version")
-this.Ox=F.Wi(this,C.zn,this.Ox,y)
-y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
-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.bQ=F.Wi(this,C.uI,this.bQ,y)
-y=z.t(b,"typeChecksEnabled")
-this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
-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)
-else{u=D.hi(this,w)
-y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.y2())
-this.z7=y},
-md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
-this.t7=this.ct(this,C.Tc,this.t7,"vm")
-this.yM.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.tB(z))},
-$iswv:true},
-O1w:{
-"^":"xm+Pi;",
-$isd3:true},
-MZ:{
-"^":"Tp:13;a,b",
-$1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-it:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.r0(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
-$isEH:true},
-lb:{
-"^":"Tp:184;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-zK:{
-"^":"Tp:69;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w
-z=null
-try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
-y=w
-P.FL("Hit V8 bug.")
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.tB(w)
-return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-tm:{
-"^":"Tp:13;b",
-$1:[function(a){var z=this.b.G2
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-mR:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-bp:{
-"^":"Tp:13;c",
-$1:[function(a){var z=this.c.Li
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
-$isEH:true},
-hc:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-y2:{
-"^":"Tp:77;",
-$2:function(a,b){J.r0(b)},
-$isEH:true},
-ER:{
-"^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.XE
-H.vf(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.wZ
-v=z[x]
-if(typeof v!=="number")return H.s(v)
-this.wZ=w+v}},
-y8:function(a,b){var z,y,x,w,v,u,t
-for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
-if(v>=w)return H.e(b,v)
-u=J.bI(u,b[v])
-z[v]=u
-t=this.wZ
-if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},
-k5:function(a,b){var z,y,x,w,v,u
-z=J.U6(b)
-y=this.XE
-x=y.length
-w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(b,w)
-if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
-CJ:function(){var z,y,x
-for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
-$isER:true},
-tL:{
-"^":"a;af<,lI<,h7,yP,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=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.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
-v=Array(v)
-v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
-u=new D.ER(0,v,0)
-u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.yP=z
-z.eK(y)
-return}z=this.QS
-if(typeof z!=="number")return H.s(z)
-z=Array(z)
-z.fixed$length=init
-u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.yP.XE)
-this.yP.k5(0,y)
-z=this.lI
-z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
-eK:{
-"^":"Pi;mV,ob,pX,yp,uK,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
-gYk:function(){return this.yp},
-gpy:function(){return this.uK},
-eC:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
-y=z.t(a,"capacity")
-this.ob=F.Wi(this,C.bV,this.ob,y)
-y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-z=z.t(a,"time")
-this.uK=F.Wi(this,C.Jl,this.uK,z)}},
-bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,yM,GH,Z2,AI,v9,tW,zb,px:KT@,t7:f5@,i9,SF,Dr,UY<,xQ<,vJ,zf,BC<,FF,bj,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gwv:function(a){return this.Q4},
-god:function(a){return this},
-gXE:function(a){return this.V3},
-sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
-gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
-gaj:function(){return this.eU},
-gjz:function(){return this.zG},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,152,185],
-N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
-y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.pl(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.Q3(w,z)},
-c2:function(){var z=this.yM
-z.gUQ(z).aN(0,new D.TV())},
-pl:function(a,b){var z,y,x,w
-z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
-Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gDX",0,0,186],
-cNN:[function(a){J.Me(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,135,187],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gjR())},
-Dw:[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.YZ(z,!1)},"$1","geL",2,0,188,189],
-xk:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.Z2=F.Wi(this,C.as,this.Z2,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Z2
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
-w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Z2=x}}return P.Ab(this.Z2,null)},"$1","gjR",2,0,190,191],
-Qn:function(a){var z,y,x
-if(a==null)return
-z=J.UQ(a,"id")
-y=this.yM
-x=y.t(0,z)
-if(x!=null)return x
-x=D.hi(this,a)
-if(x.gUm())y.u(0,z,x)
-return x},
-cv:function(a){var z=this.yM.t(0,a)
-if(z!=null)return J.r0(z)
-return this.Q4.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Z2},
-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)},
-gdN:function(){return this.f5},
-sdN:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-WU:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-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.Tc,this.f5,y)
-if(c)return
-this.kT=!0
-this.zG=F.Wi(this,C.DY,this.zG,!1)
-D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
-return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.eN,this.v9,y)
-if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
-x=z.t(b,"tagCounters")
-if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
-y=J.U6(v)
-u=0
-t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(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=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
-if(u===0){y=J.U6(w)
-t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
-t=0
-while(!0){r=s.gB(w)
-if(typeof r!=="number")return H.s(r)
-if(!(t<r))break
-J.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.Dr
-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.ew(J.ew(J.ew(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
-s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.WU(z.t(b,"heaps"))
-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.Bs,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.zf=F.Wi(this,C.yh,this.zf,y)
-y=this.tW
-y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
-m7:function(){return this.Q4.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-Q3:function(a,b){this.FF=0
-this.bj=a
-if(a==null)return
-if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
-if(typeof y!=="number")return y.g()
-this.FF=y+1
-x=J.UQ(z,y)
-if(x>>>0!==x||x>=a.length)return H.e(a,x)
-w=a[x]
-y=this.bj
-z=this.FF
-if(typeof z!=="number")return z.g()
-this.FF=z+1
-v=J.UQ(y,z)
-z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
-y=this.bj
-t=this.FF
-if(typeof t!=="number")return t.g()
-this.FF=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
-r=0
-for(;r<s;++r){q=this.AW(a)
-z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-$isbv:true,
-static:{"^":"ZGx"}},
-uz4:{
-"^":"xm+Pi;",
-$isd3:true},
-TV:{
-"^":"Tp:13;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
-a.Du=0
-a.fF=0
-a.mM=F.Wi(a,C.eF,a.mM,"")
-a.qH=F.Wi(a,C.uU,a.qH,"")
-C.Nm.sB(a.VS,0)
-C.Nm.sB(a.hw,0)
-a.Oo.V1(0)}},
-$isEH:true},
-Yb:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,192,"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:184;a,b",
-$1:[function(a){var z,y
-z=this.a
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Ea:{
-"^":"Tp:69;c",
-$0:function(){return this.c},
-$isEH:true},
-Qq:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,193,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:77;",
-$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
-$isEH:true},
-AP:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=Date.now()
-new P.iP(z,!1).EK()
-y=this.a.GH
-y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,146,"call"],
-$isEH:true},
-vO:{
-"^":"af;Ce,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
-gfS:function(){return!1},
-bu:function(a){return P.vW(this.Ce)},
-bF:function(a,b,c){var z,y,x
-this.kT=!c
-z=this.Ce
-z.V1(0)
-z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
-this.px=this.ct(0,C.YS,this.px,x)
-y=y.t(0,"name")
-this.t7=this.ct(0,C.Tc,this.t7,y)
-D.kT(z,this.Q4)},
-FV:function(a,b){return this.Ce.FV(0,b)},
-V1:function(a){return this.Ce.V1(0)},
-aN:function(a,b){return this.Ce.Zp.aN(0,b)},
-t:function(a,b){return this.Ce.Zp.t(0,b)},
-u:function(a,b,c){this.Ce.u(0,b,c)
-return c},
-gl0:function(a){var z=this.Ce.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Ce.Zp
-return z.gB(z)!==0},
-gvc:function(){return this.Ce.Zp.gvc()},
-gUQ:function(a){var z=this.Ce.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Ce.Zp
-return z.gB(z)},
-HC:[function(a){var z=this.Ce
-return z.HC(z)},"$0","gDx",0,0,111],
-nq:function(a,b){var z=this.Ce
-return z.nq(z,b)},
-ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,18],
-NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
-gqh:function(a){var z=this.Ce
-return z.gqh(z)},
-gnz:function(a){var z,y
-z=this.Ce.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-$isvO:true,
-$isqC:true,
-$asqC:function(){return[null,null]},
-$isZ0:true,
-$asZ0:function(){return[null,null]},
-$isd3:true,
-static:{"^":"RQ"}},
-ft:{
-"^":"D3;I0,LD,jo,YS,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-gja:function(a){return this.jo},
-sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
-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.Q4
-x=D.hi(y,z.t(b,"exception"))
-this.jo=F.Wi(this,C.ne,this.jo,x)
-z=D.hi(y,z.t(b,"stacktrace"))
-this.YS=F.Wi(this,C.Pf,this.YS,z)
-z="DartError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)}},
-D3:{
-"^":"af+Pi;",
-$isd3:true},
-N7:{
-"^":"wVq;I0,LD,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.kT=!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.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)},
-$isN7:true},
-wVq:{
-"^":"af+Pi;",
-$isd3:true},
-EP:{
-"^":"dZL;I0,LD,IV,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-gbA:function(a){return this.IV},
-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.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)},
-$isEP:true},
-dZL:{
-"^":"af+Pi;",
-$isd3:true},
-U4:{
-"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gO3:function(a){return this.dj},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"url")
-x=F.Wi(this,C.Fh,this.dj,y)
-this.dj=x
-if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
-w=J.U6(y)
-v=w.cn(y,"/")
-if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"user_name")
-y=this.ct(this,C.YS,this.px,y)
-this.px=y
-if(J.FN(y)===!0)this.px=this.ct(this,C.YS,this.px,x)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-y=this.Bm
-y.V1(y)
-y.FV(0,z.t(b,"imports"))
-y=this.XR
-y.V1(y)
-y.FV(0,z.t(b,"scripts"))
-y=this.DD
-y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y=this.Z3
-y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))},
-$isU4:true},
-w8F:{
-"^":"af+Pi;",
-$isd3:true},
-mT:{
-"^":"Pi;wf,yg,AP,fn",
-gWt:function(){return this.wf},
-gfj:function(){return this.yg}},
-Iy:{
-"^":"a;bi<,l<",
-eC:function(a){var z,y,x
-z=this.bi
-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.yg=F.Wi(z,C.hN,z.yg,x)
-x=this.l
-z=J.ew(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.ew(y.t(a,3),y.t(a,5))
-x.yg=F.Wi(x,C.hN,x.yg,y)},
-static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,zf,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gHt:function(a){return this.Gz},
-sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.qX},
-suj:function(a){this.qX=F.Wi(this,C.Cw,this.qX,a)},
-gVM:function(){return this.Xj},
-gi2:function(){return this.J1},
-gVF:function(){return this.Aj},
-sVF:function(a){this.Aj=F.Wi(this,C.z6,this.Aj,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-gMp:function(){var z,y
-z=this.UY
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1
-if(z){z=this.xQ
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1}else z=!1
-return z},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bu:function(a){return"Service Class: "+H.d(this.t7)},
-bF:function(a,b,c){var z,y,x
-z=J.U6(b)
-y=z.t(b,"user_name")
-this.px=this.ct(this,C.YS,this.px,y)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-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.Xj=F.Wi(this,C.XH,this.Xj,y)
-y=z.t(b,"const")
-this.vY=F.Wi(this,C.bD,this.vY,y)
-y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,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.Ih,this.E8,y)
-y=z.t(b,"tokenPos")
-this.Aj=F.Wi(this,C.z6,this.Aj,y)
-y=this.S5
-y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y=this.tJ
-y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.qX,y)
-this.qX=y
-if(y!=null)y.Ib(this)
-y=z.t(b,"error")
-this.zf=F.Wi(this,C.yh,this.zf,y)
-x=z.t(b,"allocationStats")
-if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-cv:function(a){var z=this.Q4
-return z.god(z).cv(J.ew(this.r0,"/"+H.d(a)))},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
-c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
-vx:{
-"^":"Zqa;Gd>,d6,I0,U9,nE,mB,wA,y6,FB,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-ghY:function(){return this.U9},
-shY:function(a){var z=this.U9
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.U9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
-gUm:function(){return!0},
-gfS:function(){return!0},
-rK:function(a){var z,y
-z=J.bI(a,1)
-y=this.Gd.ao
-if(z>>>0!==z||z>=y.length)return H.e(y,z)
-return y[z]},
-q6:function(a){return this.y6.t(0,a)},
-bF:function(a,b,c){var z,y,x,w
-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.wA=y
-x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.mB=w
-this.px=this.ct(this,C.YS,this.px,w)
-w=this.wA
-this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))},
-PT:function(a){var z,y,x,w,v,u,t,s,r
-if(a==null)return
-this.y6=P.Fl(null,null)
-this.FB=P.Fl(null,null)
-this.U9=F.Wi(this,C.Gd,this.U9,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
-for(z=J.mY(a);z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,0)
-v=1
-while(!0){u=x.gB(y)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-t=x.t(y,v)
-s=x.t(y,v+1)
-u=this.U9
-if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.U9=t
-u=this.nE
-if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.nE=t}else{u=J.Bl(u,t)?this.U9:t
-r=this.U9
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
-this.FB.u(0,t,s)
-v+=2}}},
-SC:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=this.d6
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(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.ew(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
-if(a==null)return
-z=J.uH(a,"\n")
-if(z.length===0)return
-this.kT=!0
-y=this.Gd
-y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
-zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
-$isvx:true},
-Zqa:{
-"^":"af+Pi;",
-$isd3:true},
-uA:{
-"^":"a;Yu<,Du<,fF<",
-$isuA:true},
-xb:{
-"^":"Pi;Yu<,JP,VF<,YnP,fY>,ar,MT,AP,fn",
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gJz:function(){return this.MT},
-JM:[function(){var z,y
-z=this.JP
-y=J.x(z)
-if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,194],
-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
-y=a.q6(z)
-if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
-$isxb:true},
-DP:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
-dV:[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,194],
-io:[function(a){var z
-if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
-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,195,71],
-HU:[function(a){var z
-if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
-if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,195,71],
-eQ:function(){var z,y,x,w
-y=J.uH(this.L4," ")
-x=y.length
-if(x!==2)return 0
-if(1>=x)return H.e(y,1)
-z=y[1]
-if(J.co(z,"0x"))z=J.ZZ(z,2)
-try{x=H.BU(z,16,null)
-return x}catch(w){H.Ru(w)
-return 0}},
-Sd:function(a){var z,y,x,w,v
-z=this.L4
-if(!J.co(z,"j"))return
-y=this.eQ()
-x=J.x(y)
-if(x.n(y,0)){P.FL("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
-if(J.xC(v.gYu(),y)){z=this.dh
-if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=v
-return}}P.FL("Could not find instruction at "+x.WZ(y,16))},
-$isDP:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-WAE:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Oci,pg,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
-N.QM("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.EY())}}},
-Fc:{
-"^":"a;tT>,Av<",
-$isFc:true},
-t9:{
-"^":"a;tT>,Av<,ks>,Jv",
-$ist9:true},
-kx:{
-"^":"D3i;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,dN@,TD,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-glt:function(){return this.xM},
-gS7:function(){return this.mM},
-gan:function(){return this.qH},
-gL1:function(){return this.Ni},
-sL1:function(a){this.Ni=F.Wi(this,C.zO,this.Ni,a)},
-gig:function(a){return this.MO},
-sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gYG:function(){return this.MH},
-gUm:function(){return!0},
-gfS:function(){return!0},
-tx:[function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,196,197],
-OF:function(){if(this.ar!=null)return
-if(!J.xC(this.I0,C.l8))return
-var z=this.MO
-if(z==null)return
-if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.UQ(this.MO,"script")).ml(this.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
-return P.Ab(this,null)},
-bd: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)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new D.Fc(c[w],v))
-y+=2}H.rd(a,new D.fx())},
-Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,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.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.hw,z.t(a,"callees"),b)
-y=z.t(a,"ticks")
-if(y!=null)this.qL(y)
-z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.dN=z.t(b,"name")
-y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
-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.Oj=H.BU(z.t(b,"start"),16,null)
-this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.Q4
-x=y.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.god(y).Qn(z.t(b,"object_pool"))
-this.Ni=F.Wi(this,C.zO,this.Ni,y)
-w=z.t(b,"disassembly")
-if(w!=null)this.xs(w)
-v=z.t(b,"descriptors")
-if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.ao
-this.kT=z.length!==0||!J.xC(this.I0,C.l8)
-z=z.length!==0&&J.xC(this.I0,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},
-gUa:function(){return this.TD},
-xs:function(a){var z,y,x,w,v,u,t,s
-z=this.va
-z.V1(z)
-y=J.U6(a)
-x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(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.xb
-s=[]
-s.$builtinTypeInfo=[w]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[w]
-z.h(0,new D.DP(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
-QX: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.lo
-if(J.xC(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))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=this.Oo
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(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)))
-x+=3}},
-tg:function(a,b){J.J5(b,this.Oj)
-return!1},
-gkU:function(){return J.xC(this.I0,C.l8)},
-$iskx:true,
-static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-D3i:{
-"^":"af+Pi;",
-$isd3:true},
-Em:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=this.a
-y=J.UQ(z.MO,"script")
-if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,198,"call"],
-$isEH:true},
-fx:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
-l8R:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Ll,lTU,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.fO
-else if(z.n(a,"Pipe"))return C.FJ
-else if(z.n(a,"Internal"))return C.wj
-N.QM("").j2("Unknown socket kind "+H.d(a))
-throw H.b(P.EY())}}},
-WP:{
-"^":"Pqb;V8@,je,mI,I0,vu,DB,XK,FH,L7,Wu,tO,HO,kJ,Wm,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gUm:function(){return!0},
-gHY:function(){return J.xC(this.I0,C.FJ)},
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gyv: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},
-gkE:function(){return this.Wu},
-giP:function(){return this.tO},
-gLw:function(){return this.HO},
-gNS:function(){return this.kJ},
-guh:function(){return this.Wm},
-bF:function(a,b,c){var z,y
-z=J.U6(b)
-y=z.t(b,"name")
-this.px=this.ct(this,C.YS,this.px,y)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-y=D.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-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.kJ=F.Wi(this,C.dx,this.kJ,y)
-y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
-y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
-this.V8=z.t(b,"owner")}},
-Pqb:{
-"^":"af+Pi;",
-$isd3:true},
-Qf:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y
-z=J.x(b)
-y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
-else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.yX(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V44;S4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{cE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.n8.ZL(a)
-C.n8.XI(a)
-return a}}},
-V44:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V45;Xc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{bZp:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V45:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
-"^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.VT(this.Jf,"/")&&J.co(b,"/"))b=J.ZZ(b,1)
-N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
-z=this.Jf
-if(typeof z!=="string")return z.g()
-return W.lt(J.ew(z,b),null,null,null,P.EF(["Observatory-Version","1.0"],null,null),null,null,null).ml(new U.dT()).OA(new U.E7())},
-eY:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:200;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,199,"call"],
-$isEH:true},
-E7:{
-"^":"Tp:13;",
-$1:[function(a){var z,y
-N.QM("").YX("HttpRequest.request failed.")
-z=J.l2(a)
-y=J.RE(z)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",y.gxN(z),"kind","NetworkException","message","Could not connect to service ("+H.d(y.gpo(z))+"). Check that you started the VM with the following flags: --observe"],null,null))},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-ho:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-q3:[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)
-z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
-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)
-J.iA(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},
-PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
-N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
-"^":"",
-Ti:{
-"^":"V46;Ll,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gWA:function(a){return a.Ll},
-sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
-Xq:function(a){var z
-switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
-return z
-case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
-return z
-case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
-return z
-case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
-return z
-case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
-return z
-case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
-return z
-case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
-return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
-return z
-case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
-return z
-case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
-return z
-case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(z,a.Ll)
-return z
-case"SocketList":z=W.r3("io-socket-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"Socket":z=W.r3("io-socket-view",null)
-J.Cu(z,a.Ll)
-return z
-case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
-return z
-case"Isolate":z=W.r3("isolate-view",null)
-J.uM(z,a.Ll)
-return z
-case"Library":z=W.r3("library-view",null)
-J.cl(z,a.Ll)
-return z
-case"ProcessList":z=W.r3("io-process-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"Process":z=W.r3("io-process-view",null)
-J.aw(z,a.Ll)
-return z
-case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
-return z
-case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
-return z
-case"Script":z=W.r3("script-view",null)
-J.ZI(z,a.Ll)
-return z
-case"StackTrace":z=W.r3("stack-trace",null)
-J.yO(z,a.Ll)
-return z
-case"VM":z=W.r3("vm-view",null)
-J.tQ(z,a.Ll)
-return z
-default:z=W.r3("json-view",null)
-J.wD(z,a.Ll)
-return z}},
-rm:[function(a,b){var z,y,x
-this.pj(a)
-z=a.Ll
-if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gzS()
-x=this.Xq(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,13,57],
-$isTi:true,
-static:{HP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ns.ZL(a)
-C.Ns.XI(a)
-return a}}},
-V46:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
-"^":"",
-xI:{
-"^":"pv;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gnv:function(a){return a.tY},
-snv:function(a,b){a.tY=this.ct(a,C.xP,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))
-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,20,57],
-gO3:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return z.gdN()},
-goc:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return J.O6(z)},
-gWw:function(a){return J.FN(this.goc(a))},
-static:{fd:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HRc.ZL(a)
-C.HRc.XI(a)
-return a}}},
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
-"^":"",
-CY:{
-"^":"KAf;kF,IK,bP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-RC:[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,102,1,201,95],
-static:{Sm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.zb.ZL(a)
-C.zb.XI(a)
-return a}}},
-KAf:{
-"^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
-"^":"",
-Wq:{
-"^":"a;c1,IW,Mg,nN,ER,Ja,WI,tu",
-WO:function(a,b){return this.tu.$1(b)},
-bu:function(a){var z=P.p9("")
-z.KF("(options:")
-z.KF(this.c1?"fields ":"")
-z.KF(this.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Mg?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
-z.KF(")")
-return z.vM}},
-ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
-giO:function(a){var z=this.oc
-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("")
-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(")")
-return z.vM},
-$isES:true},
-iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
-"^":"",
-Na:function(a,b,c){var z,y
-z=a.length
-if(z<b){y=Array(b)
-y.fixed$length=init
-H.qG(y,0,z,a,0)
-return y}if(z>c){z=Array(c)
-z.fixed$length=init
-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.Kp(a,0)]
-for(;z.G();){y=z.lo
-b.length
-x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Kp(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.lo
-if(w.n(y,v))return!0
-if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
-if(u)return!0}}return!1},
-OS:function(a){var z,y
-z=H.G3()
-y=H.KT(z).BD(a)
-if(y)return 0
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
-if(z)return 3
-return 4},
-RI:function(a){var z,y
-z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
-if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-z=H.KT(z).BD(a)
-if(z)return 0
-return-1},
-W4:function(a,b,c){var z,y,x,w,v
-z=a.length
-y=b.length
-if(z!==y)return!1
-if(c){x=P.Ls(null,null,null,null)
-x.FV(0,b)
-for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
-if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
-"^":"",
-kP:function(){throw H.b(P.FM("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)."))}}],["smoke.static","package:smoke/static.dart",,O,{
-"^":"",
-Oj:{
-"^":"a;E4e,AH,lk,XO,Yp,af<,yQ"},
-fH:{
-"^":"a;eA,vk,X9",
-jD:function(a,b){var z=this.eA.t(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.vk.t(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
-z=null
-if(!!J.x(a).$isuq){this.X9.t(0,a)
-z=null}else{x=this.eA.t(0,b)
-z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
-y=null
-if(d){w=X.OS(z)
-if(w>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,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
-u=v>=0?v:J.q8(c)
-c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
-return u}catch(t){if(!!J.x(H.Ru(t)).$isJS){if(y!=null)P.FL(y)
-throw t}else throw t}}},
-bY:{
-"^":"a;TB,WF,wa",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
-x=J.x(y)
-if(x.n(y,b))return!0
-if(y==null){if(!this.wa)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
-n6:function(a,b){var z,y
-z=this.WF.t(0,a)
-if(z==null){if(!this.wa)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
-CV:function(a,b){var z=this.F1(a,b)
-if(z==null){if(!this.wa)return
-throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
-Me:function(a,b,c){var z,y,x,w,v,u
-z=[]
-if(c.Mg){y=this.TB.t(0,b)
-if(y==null){if(this.wa)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
-if(x==null){if(!this.wa)return z
-throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
-if(u!=null&&!X.ZO(v.gDv(),u))continue
-z.push(v)}return z},
-F1:function(a,b){var z,y,x,w,v
-for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
-if(x!=null){w=x.t(0,b)
-if(w!=null)return w}v=z.t(0,a)
-if(v==null){if(!this.wa)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
-ut:{
-"^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
-static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
-z.Ut(a)
-return z}}},
-m8:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.Nz.u(0,b,a)},
-$isEH:true},
-tk:{
-"^":"a;GB",
-bu:function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
-"^":"",
-nm:{
-"^":"V47;xP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gM6:function(a){return a.xP},
-sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-static:{an:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dX.ZL(a)
-C.dX.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
-"^":"",
-uw:{
-"^":"V48;ju,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.r0(a.ju).Qy(b)},"$1","gvC",2,0,20,90],
-static:{HI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
-"^":"",
-AD:function(a,b,c,d){var z,y
-if(c){z=null!=d&&!1!==d
-y=J.RE(a)
-if(z)y.gQg(a).MW.setAttribute(b,"")
-else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
-y=d==null?"":H.d(d)
-z.MW.setAttribute(b,y)}},
-y9:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return M.wp(a)?a:null},
-wp:function(a){var z=J.x(a)
-return!!z.$isQF||!!z.$isI0||!!z.$ishy},
-Lj:function(a,b){var z,y,x,w,v,u
-z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.Lj(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
-w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
-return z},
-X7:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Lh(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.Ky(z).bt(a)
-if(f!=null)J.Co(M.Ky(z),f)}M.mV(z,d,e,g)
-return z},
-tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
-if(b==null||b==="")return
-z="#"+H.d(b)
-for(;!0;){a=M.tA(a)
-y=$.It()
-y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
-y=w==null
-if(!y&&w.gO5()!=null)v=J.Eh(w.gO5(),z)
-else{u=J.x(a)
-v=!!u.$isQF||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
-if(y)return
-a=w.gCi()
-if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
-return new M.aR(a,b,c)},
-pN:function(a,b){var z,y
-z=J.x(a)
-if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.iw(a.textContent,M.fX("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
-rJ:function(a,b,c){var z=a.getAttribute(b)
-if(z==="")z="{{}}"
-return S.iw(z,M.fX(b,a,c))},
-F5:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=null
-y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
-if(y){x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
-z=M.rJ(a,"if",b)
-v.qd=z
-x=M.rJ(a,"bind",b)
-v.fu=x
-u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.iw("{{}}",M.fX("bind",a,b))
-return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
-return b.gaW()?y:b.qm(y)}x=J.U6(b)
-w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-v=Array(w)
-v.fixed$length=init
-w=v.length
-u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
-if(!(u<t))break
-z=b.HH(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)},
-GZ:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.geq())return M.KH(a,b,c,d)
-if(b.gqz()){z=b.HH(0)
-if(z!=null)y=z.$3(d,c,!1)
-else{x=b.Pn(0)
-x=!!J.x(x).$isTv?x:L.hk(x)
-w=$.ps
-$.ps=w+1
-y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}x=$.ps
-$.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.Wf=[]
-x=J.U6(b)
-v=0
-while(!0){w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(v<w))break
-c$0:{u=b.AX(v)
-z=b.HH(v)
-if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.ti(t)
-else{if(y.GX!=null||y.cb==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gjM())
-w=y.cb
-w.push(C.dV)
-w.push(t)}break c$0}s=b.Pn(v)
-if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++v}return new Y.Qw(y,b.gEO(),null,null,null)},
-mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=J.RE(b)
-y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Ky(a)
-for(w=J.U6(y),v=J.RE(x),u=0;u<w.gB(y);u+=2){t=w.t(y,u)
-s=w.t(y,u+1)
-r=v.nR(x,t,M.GZ(t,s,a,c),s.geq())
-if(r!=null&&!0)d.push(r)}v.Vz(x)
-if(!z.$isqf)return
-q=M.Ky(a)
-q.sQ2(c)
-p=q.A5(b)
-if(p!=null&&!0)d.push(p)},
-Ky:function(a){var z,y,x,w
-z=$.cm()
-z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
-if(x!=null)return x
-w=J.x(a)
-if(!!w.$isMi)x=new M.ee(a,null,null)
-else if(!!w.$isbs)x=new M.ug(a,null,null)
-else if(!!w.$isAE)x=new M.bH(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
-else w=!0
-else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
-z.u(0,a,x)
-return x},
-CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(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;cJ",
-US:function(a,b,c){return},
-static:{"^":"ac"}},
-V2:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z,y,x,w,v,u
-z={}
-z.a=b
-y=this.grF()
-x=J.x(y)
-w=!!x.$isQlt&&J.xC(z.a,"value")
-v=z.a
-if(w){new W.E9(y).Rz(0,v)
-if(d)return this.nD(c)
-x=this.ge2()
-x.$1(J.mu(c,x))}else{u=J.VT(v,"?")
-if(u){x.gQg(y).Rz(0,z.a)
-x=z.a
-w=J.U6(x)
-z.a=w.Nj(x,0,J.bI(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.IoZ(z,this,u)
-x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-nD:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
-y=J.RE(z)
-x=y.gBy(z)
-w=J.x(x)
-if(!!w.$isbs){v=J.C5(M.Ky(x))
-if(v!=null){u=J.UQ(v,"value")
-if(!!J.x(u).$isb2){t=x.value
-s=u}else{t=null
-s=null}}else{t=null
-s=null}}else{t=null
-s=null}y.sP(z,a==null?"":H.d(a))
-if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
-IoZ:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
-$isEH:true},
-b2:{
-"^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
-break
-case"checked":z=this.rF
-y=J.RE(z)
-x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
-if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
-return b},
-S6:function(a){var z=this.E3
-if(z!=null){z.ed()
-this.E3=null}z=this.vt
-if(z!=null){J.x0(z)
-this.vt=null}},
-$isb2:true,
-static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
-return
-case"selectedIndex":J.dk(a,M.h5(b))
-return
-case"value":J.ta(a,b==null?"":H.d(b))
-return}},IP:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.eu(a,C.i3.Ph,!1),[null])
-switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
-case"radio":case"select-multiple":case"select-one":return z.gEr(a)
-case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.ol("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.wi(z)
-return z.ad(z,new M.qx(a))}else{y=M.y9(a)
-if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
-Ufa:{
-"^":"Tp:69;",
-$0:function(){var z,y,x,w,v
-z=document.createElement("div",null).appendChild(W.ED(null))
-y=J.RE(z)
-y.st5(z,"checkbox")
-x=[]
-w=y.gVl(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
-y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
-y=window
-v=document.createEvent("MouseEvent")
-J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
-z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gtH(x)},
-$isEH:true},
-pp:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-ik:{
-"^":"Tp:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-qx:{
-"^":"Tp:13;a",
-$1:function(a){var z,y
-z=this.a
-y=J.x(a)
-if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
-z=J.O6(z)
-z=y==null?z==null:y===z}else z=!1
-else z=!1
-else z=!1
-return z},
-$isEH:true},
-y4:{
-"^":"Tp:13;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
-$isEH:true},
-LG:{
-"^":"Tp:13;",
-$1:function(a){return 0},
-$isEH:true},
-ee:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-z=J.x(b)
-if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-PW:{
-"^":"a;Cd>,ks>,jb>",
-ghK:function(){return!1},
-JW:function(a){var z=this.ks
-if(z==null||a>=z.length)return
-if(a>=z.length)return H.e(z,a)
-return z[a]}},
-qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
-ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;rF<,Cd*,Vw?",
-nR:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
-if(typeof console!="undefined")console.error(z)
-return},
-Vz:function(a){},
-gCn:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.fe(!!J.x(z).$isvy?z:M.Ky(z))}else z=null
-return z},
-Un:function(a,b){var z,y
-z=this.Cd
-if(z==null){z=P.Fl(null,null)
-this.Cd=z}y=z.t(0,a)
-if(y!=null)J.x0(y)
-this.Cd.u(0,a,b)
-return b},
-$isvy:true},
-DH:{
-"^":"a;k8>,EA,Po"},
-ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(J.xC(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
-if(d)return
-return this.Un("ref",c)},
-A5:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
-if(z!=null){z.S6(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Q2)
-J.ZW($.pT(),this.rF,["ref"],!0)
-return this.os},
-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.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
-if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
-if(v==null){v=M.Lj(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
-w=$.Lu()
-t=w.t(0,u)
-if(t==null){t=u.implementation.createHTMLDocument("")
-$.AA().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
-w=t}s=J.mx(w)
-w=[]
-r=new M.NK(w,null,null,null)
-q=$.It()
-r.Ci=this.rF
-r.O5=z
-q.u(0,s,r)
-p=new M.DH(b,null,null)
-M.Ky(s).sVw(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.X7(o,s,this.le,l,b,c,w,null)
-M.Ky(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.O5=null
-r.Ci=null
-return s},
-gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.LH=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.Ky(y))
-y=z==null?y==null:z===y
-z=y}else z=!0
-if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
-V1:function(a){var z,y
-this.Q2=null
-this.nF=null
-z=this.Cd
-if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.x0(y)}this.q8=null
-z=this.os
-if(z==null)return
-z.Io(null)
-this.os.S6(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.Ky(z).gNK()
-return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-z=this.IO
-return z!=null?z:H.Go(this.rF,"$isOH").content},
-bt:function(a){var z,y,x,w,v,u,t
-if(this.M5===!0)return!1
-M.oR()
-M.HS()
-this.M5=!0
-z=!!J.x(this.rF).$isOH
-y=!z
-if(y){x=this.rF
-w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.rF)
-v=!!J.x(v).$isvy?v:M.Ky(v)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH
-u=!0}else{x=this.rF
-w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
-w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(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.Ky(t)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
-z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sIO(J.mx(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
-return!0},
-GC:function(){return this.bt(null)},
-$isDT:true,
-static:{"^":"mn,EW,YO,vU,xV,kY",TA:function(a){var z,y,x,w
-z=J.Do(a)
-if(W.Pv(z.defaultView)==null)return z
-y=$.LQ().t(0,z)
-if(y==null){y=z.implementation.createHTMLDocument("")
-for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
-z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
-z.gBy(a).insertBefore(y,a)
-for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
-v.getAttribute(w)
-v.removeAttribute(w)
-break
-case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
-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.NQ(a)
-if(c){J.TQ(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
-z=new M.CE()
-y=J.MK(a,$.Ze())
-if(M.CF(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.vU===!0)return
-$.vU=!0
-var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
-document.head.appendChild(z)},HS:function(){var z,y
-if($.xV===!0)return
-$.xV=!0
-z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
-if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
-J.m5(a).appendChild(z)}}},
-pi:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-CE:{
-"^":"Tp:20;",
-$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
-$isEH:true},
-MdQ:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:77;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Ky(J.l2(z.gl())).aX()},"$2",null,4,0,null,161,14,"call"],
-$isEH:true},
-lPa:{
-"^":"Tp:69;",
-$0:function(){var z=document.createDocumentFragment()
-$.It().u(0,z,new M.NK([],null,null,null))
-return z},
-$isEH:true},
-NK:{
-"^":"a;u2<,Qo<,Ci<,O5<"},
-aR:{
-"^":"Tp:13;a,b,c",
-$1:function(a){return this.c.US(a,this.a,this.b)},
-$isEH:true},
-Uk:{
-"^":"Tp:77;a,b,c,d",
-$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")
-else z=!1
-if(z)return
-y=S.iw(b,M.fX(a,this.b,this.c))
-if(y!=null){z=this.a
-x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-z.push(a)
-z.push(y)}},
-$isEH:true},
-aY:{
-"^":"Ap;bE,Rj,vy,qg,ky,vL,wC,D2,cM,qe,ur,VC,Wv,LH,TC",
-RV:function(a){return this.LH.$1(a)},
-TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.vL=null}z=this.wC
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.bE.rF
-y=a.qd
-x=y!=null
-this.D2=x
-this.cM=a.cw!=null
-if(x){this.qe=y.eq
-y=M.GZ("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gNt())}if(this.cM===!0){y=a.cw
-this.ur=y.eq
-y=M.GZ("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.eq
-y=M.GZ("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.cM!==!0?[y]:y)},"$1","gNt",2,0,20,14],
-Io:function(a){var z,y
-z=J.x(a)
-if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
-if(a===z)return
-this.Ke()
-this.qg=a
-if(!!J.x(a).$iswn&&this.cM===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.qg
-y=y!=null?y:[]
-this.Vi(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.bE.rF
-z=$.It()
-y=this.Rj
-if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.bE.rF)return x
-w=M.Ky(x).gos()
-if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.bI(a,1))
-y=this.xS(a)
-J.TmB(this.bE.rF)
-x=C.Nm.KI(this.Rj,a)
-for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
-if(u==null?y==null:u===y)y=z
-t=u.parentNode
-if(t!=null)t.removeChild(u)
-w.mx(x,u)}return x},
-Vi:[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.ky||J.FN(a)===!0)return
-u=this.bE
-t=u.rF
-if(J.TmB(t)==null){this.S6(0)
-return}s=this.vy
-Q.Y5(s,this.qg,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.LH=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
-for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
-if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a);p.G();){m=p.gl()
-for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
-y=s[h]
-x=q.Rz(0,y)
-if(x==null)try{if(this.LH!=null)y=this.RV(y)
-if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.XO(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.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
-x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,203,204],
-Ep:[function(a){var z,y,x
-z=$.It()
-z.toString
-y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
-z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.x0(z.lo)},"$1","gV6",2,0,205],
-Ke:function(){var z=this.VC
-if(z==null)return
-z.ed()
-this.VC=null},
-S6:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
-C.Nm.sB(z,0)
-this.NC()
-this.bE.os=null
-this.ky=!0}},
-XT:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
-if(d){z=c==null?"":H.d(c)
-J.t3(this.rF,z)
-return}z=this.gmt()
-z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
-bH:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
-"^":"",
-jb:{
-"^":"a;iB,eq<,O0",
-gqz:function(){return this.iB.length===5},
-gaW:function(){var z,y
-z=this.iB
-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
-return z},
-gEO:function(){return this.O0},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-AX:function(a){var z,y
-z=this.iB
-y=a*4+1
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Pn:function(a){var z,y
-z=this.iB
-y=a*4+2
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-HH:function(a){var z,y
-z=this.iB
-y=a*4+3
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-ln:[function(a){var z,y,x,w
-if(a==null)a=""
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-x=z.length
-w=C.jn.cU(x,4)*4
-if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,206,21],
-Xb:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
-t=v*4
-if(t>=z.length)return H.e(z,t)
-s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,207,208],
-l3:function(a,b){this.O0=this.iB.length===5?this.geb():this.gqt()},
-static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-if(a==null||a.length===0)return
-z=a.length
-for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
-s=C.xB.XU(a,"[[",v)
-if(s>=0)r=t<0||s<t
-else r=!1
-if(r){t=s
-q=!0
-p="]]"}else{q=!1
-p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
-if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,t))
-n=C.xB.bS(C.xB.Nj(a,t+2,o))
-w.push(q)
-u=u&&q
-m=y?null:b.$1(n)
-if(m==null)w.push(L.hk(n))
-else w.push(null)
-w.push(m)
-v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.l3(w,u)
-return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
-"^":"",
-I5:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.u2.ZL(a)
-C.u2.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
-"^":"",
-el:{
-"^":"V49;uB,lc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-RF:[function(a,b){J.r0(a.uB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{oH:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dm.ZL(a)
-C.dm.XI(a)
-return a}}},
-V49:{
-"^":"uL+Pi;",
-$isd3:true}}],])
-I.$finishClasses($$,$,null)
-$$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-W.QI.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-P.FK.$isRz=true
-P.FK.$asRz=[P.FK]
-P.FK.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$ishw=true
-U.mc.$isa=true
-U.cJ.$ishw=true
-U.cJ.$isa=true
-U.uku.$ishw=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$ishw=true
-U.fp.$isa=true
-U.ae.$ishw=true
-U.ae.$isa=true
-U.Qb.$ishw=true
-U.Qb.$isa=true
-U.c0.$ishw=true
-U.c0.$isa=true
-U.no.$ishw=true
-U.no.$isa=true
-U.Nb.$ishw=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$ishw=true
-U.zX.$isa=true
-U.x9.$ishw=true
-U.x9.$isa=true
-U.EO.$isEO=true
-U.EO.$ishw=true
-U.EO.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.Rw.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-G.uG.$isa=true
-P.oh.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.DP.$isa=true
-D.uA.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kf.$isea=true
-W.kf.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.t9.$isa=true
-D.xb.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isAj=true
-W.I0.$isKV=true
-W.I0.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-P.cb.$iscb=true
-P.cb.$isa=true
-P.Oy.$isOy=true
-P.Oy.$isa=true
-Y.qS.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-G.Ni.$isa=true
-P.AN.$isAN=true
-P.AN.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.mE.$ismE=true
-P.mE.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isOy=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isOy=true
-P.LR.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.Ob.$isOb=true
-P.Ob.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.Xa.$isXa=true
-P.Xa.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.qK.$isqK=true
-L.qK.$isAp=true
-L.qK.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isKV=true
-W.Aj.$isa=true
-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.RE=function(a){if(a==null)return a
-if(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.U6=function(a){if(typeof a=="string")return J.O.prototype
-if(a==null)return a
-if(a.constructor==Array)return J.Q.prototype
-if(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.Wx=function(a){if(typeof a=="number")return J.P.prototype
-if(a==null)return a
-if(!(a instanceof P.a))return J.kdQ.prototype
-return a}
-J.rY=function(a){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.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.m0(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.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(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
-J.AF=function(a){return J.RE(a).gIi(a)}
-J.AG=function(a){return J.x(a).bu(a)}
-J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AL=function(a){return J.RE(a).gW6(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.Aw=function(a){return J.RE(a).gb6(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.BT=function(a){return J.RE(a).gNG(a)}
-J.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
-J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
-J.By=function(a,b){return J.RE(a).sLW(a,b)}
-J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
-J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
-J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
-J.DB=function(a){return J.RE(a).gn0(a)}
-J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DL=function(a){return J.RE(a).gK4(a)}
-J.DO=function(a){return J.RE(a).gR(a)}
-J.Dd=function(a){return J.RE(a).gLe(a)}
-J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.Dn=function(a,b){return J.w1(a).zV(a,b)}
-J.Do=function(a){return J.RE(a).gM0(a)}
-J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Du=function(a){return J.RE(a).gxN(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
-J.EC=function(a){return J.RE(a).giC(a)}
-J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.EK=function(a,b){return J.RE(a).ps(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
-J.Er=function(a,b){return J.RE(a).sfY(a,b)}
-J.Ew=function(a){return J.RE(a).gkm(a)}
-J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
-J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.Fd=function(a){return J.RE(a).gi6(a)}
-J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gfN(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.HB=function(a){return J.RE(a).gxT(a)}
-J.HF=function(a){return J.RE(a).gD7(a)}
-J.HO=function(a){return J.RE(a).gWw(a)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.I2=function(a){return J.RE(a).gwv(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a){return J.RE(a).gfq(a)}
-J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
-return J.Wx(a).F(a,b)}
-J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JD=function(a){return J.RE(a).gSs(a)}
-J.JG=function(a){return J.RE(a).gHn(a)}
-J.JR=function(a){return J.RE(a).gcK(a)}
-J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Ja=function(a){return J.RE(a).gr9(a)}
-J.Jb=function(a,b){return J.RE(a).sdu(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,b){return J.RE(a).Id(a,b)}
-J.K0=function(a){return J.RE(a).gd4(a)}
-J.K2=function(a){return J.RE(a).gtN(a)}
-J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Kn=function(a){return J.Wx(a).yu(a)}
-J.Kr=function(a){return J.RE(a).e6(a)}
-J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.L7=function(a){return J.RE(a).gY9(a)}
-J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.LB=function(a){return J.RE(a).gX0(a)}
-J.LH=function(a,b){return J.w1(a).GT(a,b)}
-J.LL=function(a){return J.Wx(a).HG(a)}
-J.LM=function(a,b){return J.RE(a).szj(a,b)}
-J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Lm=function(a){return J.x(a).gbx(a)}
-J.Ln=function(a){return J.RE(a).gdU(a)}
-J.Lp=function(a){return J.RE(a).geT(a)}
-J.Lr=function(a){return J.RE(a).gMj(a)}
-J.M4=function(a){return J.RE(a).gJN(a)}
-J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
-J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MQ=function(a){return J.w1(a).grZ(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.Mp=function(a){return J.w1(a).wg(a)}
-J.Mx=function(a){return J.RE(a).gks(a)}
-J.Mz=function(a){return J.RE(a).goE(a)}
-J.N1=function(a){return J.RE(a).Es(a)}
-J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.RE(a).gjb(a)}
-J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a,b){return J.RE(a).RR(a,b)}
-J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
-J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.Nl=function(a){return J.RE(a).gO3(a)}
-J.No=function(a,b){return J.RE(a).sR(a,b)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-J.O6=function(a){return J.RE(a).goc(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
-J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OL=function(a){return J.RE(a).gQl(a)}
-J.OT=function(a){return J.RE(a).gXE(a)}
-J.OY=function(a){return J.RE(a).gJD(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
-J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(a)}
-J.PN=function(a,b){return J.RE(a).sCI(a,b)}
-J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PY=function(a){return J.RE(a).goN(a)}
-J.Pj=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
-J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
-J.Pp=function(a,b){return J.rY(a).j(a,b)}
-J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q4=function(a){return J.RE(a).gph(a)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
-J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(a)}
-J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.QX=function(a){return J.RE(a).gUo(a)}
-J.QZ=function(a){return J.RE(a).gpM(a)}
-J.Qa=function(a){return J.RE(a).gNN(a)}
-J.Qd=function(a){return J.RE(a).gRn(a)}
-J.Qr=function(a,b){return J.RE(a).skc(a,b)}
-J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
-J.Qy=function(a,b){return J.RE(a).shf(a,b)}
-J.R1=function(a){return J.RE(a).Fn(a)}
-J.R7=function(a,b){return J.U6(a).u8(a,b)}
-J.RF=function(a,b){return J.RE(a).WO(a,b)}
-J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
-J.Ry=function(a){return J.RE(a).gLW(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.SZ=function(a){return J.RE(a).gSO(a)}
-J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
-J.Sj=function(a,b){return J.RE(a).svC(a,b)}
-J.Sl=function(a){return J.RE(a).gxb(a)}
-J.So=function(a,b){return J.RE(a).X3(a,b)}
-J.Sz=function(a){return J.RE(a).gUx(a)}
-J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
-J.TQ=function(a,b){return J.RE(a).mx(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
-J.TmB=function(a){return J.RE(a).gBy(a)}
-J.Tr=function(a){return J.RE(a).gCj(a)}
-J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
-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.U8o=function(a){return J.RE(a).gUQ(a)}
-J.UM=function(a){return J.RE(a).gu7(a)}
-J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
-return J.Wx(a).w(a,b)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
-J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
-return J.U6(a).t(a,b)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(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.VL=function(a){return J.RE(a).gR2(a)}
-J.VT=function(a,b){return J.rY(a).Tc(a,b)}
-J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
-J.Vi=function(a){return J.RE(a).grO(a)}
-J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
-J.Vl=function(a){return J.RE(a).gja(a)}
-J.Vm=function(a){return J.RE(a).gP(a)}
-J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
-J.WB=function(a,b){return J.RE(a).skZ(a,b)}
-J.WI=function(a,b){return J.RE(a).sLF(a,b)}
-J.WM=function(a){return J.RE(a).gyv(a)}
-J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
-J.Wp=function(a){return J.RE(a).gQU(a)}
-J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XJ=function(a){return J.RE(a).gRY(a)}
-J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
-J.YQ=function(a){return J.RE(a).gPL(a)}
-J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gSR(a)}
-J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z2=function(a){return J.RE(a).dQ(a)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZH=function(a){return J.RE(a).gk8(a)}
-J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
-J.ZL=function(a){return J.RE(a).gAF(a)}
-J.ZN=function(a){return J.RE(a).gqN(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.rY(a).yn(a,b)}
-J.Zv=function(a){return J.RE(a).grs(a)}
-J.a8=function(a,b){return J.RE(a).sdU(a,b)}
-J.aA=function(a){return J.RE(a).gzY(a)}
-J.aT=function(a){return J.RE(a).god(a)}
-J.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
-J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
-J.ba=function(a){return J.RE(a).gKJ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
-J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.bu=function(a){return J.RE(a).gyw(a)}
-J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-J.cO=function(a){return J.RE(a).gjx(a)}
-J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
-J.cU=function(a){return J.RE(a).gHh(a)}
-J.cV=function(a,b){return J.RE(a).sjT(a,b)}
-J.cd=function(a){return J.RE(a).gql(a)}
-J.cl=function(a,b){return J.RE(a).sHt(a,b)}
-J.co=function(a,b){return J.rY(a).nC(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,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.dk=function(a,b){return J.RE(a).sMj(a,b)}
-J.eU=function(a){return J.RE(a).gRh(a)}
-J.eg=function(a){return J.RE(a).Ms(a)}
-J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
-return J.Qc(a).g(a,b)}
-J.fA=function(a){return J.RE(a).gJp(a)}
-J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fU=function(a){return J.RE(a).gDX(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).gCn(a)}
-J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fv=function(a,b){return J.RE(a).sUx(a,b)}
-J.fw=function(a){return J.RE(a).gEl(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
-J.h9=function(a,b){return J.RE(a).sWA(a,b)}
-J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hb=function(a){return J.RE(a).gQ1(a)}
-J.hn=function(a){return J.RE(a).gEu(a)}
-J.i0=function(a,b){return J.RE(a).sPB(a,b)}
-J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iA=function(a,b,c){return J.RE(a).D9(a,b,c)}
-J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
-J.iL=function(a){return J.RE(a).gNb(a)}
-J.iM=function(a,b){return J.RE(a).st5(a,b)}
-J.iS=function(a){return J.RE(a).gox(a)}
-J.ih=function(a){return J.RE(a).ga5(a)}
-J.io=function(a){return J.RE(a).gBV(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
-J.iz=function(a,b){return J.RE(a).GE(a,b)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
-J.jO=function(a,b){return J.Wx(a).Y(a,b)}
-J.jd=function(a,b){return J.RE(a).snZ(a,b)}
-J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
-J.jo=function(a){return J.RE(a).gCI(a)}
-J.jzo=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
-J.k0=function(a){return J.RE(a).giZ(a)}
-J.k7=function(a){return J.RE(a).gbA(a)}
-J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(a)}
-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.ki=function(a){return J.RE(a).gqK(a)}
-J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
-J.kv=function(a){return J.RE(a).glp(a)}
-J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
-J.l2=function(a){return J.RE(a).gN(a)}
-J.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lB=function(a){return J.RE(a).guT(a)}
-J.lT=function(a){return J.RE(a).gOd(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.ls=function(a){return J.RE(a).gt3(a)}
-J.m4=function(a){return J.RE(a).gig(a)}
-J.m5=function(a){return J.RE(a).gQr(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
-J.mP=function(a){return J.RE(a).gzj(a)}
-J.mU=function(a,b){return J.RE(a).skm(a,b)}
-J.mY=function(a){return J.w1(a).gA(a)}
-J.mZ=function(a,b,c){return J.RE(a).BG(a,b,c)}
-J.mu=function(a,b){return J.RE(a).TR(a,b)}
-J.mx=function(a){return J.RE(a).Xf(a)}
-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.n0=function(a,b){return J.RE(a).Rf(a,b)}
-J.n9=function(a){return J.RE(a).gQq(a)}
-J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
-J.oD=function(a,b){return J.RE(a).hP(a,b)}
-J.oE=function(a,b){return J.Qc(a).iM(a,b)}
-J.oJ=function(a,b){return J.RE(a).srs(a,b)}
-J.oN=function(a){return J.RE(a).gj4(a)}
-J.oZ=function(a){return J.RE(a).gBi(a)}
-J.on=function(a){return J.RE(a).gtT(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.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-J.pd=function(a){return J.RE(a).gni(a)}
-J.pm=function(a){return J.RE(a).gt0(a)}
-J.q0=function(a,b){return J.RE(a).syG(a,b)}
-J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
-J.qq=function(a,b){return J.RE(a).sNG(a,b)}
-J.r0=function(a){return J.RE(a).RE(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
-J.ra=function(a){return J.RE(a).gJ6(a)}
-J.rr=function(a){return J.rY(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
-J.ry=function(a){return J.RE(a).gYe(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.tO=function(a){return J.w1(a).Jd(a)}
-J.tQ=function(a,b){return J.RE(a).swv(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.tp=function(a){return J.RE(a).gHy(a)}
-J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tx=function(a){return J.RE(a).gcH(a)}
-J.u1=function(a){return J.RE(a).gSY(a)}
-J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
-return J.Wx(a).C(a,b)}
-J.uH=function(a,b){return J.rY(a).Fr(a,b)}
-J.uM=function(a,b){return J.RE(a).sod(a,b)}
-J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
-J.uW=function(a){return J.RE(a).gyG(a)}
-J.uX=function(a,b){return J.RE(a).sph(a,b)}
-J.uf=function(a){return J.RE(a).gxr(a)}
-J.ul=function(a){return J.RE(a).gU4(a)}
-J.uy=function(a){return J.RE(a).gHm(a)}
-J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
-J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
-J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(a)}
-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.wO=function(a){return J.RE(a).gE7(a)}
-J.wg=function(a,b){return J.U6(a).sB(a,b)}
-J.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wt=function(a){return J.RE(a).gP3(a)}
-J.wz=function(a){return J.RE(a).gzx(a)}
-J.x0=function(a){return J.RE(a).S6(a)}
-J.x5=function(a,b){return J.U6(a).tg(a,b)}
-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).sE7(a,b)}
-J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-J.xR=function(a){return J.RE(a).ghf(a)}
-J.xW=function(a,b){return J.RE(a).sZm(a,b)}
-J.xa=function(a){return J.RE(a).geS(a)}
-J.xe=function(a){return J.RE(a).gPB(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
-J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yi=function(a){return J.RE(a).gbN(a)}
-J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yq=function(a){return J.RE(a).gNs(a)}
-J.yx=function(a){return J.U6(a).gor(a)}
-J.yz=function(a){return J.RE(a).gLF(a)}
-J.z2=function(a){return J.RE(a).gG1(a)}
-J.z3=function(a){return J.RE(a).gu6(a)}
-J.z4=function(a,b){return J.RE(a).Rg(a,b)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
-J.zH=function(a){return J.RE(a).gIs(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)}
-C.Df=X.hV.prototype
-C.Gkp=Y.q6.prototype
-C.C8=B.G6.prototype
-C.HR=A.wM.prototype
-C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
-C.ka=Z.aC.prototype
-C.IK=O.VY.prototype
-C.ux=F.Be.prototype
-C.O0=R.JI.prototype
-C.OD=F.ZP.prototype
-C.tT=L.nJ.prototype
-C.UF=R.Eg.prototype
-C.MC=D.i7.prototype
-C.by=A.Gk.prototype
-C.Cl=X.MJ.prototype
-C.Mh=X.Nr.prototype
-C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
-C.Cs=O.Vb.prototype
-C.xu=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.hh=E.H8.prototype
-C.Ie=E.mO.prototype
-C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
-C.lX=E.ou.prototype
-C.Wa=E.av.prototype
-C.bZ=E.uz.prototype
-C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
-C.wP=E.ds.prototype
-C.Ag=E.Mb.prototype
-C.Tl=E.oF.prototype
-C.wK=E.qh.prototype
-C.to=E.Q6.prototype
-C.za=E.L4.prototype
-C.ij=E.Zn.prototype
-C.Rr=E.uE.prototype
-C.aV=E.n5.prototype
-C.EL=B.pR.prototype
-C.yd=Z.hx.prototype
-C.wQ=D.Z4.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.Ji=D.Oz.prototype
-C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
-C.jn=J.imn.prototype
-C.jN=J.CDU.prototype
-C.CD=J.P.prototype
-C.xB=J.O.prototype
-C.Yt=Z.vj.prototype
-C.ct=A.UK.prototype
-C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
-C.yp=H.eEV.prototype
-C.kD=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
-C.nn=A.Ya.prototype
-C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
-C.Ki=A.xc.prototype
-C.Fa=T.ov.prototype
-C.Yj=A.kn.prototype
-C.FH=U.fI.prototype
-C.n8=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Ns=U.Ti.prototype
-C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
-C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.OKl=A.G1.prototype
-C.vB=J.kdQ.prototype
-C.u2=X.I5.prototype
-C.dm=U.el.prototype
-C.ma=W.K5.prototype
-C.KZ=new H.hJ()
-C.x4=new U.EO()
-C.Gw=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
-C.ZB=new P.yRf()
-C.pr=new P.mgb()
-C.dV=new L.iNc()
-C.NU=new P.R81()
-C.dS=new P.AHi()
-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.nU=new A.iYn(0)
-C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
-C.hf=new H.IN("label")
-C.Db=H.Kx('qU')
-C.NS=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
-a.fixed$length=init
-return a}
-C.ucP=I.uL([C.NS,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.ucP)
-C.EV=new H.IN("library")
-C.Jny=H.Kx('U4')
-C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
-C.SR=new H.IN("map")
-C.MR1=H.Kx('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.Kx('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
-C.Ql=new H.IN("hasClass")
-C.HL=H.Kx('a2')
-C.J19=new K.nd()
-C.X0=I.uL([C.NS,C.J19])
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.X0)
-C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
-C.ne=new H.IN("exception")
-C.SNu=H.Kx('EP')
-C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
-C.UY=new H.IN("result")
-C.SmN=H.Kx('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
-C.QK=new H.IN("qualified")
-C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
-C.SA=new H.IN("lines")
-C.hAX=H.Kx('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.zU=new H.IN("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.ucP)
-C.yh=new H.IN("error")
-C.k5t=H.Kx('ft')
-C.m2=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.ucP)
-C.aH=new H.IN("displayCutoff")
-C.dq=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.rB=new H.IN("isolate")
-C.a2p=H.Kx('bv')
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.XA=new H.IN("cls")
-C.jF=H.Kx('dy')
-C.xY=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
-C.oUD=H.Kx('N7')
-C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.oj=new H.IN("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
-C.td=new H.IN("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
-C.zz=new H.IN("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
-C.fi=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.ucP)
-C.mr=new H.IN("expanded")
-C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.X0)
-C.kw=new H.IN("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
-C.UX=new H.IN("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
-C.bk=new H.IN("checked")
-C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
-C.kV=new H.IN("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.ucP)
-C.Ve=new H.IN("socket")
-C.Xmq=H.Kx('WP')
-C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
-C.nt=new H.IN("startLine")
-C.yw=H.Kx('KN')
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.X0)
-C.tg=new H.IN("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.X0)
-C.YD=new H.IN("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.X0)
-C.Aa=new H.IN("results")
-C.Gsc=H.Kx('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.X0)
-C.B0=new H.IN("expand")
-C.b6=new A.ES(C.B0,C.BM,!1,C.HL,!1,C.ucP)
-C.t6=new H.IN("mapAsString")
-C.hr=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.qs=new H.IN("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
-C.QH=new H.IN("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.VK=new H.IN("devtools")
-C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
-C.uu=new H.IN("internal")
-C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
-C.yL=new H.IN("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
-C.Wj=new H.IN("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.nf=new H.IN("function")
-C.V3=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.ucP)
-C.Lc=new H.IN("kind")
-C.Pc=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.ucP)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.X0)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.Zi=new H.IN("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Db,!1,C.X0)
-C.lH=new H.IN("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.ucP)
-C.AV=new H.IN("callback")
-C.wu=H.Kx('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.ucP)
-C.vs=new H.IN("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.X0)
-C.pH=new H.IN("small")
-C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
-C.XM=new H.IN("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
-C.bJ=new H.IN("counters")
-C.jJ=H.Kx('qC')
-C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.ucP)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.Ys=new H.IN("pad")
-C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
-C.YT=new H.IN("expr")
-C.eP=H.Kx('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
-C.jU=new H.IN("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
-C.DZ=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.ucP)
-C.YE=new H.IN("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.Gr=new H.IN("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
-C.RJ=new H.IN("vm")
-C.n8S=H.Kx('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.HL,!1,C.X0)
-C.PX=new H.IN("script")
-C.KB=H.Kx('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
-C.aP=new H.IN("active")
-C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
-C.vp=new H.IN("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
-C.i4=new H.IN("code")
-C.pM=H.Kx('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
-C.kG=new H.IN("classTable")
-C.F9=H.Kx('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.F9,!1,C.X0)
-C.TN=new H.IN("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Db,!1,C.X0)
-C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
-C.OO=new H.IN("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.ucP)
-C.uk=new H.IN("last")
-C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
-C.WQ=new H.IN("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
-C.Mc=new H.IN("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
-C.fn=new H.IN("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
-C.rE=new H.IN("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.ucP)
-C.cg=new H.IN("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.ucP)
-C.ng=I.uL([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ng)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
-C.kH=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
-C.xP=new H.IN("ref")
-C.TO=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
-C.vb=new H.IN("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
-C.ny=new P.a6(0)
-C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.T1=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kf])
-C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kf])
-C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
-C.mp=function(hooks) {
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+(function($) {
+function dart(){ this.x = 0 }var A = new dart;
+delete A.x;
+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 Isolate() {}
+init();
+
+$ = Isolate.$isolateProperties;
+var $$ = {};
+
+// Native classes
+(function(reflectionData) {
+  "use strict";
+  function map(x) {
+    x = {x: x};
+    delete x.x;
+    return x;
+  }
+  function processStatics(descriptor) {
+    for (var property in descriptor) {
+      if (!hasOwnProperty.call(descriptor, property))
+        continue;
+      if (property === "^")
+        continue;
+      var element = descriptor[property];
+      var firstChar = property.substring(0, 1);
+      var previousProperty;
+      if (firstChar === "+") {
+        mangledGlobalNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+        if (element && element.length)
+          init.typeInformation[previousProperty] = element;
+      } else if (firstChar === "@") {
+        property = property.substring(1);
+        $[property]["@"] = element;
+      } else if (firstChar === "*") {
+        globalObject[previousProperty].$defaultValues = element;
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods) {
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        }
+        optionalMethods[property] = previousProperty;
+      } else if (typeof element === "function") {
+        globalObject[previousProperty = property] = element;
+        functions.push(property);
+        init.globalFunctions[property] = element;
+      } else if (element.constructor === Array) {
+        addStubs(globalObject, element, property, true, descriptor, functions);
+      } else {
+        previousProperty = property;
+        var newDesc = {};
+        var previousProp;
+        for (var prop in element) {
+          if (!hasOwnProperty.call(element, prop))
+            continue;
+          firstChar = prop.substring(0, 1);
+          if (prop === "static") {
+            processStatics(init.statics[property] = element[prop]);
+          } else if (firstChar === "+") {
+            mangledNames[previousProp] = prop.substring(1);
+            var flag = element[prop];
+            if (flag > 0)
+              element[previousProp].$reflectable = flag;
+          } else if (firstChar === "@" && prop !== "@") {
+            newDesc[prop.substring(1)]["@"] = element[prop];
+          } else if (firstChar === "*") {
+            newDesc[previousProp].$defaultValues = element[prop];
+            var optionalMethods = newDesc.$methodsWithOptionalArguments;
+            if (!optionalMethods) {
+              newDesc.$methodsWithOptionalArguments = optionalMethods = {};
+            }
+            optionalMethods[prop] = previousProp;
+          } else {
+            var elem = element[prop];
+            if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
+              addStubs(newDesc, elem, prop, false, element, []);
+            } else {
+              newDesc[previousProp = prop] = elem;
+            }
+          }
+        }
+        $$[property] = [globalObject, newDesc];
+        classes.push(property);
+      }
+    }
+  }
+  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
+    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
+    f.$stubName = name;
+    functions.push(name);
+    for (var index = 0; index < array.length; index += 2) {
+      f = array[index + 1];
+      if (typeof f != "function")
+        break;
+      f.$stubName = array[index + 2];
+      funcs.push(f);
+      if (f.$stubName) {
+        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
+        functions.push(f.$stubName);
+      }
+    }
+    for (var i = 0; i < funcs.length; index++, i++) {
+      funcs[i].$callName = array[index + 1];
+    }
+    var getterStubName = array[++index];
+    array = array.slice(++index);
+    var requiredParameterInfo = array[0];
+    var requiredParameterCount = requiredParameterInfo >> 1;
+    var isAccessor = (requiredParameterInfo & 1) === 1;
+    var isSetter = requiredParameterInfo === 3;
+    var isGetter = requiredParameterInfo === 1;
+    var optionalParameterInfo = array[1];
+    var optionalParameterCount = optionalParameterInfo >> 1;
+    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
+    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
+    var functionTypeIndex = array[2];
+    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+    if (getterStubName) {
+      f = tearOff(funcs, array, isStatic, name, isIntercepted);
+      descriptor[name].$getter = f;
+      f.$getterStub = true;
+      if (isStatic)
+        init.globalFunctions[name] = f;
+      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
+      funcs.push(f);
+      if (getterStubName)
+        functions.push(getterStubName);
+      f.$stubName = getterStubName;
+      f.$callName = null;
+      if (isIntercepted)
+        init.interceptedNames[getterStubName] = true;
+    }
+    if (isReflectable) {
+      for (var i = 0; i < funcs.length; i++) {
+        funcs[i].$reflectable = 1;
+        funcs[i].$reflectionInfo = array;
+      }
+      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
+      var unmangledName = array[unmangledNameIndex];
+      var reflectionName = unmangledName;
+      if (getterStubName)
+        mangledNames[getterStubName] = reflectionName;
+      if (isSetter) {
+        reflectionName += "=";
+      } else if (!isGetter) {
+        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
+      }
+      mangledNames[name] = reflectionName;
+      funcs[0].$reflectionName = reflectionName;
+      funcs[0].$metadataIndex = unmangledNameIndex + 1;
+      if (optionalParameterCount)
+        descriptor[unmangledName + "*"] = funcs[0];
+    }
+  }
+  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
+  }
+  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
+    var cache = null;
+    return isIntercepted ? function(x) {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [x], name);
+      return new cache(this, funcs[0], x, name);
+    } : function() {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [], name);
+      return new cache(this, funcs[0], null, name);
+    };
+  }
+  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache;
+    return isStatic ? function() {
+      if (cache === void 0)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+  }
+  var functionCounter = 0;
+  var tearOffGetter = typeof dart_precompiled == "function" ? tearOffGetterCsp : tearOffGetterNoCsp;
+  if (!init.libraries)
+    init.libraries = [];
+  if (!init.mangledNames)
+    init.mangledNames = map();
+  if (!init.mangledGlobalNames)
+    init.mangledGlobalNames = map();
+  if (!init.statics)
+    init.statics = map();
+  if (!init.typeInformation)
+    init.typeInformation = map();
+  if (!init.globalFunctions)
+    init.globalFunctions = map();
+  if (!init.interceptedNames)
+    init.interceptedNames = map();
+  var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
+  var mangledGlobalNames = init.mangledGlobalNames;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = reflectionData.length;
+  for (var i = 0; i < length; i++) {
+    var data = reflectionData[i];
+    var name = data[0];
+    var uri = data[1];
+    var metadata = data[2];
+    var globalObject = data[3];
+    var descriptor = data[4];
+    var isRoot = !!data[5];
+    var fields = descriptor && descriptor["^"];
+    if (fields instanceof Array)
+      fields = fields[0];
+    var classes = [];
+    var functions = [];
+    processStatics(descriptor);
+    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
+  }
+})([
+["_foreign_helper", "dart:_foreign_helper", , H, {
+  "^": "",
+  JS_CONST: {
+    "^": "Object;code>"
+  }
+}],
+["_interceptors", "dart:_interceptors", , J, {
+  "^": "",
+  getInterceptor: function(object) {
+    return void 0;
+  },
+  makeDispatchRecord: function(interceptor, proto, extension, indexability) {
+    return {i: interceptor, p: proto, e: extension, x: indexability};
+  },
+  getNativeInterceptor: function(object) {
+    var record, proto, objectProto, interceptor;
+    record = object[init.dispatchPropertyName];
+    if (record == null)
+      if ($.initNativeDispatchFlag == null) {
+        H.initNativeDispatch();
+        record = object[init.dispatchPropertyName];
+      }
+    if (record != null) {
+      proto = record.p;
+      if (false === proto)
+        return record.i;
+      if (true === proto)
+        return object;
+      objectProto = Object.getPrototypeOf(object);
+      if (proto === objectProto)
+        return record.i;
+      if (record.e === objectProto)
+        throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
+    }
+    interceptor = H.lookupAndCacheInterceptor(object);
+    if (interceptor == null) {
+      proto = Object.getPrototypeOf(object);
+      if (proto == null || proto === Object.prototype)
+        return C.PlainJavaScriptObject_methods;
+      else
+        return C.UnknownJavaScriptObject_methods;
+    }
+    return interceptor;
+  },
+  findIndexForNativeSubclassType: function(type) {
+    var t1, map, t2, i;
+    t1 = $.mapTypeToInterceptor;
+    if (t1 == null)
+      return;
+    map = t1;
+    for (t1 = map.length, t2 = J.getInterceptor(type), i = 0; i + 1 < t1; i += 3) {
+      if (i >= t1)
+        return H.ioore(map, i);
+      if (t2.$eq(type, map[i]))
+        return i;
+    }
+    return;
+  },
+  findInterceptorConstructorForType: function(type) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 1;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1];
+  },
+  findConstructorForNativeSubclassType: function(type, $name) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 2;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1][$name];
+  },
+  Interceptor: {
+    "^": "Object;",
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return H.Primitives_objectToString(receiver);
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68],
+    get$runtimeType: function(receiver) {
+      return new H.TypeImpl(H.getRuntimeTypeString(receiver), null);
+    },
+    "%": "DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"
+  },
+  JSBool: {
+    "^": "Interceptor;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_EsU;
+    },
+    $isbool: true
+  },
+  JSNull: {
+    "^": "Interceptor;",
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_eZO;
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      return J.Interceptor.prototype.noSuchMethod$1.call(this, receiver, invocation);
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68]
+  },
+  JavaScriptObject: {
+    "^": "Interceptor;",
+    get$hashCode: function(_) {
+      return 0;
+    },
+    get$runtimeType: function(_) {
+      return C.Type_XXD;
+    }
+  },
+  PlainJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  UnknownJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  JSArray: {
+    "^": "Interceptor;",
+    add$1: function(receiver, value) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("add"));
+      receiver.push(value);
+    },
+    removeAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeAt"));
+      return receiver.splice(index, 1)[0];
+    },
+    insert$2: function(receiver, index, value) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index > receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insert"));
+      receiver.splice(index, 0, value);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insertAll"));
+      H.IterableMixinWorkaround_insertAllList(receiver, index, iterable);
+    },
+    remove$1: function(receiver, element) {
+      var i;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("remove"));
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], element)) {
+          receiver.splice(i, 1);
+          return true;
+        }
+      return false;
+    },
+    where$1: function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, f), [null]);
+    },
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [null, null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E", ret: P.Iterable, args: [{func: "Iterable__E", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    addAll$1: function(receiver, collection) {
+      var t1;
+      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
+        this.add$1(receiver, t1.get$current());
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    forEach$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_forEach(receiver, f);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E", ret: P.Iterable, args: [{func: "dynamic__E", args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    join$1: function(receiver, separator) {
+      var t1, list, i, t2;
+      t1 = receiver.length;
+      list = Array(t1);
+      list.fixed$length = init;
+      for (i = 0; i < receiver.length; ++i) {
+        t2 = H.S(receiver[i]);
+        if (i >= t1)
+          return H.ioore(list, i);
+        list[i] = t2;
+      }
+      return list.join(separator);
+    },
+    skip$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, n, null, null);
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (end < start || end > receiver.length)
+        throw H.wrapException(P.RangeError$range(end, start, receiver.length));
+      if (start === end)
+        return H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(receiver, 0)]);
+      return H.setRuntimeTypeInfo(receiver.slice(start, end), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    getRange$2: function(receiver, start, end) {
+      H.IterableMixinWorkaround__rangeCheck(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      var receiverLength;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeRange"));
+      receiverLength = receiver.length;
+      if (start < 0 || start > receiverLength)
+        throw H.wrapException(P.RangeError$range(start, 0, receiverLength));
+      if (end < start || end > receiverLength)
+        throw H.wrapException(P.RangeError$range(end, start, receiverLength));
+      H.Lists_copy(receiver, end, receiver, start, receiverLength - end);
+      this.set$length(receiver, receiverLength - (end - start));
+    },
+    any$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_any(receiver, f);
+    },
+    sort$1: function(receiver, compare) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("sort"));
+      H.IterableMixinWorkaround_sortList(receiver, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(receiver, element, start) {
+      return H.Lists_indexOf(receiver, element, start, receiver.length);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, start) {
+      return H.Lists_lastIndexOf(receiver, element, receiver.length - 1);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    contains$1: function(receiver, other) {
+      var i;
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], other))
+          return true;
+      return false;
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1;
+      if (growable)
+        return H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+      else {
+        t1 = H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+        t1.fixed$length = init;
+        return t1;
+      }
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, receiver.length, 0, null), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      if (typeof newLength !== "number" || Math.floor(newLength) !== newLength)
+        throw H.wrapException(P.ArgumentError$(newLength));
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$value(newLength));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("set length"));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("indexed set"));
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      receiver[index] = value;
+    },
+    $isJSArray: true,
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {JSArray_JSArray$fixed: function($length, $E) {
+        var t1;
+        if (typeof $length !== "number" || Math.floor($length) !== $length || $length < 0)
+          throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
+        t1 = H.setRuntimeTypeInfo(new Array($length), [$E]);
+        t1.fixed$length = init;
+        return t1;
+      }}
+  },
+  JSNumber: {
+    "^": "Interceptor;",
+    compareTo$1: function(receiver, b) {
+      var bIsNegative;
+      if (typeof b !== "number")
+        throw H.wrapException(P.ArgumentError$(b));
+      if (receiver < b)
+        return -1;
+      else if (receiver > b)
+        return 1;
+      else if (receiver === b) {
+        if (receiver === 0) {
+          bIsNegative = this.get$isNegative(b);
+          if (this.get$isNegative(receiver) === bIsNegative)
+            return 0;
+          if (this.get$isNegative(receiver))
+            return -1;
+          return 1;
+        }
+        return 0;
+      } else if (isNaN(receiver)) {
+        if (this.get$isNaN(b))
+          return 0;
+        return 1;
+      } else
+        return -1;
+    },
+    get$isNegative: function(receiver) {
+      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
+    },
+    get$isNaN: function(receiver) {
+      return isNaN(receiver);
+    },
+    get$isFinite: function(receiver) {
+      return isFinite(receiver);
+    },
+    remainder$1: function(receiver, b) {
+      return receiver % b;
+    },
+    abs$0: function(receiver) {
+      return Math.abs(receiver);
+    },
+    toInt$0: function(receiver) {
+      var t1;
+      if (receiver >= -2147483648 && receiver <= 2147483647)
+        return receiver | 0;
+      if (isFinite(receiver)) {
+        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
+        return t1 + 0;
+      }
+      throw H.wrapException(P.UnsupportedError$('' + receiver));
+    },
+    round$0: function(receiver) {
+      return this.toInt$0(this.roundToDouble$0(receiver));
+    },
+    roundToDouble$0: function(receiver) {
+      if (receiver < 0)
+        return -Math.round(-receiver);
+      else
+        return Math.round(receiver);
+    },
+    toStringAsFixed$1: function(receiver, fractionDigits) {
+      var result;
+      if (fractionDigits > 20)
+        throw H.wrapException(P.RangeError$(fractionDigits));
+      result = receiver.toFixed(fractionDigits);
+      if (receiver === 0 && this.get$isNegative(receiver))
+        return "-" + result;
+      return result;
+    },
+    toRadixString$1: function(receiver, radix) {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$(radix));
+      return receiver.toString(radix);
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      return receiver & 0x1FFFFFFF;
+    },
+    $negate: function(receiver) {
+      return -receiver;
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    $sub: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver - other;
+    },
+    $div: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver / other;
+    },
+    $mul: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver * other;
+    },
+    $mod: function(receiver, other) {
+      var result;
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      result = receiver % other;
+      if (result === 0)
+        return 0;
+      if (result > 0)
+        return result;
+      if (other < 0)
+        return result - other;
+      else
+        return result + other;
+    },
+    $tdiv: function(receiver, other) {
+      if ((receiver | 0) === receiver && (other | 0) === other && 0 !== other && -1 !== other)
+        return receiver / other | 0;
+      else {
+        if (typeof other !== "number")
+          H.throwExpression(P.ArgumentError$(other));
+        return this.toInt$0(receiver / other);
+      }
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
+    },
+    $shl: function(receiver, other) {
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    _shlPositive$1: function(receiver, other) {
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    $shr: function(receiver, other) {
+      var t1;
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    $and: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver & other) >>> 0;
+    },
+    $xor: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver ^ other) >>> 0;
+    },
+    $lt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver < other;
+    },
+    $gt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver > other;
+    },
+    $le: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver <= other;
+    },
+    $ge: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver >= other;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_xM7;
+    },
+    $isnum: true,
+    static: {"^": "JSNumber__MIN_INT32,JSNumber__MAX_INT32"}
+  },
+  JSInt: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_SnA;
+    },
+    $is$double: true,
+    $isnum: true,
+    $is$int: true
+  },
+  JSDouble: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_qq1;
+    },
+    $is$double: true,
+    $isnum: true
+  },
+  JSString: {
+    "^": "Interceptor;",
+    codeUnitAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      if (index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver.charCodeAt(index);
+    },
+    allMatches$1: function(receiver, str) {
+      return H.allMatchesInStringUnchecked(receiver, str);
+    },
+    matchAsPrefix$2: function(receiver, string, start) {
+      var t1, t2, i, t3;
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length));
+      t1 = receiver.length;
+      t2 = string.length;
+      if (start + t1 > t2)
+        return;
+      for (i = 0; i < t1; ++i) {
+        t3 = start + i;
+        if (t3 < 0)
+          H.throwExpression(P.RangeError$value(t3));
+        if (t3 >= t2)
+          H.throwExpression(P.RangeError$value(t3));
+        t3 = string.charCodeAt(t3);
+        if (i >= t1)
+          H.throwExpression(P.RangeError$value(i));
+        if (t3 !== receiver.charCodeAt(i))
+          return;
+      }
+      return new H.StringMatch(start, string, receiver);
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    endsWith$1: function(receiver, other) {
+      var otherLength, t1;
+      otherLength = other.length;
+      t1 = receiver.length;
+      if (otherLength > t1)
+        return false;
+      return other === this.substring$1(receiver, t1 - otherLength);
+    },
+    replaceAll$2: function(receiver, from, to) {
+      return H.stringReplaceAllUnchecked(receiver, from, to);
+    },
+    split$1: function(receiver, pattern) {
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (typeof pattern === "string")
+        return receiver.split(pattern);
+      else if (!!J.getInterceptor(pattern).$isJSSyntaxRegExp)
+        return receiver.split(pattern._nativeRegExp);
+      else
+        throw H.wrapException("String.split(Pattern) UNIMPLEMENTED");
+    },
+    startsWith$2: function(receiver, pattern, index) {
+      var endIndex;
+      if (index > receiver.length)
+        throw H.wrapException(P.RangeError$range(index, 0, receiver.length));
+      endIndex = index + pattern.length;
+      if (endIndex > receiver.length)
+        return false;
+      return pattern === receiver.substring(index, endIndex);
+    },
+    startsWith$1: function($receiver, pattern) {
+      return this.startsWith$2($receiver, pattern, 0);
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      if (typeof startIndex !== "number" || Math.floor(startIndex) !== startIndex)
+        H.throwExpression(P.ArgumentError$(startIndex));
+      if (endIndex == null)
+        endIndex = receiver.length;
+      if (typeof endIndex !== "number" || Math.floor(endIndex) !== endIndex)
+        H.throwExpression(P.ArgumentError$(endIndex));
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (typeof endIndex !== "number")
+        return H.iae(endIndex);
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    toLowerCase$0: function(receiver) {
+      return receiver.toLowerCase();
+    },
+    trim$0: function(receiver) {
+      var result, endIndex, startIndex, t1, endIndex0;
+      result = receiver.trim();
+      endIndex = result.length;
+      if (endIndex === 0)
+        return result;
+      if (this.codeUnitAt$1(result, 0) === 133) {
+        startIndex = J.JSString__skipLeadingWhitespace(result, 1);
+        if (startIndex === endIndex)
+          return "";
+      } else
+        startIndex = 0;
+      t1 = endIndex - 1;
+      endIndex0 = this.codeUnitAt$1(result, t1) === 133 ? J.JSString__skipTrailingWhitespace(result, t1) : endIndex;
+      if (startIndex === 0 && endIndex0 === endIndex)
+        return result;
+      return result.substring(startIndex, endIndex0);
+    },
+    $mul: function(receiver, times) {
+      var s, result;
+      if (typeof times !== "number")
+        return H.iae(times);
+      if (0 >= times)
+        return "";
+      if (times === 1 || receiver.length === 0)
+        return receiver;
+      if (times !== times >>> 0)
+        throw H.wrapException(C.C_OutOfMemoryError);
+      for (s = receiver, result = ""; true;) {
+        if ((times & 1) === 1)
+          result = s + result;
+        times = times >>> 1;
+        if (times === 0)
+          break;
+        s += s;
+      }
+      return result;
+    },
+    indexOf$2: function(receiver, pattern, start) {
+      var t1, match, t2, i;
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (typeof pattern === "string")
+        return receiver.indexOf(pattern, start);
+      t1 = J.getInterceptor(pattern);
+      if (!!t1.$isJSSyntaxRegExp) {
+        match = pattern._execGlobal$2(receiver, start);
+        return match == null ? -1 : match._match.index;
+      }
+      for (t2 = receiver.length, i = start; i <= t2; ++i)
+        if (t1.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, pattern) {
+      return this.indexOf$2($receiver, pattern, 0);
+    },
+    lastIndexOf$2: function(receiver, pattern, start) {
+      var t1, t2;
+      start = receiver.length;
+      t1 = pattern.length;
+      t2 = receiver.length;
+      if (start + t1 > t2)
+        start = t2 - t1;
+      return receiver.lastIndexOf(pattern, start);
+    },
+    lastIndexOf$1: function($receiver, pattern) {
+      return this.lastIndexOf$2($receiver, pattern, null);
+    },
+    contains$2: function(receiver, other, startIndex) {
+      if (other == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (startIndex > receiver.length)
+        throw H.wrapException(P.RangeError$range(startIndex, 0, receiver.length));
+      return H.stringContainsUnchecked(receiver, other, startIndex);
+    },
+    contains$1: function($receiver, other) {
+      return this.contains$2($receiver, other, 0);
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    compareTo$1: function(receiver, other) {
+      var t1;
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver === other)
+        t1 = 0;
+      else
+        t1 = receiver < other ? -1 : 1;
+      return t1;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_Ejg;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $isString: true,
+    static: {JSString__isWhitespace: function(codeUnit) {
+        if (codeUnit < 256)
+          switch (codeUnit) {
+            case 9:
+            case 10:
+            case 11:
+            case 12:
+            case 13:
+            case 32:
+            case 133:
+            case 160:
+              return true;
+            default:
+              return false;
+          }
+        switch (codeUnit) {
+          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 true;
+          default:
+            return false;
+        }
+      }, JSString__skipLeadingWhitespace: function(string, index) {
+        var t1, codeUnit;
+        for (t1 = string.length; index < t1;) {
+          if (index >= t1)
+            H.throwExpression(P.RangeError$value(index));
+          codeUnit = string.charCodeAt(index);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+          ++index;
+        }
+        return index;
+      }, JSString__skipTrailingWhitespace: function(string, index) {
+        var t1, index0, codeUnit;
+        for (t1 = string.length; index > 0; index = index0) {
+          index0 = index - 1;
+          if (index0 >= t1)
+            H.throwExpression(P.RangeError$value(index0));
+          codeUnit = string.charCodeAt(index0);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+        }
+        return index;
+      }}
+  }
+}],
+["_isolate_helper", "dart:_isolate_helper", , H, {
+  "^": "",
+  _callInIsolate: function(isolate, $function) {
+    var result = isolate.eval$1(0, $function);
+    init.globalState.topEventLoop.run$0();
+    return result;
+  },
+  leaveJsAsync: function() {
+    --init.globalState.topEventLoop._activeJsAsyncCount;
+  },
+  startRootIsolate: function(entry, args) {
+    var t1, t2, t3, t4, t5, rootContext;
+    t1 = {};
+    t1.args_0 = args;
+    args = args;
+    t1.args_0 = args;
+    if (args == null) {
+      args = [];
+      t1.args_0 = args;
+      t2 = args;
+    } else
+      t2 = args;
+    if (!J.getInterceptor(t2).$isList)
+      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
+    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
+    t2._Manager$1(entry);
+    init.globalState = t2;
+    if (init.globalState.isWorker === true)
+      return;
+    t2 = init.globalState.nextIsolateId++;
+    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t5 = new H.RawReceivePortImpl(0, null, false);
+    rootContext = new H._IsolateContext(t2, t3, t4, new Isolate(), t5, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t4.add$1(0, 0);
+    rootContext._addRegistration$2(0, t5);
+    init.globalState.rootContext = rootContext;
+    init.globalState.currentContext = rootContext;
+    t2 = H.getDynamicRuntimeType();
+    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
+    if (t3)
+      rootContext.eval$1(0, new H.startRootIsolate_closure(t1, entry));
+    else {
+      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
+      if (t2)
+        rootContext.eval$1(0, new H.startRootIsolate_closure0(t1, entry));
+      else
+        rootContext.eval$1(0, entry);
+    }
+    init.globalState.topEventLoop.run$0();
+  },
+  IsolateNatives_computeThisScript: function() {
+    var currentScript = init.currentScript;
+    if (currentScript != null)
+      return String(currentScript.src);
+    if (typeof version == "function" && typeof os == "object" && "system" in os)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    if (typeof version == "function" && typeof system == "function")
+      return thisFilename();
+    if (init.globalState.isWorker === true)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    return;
+  },
+  IsolateNatives_computeThisScriptFromTrace: function() {
+    var stack, matches;
+    stack = new Error().stack;
+    if (stack == null) {
+      stack = function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+
+      }();
+      if (stack == null)
+        throw H.wrapException(P.UnsupportedError$("No stack trace"));
+    }
+    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
+    if (matches != null)
+      return matches[1];
+    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
+    if (matches != null)
+      return matches[1];
+    throw H.wrapException(P.UnsupportedError$("Cannot extract URI from \"" + H.S(stack) + "\""));
+  },
+  IsolateNatives__processWorkerMessage: [function(sender, e) {
+    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context, replyPort;
+    msg = H._deserializeMessage(e.data);
+    t1 = J.getInterceptor$asx(msg);
+    switch (t1.$index(msg, "command")) {
+      case "start":
+        init.globalState.currentManagerId = t1.$index(msg, "id");
+        functionName = t1.$index(msg, "functionName");
+        entryPoint = functionName == null ? init.globalState.entry : init.globalFunctions[functionName]();
+        args = t1.$index(msg, "args");
+        message = H._deserializeMessage(t1.$index(msg, "msg"));
+        isSpawnUri = t1.$index(msg, "isSpawnUri");
+        startPaused = t1.$index(msg, "startPaused");
+        replyTo = H._deserializeMessage(t1.$index(msg, "replyTo"));
+        t1 = init.globalState.nextIsolateId++;
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+        t4 = new H.RawReceivePortImpl(0, null, false);
+        context = new H._IsolateContext(t1, t2, t3, new Isolate(), t4, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+        t3.add$1(0, 0);
+        context._addRegistration$2(0, t4);
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
+        init.globalState.currentContext = context;
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "spawn-worker":
+        replyPort = t1.$index(msg, "replyPort");
+        H.IsolateNatives_spawn(t1.$index(msg, "functionName"), t1.$index(msg, "uri"), t1.$index(msg, "args"), t1.$index(msg, "msg"), false, t1.$index(msg, "isSpawnUri"), t1.$index(msg, "startPaused")).then$2$onError(new H.IsolateNatives__processWorkerMessage_closure0(replyPort), new H.IsolateNatives__processWorkerMessage_closure1(replyPort));
+        break;
+      case "message":
+        if (t1.$index(msg, "port") != null)
+          J.send$1$x(t1.$index(msg, "port"), t1.$index(msg, "msg"));
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "close":
+        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
+        sender.terminate();
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "log":
+        H.IsolateNatives__log(t1.$index(msg, "msg"));
+        break;
+      case "print":
+        if (init.globalState.isWorker === true) {
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "print", "msg", msg], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        } else
+          P.print(t1.$index(msg, "msg"));
+        break;
+      case "error":
+        throw H.wrapException(t1.$index(msg, "msg"));
+    }
+  }, "call$2", "IsolateNatives__processWorkerMessage$closure", 4, 0, null, 0, 1],
+  IsolateNatives__log: function(msg) {
+    var trace, t1, t2, exception;
+    if (init.globalState.isWorker === true) {
+      t1 = init.globalState.mainManager;
+      t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "log", "msg", msg], null, null));
+      t1.toString;
+      self.postMessage(t2);
+    } else
+      try {
+        $.get$globalThis().console.log(msg);
+      } catch (exception) {
+        H.unwrapException(exception);
+        trace = new H._StackTrace(exception, null);
+        throw H.wrapException(P.Exception_Exception(trace));
+      }
+
+  },
+  IsolateNatives_spawn: function(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
+    var port, completer, signalReply, t1, t2, worker;
+    if (uri != null && J.endsWith$1$s(uri, ".dart"))
+      uri = J.$add$ns(uri, ".js");
+    port = P.ReceivePort_ReceivePort();
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+    port.get$first(port).then$1(new H.IsolateNatives_spawn_closure(completer));
+    signalReply = new H._NativeJsSendPort(port._rawPort, init.globalState.currentContext.id);
+    if (init.globalState.supportsWorkers === true && !isLight)
+      if (init.globalState.isWorker === true) {
+        t1 = init.globalState.mainManager;
+        t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "spawn-worker", "functionName", functionName, "args", args, "msg", message, "uri", uri, "isSpawnUri", isSpawnUri, "startPaused", startPaused, "replyPort", signalReply], null, null));
+        t1.toString;
+        self.postMessage(t2);
+      } else {
+        if (uri == null)
+          uri = $.get$IsolateNatives_thisScript();
+        worker = new Worker(uri);
+        worker.onerror = function(f, u, c) {
+          return function(e) {
+            return f(e, u, c);
+          };
+        }(H.IsolateNatives_workerOnError, uri, new H.IsolateNatives_spawn_closure0(completer));
+        worker.onmessage = function(f, a) {
+          return function(e) {
+            e.onerror = null;
+            return f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, worker);
+        t1 = init.globalState.nextManagerId++;
+        $.get$IsolateNatives_workerIds().$indexSet(0, worker, t1);
+        init.globalState.managers.$indexSet(0, t1, worker);
+        worker.postMessage(H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "start", "id", t1, "replyTo", H._serializeMessage(signalReply), "args", args, "msg", H._serializeMessage(message), "isSpawnUri", isSpawnUri, "startPaused", startPaused, "functionName", functionName], null, null)));
+      }
+    else
+      H.IsolateNatives__startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
+    return completer.future;
+  },
+  IsolateNatives__startNonWorker: function(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
+    var t1, t2, t3, t4, t5, t6;
+    t1 = {};
+    t1.args_0 = args;
+    t1.message_1 = message;
+    if (uri != null)
+      throw H.wrapException(P.UnsupportedError$("Currently spawnUri is not supported without web workers."));
+    t1.message_1 = H._serializeMessage(message);
+    t1.args_0 = H._serializeMessage(t1.args_0);
+    t2 = init.globalState.topEventLoop;
+    t3 = init.globalState.nextIsolateId++;
+    t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t5 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t6 = new H.RawReceivePortImpl(0, null, false);
+    t4 = new H._IsolateContext(t3, t4, t5, new Isolate(), t6, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t5.add$1(0, 0);
+    t4._addRegistration$2(0, t6);
+    t2.events._add$1(0, new H._IsolateEvent(t4, new H.IsolateNatives__startNonWorker_closure(t1, functionName, isSpawnUri, startPaused, replyPort), "nonworker start"));
+  },
+  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    var context, t1, t2, t3;
+    context = init.globalState.currentContext;
+    t1 = context.id;
+    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
+    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
+    t1 = context.controlPort;
+    t2 = init.globalState.currentContext.id;
+    t3 = context.pauseCapability;
+    J.send$1$x(replyTo, ["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
+    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
+    if (startPaused === true) {
+      context.addPause$2(t3, t3);
+      init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, t2, "start isolate"));
+    } else
+      t2.call$0();
+  },
+  IsolateNatives_workerOnError: [function($event, uri, onError) {
+    var message;
+    $event.preventDefault();
+    message = $event.message;
+    onError.call$1(message == null ? "Error spawning worker for " + H.S(uri) : "Error spawning worker for " + H.S(uri) + " (" + message + ")");
+    return true;
+  }, "call$3", "IsolateNatives_workerOnError$closure", 6, 0, null, 2, 3, 4],
+  _serializeMessage: function(message) {
+    var t1;
+    if (init.globalState.supportsWorkers === true) {
+      t1 = new H._JsSerializer(0, new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    } else {
+      t1 = new H._JsCopier(new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    }
+  },
+  _deserializeMessage: function(message) {
+    if (init.globalState.supportsWorkers === true)
+      return new H._JsDeserializer(null).deserialize$1(message);
+    else
+      return message;
+  },
+  _MessageTraverser_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  _Deserializer_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  startRootIsolate_closure: {
+    "^": "Closure:69;box_0,entry_1",
+    call$0: function() {
+      this.entry_1.call$1(this.box_0.args_0);
+    },
+    $isFunction: true
+  },
+  startRootIsolate_closure0: {
+    "^": "Closure:69;box_0,entry_2",
+    call$0: function() {
+      this.entry_2.call$2(this.box_0.args_0, null);
+    },
+    $isFunction: true
+  },
+  _Manager: {
+    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates<,mainManager,managers,entry<",
+    _Manager$1: function(entry) {
+      var t1, t2, t3, $function;
+      t1 = $.get$globalWindow() == null;
+      t2 = $.get$globalWorker();
+      t3 = t1 && $.get$globalPostMessageDefined() === true;
+      this.isWorker = t3;
+      if (!t3)
+        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
+      else
+        t2 = true;
+      this.supportsWorkers = t2;
+      this.fromCommandLine = t1 && !t3;
+      t2 = H._IsolateEvent;
+      t3 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [t2]);
+      t3.ListQueue$1(null, t2);
+      this.topEventLoop = new H._EventLoop(t3, 0);
+      this.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
+      this.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
+      if (this.isWorker === true) {
+        t1 = new H._MainManagerStub();
+        this.mainManager = t1;
+        $function = function(f, a) {
+          return function(e) {
+            f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, t1);
+        $.get$globalThis().onmessage = $function;
+        $.get$globalThis().dartPrint = function(object) {
+        };
+      }
+    }
+  },
+  _IsolateContext: {
+    "^": "Object;id>,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized?,isPaused<,delayedEvents<,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
+    addPause$2: function(authentification, resume) {
+      if (!this.pauseCapability.$eq(0, authentification))
+        return;
+      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
+        this.isPaused = true;
+      this._updateGlobalState$0();
+    },
+    removePause$1: function(resume) {
+      var t1, t2, $event, t3, t4, t5;
+      if (!this.isPaused)
+        return;
+      t1 = this.pauseTokens;
+      t1.remove$1(0, resume);
+      if (t1._collection$_length === 0) {
+        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
+          if (0 >= t2)
+            return H.ioore(t1, 0);
+          $event = t1.pop();
+          t2 = init.globalState.topEventLoop.events;
+          t3 = t2._head;
+          t4 = t2._collection$_table;
+          t5 = t4.length;
+          t3 = (t3 - 1 & t5 - 1) >>> 0;
+          t2._head = t3;
+          if (t3 < 0 || t3 >= t5)
+            return H.ioore(t4, t3);
+          t4[t3] = $event;
+          if (t3 === t2._tail)
+            t2._grow$0();
+          ++t2._modificationCount;
+        }
+        this.isPaused = false;
+      }
+      this._updateGlobalState$0();
+    },
+    addDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null) {
+        t1 = [];
+        this.doneHandlers = t1;
+      }
+      if (J.contains$1$asx(t1, responsePort))
+        return;
+      this.doneHandlers.push(responsePort);
+    },
+    removeDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null)
+        return;
+      J.remove$1$ax(t1, responsePort);
+    },
+    setErrorsFatal$2: function(authentification, errorsAreFatal) {
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      this.errorsAreFatal = errorsAreFatal;
+    },
+    handlePing$2: function(responsePort, pingType) {
+      var t1, t2;
+      t1 = J.getInterceptor(pingType);
+      if (!t1.$eq(pingType, 0))
+        t2 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        J.send$1$x(responsePort, null);
+        return;
+      }
+      t2 = new H._IsolateContext_handlePing_respond(responsePort);
+      if (t1.$eq(pingType, 2)) {
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(this, t2, "ping"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, t2);
+    },
+    handleKill$2: function(authentification, priority) {
+      var t1, t2;
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      t1 = J.getInterceptor(priority);
+      if (!t1.$eq(priority, 0))
+        t2 = t1.$eq(priority, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        this.kill$0();
+        return;
+      }
+      if (t1.$eq(priority, 2)) {
+        t1 = init.globalState.topEventLoop;
+        t2 = this.get$kill();
+        t1.events._add$1(0, new H._IsolateEvent(this, t2, "kill"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, this.get$kill());
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var t1, message;
+      t1 = this.errorPorts;
+      if (t1._collection$_length === 0) {
+        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
+          return;
+        t1 = $.get$globalThis();
+        if (t1.console != null && typeof t1.console.error == "function")
+          t1.console.error(error, stackTrace);
+        else {
+          P.print(error);
+          if (stackTrace != null)
+            P.print(stackTrace);
+        }
+        return;
+      }
+      message = Array(2);
+      message.fixed$length = init;
+      message[0] = J.toString$0(error);
+      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
+      for (t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]), t1._cell = t1._set._first; t1.moveNext$0();)
+        J.send$1$x(t1._collection$_current, message);
+    },
+    eval$1: [function(_, code) {
+      var old, result, e, s, exception, t1;
+      old = init.globalState.currentContext;
+      init.globalState.currentContext = this;
+      $ = this.isolateStatics;
+      result = null;
+      this._isExecutingEvent = true;
+      try {
+        result = code.call$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.handleUncaughtError$2(e, s);
+        if (this.errorsAreFatal === true) {
+          this.kill$0();
+          if (this === init.globalState.rootContext)
+            throw exception;
+        }
+      }
+ finally {
+        this._isExecutingEvent = false;
+        init.globalState.currentContext = old;
+        if (old != null)
+          $ = old.get$isolateStatics();
+        if (this._scheduledControlEvents != null)
+          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
+            this._scheduledControlEvents.removeFirst$0().call$0();
+      }
+      return result;
+    }, "call$1", "get$eval", 2, 0, 70, 71],
+    handleControlMessage$1: function(message) {
+      var t1 = J.getInterceptor$asx(message);
+      switch (t1.$index(message, 0)) {
+        case "pause":
+          this.addPause$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "resume":
+          this.removePause$1(t1.$index(message, 1));
+          break;
+        case "add-ondone":
+          this.addDoneListener$1(t1.$index(message, 1));
+          break;
+        case "remove-ondone":
+          this.removeDoneListener$1(t1.$index(message, 1));
+          break;
+        case "set-errors-fatal":
+          this.setErrorsFatal$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "ping":
+          this.handlePing$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "kill":
+          this.handleKill$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "getErrors":
+          this.errorPorts.add$1(0, t1.$index(message, 1));
+          break;
+        case "stopErrors":
+          this.errorPorts.remove$1(0, t1.$index(message, 1));
+          break;
+      }
+    },
+    lookup$1: function(portId) {
+      return this.ports.$index(0, portId);
+    },
+    _addRegistration$2: function(portId, port) {
+      var t1 = this.ports;
+      if (t1.containsKey$1(portId))
+        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
+      t1.$indexSet(0, portId, port);
+    },
+    _updateGlobalState$0: function() {
+      if (this.ports._collection$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
+        init.globalState.isolates.$indexSet(0, this.id, this);
+      else
+        this.kill$0();
+    },
+    kill$0: [function() {
+      var t1, t2;
+      t1 = this._scheduledControlEvents;
+      if (t1 != null)
+        t1.clear$0(0);
+      for (t1 = this.ports, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.__isolate_helper$_close$0();
+      t1.clear$0(0);
+      this.weakPorts.clear$0(0);
+      init.globalState.isolates.remove$1(0, this.id);
+      this.errorPorts.clear$0(0);
+      t1 = this.doneHandlers;
+      if (t1 != null) {
+        for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.send$1$x(t1._current, null);
+        this.doneHandlers = null;
+      }
+    }, "call$0", "get$kill", 0, 0, 18],
+    $is_IsolateContext: true
+  },
+  _IsolateContext_handlePing_respond: {
+    "^": "Closure:18;responsePort_0",
+    call$0: [function() {
+      J.send$1$x(this.responsePort_0, null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _EventLoop: {
+    "^": "Object;events,_activeJsAsyncCount",
+    dequeue$0: function() {
+      var t1 = this.events;
+      if (t1._head === t1._tail)
+        return;
+      return t1.removeFirst$0();
+    },
+    runIteration$0: function() {
+      var $event, t1, t2;
+      $event = this.dequeue$0();
+      if ($event == null) {
+        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports._collection$_length === 0)
+          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
+        t1 = init.globalState;
+        if (t1.isWorker === true && t1.isolates._collection$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
+          t1 = t1.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "close"], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+        return false;
+      }
+      J.process$0$x($event);
+      return true;
+    },
+    _runHelper$0: function() {
+      if ($.get$globalWindow() != null)
+        new H._EventLoop__runHelper_next(this).call$0();
+      else
+        for (; this.runIteration$0();)
+          ;
+    },
+    run$0: function() {
+      var e, trace, exception, t1, t2;
+      if (init.globalState.isWorker !== true)
+        this._runHelper$0();
+      else
+        try {
+          this._runHelper$0();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          trace = new H._StackTrace(exception, null);
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+
+    }
+  },
+  _EventLoop__runHelper_next: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      if (!this.this_0.runIteration$0())
+        return;
+      P.Timer_Timer(C.Duration_0, this);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _IsolateEvent: {
+    "^": "Object;isolate*,fn,message>",
+    process$0: [function(_) {
+      if (this.isolate.get$isPaused()) {
+        this.isolate.get$delayedEvents().push(this);
+        return;
+      }
+      J.eval$1$x(this.isolate, this.fn);
+    }, "call$0", "get$process", 0, 0, 18],
+    $is_IsolateEvent: true
+  },
+  _MainManagerStub: {
+    "^": "Object;"
+  },
+  IsolateNatives__processWorkerMessage_closure: {
+    "^": "Closure:69;entryPoint_0,args_1,message_2,isSpawnUri_3,startPaused_4,replyTo_5",
+    call$0: [function() {
+      H.IsolateNatives__startIsolate(this.entryPoint_0, this.args_1, this.message_2, this.isSpawnUri_3, this.startPaused_4, this.replyTo_5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure0: {
+    "^": "Closure:13;replyPort_6",
+    call$1: [function(msg) {
+      J.send$1$x(this.replyPort_6, msg);
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure1: {
+    "^": "Closure:5;replyPort_7",
+    call$1: [function(errorMessage) {
+      J.send$1$x(this.replyPort_7, ["spawn failed", errorMessage]);
+    }, "call$1", null, 2, 0, null, 73, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure: {
+    "^": "Closure:13;completer_0",
+    call$1: [function(msg) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(msg);
+      t2 = this.completer_0;
+      if (J.$eq(t1.$index(msg, 0), "spawned")) {
+        t1 = t2.future;
+        if (t1._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t1._asyncComplete$1(msg);
+      } else
+        t2.completeError$1(t1.$index(msg, 1));
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure0: {
+    "^": "Closure:5;completer_1",
+    call$1: [function(message) {
+      return this.completer_1.completeError$1(message);
+    }, "call$1", null, 2, 0, null, 74, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startNonWorker_closure: {
+    "^": "Closure:69;box_0,functionName_1,isSpawnUri_2,startPaused_3,replyPort_4",
+    call$0: [function() {
+      var t1 = this.box_0;
+      H.IsolateNatives__startIsolate(init.globalFunctions[this.functionName_1](), t1.args_0, t1.message_1, this.isSpawnUri_2, this.startPaused_3, this.replyPort_4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startIsolate_runStartFunction: {
+    "^": "Closure:18;topLevel_0,args_1,message_2,isSpawnUri_3,context_4",
+    call$0: [function() {
+      var t1, t2, t3;
+      this.context_4.set$initialized(true);
+      if (this.isSpawnUri_3 !== true)
+        this.topLevel_0.call$1(this.message_2);
+      else {
+        t1 = this.topLevel_0;
+        t2 = H.getDynamicRuntimeType();
+        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+        if (t3)
+          t1.call$2(this.args_1, this.message_2);
+        else {
+          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
+          if (t2)
+            t1.call$1(this.args_1);
+          else
+            t1.call$0();
+        }
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseSendPort: {
+    "^": "Object;",
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort: {
+    "^": "_BaseSendPort;_receivePort,_isolateId",
+    send$1: function(_, message) {
+      var t1, t2, isolate, t3, shouldSerialize;
+      t1 = {};
+      t2 = this._isolateId;
+      isolate = init.globalState.isolates.$index(0, t2);
+      if (isolate == null)
+        return;
+      t3 = this._receivePort;
+      if (t3.get$_isClosed())
+        return;
+      shouldSerialize = init.globalState.currentContext != null && init.globalState.currentContext.id !== t2;
+      t1.msg_0 = message;
+      if (shouldSerialize)
+        t1.msg_0 = H._serializeMessage(message);
+      if (isolate.get$controlPort() === t3) {
+        isolate.handleControlMessage$1(t1.msg_0);
+        return;
+      }
+      t2 = init.globalState.topEventLoop;
+      t3 = "receive " + H.S(message);
+      t2.events._add$1(0, new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(t1, this, shouldSerialize), t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
+    },
+    get$hashCode: function(_) {
+      return J.get$__isolate_helper$_id$x(this._receivePort);
+    },
+    $is_NativeJsSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort_send_closure: {
+    "^": "Closure:69;box_0,this_1,shouldSerialize_2",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_1._receivePort;
+      if (!t1.get$_isClosed()) {
+        if (this.shouldSerialize_2) {
+          t2 = this.box_0;
+          t2.msg_0 = H._deserializeMessage(t2.msg_0);
+        }
+        J.__isolate_helper$_add$1$x(t1, this.box_0.msg_0);
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _WorkerSendPort: {
+    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
+    send$1: function(_, message) {
+      var workerMessage, manager;
+      workerMessage = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "message", "port", this, "msg", message], null, null));
+      if (init.globalState.isWorker === true) {
+        init.globalState.mainManager.toString;
+        self.postMessage(workerMessage);
+      } else {
+        manager = init.globalState.managers.$index(0, this._workerId);
+        if (manager != null)
+          manager.postMessage(workerMessage);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.$shl$n(this._workerId, 16);
+      t2 = J.$shl$n(this._isolateId, 8);
+      t3 = this._receivePortId;
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      return (t1 ^ t2 ^ t3) >>> 0;
+    },
+    $is_WorkerSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  RawReceivePortImpl: {
+    "^": "Object;__isolate_helper$_id>,_handler,_isClosed<",
+    _handler$1: function(arg0) {
+      return this._handler.call$1(arg0);
+    },
+    __isolate_helper$_close$0: function() {
+      this._isClosed = true;
+      this._handler = null;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._isClosed)
+        return;
+      this._isClosed = true;
+      this._handler = null;
+      t1 = init.globalState.currentContext;
+      t2 = this.__isolate_helper$_id;
+      t1.ports.remove$1(0, t2);
+      t1.weakPorts.remove$1(0, t2);
+      t1._updateGlobalState$0();
+    },
+    __isolate_helper$_add$1: function(_, dataEvent) {
+      if (this._isClosed)
+        return;
+      this._handler$1(dataEvent);
+    },
+    $isRawReceivePortImpl: true,
+    static: {"^": "RawReceivePortImpl__nextFreeId"}
+  },
+  ReceivePortImpl: {
+    "^": "Stream;_rawPort,__isolate_helper$_controller",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = this.__isolate_helper$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._ControllerStream(t1), [null]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    close$0: [function(_) {
+      this._rawPort.close$0(0);
+      this.__isolate_helper$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    ReceivePortImpl$fromRawReceivePort$1: function(_rawPort) {
+      var t1 = P.StreamController_StreamController(this.get$close(this), null, null, null, true, null);
+      this.__isolate_helper$_controller = t1;
+      this._rawPort._handler = t1.get$add(t1);
+    },
+    $asStream: function() {
+      return [null];
+    },
+    $isStream: true
+  },
+  _JsSerializer: {
+    "^": "_Serializer;_nextFreeRefId,_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return ["sendport", init.globalState.currentManagerId, x._isolateId, J.get$__isolate_helper$_id$x(x._receivePort)];
+      if (!!x.$is_WorkerSendPort)
+        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return ["capability", x.__isolate_helper$_id];
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsCopier: {
+    "^": "_Copier;_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return new H._NativeJsSendPort(x._receivePort, x._isolateId);
+      if (!!x.$is_WorkerSendPort)
+        return new H._WorkerSendPort(x._workerId, x._receivePortId, x._isolateId);
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return new H.CapabilityImpl(x.__isolate_helper$_id);
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsDeserializer: {
+    "^": "_Deserializer;_deserialized",
+    deserializeSendPort$1: function(list) {
+      var t1, managerId, isolateId, receivePortId, isolate, receivePort;
+      t1 = J.getInterceptor$asx(list);
+      managerId = t1.$index(list, 1);
+      isolateId = t1.$index(list, 2);
+      receivePortId = t1.$index(list, 3);
+      if (J.$eq(managerId, init.globalState.currentManagerId)) {
+        isolate = init.globalState.isolates.$index(0, isolateId);
+        if (isolate == null)
+          return;
+        receivePort = isolate.lookup$1(receivePortId);
+        if (receivePort == null)
+          return;
+        return new H._NativeJsSendPort(receivePort, isolateId);
+      } else
+        return new H._WorkerSendPort(managerId, receivePortId, isolateId);
+    },
+    deserializeCapability$1: function(list) {
+      return new H.CapabilityImpl(J.$index$asx(list, 1));
+    }
+  },
+  _JsVisitedMap: {
+    "^": "Object;tagged",
+    $index: function(_, object) {
+      return object.__MessageTraverser__attached_info__;
+    },
+    $indexSet: function(_, object, info) {
+      this.tagged.push(object);
+      object.__MessageTraverser__attached_info__ = info;
+    },
+    reset$0: function(_) {
+      this.tagged = [];
+    },
+    cleanup$0: function() {
+      var $length, i, t1;
+      for ($length = this.tagged.length, i = 0; i < $length; ++i) {
+        t1 = this.tagged;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t1[i].__MessageTraverser__attached_info__ = null;
+      }
+      this.tagged = null;
+    }
+  },
+  _MessageTraverserVisitedMap: {
+    "^": "Object;",
+    $index: function(_, object) {
+      return;
+    },
+    $indexSet: function(_, object, info) {
+    },
+    reset$0: function(_) {
+    },
+    cleanup$0: function() {
+    }
+  },
+  _MessageTraverser: {
+    "^": "Object;",
+    traverse$1: function(x) {
+      var result;
+      if (H._MessageTraverser_isPrimitive(x))
+        return this.visitPrimitive$1(x);
+      this._visited.reset$0(0);
+      result = null;
+      try {
+        result = this._dispatch$1(x);
+      } finally {
+        this._visited.cleanup$0();
+      }
+      return result;
+    },
+    _dispatch$1: function(x) {
+      var t1;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return this.visitPrimitive$1(x);
+      t1 = J.getInterceptor(x);
+      if (!!t1.$isList)
+        return this.visitList$1(x);
+      if (!!t1.$isMap)
+        return this.visitMap$1(x);
+      if (!!t1.$isSendPort)
+        return this.visitSendPort$1(x);
+      if (!!t1.$isCapability)
+        return this.visitCapability$1(x);
+      return this.visitObject$1(x);
+    },
+    visitObject$1: function(x) {
+      throw H.wrapException("Message serialization: Illegal value " + H.S(x) + " passed");
+    }
+  },
+  _Copier: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copy, t1, len, i;
+      copy = this._visited.$index(0, list);
+      if (copy != null)
+        return copy;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      copy = Array(len);
+      copy.fixed$length = init;
+      this._visited.$indexSet(0, list, copy);
+      for (i = 0; i < len; ++i)
+        copy[i] = this._dispatch$1(t1.$index(list, i));
+      return copy;
+    },
+    visitMap$1: function(map) {
+      var t1, copy;
+      t1 = {};
+      copy = this._visited.$index(0, map);
+      t1.copy_0 = copy;
+      if (copy != null)
+        return copy;
+      copy = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1.copy_0 = copy;
+      this._visited.$indexSet(0, map, copy);
+      map.forEach$1(0, new H._Copier_visitMap_closure(t1, this));
+      return t1.copy_0;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Copier_visitMap_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function(key, val) {
+      var t1 = this.this_1;
+      J.$indexSet$ax(this.box_0.copy_0, t1._dispatch$1(key), t1._dispatch$1(val));
+    },
+    $isFunction: true
+  },
+  _Serializer: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, list);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, list, t1);
+      return ["list", t1, this._serializeList$1(list)];
+    },
+    visitMap$1: function(map) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, map);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, map, t1);
+      return ["map", t1, this._serializeList$1(J.toList$0$ax(map.get$keys())), this._serializeList$1(J.toList$0$ax(map.get$values(map)))];
+    },
+    _serializeList$1: function(list) {
+      var t1, len, result, i, t2;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      result = [];
+      C.JSArray_methods.set$length(result, len);
+      for (i = 0; i < len; ++i) {
+        t2 = this._dispatch$1(t1.$index(list, i));
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t2;
+      }
+      return result;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Deserializer: {
+    "^": "Object;",
+    deserialize$1: function(x) {
+      if (H._Deserializer_isPrimitive(x))
+        return x;
+      this._deserialized = P.HashMap_HashMap(null, null, null, null, null);
+      return this._deserializeHelper$1(x);
+    },
+    _deserializeHelper$1: function(x) {
+      var t1, id;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      t1 = J.getInterceptor$asx(x);
+      switch (t1.$index(x, 0)) {
+        case "ref":
+          id = t1.$index(x, 1);
+          return this._deserialized.$index(0, id);
+        case "list":
+          return this._deserializeList$1(x);
+        case "map":
+          return this._deserializeMap$1(x);
+        case "sendport":
+          return this.deserializeSendPort$1(x);
+        case "capability":
+          return this.deserializeCapability$1(x);
+        default:
+          return this.deserializeObject$1(x);
+      }
+    },
+    _deserializeList$1: function(x) {
+      var t1, id, dartList, len, i;
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      dartList = t1.$index(x, 2);
+      this._deserialized.$indexSet(0, id, dartList);
+      t1 = J.getInterceptor$asx(dartList);
+      len = t1.get$length(dartList);
+      if (typeof len !== "number")
+        return H.iae(len);
+      i = 0;
+      for (; i < len; ++i)
+        t1.$indexSet(dartList, i, this._deserializeHelper$1(t1.$index(dartList, i)));
+      return dartList;
+    },
+    _deserializeMap$1: function(x) {
+      var result, t1, id, keys, values, len, t2, i;
+      result = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      this._deserialized.$indexSet(0, id, result);
+      keys = t1.$index(x, 2);
+      values = t1.$index(x, 3);
+      t1 = J.getInterceptor$asx(keys);
+      len = t1.get$length(keys);
+      if (typeof len !== "number")
+        return H.iae(len);
+      t2 = J.getInterceptor$asx(values);
+      i = 0;
+      for (; i < len; ++i)
+        result.$indexSet(0, this._deserializeHelper$1(t1.$index(keys, i)), this._deserializeHelper$1(t2.$index(values, i)));
+      return result;
+    },
+    deserializeObject$1: function(x) {
+      throw H.wrapException("Unexpected serialized object");
+    }
+  },
+  TimerImpl: {
+    "^": "Object;_once,_inEventLoop,_handle",
+    cancel$0: function() {
+      if ($.get$globalThis().setTimeout != null) {
+        if (this._inEventLoop)
+          throw H.wrapException(P.UnsupportedError$("Timer in event loop cannot be canceled."));
+        if (this._handle == null)
+          return;
+        H.leaveJsAsync();
+        if (this._once)
+          $.get$globalThis().clearTimeout(this._handle);
+        else
+          $.get$globalThis().clearInterval(this._handle);
+        this._handle = null;
+      } else
+        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
+    },
+    TimerImpl$2: function(milliseconds, callback) {
+      var t1, t2;
+      if (milliseconds === 0)
+        t1 = $.get$globalThis().setTimeout == null || init.globalState.isWorker === true;
+      else
+        t1 = false;
+      if (t1) {
+        this._handle = 1;
+        t1 = init.globalState.topEventLoop;
+        t2 = init.globalState.currentContext;
+        t1.events._add$1(0, new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
+        this._inEventLoop = true;
+      } else {
+        t1 = $.get$globalThis();
+        if (t1.setTimeout != null) {
+          ++init.globalState.topEventLoop._activeJsAsyncCount;
+          this._handle = t1.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
+        } else
+          throw H.wrapException(P.UnsupportedError$("Timer greater than 0."));
+      }
+    },
+    static: {TimerImpl$: function(milliseconds, callback) {
+        var t1 = new H.TimerImpl(true, false, null);
+        t1.TimerImpl$2(milliseconds, callback);
+        return t1;
+      }}
+  },
+  TimerImpl_internalCallback: {
+    "^": "Closure:18;this_0,callback_1",
+    call$0: [function() {
+      this.this_0._handle = null;
+      this.callback_1.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  TimerImpl_internalCallback0: {
+    "^": "Closure:18;this_2,callback_3",
+    call$0: [function() {
+      this.this_2._handle = null;
+      H.leaveJsAsync();
+      this.callback_3.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  CapabilityImpl: {
+    "^": "Object;__isolate_helper$_id>",
+    get$hashCode: function(_) {
+      var hash, t1, t2;
+      hash = this.__isolate_helper$_id;
+      t1 = J.getInterceptor$n(hash);
+      t2 = t1.$shr(hash, 0);
+      t1 = t1.$tdiv(hash, 4294967296);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      hash = t2 ^ t1;
+      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
+      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
+      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
+      return (hash ^ hash >>> 16) >>> 0;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (other === this)
+        return true;
+      if (!!J.getInterceptor(other).$isCapabilityImpl) {
+        t1 = this.__isolate_helper$_id;
+        t2 = other.__isolate_helper$_id;
+        return t1 == null ? t2 == null : t1 === t2;
+      }
+      return false;
+    },
+    $isCapabilityImpl: true,
+    $isCapability: true
+  }
+}],
+["_js_helper", "dart:_js_helper", , H, {
+  "^": "",
+  isJsIndexable: function(object, record) {
+    var result;
+    if (record != null) {
+      result = record.x;
+      if (result != null)
+        return result;
+    }
+    return !!J.getInterceptor(object).$isJavaScriptIndexingBehavior;
+  },
+  S: function(value) {
+    var res;
+    if (typeof value === "string")
+      return value;
+    if (typeof value === "number") {
+      if (value !== 0)
+        return "" + value;
+    } else if (true === value)
+      return "true";
+    else if (false === value)
+      return "false";
+    else if (value == null)
+      return "null";
+    res = J.toString$0(value);
+    if (typeof res !== "string")
+      throw H.wrapException(P.ArgumentError$(value));
+    return res;
+  },
+  Primitives_objectHashCode: function(object) {
+    var hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  },
+  Primitives__throwFormatException: [function(string) {
+    throw H.wrapException(P.FormatException$(string));
+  }, "call$1", "Primitives__throwFormatException$closure", 2, 0, 5],
+  Primitives_parseInt: function(source, radix, handleError) {
+    var match, t1, maxCharCode, digitsPart, i, t2;
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+    if (radix == null) {
+      if (match != null) {
+        t1 = match.length;
+        if (2 >= t1)
+          return H.ioore(match, 2);
+        if (match[2] != null)
+          return parseInt(source, 16);
+        if (3 >= t1)
+          return H.ioore(match, 3);
+        if (match[3] != null)
+          return parseInt(source, 10);
+        return handleError.call$1(source);
+      }
+      radix = 10;
+    } else {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$("Radix " + H.S(radix) + " not in range 2..36"));
+      if (match != null) {
+        if (radix === 10) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] != null;
+        } else
+          t1 = false;
+        if (t1)
+          return parseInt(source, 10);
+        if (!(radix < 10)) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] == null;
+        } else
+          t1 = true;
+        if (t1) {
+          maxCharCode = radix <= 10 ? 48 + radix - 1 : 97 + radix - 10 - 1;
+          if (1 >= match.length)
+            return H.ioore(match, 1);
+          digitsPart = match[1];
+          t1 = J.getInterceptor$asx(digitsPart);
+          i = 0;
+          while (true) {
+            t2 = t1.get$length(digitsPart);
+            if (typeof t2 !== "number")
+              return H.iae(t2);
+            if (!(i < t2))
+              break;
+            t1.codeUnitAt$1(digitsPart, 0);
+            if (t1.codeUnitAt$1(digitsPart, i) > maxCharCode)
+              return handleError.call$1(source);
+            ++i;
+          }
+        }
+      }
+    }
+    if (match == null)
+      return handleError.call$1(source);
+    return parseInt(source, radix);
+  },
+  Primitives_parseDouble: function(source, handleError) {
+    var result, trimmed;
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source))
+      return handleError.call$1(source);
+    result = parseFloat(source);
+    if (isNaN(result)) {
+      trimmed = J.trim$0$s(source);
+      if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN")
+        return result;
+      return handleError.call$1(source);
+    }
+    return result;
+  },
+  Primitives_objectTypeName: function(object) {
+    var $name, decompiled;
+    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
+    if ($name === "Object") {
+      decompiled = String(object.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1];
+      if (typeof decompiled === "string")
+        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
+    }
+    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
+      $name = C.JSString_methods.substring$1($name, 1);
+    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
+      return init.mangledGlobalNames[m] || m;
+    });
+  },
+  Primitives_objectToString: function(object) {
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Primitives_numMicroseconds: function() {
+    if (typeof window != "undefined" && window !== null) {
+      var performance = window.performance;
+      if (performance != null && typeof performance.webkitNow == "function")
+        return C.JSNumber_methods.toInt$0(Math.floor(1000 * performance.webkitNow()));
+    }
+    return 1000 * Date.now();
+  },
+  Primitives__fromCharCodeApply: function(array) {
+    var end, t1, result, i, subarray, t2;
+    end = array.length;
+    for (t1 = end <= 500, result = "", i = 0; i < end; i += 500) {
+      if (t1)
+        subarray = array;
+      else {
+        t2 = i + 500;
+        t2 = t2 < end ? t2 : end;
+        subarray = array.slice(i, t2);
+      }
+      result += String.fromCharCode.apply(null, subarray);
+    }
+    return result;
+  },
+  Primitives_stringFromCodePoints: function(codePoints) {
+    var a, t1, i;
+    a = [];
+    a.$builtinTypeInfo = [P.$int];
+    t1 = new H.ListIterator(codePoints, codePoints.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(codePoints, 0)];
+    for (; t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i <= 65535)
+        a.push(i);
+      else if (i <= 1114111) {
+        a.push(55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
+        a.push(56320 + (i & 1023));
+      } else
+        throw H.wrapException(P.ArgumentError$(i));
+    }
+    return H.Primitives__fromCharCodeApply(a);
+  },
+  Primitives_stringFromCharCodes: function(charCodes) {
+    var t1, i;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(charCodes, charCodes.length, 0, null), [H.getTypeArgumentByIndex(charCodes, 0)]); t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i < 0)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i > 65535)
+        return H.Primitives_stringFromCodePoints(charCodes);
+    }
+    return H.Primitives__fromCharCodeApply(charCodes);
+  },
+  Primitives_stringFromCharCode: function(charCode) {
+    var bits;
+    if (typeof charCode !== "number")
+      return H.iae(charCode);
+    if (0 <= charCode) {
+      if (charCode <= 65535)
+        return String.fromCharCode(charCode);
+      if (charCode <= 1114111) {
+        bits = charCode - 65536;
+        return String.fromCharCode((55296 | C.JSNumber_methods._shrOtherPositive$1(bits, 10)) >>> 0, (56320 | bits & 1023) >>> 0);
+      }
+    }
+    throw H.wrapException(P.RangeError$range(charCode, 0, 1114111));
+  },
+  Primitives_valueFromDecomposedDate: function(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
+    var jsMonth, value, t1, date;
+    if (typeof years !== "number" || Math.floor(years) !== years)
+      H.throwExpression(P.ArgumentError$(years));
+    if (typeof month !== "number" || Math.floor(month) !== month)
+      H.throwExpression(P.ArgumentError$(month));
+    if (typeof day !== "number" || Math.floor(day) !== day)
+      H.throwExpression(P.ArgumentError$(day));
+    if (typeof hours !== "number" || Math.floor(hours) !== hours)
+      H.throwExpression(P.ArgumentError$(hours));
+    if (typeof minutes !== "number" || Math.floor(minutes) !== minutes)
+      H.throwExpression(P.ArgumentError$(minutes));
+    if (typeof seconds !== "number" || Math.floor(seconds) !== seconds)
+      H.throwExpression(P.ArgumentError$(seconds));
+    jsMonth = J.$sub$n(month, 1);
+    value = isUtc ? Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds) : new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
+    if (isNaN(value) || value < -8640000000000000 || value > 8640000000000000)
+      throw H.wrapException(P.ArgumentError$(null));
+    t1 = J.getInterceptor$n(years);
+    if (t1.$le(years, 0) || t1.$lt(years, 100)) {
+      date = new Date(value);
+      if (isUtc)
+        date.setUTCFullYear(years);
+      else
+        date.setFullYear(years);
+      return date.valueOf();
+    }
+    return value;
+  },
+  Primitives_lazyAsJsDate: function(receiver) {
+    if (receiver.date === void 0)
+      receiver.date = new Date(receiver.millisecondsSinceEpoch);
+    return receiver.date;
+  },
+  Primitives_getProperty: function(object, key) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    return object[key];
+  },
+  Primitives_setProperty: function(object, key, value) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    object[key] = value;
+  },
+  Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
+    var t1, $arguments, namedArgumentList;
+    t1 = {};
+    t1.argumentCount_0 = 0;
+    $arguments = [];
+    namedArgumentList = [];
+    if (positionalArguments != null) {
+      t1.argumentCount_0 = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    }
+    t1.names_1 = "";
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
+      namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, $arguments, namedArgumentList));
+    return J.noSuchMethod$1($function, new H.JSInvocationMirror(C.Symbol_call, "call$" + t1.argumentCount_0 + t1.names_1, 0, $arguments, namedArgumentList, null));
+  },
+  Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
+    var t1, jsFunction, info, t2, defaultArguments, t3, i, index, $arguments, argumentCount;
+    t1 = {};
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments)) {
+      jsFunction = J.getInterceptor($function)["call*"];
+      if (jsFunction == null)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      info = H.ReflectionInfo_ReflectionInfo(jsFunction);
+      if (info == null || !info.areOptionalParametersNamed)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      positionalArguments = positionalArguments != null ? P.List_List$from(positionalArguments, true, null) : [];
+      t2 = info.requiredParameterCount;
+      if (t2 !== positionalArguments.length)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      defaultArguments = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      for (t3 = info.optionalParameterCount, i = 0; i < t3; ++i) {
+        index = i + t2;
+        defaultArguments.$indexSet(0, info.parameterNameInOrder$1(index), init.metadata[info.defaultValueInOrder$1(index)]);
+      }
+      t1.bad_0 = false;
+      namedArguments.forEach$1(0, new H.Primitives_applyFunction_closure(t1, defaultArguments));
+      if (t1.bad_0)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      C.JSArray_methods.addAll$1(positionalArguments, defaultArguments.get$values(defaultArguments));
+      return jsFunction.apply($function, positionalArguments);
+    }
+    $arguments = [];
+    if (positionalArguments != null) {
+      argumentCount = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    } else
+      argumentCount = 0;
+    jsFunction = $function["call$" + argumentCount];
+    if (jsFunction == null)
+      return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+    return jsFunction.apply($function, $arguments);
+  },
+  iae: function(argument) {
+    throw H.wrapException(P.ArgumentError$(argument));
+  },
+  ioore: function(receiver, index) {
+    if (receiver == null)
+      J.get$length$asx(receiver);
+    if (typeof index !== "number" || Math.floor(index) !== index)
+      H.iae(index);
+    throw H.wrapException(P.RangeError$value(index));
+  },
+  wrapException: function(ex) {
+    var wrapper;
+    if (ex == null)
+      ex = new P.NullThrownError();
+    wrapper = new Error();
+    wrapper.dartException = ex;
+    if ("defineProperty" in Object) {
+      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+      wrapper.name = "";
+    } else
+      wrapper.toString = H.toStringWrapper;
+    return wrapper;
+  },
+  toStringWrapper: [function() {
+    return J.toString$0(this.dartException);
+  }, "call$0", "toStringWrapper$closure", 0, 0, null],
+  throwExpression: function(ex) {
+    throw H.wrapException(ex);
+  },
+  unwrapException: function(ex) {
+    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
+    t1 = new H.unwrapException_saveStackTrace(ex);
+    if (ex == null)
+      return;
+    if (typeof ex !== "object")
+      return ex;
+    if ("dartException" in ex)
+      return t1.call$1(ex.dartException);
+    else if (!("message" in ex))
+      return ex;
+    message = ex.message;
+    if ("number" in ex && typeof ex.number == "number") {
+      number = ex.number;
+      ieErrorCode = number & 65535;
+      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+        switch (ieErrorCode) {
+          case 438:
+            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
+          case 445:
+          case 5007:
+            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
+            return t1.call$1(new H.NullError(t2, null));
+        }
+    }
+    if (ex instanceof TypeError) {
+      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
+      t3 = $.get$TypeErrorDecoder_notClosurePattern();
+      t4 = $.get$TypeErrorDecoder_nullCallPattern();
+      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
+      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
+      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
+      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
+      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
+      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
+      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+      match = t2.matchTypeError$1(message);
+      if (match != null)
+        return t1.call$1(H.JsNoSuchMethodError$(message, match));
+      else {
+        match = t3.matchTypeError$1(message);
+        if (match != null) {
+          match.method = "call";
+          return t1.call$1(H.JsNoSuchMethodError$(message, match));
+        } else {
+          match = t4.matchTypeError$1(message);
+          if (match == null) {
+            match = nullLiteralCall.matchTypeError$1(message);
+            if (match == null) {
+              match = t5.matchTypeError$1(message);
+              if (match == null) {
+                match = t6.matchTypeError$1(message);
+                if (match == null) {
+                  match = t7.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullLiteralCall.matchTypeError$1(message);
+                    if (match == null) {
+                      match = t8.matchTypeError$1(message);
+                      if (match == null) {
+                        match = t9.matchTypeError$1(message);
+                        t2 = match != null;
+                      } else
+                        t2 = true;
+                    } else
+                      t2 = true;
+                  } else
+                    t2 = true;
+                } else
+                  t2 = true;
+              } else
+                t2 = true;
+            } else
+              t2 = true;
+          } else
+            t2 = true;
+          if (t2) {
+            t2 = match == null ? null : match.method;
+            return t1.call$1(new H.NullError(message, t2));
+          }
+        }
+      }
+      t2 = typeof message === "string" ? message : "";
+      return t1.call$1(new H.UnknownJsTypeError(t2));
+    }
+    if (ex instanceof RangeError) {
+      if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        return new P.StackOverflowError();
+      return t1.call$1(new P.ArgumentError(null));
+    }
+    if (typeof InternalError == "function" && ex instanceof InternalError)
+      if (typeof message === "string" && message === "too much recursion")
+        return new P.StackOverflowError();
+    return ex;
+  },
+  objectHashCode: function(object) {
+    if (object == null || typeof object != 'object')
+      return J.get$hashCode$(object);
+    else
+      return H.Primitives_objectHashCode(object);
+  },
+  fillLiteralMap: function(keyValuePairs, result) {
+    var $length, index, index0, index1;
+    $length = keyValuePairs.length;
+    for (index = 0; index < $length; index = index1) {
+      index0 = index + 1;
+      index1 = index0 + 1;
+      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+    }
+    return result;
+  },
+  invokeClosure: [function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
+    var t1 = J.getInterceptor(numberOfArguments);
+    if (t1.$eq(numberOfArguments, 0))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
+    else if (t1.$eq(numberOfArguments, 1))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
+    else if (t1.$eq(numberOfArguments, 2))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
+    else if (t1.$eq(numberOfArguments, 3))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
+    else if (t1.$eq(numberOfArguments, 4))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
+    else
+      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+  }, "call$7", "invokeClosure$closure", 14, 0, null, 6, 7, 8, 9, 10, 11, 12],
+  convertDartClosureToJS: function(closure, arity) {
+    var $function;
+    if (closure == null)
+      return;
+    $function = closure.$identity;
+    if (!!$function)
+      return $function;
+    $function = function(closure, arity, context, invoke) {
+      return function(a1, a2, a3, a4) {
+        return invoke(closure, context, arity, a1, a2, a3, a4);
+      };
+    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
+    closure.$identity = $function;
+    return $function;
+  },
+  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
+    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
+    $function = functions[0];
+    $function.$stubName;
+    callName = $function.$callName;
+    $function.$reflectionInfo = reflectionInfo;
+    functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
+    $prototype = isStatic ? Object.create(new H.TearOffClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
+    $prototype.$initialize = $prototype.constructor;
+    if (isStatic)
+      $constructor = function() {
+        this.$initialize();
+      };
+    else if (typeof dart_precompiled == "function") {
+      t1 = function(a, b, c, d) {
+        this.$initialize(a, b, c, d);
+      };
+      $constructor = t1;
+    } else {
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t1, 1);
+      t1 = new Function("a", "b", "c", "d", "this.$initialize(a,b,c,d);" + t1);
+      $constructor = t1;
+    }
+    $prototype.constructor = $constructor;
+    $constructor.prototype = $prototype;
+    t1 = !isStatic;
+    if (t1) {
+      isIntercepted = jsArguments.length == 1 && true;
+      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+      trampoline.$reflectionInfo = reflectionInfo;
+    } else {
+      $prototype.$name = propertyName;
+      trampoline = $function;
+      isIntercepted = false;
+    }
+    if (typeof functionType == "number")
+      signatureFunction = function(s) {
+        return function() {
+          return init.metadata[s];
+        };
+      }(functionType);
+    else if (t1 && typeof functionType == "function") {
+      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
+      signatureFunction = function(f, r) {
+        return function() {
+          return f.apply({$receiver: r(this)}, arguments);
+        };
+      }(functionType, getReceiver);
+    } else
+      throw H.wrapException("Error in reflectionInfo.");
+    $prototype.$signature = signatureFunction;
+    $prototype[callName] = trampoline;
+    for (t1 = functions.length, i = 1; i < t1; ++i) {
+      stub = functions[i];
+      stubCallName = stub.$callName;
+      if (stubCallName != null) {
+        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+        $prototype[stubCallName] = t2;
+      }
+    }
+    $prototype["call*"] = trampoline;
+    return $constructor;
+  },
+  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+    var getSelf = H.BoundClosure_selfOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        return function(n, S) {
+          return function() {
+            return S(this)[n]();
+          };
+        }(stubName, getSelf);
+      case 1:
+        return function(n, S) {
+          return function(a) {
+            return S(this)[n](a);
+          };
+        }(stubName, getSelf);
+      case 2:
+        return function(n, S) {
+          return function(a, b) {
+            return S(this)[n](a, b);
+          };
+        }(stubName, getSelf);
+      case 3:
+        return function(n, S) {
+          return function(a, b, c) {
+            return S(this)[n](a, b, c);
+          };
+        }(stubName, getSelf);
+      case 4:
+        return function(n, S) {
+          return function(a, b, c, d) {
+            return S(this)[n](a, b, c, d);
+          };
+        }(stubName, getSelf);
+      case 5:
+        return function(n, S) {
+          return function(a, b, c, d, e) {
+            return S(this)[n](a, b, c, d, e);
+          };
+        }(stubName, getSelf);
+      default:
+        return function(f, s) {
+          return function() {
+            return f.apply(s(this), arguments);
+          };
+        }($function, getSelf);
+    }
+  },
+  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
+    if (isIntercepted)
+      return H.Closure_forwardInterceptedCallTo(receiver, $function);
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (typeof dart_precompiled == "function" || !t1 || arity >= 27)
+      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+    if (arity === 0) {
+      t1 = $.BoundClosure_selfFieldNameCache;
+      if (t1 == null) {
+        t1 = H.BoundClosure_computeFieldNamed("self");
+        $.BoundClosure_selfFieldNameCache = t1;
+      }
+      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+    t1 = "return function(" + $arguments + "){return this.";
+    t2 = $.BoundClosure_selfFieldNameCache;
+    if (t2 == null) {
+      t2 = H.BoundClosure_computeFieldNamed("self");
+      $.BoundClosure_selfFieldNameCache = t2;
+    }
+    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
+    t1 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t1, 1);
+    return new Function(t2 + H.S(t1) + "}")();
+  },
+  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+    var getSelf, getReceiver;
+    getSelf = H.BoundClosure_selfOf;
+    getReceiver = H.BoundClosure_receiverOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        throw H.wrapException(H.RuntimeError$("Intercepted function with no arguments."));
+      case 1:
+        return function(n, s, r) {
+          return function() {
+            return s(this)[n](r(this));
+          };
+        }($name, getSelf, getReceiver);
+      case 2:
+        return function(n, s, r) {
+          return function(a) {
+            return s(this)[n](r(this), a);
+          };
+        }($name, getSelf, getReceiver);
+      case 3:
+        return function(n, s, r) {
+          return function(a, b) {
+            return s(this)[n](r(this), a, b);
+          };
+        }($name, getSelf, getReceiver);
+      case 4:
+        return function(n, s, r) {
+          return function(a, b, c) {
+            return s(this)[n](r(this), a, b, c);
+          };
+        }($name, getSelf, getReceiver);
+      case 5:
+        return function(n, s, r) {
+          return function(a, b, c, d) {
+            return s(this)[n](r(this), a, b, c, d);
+          };
+        }($name, getSelf, getReceiver);
+      case 6:
+        return function(n, s, r) {
+          return function(a, b, c, d, e) {
+            return s(this)[n](r(this), a, b, c, d, e);
+          };
+        }($name, getSelf, getReceiver);
+      default:
+        return function(f, s, r, a) {
+          return function() {
+            a = [r(this)];
+            Array.prototype.push.apply(a, arguments);
+            return f.apply(s(this), a);
+          };
+        }($function, getSelf, getReceiver);
+    }
+  },
+  Closure_forwardInterceptedCallTo: function(receiver, $function) {
+    var selfField, t1, stubName, arity, isCsp, lookedUpFunction, t2, $arguments;
+    selfField = H.BoundClosure_selfFieldName();
+    t1 = $.BoundClosure_receiverFieldNameCache;
+    if (t1 == null) {
+      t1 = H.BoundClosure_computeFieldNamed("receiver");
+      $.BoundClosure_receiverFieldNameCache = t1;
+    }
+    stubName = $function.$stubName;
+    arity = $function.length;
+    isCsp = typeof dart_precompiled == "function";
+    lookedUpFunction = receiver[stubName];
+    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (isCsp || !t2 || arity >= 28)
+      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
+    if (arity === 1) {
+      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
+    t2 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t2, 1);
+    return new Function(t1 + H.S(t2) + "}")();
+  },
+  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
+    functions.fixed$length = init;
+    reflectionInfo.fixed$length = init;
+    return H.Closure_fromTearOff(receiver, functions, reflectionInfo, !!isStatic, jsArguments, $name);
+  },
+  propertyTypeCastError: function(value, property) {
+    var t1 = J.getInterceptor$asx(property);
+    throw H.wrapException(H.CastErrorImplementation$(H.Primitives_objectTypeName(value), t1.substring$2(property, 3, t1.get$length(property))));
+  },
+  interceptedTypeCast: function(value, property) {
+    var t1;
+    if (value != null)
+      t1 = typeof value === "object" && J.getInterceptor(value)[property];
+    else
+      t1 = true;
+    if (t1)
+      return value;
+    H.propertyTypeCastError(value, property);
+  },
+  throwCyclicInit: function(staticName) {
+    throw H.wrapException(P.CyclicInitializationError$("Cyclic initialization for static " + H.S(staticName)));
+  },
+  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
+    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
+  },
+  buildInterfaceType: function(rti, typeArguments) {
+    var $name = rti.name;
+    if (typeArguments == null || typeArguments.length === 0)
+      return new H.RuntimeTypePlain($name);
+    return new H.RuntimeTypeGeneric($name, typeArguments, null);
+  },
+  getDynamicRuntimeType: function() {
+    return C.C_DynamicRuntimeType;
+  },
+  createRuntimeType: function($name) {
+    return new H.TypeImpl($name, null);
+  },
+  setRuntimeTypeInfo: function(target, typeInfo) {
+    if (target != null)
+      target.$builtinTypeInfo = typeInfo;
+    return target;
+  },
+  getRuntimeTypeInfo: function(target) {
+    if (target == null)
+      return;
+    return target.$builtinTypeInfo;
+  },
+  getRuntimeTypeArguments: function(target, substitutionName) {
+    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
+  },
+  getRuntimeTypeArgument: function(target, substitutionName, index) {
+    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
+    return $arguments == null ? null : $arguments[index];
+  },
+  getTypeArgumentByIndex: function(target, index) {
+    var rti = H.getRuntimeTypeInfo(target);
+    return rti == null ? null : rti[index];
+  },
+  runtimeTypeToString: function(type, onTypeVariable) {
+    if (type == null)
+      return "dynamic";
+    else if (typeof type === "object" && type !== null && type.constructor === Array)
+      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
+    else if (typeof type == "function")
+      return type.builtin$cls;
+    else if (typeof type === "number" && Math.floor(type) === type)
+      return C.JSInt_methods.toString$0(type);
+    else
+      return;
+  },
+  joinArguments: function(types, startIndex, onTypeVariable) {
+    var buffer, index, firstArgument, allDynamic, argument, str;
+    if (types == null)
+      return "";
+    buffer = P.StringBuffer$("");
+    for (index = startIndex, firstArgument = true, allDynamic = true; index < types.length; ++index) {
+      if (firstArgument)
+        firstArgument = false;
+      else
+        buffer._contents += ", ";
+      argument = types[index];
+      if (argument != null)
+        allDynamic = false;
+      str = H.runtimeTypeToString(argument, onTypeVariable);
+      buffer._contents += typeof str === "string" ? str : H.S(str);
+    }
+    return allDynamic ? "" : "<" + H.S(buffer) + ">";
+  },
+  getRuntimeTypeString: function(object) {
+    var className = J.getInterceptor(object).constructor.builtin$cls;
+    if (object == null)
+      return className;
+    return className + H.joinArguments(object.$builtinTypeInfo, 0, null);
+  },
+  substitute: function(substitution, $arguments) {
+    if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+      $arguments = substitution;
+    else if (typeof substitution == "function") {
+      substitution = H.invokeOn(substitution, null, $arguments);
+      if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+        $arguments = substitution;
+      else if (typeof substitution == "function")
+        $arguments = H.invokeOn(substitution, null, $arguments);
+    }
+    return $arguments;
+  },
+  checkSubtype: function(object, isField, checks, asField) {
+    var $arguments, interceptor;
+    if (object == null)
+      return false;
+    $arguments = H.getRuntimeTypeInfo(object);
+    interceptor = J.getInterceptor(object);
+    if (interceptor[isField] == null)
+      return false;
+    return H.areSubtypes(H.substitute(interceptor[asField], $arguments), checks);
+  },
+  areSubtypes: function(s, t) {
+    var len, i;
+    if (s == null || t == null)
+      return true;
+    len = s.length;
+    for (i = 0; i < len; ++i)
+      if (!H.isSubtype(s[i], t[i]))
+        return false;
+    return true;
+  },
+  computeSignature: function(signature, context, contextName) {
+    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
+  },
+  checkSubtypeOfRuntimeType: function(o, t) {
+    var rti, type;
+    if (o == null)
+      return t == null || t.builtin$cls === "Object" || t.builtin$cls === "Null";
+    if (t == null)
+      return true;
+    rti = H.getRuntimeTypeInfo(o);
+    o = J.getInterceptor(o);
+    if (rti != null) {
+      type = rti.slice();
+      type.splice(0, 0, o);
+    } else
+      type = o;
+    return H.isSubtype(type, t);
+  },
+  isSubtype: function(s, t) {
+    var targetSignatureFunction, t1, typeOfS, t2, typeOfT, $name, substitution;
+    if (s === t)
+      return true;
+    if (s == null || t == null)
+      return true;
+    if ("func" in t) {
+      if (!("func" in s)) {
+        if ("$is_" + H.S(t.func) in s)
+          return true;
+        targetSignatureFunction = s.$signature;
+        if (targetSignatureFunction == null)
+          return false;
+        s = targetSignatureFunction.apply(s, null);
+      }
+      return H.isFunctionSubtype(s, t);
+    }
+    if (t.builtin$cls === "Function" && "func" in s)
+      return true;
+    t1 = typeof s === "object" && s !== null && s.constructor === Array;
+    typeOfS = t1 ? s[0] : s;
+    t2 = typeof t === "object" && t !== null && t.constructor === Array;
+    typeOfT = t2 ? t[0] : t;
+    $name = H.runtimeTypeToString(typeOfT, null);
+    if (typeOfT !== typeOfS) {
+      if (!("$is" + H.S($name) in typeOfS))
+        return false;
+      substitution = typeOfS["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
+    } else
+      substitution = null;
+    if (!t1 && substitution == null || !t2)
+      return true;
+    t1 = t1 ? s.slice(1) : null;
+    t2 = t2 ? t.slice(1) : null;
+    return H.areSubtypes(H.substitute(substitution, t1), t2);
+  },
+  areAssignable: function(s, t, allowShorter) {
+    var sLength, tLength, i, t1, t2;
+    if (t == null && s == null)
+      return true;
+    if (t == null)
+      return allowShorter;
+    if (s == null)
+      return false;
+    sLength = s.length;
+    tLength = t.length;
+    if (allowShorter) {
+      if (sLength < tLength)
+        return false;
+    } else if (sLength !== tLength)
+      return false;
+    for (i = 0; i < tLength; ++i) {
+      t1 = s[i];
+      t2 = t[i];
+      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+        return false;
+    }
+    return true;
+  },
+  areAssignableMaps: function(s, t) {
+    var t1, names, i, $name, tType, sType;
+    if (t == null)
+      return true;
+    if (s == null)
+      return false;
+    t1 = Object.getOwnPropertyNames(t);
+    t1.fixed$length = init;
+    names = t1;
+    for (t1 = names.length, i = 0; i < t1; ++i) {
+      $name = names[i];
+      if (!Object.hasOwnProperty.call(s, $name))
+        return false;
+      tType = t[$name];
+      sType = s[$name];
+      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
+        return false;
+    }
+    return true;
+  },
+  isFunctionSubtype: function(s, t) {
+    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
+    if (!("func" in s))
+      return false;
+    if ("void" in s) {
+      if (!("void" in t) && "ret" in t)
+        return false;
+    } else if (!("void" in t)) {
+      sReturnType = s.ret;
+      tReturnType = t.ret;
+      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
+        return false;
+    }
+    sParameterTypes = s.args;
+    tParameterTypes = t.args;
+    sOptionalParameterTypes = s.opt;
+    tOptionalParameterTypes = t.opt;
+    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
+    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
+    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
+    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
+    if (sParametersLen > tParametersLen)
+      return false;
+    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
+      return false;
+    if (sParametersLen === tParametersLen) {
+      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
+        return false;
+      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
+        return false;
+    } else {
+      for (pos = 0; pos < sParametersLen; ++pos) {
+        t1 = sParameterTypes[pos];
+        t2 = tParameterTypes[pos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tOptionalParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+    }
+    return H.areAssignableMaps(s.named, t.named);
+  },
+  invokeOn: function($function, receiver, $arguments) {
+    return $function.apply(receiver, $arguments);
+  },
+  toStringForNativeObject: function(obj) {
+    var t1 = $.getTagFunction;
+    return "Instance of " + (t1 == null ? "<Unknown>" : t1.call$1(obj));
+  },
+  hashCodeForNativeObject: function(object) {
+    return H.Primitives_objectHashCode(object);
+  },
+  defineProperty: function(obj, property, value) {
+    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+  },
+  lookupAndCacheInterceptor: function(obj) {
+    var tag, record, interceptor, interceptorClass, mark, t1;
+    tag = $.getTagFunction.call$1(obj);
+    record = $.dispatchRecordsForInstanceTags[tag];
+    if (record != null) {
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    interceptor = $.interceptorsForUncacheableTags[tag];
+    if (interceptor != null)
+      return interceptor;
+    interceptorClass = init.interceptorsByTag[tag];
+    if (interceptorClass == null) {
+      tag = $.alternateTagFunction.call$2(obj, tag);
+      if (tag != null) {
+        record = $.dispatchRecordsForInstanceTags[tag];
+        if (record != null) {
+          Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+          return record.i;
+        }
+        interceptor = $.interceptorsForUncacheableTags[tag];
+        if (interceptor != null)
+          return interceptor;
+        interceptorClass = init.interceptorsByTag[tag];
+      }
+    }
+    if (interceptorClass == null)
+      return;
+    interceptor = interceptorClass.prototype;
+    mark = tag[0];
+    if (mark === "!") {
+      record = H.makeLeafDispatchRecord(interceptor);
+      $.dispatchRecordsForInstanceTags[tag] = record;
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    if (mark === "~") {
+      $.interceptorsForUncacheableTags[tag] = interceptor;
+      return interceptor;
+    }
+    if (mark === "-") {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    }
+    if (mark === "+")
+      return H.patchInteriorProto(obj, interceptor);
+    if (mark === "*")
+      throw H.wrapException(P.UnimplementedError$(tag));
+    if (init.leafTags[tag] === true) {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    } else
+      return H.patchInteriorProto(obj, interceptor);
+  },
+  patchInteriorProto: function(obj, interceptor) {
+    var proto, record;
+    proto = Object.getPrototypeOf(obj);
+    record = J.makeDispatchRecord(interceptor, proto, null, null);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+    return interceptor;
+  },
+  makeLeafDispatchRecord: function(interceptor) {
+    return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+  },
+  makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
+    var interceptor = interceptorClass.prototype;
+    if (init.leafTags[tag] === true)
+      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+    else
+      return J.makeDispatchRecord(interceptor, proto, null, null);
+  },
+  initNativeDispatch: function() {
+    if (true === $.initNativeDispatchFlag)
+      return;
+    $.initNativeDispatchFlag = true;
+    H.initNativeDispatchContinue();
+  },
+  initNativeDispatchContinue: function() {
+    var map, tags, fun, i, tag, proto, record, interceptorClass;
+    $.dispatchRecordsForInstanceTags = Object.create(null);
+    $.interceptorsForUncacheableTags = Object.create(null);
+    H.initHooks();
+    map = init.interceptorsByTag;
+    tags = Object.getOwnPropertyNames(map);
+    if (typeof window != "undefined") {
+      window;
+      fun = function() {
+      };
+      for (i = 0; i < tags.length; ++i) {
+        tag = tags[i];
+        proto = $.prototypeForTagFunction.call$1(tag);
+        if (proto != null) {
+          record = H.makeDefaultDispatchRecord(tag, map[tag], proto);
+          if (record != null) {
+            Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+            fun.prototype = proto;
+          }
+        }
+      }
+    }
+    for (i = 0; i < tags.length; ++i) {
+      tag = tags[i];
+      if (/^[A-Za-z_]/.test(tag)) {
+        interceptorClass = map[tag];
+        map["!" + tag] = interceptorClass;
+        map["~" + tag] = interceptorClass;
+        map["-" + tag] = interceptorClass;
+        map["+" + tag] = interceptorClass;
+        map["*" + tag] = interceptorClass;
+      }
+    }
+  },
+  initHooks: function() {
+    var hooks, transformers, i, transformer, getTag, getUnknownTag, prototypeForTag;
+    hooks = C.JS_CONST_aQP();
+    hooks = H.applyHooksTransformer(C.JS_CONST_0, H.applyHooksTransformer(C.JS_CONST_rr7, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_gkc, H.applyHooksTransformer(C.JS_CONST_4hp, H.applyHooksTransformer(C.JS_CONST_QJm(C.JS_CONST_8ZY), hooks)))))));
+    if (typeof dartNativeDispatchHooksTransformer != "undefined") {
+      transformers = dartNativeDispatchHooksTransformer;
+      if (typeof transformers == "function")
+        transformers = [transformers];
+      if (transformers.constructor == Array)
+        for (i = 0; i < transformers.length; ++i) {
+          transformer = transformers[i];
+          if (typeof transformer == "function")
+            hooks = transformer(hooks) || hooks;
+        }
+    }
+    getTag = hooks.getTag;
+    getUnknownTag = hooks.getUnknownTag;
+    prototypeForTag = hooks.prototypeForTag;
+    $.getTagFunction = new H.initHooks_closure(getTag);
+    $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
+    $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
+  },
+  applyHooksTransformer: function(transformer, hooks) {
+    return transformer(hooks) || hooks;
+  },
+  allMatchesInStringUnchecked: function(needle, haystack) {
+    var result, $length, patternLength, startIndex, position, endIndex;
+    result = H.setRuntimeTypeInfo([], [P.Match]);
+    $length = haystack.length;
+    patternLength = needle.length;
+    for (startIndex = 0; true;) {
+      position = C.JSString_methods.indexOf$2(haystack, needle, startIndex);
+      if (position === -1)
+        break;
+      result.push(new H.StringMatch(position, haystack, needle));
+      endIndex = position + patternLength;
+      if (endIndex === $length)
+        break;
+      else
+        startIndex = position === endIndex ? startIndex + 1 : endIndex;
+    }
+    return result;
+  },
+  stringContainsUnchecked: function(receiver, other, startIndex) {
+    var t1, t2;
+    if (typeof other === "string")
+      return C.JSString_methods.indexOf$2(receiver, other, startIndex) !== -1;
+    else {
+      t1 = J.getInterceptor(other);
+      if (!!t1.$isJSSyntaxRegExp) {
+        t1 = C.JSString_methods.substring$1(receiver, startIndex);
+        t2 = other._nativeRegExp;
+        return t2.test(t1);
+      } else
+        return J.get$isNotEmpty$asx(t1.allMatches$1(other, C.JSString_methods.substring$1(receiver, startIndex)));
+    }
+  },
+  stringReplaceAllUnchecked: function(receiver, from, to) {
+    var result, $length, i, t1;
+    if (from === "")
+      if (receiver === "")
+        return to;
+      else {
+        result = P.StringBuffer$("");
+        $length = receiver.length;
+        result.write$1(to);
+        for (i = 0; i < $length; ++i) {
+          t1 = receiver[i];
+          t1 = result._contents += t1;
+          result._contents = t1 + to;
+        }
+        return result._contents;
+      }
+    else
+      return receiver.replace(new RegExp(from.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), "\\$&"), 'g'), to.replace(/\$/g, "$$$$"));
+  },
+  ConstantMap: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$isNotEmpty: function(_) {
+      return !J.$eq(this.get$length(this), 0);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _throwUnmodifiable$0: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
+    },
+    $indexSet: function(_, key, val) {
+      return this._throwUnmodifiable$0();
+    },
+    clear$0: function(_) {
+      return this._throwUnmodifiable$0();
+    },
+    addAll$1: function(_, other) {
+      return this._throwUnmodifiable$0();
+    },
+    $isMap: true
+  },
+  ConstantStringMap: {
+    "^": "ConstantMap;length>,_jsObject,_keys",
+    containsKey$1: function(key) {
+      if (typeof key !== "string")
+        return false;
+      if ("__proto__" === key)
+        return false;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    $index: function(_, key) {
+      if (!this.containsKey$1(key))
+        return;
+      return this._fetch$1(key);
+    },
+    _fetch$1: function(key) {
+      return this._jsObject[key];
+    },
+    forEach$1: function(_, f) {
+      var keys, i, key;
+      keys = this._keys;
+      for (i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        f.call$2(key, this._fetch$1(key));
+      }
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new H._ConstantMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(this._keys, new H.ConstantStringMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    $isEfficientLength: true
+  },
+  ConstantStringMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(key) {
+      return this.this_0._fetch$1(key);
+    }, "call$1", null, 2, 0, null, 76, "call"],
+    $isFunction: true
+  },
+  _ConstantMapKeyIterable: {
+    "^": "IterableBase;__js_helper$_map",
+    get$iterator: function(_) {
+      return J.get$iterator$ax(this.__js_helper$_map._keys);
+    }
+  },
+  JSInvocationMirror: {
+    "^": "Object;__js_helper$_memberName,_internalName,_kind,_arguments,_namedArgumentNames,_namedIndices",
+    get$memberName: function() {
+      return this.__js_helper$_memberName;
+    },
+    get$isMethod: function() {
+      return this._kind === 0;
+    },
+    get$positionalArguments: function() {
+      var t1, argumentCount, list, index;
+      if (this._kind === 1)
+        return C.List_empty;
+      t1 = this._arguments;
+      argumentCount = t1.length - this._namedArgumentNames.length;
+      if (argumentCount === 0)
+        return C.List_empty;
+      list = [];
+      for (index = 0; index < argumentCount; ++index) {
+        if (index >= t1.length)
+          return H.ioore(t1, index);
+        list.push(t1[index]);
+      }
+      list.immutable$list = true;
+      list.fixed$length = true;
+      return list;
+    },
+    get$namedArguments: function() {
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4;
+      if (this._kind !== 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      t1 = this._namedArgumentNames;
+      namedArgumentCount = t1.length;
+      t2 = this._arguments;
+      namedArgumentsStartIndex = t2.length - namedArgumentCount;
+      if (namedArgumentCount === 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, null);
+      for (i = 0; i < namedArgumentCount; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        t4 = namedArgumentsStartIndex + i;
+        if (t4 < 0 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        map.$indexSet(0, new H.Symbol0(t3), t2[t4]);
+      }
+      return map;
+    },
+    static: {"^": "JSInvocationMirror_METHOD,JSInvocationMirror_GETTER,JSInvocationMirror_SETTER"}
+  },
+  ReflectionInfo: {
+    "^": "Object;jsFunction,data>,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
+    parameterName$1: function(parameter) {
+      var metadataIndex = this.data[parameter + this.optionalParameterCount + 3];
+      return init.metadata[metadataIndex];
+    },
+    defaultValue$1: function(_, parameter) {
+      var t1 = this.requiredParameterCount;
+      if (typeof parameter !== "number")
+        return parameter.$lt();
+      if (parameter < t1)
+        return;
+      return this.data[3 + parameter - t1];
+    },
+    defaultValueInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.defaultValue$1(0, parameter);
+      return this.defaultValue$1(0, this.sortedIndex$1(parameter - t1));
+    },
+    parameterNameInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.parameterName$1(parameter);
+      return this.parameterName$1(this.sortedIndex$1(parameter - t1));
+    },
+    sortedIndex$1: function(unsortedIndex) {
+      var t1, t2, positions, t3, i, index;
+      t1 = {};
+      if (this.cachedSortedIndices == null) {
+        t2 = this.optionalParameterCount;
+        this.cachedSortedIndices = Array(t2);
+        positions = P.LinkedHashMap_LinkedHashMap$_empty(P.String, P.$int);
+        for (t3 = this.requiredParameterCount, i = 0; i < t2; ++i) {
+          index = t3 + i;
+          positions.$indexSet(0, this.parameterName$1(index), index);
+        }
+        t1.index_0 = 0;
+        t2 = positions.get$keys();
+        t2 = P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "IterableBase", 0));
+        H.IterableMixinWorkaround_sortList(t2, null);
+        H.IterableMixinWorkaround_forEach(t2, new H.ReflectionInfo_sortedIndex_closure(t1, this, positions));
+      }
+      t1 = this.cachedSortedIndices;
+      if (unsortedIndex < 0 || unsortedIndex >= t1.length)
+        return H.ioore(t1, unsortedIndex);
+      return t1[unsortedIndex];
+    },
+    static: {"^": "ReflectionInfo_REQUIRED_PARAMETERS_INFO,ReflectionInfo_OPTIONAL_PARAMETERS_INFO,ReflectionInfo_FUNCTION_TYPE_INDEX,ReflectionInfo_FIRST_DEFAULT_ARGUMENT", ReflectionInfo_ReflectionInfo: function(jsFunction) {
+        var data, requiredParametersInfo, optionalParametersInfo;
+        data = jsFunction.$reflectionInfo;
+        if (data == null)
+          return;
+        data.fixed$length = init;
+        data = data;
+        requiredParametersInfo = data[0];
+        optionalParametersInfo = data[1];
+        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
+      }}
+  },
+  ReflectionInfo_sortedIndex_closure: {
+    "^": "Closure:5;box_0,this_1,positions_2",
+    call$1: function($name) {
+      var t1, t2, t3;
+      t1 = this.this_1.cachedSortedIndices;
+      t2 = this.box_0.index_0++;
+      t3 = this.positions_2.$index(0, $name);
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      t1[t2] = t3;
+    },
+    $isFunction: true
+  },
+  Primitives_functionNoSuchMethod_closure: {
+    "^": "Closure:77;box_0,arguments_1,namedArgumentList_2",
+    call$2: function($name, argument) {
+      var t1 = this.box_0;
+      t1.names_1 = t1.names_1 + "$" + H.S($name);
+      this.namedArgumentList_2.push($name);
+      this.arguments_1.push(argument);
+      ++t1.argumentCount_0;
+    },
+    $isFunction: true
+  },
+  Primitives_applyFunction_closure: {
+    "^": "Closure:77;box_0,defaultArguments_1",
+    call$2: function(parameter, value) {
+      var t1 = this.defaultArguments_1;
+      if (t1.containsKey$1(parameter))
+        t1.$indexSet(0, parameter, value);
+      else
+        this.box_0.bad_0 = true;
+    },
+    $isFunction: true
+  },
+  TypeErrorDecoder: {
+    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
+    matchTypeError$1: function(message) {
+      var match, result, t1;
+      match = new RegExp(this._pattern).exec(message);
+      if (match == null)
+        return;
+      result = {};
+      t1 = this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    },
+    static: {"^": "TypeErrorDecoder_noSuchMethodPattern,TypeErrorDecoder_notClosurePattern,TypeErrorDecoder_nullCallPattern,TypeErrorDecoder_nullLiteralCallPattern,TypeErrorDecoder_undefinedCallPattern,TypeErrorDecoder_undefinedLiteralCallPattern,TypeErrorDecoder_nullPropertyPattern,TypeErrorDecoder_nullLiteralPropertyPattern,TypeErrorDecoder_undefinedPropertyPattern,TypeErrorDecoder_undefinedLiteralPropertyPattern", TypeErrorDecoder_extractPattern: function(message) {
+        var match, $arguments, argumentsExpr, expr, method, receiver;
+        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
+        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+        if (match == null)
+          match = [];
+        $arguments = match.indexOf("\\$arguments\\$");
+        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+        expr = match.indexOf("\\$expr\\$");
+        method = match.indexOf("\\$method\\$");
+        receiver = match.indexOf("\\$receiver\\$");
+        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+        return function($expr$) {
+          var $argumentsExpr$ = '$arguments$';
+          try {
+            $expr$.$method$($argumentsExpr$);
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+        return function($expr$) {
+          try {
+            $expr$.$method$;
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }}
+  },
+  NullError: {
+    "^": "Error;_message,_method",
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NullError: " + H.S(this._message);
+      return "NullError: Cannot call \"" + H.S(t1) + "\" on null";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true
+  },
+  JsNoSuchMethodError: {
+    "^": "Error;_message,_method,_receiver",
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this._message);
+      t2 = this._receiver;
+      if (t2 == null)
+        return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" (" + H.S(this._message) + ")";
+      return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" on \"" + H.S(t2) + "\" (" + H.S(this._message) + ")";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true,
+    static: {JsNoSuchMethodError$: function(_message, match) {
+        var t1, t2;
+        t1 = match == null;
+        t2 = t1 ? null : match.method;
+        t1 = t1 ? null : match.receiver;
+        return new H.JsNoSuchMethodError(_message, t2, t1);
+      }}
+  },
+  UnknownJsTypeError: {
+    "^": "Error;_message",
+    toString$0: function(_) {
+      var t1 = this._message;
+      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
+    }
+  },
+  unwrapException_saveStackTrace: {
+    "^": "Closure:13;ex_0",
+    call$1: function(error) {
+      if (!!J.getInterceptor(error).$isError)
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = this.ex_0;
+      return error;
+    },
+    $isFunction: true
+  },
+  _StackTrace: {
+    "^": "Object;_exception,_trace",
+    toString$0: function(_) {
+      var t1, trace;
+      t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = typeof t1 === "object" ? t1.stack : null;
+      t1 = trace == null ? "" : trace;
+      this._trace = t1;
+      return t1;
+    }
+  },
+  invokeClosure_closure: {
+    "^": "Closure:69;closure_0",
+    call$0: function() {
+      return this.closure_0.call$0();
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure0: {
+    "^": "Closure:69;closure_1,arg1_2",
+    call$0: function() {
+      return this.closure_1.call$1(this.arg1_2);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure1: {
+    "^": "Closure:69;closure_3,arg1_4,arg2_5",
+    call$0: function() {
+      return this.closure_3.call$2(this.arg1_4, this.arg2_5);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure2: {
+    "^": "Closure:69;closure_6,arg1_7,arg2_8,arg3_9",
+    call$0: function() {
+      return this.closure_6.call$3(this.arg1_7, this.arg2_8, this.arg3_9);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure3: {
+    "^": "Closure:69;closure_10,arg1_11,arg2_12,arg3_13,arg4_14",
+    call$0: function() {
+      return this.closure_10.call$4(this.arg1_11, this.arg2_12, this.arg3_13, this.arg4_14);
+    },
+    $isFunction: true
+  },
+  Closure: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Closure";
+    },
+    $isFunction: true,
+    get$$call: function() {
+      return this;
+    }
+  },
+  TearOffClosure: {
+    "^": "Closure;"
+  },
+  BoundClosure: {
+    "^": "TearOffClosure;_self,_target,_receiver,__js_helper$_name",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isBoundClosure)
+        return false;
+      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var t1, receiverHashCode;
+      t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return J.$xor$n(receiverHashCode, H.Primitives_objectHashCode(this._target));
+    },
+    $isBoundClosure: true,
+    static: {"^": "BoundClosure_selfFieldNameCache,BoundClosure_receiverFieldNameCache", BoundClosure_selfOf: function(closure) {
+        return closure._self;
+      }, BoundClosure_receiverOf: function(closure) {
+        return closure._receiver;
+      }, BoundClosure_selfFieldName: function() {
+        var t1 = $.BoundClosure_selfFieldNameCache;
+        if (t1 == null) {
+          t1 = H.BoundClosure_computeFieldNamed("self");
+          $.BoundClosure_selfFieldNameCache = t1;
+        }
+        return t1;
+      }, BoundClosure_computeFieldNamed: function(fieldName) {
+        var template, t1, names, i, $name;
+        template = new H.BoundClosure("self", "target", "receiver", "name");
+        t1 = Object.getOwnPropertyNames(template);
+        t1.fixed$length = init;
+        names = t1;
+        for (t1 = names.length, i = 0; i < t1; ++i) {
+          $name = names[i];
+          if (template[$name] === fieldName)
+            return $name;
+        }
+      }}
+  },
+  CastErrorImplementation: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return this.message;
+    },
+    $isError: true,
+    static: {CastErrorImplementation$: function(actualType, expectedType) {
+        return new H.CastErrorImplementation("CastError: Casting value of type " + H.S(actualType) + " to incompatible type " + H.S(expectedType));
+      }}
+  },
+  RuntimeError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "RuntimeError: " + H.S(this.message);
+    },
+    static: {RuntimeError$: function(message) {
+        return new H.RuntimeError(message);
+      }}
+  },
+  RuntimeType: {
+    "^": "Object;"
+  },
+  RuntimeFunctionType: {
+    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
+    _isTest$1: function(expression) {
+      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
+      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
+    },
+    _extractFunctionTypeObjectFrom$1: function(o) {
+      var interceptor = J.getInterceptor(o);
+      return "$signature" in interceptor ? interceptor.$signature() : null;
+    },
+    toRti$0: function() {
+      var result, t1, t2, namedRti, keys, i, $name;
+      result = {func: "dynafunc"};
+      t1 = this.returnType;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isVoidRuntimeType)
+        result.void = true;
+      else if (!t2.$isDynamicRuntimeType)
+        result.ret = t1.toRti$0();
+      t1 = this.parameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.args = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.opt = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.namedParameters;
+      if (t1 != null) {
+        namedRti = {};
+        keys = H.extractKeys(t1);
+        for (t2 = keys.length, i = 0; i < t2; ++i) {
+          $name = keys[i];
+          namedRti[$name] = t1[$name].toRti$0();
+        }
+        result.named = namedRti;
+      }
+      return result;
+    },
+    toString$0: function(_) {
+      var t1, t2, result, needsComma, i, type, keys, $name;
+      t1 = this.parameterTypes;
+      if (t1 != null)
+        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+      else {
+        result = "(";
+        needsComma = false;
+      }
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0) {
+        result = (needsComma ? result + ", " : result) + "[";
+        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+        result += "]";
+      } else {
+        t1 = this.namedParameters;
+        if (t1 != null) {
+          result = (needsComma ? result + ", " : result) + "{";
+          keys = H.extractKeys(t1);
+          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+            $name = keys[i];
+            if (needsComma)
+              result += ", ";
+            result += H.S(t1[$name].toRti$0()) + " " + $name;
+          }
+          result += "}";
+        }
+      }
+      return result + (") -> " + H.S(this.returnType));
+    },
+    static: {"^": "RuntimeFunctionType_inAssert", RuntimeFunctionType_listToRti: function(list) {
+        var result, t1, i;
+        list = list;
+        result = [];
+        for (t1 = list.length, i = 0; i < t1; ++i)
+          result.push(list[i].toRti$0());
+        return result;
+      }}
+  },
+  DynamicRuntimeType: {
+    "^": "RuntimeType;",
+    toString$0: function(_) {
+      return "dynamic";
+    },
+    toRti$0: function() {
+      return;
+    },
+    $isDynamicRuntimeType: true
+  },
+  RuntimeTypePlain: {
+    "^": "RuntimeType;name>",
+    toRti$0: function() {
+      var t1, rti;
+      t1 = this.name;
+      rti = init.allClasses[t1];
+      if (rti == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "'");
+      return rti;
+    },
+    toString$0: function(_) {
+      return this.name;
+    }
+  },
+  RuntimeTypeGeneric: {
+    "^": "RuntimeType;name>,arguments,rti",
+    toRti$0: function() {
+      var t1, result;
+      t1 = this.rti;
+      if (t1 != null)
+        return t1;
+      t1 = this.name;
+      result = [init.allClasses[t1]];
+      if (0 >= result.length)
+        return H.ioore(result, 0);
+      if (result[0] == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "<...>'");
+      for (t1 = this.arguments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        result.push(t1._current.toRti$0());
+      this.rti = result;
+      return result;
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + "<" + J.join$1$ax(this.arguments, ", ") + ">";
+    }
+  },
+  TypeImpl: {
+    "^": "Object;_typeName,_unmangledName",
+    toString$0: function(_) {
+      var t1, unmangledName;
+      t1 = this._unmangledName;
+      if (t1 != null)
+        return t1;
+      unmangledName = this._typeName.replace(/[^<,> ]+/g, function(m) {
+        return init.mangledGlobalNames[m] || m;
+      });
+      this._unmangledName = unmangledName;
+      return unmangledName;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this._typeName);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isTypeImpl && J.$eq(this._typeName, other._typeName);
+    },
+    $isTypeImpl: true,
+    $isType: true
+  },
+  initHooks_closure: {
+    "^": "Closure:13;getTag_0",
+    call$1: function(o) {
+      return this.getTag_0(o);
+    },
+    $isFunction: true
+  },
+  initHooks_closure0: {
+    "^": "Closure:78;getUnknownTag_1",
+    call$2: function(o, tag) {
+      return this.getUnknownTag_1(o, tag);
+    },
+    $isFunction: true
+  },
+  initHooks_closure1: {
+    "^": "Closure:5;prototypeForTag_2",
+    call$1: function(tag) {
+      return this.prototypeForTag_2(tag);
+    },
+    $isFunction: true
+  },
+  JSSyntaxRegExp: {
+    "^": "Object;pattern,_nativeRegExp,_nativeGlobalRegExp,_nativeAnchoredRegExp",
+    get$_nativeGlobalVersion: function() {
+      var t1 = this._nativeGlobalRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern, t1.multiline, !t1.ignoreCase, true);
+      this._nativeGlobalRegExp = t1;
+      return t1;
+    },
+    get$_nativeAnchoredVersion: function() {
+      var t1 = this._nativeAnchoredRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern + "|()", t1.multiline, !t1.ignoreCase, true);
+      this._nativeAnchoredRegExp = t1;
+      return t1;
+    },
+    firstMatch$1: function(str) {
+      var m;
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      m = this._nativeRegExp.exec(str);
+      if (m == null)
+        return;
+      return H._MatchImplementation$(this, m);
+    },
+    hasMatch$1: function(str) {
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      return this._nativeRegExp.test(str);
+    },
+    allMatches$1: function(_, str) {
+      return new H._AllMatchesIterable(this, str);
+    },
+    _execGlobal$2: function(string, start) {
+      var regexp, match;
+      regexp = this.get$_nativeGlobalVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      return H._MatchImplementation$(this, match);
+    },
+    _execAnchored$2: function(string, start) {
+      var regexp, match, t1, t2;
+      regexp = this.get$_nativeAnchoredVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      t1 = match.length;
+      t2 = t1 - 1;
+      if (t2 < 0)
+        return H.ioore(match, t2);
+      if (match[t2] != null)
+        return;
+      C.JSArray_methods.set$length(match, t2);
+      return H._MatchImplementation$(this, match);
+    },
+    matchAsPrefix$2: function(_, string, start) {
+      var t1;
+      if (start >= 0) {
+        t1 = J.get$length$asx(string);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = start > t1;
+      } else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(P.RangeError$range(start, 0, J.get$length$asx(string)));
+      return this._execAnchored$2(string, start);
+    },
+    matchAsPrefix$1: function($receiver, string) {
+      return this.matchAsPrefix$2($receiver, string, 0);
+    },
+    $isJSSyntaxRegExp: true,
+    $isRegExp: true,
+    static: {JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, global) {
+        var m, i, g, regexp, errorMessage;
+        m = multiLine ? "m" : "";
+        i = caseSensitive ? "" : "i";
+        g = global ? "g" : "";
+        regexp = function() {
+          try {
+            return new RegExp(source, m + i + g);
+          } catch (e) {
+            return e;
+          }
+
+        }();
+        if (regexp instanceof RegExp)
+          return regexp;
+        errorMessage = String(regexp);
+        throw H.wrapException(P.FormatException$("Illegal RegExp pattern: " + source + ", " + errorMessage));
+      }}
+  },
+  _MatchImplementation: {
+    "^": "Object;pattern,_match",
+    $index: function(_, index) {
+      var t1 = this._match;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    _MatchImplementation$2: function(pattern, _match) {
+    },
+    $isMatch: true,
+    static: {_MatchImplementation$: function(pattern, _match) {
+        var t1 = new H._MatchImplementation(pattern, _match);
+        t1._MatchImplementation$2(pattern, _match);
+        return t1;
+      }}
+  },
+  _AllMatchesIterable: {
+    "^": "IterableBase;_re,_string",
+    get$iterator: function(_) {
+      return new H._AllMatchesIterator(this._re, this._string, null);
+    },
+    $asIterableBase: function() {
+      return [P.Match];
+    },
+    $asIterable: function() {
+      return [P.Match];
+    }
+  },
+  _AllMatchesIterator: {
+    "^": "Object;_regExp,_string,__js_helper$_current",
+    get$current: function() {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, index;
+      if (this._string == null)
+        return false;
+      t1 = this.__js_helper$_current;
+      if (t1 != null) {
+        t1 = t1._match;
+        t2 = t1.index;
+        if (0 >= t1.length)
+          return H.ioore(t1, 0);
+        t1 = J.get$length$asx(t1[0]);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        index = t2 + t1;
+        if (this.__js_helper$_current._match.index === index)
+          ++index;
+      } else
+        index = 0;
+      t1 = this._regExp._execGlobal$2(this._string, index);
+      this.__js_helper$_current = t1;
+      if (t1 == null) {
+        this._string = null;
+        return false;
+      }
+      return true;
+    }
+  },
+  StringMatch: {
+    "^": "Object;start,input,pattern",
+    $index: function(_, g) {
+      if (!J.$eq(g, 0))
+        H.throwExpression(P.RangeError$value(g));
+      return this.pattern;
+    },
+    $isMatch: true
+  }
+}],
+["action_link_element", "package:observatory/src/elements/action_link.dart", , X, {
+  "^": "",
+  ActionLinkElement: {
+    "^": "PolymerElement_ChangeNotifier;_action_link_element$__$busy,_action_link_element$__$callback,_action_link_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._action_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._action_link_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._action_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._action_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._action_link_element$__$callback, value);
+    },
+    get$label: function(receiver) {
+      return receiver._action_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._action_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._action_link_element$__$label, value);
+    },
+    doAction$3: [function(receiver, a, b, c) {
+      var t1 = receiver._action_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._action_link_element$__$callback != null) {
+        receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$1(receiver, null).whenComplete$1(new X.ActionLinkElement_doAction_closure(receiver));
+      }
+    }, "call$3", "get$doAction", 6, 0, 79, 46, 47, 80],
+    static: {ActionLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._action_link_element$__$busy = false;
+        receiver._action_link_element$__$callback = null;
+        receiver._action_link_element$__$label = "action";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ActionLinkElement_methods.Element$created$0(receiver);
+        C.ActionLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ActionLinkElement_doAction_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      t1._action_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._action_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["app", "package:observatory/app.dart", , G, {
+  "^": "",
+  GoogleChart__initOnceOnComplete: [function(_) {
+    var t1;
+    N.Logger_Logger("").info$1("Google Charts API loaded");
+    t1 = J.$index$asx(J.$index$asx($.get$context(), "google"), "visualization");
+    $.GoogleChart__api = t1;
+    return t1;
+  }, "call$1", "GoogleChart__initOnceOnComplete$closure", 2, 0, 13, 14],
+  Utils_formatPercent: function(a, total) {
+    return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+  },
+  Utils_zeroPad: function(value, pad) {
+    var prefix;
+    for (prefix = ""; pad > 1;) {
+      --pad;
+      if (value < Math.pow(10, pad))
+        prefix += "0";
+    }
+    return prefix + H.S(value);
+  },
+  Utils_formatCommaSeparated: [function(v) {
+    var t1, mod, r;
+    t1 = J.getInterceptor$n(v);
+    if (t1.$lt(v, 1000))
+      return t1.toString$0(v);
+    mod = t1.$mod(v, 1000);
+    v = t1.$tdiv(v, 1000);
+    r = G.Utils_zeroPad(mod, 3);
+    for (; t1 = J.getInterceptor$n(v), t1.$gt(v, 1000);) {
+      r = G.Utils_zeroPad(t1.$mod(v, 1000), 3) + "," + r;
+      v = t1.$tdiv(v, 1000);
+    }
+    return !t1.$eq(v, 0) ? H.S(v) + "," + r : r;
+  }, "call$1", "Utils_formatCommaSeparated$closure", 2, 0, 15],
+  Utils_formatTimePrecise: function(time) {
+    var millis, hours, minutes, seconds;
+    millis = C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(time * 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    millis = C.JSInt_methods.$mod(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(millis, 1000);
+    millis = C.JSInt_methods.$mod(millis, 1000);
+    if (hours > 0)
+      return G.Utils_zeroPad(hours, 2) + ":" + G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+    else
+      return G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+  },
+  Utils_formatSize: [function(bytes) {
+    var t1 = J.getInterceptor$n(bytes);
+    if (t1.$lt(bytes, 1024))
+      return H.S(bytes) + "B";
+    else if (t1.$lt(bytes, 1048576))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1024), 1) + "KB";
+    else if (t1.$lt(bytes, 1073741824))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1048576), 1) + "MB";
+    else if (t1.$lt(bytes, 1099511627776))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1073741824), 1) + "GB";
+    else
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1099511627776), 1) + "TB";
+  }, "call$1", "Utils_formatSize$closure", 2, 0, 15, 16],
+  Utils_formatTime: function(time) {
+    var millis, hours, minutes, seconds;
+    if (time == null)
+      return "-";
+    millis = J.round$0$n(J.$mul$ns(time, 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(C.JSInt_methods.$mod(millis, 60000), 1000);
+    P.StringBuffer$("");
+    if (hours !== 0)
+      return "" + hours + "h " + minutes + "m " + seconds + "s";
+    if (minutes !== 0)
+      return "" + minutes + "m " + seconds + "s";
+    return "" + seconds + "s";
+  },
+  Pane: {
+    "^": "ChangeNotifier;",
+    get$element: function(_) {
+      return this._app$__$element;
+    },
+    $isPane: true
+  },
+  ServiceObjectPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      if (J.$eq(url, ""))
+        return;
+      this.app.vm.get$1(url).then$1(new G.ServiceObjectPane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return true;
+    }
+  },
+  ServiceObjectPane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(obj) {
+      J.set$object$x(this.this_0._app$__$element, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassTreePane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("class-tree", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      this.app.vm.get$1(J.substring$1$s(url, 11)).then$1(new G.ClassTreePane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "class-tree/");
+    },
+    static: {"^": "ClassTreePane__urlPrefix"}
+  },
+  ClassTreePane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(i) {
+      var t1 = this.this_0._app$__$element;
+      if (t1 != null)
+        J.set$isolate$x(t1, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  ErrorViewPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      var t1, t2;
+      t1 = H.interceptedTypeCast(this._app$__$element, "$isServiceObjectViewElement");
+      t2 = this.app.lastErrorOrException;
+      t1._service_object_view_element$__$object = J.notifyPropertyChange$3$x(t1, C.Symbol_object, t1._service_object_view_element$__$object, t2);
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "error/");
+    }
+  },
+  ObservatoryApplication: {
+    "^": "ChangeNotifier;_paneRegistry,_serviceObjectPane,_currentPane,locationManager,vm>,_app$__$isolate,rootElement,lastErrorOrException,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$isolate: function(_) {
+      return this._app$__$isolate;
+    },
+    set$isolate: function(_, value) {
+      this._app$__$isolate = F.notifyPropertyChangeHelper(this, C.Symbol_isolate, this._app$__$isolate, value);
+    },
+    _initOnce$0: function() {
+      var t1, t2;
+      this._registerPanes$0();
+      t1 = this.vm;
+      t2 = t1.errors;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t2), [H.getTypeArgumentByIndex(t2, 0)]).listen$1(this.get$_app$_onError());
+      t1 = t1.exceptions;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$1(this.get$_onException());
+      t1 = this.locationManager;
+      $.location = t1;
+      t1._app = this;
+      t2 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_popstate._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(t1.get$_onLocationChange()), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1._onStartup$0();
+    },
+    _registerPanes$0: function() {
+      var t1, t2;
+      if (this._serviceObjectPane != null)
+        return;
+      t1 = this._paneRegistry;
+      t1.push(new G.ClassTreePane(this, null, null, null));
+      t1.push(new G.ErrorViewPane(this, null, null, null));
+      t2 = new G.ServiceObjectPane(this, null, null, null);
+      this._serviceObjectPane = t2;
+      t1.push(t2);
+    },
+    _app$_onError$1: [function(error) {
+      this.lastErrorOrException = error;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_app$_onError", 2, 0, 83, 24],
+    _onException$1: [function(exception) {
+      this.lastErrorOrException = exception;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_onException", 2, 0, 84, 85],
+    _visit$2: function(url, args) {
+      var t1, i, pane;
+      for (t1 = this._paneRegistry, i = 0; i < t1.length; ++i) {
+        pane = t1[i];
+        if (pane.canVisit$1(url)) {
+          this._installPane$1(pane);
+          pane.visit$1(url);
+          return;
+        }
+      }
+      throw H.wrapException(P.FallThroughError$());
+    },
+    _installPane$1: function(pane) {
+      var line, t1, t2;
+      line = "Installing " + J.toString$0(pane);
+      t1 = $.printToZone;
+      if (t1 == null)
+        H.printString(line);
+      else
+        t1.call$1(line);
+      t1 = this._currentPane;
+      if (t1 == null ? pane == null : t1 === pane)
+        return;
+      if (t1 != null) {
+        t2 = t1._app$__$element;
+        if (t1.get$hasObservers(t1) && t2 != null) {
+          t2 = new T.PropertyChangeRecord(t1, C.Symbol_element, t2, null);
+          t2.$builtinTypeInfo = [null];
+          t1.notifyChange$1(t1, t2);
+        }
+        t1._app$__$element = null;
+      }
+      pane.onInstall$0();
+      t1 = this.rootElement;
+      J._clearChildren$0$x(t1);
+      t1.appendChild(pane._app$__$element);
+      this._currentPane = pane;
+    },
+    ObservatoryApplication$1: function(rootElement) {
+      this._initOnce$0();
+    },
+    ObservatoryApplication$devtools$1: function(rootElement) {
+      this._initOnce$0();
+    }
+  },
+  DataTable: {
+    "^": "Object;_app$_table",
+    get$columns: function() {
+      return this._app$_table.callMethod$1("getNumberOfColumns");
+    },
+    get$rows: function(_) {
+      return this._app$_table.callMethod$1("getNumberOfRows");
+    },
+    clearRows$0: function() {
+      var t1 = this._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+    },
+    addRow$1: function(_, row) {
+      var t1 = [];
+      C.JSArray_methods.addAll$1(t1, J.map$1$ax(row, P._convertToJS$closure()));
+      this._app$_table.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+    }
+  },
+  Chart: {
+    "^": "Object;_app$_chart,options",
+    draw$1: function(table) {
+      var jsOptions = P.JsObject_JsObject$jsify(this.options);
+      this._app$_chart.callMethod$2("draw", [table._app$_table, jsOptions]);
+    }
+  },
+  LocationManager: {
+    "^": "Observable;",
+    _go$1: function(url) {
+      var chunks, t1, args;
+      if (J.getInterceptor$s(url).startsWith$1(url, "#"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.startsWith$1(url, "/"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.contains$1(url, "#")) {
+        chunks = url.split("#");
+        t1 = chunks.length;
+        if (0 >= t1)
+          return H.ioore(chunks, 0);
+        url = chunks[0];
+        if (t1 > 1 && !J.$eq(chunks[1], "")) {
+          if (1 >= chunks.length)
+            return H.ioore(chunks, 1);
+          args = chunks[1];
+        } else
+          args = null;
+      } else
+        args = null;
+      this._app._visit$2(url, args);
+    },
+    onGoto$3: function($event, detail, target) {
+      var href, t1, t2, t3;
+      href = J.get$attributes$x(target)._html$_element.getAttribute("href");
+      t1 = J.getInterceptor$x($event);
+      t2 = t1.get$button($event);
+      if (typeof t2 !== "number")
+        return t2.$gt();
+      if (t2 > 1 || t1.get$metaKey($event) === true || t1.get$ctrlKey($event) === true || t1.get$shiftKey($event) === true || t1.get$altKey($event) === true)
+        return;
+      t2 = $.location;
+      t3 = t2._lastUrl;
+      if (t3 == null ? href != null : t3 !== href) {
+        N.Logger_Logger("").info$1("Navigated to " + H.S(href));
+        window.history.pushState(href, document.title, href);
+        t2._lastUrl = href;
+      }
+      t2._go$1(href);
+      t1.preventDefault$0($event);
+    }
+  },
+  HashLocationManager: {
+    "^": "LocationManager;_initialPath,_app,_lastUrl,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records",
+    _onStartup$0: function() {
+      var initialPath = H.S(window.location.hash);
+      if (window.location.hash === "" || window.location.hash === "#")
+        initialPath = "#" + this._initialPath;
+      window.history.pushState(initialPath, document.title, initialPath);
+      this._go$1(window.location.hash);
+    },
+    _onLocationChange$1: [function(_) {
+      this._go$1(window.location.hash);
+    }, "call$1", "get$_onLocationChange", 2, 0, 86, 14]
+  },
+  TableTreeRow: {
+    "^": "ChangeNotifier;parent>,depth<,children>,columns<",
+    get$expander: function(_) {
+      return this._app$__$expander;
+    },
+    get$expanderStyle: function() {
+      return this._app$__$expanderStyle;
+    },
+    get$expanded: function(_) {
+      return this._expanded;
+    },
+    set$expanded: function(_, expanded) {
+      var t1 = J.$eq(this._expanded, expanded);
+      this._expanded = expanded;
+      if (!t1) {
+        t1 = this._app$__$expander;
+        if (expanded === true) {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u21b3");
+          this.onShow$0(0);
+        } else {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u2192");
+          this.onHide$0();
+        }
+      }
+    },
+    toggle$0: function() {
+      this.set$expanded(0, this._expanded !== true);
+      return this._expanded;
+    },
+    TableTreeRow$1: function($parent) {
+      if (!this.hasChildren$0())
+        this._app$__$expanderStyle = F.notifyPropertyChangeHelper(this, C.Symbol_expanderStyle, this._app$__$expanderStyle, "visibility:hidden;");
+    },
+    $isTableTreeRow: true
+  },
+  TableTree: {
+    "^": "ChangeNotifier;rows>,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    initialize$1: function(root) {
+      var t1, t2;
+      t1 = this.rows;
+      t2 = J.getInterceptor$ax(t1);
+      t2.clear$0(t1);
+      root.onShow$0(0);
+      t2.addAll$1(t1, root.children);
+    },
+    toggle$1: function(rowIndex) {
+      var t1, t2, row;
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      row = t2.$index(t1, rowIndex);
+      if (row.toggle$0() === true)
+        t2.insertAll$2(t1, t2.indexOf$1(t1, row) + 1, J.get$children$x(row));
+      else
+        this._collapse$1(row);
+    },
+    _collapse$1: function(row) {
+      var t1, childCount, i, t2, t3;
+      t1 = J.getInterceptor$x(row);
+      childCount = J.get$length$asx(t1.get$children(row));
+      if (childCount === 0)
+        return;
+      for (i = 0; i < childCount; ++i)
+        if (J.get$expanded$x(J.$index$asx(t1.get$children(row), i)) === true)
+          this._collapse$1(J.$index$asx(t1.get$children(row), i));
+      t1.set$expanded(row, false);
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.indexOf$1(t1, row) + 1;
+      t2.removeRange$2(t1, t3, t3 + childCount);
+    }
+  },
+  SortedTableColumn: {
+    "^": "Object;label>,formatter<",
+    static: {SortedTableColumn_toStringFormatter: [function(v) {
+        return v != null ? J.toString$0(v) : "<null>";
+      }, "call$1", "SortedTableColumn_toStringFormatter$closure", 2, 0, 17]}
+  },
+  SortedTableRow: {
+    "^": "Object;values>",
+    $isSortedTableRow: true
+  },
+  SortedTable: {
+    "^": "ChangeNotifier;columns<,rows>,sortedRows<",
+    set$sortColumnIndex: function(index) {
+      this._sortColumnIndex = index;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    get$sortColumnIndex: function() {
+      return this._sortColumnIndex;
+    },
+    get$sortDescending: function() {
+      return this._sortDescending;
+    },
+    set$sortDescending: function(descending) {
+      this._sortDescending = descending;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    getSortKeyFor$2: function(row, col) {
+      var t1 = this.rows;
+      if (row >>> 0 !== row || row >= t1.length)
+        return H.ioore(t1, row);
+      return J.$index$asx(J.get$values$x(t1[row]), col);
+    },
+    _sortFuncDescending$2: [function(i, j) {
+      var a = this.getSortKeyFor$2(i, this._sortColumnIndex);
+      return J.compareTo$1$ns(this.getSortKeyFor$2(j, this._sortColumnIndex), a);
+    }, "call$2", "get$_sortFuncDescending", 4, 0, 87],
+    _sortFuncAscending$2: [function(i, j) {
+      return J.compareTo$1$ns(this.getSortKeyFor$2(i, this._sortColumnIndex), this.getSortKeyFor$2(j, this._sortColumnIndex));
+    }, "call$2", "get$_sortFuncAscending", 4, 0, 87],
+    sort$0: function(_) {
+      var t1, t2;
+      new P.Stopwatch(1000000, null, null).start$0(0);
+      t1 = this.sortedRows;
+      if (this._sortDescending) {
+        t2 = this.get$_sortFuncDescending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      } else {
+        t2 = this.get$_sortFuncAscending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      }
+    },
+    clearRows$0: function() {
+      C.JSArray_methods.set$length(this.rows, 0);
+      C.JSArray_methods.set$length(this.sortedRows, 0);
+    },
+    addRow$1: function(_, row) {
+      var t1 = this.rows;
+      this.sortedRows.push(t1.length);
+      t1.push(row);
+    },
+    getFormattedValue$2: function(row, column) {
+      var t1, value;
+      t1 = this.rows;
+      if (row >= t1.length)
+        return H.ioore(t1, row);
+      value = J.$index$asx(J.get$values$x(t1[row]), column);
+      t1 = this.columns;
+      if (column >= t1.length)
+        return H.ioore(t1, column);
+      return t1[column].get$formatter().call$1(value);
+    },
+    getColumnLabel$1: [function(column) {
+      var t1;
+      if (!J.$eq(column, this._sortColumnIndex)) {
+        t1 = this.columns;
+        if (column >>> 0 !== column || column >= t1.length)
+          return H.ioore(t1, column);
+        return J.$add$ns(J.get$label$x(t1[column]), "\u2003");
+      }
+      t1 = this.columns;
+      if (column >>> 0 !== column || column >= t1.length)
+        return H.ioore(t1, column);
+      t1 = J.get$label$x(t1[column]);
+      return J.$add$ns(t1, this._sortDescending ? "\u25bc" : "\u25b2");
+    }, "call$1", "get$getColumnLabel", 2, 0, 15, 88]
+  }
+}],
+["app_bootstrap", "index.html_bootstrap.dart", , E, {
+  "^": "",
+  main0: [function() {
+    var t1, t2, t3, t4, t5;
+    t1 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure(), C.Symbol_address, new E.main_closure0(), C.Symbol_anchor, new E.main_closure1(), C.Symbol_assertsEnabled, new E.main_closure2(), C.Symbol_bpt, new E.main_closure3(), C.Symbol_busy, new E.main_closure4(), C.Symbol_buttonClick, new E.main_closure5(), C.Symbol_bytes, new E.main_closure6(), C.Symbol_callback, new E.main_closure7(), C.Symbol_capacity, new E.main_closure8(), C.Symbol_change, new E.main_closure9(), C.Symbol_changeSort, new E.main_closure10(), C.Symbol_checked, new E.main_closure11(), C.Symbol_checkedText, new E.main_closure12(), C.Symbol_classTable, new E.main_closure13(), C.Symbol_classes, new E.main_closure14(), C.Symbol_closing, new E.main_closure15(), C.Symbol_cls, new E.main_closure16(), C.Symbol_code, new E.main_closure17(), C.Symbol_coloring, new E.main_closure18(), C.Symbol_columns, new E.main_closure19(), C.Symbol_connection, new E.main_closure20(), C.Symbol_counters, new E.main_closure21(), C.Symbol_countersChanged, new E.main_closure22(), C.Symbol_current, new E.main_closure23(), C.Symbol_descriptor, new E.main_closure24(), C.Symbol_descriptors, new E.main_closure25(), C.Symbol_devtools, new E.main_closure26(), C.Symbol_displayCutoff, new E.main_closure27(), C.Symbol_doAction, new E.main_closure28(), C.Symbol_element, new E.main_closure29(), C.Symbol_endLine, new E.main_closure30(), C.Symbol_endPos, new E.main_closure31(), C.Symbol_endPosChanged, new E.main_closure32(), C.Symbol_entry, new E.main_closure33(), C.Symbol_error, new E.main_closure34(), C.Symbol_eval, new E.main_closure35(), C.Symbol_evalNow, new E.main_closure36(), C.Symbol_exception, new E.main_closure37(), C.Symbol_expand, new E.main_closure38(), C.Symbol_expandChanged, new E.main_closure39(), C.Symbol_expanded, new E.main_closure40(), C.Symbol_expander, new E.main_closure41(), C.Symbol_expanderStyle, new E.main_closure42(), C.Symbol_expr, new E.main_closure43(), C.Symbol_external, new E.main_closure44(), C.Symbol_fd, new E.main_closure45(), C.Symbol_field, new E.main_closure46(), C.Symbol_fields, new E.main_closure47(), C.Symbol_file, new E.main_closure48(), C.Symbol_firstTokenPos, new E.main_closure49(), C.Symbol_flag, new E.main_closure50(), C.Symbol_flagList, new E.main_closure51(), C.Symbol_formatSize, new E.main_closure52(), C.Symbol_formatTime, new E.main_closure53(), C.Symbol_formattedAddress, new E.main_closure54(), C.Symbol_formattedAverage, new E.main_closure55(), C.Symbol_formattedCollections, new E.main_closure56(), C.Symbol_formattedDeoptId, new E.main_closure57(), C.Symbol_formattedExclusive, new E.main_closure58(), C.Symbol_formattedExclusiveTicks, new E.main_closure59(), C.Symbol_formattedInclusive, new E.main_closure60(), C.Symbol_formattedInclusiveTicks, new E.main_closure61(), C.Symbol_formattedLine, new E.main_closure62(), C.Symbol_formattedTotalCollectionTime, new E.main_closure63(), C.Symbol_fragmentation, new E.main_closure64(), C.Symbol_fragmentationChanged, new E.main_closure65(), C.Symbol_frame, new E.main_closure66(), C.Symbol_function, new E.main_closure67(), C.Symbol_functionChanged, new E.main_closure68(), C.Symbol_functions, new E.main_closure69(), C.Symbol_getColumnLabel, new E.main_closure70(), C.Symbol_goto, new E.main_closure71(), C.Symbol_gotoLink, new E.main_closure72(), C.Symbol_hasClass, new E.main_closure73(), C.Symbol_hasDescriptors, new E.main_closure74(), C.Symbol_hasDisassembly, new E.main_closure75(), C.Symbol_hasNoAllocations, new E.main_closure76(), C.Symbol_hasParent, new E.main_closure77(), C.Symbol_hashLinkWorkaround, new E.main_closure78(), C.Symbol_hideTagsChecked, new E.main_closure79(), C.Symbol_hits, new E.main_closure80(), C.Symbol_hoverText, new E.main_closure81(), C.Symbol_httpServer, new E.main_closure82(), C.Symbol_human, new E.main_closure83(), C.Symbol_idle, new E.main_closure84(), C.Symbol_imp, new E.main_closure85(), C.Symbol_imports, new E.main_closure86(), C.Symbol_instance, new E.main_closure87(), C.Symbol_instances, new E.main_closure88(), C.Symbol_instruction, new E.main_closure89(), C.Symbol_instructions, new E.main_closure90(), C.Symbol_interface, new E.main_closure91(), C.Symbol_interfaces, new E.main_closure92(), C.Symbol_internal, new E.main_closure93(), C.Symbol_io, new E.main_closure94(), C.Symbol_isAbstract, new E.main_closure95(), C.Symbol_isBool, new E.main_closure96(), C.Symbol_isComment, new E.main_closure97(), C.Symbol_isDart, new E.main_closure98(), C.Symbol_isDartCode, new E.main_closure99(), C.Symbol_isDouble, new E.main_closure100(), C.Symbol_isEmpty, new E.main_closure101(), C.Symbol_isError, new E.main_closure102(), C.Symbol_isInstance, new E.main_closure103(), C.Symbol_isInt, new E.main_closure104(), C.Symbol_isList, new E.main_closure105(), C.Symbol_isNotEmpty, new E.main_closure106(), C.Symbol_isNull, new E.main_closure107(), C.Symbol_isOptimized, new E.main_closure108(), C.Symbol_isPatch, new E.main_closure109(), C.Symbol_isPipe, new E.main_closure110(), C.Symbol_isString, new E.main_closure111(), C.Symbol_isType, new E.main_closure112(), C.Symbol_isUnexpected, new E.main_closure113(), C.Symbol_isolate, new E.main_closure114(), C.Symbol_isolateChanged, new E.main_closure115(), C.Symbol_isolates, new E.main_closure116(), C.Symbol_jumpTarget, new E.main_closure117(), C.Symbol_kind, new E.main_closure118(), C.Symbol_label, new E.main_closure119(), C.Symbol_last, new E.main_closure120(), C.Symbol_lastAccumulatorReset, new E.main_closure121(), C.Symbol_lastServiceGC, new E.main_closure122(), C.Symbol_lastTokenPos, new E.main_closure123(), C.Symbol_lastUpdate, new E.main_closure124(), C.Symbol_length, new E.main_closure125(), C.Symbol_lib, new E.main_closure126(), C.Symbol_libraries, new E.main_closure127(), C.Symbol_library, new E.main_closure128(), C.Symbol_line, new E.main_closure129(), C.Symbol_lineMode, new E.main_closure130(), C.Symbol_lineNumber, new E.main_closure131(), C.Symbol_lineNumbers, new E.main_closure132(), C.Symbol_lines, new E.main_closure133(), C.Symbol_link, new E.main_closure134(), C.Symbol_list, new E.main_closure135(), C.Symbol_listening, new E.main_closure136(), C.Symbol_loading, new E.main_closure137(), C.Symbol_localAddress, new E.main_closure138(), C.Symbol_localPort, new E.main_closure139(), C.Symbol_mainPort, new E.main_closure140(), C.Symbol_map, new E.main_closure141(), C.Symbol_mapAsString, new E.main_closure142(), C.Symbol_mapChanged, new E.main_closure143(), C.Symbol_message, new E.main_closure144(), C.Symbol_mouseOut, new E.main_closure145(), C.Symbol_mouseOver, new E.main_closure146(), C.Symbol_msg, new E.main_closure147(), C.Symbol_name, new E.main_closure148(), C.Symbol_nameIsEmpty, new E.main_closure149(), C.Symbol_newSpace, new E.main_closure150(), C.Symbol_object, new E.main_closure151(), C.Symbol_objectChanged, new E.main_closure152(), C.Symbol_objectPool, new E.main_closure153(), C.Symbol_oldSpace, new E.main_closure154(), C.Symbol_pad, new E.main_closure155(), C.Symbol_padding, new E.main_closure156(), C.Symbol_path, new E.main_closure157(), C.Symbol_pause, new E.main_closure158(), C.Symbol_pauseEvent, new E.main_closure159(), C.Symbol_pid, new E.main_closure160(), C.Symbol_pos, new E.main_closure161(), C.Symbol_posChanged, new E.main_closure162(), C.Symbol_process, new E.main_closure163(), C.Symbol_profile, new E.main_closure164(), C.Symbol_profileChanged, new E.main_closure165(), C.Symbol_protocol, new E.main_closure166(), C.Symbol_qualified, new E.main_closure167(), C.Symbol_qualifiedName, new E.main_closure168(), C.Symbol_reachable, new E.main_closure169(), C.Symbol_readClosed, new E.main_closure170(), C.Symbol_ref, new E.main_closure171(), C.Symbol_refChanged, new E.main_closure172(), C.Symbol_refresh, new E.main_closure173(), C.Symbol_refreshCoverage, new E.main_closure174(), C.Symbol_refreshGC, new E.main_closure175(), C.Symbol_refreshTime, new E.main_closure176(), C.Symbol_relativeLink, new E.main_closure177(), C.Symbol_remoteAddress, new E.main_closure178(), C.Symbol_remotePort, new E.main_closure179(), C.Symbol_resetAccumulator, new E.main_closure180(), C.Symbol_response, new E.main_closure181(), C.Symbol_result, new E.main_closure182(), C.Symbol_results, new E.main_closure183(), C.Symbol_resume, new E.main_closure184(), C.Symbol_retainedBytes, new E.main_closure185(), C.Symbol_retainedSize, new E.main_closure186(), C.Symbol_retainingPath, new E.main_closure187(), C.Symbol_rootLib, new E.main_closure188(), C.Symbol_row, new E.main_closure189(), C.Symbol_rows, new E.main_closure190(), C.Symbol_running, new E.main_closure191(), C.Symbol_sampleCount, new E.main_closure192(), C.Symbol_sampleDepth, new E.main_closure193(), C.Symbol_sampleRate, new E.main_closure194(), C.Symbol_script, new E.main_closure195(), C.Symbol_scriptChanged, new E.main_closure196(), C.Symbol_scripts, new E.main_closure197(), C.Symbol_selectExpr, new E.main_closure198(), C.Symbol_serviceType, new E.main_closure199(), C.Symbol_small, new E.main_closure200(), C.Symbol_socket, new E.main_closure201(), C.Symbol_socketOwner, new E.main_closure202(), C.Symbol_startLine, new E.main_closure203(), C.Symbol_status, new E.main_closure204(), C.Symbol_styleForHits, new E.main_closure205(), C.Symbol_subClasses, new E.main_closure206(), C.Symbol_subclass, new E.main_closure207(), C.Symbol_superClass, new E.main_closure208(), C.Symbol_tagSelector, new E.main_closure209(), C.Symbol_tagSelectorChanged, new E.main_closure210(), C.Symbol_text, new E.main_closure211(), C.Symbol_timeSpan, new E.main_closure212(), C.Symbol_tipExclusive, new E.main_closure213(), C.Symbol_tipKind, new E.main_closure214(), C.Symbol_tipParent, new E.main_closure215(), C.Symbol_tipTicks, new E.main_closure216(), C.Symbol_tipTime, new E.main_closure217(), C.Symbol_toggleExpand, new E.main_closure218(), C.Symbol_toggleExpanded, new E.main_closure219(), C.Symbol_tokenPos, new E.main_closure220(), C.Symbol_topFrame, new E.main_closure221(), C.Symbol_trace, new E.main_closure222(), C.Symbol_tree, new E.main_closure223(), C.Symbol_typeChecksEnabled, new E.main_closure224(), C.Symbol_uncheckedText, new E.main_closure225(), C.Symbol_updateLineMode, new E.main_closure226(), C.Symbol_uptime, new E.main_closure227(), C.Symbol_url, new E.main_closure228(), C.Symbol_used, new E.main_closure229(), C.Symbol_v, new E.main_closure230(), C.Symbol_variable, new E.main_closure231(), C.Symbol_variables, new E.main_closure232(), C.Symbol_version, new E.main_closure233(), C.Symbol_vm, new E.main_closure234(), C.Symbol_vmName, new E.main_closure235(), C.Symbol_webSocket, new E.main_closure236(), C.Symbol_writeClosed, new E.main_closure237()], null, null);
+    t2 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure238(), C.Symbol_anchor, new E.main_closure239(), C.Symbol_busy, new E.main_closure240(), C.Symbol_callback, new E.main_closure241(), C.Symbol_checked, new E.main_closure242(), C.Symbol_checkedText, new E.main_closure243(), C.Symbol_classTable, new E.main_closure244(), C.Symbol_cls, new E.main_closure245(), C.Symbol_code, new E.main_closure246(), C.Symbol_connection, new E.main_closure247(), C.Symbol_counters, new E.main_closure248(), C.Symbol_devtools, new E.main_closure249(), C.Symbol_displayCutoff, new E.main_closure250(), C.Symbol_endLine, new E.main_closure251(), C.Symbol_endPos, new E.main_closure252(), C.Symbol_entry, new E.main_closure253(), C.Symbol_error, new E.main_closure254(), C.Symbol_eval, new E.main_closure255(), C.Symbol_exception, new E.main_closure256(), C.Symbol_expand, new E.main_closure257(), C.Symbol_expanded, new E.main_closure258(), C.Symbol_expr, new E.main_closure259(), C.Symbol_field, new E.main_closure260(), C.Symbol_file, new E.main_closure261(), C.Symbol_firstTokenPos, new E.main_closure262(), C.Symbol_flag, new E.main_closure263(), C.Symbol_flagList, new E.main_closure264(), C.Symbol_fragmentation, new E.main_closure265(), C.Symbol_frame, new E.main_closure266(), C.Symbol_function, new E.main_closure267(), C.Symbol_hasClass, new E.main_closure268(), C.Symbol_hasParent, new E.main_closure269(), C.Symbol_hashLinkWorkaround, new E.main_closure270(), C.Symbol_hideTagsChecked, new E.main_closure271(), C.Symbol_httpServer, new E.main_closure272(), C.Symbol_imp, new E.main_closure273(), C.Symbol_instance, new E.main_closure274(), C.Symbol_instances, new E.main_closure275(), C.Symbol_interface, new E.main_closure276(), C.Symbol_internal, new E.main_closure277(), C.Symbol_io, new E.main_closure278(), C.Symbol_isDart, new E.main_closure279(), C.Symbol_isolate, new E.main_closure280(), C.Symbol_kind, new E.main_closure281(), C.Symbol_label, new E.main_closure282(), C.Symbol_last, new E.main_closure283(), C.Symbol_lastAccumulatorReset, new E.main_closure284(), C.Symbol_lastServiceGC, new E.main_closure285(), C.Symbol_lastTokenPos, new E.main_closure286(), C.Symbol_lib, new E.main_closure287(), C.Symbol_library, new E.main_closure288(), C.Symbol_lineMode, new E.main_closure289(), C.Symbol_lines, new E.main_closure290(), C.Symbol_link, new E.main_closure291(), C.Symbol_list, new E.main_closure292(), C.Symbol_map, new E.main_closure293(), C.Symbol_mapAsString, new E.main_closure294(), C.Symbol_msg, new E.main_closure295(), C.Symbol_name, new E.main_closure296(), C.Symbol_object, new E.main_closure297(), C.Symbol_objectPool, new E.main_closure298(), C.Symbol_pad, new E.main_closure299(), C.Symbol_path, new E.main_closure300(), C.Symbol_pause, new E.main_closure301(), C.Symbol_pos, new E.main_closure302(), C.Symbol_process, new E.main_closure303(), C.Symbol_profile, new E.main_closure304(), C.Symbol_qualified, new E.main_closure305(), C.Symbol_qualifiedName, new E.main_closure306(), C.Symbol_reachable, new E.main_closure307(), C.Symbol_ref, new E.main_closure308(), C.Symbol_refresh, new E.main_closure309(), C.Symbol_refreshCoverage, new E.main_closure310(), C.Symbol_refreshGC, new E.main_closure311(), C.Symbol_refreshTime, new E.main_closure312(), C.Symbol_resetAccumulator, new E.main_closure313(), C.Symbol_result, new E.main_closure314(), C.Symbol_results, new E.main_closure315(), C.Symbol_resume, new E.main_closure316(), C.Symbol_retainedBytes, new E.main_closure317(), C.Symbol_retainedSize, new E.main_closure318(), C.Symbol_retainingPath, new E.main_closure319(), C.Symbol_rootLib, new E.main_closure320(), C.Symbol_sampleCount, new E.main_closure321(), C.Symbol_sampleDepth, new E.main_closure322(), C.Symbol_sampleRate, new E.main_closure323(), C.Symbol_script, new E.main_closure324(), C.Symbol_small, new E.main_closure325(), C.Symbol_socket, new E.main_closure326(), C.Symbol_socketOwner, new E.main_closure327(), C.Symbol_startLine, new E.main_closure328(), C.Symbol_status, new E.main_closure329(), C.Symbol_subclass, new E.main_closure330(), C.Symbol_superClass, new E.main_closure331(), C.Symbol_tagSelector, new E.main_closure332(), C.Symbol_text, new E.main_closure333(), C.Symbol_timeSpan, new E.main_closure334(), C.Symbol_tokenPos, new E.main_closure335(), C.Symbol_trace, new E.main_closure336(), C.Symbol_uncheckedText, new E.main_closure337(), C.Symbol_vm, new E.main_closure338(), C.Symbol_webSocket, new E.main_closure339()], null, null);
+    t3 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, C.Type_GNh, C.Type_ON8, C.Type_EOZ, C.Type_ql8, C.Type_UJT, C.Type_dRp, C.Type_EOZ, C.Type_O5a, C.Type_EOZ, C.Type_2jN, C.Type_UJT, C.Type_Aym, C.Type_EOZ, C.Type_cop, C.Type_GNh, C.Type_Npb, C.Type_EOZ, C.Type_8eb, C.Type_EOZ, C.Type_p2P, C.Type_GNh, C.Type_ohY, C.Type_UJT, C.Type_4IJ, C.Type_EOZ, C.Type_7g3, C.Type_EOZ, C.Type_f1j, C.Type_EOZ, C.Type_wgH, C.Type_oyU, C.Type_bDN, C.Type_EOZ, C.Type_SoB, C.Type_EOZ, C.Type_LV6, C.Type_EOZ, C.Type_EVD, C.Type_UJT, C.Type_gqS, C.Type_EOZ, C.Type_uIL, C.Type_UJT, C.Type_L9j, C.Type_EOZ, C.Type_yvP, C.Type_EOZ, C.Type_i7j, C.Type_UJT, C.Type_M6L, C.Type_EOZ, C.Type_8KD, C.Type_EOZ, C.Type_qMZ, C.Type_oyU, C.Type_AHF, C.Type_EOZ, C.Type_IuH, C.Type_EOZ, C.Type_mWg, C.Type_UJT, C.Type_8cK, C.Type_EOZ, C.Type_JmU, C.Type_UJT, C.Type_4m4, C.Type_EOZ, C.Type_B8J, C.Type_UJT, C.Type_61d, C.Type_EOZ, C.Type_TEn, C.Type_EOZ, C.Type_gg4, C.Type_EOZ, C.Type_MUU, C.Type_UJT, C.Type_AyI, C.Type_EOZ, C.Type_cOY, C.Type_EOZ, C.Type_ES1, C.Type_UJT, C.Type_wT1, C.Type_EOZ, C.Type_ECh, C.Type_EOZ, C.Type_aAD, C.Type_EOZ, C.Type_8Gl, C.Type_EOZ, C.Type_iL9, C.Type_EOZ, C.Type_ZKG, C.Type_EOZ, C.Type_Kyy, C.Type_EOZ, C.Type_mpV, C.Type_UJT, C.Type_qph, C.Type_EOZ, C.Type_JFX, C.Type_EOZ, C.Type_wsa, C.Type_EOZ, C.Type_s2l, C.Type_EOZ, C.Type_nV5, C.Type_EOZ, C.Type_9ur, C.Type_sRP, C.Type_KMd, C.Type_EOZ, C.Type_AD4, C.Type_EOZ, C.Type_Sxn, C.Type_EOZ, C.Type_C7R, C.Type_EOZ, C.Type_YgH, C.Type_EOZ, C.Type_sRP, C.Type_I2I, C.Type_a1Y, C.Type_EOZ, C.Type_wBh, C.Type_oyU, C.Type_0e9, C.Type_EOZ, C.Type_FKd, C.Type_EOZ, C.Type_y1j, C.Type_EOZ, C.Type_UJT, C.Type_EOZ, C.Type_Mu6, C.Type_EOZ, C.Type_kuc, C.Type_GNh, C.Type_Jcu, C.Type_EOZ, C.Type_nVV, C.Type_EOZ, C.Type_Eue, C.Type_UJT, C.Type_E0k, C.Type_EOZ, C.Type_GNh, C.Type_I2I, C.Type_EOZ, C.Type_sRP, C.Type_oyU, C.Type_UJT], null, null);
+    t4 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_ON8, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_msg, C.Declaration_gc6], null, null), C.Type_ql8, C.Map_empty, C.Type_dRp, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_agR, C.Symbol_isolateChanged, C.Declaration_e3c], null, null), C.Type_O5a, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_okX, C.Symbol_instances, C.Declaration_qr9, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_2jN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_AgZ, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Aym, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_woc], null, null), C.Type_cop, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expand, C.Declaration_yXb0, C.Symbol_expandChanged, C.Declaration_Dbk, C.Symbol_expanded, C.Declaration_RQo], null, null), C.Type_Npb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_eea], null, null), C.Type_8eb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_callback, C.Declaration_IF7, C.Symbol_lineMode, C.Declaration_ww8, C.Symbol_results, C.Declaration_ggw, C.Symbol_text, C.Declaration_ZfX], null, null), C.Type_p2P, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expr, C.Declaration_gLQ, C.Symbol_label, C.Declaration_0g2, C.Symbol_result, C.Declaration_2No], null, null), C.Type_ohY, C.Map_empty, C.Type_4IJ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_field, C.Declaration_iyl], null, null), C.Type_7g3, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flag, C.Declaration_6YB], null, null), C.Type_f1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flagList, C.Declaration_wE9], null, null), C.Type_wgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_hasClass, C.Declaration_X8B, C.Symbol_hasParent, C.Declaration_0qV, C.Symbol_isDart, C.Declaration_o7e, C.Symbol_qualified, C.Declaration_e24, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_bDN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_function, C.Declaration_y9n, C.Symbol_functionChanged, C.Declaration_Chj, C.Symbol_kind, C.Declaration_Xdi, C.Symbol_qualifiedName, C.Declaration_i3y], null, null), C.Type_SoB, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_fragmentation, C.Declaration_0Y4, C.Symbol_fragmentationChanged, C.Declaration_ivD, C.Symbol_status, C.Declaration_8sn], null, null), C.Type_LV6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_classTable, C.Declaration_gsm, C.Symbol_isolate, C.Declaration_agR, C.Symbol_lastAccumulatorReset, C.Declaration_vA1, C.Symbol_lastServiceGC, C.Declaration_mPk, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g], null, null), C.Type_EVD, C.Map_empty, C.Type_gqS, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_instance, C.Declaration_o7L, C.Symbol_path, C.Declaration_cMb, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_uIL, C.Map_empty, C.Type_L9j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_connection, C.Declaration_yDj], null, null), C.Type_yvP, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_i7j, C.Map_empty, C.Type_M6L, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_httpServer, C.Declaration_BSX], null, null), C.Type_8KD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_qMZ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_small, C.Declaration_pPA], null, null), C.Type_AHF, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_process, C.Declaration_a13], null, null), C.Type_IuH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_mWg, C.Map_empty, C.Type_8cK, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_file, C.Declaration_Ix1], null, null), C.Type_JmU, C.Map_empty, C.Type_4m4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_B8J, C.Map_empty, C.Type_61d, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_socket, C.Declaration_Iiu], null, null), C.Type_TEn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_io, C.Declaration_bh9], null, null), C.Type_gg4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_MUU, C.Map_empty, C.Type_AyI, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_webSocket, C.Declaration_mT8], null, null), C.Type_cOY, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_displayCutoff, C.Declaration_CR6, C.Symbol_hideTagsChecked, C.Declaration_a1A, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g, C.Symbol_refreshTime, C.Declaration_ijl, C.Symbol_sampleCount, C.Declaration_ac8, C.Symbol_sampleDepth, C.Declaration_2AE, C.Symbol_sampleRate, C.Declaration_3VL, C.Symbol_tagSelector, C.Declaration_Q0F, C.Symbol_tagSelectorChanged, C.Declaration_ECn, C.Symbol_timeSpan, C.Declaration_dIf], null, null), C.Type_ES1, C.Map_empty, C.Type_wT1, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_counters, C.Declaration_2Qn, C.Symbol_countersChanged, C.Declaration_cJC], null, null), C.Type_ECh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_aAD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_8Gl, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_iL9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_ZKG, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_Kyy, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_map, C.Declaration_wzu, C.Symbol_mapAsString, C.Declaration_Qx4, C.Symbol_mapChanged, C.Declaration_iLh], null, null), C.Type_mpV, C.Map_empty, C.Type_qph, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_library, C.Declaration_6ts], null, null), C.Type_JFX, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_qrv, C.Symbol_last, C.Declaration_06U], null, null), C.Type_wsa, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj, C.Symbol_isolateChanged, C.Declaration_e3c, C.Symbol_last, C.Declaration_06U], null, null), C.Type_s2l, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U, C.Symbol_library, C.Declaration_6ts], null, null), C.Type_nV5, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pad, C.Declaration_EsU], null, null), C.Type_9ur, C.Map_empty, C.Type_KMd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_last, C.Declaration_06U, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_AD4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_Sxn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, C.Declaration_dw1, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_C7R, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U], null, null), C.Type_YgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_devtools, C.Declaration_c4R], null, null), C.Type_sRP, C.Map_empty, C.Type_a1Y, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_endLine, C.Declaration_ZcJ, C.Symbol_endPos, C.Declaration_ACG, C.Symbol_endPosChanged, C.Declaration_QAa, C.Symbol_lines, C.Declaration_WfA, C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq, C.Symbol_script, C.Declaration_yx3, C.Symbol_scriptChanged, C.Declaration_ixB, C.Symbol_startLine, C.Declaration_k6K], null, null), C.Type_wBh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq], null, null), C.Type_0e9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_script, C.Declaration_yx3], null, null), C.Type_FKd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_4eA], null, null), C.Type_y1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_exception, C.Declaration_v0l], null, null), C.Type_UJT, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_internal, C.Declaration_XBb, C.Symbol_ref, C.Declaration_e3c0, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Mu6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_object, C.Declaration_HtW, C.Symbol_objectChanged, C.Declaration_4up], null, null), C.Type_kuc, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_checked, C.Declaration_siO, C.Symbol_checkedText, C.Declaration_cdS, C.Symbol_uncheckedText, C.Declaration_IRg], null, null), C.Type_Jcu, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_frame, C.Declaration_65l], null, null), C.Type_nVV, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_trace, C.Declaration_ssf], null, null), C.Type_Eue, C.Map_empty, C.Type_E0k, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_0, C.Symbol_vm, C.Declaration_Qi2], null, null)], null, null);
+    t5 = O.GeneratedSymbolConverterService$(new O.StaticConfiguration(t1, t2, t3, t4, C.Map_empty, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, "active", C.Symbol_address, "address", C.Symbol_anchor, "anchor", C.Symbol_assertsEnabled, "assertsEnabled", C.Symbol_bpt, "bpt", C.Symbol_busy, "busy", C.Symbol_buttonClick, "buttonClick", C.Symbol_bytes, "bytes", C.Symbol_callback, "callback", C.Symbol_capacity, "capacity", C.Symbol_change, "change", C.Symbol_changeSort, "changeSort", C.Symbol_checked, "checked", C.Symbol_checkedText, "checkedText", C.Symbol_classTable, "classTable", C.Symbol_classes, "classes", C.Symbol_closing, "closing", C.Symbol_cls, "cls", C.Symbol_code, "code", C.Symbol_coloring, "coloring", C.Symbol_columns, "columns", C.Symbol_connection, "connection", C.Symbol_counters, "counters", C.Symbol_countersChanged, "countersChanged", C.Symbol_current, "current", C.Symbol_descriptor, "descriptor", C.Symbol_descriptors, "descriptors", C.Symbol_devtools, "devtools", C.Symbol_displayCutoff, "displayCutoff", C.Symbol_doAction, "doAction", C.Symbol_element, "element", C.Symbol_endLine, "endLine", C.Symbol_endPos, "endPos", C.Symbol_endPosChanged, "endPosChanged", C.Symbol_entry, "entry", C.Symbol_error, "error", C.Symbol_eval, "eval", C.Symbol_evalNow, "evalNow", C.Symbol_exception, "exception", C.Symbol_expand, "expand", C.Symbol_expandChanged, "expandChanged", C.Symbol_expanded, "expanded", C.Symbol_expander, "expander", C.Symbol_expanderStyle, "expanderStyle", C.Symbol_expr, "expr", C.Symbol_external, "external", C.Symbol_fd, "fd", C.Symbol_field, "field", C.Symbol_fields, "fields", C.Symbol_file, "file", C.Symbol_firstTokenPos, "firstTokenPos", C.Symbol_flag, "flag", C.Symbol_flagList, "flagList", C.Symbol_formatSize, "formatSize", C.Symbol_formatTime, "formatTime", C.Symbol_formattedAddress, "formattedAddress", C.Symbol_formattedAverage, "formattedAverage", C.Symbol_formattedCollections, "formattedCollections", C.Symbol_formattedDeoptId, "formattedDeoptId", C.Symbol_formattedExclusive, "formattedExclusive", C.Symbol_formattedExclusiveTicks, "formattedExclusiveTicks", C.Symbol_formattedInclusive, "formattedInclusive", C.Symbol_formattedInclusiveTicks, "formattedInclusiveTicks", C.Symbol_formattedLine, "formattedLine", C.Symbol_formattedTotalCollectionTime, "formattedTotalCollectionTime", C.Symbol_fragmentation, "fragmentation", C.Symbol_fragmentationChanged, "fragmentationChanged", C.Symbol_frame, "frame", C.Symbol_function, "function", C.Symbol_functionChanged, "functionChanged", C.Symbol_functions, "functions", C.Symbol_getColumnLabel, "getColumnLabel", C.Symbol_goto, "goto", C.Symbol_gotoLink, "gotoLink", C.Symbol_hasClass, "hasClass", C.Symbol_hasDescriptors, "hasDescriptors", C.Symbol_hasDisassembly, "hasDisassembly", C.Symbol_hasNoAllocations, "hasNoAllocations", C.Symbol_hasParent, "hasParent", C.Symbol_hashLinkWorkaround, "hashLinkWorkaround", C.Symbol_hideTagsChecked, "hideTagsChecked", C.Symbol_hits, "hits", C.Symbol_hoverText, "hoverText", C.Symbol_httpServer, "httpServer", C.Symbol_human, "human", C.Symbol_idle, "idle", C.Symbol_imp, "imp", C.Symbol_imports, "imports", C.Symbol_instance, "instance", C.Symbol_instances, "instances", C.Symbol_instruction, "instruction", C.Symbol_instructions, "instructions", C.Symbol_interface, "interface", C.Symbol_interfaces, "interfaces", C.Symbol_internal, "internal", C.Symbol_io, "io", C.Symbol_isAbstract, "isAbstract", C.Symbol_isBool, "isBool", C.Symbol_isComment, "isComment", C.Symbol_isDart, "isDart", C.Symbol_isDartCode, "isDartCode", C.Symbol_isDouble, "isDouble", C.Symbol_isEmpty, "isEmpty", C.Symbol_isError, "isError", C.Symbol_isInstance, "isInstance", C.Symbol_isInt, "isInt", C.Symbol_isList, "isList", C.Symbol_isNotEmpty, "isNotEmpty", C.Symbol_isNull, "isNull", C.Symbol_isOptimized, "isOptimized", C.Symbol_isPatch, "isPatch", C.Symbol_isPipe, "isPipe", C.Symbol_isString, "isString", C.Symbol_isType, "isType", C.Symbol_isUnexpected, "isUnexpected", C.Symbol_isolate, "isolate", C.Symbol_isolateChanged, "isolateChanged", C.Symbol_isolates, "isolates", C.Symbol_jumpTarget, "jumpTarget", C.Symbol_kind, "kind", C.Symbol_label, "label", C.Symbol_last, "last", C.Symbol_lastAccumulatorReset, "lastAccumulatorReset", C.Symbol_lastServiceGC, "lastServiceGC", C.Symbol_lastTokenPos, "lastTokenPos", C.Symbol_lastUpdate, "lastUpdate", C.Symbol_length, "length", C.Symbol_lib, "lib", C.Symbol_libraries, "libraries", C.Symbol_library, "library", C.Symbol_line, "line", C.Symbol_lineMode, "lineMode", C.Symbol_lineNumber, "lineNumber", C.Symbol_lineNumbers, "lineNumbers", C.Symbol_lines, "lines", C.Symbol_link, "link", C.Symbol_list, "list", C.Symbol_listening, "listening", C.Symbol_loading, "loading", C.Symbol_localAddress, "localAddress", C.Symbol_localPort, "localPort", C.Symbol_mainPort, "mainPort", C.Symbol_map, "map", C.Symbol_mapAsString, "mapAsString", C.Symbol_mapChanged, "mapChanged", C.Symbol_message, "message", C.Symbol_mouseOut, "mouseOut", C.Symbol_mouseOver, "mouseOver", C.Symbol_msg, "msg", C.Symbol_name, "name", C.Symbol_nameIsEmpty, "nameIsEmpty", C.Symbol_newSpace, "newSpace", C.Symbol_object, "object", C.Symbol_objectChanged, "objectChanged", C.Symbol_objectPool, "objectPool", C.Symbol_oldSpace, "oldSpace", C.Symbol_pad, "pad", C.Symbol_padding, "padding", C.Symbol_path, "path", C.Symbol_pause, "pause", C.Symbol_pauseEvent, "pauseEvent", C.Symbol_pid, "pid", C.Symbol_pos, "pos", C.Symbol_posChanged, "posChanged", C.Symbol_process, "process", C.Symbol_profile, "profile", C.Symbol_profileChanged, "profileChanged", C.Symbol_protocol, "protocol", C.Symbol_qualified, "qualified", C.Symbol_qualifiedName, "qualifiedName", C.Symbol_reachable, "reachable", C.Symbol_readClosed, "readClosed", C.Symbol_ref, "ref", C.Symbol_refChanged, "refChanged", C.Symbol_refresh, "refresh", C.Symbol_refreshCoverage, "refreshCoverage", C.Symbol_refreshGC, "refreshGC", C.Symbol_refreshTime, "refreshTime", C.Symbol_relativeLink, "relativeLink", C.Symbol_remoteAddress, "remoteAddress", C.Symbol_remotePort, "remotePort", C.Symbol_resetAccumulator, "resetAccumulator", C.Symbol_response, "response", C.Symbol_result, "result", C.Symbol_results, "results", C.Symbol_resume, "resume", C.Symbol_retainedBytes, "retainedBytes", C.Symbol_retainedSize, "retainedSize", C.Symbol_retainingPath, "retainingPath", C.Symbol_rootLib, "rootLib", C.Symbol_row, "row", C.Symbol_rows, "rows", C.Symbol_running, "running", C.Symbol_sampleCount, "sampleCount", C.Symbol_sampleDepth, "sampleDepth", C.Symbol_sampleRate, "sampleRate", C.Symbol_script, "script", C.Symbol_scriptChanged, "scriptChanged", C.Symbol_scripts, "scripts", C.Symbol_selectExpr, "selectExpr", C.Symbol_serviceType, "serviceType", C.Symbol_small, "small", C.Symbol_socket, "socket", C.Symbol_socketOwner, "socketOwner", C.Symbol_startLine, "startLine", C.Symbol_status, "status", C.Symbol_styleForHits, "styleForHits", C.Symbol_subClasses, "subClasses", C.Symbol_subclass, "subclass", C.Symbol_superClass, "superClass", C.Symbol_tagSelector, "tagSelector", C.Symbol_tagSelectorChanged, "tagSelectorChanged", C.Symbol_text, "text", C.Symbol_timeSpan, "timeSpan", C.Symbol_tipExclusive, "tipExclusive", C.Symbol_tipKind, "tipKind", C.Symbol_tipParent, "tipParent", C.Symbol_tipTicks, "tipTicks", C.Symbol_tipTime, "tipTime", C.Symbol_toggleExpand, "toggleExpand", C.Symbol_toggleExpanded, "toggleExpanded", C.Symbol_tokenPos, "tokenPos", C.Symbol_topFrame, "topFrame", C.Symbol_trace, "trace", C.Symbol_tree, "tree", C.Symbol_typeChecksEnabled, "typeChecksEnabled", C.Symbol_uncheckedText, "uncheckedText", C.Symbol_updateLineMode, "updateLineMode", C.Symbol_uptime, "uptime", C.Symbol_url, "url", C.Symbol_used, "used", C.Symbol_v, "v", C.Symbol_variable, "variable", C.Symbol_variables, "variables", C.Symbol_version, "version", C.Symbol_vm, "vm", C.Symbol_vmName, "vmName", C.Symbol_webSocket, "webSocket", C.Symbol_writeClosed, "writeClosed"], null, null), false));
+    $.objectAccessor = new O.GeneratedObjectAccessorService(t1, t2, C.Map_empty);
+    $.typeInspector = new O.GeneratedTypeInspectorService(t3, t4, false);
+    $.symbolConverter = t5;
+    $.initializers = [new E.main_closure340(), new E.main_closure341(), new E.main_closure342(), new E.main_closure343(), new E.main_closure344(), new E.main_closure345(), new E.main_closure346(), new E.main_closure347(), new E.main_closure348(), new E.main_closure349(), new E.main_closure350(), new E.main_closure351(), new E.main_closure352(), new E.main_closure353(), new E.main_closure354(), new E.main_closure355(), new E.main_closure356(), new E.main_closure357(), new E.main_closure358(), new E.main_closure359(), new E.main_closure360(), new E.main_closure361(), new E.main_closure362(), new E.main_closure363(), new E.main_closure364(), new E.main_closure365(), new E.main_closure366(), new E.main_closure367(), new E.main_closure368(), new E.main_closure369(), new E.main_closure370(), new E.main_closure371(), new E.main_closure372(), new E.main_closure373(), new E.main_closure374(), new E.main_closure375(), new E.main_closure376(), new E.main_closure377(), new E.main_closure378(), new E.main_closure379(), new E.main_closure380(), new E.main_closure381(), new E.main_closure382(), new E.main_closure383(), new E.main_closure384(), new E.main_closure385(), new E.main_closure386(), new E.main_closure387(), new E.main_closure388(), new E.main_closure389(), new E.main_closure390(), new E.main_closure391(), new E.main_closure392(), new E.main_closure393(), new E.main_closure394(), new E.main_closure395(), new E.main_closure396(), new E.main_closure397(), new E.main_closure398(), new E.main_closure399(), new E.main_closure400(), new E.main_closure401(), new E.main_closure402(), new E.main_closure403(), new E.main_closure404(), new E.main_closure405(), new E.main_closure406(), new E.main_closure407(), new E.main_closure408(), new E.main_closure409(), new E.main_closure410(), new E.main_closure411(), new E.main_closure412(), new E.main_closure413()];
+    $.deployMode = true;
+    F.main();
+  }, "call$0", "main0$closure", 0, 0, 18],
+  main_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$active$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$address();
+    },
+    $isFunction: true
+  },
+  main_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$anchor$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure2: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$assertsEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure3: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bpt();
+    },
+    $isFunction: true
+  },
+  main_closure4: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$busy$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure5: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$buttonClick$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure6: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bytes();
+    },
+    $isFunction: true
+  },
+  main_closure7: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$callback$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure8: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$capacity();
+    },
+    $isFunction: true
+  },
+  main_closure9: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$change$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure10: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$changeSort$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure11: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure12: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checkedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure13: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classTable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure14: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure15: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$closing();
+    },
+    $isFunction: true
+  },
+  main_closure16: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$cls$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure17: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$code$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure18: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$coloring$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure19: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$columns();
+    },
+    $isFunction: true
+  },
+  main_closure20: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$connection$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure21: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$counters$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure22: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$countersChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure23: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$current();
+    },
+    $isFunction: true
+  },
+  main_closure24: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptor();
+    },
+    $isFunction: true
+  },
+  main_closure25: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptors();
+    },
+    $isFunction: true
+  },
+  main_closure26: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$devtools$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure27: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$displayCutoff$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure28: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$doAction$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure29: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$element$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure30: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure31: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure32: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPosChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure33: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$entry();
+    },
+    $isFunction: true
+  },
+  main_closure34: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$error$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure35: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$eval$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure36: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$evalNow$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure37: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$exception$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure38: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expand$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure39: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expandChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure40: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure41: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expander$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure42: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$expanderStyle();
+    },
+    $isFunction: true
+  },
+  main_closure43: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure44: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$external();
+    },
+    $isFunction: true
+  },
+  main_closure45: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fd();
+    },
+    $isFunction: true
+  },
+  main_closure46: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$field$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure47: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fields();
+    },
+    $isFunction: true
+  },
+  main_closure48: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$file$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure49: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$firstTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure50: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flag$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure51: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flagList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure52: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure53: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure54: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedAddress();
+    },
+    $isFunction: true
+  },
+  main_closure55: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedAverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure56: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedCollections$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure57: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedDeoptId();
+    },
+    $isFunction: true
+  },
+  main_closure58: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure59: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure60: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusive();
+    },
+    $isFunction: true
+  },
+  main_closure61: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure62: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedLine();
+    },
+    $isFunction: true
+  },
+  main_closure63: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedTotalCollectionTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure64: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentation$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure65: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentationChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure66: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$frame$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure67: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$function$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure68: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$functionChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure69: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$functions();
+    },
+    $isFunction: true
+  },
+  main_closure70: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$getColumnLabel();
+    },
+    $isFunction: true
+  },
+  main_closure71: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$goto$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure72: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$gotoLink$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure73: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasClass$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure74: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDescriptors();
+    },
+    $isFunction: true
+  },
+  main_closure75: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDisassembly();
+    },
+    $isFunction: true
+  },
+  main_closure76: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasNoAllocations();
+    },
+    $isFunction: true
+  },
+  main_closure77: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasParent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure78: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hashLinkWorkaround$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure79: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hideTagsChecked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure80: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hits();
+    },
+    $isFunction: true
+  },
+  main_closure81: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hoverText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure82: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$httpServer$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure83: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$human();
+    },
+    $isFunction: true
+  },
+  main_closure84: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$idle();
+    },
+    $isFunction: true
+  },
+  main_closure85: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imp();
+    },
+    $isFunction: true
+  },
+  main_closure86: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imports();
+    },
+    $isFunction: true
+  },
+  main_closure87: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure88: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instances$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure89: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instruction();
+    },
+    $isFunction: true
+  },
+  main_closure90: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instructions();
+    },
+    $isFunction: true
+  },
+  main_closure91: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$$interface();
+    },
+    $isFunction: true
+  },
+  main_closure92: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$interfaces();
+    },
+    $isFunction: true
+  },
+  main_closure93: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$internal$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure94: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$io$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure95: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isAbstract();
+    },
+    $isFunction: true
+  },
+  main_closure96: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isBool$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure97: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isComment();
+    },
+    $isFunction: true
+  },
+  main_closure98: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDart$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure99: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isDartCode();
+    },
+    $isFunction: true
+  },
+  main_closure100: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDouble$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure101: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure102: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isError$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure103: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInstance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure104: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInt$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure105: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure106: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNotEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure107: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNull$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure108: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isOptimized();
+    },
+    $isFunction: true
+  },
+  main_closure109: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPatch();
+    },
+    $isFunction: true
+  },
+  main_closure110: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPipe();
+    },
+    $isFunction: true
+  },
+  main_closure111: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure112: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isType$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure113: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isUnexpected$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure114: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure115: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolateChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure116: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isolates();
+    },
+    $isFunction: true
+  },
+  main_closure117: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$jumpTarget();
+    },
+    $isFunction: true
+  },
+  main_closure118: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$kind$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure119: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$label$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure120: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$last$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure121: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastAccumulatorReset$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure122: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastServiceGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure123: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure124: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastUpdate();
+    },
+    $isFunction: true
+  },
+  main_closure125: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$length$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure126: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lib();
+    },
+    $isFunction: true
+  },
+  main_closure127: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$libraries();
+    },
+    $isFunction: true
+  },
+  main_closure128: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$library$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure129: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$line();
+    },
+    $isFunction: true
+  },
+  main_closure130: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure131: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumber$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure132: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumbers$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure133: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lines$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure134: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$link$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure135: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$list$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure136: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$listening();
+    },
+    $isFunction: true
+  },
+  main_closure137: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$loading();
+    },
+    $isFunction: true
+  },
+  main_closure138: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localAddress();
+    },
+    $isFunction: true
+  },
+  main_closure139: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localPort();
+    },
+    $isFunction: true
+  },
+  main_closure140: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$mainPort();
+    },
+    $isFunction: true
+  },
+  main_closure141: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$map$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure142: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapAsString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure143: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure144: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$message$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure145: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOut$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure146: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOver$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure147: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$msg$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure148: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$name$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure149: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$nameIsEmpty$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure150: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$newSpace();
+    },
+    $isFunction: true
+  },
+  main_closure151: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$object$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure152: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$objectChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure153: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$objectPool();
+    },
+    $isFunction: true
+  },
+  main_closure154: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$oldSpace();
+    },
+    $isFunction: true
+  },
+  main_closure155: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pad$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure156: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$padding$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure157: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$path$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure158: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pause$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure159: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pauseEvent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure160: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$pid();
+    },
+    $isFunction: true
+  },
+  main_closure161: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure162: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$posChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure163: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$process$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure164: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profile$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure165: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profileChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure166: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$protocol$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure167: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualified$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure168: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualifiedName$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure169: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$reachable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure170: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$readClosed();
+    },
+    $isFunction: true
+  },
+  main_closure171: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$ref$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure172: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure173: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refresh$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure174: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshCoverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure175: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure176: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure177: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$relativeLink();
+    },
+    $isFunction: true
+  },
+  main_closure178: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remoteAddress();
+    },
+    $isFunction: true
+  },
+  main_closure179: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remotePort();
+    },
+    $isFunction: true
+  },
+  main_closure180: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resetAccumulator$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure181: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$response$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure182: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$result$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure183: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$results$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure184: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resume$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure185: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedBytes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure186: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure187: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainingPath$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure188: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$rootLib();
+    },
+    $isFunction: true
+  },
+  main_closure189: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$row();
+    },
+    $isFunction: true
+  },
+  main_closure190: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$rows$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure191: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$running();
+    },
+    $isFunction: true
+  },
+  main_closure192: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleCount$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure193: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleDepth$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure194: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleRate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure195: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$script$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure196: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$scriptChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure197: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$scripts();
+    },
+    $isFunction: true
+  },
+  main_closure198: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$selectExpr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure199: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$serviceType();
+    },
+    $isFunction: true
+  },
+  main_closure200: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$small$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure201: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$socket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure202: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$socketOwner();
+    },
+    $isFunction: true
+  },
+  main_closure203: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$startLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure204: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$status$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure205: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$styleForHits$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure206: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subClasses();
+    },
+    $isFunction: true
+  },
+  main_closure207: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subclass();
+    },
+    $isFunction: true
+  },
+  main_closure208: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$superClass();
+    },
+    $isFunction: true
+  },
+  main_closure209: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelector$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure210: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelectorChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure211: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$text$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure212: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$timeSpan$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure213: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure214: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipKind();
+    },
+    $isFunction: true
+  },
+  main_closure215: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipParent();
+    },
+    $isFunction: true
+  },
+  main_closure216: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTicks();
+    },
+    $isFunction: true
+  },
+  main_closure217: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTime();
+    },
+    $isFunction: true
+  },
+  main_closure218: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpand$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure219: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure220: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure221: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$topFrame();
+    },
+    $isFunction: true
+  },
+  main_closure222: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$trace$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure223: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tree$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure224: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$typeChecksEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure225: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$uncheckedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure226: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$updateLineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure227: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$uptime();
+    },
+    $isFunction: true
+  },
+  main_closure228: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$url$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure229: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$used();
+    },
+    $isFunction: true
+  },
+  main_closure230: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$v();
+    },
+    $isFunction: true
+  },
+  main_closure231: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variable();
+    },
+    $isFunction: true
+  },
+  main_closure232: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variables();
+    },
+    $isFunction: true
+  },
+  main_closure233: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$version$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure234: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$vm$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure235: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$vmName();
+    },
+    $isFunction: true
+  },
+  main_closure236: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$webSocket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure237: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$writeClosed();
+    },
+    $isFunction: true
+  },
+  main_closure238: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$active$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure239: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$anchor$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure240: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$busy$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure241: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$callback$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure242: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure243: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checkedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure244: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$classTable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure245: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$cls$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure246: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$code$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure247: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$connection$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure248: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$counters$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure249: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$devtools$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure250: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$displayCutoff$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure251: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure252: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endPos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure253: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$entry(v);
+    },
+    $isFunction: true
+  },
+  main_closure254: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$error$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure255: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$eval$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure256: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$exception$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure257: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expand$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure258: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expanded$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure259: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expr$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure260: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$field$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure261: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$file$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure262: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$firstTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure263: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flag$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure264: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flagList$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure265: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$fragmentation$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure266: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$frame$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure267: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$$function$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure268: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasClass$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure269: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasParent$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure270: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hashLinkWorkaround$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure271: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hideTagsChecked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure272: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$httpServer$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure273: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$imp(v);
+    },
+    $isFunction: true
+  },
+  main_closure274: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instance$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure275: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instances$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure276: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$$interface(v);
+    },
+    $isFunction: true
+  },
+  main_closure277: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$internal$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure278: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$io$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure279: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isDart$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure280: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isolate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure281: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$kind$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure282: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$label$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure283: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$last$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure284: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastAccumulatorReset$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure285: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastServiceGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure286: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lastTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure287: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lib(v);
+    },
+    $isFunction: true
+  },
+  main_closure288: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$library$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure289: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lineMode$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure290: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lines$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure291: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$link$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure292: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$list$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure293: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$map$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure294: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$mapAsString$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure295: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$msg$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure296: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$name$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure297: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$object$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure298: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$objectPool(v);
+    },
+    $isFunction: true
+  },
+  main_closure299: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pad$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure300: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$path$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure301: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pause$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure302: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure303: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$process$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure304: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$profile$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure305: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualified$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure306: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualifiedName$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure307: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$reachable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure308: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$ref$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure309: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refresh$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure310: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshCoverage$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure311: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure312: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshTime$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure313: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resetAccumulator$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure314: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$result$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure315: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$results$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure316: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resume$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure317: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedBytes$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure318: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedSize$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure319: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainingPath$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure320: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$rootLib(v);
+    },
+    $isFunction: true
+  },
+  main_closure321: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleCount$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure322: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleDepth$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure323: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleRate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure324: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$script$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure325: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$small$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure326: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$socket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure327: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$socketOwner(v);
+    },
+    $isFunction: true
+  },
+  main_closure328: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$startLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure329: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$status$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure330: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$subclass(v);
+    },
+    $isFunction: true
+  },
+  main_closure331: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$superClass(v);
+    },
+    $isFunction: true
+  },
+  main_closure332: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$tagSelector$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure333: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$text$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure334: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$timeSpan$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure335: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$tokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure336: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$trace$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure337: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$uncheckedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure338: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$vm$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure339: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$webSocket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure340: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("curly-block", C.Type_cop);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure341: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-element", C.Type_sRP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure342: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-ref", C.Type_UJT);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure343: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-ref", C.Type_EVD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure344: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("action-link", C.Type_kA7);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure345: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-bar", C.Type_nV5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure346: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu", C.Type_KMd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure347: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu-item", C.Type_AD4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure348: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-refresh", C.Type_Sxn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure349: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-control", C.Type_9ur);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure350: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("top-nav-menu", C.Type_C7R);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure351: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-nav-menu", C.Type_wsa);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure352: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-nav-menu", C.Type_s2l);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure353: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-nav-menu", C.Type_JFX);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure354: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("breakpoint-list", C.Type_ON8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure355: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-ref", C.Type_ql8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure356: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-tree", C.Type_dRp);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure357: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-box", C.Type_8eb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure358: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-link", C.Type_p2P);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure359: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-ref", C.Type_ohY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure360: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-ref", C.Type_wgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure361: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-ref", C.Type_mpV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure362: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-ref", C.Type_wBh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure363: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-view", C.Type_O5a);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure364: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-ref", C.Type_2jN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure365: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-view", C.Type_Aym);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure366: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("error-view", C.Type_Npb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure367: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-view", C.Type_4IJ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure368: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-frame", C.Type_Jcu);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure369: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-list", C.Type_f1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure370: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-item", C.Type_7g3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure371: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-inset", C.Type_a1Y);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure372: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-view", C.Type_bDN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure373: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-map", C.Type_SoB);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure374: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-view", C.Type_TEn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure375: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-ref", C.Type_JmU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure376: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-list-view", C.Type_yvP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure377: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-ref", C.Type_i7j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure378: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-view", C.Type_M6L);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure379: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-view", C.Type_L9j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure380: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-ref", C.Type_uIL);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure381: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-ref", C.Type_B8J);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure382: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-list-view", C.Type_4m4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure383: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-view", C.Type_61d);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure384: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-ref", C.Type_MUU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure385: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-list-view", C.Type_gg4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure386: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-view", C.Type_AyI);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure387: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-list-view", C.Type_IuH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure388: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-ref", C.Type_mWg);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure389: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-view", C.Type_8cK);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure390: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-list-view", C.Type_8KD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure391: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-ref", C.Type_qMZ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure392: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-view", C.Type_AHF);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure393: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-ref", C.Type_ES1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure394: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-summary", C.Type_iL9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure395: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-run-state", C.Type_aAD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure396: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-location", C.Type_ECh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure397: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-shared-summary", C.Type_8Gl);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure398: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-counter-chart", C.Type_wT1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure399: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-view", C.Type_ZKG);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure400: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-view", C.Type_gqS);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure401: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("json-view", C.Type_Kyy);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure402: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-view", C.Type_qph);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure403: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-profile", C.Type_LV6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure404: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("sliding-checkbox", C.Type_kuc);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure405: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-profile", C.Type_cOY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure406: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-view", C.Type_0e9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure407: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-trace", C.Type_nVV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure408: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-view", C.Type_E0k);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure409: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-view", C.Type_Mu6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure410: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-application", C.Type_YgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure411: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-exception-view", C.Type_y1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure412: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-error-view", C.Type_FKd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure413: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-ref", C.Type_Eue);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+},
+1],
+["breakpoint_list_element", "package:observatory/src/elements/breakpoint_list.dart", , B, {
+  "^": "",
+  BreakpointListElement: {
+    "^": "ObservatoryElement_ChangeNotifier;_breakpoint_list_element$__$msg,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$msg: function(receiver) {
+      return receiver._breakpoint_list_element$__$msg;
+    },
+    set$msg: function(receiver, value) {
+      receiver._breakpoint_list_element$__$msg = this.notifyPropertyChange$3(receiver, C.Symbol_msg, receiver._breakpoint_list_element$__$msg, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._breakpoint_list_element$__$msg).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {BreakpointListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.BreakpointListElement_methods.Element$created$0(receiver);
+        C.BreakpointListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["class_ref_element", "package:observatory/src/elements/class_ref.dart", , Q, {
+  "^": "",
+  ClassRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {ClassRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassRefElement_methods.Element$created$0(receiver);
+        C.ClassRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["class_tree_element", "package:observatory/src/elements/class_tree.dart", , O, {
+  "^": "",
+  ClassTreeRow: {
+    "^": "TableTreeRow;isolate>,cls>,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onShow$0: function(_) {
+      var t1, t2, t3, t4, subClass, t5, row;
+      t1 = this.children;
+      if (t1.length > 0)
+        return;
+      for (t2 = J.get$iterator$ax(J.get$children$x(this.cls)), t3 = this.isolate, t4 = this.depth + 1; t2.moveNext$0();) {
+        subClass = t2.get$current();
+        if (subClass.get$isPatch() === true)
+          continue;
+        t5 = [];
+        t5.$builtinTypeInfo = [G.TableTreeRow];
+        row = new O.ClassTreeRow(t3, subClass, this, t4, t5, [], "\u2192", "cursor: pointer;", false, null, null);
+        if (!row.hasChildren$0()) {
+          t5 = row._app$__$expanderStyle;
+          if (row.get$hasObservers(row) && !J.$eq(t5, "visibility:hidden;")) {
+            t5 = new T.PropertyChangeRecord(row, C.Symbol_expanderStyle, t5, "visibility:hidden;");
+            t5.$builtinTypeInfo = [null];
+            row.notifyChange$1(row, t5);
+          }
+          row._app$__$expanderStyle = "visibility:hidden;";
+        }
+        t1.push(row);
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.cls)) > 0;
+    }
+  },
+  ClassTreeElement: {
+    "^": "ObservatoryElement_ChangeNotifier1;_class_tree_element$__$isolate,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._class_tree_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._class_tree_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._class_tree_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      t1 = receiver._class_tree_element$__$isolate;
+      if (t1 != null)
+        this._update$1(receiver, t1.get$objectClass());
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      receiver._class_tree_element$__$isolate.getClassHierarchy$0().then$1(new O.ClassTreeElement_isolateChanged_closure(receiver));
+    }, "call$1", "get$isolateChanged", 2, 0, 13, 57],
+    _update$1: function(receiver, root) {
+      var rootRow, e, stackTrace, t1, t2, rootRow0, t3, t4, t5, exception;
+      try {
+        t1 = receiver._class_tree_element$__$isolate;
+        t2 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        rootRow0 = new O.ClassTreeRow(t1, root, null, 0, t2, [], "\u2192", "cursor: pointer;", false, null, null);
+        rootRow0.TableTreeRow$1(null);
+        rootRow = rootRow0;
+        t1 = J.get$children$x(rootRow);
+        t2 = receiver._class_tree_element$__$isolate;
+        t3 = rootRow;
+        t4 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t5 = t3 != null ? t3.get$depth() + 1 : 0;
+        t4 = new O.ClassTreeRow(t2, root, t3, t5, t4, [], "\u2192", "cursor: pointer;", false, null, null);
+        t4.TableTreeRow$1(t3);
+        t1.push(t4);
+        receiver.tree.initialize$1(rootRow);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_update", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {ClassTreeElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassTreeElement_methods.Element$created$0(receiver);
+        C.ClassTreeElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier1: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassTreeElement_isolateChanged_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(objectClass) {
+      J._update$1$x(this.this_0, objectClass);
+    }, "call$1", null, 2, 0, null, 95, "call"],
+    $isFunction: true
+  }
+}],
+["class_view_element", "package:observatory/src/elements/class_view.dart", , Z, {
+  "^": "",
+  ClassViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier2;_class_view_element$__$cls,_class_view_element$__$instances,_class_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._class_view_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._class_view_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._class_view_element$__$cls, value);
+    },
+    get$instances: function(receiver) {
+      return receiver._class_view_element$__$instances;
+    },
+    set$instances: function(receiver, value) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._class_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return receiver._class_view_element$__$cls.get$1("eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    reachable$1: [function(receiver, limit) {
+      return receiver._class_view_element$__$cls.get$1("instances?limit=" + H.S(limit)).then$1(new Z.ClassViewElement_reachable_closure(receiver));
+    }, "call$1", "get$reachable", 2, 0, 98, 99],
+    retainedSize$1: [function(receiver, dummy) {
+      return receiver._class_view_element$__$cls.get$1("retained").then$1(new Z.ClassViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    refresh$1: [function(receiver, done) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, null);
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, null);
+      J.reload$0$x(receiver._class_view_element$__$cls).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {ClassViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassViewElement_methods.Element$created$0(receiver);
+        C.ClassViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier2: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassViewElement_reachable_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._class_view_element$__$instances = J.notifyPropertyChange$3$x(t1, C.Symbol_instances, t1._class_view_element$__$instances, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._class_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._class_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["code_ref_element", "package:observatory/src/elements/code_ref.dart", , O, {
+  "^": "",
+  CodeRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_code, 0, 1);
+    }, "call$1", "get$refChanged", 2, 0, 13, 57],
+    static: {CodeRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeRefElement_methods.Element$created$0(receiver);
+        C.CodeRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["code_view_element", "package:observatory/src/elements/code_view.dart", , F, {
+  "^": "",
+  CodeViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier3;_code_view_element$__$code,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._code_view_element$__$code;
+    },
+    set$code: function(receiver, value) {
+      receiver._code_view_element$__$code = this.notifyPropertyChange$3(receiver, C.Symbol_code, receiver._code_view_element$__$code, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._code_view_element$__$code;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1).then$1(new F.CodeViewElement_attached_closure());
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._code_view_element$__$code).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _findJumpTarget$1: function(receiver, target) {
+      var jumpTarget, address, node;
+      jumpTarget = J.get$attributes$x(target)._html$_element.getAttribute("data-jump-target");
+      if (jumpTarget === "")
+        return;
+      address = H.Primitives_parseInt(jumpTarget, null, null);
+      node = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#addr-" + H.S(address));
+      if (node == null)
+        return;
+      return node;
+    },
+    mouseOver$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).add$1(0, "highlight");
+    }, "call$3", "get$mouseOver", 6, 0, 102, 1, 93, 94],
+    mouseOut$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).remove$1(0, "highlight");
+    }, "call$3", "get$mouseOut", 6, 0, 102, 1, 93, 94],
+    static: {CodeViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeViewElement_methods.Element$created$0(receiver);
+        C.CodeViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier3: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeViewElement_attached_closure: {
+    "^": "Closure:103;",
+    call$1: [function(c) {
+      c.loadScript$0();
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  }
+}],
+["curly_block_element", "package:observatory/src/elements/curly_block.dart", , R, {
+  "^": "",
+  CurlyBlockElement: {
+    "^": "PolymerElement_ChangeNotifier0;_curly_block_element$__$expanded,_curly_block_element$__$busy,_curly_block_element$__$callback,_curly_block_element$__$expand,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$expanded: function(receiver) {
+      return receiver._curly_block_element$__$expanded;
+    },
+    set$expanded: function(receiver, value) {
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, value);
+    },
+    get$busy: function(receiver) {
+      return receiver._curly_block_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._curly_block_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$2: function($receiver, arg0, arg1) {
+      return this.get$callback($receiver).call$2(arg0, arg1);
+    },
+    set$callback: function(receiver, value) {
+      receiver._curly_block_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._curly_block_element$__$callback, value);
+    },
+    get$expand: function(receiver) {
+      return receiver._curly_block_element$__$expand;
+    },
+    set$expand: function(receiver, value) {
+      receiver._curly_block_element$__$expand = this.notifyPropertyChange$3(receiver, C.Symbol_expand, receiver._curly_block_element$__$expand, value);
+    },
+    expandChanged$1: [function(receiver, oldValue) {
+      var t1 = receiver._curly_block_element$__$expand;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, t1);
+    }, "call$1", "get$expandChanged", 2, 0, 20, 57],
+    doneCallback$0: [function(receiver) {
+      var t1 = receiver._curly_block_element$__$expanded;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, false);
+    }, "call$0", "get$doneCallback", 0, 0, 18],
+    toggleExpand$3: [function(receiver, a, b, c) {
+      var t1 = receiver._curly_block_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._curly_block_element$__$callback != null) {
+        receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$2(receiver, receiver._curly_block_element$__$expanded !== true, this.get$doneCallback(receiver));
+      } else {
+        t1 = receiver._curly_block_element$__$expanded;
+        receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      }
+    }, "call$3", "get$toggleExpand", 6, 0, 79, 46, 47, 80],
+    static: {CurlyBlockElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._curly_block_element$__$expanded = false;
+        receiver._curly_block_element$__$busy = false;
+        receiver._curly_block_element$__$callback = null;
+        receiver._curly_block_element$__$expand = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CurlyBlockElement_methods.Element$created$0(receiver);
+        C.CurlyBlockElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier0: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["dart._internal", "dart:_internal", , H, {
+  "^": "",
+  IterableMixinWorkaround_forEach: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      f.call$1(t1._current);
+  },
+  IterableMixinWorkaround_any: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      if (f.call$1(t1._current) === true)
+        return true;
+    return false;
+  },
+  IterableMixinWorkaround_fold: function(iterable, initialValue, combine) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      initialValue = combine.call$2(initialValue, t1._current);
+    return initialValue;
+  },
+  IterableMixinWorkaround_sortList: function(list, compare) {
+    if (compare == null)
+      compare = P.Comparable_compare$closure();
+    H.Sort__doSort(list, 0, list.length - 1, compare);
+  },
+  IterableMixinWorkaround__rangeCheck: function(list, start, end) {
+    var t1 = J.getInterceptor$n(start);
+    if (t1.$lt(start, 0) || t1.$gt(start, list.length))
+      throw H.wrapException(P.RangeError$range(start, 0, list.length));
+    t1 = J.getInterceptor$n(end);
+    if (t1.$lt(end, start) || t1.$gt(end, list.length))
+      throw H.wrapException(P.RangeError$range(end, start, list.length));
+  },
+  IterableMixinWorkaround_setRangeList: function(list, start, end, from, skipCount) {
+    var $length, t1, otherStart, otherList;
+    H.IterableMixinWorkaround__rangeCheck(list, start, end);
+    $length = J.$sub$n(end, start);
+    if (J.$eq($length, 0))
+      return;
+    if (J.$lt$n(skipCount, 0))
+      throw H.wrapException(P.ArgumentError$(skipCount));
+    t1 = J.getInterceptor(from);
+    if (!!t1.$isList) {
+      otherStart = skipCount;
+      otherList = from;
+    } else {
+      otherList = t1.skip$1(from, skipCount).toList$1$growable(0, false);
+      otherStart = 0;
+    }
+    if (J.$gt$n(J.$add$ns(otherStart, $length), J.get$length$asx(otherList)))
+      throw H.wrapException(H.IterableElementError_tooFew());
+    H.Lists_copy(otherList, otherStart, list, start, $length);
+  },
+  IterableMixinWorkaround_insertAllList: function(list, index, iterable) {
+    var t1, insertionLength, t2, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    t1 = J.getInterceptor(iterable);
+    if (!t1.$isEfficientLength)
+      iterable = t1.toList$1$growable(iterable, false);
+    t1 = J.getInterceptor$asx(iterable);
+    insertionLength = t1.get$length(iterable);
+    t2 = list.length;
+    if (typeof insertionLength !== "number")
+      return H.iae(insertionLength);
+    C.JSArray_methods.set$length(list, t2 + insertionLength);
+    t2 = list.length;
+    if (!!list.immutable$list)
+      H.throwExpression(P.UnsupportedError$("set range"));
+    H.IterableMixinWorkaround_setRangeList(list, index + insertionLength, t2, list, index);
+    for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableMixinWorkaround_setAllList: function(list, index, iterable) {
+    var t1, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableElementError_noElement: function() {
+    return new P.StateError("No element");
+  },
+  IterableElementError_tooFew: function() {
+    return new P.StateError("Too few elements");
+  },
+  Lists_copy: function(src, srcStart, dst, dstStart, count) {
+    var t1, i, j, t2, t3;
+    t1 = J.getInterceptor$n(srcStart);
+    if (t1.$lt(srcStart, dstStart))
+      for (i = J.$sub$n(t1.$add(srcStart, count), 1), j = J.$sub$n(J.$add$ns(dstStart, count), 1), t1 = J.getInterceptor$asx(src); t2 = J.getInterceptor$n(i), t2.$ge(i, srcStart); i = t2.$sub(i, 1), j = J.$sub$n(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
+    else
+      for (t2 = J.getInterceptor$asx(src), j = dstStart, i = srcStart; t3 = J.getInterceptor$n(i), t3.$lt(i, t1.$add(srcStart, count)); i = t3.$add(i, 1), j = J.$add$ns(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t2.$index(src, i));
+  },
+  Lists_indexOf: function(a, element, startIndex, endIndex) {
+    var i;
+    if (startIndex >= a.length)
+      return -1;
+    for (i = startIndex; i < endIndex; ++i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Lists_lastIndexOf: function(a, element, startIndex) {
+    var t1, i;
+    if (typeof startIndex !== "number")
+      return startIndex.$lt();
+    if (startIndex < 0)
+      return -1;
+    t1 = a.length;
+    if (startIndex >= t1)
+      startIndex = t1 - 1;
+    for (i = startIndex; i >= 0; --i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Sort__doSort: function(a, left, right, compare) {
+    if (right - left <= 32)
+      H.Sort__insertionSort(a, left, right, compare);
+    else
+      H.Sort__dualPivotQuicksort(a, left, right, compare);
+  },
+  Sort__insertionSort: function(a, left, right, compare) {
+    var i, t1, el, j, j0;
+    for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
+      el = t1.$index(a, i);
+      j = i;
+      while (true) {
+        if (!(j > left && J.$gt$n(compare.call$2(t1.$index(a, j - 1), el), 0)))
+          break;
+        j0 = j - 1;
+        t1.$indexSet(a, j, t1.$index(a, j0));
+        j = j0;
+      }
+      t1.$indexSet(a, j, el);
+    }
+  },
+  Sort__dualPivotQuicksort: function(a, left, right, compare) {
+    var sixth, index1, index5, index3, index2, index4, t1, el1, el2, el3, el4, el5, t0, less, great, k, ak, comp, t2, great0, less0, pivots_are_equal;
+    sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6);
+    index1 = left + sixth;
+    index5 = right - sixth;
+    index3 = C.JSInt_methods._tdivFast$1(left + right, 2);
+    index2 = index3 - sixth;
+    index4 = index3 + sixth;
+    t1 = J.getInterceptor$asx(a);
+    el1 = t1.$index(a, index1);
+    el2 = t1.$index(a, index2);
+    el3 = t1.$index(a, index3);
+    el4 = t1.$index(a, index4);
+    el5 = t1.$index(a, index5);
+    if (J.$gt$n(compare.call$2(el1, el2), 0)) {
+      t0 = el2;
+      el2 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el3), 0)) {
+      t0 = el3;
+      el3 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el4), 0)) {
+      t0 = el4;
+      el4 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el3, el4), 0)) {
+      t0 = el4;
+      el4 = el3;
+      el3 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el5), 0)) {
+      t0 = el5;
+      el5 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    t1.$indexSet(a, index1, el1);
+    t1.$indexSet(a, index3, el3);
+    t1.$indexSet(a, index5, el5);
+    t1.$indexSet(a, index2, t1.$index(a, left));
+    t1.$indexSet(a, index4, t1.$index(a, right));
+    less = left + 1;
+    great = right - 1;
+    if (J.$eq(compare.call$2(el2, el4), 0)) {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        comp = compare.call$2(ak, el2);
+        t2 = J.getInterceptor(comp);
+        if (t2.$eq(comp, 0))
+          continue;
+        if (t2.$lt(comp, 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else
+          for (; true;) {
+            comp = compare.call$2(t1.$index(a, great), el2);
+            t2 = J.getInterceptor$n(comp);
+            if (t2.$gt(comp, 0)) {
+              --great;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (t2.$lt(comp, 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+                break;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                break;
+              }
+            }
+          }
+      }
+      pivots_are_equal = true;
+    } else {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$lt$n(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$gt$n(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$gt$n(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      pivots_are_equal = false;
+    }
+    t2 = less - 1;
+    t1.$indexSet(a, left, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el2);
+    t2 = great + 1;
+    t1.$indexSet(a, right, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el4);
+    H.Sort__doSort(a, left, less - 2, compare);
+    H.Sort__doSort(a, great + 2, right, compare);
+    if (pivots_are_equal)
+      return;
+    if (less < index1 && great > index5) {
+      for (; J.$eq(compare.call$2(t1.$index(a, less), el2), 0);)
+        ++less;
+      for (; J.$eq(compare.call$2(t1.$index(a, great), el4), 0);)
+        --great;
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$eq(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$eq(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$eq(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      H.Sort__doSort(a, less, great, compare);
+    } else
+      H.Sort__doSort(a, less, great, compare);
+  },
+  ListIterable: {
+    "^": "IterableBase;",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(this, this.get$length(this), 0, null), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+    },
+    forEach$1: function(_, action) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        action.call$1(this.elementAt$1(0, i));
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$last: function(_) {
+      if (J.$eq(this.get$length(this), 0))
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.elementAt$1(0, J.$sub$n(this.get$length(this), 1));
+    },
+    contains$1: function(_, element) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (J.$eq(this.elementAt$1(0, i), element))
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    any$1: function(_, test) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (test.call$1(this.elementAt$1(0, i)) === true)
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    join$1: function(_, separator) {
+      var $length, t1, first, buffer, i, str;
+      $length = this.get$length(this);
+      if (separator.length !== 0) {
+        t1 = J.getInterceptor($length);
+        if (t1.$eq($length, 0))
+          return "";
+        first = H.S(this.elementAt$1(0, 0));
+        if (!t1.$eq($length, this.get$length(this)))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        buffer = P.StringBuffer$(first);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 1;
+        for (; i < $length; ++i) {
+          buffer._contents += separator;
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      } else {
+        buffer = P.StringBuffer$("");
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 0;
+        for (; i < $length; ++i) {
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      }
+    },
+    where$1: function(_, test) {
+      return P.IterableBase.prototype.where$1.call(this, this, test);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E0", ret: P.Iterable, args: [{func: "dynamic__E0", args: [E]}]};
+      }, this.$receiver, "ListIterable");
+    }, 31],
+    toList$1$growable: function(_, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = Array(t1);
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+      }
+      i = 0;
+      while (true) {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (!(i < t1))
+          break;
+        t1 = this.elementAt$1(0, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+        ++i;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    $isEfficientLength: true
+  },
+  SubListIterable: {
+    "^": "ListIterable;_iterable,_start,_endOrLength",
+    get$_endIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._endOrLength;
+      if (t1 == null || J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$_startIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$length: function(_) {
+      var $length, t1, t2;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$ge$n(t1, $length))
+        return 0;
+      t2 = this._endOrLength;
+      if (t2 == null || J.$ge$n(t2, $length))
+        return J.$sub$n($length, t1);
+      return J.$sub$n(t2, t1);
+    },
+    elementAt$1: function(_, index) {
+      var realIndex = J.$add$ns(this.get$_startIndex(), index);
+      if (J.$lt$n(index, 0) || J.$ge$n(realIndex, this.get$_endIndex()))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      return J.elementAt$1$ax(this._iterable, realIndex);
+    },
+    skip$1: function(_, count) {
+      if (J.$lt$n(count, 0))
+        throw H.wrapException(P.RangeError$value(count));
+      return H.SubListIterable$(this._iterable, J.$add$ns(this._start, count), this._endOrLength, null);
+    },
+    take$1: function(_, count) {
+      var t1, t2, newEnd;
+      if (count < 0)
+        throw H.wrapException(P.RangeError$value(count));
+      t1 = this._endOrLength;
+      t2 = this._start;
+      if (t1 == null)
+        return H.SubListIterable$(this._iterable, t2, J.$add$ns(t2, count), null);
+      else {
+        newEnd = J.$add$ns(t2, count);
+        if (J.$lt$n(t1, newEnd))
+          return this;
+        return H.SubListIterable$(this._iterable, t2, newEnd, null);
+      }
+    },
+    SubListIterable$3: function(_iterable, _start, _endOrLength, $E) {
+      var t1, t2, t3;
+      t1 = this._start;
+      t2 = J.getInterceptor$n(t1);
+      if (t2.$lt(t1, 0))
+        throw H.wrapException(P.RangeError$value(t1));
+      t3 = this._endOrLength;
+      if (t3 != null) {
+        if (J.$lt$n(t3, 0))
+          throw H.wrapException(P.RangeError$value(t3));
+        if (t2.$gt(t1, t3))
+          throw H.wrapException(P.RangeError$range(t1, 0, t3));
+      }
+    },
+    static: {SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
+        var t1 = H.setRuntimeTypeInfo(new H.SubListIterable(_iterable, _start, _endOrLength), [$E]);
+        t1.SubListIterable$3(_iterable, _start, _endOrLength, $E);
+        return t1;
+      }}
+  },
+  ListIterator: {
+    "^": "Object;_iterable,_length,_index,_current",
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2, $length, t3;
+      t1 = this._iterable;
+      t2 = J.getInterceptor$asx(t1);
+      $length = t2.get$length(t1);
+      if (!J.$eq(this._length, $length))
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t3 = this._index;
+      if (typeof $length !== "number")
+        return H.iae($length);
+      if (t3 >= $length) {
+        this._current = null;
+        return false;
+      }
+      this._current = t2.elementAt$1(t1, t3);
+      ++this._index;
+      return true;
+    }
+  },
+  MappedIterable: {
+    "^": "IterableBase;_iterable,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$iterator: function(_) {
+      var t1 = new H.MappedIterator(null, J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._iterable);
+    },
+    get$last: function(_) {
+      return this._f$1(J.get$last$ax(this._iterable));
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+        if (!!J.getInterceptor(iterable).$isEfficientLength)
+          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
+        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
+      }}
+  },
+  EfficientLengthMappedIterable: {
+    "^": "MappedIterable;_iterable,_f",
+    $isEfficientLength: true
+  },
+  MappedIterator: {
+    "^": "Iterator;_current,_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      var t1 = this._iterator;
+      if (t1.moveNext$0()) {
+        this._current = this._f$1(t1.get$current());
+        return true;
+      }
+      this._current = null;
+      return false;
+    },
+    get$current: function() {
+      return this._current;
+    },
+    $asIterator: function($S, $T) {
+      return [$T];
+    }
+  },
+  MappedListIterable: {
+    "^": "ListIterable;_source,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f$1(J.elementAt$1$ax(this._source, index));
+    },
+    $asListIterable: function($S, $T) {
+      return [$T];
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    $isEfficientLength: true
+  },
+  WhereIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.WhereIterator(J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  WhereIterator: {
+    "^": "Iterator;_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      for (var t1 = this._iterator; t1.moveNext$0();)
+        if (this._f$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$current: function() {
+      return this._iterator.get$current();
+    }
+  },
+  ExpandIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.ExpandIterator(J.get$iterator$ax(this._iterable), this._f, C.C_EmptyIterator, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    }
+  },
+  ExpandIterator: {
+    "^": "Object;_iterator,_f,_currentExpansion,_current",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2;
+      t1 = this._currentExpansion;
+      if (t1 == null)
+        return false;
+      for (t2 = this._iterator; !t1.moveNext$0();) {
+        this._current = null;
+        if (t2.moveNext$0()) {
+          this._currentExpansion = null;
+          t1 = J.get$iterator$ax(this._f$1(t2.get$current()));
+          this._currentExpansion = t1;
+        } else
+          return false;
+      }
+      this._current = this._currentExpansion.get$current();
+      return true;
+    }
+  },
+  EmptyIterator: {
+    "^": "Object;",
+    moveNext$0: function() {
+      return false;
+    },
+    get$current: function() {
+      return;
+    }
+  },
+  FixedLengthListMixin: {
+    "^": "Object;",
+    set$length: function(receiver, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of a fixed-length list"));
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insert$2: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insertAll$2: function(receiver, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    clear$0: function(receiver) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear a fixed-length list"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from a fixed-length list"));
+    }
+  },
+  UnmodifiableListMixin: {
+    "^": "Object;",
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of an unmodifiable list"));
+    },
+    setAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insert$2: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insertAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    addAll$1: function(_, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    clear$0: function(_) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear an unmodifiable list"));
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from an unmodifiable list"));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  UnmodifiableListBase: {
+    "^": "ListBase+UnmodifiableListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ReversedListIterable: {
+    "^": "ListIterable;_source",
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      var t1, t2, t3;
+      t1 = this._source;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.get$length(t1);
+      if (typeof index !== "number")
+        return H.iae(index);
+      return t2.elementAt$1(t1, t3 - 1 - index);
+    }
+  },
+  Symbol0: {
+    "^": "Object;_name>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isSymbol0 && J.$eq(this._name, other._name);
+    },
+    get$hashCode: function(_) {
+      var t1 = J.get$hashCode$(this._name);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return 536870911 & 664597 * t1;
+    },
+    toString$0: function(_) {
+      return "Symbol(\"" + H.S(this._name) + "\")";
+    },
+    $isSymbol0: true,
+    $isSymbol: true,
+    static: {"^": "Symbol_reservedWordRE,Symbol_publicIdentifierRE,Symbol_identifierRE,Symbol_operatorRE,Symbol_publicSymbolPattern,Symbol_symbolPattern"}
+  }
+}],
+["dart._js_names", "dart:_js_names", , H, {
+  "^": "",
+  extractKeys: function(victim) {
+    var t1 = H.setRuntimeTypeInfo(function(victim, hasOwnProperty) {
+      var result = [];
+      for (var key in victim) {
+        if (hasOwnProperty.call(victim, key))
+          result.push(key);
+      }
+      return result;
+    }(victim, Object.prototype.hasOwnProperty), [null]);
+    t1.fixed$length = init;
+    return t1;
+  }
+}],
+["dart.async", "dart:async", , P, {
+  "^": "",
+  _AsyncRun__initializeScheduleImmediate: function() {
+    if ($.get$globalThis().scheduleImmediate != null)
+      return P._AsyncRun__scheduleImmediateJsOverride$closure();
+    return P._AsyncRun__scheduleImmediateWithTimer$closure();
+  },
+  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    $.get$globalThis().scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 19],
+  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
+    P._createTimer(C.Duration_0, callback);
+  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 19],
+  _registerErrorHandler: function(errorHandler, zone) {
+    var t1 = H.getDynamicRuntimeType();
+    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
+    if (t1)
+      return zone.registerBinaryCallback$1(errorHandler);
+    else
+      return zone.registerUnaryCallback$1(errorHandler);
+  },
+  Future_Future: function(computation, $T) {
+    var result = P._Future$($T);
+    P.Timer_Timer(C.Duration_0, new P.Future_Future_closure(computation, result));
+    return result;
+  },
+  Future_wait: function(futures, eagerError) {
+    var t1, t2, t3, values, completer;
+    t1 = {};
+    t1.completer_0 = null;
+    t1.values_1 = null;
+    t1.remaining_2 = 0;
+    t1.error_3 = null;
+    t1.stackTrace_4 = null;
+    t2 = new P.Future_wait_handleError(t1, eagerError);
+    for (t3 = H.setRuntimeTypeInfo(new H.ListIterator(futures, futures.length, 0, null), [H.getTypeArgumentByIndex(futures, 0)]); t3.moveNext$0();)
+      t3._current.then$2$onError(new P.Future_wait_closure(t1, eagerError, t1.remaining_2++), t2);
+    t2 = t1.remaining_2;
+    if (t2 === 0)
+      return P._Future$immediate(C.List_empty, null);
+    values = Array(t2);
+    values.fixed$length = init;
+    t1.values_1 = values;
+    t2 = P.List;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t2)), [t2]);
+    t1.completer_0 = completer;
+    return completer.future;
+  },
+  _asyncRunCallbackLoop: function() {
+    var entry = $._nextCallback;
+    for (; entry != null;) {
+      J.callback$0$x(entry);
+      entry = entry.get$next();
+      $._nextCallback = entry;
+    }
+    $._lastCallback = null;
+  },
+  _asyncRunCallback: [function() {
+    var exception;
+    try {
+      P._asyncRunCallbackLoop();
+    } catch (exception) {
+      H.unwrapException(exception);
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+      $._nextCallback = $._nextCallback.get$next();
+      throw exception;
+    }
+
+  }, "call$0", "_asyncRunCallback$closure", 0, 0, 18],
+  _scheduleAsyncCallback: function(callback) {
+    var t1, t2;
+    t1 = $._lastCallback;
+    if (t1 == null) {
+      t1 = new P._AsyncCallbackEntry(callback, null);
+      $._lastCallback = t1;
+      $._nextCallback = t1;
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+    } else {
+      t2 = new P._AsyncCallbackEntry(callback, null);
+      t1.next = t2;
+      $._lastCallback = t2;
+    }
+  },
+  scheduleMicrotask: function(callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone)) {
+      $.Zone__current.scheduleMicrotask$1(callback);
+      return;
+    }
+    t1 = $.Zone__current;
+    t1.scheduleMicrotask$1(t1.bindCallback$2$runGuarded(callback, true));
+  },
+  StreamController_StreamController: function(onCancel, onListen, onPause, onResume, sync, $T) {
+    return sync ? H.setRuntimeTypeInfo(new P._SyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]) : H.setRuntimeTypeInfo(new P._AsyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]);
+  },
+  StreamController_StreamController$broadcast: function(onCancel, onListen, sync, $T) {
+    var t1;
+    if (sync) {
+      t1 = H.setRuntimeTypeInfo(new P._SyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    } else {
+      t1 = H.setRuntimeTypeInfo(new P._AsyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    }
+    return t1;
+  },
+  _runGuarded: function(notificationHandler) {
+    var result, e, s, exception, t1;
+    if (notificationHandler == null)
+      return;
+    try {
+      result = notificationHandler.call$0();
+      if (!!J.getInterceptor(result).$isFuture)
+        return result;
+      return;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      $.Zone__current.handleUncaughtError$2(e, s);
+    }
+
+  },
+  _nullDataHandler: [function(value) {
+  }, "call$1", "_nullDataHandler$closure", 2, 0, 20, 21],
+  _nullErrorHandler: [function(error, stackTrace) {
+    $.Zone__current.handleUncaughtError$2(error, stackTrace);
+  }, function(error) {
+    return P._nullErrorHandler(error, null);
+  }, null, "call$2", "call$1", "_nullErrorHandler$closure", 2, 2, 22, 23, 24, 25],
+  _nullDoneHandler: [function() {
+  }, "call$0", "_nullDoneHandler$closure", 0, 0, 18],
+  _runUserCode: function(userCode, onSuccess, onError) {
+    var e, s, exception, t1;
+    try {
+      onSuccess.call$1(userCode.call$0());
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      onError.call$2(e, s);
+    }
+
+  },
+  _cancelAndError: function(subscription, future, error, stackTrace) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndError_closure(future, error, stackTrace));
+    else
+      future._completeError$2(error, stackTrace);
+  },
+  _cancelAndErrorClosure: function(subscription, future) {
+    return new P._cancelAndErrorClosure_closure(subscription, future);
+  },
+  _cancelAndValue: function(subscription, future, value) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
+    else
+      future._complete$1(value);
+  },
+  Timer_Timer: function(duration, callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return $.Zone__current.createTimer$2(duration, callback);
+    t1 = $.Zone__current;
+    return t1.createTimer$2(duration, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  _createTimer: function(duration, callback) {
+    var milliseconds = duration.get$inMilliseconds();
+    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+  },
+  Zone__enter: function(zone) {
+    var previous = $.Zone__current;
+    $.Zone__current = zone;
+    return previous;
+  },
+  _rootHandleUncaughtError: [function($self, $parent, zone, error, stackTrace) {
+    $self.run$1(new P._rootHandleUncaughtError_closure(error, stackTrace));
+  }, "call$5", "_rootHandleUncaughtError$closure", 10, 0, 26, 27, 28, 29, 24, 25],
+  _rootRun: [function($self, $parent, zone, f) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$0();
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$0();
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$4", "_rootRun$closure", 8, 0, 30, 27, 28, 29, 31],
+  _rootRunUnary: [function($self, $parent, zone, f, arg) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$1(arg);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$1(arg);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$5", "_rootRunUnary$closure", 10, 0, 32, 27, 28, 29, 31, 33],
+  _rootRunBinary: [function($self, $parent, zone, f, arg1, arg2) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$2(arg1, arg2);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$2(arg1, arg2);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$6", "_rootRunBinary$closure", 12, 0, 34, 27, 28, 29, 31, 9, 10],
+  _rootRegisterCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterCallback$closure", 8, 0, 35, 27, 28, 29, 31],
+  _rootRegisterUnaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterUnaryCallback$closure", 8, 0, 36, 27, 28, 29, 31],
+  _rootRegisterBinaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterBinaryCallback$closure", 8, 0, 37, 27, 28, 29, 31],
+  _rootScheduleMicrotask: [function($self, $parent, zone, f) {
+    P._scheduleAsyncCallback(C.C__RootZone !== zone ? zone.bindCallback$1(f) : f);
+  }, "call$4", "_rootScheduleMicrotask$closure", 8, 0, 38],
+  _rootCreateTimer: [function($self, $parent, zone, duration, callback) {
+    return P._createTimer(duration, C.C__RootZone !== zone ? zone.bindCallback$1(callback) : callback);
+  }, "call$5", "_rootCreateTimer$closure", 10, 0, 39, 27, 28, 29, 40, 41],
+  _rootPrint: [function($self, $parent, zone, line) {
+    H.printString(line);
+  }, "call$4", "_rootPrint$closure", 8, 0, 42],
+  _printToZone: [function(line) {
+    J.print$1$x($.Zone__current, line);
+  }, "call$1", "_printToZone$closure", 2, 0, 43],
+  _rootFork: [function($self, $parent, zone, specification, zoneValues) {
+    var copiedMap;
+    $.printToZone = P._printToZone$closure();
+    copiedMap = P.HashMap_HashMap(null, null, null, null, null);
+    return new P._CustomizedZone(zone, specification, copiedMap);
+  }, "call$5", "_rootFork$closure", 10, 0, 44],
+  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
+    "^": "Closure:69;callback_0",
+    call$0: [function() {
+      H.leaveJsAsync();
+      this.callback_0.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _AsyncError: {
+    "^": "Object;error>,stackTrace<",
+    $isError: true
+  },
+  _BroadcastStream: {
+    "^": "_ControllerStream;_async$_controller"
+  },
+  _BroadcastSubscription: {
+    "^": "_ControllerSubscription;_eventState@,_async$_next@,_async$_previous@,_async$_controller,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    get$_async$_controller: function() {
+      return this._async$_controller;
+    },
+    _expectsEvent$1: function(eventId) {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 1) === eventId;
+    },
+    _toggleEventId$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$xor();
+      this._eventState = t1 ^ 1;
+    },
+    get$_isFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 2) !== 0;
+    },
+    _setRemoveAfterFiring$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$or();
+      this._eventState = t1 | 4;
+    },
+    get$_removeAfterFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 4) !== 0;
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    static: {"^": "_BroadcastSubscription__STATE_EVENT_ID,_BroadcastSubscription__STATE_FIRING,_BroadcastSubscription__STATE_REMOVE_AFTER_FIRING"}
+  },
+  _BroadcastStreamController: {
+    "^": "Object;_async$_next@,_async$_previous@",
+    get$isPaused: function() {
+      return false;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 != null)
+        return t1;
+      t1 = P._Future$(null);
+      this._doneFuture = t1;
+      return t1;
+    },
+    _removeListener$1: function(subscription) {
+      var previous, next;
+      previous = subscription.get$_async$_previous();
+      next = subscription.get$_async$_next();
+      previous.set$_async$_next(next);
+      next.set$_async$_previous(previous);
+      subscription.set$_async$_previous(subscription);
+      subscription.set$_async$_next(subscription);
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription;
+      if ((this._state & 4) !== 0) {
+        t1 = new P._DoneStreamSubscription($.Zone__current, 0, P._nullDoneHandler$closure());
+        t1.$builtinTypeInfo = this.$builtinTypeInfo;
+        t1._schedule$0();
+        return t1;
+      }
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = new P._BroadcastSubscription(null, null, null, this, null, null, null, t1, t2, null, null);
+      subscription.$builtinTypeInfo = this.$builtinTypeInfo;
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+      t2 = this._async$_previous;
+      subscription._async$_previous = t2;
+      subscription._async$_next = this;
+      t2.set$_async$_next(subscription);
+      this._async$_previous = subscription;
+      subscription._eventState = this._state & 1;
+      if (this._async$_next === subscription)
+        P._runGuarded(this._onListen);
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      if (subscription.get$_async$_next() === subscription)
+        return;
+      if (subscription.get$_isFiring())
+        subscription._setRemoveAfterFiring$0();
+      else {
+        this._removeListener$1(subscription);
+        if ((this._state & 2) === 0 && this._async$_next === this)
+          this._callOnCancel$0();
+      }
+    },
+    _recordPause$1: function(subscription) {
+    },
+    _recordResume$1: function(subscription) {
+    },
+    _addEventError$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add new events after calling close");
+      return new P.StateError("Cannot add new events while doing an addStream");
+    },
+    add$1: [function(_, data) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendData$1(data);
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T", void: true, args: [T]};
+      }, this.$receiver, "_BroadcastStreamController");
+    }, 104],
+    addError$2: [function(error, stackTrace) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendError$2(error, stackTrace);
+    }, function(error) {
+      return this.addError$2(error, null);
+    }, "addError$1", "call$2", "call$1", "get$addError", 2, 2, 105, 23, 24, 25],
+    close$0: function(_) {
+      var t1, doneFuture;
+      t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._doneFuture;
+      if (t1 >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._state = t1 | 4;
+      doneFuture = this._ensureDoneFuture$0();
+      this._sendDone$0();
+      return doneFuture;
+    },
+    _async$_add$1: function(_, data) {
+      this._sendData$1(data);
+    },
+    _addError$2: function(error, stackTrace) {
+      this._sendError$2(error, stackTrace);
+    },
+    _close$0: function() {
+      var addState = this._addStreamState;
+      this._addStreamState = null;
+      this._state &= 4294967287;
+      C.JSNull_methods.complete$0(addState);
+    },
+    _forEachListener$1: function(action) {
+      var t1, link, id, link0;
+      t1 = this._state;
+      if ((t1 & 2) !== 0)
+        throw H.wrapException(P.StateError$("Cannot fire new event. Controller is already firing an event"));
+      link = this._async$_next;
+      if (link === this)
+        return;
+      id = t1 & 1;
+      this._state = t1 ^ 3;
+      for (; link !== this;)
+        if (link._expectsEvent$1(id)) {
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$or();
+          link.set$_eventState(t1 | 2);
+          action.call$1(link);
+          link._toggleEventId$0();
+          link0 = link.get$_async$_next();
+          if (link.get$_removeAfterFiring())
+            this._removeListener$1(link);
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$and();
+          link.set$_eventState(t1 & 4294967293);
+          link = link0;
+        } else
+          link = link.get$_async$_next();
+      this._state &= 4294967293;
+      if (this._async$_next === this)
+        this._callOnCancel$0();
+    },
+    _callOnCancel$0: function() {
+      if ((this._state & 4) !== 0 && this._doneFuture._state === 0)
+        this._doneFuture._asyncComplete$1(null);
+      P._runGuarded(this._onCancel);
+    }
+  },
+  _SyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var t1 = this._async$_next;
+      if (t1 === this)
+        return;
+      if (t1.get$_async$_next() === this) {
+        this._state |= 2;
+        this._async$_next._async$_add$1(0, data);
+        this._state &= 4294967293;
+        if (this._async$_next === this)
+          this._callOnCancel$0();
+        return;
+      }
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(this, data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      if (this._async$_next === this)
+        return;
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendError_closure(this, error, stackTrace));
+    },
+    _sendDone$0: function() {
+      if (this._async$_next !== this)
+        this._forEachListener$1(new P._SyncBroadcastStreamController__sendDone_closure(this));
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  _SyncBroadcastStreamController__sendData_closure: {
+    "^": "Closure;this_0,data_1",
+    call$1: function(subscription) {
+      subscription._async$_add$1(0, this.data_1);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendError_closure: {
+    "^": "Closure;this_0,error_1,stackTrace_2",
+    call$1: function(subscription) {
+      subscription._addError$2(this.error_1, this.stackTrace_2);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendDone_closure: {
+    "^": "Closure;this_0",
+    call$1: function(subscription) {
+      subscription._close$0();
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BroadcastSubscription", args: [[P._BroadcastSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _AsyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var link, t1;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next()) {
+        t1 = new P._DelayedData(data, null);
+        t1.$builtinTypeInfo = [null];
+        link._addPending$1(t1);
+      }
+    },
+    _sendError$2: function(error, stackTrace) {
+      var link;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next())
+        link._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      var link = this._async$_next;
+      if (link !== this)
+        for (; link !== this; link = link.get$_async$_next())
+          link._addPending$1(C.C__DelayedDone);
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  Future: {
+    "^": "Object;",
+    $isFuture: true
+  },
+  Future_Future_closure: {
+    "^": "Closure:69;computation_0,result_1",
+    call$0: [function() {
+      var e, s, exception, t1;
+      try {
+        this.result_1._complete$1(this.computation_0.call$0());
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.result_1._completeError$2(e, s);
+      }
+
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Future_wait_handleError: {
+    "^": "Closure:75;box_0,eagerError_1",
+    call$2: [function(theError, theStackTrace) {
+      var t1, t2, t3;
+      t1 = this.box_0;
+      t2 = t1.values_1;
+      t1.values_1 = null;
+      t3 = --t1.remaining_2;
+      if (t2 != null)
+        if (t3 === 0 || this.eagerError_1)
+          t1.completer_0.completeError$2(theError, theStackTrace);
+        else {
+          t1.error_3 = theError;
+          t1.stackTrace_4 = theStackTrace;
+        }
+      else if (t3 === 0 && !this.eagerError_1)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$2", null, 4, 0, null, 106, 107, "call"],
+    $isFunction: true
+  },
+  Future_wait_closure: {
+    "^": "Closure:108;box_0,eagerError_2,pos_3",
+    call$1: [function(value) {
+      var t1, t2, t3, t4;
+      t1 = this.box_0;
+      t2 = --t1.remaining_2;
+      t3 = t1.values_1;
+      if (t3 != null) {
+        t4 = this.pos_3;
+        if (t4 < 0 || t4 >= t3.length)
+          return H.ioore(t3, t4);
+        t3[t4] = value;
+        if (t2 === 0) {
+          t1 = t1.completer_0.future;
+          if (t1._state !== 0)
+            H.throwExpression(P.StateError$("Future already completed"));
+          t1._asyncComplete$1(t3);
+        }
+      } else if (t2 === 0 && !this.eagerError_2)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _AsyncCompleter: {
+    "^": "_Completer;future",
+    complete$1: [function(_, value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(value);
+    }, function($receiver) {
+      return this.complete$1($receiver, null);
+    }, "complete$0", "call$1", "call$0", "get$complete", 0, 2, 109, 23, 21],
+    completeError$2: [function(error, stackTrace) {
+      var t1;
+      if (error == null)
+        throw H.wrapException(P.ArgumentError$("Error must not be null"));
+      t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncCompleteError$2(error, stackTrace);
+    }, function(error) {
+      return this.completeError$2(error, null);
+    }, "completeError$1", "call$2", "call$1", "get$completeError", 2, 2, 105, 23, 24, 25]
+  },
+  _Future: {
+    "^": "Object;_state,_zone<,_resultOrListeners,_nextListener@,_onValueCallback,_errorTestCallback,_onErrorCallback,_whenCompleteActionCallback",
+    get$_isComplete: function() {
+      return this._state >= 4;
+    },
+    get$_hasValue: function() {
+      return this._state === 4;
+    },
+    get$_hasError: function() {
+      return this._state === 8;
+    },
+    set$_isChained: function(value) {
+      if (value)
+        this._state = 2;
+      else
+        this._state = 0;
+    },
+    get$_onValue: function() {
+      return this._state === 2 ? null : this._onValueCallback;
+    },
+    get$_errorTest: function() {
+      return this._state === 2 ? null : this._errorTestCallback;
+    },
+    get$_onError: function() {
+      return this._state === 2 ? null : this._onErrorCallback;
+    },
+    get$_whenCompleteAction: function() {
+      return this._state === 2 ? null : this._whenCompleteActionCallback;
+    },
+    then$2$onError: function(f, onError) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, t1.registerUnaryCallback$1(f), null, P._registerErrorHandler(onError, $.Zone__current), null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    then$1: function(f) {
+      return this.then$2$onError(f, null);
+    },
+    catchError$2$test: function(onError, test) {
+      var t1, t2, result;
+      t1 = $.Zone__current;
+      t2 = P._registerErrorHandler(onError, t1);
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, null, $.Zone__current.registerUnaryCallback$1(test), t2, null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    catchError$1: function(onError) {
+      return this.catchError$2$test(onError, null);
+    },
+    whenComplete$1: function(action) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = new P._Future(0, t1, null, null, null, null, null, t1.registerCallback$1(action));
+      result.$builtinTypeInfo = this.$builtinTypeInfo;
+      this._addListener$1(result);
+      return result;
+    },
+    get$_async$_value: function() {
+      return this._resultOrListeners;
+    },
+    get$_error: function() {
+      return this._resultOrListeners;
+    },
+    _setValue$1: function(value) {
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
+    _setError$2: function(error, stackTrace) {
+      this._state = 8;
+      this._resultOrListeners = new P._AsyncError(error, stackTrace);
+    },
+    _addListener$1: function(listener) {
+      if (this._state >= 4)
+        this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(this, listener));
+      else {
+        listener.set$_nextListener(this._resultOrListeners);
+        this._resultOrListeners = listener;
+      }
+    },
+    _removeListeners$0: function() {
+      var current, prev, next;
+      current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      for (prev = null; current != null; prev = current, current = next) {
+        next = current.get$_nextListener();
+        current.set$_nextListener(prev);
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var t1, listeners;
+      t1 = J.getInterceptor(value);
+      if (!!t1.$isFuture)
+        if (!!t1.$is_Future)
+          P._Future__chainCoreFuture(value, this);
+        else
+          P._Future__chainForeignFuture(value, this);
+      else {
+        listeners = this._removeListeners$0();
+        this._setValue$1(value);
+        P._Future__propagateToListeners(this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var listeners = this._removeListeners$0();
+      this._setValue$1(value);
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _completeError$2: [function(error, stackTrace) {
+      var listeners = this._removeListeners$0();
+      this._setError$2(error, stackTrace);
+      P._Future__propagateToListeners(this, listeners);
+    }, function(error) {
+      return this._completeError$2(error, null);
+    }, "_completeError$1", "call$2", "call$1", "get$_completeError", 2, 2, 22, 23, 24, 25],
+    _asyncComplete$1: function(value) {
+      var t1;
+      if (value == null)
+        ;
+      else {
+        t1 = J.getInterceptor(value);
+        if (!!t1.$isFuture) {
+          if (!!t1.$is_Future) {
+            t1 = value._state;
+            if (t1 >= 4 && t1 === 8) {
+              if (this._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              this._state = 1;
+              this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure(this, value));
+            } else
+              P._Future__chainCoreFuture(value, this);
+          } else
+            P._Future__chainForeignFuture(value, this);
+          return;
+        }
+      }
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure0(this, value));
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    _async$_Future$immediate$1: function(value, $T) {
+      this._asyncComplete$1(value);
+    },
+    _async$_Future$immediateError$2: function(error, stackTrace, $T) {
+      this._asyncCompleteError$2(error, stackTrace);
+    },
+    $is_Future: true,
+    $isFuture: true,
+    static: {"^": "_Future__INCOMPLETE,_Future__PENDING_COMPLETE,_Future__CHAINED,_Future__VALUE,_Future__ERROR", _Future$: function($T) {
+        return H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+      }, _Future$immediate: function(value, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediate$1(value, $T);
+        return t1;
+      }, _Future$immediateError: function(error, stackTrace, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediateError$2(error, stackTrace, $T);
+        return t1;
+      }, _Future__chainForeignFuture: function(source, target) {
+        target.set$_isChained(true);
+        source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
+      }, _Future__chainCoreFuture: function(source, target) {
+        target.set$_isChained(true);
+        if (source._state >= 4)
+          P._Future__propagateToListeners(source, target);
+        else
+          source._addListener$1(target);
+      }, _Future__propagateMultipleListeners: function(source, listeners) {
+        var listeners0;
+        do {
+          listeners0 = listeners.get$_nextListener();
+          listeners.set$_nextListener(null);
+          P._Future__propagateToListeners(source, listeners);
+          if (listeners0 != null) {
+            listeners = listeners0;
+            continue;
+          } else
+            break;
+        } while (true);
+      }, _Future__propagateToListeners: function(source, listeners) {
+        var t1, t2, t3, hasError, asyncError, sourceValue, zone, oldZone, chainSource, listeners0;
+        t1 = {};
+        t1.source_4 = source;
+        for (t2 = source; true;) {
+          t3 = {};
+          if (!t2.get$_isComplete())
+            return;
+          hasError = t1.source_4.get$_hasError();
+          if (hasError && listeners == null) {
+            asyncError = t1.source_4.get$_error();
+            t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+            return;
+          }
+          if (listeners == null)
+            return;
+          if (listeners.get$_nextListener() != null) {
+            P._Future__propagateMultipleListeners(t1.source_4, listeners);
+            return;
+          }
+          t3.listenerHasValue_1 = true;
+          sourceValue = t1.source_4.get$_hasValue() ? t1.source_4.get$_async$_value() : null;
+          t3.listenerValueOrError_2 = sourceValue;
+          t3.isPropagationAborted_3 = false;
+          t2 = !hasError;
+          if (!t2 || listeners.get$_onValue() != null || listeners.get$_whenCompleteAction() != null) {
+            zone = listeners.get$_zone();
+            if (hasError && !t1.source_4.get$_zone().inSameErrorZone$1(zone)) {
+              asyncError = t1.source_4.get$_error();
+              t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+              return;
+            }
+            oldZone = $.Zone__current;
+            if (oldZone == null ? zone != null : oldZone !== zone)
+              $.Zone__current = zone;
+            else
+              oldZone = null;
+            if (t2) {
+              if (listeners.get$_onValue() != null)
+                t3.listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
+            } else
+              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
+            if (listeners.get$_whenCompleteAction() != null)
+              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
+            if (oldZone != null)
+              $.Zone__current = oldZone;
+            if (t3.isPropagationAborted_3)
+              return;
+            if (t3.listenerHasValue_1 === true) {
+              t2 = t3.listenerValueOrError_2;
+              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
+            } else
+              t2 = false;
+            if (t2) {
+              chainSource = t3.listenerValueOrError_2;
+              if (!!J.getInterceptor(chainSource).$is_Future)
+                if (chainSource._state >= 4) {
+                  listeners.set$_isChained(true);
+                  t1.source_4 = chainSource;
+                  t2 = chainSource;
+                  continue;
+                } else
+                  P._Future__chainCoreFuture(chainSource, listeners);
+              else
+                P._Future__chainForeignFuture(chainSource, listeners);
+              return;
+            }
+          }
+          if (t3.listenerHasValue_1 === true) {
+            listeners0 = listeners._removeListeners$0();
+            listeners._setValue$1(t3.listenerValueOrError_2);
+          } else {
+            listeners0 = listeners._removeListeners$0();
+            asyncError = t3.listenerValueOrError_2;
+            listeners._setError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+          }
+          t1.source_4 = listeners;
+          t2 = listeners;
+          listeners = listeners0;
+        }
+      }}
+  },
+  _Future__addListener_closure: {
+    "^": "Closure:69;this_0,listener_1",
+    call$0: [function() {
+      P._Future__propagateToListeners(this.this_0, this.listener_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure: {
+    "^": "Closure:13;target_0",
+    call$1: [function(value) {
+      this.target_0._completeWithValue$1(value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure0: {
+    "^": "Closure:110;target_1",
+    call$2: [function(error, stackTrace) {
+      this.target_1._completeError$2(error, stackTrace);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure: {
+    "^": "Closure:69;this_0,coreFuture_1",
+    call$0: [function() {
+      P._Future__chainCoreFuture(this.coreFuture_1, this.this_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure0: {
+    "^": "Closure:69;this_2,value_3",
+    call$0: [function() {
+      this.this_2._completeWithValue$1(this.value_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncCompleteError_closure: {
+    "^": "Closure:69;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      this.this_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleValueCallback: {
+    "^": "Closure:111;box_1,listener_3,sourceValue_4,zone_5",
+    call$0: function() {
+      var e, s, exception, t1;
+      try {
+        this.box_1.listenerValueOrError_2 = this.zone_5.runUnary$2(this.listener_3.get$_onValue(), this.sourceValue_4);
+        return true;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.box_1.listenerValueOrError_2 = new P._AsyncError(e, s);
+        return false;
+      }
+
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleError: {
+    "^": "Closure:18;box_2,box_1,listener_6,zone_7",
+    call$0: function() {
+      var asyncError, test, matchesTest, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
+      asyncError = this.box_2.source_4.get$_error();
+      t1 = this.listener_6;
+      test = t1.get$_errorTest();
+      matchesTest = true;
+      if (test != null)
+        try {
+          matchesTest = this.zone_7.runUnary$2(test, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e, s);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+      errorCallback = t1.get$_onError();
+      if (matchesTest === true && errorCallback != null) {
+        try {
+          t1 = errorCallback;
+          t2 = H.getDynamicRuntimeType();
+          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+          t3 = this.zone_7;
+          t4 = this.box_1;
+          if (t2)
+            t4.listenerValueOrError_2 = t3.runBinary$3(errorCallback, J.get$error$x(asyncError), asyncError.get$stackTrace());
+          else
+            t4.listenerValueOrError_2 = t3.runUnary$2(errorCallback, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          s0 = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e0;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e0, s0);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+        this.box_1.listenerHasValue_1 = true;
+      } else {
+        t1 = this.box_1;
+        t1.listenerValueOrError_2 = asyncError;
+        t1.listenerHasValue_1 = false;
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback: {
+    "^": "Closure:18;box_2,box_1,hasError_8,listener_9,zone_10",
+    call$0: function() {
+      var t1, e, s, exception, t2, t3;
+      t1 = {};
+      t1.completeResult_0 = null;
+      try {
+        t1.completeResult_0 = this.zone_10.run$1(this.listener_9.get$_whenCompleteAction());
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        e = t2;
+        s = new H._StackTrace(exception, null);
+        if (this.hasError_8) {
+          t2 = J.get$error$x(this.box_2.source_4.get$_error());
+          t3 = e;
+          t3 = t2 == null ? t3 == null : t2 === t3;
+          t2 = t3;
+        } else
+          t2 = false;
+        t3 = this.box_1;
+        if (t2)
+          t3.listenerValueOrError_2 = this.box_2.source_4.get$_error();
+        else
+          t3.listenerValueOrError_2 = new P._AsyncError(e, s);
+        t3.listenerHasValue_1 = false;
+      }
+
+      if (!!J.getInterceptor(t1.completeResult_0).$isFuture) {
+        t2 = this.listener_9;
+        t2.set$_isChained(true);
+        this.box_1.isPropagationAborted_3 = true;
+        t1.completeResult_0.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this.box_2, t2), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, t2));
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
+    "^": "Closure:13;box_2,listener_11",
+    call$1: [function(ignored) {
+      P._Future__propagateToListeners(this.box_2.source_4, this.listener_11);
+    }, "call$1", null, 2, 0, null, 112, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
+    "^": "Closure:110;box_0,listener_12",
+    call$2: [function(error, stackTrace) {
+      var t1, completeResult;
+      t1 = this.box_0;
+      if (!J.getInterceptor(t1.completeResult_0).$is_Future) {
+        completeResult = P._Future$(null);
+        t1.completeResult_0 = completeResult;
+        completeResult._setError$2(error, stackTrace);
+      }
+      P._Future__propagateToListeners(t1.completeResult_0, this.listener_12);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _AsyncCallbackEntry: {
+    "^": "Object;callback>,next@",
+    callback$0: function($receiver) {
+      return this.callback.call$0();
+    }
+  },
+  Stream: {
+    "^": "Object;",
+    map$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._MapStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__dynamic__T", ret: P.Stream, args: [{func: "dynamic__T", args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    expand$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._ExpandStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__Iterable__T", ret: P.Stream, args: [{func: "Iterable__T", ret: P.Iterable, args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    contains$1: function(_, needle) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_contains_closure(t1, this, needle, future), true, new P.Stream_contains_closure0(future), future.get$_completeError());
+      return future;
+    },
+    forEach$1: function(_, action) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(null);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_forEach_closure(t1, this, action, future), true, new P.Stream_forEach_closure0(future), future.get$_completeError());
+      return future;
+    },
+    any$1: function(_, test) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_any_closure(t1, this, test, future), true, new P.Stream_any_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$length: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.$int);
+      t1.count_0 = 0;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    get$isEmpty: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_isEmpty_closure(t1, future), true, new P.Stream_isEmpty_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$first: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_first_closure(t1, this, future), true, new P.Stream_first_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$last: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.result_0 = null;
+      t1.foundResult_1 = false;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_last_closure(t1, this), true, new P.Stream_last_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    $isStream: true
+  },
+  Stream_contains_closure: {
+    "^": "Closure;box_0,this_1,needle_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_contains__closure(this.needle_2, element), new P.Stream_contains__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_contains__closure: {
+    "^": "Closure:69;needle_4,element_5",
+    call$0: function() {
+      return J.$eq(this.element_5, this.needle_4);
+    },
+    $isFunction: true
+  },
+  Stream_contains__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_contains_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_forEach_closure: {
+    "^": "Closure;box_0,this_1,action_2,future_3",
+    call$1: [function(element) {
+      P._runUserCode(new P.Stream_forEach__closure(this.action_2, element), new P.Stream_forEach__closure0(), P._cancelAndErrorClosure(this.box_0.subscription_0, this.future_3));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_forEach__closure: {
+    "^": "Closure:69;action_4,element_5",
+    call$0: function() {
+      return this.action_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_forEach__closure0: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+    },
+    $isFunction: true
+  },
+  Stream_forEach_closure0: {
+    "^": "Closure:69;future_6",
+    call$0: [function() {
+      this.future_6._complete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_any_closure: {
+    "^": "Closure;box_0,this_1,test_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_any__closure(this.test_2, element), new P.Stream_any__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_any__closure: {
+    "^": "Closure:69;test_4,element_5",
+    call$0: function() {
+      return this.test_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_any__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_any_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure: {
+    "^": "Closure:13;box_0",
+    call$1: [function(_) {
+      ++this.box_0.count_0;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure0: {
+    "^": "Closure:69;box_0,future_1",
+    call$0: [function() {
+      this.future_1._complete$1(this.box_0.count_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure: {
+    "^": "Closure:13;box_0,future_1",
+    call$1: [function(_) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_1, false);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure0: {
+    "^": "Closure:69;future_2",
+    call$0: [function() {
+      this.future_2._complete$1(true);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_first_closure: {
+    "^": "Closure;box_0,this_1,future_2",
+    call$1: [function(value) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_2, value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_first_closure0: {
+    "^": "Closure:69;future_3",
+    call$0: [function() {
+      this.future_3._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_last_closure: {
+    "^": "Closure;box_0,this_1",
+    call$1: [function(value) {
+      var t1 = this.box_0;
+      t1.foundResult_1 = true;
+      t1.result_0 = value;
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_last_closure0: {
+    "^": "Closure:69;box_0,future_2",
+    call$0: [function() {
+      var t1 = this.box_0;
+      if (t1.foundResult_1) {
+        this.future_2._complete$1(t1.result_0);
+        return;
+      }
+      this.future_2._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  StreamSubscription: {
+    "^": "Object;",
+    $isStreamSubscription: true
+  },
+  _StreamController: {
+    "^": "Object;",
+    get$isPaused: function() {
+      var t1 = this._state;
+      return (t1 & 1) !== 0 ? this.get$_subscription().get$_isInputPaused() : (t1 & 2) === 0;
+    },
+    get$_pendingEvents: function() {
+      if ((this._state & 8) === 0)
+        return this._varData;
+      return this._varData.get$varData();
+    },
+    _ensurePendingEvents$0: function() {
+      var t1, state;
+      if ((this._state & 8) === 0) {
+        t1 = this._varData;
+        if (t1 == null) {
+          t1 = new P._StreamImplEvents(null, null, 0);
+          this._varData = t1;
+        }
+        return t1;
+      }
+      state = this._varData;
+      state.get$varData();
+      return state.get$varData();
+    },
+    get$_subscription: function() {
+      if ((this._state & 8) !== 0)
+        return this._varData.get$varData();
+      return this._varData;
+    },
+    _badEventState$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add event after closing");
+      return new P.StateError("Cannot add event while adding a stream");
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 == null) {
+        t1 = (this._state & 2) !== 0 ? $.get$Future__nullFuture() : P._Future$(null);
+        this._doneFuture = t1;
+      }
+      return t1;
+    },
+    add$1: [function(_, value) {
+      var t1 = this._state;
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T0", void: true, args: [T]};
+      }, this.$receiver, "_StreamController");
+    }],
+    close$0: function(_) {
+      var t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._ensureDoneFuture$0();
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      t1 |= 4;
+      this._state = t1;
+      if ((t1 & 1) !== 0)
+        this._sendDone$0();
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
+      return this._ensureDoneFuture$0();
+    },
+    _async$_add$1: function(_, value) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendError$2(error, stackTrace);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace, null));
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription, pendingEvents, addState;
+      if ((this._state & 3) !== 0)
+        throw H.wrapException(P.StateError$("Stream has already been listened to."));
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = H.setRuntimeTypeInfo(new P._ControllerSubscription(this, null, null, null, t1, t2, null, null), [null]);
+      pendingEvents = this.get$_pendingEvents();
+      t2 = this._state |= 1;
+      if ((t2 & 8) !== 0) {
+        addState = this._varData;
+        addState.set$varData(subscription);
+        addState.resume$0(0);
+      } else
+        this._varData = subscription;
+      subscription._setPendingEvents$1(pendingEvents);
+      subscription._guardCallback$1(new P._StreamController__subscribe_closure(this));
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      var result, e, s, exception, t1, result0;
+      result = null;
+      if ((this._state & 8) !== 0)
+        result = this._varData.cancel$0();
+      this._varData = null;
+      this._state = this._state & 4294967286 | 2;
+      if (this.get$_onCancel() != null)
+        if (result == null)
+          try {
+            result = this._onCancel$0();
+          } catch (exception) {
+            t1 = H.unwrapException(exception);
+            e = t1;
+            s = new H._StackTrace(exception, null);
+            result0 = P._Future$(null);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+
+        else
+          result = result.whenComplete$1(this.get$_onCancel());
+      t1 = new P._StreamController__recordCancel_complete(this);
+      if (result != null)
+        result = result.whenComplete$1(t1);
+      else
+        t1.call$0();
+      return result;
+    },
+    _recordPause$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.pause$0(0);
+      P._runGuarded(this.get$_onPause());
+    },
+    _recordResume$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.resume$0(0);
+      P._runGuarded(this.get$_onResume());
+    }
+  },
+  _StreamController__subscribe_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      P._runGuarded(this.this_0.get$_onListen());
+    },
+    $isFunction: true
+  },
+  _StreamController__recordCancel_complete: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1 = this.this_0._doneFuture;
+      if (t1 != null && t1._state === 0)
+        t1._asyncComplete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _SyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._async$_add$1(0, data);
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addError$2(error, stackTrace);
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._close$0();
+    }
+  },
+  _AsyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._addPending$1(C.C__DelayedDone);
+    }
+  },
+  _AsyncStreamController: {
+    "^": "_StreamController__AsyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__AsyncStreamControllerDispatch: {
+    "^": "_StreamController+_AsyncStreamControllerDispatch;"
+  },
+  _SyncStreamController: {
+    "^": "_StreamController__SyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__SyncStreamControllerDispatch: {
+    "^": "_StreamController+_SyncStreamControllerDispatch;"
+  },
+  _ControllerStream: {
+    "^": "_StreamImpl;_async$_controller",
+    _createSubscription$1: function(cancelOnError) {
+      return this._async$_controller._subscribe$1(cancelOnError);
+    },
+    get$hashCode: function(_) {
+      return (H.Primitives_objectHashCode(this._async$_controller) ^ 892482866) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$is_ControllerStream)
+        return false;
+      return other._async$_controller === this._async$_controller;
+    },
+    $is_ControllerStream: true
+  },
+  _ControllerSubscription: {
+    "^": "_BufferingStreamSubscription;_async$_controller<,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _onCancel$0: function() {
+      return this.get$_async$_controller()._recordCancel$1(this);
+    },
+    _onPause$0: [function() {
+      this.get$_async$_controller()._recordPause$1(this);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      this.get$_async$_controller()._recordResume$1(this);
+    }, "call$0", "get$_onResume", 0, 0, 18]
+  },
+  _EventSink: {
+    "^": "Object;"
+  },
+  _BufferingStreamSubscription: {
+    "^": "Object;_onData,_onError<,_onDone,_zone<,_state,_cancelFuture,_pending",
+    _setPendingEvents$1: function(pendingEvents) {
+      if (pendingEvents == null)
+        return;
+      this._pending = pendingEvents;
+      if (!pendingEvents.get$isEmpty(pendingEvents)) {
+        this._state = (this._state | 64) >>> 0;
+        this._pending.schedule$1(this);
+      }
+    },
+    onData$1: function(handleData) {
+      this._onData = this._zone.registerUnaryCallback$1(handleData);
+    },
+    onError$1: function(_, handleError) {
+      if (handleError == null)
+        handleError = P._nullErrorHandler$closure();
+      this._onError = P._registerErrorHandler(handleError, this._zone);
+    },
+    onDone$1: function(handleDone) {
+      if (handleDone == null)
+        handleDone = P._nullDoneHandler$closure();
+      this._onDone = this._zone.registerCallback$1(handleDone);
+    },
+    pause$1: [function(_, resumeSignal) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      this._state = (t1 + 128 | 4) >>> 0;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+      if (t1 < 128 && this._pending != null)
+        this._pending.cancelSchedule$0();
+      if ((t1 & 4) === 0 && (this._state & 32) === 0)
+        this._guardCallback$1(this.get$_onPause());
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 >= 128) {
+        t1 -= 128;
+        this._state = t1;
+        if (t1 < 128) {
+          if ((t1 & 64) !== 0) {
+            t1 = this._pending;
+            t1 = !t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+          if (t1)
+            this._pending.schedule$1(this);
+          else {
+            t1 = (this._state & 4294967291) >>> 0;
+            this._state = t1;
+            if ((t1 & 32) === 0)
+              this._guardCallback$1(this.get$_onResume());
+          }
+        }
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      var t1 = (this._state & 4294967279) >>> 0;
+      this._state = t1;
+      if ((t1 & 8) !== 0)
+        return this._cancelFuture;
+      this._cancel$0();
+      return this._cancelFuture;
+    },
+    get$_isInputPaused: function() {
+      return (this._state & 4) !== 0;
+    },
+    get$isPaused: function() {
+      return this._state >= 128;
+    },
+    _cancel$0: function() {
+      var t1 = (this._state | 8) >>> 0;
+      this._state = t1;
+      if ((t1 & 64) !== 0)
+        this._pending.cancelSchedule$0();
+      if ((this._state & 32) === 0)
+        this._pending = null;
+      this._cancelFuture = this._onCancel$0();
+    },
+    _async$_add$1: function(_, data) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendData$1(data);
+      else
+        this._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendError$2(error, stackTrace);
+      else
+        this._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _close$0: function() {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t1 = (t1 | 2) >>> 0;
+      this._state = t1;
+      if (t1 < 32)
+        this._sendDone$0();
+      else
+        this._addPending$1(C.C__DelayedDone);
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+    },
+    _addPending$1: function($event) {
+      var pending, t1;
+      pending = this._pending;
+      if (pending == null) {
+        pending = new P._StreamImplEvents(null, null, 0);
+        this._pending = pending;
+      }
+      pending.add$1(0, $event);
+      t1 = this._state;
+      if ((t1 & 64) === 0) {
+        t1 = (t1 | 64) >>> 0;
+        this._state = t1;
+        if (t1 < 128)
+          this._pending.schedule$1(this);
+      }
+    },
+    _sendData$1: function(data) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      this._zone.runUnaryGuarded$2(this._onData, data);
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _sendError$2: function(error, stackTrace) {
+      var t1, t2;
+      t1 = this._state;
+      t2 = new P._BufferingStreamSubscription__sendError_sendError(this, error, stackTrace);
+      if ((t1 & 1) !== 0) {
+        this._state = (t1 | 16) >>> 0;
+        this._cancel$0();
+        t1 = this._cancelFuture;
+        if (!!J.getInterceptor(t1).$isFuture)
+          t1.whenComplete$1(t2);
+        else
+          t2.call$0();
+      } else {
+        t2.call$0();
+        this._checkState$1((t1 & 4) !== 0);
+      }
+    },
+    _sendDone$0: function() {
+      var t1, t2;
+      t1 = new P._BufferingStreamSubscription__sendDone_sendDone(this);
+      this._cancel$0();
+      this._state = (this._state | 16) >>> 0;
+      t2 = this._cancelFuture;
+      if (!!J.getInterceptor(t2).$isFuture)
+        t2.whenComplete$1(t1);
+      else
+        t1.call$0();
+    },
+    _guardCallback$1: function(callback) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      callback.call$0();
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _checkState$1: function(wasInputPaused) {
+      var t1, isInputPaused;
+      if ((this._state & 64) !== 0) {
+        t1 = this._pending;
+        t1 = t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = (this._state & 4294967231) >>> 0;
+        this._state = t1;
+        if ((t1 & 4) !== 0)
+          if (t1 < 128) {
+            t1 = this._pending;
+            t1 = t1 == null || t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          this._state = (this._state & 4294967291) >>> 0;
+      }
+      for (; true; wasInputPaused = isInputPaused) {
+        t1 = this._state;
+        if ((t1 & 8) !== 0) {
+          this._pending = null;
+          return;
+        }
+        isInputPaused = (t1 & 4) !== 0;
+        if (wasInputPaused === isInputPaused)
+          break;
+        this._state = (t1 ^ 32) >>> 0;
+        if (isInputPaused)
+          this._onPause$0();
+        else
+          this._onResume$0();
+        this._state = (this._state & 4294967263) >>> 0;
+      }
+      t1 = this._state;
+      if ((t1 & 64) !== 0 && t1 < 128)
+        this._pending.schedule$1(this);
+    },
+    $isStreamSubscription: true,
+    static: {"^": "_BufferingStreamSubscription__STATE_CANCEL_ON_ERROR,_BufferingStreamSubscription__STATE_CLOSED,_BufferingStreamSubscription__STATE_INPUT_PAUSED,_BufferingStreamSubscription__STATE_CANCELED,_BufferingStreamSubscription__STATE_WAIT_FOR_CANCEL,_BufferingStreamSubscription__STATE_IN_CALLBACK,_BufferingStreamSubscription__STATE_HAS_PENDING,_BufferingStreamSubscription__STATE_PAUSE_COUNT,_BufferingStreamSubscription__STATE_PAUSE_COUNT_SHIFT"}
+  },
+  _BufferingStreamSubscription__sendError_sendError: {
+    "^": "Closure:18;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 32) >>> 0;
+      t2 = t1._zone;
+      if (!t2.inSameErrorZone$1($.Zone__current))
+        $.Zone__current.handleUncaughtError$2(this.error_1, this.stackTrace_2);
+      else {
+        t3 = t1._onError;
+        t4 = H.getDynamicRuntimeType();
+        t4 = H.buildFunctionType(t4, [t4, t4])._isTest$1(t3);
+        t5 = t1._onError;
+        t6 = this.error_1;
+        if (t4)
+          t2.runBinaryGuarded$3(t5, t6, this.stackTrace_2);
+        else
+          t2.runUnaryGuarded$2(t5, t6);
+      }
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BufferingStreamSubscription__sendDone_sendDone: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 42) >>> 0;
+      t1._zone.runGuarded$1(t1._onDone);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImpl: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var subscription = this._createSubscription$1(true === cancelOnError);
+      subscription.onData$1(onData);
+      subscription.onError$1(0, onError);
+      subscription.onDone$1(onDone);
+      return subscription;
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    _createSubscription$1: function(cancelOnError) {
+      var t1, t2;
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      t2 = new P._BufferingStreamSubscription(null, null, null, t1, t2, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    }
+  },
+  _DelayedEvent: {
+    "^": "Object;next@"
+  },
+  _DelayedData: {
+    "^": "_DelayedEvent;value>,next",
+    perform$1: function(dispatch) {
+      dispatch._sendData$1(this.value);
+    }
+  },
+  _DelayedError: {
+    "^": "_DelayedEvent;error>,stackTrace<,next",
+    perform$1: function(dispatch) {
+      dispatch._sendError$2(this.error, this.stackTrace);
+    }
+  },
+  _DelayedDone: {
+    "^": "Object;",
+    perform$1: function(dispatch) {
+      dispatch._sendDone$0();
+    },
+    get$next: function() {
+      return;
+    },
+    set$next: function(_) {
+      throw H.wrapException(P.StateError$("No events after a done."));
+    }
+  },
+  _PendingEvents: {
+    "^": "Object;",
+    schedule$1: function(dispatch) {
+      var t1 = this._state;
+      if (t1 === 1)
+        return;
+      if (t1 >= 1) {
+        this._state = 1;
+        return;
+      }
+      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(this, dispatch));
+      this._state = 1;
+    },
+    cancelSchedule$0: function() {
+      if (this._state === 1)
+        this._state = 3;
+    }
+  },
+  _PendingEvents_schedule_closure: {
+    "^": "Closure:69;this_0,dispatch_1",
+    call$0: [function() {
+      var t1, oldState;
+      t1 = this.this_0;
+      oldState = t1._state;
+      t1._state = 0;
+      if (oldState === 3)
+        return;
+      t1.handleNext$1(this.dispatch_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImplEvents: {
+    "^": "_PendingEvents;firstPendingEvent,lastPendingEvent,_state",
+    get$isEmpty: function(_) {
+      return this.lastPendingEvent == null;
+    },
+    add$1: function(_, $event) {
+      var t1 = this.lastPendingEvent;
+      if (t1 == null) {
+        this.lastPendingEvent = $event;
+        this.firstPendingEvent = $event;
+      } else {
+        t1.set$next($event);
+        this.lastPendingEvent = $event;
+      }
+    },
+    handleNext$1: function(dispatch) {
+      var $event, t1;
+      $event = this.firstPendingEvent;
+      t1 = $event.get$next();
+      this.firstPendingEvent = t1;
+      if (t1 == null)
+        this.lastPendingEvent = null;
+      $event.perform$1(dispatch);
+    },
+    clear$0: function(_) {
+      if (this._state === 1)
+        this._state = 3;
+      this.lastPendingEvent = null;
+      this.firstPendingEvent = null;
+    }
+  },
+  _DoneStreamSubscription: {
+    "^": "Object;_zone<,_state,_onDone",
+    get$isPaused: function() {
+      return this._state >= 4;
+    },
+    _schedule$0: function() {
+      if ((this._state & 2) !== 0)
+        return;
+      this._zone.scheduleMicrotask$1(this.get$_sendDone());
+      this._state = (this._state | 2) >>> 0;
+    },
+    onData$1: function(handleData) {
+    },
+    onError$1: function(_, handleError) {
+    },
+    onDone$1: function(handleDone) {
+      this._onDone = handleDone;
+    },
+    pause$1: [function(_, resumeSignal) {
+      this._state += 4;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if (t1 >= 4) {
+        t1 -= 4;
+        this._state = t1;
+        if (t1 < 4 && (t1 & 1) === 0)
+          this._schedule$0();
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      return;
+    },
+    _sendDone$0: [function() {
+      var t1 = (this._state & 4294967293) >>> 0;
+      this._state = t1;
+      if (t1 >= 4)
+        return;
+      this._state = (t1 | 1) >>> 0;
+      t1 = this._onDone;
+      if (t1 != null)
+        this._zone.runGuarded$1(t1);
+    }, "call$0", "get$_sendDone", 0, 0, 18],
+    $isStreamSubscription: true,
+    static: {"^": "_DoneStreamSubscription__DONE_SENT,_DoneStreamSubscription__SCHEDULED,_DoneStreamSubscription__PAUSED"}
+  },
+  _cancelAndError_closure: {
+    "^": "Closure:69;future_0,error_1,stackTrace_2",
+    call$0: [function() {
+      return this.future_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _cancelAndErrorClosure_closure: {
+    "^": "Closure:118;subscription_0,future_1",
+    call$2: function(error, stackTrace) {
+      return P._cancelAndError(this.subscription_0, this.future_1, error, stackTrace);
+    },
+    $isFunction: true
+  },
+  _cancelAndValue_closure: {
+    "^": "Closure:69;future_0,value_1",
+    call$0: [function() {
+      return this.future_0._complete$1(this.value_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _ForwardingStream: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1, t2, t3, t4, result;
+      cancelOnError = true === cancelOnError;
+      t1 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 0);
+      t2 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 1);
+      t3 = $.Zone__current;
+      t4 = cancelOnError ? 1 : 0;
+      result = H.setRuntimeTypeInfo(new P._ForwardingStreamSubscription(this, null, null, null, null, t3, t4, null, null), [t1, t2]);
+      result._ForwardingStreamSubscription$2(this, cancelOnError, t1, t2);
+      result.onData$1(onData);
+      result.onError$1(0, onError);
+      result.onDone$1(onDone);
+      return result;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    _handleData$2: function(data, sink) {
+      sink._async$_add$1(0, data);
+    },
+    $asStream: function($S, $T) {
+      return [$T];
+    }
+  },
+  _ForwardingStreamSubscription: {
+    "^": "_BufferingStreamSubscription;_stream,_subscription,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _async$_add$1: function(_, data) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._async$_add$1.call(this, this, data);
+    },
+    _addError$2: function(error, stackTrace) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._addError$2.call(this, error, stackTrace);
+    },
+    _onPause$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.pause$0(0);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.resume$0(0);
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null) {
+        this._subscription = null;
+        t1.cancel$0();
+      }
+      return;
+    },
+    _handleData$1: [function(data) {
+      this._stream._handleData$2(data, this);
+    }, "call$1", "get$_handleData", 2, 0, function() {
+      return H.computeSignature(function(S, T) {
+        return {func: "void__S", void: true, args: [S]};
+      }, this.$receiver, "_ForwardingStreamSubscription");
+    }, 104],
+    _handleError$2: [function(error, stackTrace) {
+      this._addError$2(error, stackTrace);
+    }, "call$2", "get$_handleError", 4, 0, 119, 24, 25],
+    _handleDone$0: [function() {
+      this._close$0();
+    }, "call$0", "get$_handleDone", 0, 0, 18],
+    _ForwardingStreamSubscription$2: function(_stream, cancelOnError, $S, $T) {
+      var t1, t2;
+      t1 = this.get$_handleData();
+      t2 = this.get$_handleError();
+      this._subscription = this._stream._async$_source.listen$3$onDone$onError(t1, this.get$_handleDone(), t2);
+    },
+    $as_BufferingStreamSubscription: function($S, $T) {
+      return [$T];
+    },
+    $asStreamSubscription: function($S, $T) {
+      return [$T];
+    }
+  },
+  _WhereStream: {
+    "^": "_ForwardingStream;_test,_async$_source",
+    _test$1: function(arg0) {
+      return this._test.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var satisfies, e, s, exception, t1;
+      satisfies = null;
+      try {
+        satisfies = this._test$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      if (satisfies === true)
+        J._async$_add$1$x(sink, inputEvent);
+    },
+    $as_ForwardingStream: function($T) {
+      return [$T, $T];
+    },
+    $asStream: null
+  },
+  _MapStream: {
+    "^": "_ForwardingStream;_transform,_async$_source",
+    _transform$1: function(arg0) {
+      return this._transform.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var outputEvent, e, s, exception, t1;
+      outputEvent = null;
+      try {
+        outputEvent = this._transform$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      J._async$_add$1$x(sink, outputEvent);
+    }
+  },
+  _ExpandStream: {
+    "^": "_ForwardingStream;_expand,_async$_source",
+    _expand$1: function(arg0) {
+      return this._expand.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var value, e, s, t1, exception;
+      try {
+        for (t1 = J.get$iterator$ax(this._expand$1(inputEvent)); t1.moveNext$0();) {
+          value = t1.get$current();
+          J._async$_add$1$x(sink, value);
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+      }
+
+    }
+  },
+  Timer: {
+    "^": "Object;"
+  },
+  ZoneSpecification: {
+    "^": "Object;"
+  },
+  _ZoneSpecification: {
+    "^": "Object;handleUncaughtError<,run<,runUnary<,runBinary<,registerCallback<,registerUnaryCallback<,registerBinaryCallback<,scheduleMicrotask<,createTimer<,createPeriodicTimer,print>,fork<",
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.handleUncaughtError.call$2(arg0, arg1);
+    },
+    run$1: function(arg0) {
+      return this.run.call$1(arg0);
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.runUnary.call$2(arg0, arg1);
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.runBinary.call$3(arg0, arg1, arg2);
+    },
+    registerCallback$1: function(arg0) {
+      return this.registerCallback.call$1(arg0);
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.registerUnaryCallback.call$1(arg0);
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.registerBinaryCallback.call$1(arg0);
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.scheduleMicrotask.call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.scheduleMicrotask.call$2(arg0, arg1);
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.createTimer.call$2(arg0, arg1);
+    },
+    print$1: function($receiver, arg0) {
+      return this.print.call$1(arg0);
+    },
+    fork$1$specification: function(arg0) {
+      return this.fork.call$1$specification(arg0);
+    }
+  },
+  ZoneDelegate: {
+    "^": "Object;"
+  },
+  Zone: {
+    "^": "Object;"
+  },
+  _ZoneDelegate: {
+    "^": "Object;_degelationTarget",
+    get$_zone: function() {
+      return this._degelationTarget;
+    },
+    handleUncaughtError$3: function(zone, error, stackTrace) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$handleUncaughtError() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$handleUncaughtError().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, error, stackTrace);
+    },
+    run$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$run() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$run().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    runUnary$3: function(zone, f, arg) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runUnary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runUnary().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg);
+    },
+    runBinary$4: function(zone, f, arg1, arg2) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runBinary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runBinary().call$6($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg1, arg2);
+    },
+    registerCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerUnaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerUnaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerUnaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerBinaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerBinaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerBinaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    scheduleMicrotask$2: function(zone, f) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$scheduleMicrotask() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      $parent.get$_specification().get$scheduleMicrotask().call$4($parent, new P._ZoneDelegate(t1), zone, f);
+    },
+    createTimer$3: function(zone, duration, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$createTimer() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$createTimer().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, duration, f);
+    },
+    print$2: function(_, zone, line) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; t1 = $parent.get$_specification(), t1.get$print(t1) == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$_specification();
+      t1.get$print(t1).call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, line);
+    },
+    fork$3: function(zone, specification, zoneValues) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$fork() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      return $parent.get$_specification().get$fork().call$5($parent, new P._ZoneDelegate(t1), zone, specification, zoneValues);
+    }
+  },
+  _BaseZone: {
+    "^": "Object;",
+    inSameErrorZone$1: function(otherZone) {
+      return this.get$_errorZone() === otherZone.get$_errorZone();
+    },
+    runGuarded$1: function(f) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.run$1(f);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runUnaryGuarded$2: function(f, arg) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runUnary$2(f, arg);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runBinaryGuarded$3: function(f, arg1, arg2) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runBinary$3(f, arg1, arg2);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    bindCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindCallback_closure0(this, registered);
+    },
+    bindCallback$1: function(f) {
+      return this.bindCallback$2$runGuarded(f, true);
+    },
+    bindUnaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerUnaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindUnaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindUnaryCallback_closure0(this, registered);
+    },
+    bindBinaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerBinaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindBinaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindBinaryCallback_closure0(this, registered);
+    }
+  },
+  _BaseZone_bindCallback_closure: {
+    "^": "Closure:69;this_0,registered_1",
+    call$0: [function() {
+      return this.this_0.runGuarded$1(this.registered_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindCallback_closure0: {
+    "^": "Closure:69;this_2,registered_3",
+    call$0: [function() {
+      return this.this_2.run$1(this.registered_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure: {
+    "^": "Closure:13;this_0,registered_1",
+    call$1: [function(arg) {
+      return this.this_0.runUnaryGuarded$2(this.registered_1, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure0: {
+    "^": "Closure:13;this_2,registered_3",
+    call$1: [function(arg) {
+      return this.this_2.runUnary$2(this.registered_3, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure: {
+    "^": "Closure:75;this_0,registered_1",
+    call$2: [function(arg1, arg2) {
+      return this.this_0.runBinaryGuarded$3(this.registered_1, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure0: {
+    "^": "Closure:75;this_2,registered_3",
+    call$2: [function(arg1, arg2) {
+      return this.this_2.runBinary$3(this.registered_3, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _CustomizedZone: {
+    "^": "_BaseZone;parent>,_specification<,_async$_map",
+    get$_errorZone: function() {
+      return this.parent.get$_errorZone();
+    },
+    $index: function(_, key) {
+      var t1, result;
+      t1 = this._async$_map;
+      result = t1.$index(0, key);
+      if (result != null || t1.containsKey$1(key))
+        return result;
+      return this.parent.$index(0, key);
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return new P._ZoneDelegate(this).handleUncaughtError$3(this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return new P._ZoneDelegate(this).fork$3(this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return new P._ZoneDelegate(this).run$2(this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return new P._ZoneDelegate(this).runUnary$3(this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return new P._ZoneDelegate(this).runBinary$4(this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerCallback$2(this, f);
+    },
+    registerUnaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerUnaryCallback$2(this, f);
+    },
+    registerBinaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerBinaryCallback$2(this, f);
+    },
+    scheduleMicrotask$1: function(f) {
+      new P._ZoneDelegate(this).scheduleMicrotask$2(this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return new P._ZoneDelegate(this).createTimer$3(this, duration, f);
+    },
+    print$1: function(_, line) {
+      new P._ZoneDelegate(this).print$2(0, this, line);
+    }
+  },
+  _rootHandleUncaughtError_closure: {
+    "^": "Closure:69;error_0,stackTrace_1",
+    call$0: [function() {
+      P._scheduleAsyncCallback(new P._rootHandleUncaughtError__closure(this.error_0, this.stackTrace_1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootHandleUncaughtError__closure: {
+    "^": "Closure:69;error_2,stackTrace_3",
+    call$0: [function() {
+      var t1, trace;
+      t1 = this.error_2;
+      P.print("Uncaught Error: " + H.S(t1));
+      trace = this.stackTrace_3;
+      if (trace == null && !!J.getInterceptor(t1).$isError)
+        trace = t1.get$stackTrace();
+      if (trace != null)
+        P.print("Stack Trace: \n" + H.S(trace) + "\n");
+      throw H.wrapException(t1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootFork_closure: {
+    "^": "Closure:75;copiedMap_0",
+    call$2: [function(key, value) {
+      this.copiedMap_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true
+  },
+  _RootZoneSpecification: {
+    "^": "Object;",
+    get$handleUncaughtError: function() {
+      return P._rootHandleUncaughtError$closure();
+    },
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.get$handleUncaughtError().call$2(arg0, arg1);
+    },
+    get$run: function() {
+      return P._rootRun$closure();
+    },
+    run$1: function(arg0) {
+      return this.get$run().call$1(arg0);
+    },
+    get$runUnary: function() {
+      return P._rootRunUnary$closure();
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.get$runUnary().call$2(arg0, arg1);
+    },
+    get$runBinary: function() {
+      return P._rootRunBinary$closure();
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.get$runBinary().call$3(arg0, arg1, arg2);
+    },
+    get$registerCallback: function() {
+      return P._rootRegisterCallback$closure();
+    },
+    registerCallback$1: function(arg0) {
+      return this.get$registerCallback().call$1(arg0);
+    },
+    get$registerUnaryCallback: function() {
+      return P._rootRegisterUnaryCallback$closure();
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.get$registerUnaryCallback().call$1(arg0);
+    },
+    get$registerBinaryCallback: function() {
+      return P._rootRegisterBinaryCallback$closure();
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.get$registerBinaryCallback().call$1(arg0);
+    },
+    get$scheduleMicrotask: function() {
+      return P._rootScheduleMicrotask$closure();
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.get$scheduleMicrotask().call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.get$scheduleMicrotask().call$2(arg0, arg1);
+    },
+    get$createTimer: function() {
+      return P._rootCreateTimer$closure();
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.get$createTimer().call$2(arg0, arg1);
+    },
+    get$print: function(_) {
+      return P._rootPrint$closure();
+    },
+    print$1: function($receiver, arg0) {
+      return this.get$print(this).call$1(arg0);
+    },
+    get$fork: function() {
+      return P._rootFork$closure();
+    },
+    fork$1$specification: function(arg0) {
+      return this.get$fork().call$1$specification(arg0);
+    }
+  },
+  _RootZone: {
+    "^": "_BaseZone;",
+    get$parent: function(_) {
+      return;
+    },
+    get$_specification: function() {
+      return C.C__RootZoneSpecification;
+    },
+    get$_errorZone: function() {
+      return this;
+    },
+    inSameErrorZone$1: function(otherZone) {
+      return otherZone.get$_errorZone() === this;
+    },
+    $index: function(_, key) {
+      return;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return P._rootHandleUncaughtError(this, null, this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return P._rootFork(this, null, this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return P._rootRun(this, null, this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return P._rootRunUnary(this, null, this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return P._rootRunBinary(this, null, this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return f;
+    },
+    registerUnaryCallback$1: function(f) {
+      return f;
+    },
+    registerBinaryCallback$1: function(f) {
+      return f;
+    },
+    scheduleMicrotask$1: function(f) {
+      P._rootScheduleMicrotask(this, null, this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return P._rootCreateTimer(this, null, this, duration, f);
+    },
+    print$1: function(_, line) {
+      H.printString(line);
+      return;
+    }
+  }
+}],
+["dart.collection", "dart:collection", , P, {
+  "^": "",
+  LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
+    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]));
+  },
+  LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  _defaultEquals: [function(a, b) {
+    return J.$eq(a, b);
+  }, "call$2", "_defaultEquals$closure", 4, 0, 45, 46, 47],
+  _defaultHashCode: [function(a) {
+    return J.get$hashCode$(a);
+  }, "call$1", "_defaultHashCode$closure", 2, 0, 48, 46],
+  HashMap_HashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    var t1;
+    if (equals == null) {
+      t1 = new P._HashMap(0, null, null, null, null);
+      t1.$builtinTypeInfo = [$K, $V];
+      return t1;
+    }
+    hashCode = P._defaultHashCode$closure();
+    return P._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
+  },
+  HashMap_HashMap$identity: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._IdentityHashMap(0, null, null, null, null), [$K, $V]);
+  },
+  HashSet_HashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._HashSet(0, null, null, null, null), [$E]);
+  },
+  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+    var parts, t1;
+    if (P.IterableBase__isToStringVisiting(iterable)) {
+      if (leftDelimiter === "(" && rightDelimiter === ")")
+        return "(...)";
+      return leftDelimiter + "..." + rightDelimiter;
+    }
+    parts = [];
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      P.IterableBase__iterablePartsToStrings(iterable, parts);
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = P.StringBuffer$(leftDelimiter);
+    t1.writeAll$2(parts, ", ");
+    t1.write$1(rightDelimiter);
+    return t1._contents;
+  },
+  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+    var buffer, t1;
+    if (P.IterableBase__isToStringVisiting(iterable))
+      return leftDelimiter + "..." + rightDelimiter;
+    buffer = P.StringBuffer$(leftDelimiter);
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      buffer.writeAll$2(iterable, ", ");
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    buffer.write$1(rightDelimiter);
+    return buffer.get$_contents();
+  },
+  IterableBase__isToStringVisiting: function(o) {
+    var i, t1;
+    for (i = 0; t1 = $.get$IterableBase__toStringVisiting(), i < t1.length; ++i)
+      if (o === t1[i])
+        return true;
+    return false;
+  },
+  IterableBase__iterablePartsToStrings: function(iterable, parts) {
+    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
+    it = iterable.get$iterator(iterable);
+    $length = 0;
+    count = 0;
+    while (true) {
+      if (!($length < 80 || count < 3))
+        break;
+      if (!it.moveNext$0())
+        return;
+      next = H.S(it.get$current());
+      parts.push(next);
+      $length += next.length + 2;
+      ++count;
+    }
+    if (!it.moveNext$0()) {
+      if (count <= 5)
+        return;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      ultimateString = parts.pop();
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      penultimateString = parts.pop();
+    } else {
+      penultimate = it.get$current();
+      ++count;
+      if (!it.moveNext$0()) {
+        if (count <= 4) {
+          parts.push(H.S(penultimate));
+          return;
+        }
+        ultimateString = H.S(penultimate);
+        if (0 >= parts.length)
+          return H.ioore(parts, 0);
+        penultimateString = parts.pop();
+        $length += ultimateString.length + 2;
+      } else {
+        ultimate = it.get$current();
+        ++count;
+        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+          ultimate0 = it.get$current();
+          ++count;
+          if (count > 100) {
+            while (true) {
+              if (!($length > 75 && count > 3))
+                break;
+              if (0 >= parts.length)
+                return H.ioore(parts, 0);
+              $length -= parts.pop().length + 2;
+              --count;
+            }
+            parts.push("...");
+            return;
+          }
+        }
+        penultimateString = H.S(penultimate);
+        ultimateString = H.S(ultimate);
+        $length += ultimateString.length + penultimateString.length + 4;
+      }
+    }
+    if (count > parts.length + 2) {
+      $length += 5;
+      elision = "...";
+    } else
+      elision = null;
+    while (true) {
+      if (!($length > 80 && parts.length > 3))
+        break;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      $length -= parts.pop().length + 2;
+      if (elision == null) {
+        $length += 5;
+        elision = "...";
+      }
+    }
+    if (elision != null)
+      parts.push(elision);
+    parts.push(penultimateString);
+    parts.push(ultimateString);
+  },
+  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
+  },
+  Maps_mapToString: function(m) {
+    var t1, result;
+    t1 = {};
+    if (P.IterableBase__isToStringVisiting(m))
+      return "{...}";
+    result = P.StringBuffer$("");
+    try {
+      $.get$IterableBase__toStringVisiting().push(m);
+      result.write$1("{");
+      t1.first_0 = true;
+      J.forEach$1$ax(m, new P.Maps_mapToString_closure(t1, result));
+      result.write$1("}");
+    } finally {
+      t1 = $.get$IterableBase__toStringVisiting();
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    return result.get$_contents();
+  },
+  _HashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._HashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        return nums == null ? false : nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P._HashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, t1, entry, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          t1 = null;
+        else {
+          entry = strings[key];
+          t1 = entry === strings ? null : entry;
+        }
+        return t1;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          t1 = null;
+        else {
+          entry = nums[key];
+          t1 = entry === nums ? null : entry;
+        }
+        return t1;
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      return index < 0 ? null : bucket[index + 1];
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._HashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._HashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null) {
+        P._HashMap__setTableEntry(rest, hash, [key, value]);
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      } else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index + 1] = value;
+        else {
+          bucket.push(key, value);
+          ++this._collection$_length;
+          this._collection$_keys = null;
+        }
+      }
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      --this._collection$_length;
+      this._collection$_keys = null;
+      return bucket.splice(index, 2)[1];
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._collection$_keys = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    forEach$1: function(_, action) {
+      var keys, $length, i, key;
+      keys = this._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        key = keys[i];
+        action.call$2(key, this.$index(0, key));
+        if (keys !== this._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    _computeKeys$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._collection$_keys;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; i0 += 2) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._collection$_keys = result;
+      return result;
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      if (table[key] == null) {
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      }
+      P._HashMap__setTableEntry(table, key, value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var value;
+      if (table != null && table[key] != null) {
+        value = P._HashMap__getTableEntry(table, key);
+        delete table[key];
+        --this._collection$_length;
+        this._collection$_keys = null;
+        return value;
+      } else
+        return;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (J.$eq(bucket[i], key))
+          return i;
+      return -1;
+    },
+    $isMap: true,
+    static: {_HashMap__getTableEntry: function(table, key) {
+        var entry = table[key];
+        return entry === table ? null : entry;
+      }, _HashMap__setTableEntry: function(table, key, value) {
+        if (value == null)
+          table[key] = table;
+        else
+          table[key] = value;
+      }, _HashMap__newHashTable: function() {
+        var table = Object.create(null);
+        P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _HashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _HashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V", args: [K, V]};
+      }, this.this_0, "_HashMap");
+    }
+  },
+  _IdentityHashMap: {
+    "^": "_HashMap;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _computeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2) {
+        t1 = bucket[i];
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  },
+  _CustomHashMap: {
+    "^": "_HashMap;_equals,_hashCode,_validKey,_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _equals$2: function(arg0, arg1) {
+      return this._equals.call$2(arg0, arg1);
+    },
+    _hashCode$1: function(arg0) {
+      return this._hashCode.call$1(arg0);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    $index: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._get$1.call(this, key);
+    },
+    $indexSet: function(_, key, value) {
+      P._HashMap.prototype._set$2.call(this, key, value);
+    },
+    containsKey$1: function(key) {
+      if (this._validKey$1(key) !== true)
+        return false;
+      return P._HashMap.prototype._containsKey$1.call(this, key);
+    },
+    remove$1: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._remove$1.call(this, key);
+    },
+    _computeHashCode$1: function(key) {
+      return this._hashCode$1(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (this._equals$2(bucket[i], key) === true)
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    static: {_CustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
+        var t1 = new P._CustomHashMap_closure($K);
+        return H.setRuntimeTypeInfo(new P._CustomHashMap(_equals, _hashCode, t1, 0, null, null, null, null), [$K, $V]);
+      }}
+  },
+  _CustomHashMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  HashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._map;
+      t1 = new P.HashMapKeyIterator(t1, t1._computeKeys$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, keys, $length, i;
+      t1 = this._map;
+      keys = t1._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        f.call$1(keys[i]);
+        if (keys !== t1._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+      }
+    },
+    $isEfficientLength: true
+  },
+  HashMapKeyIterator: {
+    "^": "Object;_map,_collection$_keys,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var keys, offset, t1;
+      keys = this._collection$_keys;
+      offset = this._offset;
+      t1 = this._map;
+      if (keys !== t1._collection$_keys)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= keys.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = keys[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._LinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new P._LinkedHashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, cell, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return;
+        cell = strings[key];
+        return cell == null ? null : cell.get$_value();
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return;
+        cell = nums[key];
+        return cell == null ? null : cell.get$_value();
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      return bucket[index].get$_value();
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._LinkedHashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._LinkedHashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$2(key, value)];
+      else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].set$_value(value);
+        else
+          bucket.push(this._newLinkedCell$2(key, value));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index, cell;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      cell = bucket.splice(index, 1)[0];
+      this._unlinkCell$1(cell);
+      return cell.get$_value();
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.get$_key(), cell.get$_value());
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      var cell = table[key];
+      if (cell == null)
+        table[key] = this._newLinkedCell$2(key, value);
+      else
+        cell.set$_value(value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return;
+      cell = table[key];
+      if (cell == null)
+        return;
+      this._unlinkCell$1(cell);
+      delete table[key];
+      return cell.get$_value();
+    },
+    _newLinkedCell$2: function(key, value) {
+      var cell, last;
+      cell = new P.LinkedHashMapCell(key, value, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$_key(), key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isLinkedHashMap: true,
+    $isMap: true,
+    static: {_LinkedHashMap__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _LinkedHashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _LinkedHashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V0", args: [K, V]};
+      }, this.this_0, "_LinkedHashMap");
+    }
+  },
+  LinkedHashMapCell: {
+    "^": "Object;_key<,_value@,_next@,_previous@"
+  },
+  LinkedHashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._cell = t1._first;
+      return t2;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, cell, modifications;
+      t1 = this._map;
+      cell = t1._first;
+      modifications = t1._modifications;
+      for (; cell != null;) {
+        f.call$1(cell.get$_key());
+        if (modifications !== t1._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+        cell = cell.get$_next();
+      }
+    },
+    $isEfficientLength: true
+  },
+  LinkedHashMapKeyIterator: {
+    "^": "Object;_map,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._map;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_key();
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  _HashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_elements",
+    get$iterator: function(_) {
+      var t1 = new P.HashSetIterator(this, this._computeElements$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        return nums == null ? false : nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.$index$asx(bucket, index);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [element];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(element);
+      }
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    addAll$1: function(_, objects) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(objects, objects.length, 0, null), [H.getTypeArgumentByIndex(objects, 0)]); t1.moveNext$0();)
+        this.add$1(0, t1._current);
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      --this._collection$_length;
+      this._elements = null;
+      bucket.splice(index, 1);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._elements = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    _computeElements$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._elements;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; ++i0) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._elements = result;
+      return result;
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = 0;
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      if (table != null && table[element] != null) {
+        delete table[element];
+        --this._collection$_length;
+        this._elements = null;
+        return true;
+      } else
+        return false;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i], element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_HashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  HashSetIterator: {
+    "^": "Object;_set,_elements,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var elements, offset, t1;
+      elements = this._elements;
+      offset = this._offset;
+      t1 = this._set;
+      if (elements !== t1._elements)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= elements.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = elements[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$iterator: function(_) {
+      var t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(this, this._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      else
+        return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.get$_element$x(J.$index$asx(bucket, index));
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$1(cell.get$_element(cell));
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    get$last: function(_) {
+      var t1 = this._last;
+      if (t1 == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$1(element)];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(this._newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      this._unlinkCell$1(bucket.splice(index, 1)[0]);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._newLinkedCell$1(element);
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _newLinkedCell$1: function(element) {
+      var cell, last;
+      cell = new P.LinkedHashSetCell(element, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(J.get$_element$x(bucket[i]), element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_LinkedHashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  LinkedHashSetCell: {
+    "^": "Object;_element>,_next@,_previous@"
+  },
+  LinkedHashSetIterator: {
+    "^": "Object;_set,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._set;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_element(t1);
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  UnmodifiableListView: {
+    "^": "UnmodifiableListBase;_collection$_source",
+    get$length: function(_) {
+      return this._collection$_source.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._collection$_source;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _HashSetBase: {
+    "^": "SetBase;"
+  },
+  IterableBase: {
+    "^": "Object;",
+    map$1: [function(_, f) {
+      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "IterableBase", 0), null);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E1", ret: P.Iterable, args: [{func: "dynamic__E1", args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    where$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0)]);
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E0", ret: P.Iterable, args: [{func: "Iterable__E0", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    contains$1: function(_, element) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (J.$eq(t1.get$current(), element))
+          return true;
+      return false;
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (f.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "IterableBase", 0));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$length: function(_) {
+      var it, count;
+      it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    get$isEmpty: function(_) {
+      return !this.get$iterator(this).moveNext$0();
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$isEmpty(this) !== true;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    elementAt$1: function(_, index) {
+      var t1, remaining, element, t2;
+      if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0();) {
+        element = t1.get$current();
+        t2 = J.getInterceptor(remaining);
+        if (t2.$eq(remaining, 0))
+          return element;
+        remaining = t2.$sub(remaining, 1);
+      }
+      throw H.wrapException(P.RangeError$value(index));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    },
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListBase: {
+    "^": "Object_ListMixin;"
+  },
+  Object_ListMixin: {
+    "^": "Object+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, this.get$length(receiver), 0, null), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    elementAt$1: function(receiver, index) {
+      return this.$index(receiver, index);
+    },
+    forEach$1: function(receiver, action) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        action.call$1(this.$index(receiver, i));
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+    },
+    get$isEmpty: function(receiver) {
+      return this.get$length(receiver) === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return !this.get$isEmpty(receiver);
+    },
+    get$last: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(P.StateError$("No elements"));
+      return this.$index(receiver, this.get$length(receiver) - 1);
+    },
+    contains$1: function(receiver, element) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        if (J.$eq(this.$index(receiver, i), element))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    any$1: function(receiver, test) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(this.$index(receiver, i)) === true)
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    join$1: function(receiver, separator) {
+      var buffer;
+      if (this.get$length(receiver) === 0)
+        return "";
+      buffer = P.StringBuffer$("");
+      buffer.writeAll$2(receiver, separator);
+      return buffer._contents;
+    },
+    where$1: function(receiver, test) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, test), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E2", ret: P.Iterable, args: [{func: "dynamic__E2", args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E1", ret: P.Iterable, args: [{func: "Iterable__E1", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    skip$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, count, null, null);
+    },
+    toList$1$growable: function(receiver, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(receiver));
+      } else {
+        t1 = Array(this.get$length(receiver));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+      }
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        t1 = this.$index(receiver, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(receiver, element) {
+      var t1 = this.get$length(receiver);
+      this.set$length(receiver, t1 + 1);
+      this.$indexSet(receiver, t1, element);
+    },
+    addAll$1: function(receiver, iterable) {
+      var t1, element, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();) {
+        element = t1._current;
+        t2 = this.get$length(receiver);
+        this.set$length(receiver, t2 + 1);
+        this.$indexSet(receiver, t2, element);
+      }
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    sort$1: function(receiver, compare) {
+      if (compare == null)
+        compare = P.Comparable_compare$closure();
+      H.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    _rangeCheck$2: function(receiver, start, end) {
+      var t1 = J.getInterceptor$n(start);
+      if (t1.$lt(start, 0) || t1.$gt(start, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(start, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor$n(end);
+      if (t1.$lt(end, start) || t1.$gt(end, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(end, start, this.get$length(receiver)));
+    },
+    getRange$2: function(receiver, start, end) {
+      this._rangeCheck$2(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    removeRange$2: function(receiver, start, end) {
+      var $length;
+      this._rangeCheck$2(receiver, start, end);
+      $length = end - start;
+      this.setRange$4(receiver, start, this.get$length(receiver) - $length, receiver, end);
+      this.set$length(receiver, this.get$length(receiver) - $length);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, t1, otherStart, otherList, i;
+      if (start < 0 || start > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(receiver)));
+      if (end < start || end > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(receiver)));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList) {
+        otherStart = skipCount;
+        otherList = iterable;
+      } else {
+        otherList = t1.skip$1(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+      else
+        for (i = 0; i < $length; ++i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    indexOf$2: function(receiver, element, startIndex) {
+      var i;
+      if (startIndex >= this.get$length(receiver))
+        return -1;
+      for (i = startIndex; i < this.get$length(receiver); ++i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, startIndex) {
+      var i;
+      startIndex = this.get$length(receiver) - 1;
+      for (i = startIndex; i >= 0; --i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(receiver, index, element) {
+      if (index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      if (index === this.get$length(receiver)) {
+        this.add$1(receiver, element);
+        return;
+      }
+      this.set$length(receiver, this.get$length(receiver) + 1);
+      this.setRange$4(receiver, index + 1, this.get$length(receiver), receiver, index);
+      this.$indexSet(receiver, index, element);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      var t1, insertionLength;
+      if (index < 0 || index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isEfficientLength)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      this.set$length(receiver, this.get$length(receiver) + insertionLength);
+      this.setRange$4(receiver, index + insertionLength, this.get$length(receiver), receiver, index);
+      this.setAll$2(receiver, index, iterable);
+    },
+    setAll$2: function(receiver, index, iterable) {
+      var t1, index0;
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList)
+        this.setRange$3(receiver, index, index + t1.get$length(iterable), iterable);
+      else
+        for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+          index0 = index + 1;
+          this.$indexSet(receiver, index, t1.get$current());
+        }
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  Maps_mapToString_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(k, v) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1(", ");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(k);
+      t1.write$1(": ");
+      t1.write$1(v);
+    },
+    $isFunction: true
+  },
+  ListQueue: {
+    "^": "IterableBase;_collection$_table,_head,_tail,_modificationCount",
+    get$iterator: function(_) {
+      var t1 = new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    forEach$1: function(_, action) {
+      var modificationCount, i, t1;
+      modificationCount = this._modificationCount;
+      for (i = this._head; i !== this._tail; i = (i + 1 & this._collection$_table.length - 1) >>> 0) {
+        t1 = this._collection$_table;
+        if (i < 0 || i >= t1.length)
+          return H.ioore(t1, i);
+        action.call$1(t1[i]);
+        if (modificationCount !== this._modificationCount)
+          H.throwExpression(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return this._head === this._tail;
+    },
+    get$length: function(_) {
+      return (this._tail - this._head & this._collection$_table.length - 1) >>> 0;
+    },
+    get$last: function(_) {
+      var t1, t2, t3;
+      t1 = this._head;
+      t2 = this._tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      t1 = this._collection$_table;
+      t3 = t1.length;
+      t2 = (t2 - 1 & t3 - 1) >>> 0;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    toList$1$growable: function(_, growable) {
+      var list, t1;
+      if (growable) {
+        list = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(list, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        list = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      this._writeToList$1(list);
+      return list;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(_, element) {
+      this._add$1(0, element);
+    },
+    addAll$1: function(_, elements) {
+      var addCount, $length, t1, t2, t3, newCapacity, newTable, endSpace, preSpace;
+      addCount = elements.length;
+      $length = this.get$length(this);
+      t1 = $length + addCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3) {
+        newCapacity = P.ListQueue__nextPowerOf2(t1);
+        if (typeof newCapacity !== "number")
+          return H.iae(newCapacity);
+        t2 = Array(newCapacity);
+        t2.fixed$length = init;
+        newTable = H.setRuntimeTypeInfo(t2, [H.getTypeArgumentByIndex(this, 0)]);
+        this._tail = this._writeToList$1(newTable);
+        this._collection$_table = newTable;
+        this._head = 0;
+        H.IterableMixinWorkaround_setRangeList(newTable, $length, t1, elements, 0);
+        this._tail += addCount;
+      } else {
+        t1 = this._tail;
+        endSpace = t3 - t1;
+        if (addCount < endSpace) {
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + addCount, elements, 0);
+          this._tail += addCount;
+        } else {
+          preSpace = addCount - endSpace;
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + endSpace, elements, 0);
+          t1 = this._collection$_table;
+          H.IterableMixinWorkaround_setRangeList(t1, 0, preSpace, elements, endSpace);
+          this._tail = preSpace;
+        }
+      }
+      ++this._modificationCount;
+    },
+    clear$0: function(_) {
+      var i, t1, t2, t3, t4;
+      i = this._head;
+      t1 = this._tail;
+      if (i !== t1) {
+        for (t2 = this._collection$_table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
+          if (i < 0 || i >= t3)
+            return H.ioore(t2, i);
+          t2[i] = null;
+        }
+        this._tail = 0;
+        this._head = 0;
+        ++this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    removeFirst$0: function() {
+      var t1, t2, t3, result;
+      t1 = this._head;
+      if (t1 === this._tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++this._modificationCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3)
+        return H.ioore(t2, t1);
+      result = t2[t1];
+      t2[t1] = null;
+      this._head = (t1 + 1 & t3 - 1) >>> 0;
+      return result;
+    },
+    _add$1: function(_, element) {
+      var t1, t2, t3;
+      t1 = this._collection$_table;
+      t2 = this._tail;
+      t3 = t1.length;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      t1[t2] = element;
+      t3 = (t2 + 1 & t3 - 1) >>> 0;
+      this._tail = t3;
+      if (this._head === t3)
+        this._grow$0();
+      ++this._modificationCount;
+    },
+    _grow$0: function() {
+      var t1, newTable, t2, split;
+      t1 = Array(this._collection$_table.length * 2);
+      t1.fixed$length = init;
+      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      t1 = this._collection$_table;
+      t2 = this._head;
+      split = t1.length - t2;
+      H.IterableMixinWorkaround_setRangeList(newTable, 0, split, t1, t2);
+      t1 = this._head;
+      t2 = this._collection$_table;
+      H.IterableMixinWorkaround_setRangeList(newTable, split, split + t1, t2, 0);
+      this._head = 0;
+      this._tail = this._collection$_table.length;
+      this._collection$_table = newTable;
+    },
+    _writeToList$1: function(target) {
+      var t1, t2, t3, $length, firstPartSize;
+      t1 = this._head;
+      t2 = this._tail;
+      t3 = this._collection$_table;
+      if (t1 <= t2) {
+        $length = t2 - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, $length, t3, t1);
+        return $length;
+      } else {
+        firstPartSize = t3.length - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, firstPartSize, t3, t1);
+        t1 = this._tail;
+        t2 = this._collection$_table;
+        H.IterableMixinWorkaround_setRangeList(target, firstPartSize, firstPartSize + t1, t2, 0);
+        return this._tail + firstPartSize;
+      }
+    },
+    ListQueue$1: function(initialCapacity, $E) {
+      var t1 = Array(8);
+      t1.fixed$length = init;
+      this._collection$_table = H.setRuntimeTypeInfo(t1, [$E]);
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {"^": "ListQueue__INITIAL_CAPACITY", ListQueue__nextPowerOf2: function(number) {
+        var nextNumber;
+        if (typeof number !== "number")
+          return number.$shl();
+        number = (number << 2 >>> 0) - 1;
+        for (; true; number = nextNumber) {
+          nextNumber = (number & number - 1) >>> 0;
+          if (nextNumber === 0)
+            return number;
+        }
+      }}
+  },
+  _ListQueueIterator: {
+    "^": "Object;_queue,_end,_modificationCount,_collection$_position,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._queue;
+      if (this._modificationCount !== t1._modificationCount)
+        H.throwExpression(P.ConcurrentModificationError$(t1));
+      t2 = this._collection$_position;
+      if (t2 === this._end) {
+        this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._collection$_table;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      this._collection$_current = t1[t2];
+      this._collection$_position = (t2 + 1 & t3 - 1) >>> 0;
+      return true;
+    }
+  },
+  SetMixin: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    clear$0: function(_) {
+      this.removeAll$1(this.toList$0(0));
+    },
+    addAll$1: function(_, elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.add$1(0, t1.get$current());
+    },
+    removeAll$1: function(elements) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(elements, elements.length, 0, null), [H.getTypeArgumentByIndex(elements, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    toList$1$growable: function(_, growable) {
+      var result, t1, i, element, i0;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      for (t1 = this.get$iterator(this), i = 0; t1.moveNext$0(); i = i0) {
+        element = t1.get$current();
+        i0 = i + 1;
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = element;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E3", ret: P.Iterable, args: [{func: "dynamic__E3", args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    where$1: function(_, f) {
+      var t1 = new H.WhereIterable(this, f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E2", ret: P.Iterable, args: [{func: "Iterable__E2", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  SetBase: {
+    "^": "SetMixin;"
+  },
+  _SplayTreeNode: {
+    "^": "Object;key>,left>,right>",
+    $is_SplayTreeNode: true
+  },
+  _SplayTreeMapNode: {
+    "^": "_SplayTreeNode;value*,key,left,right",
+    $as_SplayTreeNode: function($K, $V) {
+      return [$K];
+    }
+  },
+  _SplayTree: {
+    "^": "Object;",
+    _splay$1: function(key) {
+      var current, left, right, left0, comp, t1, tmp, current0;
+      current = this._root;
+      if (current == null)
+        return -1;
+      left = this._dummy;
+      for (right = left, left0 = right, comp = null; true;) {
+        comp = this._compare$2(current.key, key);
+        t1 = J.getInterceptor$n(comp);
+        if (t1.$gt(comp, 0)) {
+          t1 = current.left;
+          if (t1 == null)
+            break;
+          comp = this._compare$2(t1.key, key);
+          if (J.$gt$n(comp, 0)) {
+            tmp = current.left;
+            current.left = tmp.right;
+            tmp.right = current;
+            if (tmp.left == null) {
+              current = tmp;
+              break;
+            }
+            current = tmp;
+          }
+          right.left = current;
+          current0 = current.left;
+          right = current;
+          current = current0;
+        } else {
+          if (t1.$lt(comp, 0)) {
+            t1 = current.right;
+            if (t1 == null)
+              break;
+            comp = this._compare$2(t1.key, key);
+            if (J.$lt$n(comp, 0)) {
+              tmp = current.right;
+              current.right = tmp.left;
+              tmp.left = current;
+              if (tmp.right == null) {
+                current = tmp;
+                break;
+              }
+              current = tmp;
+            }
+            left0.right = current;
+            current0 = current.right;
+          } else
+            break;
+          left0 = current;
+          current = current0;
+        }
+      }
+      left0.right = current.left;
+      right.left = current.right;
+      current.left = left.right;
+      current.right = left.left;
+      this._root = current;
+      left.right = null;
+      left.left = null;
+      ++this._splayCount;
+      return comp;
+    },
+    _addNewRoot$2: function(node, comp) {
+      var t1, t2;
+      ++this._count;
+      ++this._modificationCount;
+      if (this._root == null) {
+        this._root = node;
+        return;
+      }
+      t1 = J.$lt$n(comp, 0);
+      t2 = this._root;
+      if (t1) {
+        node.left = t2;
+        node.right = t2.right;
+        t2.right = null;
+      } else {
+        node.right = t2;
+        node.left = t2.left;
+        t2.left = null;
+      }
+      this._root = node;
+    }
+  },
+  SplayTreeMap: {
+    "^": "_SplayTree;_comparator,_validKey,_root,_dummy,_count,_modificationCount,_splayCount",
+    _comparator$2: function(arg0, arg1) {
+      return this._comparator.call$2(arg0, arg1);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    _compare$2: function(key1, key2) {
+      return this._comparator$2(key1, key2);
+    },
+    $index: function(_, key) {
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      if (this._validKey$1(key) !== true)
+        return;
+      if (this._root != null)
+        if (J.$eq(this._splay$1(key), 0))
+          return this._root.value;
+      return;
+    },
+    $indexSet: function(_, key, value) {
+      var comp;
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      comp = this._splay$1(key);
+      if (J.$eq(comp, 0)) {
+        this._root.value = value;
+        return;
+      }
+      this._addNewRoot$2(H.setRuntimeTypeInfo(new P._SplayTreeMapNode(value, key, null, null), [null, null]), comp);
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P.SplayTreeMap_addAll_closure(this));
+    },
+    get$isEmpty: function(_) {
+      return this._root == null;
+    },
+    get$isNotEmpty: function(_) {
+      return this._root != null;
+    },
+    forEach$1: function(_, f) {
+      var t1, nodes, node;
+      t1 = H.getTypeArgumentByIndex(this, 0);
+      nodes = H.setRuntimeTypeInfo(new P._SplayTreeNodeIterator(this, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), this._modificationCount, this._splayCount, null), [t1]);
+      nodes._SplayTreeIterator$1(this, [P._SplayTreeNode, t1]);
+      for (; nodes.moveNext$0();) {
+        node = nodes.get$current();
+        t1 = J.getInterceptor$x(node);
+        f.call$2(t1.get$key(node), t1.get$value(node));
+      }
+    },
+    get$length: function(_) {
+      return this._count;
+    },
+    clear$0: function(_) {
+      this._root = null;
+      this._count = 0;
+      ++this._modificationCount;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P._SplayTreeKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      var t1 = new P._SplayTreeValueIterable(this);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isSplayTreeMap: true,
+    $as_SplayTree: function($K, $V) {
+      return [$K];
+    },
+    $asMap: null,
+    $isMap: true,
+    static: {SplayTreeMap$: function(compare, isValidKey, $K, $V) {
+        var t1, t2;
+        t1 = P.Comparable_compare$closure();
+        t2 = new P.SplayTreeMap_closure($K);
+        return H.setRuntimeTypeInfo(new P.SplayTreeMap(t1, t2, null, H.setRuntimeTypeInfo(new P._SplayTreeNode(null, null, null), [$K]), 0, 0, 0), [$K, $V]);
+      }}
+  },
+  SplayTreeMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  SplayTreeMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V1", args: [K, V]};
+      }, this.this_0, "SplayTreeMap");
+    }
+  },
+  _SplayTreeIterator: {
+    "^": "Object;",
+    get$current: function() {
+      var t1 = this._currentNode;
+      if (t1 == null)
+        return;
+      return this._getValue$1(t1);
+    },
+    _findLeftMostDescendent$1: function(node) {
+      var t1;
+      for (t1 = this._workList; node != null;) {
+        t1.push(node);
+        node = node.left;
+      }
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._tree;
+      if (this._modificationCount !== t1._modificationCount)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t2 = this._workList;
+      if (t2.length === 0) {
+        this._currentNode = null;
+        return false;
+      }
+      if (t1._splayCount !== this._splayCount && this._currentNode != null) {
+        t3 = this._currentNode;
+        C.JSArray_methods.set$length(t2, 0);
+        if (t3 == null)
+          this._findLeftMostDescendent$1(t1._root);
+        else {
+          t1._splay$1(t3.key);
+          this._findLeftMostDescendent$1(t1._root.right);
+        }
+      }
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t1 = t2.pop();
+      this._currentNode = t1;
+      this._findLeftMostDescendent$1(t1.right);
+      return true;
+    },
+    _SplayTreeIterator$1: function(tree, $T) {
+      this._findLeftMostDescendent$1(tree._root);
+    }
+  },
+  _SplayTreeKeyIterable: {
+    "^": "IterableBase;_tree",
+    get$length: function(_) {
+      return this._tree._count;
+    },
+    get$isEmpty: function(_) {
+      return this._tree._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._tree;
+      t2 = new P._SplayTreeKeyIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 0));
+      return t2;
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeValueIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._count;
+    },
+    get$isEmpty: function(_) {
+      return this._map._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P._SplayTreeValueIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 1));
+      return t2;
+    },
+    $asIterableBase: function($K, $V) {
+      return [$V];
+    },
+    $asIterable: function($K, $V) {
+      return [$V];
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeKeyIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.key;
+    }
+  },
+  _SplayTreeValueIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.value;
+    },
+    $as_SplayTreeIterator: function($K, $V) {
+      return [$V];
+    }
+  },
+  _SplayTreeNodeIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node;
+    },
+    $as_SplayTreeIterator: function($K) {
+      return [[P._SplayTreeNode, $K]];
+    }
+  }
+}],
+["dart.convert", "dart:convert", , P, {
+  "^": "",
+  _convertJsonToDart: function(json, reviver) {
+    var revive = reviver == null ? new P._convertJsonToDart_closure() : reviver;
+    return revive.call$2(null, new P._convertJsonToDart_walk(revive).call$1(json));
+  },
+  _parseJson: function(source, reviver) {
+    var parsed, e, t1, exception;
+    t1 = source;
+    if (typeof t1 !== "string")
+      throw H.wrapException(P.ArgumentError$(source));
+    parsed = null;
+    try {
+      parsed = JSON.parse(source);
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      throw H.wrapException(P.FormatException$(String(e)));
+    }
+
+    return P._convertJsonToDart(parsed, reviver);
+  },
+  _defaultToEncodable: [function(object) {
+    return object.toJson$0();
+  }, "call$1", "_defaultToEncodable$closure", 2, 0, 49, 50],
+  _convertJsonToDart_closure: {
+    "^": "Closure:75;",
+    call$2: function(key, value) {
+      return value;
+    },
+    $isFunction: true
+  },
+  _convertJsonToDart_walk: {
+    "^": "Closure:13;revive_0",
+    call$1: function(e) {
+      var list, t1, i, keys, map, key, proto;
+      if (e == null || typeof e != "object")
+        return e;
+      if (Object.getPrototypeOf(e) === Array.prototype) {
+        list = e;
+        for (t1 = this.revive_0, i = 0; i < list.length; ++i)
+          list[i] = t1.call$2(i, this.call$1(list[i]));
+        return list;
+      }
+      keys = Object.keys(e);
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = this.revive_0, i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        map.$indexSet(0, key, t1.call$2(key, this.call$1(e[key])));
+      }
+      proto = e.__proto__;
+      if (typeof proto !== "undefined" && proto !== Object.prototype)
+        map.$indexSet(0, "__proto__", t1.call$2("__proto__", this.call$1(proto)));
+      return map;
+    },
+    $isFunction: true
+  },
+  Codec: {
+    "^": "Object;"
+  },
+  Converter: {
+    "^": "Object;"
+  },
+  Encoding: {
+    "^": "Codec;",
+    $asCodec: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  JsonUnsupportedObjectError: {
+    "^": "Error;unsupportedObject,cause",
+    toString$0: function(_) {
+      if (this.cause != null)
+        return "Converting object to an encodable object failed.";
+      else
+        return "Converting object did not return an encodable object.";
+    },
+    static: {JsonUnsupportedObjectError$: function(unsupportedObject, cause) {
+        return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
+      }}
+  },
+  JsonCyclicError: {
+    "^": "JsonUnsupportedObjectError;unsupportedObject,cause",
+    toString$0: function(_) {
+      return "Cyclic error in JSON stringify";
+    },
+    static: {JsonCyclicError$: function(object) {
+        return new P.JsonCyclicError(object, null);
+      }}
+  },
+  JsonCodec: {
+    "^": "Codec;_reviver<,_toEncodable",
+    decode$2$reviver: function(source, reviver) {
+      return P._parseJson(source, this.get$decoder()._reviver);
+    },
+    decode$1: function(source) {
+      return this.decode$2$reviver(source, null);
+    },
+    encode$2$toEncodable: function(value, toEncodable) {
+      var t1 = this.get$encoder();
+      return P._JsonStringifier_stringify(value, t1._toEncodableFunction, t1.indent);
+    },
+    encode$1: function(value) {
+      return this.encode$2$toEncodable(value, null);
+    },
+    get$encoder: function() {
+      return C.JsonEncoder_null_null;
+    },
+    get$decoder: function() {
+      return C.JsonDecoder_null;
+    },
+    $asCodec: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonEncoder: {
+    "^": "Converter;indent,_toEncodableFunction",
+    $asConverter: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonDecoder: {
+    "^": "Converter;_reviver<",
+    $asConverter: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _JsonStringifier: {
+    "^": "Object;_toEncodable,_sink,_convert$_seen",
+    _toEncodable$1: function(arg0) {
+      return this._toEncodable.call$1(arg0);
+    },
+    escape$1: function(s) {
+      var t1, $length, t2, offset, i, charCode, t3;
+      t1 = J.getInterceptor$asx(s);
+      $length = t1.get$length(s);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      t2 = this._sink;
+      offset = 0;
+      i = 0;
+      for (; i < $length; ++i) {
+        charCode = t1.codeUnitAt$1(s, i);
+        if (charCode > 92)
+          continue;
+        if (charCode < 32) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          switch (charCode) {
+            case 8:
+              t3 = H.Primitives_stringFromCharCode(98);
+              t2._contents += t3;
+              break;
+            case 9:
+              t3 = H.Primitives_stringFromCharCode(116);
+              t2._contents += t3;
+              break;
+            case 10:
+              t3 = H.Primitives_stringFromCharCode(110);
+              t2._contents += t3;
+              break;
+            case 12:
+              t3 = H.Primitives_stringFromCharCode(102);
+              t2._contents += t3;
+              break;
+            case 13:
+              t3 = H.Primitives_stringFromCharCode(114);
+              t2._contents += t3;
+              break;
+            default:
+              t3 = H.Primitives_stringFromCharCode(117);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = charCode >>> 4 & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              t3 = charCode & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              break;
+          }
+        } else if (charCode === 34 || charCode === 92) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          t3 = H.Primitives_stringFromCharCode(charCode);
+          t2._contents += t3;
+        }
+      }
+      if (offset === 0)
+        t2._contents += typeof s === "string" ? s : H.S(s);
+      else if (offset < $length) {
+        t1 = t1.substring$2(s, offset, $length);
+        t2._contents += t1;
+      }
+    },
+    checkCycle$1: function(object) {
+      var t1, t2, i, t3;
+      for (t1 = this._convert$_seen, t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = t1[i];
+        if (object == null ? t3 == null : object === t3)
+          throw H.wrapException(P.JsonCyclicError$(object));
+      }
+      t1.push(object);
+    },
+    stringifyValue$1: function(object) {
+      var customJson, e, t1, exception;
+      if (!this.stringifyJsonValue$1(object)) {
+        this.checkCycle$1(object);
+        try {
+          customJson = this._toEncodable$1(object);
+          if (!this.stringifyJsonValue$1(customJson)) {
+            t1 = P.JsonUnsupportedObjectError$(object, null);
+            throw H.wrapException(t1);
+          }
+          t1 = this._convert$_seen;
+          if (0 >= t1.length)
+            return H.ioore(t1, 0);
+          t1.pop();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          throw H.wrapException(P.JsonUnsupportedObjectError$(object, e));
+        }
+
+      }
+    },
+    stringifyJsonValue$1: function(object) {
+      var t1, t2, i, t3, separator, key;
+      if (typeof object === "number") {
+        if (!C.JSNumber_methods.get$isFinite(object))
+          return false;
+        this._sink.write$1(C.JSNumber_methods.toString$0(object));
+        return true;
+      } else if (object === true) {
+        this._sink.write$1("true");
+        return true;
+      } else if (object === false) {
+        this._sink.write$1("false");
+        return true;
+      } else if (object == null) {
+        this._sink.write$1("null");
+        return true;
+      } else if (typeof object === "string") {
+        t1 = this._sink;
+        t1.write$1("\"");
+        this.escape$1(object);
+        t1.write$1("\"");
+        return true;
+      } else {
+        t1 = J.getInterceptor(object);
+        if (!!t1.$isList) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("[");
+          if (t1.get$length(object) > 0) {
+            this.stringifyValue$1(t1.$index(object, 0));
+            for (i = 1; i < t1.get$length(object); ++i) {
+              t2._contents += ",";
+              this.stringifyValue$1(t1.$index(object, i));
+            }
+          }
+          t2.write$1("]");
+          this._removeSeen$1(object);
+          return true;
+        } else if (!!t1.$isMap) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("{");
+          for (t3 = J.get$iterator$ax(object.get$keys()), separator = "\""; t3.moveNext$0(); separator = ",\"") {
+            key = t3.get$current();
+            t2._contents += separator;
+            this.escape$1(key);
+            t2._contents += "\":";
+            this.stringifyValue$1(t1.$index(object, key));
+          }
+          t2.write$1("}");
+          this._removeSeen$1(object);
+          return true;
+        } else
+          return false;
+      }
+    },
+    _removeSeen$1: function(object) {
+      var t1 = this._convert$_seen;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    },
+    static: {"^": "_JsonStringifier_BACKSPACE,_JsonStringifier_TAB,_JsonStringifier_NEWLINE,_JsonStringifier_CARRIAGE_RETURN,_JsonStringifier_FORM_FEED,_JsonStringifier_QUOTE,_JsonStringifier_CHAR_0,_JsonStringifier_BACKSLASH,_JsonStringifier_CHAR_b,_JsonStringifier_CHAR_f,_JsonStringifier_CHAR_n,_JsonStringifier_CHAR_r,_JsonStringifier_CHAR_t,_JsonStringifier_CHAR_u", _JsonStringifier__JsonStringifier: function(sink, toEncodable, indent) {
+        return new P._JsonStringifier(toEncodable, sink, []);
+      }, _JsonStringifier_stringify: function(object, toEncodable, indent) {
+        var output;
+        toEncodable = P._defaultToEncodable$closure();
+        output = P.StringBuffer$("");
+        P._JsonStringifier__JsonStringifier(output, toEncodable, indent).stringifyValue$1(object);
+        return output._contents;
+      }}
+  },
+  Utf8Codec: {
+    "^": "Encoding;_allowMalformed",
+    get$name: function(_) {
+      return "utf-8";
+    },
+    get$encoder: function() {
+      return new P.Utf8Encoder();
+    }
+  },
+  Utf8Encoder: {
+    "^": "Converter;",
+    convert$1: function(string) {
+      var t1, t2, encoder;
+      t1 = J.getInterceptor$asx(string);
+      t2 = J.$mul$ns(t1.get$length(string), 3);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = H.setRuntimeTypeInfo(Array(t2), [P.$int]);
+      encoder = new P._Utf8Encoder(0, 0, t2);
+      if (encoder._fillBuffer$3(string, 0, t1.get$length(string)) !== t1.get$length(string))
+        encoder._writeSurrogate$2(t1.codeUnitAt$1(string, J.$sub$n(t1.get$length(string), 1)), 0);
+      return C.JSArray_methods.sublist$2(t2, 0, encoder._bufferIndex);
+    },
+    $asConverter: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  _Utf8Encoder: {
+    "^": "Object;_carry,_bufferIndex,_buffer",
+    _writeSurrogate$2: function(leadingSurrogate, nextCodeUnit) {
+      var t1, t2, rune, t3, t4;
+      t1 = this._buffer;
+      t2 = this._bufferIndex;
+      if ((nextCodeUnit & 64512) === 56320) {
+        rune = 65536 + ((leadingSurrogate & 1023) << 10 >>> 0) | nextCodeUnit & 1023;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = (240 | rune >>> 18) >>> 0;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune >>> 12 & 63;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | rune >>> 6 & 63;
+        this._bufferIndex = t3 + 1;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune & 63;
+        return true;
+      } else {
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 224 | leadingSurrogate >>> 12;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | leadingSurrogate >>> 6 & 63;
+        this._bufferIndex = t2 + 1;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | leadingSurrogate & 63;
+        return false;
+      }
+    },
+    _fillBuffer$3: function(str, start, end) {
+      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5;
+      if (start !== end && (J.codeUnitAt$1$s(str, J.$sub$n(end, 1)) & 64512) === 55296)
+        end = J.$sub$n(end, 1);
+      if (typeof end !== "number")
+        return H.iae(end);
+      t1 = this._buffer;
+      t2 = t1.length;
+      t3 = J.getInterceptor$s(str);
+      stringIndex = start;
+      for (; stringIndex < end; ++stringIndex) {
+        codeUnit = t3.codeUnitAt$1(str, stringIndex);
+        if (codeUnit <= 127) {
+          t4 = this._bufferIndex;
+          if (t4 >= t2)
+            break;
+          this._bufferIndex = t4 + 1;
+          t1[t4] = codeUnit;
+        } else if ((codeUnit & 64512) === 55296) {
+          if (this._bufferIndex + 3 >= t2)
+            break;
+          stringIndex0 = stringIndex + 1;
+          if (this._writeSurrogate$2(codeUnit, t3.codeUnitAt$1(str, stringIndex0)))
+            stringIndex = stringIndex0;
+        } else if (codeUnit <= 2047) {
+          t4 = this._bufferIndex;
+          t5 = t4 + 1;
+          if (t5 >= t2)
+            break;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 192 | codeUnit >>> 6;
+          this._bufferIndex = t5 + 1;
+          t1[t5] = 128 | codeUnit & 63;
+        } else {
+          t4 = this._bufferIndex;
+          if (t4 + 2 >= t2)
+            break;
+          t5 = t4 + 1;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 224 | codeUnit >>> 12;
+          t4 = t5 + 1;
+          this._bufferIndex = t4;
+          if (t5 >= t2)
+            return H.ioore(t1, t5);
+          t1[t5] = 128 | codeUnit >>> 6 & 63;
+          this._bufferIndex = t4 + 1;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 128 | codeUnit & 63;
+        }
+      }
+      return stringIndex;
+    },
+    static: {"^": "_Utf8Encoder__DEFAULT_BYTE_BUFFER_SIZE"}
+  }
+}],
+["dart.core", "dart:core", , P, {
+  "^": "",
+  Function__toMangledNames: function(namedArguments) {
+    return;
+  },
+  Comparable_compare: [function(a, b) {
+    return J.compareTo$1$ns(a, b);
+  }, "call$2", "Comparable_compare$closure", 4, 0, 51, 46, 47],
+  Error_safeToString: function(object) {
+    var buffer, t1, i, t2, codeUnit;
+    if (typeof object === "number" || typeof object === "boolean" || null == object)
+      return J.toString$0(object);
+    if (typeof object === "string") {
+      buffer = new P.StringBuffer("");
+      buffer._contents = "\"";
+      for (t1 = object.length, i = 0, t2 = "\""; i < t1; ++i) {
+        codeUnit = C.JSString_methods.codeUnitAt$1(object, i);
+        if (codeUnit <= 31)
+          if (codeUnit === 10)
+            t2 = buffer._contents += "\\n";
+          else if (codeUnit === 13)
+            t2 = buffer._contents += "\\r";
+          else if (codeUnit === 9)
+            t2 = buffer._contents += "\\t";
+          else {
+            t2 = buffer._contents += "\\x";
+            if (codeUnit < 16)
+              buffer._contents = t2 + "0";
+            else {
+              buffer._contents = t2 + "1";
+              codeUnit -= 16;
+            }
+            t2 = H.Primitives_stringFromCharCode(codeUnit < 10 ? 48 + codeUnit : 87 + codeUnit);
+            t2 = buffer._contents += t2;
+          }
+        else if (codeUnit === 92)
+          t2 = buffer._contents += "\\\\";
+        else if (codeUnit === 34)
+          t2 = buffer._contents += "\\\"";
+        else {
+          t2 = H.Primitives_stringFromCharCode(codeUnit);
+          t2 = buffer._contents += t2;
+        }
+      }
+      t1 = t2 + "\"";
+      buffer._contents = t1;
+      return t1;
+    }
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Exception_Exception: function(message) {
+    return new P._ExceptionImplementation(message);
+  },
+  identical: [function(a, b) {
+    return a == null ? b == null : a === b;
+  }, "call$2", "identical$closure", 4, 0, 52],
+  identityHashCode: [function(object) {
+    return H.objectHashCode(object);
+  }, "call$1", "identityHashCode$closure", 2, 0, 53],
+  List_List$filled: function($length, fill, $E) {
+    var result, t1, i;
+    result = J.JSArray_JSArray$fixed($length, $E);
+    if ($length !== 0 && true)
+      for (t1 = result.length, i = 0; i < t1; ++i)
+        result[i] = fill;
+    return result;
+  },
+  List_List$from: function(other, growable, $E) {
+    var list, t1;
+    list = H.setRuntimeTypeInfo([], [$E]);
+    for (t1 = J.get$iterator$ax(other); t1.moveNext$0();)
+      list.push(t1.get$current());
+    if (growable)
+      return list;
+    list.fixed$length = init;
+    return list;
+  },
+  print: function(object) {
+    var line, t1;
+    line = H.S(object);
+    t1 = $.printToZone;
+    if (t1 == null)
+      H.printString(line);
+    else
+      t1.call$1(line);
+  },
+  Function__toMangledNames_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(symbol, value) {
+      this.result_0.$indexSet(0, symbol.get$_name(symbol), value);
+    },
+    $isFunction: true
+  },
+  NoSuchMethodError_toString_closure: {
+    "^": "Closure:121;box_0",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (t1.i_1 > 0)
+        t1.sb_0.write$1(", ");
+      t1.sb_0.write$1(J.get$_name$x(key));
+      t1.sb_0.write$1(": ");
+      t1.sb_0.write$1(P.Error_safeToString(value));
+      ++t1.i_1;
+    },
+    $isFunction: true
+  },
+  bool: {
+    "^": "Object;",
+    $isbool: true
+  },
+  "+bool": 0,
+  Comparable: {
+    "^": "Object;"
+  },
+  DateTime: {
+    "^": "Object;millisecondsSinceEpoch<,isUtc",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDateTime)
+        return false;
+      return J.$eq(this.millisecondsSinceEpoch, other.millisecondsSinceEpoch) && this.isUtc === other.isUtc;
+    },
+    compareTo$1: function(_, other) {
+      return J.compareTo$1$ns(this.millisecondsSinceEpoch, other.get$millisecondsSinceEpoch());
+    },
+    get$hashCode: function(_) {
+      return this.millisecondsSinceEpoch;
+    },
+    toString$0: function(_) {
+      var t1, y, m, d, h, min, sec, ms;
+      t1 = this.isUtc;
+      y = P.DateTime__fourDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(this).getFullYear() + 0);
+      m = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(this).getMonth() + 1);
+      d = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(this).getDate() + 0);
+      h = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(this).getHours() + 0);
+      min = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(this).getMinutes() + 0);
+      sec = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(this).getSeconds() + 0);
+      ms = P.DateTime__threeDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(this).getMilliseconds() + 0);
+      if (t1)
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
+      else
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
+    },
+    add$1: function(_, duration) {
+      return P.DateTime$fromMillisecondsSinceEpoch(J.$add$ns(this.millisecondsSinceEpoch, duration.get$inMilliseconds()), this.isUtc);
+    },
+    DateTime$_now$0: function() {
+      H.Primitives_lazyAsJsDate(this);
+    },
+    DateTime$fromMillisecondsSinceEpoch$2$isUtc: function(millisecondsSinceEpoch, isUtc) {
+      if (J.abs$0$n(millisecondsSinceEpoch) > 8640000000000000)
+        throw H.wrapException(P.ArgumentError$(millisecondsSinceEpoch));
+    },
+    $isDateTime: true,
+    static: {"^": "DateTime_MONDAY,DateTime_TUESDAY,DateTime_WEDNESDAY,DateTime_THURSDAY,DateTime_FRIDAY,DateTime_SATURDAY,DateTime_SUNDAY,DateTime_DAYS_PER_WEEK,DateTime_JANUARY,DateTime_FEBRUARY,DateTime_MARCH,DateTime_APRIL,DateTime_MAY,DateTime_JUNE,DateTime_JULY,DateTime_AUGUST,DateTime_SEPTEMBER,DateTime_OCTOBER,DateTime_NOVEMBER,DateTime_DECEMBER,DateTime_MONTHS_PER_YEAR,DateTime__MAX_MILLISECONDS_SINCE_EPOCH", DateTime_parse: function(formattedString) {
+        var match, t1, t2, years, month, day, hour, minute, second, millisecond, addOneMillisecond, t3, sign, hourDifference, minuteDifference, isUtc, millisecondsSinceEpoch;
+        match = new H.JSSyntaxRegExp("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", H.JSSyntaxRegExp_makeNative("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", false, true, false), null, null).firstMatch$1(formattedString);
+        if (match != null) {
+          t1 = new P.DateTime_parse_parseIntOrZero();
+          t2 = match._match;
+          if (1 >= t2.length)
+            return H.ioore(t2, 1);
+          years = H.Primitives_parseInt(t2[1], null, null);
+          if (2 >= t2.length)
+            return H.ioore(t2, 2);
+          month = H.Primitives_parseInt(t2[2], null, null);
+          if (3 >= t2.length)
+            return H.ioore(t2, 3);
+          day = H.Primitives_parseInt(t2[3], null, null);
+          if (4 >= t2.length)
+            return H.ioore(t2, 4);
+          hour = t1.call$1(t2[4]);
+          if (5 >= t2.length)
+            return H.ioore(t2, 5);
+          minute = t1.call$1(t2[5]);
+          if (6 >= t2.length)
+            return H.ioore(t2, 6);
+          second = t1.call$1(t2[6]);
+          if (7 >= t2.length)
+            return H.ioore(t2, 7);
+          millisecond = J.round$0$n(J.$mul$ns(new P.DateTime_parse_parseDoubleOrZero().call$1(t2[7]), 1000));
+          if (millisecond === 1000) {
+            addOneMillisecond = true;
+            millisecond = 999;
+          } else
+            addOneMillisecond = false;
+          t3 = t2.length;
+          if (8 >= t3)
+            return H.ioore(t2, 8);
+          if (t2[8] != null) {
+            if (9 >= t3)
+              return H.ioore(t2, 9);
+            t3 = t2[9];
+            if (t3 != null) {
+              sign = J.$eq(t3, "-") ? -1 : 1;
+              if (10 >= t2.length)
+                return H.ioore(t2, 10);
+              hourDifference = H.Primitives_parseInt(t2[10], null, null);
+              if (11 >= t2.length)
+                return H.ioore(t2, 11);
+              minuteDifference = t1.call$1(t2[11]);
+              if (typeof hourDifference !== "number")
+                return H.iae(hourDifference);
+              minuteDifference = J.$add$ns(minuteDifference, 60 * hourDifference);
+              if (typeof minuteDifference !== "number")
+                return H.iae(minuteDifference);
+              minute = J.$sub$n(minute, sign * minuteDifference);
+            }
+            isUtc = true;
+          } else
+            isUtc = false;
+          millisecondsSinceEpoch = H.Primitives_valueFromDecomposedDate(years, month, day, hour, minute, second, millisecond, isUtc);
+          return P.DateTime$fromMillisecondsSinceEpoch(addOneMillisecond ? millisecondsSinceEpoch + 1 : millisecondsSinceEpoch, isUtc);
+        } else
+          throw H.wrapException(P.FormatException$(formattedString));
+      }, DateTime$fromMillisecondsSinceEpoch: function(millisecondsSinceEpoch, isUtc) {
+        var t1 = new P.DateTime(millisecondsSinceEpoch, isUtc);
+        t1.DateTime$fromMillisecondsSinceEpoch$2$isUtc(millisecondsSinceEpoch, isUtc);
+        return t1;
+      }, DateTime__fourDigits: function(n) {
+        var absN, sign;
+        absN = Math.abs(n);
+        sign = n < 0 ? "-" : "";
+        if (absN >= 1000)
+          return "" + n;
+        if (absN >= 100)
+          return sign + "0" + H.S(absN);
+        if (absN >= 10)
+          return sign + "00" + H.S(absN);
+        return sign + "000" + H.S(absN);
+      }, DateTime__threeDigits: function(n) {
+        if (n >= 100)
+          return "" + n;
+        if (n >= 10)
+          return "0" + n;
+        return "00" + n;
+      }, DateTime__twoDigits: function(n) {
+        if (n >= 10)
+          return "" + n;
+        return "0" + n;
+      }}
+  },
+  DateTime_parse_parseIntOrZero: {
+    "^": "Closure:122;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseInt(matched, null, null);
+    },
+    $isFunction: true
+  },
+  DateTime_parse_parseDoubleOrZero: {
+    "^": "Closure:123;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseDouble(matched, null);
+    },
+    $isFunction: true
+  },
+  $double: {
+    "^": "num;",
+    $is$double: true
+  },
+  "+double": 0,
+  Duration: {
+    "^": "Object;_duration<",
+    $add: function(_, other) {
+      return P.Duration$(0, 0, this._duration + other.get$_duration(), 0, 0, 0);
+    },
+    $sub: function(_, other) {
+      return P.Duration$(0, 0, this._duration - other.get$_duration(), 0, 0, 0);
+    },
+    $mul: function(_, factor) {
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      return P.Duration$(0, 0, C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(this._duration * factor)), 0, 0, 0);
+    },
+    $tdiv: function(_, quotient) {
+      if (J.$eq(quotient, 0))
+        throw H.wrapException(P.IntegerDivisionByZeroException$());
+      if (typeof quotient !== "number")
+        return H.iae(quotient);
+      return P.Duration$(0, 0, C.JSNumber_methods.$tdiv(this._duration, quotient), 0, 0, 0);
+    },
+    $lt: function(_, other) {
+      return this._duration < other.get$_duration();
+    },
+    $gt: function(_, other) {
+      return this._duration > other.get$_duration();
+    },
+    $le: function(_, other) {
+      return this._duration <= other.get$_duration();
+    },
+    $ge: function(_, other) {
+      return this._duration >= other.get$_duration();
+    },
+    get$inMilliseconds: function() {
+      return C.JSNumber_methods._tdivFast$1(this._duration, 1000);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDuration)
+        return false;
+      return this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return this._duration & 0x1FFFFFFF;
+    },
+    compareTo$1: function(_, other) {
+      return C.JSNumber_methods.compareTo$1(this._duration, other.get$_duration());
+    },
+    toString$0: function(_) {
+      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
+      t1 = new P.Duration_toString_twoDigits();
+      t2 = this._duration;
+      if (t2 < 0)
+        return "-" + P.Duration$(0, 0, -t2, 0, 0, 0).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 60000000), 60));
+      twoDigitSeconds = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 1000000), 60));
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSNumber_methods.remainder$1(t2, 1000000));
+      return H.S(C.JSNumber_methods._tdivFast$1(t2, 3600000000)) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    },
+    $isDuration: true,
+    static: {"^": "Duration_MICROSECONDS_PER_MILLISECOND,Duration_MILLISECONDS_PER_SECOND,Duration_SECONDS_PER_MINUTE,Duration_MINUTES_PER_HOUR,Duration_HOURS_PER_DAY,Duration_MICROSECONDS_PER_SECOND,Duration_MICROSECONDS_PER_MINUTE,Duration_MICROSECONDS_PER_HOUR,Duration_MICROSECONDS_PER_DAY,Duration_MILLISECONDS_PER_MINUTE,Duration_MILLISECONDS_PER_HOUR,Duration_MILLISECONDS_PER_DAY,Duration_SECONDS_PER_HOUR,Duration_SECONDS_PER_DAY,Duration_MINUTES_PER_DAY,Duration_ZERO", Duration$: function(days, hours, microseconds, milliseconds, minutes, seconds) {
+        return new P.Duration(days * 86400000000 + hours * 3600000000 + minutes * 60000000 + seconds * 1000000 + milliseconds * 1000 + microseconds);
+      }}
+  },
+  Duration_toString_sixDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 100000)
+        return H.S(n);
+      if (n >= 10000)
+        return "0" + H.S(n);
+      if (n >= 1000)
+        return "00" + H.S(n);
+      if (n >= 100)
+        return "000" + H.S(n);
+      if (n >= 10)
+        return "0000" + H.S(n);
+      return "00000" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Duration_toString_twoDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 10)
+        return H.S(n);
+      return "0" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Error: {
+    "^": "Object;",
+    get$stackTrace: function() {
+      return new H._StackTrace(this.$thrownJsError, null);
+    },
+    $isError: true
+  },
+  NullThrownError: {
+    "^": "Error;",
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  },
+  ArgumentError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Illegal argument(s): " + H.S(t1);
+      return "Illegal argument(s)";
+    },
+    static: {ArgumentError$: function(message) {
+        return new P.ArgumentError(message);
+      }}
+  },
+  RangeError: {
+    "^": "ArgumentError;message",
+    toString$0: function(_) {
+      return "RangeError: " + H.S(this.message);
+    },
+    static: {RangeError$: function(message) {
+        return new P.RangeError(message);
+      }, RangeError$value: function(value) {
+        return new P.RangeError("value " + H.S(value));
+      }, RangeError$range: function(value, start, end) {
+        return new P.RangeError("value " + H.S(value) + " not in range " + H.S(start) + ".." + H.S(end));
+      }}
+  },
+  FallThroughError: {
+    "^": "Error;",
+    static: {FallThroughError$: function() {
+        return new P.FallThroughError();
+      }}
+  },
+  NoSuchMethodError: {
+    "^": "Error;_core$_receiver,_memberName,_core$_arguments,_namedArguments,_existingArgumentNames",
+    toString$0: function(_) {
+      var t1, t2, t3, t4, t5, str;
+      t1 = {};
+      t1.sb_0 = P.StringBuffer$("");
+      t1.i_1 = 0;
+      for (t2 = this._core$_arguments, t3 = 0; t4 = t2.length, t3 < t4; t3 = ++t1.i_1) {
+        if (t3 > 0) {
+          t5 = t1.sb_0;
+          t5._contents += ", ";
+        }
+        t5 = t1.sb_0;
+        if (t3 < 0)
+          return H.ioore(t2, t3);
+        str = P.Error_safeToString(t2[t3]);
+        t5._contents += typeof str === "string" ? str : H.S(str);
+      }
+      this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(t1));
+      return "NoSuchMethodError : method not found: '" + this._memberName.toString$0(0) + "'\nReceiver: " + H.S(P.Error_safeToString(this._core$_receiver)) + "\nArguments: [" + t1.sb_0._contents + "]";
+    },
+    $isNoSuchMethodError: true,
+    static: {NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
+        return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames);
+      }}
+  },
+  UnsupportedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    },
+    static: {UnsupportedError$: function(message) {
+        return new P.UnsupportedError(message);
+      }}
+  },
+  UnimplementedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      return t1 != null ? "UnimplementedError: " + H.S(t1) : "UnimplementedError";
+    },
+    $isError: true,
+    static: {UnimplementedError$: function(message) {
+        return new P.UnimplementedError(message);
+      }}
+  },
+  StateError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    },
+    static: {StateError$: function(message) {
+        return new P.StateError(message);
+      }}
+  },
+  ConcurrentModificationError: {
+    "^": "Error;modifiedObject",
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
+    },
+    static: {ConcurrentModificationError$: function(modifiedObject) {
+        return new P.ConcurrentModificationError(modifiedObject);
+      }}
+  },
+  OutOfMemoryError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Out of Memory";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  StackOverflowError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  CyclicInitializationError: {
+    "^": "Error;variableName",
+    toString$0: function(_) {
+      return "Reading static variable '" + this.variableName + "' during its initialization";
+    },
+    static: {CyclicInitializationError$: function(variableName) {
+        return new P.CyclicInitializationError(variableName);
+      }}
+  },
+  _ExceptionImplementation: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 == null)
+        return "Exception";
+      return "Exception: " + H.S(t1);
+    }
+  },
+  FormatException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "FormatException: " + H.S(this.message);
+    },
+    static: {FormatException$: function(message) {
+        return new P.FormatException(message);
+      }}
+  },
+  IntegerDivisionByZeroException: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "IntegerDivisionByZeroException";
+    },
+    static: {IntegerDivisionByZeroException$: function() {
+        return new P.IntegerDivisionByZeroException();
+      }}
+  },
+  Expando: {
+    "^": "Object;name>",
+    toString$0: function(_) {
+      return "Expando:" + H.S(this.name);
+    },
+    $index: function(_, object) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
+    },
+    $indexSet: function(_, object, value) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      if (values == null) {
+        values = new P.Object();
+        H.Primitives_setProperty(object, "expando$values", values);
+      }
+      H.Primitives_setProperty(values, this._getKey$0(), value);
+    },
+    _getKey$0: function() {
+      var key, t1;
+      key = H.Primitives_getProperty(this, "expando$key");
+      if (key == null) {
+        t1 = $.Expando__keyCount;
+        $.Expando__keyCount = t1 + 1;
+        key = "expando$key$" + t1;
+        H.Primitives_setProperty(this, "expando$key", key);
+      }
+      return key;
+    },
+    static: {"^": "Expando__KEY_PROPERTY_NAME,Expando__EXPANDO_PROPERTY_NAME,Expando__keyCount"}
+  },
+  Function: {
+    "^": "Object;",
+    $isFunction: true
+  },
+  $int: {
+    "^": "num;",
+    $is$int: true
+  },
+  "+int": 0,
+  Iterable: {
+    "^": "Object;",
+    $isIterable: true,
+    $asIterable: null
+  },
+  Iterator: {
+    "^": "Object;"
+  },
+  List: {
+    "^": "Object;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  "+List": 0,
+  Map: {
+    "^": "Object;",
+    $isMap: true
+  },
+  Null: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "null";
+    }
+  },
+  "+Null": 0,
+  num: {
+    "^": "Object;",
+    $isnum: true
+  },
+  "+num": 0,
+  Object: {
+    "^": ";",
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return H.Primitives_objectToString(this);
+    },
+    noSuchMethod$1: function(_, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    },
+    get$runtimeType: function(_) {
+      return new H.TypeImpl(H.getRuntimeTypeString(this), null);
+    },
+    $isObject: true
+  },
+  Match: {
+    "^": "Object;",
+    $isMatch: true
+  },
+  StackTrace: {
+    "^": "Object;"
+  },
+  Stopwatch: {
+    "^": "Object;frequency,_core$_start,_stop",
+    start$0: function(_) {
+      var t1, t2, t3;
+      t1 = this._core$_start == null;
+      if (!t1 && this._stop == null)
+        return;
+      if (t1)
+        this._core$_start = H.Primitives_numMicroseconds();
+      else {
+        t1 = H.Primitives_numMicroseconds();
+        t2 = this._stop;
+        t3 = this._core$_start;
+        if (typeof t2 !== "number")
+          return t2.$sub();
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        this._core$_start = t1 - (t2 - t3);
+        this._stop = null;
+      }
+    }
+  },
+  String: {
+    "^": "Object;",
+    $isString: true
+  },
+  "+String": 0,
+  RuneIterator: {
+    "^": "Object;string,_core$_position,_nextPosition,_currentCodePoint",
+    get$current: function() {
+      return this._currentCodePoint;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3, codeUnit, nextPosition, nextCodeUnit;
+      t1 = this._nextPosition;
+      this._core$_position = t1;
+      t2 = this.string;
+      t3 = t2.length;
+      if (t1 === t3) {
+        this._currentCodePoint = null;
+        return false;
+      }
+      codeUnit = C.JSString_methods.codeUnitAt$1(t2, t1);
+      nextPosition = this._core$_position + 1;
+      if ((codeUnit & 64512) === 55296 && nextPosition < t3) {
+        nextCodeUnit = C.JSString_methods.codeUnitAt$1(t2, nextPosition);
+        if ((nextCodeUnit & 64512) === 56320) {
+          this._nextPosition = nextPosition + 1;
+          this._currentCodePoint = 65536 + ((codeUnit & 1023) << 10 >>> 0) + (nextCodeUnit & 1023);
+          return true;
+        }
+      }
+      this._nextPosition = nextPosition;
+      this._currentCodePoint = codeUnit;
+      return true;
+    }
+  },
+  StringBuffer: {
+    "^": "Object;_contents<",
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    get$isEmpty: function(_) {
+      return this._contents.length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._contents.length !== 0;
+    },
+    write$1: function(obj) {
+      this._contents += typeof obj === "string" ? obj : H.S(obj);
+    },
+    writeAll$2: function(objects, separator) {
+      var iterator, str;
+      iterator = J.get$iterator$ax(objects);
+      if (!iterator.moveNext$0())
+        return;
+      if (separator.length === 0)
+        do {
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        } while (iterator.moveNext$0());
+      else {
+        this.write$1(iterator.get$current());
+        for (; iterator.moveNext$0();) {
+          this._contents += separator;
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        }
+      }
+    },
+    clear$0: function(_) {
+      this._contents = "";
+    },
+    toString$0: function(_) {
+      return this._contents;
+    },
+    StringBuffer$1: function($content) {
+      if (typeof $content === "string")
+        this._contents = $content;
+      else
+        this.write$1($content);
+    },
+    static: {StringBuffer$: function($content) {
+        var t1 = new P.StringBuffer("");
+        t1.StringBuffer$1($content);
+        return t1;
+      }}
+  },
+  Symbol: {
+    "^": "Object;",
+    $isSymbol: true
+  },
+  Type: {
+    "^": "Object;",
+    $isType: true
+  },
+  Uri: {
+    "^": "Object;_host,_port,_path,scheme,userInfo,query,fragment,_pathSegments,_queryParameters",
+    get$host: function(_) {
+      var t1;
+      if (C.JSString_methods.startsWith$1(this._host, "[")) {
+        t1 = this._host;
+        return C.JSString_methods.substring$2(t1, 1, t1.length - 1);
+      }
+      return this._host;
+    },
+    get$port: function(_) {
+      var t1;
+      if (J.$eq(this._port, 0)) {
+        t1 = this.scheme;
+        if (t1 === "http")
+          return 80;
+        if (t1 === "https")
+          return 443;
+      }
+      return this._port;
+    },
+    get$path: function(_) {
+      return this._path;
+    },
+    _makePath$2: function(path, pathSegments) {
+      var t1, result;
+      t1 = path == null;
+      if (t1 && true)
+        return "";
+      t1 = !t1;
+      if (t1)
+        ;
+      result = t1 ? P.Uri__normalize(path) : C.JSNull_methods.map$1(pathSegments, new P.Uri__makePath_closure()).join$1(0, "/");
+      if ((this.get$host(this) !== "" || this.scheme === "file") && J.getInterceptor$asx(result).get$isNotEmpty(result) && !C.JSString_methods.startsWith$1(result, "/"))
+        return "/" + H.S(result);
+      return result;
+    },
+    _merge$2: function(base, reference) {
+      if (base === "")
+        return "/" + H.S(reference);
+      return C.JSString_methods.substring$2(base, 0, J.getInterceptor$asx(base).lastIndexOf$1(base, "/") + 1) + H.S(reference);
+    },
+    _hasDotSegments$1: function(path) {
+      if (path.length > 0 && J.codeUnitAt$1$s(path, 0) === 58)
+        return true;
+      return J.indexOf$1$asx(path, "/.") !== -1;
+    },
+    _removeDotSegments$1: function(path) {
+      var output, t1, appendSlash, segment, t2;
+      if (!this._hasDotSegments$1(path))
+        return path;
+      output = [];
+      for (t1 = path.split("/"), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), appendSlash = false; t1.moveNext$0();) {
+        segment = t1._current;
+        if (J.$eq(segment, "..")) {
+          t2 = output.length;
+          if (t2 !== 0)
+            if (t2 === 1) {
+              if (0 >= t2)
+                return H.ioore(output, 0);
+              t2 = !J.$eq(output[0], "");
+            } else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2) {
+            if (0 >= output.length)
+              return H.ioore(output, 0);
+            output.pop();
+          }
+          appendSlash = true;
+        } else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      if (appendSlash)
+        output.push("");
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    toString$0: function(_) {
+      var sb, t1;
+      sb = P.StringBuffer$("");
+      t1 = this.scheme;
+      if ("" !== t1) {
+        sb.write$1(t1);
+        sb.write$1(":");
+      }
+      if (this.get$host(this) !== "" || t1 === "file") {
+        sb.write$1("//");
+        t1 = this.userInfo;
+        if ("" !== t1) {
+          sb.write$1(t1);
+          sb.write$1("@");
+        }
+        sb.write$1(this._host);
+        if (!J.$eq(this._port, 0)) {
+          sb.write$1(":");
+          sb.write$1(J.toString$0(this._port));
+        }
+      }
+      sb.write$1(this._path);
+      t1 = this.query;
+      if ("" !== t1) {
+        sb.write$1("?");
+        sb.write$1(t1);
+      }
+      t1 = this.fragment;
+      if ("" !== t1) {
+        sb.write$1("#");
+        sb.write$1(t1);
+      }
+      return sb._contents;
+    },
+    $eq: function(_, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isUri)
+        return false;
+      t2 = this.scheme;
+      t3 = other.scheme;
+      if (t2 == null ? t3 == null : t2 === t3)
+        if (this.userInfo === other.userInfo)
+          if (this.get$host(this) === t1.get$host(other))
+            if (J.$eq(this.get$port(this), t1.get$port(other))) {
+              t1 = this._path;
+              t2 = other._path;
+              if (t1 == null ? t2 == null : t1 === t2) {
+                t1 = this.query;
+                t2 = other.query;
+                if (t1 == null ? t2 == null : t1 === t2) {
+                  t1 = this.fragment;
+                  t2 = other.fragment;
+                  t2 = t1 == null ? t2 == null : t1 === t2;
+                  t1 = t2;
+                } else
+                  t1 = false;
+              } else
+                t1 = false;
+            } else
+              t1 = false;
+          else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = new P.Uri_hashCode_combine();
+      return t1.call$2(this.scheme, t1.call$2(this.userInfo, t1.call$2(this.get$host(this), t1.call$2(this.get$port(this), t1.call$2(this._path, t1.call$2(this.query, t1.call$2(this.fragment, 1)))))));
+    },
+    Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+      if (scheme === "http" && J.$eq(port, 80))
+        this._port = 0;
+      else if (scheme === "https" && J.$eq(port, 443))
+        this._port = 0;
+      else
+        this._port = port;
+      this._path = this._makePath$2(path, pathSegments);
+    },
+    $isUri: true,
+    static: {"^": "Uri__SPACE,Uri__DOUBLE_QUOTE,Uri__NUMBER_SIGN,Uri__PERCENT,Uri__ASTERISK,Uri__PLUS,Uri__SLASH,Uri__ZERO,Uri__NINE,Uri__COLON,Uri__LESS,Uri__GREATER,Uri__QUESTION,Uri__AT_SIGN,Uri__UPPER_CASE_A,Uri__UPPER_CASE_F,Uri__UPPER_CASE_Z,Uri__LEFT_BRACKET,Uri__BACKSLASH,Uri__RIGHT_BRACKET,Uri__LOWER_CASE_A,Uri__LOWER_CASE_F,Uri__LOWER_CASE_Z,Uri__BAR,Uri__unreservedTable,Uri__unreserved2396Table,Uri__encodeFullTable,Uri__schemeTable,Uri__schemeLowerTable,Uri__subDelimitersTable,Uri__regNameTable,Uri__pathCharTable,Uri__queryCharTable", Uri_parse: function(uri) {
+        var port, portStr, t1, t2, $length, index, schemeEndIndex, index0, codeUnit, t3, authorityEndIndex, portIndex, userInfoEndIndex, authorityEndIndex0, pathEndIndex, pathEndIndex0, queryEndIndex, queryEndIndex0, scheme, startIndex, userInfo, exception, host, path, query, fragment;
+        t1 = new P.Uri_parse_isRegName();
+        t2 = new P.Uri_parse_ipV6Address(uri);
+        $length = uri.length;
+        if ($length === 0)
+          return P.Uri$("", "", null, null, 0, null, null, null, "");
+        if (J.codeUnitAt$1$s(uri, 0) !== 47)
+          for (index = 0; schemeEndIndex = 0, index < $length; index = index0) {
+            index0 = index + 1;
+            if (index >= $length)
+              H.throwExpression(P.RangeError$value(index));
+            codeUnit = uri.charCodeAt(index);
+            if (codeUnit < 128) {
+              t3 = codeUnit >>> 4;
+              if (t3 >= 8)
+                return H.ioore(C.List_JYB, t3);
+              t3 = (C.List_JYB[t3] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t3 = false;
+            if (!t3) {
+              if (codeUnit === 58) {
+                schemeEndIndex = index0;
+                index = schemeEndIndex;
+              } else {
+                index = index0 - 1;
+                schemeEndIndex = 0;
+              }
+              break;
+            }
+          }
+        else {
+          index = 0;
+          schemeEndIndex = 0;
+        }
+        if (schemeEndIndex === index) {
+          t3 = schemeEndIndex + 1;
+          t3 = t3 < $length && C.JSString_methods.codeUnitAt$1(uri, schemeEndIndex) === 47 && C.JSString_methods.codeUnitAt$1(uri, t3) === 47;
+        } else
+          t3 = false;
+        if (t3) {
+          authorityEndIndex = schemeEndIndex + 2;
+          for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), userInfoEndIndex = -1, t3.$lt(authorityEndIndex, $length);) {
+            authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+            if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+              H.throwExpression(P.ArgumentError$(authorityEndIndex));
+            if (t3.$lt(authorityEndIndex, 0))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            if (t3.$ge(authorityEndIndex, $length))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            codeUnit = uri.charCodeAt(authorityEndIndex);
+            if (t1.call$1(codeUnit) !== true)
+              if (codeUnit === 91)
+                authorityEndIndex = t2.call$1(authorityEndIndex0);
+              else {
+                if (J.$eq(portIndex, -1) && codeUnit === 58)
+                  ;
+                else {
+                  t3 = codeUnit === 64 || codeUnit === 58;
+                  authorityEndIndex = authorityEndIndex0 - 1;
+                  if (t3) {
+                    userInfoEndIndex = C.JSString_methods.indexOf$2(uri, "@", authorityEndIndex);
+                    if (userInfoEndIndex === -1) {
+                      authorityEndIndex = index;
+                      break;
+                    }
+                    authorityEndIndex = userInfoEndIndex + 1;
+                    for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), t3.$lt(authorityEndIndex, $length);) {
+                      authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+                      if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+                        H.throwExpression(P.ArgumentError$(authorityEndIndex));
+                      if (t3.$lt(authorityEndIndex, 0))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      if (t3.$ge(authorityEndIndex, $length))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      codeUnit = uri.charCodeAt(authorityEndIndex);
+                      if (t1.call$1(codeUnit) !== true)
+                        if (codeUnit === 91)
+                          authorityEndIndex = t2.call$1(authorityEndIndex0);
+                        else {
+                          if (codeUnit === 58) {
+                            if (!J.$eq(portIndex, -1))
+                              throw H.wrapException(P.FormatException$("Double port in host"));
+                          } else {
+                            authorityEndIndex = authorityEndIndex0 - 1;
+                            break;
+                          }
+                          authorityEndIndex = authorityEndIndex0;
+                          portIndex = authorityEndIndex;
+                        }
+                      else
+                        authorityEndIndex = authorityEndIndex0;
+                    }
+                    break;
+                  } else {
+                    userInfoEndIndex = -1;
+                    break;
+                  }
+                }
+                authorityEndIndex = authorityEndIndex0;
+                portIndex = authorityEndIndex;
+              }
+            else
+              authorityEndIndex = authorityEndIndex0;
+          }
+        } else {
+          authorityEndIndex = schemeEndIndex;
+          userInfoEndIndex = -1;
+          portIndex = -1;
+        }
+        for (pathEndIndex = authorityEndIndex; t1 = J.getInterceptor$n(pathEndIndex), t1.$lt(pathEndIndex, $length); pathEndIndex = pathEndIndex0) {
+          pathEndIndex0 = t1.$add(pathEndIndex, 1);
+          if (typeof pathEndIndex !== "number" || Math.floor(pathEndIndex) !== pathEndIndex)
+            H.throwExpression(P.ArgumentError$(pathEndIndex));
+          if (t1.$lt(pathEndIndex, 0))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          if (t1.$ge(pathEndIndex, $length))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          codeUnit = uri.charCodeAt(pathEndIndex);
+          if (codeUnit === 63 || codeUnit === 35) {
+            pathEndIndex = pathEndIndex0 - 1;
+            break;
+          }
+        }
+        t1 = J.getInterceptor$n(pathEndIndex);
+        if (t1.$lt(pathEndIndex, $length) && C.JSString_methods.codeUnitAt$1(uri, pathEndIndex) === 63)
+          for (queryEndIndex = pathEndIndex; t2 = J.getInterceptor$n(queryEndIndex), t2.$lt(queryEndIndex, $length); queryEndIndex = queryEndIndex0) {
+            queryEndIndex0 = t2.$add(queryEndIndex, 1);
+            if (typeof queryEndIndex !== "number" || Math.floor(queryEndIndex) !== queryEndIndex)
+              H.throwExpression(P.ArgumentError$(queryEndIndex));
+            if (t2.$lt(queryEndIndex, 0))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (t2.$ge(queryEndIndex, $length))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (uri.charCodeAt(queryEndIndex) === 35) {
+              queryEndIndex = queryEndIndex0 - 1;
+              break;
+            }
+          }
+        else
+          queryEndIndex = pathEndIndex;
+        scheme = schemeEndIndex > 0 ? C.JSString_methods.substring$2(uri, 0, schemeEndIndex - 1) : null;
+        port = 0;
+        if (schemeEndIndex !== authorityEndIndex) {
+          startIndex = schemeEndIndex + 2;
+          if (userInfoEndIndex > 0) {
+            userInfo = C.JSString_methods.substring$2(uri, startIndex, userInfoEndIndex);
+            startIndex = userInfoEndIndex + 1;
+          } else
+            userInfo = "";
+          t2 = J.getInterceptor$n(portIndex);
+          if (t2.$gt(portIndex, 0)) {
+            portStr = C.JSString_methods.substring$2(uri, portIndex, authorityEndIndex);
+            try {
+              port = H.Primitives_parseInt(portStr, null, null);
+            } catch (exception) {
+              H.unwrapException(exception);
+              throw H.wrapException(P.FormatException$("Invalid port: '" + H.S(portStr) + "'"));
+            }
+
+            host = C.JSString_methods.substring$2(uri, startIndex, t2.$sub(portIndex, 1));
+          } else
+            host = C.JSString_methods.substring$2(uri, startIndex, authorityEndIndex);
+        } else {
+          host = "";
+          userInfo = "";
+        }
+        path = C.JSString_methods.substring$2(uri, authorityEndIndex, pathEndIndex);
+        query = t1.$lt(pathEndIndex, queryEndIndex) ? C.JSString_methods.substring$2(uri, t1.$add(pathEndIndex, 1), queryEndIndex) : "";
+        t1 = J.getInterceptor$n(queryEndIndex);
+        fragment = t1.$lt(queryEndIndex, $length) ? C.JSString_methods.substring$2(uri, t1.$add(queryEndIndex, 1), $length) : "";
+        return P.Uri$(fragment, host, path, null, port, query, null, scheme, userInfo);
+      }, Uri$: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+        var t1 = P.Uri__makeScheme(scheme);
+        t1 = new P.Uri(P.Uri__makeHost(host), null, null, t1, userInfo, P.Uri__makeQuery(query, queryParameters), P.Uri__makeFragment(fragment), null, null);
+        t1.Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo);
+        return t1;
+      }, Uri__makeHost: function(host) {
+        var t1, i;
+        if (host.length === 0)
+          return host;
+        if (C.JSString_methods.codeUnitAt$1(host, 0) === 91) {
+          t1 = host.length - 1;
+          if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93)
+            throw H.wrapException(P.FormatException$("Missing end `]` to match `[` in host"));
+          P.Uri_parseIPv6Address(C.JSString_methods.substring$2(host, 1, t1));
+          return host;
+        }
+        for (t1 = host.length, i = 0; i < t1; ++i) {
+          if (i >= t1)
+            H.throwExpression(P.RangeError$value(i));
+          if (host.charCodeAt(i) === 58) {
+            P.Uri_parseIPv6Address(host);
+            return "[" + host + "]";
+          }
+        }
+        return host;
+      }, Uri__makeScheme: function(scheme) {
+        var t1, $length, allLowercase, i, codeUnit, t2;
+        t1 = new P.Uri__makeScheme_isSchemeLowerCharacter();
+        if (scheme == null)
+          return "";
+        $length = scheme.length;
+        for (allLowercase = true, i = 0; i < $length; ++i) {
+          if (i >= $length)
+            H.throwExpression(P.RangeError$value(i));
+          codeUnit = scheme.charCodeAt(i);
+          if (i === 0) {
+            if (!(codeUnit >= 97 && codeUnit <= 122))
+              t2 = codeUnit >= 65 && codeUnit <= 90;
+            else
+              t2 = true;
+            t2 = !t2;
+          } else
+            t2 = false;
+          if (t2)
+            throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+          if (t1.call$1(codeUnit) !== true) {
+            if (codeUnit < 128) {
+              t2 = codeUnit >>> 4;
+              if (t2 >= 8)
+                return H.ioore(C.List_JYB, t2);
+              t2 = (C.List_JYB[t2] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t2 = false;
+            if (t2)
+              ;
+            else
+              throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+            allLowercase = false;
+          }
+        }
+        return allLowercase ? scheme : scheme.toLowerCase();
+      }, Uri__makeQuery: function(query, queryParameters) {
+        var t1, t2, result;
+        t1 = {};
+        t2 = query == null;
+        if (t2 && true)
+          return "";
+        t2 = !t2;
+        if (t2)
+          ;
+        if (t2)
+          return P.Uri__normalize(query);
+        result = P.StringBuffer$("");
+        t1.first_0 = true;
+        C.JSNull_methods.forEach$1(queryParameters, new P.Uri__makeQuery_closure(t1, result));
+        return result._contents;
+      }, Uri__makeFragment: function(fragment) {
+        if (fragment == null)
+          return "";
+        return P.Uri__normalize(fragment);
+      }, Uri__normalize: function(component) {
+        var t1, index, t2, t3, t4, t5, $length, t6, t7, codeUnit1, codeUnit2, decodedCodeUnit, t8, next;
+        t1 = {};
+        index = J.getInterceptor$asx(component).indexOf$1(component, "%");
+        t1.index_0 = index;
+        if (index < 0)
+          return component;
+        t2 = new P.Uri__normalize_isNormalizedHexDigit();
+        t3 = new P.Uri__normalize_isUnreserved();
+        t4 = new P.Uri__normalize_normalizeHexDigit(component, t2, new P.Uri__normalize_isLowerCaseHexDigit());
+        t5 = new P.Uri__normalize_decodeHexDigitPair(component);
+        t1.result_1 = null;
+        $length = component.length;
+        t1.prevIndex_2 = 0;
+        t6 = new P.Uri__normalize_fillResult(t1, component);
+        for (t7 = index; t7 < $length;) {
+          if ($length < t7 + 2)
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + component));
+          codeUnit1 = C.JSString_methods.codeUnitAt$1(component, t7 + 1);
+          codeUnit2 = C.JSString_methods.codeUnitAt$1(component, t1.index_0 + 2);
+          decodedCodeUnit = t5.call$1(t1.index_0 + 1);
+          if (t2.call$1(codeUnit1) === true && t2.call$1(codeUnit2) === true && t3.call$1(decodedCodeUnit) !== true)
+            t7 = t1.index_0 += 3;
+          else {
+            t6.call$0();
+            t7 = t3.call$1(decodedCodeUnit);
+            t8 = t1.result_1;
+            if (t7 === true) {
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(decodedCodeUnit);
+              t8._contents += t7;
+            } else {
+              t8.toString;
+              t8._contents += "%";
+              t7 = t4.call$1(t1.index_0 + 1);
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(t7);
+              t8._contents += t7;
+              t7 = t1.result_1;
+              t8 = t4.call$1(t1.index_0 + 2);
+              t7.toString;
+              t8 = H.Primitives_stringFromCharCode(t8);
+              t7._contents += t8;
+            }
+            t7 = t1.index_0 += 3;
+            t1.prevIndex_2 = t7;
+          }
+          next = C.JSString_methods.indexOf$2(component, "%", t7);
+          if (next >= t1.index_0) {
+            t1.index_0 = next;
+            t7 = next;
+          } else {
+            t1.index_0 = $length;
+            t7 = $length;
+          }
+        }
+        if (t1.result_1 == null)
+          return component;
+        if (t1.prevIndex_2 !== t7)
+          t6.call$0();
+        return J.toString$0(t1.result_1);
+      }, Uri_parseIPv4Address: function(host) {
+        var t1, bytes;
+        t1 = new P.Uri_parseIPv4Address_error();
+        bytes = host.split(".");
+        if (bytes.length !== 4)
+          t1.call$1("IPv4 address should contain exactly 4 parts");
+        return H.setRuntimeTypeInfo(new H.MappedListIterable(bytes, new P.Uri_parseIPv4Address_closure(t1)), [null, null]).toList$0(0);
+      }, Uri_parseIPv6Address: function(host) {
+        var error, parseHex, parts, partStart, last, wildcardSeen, i, t1, t2, atEnd, isLastWildcard, exception;
+        error = new P.Uri_parseIPv6Address_error();
+        parseHex = new P.Uri_parseIPv6Address_parseHex(host, error);
+        if (J.get$length$asx(host) < 2)
+          error.call$1("address is too short");
+        parts = [];
+        partStart = 0;
+        wildcardSeen = false;
+        i = 0;
+        while (true) {
+          t1 = J.get$length$asx(host);
+          if (typeof t1 !== "number")
+            return H.iae(t1);
+          if (!(i < t1))
+            break;
+          t1 = host;
+          t2 = J.get$length$asx(t1);
+          if (typeof t2 !== "number")
+            return H.iae(t2);
+          if (i >= t2)
+            H.throwExpression(P.RangeError$value(i));
+          if (t1.charCodeAt(i) === 58) {
+            if (i === 0) {
+              ++i;
+              t1 = host;
+              if (i >= J.get$length$asx(t1))
+                H.throwExpression(P.RangeError$value(i));
+              if (t1.charCodeAt(i) !== 58)
+                error.call$1("invalid start colon.");
+              partStart = i;
+            }
+            if (i === partStart) {
+              if (wildcardSeen)
+                error.call$1("only one wildcard `::` is allowed");
+              J.add$1$ax(parts, -1);
+              wildcardSeen = true;
+            } else
+              J.add$1$ax(parts, parseHex.call$2(partStart, i));
+            partStart = i + 1;
+          }
+          ++i;
+        }
+        if (J.get$length$asx(parts) === 0)
+          error.call$1("too few parts");
+        atEnd = J.$eq(partStart, J.get$length$asx(host));
+        isLastWildcard = J.$eq(J.get$last$ax(parts), -1);
+        if (atEnd && !isLastWildcard)
+          error.call$1("expected a part after last `:`");
+        if (!atEnd)
+          try {
+            J.add$1$ax(parts, parseHex.call$2(partStart, J.get$length$asx(host)));
+          } catch (exception) {
+            H.unwrapException(exception);
+            try {
+              last = P.Uri_parseIPv4Address(J.substring$1$s(host, partStart));
+              t1 = J.$shl$n(J.$index$asx(last, 0), 8);
+              t2 = J.$index$asx(last, 1);
+              if (typeof t2 !== "number")
+                return H.iae(t2);
+              J.add$1$ax(parts, (t1 | t2) >>> 0);
+              t2 = J.$shl$n(J.$index$asx(last, 2), 8);
+              t1 = J.$index$asx(last, 3);
+              if (typeof t1 !== "number")
+                return H.iae(t1);
+              J.add$1$ax(parts, (t2 | t1) >>> 0);
+            } catch (exception) {
+              H.unwrapException(exception);
+              error.call$1("invalid end of IPv6 address.");
+            }
+
+          }
+
+        if (wildcardSeen) {
+          if (J.get$length$asx(parts) > 7)
+            error.call$1("an address with a wildcard must have less than 7 parts");
+        } else if (J.get$length$asx(parts) !== 8)
+          error.call$1("an address without a wildcard must contain exactly 8 parts");
+        t1 = new H.ExpandIterable(parts, new P.Uri_parseIPv6Address_closure(parts));
+        t1.$builtinTypeInfo = [null, null];
+        return P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+      }, Uri__uriEncode: function(canonicalTable, text, encoding, spaceToPlus) {
+        var t1, result, bytes, i, $byte, t2, t3;
+        t1 = new P.Uri__uriEncode_byteToHex();
+        result = P.StringBuffer$("");
+        bytes = encoding.get$encoder().convert$1(text);
+        for (i = 0; i < bytes.length; ++i) {
+          $byte = bytes[i];
+          t2 = J.getInterceptor$n($byte);
+          if (t2.$lt($byte, 128)) {
+            t3 = t2.$shr($byte, 4);
+            if (t3 >= 8)
+              return H.ioore(canonicalTable, t3);
+            t3 = (canonicalTable[t3] & C.JSInt_methods._shlPositive$1(1, t2.$and($byte, 15))) !== 0;
+          } else
+            t3 = false;
+          if (t3) {
+            t2 = H.Primitives_stringFromCharCode($byte);
+            result._contents += t2;
+          } else if (spaceToPlus && t2.$eq($byte, 32)) {
+            t2 = H.Primitives_stringFromCharCode(43);
+            result._contents += t2;
+          } else {
+            t2 = H.Primitives_stringFromCharCode(37);
+            result._contents += t2;
+            t1.call$2($byte, result);
+          }
+        }
+        return result._contents;
+      }}
+  },
+  Uri_parse_isRegName: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_qNA, t1);
+        t1 = (C.List_qNA[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri_parse_ipV6Address: {
+    "^": "Closure:125;uri_0",
+    call$1: function(index) {
+      index = J.indexOf$2$asx(this.uri_0, "]", index);
+      if (index === -1)
+        throw H.wrapException(P.FormatException$("Bad end of IPv6 host"));
+      return index + 1;
+    },
+    $isFunction: true
+  },
+  Uri__makeScheme_isSchemeLowerCharacter: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_6Pr, t1);
+        t1 = (C.List_6Pr[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__makePath_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return P.Uri__uriEncode(C.List_qg4, s, C.Utf8Codec_false, false);
+    },
+    $isFunction: true
+  },
+  Uri__makeQuery_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1("&");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, key, C.Utf8Codec_false, true));
+      value.get$isEmpty(value);
+      t1.write$1("=");
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, value, C.Utf8Codec_false, true));
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isNormalizedHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      var t1;
+      if (!(48 <= digit && digit <= 57))
+        t1 = 65 <= digit && digit <= 70;
+      else
+        t1 = true;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isLowerCaseHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      return 97 <= digit && digit <= 102;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isUnreserved: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = C.JSInt_methods._shrOtherPositive$1(ch, 4);
+        if (t1 >= 8)
+          return H.ioore(C.List_nxB, t1);
+        t1 = (C.List_nxB[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_normalizeHexDigit: {
+    "^": "Closure:125;component_1,isNormalizedHexDigit_2,isLowerCaseHexDigit_3",
+    call$1: function(index) {
+      var t1, codeUnit;
+      t1 = this.component_1;
+      codeUnit = J.codeUnitAt$1$s(t1, index);
+      if (this.isLowerCaseHexDigit_3.call$1(codeUnit) === true)
+        return codeUnit - 32;
+      else if (this.isNormalizedHexDigit_2.call$1(codeUnit) !== true)
+        throw H.wrapException(P.ArgumentError$("Invalid URI component: " + t1));
+      else
+        return codeUnit;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_decodeHexDigitPair: {
+    "^": "Closure:125;component_4",
+    call$1: function(index) {
+      var t1, t2, $byte, i, codeUnit;
+      for (t1 = this.component_4, t2 = J.getInterceptor$s(t1), $byte = 0, i = 0; i < 2; ++i) {
+        codeUnit = t2.codeUnitAt$1(t1, index + i);
+        if (48 <= codeUnit && codeUnit <= 57)
+          $byte = $byte * 16 + codeUnit - 48;
+        else {
+          codeUnit |= 32;
+          if (97 <= codeUnit && codeUnit <= 102)
+            $byte = $byte * 16 + codeUnit - 97 + 10;
+          else
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + t1));
+        }
+      }
+      return $byte;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_fillResult: {
+    "^": "Closure:18;box_0,component_5",
+    call$0: function() {
+      var t1, t2, t3, t4, t5;
+      t1 = this.box_0;
+      t2 = t1.result_1;
+      t3 = t1.prevIndex_2;
+      t4 = this.component_5;
+      t5 = t1.index_0;
+      if (t2 == null)
+        t1.result_1 = P.StringBuffer$(J.substring$2$s(t4, t3, t5));
+      else
+        t2.write$1(J.substring$2$s(t4, t3, t5));
+    },
+    $isFunction: true
+  },
+  Uri_hashCode_combine: {
+    "^": "Closure:126;",
+    call$2: function(part, current) {
+      var t1 = J.get$hashCode$(part);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return current * 31 + t1 & 1073741823;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_closure: {
+    "^": "Closure:13;error_0",
+    call$1: [function(byteString) {
+      var $byte, t1;
+      $byte = H.Primitives_parseInt(byteString, null, null);
+      t1 = J.getInterceptor$n($byte);
+      if (t1.$lt($byte, 0) || t1.$gt($byte, 255))
+        this.error_0.call$1("each part must be in the range of `0..255`");
+      return $byte;
+    }, "call$1", null, 2, 0, null, 127, "call"],
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_parseHex: {
+    "^": "Closure:87;host_0,error_1",
+    call$2: function(start, end) {
+      var value, t1;
+      if (end - start > 4)
+        this.error_1.call$1("an IPv6 part can only contain a maximum of 4 hex digits");
+      value = H.Primitives_parseInt(C.JSString_methods.substring$2(this.host_0, start, end), 16, null);
+      t1 = J.getInterceptor$n(value);
+      if (t1.$lt(value, 0) || t1.$gt(value, 65535))
+        this.error_1.call$1("each part must be in the range of `0x0..0xFFFF`");
+      return value;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_closure: {
+    "^": "Closure:13;parts_2",
+    call$1: function(value) {
+      var t1 = J.getInterceptor(value);
+      if (t1.$eq(value, -1))
+        return P.List_List$filled((9 - this.parts_2.length) * 2, 0, null);
+      else
+        return [t1.$shr(value, 8) & 255, t1.$and(value, 255)];
+    },
+    $isFunction: true
+  },
+  Uri__uriEncode_byteToHex: {
+    "^": "Closure:75;",
+    call$2: function($byte, buffer) {
+      var t1 = J.getInterceptor$n($byte);
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$shr($byte, 4))));
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$and($byte, 15))));
+    },
+    $isFunction: true
+  }
+}],
+["dart.dom.html", "dart:html", , W, {
+  "^": "",
+  CustomEvent_CustomEvent: function(type, canBubble, cancelable, detail) {
+    var e, t1, exception;
+    e = document.createEvent("CustomEvent");
+    J.set$_dartDetail$x(e, detail);
+    if (!J.getInterceptor(detail).$isList)
+      if (!J.getInterceptor(detail).$isMap) {
+        t1 = detail;
+        if (typeof t1 !== "string") {
+          t1 = detail;
+          t1 = typeof t1 === "number";
+        } else
+          t1 = true;
+      } else
+        t1 = true;
+    else
+      t1 = true;
+    if (t1)
+      try {
+        detail = P._convertDartToNative_PrepareForStructuredClone(detail);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
+      } catch (exception) {
+        H.unwrapException(exception);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+      }
+
+    else
+      J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+    return e;
+  },
+  _ElementFactoryProvider_createElement_tag: function(tag, typeExtension) {
+    return document.createElement(tag);
+  },
+  HttpRequest_request: function(url, method, mimeType, onProgress, requestHeaders, responseType, sendData, withCredentials) {
+    var t1, completer, xhr;
+    t1 = W.HttpRequest;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t1)), [t1]);
+    xhr = new XMLHttpRequest();
+    C.HttpRequest_methods.open$3$async(xhr, "GET", url, true);
+    requestHeaders.forEach$1(0, new W.HttpRequest_request_closure(xhr));
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_load._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new W.HttpRequest_request_closure0(completer, xhr)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_error._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(completer.get$completeError()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    xhr.send();
+    return completer.future;
+  },
+  InputElement_InputElement: function(type) {
+    var e, exception;
+    e = document.createElement("input", null);
+    if (type != null)
+      try {
+        J.set$type$x(e, type);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return e;
+  },
+  _JenkinsSmiHash_combine: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _convertNativeToDart_Window: function(win) {
+    if (win == null)
+      return;
+    return W._DOMWindowCrossFrame__createSafe(win);
+  },
+  _convertNativeToDart_EventTarget: function(e) {
+    var $window;
+    if (e == null)
+      return;
+    if ("setInterval" in e) {
+      $window = W._DOMWindowCrossFrame__createSafe(e);
+      if (!!J.getInterceptor($window).$isEventTarget)
+        return $window;
+      return;
+    } else
+      return e;
+  },
+  _convertDartToNative_EventTarget: function(e) {
+    return e;
+  },
+  _convertNativeToDart_XHR_Response: function(o) {
+    if (!!J.getInterceptor(o).$isDocument)
+      return o;
+    return P.convertNativeToDart_AcceptStructuredClone(o, true);
+  },
+  _callConstructor: function($constructor, interceptor) {
+    return new W._callConstructor_closure($constructor, interceptor);
+  },
+  _callAttached: [function(receiver) {
+    return J.attached$0$x(receiver);
+  }, "call$1", "_callAttached$closure", 2, 0, 13, 54],
+  _callDetached: [function(receiver) {
+    return J.detached$0$x(receiver);
+  }, "call$1", "_callDetached$closure", 2, 0, 13, 54],
+  _callAttributeChanged: [function(receiver, $name, oldValue, newValue) {
+    return J.attributeChanged$3$x(receiver, $name, oldValue, newValue);
+  }, "call$4", "_callAttributeChanged$closure", 8, 0, 55, 54, 56, 57, 58],
+  _registerCustomElement: function(context, $document, tag, type, extendsTagName) {
+    var interceptorClass, interceptor, $constructor, baseClassName, t1, baseConstructor, properties, proto, t2, options;
+    interceptorClass = J.findInterceptorConstructorForType(type);
+    if (interceptorClass == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    interceptor = interceptorClass.prototype;
+    $constructor = J.findConstructorForNativeSubclassType(type, "created");
+    if ($constructor == null)
+      throw H.wrapException(P.ArgumentError$(H.S(type) + " has no constructor called 'created'"));
+    J.getNativeInterceptor(W._ElementFactoryProvider_createElement_tag("article", null));
+    baseClassName = interceptorClass.$nativeSuperclassTag;
+    if (baseClassName == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    t1 = extendsTagName == null;
+    if (t1) {
+      if (!J.$eq(baseClassName, "HTMLElement"))
+        throw H.wrapException(P.UnsupportedError$("Class must provide extendsTag if base native class is not HtmlElement"));
+    } else if (!($document.createElement(extendsTagName) instanceof window[baseClassName]))
+      throw H.wrapException(P.UnsupportedError$("extendsTag does not match base native class"));
+    baseConstructor = context[baseClassName];
+    properties = {};
+    properties.createdCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callConstructor($constructor, interceptor), 1))};
+    properties.attachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callAttached$closure(), 1))};
+    properties.detachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callDetached$closure(), 1))};
+    properties.attributeChangedCallback = {value: function(invokeCallback) {
+        return function(arg1, arg2, arg3) {
+          return invokeCallback(this, arg1, arg2, arg3);
+        };
+      }(H.convertDartClosureToJS(W._callAttributeChanged$closure(), 4))};
+    proto = Object.create(baseConstructor.prototype, properties);
+    t2 = H.makeLeafDispatchRecord(interceptor);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: t2, enumerable: false, writable: true, configurable: true});
+    options = {prototype: proto};
+    if (!t1)
+      options.extends = extendsTagName;
+    $document.registerElement(tag, options);
+  },
+  _wrapZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    if (callback == null)
+      return;
+    return $.Zone__current.bindUnaryCallback$2$runGuarded(callback, true);
+  },
+  _wrapBinaryZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    return $.Zone__current.bindBinaryCallback$2$runGuarded(callback, true);
+  },
+  HtmlElement: {
+    "^": "Element;",
+    "%": "HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;HtmlElement_Polymer|HtmlElement_Polymer_ChangeNotifier|PolymerElement|PolymerElement_ChangeNotifier|ActionLinkElement|ObservatoryElement|ObservatoryElement_ChangeNotifier|BreakpointListElement|ObservatoryElement_ChangeNotifier0|ServiceRefElement|ClassRefElement|ObservatoryElement_ChangeNotifier1|ClassTreeElement|ObservatoryElement_ChangeNotifier2|ClassViewElement|CodeRefElement|ObservatoryElement_ChangeNotifier3|CodeViewElement|PolymerElement_ChangeNotifier0|CurlyBlockElement|ObservatoryElement_ChangeNotifier4|ErrorViewElement|ObservatoryElement_ChangeNotifier5|EvalBoxElement|PolymerElement_ChangeNotifier1|EvalLinkElement|FieldRefElement|ObservatoryElement_ChangeNotifier6|FieldViewElement|ObservatoryElement_ChangeNotifier7|FlagListElement|ObservatoryElement_ChangeNotifier8|FlagItemElement|ServiceRefElement_ChangeNotifier|FunctionRefElement|ObservatoryElement_ChangeNotifier9|FunctionViewElement|ObservatoryElement_ChangeNotifier10|HeapMapElement|ObservatoryElement_ChangeNotifier11|HeapProfileElement|InstanceRefElement|ObservatoryElement_ChangeNotifier12|InstanceViewElement|ObservatoryElement_ChangeNotifier13|IOViewElement|IORefElement|ObservatoryElement_ChangeNotifier14|IOHttpServerListViewElement|IOHttpServerRefElement|ObservatoryElement_ChangeNotifier15|IOHttpServerViewElement|ObservatoryElement_ChangeNotifier16|IOHttpServerConnectionViewElement|IOHttpServerConnectionRefElement|IOSocketRefElement|ObservatoryElement_ChangeNotifier17|IOSocketListViewElement|ObservatoryElement_ChangeNotifier18|IOSocketViewElement|IOWebSocketRefElement|ObservatoryElement_ChangeNotifier19|IOWebSocketListViewElement|ObservatoryElement_ChangeNotifier20|IOWebSocketViewElement|ObservatoryElement_ChangeNotifier21|IORandomAccessFileListViewElement|IORandomAccessFileRefElement|ObservatoryElement_ChangeNotifier22|IORandomAccessFileViewElement|ObservatoryElement_ChangeNotifier23|IOProcessListViewElement|ServiceRefElement_ChangeNotifier0|IOProcessRefElement|ObservatoryElement_ChangeNotifier24|IOProcessViewElement|ObservatoryElement_ChangeNotifier25|IsolateProfileElement|IsolateRefElement|ObservatoryElement_ChangeNotifier26|IsolateSummaryElement|ObservatoryElement_ChangeNotifier27|IsolateRunStateElement|ObservatoryElement_ChangeNotifier28|IsolateLocationElement|ObservatoryElement_ChangeNotifier29|IsolateSharedSummaryElement|ObservatoryElement_ChangeNotifier30|IsolateCounterChartElement|ObservatoryElement_ChangeNotifier31|IsolateViewElement|ObservatoryElement_ChangeNotifier32|JsonViewElement|LibraryRefElement|ObservatoryElement_ChangeNotifier33|LibraryViewElement|ObservatoryElement_ChangeNotifier34|NavBarElement|ObservatoryElement_ChangeNotifier35|NavMenuElement|ObservatoryElement_ChangeNotifier36|NavMenuItemElement|ObservatoryElement_ChangeNotifier37|NavRefreshElement|NavControlElement|ObservatoryElement_ChangeNotifier38|TopNavMenuElement|ObservatoryElement_ChangeNotifier39|IsolateNavMenuElement|ObservatoryElement_ChangeNotifier40|LibraryNavMenuElement|ObservatoryElement_ChangeNotifier41|ClassNavMenuElement|ObservatoryElement_ChangeNotifier42|ObservatoryApplicationElement|ObservatoryElement_ChangeNotifier43|ScriptInsetElement|ServiceRefElement_ChangeNotifier1|ScriptRefElement|ObservatoryElement_ChangeNotifier44|ScriptViewElement|ObservatoryElement_ChangeNotifier45|ServiceErrorViewElement|ObservatoryElement_ChangeNotifier46|ServiceExceptionViewElement|ObservatoryElement_ChangeNotifier47|ServiceObjectViewElement|PolymerElement_ChangeNotifier2|SlidingCheckboxElement|ObservatoryElement_ChangeNotifier48|StackFrameElement|ObservatoryElement_ChangeNotifier49|StackTraceElement|VMRefElement|ObservatoryElement_ChangeNotifier50|VMViewElement"
+  },
+  _EntryArray: {
+    "^": "Interceptor;",
+    $isList: true,
+    $asList: function() {
+      return [W.Entry];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Entry];
+    },
+    "%": "EntryArray"
+  },
+  AnchorElement: {
+    "^": "HtmlElement;target=,type%,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAnchorElement"
+  },
+  AreaElement: {
+    "^": "HtmlElement;target=,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAreaElement"
+  },
+  BaseElement: {
+    "^": "HtmlElement;href%,target=",
+    "%": "HTMLBaseElement"
+  },
+  Blob: {
+    "^": "Interceptor;type=",
+    $isBlob: true,
+    "%": ";Blob"
+  },
+  BodyElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLBodyElement"
+  },
+  ButtonElement: {
+    "^": "HtmlElement;form=,name%,type%,value%",
+    "%": "HTMLButtonElement"
+  },
+  CanvasElement: {
+    "^": "HtmlElement;height},width}",
+    get$context2D: function(receiver) {
+      return receiver.getContext("2d");
+    },
+    "%": "HTMLCanvasElement"
+  },
+  CanvasRenderingContext: {
+    "^": "Interceptor;",
+    "%": ";CanvasRenderingContext"
+  },
+  CanvasRenderingContext2D: {
+    "^": "CanvasRenderingContext;",
+    putImageData$7: function(receiver, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+      var t1;
+      if (dirtyWidth != null)
+        t1 = true;
+      else
+        t1 = false;
+      if (t1) {
+        receiver.putImageData(P.convertDartToNative_ImageData(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+        return;
+      }
+      throw H.wrapException(P.ArgumentError$("Incorrect number or type of arguments"));
+    },
+    "%": "CanvasRenderingContext2D"
+  },
+  CharacterData: {
+    "^": "Node;data=,length=,nextElementSibling=",
+    "%": "Comment;CharacterData"
+  },
+  CloseEvent: {
+    "^": "Event;code=",
+    "%": "CloseEvent"
+  },
+  CompositionEvent: {
+    "^": "UIEvent;data=",
+    "%": "CompositionEvent"
+  },
+  CustomEvent: {
+    "^": "Event;_dartDetail}",
+    get$detail: function(receiver) {
+      var t1 = receiver._dartDetail;
+      if (t1 != null)
+        return t1;
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.detail, true);
+    },
+    _initCustomEvent$4: function(receiver, typeArg, canBubbleArg, cancelableArg, detailArg) {
+      return receiver.initCustomEvent(typeArg, canBubbleArg, cancelableArg, detailArg);
+    },
+    $isCustomEvent: true,
+    "%": "CustomEvent"
+  },
+  DetailsElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDetailsElement"
+  },
+  DialogElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDialogElement"
+  },
+  Document: {
+    "^": "Node;",
+    createDocumentFragment$0: function(receiver) {
+      return receiver.createDocumentFragment();
+    },
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    importNode$2: function(receiver, node, deep) {
+      return receiver.importNode(node, deep);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    $isDocument: true,
+    "%": "XMLDocument;Document"
+  },
+  DocumentFragment: {
+    "^": "Node;",
+    get$children: function(receiver) {
+      if (receiver._docChildren == null)
+        receiver._docChildren = H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [null]);
+      return receiver._docChildren;
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    "%": ";DocumentFragment"
+  },
+  DomError: {
+    "^": "Interceptor;message=,name=",
+    "%": ";DOMError"
+  },
+  DomException: {
+    "^": "Interceptor;message=",
+    get$name: function(receiver) {
+      var errorName = receiver.name;
+      if (P.Device_isWebKit() === true && errorName === "SECURITY_ERR")
+        return "SecurityError";
+      if (P.Device_isWebKit() === true && errorName === "SYNTAX_ERR")
+        return "SyntaxError";
+      return errorName;
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    $isDomException: true,
+    "%": "DOMException"
+  },
+  Element: {
+    "^": "Node;title},className%,id=,tagName=,nextElementSibling=",
+    get$attributes: function(receiver) {
+      return new W._ElementAttributeMap(receiver);
+    },
+    get$children: function(receiver) {
+      return new W._ChildrenElementList(receiver, receiver.children);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    get$classes: function(receiver) {
+      return new W._ElementCssClassSet(receiver);
+    },
+    get$offset: function(receiver) {
+      return P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetHeight)), null);
+    },
+    attached$0: function(receiver) {
+    },
+    detached$0: function(receiver) {
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+    },
+    get$localName: function(receiver) {
+      return receiver.localName;
+    },
+    get$namespaceUri: function(receiver) {
+      return receiver.namespaceURI;
+    },
+    toString$0: function(receiver) {
+      return receiver.localName;
+    },
+    matches$1: function(receiver, selectors) {
+      if (!!receiver.matches)
+        return receiver.matches(selectors);
+      else if (!!receiver.webkitMatchesSelector)
+        return receiver.webkitMatchesSelector(selectors);
+      else if (!!receiver.mozMatchesSelector)
+        return receiver.mozMatchesSelector(selectors);
+      else if (!!receiver.msMatchesSelector)
+        return receiver.msMatchesSelector(selectors);
+      else if (!!receiver.oMatchesSelector)
+        return receiver.oMatchesSelector(selectors);
+      else
+        throw H.wrapException(P.UnsupportedError$("Not supported on this platform"));
+    },
+    matchesWithAncestors$1: function(receiver, selectors) {
+      var elem = receiver;
+      do {
+        if (J.matches$1$x(elem, selectors))
+          return true;
+        elem = elem.parentElement;
+      } while (elem != null);
+      return false;
+    },
+    createShadowRoot$0: function(receiver) {
+      return (receiver.createShadowRoot || receiver.webkitCreateShadowRoot).call(receiver);
+    },
+    get$on: function(receiver) {
+      return new W.ElementEvents(receiver, receiver);
+    },
+    getAttribute$1: function(receiver, $name) {
+      return receiver.getAttribute($name);
+    },
+    getBoundingClientRect$0: function(receiver) {
+      return receiver.getBoundingClientRect();
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    Element$created$0: function(receiver) {
+    },
+    $isElement: true,
+    $isEventTarget: true,
+    "%": ";Element"
+  },
+  EmbedElement: {
+    "^": "HtmlElement;height},name%,type%,width}",
+    "%": "HTMLEmbedElement"
+  },
+  ErrorEvent: {
+    "^": "Event;error=,message=",
+    "%": "ErrorEvent"
+  },
+  Event: {
+    "^": "Interceptor;_selector},path=,type=",
+    get$currentTarget: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.currentTarget);
+    },
+    get$target: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.target);
+    },
+    preventDefault$0: function(receiver) {
+      return receiver.preventDefault();
+    },
+    $isEvent: true,
+    "%": "AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"
+  },
+  EventTarget: {
+    "^": "Interceptor;",
+    get$on: function(receiver) {
+      return new W.Events(receiver);
+    },
+    addEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.addEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    addEventListener$2: function($receiver, type, listener) {
+      listener = H.convertDartClosureToJS(listener, 1);
+      return $receiver.addEventListener(type, listener);
+    },
+    dispatchEvent$1: function(receiver, $event) {
+      return receiver.dispatchEvent($event);
+    },
+    removeEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.removeEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    $isEventTarget: true,
+    "%": ";EventTarget"
+  },
+  FieldSetElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLFieldSetElement"
+  },
+  File: {
+    "^": "Blob;name=",
+    $isFile: true,
+    "%": "File"
+  },
+  FileError: {
+    "^": "DomError;code=",
+    "%": "FileError"
+  },
+  FormElement: {
+    "^": "HtmlElement;length=,name%,target=",
+    "%": "HTMLFormElement"
+  },
+  History: {
+    "^": "Interceptor;length=",
+    "%": "History"
+  },
+  HtmlCollection: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"
+  },
+  HtmlDocument: {
+    "^": "Document;",
+    get$head: function(receiver) {
+      return receiver.head;
+    },
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "HTMLDocument"
+  },
+  HttpRequest: {
+    "^": "HttpRequestEventTarget;responseText=,status=,statusText=",
+    get$response: function(receiver) {
+      return W._convertNativeToDart_XHR_Response(receiver.response);
+    },
+    open$5$async$password$user: function(receiver, method, url, async, password, user) {
+      return receiver.open(method, url, async, user, password);
+    },
+    open$3$async: function($receiver, method, url, async) {
+      return $receiver.open(method, url, async);
+    },
+    send$1: function(receiver, data) {
+      return receiver.send(data);
+    },
+    $isHttpRequest: true,
+    "%": "XMLHttpRequest"
+  },
+  HttpRequestEventTarget: {
+    "^": "EventTarget;",
+    "%": ";XMLHttpRequestEventTarget"
+  },
+  IFrameElement: {
+    "^": "HtmlElement;height},name%,width}",
+    "%": "HTMLIFrameElement"
+  },
+  ImageData: {
+    "^": "Interceptor;data=,height=,width=",
+    $isImageData: true,
+    "%": "ImageData"
+  },
+  ImageElement: {
+    "^": "HtmlElement;height},width}",
+    complete$1: function($receiver, arg0) {
+      return $receiver.complete.call$1(arg0);
+    },
+    "%": "HTMLImageElement"
+  },
+  InputElement: {
+    "^": "HtmlElement;checked%,form=,height},list=,name%,type%,value%,width}",
+    accept$1: function($receiver, arg0) {
+      return $receiver.accept.call$1(arg0);
+    },
+    $isInputElement: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true,
+    "%": "HTMLInputElement"
+  },
+  KeyboardEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "KeyboardEvent"
+  },
+  KeygenElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLKeygenElement"
+  },
+  LIElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLLIElement"
+  },
+  LabelElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLabelElement"
+  },
+  LegendElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLegendElement"
+  },
+  LinkElement: {
+    "^": "HtmlElement;href%,type%",
+    "%": "HTMLLinkElement"
+  },
+  Location: {
+    "^": "Interceptor;href=,protocol=",
+    reload$0: function(receiver) {
+      return receiver.reload();
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "Location"
+  },
+  MapElement: {
+    "^": "HtmlElement;name%",
+    "%": "HTMLMapElement"
+  },
+  MediaElement: {
+    "^": "HtmlElement;error=",
+    load$0: function(receiver) {
+      return receiver.load();
+    },
+    pause$0: [function(receiver) {
+      return receiver.pause();
+    }, "call$0", "get$pause", 0, 0, 18],
+    "%": "HTMLAudioElement;HTMLMediaElement",
+    static: {"^": "MediaElement_pauseEvent<"}
+  },
+  MediaError: {
+    "^": "Interceptor;code=",
+    "%": "MediaError"
+  },
+  MediaKeyError: {
+    "^": "Interceptor;code=",
+    "%": "MediaKeyError"
+  },
+  MediaKeyEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyEvent"
+  },
+  MediaKeyMessageEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyMessageEvent"
+  },
+  MediaStream: {
+    "^": "EventTarget;id=,label=",
+    "%": "MediaStream"
+  },
+  MessageEvent: {
+    "^": "Event;",
+    get$data: function(receiver) {
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.data, true);
+    },
+    $isMessageEvent: true,
+    "%": "MessageEvent"
+  },
+  MetaElement: {
+    "^": "HtmlElement;content=,name%",
+    "%": "HTMLMetaElement"
+  },
+  MeterElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLMeterElement"
+  },
+  MidiMessageEvent: {
+    "^": "Event;data=",
+    "%": "MIDIMessageEvent"
+  },
+  MidiOutput: {
+    "^": "MidiPort;",
+    send$2: function(receiver, data, timestamp) {
+      return receiver.send(data, timestamp);
+    },
+    send$1: function($receiver, data) {
+      return $receiver.send(data);
+    },
+    "%": "MIDIOutput"
+  },
+  MidiPort: {
+    "^": "EventTarget;id=,name=,type=,version=",
+    "%": "MIDIInput;MIDIPort"
+  },
+  MouseEvent: {
+    "^": "UIEvent;altKey=,button=,ctrlKey=,metaKey=,shiftKey=",
+    _initMouseEvent$15: function(receiver, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
+      receiver.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, W._convertDartToNative_EventTarget(relatedTarget));
+      return;
+    },
+    get$offset: function(receiver) {
+      var target, point;
+      if (!!receiver.offsetX)
+        return H.setRuntimeTypeInfo(new P.Point(receiver.offsetX, receiver.offsetY), [null]);
+      else {
+        if (!J.getInterceptor(W._convertNativeToDart_EventTarget(receiver.target)).$isElement)
+          throw H.wrapException(P.UnsupportedError$("offsetX is only supported on elements"));
+        target = W._convertNativeToDart_EventTarget(receiver.target);
+        point = H.setRuntimeTypeInfo(new P.Point(receiver.clientX, receiver.clientY), [null]).$sub(0, J.get$topLeft$x(J.getBoundingClientRect$0$x(target)));
+        return H.setRuntimeTypeInfo(new P.Point(J.toInt$0$n(point.x), J.toInt$0$n(point.y)), [null]);
+      }
+    },
+    $isMouseEvent: true,
+    "%": "DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"
+  },
+  MutationObserver: {
+    "^": "Interceptor;",
+    observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree: function(receiver, target, attributeFilter, attributeOldValue, attributes, characterData, characterDataOldValue, childList, subtree) {
+      var parsedOptions, t1;
+      parsedOptions = {};
+      t1 = new W.MutationObserver_observe_override(parsedOptions);
+      t1.call$2("childList", childList);
+      t1.call$2("attributes", attributes);
+      t1.call$2("characterData", characterData);
+      t1.call$2("subtree", subtree);
+      t1.call$2("attributeOldValue", attributeOldValue);
+      t1.call$2("characterDataOldValue", characterDataOldValue);
+      t1.call$2("attributeFilter", attributeFilter);
+      receiver.observe(target, parsedOptions);
+    },
+    observe$3$attributeFilter$attributes: function($receiver, target, attributeFilter, attributes) {
+      return this.observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree($receiver, target, attributeFilter, null, attributes, null, null, null, null);
+    },
+    "%": "MutationObserver|WebKitMutationObserver"
+  },
+  MutationRecord: {
+    "^": "Interceptor;target=,type=",
+    "%": "MutationRecord"
+  },
+  NavigatorUserMediaError: {
+    "^": "Interceptor;message=,name=",
+    "%": "NavigatorUserMediaError"
+  },
+  Node: {
+    "^": "EventTarget;firstChild=,nextNode:nextSibling=,ownerDocument=,parent:parentElement=,parentNode=,text:textContent%",
+    get$nodes: function(receiver) {
+      return new W._ChildNodeListLazy(receiver);
+    },
+    remove$0: function(receiver) {
+      var t1 = receiver.parentNode;
+      if (t1 != null)
+        t1.removeChild(receiver);
+    },
+    replaceWith$1: function(receiver, otherNode) {
+      var $parent, exception;
+      try {
+        $parent = receiver.parentNode;
+        J._replaceChild$2$x($parent, otherNode, receiver);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+      return receiver;
+    },
+    insertAllBefore$2: function(receiver, newNodes, refChild) {
+      var t1, len, i;
+      t1 = J.getInterceptor(newNodes);
+      if (!!t1.$is_ChildNodeListLazy) {
+        t1 = newNodes._this;
+        if (t1 === receiver)
+          throw H.wrapException(P.ArgumentError$(newNodes));
+        for (len = t1.childNodes.length, i = 0; i < len; ++i)
+          receiver.insertBefore(t1.firstChild, refChild);
+      } else
+        for (t1 = t1.get$iterator(newNodes); t1.moveNext$0();)
+          receiver.insertBefore(t1.get$current(), refChild);
+    },
+    _clearChildren$0: function(receiver) {
+      var t1;
+      for (; t1 = receiver.firstChild, t1 != null;)
+        receiver.removeChild(t1);
+    },
+    toString$0: function(receiver) {
+      var t1 = receiver.nodeValue;
+      return t1 == null ? J.Interceptor.prototype.toString$0.call(this, receiver) : t1;
+    },
+    append$1: function(receiver, newChild) {
+      return receiver.appendChild(newChild);
+    },
+    contains$1: function(receiver, other) {
+      return receiver.contains(other);
+    },
+    insertBefore$2: function(receiver, newChild, refChild) {
+      return receiver.insertBefore(newChild, refChild);
+    },
+    _replaceChild$2: function(receiver, newChild, oldChild) {
+      return receiver.replaceChild(newChild, oldChild);
+    },
+    $isNode: true,
+    "%": "DocumentType|Notation;Node"
+  },
+  NodeList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin0;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "NodeList|RadioNodeList"
+  },
+  OListElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLOListElement"
+  },
+  ObjectElement: {
+    "^": "HtmlElement;data=,form=,height},name%,type%,width}",
+    "%": "HTMLObjectElement"
+  },
+  OptGroupElement: {
+    "^": "HtmlElement;label%",
+    "%": "HTMLOptGroupElement"
+  },
+  OptionElement: {
+    "^": "HtmlElement;form=,index=,label%,value%",
+    $isOptionElement: true,
+    "%": "HTMLOptionElement"
+  },
+  OutputElement: {
+    "^": "HtmlElement;form=,name%,type=,value%",
+    "%": "HTMLOutputElement"
+  },
+  ParamElement: {
+    "^": "HtmlElement;name%,value%",
+    "%": "HTMLParamElement"
+  },
+  PopStateEvent: {
+    "^": "Event;",
+    $isPopStateEvent: true,
+    "%": "PopStateEvent"
+  },
+  PositionError: {
+    "^": "Interceptor;code=,message=",
+    "%": "PositionError"
+  },
+  ProcessingInstruction: {
+    "^": "CharacterData;target=",
+    "%": "ProcessingInstruction"
+  },
+  ProgressElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLProgressElement"
+  },
+  ProgressEvent: {
+    "^": "Event;loaded=",
+    $isProgressEvent: true,
+    "%": "XMLHttpRequestProgressEvent;ProgressEvent"
+  },
+  ResourceProgressEvent: {
+    "^": "ProgressEvent;url=",
+    "%": "ResourceProgressEvent"
+  },
+  ScriptElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLScriptElement"
+  },
+  SecurityPolicyViolationEvent: {
+    "^": "Event;lineNumber=",
+    "%": "SecurityPolicyViolationEvent"
+  },
+  SelectElement: {
+    "^": "HtmlElement;form=,length%,name%,selectedIndex%,type=,value%",
+    $isSelectElement: true,
+    "%": "HTMLSelectElement"
+  },
+  ShadowRoot: {
+    "^": "DocumentFragment;",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isShadowRoot: true,
+    "%": "ShadowRoot"
+  },
+  SourceElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLSourceElement"
+  },
+  SpeechRecognitionError: {
+    "^": "Event;error=,message=",
+    "%": "SpeechRecognitionError"
+  },
+  SpeechRecognitionEvent: {
+    "^": "Event;results=",
+    "%": "SpeechRecognitionEvent"
+  },
+  SpeechRecognitionResult: {
+    "^": "Interceptor;isFinal=,length=",
+    "%": "SpeechRecognitionResult"
+  },
+  SpeechSynthesisEvent: {
+    "^": "Event;name=",
+    "%": "SpeechSynthesisEvent"
+  },
+  StorageEvent: {
+    "^": "Event;key=,url=",
+    "%": "StorageEvent"
+  },
+  StyleElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLStyleElement"
+  },
+  TableCellElement: {
+    "^": "HtmlElement;",
+    $isTableCellElement: true,
+    "%": "HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"
+  },
+  TableElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableElement"
+  },
+  TableRowElement: {
+    "^": "HtmlElement;rowIndex=",
+    insertCell$1: function(receiver, index) {
+      return receiver.insertCell(index);
+    },
+    $isTableRowElement: true,
+    "%": "HTMLTableRowElement"
+  },
+  TableSectionElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableSectionElement"
+  },
+  TemplateElement: {
+    "^": "HtmlElement;content=",
+    $isTemplateElement: true,
+    "%": ";HTMLTemplateElement;TemplateElement_Polymer|TemplateElement_Polymer_Observable|AutoBindingElement"
+  },
+  Text: {
+    "^": "CharacterData;",
+    $isText: true,
+    "%": "CDATASection|Text"
+  },
+  TextAreaElement: {
+    "^": "HtmlElement;form=,name%,rows=,type=,value%",
+    $isTextAreaElement: true,
+    "%": "HTMLTextAreaElement"
+  },
+  TextEvent: {
+    "^": "UIEvent;data=",
+    "%": "TextEvent"
+  },
+  TouchEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "TouchEvent"
+  },
+  TrackElement: {
+    "^": "HtmlElement;kind%,label%",
+    "%": "HTMLTrackElement"
+  },
+  UIEvent: {
+    "^": "Event;detail=",
+    "%": "FocusEvent|SVGZoomEvent;UIEvent"
+  },
+  VideoElement: {
+    "^": "MediaElement;height},width}",
+    "%": "HTMLVideoElement"
+  },
+  Window: {
+    "^": "EventTarget;name%,status%",
+    _requestAnimationFrame$1: function(receiver, callback) {
+      return receiver.requestAnimationFrame(H.convertDartClosureToJS(callback, 1));
+    },
+    _ensureRequestAnimationFrame$0: function(receiver) {
+      if (!!(receiver.requestAnimationFrame && receiver.cancelAnimationFrame))
+        return;
+      (function($this) {
+        var vendors = ['ms', 'moz', 'webkit', 'o'];
+        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+        }
+        if ($this.requestAnimationFrame && $this.cancelAnimationFrame)
+          return;
+        $this.requestAnimationFrame = function(callback) {
+          return window.setTimeout(function() {
+            callback(Date.now());
+          }, 16);
+        };
+        $this.cancelAnimationFrame = function(id) {
+          clearTimeout(id);
+        };
+      })(receiver);
+    },
+    get$parent: function(receiver) {
+      return W._convertNativeToDart_Window(receiver.parent);
+    },
+    close$0: function(receiver) {
+      return receiver.close();
+    },
+    postMessage$3: function(receiver, message, targetOrigin, messagePorts) {
+      receiver.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+      return;
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    $isWindow: true,
+    $isEventTarget: true,
+    "%": "DOMWindow|Window"
+  },
+  _Attr: {
+    "^": "Node;name=,value%",
+    "%": "Attr"
+  },
+  _ClientRect: {
+    "^": "Interceptor;bottom=,height=,left=,right=,top=,width=",
+    toString$0: function(receiver) {
+      return "Rectangle (" + H.S(receiver.left) + ", " + H.S(receiver.top) + ") " + H.S(receiver.width) + " x " + H.S(receiver.height);
+    },
+    $eq: function(receiver, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      t2 = receiver.left;
+      t3 = t1.get$left(other);
+      if (t2 == null ? t3 == null : t2 === t3) {
+        t2 = receiver.top;
+        t3 = t1.get$top(other);
+        if (t2 == null ? t3 == null : t2 === t3) {
+          t2 = receiver.width;
+          t3 = t1.get$width(other);
+          if (t2 == null ? t3 == null : t2 === t3) {
+            t2 = receiver.height;
+            t1 = t1.get$height(other);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(receiver) {
+      var t1, t2, t3, t4, hash;
+      t1 = J.get$hashCode$(receiver.left);
+      t2 = J.get$hashCode$(receiver.top);
+      t3 = J.get$hashCode$(receiver.width);
+      t4 = J.get$hashCode$(receiver.height);
+      t4 = W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(0, t1), t2), t3), t4);
+      hash = 536870911 & t4 + ((67108863 & t4) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$topLeft: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.Point(receiver.left, receiver.top), [null]);
+    },
+    $isRectangle: true,
+    $asRectangle: function() {
+      return [null];
+    },
+    "%": "ClientRect|DOMRect"
+  },
+  _HTMLFrameSetElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLFrameSetElement"
+  },
+  _NamedNodeMap: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin1;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "MozNamedAttrMap|NamedNodeMap"
+  },
+  _SpeechRecognitionResultList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin2;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "SpeechRecognitionResultList"
+  },
+  _ChildrenElementList: {
+    "^": "ListBase;_html$_element,_childElements",
+    contains$1: function(_, element) {
+      return J.contains$1$asx(this._childElements, element);
+    },
+    get$isEmpty: function(_) {
+      return this._html$_element.firstElementChild == null;
+    },
+    get$length: function(_) {
+      return this._childElements.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      this._html$_element.replaceChild(value, t1[index]);
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize element lists"));
+    },
+    add$1: function(_, value) {
+      this._html$_element.appendChild(value);
+      return value;
+    },
+    get$iterator: function(_) {
+      var t1 = this.toList$0(this);
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._html$_element; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort element lists"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._childElements.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._childElements;
+      t2 = t1.length;
+      t3 = this._html$_element;
+      if (index === t2)
+        t3.appendChild(element);
+      else {
+        if (index >= t2)
+          return H.ioore(t1, index);
+        t3.insertBefore(element, t1[index]);
+      }
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._html$_element);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        this._html$_element.removeChild(result);
+      return result;
+    },
+    get$last: function(_) {
+      var result = this._html$_element.lastElementChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    $asListBase: function() {
+      return [W.Element];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Element];
+    },
+    $asList: function() {
+      return [W.Element];
+    },
+    $asIterable: function() {
+      return [W.Element];
+    }
+  },
+  _FrozenElementList: {
+    "^": "ListBase;_nodeList,_elementList",
+    get$length: function(_) {
+      return this._nodeList.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._nodeList;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    get$last: function(_) {
+      return C.NodeList_methods.get$last(this._nodeList);
+    },
+    get$classes: function(_) {
+      return W._MultiElementCssClassSet$(this._elementList);
+    },
+    get$onChange: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_change._eventType), [null]);
+    },
+    get$onInput: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_input._eventType), [null]);
+    },
+    _html$_FrozenElementList$_wrap$1: function(_nodeList, $T) {
+      var t1 = C.NodeList_methods.where$1(this._nodeList, new W._FrozenElementList$_wrap_closure());
+      this._elementList = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_FrozenElementList$_wrap: function(_nodeList, $T) {
+        var t1 = H.setRuntimeTypeInfo(new W._FrozenElementList(_nodeList, null), [$T]);
+        t1._html$_FrozenElementList$_wrap$1(_nodeList, $T);
+        return t1;
+      }}
+  },
+  _FrozenElementList$_wrap_closure: {
+    "^": "Closure:13;",
+    call$1: function(e) {
+      return !!J.getInterceptor(e).$isElement;
+    },
+    $isFunction: true
+  },
+  Entry: {
+    "^": "Interceptor;"
+  },
+  Events: {
+    "^": "Object;_ptr<",
+    $index: function(_, type) {
+      return H.setRuntimeTypeInfo(new W._EventStream(this.get$_ptr(), type, false), [null]);
+    }
+  },
+  ElementEvents: {
+    "^": "Events;_ptr:html$ElementEvents$_ptr<,_ptr",
+    $index: function(_, type) {
+      var t1, t2;
+      t1 = $.get$ElementEvents_webkitEvents();
+      t2 = J.getInterceptor$s(type);
+      if (t1.get$keys()._map.containsKey$1(t2.toLowerCase$0(type)))
+        if (P.Device_isWebKit() === true)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, t1.$index(0, t2.toLowerCase$0(type)), false), [null]);
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, type, false), [null]);
+    },
+    static: {"^": "ElementEvents_webkitEvents"}
+  },
+  Interceptor_ListMixin: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin: {
+    "^": "Interceptor_ListMixin+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  HttpRequest_request_closure: {
+    "^": "Closure:75;xhr_0",
+    call$2: function(header, value) {
+      this.xhr_0.setRequestHeader(header, value);
+    },
+    $isFunction: true
+  },
+  HttpRequest_request_closure0: {
+    "^": "Closure:13;completer_1,xhr_2",
+    call$1: [function(e) {
+      var t1, t2, t3;
+      t1 = this.xhr_2;
+      t2 = t1.status;
+      if (typeof t2 !== "number")
+        return t2.$ge();
+      t2 = t2 >= 200 && t2 < 300 || t2 === 0 || t2 === 304;
+      t3 = this.completer_1;
+      if (t2) {
+        t2 = t3.future;
+        if (t2._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t2._asyncComplete$1(t1);
+      } else
+        t3.completeError$1(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  MutationObserver_observe_override: {
+    "^": "Closure:75;parsedOptions_0",
+    call$2: function(key, value) {
+      if (value != null)
+        this.parsedOptions_0[key] = value;
+    },
+    $isFunction: true
+  },
+  _ChildNodeListLazy: {
+    "^": "ListBase;_this",
+    get$last: function(_) {
+      var result = this._this.lastChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    add$1: function(_, value) {
+      this._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    insert$2: function(_, index, node) {
+      var t1, t2, t3;
+      if (index > this._this.childNodes.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._this;
+      t2 = t1.childNodes;
+      t3 = t2.length;
+      if (index === t3)
+        t1.appendChild(node);
+      else {
+        if (index >= t3)
+          return H.ioore(t2, index);
+        t1.insertBefore(node, t2[index]);
+      }
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setAll on Node list"));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._this);
+    },
+    $indexSet: function(_, index, value) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      t1.replaceChild(value, t2[index]);
+    },
+    get$iterator: function(_) {
+      return C.NodeList_methods.get$iterator(this._this.childNodes);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort Node list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on Node list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    get$length: function(_) {
+      return this._this.childNodes.length;
+    },
+    set$length: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot set length on immutable List."));
+    },
+    $index: function(_, index) {
+      var t1 = this._this.childNodes;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $is_ChildNodeListLazy: true,
+    $asListBase: function() {
+      return [W.Node];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Node];
+    },
+    $asList: function() {
+      return [W.Node];
+    },
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin0: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin0: {
+    "^": "Interceptor_ListMixin0+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin1: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin1: {
+    "^": "Interceptor_ListMixin1+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin2: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin2: {
+    "^": "Interceptor_ListMixin2+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  _AttributeMap: {
+    "^": "Object;",
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new W._AttributeMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    forEach$1: function(_, f) {
+      var t1, key;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        key = t1._current;
+        f.call$2(key, this.$index(0, key));
+      }
+    },
+    get$keys: function() {
+      var attributes, keys, len, i;
+      attributes = this._html$_element.attributes;
+      keys = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          keys.push(J.get$name$x(attributes[i]));
+        }
+      }
+      return keys;
+    },
+    get$values: function(_) {
+      var attributes, values, len, i;
+      attributes = this._html$_element.attributes;
+      values = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          values.push(J.get$value$x(attributes[i]));
+        }
+      }
+      return values;
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [P.String, P.String];
+    }
+  },
+  _AttributeMap_addAll_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0.$indexSet(0, k, v);
+    },
+    $isFunction: true
+  },
+  _ElementAttributeMap: {
+    "^": "_AttributeMap;_html$_element",
+    containsKey$1: function(key) {
+      return this._html$_element.hasAttribute(key);
+    },
+    $index: function(_, key) {
+      return this._html$_element.getAttribute(key);
+    },
+    $indexSet: function(_, key, value) {
+      this._html$_element.setAttribute(key, value);
+    },
+    remove$1: function(_, key) {
+      var t1, value;
+      t1 = this._html$_element;
+      value = t1.getAttribute(key);
+      t1.removeAttribute(key);
+      return value;
+    },
+    get$length: function(_) {
+      return this.get$keys().length;
+    },
+    _matches$1: function(node) {
+      return node.namespaceURI == null;
+    }
+  },
+  _MultiElementCssClassSet: {
+    "^": "CssClassSetImpl;_elementIterable,_elementCssClassSetIterable",
+    readClasses$0: function() {
+      var s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_readClasses_closure(s));
+      return s;
+    },
+    writeClasses$1: function(s) {
+      var classes, t1;
+      classes = C.JSArray_methods.join$1(P.List_List$from(s, true, null), " ");
+      for (t1 = this._elementIterable, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.set$className$x(t1._current, classes);
+    },
+    modify$1: function(f) {
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_modify_closure(f));
+    },
+    _MultiElementCssClassSet$1: function(_elementIterable) {
+      this._elementCssClassSetIterable = H.setRuntimeTypeInfo(new H.MappedListIterable(P.List_List$from(this._elementIterable, true, null), new W._MultiElementCssClassSet_closure()), [null, null]);
+    },
+    static: {_MultiElementCssClassSet$: function(_elementIterable) {
+        var t1 = new W._MultiElementCssClassSet(_elementIterable, null);
+        t1._MultiElementCssClassSet$1(_elementIterable);
+        return t1;
+      }}
+  },
+  _MultiElementCssClassSet_closure: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return new W._ElementCssClassSet(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_readClasses_closure: {
+    "^": "Closure:13;s_0",
+    call$1: function(e) {
+      return this.s_0.addAll$1(0, e.readClasses$0());
+    },
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_modify_closure: {
+    "^": "Closure:13;f_0",
+    call$1: function(e) {
+      return e.modify$1(this.f_0);
+    },
+    $isFunction: true
+  },
+  _ElementCssClassSet: {
+    "^": "CssClassSetImpl;_html$_element",
+    readClasses$0: function() {
+      var s, t1, trimmed;
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      for (t1 = J.get$className$x(this._html$_element).split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      P.List_List$from(s, true, null);
+      J.set$className$x(this._html$_element, s.join$1(0, " "));
+    }
+  },
+  EventStreamProvider: {
+    "^": "Object;_eventType",
+    forTarget$2$useCapture: function(e, useCapture) {
+      return H.setRuntimeTypeInfo(new W._EventStream(e, this._eventType, useCapture), [null]);
+    },
+    forTarget$1: function(e) {
+      return this.forTarget$2$useCapture(e, false);
+    }
+  },
+  _EventStream: {
+    "^": "Stream;_html$_target,_eventType,_useCapture",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = new W._EventStreamSubscription(0, this._html$_target, this._eventType, W._wrapZone(onData), this._useCapture);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      t1._tryResume$0();
+      return t1;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    }
+  },
+  _ElementEventStreamImpl: {
+    "^": "_EventStream;_html$_target,_eventType,_useCapture",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    $isStream: true
+  },
+  _ElementEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl: {
+    "^": "Stream;_targetList,_useCapture,_eventType",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementListEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementListEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var pool, t1, t2, t3, t4;
+      pool = H.setRuntimeTypeInfo(new W._StreamPool(null, P.LinkedHashMap_LinkedHashMap(null, null, null, [P.Stream, null], [P.StreamSubscription, null])), [null]);
+      pool._html$_StreamPool$broadcast$0(null);
+      for (t1 = this._targetList, t1 = t1.get$iterator(t1), t2 = this._eventType, t3 = this._useCapture; t1.moveNext$0();) {
+        t4 = new W._EventStream(t1._current, t2, t3);
+        t4.$builtinTypeInfo = [null];
+        pool.add$1(0, t4);
+      }
+      t1 = pool._html$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    $isStream: true
+  },
+  _ElementListEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _EventStreamSubscription: {
+    "^": "StreamSubscription;_pauseCount,_html$_target,_eventType,_html$_onData,_useCapture",
+    cancel$0: function() {
+      if (this._html$_target == null)
+        return;
+      this._unlisten$0();
+      this._html$_target = null;
+      this._html$_onData = null;
+      return;
+    },
+    pause$1: [function(_, resumeSignal) {
+      if (this._html$_target == null)
+        return;
+      ++this._pauseCount;
+      this._unlisten$0();
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    get$isPaused: function() {
+      return this._pauseCount > 0;
+    },
+    resume$0: [function(_) {
+      if (this._html$_target == null || this._pauseCount <= 0)
+        return;
+      --this._pauseCount;
+      this._tryResume$0();
+    }, "call$0", "get$resume", 0, 0, 18],
+    _tryResume$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null && this._pauseCount <= 0)
+        J.addEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    },
+    _unlisten$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null)
+        J.removeEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    }
+  },
+  _StreamPool: {
+    "^": "Object;_html$_controller,_subscriptions",
+    add$1: function(_, stream) {
+      var t1, t2;
+      t1 = this._subscriptions;
+      if (t1.containsKey$1(stream))
+        return;
+      t2 = this._html$_controller;
+      t1.$indexSet(0, stream, stream.listen$3$onDone$onError(t2.get$add(t2), new W._StreamPool_add_closure(this, stream), this._html$_controller.get$addError()));
+    },
+    remove$1: function(_, stream) {
+      var subscription = this._subscriptions.remove$1(0, stream);
+      if (subscription != null)
+        subscription.cancel$0();
+    },
+    close$0: [function(_) {
+      var t1, t2;
+      for (t1 = this._subscriptions, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.cancel$0();
+      t1.clear$0(0);
+      this._html$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    _html$_StreamPool$broadcast$0: function($T) {
+      this._html$_controller = P.StreamController_StreamController$broadcast(this.get$close(this), null, true, $T);
+    }
+  },
+  _StreamPool_add_closure: {
+    "^": "Closure:69;this_0,stream_1",
+    call$0: [function() {
+      return this.this_0.remove$1(0, this.stream_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ImmutableListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new W.FixedSizeListIterator(receiver, this.get$length(receiver), -1, null), [H.getRuntimeTypeArgument(receiver, "ImmutableListMixin", 0)]);
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    sort$1: function(receiver, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort immutable List."));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    insert$2: function(receiver, index, element) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    setAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an immutable List."));
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on immutable List."));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot removeRange on immutable List."));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _WrappedList: {
+    "^": "ListBase;_list",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new W._WrappedIterator(J.get$iterator$ax(this._list)), [null]);
+    },
+    get$length: function(_) {
+      return this._list.length;
+    },
+    add$1: function(_, element) {
+      J.add$1$ax(this._list, element);
+    },
+    clear$0: function(_) {
+      J.clear$0$ax(this._list);
+    },
+    $index: function(_, index) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    set$length: function(_, newLength) {
+      J.set$length$asx(this._list, newLength);
+    },
+    sort$1: function(_, compare) {
+      J.sort$1$ax(this._list, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(_, element, start) {
+      return J.indexOf$2$asx(this._list, element, start);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(_, element, start) {
+      return J.lastIndexOf$2$asx(this._list, element, start);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(_, index, element) {
+      return J.insert$2$ax(this._list, index, element);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      J.setRange$4$ax(this._list, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      J.removeRange$2$ax(this._list, start, end);
+    }
+  },
+  _WrappedIterator: {
+    "^": "Object;_html$_iterator",
+    moveNext$0: function() {
+      return this._html$_iterator.moveNext$0();
+    },
+    get$current: function() {
+      return this._html$_iterator._html$_current;
+    }
+  },
+  FixedSizeListIterator: {
+    "^": "Object;_array,_html$_length,_position,_html$_current",
+    moveNext$0: function() {
+      var nextPosition, t1;
+      nextPosition = this._position + 1;
+      t1 = this._html$_length;
+      if (nextPosition < t1) {
+        this._html$_current = J.$index$asx(this._array, nextPosition);
+        this._position = nextPosition;
+        return true;
+      }
+      this._html$_current = null;
+      this._position = t1;
+      return false;
+    },
+    get$current: function() {
+      return this._html$_current;
+    }
+  },
+  _callConstructor_closure: {
+    "^": "Closure:13;constructor_0,interceptor_1",
+    call$1: [function(receiver) {
+      var t1 = H.makeLeafDispatchRecord(this.interceptor_1);
+      Object.defineProperty(receiver, init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      receiver.constructor = receiver.__proto__.constructor;
+      return this.constructor_0(receiver);
+    }, "call$1", null, 2, 0, null, 54, "call"],
+    $isFunction: true
+  },
+  _DOMWindowCrossFrame: {
+    "^": "Object;_window",
+    get$parent: function(_) {
+      return W._DOMWindowCrossFrame__createSafe(this._window.parent);
+    },
+    close$0: function(_) {
+      return this._window.close();
+    },
+    postMessage$3: function(_, message, targetOrigin, messagePorts) {
+      this._window.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    get$on: function(_) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    addEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    removeEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    $isEventTarget: true,
+    static: {_DOMWindowCrossFrame__createSafe: function(w) {
+        if (w === window)
+          return w;
+        else
+          return new W._DOMWindowCrossFrame(w);
+      }}
+  }
+}],
+["dart.dom.indexed_db", "dart:indexed_db", , P, {
+  "^": "",
+  KeyRange: {
+    "^": "Interceptor;",
+    $isKeyRange: true,
+    "%": "IDBKeyRange"
+  }
+}],
+["dart.dom.svg", "dart:svg", , P, {
+  "^": "",
+  AElement: {
+    "^": "GraphicsElement;target=,href=",
+    "%": "SVGAElement"
+  },
+  AltGlyphElement: {
+    "^": "TextPositioningElement;href=",
+    "%": "SVGAltGlyphElement"
+  },
+  FEBlendElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEBlendElement"
+  },
+  FEColorMatrixElement: {
+    "^": "SvgElement;type=,values=,result=,x=,y=",
+    "%": "SVGFEColorMatrixElement"
+  },
+  FEComponentTransferElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEComponentTransferElement"
+  },
+  FECompositeElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFECompositeElement"
+  },
+  FEConvolveMatrixElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEConvolveMatrixElement"
+  },
+  FEDiffuseLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDiffuseLightingElement"
+  },
+  FEDisplacementMapElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDisplacementMapElement"
+  },
+  FEFloodElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEFloodElement"
+  },
+  FEGaussianBlurElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEGaussianBlurElement"
+  },
+  FEImageElement: {
+    "^": "SvgElement;result=,x=,y=,href=",
+    "%": "SVGFEImageElement"
+  },
+  FEMergeElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEMergeElement"
+  },
+  FEMorphologyElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFEMorphologyElement"
+  },
+  FEOffsetElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEOffsetElement"
+  },
+  FEPointLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFEPointLightElement"
+  },
+  FESpecularLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFESpecularLightingElement"
+  },
+  FESpotLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFESpotLightElement"
+  },
+  FETileElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFETileElement"
+  },
+  FETurbulenceElement: {
+    "^": "SvgElement;type=,result=,x=,y=",
+    "%": "SVGFETurbulenceElement"
+  },
+  FilterElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGFilterElement"
+  },
+  ForeignObjectElement: {
+    "^": "GraphicsElement;x=,y=",
+    "%": "SVGForeignObjectElement"
+  },
+  GeometryElement: {
+    "^": "GraphicsElement;",
+    "%": "SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"
+  },
+  GraphicsElement: {
+    "^": "SvgElement;",
+    "%": "SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"
+  },
+  ImageElement0: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGImageElement"
+  },
+  MaskElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGMaskElement"
+  },
+  PatternElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGPatternElement"
+  },
+  RectElement: {
+    "^": "GeometryElement;x=,y=",
+    "%": "SVGRectElement"
+  },
+  ScriptElement0: {
+    "^": "SvgElement;type%,href=",
+    "%": "SVGScriptElement"
+  },
+  StyleElement0: {
+    "^": "SvgElement;type%",
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "SVGStyleElement"
+  },
+  SvgElement: {
+    "^": "Element;",
+    get$classes: function(receiver) {
+      if (receiver._cssClassSet == null)
+        receiver._cssClassSet = new P._AttributeClassSet(receiver);
+      return receiver._cssClassSet;
+    },
+    get$children: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [W.Element]);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    $isEventTarget: 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: {"^": "SvgElement_pauseEvent<"}
+  },
+  SvgSvgElement: {
+    "^": "GraphicsElement;x=,y=",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isSvgSvgElement: true,
+    "%": "SVGSVGElement"
+  },
+  TextContentElement: {
+    "^": "GraphicsElement;",
+    "%": ";SVGTextContentElement"
+  },
+  TextPathElement: {
+    "^": "TextContentElement;href=",
+    "%": "SVGTextPathElement"
+  },
+  TextPositioningElement: {
+    "^": "TextContentElement;x=,y=",
+    "%": "SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"
+  },
+  UseElement: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGUseElement"
+  },
+  _GradientElement: {
+    "^": "SvgElement;href=",
+    "%": "SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"
+  },
+  _AttributeClassSet: {
+    "^": "CssClassSetImpl;_svg$_element",
+    readClasses$0: function() {
+      var classname, s, t1, trimmed;
+      classname = this._svg$_element.getAttribute("class");
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      if (classname == null)
+        return s;
+      for (t1 = classname.split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      this._svg$_element.setAttribute("class", s.join$1(0, " "));
+    }
+  }
+}],
+["dart.dom.web_sql", "dart:web_sql", , P, {
+  "^": "",
+  SqlError: {
+    "^": "Interceptor;code=,message=",
+    "%": "SQLError"
+  }
+}],
+["dart.isolate", "dart:isolate", , P, {
+  "^": "",
+  ReceivePort_ReceivePort: function() {
+    var t1, t2, t3;
+    t1 = $.RawReceivePortImpl__nextFreeId;
+    $.RawReceivePortImpl__nextFreeId = t1 + 1;
+    t2 = new H.RawReceivePortImpl(t1, null, false);
+    t3 = init.globalState.currentContext;
+    t3._addRegistration$2(t1, t2);
+    t3._updateGlobalState$0();
+    t3 = new H.ReceivePortImpl(t2, null);
+    t3.ReceivePortImpl$fromRawReceivePort$1(t2);
+    return t3;
+  },
+  Capability: {
+    "^": "Object;",
+    $isCapability: true,
+    static: {Capability_Capability: function() {
+        return new H.CapabilityImpl((Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296);
+      }}
+  }
+}],
+["dart.js", "dart:js", , P, {
+  "^": "",
+  _convertDartFunction: function(f, captureThis) {
+    return function(_call, f, captureThis) {
+      return function() {
+        return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
+      };
+    }(P._callDartFunction, f, captureThis);
+  },
+  _callDartFunction: [function(callback, captureThis, $self, $arguments) {
+    var arguments0;
+    if (captureThis === true) {
+      arguments0 = [$self];
+      C.JSArray_methods.addAll$1(arguments0, $arguments);
+      $arguments = arguments0;
+    }
+    return P._convertToJS(H.Primitives_applyFunction(callback, P.List_List$from(J.map$1$ax($arguments, P._convertToDart$closure()), true, null), P.Function__toMangledNames(null)));
+  }, "call$4", "_callDartFunction$closure", 8, 0, null, 41, 59, 27, 60],
+  _defineProperty: function(o, $name, value) {
+    var exception;
+    if (Object.isExtensible(o))
+      try {
+        Object.defineProperty(o, $name, {value: value});
+        return true;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return false;
+  },
+  _getOwnProperty: function(o, $name) {
+    if (Object.prototype.hasOwnProperty.call(o, $name))
+      return o[$name];
+    return;
+  },
+  _convertToJS: [function(o) {
+    var t1;
+    if (o == null)
+      return;
+    else if (typeof o === "string" || typeof o === "number" || typeof o === "boolean")
+      return o;
+    else {
+      t1 = J.getInterceptor(o);
+      if (!!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow)
+        return o;
+      else if (!!t1.$isDateTime)
+        return H.Primitives_lazyAsJsDate(o);
+      else if (!!t1.$isJsObject)
+        return o._js$_jsObject;
+      else if (!!t1.$isFunction)
+        return P._getJsProxy(o, "$dart_jsFunction", new P._convertToJS_closure());
+      else
+        return P._getJsProxy(o, "_$dart_jsObject", new P._convertToJS_closure0($.get$_dartProxyCtor()));
+    }
+  }, "call$1", "_convertToJS$closure", 2, 0, 13, 61],
+  _getJsProxy: function(o, propertyName, createProxy) {
+    var jsProxy = P._getOwnProperty(o, propertyName);
+    if (jsProxy == null) {
+      jsProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, jsProxy);
+    }
+    return jsProxy;
+  },
+  _convertToDart: [function(o) {
+    var t1;
+    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
+      return o;
+    else {
+      if (o instanceof Object) {
+        t1 = J.getInterceptor(o);
+        t1 = !!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow;
+      } else
+        t1 = false;
+      if (t1)
+        return o;
+      else if (o instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(o.getTime(), false);
+      else if (o.constructor === $.get$_dartProxyCtor())
+        return o.o;
+      else
+        return P._wrapToDart(o);
+    }
+  }, "call$1", "_convertToDart$closure", 2, 0, 49, 61],
+  _wrapToDart: function(o) {
+    if (typeof o == "function")
+      return P._getDartProxy(o, $.get$_DART_CLOSURE_PROPERTY_NAME(), new P._wrapToDart_closure());
+    else if (o instanceof Array)
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure0());
+    else
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure1());
+  },
+  _getDartProxy: function(o, propertyName, createProxy) {
+    var dartProxy = P._getOwnProperty(o, propertyName);
+    if (dartProxy == null || !(o instanceof Object)) {
+      dartProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, dartProxy);
+    }
+    return dartProxy;
+  },
+  JsObject: {
+    "^": "Object;_js$_jsObject",
+    $index: function(_, property) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      return P._convertToDart(this._js$_jsObject[property]);
+    },
+    $indexSet: function(_, property, value) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      this._js$_jsObject[property] = P._convertToJS(value);
+    },
+    get$hashCode: function(_) {
+      return 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isJsObject && this._js$_jsObject === other._js$_jsObject;
+    },
+    hasProperty$1: function(property) {
+      return property in this._js$_jsObject;
+    },
+    toString$0: function(_) {
+      var t1, exception;
+      try {
+        t1 = String(this._js$_jsObject);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return P.Object.prototype.toString$0.call(this, this);
+      }
+
+    },
+    callMethod$2: function(method, args) {
+      var t1, t2;
+      t1 = this._js$_jsObject;
+      t2 = args == null ? null : P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(t1[method].apply(t1, t2));
+    },
+    callMethod$1: function(method) {
+      return this.callMethod$2(method, null);
+    },
+    $isJsObject: true,
+    static: {JsObject_JsObject: function($constructor, $arguments) {
+        var constr, args, factoryFunction;
+        constr = P._convertToJS($constructor);
+        if ($arguments == null)
+          return P._wrapToDart(new constr());
+        args = [null];
+        C.JSArray_methods.addAll$1(args, H.setRuntimeTypeInfo(new H.MappedListIterable($arguments, P._convertToJS$closure()), [null, null]));
+        factoryFunction = constr.bind.apply(constr, args);
+        String(factoryFunction);
+        return P._wrapToDart(new factoryFunction());
+      }, JsObject_JsObject$fromBrowserObject: function(object) {
+        if (object == null)
+          throw H.wrapException(P.ArgumentError$("object cannot be a num, string, bool, or null"));
+        return P._wrapToDart(P._convertToJS(object));
+      }, JsObject_JsObject$jsify: function(object) {
+        return P._wrapToDart(P.JsObject__convertDataTree(object));
+      }, JsObject__convertDataTree: function(data) {
+        return new P.JsObject__convertDataTree__convert(P.HashMap_HashMap$identity(null, null)).call$1(data);
+      }}
+  },
+  JsObject__convertDataTree__convert: {
+    "^": "Closure:13;_convertedObjects_0",
+    call$1: [function(o) {
+      var t1, t2, convertedMap, key, convertedList;
+      t1 = this._convertedObjects_0;
+      if (t1.containsKey$1(o))
+        return t1.$index(0, o);
+      t2 = J.getInterceptor(o);
+      if (!!t2.$isMap) {
+        convertedMap = {};
+        t1.$indexSet(0, o, convertedMap);
+        for (t1 = J.get$iterator$ax(o.get$keys()); t1.moveNext$0();) {
+          key = t1.get$current();
+          convertedMap[key] = this.call$1(t2.$index(o, key));
+        }
+        return convertedMap;
+      } else if (!!t2.$isIterable) {
+        convertedList = [];
+        t1.$indexSet(0, o, convertedList);
+        C.JSArray_methods.addAll$1(convertedList, t2.map$1(o, this));
+        return convertedList;
+      } else
+        return P._convertToJS(o);
+    }, "call$1", null, 2, 0, null, 61, "call"],
+    $isFunction: true
+  },
+  JsFunction: {
+    "^": "JsObject;_js$_jsObject",
+    apply$2$thisArg: function(args, thisArg) {
+      var t1, t2;
+      t1 = P._convertToJS(thisArg);
+      t2 = P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(this._js$_jsObject.apply(t1, t2));
+    },
+    apply$1: function(args) {
+      return this.apply$2$thisArg(args, null);
+    },
+    $isJsFunction: true,
+    static: {JsFunction_JsFunction$withThis: function(f) {
+        return new P.JsFunction(P._convertDartFunction(f, true));
+      }}
+  },
+  JsArray: {
+    "^": "JsObject_ListMixin;_js$_jsObject",
+    $index: function(_, index) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      return P.JsObject.prototype.$index.call(this, this, index);
+    },
+    $indexSet: function(_, index, value) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      P.JsObject.prototype.$indexSet.call(this, this, index, value);
+    },
+    get$length: function(_) {
+      var len = this._js$_jsObject.length;
+      if (typeof len === "number" && len >>> 0 === len)
+        return len;
+      throw H.wrapException(P.StateError$("Bad JsArray length"));
+    },
+    set$length: function(_, $length) {
+      P.JsObject.prototype.$indexSet.call(this, this, "length", $length);
+    },
+    add$1: function(_, value) {
+      this.callMethod$2("push", [value]);
+    },
+    addAll$1: function(_, iterable) {
+      this.callMethod$2("push", iterable instanceof Array ? iterable : P.List_List$from(iterable, true, null));
+    },
+    insert$2: function(_, index, element) {
+      if (index >= this.get$length(this) + 1)
+        H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      this.callMethod$2("splice", [index, 0, element]);
+    },
+    removeRange$2: function(_, start, end) {
+      P.JsArray__checkRange(start, end, this.get$length(this));
+      this.callMethod$2("splice", [start, end - start]);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      var t1, $length, args;
+      t1 = this.get$length(this);
+      if (start < 0 || start > t1)
+        H.throwExpression(P.RangeError$range(start, 0, t1));
+      if (end < start || end > t1)
+        H.throwExpression(P.RangeError$range(end, start, t1));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      args = [start, $length];
+      C.JSArray_methods.addAll$1(args, J.skip$1$ax(iterable, skipCount).take$1(0, $length));
+      this.callMethod$2("splice", args);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    sort$1: function(_, compare) {
+      this.callMethod$2("sort", [compare]);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    static: {JsArray__checkRange: function(start, end, $length) {
+        if (start < 0 || start > $length)
+          throw H.wrapException(P.RangeError$range(start, 0, $length));
+        if (end < start || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length));
+      }}
+  },
+  JsObject_ListMixin: {
+    "^": "JsObject+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _convertToJS_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      var jsFunction = P._convertDartFunction(o, false);
+      P._defineProperty(jsFunction, $.get$_DART_CLOSURE_PROPERTY_NAME(), o);
+      return jsFunction;
+    },
+    $isFunction: true
+  },
+  _convertToJS_closure0: {
+    "^": "Closure:13;ctor_0",
+    call$1: function(o) {
+      return new this.ctor_0(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsFunction(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return H.setRuntimeTypeInfo(new P.JsArray(o), [null]);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsObject(o);
+    },
+    $isFunction: true
+  }
+}],
+["dart.math", "dart:math", , P, {
+  "^": "",
+  _JenkinsSmiHash_combine0: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish: function(hash) {
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash ^= hash >>> 11;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  min: function(a, b) {
+    var t1;
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(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;
+      if (a === 0)
+        t1 = b === 0 ? 1 / b < 0 : b < 0;
+      else
+        t1 = false;
+      if (t1 || isNaN(b))
+        return b;
+      return a;
+    }
+    return a;
+  },
+  max: function(a, b) {
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(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;
+      if (C.JSDouble_methods.get$isNaN(b))
+        return b;
+      return a;
+    }
+    if (b === 0 && C.JSNumber_methods.get$isNegative(a))
+      return b;
+    return a;
+  },
+  _JSRandom: {
+    "^": "Object;",
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
+    }
+  },
+  _Random: {
+    "^": "Object;_lo,_hi",
+    _nextState$0: function() {
+      var t1, tmpHi, tmpHiLo, tmpLo, tmpLoLo, newLo;
+      t1 = this._lo;
+      tmpHi = 4294901760 * t1;
+      tmpHiLo = (tmpHi & 4294967295) >>> 0;
+      tmpLo = 55905 * t1;
+      tmpLoLo = (tmpLo & 4294967295) >>> 0;
+      newLo = tmpLoLo + tmpHiLo + this._hi;
+      t1 = (newLo & 4294967295) >>> 0;
+      this._lo = t1;
+      this._hi = (C.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) & 4294967295) >>> 0;
+    },
+    nextInt$1: function(max) {
+      var t1, rnd32, result;
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      t1 = max - 1;
+      if ((max & t1) === 0) {
+        this._nextState$0();
+        return (this._lo & t1) >>> 0;
+      }
+      do {
+        this._nextState$0();
+        rnd32 = this._lo;
+        result = rnd32 % max;
+      } while (rnd32 - result + max >= 4294967296);
+      return result;
+    },
+    _Random$1: function(seed) {
+      var empty_seed, t1, low, high, tmplow, low0, t2, t3;
+      empty_seed = J.$lt$n(seed, 0) ? -1 : 0;
+      do {
+        t1 = J.getInterceptor$n(seed);
+        low = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, low), 4294967296);
+        t1 = J.getInterceptor$n(seed);
+        high = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, high), 4294967296);
+        tmplow = ((~low & 4294967295) >>> 0) + (low << 21 >>> 0);
+        low0 = (tmplow & 4294967295) >>> 0;
+        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296) & 4294967295;
+        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 24) >>> 0) * 265 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 14) >>> 0) * 21 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
+        high = (high ^ high >>> 28) >>> 0;
+        tmplow = (low << 31 >>> 0) + low;
+        low0 = (tmplow & 4294967295) >>> 0;
+        t1 = C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296);
+        tmplow = this._lo * 1037;
+        t2 = (tmplow & 4294967295) >>> 0;
+        this._lo = t2;
+        t3 = (this._hi * 1037 + C.JSInt_methods._tdivFast$1(tmplow - t2, 4294967296) & 4294967295) >>> 0;
+        this._hi = t3;
+        this._lo = (t2 ^ low0) >>> 0;
+        this._hi = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 & 4294967295) >>> 0;
+      } while (!J.$eq(seed, empty_seed));
+      if (this._hi === 0 && this._lo === 0)
+        this._lo = 23063;
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+    },
+    static: {"^": "_Random__POW2_53_D,_Random__POW2_27_D,_Random__MASK32", _Random$: function(seed) {
+        var t1 = new P._Random(0, 0);
+        t1._Random$1(seed);
+        return t1;
+      }}
+  },
+  Point: {
+    "^": "Object;x>,y>",
+    toString$0: function(_) {
+      return "Point(" + H.S(this.x) + ", " + H.S(this.y) + ")";
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isPoint)
+        return false;
+      t1 = this.x;
+      t2 = other.x;
+      if (t1 == null ? t2 == null : t1 === t2) {
+        t1 = this.y;
+        t2 = other.y;
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.x);
+      t2 = J.get$hashCode$(this.y);
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, t1), t2));
+    },
+    $add: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$add();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$add();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 + t3, t4 + t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $sub: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$sub();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$sub();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 - t3, t4 - t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $mul: function(_, factor) {
+      var t1, t2;
+      t1 = this.x;
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      t2 = this.y;
+      if (typeof t2 !== "number")
+        return t2.$mul();
+      t2 = new P.Point(t1 * factor, t2 * factor);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $isPoint: true
+  },
+  _RectangleBase: {
+    "^": "Object;",
+    get$right: function(_) {
+      return this.get$left(this) + this.width;
+    },
+    get$bottom: function(_) {
+      return this.get$top(this) + this.height;
+    },
+    toString$0: function(_) {
+      return "Rectangle (" + this.get$left(this) + ", " + this.top + ") " + this.width + " x " + this.height;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      if (this.get$left(this) === t1.get$left(other)) {
+        t2 = this.top;
+        t1 = t2 === t1.get$top(other) && this.left + this.width === t1.get$right(other) && t2 + this.height === t1.get$bottom(other);
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.top;
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, this.get$left(this) & 0x1FFFFFFF), t1 & 0x1FFFFFFF), this.left + this.width & 0x1FFFFFFF), t1 + this.height & 0x1FFFFFFF));
+    },
+    get$topLeft: function(_) {
+      var t1 = new P.Point(this.get$left(this), this.top);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  Rectangle: {
+    "^": "_RectangleBase;left>,top>,width>,height>",
+    $isRectangle: true,
+    $asRectangle: null,
+    static: {Rectangle$: function(left, $top, width, height, $T) {
+        var t1, t2;
+        t1 = width < 0 ? -width * 0 : width;
+        t2 = height < 0 ? -height * 0 : height;
+        return H.setRuntimeTypeInfo(new P.Rectangle(left, $top, t1, t2), [$T]);
+      }}
+  }
+}],
+["dart.pkg.collection.wrappers", "package:collection/wrappers.dart", , Q, {
+  "^": "",
+  UnmodifiableMapMixin__throw: function() {
+    throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Map"));
+  },
+  UnmodifiableMapView: {
+    "^": "DelegatingMap_UnmodifiableMapMixin;_base"
+  },
+  DelegatingMap_UnmodifiableMapMixin: {
+    "^": "DelegatingMap+UnmodifiableMapMixin;",
+    $isMap: true
+  },
+  UnmodifiableMapMixin: {
+    "^": "Object;",
+    $indexSet: function(_, key, value) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    addAll$1: function(_, other) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    clear$0: function(_) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    $isMap: true
+  },
+  DelegatingMap: {
+    "^": "Object;",
+    $index: function(_, key) {
+      return this._base.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      this._base.$indexSet(0, key, value);
+    },
+    addAll$1: function(_, other) {
+      this._base.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      this._base.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      this._base.forEach$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this._base._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._base._collection$_length !== 0;
+    },
+    get$keys: function() {
+      var t1 = this._base;
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._base._collection$_length;
+    },
+    get$values: function(_) {
+      var t1 = this._base;
+      return t1.get$values(t1);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._base);
+    },
+    $isMap: true
+  }
+}],
+["dart.typed_data.implementation", "dart:_native_typed_data", , H, {
+  "^": "",
+  NativeTypedArray$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfDouble$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfInt$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeByteBuffer: {
+    "^": "Interceptor;",
+    get$runtimeType: function(receiver) {
+      return C.Type_wAg;
+    },
+    $isNativeByteBuffer: true,
+    "%": "ArrayBuffer"
+  },
+  NativeTypedData: {
+    "^": "Interceptor;",
+    _invalidIndex$2: function(receiver, index, $length) {
+      var t1 = J.getInterceptor$n(index);
+      if (t1.$lt(index, 0) || t1.$ge(index, $length))
+        throw H.wrapException(P.RangeError$range(index, 0, $length));
+      else
+        throw H.wrapException(P.ArgumentError$("Invalid list index " + H.S(index)));
+    },
+    _checkIndex$2: function(receiver, index, $length) {
+      if (index >>> 0 !== index || index >= $length)
+        this._invalidIndex$2(receiver, index, $length);
+    },
+    $isNativeTypedData: true,
+    $isTypedData: true,
+    "%": ";ArrayBufferView;NativeTypedArray|NativeTypedArray_ListMixin|NativeTypedArray_ListMixin_FixedLengthListMixin|NativeTypedArrayOfDouble|NativeTypedArray_ListMixin0|NativeTypedArray_ListMixin_FixedLengthListMixin0|NativeTypedArrayOfInt"
+  },
+  NativeByteData: {
+    "^": "NativeTypedData;",
+    get$runtimeType: function(receiver) {
+      return C.Type_oGP;
+    },
+    $isTypedData: true,
+    "%": "DataView"
+  },
+  NativeFloat32List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_Art;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float32Array"
+  },
+  NativeFloat64List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_ckn;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float64Array"
+  },
+  NativeInt16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_UoK;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int16Array"
+  },
+  NativeInt32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_dTZ;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int32Array"
+  },
+  NativeInt8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_mp3;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int8Array"
+  },
+  NativeUint16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_CAk;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint16Array"
+  },
+  NativeUint32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_irB;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint32Array"
+  },
+  NativeUint8ClampedList: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_QuW;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "CanvasPixelArray|Uint8ClampedArray"
+  },
+  NativeUint8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_6L0;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": ";Uint8Array"
+  },
+  NativeTypedArray: {
+    "^": "NativeTypedData;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    _setRangeFast$4: function(receiver, start, end, source, skipCount) {
+      var t1, count, sourceLength;
+      t1 = receiver.length + 1;
+      this._checkIndex$2(receiver, start, t1);
+      this._checkIndex$2(receiver, end, t1);
+      if (start > end)
+        throw H.wrapException(P.RangeError$range(start, 0, end));
+      count = end - start;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      sourceLength = source.length;
+      if (sourceLength - skipCount < count)
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (skipCount !== 0 || sourceLength !== count)
+        source = source.subarray(skipCount, skipCount + count);
+      receiver.set(source, start);
+    },
+    $isJavaScriptIndexingBehavior: true
+  },
+  NativeTypedArrayOfDouble: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfDouble) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfDouble: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin: {
+    "^": "NativeTypedArray_ListMixin+FixedLengthListMixin;"
+  },
+  NativeTypedArrayOfInt: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin0;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfInt) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfInt: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin0: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin0: {
+    "^": "NativeTypedArray_ListMixin0+FixedLengthListMixin;"
+  }
+}],
+["dart2js._js_primitives", "dart:_js_primitives", , H, {
+  "^": "",
+  printString: function(string) {
+    if (typeof dartPrint == "function") {
+      dartPrint(string);
+      return;
+    }
+    if (typeof console == "object" && typeof console.log != "undefined") {
+      console.log(string);
+      return;
+    }
+    if (typeof window == "object")
+      return;
+    if (typeof print == "function") {
+      print(string);
+      return;
+    }
+    throw "Unable to print message: " + String(string);
+  }
+}],
+["error_view_element", "package:observatory/src/elements/error_view.dart", , F, {
+  "^": "",
+  ErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier4;_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._error_view_element$__$error, value);
+    },
+    static: {ErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ErrorViewElement_methods.Element$created$0(receiver);
+        C.ErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier4: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["eval_box_element", "package:observatory/src/elements/eval_box.dart", , L, {
+  "^": "",
+  EvalBoxElement: {
+    "^": "ObservatoryElement_ChangeNotifier5;_eval_box_element$__$text,_eval_box_element$__$lineMode,_eval_box_element$__$callback,_eval_box_element$__$results,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$text: function(receiver) {
+      return receiver._eval_box_element$__$text;
+    },
+    set$text: function(receiver, value) {
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, value);
+    },
+    get$lineMode: function(receiver) {
+      return receiver._eval_box_element$__$lineMode;
+    },
+    set$lineMode: function(receiver, value) {
+      receiver._eval_box_element$__$lineMode = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_box_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_box_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_box_element$__$callback, value);
+    },
+    get$results: function(receiver) {
+      return receiver._eval_box_element$__$results;
+    },
+    set$results: function(receiver, value) {
+      receiver._eval_box_element$__$results = this.notifyPropertyChange$3(receiver, C.Symbol_results, receiver._eval_box_element$__$results, value);
+    },
+    updateLineMode$3: [function(receiver, e, detail, target) {
+      var t1 = H.interceptedTypeCast(J.get$target$x(e), "$isInputElement").value;
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, t1);
+      receiver._eval_box_element$__$lineMode = t1;
+      if (J.$eq(t1, "1-line")) {
+        t1 = J.replaceAll$2$s(receiver._eval_box_element$__$text, "\n", " ");
+        receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+      }
+    }, "call$3", "get$updateLineMode", 6, 0, 102, 1, 93, 94],
+    eval$3: [function(receiver, e, detail, target) {
+      var expr, t1, map;
+      J.preventDefault$0$x(e);
+      expr = receiver._eval_box_element$__$text;
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, expr, "");
+      if (receiver._eval_box_element$__$callback != null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        map = R._toObservableDeep(t1);
+        J.$indexSet$ax(map, "expr", expr);
+        J.insert$2$ax(receiver._eval_box_element$__$results, 0, map);
+        this.callback$1(receiver, expr).then$1(new L.EvalBoxElement_eval_closure(map));
+      }
+    }, "call$3", "get$eval", 6, 0, 102, 1, 93, 94],
+    selectExpr$1: [function(receiver, e) {
+      var t1 = J.getAttribute$1$x(J.get$target$x(e), "expr");
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+    }, "call$1", "get$selectExpr", 2, 0, 128, 1],
+    static: {EvalBoxElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = R._toObservableDeep([]);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver._eval_box_element$__$lineMode = "1-line";
+        receiver._eval_box_element$__$results = t1;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.EvalBoxElement_methods.Element$created$0(receiver);
+        C.EvalBoxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier5: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalBoxElement_eval_closure: {
+    "^": "Closure:13;map_0",
+    call$1: [function(result) {
+      J.$indexSet$ax(this.map_0, "value", result);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["eval_link_element", "package:observatory/src/elements/eval_link.dart", , R, {
+  "^": "",
+  EvalLinkElement: {
+    "^": "PolymerElement_ChangeNotifier1;_eval_link_element$__$busy,_eval_link_element$__$label,_eval_link_element$__$callback,_eval_link_element$__$expr,_eval_link_element$__$result,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._eval_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._eval_link_element$__$busy, value);
+    },
+    get$label: function(receiver) {
+      return receiver._eval_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._eval_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._eval_link_element$__$label, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_link_element$__$callback, value);
+    },
+    get$expr: function(receiver) {
+      return receiver._eval_link_element$__$expr;
+    },
+    set$expr: function(receiver, value) {
+      receiver._eval_link_element$__$expr = this.notifyPropertyChange$3(receiver, C.Symbol_expr, receiver._eval_link_element$__$expr, value);
+    },
+    get$result: function(receiver) {
+      return receiver._eval_link_element$__$result;
+    },
+    set$result: function(receiver, value) {
+      receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, value);
+    },
+    evalNow$3: [function(receiver, a, b, c) {
+      var t1 = receiver._eval_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._eval_link_element$__$callback != null) {
+        receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, null);
+        this.callback$1(receiver, receiver._eval_link_element$__$expr).then$1(new R.EvalLinkElement_evalNow_closure(receiver)).whenComplete$1(new R.EvalLinkElement_evalNow_closure0(receiver));
+      }
+    }, "call$3", "get$evalNow", 6, 0, 79, 46, 47, 80],
+    static: {EvalLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._eval_link_element$__$busy = false;
+        receiver._eval_link_element$__$label = "[evaluate]";
+        receiver._eval_link_element$__$callback = null;
+        receiver._eval_link_element$__$expr = "";
+        receiver._eval_link_element$__$result = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.EvalLinkElement_methods.Element$created$0(receiver);
+        C.EvalLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier1: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalLinkElement_evalNow_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._eval_link_element$__$result = J.notifyPropertyChange$3$x(t1, C.Symbol_result, t1._eval_link_element$__$result, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  EvalLinkElement_evalNow_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      var t1 = this.this_1;
+      t1._eval_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._eval_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["field_ref_element", "package:observatory/src/elements/field_ref.dart", , D, {
+  "^": "",
+  FieldRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {FieldRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldRefElement_methods.Element$created$0(receiver);
+        C.FieldRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["field_view_element", "package:observatory/src/elements/field_view.dart", , A, {
+  "^": "",
+  FieldViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier6;_field_view_element$__$field,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$field: function(receiver) {
+      return receiver._field_view_element$__$field;
+    },
+    set$field: function(receiver, value) {
+      receiver._field_view_element$__$field = this.notifyPropertyChange$3(receiver, C.Symbol_field, receiver._field_view_element$__$field, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._field_view_element$__$field).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FieldViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldViewElement_methods.Element$created$0(receiver);
+        C.FieldViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier6: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["flag_list_element", "package:observatory/src/elements/flag_list.dart", , X, {
+  "^": "",
+  FlagListElement: {
+    "^": "ObservatoryElement_ChangeNotifier7;_flag_list_element$__$flagList,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flagList: function(receiver) {
+      return receiver._flag_list_element$__$flagList;
+    },
+    set$flagList: function(receiver, value) {
+      receiver._flag_list_element$__$flagList = this.notifyPropertyChange$3(receiver, C.Symbol_flagList, receiver._flag_list_element$__$flagList, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._flag_list_element$__$flagList).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FlagListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagListElement_methods.Element$created$0(receiver);
+        C.FlagListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier7: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  FlagItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier8;_flag_list_element$__$flag,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flag: function(receiver) {
+      return receiver._flag_list_element$__$flag;
+    },
+    set$flag: function(receiver, value) {
+      receiver._flag_list_element$__$flag = this.notifyPropertyChange$3(receiver, C.Symbol_flag, receiver._flag_list_element$__$flag, value);
+    },
+    static: {FlagItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagItemElement_methods.Element$created$0(receiver);
+        C.FlagItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier8: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_ref_element", "package:observatory/src/elements/function_ref.dart", , U, {
+  "^": "",
+  FunctionRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier;_function_ref_element$__$qualified,_function_ref_element$__$hasParent,_function_ref_element$__$hasClass,_function_ref_element$__$isDart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$qualified: function(receiver) {
+      return receiver._function_ref_element$__$qualified;
+    },
+    set$qualified: function(receiver, value) {
+      receiver._function_ref_element$__$qualified = this.notifyPropertyChange$3(receiver, C.Symbol_qualified, receiver._function_ref_element$__$qualified, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      var refMap, t1, t2;
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, 0, 1);
+      refMap = receiver._service_ref_element$__$ref;
+      t1 = refMap != null;
+      if (t1) {
+        t2 = J.getInterceptor$asx(refMap);
+        t2 = !J.$eq(t2.$index(refMap, "kind"), "Collected") && !J.$eq(t2.$index(refMap, "kind"), "Native") && !J.$eq(t2.$index(refMap, "kind"), "Tag") && !J.$eq(t2.$index(refMap, "kind"), "Reused");
+      } else
+        t2 = false;
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, t2);
+      t2 = t1 && J.$index$asx(refMap, "parent") != null;
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, t2);
+      if (t1) {
+        t1 = J.getInterceptor$asx(refMap);
+        t1 = t1.$index(refMap, "owner") != null && J.$eq(t1.$index(refMap, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, t1);
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$hasParent: function(receiver) {
+      return receiver._function_ref_element$__$hasParent;
+    },
+    set$hasParent: function(receiver, value) {
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, value);
+    },
+    get$hasClass: function(receiver) {
+      return receiver._function_ref_element$__$hasClass;
+    },
+    set$hasClass: function(receiver, value) {
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, value);
+    },
+    get$isDart: function(receiver) {
+      return receiver._function_ref_element$__$isDart;
+    },
+    set$isDart: function(receiver, value) {
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, value);
+    },
+    static: {FunctionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._function_ref_element$__$qualified = true;
+        receiver._function_ref_element$__$hasParent = false;
+        receiver._function_ref_element$__$hasClass = false;
+        receiver._function_ref_element$__$isDart = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionRefElement_methods.Element$created$0(receiver);
+        C.FunctionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_view_element", "package:observatory/src/elements/function_view.dart", , N, {
+  "^": "",
+  FunctionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier9;_function_view_element$__$function,_function_view_element$__$qualifiedName,_function_view_element$__$kind,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$$function: function(receiver) {
+      return receiver._function_view_element$__$function;
+    },
+    set$$function: function(receiver, value) {
+      receiver._function_view_element$__$function = this.notifyPropertyChange$3(receiver, C.Symbol_function, receiver._function_view_element$__$function, value);
+    },
+    get$qualifiedName: function(receiver) {
+      return receiver._function_view_element$__$qualifiedName;
+    },
+    set$qualifiedName: function(receiver, value) {
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, value);
+    },
+    get$kind: function(receiver) {
+      return receiver._function_view_element$__$kind;
+    },
+    set$kind: function(receiver, value) {
+      receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, receiver._function_view_element$__$kind, value);
+    },
+    _getQualifiedName$1: function(receiver, $function) {
+      var t1, $parent, cls;
+      t1 = $function != null;
+      $parent = t1 && J.$index$asx($function, "parent") != null ? J.$index$asx($function, "parent") : null;
+      if ($parent != null)
+        return this._getQualifiedName$1(receiver, $parent) + "." + H.S(J.$index$asx($function, "user_name"));
+      if (t1) {
+        t1 = J.getInterceptor$asx($function);
+        t1 = t1.$index($function, "owner") != null && J.$eq(t1.$index($function, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      cls = t1 ? J.$index$asx($function, "owner") : null;
+      if (cls != null)
+        return H.S(J.$index$asx(cls, "user_name")) + "." + H.S(J.$index$asx($function, "user_name"));
+      return H.S(J.$index$asx($function, "user_name"));
+    },
+    functionChanged$1: [function(receiver, oldValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_kind, 0, 1);
+      t1 = this._getQualifiedName$1(receiver, receiver._function_view_element$__$function);
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, t1);
+      t1 = J.$index$asx(receiver._function_view_element$__$function, "kind");
+      t2 = receiver._function_view_element$__$kind;
+      switch (t1) {
+        case "kRegularFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "function");
+          break;
+        case "kClosureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "closure function");
+          break;
+        case "kSignatureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "signature function");
+          break;
+        case "kGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "getter function");
+          break;
+        case "kSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "setter function");
+          break;
+        case "kConstructor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "constructor");
+          break;
+        case "kImplicitGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit getter function");
+          break;
+        case "kImplicitSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit setter function");
+          break;
+        case "kStaticInitializer":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "static initializer");
+          break;
+        case "kMethodExtractor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "method extractor");
+          break;
+        case "kNoSuchMethodDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "noSuchMethod dispatcher");
+          break;
+        case "kInvokeFieldDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "invoke field dispatcher");
+          break;
+        default:
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "UNKNOWN");
+          break;
+      }
+    }, "call$1", "get$functionChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._function_view_element$__$function).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FunctionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionViewElement_methods.Element$created$0(receiver);
+        C.FunctionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier9: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["heap_map_element", "package:observatory/src/elements/heap_map.dart", , O, {
+  "^": "",
+  PixelReference: {
+    "^": "Object;_data,_dataIndex",
+    next$0: [function() {
+      return new O.PixelReference(this._data, this._dataIndex + 4);
+    }, "call$0", "get$next", 0, 0, 131],
+    get$index: function(_) {
+      return C.JSNumber_methods._tdivFast$1(this._dataIndex, 4);
+    },
+    static: {"^": "PixelReference_NUM_COLOR_COMPONENTS", PixelReference$: function(data, point) {
+        var t1, t2, t3;
+        t1 = point.get$y(point);
+        t2 = J.get$width$x(data);
+        if (typeof t1 !== "number")
+          return t1.$mul();
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t3 = point.get$x(point);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        return new O.PixelReference(data, (t1 * t2 + t3) * 4);
+      }}
+  },
+  ObjectInfo: {
+    "^": "Object;address<,size"
+  },
+  HeapMapElement: {
+    "^": "ObservatoryElement_ChangeNotifier10;_fragmentationCanvas,_fragmentationData,_pageHeight,_classIdToColor,_colorToClassId,_classIdToName,_heap_map_element$__$status,_heap_map_element$__$fragmentation,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$status: function(receiver) {
+      return receiver._heap_map_element$__$status;
+    },
+    set$status: function(receiver, value) {
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, value);
+    },
+    get$fragmentation: function(receiver) {
+      return receiver._heap_map_element$__$fragmentation;
+    },
+    set$fragmentation: function(receiver, value) {
+      receiver._heap_map_element$__$fragmentation = this.notifyPropertyChange$3(receiver, C.Symbol_fragmentation, receiver._heap_map_element$__$fragmentation, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#fragmentation");
+      receiver._fragmentationCanvas = t1;
+      t1 = J.get$onMouseMove$x(t1);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleMouseMove(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = J.get$onMouseDown$x(receiver._fragmentationCanvas);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleClick(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    },
+    _packColor$1: function(receiver, color) {
+      var t1, packed, component;
+      for (t1 = J.get$iterator$ax(color), packed = 0; t1.moveNext$0();) {
+        component = t1._current;
+        if (typeof component !== "number")
+          return H.iae(component);
+        packed = packed * 256 + component;
+      }
+      return packed;
+    },
+    _addClass$3: function(receiver, classId, $name, color) {
+      var t1 = J.split$1$s($name, "@");
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      receiver._classIdToName.$indexSet(0, classId, t1[0]);
+      receiver._classIdToColor.$indexSet(0, classId, color);
+      receiver._colorToClassId.$indexSet(0, this._packColor$1(receiver, color), classId);
+    },
+    _updateClassList$2: function(receiver, classList, freeClassId) {
+      var t1, t2, t3, t4, member, classId, rng, color, t5;
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")), t2 = receiver._classIdToName, t3 = receiver._classIdToColor, t4 = receiver._colorToClassId; t1.moveNext$0();) {
+        member = t1.get$current();
+        if (!J.getInterceptor(member).$isClass) {
+          N.Logger_Logger("").info$1(H.S(member));
+          continue;
+        }
+        classId = H.Primitives_parseInt(C.JSArray_methods.get$last(J.split$1$s(member._id, "/")), null, null);
+        rng = classId == null ? C.C__JSRandom : P._Random$(classId);
+        color = [rng.nextInt$1(128), rng.nextInt$1(128), rng.nextInt$1(128), 255];
+        t5 = J.split$1$s(member._service$__$name, "@");
+        if (0 >= t5.length)
+          return H.ioore(t5, 0);
+        t2.$indexSet(0, classId, t5[0]);
+        t3.$indexSet(0, classId, color);
+        t4.$indexSet(0, this._packColor$1(receiver, color), classId);
+      }
+      this._addClass$3(receiver, freeClassId, "Free", $.get$HeapMapElement__freeColor());
+      this._addClass$3(receiver, 0, "", $.get$HeapMapElement__pageSeparationColor());
+    },
+    _objectAt$1: function(receiver, point) {
+      var t1, t2, pagePixels, index, pageIndex, pageOffset, pages, page, objects, offset, size, i, t3;
+      t1 = receiver._pageHeight;
+      t2 = J.get$width$x(receiver._fragmentationData);
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      pagePixels = t1 * t2;
+      index = C.JSNumber_methods._tdivFast$1(O.PixelReference$(receiver._fragmentationData, point)._dataIndex, 4);
+      pageIndex = C.JSNumber_methods.$tdiv(index, pagePixels);
+      pageOffset = C.JSNumber_methods.$mod(index, pagePixels);
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      if (!(pageIndex < 0)) {
+        t1 = J.get$length$asx(pages);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = pageIndex >= t1;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      page = J.$index$asx(pages, pageIndex);
+      t1 = J.getInterceptor$asx(page);
+      objects = t1.$index(page, "objects");
+      t2 = J.getInterceptor$asx(objects);
+      offset = 0;
+      size = 0;
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        size = t2.$index(objects, i);
+        if (typeof size !== "number")
+          return H.iae(size);
+        offset += size;
+        if (offset > pageOffset) {
+          pageOffset = offset - size;
+          break;
+        }
+        i += 2;
+      }
+      t1 = H.Primitives_parseInt(t1.$index(page, "object_start"), null, null);
+      t2 = J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes");
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      return new O.ObjectInfo(J.$add$ns(t1, pageOffset * t2), J.$mul$ns(size, J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")));
+    },
+    _handleMouseMove$1: [function(receiver, $event) {
+      var t1, info, addressString, t2, className;
+      t1 = J.getInterceptor$x($event);
+      info = this._objectAt$1(receiver, t1.get$offset($event));
+      addressString = H.S(info.size) + "B @ 0x" + J.toRadixString$1$n(info.address, 16);
+      t1 = t1.get$offset($event);
+      t1 = O.PixelReference$(receiver._fragmentationData, t1);
+      t2 = t1._dataIndex;
+      className = receiver._classIdToName.$index(0, receiver._colorToClassId.$index(0, this._packColor$1(receiver, C.NativeUint8ClampedList_methods.getRange$2(J.get$data$x(t1._data), t2, t2 + 4))));
+      t1 = J.$eq(className, "") ? "-" : H.S(className) + " " + addressString;
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t1);
+    }, "call$1", "get$_handleMouseMove", 2, 0, 128, 2],
+    _handleClick$1: [function(receiver, $event) {
+      var address = J.toRadixString$1$n(this._objectAt$1(receiver, J.get$offset$x($event)).address, 16);
+      window.location.hash = "/" + H.S(J.get$link$x(J.get$isolate$x(receiver._heap_map_element$__$fragmentation))) + "/address/" + address;
+    }, "call$1", "get$_handleClick", 2, 0, 128, 2],
+    _updateFragmentationData$0: function(receiver) {
+      var t1, pages, width, t2, height;
+      t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null || receiver._fragmentationCanvas == null)
+        return;
+      this._updateClassList$2(receiver, J.$index$asx(t1, "class_list"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "free_class_id"));
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = receiver._fragmentationCanvas.parentElement;
+      t1.toString;
+      width = P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientHeight)), null).width;
+      t1 = J.$tdiv$n(J.$tdiv$n(J.$index$asx(receiver._heap_map_element$__$fragmentation, "page_size_bytes"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")), width);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = 4 + t1;
+      receiver._pageHeight = t1;
+      t2 = J.get$length$asx(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      height = P.min(t1 * t2, 6000);
+      t2 = P.convertNativeToDart_ImageData(J.get$context2D$x(receiver._fragmentationCanvas).createImageData(width, height));
+      receiver._fragmentationData = t2;
+      J.set$width$x(receiver._fragmentationCanvas, J.get$width$x(t2));
+      J.set$height$x(receiver._fragmentationCanvas, J.get$height$x(receiver._fragmentationData));
+      this._renderPages$1(receiver, 0);
+    },
+    _renderPages$1: function(receiver, startPage) {
+      var pages, t1, t2, startY, endY, pixel, objects, i, t3, count, color, count0, t4, t5, t6;
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = J.getInterceptor$asx(pages);
+      t2 = "Loaded " + startPage + " of " + H.S(t1.get$length(pages)) + " pages";
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t2);
+      t2 = receiver._pageHeight;
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      startY = startPage * t2;
+      endY = startY + t2;
+      t2 = t1.get$length(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(startPage >= t2)) {
+        t2 = J.get$height$x(receiver._fragmentationData);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t2 = endY > t2;
+      } else
+        t2 = true;
+      if (t2)
+        return;
+      pixel = O.PixelReference$(receiver._fragmentationData, H.setRuntimeTypeInfo(new P.Point(0, startY), [null]));
+      objects = J.$index$asx(t1.$index(pages, startPage), "objects");
+      t1 = J.getInterceptor$asx(objects);
+      t2 = receiver._classIdToColor;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        count = t1.$index(objects, i);
+        color = t2.$index(0, t1.$index(objects, i + 1));
+        for (; t3 = J.getInterceptor$n(count), count0 = t3.$sub(count, 1), t3.$gt(count, 0); count = count0) {
+          t3 = pixel._data;
+          t4 = pixel._dataIndex;
+          t5 = t4 + 4;
+          C.NativeUint8ClampedList_methods.setRange$3(J.get$data$x(t3), t4, t5, color);
+          pixel = new O.PixelReference(t3, t5);
+        }
+        i += 2;
+      }
+      while (true) {
+        t1 = pixel._dataIndex;
+        t2 = C.JSNumber_methods._tdivFast$1(t1, 4);
+        t3 = pixel._data;
+        t4 = J.getInterceptor$x(t3);
+        t5 = t4.get$width(t3);
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        t5 = C.JSNumber_methods.$mod(t2, t5);
+        t6 = t4.get$width(t3);
+        if (typeof t6 !== "number")
+          return H.iae(t6);
+        t6 = C.JSNumber_methods.$tdiv(t2, t6);
+        new P.Point(t5, t6).$builtinTypeInfo = [null];
+        if (!(t6 < endY))
+          break;
+        t2 = $.get$HeapMapElement__pageSeparationColor();
+        t5 = t1 + 4;
+        C.NativeUint8ClampedList_methods.setRange$3(t4.get$data(t3), t1, t5, t2);
+        pixel = new O.PixelReference(t3, t5);
+      }
+      t1 = J.get$context2D$x(receiver._fragmentationCanvas);
+      t2 = receiver._fragmentationData;
+      J.putImageData$7$x(t1, t2, 0, 0, 0, startY, J.get$width$x(t2), endY);
+      P.Future_Future(new O.HeapMapElement__renderPages_closure(receiver, startPage), null);
+    },
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("heapmap").then$1(new O.HeapMapElement_refresh_closure(receiver)).catchError$1(new O.HeapMapElement_refresh_closure0()).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    fragmentationChanged$1: [function(receiver, oldValue) {
+      P.Future_Future(new O.HeapMapElement_fragmentationChanged_closure(receiver), null);
+    }, "call$1", "get$fragmentationChanged", 2, 0, 20, 57],
+    static: {"^": "HeapMapElement__freeColor,HeapMapElement__pageSeparationColor,HeapMapElement__PAGE_SEPARATION_HEIGHT,HeapMapElement__MAX_CANVAS_HEIGHT", HeapMapElement$created: function(receiver) {
+        var t1, t2, t3, t4, t5;
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t5 = P.String;
+        t5 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t5, null), null, null), [t5, null]);
+        receiver._classIdToColor = t1;
+        receiver._colorToClassId = t2;
+        receiver._classIdToName = t3;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t4;
+        receiver.polymer$Polymer$$ = t5;
+        C.HeapMapElement_methods.Element$created$0(receiver);
+        C.HeapMapElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier10: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  HeapMapElement__renderPages_closure: {
+    "^": "Closure:69;this_0,startPage_1",
+    call$0: function() {
+      J._renderPages$1$x(this.this_0, this.startPage_1 + 1);
+    },
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(response) {
+      var t1 = this.this_0;
+      t1._heap_map_element$__$fragmentation = J.notifyPropertyChange$3$x(t1, C.Symbol_fragmentation, t1._heap_map_element$__$fragmentation, response);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure0: {
+    "^": "Closure:75;",
+    call$2: [function(e, st) {
+      N.Logger_Logger("").info$1(H.S(e) + " " + H.S(st));
+    }, "call$2", null, 4, 0, null, 1, 133, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_fragmentationChanged_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      J._updateFragmentationData$0$x(this.this_0);
+    },
+    $isFunction: true
+  }
+}],
+["heap_profile_element", "package:observatory/src/elements/heap_profile.dart", , K, {
+  "^": "",
+  ClassSortedTable: {
+    "^": "SortedTable;columns,rows,sortedRows,_sortColumnIndex,_sortDescending,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getSortKeyFor$2: function(row, col) {
+      var t1;
+      if (col === 0) {
+        t1 = this.rows;
+        if (row >>> 0 !== row || row >= t1.length)
+          return H.ioore(t1, row);
+        return J.get$name$x(J.$index$asx(J.get$values$x(t1[row]), col));
+      }
+      return G.SortedTable.prototype.getSortKeyFor$2.call(this, row, col);
+    }
+  },
+  HeapProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier11;_heap_profile_element$__$lastServiceGC,_heap_profile_element$__$lastAccumulatorReset,_newPieDataTable,_newPieChart,_oldPieDataTable,_oldPieChart,_heap_profile_element$__$classTable,_classTableBody,_heap_profile_element$__$profile,_heap_profile_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$lastServiceGC: function(receiver) {
+      return receiver._heap_profile_element$__$lastServiceGC;
+    },
+    set$lastServiceGC: function(receiver, value) {
+      receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, value);
+    },
+    get$lastAccumulatorReset: function(receiver) {
+      return receiver._heap_profile_element$__$lastAccumulatorReset;
+    },
+    set$lastAccumulatorReset: function(receiver, value) {
+      receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, value);
+    },
+    get$classTable: function(receiver) {
+      return receiver._heap_profile_element$__$classTable;
+    },
+    set$classTable: function(receiver, value) {
+      receiver._heap_profile_element$__$classTable = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, value);
+    },
+    get$profile: function(receiver) {
+      return receiver._heap_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._heap_profile_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._heap_profile_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#newPieChart");
+      t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t1]);
+      receiver._newPieChart = t2;
+      t2 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#oldPieChart");
+      t1 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t1._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t2]);
+      receiver._oldPieChart = t1;
+      receiver._classTableBody = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#classTableBody");
+    },
+    _updateClasses$0: function(receiver) {
+      var t1, clsAllocations, t2, cls;
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        clsAllocations = t1.get$current();
+        t2 = J.getInterceptor$asx(clsAllocations);
+        cls = t2.$index(clsAllocations, "class");
+        if (cls == null)
+          continue;
+        cls.get$newSpace().update$1(t2.$index(clsAllocations, "new"));
+        cls.get$oldSpace().update$1(t2.$index(clsAllocations, "old"));
+      }
+    },
+    _updateClassTable$0: function(receiver) {
+      var t1, cls, t2, t3, t4, t5, t6, t7, t8, t9;
+      receiver._heap_profile_element$__$classTable.clearRows$0();
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        cls = J.$index$asx(t1.get$current(), "class");
+        if (cls == null)
+          continue;
+        if (cls.get$hasNoAllocations())
+          continue;
+        t2 = cls.get$newSpace().get$accumulated()._service$__$bytes;
+        t3 = cls.get$newSpace().get$accumulated()._service$__$instances;
+        t4 = cls.get$newSpace().get$current()._service$__$bytes;
+        t5 = cls.get$newSpace().get$current()._service$__$instances;
+        t6 = cls.get$oldSpace().get$accumulated()._service$__$bytes;
+        t7 = cls.get$oldSpace().get$accumulated()._service$__$instances;
+        t8 = cls.get$oldSpace().get$current()._service$__$bytes;
+        t9 = cls.get$oldSpace().get$current()._service$__$instances;
+        J.addRow$1$x(receiver._heap_profile_element$__$classTable, new G.SortedTableRow([cls, "", t2, t3, t4, t5, "", t6, t7, t8, t9]));
+      }
+      J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+    },
+    _fillClassTableDomRow$2: function(receiver, tr, rowIndex) {
+      var row, t1, t2, i, t3, cell;
+      row = J.$index$asx(J.get$rows$x(receiver._heap_profile_element$__$classTable), rowIndex);
+      t1 = J.getInterceptor$x(tr);
+      t2 = J.getInterceptor$x(row);
+      J.set$ref$x(J.$index$asx(J.get$children$x(J.$index$asx(t1.get$children(tr), 0)), 0), J.$index$asx(t2.get$values(row), 0));
+      i = 1;
+      while (true) {
+        t3 = J.get$length$asx(t2.get$values(row));
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        c$0: {
+          if (C.JSArray_methods.contains$1(C.List_1_6, i))
+            break c$0;
+          cell = J.$index$asx(t1.get$children(tr), i);
+          t3 = J.getInterceptor$x(cell);
+          t3.set$title(cell, J.toString$0(J.$index$asx(t2.get$values(row), i)));
+          t3.set$text(cell, receiver._heap_profile_element$__$classTable.getFormattedValue$2(rowIndex, i));
+        }
+        ++i;
+      }
+    },
+    _updateClassTableInDom$0: function(receiver) {
+      var t1, deadRows, i, t2, newRows, tr, cell, rowIndex;
+      t1 = J.get$children$x(receiver._classTableBody);
+      if (t1.get$length(t1) > receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+        t1 = J.get$children$x(receiver._classTableBody);
+        deadRows = t1.get$length(t1) - receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+        for (i = 0; i < deadRows; ++i)
+          J.get$children$x(receiver._classTableBody).removeLast$0(0);
+      } else {
+        t1 = J.get$children$x(receiver._classTableBody);
+        if (t1.get$length(t1) < receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+          t1 = receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+          t2 = J.get$children$x(receiver._classTableBody);
+          newRows = t1 - t2.get$length(t2);
+          for (i = 0; i < newRows; ++i) {
+            tr = document.createElement("tr", null);
+            t1 = J.getInterceptor$x(tr);
+            t1.insertCell$1(tr, -1).appendChild(W._ElementFactoryProvider_createElement_tag("class-ref", null));
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            J.get$children$x(receiver._classTableBody).add$1(0, tr);
+          }
+        }
+      }
+      for (i = 0; i < receiver._heap_profile_element$__$classTable.get$sortedRows().length; ++i) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortedRows();
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        rowIndex = t1[i];
+        this._fillClassTableDomRow$2(receiver, J.get$children$x(receiver._classTableBody).$index(0, i), rowIndex);
+      }
+    },
+    changeSort$3: [function(receiver, e, detail, target) {
+      var t1, t2, t3;
+      if (!!J.getInterceptor(target).$isTableCellElement) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortColumnIndex();
+        t2 = target.cellIndex;
+        t3 = receiver._heap_profile_element$__$classTable;
+        if (t1 == null ? t2 != null : t1 !== t2) {
+          t3.set$sortColumnIndex(t2);
+          receiver._heap_profile_element$__$classTable.set$sortDescending(true);
+        } else
+          t3.set$sortDescending(!t3.get$sortDescending());
+        J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+        this._updateClassTableInDom$0(receiver);
+      }
+    }, "call$3", "get$changeSort", 6, 0, 92, 1, 93, 94],
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshGC$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?gc=full").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refreshGC", 2, 0, 20, 89],
+    resetAccumulator$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?reset=true").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$resetAccumulator", 2, 0, 20, 89],
+    _heap_profile_element$_update$1: [function(receiver, newProfile) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, newProfile);
+    }, "call$1", "get$_heap_profile_element$_update", 2, 0, 134, 135],
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, millis, isolate, t2, t3;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      t1 = J.get$isolate$x(t1);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, t1);
+      receiver._heap_profile_element$__$isolate = t1;
+      t1.updateHeapsFromMap$1(J.$index$asx(receiver._heap_profile_element$__$profile, "heaps"));
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastAccumulatorReset"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, t1);
+      }
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastServiceGC"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, t1);
+      }
+      t1 = receiver._newPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      isolate = J.get$isolate$x(receiver._heap_profile_element$__$profile);
+      t1 = receiver._newPieDataTable;
+      t2 = isolate.get$newSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._newPieDataTable;
+      t1 = J.$sub$n(isolate.get$newSpace().get$capacity(), isolate.get$newSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._newPieDataTable;
+      t3 = isolate.get$newSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      t1 = receiver._oldPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      t1 = receiver._oldPieDataTable;
+      t2 = isolate.get$oldSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._oldPieDataTable;
+      t1 = J.$sub$n(isolate.get$oldSpace().get$capacity(), isolate.get$oldSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._oldPieDataTable;
+      t3 = isolate.get$oldSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      this._updateClasses$0(receiver);
+      this._updateClassTable$0(receiver);
+      this._updateClassTableInDom$0(receiver);
+      receiver._newPieChart.draw$1(receiver._newPieDataTable);
+      receiver._oldPieChart.draw$1(receiver._oldPieDataTable);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedAverage, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedTotalCollectionTime, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedCollections, 0, 1);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    formattedAverage$1: [function(receiver, newSpace) {
+      var t1, t2, heap;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      heap = newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace();
+      return C.JSNumber_methods.toStringAsFixed$1(J.$div$n(J.$mul$ns(heap.get$totalCollectionTimeInSeconds(), 1000), heap.get$collections()), 2) + " ms";
+    }, "call$1", "get$formattedAverage", 2, 0, 136, 137],
+    formattedCollections$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toString$0((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$collections());
+    }, "call$1", "get$formattedCollections", 2, 0, 136, 137],
+    formattedTotalCollectionTime$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toStringAsFixed$1$n((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$totalCollectionTimeInSeconds(), 2) + " secs";
+    }, "call$1", "get$formattedTotalCollectionTime", 2, 0, 136, 137],
+    HeapProfileElement$created$0: function(receiver) {
+      var t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._newPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._newPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._oldPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._oldPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = H.setRuntimeTypeInfo([], [G.SortedTableRow]);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, new K.ClassSortedTable([new G.SortedTableColumn("Class", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulated Size (New)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulated Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulator Size (Old)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulator Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure())], t1, [], 0, true, null, null));
+      receiver._heap_profile_element$__$classTable = t1;
+      t1.set$sortColumnIndex(2);
+    },
+    static: {HeapProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._heap_profile_element$__$lastServiceGC = "---";
+        receiver._heap_profile_element$__$lastAccumulatorReset = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.HeapProfileElement_methods.Element$created$0(receiver);
+        C.HeapProfileElement_methods.PolymerElement$created$0(receiver);
+        C.HeapProfileElement_methods.HeapProfileElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier11: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["html_common", "dart:html_common", , P, {
+  "^": "",
+  _convertDartToNative_PrepareForStructuredClone: function(value) {
+    var copies, copy;
+    copies = [];
+    copy = new P._convertDartToNative_PrepareForStructuredClone_walk(new P._convertDartToNative_PrepareForStructuredClone_findSlot([], copies), new P._convertDartToNative_PrepareForStructuredClone_readSlot(copies), new P._convertDartToNative_PrepareForStructuredClone_writeSlot(copies)).call$1(value);
+    new P._convertDartToNative_PrepareForStructuredClone_cleanupSlots().call$0();
+    return copy;
+  },
+  convertNativeToDart_AcceptStructuredClone: function(object, mustCopy) {
+    var copies = [];
+    return new P.convertNativeToDart_AcceptStructuredClone_walk(mustCopy, new P.convertNativeToDart_AcceptStructuredClone_findSlot([], copies), new P.convertNativeToDart_AcceptStructuredClone_readSlot(copies), new P.convertNativeToDart_AcceptStructuredClone_writeSlot(copies)).call$1(object);
+  },
+  convertNativeToDart_ImageData: function(nativeImageData) {
+    var t1, data;
+    t1 = J.getInterceptor(nativeImageData);
+    if (!!t1.$isImageData) {
+      data = t1.get$data(nativeImageData);
+      if (data.constructor === Array)
+        if (typeof CanvasPixelArray !== "undefined") {
+          data.constructor = CanvasPixelArray;
+          data.BYTES_PER_ELEMENT = 1;
+        }
+      return nativeImageData;
+    }
+    return new P._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
+  },
+  convertDartToNative_ImageData: function(imageData) {
+    if (!!J.getInterceptor(imageData).$is_TypedImageData)
+      return {data: imageData.data, height: imageData.height, width: imageData.width};
+    return imageData;
+  },
+  Device_isWebKit: function() {
+    var t1 = $.Device__isWebKit;
+    if (t1 == null) {
+      t1 = $.Device__isOpera;
+      if (t1 == null) {
+        t1 = J.contains$2$asx(window.navigator.userAgent, "Opera", 0);
+        $.Device__isOpera = t1;
+      }
+      t1 = t1 !== true && J.contains$2$asx(window.navigator.userAgent, "WebKit", 0);
+      $.Device__isWebKit = t1;
+    }
+    return t1;
+  },
+  _convertDartToNative_PrepareForStructuredClone_findSlot: {
+    "^": "Closure:48;values_1,copies_2",
+    call$1: function(value) {
+      var t1, $length, i;
+      t1 = this.values_1;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i)
+        if (t1[i] === value)
+          return i;
+      t1.push(value);
+      this.copies_2.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_readSlot: {
+    "^": "Closure:138;copies_3",
+    call$1: function(i) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_4",
+    call$2: function(i, x) {
+      var t1 = this.copies_4;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_cleanupSlots: {
+    "^": "Closure:69;",
+    call$0: function() {
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk: {
+    "^": "Closure:13;findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var t1, t2, slot, copy, $length, i;
+      t1 = {};
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      t2 = J.getInterceptor(e);
+      if (!!t2.$isDateTime)
+        return new Date(e.millisecondsSinceEpoch);
+      if (!!t2.$isRegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (!!t2.$isFile)
+        return e;
+      if (!!t2.$isBlob)
+        return e;
+      if (!!t2.$isImageData)
+        return e;
+      if (!!t2.$isNativeByteBuffer)
+        return e;
+      if (!!t2.$isNativeTypedData)
+        return e;
+      if (!!t2.$isMap) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        t1.copy_0 = copy;
+        if (copy != null)
+          return copy;
+        copy = {};
+        t1.copy_0 = copy;
+        this.writeSlot_7.call$2(slot, copy);
+        t2.forEach$1(e, new P._convertDartToNative_PrepareForStructuredClone_walk_closure(t1, this));
+        return t1.copy_0;
+      }
+      if (!!t2.$isList) {
+        $length = t2.get$length(e);
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null) {
+          if (true === copy) {
+            copy = new Array($length);
+            this.writeSlot_7.call$2(slot, copy);
+          }
+          return copy;
+        }
+        copy = new Array($length);
+        this.writeSlot_7.call$2(slot, copy);
+        for (i = 0; i < $length; ++i) {
+          t1 = this.call$1(t2.$index(e, i));
+          if (i >= copy.length)
+            return H.ioore(copy, i);
+          copy[i] = t1;
+        }
+        return copy;
+      }
+      throw H.wrapException(P.UnimplementedError$("structured clone of other type"));
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk_closure: {
+    "^": "Closure:75;box_0,walk_8",
+    call$2: function(key, value) {
+      this.box_0.copy_0[key] = this.walk_8.call$1(value);
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_findSlot: {
+    "^": "Closure:48;values_0,copies_1",
+    call$1: function(value) {
+      var t1, $length, i, t2;
+      t1 = this.values_0;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i) {
+        t2 = t1[i];
+        if (t2 == null ? value == null : t2 === value)
+          return i;
+      }
+      t1.push(value);
+      this.copies_1.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_readSlot: {
+    "^": "Closure:138;copies_2",
+    call$1: function(i) {
+      var t1 = this.copies_2;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_3",
+    call$2: function(i, x) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_walk: {
+    "^": "Closure:13;mustCopy_4,findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var slot, copy, t1, key, $length, t2, i;
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      if (e instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
+      if (e instanceof RegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (Object.getPrototypeOf(e) === Object.prototype) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        copy = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.writeSlot_7.call$2(slot, copy);
+        for (t1 = Object.keys(e), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          key = t1._current;
+          copy.$indexSet(0, key, this.call$1(e[key]));
+        }
+        return copy;
+      }
+      if (e instanceof Array) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        t1 = J.getInterceptor$asx(e);
+        $length = t1.get$length(e);
+        copy = this.mustCopy_4 ? new Array($length) : e;
+        this.writeSlot_7.call$2(slot, copy);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        t2 = J.getInterceptor$ax(copy);
+        i = 0;
+        for (; i < $length; ++i)
+          t2.$indexSet(copy, i, this.call$1(t1.$index(e, i)));
+        return copy;
+      }
+      return e;
+    },
+    $isFunction: true
+  },
+  _TypedImageData: {
+    "^": "Object;data>,height>,width>",
+    $is_TypedImageData: true,
+    $isImageData: true
+  },
+  CssClassSetImpl: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return this.readClasses$0().join$1(0, " ");
+    },
+    get$iterator: function(_) {
+      var t1 = this.readClasses$0();
+      t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    forEach$1: function(_, f) {
+      this.readClasses$0().forEach$1(0, f);
+    },
+    join$1: function(_, separator) {
+      return this.readClasses$0().join$1(0, separator);
+    },
+    map$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$map", 2, 0, 140, 31],
+    where$1: function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.WhereIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    expand$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$expand", 2, 0, 141, 31],
+    any$1: function(_, f) {
+      return this.readClasses$0().any$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this.readClasses$0()._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.readClasses$0()._collection$_length !== 0;
+    },
+    get$length: function(_) {
+      return this.readClasses$0()._collection$_length;
+    },
+    contains$1: function(_, value) {
+      return this.readClasses$0().contains$1(0, value);
+    },
+    lookup$1: function(value) {
+      return this.readClasses$0().contains$1(0, value) ? value : null;
+    },
+    add$1: function(_, value) {
+      return this.modify$1(new P.CssClassSetImpl_add_closure(value));
+    },
+    remove$1: function(_, value) {
+      var s, result;
+      s = this.readClasses$0();
+      result = s.remove$1(0, value);
+      this.writeClasses$1(s);
+      return result;
+    },
+    addAll$1: function(_, iterable) {
+      this.modify$1(new P.CssClassSetImpl_addAll_closure(iterable));
+    },
+    get$last: function(_) {
+      var t1 = this.readClasses$0()._last;
+      if (t1 == null)
+        H.throwExpression(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    toList$1$growable: function(_, growable) {
+      return this.readClasses$0().toList$1$growable(0, growable);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    clear$0: function(_) {
+      this.modify$1(new P.CssClassSetImpl_clear_closure());
+    },
+    modify$1: function(f) {
+      var s, ret;
+      s = this.readClasses$0();
+      ret = f.call$1(s);
+      this.writeClasses$1(s);
+      return ret;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.String];
+    }
+  },
+  CssClassSetImpl_add_closure: {
+    "^": "Closure:13;value_0",
+    call$1: [function(s) {
+      return J.add$1$ax(s, this.value_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_addAll_closure: {
+    "^": "Closure:13;iterable_0",
+    call$1: [function(s) {
+      return J.addAll$1$ax(s, this.iterable_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_clear_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return J.clear$0$ax(s);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  FilteredElementList: {
+    "^": "ListBase;_html_common$_node,_childNodes",
+    get$_filtered: function() {
+      var t1 = this._childNodes;
+      return P.List_List$from(t1.where$1(t1, new P.FilteredElementList__filtered_closure()), true, W.Element);
+    },
+    forEach$1: function(_, f) {
+      H.IterableMixinWorkaround_forEach(this.get$_filtered(), f);
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      J.replaceWith$1$x(t1[index], value);
+    },
+    set$length: function(_, newLength) {
+      var len = this.get$_filtered().length;
+      if (newLength >= len)
+        return;
+      else if (newLength < 0)
+        throw H.wrapException(P.ArgumentError$("Invalid list length"));
+      this.removeRange$2(0, newLength, len);
+    },
+    add$1: function(_, value) {
+      this._childNodes._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._childNodes._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    contains$1: function(_, needle) {
+      return false;
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort filtered list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on filtered list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      H.IterableMixinWorkaround_forEach(C.JSArray_methods.sublist$2(this.get$_filtered(), start, end), new P.FilteredElementList_removeRange_closure());
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._childNodes._this);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        J.remove$0$ax(result);
+      return result;
+    },
+    insert$2: function(_, index, value) {
+      this._childNodes.insert$2(0, index, value);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._childNodes._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    get$length: function(_) {
+      return this.get$_filtered().length;
+    },
+    $index: function(_, index) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    get$iterator: function(_) {
+      var t1 = this.get$_filtered();
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    }
+  },
+  FilteredElementList__filtered_closure: {
+    "^": "Closure:13;",
+    call$1: function(n) {
+      return !!J.getInterceptor(n).$isElement;
+    },
+    $isFunction: true
+  },
+  FilteredElementList_removeRange_closure: {
+    "^": "Closure:13;",
+    call$1: function(el) {
+      return J.remove$0$ax(el);
+    },
+    $isFunction: true
+  }
+}],
+["instance_ref_element", "package:observatory/src/elements/instance_ref.dart", , B, {
+  "^": "",
+  InstanceRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null)
+        if (J.$eq(t1.get$serviceType(), "Null"))
+          if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/optimized-out"))
+            return "This object is no longer needed and has been removed by the optimizing compiler.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/collected"))
+            return "This object has been reclaimed by the garbage collector.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/expired"))
+            return "The handle to this object has expired.  Consider refreshing the page.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/not-initialized"))
+            return "This object will be initialized once it is accessed by the program.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/being-initialized"))
+            return "This object is currently being initialized.";
+      return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+    },
+    expander$0: [function(receiver) {
+      return this.get$expandEvent(receiver);
+    }, "call$0", "get$expander", 0, 0, 69],
+    expandEvent$2: [function(receiver, expand, done) {
+      var t1, t2;
+      t1 = receiver._service_ref_element$__$ref;
+      if (expand === true)
+        J.reload$0$x(t1).then$1(new B.InstanceRefElement_expandEvent_closure(receiver)).whenComplete$1(done);
+      else {
+        t2 = J.getInterceptor$ax(t1);
+        t2.$indexSet(t1, "fields", null);
+        t2.$indexSet(t1, "elements", null);
+        done.call$0();
+      }
+    }, "call$2", "get$expandEvent", 4, 0, 143, 144, 89],
+    static: {InstanceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceRefElement_methods.Element$created$0(receiver);
+        C.InstanceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  InstanceRefElement_expandEvent_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(result);
+      if (t1.$index(result, "valueAsString") != null) {
+        t1.set$name(result, t1.$index(result, "valueAsString"));
+        result.set$vmName(t1.$index(result, "valueAsString"));
+      }
+      t1 = this.this_0;
+      t2 = J.getInterceptor$x(t1);
+      t1._service_ref_element$__$ref = t2.notifyPropertyChange$3(t1, C.Symbol_ref, t1._service_ref_element$__$ref, result);
+      t2.notifyPropertyChange$3(t1, C.Symbol_ref, 0, 1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["instance_view_element", "package:observatory/src/elements/instance_view.dart", , Z, {
+  "^": "",
+  InstanceViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier12;_instance_view_element$__$instance,_instance_view_element$__$path,_instance_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$instance: function(receiver) {
+      return receiver._instance_view_element$__$instance;
+    },
+    set$instance: function(receiver, value) {
+      receiver._instance_view_element$__$instance = this.notifyPropertyChange$3(receiver, C.Symbol_instance, receiver._instance_view_element$__$instance, value);
+    },
+    get$path: function(receiver) {
+      return receiver._instance_view_element$__$path;
+    },
+    set$path: function(receiver, value) {
+      receiver._instance_view_element$__$path = this.notifyPropertyChange$3(receiver, C.Symbol_path, receiver._instance_view_element$__$path, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._instance_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._instance_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._instance_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    retainedSize$1: [function(receiver, dummy) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retained")).then$1(new Z.InstanceViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    retainingPath$1: [function(receiver, arg) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retaining_path?limit=" + H.S(arg))).then$1(new Z.InstanceViewElement_retainingPath_closure(receiver));
+    }, "call$1", "get$retainingPath", 2, 0, 98, 33],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._instance_view_element$__$instance).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {InstanceViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._instance_view_element$__$retainedBytes = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceViewElement_methods.Element$created$0(receiver);
+        C.InstanceViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier12: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  InstanceViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._instance_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._instance_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  InstanceViewElement_retainingPath_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._instance_view_element$__$path = J.notifyPropertyChange$3$x(t1, C.Symbol_path, t1._instance_view_element$__$path, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["io_view_element", "package:observatory/src/elements/io_view.dart", , E, {
+  "^": "",
+  IOViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier13;_io_view_element$__$io,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$io: function(receiver) {
+      return receiver._io_view_element$__$io;
+    },
+    set$io: function(receiver, value) {
+      receiver._io_view_element$__$io = this.notifyPropertyChange$3(receiver, C.Symbol_io, receiver._io_view_element$__$io, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$io).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOViewElement_methods.Element$created$0(receiver);
+        C.IOViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier13: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORefElement_methods.Element$created$0(receiver);
+        C.IORefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier14;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOHttpServerListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerListViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier14: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier15;_io_view_element$__$httpServer,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$httpServer: function(receiver) {
+      return receiver._io_view_element$__$httpServer;
+    },
+    set$httpServer: function(receiver, value) {
+      receiver._io_view_element$__$httpServer = this.notifyPropertyChange$3(receiver, C.Symbol_httpServer, receiver._io_view_element$__$httpServer, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(new E.IOHttpServerViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier15: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier16;_io_view_element$__$connection,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$connection: function(receiver) {
+      return receiver._io_view_element$__$connection;
+    },
+    set$connection: function(receiver, value) {
+      receiver._io_view_element$__$connection = this.notifyPropertyChange$3(receiver, C.Symbol_connection, receiver._io_view_element$__$connection, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(new E.IOHttpServerConnectionViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerConnectionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier16: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerConnectionViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerConnectionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketRefElement_methods.Element$created$0(receiver);
+        C.IOSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier17;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier17: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier18;_io_view_element$__$socket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$socket: function(receiver) {
+      return receiver._io_view_element$__$socket;
+    },
+    set$socket: function(receiver, value) {
+      receiver._io_view_element$__$socket = this.notifyPropertyChange$3(receiver, C.Symbol_socket, receiver._io_view_element$__$socket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$socket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketViewElement_methods.Element$created$0(receiver);
+        C.IOSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier18: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOWebSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketRefElement_methods.Element$created$0(receiver);
+        C.IOWebSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOWebSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier19;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier19: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier20;_io_view_element$__$webSocket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$webSocket: function(receiver) {
+      return receiver._io_view_element$__$webSocket;
+    },
+    set$webSocket: function(receiver, value) {
+      receiver._io_view_element$__$webSocket = this.notifyPropertyChange$3(receiver, C.Symbol_webSocket, receiver._io_view_element$__$webSocket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$webSocket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier20: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier21;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IORandomAccessFileListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileListViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier21: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORandomAccessFileRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileRefElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IORandomAccessFileViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier22;_io_view_element$__$file,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$file: function(receiver) {
+      return receiver._io_view_element$__$file;
+    },
+    set$file: function(receiver, value) {
+      receiver._io_view_element$__$file = this.notifyPropertyChange$3(receiver, C.Symbol_file, receiver._io_view_element$__$file, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(new E.IORandomAccessFileViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IORandomAccessFileViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier22: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOProcessListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier23;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOProcessListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessListViewElement_methods.Element$created$0(receiver);
+        C.IOProcessListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier23: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier0;_io_view_element$__$small,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$small: function(receiver) {
+      return receiver._io_view_element$__$small;
+    },
+    set$small: function(receiver, value) {
+      receiver._io_view_element$__$small = this.notifyPropertyChange$3(receiver, C.Symbol_small, receiver._io_view_element$__$small, value);
+    },
+    static: {IOProcessRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._io_view_element$__$small = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessRefElement_methods.Element$created$0(receiver);
+        C.IOProcessRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier0: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier24;_io_view_element$__$process,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$process: function(receiver) {
+      return receiver._io_view_element$__$process;
+    },
+    process$0: function($receiver) {
+      return this.get$process($receiver).call$0();
+    },
+    set$process: function(receiver, value) {
+      receiver._io_view_element$__$process = this.notifyPropertyChange$3(receiver, C.Symbol_process, receiver._io_view_element$__$process, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(new E.IOProcessViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOProcessViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessViewElement_methods.Element$created$0(receiver);
+        C.IOProcessViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier24: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_profile_element", "package:observatory/src/elements/isolate_profile.dart", , X, {
+  "^": "",
+  ProfileCodeTrieNodeTreeRow: {
+    "^": "TableTreeRow;profile>,root,node,tipKind<,tipParent<,tipExclusive<,tipTicks<,tipTime<,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$code: function(_) {
+      return J.get$code$x(this.node);
+    },
+    onShow$0: function(_) {
+      var t1, threshold, t2, t3, t4, t5, childNode, t6;
+      t1 = this.profile;
+      threshold = J.$index$asx(t1, "threshold");
+      t2 = this.children;
+      if (t2.length > 0)
+        return;
+      for (t3 = this.node, t4 = J.get$iterator$ax(J.get$children$x(t3)), t5 = this.root; t4.moveNext$0();) {
+        childNode = t4.get$current();
+        t6 = J.$div$n(childNode.get$count(), t3.get$count());
+        if (typeof threshold !== "number")
+          return H.iae(threshold);
+        if (!(t6 > threshold || J.$div$n(J.get$code$x(childNode).get$exclusiveTicks(), t5.count) > threshold))
+          continue;
+        t2.push(X.ProfileCodeTrieNodeTreeRow$(t1, t5, childNode, this));
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.node)) > 0;
+    },
+    ProfileCodeTrieNodeTreeRow$4: function(profile, root, node, $parent) {
+      var t1, t2;
+      t1 = this.node;
+      this.tipTicks = H.S(t1.get$count());
+      this.tipTime = G.Utils_formatTimePrecise(J.$div$n(J.$mul$ns(J.$index$asx(this.profile, "period"), t1.get$count()), 1000000));
+      t2 = J.getInterceptor$x(t1);
+      if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Tag)) {
+        this.tipKind = "Tag (category)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t1.get$count(), this.root.count);
+      } else {
+        if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Collected) || J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Reused))
+          this.tipKind = "Garbage Collected Code";
+        else
+          this.tipKind = H.S(J.get$kind$x(t2.get$code(t1))) + " (Function)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t2.get$code(t1).get$exclusiveTicks(), this.root.count);
+      }
+      t1 = this.columns;
+      t1.push(this.tipParent);
+      t1.push(this.tipExclusive);
+    },
+    static: {ProfileCodeTrieNodeTreeRow$: function(profile, root, node, $parent) {
+        var t1, t2;
+        t1 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t2 = $parent != null ? $parent.depth + 1 : 0;
+        t1 = new X.ProfileCodeTrieNodeTreeRow(profile, root, node, "", "", "", "", "", $parent, t2, t1, [], "\u2192", "cursor: pointer;", false, null, null);
+        t1.TableTreeRow$1($parent);
+        t1.ProfileCodeTrieNodeTreeRow$4(profile, root, node, $parent);
+        return t1;
+      }}
+  },
+  IsolateProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier25;_isolate_profile_element$__$profile,_isolate_profile_element$__$hideTagsChecked,_isolate_profile_element$__$sampleCount,_isolate_profile_element$__$refreshTime,_isolate_profile_element$__$sampleRate,_isolate_profile_element$__$sampleDepth,_isolate_profile_element$__$displayCutoff,_isolate_profile_element$__$timeSpan,displayThreshold,_isolate_profile_element$__$tagSelector,_isolate_profile_element$_id,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$profile: function(receiver) {
+      return receiver._isolate_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._isolate_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._isolate_profile_element$__$profile, value);
+    },
+    get$hideTagsChecked: function(receiver) {
+      return receiver._isolate_profile_element$__$hideTagsChecked;
+    },
+    set$hideTagsChecked: function(receiver, value) {
+      receiver._isolate_profile_element$__$hideTagsChecked = this.notifyPropertyChange$3(receiver, C.Symbol_hideTagsChecked, receiver._isolate_profile_element$__$hideTagsChecked, value);
+    },
+    get$sampleCount: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleCount;
+    },
+    set$sampleCount: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, value);
+    },
+    get$refreshTime: function(receiver) {
+      return receiver._isolate_profile_element$__$refreshTime;
+    },
+    set$refreshTime: function(receiver, value) {
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, value);
+    },
+    get$sampleRate: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleRate;
+    },
+    set$sampleRate: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, value);
+    },
+    get$sampleDepth: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleDepth;
+    },
+    set$sampleDepth: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, value);
+    },
+    get$displayCutoff: function(receiver) {
+      return receiver._isolate_profile_element$__$displayCutoff;
+    },
+    set$displayCutoff: function(receiver, value) {
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, value);
+    },
+    get$timeSpan: function(receiver) {
+      return receiver._isolate_profile_element$__$timeSpan;
+    },
+    set$timeSpan: function(receiver, value) {
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, value);
+    },
+    get$tagSelector: function(receiver) {
+      return receiver._isolate_profile_element$__$tagSelector;
+    },
+    set$tagSelector: function(receiver, value) {
+      receiver._isolate_profile_element$__$tagSelector = this.notifyPropertyChange$3(receiver, C.Symbol_tagSelector, receiver._isolate_profile_element$__$tagSelector, value);
+    },
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, totalSamples, now, period, t2;
+      t1 = receiver._isolate_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      totalSamples = J.$index$asx(t1, "samples");
+      now = new P.DateTime(Date.now(), false);
+      now.DateTime$_now$0();
+      t1 = J.toString$0(totalSamples);
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, t1);
+      t1 = now.toString$0(0);
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, t1);
+      t1 = J.toString$0(J.$index$asx(receiver._isolate_profile_element$__$profile, "depth"));
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, t1);
+      period = J.$index$asx(receiver._isolate_profile_element$__$profile, "period");
+      if (typeof period !== "number")
+        return H.iae(period);
+      t1 = C.JSNumber_methods.toStringAsFixed$1(1000000 / period, 0);
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, t1);
+      t1 = G.Utils_formatTime(J.$index$asx(receiver._isolate_profile_element$__$profile, "timeSpan"));
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, t1);
+      t1 = receiver.displayThreshold;
+      t2 = C.JSDouble_methods.toString$0(t1 * 100) + "%";
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, t2);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).processProfile$1(receiver._isolate_profile_element$__$profile);
+      J.$indexSet$ax(receiver._isolate_profile_element$__$profile, "threshold", t1);
+      this._isolate_profile_element$_update$0(receiver);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      this._isolate_profile_element$_update$0(receiver);
+    },
+    tagSelectorChanged$1: [function(receiver, oldValue) {
+      this.refresh$1(receiver, null);
+    }, "call$1", "get$tagSelectorChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      var request = "profile?tags=" + H.S(receiver._isolate_profile_element$__$tagSelector);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$1(request).then$1(new X.IsolateProfileElement_refresh_closure(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _isolate_profile_element$_update$0: function(receiver) {
+      if (receiver._isolate_profile_element$__$profile == null)
+        return;
+      this._buildStackTree$0(receiver);
+    },
+    _buildStackTree$0: function(receiver) {
+      var root, e, stackTrace, exception, t1;
+      root = J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$profileTrieRoot();
+      if (root == null)
+        return;
+      try {
+        receiver.tree.initialize$1(X.ProfileCodeTrieNodeTreeRow$(receiver._isolate_profile_element$__$profile, root, root, null));
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_buildStackTree", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {"^": "IsolateProfileElement_MICROSECONDS_PER_SECOND", IsolateProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._isolate_profile_element$__$sampleCount = "";
+        receiver._isolate_profile_element$__$refreshTime = "";
+        receiver._isolate_profile_element$__$sampleRate = "";
+        receiver._isolate_profile_element$__$sampleDepth = "";
+        receiver._isolate_profile_element$__$displayCutoff = "";
+        receiver._isolate_profile_element$__$timeSpan = "";
+        receiver.displayThreshold = 0.0002;
+        receiver._isolate_profile_element$__$tagSelector = "uv";
+        receiver._isolate_profile_element$_id = "#tableTree";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateProfileElement_methods.Element$created$0(receiver);
+        C.IsolateProfileElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier25: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateProfileElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(m) {
+      var t1 = this.this_0;
+      t1._isolate_profile_element$__$profile = J.notifyPropertyChange$3$x(t1, C.Symbol_profile, t1._isolate_profile_element$__$profile, m);
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_ref_element", "package:observatory/src/elements/isolate_ref.dart", , N, {
+  "^": "",
+  IsolateRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IsolateRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRefElement_methods.Element$created$0(receiver);
+        C.IsolateRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["isolate_summary_element", "package:observatory/src/elements/isolate_summary.dart", , D, {
+  "^": "",
+  IsolateSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier26;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier26: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement: {
+    "^": "ObservatoryElement_ChangeNotifier27;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/pause").then$1(new D.IsolateRunStateElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/resume").then$1(new D.IsolateRunStateElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateRunStateElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRunStateElement_methods.Element$created$0(receiver);
+        C.IsolateRunStateElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier27: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateRunStateElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateLocationElement: {
+    "^": "ObservatoryElement_ChangeNotifier28;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateLocationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateLocationElement_methods.Element$created$0(receiver);
+        C.IsolateLocationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier28: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateSharedSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier29;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSharedSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSharedSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSharedSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier29: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CounterChart: {
+    "^": "Object;_table,_chart",
+    update$1: function(counters) {
+      var t1, t2, t3, key, t4, t5;
+      t1 = this._table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Name"]);
+        t1.callMethod$2("addColumn", ["number", "Value"]);
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      for (t2 = J.get$iterator$ax(counters.get$keys()), t3 = J.getInterceptor$asx(counters); t2.moveNext$0();) {
+        key = t2.get$current();
+        t4 = J.split$1$s(t3.$index(counters, key), "%");
+        if (0 >= t4.length)
+          return H.ioore(t4, 0);
+        t5 = [];
+        C.JSArray_methods.addAll$1(t5, C.JSArray_methods.map$1([key, H.Primitives_parseDouble(t4[0], null)], P._convertToJS$closure()));
+        t5 = new P.JsArray(t5);
+        t5.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t5]);
+      }
+    }
+  },
+  IsolateCounterChartElement: {
+    "^": "ObservatoryElement_ChangeNotifier30;_isolate_summary_element$__$counters,chart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$counters: function(receiver) {
+      return receiver._isolate_summary_element$__$counters;
+    },
+    set$counters: function(receiver, value) {
+      receiver._isolate_summary_element$__$counters = this.notifyPropertyChange$3(receiver, C.Symbol_counters, receiver._isolate_summary_element$__$counters, value);
+    },
+    countersChanged$1: [function(receiver, oldValue) {
+      var t1, element, t2;
+      if (receiver._isolate_summary_element$__$counters == null)
+        return;
+      if ($.get$GoogleChart__completer().future._state !== 0 && receiver.chart == null)
+        receiver.chart = new D.CounterChart(new G.DataTable(P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null)), null);
+      t1 = receiver.chart;
+      if (t1 == null)
+        return;
+      t1.update$1(receiver._isolate_summary_element$__$counters);
+      element = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#counterPieChart");
+      if (element != null) {
+        t1 = receiver.chart;
+        t2 = t1._chart;
+        if (t2 == null) {
+          t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+          t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [element]);
+          t1._chart = t2;
+        }
+        t2.draw$1(t1._table);
+      }
+    }, "call$1", "get$countersChanged", 2, 0, 20, 57],
+    static: {IsolateCounterChartElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateCounterChartElement_methods.Element$created$0(receiver);
+        C.IsolateCounterChartElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier30: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["isolate_view_element", "package:observatory/src/elements/isolate_view.dart", , L, {
+  "^": "",
+  TagProfileChart: {
+    "^": "Object;_isolate_view_element$_table,_isolate_view_element$_chart",
+    update$1: function(tagProfile) {
+      var t1, t2, tagName, idleIndex, t, i, snapshotTime, row, sum, j;
+      t1 = this._isolate_view_element$_table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Time"]);
+        for (t2 = J.get$iterator$ax(tagProfile.get$names()); t2.moveNext$0();) {
+          tagName = t2._current;
+          if (J.$eq(tagName, "Idle"))
+            continue;
+          t1.callMethod$2("addColumn", ["number", tagName]);
+        }
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      idleIndex = J.indexOf$1$asx(tagProfile.get$names(), "Idle");
+      t = tagProfile.get$updatedAtSeconds();
+      for (i = 0; i < tagProfile.get$snapshots().length; ++i) {
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        snapshotTime = t2[i].seconds;
+        row = [];
+        if (snapshotTime > 0) {
+          if (typeof t !== "number")
+            return H.iae(t);
+          row.push("t " + C.JSNumber_methods.toStringAsFixed$1(snapshotTime - t, 2));
+        } else
+          row.push("");
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        sum = t2[i]._sum;
+        if (sum === 0) {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              row.push(0);
+            }
+            ++j;
+          }
+        } else {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              t2 = tagProfile.get$snapshots();
+              if (i >= t2.length)
+                return H.ioore(t2, i);
+              t2 = t2[i].counters;
+              if (j >= t2.length)
+                return H.ioore(t2, j);
+              row.push(C.JSNumber_methods.toInt$0(J.$div$n(t2[j], sum) * 100));
+            }
+            ++j;
+          }
+        }
+        t2 = [];
+        C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(row, P._convertToJS$closure()));
+        t2 = new P.JsArray(t2);
+        t2.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t2]);
+      }
+    }
+  },
+  IsolateViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier31;_isolate_view_element$__$isolate,_isolate_view_element$_updateTimer,tagProfileChart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_view_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_view_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_view_element$__$isolate, value);
+    },
+    eval$1: [function(receiver, text) {
+      var t1 = receiver._isolate_view_element$__$isolate;
+      return t1.get$1(J.$add$ns(J.get$id$x(t1.get$rootLib()), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    _updateTagProfile$0: [function(receiver) {
+      receiver._isolate_view_element$__$isolate.updateTagProfile$0().then$1(new L.IsolateViewElement__updateTagProfile_closure(receiver));
+    }, "call$0", "get$_updateTagProfile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateTagProfile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._isolate_view_element$_updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._isolate_view_element$_updateTimer = null;
+      }
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._isolate_view_element$__$isolate).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("debug/pause").then$1(new L.IsolateViewElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("resume").then$1(new L.IsolateViewElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateViewElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver.tagProfileChart = new L.TagProfileChart(new G.DataTable(t1), null);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.IsolateViewElement_methods.Element$created$0(receiver);
+        C.IsolateViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier31: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateViewElement__updateTagProfile_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(tagProfile) {
+      var t1, t2, element, t3, t4;
+      t1 = this.this_0;
+      t2 = t1.tagProfileChart;
+      t2.update$1(tagProfile);
+      element = (t1.shadowRoot || t1.webkitShadowRoot).querySelector("#tagProfileChart");
+      if (element != null) {
+        if (t2._isolate_view_element$_chart == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t4 = new G.Chart(null, t3);
+          t4._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "SteppedAreaChart"), [element]);
+          t2._isolate_view_element$_chart = t4;
+          t3.$indexSet(0, "isStacked", true);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "connectSteps", false);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "vAxis", P.LinkedHashMap_LinkedHashMap$_literal(["minValue", 0, "maxValue", 100], null, null));
+        }
+        t2._isolate_view_element$_chart.draw$1(t2._isolate_view_element$_table);
+      }
+      if (t1._isolate_view_element$_updateTimer != null)
+        t1._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateTagProfile$x(t1));
+    }, "call$1", null, 2, 0, null, 147, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["json_view_element", "package:observatory/src/elements/json_view.dart", , Z, {
+  "^": "",
+  JsonPrettyPrinter: {
+    "^": "Object;_json_view_element$_buffer,_seen",
+    _printMap$2: function(map, depth) {
+      var t1, t2, t3, t4, t5, k, v, t6;
+      t1 = this._seen;
+      if (t1.contains$1(0, map))
+        return;
+      t1.add$1(0, map);
+      for (t2 = J.get$iterator$ax(map.get$keys()), t3 = this._json_view_element$_buffer, t4 = J.getInterceptor$asx(map), t5 = depth + 1; t2.moveNext$0();) {
+        k = t2.get$current();
+        v = t4.$index(map, k);
+        t6 = J.getInterceptor(v);
+        if (!!t6.$isMap) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": {\n";
+          t3._contents += t6;
+          this._printMap$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "}\n";
+        } else if (!!t6.$isList) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": [\n";
+          t3._contents += t6;
+          this._printList$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "]\n";
+        } else {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": " + H.S(v);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "\n";
+        }
+      }
+      t1.remove$1(0, map);
+    },
+    _printList$2: function(list, depth) {
+      var t1, t2, t3, t4, v, t5;
+      t1 = this._seen;
+      if (t1.contains$1(0, list))
+        return;
+      t1.add$1(0, list);
+      for (t2 = J.get$iterator$ax(list), t3 = this._json_view_element$_buffer, t4 = depth + 1; t2.moveNext$0();) {
+        v = t2.get$current();
+        t5 = J.getInterceptor(v);
+        if (!!t5.$isMap) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "{\n";
+          this._printMap$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "}\n";
+        } else if (!!t5.$isList) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "[\n";
+          this._printList$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "]\n";
+        } else {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t5;
+          t5 = t3._contents += typeof v === "string" ? v : H.S(v);
+          t3._contents = t5 + "\n";
+        }
+      }
+      t1.remove$1(0, list);
+    }
+  },
+  JsonViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier32;_json_view_element$__$map,_json_view_element$__$mapAsString,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$map: function(receiver) {
+      return receiver._json_view_element$__$map;
+    },
+    map$1: function($receiver, arg0) {
+      return this.get$map($receiver).call$1(arg0);
+    },
+    set$map: function(receiver, value) {
+      receiver._json_view_element$__$map = this.notifyPropertyChange$3(receiver, C.Symbol_map, receiver._json_view_element$__$map, value);
+    },
+    get$mapAsString: function(receiver) {
+      return receiver._json_view_element$__$mapAsString;
+    },
+    set$mapAsString: function(receiver, value) {
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, value);
+    },
+    mapChanged$1: [function(receiver, oldValue) {
+      var t1, t2, t3;
+      t1 = P.StringBuffer$("");
+      t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      t3 = receiver._json_view_element$__$map;
+      t1._contents = "";
+      t1.write$1("{\n");
+      new Z.JsonPrettyPrinter(t1, t2)._printMap$2(t3, 0);
+      t1.write$1("}\n");
+      t1 = t1._contents;
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, t1);
+    }, "call$1", "get$mapChanged", 2, 0, 20, 57],
+    static: {JsonViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.JsonViewElement_methods.Element$created$0(receiver);
+        C.JsonViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier32: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["library_ref_element", "package:observatory/src/elements/library_ref.dart", , R, {
+  "^": "",
+  LibraryRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {LibraryRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryRefElement_methods.Element$created$0(receiver);
+        C.LibraryRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["library_view_element", "package:observatory/src/elements/library_view.dart", , M, {
+  "^": "",
+  LibraryViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier33;_library_view_element$__$library,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._library_view_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._library_view_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._library_view_element$__$library, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._library_view_element$__$library).get$1(J.$add$ns(J.get$id$x(receiver._library_view_element$__$library), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._library_view_element$__$library).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {LibraryViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryViewElement_methods.Element$created$0(receiver);
+        C.LibraryViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier33: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["logging", "package:logging/logging.dart", , N, {
+  "^": "",
+  Logger: {
+    "^": "Object;name>,parent>,_level,_children>,children>,_controller",
+    get$fullName: function() {
+      var t1, t2, t3;
+      t1 = this.parent;
+      t2 = t1 == null || J.$eq(J.get$name$x(t1), "");
+      t3 = this.name;
+      return t2 ? t3 : t1.get$fullName() + "." + t3;
+    },
+    get$level: function() {
+      if ($.hierarchicalLoggingEnabled) {
+        var t1 = this._level;
+        if (t1 != null)
+          return t1;
+        t1 = this.parent;
+        if (t1 != null)
+          return t1.get$level();
+      }
+      return $._rootLevel;
+    },
+    set$level: function(value) {
+      if ($.hierarchicalLoggingEnabled && this.parent != null)
+        this._level = value;
+      else {
+        if (this.parent != null)
+          throw H.wrapException(P.UnsupportedError$("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."));
+        $._rootLevel = value;
+      }
+    },
+    get$onRecord: function() {
+      return this._getStream$0();
+    },
+    isLoggable$1: function(value) {
+      return value.value >= this.get$level().value;
+    },
+    log$4: function(logLevel, message, error, stackTrace) {
+      var t1, t2, t3, record, target;
+      if (logLevel.value >= this.get$level().value) {
+        t1 = this.get$fullName();
+        t2 = new P.DateTime(Date.now(), false);
+        t2.DateTime$_now$0();
+        t3 = $.LogRecord__nextNumber;
+        $.LogRecord__nextNumber = t3 + 1;
+        record = new N.LogRecord(logLevel, message, t1, t2, t3, error, stackTrace);
+        if ($.hierarchicalLoggingEnabled)
+          for (target = this; target != null;) {
+            target._publish$1(record);
+            target = J.get$parent$x(target);
+          }
+        else
+          N.Logger_Logger("")._publish$1(record);
+      }
+    },
+    finer$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINER_400, message, error, stackTrace);
+    },
+    finer$1: function(message) {
+      return this.finer$3(message, null, null);
+    },
+    fine$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINE_500, message, error, stackTrace);
+    },
+    fine$1: function(message) {
+      return this.fine$3(message, null, null);
+    },
+    info$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_INFO_800, message, error, stackTrace);
+    },
+    info$1: function(message) {
+      return this.info$3(message, null, null);
+    },
+    warning$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_WARNING_900, message, error, stackTrace);
+    },
+    warning$1: function(message) {
+      return this.warning$3(message, null, null);
+    },
+    severe$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_SEVERE_1000, message, error, stackTrace);
+    },
+    severe$1: function(message) {
+      return this.severe$3(message, null, null);
+    },
+    _getStream$0: function() {
+      if ($.hierarchicalLoggingEnabled || this.parent == null) {
+        var t1 = this._controller;
+        if (t1 == null) {
+          t1 = P.StreamController_StreamController$broadcast(null, null, true, N.LogRecord);
+          this._controller = t1;
+        }
+        t1.toString;
+        return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+      } else
+        return N.Logger_Logger("")._getStream$0();
+    },
+    _publish$1: function(record) {
+      var t1 = this._controller;
+      if (t1 != null) {
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(record);
+      }
+    },
+    Logger$_internal$3: function($name, $parent, children) {
+      var t1 = this.parent;
+      if (t1 != null)
+        J.get$_children$x(t1).$indexSet(0, this.name, this);
+    },
+    $isLogger: true,
+    static: {"^": "Logger__loggers", Logger_Logger: function($name) {
+        return $.get$Logger__loggers().putIfAbsent$2($name, new N.Logger_Logger_closure($name));
+      }}
+  },
+  Logger_Logger_closure: {
+    "^": "Closure:69;name_0",
+    call$0: function() {
+      var thisName, dot, $parent, t1, t2;
+      thisName = this.name_0;
+      if (C.JSString_methods.startsWith$1(thisName, "."))
+        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
+      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
+      if (dot === -1)
+        $parent = thisName !== "" ? N.Logger_Logger("") : null;
+      else {
+        $parent = N.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
+        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
+      }
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, N.Logger);
+      t2 = new N.Logger(thisName, $parent, null, t1, H.setRuntimeTypeInfo(new Q.UnmodifiableMapView(t1), [null, null]), null);
+      t2.Logger$_internal$3(thisName, $parent, t1);
+      return t2;
+    },
+    $isFunction: true
+  },
+  Level: {
+    "^": "Object;name>,value>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isLevel && this.value === other.value;
+    },
+    $lt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value < t1;
+    },
+    $le: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value <= t1;
+    },
+    $gt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value > t1;
+    },
+    $ge: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value >= t1;
+    },
+    compareTo$1: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value - t1;
+    },
+    get$hashCode: function(_) {
+      return this.value;
+    },
+    toString$0: function(_) {
+      return this.name;
+    },
+    $isLevel: true,
+    static: {"^": "Level_ALL,Level_OFF,Level_FINEST,Level_FINER,Level_FINE,Level_CONFIG,Level_INFO,Level_WARNING,Level_SEVERE,Level_SHOUT,Level_LEVELS"}
+  },
+  LogRecord: {
+    "^": "Object;level<,message>,loggerName,time<,sequenceNumber,error>,stackTrace<",
+    toString$0: function(_) {
+      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
+    },
+    $isLogRecord: true,
+    static: {"^": "LogRecord__nextNumber"}
+  }
+}],
+["", "main.dart", , F, {
+  "^": "",
+  main: function() {
+    var t1, t2;
+    N.Logger_Logger("").set$level(C.Level_INFO_800);
+    N.Logger_Logger("").get$onRecord().listen$1(new F.main_closure414());
+    N.Logger_Logger("").info$1("Starting Observatory");
+    N.Logger_Logger("").info$1("Loading Google Charts API");
+    t1 = J.$index$asx($.get$context(), "google");
+    t2 = $.get$GoogleChart__completer();
+    t1.callMethod$2("load", ["visualization", "1", P.JsObject_JsObject$jsify(P.LinkedHashMap_LinkedHashMap$_literal(["packages", ["corechart", "table"], "callback", P.JsFunction_JsFunction$withThis(t2.get$complete(t2))], null, null))]);
+    $.get$GoogleChart__completer().future.then$1(G.GoogleChart__initOnceOnComplete$closure()).then$1(new F.main_closure415());
+  },
+  main_closure414: {
+    "^": "Closure:149;",
+    call$1: [function(rec) {
+      var t1;
+      if (J.$eq(rec.get$level(), C.Level_WARNING_900)) {
+        t1 = J.getInterceptor$x(rec);
+        if (J.startsWith$1$s(t1.get$message(rec), "Error evaluating expression"))
+          t1 = J.contains$1$asx(t1.get$message(rec), "Can't assign to null: ") === true || J.contains$1$asx(t1.get$message(rec), "Expression is not assignable: ") === true;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      if (t1)
+        return;
+      P.print(rec.get$level().name + ": " + rec.get$time().toString$0(0) + ": " + H.S(J.get$message$x(rec)));
+    }, "call$1", null, 2, 0, null, 148, "call"],
+    $isFunction: true
+  },
+  main_closure415: {
+    "^": "Closure:13;",
+    call$1: [function(_) {
+      N.Logger_Logger("").info$1("Initializing Polymer");
+      A.initPolymer();
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["nav_bar_element", "package:observatory/src/elements/nav_bar.dart", , A, {
+  "^": "",
+  NavBarElement: {
+    "^": "ObservatoryElement_ChangeNotifier34;_nav_bar_element$__$pad,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pad: function(receiver) {
+      return receiver._nav_bar_element$__$pad;
+    },
+    set$pad: function(receiver, value) {
+      receiver._nav_bar_element$__$pad = this.notifyPropertyChange$3(receiver, C.Symbol_pad, receiver._nav_bar_element$__$pad, value);
+    },
+    static: {NavBarElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$pad = true;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavBarElement_methods.Element$created$0(receiver);
+        C.NavBarElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier34: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier35;_nav_bar_element$__$link,_nav_bar_element$__$anchor,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {NavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuElement_methods.Element$created$0(receiver);
+        C.NavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier35: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier36;_nav_bar_element$__$link,_nav_bar_element$__$anchor,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    static: {NavMenuItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuItemElement_methods.Element$created$0(receiver);
+        C.NavMenuItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier36: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavRefreshElement: {
+    "^": "ObservatoryElement_ChangeNotifier37;_nav_bar_element$__$callback,_nav_bar_element$__$active,_nav_bar_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$callback: function(receiver) {
+      return receiver._nav_bar_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._nav_bar_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._nav_bar_element$__$callback, value);
+    },
+    get$active: function(receiver) {
+      return receiver._nav_bar_element$__$active;
+    },
+    set$active: function(receiver, value) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, value);
+    },
+    get$label: function(receiver) {
+      return receiver._nav_bar_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._nav_bar_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._nav_bar_element$__$label, value);
+    },
+    buttonClick$3: [function(receiver, e, detail, target) {
+      var t1 = receiver._nav_bar_element$__$active;
+      if (t1 === true)
+        return;
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, t1, true);
+      if (receiver._nav_bar_element$__$callback != null)
+        this.callback$1(receiver, this.get$refreshDone(receiver));
+    }, "call$3", "get$buttonClick", 6, 0, 102, 1, 93, 94],
+    refreshDone$0: [function(receiver) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, false);
+    }, "call$0", "get$refreshDone", 0, 0, 18],
+    static: {NavRefreshElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$active = false;
+        receiver._nav_bar_element$__$label = "Refresh";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavRefreshElement_methods.Element$created$0(receiver);
+        C.NavRefreshElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier37: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavControlElement: {
+    "^": "ObservatoryElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {NavControlElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavControlElement_methods.Element$created$0(receiver);
+        C.NavControlElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TopNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier38;_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {TopNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.TopNavMenuElement_methods.Element$created$0(receiver);
+        C.TopNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier38: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier39;_nav_bar_element$__$last,_nav_bar_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._nav_bar_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._nav_bar_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._nav_bar_element$__$isolate, value);
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_hashLinkWorkaround, 0, 1);
+    }, "call$1", "get$isolateChanged", 2, 0, 20, 57],
+    get$hashLinkWorkaround: function(receiver) {
+      var t1 = receiver._nav_bar_element$__$isolate;
+      if (t1 != null)
+        return J.get$link$x(t1);
+      else
+        return "";
+    },
+    set$hashLinkWorkaround: function(receiver, x) {
+    },
+    static: {IsolateNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateNavMenuElement_methods.Element$created$0(receiver);
+        C.IsolateNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier39: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  LibraryNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier40;_nav_bar_element$__$library,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._nav_bar_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._nav_bar_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._nav_bar_element$__$library, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {LibraryNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryNavMenuElement_methods.Element$created$0(receiver);
+        C.LibraryNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier40: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier41;_nav_bar_element$__$cls,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._nav_bar_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._nav_bar_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._nav_bar_element$__$cls, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {ClassNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassNavMenuElement_methods.Element$created$0(receiver);
+        C.ClassNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier41: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_application_element", "package:observatory/src/elements/observatory_application.dart", , V, {
+  "^": "",
+  ObservatoryApplicationElement: {
+    "^": "ObservatoryElement_ChangeNotifier42;_observatory_application_element$__$devtools,app,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$devtools: function(receiver) {
+      return receiver._observatory_application_element$__$devtools;
+    },
+    set$devtools: function(receiver, value) {
+      receiver._observatory_application_element$__$devtools = this.notifyPropertyChange$3(receiver, C.Symbol_devtools, receiver._observatory_application_element$__$devtools, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      if (receiver._observatory_application_element$__$devtools === true) {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.DartiumVM(P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Completer), 0, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.DartiumVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$devtools$1(receiver);
+        receiver.app = t2;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.HttpVM(null, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.HttpVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$1(receiver);
+        receiver.app = t2;
+      }
+    },
+    static: {ObservatoryApplicationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._observatory_application_element$__$devtools = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryApplicationElement_methods.Element$created$0(receiver);
+        C.ObservatoryApplicationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier42: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_element", "package:observatory/src/elements/observatory_element.dart", , Z, {
+  "^": "",
+  ObservatoryElement: {
+    "^": "PolymerElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    attached$0: function(receiver) {
+      A.Polymer.prototype.attached$0.call(this, receiver);
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      A.Polymer.prototype.attributeChanged$3.call(this, receiver, $name, oldValue, newValue);
+    },
+    detached$0: function(receiver) {
+      A.Polymer.prototype.detached$0.call(this, receiver);
+    },
+    ready$0: function(receiver) {
+      A.Polymer.prototype.ready$0.call(this, receiver);
+    },
+    goto$3: [function(receiver, $event, detail, target) {
+      $.location.onGoto$3($event, detail, target);
+    }, "call$3", "get$$goto", 6, 0, 150, 2, 93, 94],
+    gotoLink$1: [function(receiver, url) {
+      $.location.toString;
+      return "#" + H.S(url);
+    }, "call$1", "get$gotoLink", 2, 0, 151, 152],
+    formatTime$1: [function(receiver, time) {
+      return G.Utils_formatTime(time);
+    }, "call$1", "get$formatTime", 2, 0, 153, 154],
+    formatSize$1: [function(receiver, bytes) {
+      return G.Utils_formatSize(bytes);
+    }, "call$1", "get$formatSize", 2, 0, 15, 16],
+    isNull$1: [function(receiver, type) {
+      return J.$eq(type, "Null");
+    }, "call$1", "get$isNull", 2, 0, 155, 156],
+    isError$1: [function(receiver, type) {
+      return J.$eq(type, "Error");
+    }, "call$1", "get$isError", 2, 0, 155, 156],
+    isInt$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "Smi") || t1.$eq(type, "Mint") || t1.$eq(type, "Bigint");
+    }, "call$1", "get$isInt", 2, 0, 155, 156],
+    isBool$1: [function(receiver, type) {
+      return J.$eq(type, "Bool");
+    }, "call$1", "get$isBool", 2, 0, 155, 156],
+    isString$1: [function(receiver, type) {
+      return J.$eq(type, "String");
+    }, "call$1", "get$isString", 2, 0, 155, 156],
+    isInstance$1: [function(receiver, type) {
+      return J.$eq(type, "Instance");
+    }, "call$1", "get$isInstance", 2, 0, 155, 156],
+    isDouble$1: [function(receiver, type) {
+      return J.$eq(type, "Double");
+    }, "call$1", "get$isDouble", 2, 0, 155, 156],
+    isList$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "GrowableObjectArray") || t1.$eq(type, "Array");
+    }, "call$1", "get$isList", 2, 0, 155, 156],
+    isType$1: [function(receiver, type) {
+      return J.$eq(type, "Type");
+    }, "call$1", "get$isType", 2, 0, 155, 156],
+    isUnexpected$1: [function(receiver, type) {
+      return !C.JSArray_methods.contains$1(["Null", "Smi", "Mint", "Bigint", "Bool", "String", "Double", "Instance", "GrowableObjectArray", "Array", "Type", "Error"], type);
+    }, "call$1", "get$isUnexpected", 2, 0, 155, 156],
+    static: {ObservatoryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryElement_methods.Element$created$0(receiver);
+        C.ObservatoryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["observe.src.bindable", "package:observe/src/bindable.dart", , A, {
+  "^": "",
+  Bindable: {
+    "^": "Object;",
+    set$value: function(_, newValue) {
+    },
+    $isBindable: true
+  }
+}],
+["observe.src.change_notifier", "package:observe/src/change_notifier.dart", , O, {
+  "^": "",
+  ChangeNotifier: {
+    "^": "Object;",
+    get$changes: function(receiver) {
+      var t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 == null) {
+        t1 = this.get$observed(receiver);
+        t1 = P.StreamController_StreamController$broadcast(this.get$unobserved(receiver), t1, true, null);
+        receiver.change_notifier$ChangeNotifier$_changes = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    observed$0: [function(receiver) {
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(receiver) {
+      receiver.change_notifier$ChangeNotifier$_changes = null;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    deliverChanges$0: [function(receiver) {
+      var records, t1, t2;
+      records = receiver.change_notifier$ChangeNotifier$_change_notifier$_records;
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records = null;
+      if (this.get$hasObservers(receiver) && records != null) {
+        t1 = receiver.change_notifier$ChangeNotifier$_changes;
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [T.ChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    notifyPropertyChange$3: function(receiver, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(receiver, field, oldValue, newValue);
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (receiver.change_notifier$ChangeNotifier$_change_notifier$_records == null) {
+        receiver.change_notifier$ChangeNotifier$_change_notifier$_records = [];
+        P.scheduleMicrotask(this.get$deliverChanges(receiver));
+      }
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records.push(record);
+    },
+    $isObservable: true
+  }
+}],
+["observe.src.change_record", "package:observe/src/change_record.dart", , T, {
+  "^": "",
+  ChangeRecord: {
+    "^": "Object;",
+    $isChangeRecord: true
+  },
+  PropertyChangeRecord: {
+    "^": "ChangeRecord;object>,name>,oldValue,newValue",
+    toString$0: function(_) {
+      return "#<PropertyChangeRecord " + H.S(this.name) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isPropertyChangeRecord: true
+  }
+}],
+["observe.src.dirty_check", "package:observe/src/dirty_check.dart", , O, {
+  "^": "",
+  dirtyCheckObservables: function() {
+    var cycles, debugLoop, toCheck, t1, anyChanged, i, observer, t2, info, t3;
+    if ($._delivering)
+      return;
+    if ($._allObservables == null)
+      return;
+    $._delivering = true;
+    cycles = 0;
+    debugLoop = null;
+    do {
+      ++cycles;
+      if (cycles === 1000)
+        debugLoop = [];
+      toCheck = $._allObservables;
+      t1 = [];
+      t1.$builtinTypeInfo = [F.Observable];
+      $._allObservables = t1;
+      for (t1 = debugLoop != null, anyChanged = false, i = 0; i < toCheck.length; ++i) {
+        observer = toCheck[i];
+        t2 = J.getInterceptor$x(observer);
+        if (t2.get$hasObservers(observer)) {
+          if (t2.deliverChanges$0(observer)) {
+            if (t1)
+              debugLoop.push([i, observer]);
+            anyChanged = true;
+          }
+          $._allObservables.push(observer);
+        }
+      }
+    } while (cycles < 1000 && anyChanged);
+    if (t1 && anyChanged) {
+      t1 = $.get$_logger();
+      t1.warning$1("Possible loop in Observable.dirtyCheck, stopped checking.");
+      for (t2 = H.setRuntimeTypeInfo(new H.ListIterator(debugLoop, debugLoop.length, 0, null), [H.getTypeArgumentByIndex(debugLoop, 0)]); t2.moveNext$0();) {
+        info = t2._current;
+        t3 = J.getInterceptor$asx(info);
+        t1.warning$1("In last iteration Observable changed at index " + H.S(t3.$index(info, 0)) + ", object: " + H.S(t3.$index(info, 1)) + ".");
+      }
+    }
+    $._allObservablesCount = $._allObservables.length;
+    $._delivering = false;
+  },
+  dirtyCheckZoneSpec: function() {
+    var t1 = {};
+    t1.pending_0 = false;
+    t1 = new O.dirtyCheckZoneSpec_enqueueDirtyCheck(t1);
+    return new P._ZoneSpecification(null, null, null, null, new O.dirtyCheckZoneSpec_wrapCallback(t1), new O.dirtyCheckZoneSpec_wrapUnaryCallback(t1), null, null, null, null, null, null);
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck: {
+    "^": "Closure:157;box_0",
+    call$2: function($parent, zone) {
+      var t1 = this.box_0;
+      if (t1.pending_0)
+        return;
+      t1.pending_0 = true;
+      $parent.scheduleMicrotask$2(zone, new O.dirtyCheckZoneSpec_enqueueDirtyCheck_closure(t1));
+    },
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck_closure: {
+    "^": "Closure:69;box_0",
+    call$0: [function() {
+      this.box_0.pending_0 = false;
+      O.dirtyCheckObservables();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback: {
+    "^": "Closure:30;enqueueDirtyCheck_1",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapCallback_closure(this.enqueueDirtyCheck_1, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback_closure: {
+    "^": "Closure:69;enqueueDirtyCheck_2,parent_3,zone_4,f_5",
+    call$0: [function() {
+      this.enqueueDirtyCheck_2.call$2(this.parent_3, this.zone_4);
+      return this.f_5.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback: {
+    "^": "Closure:158;enqueueDirtyCheck_6",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapUnaryCallback_closure(this.enqueueDirtyCheck_6, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback_closure: {
+    "^": "Closure:13;enqueueDirtyCheck_7,parent_8,zone_9,f_10",
+    call$1: [function(x) {
+      this.enqueueDirtyCheck_7.call$2(this.parent_8, this.zone_9);
+      return this.f_10.call$1(x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  }
+}],
+["observe.src.list_diff", "package:observe/src/list_diff.dart", , G, {
+  "^": "",
+  _calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var rowCount, columnCount, distances, t1, i, t2, j, t3, t4, t5, t6, t7, t8, t9;
+    rowCount = oldEnd - oldStart + 1;
+    columnCount = J.$add$ns(J.$sub$n(currentEnd, currentStart), 1);
+    distances = Array(rowCount);
+    for (t1 = distances.length, i = 0; i < rowCount; ++i) {
+      if (typeof columnCount !== "number")
+        return H.iae(columnCount);
+      t2 = Array(columnCount);
+      if (i >= t1)
+        return H.ioore(distances, i);
+      distances[i] = t2;
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t2[0] = i;
+    }
+    if (typeof columnCount !== "number")
+      return H.iae(columnCount);
+    j = 0;
+    for (; j < columnCount; ++j) {
+      if (0 >= t1)
+        return H.ioore(distances, 0);
+      t2 = distances[0];
+      if (j >= t2.length)
+        return H.ioore(t2, j);
+      t2[j] = j;
+    }
+    for (t2 = J.getInterceptor$ns(currentStart), t3 = J.getInterceptor$asx(current), i = 1; i < rowCount; ++i)
+      for (t4 = i - 1, t5 = oldStart + i - 1, j = 1; j < columnCount; ++j) {
+        if (t5 >>> 0 !== t5 || t5 >= old.length)
+          return H.ioore(old, t5);
+        t6 = J.$eq(old[t5], t3.$index(current, J.$sub$n(t2.$add(currentStart, j), 1)));
+        t7 = distances[i];
+        t8 = distances[t4];
+        t9 = j - 1;
+        if (t6) {
+          if (i >= t1)
+            return H.ioore(distances, i);
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (t9 >= t8.length)
+            return H.ioore(t8, t9);
+          t6 = t8[t9];
+          if (j >= t7.length)
+            return H.ioore(t7, j);
+          t7[j] = t6;
+        } else {
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (j >= t8.length)
+            return H.ioore(t8, j);
+          t6 = t8[j];
+          if (typeof t6 !== "number")
+            return t6.$add();
+          if (i >= t1)
+            return H.ioore(distances, i);
+          t8 = t7.length;
+          if (t9 >= t8)
+            return H.ioore(t7, t9);
+          t9 = t7[t9];
+          if (typeof t9 !== "number")
+            return t9.$add();
+          t9 = P.min(t6 + 1, t9 + 1);
+          if (j >= t8)
+            return H.ioore(t7, j);
+          t7[j] = t9;
+        }
+      }
+    return distances;
+  },
+  _spliceOperationsFromEditDistances: function(distances) {
+    var t1, i, j, t2, current, edits, t3, t4, t5, northWest, west, north, min;
+    t1 = distances.length;
+    i = t1 - 1;
+    if (0 >= t1)
+      return H.ioore(distances, 0);
+    j = distances[0].length - 1;
+    if (i < 0)
+      return H.ioore(distances, i);
+    t2 = distances[i];
+    if (j < 0 || j >= t2.length)
+      return H.ioore(t2, j);
+    current = t2[j];
+    edits = [];
+    while (true) {
+      if (!(i > 0 || j > 0))
+        break;
+      c$0: {
+        if (i === 0) {
+          edits.push(2);
+          --j;
+          break c$0;
+        }
+        if (j === 0) {
+          edits.push(3);
+          --i;
+          break c$0;
+        }
+        t2 = i - 1;
+        if (t2 < 0)
+          return H.ioore(distances, t2);
+        t3 = distances[t2];
+        t4 = j - 1;
+        t5 = t3.length;
+        if (t4 < 0 || t4 >= t5)
+          return H.ioore(t3, t4);
+        northWest = t3[t4];
+        if (j < 0 || j >= t5)
+          return H.ioore(t3, j);
+        west = t3[j];
+        if (i < 0)
+          return H.ioore(distances, i);
+        t3 = distances[i];
+        if (t4 >= t3.length)
+          return H.ioore(t3, t4);
+        north = t3[t4];
+        min = P.min(P.min(west, north), northWest);
+        if (min === northWest) {
+          if (northWest == null ? current == null : northWest === current)
+            edits.push(0);
+          else {
+            edits.push(1);
+            current = northWest;
+          }
+          j = t4;
+          i = t2;
+        } else if (min === west) {
+          edits.push(3);
+          current = west;
+          i = t2;
+        } else {
+          edits.push(2);
+          current = north;
+          j = t4;
+        }
+      }
+    }
+    return H.setRuntimeTypeInfo(new H.ReversedListIterable(edits), [null]).toList$0(0);
+  },
+  _sharedPrefix: function(arr1, arr2, searchLength) {
+    var t1, i, t2;
+    for (t1 = J.getInterceptor$asx(arr1), i = 0; i < searchLength; ++i) {
+      t2 = t1.$index(arr1, i);
+      if (i >= arr2.length)
+        return H.ioore(arr2, i);
+      if (!J.$eq(t2, arr2[i]))
+        return i;
+    }
+    return searchLength;
+  },
+  _sharedSuffix: function(arr1, arr2, searchLength) {
+    var t1, index1, index2, count, t2;
+    t1 = J.getInterceptor$asx(arr1);
+    index1 = t1.get$length(arr1);
+    index2 = arr2.length;
+    count = 0;
+    while (true) {
+      if (count < searchLength) {
+        --index1;
+        t2 = t1.$index(arr1, index1);
+        --index2;
+        if (index2 < 0 || index2 >= arr2.length)
+          return H.ioore(arr2, index2);
+        t2 = J.$eq(t2, arr2[index2]);
+      } else
+        t2 = false;
+      if (!t2)
+        break;
+      ++count;
+    }
+    return count;
+  },
+  calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var t1, minLength, t2, prefixCount, suffixCount, removed, splice, oldStart0, ops, splices, oldIndex, index, i;
+    t1 = J.getInterceptor$n(currentEnd);
+    minLength = P.min(t1.$sub(currentEnd, currentStart), oldEnd - oldStart);
+    t2 = J.getInterceptor(currentStart);
+    prefixCount = t2.$eq(currentStart, 0) && oldStart === 0 ? G._sharedPrefix(current, old, minLength) : 0;
+    suffixCount = t1.$eq(currentEnd, J.get$length$asx(current)) && oldEnd === old.length ? G._sharedSuffix(current, old, minLength - prefixCount) : 0;
+    currentStart = t2.$add(currentStart, prefixCount);
+    oldStart += prefixCount;
+    currentEnd = t1.$sub(currentEnd, suffixCount);
+    oldEnd -= suffixCount;
+    t1 = J.getInterceptor$n(currentEnd);
+    if (J.$eq(t1.$sub(currentEnd, currentStart), 0) && oldEnd - oldStart === 0)
+      return C.List_empty;
+    if (J.$eq(currentStart, currentEnd)) {
+      removed = [];
+      t1 = new P.UnmodifiableListView(removed);
+      t1.$builtinTypeInfo = [null];
+      splice = new G.ListChangeRecord(current, t1, removed, currentStart, 0);
+      for (; oldStart < oldEnd; oldStart = oldStart0) {
+        t1 = splice._removed;
+        oldStart0 = oldStart + 1;
+        if (oldStart >>> 0 !== oldStart || oldStart >= old.length)
+          return H.ioore(old, oldStart);
+        J.add$1$ax(t1, old[oldStart]);
+      }
+      return [splice];
+    } else if (oldStart === oldEnd) {
+      t1 = t1.$sub(currentEnd, currentStart);
+      removed = [];
+      t2 = new P.UnmodifiableListView(removed);
+      t2.$builtinTypeInfo = [null];
+      return [new G.ListChangeRecord(current, t2, removed, currentStart, t1)];
+    }
+    ops = G._spliceOperationsFromEditDistances(G._calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+    splices = [];
+    splices.$builtinTypeInfo = [G.ListChangeRecord];
+    for (oldIndex = oldStart, index = currentStart, splice = null, i = 0; i < ops.length; ++i)
+      switch (ops[i]) {
+        case 0:
+          if (splice != null) {
+            splices.push(splice);
+            splice = null;
+          }
+          index = J.$add$ns(index, 1);
+          ++oldIndex;
+          break;
+        case 1:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+        case 2:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          break;
+        case 3:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+      }
+    if (splice != null)
+      splices.push(splice);
+    return splices;
+  },
+  _mergeSplice: function(splices, record) {
+    var t1, t2, t3, addedCount, t4, splice, inserted, insertionOffset, i, current, intersectCount, removed, offset;
+    t1 = J.getInterceptor$x(record);
+    t2 = t1.get$object(record);
+    t1 = t1.get$index(record);
+    t3 = J.toList$0$ax(record.get$_removed());
+    addedCount = record.get$addedCount();
+    if (addedCount == null)
+      addedCount = 0;
+    t4 = new P.UnmodifiableListView(t3);
+    t4.$builtinTypeInfo = [null];
+    splice = new G.ListChangeRecord(t2, t4, t3, t1, addedCount);
+    for (inserted = false, insertionOffset = 0, i = 0; t1 = splices.length, i < t1; ++i) {
+      if (i < 0)
+        return H.ioore(splices, i);
+      current = splices[i];
+      current._list_diff$_index = J.$add$ns(current._list_diff$_index, insertionOffset);
+      if (inserted)
+        continue;
+      t1 = splice._list_diff$_index;
+      t2 = J.$add$ns(t1, splice._unmodifiableRemoved._collection$_source.length);
+      t3 = current._list_diff$_index;
+      intersectCount = P.min(t2, J.$add$ns(t3, current._addedCount)) - P.max(t1, t3);
+      if (intersectCount >= 0) {
+        C.JSArray_methods.removeAt$1(splices, i);
+        --i;
+        t1 = J.$sub$n(current._addedCount, current._unmodifiableRemoved._collection$_source.length);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        insertionOffset -= t1;
+        t1 = J.$add$ns(splice._addedCount, J.$sub$n(current._addedCount, intersectCount));
+        splice._addedCount = t1;
+        t2 = splice._unmodifiableRemoved._collection$_source.length;
+        t3 = current._unmodifiableRemoved._collection$_source.length;
+        if (J.$eq(t1, 0) && t2 + t3 - intersectCount === 0)
+          inserted = true;
+        else {
+          removed = current._removed;
+          if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+            t1 = splice._unmodifiableRemoved;
+            t1 = t1.getRange$2(t1, 0, J.$sub$n(current._list_diff$_index, splice._list_diff$_index));
+            removed.toString;
+            if (typeof removed !== "object" || removed === null || !!removed.fixed$length)
+              H.throwExpression(P.UnsupportedError$("insertAll"));
+            H.IterableMixinWorkaround_insertAllList(removed, 0, t1);
+          }
+          if (J.$gt$n(J.$add$ns(splice._list_diff$_index, splice._unmodifiableRemoved._collection$_source.length), J.$add$ns(current._list_diff$_index, current._addedCount))) {
+            t1 = splice._unmodifiableRemoved;
+            J.addAll$1$ax(removed, t1.getRange$2(t1, J.$sub$n(J.$add$ns(current._list_diff$_index, current._addedCount), splice._list_diff$_index), splice._unmodifiableRemoved._collection$_source.length));
+          }
+          splice._removed = removed;
+          splice._unmodifiableRemoved = current._unmodifiableRemoved;
+          if (J.$lt$n(current._list_diff$_index, splice._list_diff$_index))
+            splice._list_diff$_index = current._list_diff$_index;
+          inserted = false;
+        }
+      } else if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+        C.JSArray_methods.insert$2(splices, i, splice);
+        ++i;
+        offset = J.$sub$n(splice._addedCount, splice._unmodifiableRemoved._collection$_source.length);
+        current._list_diff$_index = J.$add$ns(current._list_diff$_index, offset);
+        if (typeof offset !== "number")
+          return H.iae(offset);
+        insertionOffset += offset;
+        inserted = true;
+      } else
+        inserted = false;
+    }
+    if (!inserted)
+      splices.push(splice);
+  },
+  _createInitialSplices: function(list, records) {
+    var splices, t1;
+    splices = H.setRuntimeTypeInfo([], [G.ListChangeRecord]);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(records, records.length, 0, null), [H.getTypeArgumentByIndex(records, 0)]); t1.moveNext$0();)
+      G._mergeSplice(splices, t1._current);
+    return splices;
+  },
+  projectListSplices: function(list, records) {
+    var splices, t1, t2, splice, t3, t4;
+    if (records.length <= 1)
+      return records;
+    splices = [];
+    for (t1 = G._createInitialSplices(list, records), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), t2 = list._observable_list$_list; t1.moveNext$0();) {
+      splice = t1._current;
+      if (J.$eq(splice.get$addedCount(), 1) && splice.get$removed()._collection$_source.length === 1) {
+        t3 = splice.get$removed()._collection$_source;
+        if (0 >= t3.length)
+          return H.ioore(t3, 0);
+        t3 = t3[0];
+        t4 = J.get$index$x(splice);
+        if (t4 >>> 0 !== t4 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        if (!J.$eq(t3, t2[t4]))
+          splices.push(splice);
+        continue;
+      }
+      t3 = J.getInterceptor$x(splice);
+      C.JSArray_methods.addAll$1(splices, G.calcSplices(list, t3.get$index(splice), J.$add$ns(t3.get$index(splice), splice.get$addedCount()), splice.get$_removed(), 0, splice.get$removed()._collection$_source.length));
+    }
+    return splices;
+  },
+  ListChangeRecord: {
+    "^": "Object;object>,_unmodifiableRemoved,_removed<,_list_diff$_index,_addedCount",
+    get$index: function(_) {
+      return this._list_diff$_index;
+    },
+    get$removed: function() {
+      return this._unmodifiableRemoved;
+    },
+    get$addedCount: function() {
+      return this._addedCount;
+    },
+    indexChanged$1: function(key) {
+      var t1;
+      if (typeof key === "number" && Math.floor(key) === key) {
+        t1 = this._list_diff$_index;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = key < t1;
+      } else
+        t1 = true;
+      if (t1)
+        return false;
+      if (!J.$eq(this._addedCount, this._unmodifiableRemoved._collection$_source.length))
+        return true;
+      return J.$lt$n(key, J.$add$ns(this._list_diff$_index, this._addedCount));
+    },
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = "#<ListChangeRecord index: " + H.S(this._list_diff$_index) + ", removed: ";
+      t2 = this._unmodifiableRemoved;
+      return t1 + t2.toString$0(t2) + ", addedCount: " + H.S(this._addedCount) + ">";
+    },
+    $isListChangeRecord: true,
+    static: {ListChangeRecord_ListChangeRecord: function(object, index, addedCount, removed) {
+        var t1;
+        if (removed == null)
+          removed = [];
+        if (addedCount == null)
+          addedCount = 0;
+        t1 = new P.UnmodifiableListView(removed);
+        t1.$builtinTypeInfo = [null];
+        return new G.ListChangeRecord(object, t1, removed, index, addedCount);
+      }}
+  }
+}],
+["observe.src.metadata", "package:observe/src/metadata.dart", , K, {
+  "^": "",
+  ObservableProperty: {
+    "^": "Object;"
+  },
+  Reflectable: {
+    "^": "Object;"
+  }
+}],
+["observe.src.observable", "package:observe/src/observable.dart", , F, {
+  "^": "",
+  Observable_dirtyCheck: [function() {
+    return O.dirtyCheckObservables();
+  }, "call$0", "Observable_dirtyCheck$closure", 0, 0, 18],
+  notifyPropertyChangeHelper: function(obj, field, oldValue, newValue) {
+    var t1 = J.getInterceptor$x(obj);
+    if (t1.get$hasObservers(obj) && !J.$eq(oldValue, newValue))
+      t1.notifyChange$1(obj, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(obj, field, oldValue, newValue), [null]));
+    return newValue;
+  },
+  Observable: {
+    "^": "Object;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    get$changes: function(receiver) {
+      var t1;
+      if (this.get$_observable$_changes(receiver) == null) {
+        t1 = this.get$_observable$_observed(receiver);
+        this.set$_observable$_changes(receiver, P.StreamController_StreamController$broadcast(this.get$_unobserved(receiver), t1, true, null));
+      }
+      t1 = this.get$_observable$_changes(receiver);
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      if (this.get$_observable$_changes(receiver) != null) {
+        t1 = this.get$_observable$_changes(receiver);
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _observable$_observed$0: [function(receiver) {
+      var t1, values, $name, getter;
+      t1 = $._allObservables;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo([], [F.Observable]);
+        $._allObservables = t1;
+      }
+      t1.push(receiver);
+      $._allObservablesCount = $._allObservablesCount + 1;
+      values = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, P.Object);
+      for (t1 = this.get$runtimeType(receiver), t1 = $.get$typeInspector().query$2(0, t1, new A.QueryOptions(true, false, true, C.Type_HqF, false, false, C.List_GGa, null)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        $name = J.get$name$x(t1._current);
+        getter = $.get$objectAccessor()._getters.$index(0, $name);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + this.toString$0(receiver)));
+        values.$indexSet(0, $name, getter.call$1(receiver));
+      }
+      this.set$_values(receiver, values);
+    }, "call$0", "get$_observable$_observed", 0, 0, 18],
+    _unobserved$0: [function(receiver) {
+      if (this.get$_values(receiver) != null)
+        this.set$_values(receiver, null);
+    }, "call$0", "get$_unobserved", 0, 0, 18],
+    deliverChanges$0: function(receiver) {
+      var t1, t2;
+      t1 = {};
+      if (this.get$_values(receiver) == null || !this.get$hasObservers(receiver))
+        return false;
+      t1.records_0 = this.get$_records(receiver);
+      this.set$_records(receiver, null);
+      this.get$_values(receiver).forEach$1(0, new F.Observable_deliverChanges_closure(t1, receiver));
+      if (t1.records_0 == null)
+        return false;
+      t2 = this.get$_observable$_changes(receiver);
+      t1 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(t1.records_0), [T.ChangeRecord]);
+      if (t2._state >= 4)
+        H.throwExpression(t2._addEventError$0());
+      t2._sendData$1(t1);
+      return true;
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (this.get$_records(receiver) == null)
+        this.set$_records(receiver, []);
+      this.get$_records(receiver).push(record);
+    },
+    $isObservable: true
+  },
+  Observable_deliverChanges_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function($name, oldValue) {
+      var t1, newValue, t2, t3, records;
+      t1 = this.this_1;
+      newValue = $.get$objectAccessor().read$2(t1, $name);
+      if (!J.$eq(oldValue, newValue)) {
+        t2 = this.box_0;
+        t3 = t2.records_0;
+        if (t3 == null) {
+          records = [];
+          t2.records_0 = records;
+          t2 = records;
+        } else
+          t2 = t3;
+        t2.push(H.setRuntimeTypeInfo(new T.PropertyChangeRecord(t1, $name, oldValue, newValue), [null]));
+        J.get$_values$x(t1).$indexSet(0, $name, newValue);
+      }
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_box", "package:observe/src/observable_box.dart", , A, {
+  "^": "",
+  ObservableBox: {
+    "^": "ChangeNotifier;",
+    get$value: function(_) {
+      return this._observable_box$_value;
+    },
+    set$value: function(_, newValue) {
+      this._observable_box$_value = F.notifyPropertyChangeHelper(this, C.Symbol_value, this._observable_box$_value, newValue);
+    },
+    toString$0: function(_) {
+      return "#<" + new H.TypeImpl(H.getRuntimeTypeString(this), null).toString$0(0) + " value: " + H.S(this._observable_box$_value) + ">";
+    }
+  }
+}],
+["observe.src.observable_list", "package:observe/src/observable_list.dart", , Q, {
+  "^": "",
+  ObservableList: {
+    "^": "ListBase_ChangeNotifier;_listRecords@,_listChanges,_observable_list$_list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$listChanges: function() {
+      var t1 = this._listChanges;
+      if (t1 == null) {
+        t1 = P.StreamController_StreamController$broadcast(new Q.ObservableList_listChanges_closure(this), null, true, null);
+        this._listChanges = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._observable_list$_list.length;
+    },
+    set$length: function(_, value) {
+      var t1, len, t2, t3, removed;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      if (len === value)
+        return;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, value);
+      t2 = len === 0;
+      t3 = value === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t2, t3);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t2, !t3);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        if (value < len) {
+          if (value < 0 || value > t1.length)
+            H.throwExpression(P.RangeError$range(value, 0, t1.length));
+          if (len < value || len > t1.length)
+            H.throwExpression(P.RangeError$range(len, value, t1.length));
+          t2 = new H.SubListIterable(t1, value, len);
+          t2.$builtinTypeInfo = [null];
+          if (value < 0)
+            H.throwExpression(P.RangeError$value(value));
+          if (len < 0)
+            H.throwExpression(P.RangeError$value(len));
+          if (value > len)
+            H.throwExpression(P.RangeError$range(value, 0, len));
+          t2 = t2.toList$0(0);
+          t3 = new P.UnmodifiableListView(t2);
+          t3.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t3, t2, value, 0));
+        } else {
+          removed = [];
+          t2 = new P.UnmodifiableListView(removed);
+          t2.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t2, removed, len, value - len));
+        }
+      C.JSArray_methods.set$length(t1, value);
+    },
+    $index: function(_, index) {
+      var t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1, oldValue, t2, t3;
+      t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      oldValue = t1[index];
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2) {
+        t2 = [oldValue];
+        t3 = new P.UnmodifiableListView(t2);
+        t3.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t3, t2, index, 1));
+      }
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    get$isEmpty: function(_) {
+      return P.ListMixin.prototype.get$isEmpty.call(this, this);
+    },
+    get$isNotEmpty: function(_) {
+      return P.ListMixin.prototype.get$isNotEmpty.call(this, this);
+    },
+    setAll$2: function(_, index, iterable) {
+      var t1, len, t2;
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      len = J.get$length$asx(iterable);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && len > 0) {
+        t1 = this._observable_list$_list;
+        H.IterableMixinWorkaround__rangeCheck(t1, index, len);
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, len, H.SubListIterable$(t1, index, len, null).toList$0(0)));
+      }
+      H.IterableMixinWorkaround_setAllList(this._observable_list$_list, index, iterable);
+    },
+    add$1: function(_, value) {
+      var t1, len, t2, t3;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      this._notifyChangeLength$2(len, len + 1);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, 1, null));
+      C.JSArray_methods.add$1(t1, value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, len, added, t2;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.addAll$1(t1, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      added = t1.length - len;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && added > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, added, null));
+    },
+    removeRange$2: function(_, start, end) {
+      var t1, t2, rangeLength, t3, len, t4, t5;
+      t1 = start >= 0;
+      if (!t1 || start > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(this)));
+      t2 = end >= start;
+      if (!t2 || end > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(this)));
+      rangeLength = end - start;
+      t3 = this._observable_list$_list;
+      len = t3.length;
+      t4 = len - rangeLength;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, t4);
+      t5 = len === 0;
+      t4 = t4 === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t5, t4);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t5, !t4);
+      t4 = this._listChanges;
+      if (t4 != null) {
+        t5 = t4._async$_next;
+        t4 = t5 == null ? t4 != null : t5 !== t4;
+      } else
+        t4 = false;
+      if (t4 && rangeLength > 0) {
+        if (!t1 || start > t3.length)
+          H.throwExpression(P.RangeError$range(start, 0, t3.length));
+        if (!t2 || end > t3.length)
+          H.throwExpression(P.RangeError$range(end, start, t3.length));
+        t1 = new H.SubListIterable(t3, start, end);
+        t1.$builtinTypeInfo = [null];
+        if (start < 0)
+          H.throwExpression(P.RangeError$value(start));
+        if (end < 0)
+          H.throwExpression(P.RangeError$value(end));
+        if (start > end)
+          H.throwExpression(P.RangeError$range(start, 0, end));
+        t1 = t1.toList$0(0);
+        t2 = new P.UnmodifiableListView(t1);
+        t2.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t2, t1, start, 0));
+      }
+      C.JSArray_methods.removeRange$2(t3, start, end);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, insertionLength, len, t2;
+      if (index < 0 || index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.set$length(t1, len + insertionLength);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + insertionLength, t2, this, index);
+      H.IterableMixinWorkaround_setAllList(t1, index, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && insertionLength > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, insertionLength, null));
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._observable_list$_list;
+      t2 = t1.length;
+      if (index === t2) {
+        this.add$1(0, element);
+        return;
+      }
+      C.JSArray_methods.set$length(t1, t2 + 1);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + 1, t2, this, index);
+      t2 = t1.length;
+      this._notifyChangeLength$2(t2 - 1, t2);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, 1, null));
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = element;
+    },
+    _recordChange$1: function(record) {
+      var t1, t2;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1)
+        return;
+      if (this._listRecords == null) {
+        this._listRecords = [];
+        P.scheduleMicrotask(this.get$deliverListChanges());
+      }
+      this._listRecords.push(record);
+    },
+    _notifyChangeLength$2: function(oldValue, newValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(this, C.Symbol_length, oldValue, newValue);
+      t1 = oldValue === 0;
+      t2 = newValue === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t1, t2);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t1, !t2);
+    },
+    deliverListChanges$0: [function() {
+      var t1, records, t2;
+      t1 = this._listRecords;
+      if (t1 == null)
+        return false;
+      records = G.projectListSplices(this, t1);
+      this._listRecords = null;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t2 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t2 = false;
+      if (t2 && records.length !== 0) {
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [G.ListChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverListChanges", 0, 0, 111],
+    $isObservableList: true,
+    static: {ObservableList$: function($length, $E) {
+        var t1 = H.setRuntimeTypeInfo([], [$E]);
+        return H.setRuntimeTypeInfo(new Q.ObservableList(null, null, t1, null, null), [$E]);
+      }, ObservableList_applyChangeRecords: function(previous, current, changeRecords) {
+        var t1, t2, change, t3, addEnd, removeEnd, addedItems, t4, t5, removeLength, insertLength, delta, insertEnd, newEnd, newLength;
+        if (previous === current)
+          throw H.wrapException(P.ArgumentError$("can't use same list for previous and current"));
+        for (t1 = J.get$iterator$ax(changeRecords), t2 = J.getInterceptor$ax(current); t1.moveNext$0();) {
+          change = t1.get$current();
+          t3 = J.getInterceptor$x(change);
+          addEnd = J.$add$ns(t3.get$index(change), change.get$addedCount());
+          removeEnd = J.$add$ns(t3.get$index(change), change.get$removed()._collection$_source.length);
+          addedItems = t2.getRange$2(current, t3.get$index(change), addEnd);
+          t3 = t3.get$index(change);
+          t4 = J.getInterceptor$n(t3);
+          if (t4.$lt(t3, 0) || t4.$gt(t3, previous.length))
+            H.throwExpression(P.RangeError$range(t3, 0, previous.length));
+          t5 = J.getInterceptor$n(removeEnd);
+          if (t5.$lt(removeEnd, t3) || t5.$gt(removeEnd, previous.length))
+            H.throwExpression(P.RangeError$range(removeEnd, t3, previous.length));
+          removeLength = t5.$sub(removeEnd, t3);
+          insertLength = addedItems.get$length(addedItems);
+          t5 = J.getInterceptor$n(removeLength);
+          if (t5.$ge(removeLength, insertLength)) {
+            delta = t5.$sub(removeLength, insertLength);
+            insertEnd = t4.$add(t3, insertLength);
+            t4 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newEnd = t4 - delta;
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+            if (delta !== 0) {
+              H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newEnd, previous, removeEnd);
+              C.JSArray_methods.set$length(previous, newEnd);
+            }
+          } else {
+            delta = J.$sub$n(insertLength, removeLength);
+            t5 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newLength = t5 + delta;
+            insertEnd = t4.$add(t3, insertLength);
+            C.JSArray_methods.set$length(previous, newLength);
+            H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newLength, previous, removeEnd);
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+          }
+        }
+      }}
+  },
+  ListBase_ChangeNotifier: {
+    "^": "ListBase+ChangeNotifier;",
+    $isObservable: true
+  },
+  ObservableList_listChanges_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      this.this_0._listChanges = null;
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_map", "package:observe/src/observable_map.dart", , V, {
+  "^": "",
+  MapChangeRecord: {
+    "^": "ChangeRecord;key>,oldValue,newValue,isInsert,isRemove",
+    toString$0: function(_) {
+      var kind;
+      if (this.isInsert)
+        kind = "insert";
+      else
+        kind = this.isRemove ? "remove" : "set";
+      return "#<MapChangeRecord " + kind + " " + H.S(this.key) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isMapChangeRecord: true
+  },
+  ObservableMap: {
+    "^": "ChangeNotifier;_observable_map$_map,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$keys: function() {
+      return this._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    $index: function(_, key) {
+      return this._observable_map$_map.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var t1, t2, len, oldValue;
+      t1 = this.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1) {
+        this._observable_map$_map.$indexSet(0, key, value);
+        return;
+      }
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      oldValue = t1.$index(0, key);
+      t1.$indexSet(0, key, value);
+      if (len !== t1.get$length(t1)) {
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, t1.get$length(t1));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, null, value, true, false), [null, null]));
+        this._notifyKeysValuesChanged$0();
+      } else if (!J.$eq(oldValue, value)) {
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, oldValue, value, false, false), [null, null]));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+      }
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new V.ObservableMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1, len, t2, t3;
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      t2 = this.change_notifier$ChangeNotifier$_changes;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2 && len > 0) {
+        t1.forEach$1(0, new V.ObservableMap_clear_closure(this));
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, 0);
+        this._notifyKeysValuesChanged$0();
+      }
+      t1.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._observable_map$_map.forEach$1(0, f);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _notifyKeysValuesChanged$0: function() {
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_keys, null, null), [null]));
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+    },
+    $isObservableMap: true,
+    $isMap: true,
+    static: {ObservableMap_ObservableMap$createFromType: function(other, $K, $V) {
+        var result;
+        if (!!other.$isSplayTreeMap)
+          result = H.setRuntimeTypeInfo(new V.ObservableMap(P.SplayTreeMap$(null, null, $K, $V), null, null), [$K, $V]);
+        else
+          result = !!other.$isLinkedHashMap ? H.setRuntimeTypeInfo(new V.ObservableMap(P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V), null, null), [$K, $V]) : H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, $K, $V), null, null), [$K, $V]);
+        return result;
+      }}
+  },
+  ObservableMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: [function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V2", args: [K, V]};
+      }, this.this_0, "ObservableMap");
+    }
+  },
+  ObservableMap_clear_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(key, value) {
+      var t1 = this.this_0;
+      t1.notifyChange$1(t1, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, value, null, false, true), [null, null]));
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observer_transform", "package:observe/src/observer_transform.dart", , Y, {
+  "^": "",
+  ObserverTransform: {
+    "^": "Bindable;_bindable,_getTransformer,_setTransformer,_observer_transform$_notifyCallback,_observer_transform$_value",
+    _getTransformer$1: function(arg0) {
+      return this._getTransformer.call$1(arg0);
+    },
+    _observer_transform$_notifyCallback$1: function(arg0) {
+      return this._observer_transform$_notifyCallback.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      var t1;
+      this._observer_transform$_notifyCallback = callback;
+      t1 = this._getTransformer$1(J.open$1$x(this._bindable, this.get$_observedCallback()));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    _observedCallback$1: [function(newValue) {
+      var value = this._getTransformer$1(newValue);
+      if (J.$eq(value, this._observer_transform$_value))
+        return;
+      this._observer_transform$_value = value;
+      return this._observer_transform$_notifyCallback$1(value);
+    }, "call$1", "get$_observedCallback", 2, 0, 13, 58],
+    close$0: function(_) {
+      var t1 = this._bindable;
+      if (t1 != null)
+        J.close$0$x(t1);
+      this._bindable = null;
+      this._getTransformer = null;
+      this._setTransformer = null;
+      this._observer_transform$_notifyCallback = null;
+      this._observer_transform$_value = null;
+    },
+    get$value: function(_) {
+      var t1 = this._getTransformer$1(J.get$value$x(this._bindable));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._bindable, newValue);
+    }
+  }
+}],
+["observe.src.path_observer", "package:observe/src/path_observer.dart", , L, {
+  "^": "",
+  _getObjectProperty: function(object, property) {
+    var t1, t2, getter, exception, decl;
+    if (object == null)
+      return;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object)))
+        return J.$index$asx(object, property);
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1)
+        return J.$index$asx(object, $.get$symbolConverter()._names.$index(0, property));
+      try {
+        t1 = object;
+        t2 = property;
+        getter = $.get$objectAccessor()._getters.$index(0, t2);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + H.S(t1)));
+        t1 = getter.call$1(t1);
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          decl = $.get$typeInspector()._findDeclaration$2(t1, C.Symbol_noSuchMethod);
+          if (!(decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't get " + H.S(property) + " in " + H.S(object));
+    return;
+  },
+  _setObjectProperty: function(object, property, value) {
+    var t1, t2, exception;
+    if (object == null)
+      return false;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object))) {
+        J.$indexSet$ax(object, property, value);
+        return true;
+      }
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1) {
+        J.$indexSet$ax(object, $.get$symbolConverter()._names.$index(0, property), value);
+        return true;
+      }
+      try {
+        $.get$objectAccessor().write$3(object, property, value);
+        return true;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          if (!$.get$typeInspector().hasInstanceMethod$2(t1, C.Symbol_noSuchMethod))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't set " + H.S(property) + " in " + H.S(object));
+    return false;
+  },
+  _isPathValid: function(s) {
+    s = J.trim$0$s(s);
+    if (s === "")
+      return true;
+    if (0 >= s.length)
+      return H.ioore(s, 0);
+    if (s[0] === ".")
+      return false;
+    return $.get$_pathRegExp().hasMatch$1(s);
+  },
+  PathObserver: {
+    "^": "_Observer;_path_observer$_path,_object,_directObserver,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._path_observer$_path == null;
+    },
+    set$value: function(_, newValue) {
+      var t1 = this._path_observer$_path;
+      if (t1 != null)
+        t1.setValueFrom$2(this._object, newValue);
+    },
+    get$_reportArgumentCount: function() {
+      return 2;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      this._directObserver = L._ObservedSet__ObservedSet(this, this._object);
+      this._check$1$skipChanges(true);
+    },
+    _disconnect$0: function() {
+      this._path_observer$_value = null;
+      this._path_observer$_path = null;
+      this._object = null;
+    },
+    _iterateObjects$1: function(observe) {
+      this._path_observer$_path._iterateObjects$2(this._object, observe);
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var oldValue, t1;
+      oldValue = this._path_observer$_value;
+      t1 = this._path_observer$_path.getValueFrom$1(this._object);
+      this._path_observer$_value = t1;
+      if (skipChanges || J.$eq(t1, oldValue))
+        return false;
+      this._report$2(this._path_observer$_value, oldValue);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  PropertyPath: {
+    "^": "Object;_segments",
+    get$length: function(_) {
+      return this._segments.length;
+    },
+    get$isEmpty: function(_) {
+      return this._segments.length === 0;
+    },
+    get$isValid: function() {
+      return true;
+    },
+    toString$0: function(_) {
+      if (!this.get$isValid())
+        return "<invalid path>";
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this._segments, new L.PropertyPath_toString_closure()), [null, null]).join$1(0, ".");
+    },
+    $eq: function(_, other) {
+      var t1, len, t2, i, t3;
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isPropertyPath)
+        return false;
+      if (this.get$isValid() !== other.get$isValid())
+        return false;
+      t1 = this._segments;
+      len = t1.length;
+      t2 = other._segments;
+      if (len !== t2.length)
+        return false;
+      for (i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        if (!J.$eq(t3, t2[i]))
+          return false;
+      }
+      return true;
+    },
+    get$hashCode: function(_) {
+      var t1, len, hash, i, t2;
+      for (t1 = this._segments, len = t1.length, hash = 0, i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t2 = J.get$hashCode$(t1[i]);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        hash = 536870911 & hash + t2;
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >>> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    getValueFrom$1: function(obj) {
+      var t1, segment;
+      if (!this.get$isValid())
+        return;
+      for (t1 = this._segments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        segment = t1._current;
+        if (obj == null)
+          return;
+        obj = L._getObjectProperty(obj, segment);
+      }
+      return obj;
+    },
+    setValueFrom$2: function(obj, value) {
+      var t1, end, i;
+      t1 = this._segments;
+      end = t1.length - 1;
+      if (end < 0)
+        return false;
+      for (i = 0; i < end; ++i) {
+        if (obj == null)
+          return false;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+      if (end >= t1.length)
+        return H.ioore(t1, end);
+      return L._setObjectProperty(obj, t1[end], value);
+    },
+    _iterateObjects$2: function(obj, observe) {
+      var t1, last, i, i0;
+      if (!this.get$isValid() || this._segments.length === 0)
+        return;
+      t1 = this._segments;
+      last = t1.length - 1;
+      for (i = 0; obj != null; i = i0) {
+        observe.call$1(obj);
+        if (i >= last)
+          break;
+        i0 = i + 1;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+    },
+    $isPropertyPath: true,
+    static: {PropertyPath_PropertyPath: function(path) {
+        var copy, t1, segment, pathObj, segments, t2, index, it;
+        if (!!J.getInterceptor(path).$isList) {
+          copy = P.List_List$from(path, false, null);
+          t1 = new H.ListIterator(copy, copy.length, 0, null);
+          t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(copy, 0)];
+          for (; t1.moveNext$0();) {
+            segment = t1._current;
+            if ((typeof segment !== "number" || Math.floor(segment) !== segment) && !J.getInterceptor(segment).$isSymbol)
+              throw H.wrapException(P.ArgumentError$("List must contain only ints and Symbols"));
+          }
+          return new L.PropertyPath(copy);
+        }
+        if (path == null)
+          path = "";
+        pathObj = $.get$_pathCache().$index(0, path);
+        if (pathObj != null)
+          return pathObj;
+        if (!L._isPathValid(path))
+          return $.get$_InvalidPropertyPath__instance();
+        segments = [];
+        t1 = J.trim$0$s(path).split(".");
+        t2 = new H.ListIterator(t1, t1.length, 0, null);
+        t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+        for (; t2.moveNext$0();) {
+          segment = t2._current;
+          if (J.$eq(segment, ""))
+            continue;
+          index = H.Primitives_parseInt(segment, 10, new L.PropertyPath_PropertyPath_closure());
+          segments.push(index != null ? index : $.get$symbolConverter()._symbols.$index(0, segment));
+        }
+        pathObj = new L.PropertyPath(C.JSArray_methods.toList$1$growable(segments, false));
+        t1 = $.get$_pathCache();
+        if (t1._collection$_length >= 100) {
+          t1.toString;
+          t2 = new P.LinkedHashMapKeyIterable(t1);
+          t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+          it = t2.get$iterator(t2);
+          if (!it.moveNext$0())
+            H.throwExpression(H.IterableElementError_noElement());
+          t1.remove$1(0, it.get$current());
+        }
+        t1.$indexSet(0, path, pathObj);
+        return pathObj;
+      }}
+  },
+  PropertyPath_PropertyPath_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return;
+    },
+    $isFunction: true
+  },
+  PropertyPath_toString_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return !!J.getInterceptor(s).$isSymbol ? $.get$symbolConverter()._names.$index(0, s) : s;
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  _InvalidPropertyPath: {
+    "^": "PropertyPath;_segments",
+    get$isValid: function() {
+      return false;
+    },
+    static: {"^": "_InvalidPropertyPath__instance"}
+  },
+  closure7: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return new H.JSSyntaxRegExp("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$", H.JSSyntaxRegExp_makeNative("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$", false, true, false), null, null);
+    },
+    $isFunction: true
+  },
+  CompoundObserver: {
+    "^": "_Observer;_directObserver,_observed,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._observed == null;
+    },
+    get$_reportArgumentCount: function() {
+      return 3;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      var t1, t2, i, object;
+      this._check$1$skipChanges(true);
+      for (t1 = this._observed, t2 = t1.length, i = 0; i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t1 = $._ObservedSet__lastSet;
+          if (t1 != null) {
+            t2 = t1._rootObject;
+            t2 = t2 == null ? object != null : t2 !== object;
+          } else
+            t2 = true;
+          if (t2) {
+            t1 = new L._ObservedSet(object, P.SplayTreeMap$(null, null, null, null), null, null, false);
+            $._ObservedSet__lastSet = t1;
+          }
+          t1._path_observer$_observers.$indexSet(0, this._birthId, this);
+          this._iterateObjects$1(t1.get$observe(t1));
+          this._directObserver = null;
+          break;
+        }
+      }
+    },
+    _disconnect$0: function() {
+      var i, t1, t2, t3;
+      this._path_observer$_value = null;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2)
+        if (t1[i] === C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          J.close$0$x(t1[t3]);
+        }
+      this._observed = null;
+    },
+    addPath$2: function(object, path) {
+      var t1;
+      if (this._notifyCallback != null || this._observed == null)
+        throw H.wrapException(P.StateError$("Cannot add paths once started."));
+      if (!J.getInterceptor(path).$isPropertyPath)
+        path = L.PropertyPath_PropertyPath(path);
+      t1 = this._observed;
+      t1.push(object);
+      t1.push(path);
+    },
+    addPath$1: function(object) {
+      return this.addPath$2(object, null);
+    },
+    _iterateObjects$1: function(observe) {
+      var i, t1, t2, object, t3;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          H.interceptedTypeCast(t1[t3], "$isPropertyPath")._iterateObjects$2(object, observe);
+        }
+      }
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var changed, oldValues, i, t1, t2, t3, pathOrObserver, object, value;
+      J.set$length$asx(this._path_observer$_value, C.JSInt_methods._tdivFast$1(this._observed.length, 2));
+      for (changed = false, oldValues = null, i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        t3 = i + 1;
+        if (t3 >= t2)
+          return H.ioore(t1, t3);
+        pathOrObserver = t1[t3];
+        object = t1[i];
+        if (object === C.C__ObserverSentinel) {
+          H.interceptedTypeCast(pathOrObserver, "$isBindable");
+          value = pathOrObserver.get$value(pathOrObserver);
+        } else
+          value = H.interceptedTypeCast(pathOrObserver, "$isPropertyPath").getValueFrom$1(object);
+        if (skipChanges) {
+          J.$indexSet$ax(this._path_observer$_value, C.JSInt_methods._tdivFast$1(i, 2), value);
+          continue;
+        }
+        t1 = this._path_observer$_value;
+        t2 = C.JSInt_methods._tdivFast$1(i, 2);
+        if (J.$eq(value, J.$index$asx(t1, t2)))
+          continue;
+        t1 = this._notifyArgumentCount;
+        if (typeof t1 !== "number")
+          return t1.$ge();
+        if (t1 >= 2) {
+          if (oldValues == null)
+            oldValues = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          oldValues.$indexSet(0, t2, J.$index$asx(this._path_observer$_value, t2));
+        }
+        J.$indexSet$ax(this._path_observer$_value, t2, value);
+        changed = true;
+      }
+      if (!changed)
+        return false;
+      this._report$3(this._path_observer$_value, oldValues, t1);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  _ObserverSentinel: {
+    "^": "Object;"
+  },
+  _Observer: {
+    "^": "Bindable;_birthId<",
+    _notifyCallback$0: function() {
+      return this._notifyCallback.call$0();
+    },
+    _notifyCallback$1: function(arg0) {
+      return this._notifyCallback.call$1(arg0);
+    },
+    _notifyCallback$2: function(arg0, arg1) {
+      return this._notifyCallback.call$2(arg0, arg1);
+    },
+    _notifyCallback$3: function(arg0, arg1, arg2) {
+      return this._notifyCallback.call$3(arg0, arg1, arg2);
+    },
+    get$_isOpen: function() {
+      return this._notifyCallback != null;
+    },
+    open$1: function(_, callback) {
+      if (this._notifyCallback != null || this.get$_path_observer$_isClosed())
+        throw H.wrapException(P.StateError$("Observer has already been opened."));
+      if (X.minArgs(callback) > this.get$_reportArgumentCount())
+        throw H.wrapException(P.ArgumentError$("callback should take " + this.get$_reportArgumentCount() + " or fewer arguments"));
+      this._notifyCallback = callback;
+      this._notifyArgumentCount = P.min(this.get$_reportArgumentCount(), X.maxArgs(callback));
+      this._connect$0();
+      return this._path_observer$_value;
+    },
+    get$value: function(_) {
+      this._check$1$skipChanges(true);
+      return this._path_observer$_value;
+    },
+    close$0: function(_) {
+      if (this._notifyCallback == null)
+        return;
+      this._disconnect$0();
+      this._path_observer$_value = null;
+      this._notifyCallback = null;
+    },
+    _deliver$1: [function(_) {
+      if (this._notifyCallback != null)
+        this._dirtyCheck$0();
+    }, "call$1", "get$_deliver", 2, 0, 20, 14],
+    _dirtyCheck$0: function() {
+      var cycles = 0;
+      while (true) {
+        if (!(cycles < 1000 && this._check$0()))
+          break;
+        ++cycles;
+      }
+      return cycles > 0;
+    },
+    _report$3: function(newValue, oldValue, extraArg) {
+      var e, s, exception, t1;
+      try {
+        switch (this._notifyArgumentCount) {
+          case 0:
+            this._notifyCallback$0();
+            break;
+          case 1:
+            this._notifyCallback$1(newValue);
+            break;
+          case 2:
+            this._notifyCallback$2(newValue, oldValue);
+            break;
+          case 3:
+            this._notifyCallback$3(newValue, oldValue, extraArg);
+            break;
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2(e, s);
+      }
+
+    },
+    _report$2: function(newValue, oldValue) {
+      return this._report$3(newValue, oldValue, null);
+    }
+  },
+  _ObservedSet: {
+    "^": "Object;_rootObject,_path_observer$_observers,_objects,_toRemove,_resetNeeded",
+    open$1: function(_, obs) {
+      this._path_observer$_observers.$indexSet(0, obs.get$_birthId(), obs);
+      obs._iterateObjects$1(this.get$observe(this));
+    },
+    observe$1: [function(_, obj) {
+      var t1 = J.getInterceptor(obj);
+      if (!!t1.$isObservableList)
+        this._observeStream$1(obj.get$listChanges());
+      if (!!t1.$isObservable)
+        this._observeStream$1(t1.get$changes(obj));
+    }, "call$1", "get$observe", 2, 0, 159, 81],
+    _observeStream$1: function(stream) {
+      var t1, sub;
+      if (this._objects == null)
+        this._objects = P.HashMap_HashMap(null, null, null, null, null);
+      t1 = this._toRemove;
+      sub = t1 != null ? t1.remove$1(0, stream) : null;
+      if (sub != null)
+        this._objects.$indexSet(0, stream, sub);
+      else if (!this._objects.containsKey$1(stream))
+        this._objects.$indexSet(0, stream, stream.listen$1(this.get$_path_observer$_callback()));
+    },
+    reset$0: [function(_) {
+      var objs, t1, t2, t3, observer;
+      if (!this._resetNeeded)
+        return;
+      objs = this._toRemove;
+      if (objs == null)
+        objs = P.HashMap_HashMap(null, null, null, null, null);
+      this._toRemove = this._objects;
+      this._objects = objs;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t2 = t1._map, t3 = H.getTypeArgumentByIndex(t1, 1), t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterator(t2, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t2._modificationCount, t2._splayCount, null), [H.getTypeArgumentByIndex(t1, 0), t3]), t1._SplayTreeIterator$1(t2, t3); t1.moveNext$0();) {
+        observer = t1.get$current();
+        if (observer.get$_isOpen())
+          observer._iterateObjects$1(this.get$observe(this));
+      }
+      for (t1 = this._toRemove, t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        t1._current.cancel$0();
+      this._toRemove = null;
+    }, "call$0", "get$reset", 0, 0, 18],
+    _path_observer$_callback$1: [function(records) {
+      var t1, observer;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t1 = P.List_List$from(t1, false, H.getRuntimeTypeArgument(t1, "IterableBase", 0)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        observer = t1._current;
+        if (observer.get$_isOpen())
+          observer._check$0();
+      }
+      this._resetNeeded = true;
+      P.scheduleMicrotask(this.get$reset(this));
+    }, "call$1", "get$_path_observer$_callback", 2, 0, 20, 160],
+    static: {"^": "_ObservedSet__lastSet", _ObservedSet__ObservedSet: function(observer, rootObj) {
+        var t1, t2;
+        t1 = $._ObservedSet__lastSet;
+        if (t1 != null) {
+          t2 = t1._rootObject;
+          t2 = t2 == null ? rootObj != null : t2 !== rootObj;
+        } else
+          t2 = true;
+        if (t2) {
+          t1 = new L._ObservedSet(rootObj, P.SplayTreeMap$(null, null, null, null), null, null, false);
+          $._ObservedSet__lastSet = t1;
+        }
+        t1._path_observer$_observers.$indexSet(0, observer._birthId, observer);
+        observer._iterateObjects$1(t1.get$observe(t1));
+      }}
+  }
+}],
+["observe.src.to_observable", "package:observe/src/to_observable.dart", , R, {
+  "^": "",
+  _toObservableDeep: [function(value) {
+    var t1, result, t2;
+    t1 = J.getInterceptor(value);
+    if (!!t1.$isObservable)
+      return value;
+    if (!!t1.$isMap) {
+      result = V.ObservableMap_ObservableMap$createFromType(value, null, null);
+      t1.forEach$1(value, new R._toObservableDeep_closure(result));
+      return result;
+    }
+    if (!!t1.$isIterable) {
+      t1 = t1.map$1(value, R._toObservableDeep$closure());
+      t2 = Q.ObservableList$(null, null);
+      t2.addAll$1(0, t1);
+      return t2;
+    }
+    return value;
+  }, "call$1", "_toObservableDeep$closure", 2, 0, 13, 21],
+  _toObservableDeep_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(k, v) {
+      this.result_0.$indexSet(0, R._toObservableDeep(k), R._toObservableDeep(v));
+    },
+    $isFunction: true
+  }
+}],
+["polymer", "package:polymer/polymer.dart", , A, {
+  "^": "",
+  _shimShadowDomStyling: function(template, $name, extendee) {
+    if (template == null || $.get$_ShadowCss() == null)
+      return;
+    $.get$_ShadowCss().callMethod$2("shimStyling", [template, $name, extendee]);
+  },
+  _cssTextFromSheet: function(sheet) {
+    var href, e, t, t1, exception;
+    if (sheet == null)
+      return "";
+    if ($.deployMode)
+      return "";
+    t1 = J.getInterceptor$x(sheet);
+    href = t1.get$href(sheet);
+    if (J.$eq(href, ""))
+      href = t1.get$attributes(sheet)._html$_element.getAttribute("href");
+    try {
+      t1 = new XMLHttpRequest();
+      C.HttpRequest_methods.open$3$async(t1, "GET", href, false);
+      t1.send();
+      t1 = t1.responseText;
+      return t1;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      if (!!J.getInterceptor(t1).$isDomException) {
+        e = t1;
+        t = new H._StackTrace(exception, null);
+        $.get$_sheetLog().fine$1("failed to XHR stylesheet text href=\"" + H.S(href) + "\" error: " + H.S(e) + ", trace: " + H.S(t));
+        return "";
+      } else
+        throw exception;
+    }
+
+  },
+  _isObserverMethod: [function(symbol) {
+    var $name, t1;
+    $name = $.get$symbolConverter()._names.$index(0, symbol);
+    if ($name == null)
+      return false;
+    t1 = J.getInterceptor$s($name);
+    return t1.endsWith$1($name, "Changed") && !t1.$eq($name, "attributeChanged");
+  }, "call$1", "_isObserverMethod$closure", 2, 0, 62, 63],
+  Polymer_register: function($name, type) {
+    $.get$_typesByName().$indexSet(0, $name, type);
+    H.interceptedTypeCast(J.$index$asx($.get$context(), "Polymer"), "$isJsFunction").apply$1([$name]);
+  },
+  Polymer_applyStyleToScope: function(style, scope) {
+    var clone, attr, refNode, styleElement;
+    if (style == null)
+      return;
+    document;
+    if ($.get$_hasShadowDomPolyfill() === true)
+      scope = document.head;
+    clone = document.createElement("style", null);
+    J.set$text$x(clone, J.get$text$x(style));
+    attr = style.getAttribute("element");
+    if (attr != null)
+      clone.setAttribute("element", attr);
+    refNode = scope.firstChild;
+    if (scope === document.head) {
+      styleElement = W._FrozenElementList$_wrap(document.head.querySelectorAll("style[element]"), null);
+      if (styleElement.get$isNotEmpty(styleElement))
+        refNode = J.get$nextElementSibling$x(C.NodeList_methods.get$last(styleElement._nodeList));
+    }
+    scope.insertBefore(clone, refNode);
+  },
+  initPolymer: function() {
+    if ($.deployMode) {
+      A.startPolymer($.initializers, true);
+      return $.Zone__current;
+    }
+    var t1 = $.Zone__current.fork$1$specification(O.dirtyCheckZoneSpec());
+    t1.run$1(new A.initPolymer_closure());
+    return t1;
+  },
+  startPolymer: function(initializers, deployMode) {
+    var poly, t1;
+    if ($._startPolymerCalled)
+      throw H.wrapException("Initialization was already done.");
+    $._startPolymerCalled = true;
+    A._hookJsPolymer();
+    $._deployMode = deployMode;
+    if (initializers == null)
+      throw H.wrapException("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.Polymer_register("d-auto-binding", C.Type_s8b);
+    poly = document.createElement("polymer-element", null);
+    poly.setAttribute("name", "d-auto-binding");
+    poly.setAttribute("extends", "template");
+    J.$index$asx($.get$_polymerElementProto(), "init").apply$2$thisArg([], poly);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(initializers, 74, 0, null), [H.getTypeArgumentByIndex(initializers, 0)]); t1.moveNext$0();)
+      t1._current.call$0();
+  },
+  _hookJsPolymer: function() {
+    var t1, polymerJs, zone, originalRegister;
+    t1 = $.get$context();
+    if (J.$index$asx(t1, "Platform") == null)
+      throw H.wrapException(P.StateError$("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."));
+    polymerJs = J.$index$asx(t1, "Polymer");
+    if (polymerJs == null)
+      throw H.wrapException(P.StateError$("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."));
+    zone = $.Zone__current;
+    polymerJs.callMethod$2("whenPolymerReady", [zone.bindCallback$1(new A._hookJsPolymer_closure())]);
+    originalRegister = J.$index$asx($.get$_polymerElementProto(), "register");
+    if (originalRegister == null)
+      throw H.wrapException(P.StateError$("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."));
+    J.$indexSet$ax($.get$_polymerElementProto(), "register", P.JsFunction_JsFunction$withThis(new A._hookJsPolymer_registerDart(zone, originalRegister)));
+  },
+  PolymerDeclaration: {
+    "^": "Object;element>,type>,superDeclaration<,name>,_polymer$_publish<,_publishLC<,_observe>,_instanceAttributes<,_reflect<,_sheets,_styles,syntax>,_eventDelegates<,_templateDelegates,_rootUri",
+    get$templateContent: function() {
+      var template, t1;
+      template = J.querySelector$1$x(this.element, "template");
+      if (template != null)
+        t1 = J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template));
+      else
+        t1 = null;
+      return t1;
+    },
+    registerType$1: function($name) {
+      var baseTag, decl, t1;
+      for (baseTag = null, decl = this; decl != null;) {
+        baseTag = J.get$attributes$x(J.get$element$x(decl))._html$_element.getAttribute("extends");
+        decl = decl.get$superDeclaration();
+      }
+      t1 = document;
+      W._registerCustomElement(window, t1, $name, this.type, baseTag);
+    },
+    resolveElementPaths$1: function(node) {
+      var t1 = $.get$_Platform();
+      if (t1 == null)
+        return;
+      J.$index$asx(t1, "urlResolver").callMethod$2("resolveDom", [node]);
+    },
+    publishAttributes$1: function(superDecl) {
+      var t1, t2, attrs, t3, attr, property, path, t4, decl;
+      if (superDecl != null) {
+        if (superDecl.get$_polymer$_publish() != null) {
+          t1 = superDecl.get$_polymer$_publish();
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._polymer$_publish = t2;
+        }
+        if (superDecl.get$_reflect() != null) {
+          t1 = superDecl.get$_reflect();
+          t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._reflect = t2;
+        }
+      }
+      t1 = this.type;
+      this._getPublishedProperties$1(t1);
+      attrs = J.get$attributes$x(this.element)._html$_element.getAttribute("attributes");
+      if (attrs != null)
+        for (t2 = C.JSString_methods.split$1(attrs, $.get$_ATTRIBUTES_REGEX()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]), t3 = this.name; t2.moveNext$0();) {
+          attr = J.trim$0$s(t2._current);
+          if (attr === "")
+            continue;
+          property = $.get$symbolConverter()._symbols.$index(0, attr);
+          path = L.PropertyPath_PropertyPath([property]);
+          t4 = this._polymer$_publish;
+          if (t4 != null && t4.containsKey$1(path))
+            continue;
+          decl = $.get$typeInspector().getDeclaration$2(t1, property);
+          if (decl == null || decl.kind === C.DeclarationKind_2 || decl.isFinal) {
+            window;
+            t4 = "property for attribute " + attr + " of polymer-element name=" + H.S(t3) + " not found.";
+            if (typeof console != "undefined")
+              console.warn(t4);
+            continue;
+          }
+          t4 = this._polymer$_publish;
+          if (t4 == null) {
+            t4 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            this._polymer$_publish = t4;
+          }
+          t4.$indexSet(0, path, decl);
+        }
+    },
+    _getPublishedProperties$1: function(type) {
+      var t1, decl, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, type, C.QueryOptions_sAl), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        t2 = J.getInterceptor$x(decl);
+        if (t2.get$isFinal(decl) === true)
+          continue;
+        t3 = this._polymer$_publish;
+        if (t3 == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+          this._polymer$_publish = t3;
+        }
+        t3.$indexSet(0, L.PropertyPath_PropertyPath([t2.get$name(decl)]), decl);
+        t3 = new H.WhereIterable(decl.get$annotations(), new A.PolymerDeclaration__getPublishedProperties_closure());
+        t3.$builtinTypeInfo = [null];
+        if (t3.any$1(0, new A.PolymerDeclaration__getPublishedProperties_closure0())) {
+          t3 = this._reflect;
+          if (t3 == null) {
+            t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+            this._reflect = t3;
+          }
+          t2 = t2.get$name(decl);
+          t3.add$1(0, $.get$symbolConverter()._names.$index(0, t2));
+        }
+      }
+    },
+    accumulateInstanceAttributes$0: function() {
+      var t1, t2;
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      this._instanceAttributes = t1;
+      t2 = this.superDeclaration;
+      if (t2 != null)
+        t1.addAll$1(0, t2.get$_instanceAttributes());
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_accumulateInstanceAttributes_closure(this));
+    },
+    addAttributeDelegates$1: function(delegates) {
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_addAttributeDelegates_closure(delegates));
+    },
+    cacheSheets$0: function() {
+      var t1 = this.findNodes$1("link[rel=stylesheet]");
+      this._sheets = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    cacheStyles$0: function() {
+      var t1 = this.findNodes$1("style[polymer-scope]");
+      this._styles = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    installLocalSheets$0: function() {
+      var t1, sheets, $content, cssText, t2, str, t3, style;
+      t1 = this._sheets;
+      t1.toString;
+      sheets = H.setRuntimeTypeInfo(new H.WhereIterable(t1, new A.PolymerDeclaration_installLocalSheets_closure()), [null]);
+      $content = this.get$templateContent();
+      if ($content != null) {
+        cssText = P.StringBuffer$("");
+        for (t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(sheets._iterable), sheets._f), [H.getTypeArgumentByIndex(sheets, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+          str = A._cssTextFromSheet(t2.get$current());
+          t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+          cssText._contents = t3 + "\n";
+        }
+        if (cssText._contents.length > 0) {
+          style = J.get$ownerDocument$x(this.element).createElement("style", null);
+          J.set$text$x(style, H.S(cssText));
+          t1 = J.getInterceptor$x($content);
+          t1.insertBefore$2($content, style, t1.get$firstChild($content));
+        }
+      }
+    },
+    findNodes$2: function(selector, matcher) {
+      var t1, nodes, $content;
+      t1 = J.querySelectorAll$1$x(this.element, selector);
+      nodes = t1.toList$0(t1);
+      $content = this.get$templateContent();
+      if ($content != null)
+        C.JSArray_methods.addAll$1(nodes, J.querySelectorAll$1$x($content, selector));
+      return nodes;
+    },
+    findNodes$1: function(selector) {
+      return this.findNodes$2(selector, null);
+    },
+    cssTextForScope$1: function(scopeDescriptor) {
+      var cssText, t1, t2, t3, str, t4;
+      cssText = P.StringBuffer$("");
+      t1 = new A.PolymerDeclaration_cssTextForScope_matcher("[polymer-scope=" + scopeDescriptor + "]");
+      for (t2 = this._sheets, t2.toString, t2 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t2 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0)]), t3 = t2._iterator; t2.moveNext$0();) {
+        str = A._cssTextFromSheet(t3.get$current());
+        t4 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t4 + "\n\n";
+      }
+      for (t2 = this._styles, t2.toString, t1 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+        str = J.get$text$x(t2.get$current());
+        t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t3 + "\n\n";
+      }
+      return cssText._contents;
+    },
+    cssTextToScopeStyle$2: function(cssText, scopeDescriptor) {
+      var t1;
+      if (cssText === "")
+        return;
+      t1 = document.createElement("style", null);
+      J.set$text$x(t1, cssText);
+      t1.setAttribute("element", H.S(this.name) + "-" + scopeDescriptor);
+      return t1;
+    },
+    inferObservers$0: function() {
+      var t1, decl, t2, t3, $name;
+      for (t1 = $.get$_changedMethodQueryOptions(), t1 = $.get$typeInspector().query$2(0, this.type, t1), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        if (this._observe == null)
+          this._observe = P.HashMap_HashMap(null, null, null, null, null);
+        t2 = J.getInterceptor$x(decl);
+        t3 = t2.get$name(decl);
+        $name = $.get$symbolConverter()._names.$index(0, t3);
+        t3 = J.getInterceptor$asx($name);
+        $name = t3.substring$2($name, 0, J.$sub$n(t3.get$length($name), 7));
+        this._observe.$indexSet(0, L.PropertyPath_PropertyPath($name), [t2.get$name(decl)]);
+      }
+    },
+    explodeObservers$0: function() {
+      var t1, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, this.type, C.QueryOptions_xw8), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        t2 = t1._current.get$annotations();
+        t3 = new H.ListIterator(t2, t2.length, 0, null);
+        t3.$builtinTypeInfo = [H.getTypeArgumentByIndex(t2, 0)];
+        for (; t3.moveNext$0();)
+          continue;
+      }
+    },
+    _lowerCaseMap$1: function(properties) {
+      var map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, null);
+      properties.forEach$1(0, new A.PolymerDeclaration__lowerCaseMap_closure(map));
+      return map;
+    },
+    $isPolymerDeclaration: true,
+    static: {"^": "PolymerDeclaration__polymerSyntax"}
+  },
+  PolymerDeclaration__getPublishedProperties_closure: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return !!J.getInterceptor(a).$isPublishedProperty;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__getPublishedProperties_closure0: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a.get$reflect();
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_accumulateInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      if (C.Map_EJn7R.containsKey$1($name) !== true && !J.startsWith$1$s($name, "on-"))
+        this.this_0._instanceAttributes.$indexSet(0, $name, value);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_addAttributeDelegates_closure: {
+    "^": "Closure:75;delegates_0",
+    call$2: function($name, value) {
+      var t1, start, end;
+      t1 = J.getInterceptor$s($name);
+      if (t1.startsWith$1($name, "on-")) {
+        start = J.getInterceptor$asx(value).indexOf$1(value, "{{");
+        end = C.JSString_methods.lastIndexOf$1(value, "}}");
+        if (start >= 0 && end >= 0)
+          this.delegates_0.$indexSet(0, t1.substring$1($name, 3), C.JSString_methods.trim$0(C.JSString_methods.substring$2(value, start + 2, end)));
+      }
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_installLocalSheets_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return J.get$attributes$x(s)._html$_element.hasAttribute("polymer-scope") !== true;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_cssTextForScope_matcher: {
+    "^": "Closure:13;selector_0",
+    call$1: function(s) {
+      return J.matches$1$x(s, this.selector_0);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_explodeObservers_closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return [];
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__lowerCaseMap_closure: {
+    "^": "Closure:161;map_0",
+    call$2: function(path, value) {
+      this.map_0.$indexSet(0, H.S(path).toLowerCase(), value);
+    },
+    $isFunction: true
+  },
+  PolymerExpressions: {
+    "^": "BindingDelegate_PolymerEventBindings;_delegate,_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      if (J.startsWith$1$s($name, "on-"))
+        return this.prepareEventBinding$3(path, $name, node);
+      return this._delegate.prepareBinding$3(path, $name, node);
+    }
+  },
+  BindingDelegate_PolymerEventBindings: {
+    "^": "BindingDelegate+PolymerEventBindings;"
+  },
+  PolymerEventBindings: {
+    "^": "Object;",
+    findController$1: function(node) {
+      var t1;
+      for (; t1 = J.getInterceptor$x(node), t1.get$parentNode(node) != null;) {
+        if (!!t1.$isPolymer && J.$index$asx(node.polymer$Polymer$_jsElem, "eventController") != null)
+          return J.$index$asx(t1.get$_jsElem(node), "eventController");
+        node = t1.get$parentNode(node);
+      }
+      return !!t1.$isShadowRoot ? node.host : null;
+    },
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new A.PolymerEventBindings_getEventHandler_closure(t1, this, target, method);
+    },
+    prepareEventBinding$3: function(path, $name, node) {
+      var t1, t2, eventType, translated;
+      t1 = {};
+      t2 = J.getInterceptor$s($name);
+      if (!t2.startsWith$1($name, "on-"))
+        return;
+      eventType = t2.substring$1($name, 3);
+      t1.eventType_0 = eventType;
+      translated = C.Map_AmMJ5.$index(0, eventType);
+      t1.eventType_0 = translated != null ? translated : t1.eventType_0;
+      return new A.PolymerEventBindings_prepareEventBinding_closure(t1, this, path);
+    }
+  },
+  PolymerEventBindings_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,target_2,method_3",
+    call$1: [function(e) {
+      var t1, t2, controller, detail;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1.findController$1(this.target_2);
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      if (!!J.getInterceptor(t2).$isPolymer) {
+        t2 = J.getInterceptor(e);
+        if (!!t2.$isCustomEvent) {
+          detail = t2.get$detail(e);
+          if (detail == null)
+            detail = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(e), "detail");
+        } else
+          detail = null;
+        t2 = t2.get$currentTarget(e);
+        t1 = t1.controller_0;
+        J.dispatchMethod$3$x(t1, t1, this.method_3, [e, detail, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + H.S(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  PolymerEventBindings_prepareEventBinding_closure: {
+    "^": "Closure:165;box_0,this_1,path_2",
+    call$3: [function(model, node, oneTime) {
+      var t1, handler, t2, sub;
+      t1 = this.path_2;
+      handler = this.this_1.getEventHandler$3(null, node, t1);
+      t2 = J.get$on$x(node).$index(0, this.box_0.eventType_0);
+      sub = H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(handler), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)]);
+      sub._tryResume$0();
+      if (oneTime === true)
+        return;
+      return new A._EventBindable(sub, t1);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  _EventBindable: {
+    "^": "Bindable;_sub,_polymer$_path",
+    get$value: function(_) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    open$1: function(_, callback) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+    }
+  },
+  PublishedProperty: {
+    "^": "ObservableProperty;reflect<",
+    $isPublishedProperty: true
+  },
+  PolymerElement: {
+    "^": "HtmlElement_Polymer_ChangeNotifier;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    PolymerElement$created$0: function(receiver) {
+      this.polymerCreated$0(receiver);
+    },
+    static: {PolymerElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.PolymerElement_methods.Element$created$0(receiver);
+        C.PolymerElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  HtmlElement_Polymer: {
+    "^": "HtmlElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  HtmlElement_Polymer_ChangeNotifier: {
+    "^": "HtmlElement_Polymer+ChangeNotifier;",
+    $isObservable: true
+  },
+  Polymer: {
+    "^": "Object;_jsElem:polymer$Polymer$_jsElem=",
+    get$element: function(receiver) {
+      return receiver.polymer$Polymer$_polymer$_element;
+    },
+    get$syntax: function(receiver) {
+      return;
+    },
+    get$_polymer$_name: function(receiver) {
+      var t1, isAttr;
+      t1 = receiver.polymer$Polymer$_polymer$_element;
+      if (t1 != null)
+        return J.get$name$x(t1);
+      isAttr = this.get$attributes(receiver)._html$_element.getAttribute("is");
+      return isAttr == null || isAttr === "" ? this.get$localName(receiver) : isAttr;
+    },
+    polymerCreated$0: function(receiver) {
+      var t, t1;
+      t = this.get$templateInstance(receiver);
+      if (t != null && t.model != null) {
+        window;
+        t1 = "Attributes on " + H.S(this.get$_polymer$_name(receiver)) + " were data bound prior to Polymer upgrading the element. This may result in incorrect binding types.";
+        if (typeof console != "undefined")
+          console.warn(t1);
+      }
+      this.prepareElement$0(receiver);
+      t1 = this.get$ownerDocument(receiver);
+      if (!J.$eq($.get$_isStagingDocument().$index(0, t1), true) || $.get$_hasShadowDomPolyfill() === true)
+        this.makeElementReady$0(receiver);
+    },
+    prepareElement$0: function(receiver) {
+      var t1, t2;
+      if (receiver.polymer$Polymer$_polymer$_element != null) {
+        window;
+        t1 = "Element already prepared: " + H.S(this.get$_polymer$_name(receiver));
+        if (typeof console != "undefined")
+          console.warn(t1);
+        return;
+      }
+      receiver.polymer$Polymer$_jsElem = P.JsObject_JsObject$fromBrowserObject(receiver);
+      t1 = this.get$_polymer$_name(receiver);
+      receiver.polymer$Polymer$_polymer$_element = $.get$_declarations().$index(0, t1);
+      this.createPropertyObserver$0(receiver);
+      t1 = receiver.polymer$Polymer$_propertyObserver;
+      if (t1 != null) {
+        t2 = this.get$notifyPropertyChanges(receiver);
+        t1.toString;
+        L._Observer.prototype.open$1.call(J.getInterceptor(t1), t1, t2);
+      }
+      if (receiver.polymer$Polymer$_polymer$_element.get$_polymer$_publish() != null)
+        this.get$changes(receiver).listen$1(this.get$_propertyChange(receiver));
+      this.copyInstanceAttributes$0(receiver);
+      this.takeAttributes$0(receiver);
+      this.addHostListeners$0(receiver);
+    },
+    makeElementReady$0: function(receiver) {
+      if (receiver.polymer$Polymer$_readied)
+        return;
+      receiver.polymer$Polymer$_readied = true;
+      this.parseDeclarations$1(receiver, receiver.polymer$Polymer$_polymer$_element);
+      this.get$attributes(receiver).remove$1(0, "unresolved");
+      this.ready$0(receiver);
+    },
+    ready$0: function(receiver) {
+    },
+    attached$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element == null)
+        throw H.wrapException(P.StateError$("polymerCreated was not called for custom element " + H.S(this.get$_polymer$_name(receiver)) + ", this should normally be done in the .created() if Polymer is used as a mixin."));
+      this.cancelUnbindAll$0(receiver);
+      if (!receiver.polymer$Polymer$_hasBeenAttached) {
+        receiver.polymer$Polymer$_hasBeenAttached = true;
+        this.async$1(receiver, new A.Polymer_attached_closure(receiver));
+      }
+    },
+    detached$0: function(receiver) {
+      this.asyncUnbindAll$0(receiver);
+    },
+    parseDeclarations$1: function(receiver, declaration) {
+      if (declaration != null) {
+        this.parseDeclarations$1(receiver, declaration.get$superDeclaration());
+        this.parseDeclaration$1(receiver, J.get$element$x(declaration));
+      }
+    },
+    parseDeclaration$1: function(receiver, elementElement) {
+      var t1, template, root, $name;
+      t1 = J.getInterceptor$x(elementElement);
+      template = t1.querySelector$1(elementElement, "template");
+      if (template != null) {
+        root = this.shadowFromTemplate$1(receiver, template);
+        $name = t1.get$attributes(elementElement)._html$_element.getAttribute("name");
+        if ($name == null)
+          return;
+        receiver.polymer$Polymer$shadowRoots.$indexSet(0, $name, root);
+      }
+    },
+    shadowFromTemplate$1: function(receiver, template) {
+      var root, syntax, t, dom, ext, t1;
+      if (template == null)
+        return;
+      root = this.createShadowRoot$0(receiver);
+      syntax = this.get$syntax(receiver);
+      t = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+      dom = J.createInstance$2$x(t, receiver, syntax == null && J.get$bindingDelegate$x(t) == null ? J.get$syntax$x(receiver.polymer$Polymer$_polymer$_element) : syntax);
+      ext = $.get$_instanceExtension().$index(0, dom);
+      t1 = ext != null ? ext.get$_bindings() : ext;
+      receiver.polymer$Polymer$_observers.push(t1);
+      root.appendChild(dom);
+      this.marshalNodeReferences$1(receiver, root);
+      t1 = $.get$_PolymerGestures();
+      if (t1 != null)
+        t1.callMethod$2("register", [root]);
+      return root;
+    },
+    marshalNodeReferences$1: function(receiver, root) {
+      var t1, t2, n;
+      if (root == null)
+        return;
+      for (t1 = J.querySelectorAll$1$x(root, "[id]"), t1 = t1.get$iterator(t1), t2 = receiver.polymer$Polymer$$; t1.moveNext$0();) {
+        n = t1._current;
+        t2.$indexSet(0, J.get$id$x(n), n);
+      }
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      var t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "class") && !t1.$eq($name, "style"))
+        this.attributeToProperty$2(receiver, $name, newValue);
+    },
+    copyInstanceAttributes$0: function(receiver) {
+      receiver.polymer$Polymer$_polymer$_element.get$_instanceAttributes().forEach$1(0, new A.Polymer_copyInstanceAttributes_closure(receiver));
+    },
+    takeAttributes$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element.get$_publishLC() == null)
+        return;
+      this.get$attributes(receiver).forEach$1(0, this.get$attributeToProperty(receiver));
+    },
+    attributeToProperty$2: [function(receiver, $name, value) {
+      var decl, t1, t2, currentValue, type, newValue;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return;
+      if (value == null || J.contains$1$asx(value, $.get$Polymer_bindPattern()) === true)
+        return;
+      t1 = J.getInterceptor$x(decl);
+      t2 = t1.get$name(decl);
+      currentValue = $.get$objectAccessor().read$2(receiver, t2);
+      type = t1.get$type(decl);
+      t2 = J.getInterceptor(type);
+      newValue = Z.deserializeValue(value, currentValue, (t2.$eq(type, C.Type_HqF) || t2.$eq(type, C.Type_dynamic)) && currentValue != null ? J.get$runtimeType$(currentValue) : type);
+      if (newValue == null ? currentValue != null : newValue !== currentValue) {
+        t1 = t1.get$name(decl);
+        $.get$objectAccessor().write$3(receiver, t1, newValue);
+      }
+    }, "call$2", "get$attributeToProperty", 4, 0, 166],
+    propertyForAttribute$1: function(receiver, $name) {
+      var publishLC = receiver.polymer$Polymer$_polymer$_element.get$_publishLC();
+      if (publishLC == null)
+        return;
+      return publishLC.$index(0, $name);
+    },
+    serializeValue$1: function(receiver, value) {
+      if (value == null)
+        return;
+      if (typeof value === "boolean")
+        return value ? "" : null;
+      else if (typeof value === "string" || typeof value === "number")
+        return H.S(value);
+      return;
+    },
+    reflectPropertyToAttribute$1: function(receiver, path) {
+      var propValue, serializedValue, t1;
+      propValue = L.PropertyPath_PropertyPath(path).getValueFrom$1(receiver);
+      serializedValue = this.serializeValue$1(receiver, propValue);
+      if (serializedValue != null)
+        this.get$attributes(receiver)._html$_element.setAttribute(path, serializedValue);
+      else if (typeof propValue === "boolean") {
+        t1 = this.get$attributes(receiver)._html$_element;
+        t1.getAttribute(path);
+        t1.removeAttribute(path);
+      }
+    },
+    bind$3$oneTime: function(receiver, $name, bindable, oneTime) {
+      var decl, t1, t2, t3, observer, reflect, propName;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return J.bind$3$oneTime$x(M.nodeBindFallback(receiver), $name, bindable, oneTime);
+      else {
+        t1 = J.getInterceptor$x(decl);
+        t2 = t1.get$name(decl);
+        t3 = $.get$_bindLog();
+        if (t3.isLoggable$1(C.Level_FINE_500))
+          t3.fine$1("bindProperty: [" + H.S(bindable) + "] to [" + H.S(this.get$_polymer$_name(receiver)) + "].[" + H.S(t2) + "]");
+        t3 = J.getInterceptor$x(bindable);
+        if (t3.get$value(bindable) == null)
+          t3.set$value(bindable, $.get$objectAccessor().read$2(receiver, t2));
+        observer = new A._PolymerBinding(receiver, t2, bindable, null, null);
+        observer._sub = this.get$changes(receiver).listen$1(observer.get$_propertyValueChanged());
+        t3 = J.open$1$x(bindable, observer.get$_updateNode());
+        observer._lastValue = t3;
+        $.get$objectAccessor().write$3(receiver, t2, t3);
+        if ($.enableBindingsReflection && true) {
+          if (J.get$bindings$x(M.nodeBindFallback(receiver)) == null) {
+            t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            J.set$bindings$x(M.nodeBindFallback(receiver), t2);
+          }
+          J.$indexSet$ax(J.get$bindings$x(M.nodeBindFallback(receiver)), $name, observer);
+        }
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        t1 = t1.get$name(decl);
+        propName = $.get$symbolConverter()._names.$index(0, t1);
+        if (reflect != null && reflect.contains$1(0, propName))
+          this.reflectPropertyToAttribute$1(receiver, propName);
+        return observer;
+      }
+    },
+    bindFinished$0: function(receiver) {
+      return this.makeElementReady$0(receiver);
+    },
+    get$bindings: function(receiver) {
+      return J.get$bindings$x(M.nodeBindFallback(receiver));
+    },
+    set$bindings: function(receiver, value) {
+      J.set$bindings$x(M.nodeBindFallback(receiver), value);
+    },
+    get$templateInstance: function(receiver) {
+      return J.get$templateInstance$x(M.nodeBindFallback(receiver));
+    },
+    asyncUnbindAll$0: function(receiver) {
+      var job, t1;
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] asyncUnbindAll");
+      job = receiver.polymer$Polymer$_unbindAllJob;
+      t1 = this.get$unbindAll(receiver);
+      if (job == null)
+        job = new A.PolymerJob(null, null, null);
+      job.start$2(0, t1, null);
+      receiver.polymer$Polymer$_unbindAllJob = job;
+    },
+    unbindAll$0: [function(receiver) {
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      H.IterableMixinWorkaround_forEach(receiver.polymer$Polymer$_observers, this.get$closeObserverList(receiver));
+      receiver.polymer$Polymer$_observers = [];
+      this.closeNamedObservers$0(receiver);
+      receiver.polymer$Polymer$_unbound = true;
+    }, "call$0", "get$unbindAll", 0, 0, 18],
+    cancelUnbindAll$0: function(receiver) {
+      var t1;
+      if (receiver.polymer$Polymer$_unbound === true) {
+        $.get$_unbindLog().warning$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] already unbound, cannot cancel unbindAll");
+        return;
+      }
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] cancelUnbindAll");
+      t1 = receiver.polymer$Polymer$_unbindAllJob;
+      if (t1 != null) {
+        t1.stop$0(0);
+        receiver.polymer$Polymer$_unbindAllJob = null;
+      }
+    },
+    createPropertyObserver$0: function(receiver) {
+      var observe, t1, o, t2, path;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe != null) {
+        t1 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t1 + 1;
+        o = new L.CompoundObserver(null, [], t1, null, null, null);
+        o._path_observer$_value = [];
+        receiver.polymer$Polymer$_propertyObserver = o;
+        receiver.polymer$Polymer$_observers.push([o]);
+        for (t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterable(observe), [H.getTypeArgumentByIndex(observe, 0)]), t2 = t1._map, t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterator(t2, t2._computeKeys$0(), 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          path = t1._collection$_current;
+          o.addPath$2(receiver, path);
+          this.observeArrayValue$3(receiver, path, path.getValueFrom$1(receiver), null);
+        }
+      }
+    },
+    notifyPropertyChanges$3: [function(receiver, newValues, oldValues, paths) {
+      J.forEach$1$ax(oldValues, new A.Polymer_notifyPropertyChanges_closure(receiver, newValues, oldValues, paths, J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element), P.HashSet_HashSet(null, null, null, null)));
+    }, "call$3", "get$notifyPropertyChanges", 6, 0, 167],
+    _propertyChange$1: [function(receiver, records) {
+      var t1, record, t2, $name, reflect;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!J.getInterceptor(record).$isPropertyChangeRecord)
+          continue;
+        t2 = record.name;
+        $name = $.get$symbolConverter()._names.$index(0, t2);
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        if (reflect != null && reflect.contains$1(0, $name))
+          this.reflectPropertyToAttribute$1(receiver, $name);
+      }
+    }, "call$1", "get$_propertyChange", 2, 0, 168, 160],
+    observeArrayValue$3: function(receiver, $name, value, old) {
+      var observe, callbacks, t1, subscription, t2;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe == null)
+        return;
+      callbacks = observe.$index(0, $name);
+      if (callbacks == null)
+        return;
+      if (!!J.getInterceptor(old).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: unregister " + H.S($name));
+        this.closeNamedObserver$1(receiver, H.S($name) + "__array");
+      }
+      if (!!J.getInterceptor(value).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: register " + H.S($name));
+        subscription = value.get$listChanges()._createSubscription$1(false);
+        subscription.onData$1(new A.Polymer_observeArrayValue_closure(receiver, old, callbacks));
+        subscription.onError$1(0, null);
+        subscription.onDone$1(null);
+        t1 = H.S($name) + "__array";
+        t2 = receiver.polymer$Polymer$_namedObservers;
+        if (t2 == null) {
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.StreamSubscription);
+          receiver.polymer$Polymer$_namedObservers = t2;
+        }
+        t2.$indexSet(0, t1, subscription);
+      }
+    },
+    closeObserverList$1: [function(receiver, observers) {
+      var t1, o;
+      for (t1 = J.get$iterator$ax(observers); t1.moveNext$0();) {
+        o = t1.get$current();
+        if (o != null)
+          J.close$0$x(o);
+      }
+    }, "call$1", "get$closeObserverList", 2, 0, 169],
+    closeNamedObserver$1: function(receiver, $name) {
+      var sub = receiver.polymer$Polymer$_namedObservers.remove$1(0, $name);
+      if (sub == null)
+        return false;
+      sub.cancel$0();
+      return true;
+    },
+    closeNamedObservers$0: function(receiver) {
+      var t1, sub;
+      t1 = receiver.polymer$Polymer$_namedObservers;
+      if (t1 == null)
+        return;
+      for (t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();) {
+        sub = t1._current;
+        if (sub != null)
+          sub.cancel$0();
+      }
+      receiver.polymer$Polymer$_namedObservers.clear$0(0);
+      receiver.polymer$Polymer$_namedObservers = null;
+    },
+    addHostListeners$0: function(receiver) {
+      var events, t1;
+      events = receiver.polymer$Polymer$_polymer$_element.get$_eventDelegates();
+      if (events.get$isEmpty(events))
+        return;
+      t1 = $.get$_eventsLog();
+      if (t1.isLoggable$1(C.Level_FINE_500))
+        t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] addHostListeners: " + events.toString$0(0));
+      events.forEach$1(0, new A.Polymer_addHostListeners_closure(receiver));
+    },
+    dispatchMethod$3: function(receiver, object, callbackOrMethod, args) {
+      var t1, log, maxArgs, t2;
+      t1 = $.get$_eventsLog();
+      log = t1.isLoggable$1(C.Level_FINE_500);
+      if (log)
+        t1.fine$1(">>> [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+      if (!!J.getInterceptor(callbackOrMethod).$isFunction) {
+        maxArgs = X.maxArgs(callbackOrMethod);
+        if (maxArgs === -1)
+          t1.warning$1("invalid callback: expected callback of 0, 1, 2, or 3 arguments");
+        C.JSArray_methods.set$length(args, maxArgs);
+        H.Primitives_applyFunction(callbackOrMethod, args, P.Function__toMangledNames(null));
+      } else if (typeof callbackOrMethod === "string") {
+        t2 = $.get$symbolConverter()._symbols.$index(0, callbackOrMethod);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(object, t2, args, true, null);
+      } else
+        t1.warning$1("invalid callback");
+      if (log)
+        t1.info$1("<<< [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+    },
+    async$1: function(receiver, method) {
+      var t1;
+      P.scheduleMicrotask(F.Observable_dirtyCheck$closure());
+      $.get$_Platform().callMethod$1("flush");
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      return C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(method));
+    },
+    fire$5$canBubble$cancelable$detail$onNode: function(receiver, type, canBubble, cancelable, detail, onNode) {
+      var $event = W.CustomEvent_CustomEvent(type, true, true, detail);
+      this.dispatchEvent$1(receiver, $event);
+      return $event;
+    },
+    fire$1: function($receiver, type) {
+      return this.fire$5$canBubble$cancelable$detail$onNode($receiver, type, null, null, null, null);
+    },
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  Polymer_attached_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      var t1 = J.get$attributes$x(this.this_0);
+      if (t1.containsKey$1($name) !== true)
+        t1.$indexSet(0, $name, new A.Polymer_copyInstanceAttributes__closure(value).call$0());
+      t1.$index(0, $name);
+    },
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes__closure: {
+    "^": "Closure:69;value_1",
+    call$0: function() {
+      return this.value_1;
+    },
+    $isFunction: true
+  },
+  Polymer_notifyPropertyChanges_closure: {
+    "^": "Closure:75;this_0,newValues_1,oldValues_2,paths_3,observe_4,called_5",
+    call$2: [function(i, oldValue) {
+      var t1, newValue, t2, t3, path, methods, t4, t5, t6, t7, method;
+      t1 = this.newValues_1;
+      newValue = J.$index$asx(t1, i);
+      t2 = this.paths_3;
+      if (typeof i !== "number")
+        return H.iae(i);
+      t3 = 2 * i + 1;
+      if (t3 >>> 0 !== t3 || t3 >= t2.length)
+        return H.ioore(t2, t3);
+      path = t2[t3];
+      t3 = this.observe_4;
+      if (t3 == null)
+        return;
+      methods = t3.$index(0, path);
+      if (methods == null)
+        return;
+      for (t3 = J.get$iterator$ax(methods), t4 = this.this_0, t5 = J.getInterceptor$x(t4), t6 = this.oldValues_2, t7 = this.called_5; t3.moveNext$0();) {
+        method = t3.get$current();
+        if (!t7.add$1(0, method))
+          continue;
+        t5.observeArrayValue$3(t4, path, newValue, oldValue);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t4, method, [oldValue, newValue, t1, t6, t2], true, null);
+      }
+    }, "call$2", null, 4, 0, null, 82, 57, "call"],
+    $isFunction: true
+  },
+  Polymer_observeArrayValue_closure: {
+    "^": "Closure:13;this_0,old_1,callbacks_2",
+    call$1: [function(changes) {
+      var t1, t2, t3, callback;
+      for (t1 = J.get$iterator$ax(this.callbacks_2), t2 = this.this_0, t3 = this.old_1; t1.moveNext$0();) {
+        callback = t1.get$current();
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t2, callback, [t3], true, null);
+      }
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  Polymer_addHostListeners_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(type, methodName) {
+      var t1 = this.this_0;
+      J.addEventListener$2$x(t1, type, J.get$syntax$x(t1.polymer$Polymer$_polymer$_element).getEventHandler$3(t1, t1, methodName));
+    },
+    $isFunction: true
+  },
+  _PolymerBinding: {
+    "^": "Bindable;_polymer$_target,_property,_polymer$_bindable,_sub,_lastValue",
+    _updateNode$1: [function(newValue) {
+      this._lastValue = newValue;
+      $.get$objectAccessor().write$3(this._polymer$_target, this._property, newValue);
+    }, "call$1", "get$_updateNode", 2, 0, 20, 58],
+    _propertyValueChanged$1: [function(records) {
+      var t1, t2, record, getter, newValue;
+      for (t1 = J.get$iterator$ax(records), t2 = this._property; t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!!J.getInterceptor(record).$isPropertyChangeRecord && J.$eq(record.name, t2)) {
+          t1 = this._polymer$_target;
+          getter = $.get$objectAccessor()._getters.$index(0, t2);
+          if (getter == null)
+            H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + J.toString$0(t1)));
+          newValue = getter.call$1(t1);
+          t1 = this._lastValue;
+          if (t1 == null ? newValue != null : t1 !== newValue)
+            J.set$value$x(this._polymer$_bindable, newValue);
+          return;
+        }
+      }
+    }, "call$1", "get$_propertyValueChanged", 2, 0, 168, 160],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._polymer$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._polymer$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._polymer$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+      J.close$0$x(this._polymer$_bindable);
+    }
+  },
+  PolymerJob: {
+    "^": "Object;_callback,_timer,_polymer$_id",
+    _callback$0: function() {
+      return this._callback.call$0();
+    },
+    start$2: function(_, callback, wait) {
+      var t1;
+      this.stop$0(0);
+      this._callback = callback;
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      this._polymer$_id = C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(new A.PolymerJob_start_closure(this)));
+    },
+    stop$0: function(_) {
+      var t1, t2;
+      t1 = this._polymer$_id;
+      if (t1 != null) {
+        t2 = window;
+        C.Window_methods._ensureRequestAnimationFrame$0(t2);
+        t2.cancelAnimationFrame(t1);
+        this._polymer$_id = null;
+      }
+      t1 = this._timer;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._timer = null;
+      }
+    }
+  },
+  PolymerJob_start_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (t1._timer != null || t1._polymer$_id != null) {
+        t1.stop$0(0);
+        t1._callback$0();
+      }
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  initPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.startPolymer($.initializers, $.deployMode);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      var t1 = $.get$Polymer__onReady().future;
+      if (t1._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(null);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart: {
+    "^": "Closure:173;zone_0,originalRegister_1",
+    call$3: [function(jsElem, $name, extendee) {
+      var type = $.get$_typesByName().$index(0, $name);
+      if (type != null)
+        return this.zone_0.run$1(new A._hookJsPolymer_registerDart_closure(jsElem, $name, type, $.get$_declarations().$index(0, extendee)));
+      return this.originalRegister_1.apply$2$thisArg([$name, extendee], jsElem);
+    }, "call$3", null, 6, 0, null, 171, 56, 172, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart_closure: {
+    "^": "Closure:69;jsElem_2,name_3,type_4,extendsDecl_5",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, assetPath, base, targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery;
+      t1 = this.jsElem_2;
+      t2 = this.name_3;
+      t3 = this.type_4;
+      t4 = this.extendsDecl_5;
+      t5 = $.get$PolymerDeclaration__polymerSyntax();
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      t7 = new A.PolymerDeclaration(t1, t3, t4, t2, null, null, null, null, null, null, null, t5, t6, null, null);
+      $.get$_declarations().$indexSet(0, t2, t7);
+      t7.publishAttributes$1(t4);
+      t8 = t7._polymer$_publish;
+      if (t8 != null)
+        t7._publishLC = t7._lowerCaseMap$1(t8);
+      t7.inferObservers$0();
+      t7.explodeObservers$0();
+      t8 = J.getInterceptor$x(t1);
+      t9 = t8.querySelector$1(t1, "template");
+      if (t9 != null)
+        J.set$bindingDelegate$x(!!J.getInterceptor(t9).$isNodeBindExtension ? t9 : M.nodeBindFallback(t9), t5);
+      t7.cacheSheets$0();
+      t7.cacheStyles$0();
+      t7.installLocalSheets$0();
+      A.Polymer_applyStyleToScope(t7.cssTextToScopeStyle$2(t7.cssTextForScope$1("global"), "global"), document.head);
+      t7.resolveElementPaths$1(t1);
+      t7.accumulateInstanceAttributes$0();
+      t7.addAttributeDelegates$1(t6);
+      assetPath = t8.get$attributes(t1)._html$_element.getAttribute("assetpath");
+      if (assetPath == null)
+        assetPath = "";
+      base = P.Uri_parse(t8.get$ownerDocument(t1).baseURI);
+      t1 = P.Uri_parse(assetPath);
+      targetScheme = t1.scheme;
+      if (targetScheme !== "") {
+        targetUserInfo = t1.userInfo;
+        targetHost = t1.get$host(t1);
+        targetPort = t1.get$port(t1);
+        targetPath = base._removeDotSegments$1(t1._path);
+        targetQuery = t1.query;
+      } else {
+        if (t1.get$host(t1) !== "") {
+          targetUserInfo = t1.userInfo;
+          targetHost = t1.get$host(t1);
+          targetPort = t1.get$port(t1);
+          targetPath = base._removeDotSegments$1(t1._path);
+          targetQuery = t1.query;
+        } else {
+          t5 = t1._path;
+          if (t5 === "") {
+            targetPath = base._path;
+            targetQuery = t1.query;
+            targetQuery = targetQuery !== "" ? targetQuery : base.query;
+          } else {
+            t5 = J.startsWith$1$s(t5, "/");
+            t6 = t1._path;
+            targetPath = t5 ? base._removeDotSegments$1(t6) : base._removeDotSegments$1(base._merge$2(base._path, t6));
+            targetQuery = t1.query;
+          }
+          targetUserInfo = base.userInfo;
+          targetHost = base.get$host(base);
+          targetPort = base.get$port(base);
+        }
+        targetScheme = base.scheme;
+      }
+      t7._rootUri = P.Uri$(t1.fragment, targetHost, targetPath, null, targetPort, targetQuery, null, targetScheme, targetUserInfo);
+      t1 = t7.get$templateContent();
+      A._shimShadowDomStyling(t1, t2, t4 != null ? J.get$name$x(t4) : null);
+      if ($.get$typeInspector().hasStaticMethod$2(t3, C.Symbol_registerCallback))
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t3, C.Symbol_registerCallback, [t7], false, null);
+      t7.registerType$1(t2);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var proto = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(document.createElement("polymer-element", null)), "__proto__");
+      return !!J.getInterceptor(proto).$isNode ? P.JsObject_JsObject$fromBrowserObject(proto) : proto;
+    },
+    $isFunction: true
+  }
+}],
+["polymer.auto_binding", "package:polymer/auto_binding.dart", , Y, {
+  "^": "",
+  AutoBindingElement: {
+    "^": "TemplateElement_Polymer_Observable;_auto_binding$_self,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$model: function(receiver) {
+      return J.get$model$x(receiver._auto_binding$_self);
+    },
+    get$bindingDelegate: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    set$bindingDelegate: function(receiver, value) {
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, value);
+    },
+    clear$0: function(receiver) {
+      return J.clear$0$ax(receiver._auto_binding$_self);
+    },
+    get$syntax: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    createInstance$2: function(receiver, model, delegate) {
+      return J.createInstance$2$x(receiver._auto_binding$_self, model, delegate);
+    },
+    AutoBindingElement$created$0: function(receiver) {
+      var t1;
+      this.polymerCreated$0(receiver);
+      receiver._auto_binding$_self = M.nodeBindFallback(receiver);
+      t1 = T.PolymerExpressions$(null, C.C_ScopeFactory);
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, new Y._AutoBindingSyntax(receiver, t1, null));
+      $.get$Polymer__onReady().future.then$1(new Y.AutoBindingElement$created_closure(receiver));
+    },
+    $isTemplateBindExtension: true,
+    $isNodeBindExtension: true,
+    static: {AutoBindingElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.AutoBindingElement_methods.Element$created$0(receiver);
+        C.AutoBindingElement_methods.AutoBindingElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TemplateElement_Polymer: {
+    "^": "TemplateElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  TemplateElement_Polymer_Observable: {
+    "^": "TemplateElement_Polymer+Observable;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    $isObservable: true
+  },
+  AutoBindingElement$created_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      t1.setAttribute("bind", "");
+      J.async$1$x(t1, new Y.AutoBindingElement$created__closure(t1));
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  AutoBindingElement$created__closure: {
+    "^": "Closure:13;this_1",
+    call$1: [function(_) {
+      var t1, t2;
+      t1 = this.this_1;
+      t2 = J.getInterceptor$x(t1);
+      t2.marshalNodeReferences$1(t1, t1.parentNode);
+      t2.fire$1(t1, "template-bound");
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  _AutoBindingSyntax: {
+    "^": "PolymerExpressions;_auto_binding$_node,_delegate,_bindingMaps",
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new Y._AutoBindingSyntax_getEventHandler_closure(t1, this, method);
+    }
+  },
+  _AutoBindingSyntax_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,method_2",
+    call$1: [function(e) {
+      var t1, t2, controller, t3, obj, t4;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1._auto_binding$_node;
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      t3 = J.getInterceptor(t2);
+      if (!!t3.$isPolymer) {
+        t2 = J.getInterceptor$x(e);
+        t3 = t2.get$detail(e);
+        t2 = t2.get$currentTarget(e);
+        obj = t1.controller_0;
+        t4 = this.this_1._auto_binding$_node;
+        if (obj === t4)
+          obj = J.get$model$x(t4._auto_binding$_self);
+        J.dispatchMethod$3$x(t1.controller_0, obj, this.method_2, [e, t3, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + t3.toString$0(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  }
+}],
+["polymer.deserialize", "package:polymer/deserialize.dart", , Z, {
+  "^": "",
+  deserializeValue: function(value, currentValue, type) {
+    var handler, t1, exception;
+    handler = $.get$_typeHandlers().$index(0, type);
+    if (handler != null)
+      return handler.call$2(value, currentValue);
+    try {
+      t1 = C.JsonCodec_null_null.decode$1(J.replaceAll$2$s(value, "'", "\""));
+      return t1;
+    } catch (exception) {
+      H.unwrapException(exception);
+      return value;
+    }
+
+  },
+  closure0: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure1: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure2: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      var t1, exception;
+      try {
+        t1 = P.DateTime_parse(x);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return def;
+      }
+
+    },
+    $isFunction: true
+  },
+  closure3: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return !J.$eq(x, "false");
+    },
+    $isFunction: true
+  },
+  closure4: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseInt(x, null, new Z._closure0(def));
+    },
+    $isFunction: true
+  },
+  _closure0: {
+    "^": "Closure:13;def_0",
+    call$1: function(_) {
+      return this.def_0;
+    },
+    $isFunction: true
+  },
+  closure5: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseDouble(x, new Z._closure(def));
+    },
+    $isFunction: true
+  },
+  _closure: {
+    "^": "Closure:13;def_1",
+    call$1: function(_) {
+      return this.def_1;
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions", "package:polymer_expressions/polymer_expressions.dart", , T, {
+  "^": "",
+  _classAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.where$1$ax(v.get$keys(), new T._classAttributeConverter_closure(v)).join$1(0, " ");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, " ") : v;
+    return t1;
+  }, "call$1", "_classAttributeConverter$closure", 2, 0, 49, 64],
+  _styleAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.map$1$ax(v.get$keys(), new T._styleAttributeConverter_closure(v)).join$1(0, ";");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, ";") : v;
+    return t1;
+  }, "call$1", "_styleAttributeConverter$closure", 2, 0, 49, 64],
+  _identity: [function(x) {
+    return x;
+  }, "call$1", "_identity$closure", 2, 0, 13, 65],
+  _classAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: function(k) {
+      return J.$eq(this.v_0.$index(0, k), true);
+    },
+    $isFunction: true
+  },
+  _styleAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: [function(k) {
+      return H.S(k) + ": " + H.S(this.v_0.$index(0, k));
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions0: {
+    "^": "BindingDelegate;_scopeFactory,globals,_scopes,_scopeIdents,_bindingMaps",
+    prepareBinding$3: function(path, $name, boundNode) {
+      var t1, t2, t3, expr;
+      t1 = {};
+      t2 = new Y.Tokenizer(H.setRuntimeTypeInfo([], [Y.Token]), P.StringBuffer$(""), new P.RuneIterator(path, 0, 0, null), null);
+      t3 = new U.AstFactory();
+      t3 = new T.Parser(t3, t2, null, null);
+      t2 = t2.tokenize$0();
+      t3._tokens = t2;
+      t3._parser$_iterator = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]);
+      t3._advance$0();
+      expr = t3._parseExpression$0();
+      if (M.isSemanticTemplate(boundNode)) {
+        t2 = J.getInterceptor($name);
+        t2 = t2.$eq($name, "bind") || t2.$eq($name, "repeat");
+      } else
+        t2 = false;
+      if (t2) {
+        t1 = J.getInterceptor(expr);
+        if (!!t1.$isHasIdentifier)
+          return new T.PolymerExpressions_prepareBinding_closure(this, expr.get$identifier(), t1.get$expr(expr));
+        else
+          return new T.PolymerExpressions_prepareBinding_closure0(this, expr);
+      }
+      t1.converter_0 = null;
+      t2 = !!J.getInterceptor(boundNode).$isElement;
+      if (t2 && J.$eq($name, "class"))
+        t1.converter_0 = T._classAttributeConverter$closure();
+      else if (t2 && J.$eq($name, "style"))
+        t1.converter_0 = T._styleAttributeConverter$closure();
+      return new T.PolymerExpressions_prepareBinding_closure1(t1, this, expr);
+    },
+    prepareInstanceModel$1: function(template) {
+      var ident = this._scopeIdents.$index(0, template);
+      if (ident == null)
+        return new T.PolymerExpressions_prepareInstanceModel_closure(this, template);
+      return new T.PolymerExpressions_prepareInstanceModel_closure0(this, template, ident);
+    },
+    _getParentScope$1: function(node) {
+      var t1, $parent, templateExtension, templateInstance, model;
+      t1 = J.getInterceptor$x(node);
+      $parent = t1.get$parentNode(node);
+      if ($parent == null)
+        return;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!t1.$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        templateInstance = t1.get$templateInstance(templateExtension);
+        model = templateInstance == null ? t1.get$model(templateExtension) : templateInstance.model;
+        if (!!J.getInterceptor(model).$isScope)
+          return model;
+        else
+          return this._scopes.$index(0, node);
+      }
+      return this._getParentScope$1($parent);
+    },
+    _getScopeForModel$2: function(node, model) {
+      var t1, t2;
+      if (node == null)
+        return K.Scope_Scope(model, this.globals);
+      t1 = J.getInterceptor(node);
+      if (!!t1.$isElement)
+        ;
+      if (!!J.getInterceptor(model).$isScope)
+        return model;
+      t2 = this._scopes;
+      if (t2.$index(0, node) != null) {
+        t2.$index(0, node);
+        return t2.$index(0, node);
+      } else if (t1.get$parentNode(node) != null)
+        return this._getContainingScope$2(t1.get$parentNode(node), model);
+      else {
+        if (!M.isSemanticTemplate(node))
+          throw H.wrapException("expected a template instead of " + H.S(node));
+        return this._getContainingScope$2(node, model);
+      }
+    },
+    _getContainingScope$2: function(node, model) {
+      var templateExtension, t1, scope;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        if (t1.get$templateInstance(templateExtension) == null)
+          t1.get$model(templateExtension);
+        return this._scopes.$index(0, node);
+      } else {
+        t1 = J.getInterceptor$x(node);
+        if (t1.get$parent(node) == null) {
+          scope = this._scopes.$index(0, node);
+          return scope != null ? scope : K.Scope_Scope(model, this.globals);
+        } else
+          return this._getContainingScope$2(t1.get$parentNode(node), model);
+      }
+    },
+    static: {"^": "PolymerExpressions_DEFAULT_GLOBALS", PolymerExpressions$: function(globals, scopeFactory) {
+        var t1, t2, t3;
+        t1 = H.setRuntimeTypeInfo(new P.Expando(null), [K.Scope]);
+        t2 = H.setRuntimeTypeInfo(new P.Expando(null), [P.String]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+        t3.addAll$1(0, C.Map_wgEsG);
+        return new T.PolymerExpressions0(scopeFactory, t3, t1, t2, null);
+      }}
+  },
+  PolymerExpressions_prepareBinding_closure: {
+    "^": "Closure:175;this_1,identifier_2,bindExpr_3",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_1;
+      t1._scopeIdents.$indexSet(0, node, this.identifier_2);
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.bindExpr_3, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure0: {
+    "^": "Closure:175;this_4,expr_5",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_4;
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_5, scope, null);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_5, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure1: {
+    "^": "Closure:175;box_0,this_6,expr_7",
+    call$3: [function(model, node, oneTime) {
+      var scope, t1;
+      scope = this.this_6._getScopeForModel$2(node, model);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_7, scope, this.box_0.converter_0);
+      t1 = this.box_0.converter_0;
+      if (t1 == null)
+        t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_7, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure: {
+    "^": "Closure:13;this_0,template_1",
+    call$1: [function(model) {
+      var t1, t2, existingScope;
+      t1 = this.this_0;
+      t2 = this.template_1;
+      existingScope = t1._scopes.$index(0, t2);
+      if (existingScope != null) {
+        if (J.$eq(model, J.get$model$x(existingScope)))
+          return existingScope;
+        return K.Scope_Scope(model, t1.globals);
+      } else
+        return t1._getScopeForModel$2(t2, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure0: {
+    "^": "Closure:13;this_2,template_3,ident_4",
+    call$1: [function(model) {
+      var t1, t2, existingScope, t3;
+      t1 = this.this_2;
+      t2 = this.template_3;
+      existingScope = t1._scopes.$index(0, t2);
+      t3 = this.ident_4;
+      if (existingScope != null)
+        return existingScope.childScope$2(t3, model);
+      else
+        return t1._getParentScope$1(t2).childScope$2(t3, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  _Binding: {
+    "^": "Bindable;_scope,_converter,_polymer_expressions$_expr,_polymer_expressions$_callback,_polymer_expressions$_sub,_observer,_polymer_expressions$_value",
+    _converter$1: function(arg0) {
+      return this._converter.call$1(arg0);
+    },
+    _polymer_expressions$_callback$1: function(arg0) {
+      return this._polymer_expressions$_callback.call$1(arg0);
+    },
+    _polymer_expressions$_check$2$skipChanges: [function(v, skipChanges) {
+      var oldValue, t1;
+      oldValue = this._polymer_expressions$_value;
+      t1 = this._converter$1(v);
+      this._polymer_expressions$_value = t1;
+      if (skipChanges !== true && this._polymer_expressions$_callback != null && !J.$eq(oldValue, t1))
+        this._polymer_expressions$_callback$1(this._polymer_expressions$_value);
+    }, function(v) {
+      return this._polymer_expressions$_check$2$skipChanges(v, false);
+    }, "_polymer_expressions$_check$1", "call$2$skipChanges", "call$1", "get$_polymer_expressions$_check", 2, 3, 176, 177, 64, 178],
+    get$value: function(_) {
+      if (this._polymer_expressions$_callback != null)
+        return this._polymer_expressions$_value;
+      return T._Binding__oneTime(this._polymer_expressions$_expr, this._scope, this._converter);
+    },
+    set$value: function(_, v) {
+      var newValue, e, s, exception, t1;
+      try {
+        newValue = K.assign(this._polymer_expressions$_expr, v, this._scope, false);
+        this._polymer_expressions$_check$2$skipChanges(newValue, true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._polymer_expressions$_expr) + "': " + H.S(e), s);
+      }
+
+    },
+    open$1: function(_, callback) {
+      var e, s, t1, observer, exception;
+      if (this._polymer_expressions$_callback != null)
+        throw H.wrapException(P.StateError$("already open"));
+      this._polymer_expressions$_callback = callback;
+      t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+      t1.ListQueue$1(null, null);
+      observer = this._polymer_expressions$_expr.accept$1(0, new K.ObserverBuilder(t1));
+      this._observer = observer;
+      t1 = observer.get$onUpdate().listen$1(this.get$_polymer_expressions$_check());
+      t1.onError$1(0, new T._Binding_open_closure(this));
+      this._polymer_expressions$_sub = t1;
+      try {
+        t1 = this._observer;
+        J.accept$1$x(t1, new K.Updater(this._scope));
+        t1.get$currentValue();
+        this._polymer_expressions$_check$2$skipChanges(this._observer.get$currentValue(), true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._observer) + "': " + H.S(e), s);
+      }
+
+      return this._polymer_expressions$_value;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._polymer_expressions$_callback == null)
+        return;
+      this._polymer_expressions$_sub.cancel$0();
+      this._polymer_expressions$_sub = null;
+      this._polymer_expressions$_callback = null;
+      t1 = $.get$Closer__instance();
+      t2 = this._observer;
+      t1.toString;
+      J.accept$1$x(t2, t1);
+      this._observer = null;
+    },
+    static: {_Binding__oneTime: function(expr, scope, converter) {
+        var value, e, s, t1, exception;
+        try {
+          value = J.accept$1$x(expr, new K.EvalVisitor(scope));
+          t1 = converter == null ? value : converter.call$1(value);
+          return t1;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(expr) + "': " + H.S(e), s);
+        }
+
+        return;
+      }}
+  },
+  _Binding_open_closure: {
+    "^": "Closure:75;this_0",
+    call$2: [function(e, s) {
+      H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this.this_0._observer) + "': " + H.S(e), s);
+    }, "call$2", null, 4, 0, null, 1, 142, "call"],
+    $isFunction: true
+  },
+  ScopeFactory: {
+    "^": "Object;"
+  }
+}],
+["polymer_expressions.async", "package:polymer_expressions/async.dart", , B, {
+  "^": "",
+  StreamBinding: {
+    "^": "ObservableBox;stream,_observable_box$_value,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    StreamBinding$1: function(stream, $T) {
+      this.stream.listen$1(new B.StreamBinding_closure($T, this));
+    },
+    $asObservableBox: function($T) {
+      return [null];
+    },
+    static: {StreamBinding$: function(stream, $T) {
+        var t1 = H.setRuntimeTypeInfo(new B.StreamBinding(stream, null, null, null), [$T]);
+        t1.StreamBinding$1(stream, $T);
+        return t1;
+      }}
+  },
+  StreamBinding_closure: {
+    "^": "Closure;T_0,this_1",
+    call$1: [function(i) {
+      var t1 = this.this_1;
+      t1._observable_box$_value = F.notifyPropertyChangeHelper(t1, C.Symbol_value, t1._observable_box$_value, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T0", args: [T]};
+      }, this.this_1, "StreamBinding");
+    }
+  }
+}],
+["polymer_expressions.eval", "package:polymer_expressions/eval.dart", , K, {
+  "^": "",
+  assign: function(expr, value, scope, checkAssignability) {
+    var filters, t1, property, expression, isIndex, filterExpr, o;
+    filters = H.setRuntimeTypeInfo([], [U.Expression]);
+    for (; t1 = J.getInterceptor(expr), !!t1.$isBinaryOperator;) {
+      if (!J.$eq(t1.get$operator(expr), "|"))
+        break;
+      filters.push(t1.get$right(expr));
+      expr = t1.get$left(expr);
+    }
+    if (!!t1.$isIdentifier) {
+      property = t1.get$value(expr);
+      expression = C.C_EmptyExpression;
+      isIndex = false;
+    } else if (!!t1.$isIndex) {
+      expression = expr.get$receiver();
+      property = expr.get$argument();
+      isIndex = true;
+    } else {
+      if (!!t1.$isGetter) {
+        expression = expr.get$receiver();
+        property = t1.get$name(expr);
+      } else {
+        if (checkAssignability)
+          throw H.wrapException(K.EvalException$("Expression is not assignable: " + H.S(expr)));
+        return;
+      }
+      isIndex = false;
+    }
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(filters, filters.length, 0, null), [H.getTypeArgumentByIndex(filters, 0)]); t1.moveNext$0();) {
+      filterExpr = t1._current;
+      J.accept$1$x(filterExpr, new K.EvalVisitor(scope));
+      if (checkAssignability)
+        throw H.wrapException(K.EvalException$("filter must implement Transformer to be assignable: " + H.S(filterExpr)));
+      else
+        return;
+    }
+    o = J.accept$1$x(expression, new K.EvalVisitor(scope));
+    if (o == null)
+      return;
+    if (isIndex)
+      J.$indexSet$ax(o, J.accept$1$x(property, new K.EvalVisitor(scope)), value);
+    else {
+      t1 = $.get$symbolConverter()._symbols.$index(0, property);
+      $.get$objectAccessor().write$3(o, t1, value);
+    }
+    return value;
+  },
+  Scope_Scope: function(model, variables) {
+    var scope, t1, t2;
+    scope = new K._ModelScope(model);
+    if (variables == null)
+      t1 = scope;
+    else {
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      t1.addAll$1(0, variables);
+      t2 = new K._GlobalsScope(scope, t1);
+      if (t1.containsKey$1("this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      t1 = t2;
+    }
+    return t1;
+  },
+  closure14: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$add$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure15: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure16: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mul$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure17: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$div$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure18: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mod$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure19: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure20: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return !J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure21: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b == null : a === b;
+    },
+    $isFunction: true
+  },
+  closure22: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b != null : a !== b;
+    },
+    $isFunction: true
+  },
+  closure23: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$gt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure24: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$ge$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure25: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$lt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure26: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$le$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure27: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true || b === true;
+    },
+    $isFunction: true
+  },
+  closure28: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true && b === true;
+    },
+    $isFunction: true
+  },
+  closure29: {
+    "^": "Closure:75;",
+    call$2: function(a, f) {
+      var t1 = H.buildInterfaceType(P.Object);
+      t1 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+      if (t1)
+        return f.call$1(a);
+      throw H.wrapException(K.EvalException$("Filters must be a one-argument function."));
+    },
+    $isFunction: true
+  },
+  closure11: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a;
+    },
+    $isFunction: true
+  },
+  closure12: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return J.$negate$n(a);
+    },
+    $isFunction: true
+  },
+  closure13: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a !== true;
+    },
+    $isFunction: true
+  },
+  Scope: {
+    "^": "Object;",
+    $indexSet: function(_, $name, value) {
+      throw H.wrapException(P.UnsupportedError$("[]= is not supported in Scope."));
+    },
+    childScope$2: function($name, value) {
+      if (J.$eq($name, "this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      return new K._LocalVariableScope(this, $name, value);
+    },
+    $isScope: true,
+    $isIndexable: true,
+    $asIndexable: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _ModelScope: {
+    "^": "Scope;model>",
+    $index: function(_, $name) {
+      var symbol, t1;
+      if (J.$eq($name, "this"))
+        return this.model;
+      symbol = $.get$symbolConverter()._symbols.$index(0, $name);
+      t1 = this.model;
+      if (t1 == null || symbol == null)
+        throw H.wrapException(K.EvalException$("variable '" + H.S($name) + "' not found"));
+      t1 = $.get$objectAccessor().read$2(t1, symbol);
+      return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+    },
+    _isModelProperty$1: function($name) {
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      return "[model: " + H.S(this.model) + "]";
+    }
+  },
+  _LocalVariableScope: {
+    "^": "Scope;parent>,varName,value>",
+    get$model: function(_) {
+      var t1 = this.parent;
+      t1 = t1.get$model(t1);
+      return t1;
+    },
+    $index: function(_, $name) {
+      var t1;
+      if (J.$eq(this.varName, $name)) {
+        t1 = this.value;
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (J.$eq(this.varName, $name))
+        return false;
+      return this.parent._isModelProperty$1($name);
+    },
+    toString$0: function(_) {
+      return this.parent.toString$0(0) + " > [local: " + H.S(this.varName) + "]";
+    }
+  },
+  _GlobalsScope: {
+    "^": "Scope;parent>,variables<",
+    get$model: function(_) {
+      return this.parent.model;
+    },
+    $index: function(_, $name) {
+      var t1 = this.variables;
+      if (t1.containsKey$1($name)) {
+        t1 = t1.$index(0, $name);
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (this.variables.containsKey$1($name))
+        return false;
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      var t1 = this.variables;
+      return "[model: " + H.S(this.parent.model) + "] > [global: " + P.IterableBase_iterableToShortString(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]), "(", ")") + "]";
+    }
+  },
+  ExpressionObserver: {
+    "^": "Object;_parent?,_eval$_value<",
+    get$onUpdate: function() {
+      var t1 = this._eval$_controller;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$currentValue: function() {
+      return this._eval$_value;
+    },
+    _updateSelf$1: function(scope) {
+    },
+    _invalidate$1: function(scope) {
+      var t1;
+      this._eval$_observe$1(0, scope);
+      t1 = this._parent;
+      if (t1 != null)
+        t1._invalidate$1(scope);
+    },
+    _eval$_unobserve$0: function() {
+      var t1 = this._eval$_subscription;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eval$_subscription = null;
+      }
+    },
+    _eval$_observe$1: function(_, scope) {
+      var _oldValue, t1, t2;
+      this._eval$_unobserve$0();
+      _oldValue = this._eval$_value;
+      this._updateSelf$1(scope);
+      t1 = this._eval$_value;
+      if (t1 == null ? _oldValue != null : t1 !== _oldValue) {
+        t2 = this._eval$_controller;
+        if (t2._state >= 4)
+          H.throwExpression(t2._addEventError$0());
+        t2._sendData$1(t1);
+      }
+    },
+    toString$0: function(_) {
+      return this._eval$_expr.toString$0(0);
+    },
+    $isExpression: true
+  },
+  Updater: {
+    "^": "RecursiveVisitor;scope",
+    visitExpression$1: function(e) {
+      e._eval$_observe$1(0, this.scope);
+    }
+  },
+  Closer: {
+    "^": "RecursiveVisitor;",
+    visitExpression$1: function(e) {
+      e._eval$_unobserve$0();
+    },
+    static: {"^": "Closer__instance"}
+  },
+  EvalVisitor: {
+    "^": "Visitor;scope",
+    visitEmptyExpression$1: function(e) {
+      return J.get$model$x(this.scope);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, t1, symbol;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      if (receiver == null)
+        return;
+      t1 = g.get$name(g);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().read$2(receiver, symbol);
+    },
+    visitIndex$1: function(i) {
+      var receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      return J.$index$asx(receiver, J.accept$1$x(i.get$argument(), this));
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, symbol;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      if (i.get$method(i) == null)
+        return H.Primitives_applyFunction(receiver, args, P.Function__toMangledNames(null));
+      t1 = i.get$method(i);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().invoke$5$adjust$namedArgs(receiver, symbol, args, false, null);
+    },
+    visitLiteral$1: function(l) {
+      return l.get$value(l);
+    },
+    visitListLiteral$1: function(l) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$0(0);
+    },
+    visitMapLiteral$1: function(l) {
+      var map, t1, entry;
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        entry = t1._current;
+        map.$indexSet(0, J.accept$1$x(J.get$key$x(entry), this), J.accept$1$x(entry.get$entryValue(), this));
+      }
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      return H.throwExpression(P.UnsupportedError$("should never be called"));
+    },
+    visitIdentifier$1: function(i) {
+      return J.$index$asx(this.scope, i.get$value(i));
+    },
+    visitBinaryOperator$1: function(o) {
+      var operator, left, right, f, t1;
+      operator = o.get$operator(o);
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      f = $.get$_BINARY_OPERATORS().$index(0, operator);
+      t1 = J.getInterceptor(operator);
+      if (t1.$eq(operator, "&&") || t1.$eq(operator, "||")) {
+        t1 = left == null ? false : left;
+        return f.call$2(t1, right == null ? false : right);
+      } else if (t1.$eq(operator, "==") || t1.$eq(operator, "!="))
+        return f.call$2(left, right);
+      else if (left == null || right == null)
+        return;
+      return f.call$2(left, right);
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, f;
+      expr = J.accept$1$x(o.get$child(), this);
+      f = $.get$_UNARY_OPERATORS().$index(0, o.get$operator(o));
+      if (J.$eq(o.get$operator(o), "!"))
+        return f.call$1(expr == null ? false : expr);
+      return expr == null ? null : f.call$1(expr);
+    },
+    visitTernaryOperator$1: function(o) {
+      return J.$eq(J.accept$1$x(o.get$condition(), this), true) ? J.accept$1$x(o.get$trueExpr(), this) : J.accept$1$x(o.get$falseExpr(), this);
+    },
+    visitInExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder: {
+    "^": "Visitor;parents",
+    visitEmptyExpression$1: function(e) {
+      return new K.EmptyObserver(e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, getter;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      getter = new K.GetterObserver(receiver, g, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(getter);
+      return getter;
+    },
+    visitIndex$1: function(i) {
+      var receiver, arg, index;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      arg = J.accept$1$x(i.get$argument(), this);
+      index = new K.IndexObserver(receiver, arg, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(index);
+      arg.set$_parent(index);
+      return index;
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, invoke;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      invoke = new K.InvokeObserver(receiver, args, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(invoke);
+      if (args != null)
+        H.IterableMixinWorkaround_forEach(args, new K.ObserverBuilder_visitInvoke_closure(invoke));
+      return invoke;
+    },
+    visitLiteral$1: function(l) {
+      return new K.LiteralObserver(l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitListLiteral$1: function(l) {
+      var items, list;
+      items = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      list = new K.ListLiteralObserver(items, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(items, new K.ObserverBuilder_visitListLiteral_closure(list));
+      return list;
+    },
+    visitMapLiteral$1: function(l) {
+      var entries, map;
+      entries = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$entries(l), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      map = new K.MapLiteralObserver(entries, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(entries, new K.ObserverBuilder_visitMapLiteral_closure(map));
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      var key, value, entry;
+      key = J.accept$1$x(e.get$key(e), this);
+      value = J.accept$1$x(e.get$entryValue(), this);
+      entry = new K.MapLiteralEntryObserver(key, value, e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      key.set$_parent(entry);
+      value.set$_parent(entry);
+      return entry;
+    },
+    visitIdentifier$1: function(i) {
+      return new K.IdentifierObserver(i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitBinaryOperator$1: function(o) {
+      var left, right, binary;
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      binary = new K.BinaryObserver(left, right, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      left.set$_parent(binary);
+      right.set$_parent(binary);
+      return binary;
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, unary;
+      expr = J.accept$1$x(o.get$child(), this);
+      unary = new K.UnaryObserver(expr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      expr.set$_parent(unary);
+      return unary;
+    },
+    visitTernaryOperator$1: function(o) {
+      var condition, trueExpr, falseExpr, ternary;
+      condition = J.accept$1$x(o.get$condition(), this);
+      trueExpr = J.accept$1$x(o.get$trueExpr(), this);
+      falseExpr = J.accept$1$x(o.get$falseExpr(), this);
+      ternary = new K.TernaryObserver(condition, trueExpr, falseExpr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      condition.set$_parent(ternary);
+      trueExpr.set$_parent(ternary);
+      falseExpr.set$_parent(ternary);
+      return ternary;
+    },
+    visitInExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder_visitInvoke_closure: {
+    "^": "Closure:13;invoke_0",
+    call$1: function(a) {
+      var t1 = this.invoke_0;
+      a.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitListLiteral_closure: {
+    "^": "Closure:13;list_0",
+    call$1: function(e) {
+      var t1 = this.list_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitMapLiteral_closure: {
+    "^": "Closure:13;map_0",
+    call$1: function(e) {
+      var t1 = this.map_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  EmptyObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = J.get$model$x(scope);
+    },
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.EmptyExpression];
+    },
+    $isEmptyExpression: true,
+    $isExpression: true
+  },
+  LiteralObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1 = this._eval$_expr;
+      this._eval$_value = t1.get$value(t1);
+    },
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Literal];
+    },
+    $asLiteral: function() {
+      return [null];
+    },
+    $isLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver: {
+    "^": "ExpressionObserver;items<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.setRuntimeTypeInfo(new H.MappedListIterable(this.items, new K.ListLiteralObserver__updateSelf_closure()), [null, null]).toList$0(0);
+    },
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.ListLiteral];
+    },
+    $isListLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(i) {
+      return i.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  MapLiteralObserver: {
+    "^": "ExpressionObserver;entries>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.IterableMixinWorkaround_fold(this.entries, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null), new K.MapLiteralObserver__updateSelf_closure());
+    },
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteral];
+    },
+    $isMapLiteral: true,
+    $isExpression: true
+  },
+  MapLiteralObserver__updateSelf_closure: {
+    "^": "Closure:75;",
+    call$2: function(m, e) {
+      J.$indexSet$ax(m, J.get$key$x(e).get$_eval$_value(), e.get$entryValue().get$_eval$_value());
+      return m;
+    },
+    $isFunction: true
+  },
+  MapLiteralEntryObserver: {
+    "^": "ExpressionObserver;key>,entryValue<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteralEntry];
+    },
+    $isMapLiteralEntry: true,
+    $isExpression: true
+  },
+  IdentifierObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, t2, model, symbol;
+      t1 = this._eval$_expr;
+      t2 = J.getInterceptor$asx(scope);
+      this._eval$_value = t2.$index(scope, t1.get$value(t1));
+      if (!scope._isModelProperty$1(t1.get$value(t1)))
+        return;
+      model = t2.get$model(scope);
+      t2 = J.getInterceptor(model);
+      if (!t2.$isObservable)
+        return;
+      t1 = t1.get$value(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_subscription = t2.get$changes(model).listen$1(new K.IdentifierObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Identifier];
+    },
+    $isIdentifier: true,
+    $isExpression: true
+  },
+  IdentifierObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IdentifierObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IdentifierObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  UnaryObserver: {
+    "^": "ExpressionObserver;child<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f;
+      t1 = this._eval$_expr;
+      f = $.get$_UNARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "!")) {
+        t1 = this.child.get$_eval$_value();
+        this._eval$_value = f.call$1(t1 == null ? false : t1);
+      } else {
+        t1 = this.child;
+        this._eval$_value = t1.get$_eval$_value() == null ? null : f.call$1(t1.get$_eval$_value());
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.UnaryOperator];
+    },
+    $isUnaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver: {
+    "^": "ExpressionObserver;left>,right>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f, t2;
+      t1 = this._eval$_expr;
+      f = $.get$_BINARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "&&") || J.$eq(t1.get$operator(t1), "||")) {
+        t1 = this.left.get$_eval$_value();
+        if (t1 == null)
+          t1 = false;
+        t2 = this.right.get$_eval$_value();
+        this._eval$_value = f.call$2(t1, t2 == null ? false : t2);
+      } else if (J.$eq(t1.get$operator(t1), "==") || J.$eq(t1.get$operator(t1), "!="))
+        this._eval$_value = f.call$2(this.left.get$_eval$_value(), this.right.get$_eval$_value());
+      else {
+        t2 = this.left;
+        if (t2.get$_eval$_value() == null || this.right.get$_eval$_value() == null)
+          this._eval$_value = null;
+        else {
+          if (J.$eq(t1.get$operator(t1), "|") && !!J.getInterceptor(t2.get$_eval$_value()).$isObservableList)
+            this._eval$_subscription = H.interceptedTypeCast(t2.get$_eval$_value(), "$isObservableList").get$listChanges().listen$1(new K.BinaryObserver__updateSelf_closure(this, scope));
+          this._eval$_value = f.call$2(t2.get$_eval$_value(), this.right.get$_eval$_value());
+        }
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.BinaryOperator];
+    },
+    $isBinaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1",
+    call$1: [function(_) {
+      return this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  TernaryObserver: {
+    "^": "ExpressionObserver;condition<,trueExpr<,falseExpr<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var t1 = this.condition.get$_eval$_value();
+      this._eval$_value = (t1 == null ? false : t1) === true ? this.trueExpr.get$_eval$_value() : this.falseExpr.get$_eval$_value();
+    },
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.TernaryOperator];
+    },
+    $isTernaryOperator: true,
+    $isExpression: true
+  },
+  GetterObserver: {
+    "^": "ExpressionObserver;receiver<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$name: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$name(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var receiverValue, t1, symbol;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      t1 = t1.get$name(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_value = $.get$objectAccessor().read$2(receiverValue, symbol);
+      t1 = J.getInterceptor(receiverValue);
+      if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.GetterObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Getter];
+    },
+    $isGetter: true,
+    $isExpression: true
+  },
+  GetterObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.GetterObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  GetterObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver: {
+    "^": "ExpressionObserver;receiver<,argument<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var receiverValue, key, t1;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      key = this.argument.get$_eval$_value();
+      t1 = J.getInterceptor$asx(receiverValue);
+      this._eval$_value = t1.$index(receiverValue, key);
+      if (!!t1.$isObservableList)
+        this._eval$_subscription = receiverValue.get$listChanges().listen$1(new K.IndexObserver__updateSelf_closure(this, scope, key));
+      else if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.IndexObserver__updateSelf_closure0(this, scope, key));
+    },
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Index];
+    },
+    $isIndex: true,
+    $isExpression: true
+  },
+  IndexObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,key_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure0(this.key_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure0: {
+    "^": "Closure:13;key_3",
+    call$1: [function(c) {
+      return c.indexChanged$1(this.key_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf_closure0: {
+    "^": "Closure:13;this_4,scope_5,key_6",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure(this.key_6)) === true)
+        this.this_4._invalidate$1(this.scope_5);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure: {
+    "^": "Closure:13;key_7",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isMapChangeRecord && J.$eq(c.key, this.key_7);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  InvokeObserver: {
+    "^": "ExpressionObserver;receiver<,arguments<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$method: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$method(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, args, receiverValue, symbol;
+      t1 = this.arguments;
+      t1.toString;
+      args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, new K.InvokeObserver__updateSelf_closure()), [null, null]).toList$0(0);
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      if (t1.get$method(t1) == null) {
+        t1 = H.Primitives_applyFunction(receiverValue, args, P.Function__toMangledNames(null));
+        this._eval$_value = !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      } else {
+        t1 = t1.get$method(t1);
+        symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+        this._eval$_value = $.get$objectAccessor().invoke$5$adjust$namedArgs(receiverValue, symbol, args, false, null);
+        t1 = J.getInterceptor(receiverValue);
+        if (!!t1.$isObservable)
+          this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.InvokeObserver__updateSelf_closure0(this, scope, symbol));
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Invoke];
+    },
+    $isInvoke: true,
+    $isExpression: true
+  },
+  InvokeObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(a) {
+      return a.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 46, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf_closure0: {
+    "^": "Closure:179;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.InvokeObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  EvalException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "EvalException: " + this.message;
+    },
+    static: {EvalException$: function(message) {
+        return new K.EvalException(message);
+      }}
+  }
+}],
+["polymer_expressions.expression", "package:polymer_expressions/expression.dart", , U, {
+  "^": "",
+  _listEquals: function(a, b) {
+    var i, t1;
+    if (a == null ? b == null : a === b)
+      return true;
+    if (a == null || b == null)
+      return false;
+    if (a.length !== b.length)
+      return false;
+    for (i = 0; i < a.length; ++i) {
+      t1 = a[i];
+      if (i >= b.length)
+        return H.ioore(b, i);
+      if (!J.$eq(t1, b[i]))
+        return false;
+    }
+    return true;
+  },
+  _hashList: function(l) {
+    l.toString;
+    return U._JenkinsSmiHash_finish0(H.IterableMixinWorkaround_fold(l, 0, new U._hashList_closure()));
+  },
+  _JenkinsSmiHash_combine1: function(hash, value) {
+    var t1 = J.$add$ns(hash, value);
+    if (typeof t1 !== "number")
+      return H.iae(t1);
+    hash = 536870911 & t1;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish0: function(hash) {
+    if (typeof hash !== "number")
+      return H.iae(hash);
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash = (hash ^ hash >>> 11) >>> 0;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  AstFactory: {
+    "^": "Object;",
+    index$2: [function(_, e, a) {
+      return new U.Index(e, a);
+    }, "call$2", "get$index", 4, 0, 180, 1, 46]
+  },
+  Expression: {
+    "^": "Object;",
+    $isExpression: true
+  },
+  EmptyExpression: {
+    "^": "Expression;",
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $isEmptyExpression: true
+  },
+  Literal: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    toString$0: function(_) {
+      var t1 = this.value;
+      return typeof t1 === "string" ? "\"" + H.S(t1) + "\"" : H.S(t1);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = H.checkSubtype(o, "$isLiteral", [H.getTypeArgumentByIndex(this, 0)], "$asLiteral");
+      return t1 && J.$eq(J.get$value$x(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isLiteral: true
+  },
+  ListLiteral: {
+    "^": "Expression;items<",
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.items);
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isListLiteral && U._listEquals(o.get$items(), this.items);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.items);
+    },
+    $isListLiteral: true
+  },
+  MapLiteral: {
+    "^": "Expression;entries>",
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return "{" + H.S(this.entries) + "}";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteral && U._listEquals(t1.get$entries(o), this.entries);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.entries);
+    },
+    $isMapLiteral: true
+  },
+  MapLiteralEntry: {
+    "^": "Expression;key>,entryValue<",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    toString$0: function(_) {
+      return this.key.toString$0(0) + ": " + H.S(this.entryValue);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteralEntry && J.$eq(t1.get$key(o), this.key) && J.$eq(o.get$entryValue(), this.entryValue);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.key.value);
+      t2 = J.get$hashCode$(this.entryValue);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isMapLiteralEntry: true
+  },
+  ParenthesizedExpression: {
+    "^": "Expression;child",
+    accept$1: function(_, v) {
+      return v.visitParenthesizedExpression$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.child) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isParenthesizedExpression && J.$eq(o.child, this.child);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.child);
+    },
+    $isParenthesizedExpression: true
+  },
+  Identifier: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    toString$0: function(_) {
+      return this.value;
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isIdentifier && J.$eq(t1.get$value(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isIdentifier: true
+  },
+  UnaryOperator: {
+    "^": "Expression;operator>,child<",
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.operator) + " " + H.S(this.child);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isUnaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(o.get$child(), this.child);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.child);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isUnaryOperator: true
+  },
+  BinaryOperator: {
+    "^": "Expression;operator>,left>,right>",
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " " + H.S(this.operator) + " " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isBinaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(t1.get$left(o), this.left) && J.$eq(t1.get$right(o), this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.left);
+      t3 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isBinaryOperator: true
+  },
+  TernaryOperator: {
+    "^": "Expression;condition<,trueExpr<,falseExpr<",
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.condition) + " ? " + H.S(this.trueExpr) + " : " + H.S(this.falseExpr) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isTernaryOperator && J.$eq(o.get$condition(), this.condition) && J.$eq(o.get$trueExpr(), this.trueExpr) && J.$eq(o.get$falseExpr(), this.falseExpr);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.condition);
+      t2 = J.get$hashCode$(this.trueExpr);
+      t3 = J.get$hashCode$(this.falseExpr);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isTernaryOperator: true
+  },
+  InExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitInExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.left;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.right;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " in " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isInExpression && o.left.$eq(0, this.left) && J.$eq(o.right, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = this.left;
+      t1 = t1.get$hashCode(t1);
+      t2 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isInExpression: true,
+    $isHasIdentifier: true
+  },
+  AsExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitAsExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.right;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.left;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " as " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isAsExpression && J.$eq(o.left, this.left) && o.right.$eq(0, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.left);
+      t2 = this.right;
+      t2 = t2.get$hashCode(t2);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isAsExpression: true,
+    $isHasIdentifier: true
+  },
+  Index: {
+    "^": "Expression;receiver<,argument<",
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "[" + H.S(this.argument) + "]";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndex && J.$eq(o.get$receiver(), this.receiver) && J.$eq(o.get$argument(), this.argument);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.argument);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isIndex: true
+  },
+  Getter: {
+    "^": "Expression;receiver<,name>",
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.name);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isGetter && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$name(o), this.name);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.name);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isGetter: true
+  },
+  Invoke: {
+    "^": "Expression;receiver<,method>,arguments<",
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.method) + "(" + H.S(this.arguments) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isInvoke && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$method(o), this.method) && U._listEquals(o.get$arguments(), this.arguments);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.method);
+      t3 = U._hashList(this.arguments);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isInvoke: true
+  },
+  _hashList_closure: {
+    "^": "Closure:75;",
+    call$2: function(h, item) {
+      return U._JenkinsSmiHash_combine1(h, J.get$hashCode$(item));
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions.parser", "package:polymer_expressions/parser.dart", , T, {
+  "^": "",
+  Parser: {
+    "^": "Object;_astFactory,_tokenizer,_tokens,_parser$_iterator",
+    get$_token: function() {
+      return this._parser$_iterator._current;
+    },
+    _advance$2: function(kind, value) {
+      var t1;
+      if (kind != null) {
+        t1 = this._parser$_iterator._current;
+        t1 = t1 == null || !J.$eq(J.get$kind$x(t1), kind);
+      } else
+        t1 = false;
+      if (!t1)
+        if (value != null) {
+          t1 = this._parser$_iterator._current;
+          t1 = t1 == null || !J.$eq(J.get$value$x(t1), value);
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(Y.ParseException$("Expected kind " + H.S(kind) + " (" + H.S(value) + "): " + H.S(this.get$_token())));
+      this._parser$_iterator.moveNext$0();
+    },
+    _advance$0: function() {
+      return this._advance$2(null, null);
+    },
+    _advance$1: function(kind) {
+      return this._advance$2(kind, null);
+    },
+    _parseExpression$0: function() {
+      if (this._parser$_iterator._current == null) {
+        this._astFactory.toString;
+        return C.C_EmptyExpression;
+      }
+      var expr = this._parseUnary$0();
+      return expr == null ? null : this._parsePrecedence$2(expr, 0);
+    },
+    _parsePrecedence$2: function(left, precedence) {
+      var t1, args, indexExpr, right, trueExpr, falseExpr;
+      for (; t1 = this._parser$_iterator._current, t1 != null;)
+        if (J.$eq(J.get$kind$x(t1), 9))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            args = this._parseArguments$0();
+            this._astFactory.toString;
+            left = new U.Invoke(left, null, args);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+            indexExpr = this._parseIndex$0();
+            this._astFactory.toString;
+            left = new U.Index(left, indexExpr);
+          } else
+            break;
+        else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 3)) {
+          this._advance$0();
+          left = this._makeInvokeOrGetter$2(left, this._parseUnary$0());
+        } else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 10))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "in")) {
+            if (!J.getInterceptor(left).$isIdentifier)
+              H.throwExpression(Y.ParseException$("in... statements must start with an identifier"));
+            this._advance$0();
+            right = this._parseExpression$0();
+            this._astFactory.toString;
+            left = new U.InExpression(left, right);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "as")) {
+            this._advance$0();
+            right = this._parseExpression$0();
+            if (!J.getInterceptor(right).$isIdentifier)
+              H.throwExpression(Y.ParseException$("'as' statements must end with an identifier"));
+            this._astFactory.toString;
+            left = new U.AsExpression(left, right);
+          } else
+            break;
+        else {
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+            t1 = this._parser$_iterator._current.get$precedence();
+            if (typeof t1 !== "number")
+              return t1.$ge();
+            if (typeof precedence !== "number")
+              return H.iae(precedence);
+            t1 = t1 >= precedence;
+          } else
+            t1 = false;
+          if (t1)
+            if (J.$eq(J.get$value$x(this._parser$_iterator._current), "?")) {
+              this._advance$2(8, "?");
+              trueExpr = this._parseExpression$0();
+              this._advance$1(5);
+              falseExpr = this._parseExpression$0();
+              this._astFactory.toString;
+              left = new U.TernaryOperator(left, trueExpr, falseExpr);
+            } else
+              left = this._parseBinary$1(left);
+          else
+            break;
+        }
+      return left;
+    },
+    _makeInvokeOrGetter$2: function(left, right) {
+      var t1, t2;
+      t1 = J.getInterceptor(right);
+      if (!!t1.$isIdentifier) {
+        t1 = t1.get$value(right);
+        this._astFactory.toString;
+        return new U.Getter(left, t1);
+      } else if (!!t1.$isInvoke && !!J.getInterceptor(right.get$receiver()).$isIdentifier) {
+        t1 = J.get$value$x(right.get$receiver());
+        t2 = right.get$arguments();
+        this._astFactory.toString;
+        return new U.Invoke(left, t1, t2);
+      } else
+        throw H.wrapException(Y.ParseException$("expected identifier: " + H.S(right)));
+    },
+    _parseBinary$1: function(left) {
+      var op, t1, right, t2, t3;
+      op = this._parser$_iterator._current;
+      t1 = J.getInterceptor$x(op);
+      if (!C.JSArray_methods.contains$1(C.List_EuK, t1.get$value(op)))
+        throw H.wrapException(Y.ParseException$("unknown operator: " + H.S(t1.get$value(op))));
+      this._advance$0();
+      right = this._parseUnary$0();
+      while (true) {
+        t2 = this._parser$_iterator._current;
+        if (t2 != null)
+          if (J.$eq(J.get$kind$x(t2), 8) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 3) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 9)) {
+            t2 = this._parser$_iterator._current.get$precedence();
+            t3 = op.get$precedence();
+            if (typeof t2 !== "number")
+              return t2.$gt();
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            t3 = t2 > t3;
+            t2 = t3;
+          } else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        right = this._parsePrecedence$2(right, this._parser$_iterator._current.get$precedence());
+      }
+      t1 = t1.get$value(op);
+      this._astFactory.toString;
+      return new U.BinaryOperator(t1, left, right);
+    },
+    _parseUnary$0: function() {
+      var value, t1, t2, expr;
+      if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+        value = J.get$value$x(this._parser$_iterator._current);
+        t1 = J.getInterceptor(value);
+        if (t1.$eq(value, "+") || t1.$eq(value, "-")) {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 6)) {
+            t1 = H.Primitives_parseInt(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+            this._astFactory.toString;
+            value = new U.Literal(t1);
+            value.$builtinTypeInfo = [null];
+            this._advance$0();
+            return value;
+          } else {
+            t1 = this._astFactory;
+            if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 7)) {
+              t2 = H.Primitives_parseDouble(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+              t1.toString;
+              value = new U.Literal(t2);
+              value.$builtinTypeInfo = [null];
+              this._advance$0();
+              return value;
+            } else {
+              expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+              t1.toString;
+              return new U.UnaryOperator(value, expr);
+            }
+          }
+        } else if (t1.$eq(value, "!")) {
+          this._advance$0();
+          expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+          this._astFactory.toString;
+          return new U.UnaryOperator(value, expr);
+        } else
+          throw H.wrapException(Y.ParseException$("unexpected token: " + H.S(value)));
+      }
+      return this._parsePrimary$0();
+    },
+    _parsePrimary$0: function() {
+      var keyword, expr;
+      switch (J.get$kind$x(this._parser$_iterator._current)) {
+        case 10:
+          keyword = J.get$value$x(this._parser$_iterator._current);
+          if (J.$eq(keyword, "this")) {
+            this._advance$0();
+            this._astFactory.toString;
+            return new U.Identifier("this");
+          } else if (C.JSArray_methods.contains$1(C.List_as_in_this, keyword))
+            throw H.wrapException(Y.ParseException$("unexpected keyword: " + H.S(keyword)));
+          throw H.wrapException(Y.ParseException$("unrecognized keyword: " + H.S(keyword)));
+        case 2:
+          return this._parseInvokeOrIdentifier$0();
+        case 1:
+          return this._parseString$0();
+        case 6:
+          return this._parseInteger$0();
+        case 7:
+          return this._parseDecimal$0();
+        case 9:
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            this._advance$0();
+            expr = this._parseExpression$0();
+            this._advance$2(9, ")");
+            this._astFactory.toString;
+            return new U.ParenthesizedExpression(expr);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "{"))
+            return this._parseMapLiteral$0();
+          else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "["))
+            return this._parseListLiteral$0();
+          return;
+        case 5:
+          throw H.wrapException(Y.ParseException$("unexpected token \":\""));
+        default:
+          return;
+      }
+    },
+    _parseListLiteral$0: function() {
+      var items, t1;
+      items = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "]"))
+          break;
+        items.push(this._parseExpression$0());
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "]");
+      return new U.ListLiteral(items);
+    },
+    _parseMapLiteral$0: function() {
+      var entries, t1, value;
+      entries = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "}"))
+          break;
+        t1 = J.get$value$x(this._parser$_iterator._current);
+        this._astFactory.toString;
+        value = new U.Literal(t1);
+        value.$builtinTypeInfo = [null];
+        this._advance$0();
+        this._advance$2(5, ":");
+        entries.push(new U.MapLiteralEntry(value, this._parseExpression$0()));
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "}");
+      return new U.MapLiteral(entries);
+    },
+    _parseInvokeOrIdentifier$0: function() {
+      var value, identifier, args;
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "true")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(true), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "false")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(false), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "null")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(null), [null]);
+      }
+      if (!J.$eq(J.get$kind$x(this._parser$_iterator._current), 2))
+        H.throwExpression(Y.ParseException$("expected identifier: " + H.S(this.get$_token()) + ".value"));
+      value = J.get$value$x(this._parser$_iterator._current);
+      this._advance$0();
+      this._astFactory.toString;
+      identifier = new U.Identifier(value);
+      args = this._parseArguments$0();
+      if (args == null)
+        return identifier;
+      else
+        return new U.Invoke(identifier, null, args);
+    },
+    _parseArguments$0: function() {
+      var t1, args;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+        args = [];
+        do {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), ")"))
+            break;
+          args.push(this._parseExpression$0());
+          t1 = this._parser$_iterator._current;
+        } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+        this._advance$2(9, ")");
+        return args;
+      }
+      return;
+    },
+    _parseIndex$0: function() {
+      var t1, expr;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+        this._advance$0();
+        expr = this._parseExpression$0();
+        this._advance$2(9, "]");
+        return expr;
+      }
+      return;
+    },
+    _parseString$0: function() {
+      var t1, value;
+      t1 = J.get$value$x(this._parser$_iterator._current);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseInt(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$0: function() {
+      return this._parseInteger$1("");
+    },
+    _parseDecimal$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseDouble(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseDecimal$0: function() {
+      return this._parseDecimal$1("");
+    }
+  }
+}],
+["polymer_expressions.src.globals", "package:polymer_expressions/src/globals.dart", , K, {
+  "^": "",
+  enumerate: [function(iterable) {
+    return H.setRuntimeTypeInfo(new K.EnumerateIterable(iterable), [null]);
+  }, "call$1", "enumerate$closure", 2, 0, 66, 67],
+  IndexedValue: {
+    "^": "Object;index>,value>",
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndexedValue && J.$eq(o.index, this.index) && J.$eq(o.value, this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.index) + ", " + H.S(this.value) + ")";
+    },
+    $isIndexedValue: true
+  },
+  EnumerateIterable: {
+    "^": "IterableBase;_globals$_iterable",
+    get$iterator: function(_) {
+      var t1 = new K.EnumerateIterator(J.get$iterator$ax(this._globals$_iterable), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._globals$_iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._globals$_iterable);
+    },
+    get$last: function(_) {
+      var t1, t2;
+      t1 = this._globals$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      t1 = new K.IndexedValue(J.$sub$n(t2.get$length(t1), 1), t2.get$last(t1));
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($V) {
+      return [[K.IndexedValue, $V]];
+    },
+    $asIterable: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  },
+  EnumerateIterator: {
+    "^": "Iterator;_globals$_iterator,_globals$_index,_globals$_current",
+    get$current: function() {
+      return this._globals$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._globals$_iterator;
+      if (t1.moveNext$0()) {
+        this._globals$_current = H.setRuntimeTypeInfo(new K.IndexedValue(this._globals$_index++, t1.get$current()), [null]);
+        return true;
+      }
+      this._globals$_current = null;
+      return false;
+    },
+    $asIterator: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  }
+}],
+["polymer_expressions.tokenizer", "package:polymer_expressions/tokenizer.dart", , Y, {
+  "^": "",
+  escape: function(c) {
+    switch (c) {
+      case 102:
+        return 12;
+      case 110:
+        return 10;
+      case 114:
+        return 13;
+      case 116:
+        return 9;
+      case 118:
+        return 11;
+      default:
+        return c;
+    }
+  },
+  Token: {
+    "^": "Object;kind>,value>,precedence<",
+    toString$0: function(_) {
+      return "(" + this.kind + ", '" + this.value + "')";
+    },
+    $isToken: true
+  },
+  Tokenizer: {
+    "^": "Object;_tokenizer$_tokens,_sb,_tokenizer$_iterator,_tokenizer$_next",
+    tokenize$0: function() {
+      var t1, t2, t3, t4, startChar, op2, op, value;
+      t1 = this._tokenizer$_iterator;
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      for (t2 = this._tokenizer$_tokens; t3 = this._tokenizer$_next, t3 != null;)
+        if (t3 === 32 || t3 === 9 || t3 === 160)
+          this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        else if (t3 === 34 || t3 === 39)
+          this.tokenizeString$0();
+        else {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            t4 = 65 <= t3 && t3 <= 90 || t3 === 95 || t3 === 36 || t3 > 127;
+          else
+            t4 = true;
+          if (t4)
+            this.tokenizeIdentifierOrKeyword$0();
+          else if (48 <= t3 && t3 <= 57)
+            this.tokenizeNumber$0();
+          else if (t3 === 46) {
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (48 <= t3 && t3 <= 57)
+              this.tokenizeFraction$0();
+            else
+              t2.push(new Y.Token(3, ".", 11));
+          } else if (t3 === 44) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(4, ",", 0));
+          } else if (t3 === 58) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(5, ":", 0));
+          } else if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+            startChar = this._tokenizer$_next;
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+              t3 = this._tokenizer$_next;
+              op2 = H.Primitives_stringFromCharCodes([startChar, t3]);
+              if (C.JSArray_methods.contains$1(C.List_Ynd, op2)) {
+                t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+                this._tokenizer$_next = t3;
+                if (t3 === 61)
+                  t3 = startChar === 33 || startChar === 61;
+                else
+                  t3 = false;
+                if (t3) {
+                  op = op2 + "=";
+                  this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+                } else
+                  op = op2;
+              } else
+                op = H.Primitives_stringFromCharCode(startChar);
+            } else
+              op = H.Primitives_stringFromCharCode(startChar);
+            t2.push(new Y.Token(8, op, C.Map_L0K61.$index(0, op)));
+          } else if (C.JSArray_methods.contains$1(C.List_ww8, this._tokenizer$_next)) {
+            value = H.Primitives_stringFromCharCode(this._tokenizer$_next);
+            t2.push(new Y.Token(9, value, C.Map_L0K61.$index(0, value)));
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+          } else
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        }
+      return t2;
+    },
+    tokenizeString$0: function() {
+      var quoteChar, t1, t2, t3;
+      quoteChar = this._tokenizer$_next;
+      t1 = this._tokenizer$_iterator;
+      t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+      this._tokenizer$_next = t2;
+      for (t3 = this._sb; t2 == null ? quoteChar != null : t2 !== quoteChar;) {
+        if (t2 == null)
+          throw H.wrapException(Y.ParseException$("unterminated string"));
+        if (t2 === 92) {
+          t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+          this._tokenizer$_next = t2;
+          if (t2 == null)
+            throw H.wrapException(Y.ParseException$("unterminated string"));
+          t2 = H.Primitives_stringFromCharCode(Y.escape(t2));
+          t3._contents += t2;
+        } else {
+          t2 = H.Primitives_stringFromCharCode(t2);
+          t3._contents += t2;
+        }
+        t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t2;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(1, t3._contents, 0));
+      t3._contents = "";
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+    },
+    tokenizeIdentifierOrKeyword$0: function() {
+      var t1, t2, t3, t4, value;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            if (!(65 <= t3 && t3 <= 90))
+              t4 = 48 <= t3 && t3 <= 57 || t3 === 95 || t3 === 36 || t3 > 127;
+            else
+              t4 = true;
+          else
+            t4 = true;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      value = t2._contents;
+      t1 = this._tokenizer$_tokens;
+      if (C.JSArray_methods.contains$1(C.List_as_in_this, value))
+        t1.push(new Y.Token(10, value, 0));
+      else
+        t1.push(new Y.Token(2, value, 0));
+      t2._contents = "";
+    },
+    tokenizeNumber$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      if (t3 === 46) {
+        t1 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t1;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (48 <= t1 && t1 <= 57)
+          this.tokenizeFraction$0();
+        else
+          this._tokenizer$_tokens.push(new Y.Token(3, ".", 11));
+      } else {
+        this._tokenizer$_tokens.push(new Y.Token(6, t2._contents, 0));
+        t2._contents = "";
+      }
+    },
+    tokenizeFraction$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._sb;
+      t1.write$1(H.Primitives_stringFromCharCode(46));
+      t2 = this._tokenizer$_iterator;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t1._contents += t3;
+        this._tokenizer$_next = t2.moveNext$0() ? t2._currentCodePoint : null;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(7, t1._contents, 0));
+      t1._contents = "";
+    }
+  },
+  ParseException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "ParseException: " + this.message;
+    },
+    static: {ParseException$: function(message) {
+        return new Y.ParseException(message);
+      }}
+  }
+}],
+["polymer_expressions.visitor", "package:polymer_expressions/visitor.dart", , S, {
+  "^": "",
+  Visitor: {
+    "^": "Object;",
+    visit$1: [function(s) {
+      return J.accept$1$x(s, this);
+    }, "call$1", "get$visit", 2, 0, 181, 142]
+  },
+  RecursiveVisitor: {
+    "^": "Visitor;",
+    visitExpression$1: function(e) {
+    },
+    visitEmptyExpression$1: function(e) {
+      this.visitExpression$1(e);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      e.child.accept$1(0, this);
+      this.visitExpression$1(e);
+    },
+    visitGetter$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      this.visitExpression$1(i);
+    },
+    visitIndex$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      J.accept$1$x(i.get$argument(), this);
+      this.visitExpression$1(i);
+    },
+    visitInvoke$1: function(i) {
+      var t1;
+      J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() != null)
+        for (t1 = i.get$arguments(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.accept$1$x(t1._current, this);
+      this.visitExpression$1(i);
+    },
+    visitLiteral$1: function(l) {
+      this.visitExpression$1(l);
+    },
+    visitListLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$items(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteralEntry$1: function(e) {
+      J.accept$1$x(e.get$key(e), this);
+      J.accept$1$x(e.get$entryValue(), this);
+      this.visitExpression$1(e);
+    },
+    visitIdentifier$1: function(i) {
+      this.visitExpression$1(i);
+    },
+    visitBinaryOperator$1: function(o) {
+      J.accept$1$x(o.get$left(o), this);
+      J.accept$1$x(o.get$right(o), this);
+      this.visitExpression$1(o);
+    },
+    visitUnaryOperator$1: function(o) {
+      J.accept$1$x(o.get$child(), this);
+      this.visitExpression$1(o);
+    },
+    visitTernaryOperator$1: function(o) {
+      J.accept$1$x(o.get$condition(), this);
+      J.accept$1$x(o.get$trueExpr(), this);
+      J.accept$1$x(o.get$falseExpr(), this);
+      this.visitExpression$1(o);
+    },
+    visitInExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    },
+    visitAsExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    }
+  }
+}],
+["script_inset_element", "package:observatory/src/elements/script_inset.dart", , T, {
+  "^": "",
+  ScriptInsetElement: {
+    "^": "ObservatoryElement_ChangeNotifier43;_script_inset_element$__$script,_script_inset_element$__$pos,_script_inset_element$__$endPos,lineNumbers=,_script_inset_element$__$startLine,_script_inset_element$__$endLine,_script_inset_element$__$lines,_updateFuture,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_inset_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_inset_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_inset_element$__$script, value);
+    },
+    get$pos: function(receiver) {
+      return receiver._script_inset_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_inset_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_inset_element$__$pos, value);
+    },
+    get$endPos: function(receiver) {
+      return receiver._script_inset_element$__$endPos;
+    },
+    set$endPos: function(receiver, value) {
+      receiver._script_inset_element$__$endPos = this.notifyPropertyChange$3(receiver, C.Symbol_endPos, receiver._script_inset_element$__$endPos, value);
+    },
+    get$startLine: function(receiver) {
+      return receiver._script_inset_element$__$startLine;
+    },
+    set$startLine: function(receiver, value) {
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, value);
+    },
+    get$endLine: function(receiver) {
+      return receiver._script_inset_element$__$endLine;
+    },
+    set$endLine: function(receiver, value) {
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, value);
+    },
+    get$lines: function(receiver) {
+      return receiver._script_inset_element$__$lines;
+    },
+    set$lines: function(receiver, value) {
+      receiver._script_inset_element$__$lines = this.notifyPropertyChange$3(receiver, C.Symbol_lines, receiver._script_inset_element$__$lines, value);
+    },
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+    },
+    scriptChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$scriptChanged", 2, 0, 20, 57],
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    endPosChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$endPosChanged", 2, 0, 20, 57],
+    styleForHits$1: [function(receiver, hits) {
+      if (hits == null)
+        return "min-width:32px;";
+      else if (J.$eq(hits, 0))
+        return "min-width:32px; background-color:red";
+      return "min-width:32px; background-color:green";
+    }, "call$1", "get$styleForHits", 2, 0, 15, 182],
+    _updateLines$0: function(receiver) {
+      var t1, t2, i;
+      if (receiver._updateFuture != null)
+        return;
+      if (J.get$loaded$x(receiver._script_inset_element$__$script) !== true) {
+        receiver._updateFuture = J.load$0$x(receiver._script_inset_element$__$script).then$1(new T.ScriptInsetElement__updateLines_closure(receiver));
+        return;
+      }
+      t1 = receiver._script_inset_element$__$pos;
+      t1 = t1 != null ? J.$sub$n(receiver._script_inset_element$__$script.tokenToLine$1(t1), 1) : 0;
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, t1);
+      t1 = receiver._script_inset_element$__$endPos;
+      t2 = receiver._script_inset_element$__$script;
+      t1 = t1 != null ? t2.tokenToLine$1(t1) : J.get$length$asx(J.get$lines$x(t2));
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, t1);
+      t1 = receiver.lineNumbers;
+      t1.clear$0(t1);
+      for (i = receiver._script_inset_element$__$startLine; t2 = J.getInterceptor$n(i), t2.$lt(i, receiver._script_inset_element$__$endLine); i = t2.$add(i, 1))
+        t1.add$1(0, i);
+    },
+    static: {"^": "ScriptInsetElement_hitStyleNone,ScriptInsetElement_hitStyleExecuted,ScriptInsetElement_hitStyleNotExecuted", ScriptInsetElement$created: function(receiver) {
+        var t1, t2, t3, t4;
+        t1 = Q.ObservableList$(null, P.$int);
+        t2 = R._toObservableDeep([]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t4 = P.String;
+        t4 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t4, null), null, null), [t4, null]);
+        receiver.lineNumbers = t1;
+        receiver._script_inset_element$__$lines = t2;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t3;
+        receiver.polymer$Polymer$$ = t4;
+        C.ScriptInsetElement_methods.Element$created$0(receiver);
+        C.ScriptInsetElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier43: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptInsetElement__updateLines_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (J.get$loaded$x(t1._script_inset_element$__$script) === true) {
+        t1._updateFuture = null;
+        J._updateLines$0$x(t1);
+      }
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["script_ref_element", "package:observatory/src/elements/script_ref.dart", , A, {
+  "^": "",
+  ScriptRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier1;_script_ref_element$__$pos,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pos: function(receiver) {
+      return receiver._script_ref_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_ref_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_ref_element$__$pos, value);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+      return t1.get$vmName();
+    },
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateProperties$1(receiver, null);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    _updateProperties$1: [function(receiver, _) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null && J.get$loaded$x(t1) === true) {
+        this.notifyPropertyChange$3(receiver, C.Symbol_name, 0, 1);
+        this.notifyPropertyChange$3(receiver, C.Symbol_url, 0, 1);
+      }
+    }, "call$1", "get$_updateProperties", 2, 0, 20, 14],
+    get$name: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return H.S(Q.ServiceRefElement.prototype.get$name.call(this, receiver)) + ":" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+    },
+    get$url: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return Q.ServiceRefElement.prototype.get$url.call(this, receiver) + "#line=" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+    },
+    static: {ScriptRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._script_ref_element$__$pos = -1;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptRefElement_methods.Element$created$0(receiver);
+        C.ScriptRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier1: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["script_view_element", "package:observatory/src/elements/script_view.dart", , U, {
+  "^": "",
+  ScriptViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier44;_script_view_element$__$script,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_view_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_view_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_view_element$__$script, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._script_view_element$__$script;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._script_view_element$__$script).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshCoverage$1: [function(receiver, done) {
+      J.refreshCoverage$0$x(J.get$isolate$x(receiver._script_view_element$__$script)).whenComplete$1(done);
+    }, "call$1", "get$refreshCoverage", 2, 0, 20, 89],
+    static: {ScriptViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptViewElement_methods.Element$created$0(receiver);
+        C.ScriptViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier44: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service", "package:observatory/service.dart", , D, {
+  "^": "",
+  ServiceObject_ServiceObject$_fromMap: function(owner, map) {
+    var t1, type, t2, t3, t4, t5, t6, obj, t7;
+    if (map == null)
+      return;
+    t1 = J.getInterceptor$asx(map);
+    t1 = t1.$index(map, "id") != null && t1.$index(map, "type") != null;
+    if (!t1)
+      N.Logger_Logger("").severe$1("Malformed service object: " + H.S(map));
+    type = J.$index$asx(map, "type");
+    t1 = J.getInterceptor$s(type);
+    switch (t1.startsWith$1(type, "@") ? t1.substring$1(type, 1) : type) {
+      case "Class":
+        t1 = D.Class;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Class(null, null, null, null, null, null, null, null, null, null, new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Code":
+        t1 = [];
+        t1.$builtinTypeInfo = [D.CodeCallCount];
+        t2 = [];
+        t2.$builtinTypeInfo = [D.CodeCallCount];
+        t3 = D.CodeInstruction;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t3 = P.$int;
+        t5 = D.CodeTick;
+        t6 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, t5), null, null);
+        t6.$builtinTypeInfo = [t3, t5];
+        obj = new D.Code(null, 0, 0, 0, 0, 0, t1, t2, t4, t6, "", "", null, null, null, false, null, null, false, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Error":
+        obj = new D.DartError(null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Isolate":
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject);
+        t3 = [];
+        t3.$builtinTypeInfo = [P.String];
+        t4 = [];
+        t4.$builtinTypeInfo = [D.TagProfileSnapshot];
+        t5 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t5];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t5];
+        t5 = D.Library;
+        t7 = [];
+        t7.$builtinTypeInfo = [t5];
+        t7 = new Q.ObservableList(null, null, t7, null, null);
+        t7.$builtinTypeInfo = [t5];
+        t5 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.$double);
+        t5 = R._toObservableDeep(t5);
+        obj = new D.Isolate(t1, null, false, false, true, false, t2, new D.TagProfile(t3, t4, null, null, 20, 0), null, t6, null, t7, null, null, null, null, null, t5, new D.HeapSpace(0, 0, 0, 0, 0, null, null), new D.HeapSpace(0, 0, 0, 0, 0, null, null), null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Library":
+        t1 = D.Library;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Script;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Library(null, t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceError":
+        obj = new D.ServiceError(null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceException":
+        obj = new D.ServiceException(null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Script":
+        t1 = D.ScriptLine;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        obj = new D.Script(t2, P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, P.$int), null, null, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Socket":
+        obj = new D.Socket(null, null, null, null, "", false, false, false, false, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      default:
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        obj = new D.ServiceMap(t1, owner, null, null, false, null, null, null, null, null);
+    }
+    obj.update$1(map);
+    return obj;
+  },
+  _isServiceMap: function(m) {
+    var t1;
+    if (m != null) {
+      t1 = J.getInterceptor$asx(m);
+      t1 = t1.$index(m, "id") != null && t1.$index(m, "type") != null;
+    } else
+      t1 = false;
+    return t1;
+  },
+  _upgradeCollection: function(collection, owner) {
+    var t1 = J.getInterceptor(collection);
+    if (!!t1.$isServiceMap)
+      return;
+    if (!!t1.$isObservableMap)
+      D._upgradeObservableMap(collection, owner);
+    else if (!!t1.$isObservableList)
+      D._upgradeObservableList(collection, owner);
+  },
+  _upgradeObservableMap: function(map, owner) {
+    map.forEach$1(0, new D._upgradeObservableMap_closure(map, owner));
+  },
+  _upgradeObservableList: function(list, owner) {
+    var t1, i, v, t2, t3, t4;
+    for (t1 = list._observable_list$_list, i = 0; i < t1.length; ++i) {
+      v = t1[i];
+      t2 = J.getInterceptor(v);
+      t3 = !!t2.$isObservableMap;
+      if (t3)
+        t4 = t2.$index(v, "id") != null && t2.$index(v, "type") != null;
+      else
+        t4 = false;
+      if (t4)
+        list.$indexSet(0, i, owner.getFromMap$1(v));
+      else if (!!t2.$isObservableList)
+        D._upgradeObservableList(v, owner);
+      else if (t3)
+        D._upgradeObservableMap(v, owner);
+    }
+  },
+  ServiceObject: {
+    "^": "ChangeNotifier;_service$__$name@,_service$__$vmName@",
+    get$vm: function(_) {
+      var t1 = this._owner;
+      return t1.get$vm(t1);
+    },
+    get$isolate: function(_) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1);
+    },
+    get$id: function(_) {
+      return this._id;
+    },
+    get$serviceType: function() {
+      return this._serviceType;
+    },
+    get$link: function(_) {
+      return this._owner.relativeLink$1(this._id);
+    },
+    get$loaded: function(_) {
+      return this._loaded;
+    },
+    get$canCache: function() {
+      return false;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    get$name: function(_) {
+      return this.get$_service$__$name();
+    },
+    set$name: function(_, value) {
+      this.set$_service$__$name(this.notifyPropertyChange$3(this, C.Symbol_name, this.get$_service$__$name(), value));
+    },
+    get$vmName: function() {
+      return this.get$_service$__$vmName();
+    },
+    set$vmName: function(value) {
+      this.set$_service$__$vmName(this.notifyPropertyChange$3(this, C.Symbol_vmName, this.get$_service$__$vmName(), value));
+    },
+    load$0: function(_) {
+      if (this._loaded)
+        return P._Future$immediate(this, null);
+      return this.reload$0(0);
+    },
+    reload$0: function(_) {
+      var t1;
+      if (J.$eq(this._id, ""))
+        return P._Future$immediate(this, null);
+      if (this._loaded && this.get$immutable())
+        return P._Future$immediate(this, null);
+      t1 = this._inProgressReload;
+      if (t1 == null) {
+        t1 = this.get$vm(this).getAsMap$1(this.get$link(this)).then$1(new D.ServiceObject_reload_closure(this)).whenComplete$1(new D.ServiceObject_reload_closure0(this));
+        this._inProgressReload = t1;
+      }
+      return t1;
+    },
+    update$1: function(map) {
+      var t1, mapIsRef, mapType, t2;
+      t1 = J.getInterceptor$asx(map);
+      mapIsRef = J.startsWith$1$s(t1.$index(map, "type"), "@");
+      mapType = t1.$index(map, "type");
+      t2 = J.getInterceptor$s(mapType);
+      if (t2.startsWith$1(mapType, "@"))
+        mapType = t2.substring$1(mapType, 1);
+      t2 = this._id;
+      if (t2 != null && !J.$eq(t2, t1.$index(map, "id")))
+        ;
+      this._id = t1.$index(map, "id");
+      this._serviceType = mapType;
+      this._service$_update$2(0, map, mapIsRef);
+    },
+    $isServiceObject: true
+  },
+  ServiceObject_reload_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(map) {
+      var mapType, t1;
+      mapType = J.$index$asx(map, "type");
+      t1 = J.getInterceptor$s(mapType);
+      if (t1.startsWith$1(mapType, "@"))
+        mapType = t1.substring$1(mapType, 1);
+      t1 = this.this_0;
+      if (!J.$eq(mapType, t1._serviceType))
+        return D.ServiceObject_ServiceObject$_fromMap(t1._owner, map);
+      t1.update$1(map);
+      return t1;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  ServiceObject_reload_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      this.this_1._inProgressReload = null;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ServiceObjectOwner: {
+    "^": "ServiceObject;"
+  },
+  VM: {
+    "^": "ServiceObjectOwner_ChangeNotifier;",
+    get$vm: function(_) {
+      return this;
+    },
+    get$isolate: function(_) {
+      return;
+    },
+    get$isolates: function() {
+      var t1 = this._isolateCache;
+      return t1.get$values(t1);
+    },
+    get$link: function(_) {
+      return H.S(this._id);
+    },
+    relativeLink$1: [function(id) {
+      return H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    get$version: function(_) {
+      return this._service$__$version;
+    },
+    get$uptime: function() {
+      return this._service$__$uptime;
+    },
+    get$assertsEnabled: function() {
+      return this._service$__$assertsEnabled;
+    },
+    get$typeChecksEnabled: function() {
+      return this._service$__$typeChecksEnabled;
+    },
+    get$pid: function() {
+      return this._service$__$pid;
+    },
+    get$lastUpdate: function() {
+      return this._service$__$lastUpdate;
+    },
+    _parseObjectId$1: function(id) {
+      var m, t1, t2, t3;
+      m = $.get$VM__currentObjectMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return;
+      t1 = m._match;
+      t2 = t1.input;
+      t3 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return C.JSString_methods.substring$1(t2, t3 + t1);
+    },
+    _parseIsolateId$1: function(id) {
+      var m, t1, t2;
+      m = $.get$VM__currentIsolateMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return "";
+      t1 = m._match;
+      t2 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return J.substring$2$s(id, 0, t2 + t1);
+    },
+    getFromMap$1: function(map) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    _getIsolate$1: function(isolateId) {
+      var isolate;
+      if (isolateId === "")
+        return P._Future$immediate(null, null);
+      isolate = this._isolateCache.$index(0, isolateId);
+      if (isolate != null)
+        return P._Future$immediate(isolate, null);
+      return this.reload$0(0).then$1(new D.VM__getIsolate_closure(this, isolateId));
+    },
+    get$1: function(id) {
+      var isolateId, objectId, obj;
+      if (J.startsWith$1$s(id, "isolates/")) {
+        isolateId = this._parseIsolateId$1(id);
+        objectId = this._parseObjectId$1(id);
+        return this._getIsolate$1(isolateId).then$1(new D.VM_get_closure(this, objectId));
+      }
+      obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this.getAsMap$1(id).then$1(new D.VM_get_closure0(this, id));
+    },
+    _service$_reviver$2: [function(key, value) {
+      return value;
+    }, "call$2", "get$_service$_reviver", 4, 0, 75],
+    _parseJSON$1: function(response) {
+      var map, decoder, exception;
+      map = null;
+      try {
+        decoder = new P.JsonDecoder(this.get$_service$_reviver());
+        map = P._parseJson(response, decoder.get$_reviver());
+      } catch (exception) {
+        H.unwrapException(exception);
+        return;
+      }
+
+      return R._toObservableDeep(map);
+    },
+    _processMap$1: function(map) {
+      var t1;
+      if (!D._isServiceMap(map)) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "FormatException", "response", map, "message", "Top level service responses must be service maps."], null, null);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, R._toObservableDeep(t1)), null, null);
+      }
+      t1 = J.getInterceptor$asx(map);
+      if (J.$eq(t1.$index(map, "type"), "ServiceError"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      else if (J.$eq(t1.$index(map, "type"), "ServiceException"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      return P._Future$immediate(map, null);
+    },
+    getAsMap$1: function(id) {
+      return this.getString$1(0, id).then$1(new D.VM_getAsMap_closure(this)).catchError$2$test(new D.VM_getAsMap_closure0(this), new D.VM_getAsMap_closure1()).catchError$2$test(new D.VM_getAsMap_closure2(this), new D.VM_getAsMap_closure3());
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "version");
+      this._service$__$version = F.notifyPropertyChangeHelper(this, C.Symbol_version, this._service$__$version, t2);
+      t2 = t1.$index(map, "architecture");
+      this._service$__$architecture = F.notifyPropertyChangeHelper(this, C.Symbol_architecture, this._service$__$architecture, t2);
+      t2 = t1.$index(map, "uptime");
+      this._service$__$uptime = F.notifyPropertyChangeHelper(this, C.Symbol_uptime, this._service$__$uptime, t2);
+      t2 = P.DateTime$fromMillisecondsSinceEpoch(H.Primitives_parseInt(t1.$index(map, "date"), null, null), false);
+      this._service$__$lastUpdate = F.notifyPropertyChangeHelper(this, C.Symbol_lastUpdate, this._service$__$lastUpdate, t2);
+      t2 = t1.$index(map, "assertsEnabled");
+      this._service$__$assertsEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_assertsEnabled, this._service$__$assertsEnabled, t2);
+      t2 = t1.$index(map, "pid");
+      this._service$__$pid = F.notifyPropertyChangeHelper(this, C.Symbol_pid, this._service$__$pid, t2);
+      t2 = t1.$index(map, "typeChecksEnabled");
+      this._service$__$typeChecksEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_typeChecksEnabled, this._service$__$typeChecksEnabled, t2);
+      this._updateIsolates$1(t1.$index(map, "isolates"));
+    },
+    _updateIsolates$1: function(newIsolates) {
+      var oldIsolateCache, newIsolateCache, t1, isolateMap, isolateId, isolate;
+      oldIsolateCache = this._isolateCache;
+      newIsolateCache = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate);
+      for (t1 = J.get$iterator$ax(newIsolates); t1.moveNext$0();) {
+        isolateMap = t1.get$current();
+        isolateId = J.$index$asx(isolateMap, "id");
+        isolate = oldIsolateCache.$index(0, isolateId);
+        if (isolate != null)
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+        else {
+          isolate = D.ServiceObject_ServiceObject$_fromMap(this, isolateMap);
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+          N.Logger_Logger("").info$1("New isolate '" + H.S(isolate._id) + "'");
+        }
+      }
+      newIsolateCache.forEach$1(0, new D.VM__updateIsolates_closure());
+      this._isolateCache = newIsolateCache;
+    },
+    VM$0: function() {
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, "vm");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, "vm");
+      this._cache.$indexSet(0, "vm", this);
+      var t1 = P.LinkedHashMap_LinkedHashMap$_literal(["id", "vm", "type", "@VM"], null, null);
+      this.update$1(R._toObservableDeep(t1));
+    },
+    $isVM: true
+  },
+  ServiceObjectOwner_ChangeNotifier: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  VM__getIsolate_closure: {
+    "^": "Closure:13;this_0,isolateId_1",
+    call$1: [function(result) {
+      if (!J.getInterceptor(result).$isVM)
+        return;
+      return this.this_0._isolateCache.$index(0, this.isolateId_1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  VM_get_closure: {
+    "^": "Closure:13;this_0,objectId_1",
+    call$1: [function(isolate) {
+      var t1;
+      if (isolate == null)
+        return this.this_0;
+      t1 = this.objectId_1;
+      if (t1 == null)
+        return J.reload$0$x(isolate);
+      else
+        return isolate.get$1(t1);
+    }, "call$1", null, 2, 0, null, 7, "call"],
+    $isFunction: true
+  },
+  VM_get_closure0: {
+    "^": "Closure:184;this_2,id_3",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_2;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_3, new D.VM_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  VM_get__closure: {
+    "^": "Closure:69;obj_4",
+    call$0: function() {
+      return this.obj_4;
+    },
+    $isFunction: true
+  },
+  VM_getAsMap_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(response) {
+      var map, e, exception, t1;
+      map = null;
+      try {
+        map = this.this_0._parseJSON$1(response);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        P.print("Hit V8 bug.");
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "DecodeException", "response", "This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.", "message", "Could not decode JSON: " + H.S(e)], null, null);
+        t1 = R._toObservableDeep(t1);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this.this_0, t1), null, null);
+      }
+
+      return this.this_0._processMap$1(map);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure0: {
+    "^": "Closure:13;this_1",
+    call$1: [function(error) {
+      var t1 = this.this_1.errors;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(error);
+      return P._Future$immediateError(error, null, null);
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure1: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceError;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure2: {
+    "^": "Closure:13;this_2",
+    call$1: [function(exception) {
+      var t1 = this.this_2.exceptions;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(exception);
+      return P._Future$immediateError(exception, null, null);
+    }, "call$1", null, 2, 0, null, 85, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure3: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceException;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM__updateIsolates_closure: {
+    "^": "Closure:75;",
+    call$2: function(isolateId, isolate) {
+      J.reload$0$x(isolate);
+    },
+    $isFunction: true
+  },
+  TagProfileSnapshot: {
+    "^": "Object;seconds,counters>,_sum",
+    set$1: function(counters) {
+      var t1, t2, i, t3, t4;
+      t1 = this.counters;
+      H.IterableMixinWorkaround_setAllList(t1, 0, counters);
+      for (t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = this._sum;
+        t4 = t1[i];
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        this._sum = t3 + t4;
+      }
+    },
+    delta$2: function(counters, old_counters) {
+      var t1, t2, t3, t4, i, t5, t6;
+      for (t1 = this.counters, t2 = t1.length, t3 = J.getInterceptor$asx(counters), t4 = old_counters.length, i = 0; i < t2; ++i) {
+        t5 = t3.$index(counters, i);
+        if (i >= t4)
+          return H.ioore(old_counters, i);
+        t5 = J.$sub$n(t5, old_counters[i]);
+        t1[i] = t5;
+        t6 = this._sum;
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        this._sum = t6 + t5;
+      }
+    },
+    max$1: function(_, counters) {
+      var t1, t2, t3, i, t4, c;
+      t1 = J.getInterceptor$asx(counters);
+      t2 = this.counters;
+      t3 = t2.length;
+      i = 0;
+      while (true) {
+        t4 = t1.get$length(counters);
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        if (!(i < t4))
+          break;
+        c = t1.$index(counters, i);
+        if (i >= t3)
+          return H.ioore(t2, i);
+        t2[i] = J.$gt$n(t2[i], c) ? t2[i] : c;
+        ++i;
+      }
+    },
+    zero$0: function() {
+      var t1, t2, i;
+      for (t1 = this.counters, t2 = t1.length, i = 0; i < t2; ++i)
+        t1[i] = 0;
+    },
+    $isTagProfileSnapshot: true
+  },
+  TagProfile: {
+    "^": "Object;names<,snapshots<,_seconds,_maxSnapshot,_historySize,_countersLength",
+    get$updatedAtSeconds: function() {
+      return this._seconds;
+    },
+    _processTagProfile$2: function(seconds, tagProfile) {
+      var t1, counters, t2, i, t3, snapshot;
+      this._seconds = seconds;
+      t1 = J.getInterceptor$asx(tagProfile);
+      counters = t1.$index(tagProfile, "counters");
+      t2 = this.names;
+      if (t2.length === 0) {
+        C.JSArray_methods.addAll$1(t2, t1.$index(tagProfile, "names"));
+        this._countersLength = J.get$length$asx(t1.$index(tagProfile, "counters"));
+        for (t1 = this._historySize, t2 = this.snapshots, i = 0; t3 = this._countersLength, i < t1; ++i) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t3 = Array(t3);
+          t3.fixed$length = init;
+          t3.$builtinTypeInfo = [P.$int];
+          snapshot = new D.TagProfileSnapshot(0, t3, 0);
+          snapshot.zero$0();
+          t2.push(snapshot);
+        }
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        t1 = Array(t3);
+        t1.fixed$length = init;
+        t1 = new D.TagProfileSnapshot(0, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+        this._maxSnapshot = t1;
+        t1.set$1(counters);
+        return;
+      }
+      t1 = this._countersLength;
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = Array(t1);
+      t1.fixed$length = init;
+      snapshot = new D.TagProfileSnapshot(seconds, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+      snapshot.delta$2(counters, this._maxSnapshot.counters);
+      this._maxSnapshot.max$1(0, counters);
+      t1 = this.snapshots;
+      t1.push(snapshot);
+      if (t1.length > this._historySize)
+        C.JSArray_methods.removeAt$1(t1, 0);
+    }
+  },
+  HeapSpace: {
+    "^": "ChangeNotifier;_service$__$used,_service$__$capacity,_service$__$external,_service$__$collections,_service$__$totalCollectionTimeInSeconds,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$used: function() {
+      return this._service$__$used;
+    },
+    get$capacity: function() {
+      return this._service$__$capacity;
+    },
+    get$external: function() {
+      return this._service$__$external;
+    },
+    get$collections: function() {
+      return this._service$__$collections;
+    },
+    get$totalCollectionTimeInSeconds: function() {
+      return this._service$__$totalCollectionTimeInSeconds;
+    },
+    update$1: function(heapMap) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(heapMap);
+      t2 = t1.$index(heapMap, "used");
+      this._service$__$used = F.notifyPropertyChangeHelper(this, C.Symbol_used, this._service$__$used, t2);
+      t2 = t1.$index(heapMap, "capacity");
+      this._service$__$capacity = F.notifyPropertyChangeHelper(this, C.Symbol_capacity, this._service$__$capacity, t2);
+      t2 = t1.$index(heapMap, "external");
+      this._service$__$external = F.notifyPropertyChangeHelper(this, C.Symbol_external, this._service$__$external, t2);
+      t2 = t1.$index(heapMap, "collections");
+      this._service$__$collections = F.notifyPropertyChangeHelper(this, C.Symbol_collections, this._service$__$collections, t2);
+      t1 = t1.$index(heapMap, "time");
+      this._service$__$totalCollectionTimeInSeconds = F.notifyPropertyChangeHelper(this, C.Symbol_totalCollectionTimeInSeconds, this._service$__$totalCollectionTimeInSeconds, t1);
+    }
+  },
+  Isolate: {
+    "^": "ServiceObjectOwner_ChangeNotifier0;_service$__$counters,_service$__$pauseEvent,_service$__$running,_service$__$idle,_service$__$loading,_service$__$ioEnabled,_cache,tagProfile,_service$__$objectClass,rootClasses,_service$__$rootLib,_service$__$libraries,_service$__$topFrame,_service$__$name:service$Isolate$_service$__$name@,_service$__$vmName:service$Isolate$_service$__$vmName@,_service$__$mainPort,_service$__$entry,timers,newSpace<,oldSpace<,_service$__$fileAndLine,_service$__$error,profileTrieRoot<,_trieDataCursor,_trieData,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$vm: function(_) {
+      return this._owner;
+    },
+    get$isolate: function(_) {
+      return this;
+    },
+    get$counters: function(_) {
+      return this._service$__$counters;
+    },
+    set$counters: function(_, value) {
+      this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, value);
+    },
+    get$link: function(_) {
+      return "/" + H.S(this._id);
+    },
+    get$pauseEvent: function(_) {
+      return this._service$__$pauseEvent;
+    },
+    get$running: function() {
+      return this._service$__$running;
+    },
+    get$idle: function() {
+      return this._service$__$idle;
+    },
+    get$loading: function() {
+      return this._service$__$loading;
+    },
+    relativeLink$1: [function(id) {
+      return "/" + H.S(this._id) + "/" + H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    processProfile$1: function(profile) {
+      var codeTable, t1, t2, exclusiveTrie;
+      codeTable = H.setRuntimeTypeInfo([], [D.Code]);
+      t1 = J.getInterceptor$asx(profile);
+      for (t2 = J.get$iterator$ax(t1.$index(profile, "codes")); t2.moveNext$0();)
+        codeTable.push(J.$index$asx(t2.get$current(), "code"));
+      this._resetProfileData$0();
+      this._updateProfileData$2(profile, codeTable);
+      exclusiveTrie = t1.$index(profile, "exclusive_trie");
+      if (exclusiveTrie != null)
+        this.profileTrieRoot = this._processProfileTrie$2(exclusiveTrie, codeTable);
+    },
+    _resetProfileData$0: function() {
+      var t1 = this._cache;
+      t1.get$values(t1).forEach$1(0, new D.Isolate__resetProfileData_closure());
+    },
+    _updateProfileData$2: function(profile, codeTable) {
+      var t1, codeRegions, sampleCount, codeRegion;
+      t1 = J.getInterceptor$asx(profile);
+      codeRegions = t1.$index(profile, "codes");
+      sampleCount = t1.$index(profile, "samples");
+      for (t1 = J.get$iterator$ax(codeRegions); t1.moveNext$0();) {
+        codeRegion = t1.get$current();
+        J.$index$asx(codeRegion, "code").updateProfileData$3(codeRegion, codeTable, sampleCount);
+      }
+    },
+    refreshCoverage$0: [function(_) {
+      return this.get$1("coverage").then$1(this.get$_processCoverage());
+    }, "call$0", "get$refreshCoverage", 0, 0, 186],
+    _processCoverage$1: [function(coverage) {
+      J.forEach$1$ax(J.$index$asx(coverage, "coverage"), new D.Isolate__processCoverage_closure(this));
+    }, "call$1", "get$_processCoverage", 2, 0, 134, 187],
+    getClassHierarchy$0: function() {
+      return this.get$1("classes").then$1(this.get$_loadClasses()).then$1(this.get$_buildClassHierarchy());
+    },
+    _loadClasses$1: [function(classList) {
+      var futureClasses, t1, cls, t2;
+      futureClasses = [];
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")); t1.moveNext$0();) {
+        cls = t1.get$current();
+        t2 = J.getInterceptor(cls);
+        if (!!t2.$isClass)
+          futureClasses.push(t2.load$0(cls));
+      }
+      return P.Future_wait(futureClasses, false);
+    }, "call$1", "get$_loadClasses", 2, 0, 188, 189],
+    _buildClassHierarchy$1: [function(classes) {
+      var t1, t2, cls, t3;
+      t1 = this.rootClasses;
+      t1.clear$0(t1);
+      this._service$__$objectClass = F.notifyPropertyChangeHelper(this, C.Symbol_objectClass, this._service$__$objectClass, null);
+      for (t2 = J.get$iterator$ax(classes); t2.moveNext$0();) {
+        cls = t2.get$current();
+        if (cls.get$superClass() == null)
+          t1.add$1(0, cls);
+        if (J.$eq(cls.get$vmName(), "Object") && J.$eq(cls.get$isPatch(), false)) {
+          t3 = this._service$__$objectClass;
+          if (this.get$hasObservers(this) && !J.$eq(t3, cls)) {
+            t3 = new T.PropertyChangeRecord(this, C.Symbol_objectClass, t3, cls);
+            t3.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t3);
+          }
+          this._service$__$objectClass = cls;
+        }
+      }
+      return P._Future$immediate(this._service$__$objectClass, null);
+    }, "call$1", "get$_buildClassHierarchy", 2, 0, 190, 191],
+    getFromMap$1: function(map) {
+      var id, t1, obj;
+      if (map == null)
+        return;
+      id = J.$index$asx(map, "id");
+      t1 = this._cache;
+      obj = t1.$index(0, id);
+      if (obj != null)
+        return obj;
+      obj = D.ServiceObject_ServiceObject$_fromMap(this, map);
+      if (obj.get$canCache())
+        t1.$indexSet(0, id, obj);
+      return obj;
+    },
+    get$1: function(id) {
+      var obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/" + H.S(id)).then$1(new D.Isolate_get_closure(this, id));
+    },
+    get$objectClass: function() {
+      return this._service$__$objectClass;
+    },
+    get$rootLib: function() {
+      return this._service$__$rootLib;
+    },
+    set$rootLib: function(value) {
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, value);
+    },
+    get$libraries: function() {
+      return this._service$__$libraries;
+    },
+    get$topFrame: function() {
+      return this._service$__$topFrame;
+    },
+    get$name: function(_) {
+      return this.service$Isolate$_service$__$name;
+    },
+    set$name: function(_, value) {
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, value);
+    },
+    get$vmName: function() {
+      return this.service$Isolate$_service$__$vmName;
+    },
+    set$vmName: function(value) {
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, value);
+    },
+    get$mainPort: function() {
+      return this._service$__$mainPort;
+    },
+    get$entry: function() {
+      return this._service$__$entry;
+    },
+    set$entry: function(value) {
+      this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    updateHeapsFromMap$1: function(map) {
+      var t1 = J.getInterceptor$asx(map);
+      this.newSpace.update$1(t1.$index(map, "new"));
+      this.oldSpace.update$1(t1.$index(map, "old"));
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, countersMap, names, counts, sum, i, t3, t4, timerMap, features;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "mainPort");
+      this._service$__$mainPort = F.notifyPropertyChangeHelper(this, C.Symbol_mainPort, this._service$__$mainPort, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      this._service$__$loading = F.notifyPropertyChangeHelper(this, C.Symbol_loading, this._service$__$loading, false);
+      D._upgradeCollection(map, this);
+      if (t1.$index(map, "rootLib") == null || t1.$index(map, "timers") == null || t1.$index(map, "heaps") == null) {
+        N.Logger_Logger("").severe$1("Malformed 'Isolate' response: " + H.S(map));
+        return;
+      }
+      t2 = t1.$index(map, "rootLib");
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, t2);
+      if (t1.$index(map, "entry") != null) {
+        t2 = t1.$index(map, "entry");
+        this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, t2);
+      }
+      if (t1.$index(map, "topFrame") != null) {
+        t2 = t1.$index(map, "topFrame");
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, t2);
+      } else
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, null);
+      countersMap = t1.$index(map, "tagCounters");
+      if (countersMap != null) {
+        t2 = J.getInterceptor$asx(countersMap);
+        names = t2.$index(countersMap, "names");
+        counts = t2.$index(countersMap, "counters");
+        t2 = J.getInterceptor$asx(counts);
+        sum = 0;
+        i = 0;
+        while (true) {
+          t3 = t2.get$length(counts);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(i < t3))
+            break;
+          t3 = t2.$index(counts, i);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          sum += t3;
+          ++i;
+        }
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = R._toObservableDeep(t3);
+        this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, t3);
+        if (sum === 0) {
+          t2 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t3 = t2.get$length(names);
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (!(i < t3))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t2.$index(names, i), "0.0%");
+            ++i;
+          }
+        } else {
+          t3 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t4 = t3.get$length(names);
+            if (typeof t4 !== "number")
+              return H.iae(t4);
+            if (!(i < t4))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t3.$index(names, i), C.JSNumber_methods.toStringAsFixed$1(J.$div$n(t2.$index(counts, i), sum) * 100, 2) + "%");
+            ++i;
+          }
+        }
+      }
+      timerMap = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      J.forEach$1$ax(t1.$index(map, "timers"), new D.Isolate__update_closure(timerMap));
+      t2 = this.timers;
+      t3 = J.getInterceptor$ax(t2);
+      t3.$indexSet(t2, "total", timerMap.$index(0, "time_total_runtime"));
+      t3.$indexSet(t2, "compile", timerMap.$index(0, "time_compilation"));
+      t3.$indexSet(t2, "gc", 0);
+      t3.$indexSet(t2, "init", J.$add$ns(J.$add$ns(J.$add$ns(timerMap.$index(0, "time_script_loading"), timerMap.$index(0, "time_creating_snapshot")), timerMap.$index(0, "time_isolate_initialization")), timerMap.$index(0, "time_bootstrap")));
+      t3.$indexSet(t2, "dart", timerMap.$index(0, "time_dart_execution"));
+      this.updateHeapsFromMap$1(t1.$index(map, "heaps"));
+      features = t1.$index(map, "features");
+      if (features != null)
+        for (t2 = J.get$iterator$ax(features); t2.moveNext$0();)
+          if (J.$eq(t2.get$current(), "io")) {
+            t3 = this._service$__$ioEnabled;
+            if (this.get$hasObservers(this) && !J.$eq(t3, true)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_ioEnabled, t3, true);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$ioEnabled = true;
+          }
+      t2 = t1.$index(map, "pauseEvent");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_pauseEvent, this._service$__$pauseEvent, t2);
+      this._service$__$pauseEvent = t2;
+      t2 = t2 == null && t1.$index(map, "topFrame") != null;
+      this._service$__$running = F.notifyPropertyChangeHelper(this, C.Symbol_running, this._service$__$running, t2);
+      t2 = this._service$__$pauseEvent == null && t1.$index(map, "topFrame") == null;
+      this._service$__$idle = F.notifyPropertyChangeHelper(this, C.Symbol_idle, this._service$__$idle, t2);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      t2 = this._service$__$libraries;
+      t2.clear$0(t2);
+      for (t1 = J.get$iterator$ax(t1.$index(map, "libraries")); t1.moveNext$0();)
+        t2.add$1(0, t1.get$current());
+      t2.sort$1(t2, new D.Isolate__update_closure0());
+    },
+    updateTagProfile$0: function() {
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/profile/tag").then$1(new D.Isolate_updateTagProfile_closure(this));
+    },
+    _processProfileTrie$2: function(data, codeTable) {
+      this._trieDataCursor = 0;
+      this._trieData = data;
+      if (data == null)
+        return;
+      if (J.$lt$n(J.get$length$asx(data), 3))
+        return;
+      return this._readTrieNode$1(codeTable);
+    },
+    _readTrieNode$1: function(codeTable) {
+      var t1, t2, index, code, count, node, t3, children, i, child;
+      t1 = this._trieData;
+      t2 = this._trieDataCursor;
+      if (typeof t2 !== "number")
+        return t2.$add();
+      this._trieDataCursor = t2 + 1;
+      index = J.$index$asx(t1, t2);
+      if (index >>> 0 !== index || index >= codeTable.length)
+        return H.ioore(codeTable, index);
+      code = codeTable[index];
+      t2 = this._trieData;
+      t1 = this._trieDataCursor;
+      if (typeof t1 !== "number")
+        return t1.$add();
+      this._trieDataCursor = t1 + 1;
+      count = J.$index$asx(t2, t1);
+      t1 = [];
+      t1.$builtinTypeInfo = [D.CodeTrieNode];
+      node = new D.CodeTrieNode(code, count, t1, 0);
+      t2 = this._trieData;
+      t3 = this._trieDataCursor;
+      if (typeof t3 !== "number")
+        return t3.$add();
+      this._trieDataCursor = t3 + 1;
+      children = J.$index$asx(t2, t3);
+      if (typeof children !== "number")
+        return H.iae(children);
+      i = 0;
+      for (; i < children; ++i) {
+        child = this._readTrieNode$1(codeTable);
+        t1.push(child);
+        t2 = node.summedChildCount;
+        t3 = child.count;
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        node.summedChildCount = t2 + t3;
+      }
+      return node;
+    },
+    $isIsolate: true,
+    static: {"^": "Isolate_TAG_ROOT_ID"}
+  },
+  ServiceObjectOwner_ChangeNotifier0: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  Isolate__resetProfileData_closure: {
+    "^": "Closure:13;",
+    call$1: function(value) {
+      if (!!J.getInterceptor(value).$isCode) {
+        value._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(value, C.Symbol_totalSamplesInProfile, value._service$__$totalSamplesInProfile, 0);
+        value.exclusiveTicks = 0;
+        value.inclusiveTicks = 0;
+        value._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedInclusiveTicks, value._service$__$formattedInclusiveTicks, "");
+        value._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedExclusiveTicks, value._service$__$formattedExclusiveTicks, "");
+        C.JSArray_methods.set$length(value.callers, 0);
+        C.JSArray_methods.set$length(value.callees, 0);
+        value.addressTicks.clear$0(0);
+      }
+    },
+    $isFunction: true
+  },
+  Isolate__processCoverage_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(scriptCoverage) {
+      var t1 = J.getInterceptor$asx(scriptCoverage);
+      t1.$index(scriptCoverage, "script")._processHits$1(t1.$index(scriptCoverage, "hits"));
+    }, "call$1", null, 2, 0, null, 192, "call"],
+    $isFunction: true
+  },
+  Isolate_get_closure: {
+    "^": "Closure:184;this_0,id_1",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_0;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_1, new D.Isolate_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  Isolate_get__closure: {
+    "^": "Closure:69;obj_2",
+    call$0: function() {
+      return this.obj_2;
+    },
+    $isFunction: true
+  },
+  Isolate__update_closure: {
+    "^": "Closure:13;timerMap_0",
+    call$1: [function(timer) {
+      var t1 = J.getInterceptor$asx(timer);
+      this.timerMap_0.$indexSet(0, t1.$index(timer, "name"), t1.$index(timer, "time"));
+    }, "call$1", null, 2, 0, null, 193, "call"],
+    $isFunction: true
+  },
+  Isolate__update_closure0: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.compareTo$1$ns(J.get$name$x(a), J.get$name$x(b));
+    },
+    $isFunction: true
+  },
+  Isolate_updateTagProfile_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(m) {
+      var t1, t2;
+      t1 = Date.now();
+      new P.DateTime(t1, false).DateTime$_now$0();
+      t2 = this.this_0.tagProfile;
+      t2._processTagProfile$2(t1 / 1000, m);
+      return t2;
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  },
+  ServiceMap: {
+    "^": "ServiceObject;_service$_map,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return (J.$eq(this._serviceType, "Class") || J.$eq(this._serviceType, "Function") || J.$eq(this._serviceType, "Field")) && !J.startsWith$1$s(this._id, $.ServiceMap_objectIdRingPrefix);
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._service$_map);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      this._loaded = !mapIsRef;
+      t1 = this._service$_map;
+      t1.clear$0(0);
+      t1.addAll$1(0, map);
+      t2 = t1._observable_map$_map;
+      t3 = t2.$index(0, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(0, C.Symbol_name, this._service$__$name, t3);
+      t2 = t2.$index(0, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(0, C.Symbol_vmName, this._service$__$vmName, t2);
+      D._upgradeCollection(t1, this._owner);
+    },
+    addAll$1: function(_, other) {
+      return this._service$_map.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      return this._service$_map.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._service$_map._observable_map$_map.forEach$1(0, f);
+    },
+    $index: function(_, k) {
+      return this._service$_map._observable_map$_map.$index(0, k);
+    },
+    $indexSet: function(_, k, v) {
+      this._service$_map.$indexSet(0, k, v);
+      return v;
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    get$keys: function() {
+      return this._service$_map._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    deliverChanges$0: [function(_) {
+      var t1 = this._service$_map;
+      return t1.deliverChanges$0(t1);
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    notifyChange$1: function(_, record) {
+      var t1 = this._service$_map;
+      return t1.notifyChange$1(t1, record);
+    },
+    notifyPropertyChange$3: function(_, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(this._service$_map, field, oldValue, newValue);
+    },
+    observed$0: [function(_) {
+      return;
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(_) {
+      this._service$_map.change_notifier$ChangeNotifier$_changes = null;
+      return;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    get$changes: function(_) {
+      var t1 = this._service$_map;
+      return t1.get$changes(t1);
+    },
+    get$hasObservers: function(_) {
+      var t1, t2;
+      t1 = this._service$_map.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isServiceMap: true,
+    $isObservableMap: true,
+    $asObservableMap: function() {
+      return [null, null];
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [null, null];
+    },
+    $isObservable: true,
+    static: {"^": "ServiceMap_objectIdRingPrefix"}
+  },
+  DartError: {
+    "^": "ServiceObject_ChangeNotifier;_service$__$kind,_service$__$message,_service$__$exception,_service$__$stacktrace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$exception: function(_) {
+      return this._service$__$exception;
+    },
+    set$exception: function(_, value) {
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, value);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t2 = this._owner;
+      t3 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "exception"));
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, t3);
+      t1 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "stacktrace"));
+      this._service$__$stacktrace = F.notifyPropertyChangeHelper(this, C.Symbol_stacktrace, this._service$__$stacktrace, t1);
+      t1 = "DartError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    }
+  },
+  ServiceObject_ChangeNotifier: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceError: {
+    "^": "ServiceObject_ChangeNotifier0;_service$__$kind,_service$__$message,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t1 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t1);
+      t1 = "ServiceError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceError: true
+  },
+  ServiceObject_ChangeNotifier0: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceException: {
+    "^": "ServiceObject_ChangeNotifier1;_service$__$kind,_service$__$message,_service$__$response,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$response: function(_) {
+      return this._service$__$response;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t1 = t1.$index(map, "response");
+      this._service$__$response = F.notifyPropertyChangeHelper(this, C.Symbol_response, this._service$__$response, t1);
+      t1 = "ServiceException " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceException: true
+  },
+  ServiceObject_ChangeNotifier1: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Library: {
+    "^": "ServiceObject_ChangeNotifier2;_service$__$url,imports<,scripts<,classes>,variables<,functions<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$url: function(_) {
+      return this._service$__$url;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, shortUrl, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "url");
+      shortUrl = F.notifyPropertyChangeHelper(this, C.Symbol_url, this._service$__$url, t2);
+      this._service$__$url = shortUrl;
+      if (J.startsWith$1$s(shortUrl, "file://") || J.startsWith$1$s(this._service$__$url, "http://")) {
+        t2 = this._service$__$url;
+        t3 = J.getInterceptor$asx(t2);
+        t4 = t3.lastIndexOf$1(t2, "/");
+        if (typeof t4 !== "number")
+          return t4.$add();
+        shortUrl = t3.substring$1(t2, t4 + 1);
+      }
+      t2 = t1.$index(map, "user_name");
+      t2 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      this._service$__$name = t2;
+      if (J.get$isEmpty$asx(t2) === true)
+        this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, shortUrl);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = this.imports;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "imports"));
+      t2 = this.scripts;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "scripts"));
+      t2 = this.classes;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "classes"));
+      t2 = this.variables;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "variables"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+    },
+    $isLibrary: true
+  },
+  ServiceObject_ChangeNotifier2: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  AllocationCount: {
+    "^": "ChangeNotifier;_service$__$instances,_service$__$bytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$instances: function(_) {
+      return this._service$__$instances;
+    },
+    set$instances: function(_, value) {
+      this._service$__$instances = F.notifyPropertyChangeHelper(this, C.Symbol_instances, this._service$__$instances, value);
+    },
+    get$bytes: function() {
+      return this._service$__$bytes;
+    }
+  },
+  Allocations: {
+    "^": "Object;accumulated<,current<",
+    update$1: function(stats) {
+      var t1, t2, t3;
+      t1 = this.accumulated;
+      t2 = J.getInterceptor$asx(stats);
+      t3 = t2.$index(stats, 6);
+      t1._service$__$instances = F.notifyPropertyChangeHelper(t1, C.Symbol_instances, t1._service$__$instances, t3);
+      t3 = t2.$index(stats, 7);
+      t1._service$__$bytes = F.notifyPropertyChangeHelper(t1, C.Symbol_bytes, t1._service$__$bytes, t3);
+      t3 = this.current;
+      t1 = J.$add$ns(t2.$index(stats, 2), t2.$index(stats, 4));
+      t3._service$__$instances = F.notifyPropertyChangeHelper(t3, C.Symbol_instances, t3._service$__$instances, t1);
+      t2 = J.$add$ns(t2.$index(stats, 3), t2.$index(stats, 5));
+      t3._service$__$bytes = F.notifyPropertyChangeHelper(t3, C.Symbol_bytes, t3._service$__$bytes, t2);
+    },
+    static: {"^": "Allocations_ALLOCATED_BEFORE_GC,Allocations_ALLOCATED_BEFORE_GC_SIZE,Allocations_LIVE_AFTER_GC,Allocations_LIVE_AFTER_GC_SIZE,Allocations_ALLOCATED_SINCE_GC,Allocations_ALLOCATED_SINCE_GC_SIZE,Allocations_ACCUMULATED,Allocations_ACCUMULATED_SIZE"}
+  },
+  Class: {
+    "^": "ServiceObject_ChangeNotifier3;_service$__$library,_service$__$script,_service$__$superClass,_service$__$isAbstract,_service$__$isConst,_service$__$isFinalized,_service$__$isPatch,_service$__$isImplemented,_service$__$tokenPos,_service$__$error,newSpace<,oldSpace<,children>,subClasses<,fields<,functions<,interfaces<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$library: function(_) {
+      return this._service$__$library;
+    },
+    set$library: function(_, value) {
+      this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$superClass: function() {
+      return this._service$__$superClass;
+    },
+    set$superClass: function(value) {
+      this._service$__$superClass = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, value);
+    },
+    get$isAbstract: function() {
+      return this._service$__$isAbstract;
+    },
+    get$isPatch: function() {
+      return this._service$__$isPatch;
+    },
+    get$tokenPos: function() {
+      return this._service$__$tokenPos;
+    },
+    set$tokenPos: function(value) {
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    get$hasNoAllocations: function() {
+      var t1, t2;
+      t1 = this.newSpace;
+      t2 = t1.accumulated;
+      if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+        t1 = t1.current;
+        t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = this.oldSpace;
+        t2 = t1.accumulated;
+        if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+          t1 = t1.current;
+          t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return "Service Class: " + H.S(this._service$__$vmName);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, allocationStats;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      if (!!J.getInterceptor(t1.$index(map, "library")).$isLibrary) {
+        t2 = t1.$index(map, "library");
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, t2);
+      } else
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, null);
+      t2 = t1.$index(map, "script");
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, t2);
+      t2 = t1.$index(map, "abstract");
+      this._service$__$isAbstract = F.notifyPropertyChangeHelper(this, C.Symbol_isAbstract, this._service$__$isAbstract, t2);
+      t2 = t1.$index(map, "const");
+      this._service$__$isConst = F.notifyPropertyChangeHelper(this, C.Symbol_isConst, this._service$__$isConst, t2);
+      t2 = t1.$index(map, "finalized");
+      this._service$__$isFinalized = F.notifyPropertyChangeHelper(this, C.Symbol_isFinalized, this._service$__$isFinalized, t2);
+      t2 = t1.$index(map, "patch");
+      this._service$__$isPatch = F.notifyPropertyChangeHelper(this, C.Symbol_isPatch, this._service$__$isPatch, t2);
+      t2 = t1.$index(map, "implemented");
+      this._service$__$isImplemented = F.notifyPropertyChangeHelper(this, C.Symbol_isImplemented, this._service$__$isImplemented, t2);
+      t2 = t1.$index(map, "tokenPos");
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, t2);
+      t2 = this.subClasses;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "subclasses"));
+      t2 = this.fields;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "fields"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+      t2 = t1.$index(map, "super");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, t2);
+      this._service$__$superClass = t2;
+      if (t2 != null)
+        t2._addToChildren$1(this);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      allocationStats = t1.$index(map, "allocationStats");
+      if (allocationStats != null) {
+        t1 = J.getInterceptor$asx(allocationStats);
+        this.newSpace.update$1(t1.$index(allocationStats, "new"));
+        this.oldSpace.update$1(t1.$index(allocationStats, "old"));
+      }
+    },
+    _addToChildren$1: function(cls) {
+      var t1 = this.children;
+      if (t1.contains$1(t1, cls))
+        return;
+      t1.add$1(0, cls);
+    },
+    get$1: function(command) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1).get$1(J.$add$ns(this._id, "/" + H.S(command)));
+    },
+    $isClass: true
+  },
+  ServiceObject_ChangeNotifier3: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptLine: {
+    "^": "ChangeNotifier;line<,text>,_service$__$hits,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$hits: function() {
+      return this._service$__$hits;
+    },
+    set$hits: function(value) {
+      this._service$__$hits = F.notifyPropertyChangeHelper(this, C.Symbol_hits, this._service$__$hits, value);
+    },
+    $isScriptLine: true
+  },
+  Script: {
+    "^": "ServiceObject_ChangeNotifier4;lines>,_hits,_service$__$kind,_service$__$firstTokenPos,_service$__$lastTokenPos,_shortUrl,_url,_tokenToLine,_tokenToCol,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$firstTokenPos: function() {
+      return this._service$__$firstTokenPos;
+    },
+    set$firstTokenPos: function(value) {
+      var t1 = this._service$__$firstTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$firstTokenPos = value;
+    },
+    get$lastTokenPos: function() {
+      return this._service$__$lastTokenPos;
+    },
+    set$lastTokenPos: function(value) {
+      var t1 = this._service$__$lastTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$lastTokenPos = value;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    getLine$1: function(line) {
+      var t1, t2;
+      t1 = J.$sub$n(line, 1);
+      t2 = this.lines._observable_list$_list;
+      if (t1 >>> 0 !== t1 || t1 >= t2.length)
+        return H.ioore(t2, t1);
+      return t2[t1];
+    },
+    tokenToLine$1: function(token) {
+      return this._tokenToLine.$index(0, token);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "name");
+      this._url = t2;
+      t3 = J.getInterceptor$asx(t2);
+      t4 = t3.lastIndexOf$1(t2, "/");
+      if (typeof t4 !== "number")
+        return t4.$add();
+      t4 = t3.substring$1(t2, t4 + 1);
+      this._shortUrl = t4;
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t4);
+      t4 = this._url;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t4);
+      this._processSource$1(t1.$index(map, "source"));
+      this._parseTokenPosTable$1(t1.$index(map, "tokenPosTable"));
+    },
+    _parseTokenPosTable$1: function(table) {
+      var t1, line, t2, lineNumber, pos, t3, tokenOffset, colNumber, t4;
+      if (table == null)
+        return;
+      this._tokenToLine = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._tokenToCol = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._service$__$firstTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_firstTokenPos, this._service$__$firstTokenPos, null);
+      this._service$__$lastTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_lastTokenPos, this._service$__$lastTokenPos, null);
+      for (t1 = J.get$iterator$ax(table); t1.moveNext$0();) {
+        line = t1.get$current();
+        t2 = J.getInterceptor$asx(line);
+        lineNumber = t2.$index(line, 0);
+        pos = 1;
+        while (true) {
+          t3 = t2.get$length(line);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(pos < t3))
+            break;
+          tokenOffset = t2.$index(line, pos);
+          colNumber = t2.$index(line, pos + 1);
+          t3 = this._service$__$firstTokenPos;
+          if (t3 == null) {
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$firstTokenPos = tokenOffset;
+            t3 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$lastTokenPos = tokenOffset;
+          } else {
+            t3 = J.$le$n(t3, tokenOffset) ? this._service$__$firstTokenPos : tokenOffset;
+            t4 = this._service$__$firstTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$firstTokenPos = t3;
+            t3 = J.$ge$n(this._service$__$lastTokenPos, tokenOffset) ? this._service$__$lastTokenPos : tokenOffset;
+            t4 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$lastTokenPos = t3;
+          }
+          this._tokenToLine.$indexSet(0, tokenOffset, lineNumber);
+          this._tokenToCol.$indexSet(0, tokenOffset, colNumber);
+          pos += 2;
+        }
+      }
+    },
+    _processHits$1: function(scriptHits) {
+      var t1, t2, i, t3, line, hit, oldHits;
+      t1 = J.getInterceptor$asx(scriptHits);
+      t2 = this._hits;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(scriptHits);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        line = t1.$index(scriptHits, i);
+        hit = t1.$index(scriptHits, i + 1);
+        oldHits = t2.$index(0, line);
+        t2.$indexSet(0, line, oldHits != null ? J.$add$ns(hit, oldHits) : hit);
+        i += 2;
+      }
+      this._applyHitsToLines$0();
+    },
+    _processSource$1: function(source) {
+      var sourceLines, t1, i, i0;
+      this._loaded = false;
+      if (source == null)
+        return;
+      sourceLines = J.split$1$s(source, "\n");
+      if (sourceLines.length === 0)
+        return;
+      this._loaded = true;
+      t1 = this.lines;
+      t1.clear$0(t1);
+      N.Logger_Logger("").info$1("Adding " + sourceLines.length + " source lines for " + H.S(this._url));
+      for (i = 0; i < sourceLines.length; i = i0) {
+        i0 = i + 1;
+        t1.add$1(0, new D.ScriptLine(i0, sourceLines[i], null, null, null));
+      }
+      this._applyHitsToLines$0();
+    },
+    _applyHitsToLines$0: function() {
+      var t1, t2, line;
+      t1 = this.lines;
+      if (t1._observable_list$_list.length === 0)
+        return;
+      for (t1 = t1.get$iterator(t1), t2 = this._hits; t1.moveNext$0();) {
+        line = t1._current;
+        line.set$hits(t2.$index(0, line.get$line()));
+      }
+    },
+    $isScript: true
+  },
+  ServiceObject_ChangeNotifier4: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeTick: {
+    "^": "Object;address<,exclusiveTicks<,inclusiveTicks<",
+    $isCodeTick: true
+  },
+  PcDescriptor: {
+    "^": "ChangeNotifier;address<,deoptId,tokenPos<,tryIndex,kind>,_service$__$script,_service$__$formattedLine,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$formattedLine: function() {
+      return this._service$__$formattedLine;
+    },
+    formattedDeoptId$0: [function() {
+      var t1, t2;
+      t1 = this.deoptId;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, -1))
+        return "N/A";
+      return t2.toString$0(t1);
+    }, "call$0", "get$formattedDeoptId", 0, 0, 194],
+    processScript$1: function(script) {
+      var t1, line;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, null);
+      t1 = this.tokenPos;
+      if (J.$eq(t1, -1))
+        return;
+      line = script.tokenToLine$1(t1);
+      if (line == null)
+        return;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      t1 = J.get$text$x(script.getLine$1(line));
+      this._service$__$formattedLine = F.notifyPropertyChangeHelper(this, C.Symbol_formattedLine, this._service$__$formattedLine, t1);
+    },
+    $isPcDescriptor: true
+  },
+  CodeInstruction: {
+    "^": "ChangeNotifier;address<,machine,human<,_service$__$jumpTarget,descriptors<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$jumpTarget: function() {
+      return this._service$__$jumpTarget;
+    },
+    get$isComment: function() {
+      return J.$eq(this.address, 0);
+    },
+    get$hasDescriptors: function() {
+      return this.descriptors._observable_list$_list.length > 0;
+    },
+    formattedAddress$0: [function() {
+      var t1, t2;
+      t1 = this.address;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, 0))
+        return "";
+      return "0x" + t2.toRadixString$1(t1, 16);
+    }, "call$0", "get$formattedAddress", 0, 0, 194],
+    formattedInclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      if (J.$eq(tick.get$inclusiveTicks(), tick.get$exclusiveTicks()))
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$inclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$inclusiveTicks()) + ")";
+    }, "call$1", "get$formattedInclusive", 2, 0, 195, 71],
+    formattedExclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$exclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$exclusiveTicks()) + ")";
+    }, "call$1", "get$formattedExclusive", 2, 0, 195, 71],
+    _getJumpAddress$0: function() {
+      var address, chunks, t1, exception;
+      chunks = J.split$1$s(this.human, " ");
+      t1 = chunks.length;
+      if (t1 !== 2)
+        return 0;
+      if (1 >= t1)
+        return H.ioore(chunks, 1);
+      address = chunks[1];
+      if (J.startsWith$1$s(address, "0x"))
+        address = J.substring$1$s(address, 2);
+      try {
+        t1 = H.Primitives_parseInt(address, 16, null);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return 0;
+      }
+
+    },
+    _resolveJumpTarget$1: function(instructions) {
+      var t1, address, t2, i, instruction;
+      t1 = this.human;
+      if (!J.startsWith$1$s(t1, "j"))
+        return;
+      address = this._getJumpAddress$0();
+      t2 = J.getInterceptor(address);
+      if (t2.$eq(address, 0)) {
+        P.print("Could not determine jump address for " + H.S(t1));
+        return;
+      }
+      for (t1 = instructions._observable_list$_list, i = 0; i < t1.length; ++i) {
+        instruction = t1[i];
+        if (J.$eq(instruction.get$address(), address)) {
+          t1 = this._service$__$jumpTarget;
+          if (this.get$hasObservers(this) && !J.$eq(t1, instruction)) {
+            t1 = new T.PropertyChangeRecord(this, C.Symbol_jumpTarget, t1, instruction);
+            t1.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t1);
+          }
+          this._service$__$jumpTarget = instruction;
+          return;
+        }
+      }
+      P.print("Could not find instruction at " + t2.toRadixString$1(address, 16));
+    },
+    $isCodeInstruction: true,
+    static: {CodeInstruction_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  CodeKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "CodeKind_Native0,CodeKind_Dart0,CodeKind_Collected0,CodeKind_Reused0,CodeKind_Tag0", CodeKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Native"))
+          return C.CodeKind_Native;
+        else if (t1.$eq(s, "Dart"))
+          return C.CodeKind_Dart;
+        else if (t1.$eq(s, "Collected"))
+          return C.CodeKind_Collected;
+        else if (t1.$eq(s, "Reused"))
+          return C.CodeKind_Reused;
+        else if (t1.$eq(s, "Tag"))
+          return C.CodeKind_Tag;
+        N.Logger_Logger("").warning$1("Unknown code kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  CodeCallCount: {
+    "^": "Object;code>,count<",
+    $isCodeCallCount: true
+  },
+  CodeTrieNode: {
+    "^": "Object;code>,count<,children>,summedChildCount",
+    $isCodeTrieNode: true
+  },
+  Code: {
+    "^": "ServiceObject_ChangeNotifier5;_service$__$kind,_service$__$totalSamplesInProfile,exclusiveTicks<,inclusiveTicks<,startAddress,endAddress,callers,callees,instructions<,addressTicks<,_service$__$formattedInclusiveTicks,_service$__$formattedExclusiveTicks,_service$__$objectPool,_service$__$function,_service$__$script,_service$__$isOptimized,name*,vmName@,_service$__$hasDisassembly,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$totalSamplesInProfile: function() {
+      return this._service$__$totalSamplesInProfile;
+    },
+    get$formattedInclusiveTicks: function() {
+      return this._service$__$formattedInclusiveTicks;
+    },
+    get$formattedExclusiveTicks: function() {
+      return this._service$__$formattedExclusiveTicks;
+    },
+    get$objectPool: function() {
+      return this._service$__$objectPool;
+    },
+    set$objectPool: function(value) {
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, value);
+    },
+    get$$function: function(_) {
+      return this._service$__$function;
+    },
+    set$$function: function(_, value) {
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$isOptimized: function() {
+      return this._service$__$isOptimized;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    _updateDescriptors$1: [function(script) {
+      var t1, t2;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        for (t2 = t1._current.get$descriptors(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t2._current.processScript$1(script);
+    }, "call$1", "get$_updateDescriptors", 2, 0, 196, 197],
+    loadScript$0: function() {
+      if (this._service$__$script != null)
+        return;
+      if (!J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return;
+      var t1 = this._service$__$function;
+      if (t1 == null)
+        return;
+      if (J.$index$asx(t1, "script") == null) {
+        J.load$0$x(this._service$__$function).then$1(new D.Code_loadScript_closure(this));
+        return;
+      }
+      J.load$0$x(J.$index$asx(this._service$__$function, "script")).then$1(this.get$_updateDescriptors());
+    },
+    reload$0: function(_) {
+      if (J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return D.ServiceObject.prototype.reload$0.call(this, this);
+      return P._Future$immediate(this, null);
+    },
+    _resolveCalls$3: function(calls, data, codes) {
+      var t1, i, t2, index, count;
+      t1 = J.getInterceptor$asx(data);
+      i = 0;
+      while (true) {
+        t2 = t1.get$length(data);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        if (!(i < t2))
+          break;
+        index = H.Primitives_parseInt(t1.$index(data, i), null, null);
+        count = H.Primitives_parseInt(t1.$index(data, i + 1), null, null);
+        if (index >>> 0 !== index || index >= codes.length)
+          return H.ioore(codes, index);
+        calls.push(new D.CodeCallCount(codes[index], count));
+        i += 2;
+      }
+      H.IterableMixinWorkaround_sortList(calls, new D.Code__resolveCalls_closure());
+    },
+    updateProfileData$3: function(profileData, codeTable, sampleCount) {
+      var t1, ticks;
+      this._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(this, C.Symbol_totalSamplesInProfile, this._service$__$totalSamplesInProfile, sampleCount);
+      t1 = J.getInterceptor$asx(profileData);
+      this.inclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "inclusive_ticks"), null, null);
+      this.exclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "exclusive_ticks"), null, null);
+      this._resolveCalls$3(this.callers, t1.$index(profileData, "callers"), codeTable);
+      this._resolveCalls$3(this.callees, t1.$index(profileData, "callees"), codeTable);
+      ticks = t1.$index(profileData, "ticks");
+      if (ticks != null)
+        this._processTicks$1(ticks);
+      t1 = D.Code_formatPercent(this.inclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.inclusiveTicks) + ")";
+      this._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedInclusiveTicks, this._service$__$formattedInclusiveTicks, t1);
+      t1 = D.Code_formatPercent(this.exclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.exclusiveTicks) + ")";
+      this._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedExclusiveTicks, this._service$__$formattedExclusiveTicks, t1);
+    },
+    _service$_update$2: function(_, m, mapIsRef) {
+      var t1, t2, t3, disassembly, descriptors;
+      t1 = J.getInterceptor$asx(m);
+      this.name = t1.$index(m, "user_name");
+      this.vmName = t1.$index(m, "name");
+      t2 = t1.$index(m, "isOptimized") != null && t1.$index(m, "isOptimized");
+      this._service$__$isOptimized = F.notifyPropertyChangeHelper(this, C.Symbol_isOptimized, this._service$__$isOptimized, t2);
+      t2 = D.CodeKind_fromString(t1.$index(m, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      this.startAddress = H.Primitives_parseInt(t1.$index(m, "start"), 16, null);
+      this.endAddress = H.Primitives_parseInt(t1.$index(m, "end"), 16, null);
+      t2 = this._owner;
+      t3 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "function"));
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, t3);
+      t2 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "object_pool"));
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, t2);
+      disassembly = t1.$index(m, "disassembly");
+      if (disassembly != null)
+        this._processDisassembly$1(disassembly);
+      descriptors = t1.$index(m, "descriptors");
+      if (descriptors != null)
+        this._processDescriptors$1(J.$index$asx(descriptors, "members"));
+      t1 = this.instructions._observable_list$_list;
+      this._loaded = t1.length !== 0 || !J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      t1 = t1.length !== 0 && J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      this._service$__$hasDisassembly = F.notifyPropertyChangeHelper(this, C.Symbol_hasDisassembly, this._service$__$hasDisassembly, t1);
+    },
+    get$hasDisassembly: function() {
+      return this._service$__$hasDisassembly;
+    },
+    _processDisassembly$1: function(disassembly) {
+      var t1, t2, i, t3, machine, human, address, t4;
+      t1 = this.instructions;
+      t1.clear$0(t1);
+      t2 = J.getInterceptor$asx(disassembly);
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(disassembly);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        machine = t2.$index(disassembly, i + 1);
+        human = t2.$index(disassembly, i + 2);
+        address = !J.$eq(t2.$index(disassembly, i), "") ? H.Primitives_parseInt(t2.$index(disassembly, i), null, null) : 0;
+        t3 = D.PcDescriptor;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t1.add$1(0, new D.CodeInstruction(address, machine, human, null, t4, null, null));
+        i += 3;
+      }
+      for (t2 = t1.get$iterator(t1); t2.moveNext$0();)
+        t2._current._resolveJumpTarget$1(t1);
+    },
+    _processDescriptor$1: function(d) {
+      var t1, address, deoptId, tokenPos, tryIndex, kind, instruction;
+      t1 = J.getInterceptor$asx(d);
+      address = H.Primitives_parseInt(t1.$index(d, "pc"), 16, null);
+      deoptId = t1.$index(d, "deoptId");
+      tokenPos = t1.$index(d, "tokenPos");
+      tryIndex = t1.$index(d, "tryIndex");
+      kind = J.trim$0$s(t1.$index(d, "kind"));
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+        instruction = t1._current;
+        if (J.$eq(instruction.get$address(), address)) {
+          instruction.get$descriptors().add$1(0, new D.PcDescriptor(address, deoptId, tokenPos, tryIndex, kind, null, null, null, null));
+          return;
+        }
+      }
+      N.Logger_Logger("").warning$1("Could not find instruction with pc descriptor address: " + H.S(address));
+    },
+    _processDescriptors$1: function(descriptors) {
+      var t1;
+      for (t1 = J.get$iterator$ax(descriptors); t1.moveNext$0();)
+        this._processDescriptor$1(t1.get$current());
+    },
+    _processTicks$1: function(profileTicks) {
+      var t1, t2, i, t3, address;
+      t1 = J.getInterceptor$asx(profileTicks);
+      t2 = this.addressTicks;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(profileTicks);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        address = H.Primitives_parseInt(t1.$index(profileTicks, i), 16, null);
+        t2.$indexSet(0, address, new D.CodeTick(address, H.Primitives_parseInt(t1.$index(profileTicks, i + 1), null, null), H.Primitives_parseInt(t1.$index(profileTicks, i + 2), null, null)));
+        i += 3;
+      }
+    },
+    contains$1: function(_, address) {
+      J.$ge$n(address, this.startAddress);
+      return false;
+    },
+    get$isDartCode: function() {
+      return J.$eq(this._service$__$kind, C.CodeKind_Dart);
+    },
+    $isCode: true,
+    static: {Code_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  ServiceObject_ChangeNotifier5: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Code_loadScript_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(func) {
+      var t1, script;
+      t1 = this.this_0;
+      script = J.$index$asx(t1._service$__$function, "script");
+      if (script == null)
+        return;
+      J.load$0$x(script).then$1(t1.get$_updateDescriptors());
+    }, "call$1", null, 2, 0, null, 198, "call"],
+    $isFunction: true
+  },
+  Code__resolveCalls_closure: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(b.get$count(), a.get$count());
+    },
+    $isFunction: true
+  },
+  SocketKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "SocketKind_Listening0,SocketKind_Normal0,SocketKind_Pipe0,SocketKind_Internal0", SocketKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Listening"))
+          return C.SocketKind_Listening;
+        else if (t1.$eq(s, "Normal"))
+          return C.SocketKind_Normal;
+        else if (t1.$eq(s, "Pipe"))
+          return C.SocketKind_Pipe;
+        else if (t1.$eq(s, "Internal"))
+          return C.SocketKind_Internal;
+        N.Logger_Logger("").warning$1("Unknown socket kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  Socket: {
+    "^": "ServiceObject_ChangeNotifier6;socketOwner@,_service$__$latest,_service$__$previous,_service$__$kind,_service$__$protocol,_service$__$readClosed,_service$__$writeClosed,_service$__$closing,_service$__$listening,_service$__$fd,_service$__$localAddress,_service$__$localPort,_service$__$remoteAddress,_service$__$remotePort,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return true;
+    },
+    get$isPipe: function() {
+      return J.$eq(this._service$__$kind, C.SocketKind_Pipe);
+    },
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$protocol: function(_) {
+      return this._service$__$protocol;
+    },
+    get$readClosed: function() {
+      return this._service$__$readClosed;
+    },
+    get$writeClosed: function() {
+      return this._service$__$writeClosed;
+    },
+    get$closing: function() {
+      return this._service$__$closing;
+    },
+    get$listening: function() {
+      return this._service$__$listening;
+    },
+    get$fd: function() {
+      return this._service$__$fd;
+    },
+    get$localAddress: function() {
+      return this._service$__$localAddress;
+    },
+    get$localPort: function() {
+      return this._service$__$localPort;
+    },
+    get$remoteAddress: function() {
+      return this._service$__$remoteAddress;
+    },
+    get$remotePort: function() {
+      return this._service$__$remotePort;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      t2 = D.SocketKind_fromString(t1.$index(map, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = t1.$index(map, "readClosed");
+      this._service$__$readClosed = F.notifyPropertyChangeHelper(this, C.Symbol_readClosed, this._service$__$readClosed, t2);
+      t2 = t1.$index(map, "writeClosed");
+      this._service$__$writeClosed = F.notifyPropertyChangeHelper(this, C.Symbol_writeClosed, this._service$__$writeClosed, t2);
+      t2 = t1.$index(map, "closing");
+      this._service$__$closing = F.notifyPropertyChangeHelper(this, C.Symbol_closing, this._service$__$closing, t2);
+      t2 = t1.$index(map, "listening");
+      this._service$__$listening = F.notifyPropertyChangeHelper(this, C.Symbol_listening, this._service$__$listening, t2);
+      t2 = t1.$index(map, "protocol");
+      this._service$__$protocol = F.notifyPropertyChangeHelper(this, C.Symbol_protocol, this._service$__$protocol, t2);
+      t2 = t1.$index(map, "localAddress");
+      this._service$__$localAddress = F.notifyPropertyChangeHelper(this, C.Symbol_localAddress, this._service$__$localAddress, t2);
+      t2 = t1.$index(map, "localPort");
+      this._service$__$localPort = F.notifyPropertyChangeHelper(this, C.Symbol_localPort, this._service$__$localPort, t2);
+      t2 = t1.$index(map, "remoteAddress");
+      this._service$__$remoteAddress = F.notifyPropertyChangeHelper(this, C.Symbol_remoteAddress, this._service$__$remoteAddress, t2);
+      t2 = t1.$index(map, "remotePort");
+      this._service$__$remotePort = F.notifyPropertyChangeHelper(this, C.Symbol_remotePort, this._service$__$remotePort, t2);
+      t2 = t1.$index(map, "fd");
+      this._service$__$fd = F.notifyPropertyChangeHelper(this, C.Symbol_fd, this._service$__$fd, t2);
+      this.socketOwner = t1.$index(map, "owner");
+    }
+  },
+  ServiceObject_ChangeNotifier6: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  _upgradeObservableMap_closure: {
+    "^": "Closure:75;map_0,owner_1",
+    call$2: function(k, v) {
+      var t1, t2;
+      t1 = J.getInterceptor(v);
+      t2 = !!t1.$isObservableMap;
+      if (t2 && D._isServiceMap(v))
+        this.map_0.$indexSet(0, k, this.owner_1.getFromMap$1(v));
+      else if (!!t1.$isObservableList)
+        D._upgradeObservableList(v, this.owner_1);
+      else if (t2)
+        D._upgradeObservableMap(v, this.owner_1);
+    },
+    $isFunction: true
+  }
+}],
+["service_error_view_element", "package:observatory/src/elements/service_error_view.dart", , R, {
+  "^": "",
+  ServiceErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier45;_service_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._service_error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._service_error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._service_error_view_element$__$error, value);
+    },
+    static: {ServiceErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceErrorViewElement_methods.Element$created$0(receiver);
+        C.ServiceErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier45: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_exception_view_element", "package:observatory/src/elements/service_exception_view.dart", , D, {
+  "^": "",
+  ServiceExceptionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier46;_service_exception_view_element$__$exception,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$exception: function(receiver) {
+      return receiver._service_exception_view_element$__$exception;
+    },
+    set$exception: function(receiver, value) {
+      receiver._service_exception_view_element$__$exception = this.notifyPropertyChange$3(receiver, C.Symbol_exception, receiver._service_exception_view_element$__$exception, value);
+    },
+    static: {ServiceExceptionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceExceptionViewElement_methods.Element$created$0(receiver);
+        C.ServiceExceptionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier46: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_html", "package:observatory/service_html.dart", , U, {
+  "^": "",
+  HttpVM: {
+    "^": "VM;host,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getString$1: function(_, id) {
+      var t1;
+      if (J.endsWith$1$s(this.host, "/") && J.startsWith$1$s(id, "/"))
+        id = J.substring$1$s(id, 1);
+      N.Logger_Logger("").info$1("Fetching " + H.S(id) + " from " + H.S(this.host));
+      t1 = this.host;
+      if (typeof t1 !== "string")
+        return t1.$add();
+      return W.HttpRequest_request(J.$add$ns(t1, id), null, null, null, P.LinkedHashMap_LinkedHashMap$_literal(["Observatory-Version", "1.0"], null, null), null, null, null).then$1(new U.HttpVM_getString_closure()).catchError$1(new U.HttpVM_getString_closure0());
+    },
+    HttpVM$0: function() {
+      this.host = "http://" + H.S(window.location.host) + "/";
+    }
+  },
+  HttpVM_getString_closure: {
+    "^": "Closure:200;",
+    call$1: [function(request) {
+      return J.get$responseText$x(request);
+    }, "call$1", null, 2, 0, null, 199, "call"],
+    $isFunction: true
+  },
+  HttpVM_getString_closure0: {
+    "^": "Closure:13;",
+    call$1: [function(error) {
+      var request, t1;
+      N.Logger_Logger("").severe$1("HttpRequest.request failed.");
+      request = J.get$target$x(error);
+      t1 = J.getInterceptor$x(request);
+      return C.JsonCodec_null_null.encode$1(P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "response", t1.get$responseText(request), "kind", "NetworkException", "message", "Could not connect to service (" + H.S(t1.get$statusText(request)) + "). Check that you started the VM with the following flags: --observe"], null, null));
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  DartiumVM: {
+    "^": "VM;_pendingRequests,_requestSerial,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    _messageHandler$1: [function(msg) {
+      var t1, id, $name, data, completer;
+      t1 = J.getInterceptor$x(msg);
+      id = J.$index$asx(t1.get$data(msg), "id");
+      $name = J.$index$asx(t1.get$data(msg), "name");
+      data = J.$index$asx(t1.get$data(msg), "data");
+      if (!J.$eq($name, "observatoryData"))
+        return;
+      t1 = this._pendingRequests;
+      completer = t1.$index(0, id);
+      t1.remove$1(0, id);
+      J.complete$1$x(completer, data);
+    }, "call$1", "get$_messageHandler", 2, 0, 20, 72],
+    getString$1: function(_, path) {
+      var idString, message, completer;
+      idString = "" + this._requestSerial;
+      message = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      message.$indexSet(0, "id", idString);
+      message.$indexSet(0, "method", "observatoryQuery");
+      message.$indexSet(0, "query", H.S(path));
+      ++this._requestSerial;
+      completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+      this._pendingRequests.$indexSet(0, idString, completer);
+      J.postMessage$2$x(W._convertNativeToDart_Window(window.parent), C.JsonCodec_null_null.encode$1(message), "*");
+      return completer.future;
+    },
+    DartiumVM$0: function() {
+      var t1 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_message._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_messageHandler()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      N.Logger_Logger("").info$1("Connected to DartiumVM");
+    }
+  }
+}],
+["service_object_view_element", "package:observatory/src/elements/service_view.dart", , U, {
+  "^": "",
+  ServiceObjectViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier47;_service_object_view_element$__$object,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$object: function(receiver) {
+      return receiver._service_object_view_element$__$object;
+    },
+    set$object: function(receiver, value) {
+      receiver._service_object_view_element$__$object = this.notifyPropertyChange$3(receiver, C.Symbol_object, receiver._service_object_view_element$__$object, value);
+    },
+    _constructElementForObject$0: function(receiver) {
+      var element;
+      switch (receiver._service_object_view_element$__$object.get$serviceType()) {
+        case "AllocationProfile":
+          element = W._ElementFactoryProvider_createElement_tag("heap-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "BreakpointList":
+          element = W._ElementFactoryProvider_createElement_tag("breakpoint-list", null);
+          J.set$msg$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Class":
+          element = W._ElementFactoryProvider_createElement_tag("class-view", null);
+          J.set$cls$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Code":
+          element = W._ElementFactoryProvider_createElement_tag("code-view", null);
+          J.set$code$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Error":
+          element = W._ElementFactoryProvider_createElement_tag("error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Field":
+          element = W._ElementFactoryProvider_createElement_tag("field-view", null);
+          J.set$field$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "FlagList":
+          element = W._ElementFactoryProvider_createElement_tag("flag-list", null);
+          J.set$flagList$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Function":
+          element = W._ElementFactoryProvider_createElement_tag("function-view", null);
+          J.set$$function$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HeapMap":
+          element = W._ElementFactoryProvider_createElement_tag("heap-map", null);
+          J.set$fragmentation$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "LibraryPrefix":
+        case "TypeRef":
+        case "TypeParameter":
+        case "BoundedType":
+        case "Int32x4":
+        case "Float32x4":
+        case "Float64x4":
+        case "TypedData":
+        case "ExternalTypedData":
+        case "Capability":
+        case "ReceivePort":
+        case "SendPort":
+        case "Stacktrace":
+        case "JSRegExp":
+        case "WeakProperty":
+        case "MirrorReference":
+        case "UserTag":
+        case "Type":
+        case "Array":
+        case "Bool":
+        case "Closure":
+        case "Double":
+        case "GrowableObjectArray":
+        case "Instance":
+        case "Smi":
+        case "Mint":
+        case "Bigint":
+        case "String":
+          element = W._ElementFactoryProvider_createElement_tag("instance-view", null);
+          J.set$instance$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "IO":
+          element = W._ElementFactoryProvider_createElement_tag("io-view", null);
+          J.set$io$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerList":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServer":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-view", null);
+          J.set$httpServer$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerConnection":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-connection-view", null);
+          J.set$connection$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "SocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Socket":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-view", null);
+          J.set$socket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocket":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-view", null);
+          J.set$webSocket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Isolate":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-view", null);
+          J.set$isolate$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Library":
+          element = W._ElementFactoryProvider_createElement_tag("library-view", null);
+          J.set$library$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ProcessList":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Process":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-view", null);
+          J.set$process$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Profile":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFileList":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFile":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-view", null);
+          J.set$file$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceError":
+          element = W._ElementFactoryProvider_createElement_tag("service-error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceException":
+          element = W._ElementFactoryProvider_createElement_tag("service-exception-view", null);
+          J.set$exception$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Script":
+          element = W._ElementFactoryProvider_createElement_tag("script-view", null);
+          J.set$script$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "StackTrace":
+          element = W._ElementFactoryProvider_createElement_tag("stack-trace", null);
+          J.set$trace$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "VM":
+          element = W._ElementFactoryProvider_createElement_tag("vm-view", null);
+          J.set$vm$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        default:
+          element = W._ElementFactoryProvider_createElement_tag("json-view", null);
+          J.set$map$ax(element, receiver._service_object_view_element$__$object);
+          return element;
+      }
+    },
+    objectChanged$1: [function(receiver, oldValue) {
+      var t1, type, element;
+      this._clearChildren$0(receiver);
+      t1 = receiver._service_object_view_element$__$object;
+      if (t1 == null) {
+        N.Logger_Logger("").info$1("Viewing null object.");
+        return;
+      }
+      type = t1.get$serviceType();
+      element = this._constructElementForObject$0(receiver);
+      if (element == null) {
+        N.Logger_Logger("").info$1("Unable to find a view element for '" + H.S(type) + "'");
+        return;
+      }
+      receiver.appendChild(element);
+      N.Logger_Logger("").info$1("Viewing object of '" + H.S(type) + "'");
+    }, "call$1", "get$objectChanged", 2, 0, 13, 57],
+    $isServiceObjectViewElement: true,
+    static: {ServiceObjectViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceObjectViewElement_methods.Element$created$0(receiver);
+        C.ServiceObjectViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier47: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_ref_element", "package:observatory/src/elements/service_ref.dart", , Q, {
+  "^": "",
+  ServiceRefElement: {
+    "^": "ObservatoryElement_ChangeNotifier0;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$ref: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    set$ref: function(receiver, value) {
+      receiver._service_ref_element$__$ref = this.notifyPropertyChange$3(receiver, C.Symbol_ref, receiver._service_ref_element$__$ref, value);
+    },
+    get$internal: function(receiver) {
+      return receiver._service_ref_element$__$internal;
+    },
+    set$internal: function(receiver, value) {
+      receiver._service_ref_element$__$internal = this.notifyPropertyChange$3(receiver, C.Symbol_internal, receiver._service_ref_element$__$internal, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_url, "", this.get$url(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_name, [], this.get$name(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_nameIsEmpty, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hoverText, "", this.get$hoverText(receiver));
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$url: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      t1 = J.get$link$x(t1);
+      $.location.toString;
+      return "#" + H.S(t1);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return t1.get$vmName();
+    },
+    get$name: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return J.get$name$x(t1);
+    },
+    get$nameIsEmpty: function(receiver) {
+      return J.get$isEmpty$asx(this.get$name(receiver));
+    },
+    static: {ServiceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceRefElement_methods.Element$created$0(receiver);
+        C.ServiceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier0: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["sliding_checkbox_element", "package:observatory/src/elements/sliding_checkbox.dart", , Q, {
+  "^": "",
+  SlidingCheckboxElement: {
+    "^": "PolymerElement_ChangeNotifier2;_sliding_checkbox_element$__$checked,_sliding_checkbox_element$__$checkedText,_sliding_checkbox_element$__$uncheckedText,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$checked: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checked;
+    },
+    set$checked: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, value);
+    },
+    get$checkedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checkedText;
+    },
+    set$checkedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checkedText = this.notifyPropertyChange$3(receiver, C.Symbol_checkedText, receiver._sliding_checkbox_element$__$checkedText, value);
+    },
+    get$uncheckedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$uncheckedText;
+    },
+    set$uncheckedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$uncheckedText = this.notifyPropertyChange$3(receiver, C.Symbol_uncheckedText, receiver._sliding_checkbox_element$__$uncheckedText, value);
+    },
+    change$3: [function(receiver, e, details, target) {
+      var t1 = J.get$checked$x((receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#slide-switch"));
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, t1);
+    }, "call$3", "get$change", 6, 0, 102, 1, 201, 94],
+    static: {SlidingCheckboxElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.SlidingCheckboxElement_methods.Element$created$0(receiver);
+        C.SlidingCheckboxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier2: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["smoke", "package:smoke/smoke.dart", , A, {
+  "^": "",
+  QueryOptions: {
+    "^": "Object;includeFields,includeProperties,includeInherited,includeUpTo,excludeFinal,includeMethods,withAnnotations,matches",
+    matches$1: function($receiver, arg0) {
+      return this.matches.call$1(arg0);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(options:");
+      t1.write$1(this.includeFields ? "fields " : "");
+      t1.write$1(this.includeProperties ? "properties " : "");
+      t1.write$1(this.includeMethods ? "methods " : "");
+      t1.write$1(this.includeInherited ? "inherited " : "_");
+      t1.write$1(this.excludeFinal ? "no finals " : "");
+      t1.write$1("annotations: " + H.S(this.withAnnotations));
+      t1.write$1(this.matches != null ? "with matcher" : "");
+      t1.write$1(")");
+      return t1._contents;
+    }
+  },
+  Declaration: {
+    "^": "Object;name>,kind>,isFinal>,type>,isStatic,annotations<",
+    get$isField: function() {
+      return this.kind === C.DeclarationKind_0;
+    },
+    get$isProperty: function() {
+      return this.kind === C.DeclarationKind_1;
+    },
+    get$isMethod: function() {
+      return this.kind === C.DeclarationKind_2;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return t1.get$hashCode(t1);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isDeclaration && this.name.$eq(0, other.name) && this.kind === other.kind && this.isFinal === other.isFinal && this.type.$eq(0, other.type) && this.isStatic === other.isStatic && X.compareLists(this.annotations, other.annotations, false);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(declaration ");
+      t1.write$1(this.name);
+      t1.write$1(this.kind === C.DeclarationKind_1 ? " (property) " : " (method) ");
+      t1.write$1(this.isFinal ? "final " : "");
+      t1.write$1(this.isStatic ? "static " : "");
+      t1.write$1(this.annotations);
+      t1.write$1(")");
+      return t1._contents;
+    },
+    $isDeclaration: true
+  },
+  DeclarationKind: {
+    "^": "Object;kind>"
+  }
+}],
+["smoke.src.common", "package:smoke/src/common.dart", , X, {
+  "^": "",
+  adjustList: function(input, min, max) {
+    var t1, t2;
+    t1 = input.length;
+    if (t1 < min) {
+      t2 = Array(min);
+      t2.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t2, 0, t1, input, 0);
+      return t2;
+    }
+    if (t1 > max) {
+      t1 = Array(max);
+      t1.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t1, 0, max, input, 0);
+      return t1;
+    }
+    return input;
+  },
+  matchesAnnotation: function(metadata, queryAnnotations) {
+    var t1, meta, t2, t3, queryMeta, t4;
+    t1 = new H.ListIterator(metadata, metadata.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(metadata, 0)];
+    for (; t1.moveNext$0();) {
+      meta = t1._current;
+      queryAnnotations.length;
+      t2 = new H.ListIterator(queryAnnotations, 1, 0, null);
+      t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(queryAnnotations, 0)];
+      t3 = J.getInterceptor(meta);
+      for (; t2.moveNext$0();) {
+        queryMeta = t2._current;
+        if (t3.$eq(meta, queryMeta))
+          return true;
+        if (!!J.getInterceptor(queryMeta).$isType) {
+          t4 = t3.get$runtimeType(meta);
+          t4 = $.get$typeInspector().isSubclassOf$2(t4, queryMeta);
+        } else
+          t4 = false;
+        if (t4)
+          return true;
+      }
+    }
+    return false;
+  },
+  minArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t2)
+      return 0;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t1 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t1)
+      return 3;
+    return 4;
+  },
+  maxArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t2)
+      return 3;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t1 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t1)
+      return 0;
+    return -1;
+  },
+  compareLists: function(a, b, unordered) {
+    var t1, t2, bSet, i, t3;
+    t1 = a.length;
+    t2 = b.length;
+    if (t1 !== t2)
+      return false;
+    if (unordered) {
+      bSet = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      bSet.addAll$1(0, b);
+      for (i = 0; i < a.length; ++i)
+        if (!bSet.contains$1(0, a[i]))
+          return false;
+    } else
+      for (i = 0; i < t1; ++i) {
+        t3 = a[i];
+        if (i >= t2)
+          return H.ioore(b, i);
+        if (t3 !== b[i])
+          return false;
+      }
+    return true;
+  }
+}],
+["smoke.src.implementation", "package:smoke/src/implementation.dart", , D, {
+  "^": "",
+  throwNotConfiguredError: function() {
+    throw H.wrapException(P.Exception_Exception("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)."));
+  }
+}],
+["smoke.static", "package:smoke/static.dart", , O, {
+  "^": "",
+  StaticConfiguration: {
+    "^": "Object;getters,setters,parents,declarations,staticMethods,names<,checkedMode"
+  },
+  GeneratedObjectAccessorService: {
+    "^": "Object;_getters,_setters,_staticMethods",
+    read$2: function(object, $name) {
+      var getter = this._getters.$index(0, $name);
+      if (getter == null)
+        throw H.wrapException(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + H.S(object)));
+      return getter.call$1(object);
+    },
+    write$3: function(object, $name, value) {
+      var setter = this._setters.$index(0, $name);
+      if (setter == null)
+        throw H.wrapException(O.MissingCodeException$("setter \"" + H.S($name) + "\" in " + H.S(object)));
+      setter.call$2(object, value);
+    },
+    invoke$5$adjust$namedArgs: function(object, $name, args, adjust, namedArgs) {
+      var method, tentativeError, getter, min, max, t1, exception;
+      method = null;
+      if (!!J.getInterceptor(object).$isType) {
+        this._staticMethods.$index(0, object);
+        method = null;
+      } else {
+        getter = this._getters.$index(0, $name);
+        method = getter == null ? null : getter.call$1(object);
+      }
+      if (method == null)
+        throw H.wrapException(O.MissingCodeException$("method \"" + H.S($name) + "\" in " + H.S(object)));
+      tentativeError = null;
+      if (adjust) {
+        min = X.minArgs(method);
+        if (min > 3) {
+          tentativeError = "we tried to adjust the arguments for calling \"" + H.S($name) + "\", but we couldn't determine the exact number of arguments it expects (it is more than 3).";
+          args = X.adjustList(args, min, P.max(min, J.get$length$asx(args)));
+        } else {
+          max = X.maxArgs(method);
+          t1 = max >= 0 ? max : J.get$length$asx(args);
+          args = X.adjustList(args, min, t1);
+        }
+      }
+      try {
+        t1 = H.Primitives_applyFunction(method, args, P.Function__toMangledNames(null));
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          if (tentativeError != null)
+            P.print(tentativeError);
+          throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+  },
+  GeneratedTypeInspectorService: {
+    "^": "Object;_parents,_declarations,_checkedMode",
+    isSubclassOf$2: function(type, supertype) {
+      var t1, parentType, t2;
+      if (type.$eq(0, supertype) || supertype.$eq(0, C.Type_HqF))
+        return true;
+      for (t1 = this._parents; !J.$eq(type, C.Type_HqF); type = parentType) {
+        parentType = t1.$index(0, type);
+        t2 = J.getInterceptor(parentType);
+        if (t2.$eq(parentType, supertype))
+          return true;
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return false;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\" (" + t2.toString$0(parentType) + ")"));
+        }
+      }
+      return false;
+    },
+    hasInstanceMethod$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic;
+    },
+    hasStaticMethod$2: function(type, $name) {
+      var map, decl;
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return false;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      decl = map.$index(0, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && decl.isStatic;
+    },
+    getDeclaration$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      if (decl == null) {
+        if (!this._checkedMode)
+          return;
+        throw H.wrapException(O.MissingCodeException$("declaration for " + H.S(type) + "." + H.S($name)));
+      }
+      return decl;
+    },
+    query$2: function(_, type, options) {
+      var result, superclass, map, t1, decl, t2;
+      result = [];
+      if (options.includeInherited) {
+        superclass = this._parents.$index(0, type);
+        if (superclass == null) {
+          if (this._checkedMode)
+            throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        } else if (!superclass.$eq(0, options.includeUpTo))
+          result = this.query$2(0, superclass, options);
+      }
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return result;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      for (t1 = J.get$iterator$ax(map.get$values(map)); t1.moveNext$0();) {
+        decl = t1.get$current();
+        if (!options.includeFields && decl.get$isField())
+          continue;
+        if (!options.includeProperties && decl.get$isProperty())
+          continue;
+        if (options.excludeFinal && J.get$isFinal$x(decl) === true)
+          continue;
+        if (!options.includeMethods && decl.get$isMethod())
+          continue;
+        if (options.matches != null && options.matches$1(0, J.get$name$x(decl)) !== true)
+          continue;
+        t2 = options.withAnnotations;
+        if (t2 != null && !X.matchesAnnotation(decl.get$annotations(), t2))
+          continue;
+        result.push(decl);
+      }
+      return result;
+    },
+    _findDeclaration$2: function(type, $name) {
+      var t1, t2, declarations, declaration, parentType;
+      for (t1 = this._parents, t2 = this._declarations; !J.$eq(type, C.Type_HqF); type = parentType) {
+        declarations = t2.$index(0, type);
+        if (declarations != null) {
+          declaration = declarations.$index(0, $name);
+          if (declaration != null)
+            return declaration;
+        }
+        parentType = t1.$index(0, type);
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        }
+      }
+      return;
+    }
+  },
+  GeneratedSymbolConverterService: {
+    "^": "Object;_names,_symbols",
+    GeneratedSymbolConverterService$1: function(configuration) {
+      this._names.forEach$1(0, new O.GeneratedSymbolConverterService_closure(this));
+    },
+    static: {GeneratedSymbolConverterService$: function(configuration) {
+        var t1 = new O.GeneratedSymbolConverterService(configuration.names, P.LinkedHashMap_LinkedHashMap$_empty(null, null));
+        t1.GeneratedSymbolConverterService$1(configuration);
+        return t1;
+      }}
+  },
+  GeneratedSymbolConverterService_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0._symbols.$indexSet(0, v, k);
+    },
+    $isFunction: true
+  },
+  MissingCodeException: {
+    "^": "Object;description",
+    toString$0: function(_) {
+      return "Missing " + this.description + ". Code generation for the smoke package seems incomplete.";
+    },
+    static: {MissingCodeException$: function(description) {
+        return new O.MissingCodeException(description);
+      }}
+  }
+}],
+["stack_frame_element", "package:observatory/src/elements/stack_frame.dart", , K, {
+  "^": "",
+  StackFrameElement: {
+    "^": "ObservatoryElement_ChangeNotifier48;_stack_frame_element$__$frame,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$frame: function(receiver) {
+      return receiver._stack_frame_element$__$frame;
+    },
+    set$frame: function(receiver, value) {
+      receiver._stack_frame_element$__$frame = this.notifyPropertyChange$3(receiver, C.Symbol_frame, receiver._stack_frame_element$__$frame, value);
+    },
+    static: {StackFrameElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackFrameElement_methods.Element$created$0(receiver);
+        C.StackFrameElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier48: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["stack_trace_element", "package:observatory/src/elements/stack_trace.dart", , X, {
+  "^": "",
+  StackTraceElement: {
+    "^": "ObservatoryElement_ChangeNotifier49;_stack_trace_element$__$trace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$trace: function(receiver) {
+      return receiver._stack_trace_element$__$trace;
+    },
+    set$trace: function(receiver, value) {
+      receiver._stack_trace_element$__$trace = this.notifyPropertyChange$3(receiver, C.Symbol_trace, receiver._stack_trace_element$__$trace, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._stack_trace_element$__$trace).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {StackTraceElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackTraceElement_methods.Element$created$0(receiver);
+        C.StackTraceElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier49: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["template_binding", "package:template_binding/template_binding.dart", , M, {
+  "^": "",
+  _updateAttribute: function(node, $name, conditional, value) {
+    var t1, t2;
+    if (conditional) {
+      t1 = null != value && false !== value;
+      t2 = J.getInterceptor$x(node);
+      if (t1)
+        t2.get$attributes(node)._html$_element.setAttribute($name, "");
+      else
+        t2.get$attributes(node).remove$1(0, $name);
+    } else {
+      t1 = J.get$attributes$x(node);
+      t2 = value == null ? "" : H.S(value);
+      t1._html$_element.setAttribute($name, t2);
+    }
+  },
+  _getTreeScope: function(node) {
+    var $parent;
+    for (; $parent = J.get$parentNode$x(node), $parent != null; node = $parent)
+      ;
+    return M._hasGetElementById(node) ? node : null;
+  },
+  _hasGetElementById: function(node) {
+    var t1 = J.getInterceptor(node);
+    return !!t1.$isDocument || !!t1.$isShadowRoot || !!t1.$isSvgSvgElement;
+  },
+  _createInstanceBindingMap: function(node, delegate) {
+    var map, t1, c, children, index, childMap;
+    map = M._getBindings(node, delegate);
+    if (map == null)
+      map = new M._InstanceBindingMap([], null, null);
+    for (t1 = J.getInterceptor$x(node), c = t1.get$firstChild(node), children = null, index = 0; c != null; c = c.nextSibling, ++index) {
+      childMap = M._createInstanceBindingMap(c, delegate);
+      if (childMap == null)
+        continue;
+      if (children == null) {
+        children = Array(t1.get$nodes(node)._this.childNodes.length);
+        children.fixed$length = init;
+      }
+      if (index >= children.length)
+        return H.ioore(children, index);
+      children[index] = childMap;
+    }
+    map.children = children;
+    return map;
+  },
+  _cloneAndBindInstance: function(node, $parent, stagingDocument, bindings, model, delegate, instanceBindings, instanceRecord) {
+    var clone, c, t1, i;
+    clone = $parent.appendChild(J.importNode$2$x(stagingDocument, node, false));
+    for (c = node.firstChild, t1 = bindings != null, i = 0; c != null; c = c.nextSibling, ++i)
+      M._cloneAndBindInstance(c, clone, stagingDocument, t1 ? bindings.getChild$1(i) : null, model, delegate, instanceBindings, null);
+    if (bindings.get$isTemplate()) {
+      M.nodeBindFallback(clone)._decorate$1(node);
+      if (delegate != null)
+        J.set$bindingDelegate$x(M.nodeBindFallback(clone), delegate);
+    }
+    M._processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  },
+  _getFragmentRoot: function(node) {
+    var p;
+    for (; p = J.get$parentNode$x(node), p != null; node = p)
+      ;
+    return node;
+  },
+  _searchRefId: function(node, id) {
+    var selector, t1, values, instance, ref, t2;
+    if (id == null || id === "")
+      return;
+    selector = "#" + H.S(id);
+    for (; true;) {
+      node = M._getFragmentRoot(node);
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(node, "expando$values");
+      instance = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+      t1 = instance == null;
+      if (!t1 && instance.get$_protoContent() != null)
+        ref = J.querySelector$1$x(instance.get$_protoContent(), selector);
+      else {
+        t2 = J.getInterceptor(node);
+        ref = !!t2.$isDocument || !!t2.$isShadowRoot || !!t2.$isSvgSvgElement ? t2.getElementById$1(node, id) : null;
+      }
+      if (ref != null)
+        return ref;
+      if (t1)
+        return;
+      node = instance.get$_templateCreator();
+      if (node == null)
+        return;
+    }
+  },
+  _getDelegateFactory: function($name, node, delegate) {
+    if (delegate == null)
+      return;
+    return new M._getDelegateFactory_closure($name, node, delegate);
+  },
+  _getBindings: function(node, delegate) {
+    var t1, tokens;
+    t1 = J.getInterceptor(node);
+    if (!!t1.$isElement)
+      return M._parseAttributeBindings(node, delegate);
+    if (!!t1.$isText) {
+      tokens = S.MustacheTokens_parse(node.textContent, M._getDelegateFactory("text", node, delegate));
+      if (tokens != null)
+        return new M._InstanceBindingMap(["text", tokens], null, null);
+    }
+    return;
+  },
+  _parseWithDefault: function(element, $name, delegate) {
+    var v = element.getAttribute($name);
+    if (v === "")
+      v = "{{}}";
+    return S.MustacheTokens_parse(v, M._getDelegateFactory($name, element, delegate));
+  },
+  _parseAttributeBindings: function(element, delegate) {
+    var t1, isTemplateNode, t2, bindings, result, t3;
+    t1 = {};
+    t1.bindings_0 = null;
+    isTemplateNode = M.isSemanticTemplate(element);
+    new W._ElementAttributeMap(element).forEach$1(0, new M._parseAttributeBindings_closure(t1, element, delegate, isTemplateNode));
+    if (isTemplateNode) {
+      t2 = t1.bindings_0;
+      if (t2 == null) {
+        bindings = [];
+        t1.bindings_0 = bindings;
+        t1 = bindings;
+      } else
+        t1 = t2;
+      result = new M._TemplateBindingMap(null, null, null, t1, null, null);
+      t1 = M._parseWithDefault(element, "if", delegate);
+      result._if = t1;
+      t2 = M._parseWithDefault(element, "bind", delegate);
+      result._bind = t2;
+      t3 = M._parseWithDefault(element, "repeat", delegate);
+      result._repeat = t3;
+      if (t1 != null && t2 == null && t3 == null)
+        result._bind = S.MustacheTokens_parse("{{}}", M._getDelegateFactory("bind", element, delegate));
+      return result;
+    }
+    t1 = t1.bindings_0;
+    return t1 == null ? null : new M._InstanceBindingMap(t1, null, null);
+  },
+  _processOneTimeBinding: function($name, tokens, node, model) {
+    var delegateFn, value, t1, t2, values, i, t3;
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      value = delegateFn != null ? delegateFn.call$3(model, node, true) : tokens.getPath$1(0).getValueFrom$1(model);
+      return tokens.get$isSimplePath() ? value : tokens.combinator$1(value);
+    }
+    t1 = J.getInterceptor$asx(tokens);
+    t2 = t1.get$length(tokens);
+    if (typeof t2 !== "number")
+      return H.iae(t2);
+    values = Array(t2);
+    values.fixed$length = init;
+    t2 = values.length;
+    i = 0;
+    while (true) {
+      t3 = t1.get$length(tokens);
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      if (!(i < t3))
+        break;
+      delegateFn = tokens.getPrepareBinding$1(i);
+      t3 = delegateFn != null ? delegateFn.call$3(model, node, false) : tokens.getPath$1(i).getValueFrom$1(model);
+      if (i >= t2)
+        return H.ioore(values, i);
+      values[i] = t3;
+      ++i;
+    }
+    return tokens.combinator$1(values);
+  },
+  _processBinding: function($name, tokens, node, model) {
+    var delegateFn, observer, t1, t2, i, oneTime, value, path;
+    if (tokens.get$onlyOneTime())
+      return M._processOneTimeBinding($name, tokens, node, model);
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      if (delegateFn != null)
+        observer = delegateFn.call$3(model, node, false);
+      else {
+        t1 = tokens.getPath$1(0);
+        t1 = !!J.getInterceptor(t1).$isPropertyPath ? t1 : L.PropertyPath_PropertyPath(t1);
+        t2 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t2 + 1;
+        observer = new L.PathObserver(t1, model, null, t2, null, null, null);
+      }
+      return tokens.get$isSimplePath() ? observer : new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+    }
+    t1 = $._Observer__nextBirthId;
+    $._Observer__nextBirthId = t1 + 1;
+    observer = new L.CompoundObserver(null, [], t1, null, null, null);
+    observer._path_observer$_value = [];
+    t1 = J.getInterceptor$asx(tokens);
+    i = 0;
+    while (true) {
+      t2 = t1.get$length(tokens);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(i < t2))
+        break;
+      c$0: {
+        oneTime = tokens.getOneTime$1(i);
+        delegateFn = tokens.getPrepareBinding$1(i);
+        if (delegateFn != null) {
+          value = delegateFn.call$3(model, node, oneTime);
+          if (oneTime === true)
+            observer.addPath$1(value);
+          else {
+            if (observer._notifyCallback != null || observer._observed == null)
+              H.throwExpression(P.StateError$("Cannot add observers once started."));
+            J.open$1$x(value, observer.get$_deliver());
+            t2 = observer._observed;
+            t2.push(C.C__ObserverSentinel);
+            t2.push(value);
+          }
+          break c$0;
+        }
+        path = tokens.getPath$1(i);
+        if (oneTime === true)
+          observer.addPath$1(path.getValueFrom$1(model));
+        else
+          observer.addPath$2(model, path);
+      }
+      ++i;
+    }
+    return new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+  },
+  _processBindings: function(node, map, model, instanceBindings) {
+    var t1, bindings, nodeExt, t2, t3, i, $name, tokens, binding, templateExt, iter;
+    t1 = J.getInterceptor$x(map);
+    bindings = t1.get$bindings(map);
+    nodeExt = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+    for (t2 = J.getInterceptor$asx(bindings), t3 = J.getInterceptor$x(nodeExt), i = 0; i < t2.get$length(bindings); i += 2) {
+      $name = t2.$index(bindings, i);
+      tokens = t2.$index(bindings, i + 1);
+      binding = t3.bind$3$oneTime(nodeExt, $name, M._processBinding($name, tokens, node, model), tokens.get$onlyOneTime());
+      if (binding != null && true)
+        instanceBindings.push(binding);
+    }
+    t3.bindFinished$0(nodeExt);
+    if (!t1.$is_TemplateBindingMap)
+      return;
+    templateExt = M.nodeBindFallback(node);
+    templateExt.set$_model(model);
+    iter = templateExt._processBindingDirectives$1(map);
+    if (iter != null && true)
+      instanceBindings.push(iter);
+  },
+  nodeBindFallback: function(node) {
+    var t1, values, extension, t2;
+    t1 = $.get$_expando();
+    t1.toString;
+    values = H.Primitives_getProperty(node, "expando$values");
+    extension = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+    if (extension != null)
+      return extension;
+    t2 = J.getInterceptor(node);
+    if (!!t2.$isInputElement)
+      extension = new M._InputElementExtension(node, null, null);
+    else if (!!t2.$isSelectElement)
+      extension = new M._SelectElementExtension(node, null, null);
+    else if (!!t2.$isTextAreaElement)
+      extension = new M._TextAreaElementExtension(node, null, null);
+    else if (!!t2.$isElement) {
+      if (!(node.tagName === "TEMPLATE" && node.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t2.get$attributes(node)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(node)) === true))
+          t2 = node.tagName === "template" && t2.get$namespaceUri(node) === "http://www.w3.org/2000/svg";
+        else
+          t2 = true;
+      else
+        t2 = true;
+      extension = t2 ? new M.TemplateBindExtension(null, null, null, false, null, null, null, null, null, null, node, null, null) : new M._ElementExtension(node, null, null);
+    } else
+      extension = !!t2.$isText ? new M._TextExtension(node, null, null) : new M.NodeBindExtension(node, null, null);
+    t1.$indexSet(0, node, extension);
+    return extension;
+  },
+  isSemanticTemplate: function(n) {
+    var t1 = J.getInterceptor(n);
+    if (!!t1.$isElement)
+      if (!(n.tagName === "TEMPLATE" && n.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t1.get$attributes(n)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t1.get$localName(n)) === true))
+          t1 = n.tagName === "template" && t1.get$namespaceUri(n) === "http://www.w3.org/2000/svg";
+        else
+          t1 = true;
+      else
+        t1 = true;
+    else
+      t1 = false;
+    return t1;
+  },
+  BindingDelegate: {
+    "^": "Object;_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      return;
+    },
+    static: {"^": "BindingDelegate__DEFAULT"}
+  },
+  _ElementExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, node, t2, t3, t4, conditional;
+      t1 = {};
+      t1.name_0 = $name;
+      node = this.get$_node();
+      t2 = J.getInterceptor(node);
+      t3 = !!t2.$isOptionElement && J.$eq(t1.name_0, "value");
+      t4 = t1.name_0;
+      if (t3) {
+        new W._ElementAttributeMap(node).remove$1(0, t4);
+        if (oneTime)
+          return this._updateOption$1(value);
+        t2 = this.get$_updateOption();
+        t2.call$1(J.open$1$x(value, t2));
+      } else {
+        conditional = J.endsWith$1$s(t4, "?");
+        if (conditional) {
+          t2.get$attributes(node).remove$1(0, t1.name_0);
+          t2 = t1.name_0;
+          t3 = J.getInterceptor$asx(t2);
+          t1.name_0 = t3.substring$2(t2, 0, J.$sub$n(t3.get$length(t2), 1));
+        }
+        if (oneTime)
+          return M._updateAttribute(this.get$_node(), t1.name_0, conditional, value);
+        t2 = new M._ElementExtension_bind_closure(t1, this, conditional);
+        t2.call$1(J.open$1$x(value, t2));
+      }
+      t1 = t1.name_0;
+      return $.enableBindingsReflection ? this._updateBindings$2(t1, value) : value;
+    },
+    _updateOption$1: [function(newValue) {
+      var node, t1, select, t2, bindings, valueBinding, oldValue, selectBinding;
+      node = this.get$_node();
+      t1 = J.getInterceptor$x(node);
+      select = t1.get$parentNode(node);
+      t2 = J.getInterceptor(select);
+      if (!!t2.$isSelectElement) {
+        bindings = J.get$bindings$x(M.nodeBindFallback(select));
+        if (bindings != null) {
+          valueBinding = J.$index$asx(bindings, "value");
+          if (!!J.getInterceptor(valueBinding).$is_InputBinding) {
+            oldValue = select.value;
+            selectBinding = valueBinding;
+          } else {
+            oldValue = null;
+            selectBinding = null;
+          }
+        } else {
+          oldValue = null;
+          selectBinding = null;
+        }
+      } else {
+        oldValue = null;
+        selectBinding = null;
+      }
+      t1.set$value(node, newValue == null ? "" : H.S(newValue));
+      if (selectBinding != null && !J.$eq(t2.get$value(select), oldValue)) {
+        t1 = t2.get$value(select);
+        J.set$value$x(selectBinding.get$_template_binding$_bindable(), t1);
+      }
+    }, "call$1", "get$_updateOption", 2, 0, 20, 58]
+  },
+  _ElementExtension_bind_closure: {
+    "^": "Closure:13;box_0,this_1,conditional_2",
+    call$1: [function(x) {
+      return M._updateAttribute(this.this_1.get$_node(), this.box_0.name_0, this.conditional_2, x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  },
+  _InputBinding: {
+    "^": "Bindable;_node<,_eventSub,_template_binding$_bindable<,_propertyName",
+    _template_binding$_updateNode$1: [function(newValue) {
+      return M._InputBinding__updateProperty(this._node, newValue, this._propertyName);
+    }, "call$1", "get$_template_binding$_updateNode", 2, 0, 20, 58],
+    _nodeChanged$1: [function(e) {
+      var t1, t2, t3, r, checkedBinding;
+      switch (this._propertyName) {
+        case "value":
+          t1 = J.get$value$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+        case "checked":
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          t3 = t2.get$checked(t1);
+          J.set$value$x(this._template_binding$_bindable, t3);
+          if (!!t2.$isInputElement && J.$eq(t2.get$type(t1), "radio"))
+            for (t1 = J.get$iterator$ax(M._InputBinding__getAssociatedRadioButtons(t1)); t1.moveNext$0();) {
+              r = t1.get$current();
+              checkedBinding = J.$index$asx(J.get$bindings$x(!!J.getInterceptor(r).$isNodeBindExtension ? r : M.nodeBindFallback(r)), "checked");
+              if (checkedBinding != null)
+                J.set$value$x(checkedBinding, false);
+            }
+          break;
+        case "selectedIndex":
+          t1 = J.get$selectedIndex$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+      }
+      O.dirtyCheckObservables();
+    }, "call$1", "get$_nodeChanged", 2, 0, 20, 1],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._template_binding$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._template_binding$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._template_binding$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._eventSub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eventSub = null;
+      }
+      t1 = this._template_binding$_bindable;
+      if (t1 != null) {
+        J.close$0$x(t1);
+        this._template_binding$_bindable = null;
+      }
+    },
+    $is_InputBinding: true,
+    static: {"^": "_InputBinding__checkboxEventType", _InputBinding__updateProperty: function(node, newValue, propertyName) {
+        switch (propertyName) {
+          case "checked":
+            J.set$checked$x(node, null != newValue && false !== newValue);
+            return;
+          case "selectedIndex":
+            J.set$selectedIndex$x(node, M._InputBinding__toInt(newValue));
+            return;
+          case "value":
+            J.set$value$x(node, newValue == null ? "" : H.S(newValue));
+            return;
+        }
+      }, _InputBinding__getStreamForInputType: function(element) {
+        var t1 = J.getInterceptor(element);
+        if (!!t1.$isOptionElement)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(element, C.EventStreamProvider_input._eventType, false), [null]);
+        switch (t1.get$type(element)) {
+          case "checkbox":
+            return $.get$_InputBinding__checkboxEventType().forTarget$1(element);
+          case "radio":
+          case "select-multiple":
+          case "select-one":
+            return t1.get$onChange(element);
+          case "range":
+            if (J.contains$1$asx(window.navigator.userAgent, new H.JSSyntaxRegExp("Trident|MSIE", H.JSSyntaxRegExp_makeNative("Trident|MSIE", false, true, false), null, null)))
+              return t1.get$onChange(element);
+            break;
+        }
+        return t1.get$onInput(element);
+      }, _InputBinding__getAssociatedRadioButtons: function(element) {
+        var t1, treeScope, radios;
+        t1 = J.getInterceptor$x(element);
+        if (t1.get$form(element) != null) {
+          t1 = t1.get$form(element);
+          t1.toString;
+          t1 = new W._ChildNodeListLazy(t1);
+          return t1.where$1(t1, new M._InputBinding__getAssociatedRadioButtons_closure(element));
+        } else {
+          treeScope = M._getTreeScope(element);
+          if (treeScope == null)
+            return C.List_empty;
+          radios = J.querySelectorAll$1$x(treeScope, "input[type=\"radio\"][name=\"" + H.S(t1.get$name(element)) + "\"]");
+          return radios.where$1(radios, new M._InputBinding__getAssociatedRadioButtons_closure0(element));
+        }
+      }, _InputBinding__toInt: function(value) {
+        if (typeof value === "string")
+          return H.Primitives_parseInt(value, null, new M._InputBinding__toInt_closure());
+        return typeof value === "number" && Math.floor(value) === value ? value : 0;
+      }}
+  },
+  closure10: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var checkbox, t1, fired, t2, $event;
+      checkbox = document.createElement("div", null).appendChild(W.InputElement_InputElement(null));
+      t1 = J.getInterceptor$x(checkbox);
+      t1.set$type(checkbox, "checkbox");
+      fired = [];
+      t2 = t1.get$onClick(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(new M._closure1(fired)), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1 = t1.get$onChange(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new M._closure2(fired)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = window;
+      $event = document.createEvent("MouseEvent");
+      J._initMouseEvent$15$x($event, "click", true, true, t1, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      checkbox.dispatchEvent($event);
+      return fired.length === 1 ? C.EventStreamProvider_change : C.JSArray_methods.get$first(fired);
+    },
+    $isFunction: true
+  },
+  _closure1: {
+    "^": "Closure:13;fired_0",
+    call$1: [function(e) {
+      this.fired_0.push(C.EventStreamProvider_click);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _closure2: {
+    "^": "Closure:13;fired_1",
+    call$1: [function(e) {
+      this.fired_1.push(C.EventStreamProvider_change);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure: {
+    "^": "Closure:13;element_0",
+    call$1: function(el) {
+      var t1, t2;
+      t1 = this.element_0;
+      t2 = J.getInterceptor(el);
+      if (!t2.$eq(el, t1))
+        if (!!t2.$isInputElement)
+          if (el.type === "radio") {
+            t2 = el.name;
+            t1 = J.get$name$x(t1);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure0: {
+    "^": "Closure:13;element_1",
+    call$1: function(el) {
+      var t1 = J.getInterceptor(el);
+      return !t1.$eq(el, this.element_1) && t1.get$form(el) == null;
+    },
+    $isFunction: true
+  },
+  _InputBinding__toInt_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return 0;
+    },
+    $isFunction: true
+  },
+  _InputElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "value") && !t1.$eq($name, "checked"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  _InstanceBindingMap: {
+    "^": "Object;bindings>,children>,content>",
+    get$isTemplate: function() {
+      return false;
+    },
+    getChild$1: function(index) {
+      var t1 = this.children;
+      if (t1 == null || index >= t1.length)
+        return;
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _TemplateBindingMap: {
+    "^": "_InstanceBindingMap;_if,_bind,_repeat,bindings,children,content",
+    get$isTemplate: function() {
+      return true;
+    },
+    $is_TemplateBindingMap: true
+  },
+  NodeBindExtension: {
+    "^": "Object;_node<,bindings*,_templateInstance?",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      window;
+      t1 = "Unhandled binding to Node: " + H.Primitives_objectToString(this) + " " + H.S($name) + " " + H.S(value) + " " + oneTime;
+      if (typeof console != "undefined")
+        console.error(t1);
+      return;
+    },
+    bindFinished$0: function(_) {
+    },
+    get$templateInstance: function(_) {
+      var t1 = this._templateInstance;
+      if (t1 != null)
+        ;
+      else if (J.get$parent$x(this.get$_node()) != null) {
+        t1 = J.get$parent$x(this.get$_node());
+        t1 = J.get$templateInstance$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+      } else
+        t1 = null;
+      return t1;
+    },
+    _updateBindings$2: function($name, binding) {
+      var t1, old;
+      t1 = this.bindings;
+      if (t1 == null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.bindings = t1;
+      }
+      old = t1.$index(0, $name);
+      if (old != null)
+        J.close$0$x(old);
+      this.bindings.$indexSet(0, $name, binding);
+      return binding;
+    },
+    $isNodeBindExtension: true
+  },
+  TemplateInstance: {
+    "^": "Object;model>,_firstNode,_lastNode"
+  },
+  _SelectElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (J.$eq($name, "selectedindex"))
+        $name = "selectedIndex";
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "selectedIndex") && !t1.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  TemplateBindExtension: {
+    "^": "_ElementExtension;_model?,_bindingDelegate,_template_binding$_iterator<,_setModelScheduled,_templateInstanceRef?,_content?,_templateIsDecorated?,_stagingDocument,_bindingMap,_refContent,_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var ref;
+      if (!J.$eq($name, "ref"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      ref = oneTime ? value : J.open$1$x(value, new M.TemplateBindExtension_bind_closure(this));
+      J.get$attributes$x(this._node)._html$_element.setAttribute("ref", ref);
+      this._refChanged$0();
+      if (oneTime)
+        return;
+      return this._updateBindings$2("ref", value);
+    },
+    _processBindingDirectives$1: function(directives) {
+      var t1 = this._template_binding$_iterator;
+      if (t1 != null)
+        t1._closeDependencies$0();
+      if (directives._if == null && directives._bind == null && directives._repeat == null) {
+        t1 = this._template_binding$_iterator;
+        if (t1 != null) {
+          t1.close$0(0);
+          this._template_binding$_iterator = null;
+        }
+        return;
+      }
+      t1 = this._template_binding$_iterator;
+      if (t1 == null) {
+        t1 = new M._TemplateIterator(this, [], [], null, false, null, null, null, null, null, null, null, false, null, null);
+        this._template_binding$_iterator = t1;
+      }
+      t1._updateDependencies$2(directives, this._model);
+      J.observe$3$attributeFilter$attributes$x($.get$TemplateBindExtension__templateObserver(), this._node, ["ref"], true);
+      return this._template_binding$_iterator;
+    },
+    createInstance$2: function(_, model, delegate) {
+      var t1, t2, delegate0, t3, map, owner, doc, instance, instanceExt, t4, instanceRecord, c, i, collectTerminator, childMap, clone;
+      if (delegate == null)
+        delegate = this._bindingDelegate;
+      t1 = this._refContent;
+      if (t1 == null) {
+        t1 = this.get$_ref();
+        t1 = J.get$content$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+        this._refContent = t1;
+      }
+      t2 = J.getInterceptor$x(t1);
+      if (t2.get$firstChild(t1) == null)
+        return $.get$_emptyInstance();
+      delegate0 = delegate == null ? $.get$BindingDelegate__DEFAULT() : delegate;
+      t3 = delegate0._bindingMaps;
+      if (t3 == null) {
+        t3 = H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+        delegate0._bindingMaps = t3;
+      }
+      map = t3.$index(0, t1);
+      if (map == null) {
+        map = M._createInstanceBindingMap(t1, delegate0);
+        delegate0._bindingMaps.$indexSet(0, t1, map);
+      }
+      t3 = this._stagingDocument;
+      if (t3 == null) {
+        owner = J.get$ownerDocument$x(this._node);
+        t3 = $.get$TemplateBindExtension__ownerStagingDocument();
+        doc = t3.$index(0, owner);
+        if (doc == null) {
+          doc = owner.implementation.createHTMLDocument("");
+          $.get$_isStagingDocument().$indexSet(0, doc, true);
+          M.TemplateBindExtension__baseUriWorkaround(doc);
+          t3.$indexSet(0, owner, doc);
+        }
+        this._stagingDocument = doc;
+        t3 = doc;
+      }
+      instance = J.createDocumentFragment$0$x(t3);
+      t3 = [];
+      instanceExt = new M._InstanceExtension(t3, null, null, null);
+      t4 = $.get$_instanceExtension();
+      instanceExt._templateCreator = this._node;
+      instanceExt._protoContent = t1;
+      t4.$indexSet(0, instance, instanceExt);
+      instanceRecord = new M.TemplateInstance(model, null, null);
+      M.nodeBindFallback(instance).set$_templateInstance(instanceRecord);
+      for (c = t2.get$firstChild(t1), t1 = map != null, i = 0, collectTerminator = false; c != null; c = c.nextSibling, ++i) {
+        if (c.nextSibling == null)
+          collectTerminator = true;
+        childMap = t1 ? map.getChild$1(i) : null;
+        clone = M._cloneAndBindInstance(c, instance, this._stagingDocument, childMap, model, delegate, t3, null);
+        M.nodeBindFallback(clone).set$_templateInstance(instanceRecord);
+        if (collectTerminator)
+          instanceExt._terminator = clone;
+      }
+      instanceRecord._firstNode = instance.firstChild;
+      instanceRecord._lastNode = instance.lastChild;
+      instanceExt._protoContent = null;
+      instanceExt._templateCreator = null;
+      return instance;
+    },
+    get$model: function(_) {
+      return this._model;
+    },
+    get$bindingDelegate: function(_) {
+      return this._bindingDelegate;
+    },
+    set$bindingDelegate: function(_, value) {
+      var t1;
+      if (this._bindingDelegate != null)
+        throw H.wrapException(P.StateError$("Template must be cleared before a new bindingDelegate can be assigned"));
+      this._bindingDelegate = value;
+      this._bindingMap = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 != null) {
+        t1._initPrepareFunctions = false;
+        t1._instanceModelFn = null;
+        t1._instancePositionChangedFn = null;
+      }
+    },
+    _refChanged$0: function() {
+      var t1, t2;
+      if (this._template_binding$_iterator != null) {
+        t1 = this._refContent;
+        t2 = this.get$_ref();
+        t2 = J.get$content$x(!!J.getInterceptor(t2).$isNodeBindExtension ? t2 : M.nodeBindFallback(t2));
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      this._refContent = null;
+      this._template_binding$_iterator._valueChanged$1(null);
+      this._template_binding$_iterator._updateIteratedValue$1(null);
+    },
+    clear$0: function(_) {
+      var t1, ref;
+      this._model = null;
+      this._bindingDelegate = null;
+      t1 = this.bindings;
+      if (t1 != null) {
+        ref = t1.remove$1(0, "ref");
+        if (ref != null)
+          J.close$0$x(ref);
+      }
+      this._refContent = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 == null)
+        return;
+      t1._valueChanged$1(null);
+      this._template_binding$_iterator.close$0(0);
+      this._template_binding$_iterator = null;
+    },
+    get$_ref: function() {
+      var ref, nextRef;
+      this._decorate$0();
+      ref = M._searchRefId(this._node, J.get$attributes$x(this._node)._html$_element.getAttribute("ref"));
+      if (ref == null) {
+        ref = this._templateInstanceRef;
+        if (ref == null)
+          return this._node;
+      }
+      nextRef = M.nodeBindFallback(ref).get$_ref();
+      return nextRef != null ? nextRef : ref;
+    },
+    get$content: function(_) {
+      var t1;
+      this._decorate$0();
+      t1 = this._content;
+      return t1 != null ? t1 : H.interceptedTypeCast(this._node, "$isTemplateElement").content;
+    },
+    _decorate$1: function(instanceRef) {
+      var isNativeHtmlTemplate, liftContents, t1, t2, templateElementExt, liftRoot, template;
+      if (this._templateIsDecorated === true)
+        return false;
+      M.TemplateBindExtension__injectStylesheet();
+      M.TemplateBindExtension__globalBaseUriWorkaround();
+      this._templateIsDecorated = true;
+      isNativeHtmlTemplate = !!J.getInterceptor(this._node).$isTemplateElement;
+      liftContents = !isNativeHtmlTemplate;
+      if (liftContents) {
+        t1 = this._node;
+        t2 = J.getInterceptor$x(t1);
+        if (t2.get$attributes(t1)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(t1)) === true) {
+          if (instanceRef != null)
+            throw H.wrapException(P.ArgumentError$("instanceRef should not be supplied for attribute templates."));
+          templateElementExt = M.TemplateBindExtension__extractTemplateFromAttributeTemplate(this._node);
+          templateElementExt = !!J.getInterceptor(templateElementExt).$isNodeBindExtension ? templateElementExt : M.nodeBindFallback(templateElementExt);
+          templateElementExt.set$_templateIsDecorated(true);
+          isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          liftRoot = true;
+        } else {
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          if (t2.get$tagName(t1) === "template" && t2.get$namespaceUri(t1) === "http://www.w3.org/2000/svg") {
+            t1 = this._node;
+            t2 = J.getInterceptor$x(t1);
+            template = t2.get$ownerDocument(t1).createElement("template", null);
+            t2.get$parentNode(t1).insertBefore(template, t1);
+            template.toString;
+            new W._ElementAttributeMap(template).addAll$1(0, t2.get$attributes(t1));
+            t2.get$attributes(t1).clear$0(0);
+            t2.remove$0(t1);
+            templateElementExt = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+            templateElementExt.set$_templateIsDecorated(true);
+            isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          } else {
+            templateElementExt = this;
+            isNativeHtmlTemplate = false;
+          }
+          liftRoot = false;
+        }
+      } else {
+        templateElementExt = this;
+        liftRoot = false;
+      }
+      if (!isNativeHtmlTemplate)
+        templateElementExt.set$_content(J.createDocumentFragment$0$x(M.TemplateBindExtension__getOrCreateTemplateContentsOwner(templateElementExt.get$_node())));
+      if (instanceRef != null)
+        templateElementExt.set$_templateInstanceRef(instanceRef);
+      else if (liftContents)
+        M.TemplateBindExtension__liftNonNativeChildrenIntoContent(templateElementExt, this._node, liftRoot);
+      else
+        M.TemplateBindExtension_bootstrap(J.get$content$x(templateElementExt));
+      return true;
+    },
+    _decorate$0: function() {
+      return this._decorate$1(null);
+    },
+    $isTemplateBindExtension: true,
+    static: {"^": "TemplateBindExtension__contentsOwner,TemplateBindExtension__ownerStagingDocument,TemplateBindExtension__allTemplatesSelectors,TemplateBindExtension__initStyles,TemplateBindExtension__initBaseUriWorkaround,TemplateBindExtension__templateObserver", TemplateBindExtension__getOrCreateTemplateContentsOwner: function(template) {
+        var doc, d, t1, t2;
+        doc = J.get$ownerDocument$x(template);
+        if (W._convertNativeToDart_Window(doc.defaultView) == null)
+          return doc;
+        d = $.get$TemplateBindExtension__contentsOwner().$index(0, doc);
+        if (d == null) {
+          d = doc.implementation.createHTMLDocument("");
+          for (; t1 = d.lastChild, t1 != null;) {
+            t2 = t1.parentNode;
+            if (t2 != null)
+              t2.removeChild(t1);
+          }
+          $.get$TemplateBindExtension__contentsOwner().$indexSet(0, doc, d);
+        }
+        return d;
+      }, TemplateBindExtension__extractTemplateFromAttributeTemplate: function(el) {
+        var t1, template, t2, $name, t3, value;
+        t1 = J.getInterceptor$x(el);
+        template = t1.get$ownerDocument(el).createElement("template", null);
+        t1.get$parentNode(el).insertBefore(template, el);
+        for (t2 = C.JSArray_methods.toList$0(t1.get$attributes(el).get$keys()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]); t2.moveNext$0();) {
+          $name = t2._current;
+          switch ($name) {
+            case "template":
+              t3 = t1.get$attributes(el)._html$_element;
+              t3.getAttribute($name);
+              t3.removeAttribute($name);
+              break;
+            case "repeat":
+            case "bind":
+            case "ref":
+              template.toString;
+              t3 = t1.get$attributes(el)._html$_element;
+              value = t3.getAttribute($name);
+              t3.removeAttribute($name);
+              template.setAttribute($name, value);
+              break;
+          }
+        }
+        return template;
+      }, TemplateBindExtension__liftNonNativeChildrenIntoContent: function(template, el, useRoot) {
+        var $content, t1, t2, child;
+        $content = J.get$content$x(template);
+        if (useRoot) {
+          J.append$1$x($content, el);
+          return;
+        }
+        for (t1 = J.getInterceptor$x(el), t2 = J.getInterceptor$x($content); child = t1.get$firstChild(el), child != null;)
+          t2.append$1($content, child);
+      }, TemplateBindExtension_bootstrap: function($content) {
+        var t1, descendents;
+        t1 = new M.TemplateBindExtension_bootstrap__bootstrap();
+        descendents = J.querySelectorAll$1$x($content, $.get$TemplateBindExtension__allTemplatesSelectors());
+        if (M.isSemanticTemplate($content))
+          t1.call$1($content);
+        descendents.forEach$1(descendents, t1);
+      }, TemplateBindExtension__injectStylesheet: function() {
+        if ($.TemplateBindExtension__initStyles === true)
+          return;
+        $.TemplateBindExtension__initStyles = true;
+        var style = document.createElement("style", null);
+        J.set$text$x(style, H.S($.get$TemplateBindExtension__allTemplatesSelectors()) + " { display: none; }");
+        document.head.appendChild(style);
+      }, TemplateBindExtension__globalBaseUriWorkaround: function() {
+        var t, d;
+        if ($.TemplateBindExtension__initBaseUriWorkaround === true)
+          return;
+        $.TemplateBindExtension__initBaseUriWorkaround = true;
+        t = document.createElement("template", null);
+        if (!!J.getInterceptor(t).$isTemplateElement) {
+          d = t.content.ownerDocument;
+          if (d.documentElement == null)
+            d.appendChild(d.createElement("html", null)).appendChild(d.createElement("head", null));
+          if (J.get$head$x(d).querySelector("base") == null)
+            M.TemplateBindExtension__baseUriWorkaround(d);
+        }
+      }, TemplateBindExtension__baseUriWorkaround: function(doc) {
+        var base = doc.createElement("base", null);
+        J.set$href$x(base, document.baseURI);
+        J.get$head$x(doc).appendChild(base);
+      }}
+  },
+  TemplateBindExtension_bind_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(ref) {
+      var t1 = this.this_0;
+      J.get$attributes$x(t1._node)._html$_element.setAttribute("ref", ref);
+      t1._refChanged$0();
+    }, "call$1", null, 2, 0, null, 202, "call"],
+    $isFunction: true
+  },
+  TemplateBindExtension_bootstrap__bootstrap: {
+    "^": "Closure:20;",
+    call$1: function(template) {
+      if (!M.nodeBindFallback(template)._decorate$1(null))
+        M.TemplateBindExtension_bootstrap(J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template)));
+    },
+    $isFunction: true
+  },
+  closure6: {
+    "^": "Closure:13;",
+    call$1: [function(k) {
+      return H.S(k) + "[template]";
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  closure8: {
+    "^": "Closure:75;",
+    call$2: [function(records, _) {
+      var t1;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();)
+        M.nodeBindFallback(J.get$target$x(t1.get$current()))._refChanged$0();
+    }, "call$2", null, 4, 0, null, 160, 14, "call"],
+    $isFunction: true
+  },
+  closure9: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var empty = document.createDocumentFragment();
+      $.get$_instanceExtension().$indexSet(0, empty, new M._InstanceExtension([], null, null, null));
+      return empty;
+    },
+    $isFunction: true
+  },
+  _InstanceExtension: {
+    "^": "Object;_bindings<,_terminator<,_templateCreator<,_protoContent<"
+  },
+  _getDelegateFactory_closure: {
+    "^": "Closure:13;name_0,node_1,delegate_2",
+    call$1: function(pathString) {
+      return this.delegate_2.prepareBinding$3(pathString, this.name_0, this.node_1);
+    },
+    $isFunction: true
+  },
+  _parseAttributeBindings_closure: {
+    "^": "Closure:75;box_0,element_1,delegate_2,isTemplateNode_3",
+    call$2: function($name, value) {
+      var t1, tokens, t2, bindings;
+      for (; t1 = J.getInterceptor$asx($name), J.$eq(t1.$index($name, 0), "_");)
+        $name = t1.substring$1($name, 1);
+      if (this.isTemplateNode_3)
+        t1 = t1.$eq($name, "bind") || t1.$eq($name, "if") || t1.$eq($name, "repeat");
+      else
+        t1 = false;
+      if (t1)
+        return;
+      tokens = S.MustacheTokens_parse(value, M._getDelegateFactory($name, this.element_1, this.delegate_2));
+      if (tokens != null) {
+        t1 = this.box_0;
+        t2 = t1.bindings_0;
+        if (t2 == null) {
+          bindings = [];
+          t1.bindings_0 = bindings;
+          t1 = bindings;
+        } else
+          t1 = t2;
+        t1.push($name);
+        t1.push(tokens);
+      }
+    },
+    $isFunction: true
+  },
+  _TemplateIterator: {
+    "^": "Bindable;_templateExt,_instances,_iteratedValue,_presentValue,_closed,_ifValue,_template_binding$_value,_hasIf,_hasRepeat,_ifOneTime,_oneTime,_listSub,_initPrepareFunctions,_instanceModelFn,_instancePositionChangedFn",
+    _instanceModelFn$1: function(arg0) {
+      return this._instanceModelFn.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      return H.throwExpression(P.StateError$("binding already opened"));
+    },
+    get$value: function(_) {
+      return this._template_binding$_value;
+    },
+    _closeDependencies$0: function() {
+      var t1, t2;
+      t1 = this._ifValue;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._ifValue = null;
+      }
+      t1 = this._template_binding$_value;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._template_binding$_value = null;
+      }
+    },
+    _updateDependencies$2: function(directives, model) {
+      var template, t1, t2;
+      this._closeDependencies$0();
+      template = this._templateExt._node;
+      t1 = directives._if;
+      t2 = t1 != null;
+      this._hasIf = t2;
+      this._hasRepeat = directives._repeat != null;
+      if (t2) {
+        this._ifOneTime = t1.onlyOneTime;
+        t1 = M._processBinding("if", t1, template, model);
+        this._ifValue = t1;
+        if (this._ifOneTime === true) {
+          if (!(null != t1 && false !== t1)) {
+            this._updateIteratedValue$1(null);
+            return;
+          }
+        } else
+          H.interceptedTypeCast(t1, "$isBindable").open$1(0, this.get$_updateIteratedValue());
+      }
+      if (this._hasRepeat === true) {
+        t1 = directives._repeat;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("repeat", t1, template, model);
+        this._template_binding$_value = t1;
+      } else {
+        t1 = directives._bind;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("bind", t1, template, model);
+        this._template_binding$_value = t1;
+      }
+      if (this._oneTime !== true)
+        J.open$1$x(t1, this.get$_updateIteratedValue());
+      this._updateIteratedValue$1(null);
+    },
+    _updateIteratedValue$1: [function(_) {
+      var ifValue, value;
+      if (this._hasIf === true) {
+        ifValue = this._ifValue;
+        if (this._ifOneTime !== true) {
+          H.interceptedTypeCast(ifValue, "$isBindable");
+          ifValue = ifValue.get$value(ifValue);
+        }
+        if (!(null != ifValue && false !== ifValue)) {
+          this._valueChanged$1([]);
+          return;
+        }
+      }
+      value = this._template_binding$_value;
+      if (this._oneTime !== true) {
+        H.interceptedTypeCast(value, "$isBindable");
+        value = value.get$value(value);
+      }
+      this._valueChanged$1(this._hasRepeat !== true ? [value] : value);
+    }, "call$1", "get$_updateIteratedValue", 2, 0, 20, 14],
+    _valueChanged$1: function(value) {
+      var t1, t2;
+      t1 = J.getInterceptor(value);
+      if (!t1.$isList)
+        value = !!t1.$isIterable ? t1.toList$0(value) : [];
+      t1 = this._iteratedValue;
+      if (value === t1)
+        return;
+      this._unobserve$0();
+      this._presentValue = value;
+      if (!!J.getInterceptor(value).$isObservableList && this._hasRepeat === true && this._oneTime !== true) {
+        if (value.get$_listRecords() != null)
+          value.set$_listRecords([]);
+        this._listSub = value.get$listChanges().listen$1(this.get$_handleSplices());
+      }
+      t2 = this._presentValue;
+      t2 = t2 != null ? t2 : [];
+      this._handleSplices$1(G.calcSplices(t2, 0, J.get$length$asx(t2), t1, 0, t1.length));
+    },
+    _getLastInstanceNode$1: function(index) {
+      var t1, t2, terminator, subtemplateIterator;
+      if (J.$eq(index, -1))
+        return this._templateExt._node;
+      t1 = $.get$_instanceExtension();
+      t2 = this._instances;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      terminator = t1.$index(0, t2[index]).get$_terminator();
+      if (terminator == null)
+        return this._getLastInstanceNode$1(index - 1);
+      if (!M.isSemanticTemplate(terminator) || terminator === this._templateExt._node)
+        return terminator;
+      subtemplateIterator = M.nodeBindFallback(terminator).get$_template_binding$_iterator();
+      if (subtemplateIterator == null)
+        return terminator;
+      return subtemplateIterator._getLastInstanceNode$1(subtemplateIterator._instances.length - 1);
+    },
+    _extractInstanceAt$1: function(index) {
+      var previousInstanceLast, lastNode, instance, t1, t2, node, t3;
+      previousInstanceLast = this._getLastInstanceNode$1(J.$sub$n(index, 1));
+      lastNode = this._getLastInstanceNode$1(index);
+      J.get$parentNode$x(this._templateExt._node);
+      instance = C.JSArray_methods.removeAt$1(this._instances, index);
+      for (t1 = J.getInterceptor$x(instance), t2 = J.getInterceptor$x(previousInstanceLast); !J.$eq(lastNode, previousInstanceLast);) {
+        node = t2.get$nextNode(previousInstanceLast);
+        if (node == null ? lastNode == null : node === lastNode)
+          lastNode = previousInstanceLast;
+        t3 = node.parentNode;
+        if (t3 != null)
+          t3.removeChild(node);
+        t1.append$1(instance, node);
+      }
+      return instance;
+    },
+    _handleSplices$1: [function(splices) {
+      var delegate, model, instance, e, s, t1, template, t2, delegate0, instanceCache, t3, t4, removeDelta, splice, t5, t6, model0, instance0, addIndex, exception, previousInstanceLast, $parent;
+      if (this._closed || J.get$isEmpty$asx(splices) === true)
+        return;
+      t1 = this._templateExt;
+      template = t1._node;
+      if (J.get$parentNode$x(template) == null) {
+        this.close$0(0);
+        return;
+      }
+      t2 = this._iteratedValue;
+      Q.ObservableList_applyChangeRecords(t2, this._presentValue, splices);
+      delegate = t1._bindingDelegate;
+      if (!this._initPrepareFunctions) {
+        this._initPrepareFunctions = true;
+        delegate0 = J.get$bindingDelegate$x(!!J.getInterceptor(t1._node).$isTemplateBindExtension ? t1._node : t1);
+        if (delegate0 != null) {
+          this._instanceModelFn = delegate0._delegate.prepareInstanceModel$1(template);
+          this._instancePositionChangedFn = null;
+        }
+      }
+      instanceCache = P.HashMap_HashMap(P.identical$closure(), null, null, null, null);
+      for (t3 = J.getInterceptor$ax(splices), t4 = t3.get$iterator(splices), removeDelta = 0; t4.moveNext$0();) {
+        splice = t4.get$current();
+        for (t5 = splice.get$removed(), t5 = t5.get$iterator(t5), t6 = J.getInterceptor$x(splice); t5.moveNext$0();) {
+          model0 = t5._current;
+          instance0 = this._extractInstanceAt$1(J.$add$ns(t6.get$index(splice), removeDelta));
+          if (!J.$eq(instance0, $.get$_emptyInstance()))
+            instanceCache.$indexSet(0, model0, instance0);
+        }
+        t5 = splice.get$addedCount();
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        removeDelta -= t5;
+      }
+      for (t3 = t3.get$iterator(splices); t3.moveNext$0();) {
+        splice = t3.get$current();
+        for (t4 = J.getInterceptor$x(splice), addIndex = t4.get$index(splice); J.$lt$n(addIndex, J.$add$ns(t4.get$index(splice), splice.get$addedCount())); ++addIndex) {
+          if (addIndex >>> 0 !== addIndex || addIndex >= t2.length)
+            return H.ioore(t2, addIndex);
+          model = t2[addIndex];
+          instance = instanceCache.remove$1(0, model);
+          if (instance == null)
+            try {
+              if (this._instanceModelFn != null)
+                model = this._instanceModelFn$1(model);
+              if (model == null)
+                instance = $.get$_emptyInstance();
+              else
+                instance = t1.createInstance$2(0, model, delegate);
+            } catch (exception) {
+              t5 = H.unwrapException(exception);
+              e = t5;
+              s = new H._StackTrace(exception, null);
+              t5 = new P._Future(0, $.Zone__current, null, null, null, null, null, null);
+              t5.$builtinTypeInfo = [null];
+              new P._AsyncCompleter(t5).$builtinTypeInfo = [null];
+              t6 = e;
+              if (t6 == null)
+                H.throwExpression(P.ArgumentError$("Error must not be null"));
+              if (t5._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              t5._asyncCompleteError$2(t6, s);
+              instance = $.get$_emptyInstance();
+            }
+
+          t5 = instance;
+          previousInstanceLast = this._getLastInstanceNode$1(addIndex - 1);
+          $parent = J.get$parentNode$x(t1._node);
+          C.JSArray_methods.insert$2(this._instances, addIndex, t5);
+          $parent.insertBefore(t5, J.get$nextNode$x(previousInstanceLast));
+        }
+      }
+      for (t1 = instanceCache.get$values(instanceCache), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        this._closeInstanceBindings$1(t1._current);
+    }, "call$1", "get$_handleSplices", 2, 0, 203, 204],
+    _closeInstanceBindings$1: [function(instance) {
+      var t1, values, bindings;
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(instance, "expando$values");
+      bindings = (values == null ? null : H.Primitives_getProperty(values, t1._getKey$0())).get$_bindings();
+      t1 = new H.ListIterator(bindings, bindings.length, 0, null);
+      t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(bindings, 0)];
+      for (; t1.moveNext$0();)
+        J.close$0$x(t1._current);
+    }, "call$1", "get$_closeInstanceBindings", 2, 0, 205],
+    _unobserve$0: function() {
+      var t1 = this._listSub;
+      if (t1 == null)
+        return;
+      t1.cancel$0();
+      this._listSub = null;
+    },
+    close$0: function(_) {
+      var t1;
+      if (this._closed)
+        return;
+      this._unobserve$0();
+      t1 = this._instances;
+      H.IterableMixinWorkaround_forEach(t1, this.get$_closeInstanceBindings());
+      C.JSArray_methods.set$length(t1, 0);
+      this._closeDependencies$0();
+      this._templateExt._template_binding$_iterator = null;
+      this._closed = true;
+    }
+  },
+  _TextExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      if (!J.$eq($name, "text"))
+        return M.NodeBindExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      if (oneTime) {
+        t1 = value == null ? "" : H.S(value);
+        J.set$text$x(this._node, t1);
+        return;
+      }
+      t1 = this.get$_updateText();
+      t1.call$1(J.open$1$x(value, t1));
+      return $.enableBindingsReflection ? this._updateBindings$2($name, value) : value;
+    },
+    _updateText$1: [function(value) {
+      var t1 = value == null ? "" : H.S(value);
+      J.set$text$x(this._node, t1);
+    }, "call$1", "get$_updateText", 2, 0, 13, 21]
+  },
+  _TextAreaElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (!J.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return $.enableBindingsReflection ? this._updateBindings$2($name, t2) : t2;
+    }
+  }
+}],
+["template_binding.src.mustache_tokens", "package:template_binding/src/mustache_tokens.dart", , S, {
+  "^": "",
+  MustacheTokens: {
+    "^": "Object;_mustache_tokens$_tokens,onlyOneTime<,_combinator",
+    get$hasOnePath: function() {
+      return this._mustache_tokens$_tokens.length === 5;
+    },
+    get$isSimplePath: function() {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = t1.length;
+      if (t2 === 5) {
+        if (0 >= t2)
+          return H.ioore(t1, 0);
+        if (J.$eq(t1[0], "")) {
+          if (4 >= t1.length)
+            return H.ioore(t1, 4);
+          t1 = J.$eq(t1[4], "");
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$combinator: function() {
+      return this._combinator;
+    },
+    combinator$1: function(arg0) {
+      return this.get$combinator().call$1(arg0);
+    },
+    get$length: function(_) {
+      return C.JSInt_methods._tdivFast$1(this._mustache_tokens$_tokens.length, 4);
+    },
+    getOneTime$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 1;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPath$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 2;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPrepareBinding$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 3;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    _singleCombinator$1: [function(value) {
+      var t1, t2, t3, t4;
+      if (value == null)
+        value = "";
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t2 = H.S(t1[0]) + H.S(value);
+      t3 = t1.length;
+      t4 = C.JSInt_methods._tdivFast$1(t3, 4) * 4;
+      if (t4 >= t3)
+        return H.ioore(t1, t4);
+      return t2 + H.S(t1[t4]);
+    }, "call$1", "get$_singleCombinator", 2, 0, 206, 21],
+    _listCombinator$1: [function(values) {
+      var t1, newValue, len, t2, i, value, t3, str;
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      newValue = P.StringBuffer$(t1[0]);
+      len = C.JSInt_methods._tdivFast$1(t1.length, 4);
+      for (t2 = J.getInterceptor$asx(values), i = 0; i < len;) {
+        value = t2.$index(values, i);
+        if (value != null)
+          newValue._contents += typeof value === "string" ? value : H.S(value);
+        ++i;
+        t3 = i * 4;
+        if (t3 >= t1.length)
+          return H.ioore(t1, t3);
+        str = t1[t3];
+        newValue._contents += typeof str === "string" ? str : H.S(str);
+      }
+      return newValue._contents;
+    }, "call$1", "get$_listCombinator", 2, 0, 207, 208],
+    MustacheTokens$_$2: function(_tokens, onlyOneTime) {
+      this._combinator = this._mustache_tokens$_tokens.length === 5 ? this.get$_singleCombinator() : this.get$_listCombinator();
+    },
+    static: {"^": "MustacheTokens__TOKEN_TEXT,MustacheTokens__TOKEN_ONETIME,MustacheTokens__TOKEN_PATH,MustacheTokens__TOKEN_PREPAREFN,MustacheTokens__TOKEN_SIZE,MustacheTokens__TOKEN_ENDTEXT", MustacheTokens_parse: function(s, fnFactory) {
+        var $length, t1, t2, tokens, lastIndex, onlyOneTime, startIndex, oneTimeStart, t3, oneTime, terminator, endIndex, pathString, delegateFn;
+        if (s == null || s.length === 0)
+          return;
+        $length = s.length;
+        for (t1 = fnFactory == null, t2 = J.getInterceptor$asx(s), tokens = null, lastIndex = 0, onlyOneTime = true; lastIndex < $length;) {
+          startIndex = t2.indexOf$2(s, "{{", lastIndex);
+          oneTimeStart = C.JSString_methods.indexOf$2(s, "[[", lastIndex);
+          if (oneTimeStart >= 0)
+            t3 = startIndex < 0 || oneTimeStart < startIndex;
+          else
+            t3 = false;
+          if (t3) {
+            startIndex = oneTimeStart;
+            oneTime = true;
+            terminator = "]]";
+          } else {
+            oneTime = false;
+            terminator = "}}";
+          }
+          endIndex = startIndex >= 0 ? C.JSString_methods.indexOf$2(s, terminator, startIndex + 2) : -1;
+          if (endIndex < 0) {
+            if (tokens == null)
+              return;
+            tokens.push(C.JSString_methods.substring$1(s, lastIndex));
+            break;
+          }
+          if (tokens == null)
+            tokens = [];
+          tokens.push(C.JSString_methods.substring$2(s, lastIndex, startIndex));
+          pathString = C.JSString_methods.trim$0(C.JSString_methods.substring$2(s, startIndex + 2, endIndex));
+          tokens.push(oneTime);
+          onlyOneTime = onlyOneTime && oneTime;
+          delegateFn = t1 ? null : fnFactory.call$1(pathString);
+          if (delegateFn == null)
+            tokens.push(L.PropertyPath_PropertyPath(pathString));
+          else
+            tokens.push(null);
+          tokens.push(delegateFn);
+          lastIndex = endIndex + 2;
+        }
+        if (lastIndex === $length)
+          tokens.push("");
+        t1 = new S.MustacheTokens(tokens, onlyOneTime, null);
+        t1.MustacheTokens$_$2(tokens, onlyOneTime);
+        return t1;
+      }}
+  }
+}],
+["vm_ref_element", "package:observatory/src/elements/vm_ref.dart", , X, {
+  "^": "",
+  VMRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {VMRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMRefElement_methods.Element$created$0(receiver);
+        C.VMRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["vm_view_element", "package:observatory/src/elements/vm_view.dart", , U, {
+  "^": "",
+  VMViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier50;_vm_view_element$__$vm,_vm_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$vm: function(receiver) {
+      return receiver._vm_view_element$__$vm;
+    },
+    set$vm: function(receiver, value) {
+      receiver._vm_view_element$__$vm = this.notifyPropertyChange$3(receiver, C.Symbol_vm, receiver._vm_view_element$__$vm, value);
+    },
+    get$error: function(receiver) {
+      return receiver._vm_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._vm_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._vm_view_element$__$error, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._vm_view_element$__$vm).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {VMViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMViewElement_methods.Element$created$0(receiver);
+        C.VMViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier50: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+]);
+Isolate.$finishClasses($$, $, null);
+$$ = null;
+
+// Runtime type support
+P.$int.$is$int = true;
+P.$int.$isComparable = true;
+P.$int.$asComparable = [P.num];
+P.$int.$isObject = true;
+P.$double.$is$double = true;
+P.$double.$isComparable = true;
+P.$double.$asComparable = [P.num];
+P.$double.$isObject = true;
+W.Node.$isNode = true;
+W.Node.$isObject = true;
+W.SpeechRecognitionResult.$isObject = true;
+W.Entry.$isObject = true;
+P.String.$isString = true;
+P.String.$isComparable = true;
+P.String.$asComparable = [P.String];
+P.String.$isObject = true;
+P.num.$isComparable = true;
+P.num.$asComparable = [P.num];
+P.num.$isObject = true;
+N.Level.$isComparable = true;
+N.Level.$asComparable = [N.Level];
+N.Level.$isObject = true;
+P.Duration.$isDuration = true;
+P.Duration.$isComparable = true;
+P.Duration.$asComparable = [P.Duration];
+P.Duration.$isObject = true;
+W.Element.$isElement = true;
+W.Element.$isNode = true;
+W.Element.$isObject = true;
+P.List.$isList = true;
+P.List.$isIterable = true;
+P.List.$isObject = true;
+P._SplayTreeNode.$isObject = true;
+P.Object.$isObject = true;
+P.Match.$isObject = true;
+K.IndexedValue.$isIndexedValue = true;
+K.IndexedValue.$isObject = true;
+U.TernaryOperator.$isExpression = true;
+U.TernaryOperator.$isObject = true;
+U.UnaryOperator.$isExpression = true;
+U.UnaryOperator.$isObject = true;
+U.BinaryOperator.$isExpression = true;
+U.BinaryOperator.$isObject = true;
+U.Identifier.$isIdentifier = true;
+U.Identifier.$isExpression = true;
+U.Identifier.$isObject = true;
+U.MapLiteralEntry.$isExpression = true;
+U.MapLiteralEntry.$isObject = true;
+U.MapLiteral.$isExpression = true;
+U.MapLiteral.$isObject = true;
+U.ListLiteral.$isExpression = true;
+U.ListLiteral.$isObject = true;
+U.Literal.$isExpression = true;
+U.Literal.$isObject = true;
+U.Invoke.$isExpression = true;
+U.Invoke.$isObject = true;
+U.Index.$isIndex = true;
+U.Index.$isExpression = true;
+U.Index.$isObject = true;
+U.Getter.$isExpression = true;
+U.Getter.$isObject = true;
+U.EmptyExpression.$isEmptyExpression = true;
+U.EmptyExpression.$isExpression = true;
+U.EmptyExpression.$isObject = true;
+P.Symbol.$isSymbol = true;
+P.Symbol.$isObject = true;
+P.Type.$isType = true;
+P.Type.$isObject = true;
+N.Logger.$isObject = true;
+T.ChangeRecord.$isChangeRecord = true;
+T.ChangeRecord.$isObject = true;
+W.TableRowElement.$isElement = true;
+W.TableRowElement.$isNode = true;
+W.TableRowElement.$isObject = true;
+G.ListChangeRecord.$isListChangeRecord = true;
+G.ListChangeRecord.$isObject = true;
+G.TableTreeRow.$isTableTreeRow = true;
+G.TableTreeRow.$isObject = true;
+F.Observable.$isObject = true;
+A.PolymerDeclaration.$isObject = true;
+W.MouseEvent.$isMouseEvent = true;
+W.MouseEvent.$isEvent = true;
+W.MouseEvent.$isObject = true;
+P.bool.$isbool = true;
+P.bool.$isObject = true;
+G.Pane.$isObject = true;
+P.Completer.$isObject = true;
+D.ServiceObject.$isServiceObject = true;
+D.ServiceObject.$isObject = true;
+D.Isolate.$isServiceObject = true;
+D.Isolate.$isObject = true;
+W.PopStateEvent.$isPopStateEvent = true;
+W.PopStateEvent.$isEvent = true;
+W.PopStateEvent.$isObject = true;
+D.CodeCallCount.$isObject = true;
+D.TagProfileSnapshot.$isObject = true;
+D.Class.$isClass = true;
+D.Class.$isServiceObject = true;
+D.Class.$isObject = true;
+D.ServiceMap.$isServiceMap = true;
+D.ServiceMap.$isServiceObject = true;
+D.ServiceMap.$isObservableMap = true;
+D.ServiceMap.$asObservableMap = [null, null];
+D.ServiceMap.$isMap = true;
+D.ServiceMap.$asMap = [null, null];
+D.ServiceMap.$isObject = true;
+D.CodeInstruction.$isObject = true;
+D.CodeTick.$isObject = true;
+D.Library.$isServiceObject = true;
+D.Library.$isObject = true;
+D.Script.$isScript = true;
+D.Script.$isServiceObject = true;
+D.Script.$isObject = true;
+D.ScriptLine.$isObject = true;
+W.HttpRequest.$isHttpRequest = true;
+W.HttpRequest.$isObject = true;
+W.ProgressEvent.$isEvent = true;
+W.ProgressEvent.$isObject = true;
+D.Code.$isCode = true;
+D.Code.$isServiceObject = true;
+D.Code.$isObject = true;
+D.CodeTrieNode.$isObject = true;
+D.PcDescriptor.$isObject = true;
+W.MessageEvent.$isEvent = true;
+W.MessageEvent.$isObject = true;
+L.PropertyPath.$isPropertyPath = true;
+L.PropertyPath.$isObject = true;
+K.Scope.$isObject = true;
+N.LogRecord.$isLogRecord = true;
+N.LogRecord.$isObject = true;
+H.RawReceivePortImpl.$isObject = true;
+H._IsolateEvent.$isObject = true;
+H._IsolateContext.$isObject = true;
+W.ShadowRoot.$isDocumentFragment = true;
+W.ShadowRoot.$isNode = true;
+W.ShadowRoot.$isObject = true;
+W.Event.$isEvent = true;
+W.Event.$isObject = true;
+P.Stream.$isStream = true;
+P.Stream.$isObject = true;
+P.StreamSubscription.$isStreamSubscription = true;
+P.StreamSubscription.$isObject = true;
+Y.Token.$isObject = true;
+U.Expression.$isExpression = true;
+U.Expression.$isObject = true;
+G.SortedTableRow.$isObject = true;
+P.ZoneDelegate.$isZoneDelegate = true;
+P.ZoneDelegate.$isObject = true;
+P.Zone.$isZone = true;
+P.Zone.$isObject = true;
+P.StackTrace.$isStackTrace = true;
+P.StackTrace.$isObject = true;
+V.ObservableMap.$isObservableMap = true;
+V.ObservableMap.$isMap = true;
+V.ObservableMap.$isObject = true;
+P._BufferingStreamSubscription.$is_BufferingStreamSubscription = true;
+P._BufferingStreamSubscription.$is_EventSink = true;
+P._BufferingStreamSubscription.$isStreamSubscription = true;
+P._BufferingStreamSubscription.$isObject = true;
+P._BroadcastSubscription.$is_BroadcastSubscription = true;
+P._BroadcastSubscription.$is_BufferingStreamSubscription = true;
+P._BroadcastSubscription.$is_EventSink = true;
+P._BroadcastSubscription.$isStreamSubscription = true;
+P._BroadcastSubscription.$isObject = true;
+P.Comparable.$isComparable = true;
+P.Comparable.$isObject = true;
+P.ZoneSpecification.$isZoneSpecification = true;
+P.ZoneSpecification.$isObject = true;
+P.Map.$isMap = true;
+P.Map.$isObject = true;
+P.Timer.$isTimer = true;
+P.Timer.$isObject = true;
+P.Iterable.$isIterable = true;
+P.Iterable.$isObject = true;
+P.Future.$isFuture = true;
+P.Future.$isObject = true;
+P.Function.$isFunction = true;
+P.Function.$isObject = true;
+P._EventSink.$is_EventSink = true;
+P._EventSink.$isObject = true;
+P._DelayedEvent.$is_DelayedEvent = true;
+P._DelayedEvent.$isObject = true;
+P.DateTime.$isDateTime = true;
+P.DateTime.$isComparable = true;
+P.DateTime.$asComparable = [null];
+P.DateTime.$isObject = true;
+A.Bindable.$isBindable = true;
+A.Bindable.$isObject = true;
+O.PixelReference.$isPixelReference = true;
+O.PixelReference.$isObject = true;
+D.ServiceError.$isServiceError = true;
+D.ServiceError.$isServiceObject = true;
+D.ServiceError.$isObject = true;
+D.ServiceException.$isServiceException = true;
+D.ServiceException.$isServiceObject = true;
+D.ServiceException.$isObject = true;
+A.Declaration.$isDeclaration = true;
+A.Declaration.$isObject = true;
+A.QueryOptions.$isQueryOptions = true;
+A.QueryOptions.$isObject = true;
+L._Observer.$is_Observer = true;
+L._Observer.$isBindable = true;
+L._Observer.$isObject = true;
+W.DocumentFragment.$isDocumentFragment = true;
+W.DocumentFragment.$isNode = true;
+W.DocumentFragment.$isObject = true;
+// getInterceptor methods
+J.getInterceptor = function(receiver) {
+  if (typeof receiver == "number") {
+    if (Math.floor(receiver) == receiver)
+      return J.JSInt.prototype;
+    return J.JSDouble.prototype;
+  }
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return J.JSNull.prototype;
+  if (typeof receiver == "boolean")
+    return J.JSBool.prototype;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$asx = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$ax = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$n = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$ns = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$s = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$x = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.$add$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver + a0;
+  return J.getInterceptor$ns(receiver).$add(receiver, a0);
+};
+J.$div$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver / a0;
+  return J.getInterceptor$n(receiver).$div(receiver, a0);
+};
+J.$eq = function(receiver, a0) {
+  if (receiver == null)
+    return a0 == null;
+  if (typeof receiver != "object")
+    return a0 != null && receiver === a0;
+  return J.getInterceptor(receiver).$eq(receiver, a0);
+};
+J.$ge$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver >= a0;
+  return J.getInterceptor$n(receiver).$ge(receiver, a0);
+};
+J.$gt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver > a0;
+  return J.getInterceptor$n(receiver).$gt(receiver, a0);
+};
+J.$index$asx = function(receiver, a0) {
+  if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
+    if (a0 >>> 0 === a0 && a0 < receiver.length)
+      return receiver[a0];
+  return J.getInterceptor$asx(receiver).$index(receiver, a0);
+};
+J.$indexSet$ax = function(receiver, a0, a1) {
+  if ((receiver.constructor == Array || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName])) && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
+    return receiver[a0] = a1;
+  return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
+};
+J.$le$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver <= a0;
+  return J.getInterceptor$n(receiver).$le(receiver, a0);
+};
+J.$lt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver < a0;
+  return J.getInterceptor$n(receiver).$lt(receiver, a0);
+};
+J.$mod$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$mod(receiver, a0);
+};
+J.$mul$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver * a0;
+  return J.getInterceptor$ns(receiver).$mul(receiver, a0);
+};
+J.$negate$n = function(receiver) {
+  if (typeof receiver == "number")
+    return -receiver;
+  return J.getInterceptor$n(receiver).$negate(receiver);
+};
+J.$shl$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$shl(receiver, a0);
+};
+J.$sub$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver - a0;
+  return J.getInterceptor$n(receiver).$sub(receiver, a0);
+};
+J.$tdiv$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$tdiv(receiver, a0);
+};
+J.$xor$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return (receiver ^ a0) >>> 0;
+  return J.getInterceptor$n(receiver).$xor(receiver, a0);
+};
+J.__isolate_helper$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).__isolate_helper$_add$1(receiver, a0);
+};
+J._async$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._async$_add$1(receiver, a0);
+};
+J._clearChildren$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
+};
+J._initCustomEvent$4$x = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
+};
+J._initMouseEvent$15$x = function(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
+  return J.getInterceptor$x(receiver)._initMouseEvent$15(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
+};
+J._renderPages$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._renderPages$1(receiver, a0);
+};
+J._replaceChild$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver)._replaceChild$2(receiver, a0, a1);
+};
+J._update$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._update$1(receiver, a0);
+};
+J._updateFragmentationData$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateFragmentationData$0(receiver);
+};
+J._updateLines$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateLines$0(receiver);
+};
+J.abs$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).abs$0(receiver);
+};
+J.accept$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).accept$1(receiver, a0);
+};
+J.add$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).add$1(receiver, a0);
+};
+J.addAll$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
+};
+J.addEventListener$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).addEventListener$2(receiver, a0, a1);
+};
+J.addEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
+};
+J.addRow$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).addRow$1(receiver, a0);
+};
+J.any$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).any$1(receiver, a0);
+};
+J.append$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).append$1(receiver, a0);
+};
+J.async$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).async$1(receiver, a0);
+};
+J.attached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).attached$0(receiver);
+};
+J.attributeChanged$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).attributeChanged$3(receiver, a0, a1, a2);
+};
+J.bind$3$oneTime$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).bind$3$oneTime(receiver, a0, a1, a2);
+};
+J.callback$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).callback$0(receiver);
+};
+J.clear$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).clear$0(receiver);
+};
+J.close$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).close$0(receiver);
+};
+J.codeUnitAt$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
+};
+J.compareTo$1$ns = function(receiver, a0) {
+  return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
+};
+J.complete$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).complete$1(receiver, a0);
+};
+J.contains$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
+};
+J.contains$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).contains$2(receiver, a0, a1);
+};
+J.createDocumentFragment$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).createDocumentFragment$0(receiver);
+};
+J.createInstance$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).createInstance$2(receiver, a0, a1);
+};
+J.detached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).detached$0(receiver);
+};
+J.dispatchMethod$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).dispatchMethod$3(receiver, a0, a1, a2);
+};
+J.elementAt$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
+};
+J.endsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).endsWith$1(receiver, a0);
+};
+J.eval$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).eval$1(receiver, a0);
+};
+J.forEach$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
+};
+J.get$$function$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$function(receiver);
+};
+J.get$$goto$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$goto(receiver);
+};
+J.get$__isolate_helper$_id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$__isolate_helper$_id(receiver);
+};
+J.get$_children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_children(receiver);
+};
+J.get$_element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_element(receiver);
+};
+J.get$_name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_name(receiver);
+};
+J.get$_observe$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_observe(receiver);
+};
+J.get$_updateFile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateFile(receiver);
+};
+J.get$_updateHttpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateHttpServer(receiver);
+};
+J.get$_updateTagProfile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateTagProfile(receiver);
+};
+J.get$_values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_values(receiver);
+};
+J.get$active$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$active(receiver);
+};
+J.get$anchor$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$anchor(receiver);
+};
+J.get$attributes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$attributes(receiver);
+};
+J.get$bindingDelegate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindingDelegate(receiver);
+};
+J.get$bindings$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindings(receiver);
+};
+J.get$busy$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$busy(receiver);
+};
+J.get$buttonClick$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$buttonClick(receiver);
+};
+J.get$callback$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$callback(receiver);
+};
+J.get$change$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$change(receiver);
+};
+J.get$changeSort$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$changeSort(receiver);
+};
+J.get$checked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checked(receiver);
+};
+J.get$checkedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checkedText(receiver);
+};
+J.get$children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$children(receiver);
+};
+J.get$className$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$className(receiver);
+};
+J.get$classTable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classTable(receiver);
+};
+J.get$classes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classes(receiver);
+};
+J.get$cls$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$cls(receiver);
+};
+J.get$code$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$code(receiver);
+};
+J.get$coloring$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$coloring(receiver);
+};
+J.get$connection$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$connection(receiver);
+};
+J.get$content$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$content(receiver);
+};
+J.get$context2D$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$context2D(receiver);
+};
+J.get$counters$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$counters(receiver);
+};
+J.get$countersChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$countersChanged(receiver);
+};
+J.get$data$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$data(receiver);
+};
+J.get$devtools$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$devtools(receiver);
+};
+J.get$displayCutoff$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$displayCutoff(receiver);
+};
+J.get$doAction$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$doAction(receiver);
+};
+J.get$element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$element(receiver);
+};
+J.get$endLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endLine(receiver);
+};
+J.get$endPos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPos(receiver);
+};
+J.get$endPosChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPosChanged(receiver);
+};
+J.get$error$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$error(receiver);
+};
+J.get$eval$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$eval(receiver);
+};
+J.get$evalNow$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$evalNow(receiver);
+};
+J.get$exception$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$exception(receiver);
+};
+J.get$expand$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$expand(receiver);
+};
+J.get$expandChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expandChanged(receiver);
+};
+J.get$expanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expanded(receiver);
+};
+J.get$expander$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expander(receiver);
+};
+J.get$expr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expr(receiver);
+};
+J.get$field$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$field(receiver);
+};
+J.get$file$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$file(receiver);
+};
+J.get$flag$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flag(receiver);
+};
+J.get$flagList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flagList(receiver);
+};
+J.get$formatSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatSize(receiver);
+};
+J.get$formatTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatTime(receiver);
+};
+J.get$formattedAverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedAverage(receiver);
+};
+J.get$formattedCollections$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedCollections(receiver);
+};
+J.get$formattedTotalCollectionTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedTotalCollectionTime(receiver);
+};
+J.get$fragmentation$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentation(receiver);
+};
+J.get$fragmentationChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentationChanged(receiver);
+};
+J.get$frame$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$frame(receiver);
+};
+J.get$functionChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$functionChanged(receiver);
+};
+J.get$gotoLink$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$gotoLink(receiver);
+};
+J.get$hasClass$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasClass(receiver);
+};
+J.get$hasParent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasParent(receiver);
+};
+J.get$hashCode$ = function(receiver) {
+  return J.getInterceptor(receiver).get$hashCode(receiver);
+};
+J.get$hashLinkWorkaround$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hashLinkWorkaround(receiver);
+};
+J.get$head$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$head(receiver);
+};
+J.get$height$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$height(receiver);
+};
+J.get$hideTagsChecked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hideTagsChecked(receiver);
+};
+J.get$hoverText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hoverText(receiver);
+};
+J.get$httpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$httpServer(receiver);
+};
+J.get$id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$id(receiver);
+};
+J.get$index$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$index(receiver);
+};
+J.get$instance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instance(receiver);
+};
+J.get$instances$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instances(receiver);
+};
+J.get$internal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$internal(receiver);
+};
+J.get$io$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$io(receiver);
+};
+J.get$isBool$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isBool(receiver);
+};
+J.get$isDart$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDart(receiver);
+};
+J.get$isDouble$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDouble(receiver);
+};
+J.get$isEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
+};
+J.get$isError$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isError(receiver);
+};
+J.get$isFinal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isFinal(receiver);
+};
+J.get$isInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInstance(receiver);
+};
+J.get$isInt$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInt(receiver);
+};
+J.get$isList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isList(receiver);
+};
+J.get$isNotEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
+};
+J.get$isNull$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isNull(receiver);
+};
+J.get$isString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isString(receiver);
+};
+J.get$isType$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isType(receiver);
+};
+J.get$isUnexpected$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isUnexpected(receiver);
+};
+J.get$isolate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolate(receiver);
+};
+J.get$isolateChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolateChanged(receiver);
+};
+J.get$iterator$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$iterator(receiver);
+};
+J.get$key$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$key(receiver);
+};
+J.get$kind$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$kind(receiver);
+};
+J.get$label$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$label(receiver);
+};
+J.get$last$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$last(receiver);
+};
+J.get$lastAccumulatorReset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastAccumulatorReset(receiver);
+};
+J.get$lastServiceGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastServiceGC(receiver);
+};
+J.get$length$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$length(receiver);
+};
+J.get$library$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$library(receiver);
+};
+J.get$lineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineMode(receiver);
+};
+J.get$lineNumber$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumber(receiver);
+};
+J.get$lineNumbers$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumbers(receiver);
+};
+J.get$lines$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lines(receiver);
+};
+J.get$link$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$link(receiver);
+};
+J.get$list$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$list(receiver);
+};
+J.get$loaded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$loaded(receiver);
+};
+J.get$map$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$map(receiver);
+};
+J.get$mapAsString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapAsString(receiver);
+};
+J.get$mapChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapChanged(receiver);
+};
+J.get$message$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$message(receiver);
+};
+J.get$model$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$model(receiver);
+};
+J.get$mouseOut$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOut(receiver);
+};
+J.get$mouseOver$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOver(receiver);
+};
+J.get$msg$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$msg(receiver);
+};
+J.get$name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$name(receiver);
+};
+J.get$nameIsEmpty$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nameIsEmpty(receiver);
+};
+J.get$nextElementSibling$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextElementSibling(receiver);
+};
+J.get$nextNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextNode(receiver);
+};
+J.get$object$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$object(receiver);
+};
+J.get$objectChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$objectChanged(receiver);
+};
+J.get$offset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$offset(receiver);
+};
+J.get$on$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$on(receiver);
+};
+J.get$onMouseDown$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseDown(receiver);
+};
+J.get$onMouseMove$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseMove(receiver);
+};
+J.get$ownerDocument$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ownerDocument(receiver);
+};
+J.get$pad$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pad(receiver);
+};
+J.get$padding$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$padding(receiver);
+};
+J.get$parent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parent(receiver);
+};
+J.get$parentNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parentNode(receiver);
+};
+J.get$path$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$path(receiver);
+};
+J.get$pause$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pause(receiver);
+};
+J.get$pauseEvent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pauseEvent(receiver);
+};
+J.get$pos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pos(receiver);
+};
+J.get$posChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$posChanged(receiver);
+};
+J.get$process$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$process(receiver);
+};
+J.get$profile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profile(receiver);
+};
+J.get$profileChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profileChanged(receiver);
+};
+J.get$protocol$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$protocol(receiver);
+};
+J.get$qualified$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualified(receiver);
+};
+J.get$qualifiedName$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualifiedName(receiver);
+};
+J.get$reachable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$reachable(receiver);
+};
+J.get$ref$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ref(receiver);
+};
+J.get$refChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refChanged(receiver);
+};
+J.get$refresh$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refresh(receiver);
+};
+J.get$refreshCoverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshCoverage(receiver);
+};
+J.get$refreshGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshGC(receiver);
+};
+J.get$refreshTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshTime(receiver);
+};
+J.get$resetAccumulator$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resetAccumulator(receiver);
+};
+J.get$response$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$response(receiver);
+};
+J.get$responseText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$responseText(receiver);
+};
+J.get$result$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$result(receiver);
+};
+J.get$results$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$results(receiver);
+};
+J.get$resume$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resume(receiver);
+};
+J.get$retainedBytes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedBytes(receiver);
+};
+J.get$retainedSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedSize(receiver);
+};
+J.get$retainingPath$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainingPath(receiver);
+};
+J.get$rowIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rowIndex(receiver);
+};
+J.get$rows$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rows(receiver);
+};
+J.get$runtimeType$ = function(receiver) {
+  return J.getInterceptor(receiver).get$runtimeType(receiver);
+};
+J.get$sampleCount$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleCount(receiver);
+};
+J.get$sampleDepth$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleDepth(receiver);
+};
+J.get$sampleRate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleRate(receiver);
+};
+J.get$script$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$script(receiver);
+};
+J.get$scriptChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$scriptChanged(receiver);
+};
+J.get$selectExpr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectExpr(receiver);
+};
+J.get$selectedIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectedIndex(receiver);
+};
+J.get$small$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$small(receiver);
+};
+J.get$socket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$socket(receiver);
+};
+J.get$startLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$startLine(receiver);
+};
+J.get$status$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$status(receiver);
+};
+J.get$styleForHits$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$styleForHits(receiver);
+};
+J.get$syntax$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$syntax(receiver);
+};
+J.get$tagSelector$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelector(receiver);
+};
+J.get$tagSelectorChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelectorChanged(receiver);
+};
+J.get$target$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$target(receiver);
+};
+J.get$templateInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$templateInstance(receiver);
+};
+J.get$text$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$text(receiver);
+};
+J.get$timeSpan$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$timeSpan(receiver);
+};
+J.get$toggleExpand$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpand(receiver);
+};
+J.get$toggleExpanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpanded(receiver);
+};
+J.get$topLeft$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$topLeft(receiver);
+};
+J.get$trace$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$trace(receiver);
+};
+J.get$tree$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tree(receiver);
+};
+J.get$uncheckedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$uncheckedText(receiver);
+};
+J.get$updateLineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$updateLineMode(receiver);
+};
+J.get$url$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$url(receiver);
+};
+J.get$value$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$value(receiver);
+};
+J.get$values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$values(receiver);
+};
+J.get$version$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$version(receiver);
+};
+J.get$vm$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$vm(receiver);
+};
+J.get$webSocket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$webSocket(receiver);
+};
+J.get$width$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$width(receiver);
+};
+J.getAttribute$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).getAttribute$1(receiver, a0);
+};
+J.getBoundingClientRect$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).getBoundingClientRect$0(receiver);
+};
+J.importNode$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).importNode$2(receiver, a0, a1);
+};
+J.indexOf$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).indexOf$1(receiver, a0);
+};
+J.indexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).indexOf$2(receiver, a0, a1);
+};
+J.insert$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).insert$2(receiver, a0, a1);
+};
+J.insertAllBefore$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).insertAllBefore$2(receiver, a0, a1);
+};
+J.join$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).join$1(receiver, a0);
+};
+J.lastIndexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).lastIndexOf$2(receiver, a0, a1);
+};
+J.load$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).load$0(receiver);
+};
+J.map$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).map$1(receiver, a0);
+};
+J.matches$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matches$1(receiver, a0);
+};
+J.matchesWithAncestors$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matchesWithAncestors$1(receiver, a0);
+};
+J.noSuchMethod$1 = function(receiver, a0) {
+  return J.getInterceptor(receiver).noSuchMethod$1(receiver, a0);
+};
+J.notifyPropertyChange$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).notifyPropertyChange$3(receiver, a0, a1, a2);
+};
+J.observe$3$attributeFilter$attributes$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).observe$3$attributeFilter$attributes(receiver, a0, a1, a2);
+};
+J.open$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).open$1(receiver, a0);
+};
+J.postMessage$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).postMessage$2(receiver, a0, a1);
+};
+J.preventDefault$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).preventDefault$0(receiver);
+};
+J.print$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).print$1(receiver, a0);
+};
+J.process$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).process$0(receiver);
+};
+J.putImageData$7$x = function(receiver, a0, a1, a2, a3, a4, a5, a6) {
+  return J.getInterceptor$x(receiver).putImageData$7(receiver, a0, a1, a2, a3, a4, a5, a6);
+};
+J.querySelector$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelector$1(receiver, a0);
+};
+J.querySelectorAll$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelectorAll$1(receiver, a0);
+};
+J.refreshCoverage$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).refreshCoverage$0(receiver);
+};
+J.reload$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).reload$0(receiver);
+};
+J.remove$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).remove$0(receiver);
+};
+J.remove$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).remove$1(receiver, a0);
+};
+J.removeEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).removeEventListener$3(receiver, a0, a1, a2);
+};
+J.removeRange$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).removeRange$2(receiver, a0, a1);
+};
+J.replaceAll$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).replaceAll$2(receiver, a0, a1);
+};
+J.replaceWith$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).replaceWith$1(receiver, a0);
+};
+J.round$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).round$0(receiver);
+};
+J.send$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).send$1(receiver, a0);
+};
+J.set$$function$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$$function(receiver, value);
+};
+J.set$_dartDetail$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_dartDetail(receiver, value);
+};
+J.set$_selector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_selector(receiver, value);
+};
+J.set$active$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$active(receiver, value);
+};
+J.set$anchor$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$anchor(receiver, value);
+};
+J.set$bindingDelegate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindingDelegate(receiver, value);
+};
+J.set$bindings$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindings(receiver, value);
+};
+J.set$busy$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$busy(receiver, value);
+};
+J.set$callback$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$callback(receiver, value);
+};
+J.set$checked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checked(receiver, value);
+};
+J.set$checkedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checkedText(receiver, value);
+};
+J.set$className$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$className(receiver, value);
+};
+J.set$classTable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$classTable(receiver, value);
+};
+J.set$cls$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$cls(receiver, value);
+};
+J.set$code$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$code(receiver, value);
+};
+J.set$connection$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$connection(receiver, value);
+};
+J.set$counters$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$counters(receiver, value);
+};
+J.set$devtools$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$devtools(receiver, value);
+};
+J.set$displayCutoff$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$displayCutoff(receiver, value);
+};
+J.set$endLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endLine(receiver, value);
+};
+J.set$endPos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endPos(receiver, value);
+};
+J.set$error$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$error(receiver, value);
+};
+J.set$eval$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$eval(receiver, value);
+};
+J.set$exception$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$exception(receiver, value);
+};
+J.set$expand$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$expand(receiver, value);
+};
+J.set$expanded$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expanded(receiver, value);
+};
+J.set$expr$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expr(receiver, value);
+};
+J.set$field$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$field(receiver, value);
+};
+J.set$file$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$file(receiver, value);
+};
+J.set$flag$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flag(receiver, value);
+};
+J.set$flagList$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flagList(receiver, value);
+};
+J.set$fragmentation$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$fragmentation(receiver, value);
+};
+J.set$frame$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$frame(receiver, value);
+};
+J.set$hasClass$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasClass(receiver, value);
+};
+J.set$hasParent$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasParent(receiver, value);
+};
+J.set$hashLinkWorkaround$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hashLinkWorkaround(receiver, value);
+};
+J.set$height$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$height(receiver, value);
+};
+J.set$hideTagsChecked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hideTagsChecked(receiver, value);
+};
+J.set$href$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$href(receiver, value);
+};
+J.set$httpServer$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$httpServer(receiver, value);
+};
+J.set$instance$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instance(receiver, value);
+};
+J.set$instances$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instances(receiver, value);
+};
+J.set$internal$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$internal(receiver, value);
+};
+J.set$io$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$io(receiver, value);
+};
+J.set$isDart$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isDart(receiver, value);
+};
+J.set$isolate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isolate(receiver, value);
+};
+J.set$kind$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$kind(receiver, value);
+};
+J.set$label$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$label(receiver, value);
+};
+J.set$last$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$last(receiver, value);
+};
+J.set$lastAccumulatorReset$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastAccumulatorReset(receiver, value);
+};
+J.set$lastServiceGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastServiceGC(receiver, value);
+};
+J.set$length$asx = function(receiver, value) {
+  return J.getInterceptor$asx(receiver).set$length(receiver, value);
+};
+J.set$library$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$library(receiver, value);
+};
+J.set$lineMode$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lineMode(receiver, value);
+};
+J.set$lines$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lines(receiver, value);
+};
+J.set$link$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$link(receiver, value);
+};
+J.set$list$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$list(receiver, value);
+};
+J.set$map$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$map(receiver, value);
+};
+J.set$mapAsString$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$mapAsString(receiver, value);
+};
+J.set$msg$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$msg(receiver, value);
+};
+J.set$name$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$name(receiver, value);
+};
+J.set$object$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$object(receiver, value);
+};
+J.set$pad$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pad(receiver, value);
+};
+J.set$path$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$path(receiver, value);
+};
+J.set$pause$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pause(receiver, value);
+};
+J.set$pos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pos(receiver, value);
+};
+J.set$process$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$process(receiver, value);
+};
+J.set$profile$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$profile(receiver, value);
+};
+J.set$qualified$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualified(receiver, value);
+};
+J.set$qualifiedName$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualifiedName(receiver, value);
+};
+J.set$reachable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$reachable(receiver, value);
+};
+J.set$ref$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$ref(receiver, value);
+};
+J.set$refresh$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refresh(receiver, value);
+};
+J.set$refreshCoverage$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshCoverage(receiver, value);
+};
+J.set$refreshGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshGC(receiver, value);
+};
+J.set$refreshTime$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshTime(receiver, value);
+};
+J.set$resetAccumulator$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resetAccumulator(receiver, value);
+};
+J.set$result$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$result(receiver, value);
+};
+J.set$results$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$results(receiver, value);
+};
+J.set$resume$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resume(receiver, value);
+};
+J.set$retainedBytes$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedBytes(receiver, value);
+};
+J.set$retainedSize$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedSize(receiver, value);
+};
+J.set$retainingPath$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainingPath(receiver, value);
+};
+J.set$sampleCount$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleCount(receiver, value);
+};
+J.set$sampleDepth$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleDepth(receiver, value);
+};
+J.set$sampleRate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleRate(receiver, value);
+};
+J.set$script$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$script(receiver, value);
+};
+J.set$selectedIndex$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$selectedIndex(receiver, value);
+};
+J.set$small$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$small(receiver, value);
+};
+J.set$socket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$socket(receiver, value);
+};
+J.set$startLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$startLine(receiver, value);
+};
+J.set$status$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$status(receiver, value);
+};
+J.set$tagSelector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$tagSelector(receiver, value);
+};
+J.set$text$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$text(receiver, value);
+};
+J.set$timeSpan$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$timeSpan(receiver, value);
+};
+J.set$trace$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$trace(receiver, value);
+};
+J.set$type$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$type(receiver, value);
+};
+J.set$uncheckedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$uncheckedText(receiver, value);
+};
+J.set$value$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$value(receiver, value);
+};
+J.set$vm$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$vm(receiver, value);
+};
+J.set$webSocket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$webSocket(receiver, value);
+};
+J.set$width$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$width(receiver, value);
+};
+J.setRange$4$ax = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$ax(receiver).setRange$4(receiver, a0, a1, a2, a3);
+};
+J.skip$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
+};
+J.sort$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).sort$0(receiver);
+};
+J.sort$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
+};
+J.split$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).split$1(receiver, a0);
+};
+J.startsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+};
+J.substring$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).substring$1(receiver, a0);
+};
+J.substring$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
+};
+J.toInt$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).toInt$0(receiver);
+};
+J.toList$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).toList$0(receiver);
+};
+J.toRadixString$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
+};
+J.toString$0 = function(receiver) {
+  return J.getInterceptor(receiver).toString$0(receiver);
+};
+J.toStringAsFixed$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toStringAsFixed$1(receiver, a0);
+};
+J.trim$0$s = function(receiver) {
+  return J.getInterceptor$s(receiver).trim$0(receiver);
+};
+J.where$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).where$1(receiver, a0);
+};
+C.ActionLinkElement_methods = X.ActionLinkElement.prototype;
+C.AutoBindingElement_methods = Y.AutoBindingElement.prototype;
+C.BreakpointListElement_methods = B.BreakpointListElement.prototype;
+C.ClassNavMenuElement_methods = A.ClassNavMenuElement.prototype;
+C.ClassRefElement_methods = Q.ClassRefElement.prototype;
+C.ClassTreeElement_methods = O.ClassTreeElement.prototype;
+C.ClassViewElement_methods = Z.ClassViewElement.prototype;
+C.CodeRefElement_methods = O.CodeRefElement.prototype;
+C.CodeViewElement_methods = F.CodeViewElement.prototype;
+C.CurlyBlockElement_methods = R.CurlyBlockElement.prototype;
+C.ErrorViewElement_methods = F.ErrorViewElement.prototype;
+C.EvalBoxElement_methods = L.EvalBoxElement.prototype;
+C.EvalLinkElement_methods = R.EvalLinkElement.prototype;
+C.FieldRefElement_methods = D.FieldRefElement.prototype;
+C.FieldViewElement_methods = A.FieldViewElement.prototype;
+C.FlagItemElement_methods = X.FlagItemElement.prototype;
+C.FlagListElement_methods = X.FlagListElement.prototype;
+C.FunctionRefElement_methods = U.FunctionRefElement.prototype;
+C.FunctionViewElement_methods = N.FunctionViewElement.prototype;
+C.HeapMapElement_methods = O.HeapMapElement.prototype;
+C.HeapProfileElement_methods = K.HeapProfileElement.prototype;
+C.HttpRequest_methods = W.HttpRequest.prototype;
+C.IOHttpServerConnectionRefElement_methods = E.IOHttpServerConnectionRefElement.prototype;
+C.IOHttpServerConnectionViewElement_methods = E.IOHttpServerConnectionViewElement.prototype;
+C.IOHttpServerListViewElement_methods = E.IOHttpServerListViewElement.prototype;
+C.IOHttpServerRefElement_methods = E.IOHttpServerRefElement.prototype;
+C.IOHttpServerViewElement_methods = E.IOHttpServerViewElement.prototype;
+C.IOProcessListViewElement_methods = E.IOProcessListViewElement.prototype;
+C.IOProcessRefElement_methods = E.IOProcessRefElement.prototype;
+C.IOProcessViewElement_methods = E.IOProcessViewElement.prototype;
+C.IORandomAccessFileListViewElement_methods = E.IORandomAccessFileListViewElement.prototype;
+C.IORandomAccessFileRefElement_methods = E.IORandomAccessFileRefElement.prototype;
+C.IORandomAccessFileViewElement_methods = E.IORandomAccessFileViewElement.prototype;
+C.IORefElement_methods = E.IORefElement.prototype;
+C.IOSocketListViewElement_methods = E.IOSocketListViewElement.prototype;
+C.IOSocketRefElement_methods = E.IOSocketRefElement.prototype;
+C.IOSocketViewElement_methods = E.IOSocketViewElement.prototype;
+C.IOViewElement_methods = E.IOViewElement.prototype;
+C.IOWebSocketListViewElement_methods = E.IOWebSocketListViewElement.prototype;
+C.IOWebSocketRefElement_methods = E.IOWebSocketRefElement.prototype;
+C.IOWebSocketViewElement_methods = E.IOWebSocketViewElement.prototype;
+C.InstanceRefElement_methods = B.InstanceRefElement.prototype;
+C.InstanceViewElement_methods = Z.InstanceViewElement.prototype;
+C.IsolateCounterChartElement_methods = D.IsolateCounterChartElement.prototype;
+C.IsolateLocationElement_methods = D.IsolateLocationElement.prototype;
+C.IsolateNavMenuElement_methods = A.IsolateNavMenuElement.prototype;
+C.IsolateProfileElement_methods = X.IsolateProfileElement.prototype;
+C.IsolateRefElement_methods = N.IsolateRefElement.prototype;
+C.IsolateRunStateElement_methods = D.IsolateRunStateElement.prototype;
+C.IsolateSharedSummaryElement_methods = D.IsolateSharedSummaryElement.prototype;
+C.IsolateSummaryElement_methods = D.IsolateSummaryElement.prototype;
+C.IsolateViewElement_methods = L.IsolateViewElement.prototype;
+C.JSArray_methods = J.JSArray.prototype;
+C.JSDouble_methods = J.JSDouble.prototype;
+C.JSInt_methods = J.JSInt.prototype;
+C.JSNull_methods = J.JSNull.prototype;
+C.JSNumber_methods = J.JSNumber.prototype;
+C.JSString_methods = J.JSString.prototype;
+C.JsonViewElement_methods = Z.JsonViewElement.prototype;
+C.LibraryNavMenuElement_methods = A.LibraryNavMenuElement.prototype;
+C.LibraryRefElement_methods = R.LibraryRefElement.prototype;
+C.LibraryViewElement_methods = M.LibraryViewElement.prototype;
+C.NativeUint8ClampedList_methods = H.NativeUint8ClampedList.prototype;
+C.NavBarElement_methods = A.NavBarElement.prototype;
+C.NavControlElement_methods = A.NavControlElement.prototype;
+C.NavMenuElement_methods = A.NavMenuElement.prototype;
+C.NavMenuItemElement_methods = A.NavMenuItemElement.prototype;
+C.NavRefreshElement_methods = A.NavRefreshElement.prototype;
+C.NodeList_methods = W.NodeList.prototype;
+C.ObservatoryApplicationElement_methods = V.ObservatoryApplicationElement.prototype;
+C.ObservatoryElement_methods = Z.ObservatoryElement.prototype;
+C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
+C.PolymerElement_methods = A.PolymerElement.prototype;
+C.ScriptInsetElement_methods = T.ScriptInsetElement.prototype;
+C.ScriptRefElement_methods = A.ScriptRefElement.prototype;
+C.ScriptViewElement_methods = U.ScriptViewElement.prototype;
+C.ServiceErrorViewElement_methods = R.ServiceErrorViewElement.prototype;
+C.ServiceExceptionViewElement_methods = D.ServiceExceptionViewElement.prototype;
+C.ServiceObjectViewElement_methods = U.ServiceObjectViewElement.prototype;
+C.ServiceRefElement_methods = Q.ServiceRefElement.prototype;
+C.SlidingCheckboxElement_methods = Q.SlidingCheckboxElement.prototype;
+C.StackFrameElement_methods = K.StackFrameElement.prototype;
+C.StackTraceElement_methods = X.StackTraceElement.prototype;
+C.TopNavMenuElement_methods = A.TopNavMenuElement.prototype;
+C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
+C.VMRefElement_methods = X.VMRefElement.prototype;
+C.VMViewElement_methods = U.VMViewElement.prototype;
+C.Window_methods = W.Window.prototype;
+C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
+C.C_EmptyExpression = new U.EmptyExpression();
+C.C_EmptyIterator = new H.EmptyIterator();
+C.C_OutOfMemoryError = new P.OutOfMemoryError();
+C.C_ScopeFactory = new T.ScopeFactory();
+C.C__DelayedDone = new P._DelayedDone();
+C.C__JSRandom = new P._JSRandom();
+C.C__ObserverSentinel = new L._ObserverSentinel();
+C.C__RootZone = new P._RootZone();
+C.C__RootZoneSpecification = new P._RootZoneSpecification();
+C.CodeKind_Collected = new D.CodeKind("Collected");
+C.CodeKind_Dart = new D.CodeKind("Dart");
+C.CodeKind_Native = new D.CodeKind("Native");
+C.CodeKind_Reused = new D.CodeKind("Reused");
+C.CodeKind_Tag = new D.CodeKind("Tag");
+C.DeclarationKind_0 = new A.DeclarationKind(0);
+C.DeclarationKind_1 = new A.DeclarationKind(1);
+C.DeclarationKind_2 = new A.DeclarationKind(2);
+C.Symbol_error = new H.Symbol0("error");
+C.Type_UOR = H.createRuntimeType('DartError');
+C.C_Reflectable = new K.Reflectable();
+C.PublishedProperty_false = new A.PublishedProperty(false);
+Isolate.makeConstantList = function(list) {
+  list.immutable$list = init;
+  list.fixed$length = init;
+  return list;
+};
+;
+C.List_bTJ = Isolate.makeConstantList([C.C_Reflectable, C.PublishedProperty_false]);
+C.Declaration_0 = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_UOR, false, C.List_bTJ);
+C.Symbol_last = new H.Symbol0("last");
+C.Type_EsU = H.createRuntimeType('bool');
+C.Declaration_06U = new A.Declaration(C.Symbol_last, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_fragmentation = new H.Symbol0("fragmentation");
+C.Type_bAc = H.createRuntimeType('ServiceMap');
+C.Declaration_0Y4 = new A.Declaration(C.Symbol_fragmentation, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_label = new H.Symbol0("label");
+C.Type_Ejg = H.createRuntimeType('String');
+C.Declaration_0g2 = new A.Declaration(C.Symbol_label, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_hasParent = new H.Symbol0("hasParent");
+C.C_ObservableProperty = new K.ObservableProperty();
+C.List_Reflectable_ObservableProperty = Isolate.makeConstantList([C.C_Reflectable, C.C_ObservableProperty]);
+C.Declaration_0qV = new A.Declaration(C.Symbol_hasParent, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleDepth = new H.Symbol0("sampleDepth");
+C.Declaration_2AE = new A.Declaration(C.Symbol_sampleDepth, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_result = new H.Symbol0("result");
+C.Type_rPh = H.createRuntimeType('ServiceObject');
+C.Declaration_2No = new A.Declaration(C.Symbol_result, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_counters = new H.Symbol0("counters");
+C.Type_caQ = H.createRuntimeType('ObservableMap');
+C.Declaration_2Qn = new A.Declaration(C.Symbol_counters, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_sampleRate = new H.Symbol0("sampleRate");
+C.Declaration_3VL = new A.Declaration(C.Symbol_sampleRate, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Type_Tby = H.createRuntimeType('ServiceError');
+C.Declaration_4eA = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_Tby, false, C.List_bTJ);
+C.Symbol_objectChanged = new H.Symbol0("objectChanged");
+C.Type_EjN = H.createRuntimeType('Function');
+C.List_empty = Isolate.makeConstantList([]);
+C.Declaration_4up = new A.Declaration(C.Symbol_objectChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_frame = new H.Symbol0("frame");
+C.Declaration_65l = new A.Declaration(C.Symbol_frame, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_flag = new H.Symbol0("flag");
+C.Declaration_6YB = new A.Declaration(C.Symbol_flag, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_library = new H.Symbol0("library");
+C.Type_azP = H.createRuntimeType('Library');
+C.Declaration_6ts = new A.Declaration(C.Symbol_library, C.DeclarationKind_1, false, C.Type_azP, false, C.List_bTJ);
+C.Symbol_status = new H.Symbol0("status");
+C.Declaration_8sn = new A.Declaration(C.Symbol_status, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPos = new H.Symbol0("endPos");
+C.Type_SnA = H.createRuntimeType('$int');
+C.Declaration_ACG = new A.Declaration(C.Symbol_endPos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_code = new H.Symbol0("code");
+C.Type_Zyt = H.createRuntimeType('Code');
+C.List_ObservableProperty = Isolate.makeConstantList([C.C_ObservableProperty]);
+C.Declaration_AgZ = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, true, C.Type_Zyt, false, C.List_ObservableProperty);
+C.Symbol_list = new H.Symbol0("list");
+C.Declaration_BKW = new A.Declaration(C.Symbol_list, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_httpServer = new H.Symbol0("httpServer");
+C.Declaration_BSX = new A.Declaration(C.Symbol_httpServer, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_retainedBytes = new H.Symbol0("retainedBytes");
+C.Declaration_CIB = new A.Declaration(C.Symbol_retainedBytes, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_displayCutoff = new H.Symbol0("displayCutoff");
+C.Declaration_CR6 = new A.Declaration(C.Symbol_displayCutoff, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_functionChanged = new H.Symbol0("functionChanged");
+C.Declaration_Chj = new A.Declaration(C.Symbol_functionChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_expandChanged = new H.Symbol0("expandChanged");
+C.Declaration_Dbk = new A.Declaration(C.Symbol_expandChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelectorChanged = new H.Symbol0("tagSelectorChanged");
+C.Declaration_ECn = new A.Declaration(C.Symbol_tagSelectorChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_profile = new H.Symbol0("profile");
+C.Declaration_EkK = new A.Declaration(C.Symbol_profile, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_pad = new H.Symbol0("pad");
+C.Declaration_EsU = new A.Declaration(C.Symbol_pad, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_object = new H.Symbol0("object");
+C.Declaration_HtW = new A.Declaration(C.Symbol_object, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_callback = new H.Symbol0("callback");
+C.Type_yvU = H.createRuntimeType('evalType');
+C.Declaration_IF7 = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_yvU, false, C.List_bTJ);
+C.Symbol_uncheckedText = new H.Symbol0("uncheckedText");
+C.Declaration_IRg = new A.Declaration(C.Symbol_uncheckedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_socket = new H.Symbol0("socket");
+C.Type_Qs5 = H.createRuntimeType('Socket');
+C.Declaration_Iiu = new A.Declaration(C.Symbol_socket, C.DeclarationKind_1, false, C.Type_Qs5, false, C.List_bTJ);
+C.Symbol_file = new H.Symbol0("file");
+C.Declaration_Ix1 = new A.Declaration(C.Symbol_file, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_refChanged = new H.Symbol0("refChanged");
+C.Declaration_MJ5 = new A.Declaration(C.Symbol_refChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelector = new H.Symbol0("tagSelector");
+C.Declaration_Q0F = new A.Declaration(C.Symbol_tagSelector, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPosChanged = new H.Symbol0("endPosChanged");
+C.Declaration_QAa = new A.Declaration(C.Symbol_endPosChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_vm = new H.Symbol0("vm");
+C.Type_GP5 = H.createRuntimeType('VM');
+C.Declaration_Qi2 = new A.Declaration(C.Symbol_vm, C.DeclarationKind_1, false, C.Type_GP5, false, C.List_bTJ);
+C.Symbol_mapAsString = new H.Symbol0("mapAsString");
+C.Declaration_Qx4 = new A.Declaration(C.Symbol_mapAsString, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_expanded = new H.Symbol0("expanded");
+C.Declaration_RQo = new A.Declaration(C.Symbol_expanded, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lines = new H.Symbol0("lines");
+C.Type_UWS = H.createRuntimeType('List');
+C.Declaration_WfA = new A.Declaration(C.Symbol_lines, C.DeclarationKind_1, false, C.Type_UWS, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_hasClass = new H.Symbol0("hasClass");
+C.Declaration_X8B = new A.Declaration(C.Symbol_hasClass, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_internal = new H.Symbol0("internal");
+C.Declaration_XBb = new A.Declaration(C.Symbol_internal, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_kind = new H.Symbol0("kind");
+C.Declaration_Xdi = new A.Declaration(C.Symbol_kind, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_endLine = new H.Symbol0("endLine");
+C.Declaration_ZcJ = new A.Declaration(C.Symbol_endLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_text = new H.Symbol0("text");
+C.Declaration_ZfX = new A.Declaration(C.Symbol_text, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_process = new H.Symbol0("process");
+C.Declaration_a13 = new A.Declaration(C.Symbol_process, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_hideTagsChecked = new H.Symbol0("hideTagsChecked");
+C.Declaration_a1A = new A.Declaration(C.Symbol_hideTagsChecked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleCount = new H.Symbol0("sampleCount");
+C.Declaration_ac8 = new A.Declaration(C.Symbol_sampleCount, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_isolate = new H.Symbol0("isolate");
+C.Type_B8J0 = H.createRuntimeType('Isolate');
+C.Declaration_agR = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_io = new H.Symbol0("io");
+C.Declaration_bh9 = new A.Declaration(C.Symbol_io, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_devtools = new H.Symbol0("devtools");
+C.Declaration_c4R = new A.Declaration(C.Symbol_devtools, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_countersChanged = new H.Symbol0("countersChanged");
+C.Declaration_cJC = new A.Declaration(C.Symbol_countersChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_path = new H.Symbol0("path");
+C.Declaration_cMb = new A.Declaration(C.Symbol_path, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checkedText = new H.Symbol0("checkedText");
+C.Declaration_cdS = new A.Declaration(C.Symbol_checkedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_timeSpan = new H.Symbol0("timeSpan");
+C.Declaration_dIf = new A.Declaration(C.Symbol_timeSpan, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_active = new H.Symbol0("active");
+C.Declaration_dw1 = new A.Declaration(C.Symbol_active, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_qualified = new H.Symbol0("qualified");
+C.Declaration_e24 = new A.Declaration(C.Symbol_qualified, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_isolateChanged = new H.Symbol0("isolateChanged");
+C.Declaration_e3c = new A.Declaration(C.Symbol_isolateChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_ref = new H.Symbol0("ref");
+C.Declaration_e3c0 = new A.Declaration(C.Symbol_ref, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Declaration_eea = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_expr = new H.Symbol0("expr");
+C.Type_dynamic = H.createRuntimeType('dynamic');
+C.Declaration_gLQ = new A.Declaration(C.Symbol_expr, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_msg = new H.Symbol0("msg");
+C.Declaration_gc6 = new A.Declaration(C.Symbol_msg, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_results = new H.Symbol0("results");
+C.Type_pe4 = H.createRuntimeType('ObservableList');
+C.Declaration_ggw = new A.Declaration(C.Symbol_results, C.DeclarationKind_1, false, C.Type_pe4, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_classTable = new H.Symbol0("classTable");
+C.Type_Gx6 = H.createRuntimeType('ClassSortedTable');
+C.Declaration_gsm = new A.Declaration(C.Symbol_classTable, C.DeclarationKind_1, false, C.Type_Gx6, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_pos = new H.Symbol0("pos");
+C.Declaration_i3t = new A.Declaration(C.Symbol_pos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_qualifiedName = new H.Symbol0("qualifiedName");
+C.Declaration_i3y = new A.Declaration(C.Symbol_qualifiedName, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_mapChanged = new H.Symbol0("mapChanged");
+C.Declaration_iLh = new A.Declaration(C.Symbol_mapChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_link = new H.Symbol0("link");
+C.Declaration_ibz = new A.Declaration(C.Symbol_link, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_refreshTime = new H.Symbol0("refreshTime");
+C.Declaration_ijl = new A.Declaration(C.Symbol_refreshTime, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_fragmentationChanged = new H.Symbol0("fragmentationChanged");
+C.Declaration_ivD = new A.Declaration(C.Symbol_fragmentationChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_scriptChanged = new H.Symbol0("scriptChanged");
+C.Declaration_ixB = new A.Declaration(C.Symbol_scriptChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_field = new H.Symbol0("field");
+C.Declaration_iyl = new A.Declaration(C.Symbol_field, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_busy = new H.Symbol0("busy");
+C.Declaration_izV = new A.Declaration(C.Symbol_busy, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_profileChanged = new H.Symbol0("profileChanged");
+C.Declaration_j3g = new A.Declaration(C.Symbol_profileChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_startLine = new H.Symbol0("startLine");
+C.Declaration_k6K = new A.Declaration(C.Symbol_startLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lastServiceGC = new H.Symbol0("lastServiceGC");
+C.Declaration_mPk = new A.Declaration(C.Symbol_lastServiceGC, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_webSocket = new H.Symbol0("webSocket");
+C.Declaration_mT8 = new A.Declaration(C.Symbol_webSocket, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_instance = new H.Symbol0("instance");
+C.Declaration_o7L = new A.Declaration(C.Symbol_instance, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_isDart = new H.Symbol0("isDart");
+C.Declaration_o7e = new A.Declaration(C.Symbol_isDart, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_cls = new H.Symbol0("cls");
+C.Type_Tzp = H.createRuntimeType('Class');
+C.Declaration_okX = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_Tzp, false, C.List_bTJ);
+C.Symbol_posChanged = new H.Symbol0("posChanged");
+C.Declaration_owq = new A.Declaration(C.Symbol_posChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_small = new H.Symbol0("small");
+C.Declaration_pPA = new A.Declaration(C.Symbol_small, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_instances = new H.Symbol0("instances");
+C.Declaration_qr9 = new A.Declaration(C.Symbol_instances, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_qrv = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checked = new H.Symbol0("checked");
+C.Declaration_siO = new A.Declaration(C.Symbol_checked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_trace = new H.Symbol0("trace");
+C.Declaration_ssf = new A.Declaration(C.Symbol_trace, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_anchor = new H.Symbol0("anchor");
+C.Declaration_suy = new A.Declaration(C.Symbol_anchor, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_exception = new H.Symbol0("exception");
+C.Type_zzJ = H.createRuntimeType('ServiceException');
+C.Declaration_v0l = new A.Declaration(C.Symbol_exception, C.DeclarationKind_1, false, C.Type_zzJ, false, C.List_bTJ);
+C.Symbol_lastAccumulatorReset = new H.Symbol0("lastAccumulatorReset");
+C.Declaration_vA1 = new A.Declaration(C.Symbol_lastAccumulatorReset, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_voj = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_bTJ);
+C.Symbol_flagList = new H.Symbol0("flagList");
+C.Declaration_wE9 = new A.Declaration(C.Symbol_flagList, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_woc = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, false, C.Type_Zyt, false, C.List_bTJ);
+C.Symbol_lineMode = new H.Symbol0("lineMode");
+C.Declaration_ww8 = new A.Declaration(C.Symbol_lineMode, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_map = new H.Symbol0("map");
+C.Declaration_wzu = new A.Declaration(C.Symbol_map, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_function = new H.Symbol0("function");
+C.Declaration_y9n = new A.Declaration(C.Symbol_function, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_connection = new H.Symbol0("connection");
+C.Declaration_yDj = new A.Declaration(C.Symbol_connection, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_yXb = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_expand = new H.Symbol0("expand");
+C.Declaration_yXb0 = new A.Declaration(C.Symbol_expand, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_script = new H.Symbol0("script");
+C.Type_cgs = H.createRuntimeType('Script');
+C.Declaration_yx3 = new A.Declaration(C.Symbol_script, C.DeclarationKind_1, false, C.Type_cgs, false, C.List_bTJ);
+C.Duration_0 = new P.Duration(0);
+C.EventStreamProvider_change = H.setRuntimeTypeInfo(new W.EventStreamProvider("change"), [W.Event]);
+C.EventStreamProvider_click = H.setRuntimeTypeInfo(new W.EventStreamProvider("click"), [W.MouseEvent]);
+C.EventStreamProvider_error = H.setRuntimeTypeInfo(new W.EventStreamProvider("error"), [W.ProgressEvent]);
+C.EventStreamProvider_input = H.setRuntimeTypeInfo(new W.EventStreamProvider("input"), [W.Event]);
+C.EventStreamProvider_load = H.setRuntimeTypeInfo(new W.EventStreamProvider("load"), [W.ProgressEvent]);
+C.EventStreamProvider_message = H.setRuntimeTypeInfo(new W.EventStreamProvider("message"), [W.MessageEvent]);
+C.EventStreamProvider_mousedown = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousedown"), [W.MouseEvent]);
+C.EventStreamProvider_mousemove = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousemove"), [W.MouseEvent]);
+C.EventStreamProvider_popstate = H.setRuntimeTypeInfo(new W.EventStreamProvider("popstate"), [W.PopStateEvent]);
+C.JS_CONST_0 = function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
-}
-C.lR=function(hooks) {
+};
+C.JS_CONST_4hp = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Firefox") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19330,8 +35830,8 @@
     return quickMap[tag] || tag;
   }
   hooks.getTag = getTagFirefox;
-}
-C.w2=function getTagFallback(o) {
+};
+C.JS_CONST_8ZY = function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
@@ -19344,10 +35844,10 @@
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
-}
-C.XQ=function(hooks) { return hooks; }
-
-C.ku=function(getTagFallback) {
+};
+C.JS_CONST_Fs4 = function(hooks) { return hooks; }
+;
+C.JS_CONST_QJm = function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -19360,8 +35860,8 @@
     }
     hooks.getTag = getTagFallback;
   };
-}
-C.MA=function() {
+};
+C.JS_CONST_aQP = function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
     if (name) return name;
@@ -19393,8 +35893,8 @@
     getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
     prototypeForTag: prototypeForTag,
     discriminator: discriminator };
-}
-C.M1=function(hooks) {
+};
+C.JS_CONST_gkc = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19422,8 +35922,8 @@
   }
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
-}
-C.hQ=function(hooks) {
+};
+C.JS_CONST_rr7 = function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -19440,593 +35940,1171 @@
   }
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
-}
-C.xr=new P.pE(null,null)
-C.A3=new P.c5(null)
-C.Sr=new P.ojF(null,null)
-C.D8=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
-C.IF=new N.qV("INFO",800)
-C.Xm=new N.qV("SEVERE",1000)
-C.nT=new N.qV("WARNING",900)
-C.NG=I.uL([1,6])
-C.rs=I.uL([0,0,26624,1023,0,0,65534,2047])
-C.SV=new H.IN("keys")
-C.Uq=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.NL=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.Kx('nd')
-C.Cd=I.uL([C.N4])
-C.G8=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=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.B2=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,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(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.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(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.CM=new H.Px(0,{},C.dn)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
-C.tq=H.Kx('Bo')
-C.MS=H.Kx('wA')
-C.wE=I.uL([C.MS])
-C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.uDk=H.Kx('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.fO=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.ke=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.hN=new H.IN("bytes")
-C.Ka=new H.IN("call")
-C.bV=new H.IN("capacity")
-C.C0=new H.IN("change")
-C.eZ=new H.IN("changeSort")
-C.OI=new H.IN("classes")
-C.To=new H.IN("closing")
-C.J6=new H.IN("collections")
-C.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-C.Je=new H.IN("current")
-C.iE=new H.IN("descriptor")
-C.f4=new H.IN("descriptors")
-C.aK=new H.IN("doAction")
-C.GP=new H.IN("element")
-C.tP=new H.IN("entry")
-C.Zb=new H.IN("eval")
-C.u7=new H.IN("evalNow")
-C.Ek=new H.IN("expander")
-C.Pn=new H.IN("expanderStyle")
-C.h7=new H.IN("external")
-C.R3=new H.IN("fd")
-C.fV=new H.IN("fields")
-C.Gd=new H.IN("firstTokenPos")
-C.FP=new H.IN("formatSize")
-C.kF=new H.IN("formatTime")
-C.UD=new H.IN("formattedAddress")
-C.Aq=new H.IN("formattedAverage")
-C.DS=new H.IN("formattedCollections")
-C.C9=new H.IN("formattedDeoptId")
-C.VF=new H.IN("formattedExclusive")
-C.uU=new H.IN("formattedExclusiveTicks")
-C.YJ=new H.IN("formattedInclusive")
-C.eF=new H.IN("formattedInclusiveTicks")
-C.oI=new H.IN("formattedLine")
-C.ST=new H.IN("formattedTotalCollectionTime")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.d4=new H.IN("goto")
-C.cF=new H.IN("gotoLink")
-C.SI=new H.IN("hasDescriptors")
-C.zS=new H.IN("hasDisassembly")
-C.YA=new H.IN("hasNoAllocations")
-C.Ge=new H.IN("hashLinkWorkaround")
-C.Ss=new H.IN("hits")
-C.k6=new H.IN("hoverText")
-C.PJ=new H.IN("human")
-C.q2=new H.IN("idle")
-C.d2=new H.IN("imp")
-C.kN=new H.IN("imports")
-C.yB=new H.IN("instances")
-C.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.Bs=new H.IN("ioEnabled")
-C.XH=new H.IN("isAbstract")
-C.I9=new H.IN("isBool")
-C.C1=new H.IN("isComment")
-C.bD=new H.IN("isConst")
-C.Yg=new H.IN("isDartCode")
-C.bR=new H.IN("isDouble")
-C.ob=new H.IN("isError")
-C.WV=new H.IN("isFinalized")
-C.Ih=new H.IN("isImplemented")
-C.Iv=new H.IN("isInstance")
-C.Wg=new H.IN("isInt")
-C.tD=new H.IN("isList")
-C.Of=new H.IN("isNull")
-C.pY=new H.IN("isOptimized")
-C.XL=new H.IN("isPatch")
-C.LA=new H.IN("isPipe")
-C.Lk=new H.IN("isString")
-C.dK=new H.IN("isType")
-C.xf=new H.IN("isUnexpected")
-C.Jx=new H.IN("isolates")
-C.b5=new H.IN("jumpTarget")
-C.kA=new H.IN("lastTokenPos")
-C.GI=new H.IN("lastUpdate")
-C.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-C.r6=new H.IN("lineNumber")
-C.MW=new H.IN("lineNumbers")
-C.cc=new H.IN("listening")
-C.DY=new H.IN("loading")
-C.Lx=new H.IN("localAddress")
-C.M3=new H.IN("localPort")
-C.wT=new H.IN("mainPort")
-C.pX=new H.IN("message")
-C.VD=new H.IN("mouseOut")
-C.NN=new H.IN("mouseOver")
-C.YS=new H.IN("name")
-C.pu=new H.IN("nameIsEmpty")
-C.BJ=new H.IN("newSpace")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.vg=new H.IN("oldSpace")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-C.uI=new H.IN("pid")
-C.AY=new H.IN("protocol")
-C.I7=new H.IN("readClosed")
-C.GR=new H.IN("refresh")
-C.KX=new H.IN("refreshCoverage")
-C.ja=new H.IN("refreshGC")
-C.MT=new H.IN("registerCallback")
-C.ir=new H.IN("relativeLink")
-C.dx=new H.IN("remoteAddress")
-C.ni=new H.IN("remotePort")
-C.X2=new H.IN("resetAccumulator")
-C.F3=new H.IN("response")
-C.nY=new H.IN("resume")
-C.HD=new H.IN("retainedSize")
-C.iU=new H.IN("retainingPath")
-C.eN=new H.IN("rootLib")
-C.ue=new H.IN("row")
-C.nh=new H.IN("rows")
-C.L2=new H.IN("running")
-C.EA=new H.IN("scripts")
-C.oW=new H.IN("selectExpr")
-C.hd=new H.IN("serviceType")
-C.jM=new H.IN("socketOwner")
-C.Pf=new H.IN("stacktrace")
-C.xA=new H.IN("styleForHits")
-C.k5=new H.IN("subClasses")
-C.Nv=new H.IN("subclass")
-C.Cw=new H.IN("superClass")
-C.hO=new H.IN("tipExclusive")
-C.ei=new H.IN("tipKind")
-C.HK=new H.IN("tipParent")
-C.je=new H.IN("tipTicks")
-C.Ef=new H.IN("tipTime")
-C.Q1=new H.IN("toggleExpand")
-C.ID=new H.IN("toggleExpanded")
-C.z6=new H.IN("tokenPos")
-C.bc=new H.IN("topFrame")
-C.Jl=new H.IN("totalCollectionTimeInSeconds")
-C.Kj=new H.IN("totalSamplesInProfile")
-C.ep=new H.IN("tree")
-C.J2=new H.IN("typeChecksEnabled")
-C.bn=new H.IN("updateLineMode")
-C.mh=new H.IN("uptime")
-C.Fh=new H.IN("url")
-C.LP=new H.IN("used")
-C.jh=new H.IN("v")
-C.Ha=new H.IN("value")
-C.fj=new H.IN("variable")
-C.xw=new H.IN("variables")
-C.zn=new H.IN("version")
-C.Tc=new H.IN("vmName")
-C.Uy=new H.IN("writeClosed")
-C.MI=H.Kx('hx')
-C.hP=H.Kx('uz')
-C.Mf=H.Kx('G1')
-C.q0S=H.Kx('Dg')
-C.Dl=H.Kx('F1')
-C.Jf=H.Kx('Mb')
-C.UJ=H.Kx('oa')
-C.E0=H.Kx('aI')
-C.Y3=H.Kx('CY')
-C.lU=H.Kx('Hl')
-C.kq=H.Kx('Nn')
-C.j4=H.Kx('IW')
-C.dP=H.Kx('vm')
-C.Vx=H.Kx('MJ')
-C.Vh=H.Kx('Pz')
-C.HC=H.Kx('F0')
-C.rR=H.Kx('wN')
-C.yS=H.Kx('G6')
-C.Sb=H.Kx('kn')
-C.FQ=H.Kx('a')
-C.Yc=H.Kx('iP')
-C.EZ=H.Kx('oF')
-C.vw=H.Kx('UK')
-C.Jo=H.Kx('i7')
-C.BL=H.Kx('Nr')
-C.ON=H.Kx('ov')
-C.jR=H.Kx('Be')
-C.al=H.Kx('es')
-C.PT=H.Kx('CX')
-C.iD=H.Kx('Vb')
-C.ce=H.Kx('kK')
-C.dD=H.Kx('av')
-C.FA=H.Kx('Ya')
-C.Th=H.Kx('fI')
-C.tU=H.Kx('L4')
-C.yT=H.Kx('FK')
-C.cK=H.Kx('I5')
-C.jA=H.Kx('Eg')
-C.K4=H.Kx('hV')
-C.Mt=H.Kx('hu')
-C.la=H.Kx('ZX')
-C.CR=H.Kx('CP')
-C.xE=H.Kx('aC')
-C.vu=H.Kx('uw')
-C.ca=H.Kx('Z4')
-C.pJ=H.Kx('Q6')
-C.Yy=H.Kx('uE')
-C.M5=H.Kx('yc')
-C.Yxm=H.Kx('Pg')
-C.il=H.Kx('xI')
-C.lk=H.Kx('mJ')
-C.lp=H.Kx('LU')
-C.oG=H.Kx('ds')
-C.EG=H.Kx('Oz')
-C.nw=H.Kx('eo')
-C.OG=H.Kx('eW')
-C.km=H.Kx('fl')
-C.jV=H.Kx('rF')
-C.Tq=H.Kx('vj')
-C.JW=H.Kx('Ww')
-C.xeh=H.Kx('ve')
-C.CT=H.Kx('St')
-C.wH=H.Kx('zM')
-C.l4=H.Kx('uL')
-C.LT=H.Kx('md')
-C.Wh=H.Kx('H8')
-C.Zj=H.Kx('U1')
-C.FG=H.Kx('qh')
-C.Fe=H.Kx('zt')
-C.NR=H.Kx('nm')
-C.DD=H.Kx('Zn')
-C.qF=H.Kx('mO')
-C.Ey=H.Kx('wM')
-C.pF=H.Kx('WS')
-C.nX=H.Kx('DE')
-C.jw=H.Kx('xc')
-C.NW=H.Kx('ye')
-C.ig=H.Kx('we')
-C.Xv=H.Kx('n5')
-C.XI=H.Kx('cn')
-C.KO=H.Kx('ZP')
-C.Jm=H.Kx('q6')
-C.Wz=H.Kx('pR')
-C.Ep=H.Kx('ou')
-C.tc=H.Kx('Ma')
-C.Io=H.Kx('Qh')
-C.wk=H.Kx('nJ')
-C.te=H.Kx('BS')
-C.ms=H.Kx('Bm')
-C.qJ=H.Kx('pG')
-C.pK=H.Kx('Rk')
-C.lE=H.Kx('DK')
-C.Az=H.Kx('Gk')
-C.GX=H.Kx('c8')
-C.X8=H.Kx('Ti')
-C.Lg=H.Kx('JI')
-C.Ju=H.Kx('Ly')
-C.mq=H.Kx('qk')
-C.XWY=H.Kx('uEY')
-C.oT=H.Kx('VY')
-C.jK=H.Kx('el')
-C.xM=new P.u5F(!1)
-$.libraries_to_load = {}
-$.Vz=1
-$.z7="$cachedFunction"
-$.eb="$cachedInvocation"
-$.OK=0
-$.bf=null
-$.P4=null
-$.Ot=!1
-$.NF=null
-$.TX=null
-$.x7=null
-$.q4=null
-$.vv=null
-$.Bv=null
-$.W5=null
-$.BY=null
-$.oK=null
-$.S6=null
-$.k8=null
-$.X3=C.NU
-$.Km=0
-$.Qz=null
-$.R6=null
-$.RL=!1
-$.Y4=C.IF
-$.xO=0
-$.ax=0
-$.Oo=null
-$.Td=!1
-$.ps=0
-$.xG=null
-$.ok=!1
-$.AC=!1
-$.M6=null
-$.UG=!0
-$.RQ="objects/"
-$.vU=null
-$.xV=null
-$.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.Ci},C.FA,A.Ya,{created:A.vn},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.MB},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.P3},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.fd},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.xeh,W.ve,{},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.Fv},C.ig,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Zg},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.HP},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.US},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","Vr",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
-try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","cz","kQ",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","Bi",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","A7","ko",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($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
-I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","Rl",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.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qr","V6",function(){return new L.vH([])})
-I.$lazy($,"_pathRegExp","tC","uC",function(){return new L.YJG().$0()})
-I.$lazy($,"_logger","y7Y","YV",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Rs",function(){return new A.Li(T.GF(null,C.qY),null)})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","jQ","op",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
-return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","Es",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","i8","p2",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","eS",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","QX5",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","NB","dg",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.Ra(),C.HL,new Z.wJY(),C.yw,new Z.zOQ(),C.CR,new Z.W6o()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",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","qM","qL",function(){return P.EF(["+",new K.Raa(),"-",new K.w0(),"!",new K.w5()],null,null)})
-I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
-I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.vE(null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Ufa().$0()})
-I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.MdQ()).zV(0,", ")})
-I.$lazy($,"_templateObserver","kY","pT",function(){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Fs(new M.DOe()),2))})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.lPa().$0()})
-I.$lazy($,"_instanceExtension","AH","It",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","AA",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
+};
+C.JsonCodec_null_null = new P.JsonCodec(null, null);
+C.JsonDecoder_null = new P.JsonDecoder(null);
+C.JsonEncoder_null_null = new P.JsonEncoder(null, null);
+C.Level_FINER_400 = new N.Level("FINER", 400);
+C.Level_FINE_500 = new N.Level("FINE", 500);
+C.Level_INFO_800 = new N.Level("INFO", 800);
+C.Level_SEVERE_1000 = new N.Level("SEVERE", 1000);
+C.Level_WARNING_900 = new N.Level("WARNING", 900);
+C.List_1_6 = Isolate.makeConstantList([1, 6]);
+C.List_6Pr = Isolate.makeConstantList([0, 0, 26624, 1023, 0, 0, 65534, 2047]);
+C.Symbol_keys = new H.Symbol0("keys");
+C.Symbol_values = new H.Symbol0("values");
+C.Symbol_length = new H.Symbol0("length");
+C.Symbol_isEmpty = new H.Symbol0("isEmpty");
+C.Symbol_isNotEmpty = new H.Symbol0("isNotEmpty");
+C.List_8QI = Isolate.makeConstantList([C.Symbol_keys, C.Symbol_values, C.Symbol_length, C.Symbol_isEmpty, C.Symbol_isNotEmpty]);
+C.List_EuK = H.setRuntimeTypeInfo(Isolate.makeConstantList(["+", "-", "*", "/", "%", "^", "==", "!=", ">", "<", ">=", "<=", "||", "&&", "&", "===", "!==", "|"]), [P.String]);
+C.Type_6WV = H.createRuntimeType('ObservableProperty');
+C.List_GGa = Isolate.makeConstantList([C.Type_6WV]);
+C.List_JYB = Isolate.makeConstantList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]);
+C.List_KIf = Isolate.makeConstantList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431]);
+C.List_Ynd = Isolate.makeConstantList(["==", "!=", "<=", ">=", "||", "&&"]);
+C.List_as_in_this = Isolate.makeConstantList(["as", "in", "this"]);
+C.List_mBx = Isolate.makeConstantList(["rowColor0", "rowColor1", "rowColor2", "rowColor3", "rowColor4", "rowColor5", "rowColor6", "rowColor7", "rowColor8"]);
+C.List_mC8 = Isolate.makeConstantList([43, 45, 42, 47, 33, 38, 37, 60, 61, 62, 63, 94, 124]);
+C.List_nxB = Isolate.makeConstantList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]);
+C.List_qNA = Isolate.makeConstantList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]);
+C.List_qg4 = Isolate.makeConstantList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]);
+C.List_ww8 = Isolate.makeConstantList([40, 41, 91, 93, 123, 125]);
+C.List_05B = Isolate.makeConstantList(["caption", "col", "colgroup", "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", "tr"]);
+C.Map_05eTF = new H.ConstantStringMap(11, {caption: null, col: null, colgroup: null, option: null, optgroup: null, tbody: null, td: null, tfoot: null, th: null, thead: null, tr: null}, C.List_05B);
+C.List_AmO = Isolate.makeConstantList(["domfocusout", "domfocusin", "dommousescroll", "animationend", "animationiteration", "animationstart", "doubleclick", "fullscreenchange", "fullscreenerror", "keyadded", "keyerror", "keymessage", "needkey", "speechchange"]);
+C.Map_AmMJ5 = new H.ConstantStringMap(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.List_AmO);
+C.List_EJ5 = Isolate.makeConstantList(["name", "extends", "constructor", "noscript", "assetpath", "cache-csstext", "attributes"]);
+C.Map_EJn7R = new H.ConstantStringMap(7, {name: 1, extends: 1, constructor: 1, noscript: 1, assetpath: 1, "cache-csstext": 1, attributes: 1}, C.List_EJ5);
+C.List_L0C = Isolate.makeConstantList(["!", ":", ",", ")", "]", "}", "?", "||", "&&", "|", "^", "&", "!=", "==", "!==", "===", ">=", ">", "<=", "<", "+", "-", "%", "/", "*", "(", "[", ".", "{"]);
+C.Map_L0K61 = new H.ConstantStringMap(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.List_L0C);
+C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty);
+C.List_enumerate = Isolate.makeConstantList(["enumerate"]);
+C.Map_wgEsG = new H.ConstantStringMap(1, {enumerate: K.enumerate$closure()}, C.List_enumerate);
+C.Type_fPs = H.createRuntimeType('HtmlElement');
+C.Type_oGx = H.createRuntimeType('PublishedProperty');
+C.List_JQl = Isolate.makeConstantList([C.Type_oGx]);
+C.QueryOptions_sAl = new A.QueryOptions(true, true, true, C.Type_fPs, false, false, C.List_JQl, null);
+C.Type_oqK = H.createRuntimeType('ObserveProperty');
+C.List_M2f = Isolate.makeConstantList([C.Type_oqK]);
+C.QueryOptions_xw8 = new A.QueryOptions(false, false, true, C.Type_fPs, false, true, C.List_M2f, null);
+C.SocketKind_Internal = new D.SocketKind("Internal");
+C.SocketKind_Listening = new D.SocketKind("Listening");
+C.SocketKind_Normal = new D.SocketKind("Normal");
+C.SocketKind_Pipe = new D.SocketKind("Pipe");
+C.Symbol_address = new H.Symbol0("address");
+C.Symbol_architecture = new H.Symbol0("architecture");
+C.Symbol_assertsEnabled = new H.Symbol0("assertsEnabled");
+C.Symbol_bpt = new H.Symbol0("bpt");
+C.Symbol_buttonClick = new H.Symbol0("buttonClick");
+C.Symbol_bytes = new H.Symbol0("bytes");
+C.Symbol_call = new H.Symbol0("call");
+C.Symbol_capacity = new H.Symbol0("capacity");
+C.Symbol_change = new H.Symbol0("change");
+C.Symbol_changeSort = new H.Symbol0("changeSort");
+C.Symbol_classes = new H.Symbol0("classes");
+C.Symbol_closing = new H.Symbol0("closing");
+C.Symbol_collections = new H.Symbol0("collections");
+C.Symbol_coloring = new H.Symbol0("coloring");
+C.Symbol_columns = new H.Symbol0("columns");
+C.Symbol_current = new H.Symbol0("current");
+C.Symbol_descriptor = new H.Symbol0("descriptor");
+C.Symbol_descriptors = new H.Symbol0("descriptors");
+C.Symbol_doAction = new H.Symbol0("doAction");
+C.Symbol_element = new H.Symbol0("element");
+C.Symbol_entry = new H.Symbol0("entry");
+C.Symbol_eval = new H.Symbol0("eval");
+C.Symbol_evalNow = new H.Symbol0("evalNow");
+C.Symbol_expander = new H.Symbol0("expander");
+C.Symbol_expanderStyle = new H.Symbol0("expanderStyle");
+C.Symbol_external = new H.Symbol0("external");
+C.Symbol_fd = new H.Symbol0("fd");
+C.Symbol_fields = new H.Symbol0("fields");
+C.Symbol_firstTokenPos = new H.Symbol0("firstTokenPos");
+C.Symbol_formatSize = new H.Symbol0("formatSize");
+C.Symbol_formatTime = new H.Symbol0("formatTime");
+C.Symbol_formattedAddress = new H.Symbol0("formattedAddress");
+C.Symbol_formattedAverage = new H.Symbol0("formattedAverage");
+C.Symbol_formattedCollections = new H.Symbol0("formattedCollections");
+C.Symbol_formattedDeoptId = new H.Symbol0("formattedDeoptId");
+C.Symbol_formattedExclusive = new H.Symbol0("formattedExclusive");
+C.Symbol_formattedExclusiveTicks = new H.Symbol0("formattedExclusiveTicks");
+C.Symbol_formattedInclusive = new H.Symbol0("formattedInclusive");
+C.Symbol_formattedInclusiveTicks = new H.Symbol0("formattedInclusiveTicks");
+C.Symbol_formattedLine = new H.Symbol0("formattedLine");
+C.Symbol_formattedTotalCollectionTime = new H.Symbol0("formattedTotalCollectionTime");
+C.Symbol_functions = new H.Symbol0("functions");
+C.Symbol_getColumnLabel = new H.Symbol0("getColumnLabel");
+C.Symbol_goto = new H.Symbol0("goto");
+C.Symbol_gotoLink = new H.Symbol0("gotoLink");
+C.Symbol_hasDescriptors = new H.Symbol0("hasDescriptors");
+C.Symbol_hasDisassembly = new H.Symbol0("hasDisassembly");
+C.Symbol_hasNoAllocations = new H.Symbol0("hasNoAllocations");
+C.Symbol_hashLinkWorkaround = new H.Symbol0("hashLinkWorkaround");
+C.Symbol_hits = new H.Symbol0("hits");
+C.Symbol_hoverText = new H.Symbol0("hoverText");
+C.Symbol_human = new H.Symbol0("human");
+C.Symbol_idle = new H.Symbol0("idle");
+C.Symbol_imp = new H.Symbol0("imp");
+C.Symbol_imports = new H.Symbol0("imports");
+C.Symbol_instruction = new H.Symbol0("instruction");
+C.Symbol_instructions = new H.Symbol0("instructions");
+C.Symbol_interface = new H.Symbol0("interface");
+C.Symbol_interfaces = new H.Symbol0("interfaces");
+C.Symbol_ioEnabled = new H.Symbol0("ioEnabled");
+C.Symbol_isAbstract = new H.Symbol0("isAbstract");
+C.Symbol_isBool = new H.Symbol0("isBool");
+C.Symbol_isComment = new H.Symbol0("isComment");
+C.Symbol_isConst = new H.Symbol0("isConst");
+C.Symbol_isDartCode = new H.Symbol0("isDartCode");
+C.Symbol_isDouble = new H.Symbol0("isDouble");
+C.Symbol_isError = new H.Symbol0("isError");
+C.Symbol_isFinalized = new H.Symbol0("isFinalized");
+C.Symbol_isImplemented = new H.Symbol0("isImplemented");
+C.Symbol_isInstance = new H.Symbol0("isInstance");
+C.Symbol_isInt = new H.Symbol0("isInt");
+C.Symbol_isList = new H.Symbol0("isList");
+C.Symbol_isNull = new H.Symbol0("isNull");
+C.Symbol_isOptimized = new H.Symbol0("isOptimized");
+C.Symbol_isPatch = new H.Symbol0("isPatch");
+C.Symbol_isPipe = new H.Symbol0("isPipe");
+C.Symbol_isString = new H.Symbol0("isString");
+C.Symbol_isType = new H.Symbol0("isType");
+C.Symbol_isUnexpected = new H.Symbol0("isUnexpected");
+C.Symbol_isolates = new H.Symbol0("isolates");
+C.Symbol_jumpTarget = new H.Symbol0("jumpTarget");
+C.Symbol_lastTokenPos = new H.Symbol0("lastTokenPos");
+C.Symbol_lastUpdate = new H.Symbol0("lastUpdate");
+C.Symbol_lib = new H.Symbol0("lib");
+C.Symbol_libraries = new H.Symbol0("libraries");
+C.Symbol_line = new H.Symbol0("line");
+C.Symbol_lineNumber = new H.Symbol0("lineNumber");
+C.Symbol_lineNumbers = new H.Symbol0("lineNumbers");
+C.Symbol_listening = new H.Symbol0("listening");
+C.Symbol_loading = new H.Symbol0("loading");
+C.Symbol_localAddress = new H.Symbol0("localAddress");
+C.Symbol_localPort = new H.Symbol0("localPort");
+C.Symbol_mainPort = new H.Symbol0("mainPort");
+C.Symbol_message = new H.Symbol0("message");
+C.Symbol_mouseOut = new H.Symbol0("mouseOut");
+C.Symbol_mouseOver = new H.Symbol0("mouseOver");
+C.Symbol_name = new H.Symbol0("name");
+C.Symbol_nameIsEmpty = new H.Symbol0("nameIsEmpty");
+C.Symbol_newSpace = new H.Symbol0("newSpace");
+C.Symbol_noSuchMethod = new H.Symbol0("noSuchMethod");
+C.Symbol_objectClass = new H.Symbol0("objectClass");
+C.Symbol_objectPool = new H.Symbol0("objectPool");
+C.Symbol_oldSpace = new H.Symbol0("oldSpace");
+C.Symbol_padding = new H.Symbol0("padding");
+C.Symbol_pause = new H.Symbol0("pause");
+C.Symbol_pauseEvent = new H.Symbol0("pauseEvent");
+C.Symbol_pid = new H.Symbol0("pid");
+C.Symbol_protocol = new H.Symbol0("protocol");
+C.Symbol_reachable = new H.Symbol0("reachable");
+C.Symbol_readClosed = new H.Symbol0("readClosed");
+C.Symbol_refresh = new H.Symbol0("refresh");
+C.Symbol_refreshCoverage = new H.Symbol0("refreshCoverage");
+C.Symbol_refreshGC = new H.Symbol0("refreshGC");
+C.Symbol_registerCallback = new H.Symbol0("registerCallback");
+C.Symbol_relativeLink = new H.Symbol0("relativeLink");
+C.Symbol_remoteAddress = new H.Symbol0("remoteAddress");
+C.Symbol_remotePort = new H.Symbol0("remotePort");
+C.Symbol_resetAccumulator = new H.Symbol0("resetAccumulator");
+C.Symbol_response = new H.Symbol0("response");
+C.Symbol_resume = new H.Symbol0("resume");
+C.Symbol_retainedSize = new H.Symbol0("retainedSize");
+C.Symbol_retainingPath = new H.Symbol0("retainingPath");
+C.Symbol_rootLib = new H.Symbol0("rootLib");
+C.Symbol_row = new H.Symbol0("row");
+C.Symbol_rows = new H.Symbol0("rows");
+C.Symbol_running = new H.Symbol0("running");
+C.Symbol_scripts = new H.Symbol0("scripts");
+C.Symbol_selectExpr = new H.Symbol0("selectExpr");
+C.Symbol_serviceType = new H.Symbol0("serviceType");
+C.Symbol_socketOwner = new H.Symbol0("socketOwner");
+C.Symbol_stacktrace = new H.Symbol0("stacktrace");
+C.Symbol_styleForHits = new H.Symbol0("styleForHits");
+C.Symbol_subClasses = new H.Symbol0("subClasses");
+C.Symbol_subclass = new H.Symbol0("subclass");
+C.Symbol_superClass = new H.Symbol0("superClass");
+C.Symbol_tipExclusive = new H.Symbol0("tipExclusive");
+C.Symbol_tipKind = new H.Symbol0("tipKind");
+C.Symbol_tipParent = new H.Symbol0("tipParent");
+C.Symbol_tipTicks = new H.Symbol0("tipTicks");
+C.Symbol_tipTime = new H.Symbol0("tipTime");
+C.Symbol_toggleExpand = new H.Symbol0("toggleExpand");
+C.Symbol_toggleExpanded = new H.Symbol0("toggleExpanded");
+C.Symbol_tokenPos = new H.Symbol0("tokenPos");
+C.Symbol_topFrame = new H.Symbol0("topFrame");
+C.Symbol_totalCollectionTimeInSeconds = new H.Symbol0("totalCollectionTimeInSeconds");
+C.Symbol_totalSamplesInProfile = new H.Symbol0("totalSamplesInProfile");
+C.Symbol_tree = new H.Symbol0("tree");
+C.Symbol_typeChecksEnabled = new H.Symbol0("typeChecksEnabled");
+C.Symbol_updateLineMode = new H.Symbol0("updateLineMode");
+C.Symbol_uptime = new H.Symbol0("uptime");
+C.Symbol_url = new H.Symbol0("url");
+C.Symbol_used = new H.Symbol0("used");
+C.Symbol_v = new H.Symbol0("v");
+C.Symbol_value = new H.Symbol0("value");
+C.Symbol_variable = new H.Symbol0("variable");
+C.Symbol_variables = new H.Symbol0("variables");
+C.Symbol_version = new H.Symbol0("version");
+C.Symbol_vmName = new H.Symbol0("vmName");
+C.Symbol_writeClosed = new H.Symbol0("writeClosed");
+C.Type_0e9 = H.createRuntimeType('ScriptViewElement');
+C.Type_2jN = H.createRuntimeType('CodeRefElement');
+C.Type_4IJ = H.createRuntimeType('FieldViewElement');
+C.Type_4m4 = H.createRuntimeType('IOSocketListViewElement');
+C.Type_61d = H.createRuntimeType('IOSocketViewElement');
+C.Type_6L0 = H.createRuntimeType('Uint8List');
+C.Type_7g3 = H.createRuntimeType('FlagItemElement');
+C.Type_8Gl = H.createRuntimeType('IsolateSharedSummaryElement');
+C.Type_8KD = H.createRuntimeType('IOProcessListViewElement');
+C.Type_8cK = H.createRuntimeType('IORandomAccessFileViewElement');
+C.Type_8eb = H.createRuntimeType('EvalBoxElement');
+C.Type_9ur = H.createRuntimeType('NavControlElement');
+C.Type_AD4 = H.createRuntimeType('NavMenuItemElement');
+C.Type_AHF = H.createRuntimeType('IOProcessViewElement');
+C.Type_AHF0 = H.createRuntimeType('NativeTypedArray');
+C.Type_Art = H.createRuntimeType('Float32List');
+C.Type_AyI = H.createRuntimeType('IOWebSocketViewElement');
+C.Type_Aym = H.createRuntimeType('CodeViewElement');
+C.Type_B8J = H.createRuntimeType('IOSocketRefElement');
+C.Type_C7R = H.createRuntimeType('TopNavMenuElement');
+C.Type_CAk = H.createRuntimeType('Uint16List');
+C.Type_E0k = H.createRuntimeType('VMViewElement');
+C.Type_ECh = H.createRuntimeType('IsolateLocationElement');
+C.Type_EOZ = H.createRuntimeType('_M1');
+C.Type_EQs = H.createRuntimeType('GlobalEventHandlers');
+C.Type_ES1 = H.createRuntimeType('IsolateRefElement');
+C.Type_EVD = H.createRuntimeType('InstanceRefElement');
+C.Type_Eue = H.createRuntimeType('VMRefElement');
+C.Type_FKd = H.createRuntimeType('ServiceErrorViewElement');
+C.Type_GNh = H.createRuntimeType('_M0');
+C.Type_HqF = H.createRuntimeType('Object');
+C.Type_I2I = H.createRuntimeType('PolymerElement');
+C.Type_IuH = H.createRuntimeType('IORandomAccessFileListViewElement');
+C.Type_JFX = H.createRuntimeType('ClassNavMenuElement');
+C.Type_Jcu = H.createRuntimeType('StackFrameElement');
+C.Type_JmU = H.createRuntimeType('IORefElement');
+C.Type_KMd = H.createRuntimeType('NavMenuElement');
+C.Type_Kyy = H.createRuntimeType('JsonViewElement');
+C.Type_L9j = H.createRuntimeType('IOHttpServerConnectionViewElement');
+C.Type_LV6 = H.createRuntimeType('HeapProfileElement');
+C.Type_M6L = H.createRuntimeType('IOHttpServerViewElement');
+C.Type_MUU = H.createRuntimeType('IOWebSocketRefElement');
+C.Type_Mu6 = H.createRuntimeType('ServiceObjectViewElement');
+C.Type_NlB = H.createRuntimeType('NativeTypedArrayOfDouble');
+C.Type_Npb = H.createRuntimeType('ErrorViewElement');
+C.Type_O5a = H.createRuntimeType('ClassViewElement');
+C.Type_ON8 = H.createRuntimeType('BreakpointListElement');
+C.Type_QuW = H.createRuntimeType('Uint8ClampedList');
+C.Type_QyU = H.createRuntimeType('WindowEventHandlers');
+C.Type_SoB = H.createRuntimeType('HeapMapElement');
+C.Type_Sxn = H.createRuntimeType('NavRefreshElement');
+C.Type_TEn = H.createRuntimeType('IOViewElement');
+C.Type_UJT = H.createRuntimeType('ServiceRefElement');
+C.Type_UoK = H.createRuntimeType('Int16List');
+C.Type_XXD = H.createRuntimeType('JSObject');
+C.Type_YgH = H.createRuntimeType('ObservatoryApplicationElement');
+C.Type_ZKG = H.createRuntimeType('IsolateViewElement');
+C.Type_a1Y = H.createRuntimeType('ScriptInsetElement');
+C.Type_aAD = H.createRuntimeType('IsolateRunStateElement');
+C.Type_bDN = H.createRuntimeType('FunctionViewElement');
+C.Type_cOY = H.createRuntimeType('IsolateProfileElement');
+C.Type_ckn = H.createRuntimeType('Float64List');
+C.Type_cop = H.createRuntimeType('CurlyBlockElement');
+C.Type_dRp = H.createRuntimeType('ClassTreeElement');
+C.Type_dTZ = H.createRuntimeType('Int32List');
+C.Type_dVs = H.createRuntimeType('DateTime');
+C.Type_eZO = H.createRuntimeType('Null');
+C.Type_f1j = H.createRuntimeType('FlagListElement');
+C.Type_gg4 = H.createRuntimeType('IOWebSocketListViewElement');
+C.Type_gqS = H.createRuntimeType('InstanceViewElement');
+C.Type_i7j = H.createRuntimeType('IOHttpServerRefElement');
+C.Type_iL9 = H.createRuntimeType('IsolateSummaryElement');
+C.Type_irB = H.createRuntimeType('Uint32List');
+C.Type_kA7 = H.createRuntimeType('ActionLinkElement');
+C.Type_kuc = H.createRuntimeType('SlidingCheckboxElement');
+C.Type_mWg = H.createRuntimeType('IORandomAccessFileRefElement');
+C.Type_mp3 = H.createRuntimeType('Int8List');
+C.Type_mpV = H.createRuntimeType('LibraryRefElement');
+C.Type_nV5 = H.createRuntimeType('NavBarElement');
+C.Type_nVV = H.createRuntimeType('StackTraceElement');
+C.Type_oGP = H.createRuntimeType('ByteData');
+C.Type_ohY = H.createRuntimeType('FieldRefElement');
+C.Type_oyU = H.createRuntimeType('_M2');
+C.Type_p2P = H.createRuntimeType('EvalLinkElement');
+C.Type_qMZ = H.createRuntimeType('IOProcessRefElement');
+C.Type_ql8 = H.createRuntimeType('ClassRefElement');
+C.Type_qph = H.createRuntimeType('LibraryViewElement');
+C.Type_qq1 = H.createRuntimeType('$double');
+C.Type_s2l = H.createRuntimeType('LibraryNavMenuElement');
+C.Type_s8b = H.createRuntimeType('AutoBindingElement');
+C.Type_sRP = H.createRuntimeType('ObservatoryElement');
+C.Type_uIL = H.createRuntimeType('IOHttpServerConnectionRefElement');
+C.Type_wAg = H.createRuntimeType('ByteBuffer');
+C.Type_wBh = H.createRuntimeType('ScriptRefElement');
+C.Type_wOW = H.createRuntimeType('NativeTypedArrayOfInt');
+C.Type_wT1 = H.createRuntimeType('IsolateCounterChartElement');
+C.Type_wgH = H.createRuntimeType('FunctionRefElement');
+C.Type_wsa = H.createRuntimeType('IsolateNavMenuElement');
+C.Type_xM7 = H.createRuntimeType('num');
+C.Type_y1j = H.createRuntimeType('ServiceExceptionViewElement');
+C.Type_yvP = H.createRuntimeType('IOHttpServerListViewElement');
+C.Utf8Codec_false = new P.Utf8Codec(false);
+$.libraries_to_load = {};
+$.RawReceivePortImpl__nextFreeId = 1;
+$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
+$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
+$.Closure_functionCounter = 0;
+$.BoundClosure_selfFieldNameCache = null;
+$.BoundClosure_receiverFieldNameCache = null;
+$.RuntimeFunctionType_inAssert = false;
+$.getTagFunction = null;
+$.alternateTagFunction = null;
+$.prototypeForTagFunction = null;
+$.dispatchRecordsForInstanceTags = null;
+$.interceptorsForUncacheableTags = null;
+$.initNativeDispatchFlag = null;
+$.location = null;
+$.GoogleChart__api = null;
+$.printToZone = null;
+$._nextCallback = null;
+$._lastCallback = null;
+$.Zone__current = C.C__RootZone;
+$.Expando__keyCount = 0;
+$.Device__isOpera = null;
+$.Device__isWebKit = null;
+$.hierarchicalLoggingEnabled = false;
+$._rootLevel = C.Level_INFO_800;
+$.LogRecord__nextNumber = 0;
+$._allObservablesCount = 0;
+$._allObservables = null;
+$._delivering = false;
+$._Observer__nextBirthId = 0;
+$._ObservedSet__lastSet = null;
+$._deployMode = false;
+$._startPolymerCalled = false;
+$.initializers = null;
+$.deployMode = true;
+$.ServiceMap_objectIdRingPrefix = "objects/";
+$.TemplateBindExtension__initStyles = null;
+$.TemplateBindExtension__initBaseUriWorkaround = null;
+$.enableBindingsReflection = false;
+$.mapTypeToInterceptor = [C.Type_fPs, W.HtmlElement, {}, C.Type_0e9, U.ScriptViewElement, {created: U.ScriptViewElement$created}, C.Type_2jN, O.CodeRefElement, {created: O.CodeRefElement$created}, C.Type_4IJ, A.FieldViewElement, {created: A.FieldViewElement$created}, C.Type_4m4, E.IOSocketListViewElement, {created: E.IOSocketListViewElement$created}, C.Type_61d, E.IOSocketViewElement, {created: E.IOSocketViewElement$created}, C.Type_7g3, X.FlagItemElement, {created: X.FlagItemElement$created}, C.Type_8Gl, D.IsolateSharedSummaryElement, {created: D.IsolateSharedSummaryElement$created}, C.Type_8KD, E.IOProcessListViewElement, {created: E.IOProcessListViewElement$created}, C.Type_8cK, E.IORandomAccessFileViewElement, {created: E.IORandomAccessFileViewElement$created}, C.Type_8eb, L.EvalBoxElement, {created: L.EvalBoxElement$created}, C.Type_9ur, A.NavControlElement, {created: A.NavControlElement$created}, C.Type_AD4, A.NavMenuItemElement, {created: A.NavMenuItemElement$created}, C.Type_AHF, E.IOProcessViewElement, {created: E.IOProcessViewElement$created}, C.Type_AHF0, H.NativeTypedArray, {"": H.NativeTypedArray$}, C.Type_AyI, E.IOWebSocketViewElement, {created: E.IOWebSocketViewElement$created}, C.Type_Aym, F.CodeViewElement, {created: F.CodeViewElement$created}, C.Type_B8J, E.IOSocketRefElement, {created: E.IOSocketRefElement$created}, C.Type_C7R, A.TopNavMenuElement, {created: A.TopNavMenuElement$created}, C.Type_E0k, U.VMViewElement, {created: U.VMViewElement$created}, C.Type_ECh, D.IsolateLocationElement, {created: D.IsolateLocationElement$created}, C.Type_EQs, W.GlobalEventHandlers, {}, C.Type_ES1, N.IsolateRefElement, {created: N.IsolateRefElement$created}, C.Type_EVD, B.InstanceRefElement, {created: B.InstanceRefElement$created}, C.Type_Eue, X.VMRefElement, {created: X.VMRefElement$created}, C.Type_FKd, R.ServiceErrorViewElement, {created: R.ServiceErrorViewElement$created}, C.Type_I2I, A.PolymerElement, {created: A.PolymerElement$created}, C.Type_IuH, E.IORandomAccessFileListViewElement, {created: E.IORandomAccessFileListViewElement$created}, C.Type_JFX, A.ClassNavMenuElement, {created: A.ClassNavMenuElement$created}, C.Type_Jcu, K.StackFrameElement, {created: K.StackFrameElement$created}, C.Type_JmU, E.IORefElement, {created: E.IORefElement$created}, C.Type_KMd, A.NavMenuElement, {created: A.NavMenuElement$created}, C.Type_Kyy, Z.JsonViewElement, {created: Z.JsonViewElement$created}, C.Type_L9j, E.IOHttpServerConnectionViewElement, {created: E.IOHttpServerConnectionViewElement$created}, C.Type_LV6, K.HeapProfileElement, {created: K.HeapProfileElement$created}, C.Type_M6L, E.IOHttpServerViewElement, {created: E.IOHttpServerViewElement$created}, C.Type_MUU, E.IOWebSocketRefElement, {created: E.IOWebSocketRefElement$created}, C.Type_Mu6, U.ServiceObjectViewElement, {created: U.ServiceObjectViewElement$created}, C.Type_NlB, H.NativeTypedArrayOfDouble, {"": H.NativeTypedArrayOfDouble$}, C.Type_Npb, F.ErrorViewElement, {created: F.ErrorViewElement$created}, C.Type_O5a, Z.ClassViewElement, {created: Z.ClassViewElement$created}, C.Type_ON8, B.BreakpointListElement, {created: B.BreakpointListElement$created}, C.Type_QyU, W.WindowEventHandlers, {}, C.Type_SoB, O.HeapMapElement, {created: O.HeapMapElement$created}, C.Type_Sxn, A.NavRefreshElement, {created: A.NavRefreshElement$created}, C.Type_TEn, E.IOViewElement, {created: E.IOViewElement$created}, C.Type_UJT, Q.ServiceRefElement, {created: Q.ServiceRefElement$created}, C.Type_YgH, V.ObservatoryApplicationElement, {created: V.ObservatoryApplicationElement$created}, C.Type_ZKG, L.IsolateViewElement, {created: L.IsolateViewElement$created}, C.Type_a1Y, T.ScriptInsetElement, {created: T.ScriptInsetElement$created}, C.Type_aAD, D.IsolateRunStateElement, {created: D.IsolateRunStateElement$created}, C.Type_bDN, N.FunctionViewElement, {created: N.FunctionViewElement$created}, C.Type_cOY, X.IsolateProfileElement, {created: X.IsolateProfileElement$created}, C.Type_cop, R.CurlyBlockElement, {created: R.CurlyBlockElement$created}, C.Type_dRp, O.ClassTreeElement, {created: O.ClassTreeElement$created}, C.Type_f1j, X.FlagListElement, {created: X.FlagListElement$created}, C.Type_gg4, E.IOWebSocketListViewElement, {created: E.IOWebSocketListViewElement$created}, C.Type_gqS, Z.InstanceViewElement, {created: Z.InstanceViewElement$created}, C.Type_i7j, E.IOHttpServerRefElement, {created: E.IOHttpServerRefElement$created}, C.Type_iL9, D.IsolateSummaryElement, {created: D.IsolateSummaryElement$created}, C.Type_kA7, X.ActionLinkElement, {created: X.ActionLinkElement$created}, C.Type_kuc, Q.SlidingCheckboxElement, {created: Q.SlidingCheckboxElement$created}, C.Type_mWg, E.IORandomAccessFileRefElement, {created: E.IORandomAccessFileRefElement$created}, C.Type_mpV, R.LibraryRefElement, {created: R.LibraryRefElement$created}, C.Type_nV5, A.NavBarElement, {created: A.NavBarElement$created}, C.Type_nVV, X.StackTraceElement, {created: X.StackTraceElement$created}, C.Type_ohY, D.FieldRefElement, {created: D.FieldRefElement$created}, C.Type_p2P, R.EvalLinkElement, {created: R.EvalLinkElement$created}, C.Type_qMZ, E.IOProcessRefElement, {created: E.IOProcessRefElement$created}, C.Type_ql8, Q.ClassRefElement, {created: Q.ClassRefElement$created}, C.Type_qph, M.LibraryViewElement, {created: M.LibraryViewElement$created}, C.Type_s2l, A.LibraryNavMenuElement, {created: A.LibraryNavMenuElement$created}, C.Type_s8b, Y.AutoBindingElement, {created: Y.AutoBindingElement$created}, C.Type_sRP, Z.ObservatoryElement, {created: Z.ObservatoryElement$created}, C.Type_uIL, E.IOHttpServerConnectionRefElement, {created: E.IOHttpServerConnectionRefElement$created}, C.Type_wBh, A.ScriptRefElement, {created: A.ScriptRefElement$created}, C.Type_wOW, H.NativeTypedArrayOfInt, {"": H.NativeTypedArrayOfInt$}, C.Type_wT1, D.IsolateCounterChartElement, {created: D.IsolateCounterChartElement$created}, C.Type_wgH, U.FunctionRefElement, {created: U.FunctionRefElement$created}, C.Type_wsa, A.IsolateNavMenuElement, {created: A.IsolateNavMenuElement$created}, C.Type_y1j, D.ServiceExceptionViewElement, {created: D.ServiceExceptionViewElement$created}, C.Type_yvP, E.IOHttpServerListViewElement, {created: E.IOHttpServerListViewElement$created}];
+Isolate.$lazy($, "globalThis", "globalThis", "get$globalThis", function() {
+  return function() {
+    return this;
+  }();
+});
+Isolate.$lazy($, "globalWindow", "globalWindow", "get$globalWindow", function() {
+  return $.get$globalThis().window;
+});
+Isolate.$lazy($, "globalWorker", "globalWorker", "get$globalWorker", function() {
+  return $.get$globalThis().Worker;
+});
+Isolate.$lazy($, "globalPostMessageDefined", "globalPostMessageDefined", "get$globalPostMessageDefined", function() {
+  return $.get$globalThis().postMessage !== void 0;
+});
+Isolate.$lazy($, "thisScript", "IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
+  return H.IsolateNatives_computeThisScript();
+});
+Isolate.$lazy($, "workerIds", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [P.$int]);
+});
+Isolate.$lazy($, "noSuchMethodPattern", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "notClosurePattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "nullCallPattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      null.$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
 
-init.functionAliases={Sa:209}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"v7",ret:{func:"aB",args:[null]},args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.AN,P.dl,P.Ob,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.f5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Df",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:"aK",ret:[P.b8,D.af],args:[null]},"dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each","k",{func:"lv",args:[P.GD,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"MG",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Ap]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"MJ",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},"hits","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},"coverage",{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","scriptCoverage","timer",{func:"I6a",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","request",{func:"c3A",args:[W.fJ]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"nl",void:true,args:[W.Aj]},{func:"en",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"VT",ret:P.b8,args:[P.qU]},];$=null
-I = I.$finishIsolateConstructor(I)
-$=new I()
-function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
-new MyClass()
-return a}
-A = convertToFastObject(A)
-B = convertToFastObject(B)
-C = convertToFastObject(C)
-D = convertToFastObject(D)
-E = convertToFastObject(E)
-F = convertToFastObject(F)
-G = convertToFastObject(G)
-H = convertToFastObject(H)
-J = convertToFastObject(J)
-K = convertToFastObject(K)
-L = convertToFastObject(L)
-M = convertToFastObject(M)
-N = convertToFastObject(N)
-O = convertToFastObject(O)
-P = convertToFastObject(P)
-Q = convertToFastObject(Q)
-R = convertToFastObject(R)
-S = convertToFastObject(S)
-T = convertToFastObject(T)
-U = convertToFastObject(U)
-V = convertToFastObject(V)
-W = convertToFastObject(W)
-X = convertToFastObject(X)
-Y = convertToFastObject(Y)
-Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-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.V7(),b)},[])}else{(function(b){H.wW(E.V7(),b)})([])}})
-function init(){I.p={}
-function generateAccessor(a,b,c){var y=a.split("-")
-var x=y[0]
-var w=x.length
-var v=x.charCodeAt(w-1)
-var u
-if(y.length>1)u=true
-else u=false
-v=v>=60&&v<=64?v-59:v>=123&&v<=126?v-117:v>=37&&v<=43?v-27:0
-if(v){var t=v&3
-var s=v>>2
-var r=x=x.substring(0,w-1)
-var q=x.indexOf(":")
-if(q>0){r=x.substring(0,q)
-x=x.substring(q+1)}if(t){var p=t&2?"r":""
-var o=t&1?"this":"r"
-var n="return "+o+"."+x
-var m=c+".prototype.g"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}if(s){var p=s&2?"r,v":"v"
-var o=s&1?"this":"r"
-var n=o+"."+x+"=v"
-var m=c+".prototype.s"+r+"="
-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+"("
-var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
-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+="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("")
-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
-a.prototype=x
-return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
-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]
-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 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={}
-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={}
-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.ag(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
-Isolate.prototype.constructor=Isolate
-Isolate.p=y
-Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
-return Isolate}}
+  }());
+});
+Isolate.$lazy($, "undefinedCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      (void 0).$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "nullPropertyPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      null.$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      (void 0).$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "_completer", "GoogleChart__completer", "get$GoogleChart__completer", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "scheduleImmediateClosure", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
+  return P._AsyncRun__initializeScheduleImmediate();
+});
+Isolate.$lazy($, "_nullFuture", "Future__nullFuture", "get$Future__nullFuture", function() {
+  return P._Future$immediate(null, null);
+});
+Isolate.$lazy($, "_toStringVisiting", "IterableBase__toStringVisiting", "get$IterableBase__toStringVisiting", function() {
+  return [];
+});
+Isolate.$lazy($, "webkitEvents", "ElementEvents_webkitEvents", "get$ElementEvents_webkitEvents", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["animationend", "webkitAnimationEnd", "animationiteration", "webkitAnimationIteration", "animationstart", "webkitAnimationStart", "fullscreenchange", "webkitfullscreenchange", "fullscreenerror", "webkitfullscreenerror", "keyadded", "webkitkeyadded", "keyerror", "webkitkeyerror", "keymessage", "webkitkeymessage", "needkey", "webkitneedkey", "pointerlockchange", "webkitpointerlockchange", "pointerlockerror", "webkitpointerlockerror", "resourcetimingbufferfull", "webkitresourcetimingbufferfull", "transitionend", "webkitTransitionEnd", "speechchange", "webkitSpeechChange"], null, null);
+});
+Isolate.$lazy($, "context", "context", "get$context", function() {
+  return P._wrapToDart(function() {
+    return this;
+  }());
+});
+Isolate.$lazy($, "_DART_OBJECT_PROPERTY_NAME", "_DART_OBJECT_PROPERTY_NAME", "get$_DART_OBJECT_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartObject");
+});
+Isolate.$lazy($, "_DART_CLOSURE_PROPERTY_NAME", "_DART_CLOSURE_PROPERTY_NAME", "get$_DART_CLOSURE_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartClosure");
+});
+Isolate.$lazy($, "_dartProxyCtor", "_dartProxyCtor", "get$_dartProxyCtor", function() {
+  return function DartObject(o) {
+    this.o = o;
+  };
+});
+Isolate.$lazy($, "_freeColor", "HeapMapElement__freeColor", "get$HeapMapElement__freeColor", function() {
+  return [255, 255, 255, 255];
+});
+Isolate.$lazy($, "_pageSeparationColor", "HeapMapElement__pageSeparationColor", "get$HeapMapElement__pageSeparationColor", function() {
+  return [0, 0, 0, 255];
+});
+Isolate.$lazy($, "_loggers", "Logger__loggers", "get$Logger__loggers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_empty(P.String, N.Logger);
+});
+Isolate.$lazy($, "_logger", "_logger", "get$_logger", function() {
+  return N.Logger_Logger("Observable.dirtyCheck");
+});
+Isolate.$lazy($, "_instance", "_InvalidPropertyPath__instance", "get$_InvalidPropertyPath__instance", function() {
+  return new L._InvalidPropertyPath([]);
+});
+Isolate.$lazy($, "_pathRegExp", "_pathRegExp", "get$_pathRegExp", function() {
+  return new L.closure7().call$0();
+});
+Isolate.$lazy($, "_logger", "_logger0", "get$_logger0", function() {
+  return N.Logger_Logger("observe.PathObserver");
+});
+Isolate.$lazy($, "_pathCache", "_pathCache", "get$_pathCache", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, L.PropertyPath);
+});
+Isolate.$lazy($, "_polymerSyntax", "PolymerDeclaration__polymerSyntax", "get$PolymerDeclaration__polymerSyntax", function() {
+  return new A.PolymerExpressions(T.PolymerExpressions$(null, C.C_ScopeFactory), null);
+});
+Isolate.$lazy($, "_typesByName", "_typesByName", "get$_typesByName", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Type);
+});
+Isolate.$lazy($, "_declarations", "_declarations", "get$_declarations", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, A.PolymerDeclaration);
+});
+Isolate.$lazy($, "_hasShadowDomPolyfill", "_hasShadowDomPolyfill", "get$_hasShadowDomPolyfill", function() {
+  return $.get$context().hasProperty$1("ShadowDOMPolyfill");
+});
+Isolate.$lazy($, "_ShadowCss", "_ShadowCss", "get$_ShadowCss", function() {
+  var t1 = $.get$_Platform();
+  return t1 != null ? J.$index$asx(t1, "ShadowCSS") : null;
+});
+Isolate.$lazy($, "_sheetLog", "_sheetLog", "get$_sheetLog", function() {
+  return N.Logger_Logger("polymer.stylesheet");
+});
+Isolate.$lazy($, "_changedMethodQueryOptions", "_changedMethodQueryOptions", "get$_changedMethodQueryOptions", function() {
+  return new A.QueryOptions(false, false, true, C.Type_fPs, false, true, null, A._isObserverMethod$closure());
+});
+Isolate.$lazy($, "_ATTRIBUTES_REGEX", "_ATTRIBUTES_REGEX", "get$_ATTRIBUTES_REGEX", function() {
+  return new H.JSSyntaxRegExp("\\s|,", H.JSSyntaxRegExp_makeNative("\\s|,", false, true, false), null, null);
+});
+Isolate.$lazy($, "_Platform", "_Platform", "get$_Platform", function() {
+  return J.$index$asx($.get$context(), "Platform");
+});
+Isolate.$lazy($, "bindPattern", "Polymer_bindPattern", "get$Polymer_bindPattern", function() {
+  return new H.JSSyntaxRegExp("\\{\\{([^{}]*)}}", H.JSSyntaxRegExp_makeNative("\\{\\{([^{}]*)}}", false, true, false), null, null);
+});
+Isolate.$lazy($, "_onReady", "Polymer__onReady", "get$Polymer__onReady", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "_observeLog", "_observeLog", "get$_observeLog", function() {
+  return N.Logger_Logger("polymer.observe");
+});
+Isolate.$lazy($, "_eventsLog", "_eventsLog", "get$_eventsLog", function() {
+  return N.Logger_Logger("polymer.events");
+});
+Isolate.$lazy($, "_unbindLog", "_unbindLog", "get$_unbindLog", function() {
+  return N.Logger_Logger("polymer.unbind");
+});
+Isolate.$lazy($, "_bindLog", "_bindLog", "get$_bindLog", function() {
+  return N.Logger_Logger("polymer.bind");
+});
+Isolate.$lazy($, "_PolymerGestures", "_PolymerGestures", "get$_PolymerGestures", function() {
+  return J.$index$asx($.get$context(), "PolymerGestures");
+});
+Isolate.$lazy($, "_polymerElementProto", "_polymerElementProto", "get$_polymerElementProto", function() {
+  return new A.closure().call$0();
+});
+Isolate.$lazy($, "_typeHandlers", "_typeHandlers", "get$_typeHandlers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal([C.Type_Ejg, new Z.closure0(), C.Type_eZO, new Z.closure1(), C.Type_dVs, new Z.closure2(), C.Type_EsU, new Z.closure3(), C.Type_SnA, new Z.closure4(), C.Type_qq1, new Z.closure5()], null, null);
+});
+Isolate.$lazy($, "_BINARY_OPERATORS", "_BINARY_OPERATORS", "get$_BINARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure14(), "-", new K.closure15(), "*", new K.closure16(), "/", new K.closure17(), "%", new K.closure18(), "==", new K.closure19(), "!=", new K.closure20(), "===", new K.closure21(), "!==", new K.closure22(), ">", new K.closure23(), ">=", new K.closure24(), "<", new K.closure25(), "<=", new K.closure26(), "||", new K.closure27(), "&&", new K.closure28(), "|", new K.closure29()], null, null);
+});
+Isolate.$lazy($, "_UNARY_OPERATORS", "_UNARY_OPERATORS", "get$_UNARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure11(), "-", new K.closure12(), "!", new K.closure13()], null, null);
+});
+Isolate.$lazy($, "_instance", "Closer__instance", "get$Closer__instance", function() {
+  return new K.Closer();
+});
+Isolate.$lazy($, "_currentIsolateMatcher", "VM__currentIsolateMatcher", "get$VM__currentIsolateMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+", H.JSSyntaxRegExp_makeNative("isolates/\\d+", false, true, false), null, null);
+});
+Isolate.$lazy($, "_currentObjectMatcher", "VM__currentObjectMatcher", "get$VM__currentObjectMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+/", H.JSSyntaxRegExp_makeNative("isolates/\\d+/", false, true, false), null, null);
+});
+Isolate.$lazy($, "objectAccessor", "objectAccessor", "get$objectAccessor", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "typeInspector", "typeInspector", "get$typeInspector", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "symbolConverter", "symbolConverter", "get$symbolConverter", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "_DEFAULT", "BindingDelegate__DEFAULT", "get$BindingDelegate__DEFAULT", function() {
+  return new M.BindingDelegate(null);
+});
+Isolate.$lazy($, "_checkboxEventType", "_InputBinding__checkboxEventType", "get$_InputBinding__checkboxEventType", function() {
+  return new M.closure10().call$0();
+});
+Isolate.$lazy($, "_contentsOwner", "TemplateBindExtension__contentsOwner", "get$TemplateBindExtension__contentsOwner", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_ownerStagingDocument", "TemplateBindExtension__ownerStagingDocument", "get$TemplateBindExtension__ownerStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_allTemplatesSelectors", "TemplateBindExtension__allTemplatesSelectors", "get$TemplateBindExtension__allTemplatesSelectors", function() {
+  return "template, " + J.map$1$ax(C.Map_05eTF.get$keys(), new M.closure6()).join$1(0, ", ");
+});
+Isolate.$lazy($, "_templateObserver", "TemplateBindExtension__templateObserver", "get$TemplateBindExtension__templateObserver", function() {
+  return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(H.convertDartClosureToJS(W._wrapBinaryZone(new M.closure8()), 2));
+});
+Isolate.$lazy($, "_emptyInstance", "_emptyInstance", "get$_emptyInstance", function() {
+  return new M.closure9().call$0();
+});
+Isolate.$lazy($, "_instanceExtension", "_instanceExtension", "get$_instanceExtension", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_isStagingDocument", "_isStagingDocument", "get$_isStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_expando", "_expando", "get$_expando", function() {
+  return H.setRuntimeTypeInfo(new P.Expando("template_binding"), [null]);
+});
+// Native classes
+
+init.functionAliases = {evalType: 209};
+;
+init.metadata = ["sender",
+"e",
+"event",
+"uri",
+"onError",
+{func: "dynamic__String", args: [P.String]},
+"closure",
+"isolate",
+"numberOfArguments",
+"arg1",
+"arg2",
+"arg3",
+"arg4",
+{func: "args1", args: [null]},
+"_",
+{func: "String__int", ret: P.String, args: [P.$int]},
+"bytes",
+{func: "String__dynamic", ret: P.String, args: [null]},
+{func: "void_", void: true},
+{func: "void__void_", void: true, args: [{func: "void_", void: true}]},
+{func: "void__dynamic", void: true, args: [null]},
+"value",
+{func: "void__dynamic__StackTrace", void: true, args: [null], opt: [P.StackTrace]},
+,
+"error",
+"stackTrace",
+{func: "void__Zone_ZoneDelegate_Zone_dynamic_StackTrace", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, null, P.StackTrace]},
+"self",
+"parent",
+"zone",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args0", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+"f",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}, null]},
+"arg",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args2_dynamic_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}, null, null]},
+{func: "ZoneCallback__Zone_ZoneDelegate_Zone_args0", ret: {func: "args0"}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "ZoneUnaryCallback__Zone_ZoneDelegate_Zone_args1", ret: {func: "args1", args: [null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "ZoneBinaryCallback__Zone_ZoneDelegate_Zone_args2", ret: {func: "args2", args: [null, null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}]},
+{func: "void__Zone_ZoneDelegate_Zone_args0", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "Timer__Zone_ZoneDelegate_Zone_Duration_void_", ret: P.Timer, args: [P.Zone, P.ZoneDelegate, P.Zone, P.Duration, {func: "void_", void: true}]},
+"duration",
+"callback",
+{func: "void__Zone_ZoneDelegate_Zone_String", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, P.String]},
+{func: "void__String", void: true, args: [P.String]},
+{func: "Zone__Zone_ZoneDelegate_Zone_ZoneSpecification_Map", ret: P.Zone, args: [P.Zone, P.ZoneDelegate, P.Zone, P.ZoneSpecification, P.Map]},
+{func: "bool__dynamic_dynamic", ret: P.bool, args: [null, null]},
+"a",
+"b",
+{func: "int__dynamic", ret: P.$int, args: [null]},
+{func: "Object__dynamic", ret: P.Object, args: [null]},
+"object",
+{func: "int__Comparable_Comparable", ret: P.$int, args: [P.Comparable, P.Comparable]},
+{func: "bool__Object_Object", ret: P.bool, args: [P.Object, P.Object]},
+{func: "int__Object", ret: P.$int, args: [P.Object]},
+"receiver",
+{func: "args4", args: [null, null, null, null]},
+"name",
+"oldValue",
+"newValue",
+"captureThis",
+"arguments",
+"o",
+{func: "bool__Symbol", ret: P.bool, args: [P.Symbol]},
+"symbol",
+"v",
+"x",
+{func: "Iterable__Iterable", ret: [P.Iterable, K.IndexedValue], args: [P.Iterable]},
+"iterable",
+"invocation",
+{func: "args0"},
+{func: "dynamic__Function", args: [P.Function]},
+"code",
+"msg",
+"errorMessage",
+"message",
+{func: "args2", args: [null, null]},
+"key",
+{func: "dynamic__String_dynamic", args: [P.String, null]},
+{func: "dynamic__dynamic_String", args: [null, P.String]},
+{func: "void__dynamic_dynamic_dynamic", void: true, args: [null, null, null]},
+"c",
+"obj",
+"i",
+{func: "void__ServiceError", void: true, args: [D.ServiceError]},
+{func: "void__ServiceException", void: true, args: [D.ServiceException]},
+"exception",
+{func: "void__PopStateEvent", void: true, args: [W.PopStateEvent]},
+{func: "int__int_int", ret: P.$int, args: [P.$int, P.$int]},
+"column",
+"done",
+{func: "String__TableTreeRow", ret: P.String, args: [G.TableTreeRow]},
+"row",
+{func: "void__Event_dynamic_Element", void: true, args: [W.Event, null, W.Element]},
+"detail",
+"target",
+"objectClass",
+{func: "Future__String", ret: [P.Future, D.ServiceObject], args: [P.String]},
+"text",
+{func: "Future__dynamic", ret: [P.Future, D.ServiceObject], args: [null]},
+"limit",
+"dummy",
+{func: "dynamic__ServiceMap", args: [D.ServiceMap]},
+{func: "void__Event_dynamic_Node", void: true, args: [W.Event, null, W.Node]},
+{func: "dynamic__Code", args: [D.Code]},
+"data",
+{func: "void__Object__StackTrace", void: true, args: [P.Object], opt: [P.StackTrace]},
+"theError",
+"theStackTrace",
+{func: "dynamic__Object", args: [P.Object]},
+{func: "void___dynamic", void: true, opt: [null]},
+{func: "dynamic__dynamic__dynamic", args: [null], opt: [null]},
+{func: "bool_", ret: P.bool},
+"ignored",
+"convert",
+"element",
+{func: "dynamic__bool", args: [P.bool]},
+{func: "void___Future", void: true, opt: [P.Future]},
+"resumeSignal",
+{func: "dynamic__dynamic_StackTrace", args: [null, P.StackTrace]},
+{func: "void__dynamic_StackTrace", void: true, args: [null, P.StackTrace]},
+"each",
+{func: "dynamic__Symbol_dynamic", args: [P.Symbol, null]},
+{func: "int__String", ret: P.$int, args: [P.String]},
+{func: "double__String", ret: P.$double, args: [P.String]},
+{func: "bool__int", ret: P.bool, args: [P.$int]},
+{func: "int__int", ret: P.$int, args: [P.$int]},
+{func: "int__dynamic_dynamic", ret: P.$int, args: [null, null]},
+"byteString",
+{func: "void__MouseEvent", void: true, args: [W.MouseEvent]},
+"result",
+{func: "dynamic__ServiceObject", args: [D.ServiceObject]},
+{func: "PixelReference_", ret: O.PixelReference},
+"response",
+"st",
+{func: "void__ServiceMap", void: true, args: [D.ServiceMap]},
+"newProfile",
+{func: "String__bool", ret: P.String, args: [P.bool]},
+"newSpace",
+{func: "dynamic__int", args: [P.$int]},
+{func: "dynamic__int_dynamic", args: [P.$int, null]},
+{func: "Iterable__dynamic__String", ret: P.Iterable, args: [{func: "dynamic__String", args: [P.String]}]},
+{func: "Iterable__Iterable__String", ret: P.Iterable, args: [{func: "Iterable__String", ret: P.Iterable, args: [P.String]}]},
+"s",
+{func: "void__bool_dynamic", void: true, args: [P.bool, null]},
+"expand",
+"m",
+{func: "Future__dynamic0", ret: P.Future, args: [null]},
+"tagProfile",
+"rec",
+{func: "dynamic__LogRecord", args: [N.LogRecord]},
+{func: "void__MouseEvent_dynamic_Element", void: true, args: [W.MouseEvent, null, W.Element]},
+{func: "String__String", ret: P.String, args: [P.String]},
+"url",
+{func: "String__double", ret: P.String, args: [P.$double]},
+"time",
+{func: "bool__String", ret: P.bool, args: [P.String]},
+"type",
+{func: "dynamic__ZoneDelegate_Zone", args: [P.ZoneDelegate, P.Zone]},
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "void__Object", void: true, args: [P.Object]},
+"records",
+{func: "dynamic__PropertyPath_dynamic", args: [L.PropertyPath, null]},
+"model",
+"node",
+"oneTime",
+{func: "args3", args: [null, null, null]},
+{func: "void__String_String", void: true, args: [P.String, P.String]},
+{func: "void__List_Map_List", void: true, args: [P.List, P.Map, P.List]},
+{func: "void__List", void: true, args: [[P.List, T.ChangeRecord]]},
+{func: "void__Iterable", void: true, args: [[P.Iterable, A.Bindable]]},
+"changes",
+"jsElem",
+"extendee",
+{func: "dynamic__dynamic_String_String", args: [null, P.String, P.String]},
+"k",
+{func: "dynamic__dynamic_Node_bool", args: [null, W.Node, P.bool]},
+{func: "dynamic__dynamic__bool", args: [null], named: {skipChanges: P.bool}},
+false,
+"skipChanges",
+{func: "dynamic__List", args: [[P.List, T.ChangeRecord]]},
+{func: "Index__Expression_Expression", ret: U.Index, args: [U.Expression, U.Expression]},
+{func: "dynamic__Expression", args: [U.Expression]},
+"hits",
+"map",
+{func: "dynamic__ObservableMap", args: [V.ObservableMap]},
+"id",
+{func: "Future_", ret: P.Future},
+"coverage",
+{func: "Future__ServiceMap", ret: [P.Future, [P.List, D.Class]], args: [D.ServiceMap]},
+"classList",
+{func: "Future__List", ret: [P.Future, D.Class], args: [[P.List, D.Class]]},
+"classes",
+"scriptCoverage",
+"timer",
+{func: "String_", ret: P.String},
+{func: "String__Code", ret: P.String, args: [D.Code]},
+{func: "void__Script", void: true, args: [D.Script]},
+"script",
+"func",
+"request",
+{func: "dynamic__HttpRequest", args: [W.HttpRequest]},
+"details",
+"ref",
+{func: "void__List0", void: true, args: [[P.List, G.ListChangeRecord]]},
+"splices",
+{func: "void__DocumentFragment", void: true, args: [W.DocumentFragment]},
+{func: "String__Object", ret: P.String, args: [P.Object]},
+{func: "String__List", ret: P.String, args: [[P.List, P.Object]]},
+"values",
+{func: "Future__String0", ret: P.Future, args: [P.String]},
+];
+$ = null;
+Isolate = Isolate.$finishIsolateConstructor(Isolate);
+$ = new Isolate();
+function convertToFastObject(properties) {
+  function MyClass() {
+  }
+  MyClass.prototype = properties;
+  new MyClass();
+  return properties;
+}
+;
+A = convertToFastObject(A);
+B = convertToFastObject(B);
+C = convertToFastObject(C);
+D = convertToFastObject(D);
+E = convertToFastObject(E);
+F = convertToFastObject(F);
+G = convertToFastObject(G);
+H = convertToFastObject(H);
+J = convertToFastObject(J);
+K = convertToFastObject(K);
+L = convertToFastObject(L);
+M = convertToFastObject(M);
+N = convertToFastObject(N);
+O = convertToFastObject(O);
+P = convertToFastObject(P);
+Q = convertToFastObject(Q);
+R = convertToFastObject(R);
+S = convertToFastObject(S);
+T = convertToFastObject(T);
+U = convertToFastObject(U);
+V = convertToFastObject(V);
+W = convertToFastObject(W);
+X = convertToFastObject(X);
+Y = convertToFastObject(Y);
+Z = convertToFastObject(Z);
+!function() {
+  function intern(s) {
+    var o = {};
+    o[s] = 1;
+    return Object.keys(convertToFastObject(o))[0];
+  }
+  init.getIsolateTag = function(name) {
+    return intern("___dart_" + name + init.isolateTag);
+  };
+  var tableProperty = "___dart_isolate_tags_";
+  var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
+  var rootProperty = "_ZxYxX";
+  for (var i = 0;; i++) {
+    var property = intern(rootProperty + "_" + i + "_");
+    if (!(property in usedProperties)) {
+      usedProperties[property] = 1;
+      init.isolateTag = property;
+      break;
+    }
+  }
+}();
+init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
+// BEGIN invoke [main].
+;(function(callback) {
+  if (typeof document === "undefined") {
+    callback(null);
+    return;
+  }
+  if (document.currentScript) {
+    callback(document.currentScript);
+    return;
+  }
+  var scripts = document.scripts;
+  function onLoad(event) {
+    for (var i = 0; i < scripts.length; ++i) {
+      scripts[i].removeEventListener("load", onLoad, false);
+    }
+    callback(event.target);
+  }
+  for (var i = 0; i < scripts.length; ++i) {
+    scripts[i].addEventListener("load", onLoad, false);
+  }
+})(function(currentScript) {
+  init.currentScript = currentScript;
+  if (typeof dartMainRunner === "function") {
+    dartMainRunner(function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    }, []);
+  } else {
+    (function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    })([]);
+  }
+});
+;
+// END invoke [main].
+function init() {
+  Isolate.$isolateProperties = {};
+  function generateAccessor(fieldDescriptor, accessors, cls) {
+    var fieldInformation = fieldDescriptor.split("-");
+    var field = fieldInformation[0];
+    var len = field.length;
+    var code = field.charCodeAt(len - 1);
+    var reflectable;
+    if (fieldInformation.length > 1)
+      reflectable = true;
+    else
+      reflectable = false;
+    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
+    if (code) {
+      var getterCode = code & 3;
+      var setterCode = code >> 2;
+      var accessorName = field = field.substring(0, len - 1);
+      var divider = field.indexOf(":");
+      if (divider > 0) {
+        accessorName = field.substring(0, divider);
+        field = field.substring(divider + 1);
+      }
+      if (getterCode) {
+        var args = getterCode & 2 ? "receiver" : "";
+        var receiver = getterCode & 1 ? "this" : "receiver";
+        var body = "return " + receiver + "." + field;
+        var property = cls + ".prototype.get$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+      if (setterCode) {
+        var args = setterCode & 2 ? "receiver, value" : "value";
+        var receiver = setterCode & 1 ? "this" : "receiver";
+        var body = receiver + "." + field + " = value";
+        var property = cls + ".prototype.set$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+    }
+    return field;
+  }
+  Isolate.$isolateProperties.$generateAccessor = generateAccessor;
+  function defineClass(name, cls, fields) {
+    var accessors = [];
+    var str = "function " + cls + "(";
+    var body = "";
+    for (var i = 0; i < fields.length; i++) {
+      if (i != 0)
+        str += ", ";
+      var field = generateAccessor(fields[i], accessors, cls);
+      var parameter = "parameter_" + field;
+      str += parameter;
+      body += "this." + field + " = " + parameter + ";\n";
+    }
+    str += ") {\n" + body + "}\n";
+    str += cls + ".builtin$cls=\"" + name + "\";\n";
+    str += "$desc=$collectedClasses." + cls + ";\n";
+    str += "if($desc instanceof Array) $desc = $desc[1];\n";
+    str += cls + ".prototype = $desc;\n";
+    if (typeof defineClass.name != "string") {
+      str += cls + ".name=\"" + cls + "\";\n";
+    }
+    str += accessors.join("");
+    return str;
+  }
+  var inheritFrom = function() {
+    function tmp() {
+    }
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    return function(constructor, superConstructor) {
+      tmp.prototype = superConstructor.prototype;
+      var object = new tmp();
+      var properties = constructor.prototype;
+      for (var member in properties)
+        if (hasOwnProperty.call(properties, member))
+          object[member] = properties[member];
+      object.constructor = constructor;
+      constructor.prototype = object;
+      return object;
+    };
+  }();
+  Isolate.$finishClasses = function(collectedClasses, isolateProperties, existingIsolateProperties) {
+    var pendingClasses = {};
+    if (!init.allClasses)
+      init.allClasses = {};
+    var allClasses = init.allClasses;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    if (typeof dart_precompiled == "function") {
+      var constructors = dart_precompiled(collectedClasses);
+    } else {
+      var combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
+      var constructorsList = [];
+    }
+    for (var cls in collectedClasses) {
+      if (hasOwnProperty.call(collectedClasses, cls)) {
+        var desc = collectedClasses[cls];
+        if (desc instanceof Array)
+          desc = desc[1];
+        var classData = desc["^"], supr, name = cls, fields = classData;
+        if (typeof classData == "string") {
+          var split = classData.split("/");
+          if (split.length == 2) {
+            name = split[0];
+            fields = split[1];
+          }
+        }
+        var s = fields.split(";");
+        fields = s[1] == "" ? [] : s[1].split(",");
+        supr = s[0];
+        split = supr.split(":");
+        if (split.length == 2) {
+          supr = split[0];
+          var functionSignature = split[1];
+          if (functionSignature)
+            desc.$signature = function(s) {
+              return function() {
+                return init.metadata[s];
+              };
+            }(functionSignature);
+        }
+        if (supr && supr.indexOf("+") > 0) {
+          s = supr.split("+");
+          supr = s[0];
+          var mixin = collectedClasses[s[1]];
+          if (mixin instanceof Array)
+            mixin = mixin[1];
+          for (var d in mixin) {
+            if (hasOwnProperty.call(mixin, d) && !hasOwnProperty.call(desc, d))
+              desc[d] = mixin[d];
+          }
+        }
+        if (typeof dart_precompiled != "function") {
+          combinedConstructorFunction += defineClass(name, cls, fields);
+          constructorsList.push(cls);
+        }
+        if (supr)
+          pendingClasses[cls] = supr;
+      }
+    }
+    if (typeof dart_precompiled != "function") {
+      combinedConstructorFunction += "return [\n  " + constructorsList.join(",\n  ") + "\n]";
+      var constructors = new Function("$collectedClasses", combinedConstructorFunction)(collectedClasses);
+      combinedConstructorFunction = null;
+    }
+    for (var i = 0; i < constructors.length; i++) {
+      var constructor = constructors[i];
+      var cls = constructor.name;
+      var desc = collectedClasses[cls];
+      var globalObject = isolateProperties;
+      if (desc instanceof Array) {
+        globalObject = desc[0] || isolateProperties;
+        desc = desc[1];
+      }
+      allClasses[cls] = constructor;
+      globalObject[cls] = constructor;
+    }
+    constructors = null;
+    var finishedClasses = {};
+    init.interceptorsByTag = Object.create(null);
+    init.leafTags = {};
+    function finishClass(cls) {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      if (hasOwnProperty.call(finishedClasses, cls))
+        return;
+      finishedClasses[cls] = true;
+      var superclass = pendingClasses[cls];
+      if (!superclass || typeof superclass != "string")
+        return;
+      finishClass(superclass);
+      var constructor = allClasses[cls];
+      var superConstructor = allClasses[superclass];
+      if (!superConstructor)
+        superConstructor = existingIsolateProperties[superclass];
+      var prototype = inheritFrom(constructor, superConstructor);
+      if (hasOwnProperty.call(prototype, "%")) {
+        var nativeSpec = prototype["%"].split(";");
+        if (nativeSpec[0]) {
+          var tags = nativeSpec[0].split("|");
+          for (var i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = true;
+          }
+        }
+        if (nativeSpec[1]) {
+          tags = nativeSpec[1].split("|");
+          if (nativeSpec[2]) {
+            var subclasses = nativeSpec[2].split("|");
+            for (var i = 0; i < subclasses.length; i++) {
+              var subclass = allClasses[subclasses[i]];
+              subclass.$nativeSuperclassTag = tags[0];
+            }
+          }
+          for (i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = false;
+          }
+        }
+      }
+    }
+    for (var cls in pendingClasses)
+      finishClass(cls);
+  };
+  Isolate.$lazy = function(prototype, staticName, fieldName, getterName, lazyValue) {
+    var sentinelUndefined = {};
+    var sentinelInProgress = {};
+    prototype[fieldName] = sentinelUndefined;
+    prototype[getterName] = function() {
+      var result = $[fieldName];
+      try {
+        if (result === sentinelUndefined) {
+          $[fieldName] = sentinelInProgress;
+          try {
+            result = $[fieldName] = lazyValue();
+          } finally {
+            if (result === sentinelUndefined)
+              if ($[fieldName] === sentinelInProgress)
+                $[fieldName] = null;
+          }
+        } else {
+          if (result === sentinelInProgress)
+            H.throwCyclicInit(staticName);
+        }
+        return result;
+      } finally {
+        $[getterName] = function() {
+          return this[fieldName];
+        };
+      }
+    };
+  };
+  Isolate.$finishIsolateConstructor = function(oldIsolate) {
+    var isolateProperties = oldIsolate.$isolateProperties;
+    function Isolate() {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      for (var staticName in isolateProperties)
+        if (hasOwnProperty.call(isolateProperties, staticName))
+          this[staticName] = isolateProperties[staticName];
+      function ForceEfficientMap() {
+      }
+      ForceEfficientMap.prototype = this;
+      new ForceEfficientMap();
+    }
+    Isolate.prototype = oldIsolate.prototype;
+    Isolate.prototype.constructor = Isolate;
+    Isolate.$isolateProperties = isolateProperties;
+    Isolate.$finishClasses = oldIsolate.$finishClasses;
+    Isolate.makeConstantList = oldIsolate.makeConstantList;
+    return Isolate;
+  };
+}
 })()
+
+//# sourceMappingURL=index.html_bootstrap.dart.js.map
+//@ sourceMappingURL=index.html_bootstrap.dart.js.map
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
index d7d3526..48f835d 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html
@@ -3850,11 +3850,30 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}" label="[find]" expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}" label="[more]" expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -16525,4 +16544,4 @@
 
   <observatory-application devtools="true"></observatory-application>
 
-<script src="index_devtools.html_bootstrap.dart.js"></script></body></html>
\ No newline at end of file
+<script type="application/dart" src="index_devtools.html_bootstrap.dart"></script><script src="packages/browser/dart.js"></script></body></html>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
index aabccc5..f80ce15 100644
--- a/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
+++ b/runtime/bin/vmservice/client/deployed/web/index_devtools.html_bootstrap.dart.js
@@ -1,19320 +1,35820 @@
 // Generated by dart2js, the Dart to JavaScript compiler.
-(function($){function dart(){this.x=0}var A=new dart
-delete A.x
-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 $$={}
-;(function(a){"use strict"
-function map(b){b={x:b}
-delete b.x
-return b}function processStatics(a3){for(var h in a3){if(!u.call(a3,h))continue
-if(h==="^")continue
-var g=a3[h]
-var f=h.substring(0,1)
-var e
-if(f==="+"){v[e]=h.substring(1)
-var d=a3[h]
-if(d>0)a3[e].$reflectable=d
-if(g&&g.length)init.typeInformation[e]=g}else if(f==="@"){h=h.substring(1)
-$[h]["@"]=g}else if(f==="*"){n[e].$defaultValues=g
-var c=a3.$methodsWithOptionalArguments
-if(!c){a3.$methodsWithOptionalArguments=c={}}c[h]=e}else if(typeof g==="function"){n[e=h]=g
-i.push(h)
-init.globalFunctions[h]=g}else if(g.constructor===Array){addStubs(n,g,h,true,a3,i)}else{e=h
-var b={}
-var a0
-for(var a1 in g){if(!u.call(g,a1))continue
-f=a1.substring(0,1)
-if(a1==="static"){processStatics(init.statics[h]=g[a1])}else if(f==="+"){w[a0]=a1.substring(1)
-var d=g[a1]
-if(d>0)g[a0].$reflectable=d}else if(f==="@"&&a1!=="@"){b[a1.substring(1)]["@"]=g[a1]}else if(f==="*"){b[a0].$defaultValues=g[a1]
-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.wh("+"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.wh("+"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.wh(this,b,c,false,[f],d)
-return new h(this,b[0],f,d)}:function(){if(h===null)h=H.wh(this,b,c,false,[],d)
-return new h(this,b[0],null,d)}}function tearOff(b,c,d,e,f){var h
-return d?function(){if(h===void 0)h=H.wh(this,b,c,true,[],e).prototype
-return h}:y(b,c,e,f)}var z=0
-var y=typeof dart_precompiled=="function"?tearOffGetterCsp:tearOffGetterNoCsp
-if(!init.libraries)init.libraries=[]
-if(!init.mangledNames)init.mangledNames=map()
-if(!init.mangledGlobalNames)init.mangledGlobalNames=map()
-if(!init.statics)init.statics=map()
-if(!init.typeInformation)init.typeInformation=map()
-if(!init.globalFunctions)init.globalFunctions=map()
-if(!init.interceptedNames)init.interceptedNames=map()
-var x=init.libraries
-var w=init.mangledNames
-var v=init.mangledGlobalNames
-var u=Object.prototype.hasOwnProperty
-var t=a.length
-for(var s=0;s<t;s++){var r=a[s]
-var q=r[0]
-var p=r[1]
-var o=r[2]
-var n=r[3]
-var m=r[4]
-var l=!!r[5]
-var k=m&&m["^"]
-if(k instanceof Array)k=k[0]
-var j=[]
-var i=[]
-processStatics(m)
-x.push([q,p,j,i,o,k,l,n])}})([["_foreign_helper","dart:_foreign_helper",,H,{
-"^":"",
-FK2:{
-"^":"a;tT>"}}],["_interceptors","dart:_interceptors",,J,{
-"^":"",
-x:function(a){return void 0},
-Qu:function(a,b,c,d){return{i:a,p:b,e:c,x:d}},
-m0: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
-if(!1===y)return z.i
-if(!0===y)return a
-x=Object.getPrototypeOf(a)
-if(y===x)return z.i
-if(z.e===x)throw H.b(P.SY("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
-else return C.vB}return w},
-TZ:function(a){var z,y,x,w
-z=$.Au
-if(z==null)return
-y=z
-for(z=y.length,x=J.x(a),w=0;w+1<z;w+=3){if(w>=z)return H.e(y,w)
-if(x.n(a,y[w]))return w}return},
-Xr:function(a){var z,y,x
-z=J.TZ(a)
-if(z==null)return
-y=$.Au
-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.TZ(a)
-if(z==null)return
-y=$.Au
-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.eQ(a)},
-bu:function(a){return H.a5(a)},
-T:[function(a,b){throw H.b(P.lr(a,b.gWa(),b.gnd(),b.gVm(),null))},"$1","gxK",2,0,null,68],
-gbx:function(a){return new H.cu(H.dJ(a),null)},
-"%":"DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"},
-yEe:{
-"^":"Gv;",
-bu:function(a){return String(a)},
-giO:function(a){return a?519018:218159},
-gbx:function(a){return C.HL},
-$isa2:true},
-CDU:{
-"^":"Gv;",
-n:function(a,b){return null==b},
-bu:function(a){return"null"},
-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","gxK",2,0,null,68]},
-Ue1:{
-"^":"Gv;",
-giO:function(a){return 0},
-gbx:function(a){return C.lU}},
-Ai:{
-"^":"Ue1;"},
-kdQ:{
-"^":"Ue1;"},
-Q:{
-"^":"Gv;",
-h:function(a,b){if(!!a.fixed$length)H.vh(P.f("add"))
-a.push(b)},
-KI: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"))
-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"))
-a.splice(b,0,c)},
-UG:function(a,b,c){if(!!a.fixed$length)H.vh(P.f("insertAll"))
-H.IC(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)
-return!0}return!1},
-ad:function(a,b){return H.VM(new H.U5(a,b),[null])},
-lM:[function(a,b){return H.VM(new H.oA(a,b),[null,null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gb",ret:P.QV,args:[{func:"hT",ret:P.QV,args:[a]}]}},this.$receiver,"Q")},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.XW(function(a){return{func:"fQ",ret:P.QV,args:[{func:"ub",args:[a]}]}},this.$receiver,"Q")},31],
-zV:function(a,b){var z,y,x,w
-z=a.length
-y=Array(z)
-y.fixed$length=init
-for(x=0;x<a.length;++x){w=H.d(a[x])
-if(x>=z)return H.e(y,x)
-y[x]=w}return y.join(b)},
-eR:function(a,b){return H.q9(a,b,null,null)},
-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.Kp(a,0)])
-return H.VM(a.slice(b,c),[H.Kp(a,0)])},
-Mu:function(a,b,c){H.xF(a,b,c)
-return H.q9(a,b,c,null)},
-gtH:function(a){if(a.length>0)return a[0]
-throw H.b(P.w("No elements"))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-UZ:function(a,b,c){var z
-if(!!a.fixed$length)H.vh(P.f("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))
-H.tb(a,c,a,b,z-c)
-this.sB(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"))
-H.rd(a,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return H.TK(a,b,c,a.length)},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return H.lO(a,b,a.length-1)},
-cn:function(a,b){return this.Pk(a,b,null)},
-tg:function(a,b){var z
-for(z=0;z<a.length;++z)if(J.xC(a[z],b))return!0
-return!1},
-gl0:function(a){return a.length===0},
-gor:function(a){return a.length!==0},
-bu:function(a){return P.WE(a,"[","]")},
-tt:function(a,b){var z
-if(b)return H.VM(a.slice(),[H.Kp(a,0)])
-else{z=H.VM(a.slice(),[H.Kp(a,0)])
-z.fixed$length=init
-return z}},
-br:function(a){return this.tt(a,!0)},
-gA:function(a){return H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)])},
-giO:function(a){return H.eQ(a)},
-gB:function(a){return a.length},
-sB:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(!!a.fixed$length)H.vh(P.f("set length"))
-a.length=b},
-t:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b>=a.length||b<0)throw H.b(P.N(b))
-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))
-a[b]=c},
-$isQ:true,
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{Zz:function(a,b){var z
-if(typeof a!=="number"||Math.floor(a)!==a||a<0)throw H.b(P.u("Length must be a non-negative integer: "+H.d(a)))
-z=H.VM(new Array(a),[b])
-z.fixed$length=init
-return z}}},
-P:{
-"^":"Gv;",
-iM:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(b))
-if(a<b)return-1
-else if(a>b)return 1
-else if(a===b){if(a===0){z=this.gzP(b)
-if(this.gzP(a)===z)return 0
-if(this.gzP(a))return-1
-return 1}return 0}else if(isNaN(a)){if(this.gG0(b))return 0
-return 1}else return-1},
-gzP:function(a){return a===0?1/a<0:a<0},
-gG0:function(a){return isNaN(a)},
-gx8:function(a){return isFinite(a)},
-JV:function(a,b){return a%b},
-Vy:function(a){return Math.abs(a)},
-yu:function(a){var z
-if(a>=-2147483648&&a<=2147483647)return a|0
-if(isFinite(a)){z=a<0?Math.ceil(a):Math.floor(a)
-return z+0}throw H.b(P.f(''+a))},
-HG:function(a){return this.yu(this.UD(a))},
-UD:function(a){if(a<0)return-Math.round(-a)
-else return Math.round(a)},
-Sy:function(a,b){var z
-if(b>20)throw H.b(P.KP(b))
-z=a.toFixed(b)
-if(a===0&&this.gzP(a))return"-"+z
-return z},
-WZ:function(a,b){if(b<2||b>36)throw H.b(P.KP(b))
-return a.toString(b)},
-bu:function(a){if(a===0&&1/a<0)return"-0.0"
-else return""+a},
-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))
-return a+b},
-W:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a-b},
-V:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a/b},
-U:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a*b},
-Y:function(a,b){var z
-if(typeof b!=="number")throw H.b(P.u(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))
-return this.yu(a/b)}},
-cU: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))
-return b>31?0:a<<b>>>0},
-W4: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))
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-GG:function(a,b){var z
-if(a>0)z=b>31?0:a>>>b
-else{z=b>31?31:b
-z=a>>z>>>0}return z},
-i:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a&b)>>>0},
-w:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return(a^b)>>>0},
-C:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<b},
-D:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>b},
-E:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a<=b},
-F:function(a,b){if(typeof b!=="number")throw H.b(P.u(b))
-return a>=b},
-gbx:function(a){return C.yT},
-$isFK:true,
-static:{"^":"Ng,N6l"}},
-imn:{
-"^":"P;",
-gbx:function(a){return C.yw},
-$isCP:true,
-$isFK:true,
-$isKN:true},
-Yn:{
-"^":"P;",
-gbx:function(a){return C.CR},
-$isCP:true,
-$isFK:true},
-O:{
-"^":"Gv;",
-j:function(a,b){if(typeof b!=="number"||Math.floor(b)!==b)throw H.b(P.u(b))
-if(b<0)throw H.b(P.N(b))
-if(b>=a.length)throw H.b(P.N(b))
-return a.charCodeAt(b)},
-dd:function(a,b){return H.ZT(a,b)},
-wL:function(a,b,c){var z,y,x,w
-if(c<0||c>b.length)throw H.b(P.TE(c,0,b.length))
-z=a.length
-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.Vo(c,b,a)},
-g:function(a,b){if(typeof b!=="string")throw H.b(P.u(b))
-return a+b},
-Tc:function(a,b){var z,y
-z=b.length
-y=a.length
-if(z>y)return!1
-return b===this.yn(a,y-z)},
-h8:function(a,b,c){return H.ys(a,b,c)},
-Fr:function(a,b){if(b==null)H.vh(P.u(null))
-if(typeof b==="string")return a.split(b)
-else if(!!J.x(b).$isVR)return a.split(b.Ej)
-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))
-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)},
-Nj:function(a,b,c){if(typeof b!=="number"||Math.floor(b)!==b)H.vh(P.u(b))
-if(c==null)c=a.length
-if(typeof c!=="number"||Math.floor(c)!==c)H.vh(P.u(c))
-if(b<0)throw H.b(P.N(b))
-if(typeof c!=="number")return H.s(c)
-if(b>c)throw H.b(P.N(b))
-if(c>a.length)throw H.b(P.N(c))
-return a.substring(b,c)},
-yn:function(a,b){return this.Nj(a,b,null)},
-hc:function(a){return a.toLowerCase()},
-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(x===y)return""}else x=0
-w=y-1
-v=this.j(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)
-if(0>=b)return""
-if(b===1||a.length===0)return a
-if(b!==b>>>0)throw H.b(C.Eq)
-for(z=a,y="";!0;){if((b&1)===1)y=z+y
-b=b>>>1
-if(b===0)break
-z+=z}return y},
-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(typeof b==="string")return a.indexOf(b,c)
-z=J.x(b)
-if(!!z.$isVR){y=b.yk(a,c)
-return y==null?-1:y.QK.index}for(x=a.length,w=c;w<=x;++w)if(z.wL(b,a,w)!=null)return w
-return-1},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){var z,y
-c=a.length
-z=b.length
-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))
-return H.b0(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(a===b)z=0
-else z=a<b?-1:1
-return z},
-bu:function(a){return a},
-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.Db},
-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))
-return a[b]},
-$isqU: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}}}}],["_isolate_helper","dart:_isolate_helper",,H,{
-"^":"",
-dB:function(a,b){var z=a.vV(0,b)
-init.globalState.Xz.bL()
-return z},
-cv:function(){--init.globalState.Xz.GL},
-wW:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=b
-b=b
-z.a=b
-if(b==null){b=[]
-z.a=b
-y=b}else y=b
-if(!J.x(y).$isWO)throw H.b(P.u("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.qi(a)
-init.globalState=y
-if(init.globalState.EF===!0)return
-y=init.globalState.Hg++
-x=P.L5(null,null,null,P.KN,H.yo)
-w=P.Ls(null,null,null,P.KN)
-v=new H.yo(0,null,!1)
-u=new H.aX(y,x,w,new I(),v,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-w.h(0,0)
-u.O9(0,v)
-init.globalState.Nr=u
-init.globalState.N0=u
-y=H.G3()
-x=H.KT(y,[y]).BD(a)
-if(x)u.vV(0,new H.PK(z,a))
-else{y=H.KT(y,[y,y]).BD(a)
-if(y)u.vV(0,new H.JO(z,a))
-else u.vV(0,a)}init.globalState.Xz.bL()},
-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.mf()
-if(typeof version=="function"&&typeof system=="function")return thisFilename()
-if(init.globalState.EF===!0)return H.mf()
-return},
-mf:function(){var z,y
-z=new Error().stack
-if(z==null){z=function(){try{throw new Error()}catch(x){return x.stack}}()
-if(z==null)throw H.b(P.f("No stack trace"))}y=z.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$","m"))
-if(y!=null)return y[1]
-y=z.match(new RegExp("^[^@]*@(.*):[0-9]*$","m"))
-if(y!=null)return y[1]
-throw H.b(P.f("Cannot extract URI from \""+H.d(z)+"\""))},
-Mg:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=H.Hh(b.data)
-y=J.U6(z)
-switch(y.t(z,"command")){case"start":init.globalState.oL=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.Hh(y.t(z,"msg"))
-t=y.t(z,"isSpawnUri")
-s=y.t(z,"startPaused")
-r=H.Hh(y.t(z,"replyTo"))
-y=init.globalState.Hg++
-q=P.L5(null,null,null,P.KN,H.yo)
-p=P.Ls(null,null,null,P.KN)
-o=new H.yo(0,null,!1)
-n=new H.aX(y,q,p,new I(),o,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-p.h(0,0)
-n.O9(0,o)
-init.globalState.Xz.Rk.NZ(0,new H.IY(n,new H.mN(w,v,u,t,s,r),"worker-start"))
-init.globalState.N0=n
-init.globalState.Xz.bL()
-break
-case"spawn-worker":m=y.t(z,"replyPort")
-H.EN(y.t(z,"functionName"),y.t(z,"uri"),y.t(z,"args"),y.t(z,"msg"),!1,y.t(z,"isSpawnUri"),y.t(z,"startPaused")).Rx(new H.xn(m),new H.jl3(m))
-break
-case"message":if(y.t(z,"port")!=null)J.H4(y.t(z,"port"),y.t(z,"msg"))
-init.globalState.Xz.bL()
-break
-case"close":init.globalState.XC.Rz(0,$.p6().t(0,a))
-a.terminate()
-init.globalState.Xz.bL()
-break
-case"log":H.ZF(y.t(z,"msg"))
-break
-case"print":if(init.globalState.EF===!0){y=init.globalState.rj
-q=H.t0(P.EF(["command","print","msg",z],null,null))
-y.toString
-self.postMessage(q)}else P.FL(y.t(z,"msg"))
-break
-case"error":throw H.b(y.t(z,"msg"))}},"$2","nW",4,0,null,0,1],
-ZF:function(a){var z,y,x,w
-if(init.globalState.EF===!0){y=init.globalState.rj
-x=H.t0(P.EF(["command","log","msg",a],null,null))
-y.toString
-self.postMessage(x)}else try{$.jk().console.log(a)}catch(w){H.Ru(w)
-z=new H.XO(w,null)
-throw H.b(P.FM(z))}},
-EN:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-if(b!=null&&J.VT(b,".dart"))b=J.ew(b,".js")
-z=P.hM()
-y=H.VM(new P.Zf(P.Dt(null)),[null])
-z.gtH(z).ml(new H.WK(y))
-x=new H.ws(z.vl,init.globalState.N0.jO)
-if(init.globalState.ji===!0&&!e)if(init.globalState.EF===!0){w=init.globalState.rj
-v=H.t0(P.EF(["command","spawn-worker","functionName",a,"args",c,"msg",d,"uri",b,"isSpawnUri",f,"startPaused",g,"replyPort",x],null,null))
-w.toString
-self.postMessage(v)}else{if(b==null)b=$.Zt()
-u=new Worker(b)
-u.onerror=function(h,i,j){return function(k){return h(k,i,j)}}(H.GA,b,new H.tZ(y))
-u.onmessage=function(h,i){return function(j){j.onerror=null
-return h(i,j)}}(H.Mg,u)
-w=init.globalState.Y7++
-$.p6().u(0,u,w)
-init.globalState.XC.u(0,w,u)
-u.postMessage(H.t0(P.EF(["command","start","id",w,"replyTo",H.t0(x),"args",c,"msg",H.t0(d),"isSpawnUri",f,"startPaused",g,"functionName",a],null,null)))}else H.Ff(a,b,c,d,f,g,x)
-return y.MM},
-Ff:function(a,b,c,d,e,f,g){var z,y,x,w,v,u
-z={}
-z.a=c
-z.b=d
-if(b!=null)throw H.b(P.f("Currently spawnUri is not supported without web workers."))
-z.b=H.t0(d)
-z.a=H.t0(z.a)
-y=init.globalState.Xz
-x=init.globalState.Hg++
-w=P.L5(null,null,null,P.KN,H.yo)
-v=P.Ls(null,null,null,P.KN)
-u=new H.yo(0,null,!1)
-w=new H.aX(x,w,v,new I(),u,P.N3(),P.N3(),!1,!1,[],P.Ls(null,null,null,null),null,null,!1,!0,P.Ls(null,null,null,null))
-v.h(0,0)
-w.O9(0,u)
-y.Rk.NZ(0,new H.IY(w,new H.hI(z,a,e,f,g),"nonworker start"))},
-Di:function(a,b,c,d,e,f){var z,y,x,w
-z=init.globalState.N0
-y=z.jO
-$.z7=$.z7+("_"+y)
-$.eb=$.eb+("_"+y)
-y=z.EE
-x=init.globalState.N0.jO
-w=z.um
-J.H4(f,["spawned",new H.ws(y,x),w,z.PX])
-x=new H.vK(a,b,c,d,z)
-if(e===!0){z.V0(w,w)
-init.globalState.Xz.Rk.NZ(0,new H.IY(z,x,"start isolate"))}else x.$0()},
-GA:[function(a,b,c){var z
-a.preventDefault()
-z=a.message
-c.$1(z==null?"Error spawning worker for "+H.d(b):"Error spawning worker for "+H.d(b)+" ("+z+")")
-return!0},"$3","dd",6,0,null,2,3,4],
-t0:function(a){var z
-if(init.globalState.ji===!0){z=new H.NA(0,new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}else{z=new H.Qt(new H.cx())
-z.mR=new H.m3(null)
-return z.Zo(a)}},
-Hh:function(a){if(init.globalState.ji===!0)return new H.BV(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"},
-PK:{
-"^":"Tp:69;a,b",
-$0:function(){this.b.$1(this.a.a)},
-$isEH:true},
-JO:{
-"^":"Tp:69;a,c",
-$0:function(){this.c.$2(this.a.a,null)},
-$isEH:true},
-pq:{
-"^":"a;Hg,oL,Y7,N0,Nr,Xz,Ai,EF,ji,iR<,rj,XC,w2<",
-qi:function(a){var z,y,x,w
-z=$.Vr()==null
-y=$.rm()
-x=z&&$.ey()===!0
-this.EF=x
-if(!x)y=y!=null&&$.Zt()!=null
-else y=!0
-this.ji=y
-this.Ai=z&&!x
-y=H.IY
-x=H.VM(new P.Sw(null,0,0,0),[y])
-x.Eo(null,y)
-this.Xz=new H.cC(x,0)
-this.iR=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
-w=function(b,c){return function(d){b(c,d)}}(H.Mg,z)
-$.jk().onmessage=w
-$.jk().dartPrint=function(b){}}}},
-aX:{
-"^":"a;jO>,Gx,fW,En<,EE<,um,PX,xF?,UF<,C9<,lw,CN,M2,mf,pa,ir",
-V0:function(a,b){if(!this.um.n(0,a))return
-if(this.lw.h(0,b)&&!this.UF)this.UF=!0
-this.PC()},
-NR:function(a){var z,y,x,w,v,u
-if(!this.UF)return
-z=this.lw
-z.Rz(0,a)
-if(z.X5===0){for(z=this.C9;y=z.length,y!==0;){if(0>=y)return H.e(z,0)
-x=z.pop()
-y=init.globalState.Xz.Rk
-w=y.av
-v=y.v5
-u=v.length
-w=(w-1&u-1)>>>0
-y.av=w
-if(w<0||w>=u)return H.e(v,w)
-v[w]=x
-if(w===y.eZ)y.M9();++y.qT}this.UF=!1}this.PC()},
-iK:function(a){var z=this.CN
-if(z==null){z=[]
-this.CN=z}if(J.x5(z,a))return
-this.CN.push(a)},
-IB:function(a){var z=this.CN
-if(z==null)return
-J.V1(z,a)},
-JZ:function(a,b){if(!this.PX.n(0,a))return
-this.pa=b},
-ZC:function(a,b){var z,y
-z=J.x(b)
-if(!z.n(b,0))y=z.n(b,1)&&!this.mf
-else y=!0
-if(y){J.H4(a,null)
-return}y=new H.NY(a)
-if(z.n(b,2)){init.globalState.Xz.Rk.NZ(0,new H.IY(this,y,"ping"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(0,y)},
-bc: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.mf
-else y=!0
-if(y){this.Dm()
-return}if(z.n(b,2)){z=init.globalState.Xz
-y=this.gIm()
-z.Rk.NZ(0,new H.IY(this,y,"kill"))
-return}z=this.M2
-if(z==null){z=H.VM(new P.Sw(null,0,0,0),[null])
-z.Eo(null,null)
-this.M2=z}z.NZ(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=$.jk()
-if(z.console!=null&&typeof z.console.error=="function")z.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.zN,null,null),[null]),z.zq=z.O2.H9;z.G();)J.H4(z.fD,y)},
-vV:[function(a,b){var z,y,x,w,v,u
-z=init.globalState.N0
-init.globalState.N0=this
-$=this.En
-y=null
-this.mf=!0
-try{y=b.$0()}catch(v){u=H.Ru(v)
-x=u
-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.mf=!1
-init.globalState.N0=z
-if(z!=null)$=z.gEn()
-if(this.M2!=null)for(;u=this.M2,!u.gl0(u);)this.M2.AR().$0()}return y},"$1","gZm",2,0,70,71],
-Ds:function(a){var z=J.U6(a)
-switch(z.t(a,0)){case"pause":this.V0(z.t(a,1),z.t(a,2))
-break
-case"resume":this.NR(z.t(a,1))
-break
-case"add-ondone":this.iK(z.t(a,1))
-break
-case"remove-ondone":this.IB(z.t(a,1))
-break
-case"set-errors-fatal":this.JZ(z.t(a,1),z.t(a,2))
-break
-case"ping":this.ZC(z.t(a,1),z.t(a,2))
-break
-case"kill":this.bc(z.t(a,1),z.t(a,2))
-break
-case"getErrors":this.ir.h(0,z.t(a,1))
-break
-case"stopErrors":this.ir.Rz(0,z.t(a,1))
-break}},
-hV:function(a){return this.Gx.t(0,a)},
-O9:function(a,b){var z=this.Gx
-if(z.x4(a))throw H.b(P.FM("Registry: ports must be registered only once."))
-z.u(0,a,b)},
-PC:function(){if(this.Gx.X5-this.fW.X5>0||this.UF||!this.xF)init.globalState.iR.u(0,this.jO,this)
-else this.Dm()},
-Dm:[function(){var z,y
-z=this.M2
-if(z!=null)z.V1(0)
-for(z=this.Gx,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.pr()
-z.V1(0)
-this.fW.V1(0)
-init.globalState.iR.Rz(0,this.jO)
-this.ir.V1(0)
-z=this.CN
-if(z!=null){for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.H4(z.lo,null)
-this.CN=null}},"$0","gIm",0,0,18],
-$isaX:true},
-NY:{
-"^":"Tp:18;a",
-$0:[function(){J.H4(this.a,null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-cC:{
-"^":"a;Rk,GL",
-mj:function(){var z=this.Rk
-if(z.av===z.eZ)return
-return z.AR()},
-xB:function(){var z,y,x
-z=this.mj()
-if(z==null){if(init.globalState.Nr!=null&&init.globalState.iR.x4(init.globalState.Nr.jO)&&init.globalState.Ai===!0&&init.globalState.Nr.Gx.X5===0)H.vh(P.FM("Program exited with open ReceivePorts."))
-y=init.globalState
-if(y.EF===!0&&y.iR.X5===0&&y.Xz.GL===0){y=y.rj
-x=H.t0(P.EF(["command","close"],null,null))
-y.toString
-self.postMessage(x)}return!1}J.R1(z)
-return!0},
-oV:function(){if($.Vr()!=null)new H.Rm(this).$0()
-else for(;this.xB(););},
-bL:function(){var z,y,x,w,v
-if(init.globalState.EF!==!0)this.oV()
-else try{this.oV()}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-w=init.globalState.rj
-v=H.t0(P.EF(["command","error","msg",H.d(z)+"\n"+H.d(y)],null,null))
-w.toString
-self.postMessage(v)}}},
-Rm:{
-"^":"Tp:18;a",
-$0:[function(){if(!this.a.xB())return
-P.rT(C.ny,this)},"$0",null,0,0,null,"call"],
-$isEH:true},
-IY:{
-"^":"a;od*,i3,G1>",
-Fn:[function(a){if(this.od.gUF()){this.od.gC9().push(this)
-return}J.QT(this.od,this.i3)},"$0","gNN",0,0,18],
-$isIY:true},
-JH:{
-"^":"a;"},
-mN:{
-"^":"Tp:69;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},
-xn:{
-"^":"Tp:13;UI",
-$1:[function(a){J.H4(this.UI,a)},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-jl3:{
-"^":"Tp:5;bK",
-$1:[function(a){J.H4(this.bK,["spawn failed",a])},"$1",null,2,0,null,73,"call"],
-$isEH:true},
-WK:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-y=this.a
-if(J.xC(z.t(a,0),"spawned")){z=y.MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(a)}else y.pm(z.t(a,1))},"$1",null,2,0,null,72,"call"],
-$isEH:true},
-tZ:{
-"^":"Tp:5;b",
-$1:[function(a){return this.b.pm(a)},"$1",null,2,0,null,74,"call"],
-$isEH:true},
-hI:{
-"^":"Tp:69;a,b,c,d,e",
-$0:[function(){var z=this.a
-H.Di(init.globalFunctions[this.b](),z.a,z.b,this.c,this.d,this.e)},"$0",null,0,0,null,"call"],
-$isEH:true},
-vK:{
-"^":"Tp:18;a,b,c,d,e",
-$0:[function(){var z,y,x
-this.e.sxF(!0)
-if(this.d!==!0)this.a.$1(this.c)
-else{z=this.a
-y=H.G3()
-x=H.KT(y,[y,y]).BD(z)
-if(x)z.$2(this.b,this.c)
-else{y=H.KT(y,[y]).BD(z)
-if(y)z.$1(this.b)
-else z.$0()}}},"$0",null,0,0,null,"call"],
-$isEH:true},
-Iy4:{
-"^":"a;",
-$isbC:true,
-$isXY:true},
-ws:{
-"^":"Iy4;JE,tv",
-wR:function(a,b){var z,y,x,w,v
-z={}
-y=this.tv
-x=init.globalState.iR.t(0,y)
-if(x==null)return
-w=this.JE
-if(w.gKS())return
-v=init.globalState.N0!=null&&init.globalState.N0.jO!==y
-z.a=b
-if(v)z.a=H.t0(b)
-if(x.gEE()===w){x.Ds(z.a)
-return}y=init.globalState.Xz
-w="receive "+H.d(b)
-y.Rk.NZ(0,new H.IY(x,new H.Ua(z,this,v),w))},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isws&&J.xC(this.JE,b.JE)},
-giO:function(a){return J.ki(this.JE)},
-$isws:true,
-$isbC:true,
-$isXY:true},
-Ua:{
-"^":"Tp:69;a,b,c",
-$0:[function(){var z,y
-z=this.b.JE
-if(!z.gKS()){if(this.c){y=this.a
-y.a=H.Hh(y.a)}J.n0(z,this.a.a)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-bM:{
-"^":"Iy4;ZU,bv,tv",
-wR:function(a,b){var z,y
-z=H.t0(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.ZU)
-if(y!=null)y.postMessage(z)}},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isbM&&J.xC(this.ZU,b.ZU)&&J.xC(this.tv,b.tv)&&J.xC(this.bv,b.bv)},
-giO:function(a){var z,y,x
-z=J.lf(this.ZU,16)
-y=J.lf(this.tv,8)
-x=this.bv
-if(typeof x!=="number")return H.s(x)
-return(z^y^x)>>>0},
-$isbM:true,
-$isbC:true,
-$isXY:true},
-yo:{
-"^":"a;qK>,D1,KS<",
-aV:function(a){return this.D1.$1(a)},
-pr:function(){this.KS=!0
-this.D1=null},
-S6:function(a){var z,y
-if(this.KS)return
-this.KS=!0
-this.D1=null
-z=init.globalState.N0
-y=this.qK
-z.Gx.Rz(0,y)
-z.fW.Rz(0,y)
-z.PC()},
-Rf:function(a,b){if(this.KS)return
-this.aV(b)},
-$isyo:true,
-static:{"^":"Vz"}},
-fc:{
-"^":"cb;vl,da",
-KR:function(a,b,c,d){var z=this.da
-z.toString
-return H.VM(new P.O9(z),[null]).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)},
-S6:[function(a){this.vl.S6(0)
-this.da.S6(0)},"$0","gJK",0,0,18],
-TL:function(a){var z=P.x2(this.gJK(this),null,null,null,!0,null)
-this.da=z
-this.vl.D1=z.ght(z)},
-$ascb:function(){return[null]},
-$iscb:true},
-NA:{
-"^":"jP1;Ao,mR",
-DE:function(a){if(!!a.$isws)return["sendport",init.globalState.oL,a.tv,J.ki(a.JE)]
-if(!!a.$isbM)return["sendport",a.ZU,a.tv,a.bv]
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return["capability",a.qK]
-throw H.b("Capability not serializable: "+a.bu(0))}},
-Qt:{
-"^":"ooy;mR",
-DE:function(a){if(!!a.$isws)return new H.ws(a.JE,a.tv)
-if(!!a.$isbM)return new H.bM(a.ZU,a.bv,a.tv)
-throw H.b("Illegal underlying port "+a.bu(0))},
-yf:function(a){if(!!a.$isiV)return new H.iV(a.qK)
-throw H.b("Capability not serializable: "+a.bu(0))}},
-BV:{
-"^":"fPc;RZ",
-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.oL)){v=init.globalState.iR.t(0,x)
-if(v==null)return
-u=v.hV(w)
-if(u==null)return
-return new H.ws(u,x)}else return new H.bM(y,w,x)},
-Op:function(a){return new H.iV(J.UQ(a,1))}},
-m3:{
-"^":"a;MD",
-t:function(a,b){return b.__MessageTraverser__attached_info__},
-u:function(a,b,c){this.MD.push(b)
-b.__MessageTraverser__attached_info__=c},
-CH:function(a){this.MD=[]},
-no:function(){var z,y,x
-for(z=this.MD.length,y=0;y<z;++y){x=this.MD
-if(y>=x.length)return H.e(x,y)
-x[y].__MessageTraverser__attached_info__=null}this.MD=null}},
-cx:{
-"^":"a;",
-t:function(a,b){return},
-u:function(a,b,c){},
-CH:function(a){},
-no:function(){}},
-BB:{
-"^":"a;",
-Zo:function(a){var z
-if(H.vM(a))return this.Pq(a)
-this.mR.CH(0)
-z=null
-try{z=this.Q9(a)}finally{this.mR.no()}return z},
-Q9:function(a){var z
-if(a==null||typeof a==="string"||typeof a==="number"||typeof a==="boolean")return this.Pq(a)
-z=J.x(a)
-if(!!z.$isWO)return this.wb(a)
-if(!!z.$isZ0)return this.TI(a)
-if(!!z.$isbC)return this.DE(a)
-if(!!z.$isXY)return this.yf(a)
-return this.N1(a)},
-N1:function(a){throw H.b("Message serialization: Illegal value "+H.d(a)+" passed")}},
-ooy:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y,x,w
-z=this.mR.t(0,a)
-if(z!=null)return z
-y=J.U6(a)
-x=y.gB(a)
-z=Array(x)
-z.fixed$length=init
-this.mR.u(0,a,z)
-for(w=0;w<x;++w)z[w]=this.Q9(y.t(a,w))
-return z},
-TI:function(a){var z,y
-z={}
-y=this.mR.t(0,a)
-z.a=y
-if(y!=null)return y
-y=P.L5(null,null,null,null,null)
-z.a=y
-this.mR.u(0,a,y)
-a.aN(0,new H.OW(z,this))
-return z.a},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-OW:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.b
-J.kW(this.a.a,z.Q9(a),z.Q9(b))},"$2",null,4,0,null,75,76,"call"],
-$isEH:true},
-jP1:{
-"^":"BB;",
-Pq:function(a){return a},
-wb:function(a){var z,y
-z=this.mR.t(0,a)
-if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["list",y,this.mE(a)]},
-TI:function(a){var z,y
-z=this.mR.t(0,a)
-if(z!=null)return["ref",z]
-y=this.Ao++
-this.mR.u(0,a,y)
-return["map",y,this.mE(J.qA(a.gvc())),this.mE(J.qA(a.gUQ(a)))]},
-mE:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=[]
-C.Nm.sB(x,y)
-for(w=0;w<y;++w){v=this.Q9(z.t(a,w))
-if(w>=x.length)return H.e(x,w)
-x[w]=v}return x},
-DE:function(a){return H.vh(P.SY(null))},
-yf:function(a){return H.vh(P.SY(null))}},
-fPc:{
-"^":"a;",
-ug:function(a){if(H.ZR(a))return a
-this.RZ=P.YM(null,null,null,null,null)
-return this.D5(a)},
-D5: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.RZ.t(0,y)
-case"list":return this.Dj(a)
-case"map":return this.GD(a)
-case"sendport":return this.Vf(a)
-case"capability":return this.Op(a)
-default:return this.PR(a)}},
-Dj:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=z.t(a,1)
-x=z.t(a,2)
-this.RZ.u(0,y,x)
-z=J.U6(x)
-w=z.gB(x)
-if(typeof w!=="number")return H.s(w)
-v=0
-for(;v<w;++v)z.u(x,v,this.D5(z.t(x,v)))
-return x},
-GD: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.RZ.u(0,x,z)
-w=y.t(a,2)
-v=y.t(a,3)
-y=J.U6(w)
-u=y.gB(w)
-if(typeof u!=="number")return H.s(u)
-t=J.U6(v)
-s=0
-for(;s<u;++s)z.u(0,this.D5(y.t(w,s)),this.D5(t.t(v,s)))
-return z},
-PR:function(a){throw H.b("Unexpected serialized object")}},
-Oe:{
-"^":"a;Om,zu,p9",
-ed:function(){if($.jk().setTimeout!=null){if(this.zu)throw H.b(P.f("Timer in event loop cannot be canceled."))
-if(this.p9==null)return
-H.cv()
-if(this.Om)$.jk().clearTimeout(this.p9)
-else $.jk().clearInterval(this.p9)
-this.p9=null}else throw H.b(P.f("Canceling a timer."))},
-Qa:function(a,b){var z,y
-if(a===0)z=$.jk().setTimeout==null||init.globalState.EF===!0
-else z=!1
-if(z){this.p9=1
-z=init.globalState.Xz
-y=init.globalState.N0
-z.Rk.NZ(0,new H.IY(y,new H.Av(this,b),"timer"))
-this.zu=!0}else{z=$.jk()
-if(z.setTimeout!=null){++init.globalState.Xz.GL
-this.p9=z.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}}},
-Av:{
-"^":"Tp:18;a,b",
-$0:[function(){this.a.p9=null
-this.b.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-vt:{
-"^":"Tp:18;c,d",
-$0:[function(){this.c.p9=null
-H.cv()
-this.d.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-iV:{
-"^":"a;qK>",
-giO:function(a){var z,y,x
-z=this.qK
-y=J.Wx(z)
-x=y.m(z,0)
-y=y.Z(z,4294967296)
-if(typeof y!=="number")return H.s(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
-if(b==null)return!1
-if(b===this)return!0
-if(!!J.x(b).$isiV){z=this.qK
-y=b.qK
-return z==null?y==null:z===y}return!1},
-$isiV:true,
-$isXY:true}}],["_js_helper","dart:_js_helper",,H,{
-"^":"",
-Gp:function(a,b){var z
-if(b!=null){z=b.x
-if(z!=null)return z}return!!J.x(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))
-return z},
-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))},"$1","kk",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))
-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)
-if(z[2]!=null)return parseInt(a,16)
-if(3>=y)return H.e(z,3)
-if(z[3]!=null)return parseInt(a,10)
-return c.$1(a)}b=10}else{if(b<2||b>36)throw H.b(P.KP("Radix "+H.d(b)+" not in range 2..36"))
-if(z!=null){if(b===10){if(3>=z.length)return H.e(z,3)
-y=z[3]!=null}else y=!1
-if(y)return parseInt(a,10)
-if(!(b<10)){if(3>=z.length)return H.e(z,3)
-y=z[3]==null}else y=!0
-if(y){x=b<=10?48+b-1:97+b-10-1
-if(1>=z.length)return H.e(z,1)
-w=z[1]
-y=J.U6(w)
-v=0
-while(!0){u=y.gB(w)
-if(typeof u!=="number")return H.s(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)
-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()
-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(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))
-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.xB.j(z,0)===36)z=C.xB.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)+"'"},
-Ms:function(){if(typeof window!="undefined"&&window!==null){var z=window.performance
-if(z!=null&&typeof z.webkitNow=="function")return C.CD.yu(Math.floor(1000*z.webkitNow()))}return 1000*Date.now()},
-Cb: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
-else{u=w+500
-u=u<z?u:z
-v=a.slice(w,u)}x+=String.fromCharCode.apply(null,v)}return x},
-YF:function(a){var z,y,x
-z=[]
-z.$builtinTypeInfo=[P.KN]
-y=new H.a7(a,a.length,0,null)
-y.$builtinTypeInfo=[H.Kp(a,0)]
-for(;y.G();){x=y.lo
-if(typeof x!=="number"||Math.floor(x)!==x)throw H.b(P.u(x))
-if(x<=65535)z.push(x)
-else if(x<=1114111){z.push(55296+(C.jn.GG(x-65536,10)&1023))
-z.push(56320+(x&1023))}else throw H.b(P.u(x))}return H.Cb(z)},
-eT:function(a){var z,y
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();){y=z.lo
-if(typeof y!=="number"||Math.floor(y)!==y)throw H.b(P.u(y))
-if(y<0)throw H.b(P.u(y))
-if(y>65535)return H.YF(a)}return H.Cb(a)},
-Lw:function(a){var z
-if(typeof a!=="number")return H.s(a)
-if(0<=a){if(a<=65535)return String.fromCharCode(a)
-if(a<=1114111){z=a-65536
-return String.fromCharCode((55296|C.CD.GG(z,10))>>>0,(56320|z&1023)>>>0)}}throw H.b(P.TE(a,0,1114111))},
-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)
-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)throw H.b(P.u(null))
-x=J.Wx(a)
-if(x.E(a,0)||x.C(a,100)){w=new Date(y)
-if(h)w.setUTCFullYear(a)
-else w.setFullYear(a)
-return w.valueOf()}return y},
-o2:function(a){if(a.date===void 0)a.date=new Date(a.y3)
-return a.date},
-of:function(a,b){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-return a[b]},
-wV:function(a,b,c){if(a==null||typeof a==="boolean"||typeof a==="number"||typeof a==="string")throw H.b(P.u(a))
-a[b]=c},
-zo:function(a,b,c){var z,y,x
-z={}
-z.a=0
-y=[]
-x=[]
-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))},
-im:function(a,b,c){var z,y,x,w,v,u,t,s,r,q
-z={}
-if(c!=null&&!c.gl0(c)){y=J.x(a)["call*"]
-if(y==null)return H.zo(a,b,c)
-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(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
-c.aN(0,new H.u8(z,v))
-if(z.a)return H.zo(a,b,c)
-C.Nm.FV(b,v.gUQ(v))
-return y.apply(a,b)}r=[]
-if(b!=null){q=b.length
-C.Nm.FV(r,b)}else q=0
-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))},
-b:function(a){var z
-if(a==null)a=new P.LK()
-z=new Error()
-z.dartException=a
-if("defineProperty" in Object){Object.defineProperty(z,"message",{get:H.tM})
-z.name=""}else z.toString=H.tM
-return z},
-tM:[function(){return J.AG(this.dartException)},"$0","p3",0,0,null],
-vh:function(a){throw H.b(a)},
-Ru:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=new H.Am(a)
-if(a==null)return
-if(typeof a!=="object")return a
-if("dartException" in a)return z.$1(a.dartException)
-else if(!("message" in a))return a
-y=a.message
-if("number" in a&&typeof a.number=="number"){x=a.number
-w=x&65535
-if((C.jn.GG(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.Zo(v,null))}}if(a instanceof TypeError){v=$.WD()
-u=$.Up()
-t=$.PH()
-s=$.D1()
-r=$.rx()
-q=$.kQ()
-p=$.W6()
-$.Bi()
-o=$.eA()
-n=$.ko()
-m=v.qS(y)
-if(m!=null)return z.$1(H.T3(y,m))
-else{m=u.qS(y)
-if(m!=null){m.method="call"
-return z.$1(H.T3(y,m))}else{m=t.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=r.qS(y)
-if(m==null){m=q.qS(y)
-if(m==null){m=p.qS(y)
-if(m==null){m=s.qS(y)
-if(m==null){m=o.qS(y)
-if(m==null){m=n.qS(y)
-v=m!=null}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0}else v=!0
-if(v){v=m==null?null:m.method
-return z.$1(new H.Zo(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.AT(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.eQ(a)},
-B7:function(a,b){var z,y,x,w
-z=a.length
-for(y=0;y<z;y=w){x=y+1
-w=x+1
-b.u(0,a[y],a[x])}return b},
-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.dr(a))
-else if(z.n(c,1))return H.dB(b,new H.TL(a,d))
-else if(z.n(c,2))return H.dB(b,new H.uZ(a,d,e))
-else if(z.n(c,3))return H.dB(b,new H.OQ(a,d,e,f))
-else if(z.n(c,4))return H.dB(b,new H.Qx(a,d,e,f,g))
-else throw H.b(P.FM("Unsupported number of arguments for wrapped closure"))},"$7","ye5",14,0,null,6,7,8,9,10,11,12],
-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)
-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
-z=b[0]
-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)
-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)}
-v=u}else{u=$.OK
-$.OK=J.ew(u,1)
-u=new Function("a","b","c","d","this.$initialize(a,b,c,d);"+u)
-v=u}w.constructor=v
-v.prototype=w
-u=!d
-if(u){t=e.length==1&&!0
-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)
-else if(u&&typeof x=="function"){q=t?H.HY:H.uj
-r=function(g,h){return function(){return g.apply({$receiver:h(this)},arguments)}}(x,q)}else throw H.b("Error in reflectionInfo.")
-w.$signature=r
-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.SD(a,o,t)
-w[n]=m}}w["call*"]=s
-return v},
-vq:function(a,b,c,d){var z=H.uj
-switch(b?-1:a){case 0:return function(e,f){return function(){return f(this)[e]()}}(c,z)
-case 1:return function(e,f){return function(g){return f(this)[e](g)}}(c,z)
-case 2:return function(e,f){return function(g,h){return f(this)[e](g,h)}}(c,z)
-case 3:return function(e,f){return function(g,h,i){return f(this)[e](g,h,i)}}(c,z)
-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)}},
-SD:function(a,b,c){var z,y,x,w,v,u
-if(c)return H.Hf(a,b)
-z=b.$stubName
-y=b.length
-x=a[z]
-w=b==null?x==null:b===x
-if(typeof dart_precompiled=="function"||!w||y>=27)return H.vq(y,!w,z,b)
-if(y===0){w=$.bf
-if(w==null){w=H.B3("self")
-$.bf=w}w="return function(){return this."+H.d(w)+"."+H.d(z)+"();"
-v=$.OK
-$.OK=J.ew(v,1)
-return new Function(w+H.d(v)+"}")()}u="abcdefghijklmnopqrstuvwxyz".split("").splice(0,y).join(",")
-w="return function("+u+"){return this."
-v=$.bf
-if(v==null){v=H.B3("self")
-$.bf=v}v=w+H.d(v)+"."+H.d(z)+"("+u+");"
-w=$.OK
-$.OK=J.ew(w,1)
-return new Function(v+H.d(w)+"}")()},
-Zq:function(a,b,c,d){var z,y
-z=H.uj
-y=H.HY
-switch(b?-1:a){case 0:throw H.b(H.Pa("Intercepted function with no arguments."))
-case 1:return function(e,f,g){return function(){return f(this)[e](g(this))}}(c,z,y)
-case 2:return function(e,f,g){return function(h){return f(this)[e](g(this),h)}}(c,z,y)
-case 3:return function(e,f,g){return function(h,i){return f(this)[e](g(this),h,i)}}(c,z,y)
-case 4:return function(e,f,g){return function(h,i,j){return f(this)[e](g(this),h,i,j)}}(c,z,y)
-case 5:return function(e,f,g){return function(h,i,j,k){return f(this)[e](g(this),h,i,j,k)}}(c,z,y)
-case 6:return function(e,f,g){return function(h,i,j,k,l){return f(this)[e](g(this),h,i,j,k,l)}}(c,z,y)
-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)}},
-Hf:function(a,b){var z,y,x,w,v,u,t,s
-z=H.bO()
-y=$.P4
-if(y==null){y=H.B3("receiver")
-$.P4=y}x=b.$stubName
-w=b.length
-v=typeof dart_precompiled=="function"
-u=a[x]
-t=b==null?u==null:b===u
-if(v||!t||w>=28)return H.Zq(w,!t,x,b)
-if(w===1){y="return function(){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+");"
-t=$.OK
-$.OK=J.ew(t,1)
-return new Function(y+H.d(t)+"}")()}s="abcdefghijklmnopqrstuvwxyz".split("").splice(0,w-1).join(",")
-y="return function("+s+"){return this."+H.d(z)+"."+H.d(x)+"(this."+H.d(y)+", "+s+");"
-t=$.OK
-$.OK=J.ew(t,1)
-return new Function(y+H.d(t)+"}")()},
-wh:function(a,b,c,d,e,f){b.fixed$length=init
-c.fixed$length=init
-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))))},
-Go:function(a,b){var z
-if(a!=null)z=typeof a==="object"&&J.x(a)[b]
-else z=!0
-if(z)return a
-H.aE(a,b)},
-ag:function(a){throw H.b(P.Gz("Cyclic initialization for static "+H.d(a)))},
-KT:function(a,b,c){return new H.GN(a,b,c,null)},
-Og:function(a,b){var z=a.name
-if(b==null||b.length===0)return new H.Fp(z)
-return new H.KEA(z,b,null)},
-G3:function(){return C.KZ},
-Kx:function(a){return new H.cu(a,null)},
-VM:function(a,b){if(a!=null)a.$builtinTypeInfo=b
-return a},
-oX:function(a){if(a==null)return
-return a.$builtinTypeInfo},
-IM:function(a,b){return H.Y9(a["$as"+H.d(b)],H.oX(a))},
-ip:function(a,b,c){var z=H.IM(a,b)
-return z==null?null:z[c]},
-Kp:function(a,b){var z=H.oX(a)
-return z==null?null:z[b]},
-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 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.vM+=", "
-v=a[y]
-if(v!=null)w=!1
-u=H.Ko(v,c)
-z.vM+=typeof u==="string"?u:H.d(u)}return w?"":"<"+H.d(z)+">"},
-dJ:function(a){var z=J.x(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
-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)
-if(y[b]==null)return!1
-return H.hv(H.Y9(y[d],z),c)},
-hv:function(a,b){var z,y
-if(a==null||b==null)return!0
-z=a.length
-for(y=0;y<z;++y)if(!H.t1(a[y],b[y]))return!1
-return!0},
-XW:function(a,b,c){return H.ml(a,b,H.IM(b,c))},
-IU:function(a,b){var z,y
-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)
-if(z!=null){y=z.slice()
-y.splice(0,0,a)}else y=a
-return H.t1(y,b)},
-t1:function(a,b){var z,y,x,w,v,u,t
-if(a===b)return!0
-if(a==null||b==null)return!0
-if("func" in b){if(!("func" in a)){if("$is_"+H.d(b.func) in a)return!0
-z=a.$signature
-if(z==null)return!1
-a=z.apply(a,null)}return H.J4(a,b)}if(b.builtin$cls==="EH"&&"func" in a)return!0
-y=typeof a==="object"&&a!==null&&a.constructor===Array
-x=y?a[0]:a
-w=typeof b==="object"&&b!==null&&b.constructor===Array
-v=w?b[0]:b
-u=H.Ko(v,null)
-if(v!==x){if(!("$is"+H.d(u) in x))return!1
-t=x["$as"+H.d(H.Ko(v,null))]}else t=null
-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)},
-Hc:function(a,b,c){var z,y,x,w,v
-if(b==null&&a==null)return!0
-if(b==null)return c
-if(a==null)return!1
-z=a.length
-y=b.length
-if(c){if(z<y)return!1}else if(z!==y)return!1
-for(x=0;x<y;++x){w=a[x]
-v=b[x]
-if(!(H.t1(w,v)||H.t1(v,w)))return!1}return!0},
-Vt:function(a,b){var z,y,x,w,v,u
-if(b==null)return!0
-if(a==null)return!1
-z=Object.getOwnPropertyNames(b)
-z.fixed$length=init
-y=z
-for(z=y.length,x=0;x<z;++x){w=y[x]
-if(!Object.hasOwnProperty.call(a,w))return!1
-v=b[w]
-u=a[w]
-if(!(H.t1(v,u)||H.t1(u,v)))return!1}return!0},
-J4:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(!("func" in a))return!1
-if("void" in a){if(!("void" in b)&&"ret" in b)return!1}else if(!("void" in b)){z=a.ret
-y=b.ret
-if(!(H.t1(z,y)||H.t1(y,z)))return!1}x=a.args
-w=b.args
-v=a.opt
-u=b.opt
-t=x!=null?x.length:0
-s=w!=null?w.length:0
-r=v!=null?v.length:0
-q=u!=null?u.length:0
-if(t>s)return!1
-if(t+r<s+q)return!1
-if(t===s){if(!H.Hc(x,w,!1))return!1
-if(!H.Hc(v,u,!0))return!1}else{for(p=0;p<t;++p){o=x[p]
-n=w[p]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=p,l=0;m<s;++l,++m){o=v[l]
-n=w[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}for(m=0;m<q;++l,++m){o=v[l]
-n=u[m]
-if(!(H.t1(o,n)||H.t1(n,o)))return!1}}return H.Vt(a.named,b.named)},
-ml:function(a,b,c){return a.apply(b,c)},
-Pq:function(a){var z=$.NF
-return"Instance of "+(z==null?"<Unknown>":z.$1(a))},
-wzi:function(a){return H.eQ(a)},
-bm: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=$.NF.$1(a)
-y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]
-if(w==null){z=$.TX.$2(a,z)
-if(z!=null){y=$.q4[z]
-if(y!=null){Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}x=$.vv[z]
-if(x!=null)return x
-w=init.interceptorsByTag[z]}}if(w==null)return
-x=w.prototype
-v=z[0]
-if(v==="!"){y=H.Va(x)
-$.q4[z]=y
-Object.defineProperty(a,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return y.i}if(v==="~"){$.vv[z]=x
-return x}if(v==="-"){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}if(v==="+")return H.B1(a,x)
-if(v==="*")throw H.b(P.SY(z))
-if(init.leafTags[z]===true){u=H.Va(x)
-Object.defineProperty(Object.getPrototypeOf(a),init.dispatchPropertyName,{value:u,enumerable:false,writable:true,configurable:true})
-return u.i}else return H.B1(a,x)},
-B1:function(a,b){var z,y
-z=Object.getPrototypeOf(a)
-y=J.Qu(b,z,null,null)
-Object.defineProperty(z,init.dispatchPropertyName,{value:y,enumerable:false,writable:true,configurable:true})
-return b},
-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.Qu(z,!1,null,!!z.$isXj)
-else return J.Qu(z,c,null,null)},
-XD:function(){if(!0===$.Bv)return
-$.Bv=!0
-H.Z1()},
-Z1:function(){var z,y,x,w,v,u,t,s
-$.q4=Object.create(null)
-$.vv=Object.create(null)
-H.kO()
-z=init.interceptorsByTag
-y=Object.getOwnPropertyNames(z)
-if(typeof window!="undefined"){window
-x=function(){}
-for(w=0;w<y.length;++w){v=y[w]
-u=$.x7.$1(v)
-if(u!=null){t=H.ow(v,z[v],u)
-if(t!=null){Object.defineProperty(u,init.dispatchPropertyName,{value:t,enumerable:false,writable:true,configurable:true})
-x.prototype=u}}}}for(w=0;w<y.length;++w){v=y[w]
-if(/^[A-Za-z_]/.test(v)){s=z[v]
-z["!"+v]=s
-z["~"+v]=s
-z["-"+v]=s
-z["+"+v]=s
-z["*"+v]=s}}},
-kO:function(){var z,y,x,w,v,u,t
-z=C.MA()
-z=H.ud(C.mp,H.ud(C.hQ,H.ud(C.XQ,H.ud(C.XQ,H.ud(C.M1,H.ud(C.lR,H.ud(C.ku(C.w2),z)))))))
-if(typeof dartNativeDispatchHooksTransformer!="undefined"){y=dartNativeDispatchHooksTransformer
-if(typeof y=="function")y=[y]
-if(y.constructor==Array)for(x=0;x<y.length;++x){w=y[x]
-if(typeof w=="function")z=w(z)||z}}v=z.getTag
-u=z.getUnknownTag
-t=z.prototypeForTag
-$.NF=new H.dC(v)
-$.TX=new H.VX(u)
-$.x7=new H.vZ(t)},
-ud:function(a,b){return a(b)||b},
-ZT:function(a,b){var z,y,x,w,v,u
-z=H.VM([],[P.ns])
-y=b.length
-x=a.length
-for(w=0;!0;){v=C.xB.XU(b,a,w)
-if(v===-1)break
-z.push(new H.Vo(v,b,a))
-u=v+x
-if(u===y)break
-else w=v===u?w+1:u}return z},
-b0:function(a,b,c){var z,y
-if(typeof b==="string")return C.xB.XU(a,b,c)!==-1
-else{z=J.x(b)
-if(!!z.$isVR){z=C.xB.yn(a,c)
-y=b.Ej
-return y.test(z)}else return J.yx(z.dd(b,C.xB.yn(a,c)))}},
-ys:function(a,b,c){var z,y,x,w
-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.vM+=w
-z.vM=w+c}return z.vM}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)},
-EP:function(){throw H.b(P.f("Cannot modify unmodifiable Map"))},
-u:function(a,b,c){return this.EP()},
-V1:function(a){return this.EP()},
-FV:function(a,b){return this.EP()},
-$isZ0:true},
-Px:{
-"^":"ysD;B>,HV,tc",
-x4:function(a){if(typeof a!=="string")return!1
-if("__proto__"===a)return!1
-return this.HV.hasOwnProperty(a)},
-t:function(a,b){if(!this.x4(b))return
-return this.TZ(b)},
-TZ:function(a){return this.HV[a]},
-aN:function(a,b){var z,y,x
-z=this.tc
-for(y=0;y<z.length;++y){x=z[y]
-b.$2(x,this.TZ(x))}},
-gvc:function(){return H.VM(new H.XR(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(this.tc,new H.hY(this),H.Kp(this,0),H.Kp(this,1))},
-$isyN:true},
-hY:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.TZ(a)},"$1",null,2,0,null,75,"call"],
-$isEH:true},
-XR:{
-"^":"mW;Y3",
-gA:function(a){return J.mY(this.Y3.tc)}},
-LI:{
-"^":"a;lK,uk,xI,rq,FX,Nc",
-gWa:function(){return this.lK},
-gUA:function(){return this.xI===0},
-gnd:function(){var z,y,x,w
-if(this.xI===1)return C.dn
-z=this.rq
-y=z.length-this.FX.length
-if(y===0)return C.dn
-x=[]
-for(w=0;w<y;++w){if(w>=z.length)return H.e(z,w)
-x.push(z[w])}x.immutable$list=!0
-x.fixed$length=!0
-return x},
-gVm:function(){var z,y,x,w,v,u,t,s
-if(this.xI!==0)return P.Fl(P.GD,null)
-z=this.FX
-y=z.length
-x=this.rq
-w=x.length-y
-if(y===0)return P.Fl(P.GD,null)
-v=P.L5(null,null,null,P.GD,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.IN(t),x[s])}return v},
-static:{"^":"hAw,oY,Y8"}},
-FD:{
-"^":"a;mr,Rn>,XZ,Rv,hG,Mo,AM,NE",
-XL:function(a){var z=this.Rn[a+this.hG+3]
-return init.metadata[z]},
-BX:function(a,b){var z=this.Rv
-if(typeof b!=="number")return b.C()
-if(b<z)return
-return this.Rn[3+b-z]},
-Fk:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.BX(0,a)
-return this.BX(0,this.e4(a-z))},
-KE:function(a){var z=this.Rv
-if(a<z)return
-if(!this.Mo||this.hG===1)return this.XL(a)
-return this.XL(this.e4(a-z))},
-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
-y=x.gvc()
-y=P.F(y,!0,H.ip(y,"mW",0))
-H.rd(y,null)
-H.bQ(y,new H.uV(z,this,x))}z=this.NE
-if(a<0||a>=z.length)return H.e(z,a)
-return z[a]},
-static:{"^":"t4,FV,OcN,H6",zh:function(a){var z,y,x
-z=a.$reflectionInfo
-if(z==null)return
-z.fixed$length=init
-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)}}},
-uV:{
-"^":"Tp:5;a,b,c",
-$1:function(a){var z,y,x
-z=this.b.NE
-y=this.a.a++
-x=this.c.t(0,a)
-if(y>=z.length)return H.e(z,y)
-z[y]=x},
-$isEH:true},
-Cj:{
-"^":"Tp:78;a,b,c",
-$2:function(a,b){var z=this.a
-z.b=z.b+"$"+H.d(a)
-this.c.push(a)
-this.b.push(b);++z.a},
-$isEH:true},
-u8:{
-"^":"Tp:78;a,b",
-$2:function(a,b){var z=this.b
-if(z.x4(a))z.u(0,a,b)
-else this.a.a=!0},
-$isEH:true},
-Zr:{
-"^":"a;bT,rq,Xs,Fa,Ga,cR",
-qS:function(a){var z,y,x
-z=new RegExp(this.bT).exec(a)
-if(z==null)return
-y={}
-x=this.rq
-if(x!==-1)y.arguments=z[x+1]
-x=this.Xs
-if(x!==-1)y.argumentsExpr=z[x+1]
-x=this.Fa
-if(x!==-1)y.expr=z[x+1]
-x=this.Ga
-if(x!==-1)y.method=z[x+1]
-x=this.cR
-if(x!==-1)y.receiver=z[x+1]
-return y},
-static:{"^":"lm,k1,Re,fN,qi,cz,BX,tt,dt,A7",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=[]
-y=z.indexOf("\\$arguments\\$")
-x=z.indexOf("\\$argumentsExpr\\$")
-w=z.indexOf("\\$expr\\$")
-v=z.indexOf("\\$method\\$")
-u=z.indexOf("\\$receiver\\$")
-return new H.Zr(a.replace('\\$arguments\\$','((?:x|[^x])*)').replace('\\$argumentsExpr\\$','((?:x|[^x])*)').replace('\\$expr\\$','((?:x|[^x])*)').replace('\\$method\\$','((?:x|[^x])*)').replace('\\$receiver\\$','((?:x|[^x])*)'),y,x,w,v,u)},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)}}},
-Zo:{
-"^":"XS;K9,Ga",
-bu:function(a){var z=this.Ga
-if(z==null)return"NullError: "+H.d(this.K9)
-return"NullError: Cannot call \""+H.d(z)+"\" on null"},
-$isJS:true,
-$isXS:true},
-u0:{
-"^":"XS;K9,Ga,cR",
-bu:function(a){var z,y
-z=this.Ga
-if(z==null)return"NoSuchMethodError: "+H.d(this.K9)
-y=this.cR
-if(y==null)return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" ("+H.d(this.K9)+")"
-return"NoSuchMethodError: Cannot call \""+H.d(z)+"\" on \""+H.d(y)+"\" ("+H.d(this.K9)+")"},
-$isJS:true,
-$isXS:true,
-static:{T3:function(a,b){var z,y
-z=b==null
-y=z?null:b.method
-z=z?null:b.receiver
-return new H.u0(a,y,z)}}},
-vV:{
-"^":"XS;K9",
-bu:function(a){var z=this.K9
-return C.xB.gl0(z)?"Error":"Error: "+z}},
-Am:{
-"^":"Tp:13;a",
-$1:function(a){if(!!J.x(a).$isXS)if(a.$thrownJsError==null)a.$thrownJsError=this.a
-return a},
-$isEH:true},
-XO:{
-"^":"a;lA,ui",
-bu:function(a){var z,y
-z=this.ui
-if(z!=null)return z
-z=this.lA
-y=typeof z==="object"?z.stack:null
-z=y==null?"":y
-this.ui=z
-return z}},
-dr:{
-"^":"Tp:69;a",
-$0:function(){return this.a.$0()},
-$isEH:true},
-TL:{
-"^":"Tp:69;b,c",
-$0:function(){return this.b.$1(this.c)},
-$isEH:true},
-uZ:{
-"^":"Tp:69;d,e,f",
-$0:function(){return this.d.$2(this.e,this.f)},
-$isEH:true},
-OQ:{
-"^":"Tp:69;UI,bK,Gq,Rm",
-$0:function(){return this.UI.$3(this.bK,this.Gq,this.Rm)},
-$isEH:true},
-Qx:{
-"^":"Tp:69;w3,HZ,mG,xC,cj",
-$0:function(){return this.w3.$4(this.HZ,this.mG,this.xC,this.cj)},
-$isEH:true},
-Tp:{
-"^":"a;",
-bu:function(a){return"Closure"},
-$isEH:true,
-gKu:function(){return this}},
-Bp:{
-"^":"Tp;"},
-v:{
-"^":"Bp;nw,jm,cR,RA",
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isv)return!1
-return this.nw===b.nw&&this.jm===b.jm&&this.cR===b.cR},
-giO:function(a){var z,y
-z=this.cR
-if(z==null)y=H.eQ(this.nw)
-else y=typeof z!=="object"?J.v1(z):H.eQ(z)
-return J.UN(y,H.eQ(this.jm))},
-$isv:true,
-static:{"^":"bf,P4",uj:function(a){return a.nw},HY:function(a){return a.cR},bO:function(){var z=$.bf
-if(z==null){z=H.B3("self")
-$.bf=z}return z},B3:function(a){var z,y,x,w,v
-z=new H.v("self","target","receiver","name")
-y=Object.getOwnPropertyNames(z)
-y.fixed$length=init
-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},
-$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))}}},
-bb:{
-"^":"XS;G1>",
-bu:function(a){return"RuntimeError: "+H.d(this.G1)},
-static:{Pa:function(a){return new H.bb(a)}}},
-lbp:{
-"^":"a;"},
-GN:{
-"^":"lbp;dw,Iq,is,p6",
-BD:function(a){var z=this.rP(a)
-return z==null?!1:H.J4(z,this.za())},
-rP:function(a){var z=J.x(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)
-if(!!x.$isnr)z.void=true
-else if(!x.$ishJ)z.ret=y.za()
-y=this.Iq
-if(y!=null&&y.length!==0)z.args=H.Dz(y)
-y=this.is
-if(y!=null&&y.length!==0)z.opt=H.Dz(y)
-y=this.p6
-if(y!=null){w={}
-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
-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
-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.p6
-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))},
-static:{"^":"Ot",Dz:function(a){var z,y,x
-a=a
-z=[]
-for(y=a.length,x=0;x<y;++x)z.push(a[x].za())
-return z}}},
-hJ:{
-"^":"lbp;",
-bu:function(a){return"dynamic"},
-za:function(){return},
-$ishJ:true},
-Fp:{
-"^":"lbp;oc>",
-za:function(){var z,y
-z=this.oc
-y=init.allClasses[z]
-if(y==null)throw H.b("no type for '"+H.d(z)+"'")
-return y},
-bu:function(a){return this.oc}},
-KEA:{
-"^":"lbp;oc>,re,Et",
-za:function(){var z,y
-z=this.Et
-if(z!=null)return z
-z=this.oc
-y=[init.allClasses[z]]
-if(0>=y.length)return H.e(y,0)
-if(y[0]==null)throw H.b("no type for '"+H.d(z)+"<...>'")
-for(z=this.re,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)y.push(z.lo.za())
-this.Et=y
-return y},
-bu:function(a){return H.d(this.oc)+"<"+J.Dn(this.re,", ")+">"}},
-cu:{
-"^":"a;LU,ke",
-bu:function(a){var z,y
-z=this.ke
-if(z!=null)return z
-y=this.LU.replace(/[^<,> ]+/g,function(b){return init.mangledGlobalNames[b]||b})
-this.ke=y
-return y},
-giO:function(a){return J.v1(this.LU)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iscu&&J.xC(this.LU,b.LU)},
-$iscu:true,
-$isuq:true},
-dC:{
-"^":"Tp:13;a",
-$1:function(a){return this.a(a)},
-$isEH:true},
-VX:{
-"^":"Tp:79;b",
-$2:function(a,b){return this.b(a,b)},
-$isEH:true},
-vZ:{
-"^":"Tp:5;c",
-$1:function(a){return this.c(a)},
-$isEH:true},
-VR:{
-"^":"a;zO,Ej,BT,xJ",
-gF4:function(){var z=this.BT
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO,z.multiline,!z.ignoreCase,!0)
-this.BT=z
-return z},
-gAT:function(){var z=this.xJ
-if(z!=null)return z
-z=this.Ej
-z=H.ol(this.zO+"|()",z.multiline,!z.ignoreCase,!0)
-this.xJ=z
-return z},
-ej:function(a){var z
-if(typeof a!=="string")H.vh(P.u(a))
-z=this.Ej.exec(a)
-if(z==null)return
-return H.Mr(this,z)},
-zD:function(a){if(typeof a!=="string")H.vh(P.u(a))
-return this.Ej.test(a)},
-dd:function(a,b){return new H.KW(this,b)},
-yk:function(a,b){var z,y
-z=this.gF4()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-return H.Mr(this,y)},
-Bh:function(a,b){var z,y,x,w
-z=this.gAT()
-z.lastIndex=b
-y=z.exec(a)
-if(y==null)return
-x=y.length
-w=x-1
-if(w<0)return H.e(y,w)
-if(y[w]!=null)return
-C.Nm.sB(y,w)
-return H.Mr(this,y)},
-wL:function(a,b,c){var z
-if(c>=0){z=J.q8(b)
-if(typeof z!=="number")return H.s(z)
-z=c>z}else z=!0
-if(z)throw H.b(P.TE(c,0,J.q8(b)))
-return this.Bh(b,c)},
-R4:function(a,b){return this.wL(a,b,0)},
-$isVR:true,
-$isSP:true,
-static:{ol:function(a,b,c,d){var z,y,x,w,v
-z=b?"m":""
-y=c?"":"i"
-x=d?"g":""
-w=function(){try{return new RegExp(a,z+y+x)}catch(u){return u}}()
-if(w instanceof RegExp)return w
-v=String(w)
-throw H.b(P.cD("Illegal RegExp pattern: "+a+", "+v))}}},
-AX:{
-"^":"a;zO,QK",
-t:function(a,b){var z=this.QK
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-VO:function(a,b){},
-$isns:true,
-static:{Mr:function(a,b){var z=new H.AX(a,b)
-z.VO(a,b)
-return z}}},
-KW:{
-"^":"mW;rN,rv",
-gA:function(a){return new H.Pb(this.rN,this.rv,null)},
-$asmW:function(){return[P.ns]},
-$asQV:function(){return[P.ns]}},
-Pb:{
-"^":"a;xz,rv,Wh",
-gl:function(){return this.Wh},
-G:function(){var z,y,x
-if(this.rv==null)return!1
-z=this.Wh
-if(z!=null){z=z.QK
-y=z.index
-if(0>=z.length)return H.e(z,0)
-z=J.q8(z[0])
-if(typeof z!=="number")return H.s(z)
-x=y+z
-if(this.Wh.QK.index===x)++x}else x=0
-z=this.xz.yk(this.rv,x)
-this.Wh=z
-if(z==null){this.rv=null
-return!1}return!0}},
-Vo:{
-"^":"a;M,f1,zO",
-t:function(a,b){if(!J.xC(b,0))H.vh(P.N(b))
-return this.zO},
-$isns:true}}],["action_link_element","package:observatory/src/elements/action_link.dart",,X,{
-"^":"",
-hV:{
-"^":"LPc;fi,dB,KW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gv8:function(a){return a.fi},
-sv8:function(a,b){a.fi=this.ct(a,C.S4,a.fi,b)},
-gFR:function(a){return a.dB},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.dB=this.ct(a,C.AV,a.dB,b)},
-gph:function(a){return a.KW},
-sph:function(a,b){a.KW=this.ct(a,C.hf,a.KW,b)},
-F6:[function(a,b,c,d){var z=a.fi
-if(z===!0)return
-if(a.dB!=null){a.fi=this.ct(a,C.S4,z,!0)
-this.LY(a,null).Qy(new X.jE(a))}},"$3","gNa",6,0,80,46,47,81],
-static:{zy:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fi=!1
-a.dB=null
-a.KW="action"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Df.ZL(a)
-C.Df.XI(a)
-return a}}},
-LPc:{
-"^":"xc+Pi;",
-$isd3:true},
-jE:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-z.fi=J.Q5(z,C.S4,z.fi,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["app","package:observatory/app.dart",,G,{
-"^":"",
-m7:[function(a){var z
-N.QM("").To("Google Charts API loaded")
-z=J.UQ(J.UQ($.Si(),"google"),"visualization")
-$.BY=z
-return z},"$1","vN",2,0,13,14],
-dj:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"},
-o1:function(a,b){var z
-for(z="";b>1;){--b
-if(a<Math.pow(10,b))z+="0"}return z+H.d(a)},
-le:[function(a){var z,y,x
-z=J.Wx(a)
-if(z.C(a,1000))return z.bu(a)
-y=z.Y(a,1000)
-a=z.Z(a,1000)
-x=G.o1(y,3)
-for(;z=J.Wx(a),z.D(a,1000);){x=G.o1(z.Y(a,1000),3)+","+x
-a=z.Z(a,1000)}return!z.n(a,0)?H.d(a)+","+x:x},"$1","kh",2,0,15],
-P0:function(a){var z,y,x,w
-z=C.CD.yu(C.CD.UD(a*1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-z=C.jn.Y(z,60000)
-w=C.jn.cU(z,1000)
-z=C.jn.Y(z,1000)
-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)},
-As:[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","YN",2,0,15,16],
-mG:function(a){var z,y,x,w
-if(a==null)return"-"
-z=J.LL(J.vX(a,1000))
-y=C.jn.cU(z,3600000)
-z=C.jn.Y(z,3600000)
-x=C.jn.cU(z,60000)
-w=C.jn.cU(C.jn.Y(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"},
-uG:{
-"^":"Pi;",
-gFL:function(a){return this.yF},
-$isuG:true},
-cZ:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){if(J.xC(a,""))return
-this.MR.wv.cv(a).ml(new G.zv(this))},
-VU:function(a){return!0}},
-zv:{
-"^":"Tp:13;a",
-$1:[function(a){J.h9(this.a.yF,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ez:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("class-tree",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){this.MR.wv.cv(J.ZZ(a,11)).ml(new G.yk(this))},
-VU:function(a){return J.co(a,"class-tree/")},
-static:{"^":"o9x"}},
-yk:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a.yF
-if(z!=null)J.uM(z,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-f2:{
-"^":"uG;MR,yF,AP,fn",
-zw:function(){if(this.yF==null){var z=W.r3("service-view",null)
-this.yF=F.Wi(this,C.GP,this.yF,z)}},
-DV:function(a){var z,y
-z=H.Go(this.yF,"$isTi")
-y=this.MR.EC
-z.Ll=J.Q5(z,C.td,z.Ll,y)},
-VU:function(a){return J.co(a,"error/")}},
-mL:{
-"^":"Pi;cE,Lh,cL,Z6,wv>,Eb,bn,EC,AP,fn",
-god:function(a){return this.Eb},
-sod:function(a,b){this.Eb=F.Wi(this,C.rB,this.Eb,b)},
-Da:function(){var z,y
-this.om()
-z=this.wv
-y=z.G2
-H.VM(new P.Ik(y),[H.Kp(y,0)]).yI(this.gbf())
-z=z.Li
-H.VM(new P.Ik(z),[H.Kp(z,0)]).yI(this.gXa())
-z=this.Z6
-$.W5=z
-z.ec=this
-y=H.VM(new W.RO(window,C.yf.Ph,!1),[null])
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(z.gjU()),y.Sg),[H.Kp(y,0)]).Zz()
-z.Cy()},
-om:function(){var z,y
-if(this.Lh!=null)return
-z=this.cE
-z.push(new G.Ez(this,null,null,null))
-z.push(new G.f2(this,null,null,null))
-y=new G.cZ(this,null,null,null)
-this.Lh=y
-z.push(y)},
-kj:[function(a){this.EC=a
-this.og("error/",null)},"$1","gbf",2,0,84,24],
-kI:[function(a){this.EC=a
-this.og("error/",null)},"$1","gXa",2,0,85,86],
-og:function(a,b){var z,y,x
-for(z=this.cE,y=0;y<z.length;++y){x=z[y]
-if(x.VU(a)){this.lJ(x)
-x.DV(a)
-return}}throw H.b(P.EY())},
-lJ:function(a){var z,y,x
-z="Installing "+J.AG(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)
-y=this.cL
-if(y==null?a==null:y===a)return
-if(y!=null){x=y.yF
-if(y.gnz(y)&&x!=null){x=new T.qI(y,C.GP,x,null)
-x.$builtinTypeInfo=[null]
-y.nq(y,x)}y.yF=null}a.zw()
-y=this.bn
-J.r4(y)
-y.appendChild(a.yF)
-this.cL=a},
-Ty:function(a){this.Da()},
-E0:function(a){this.Da()}},
-Kf:{
-"^":"a;Yb",
-goH:function(){return this.Yb.nQ("getNumberOfColumns")},
-gvp:function(a){return this.Yb.nQ("getNumberOfRows")},
-B7:function(){var z=this.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])},
-Id:function(a,b){var z=[]
-C.Nm.FV(z,J.kl(b,P.En()))
-this.Yb.V7("addRow",[H.VM(new P.Tz(z),[null])])}},
-qu:{
-"^":"a;vR,bG",
-W2:function(a){var z=P.jT(this.bG)
-this.vR.V7("draw",[a.Yb,z])}},
-yVe:{
-"^":"d3;",
-lU:function(a){var z,y,x
-if(J.rY(a).nC(a,"#"))a=C.xB.yn(a,1)
-if(C.xB.nC(a,"/"))a=C.xB.yn(a,1)
-if(C.xB.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)
-x=z[1]}else x=null}else x=null
-this.ec.og(a,x)},
-Bs:function(a,b,c){var z,y,x,w
-z=J.Vs(c).MW.getAttribute("href")
-y=J.RE(a)
-x=y.gpL(a)
-if(typeof x!=="number")return x.D()
-if(x>1||y.gNl(a)===!0||y.gEX(a)===!0||y.gqx(a)===!0||y.gGU(a)===!0)return
-x=$.W5
-w=x.c5
-if(w==null?z!=null:w!==z){N.QM("").To("Navigated to "+H.d(z))
-window.history.pushState(z,document.title,z)
-x.c5=z}x.lU(z)
-y.e6(a)}},
-OR:{
-"^":"yVe;hS,ec,c5,ro,dUC,pt",
-Cy:function(){var z=H.d(window.location.hash)
-if(window.location.hash===""||window.location.hash==="#")z="#"+this.hS
-window.history.pushState(z,document.title,z)
-this.lU(window.location.hash)},
-y0:[function(a){this.lU(window.location.hash)},"$1","gjU",2,0,87,14]},
-Y2:{
-"^":"Pi;eT>,yt<,ks>,oH<",
-gyX:function(a){return this.PU},
-gty:function(){return this.aZ},
-goE:function(a){return this.yq},
-soE:function(a,b){var z=J.xC(this.yq,b)
-this.yq=b
-if(!z){z=this.PU
-if(b===!0){this.PU=F.Wi(this,C.Ek,z,"\u21b3")
-this.C4(0)}else{this.PU=F.Wi(this,C.Ek,z,"\u2192")
-this.cO()}}},
-r8:function(){this.soE(0,this.yq!==!0)
-return this.yq},
-k7:function(a){if(!this.Nh())this.aZ=F.Wi(this,C.Pn,this.aZ,"visibility:hidden;")},
-$isY2:true},
-XN:{
-"^":"Pi;vp>,AP,fn",
-rT:function(a){var z,y
-z=this.vp
-y=J.w1(z)
-y.V1(z)
-a.C4(0)
-y.FV(z,a.ks)},
-qU:function(a){var z,y,x
-z=this.vp
-y=J.U6(z)
-x=y.t(z,a)
-if(x.r8()===!0)y.UG(z,y.u8(z,x)+1,J.Mx(x))
-else this.FS(x)},
-FS:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=J.q8(z.gks(a))
-if(y===0)return
-for(x=0;x<y;++x)if(J.Mz(J.UQ(z.gks(a),x))===!0)this.FS(J.UQ(z.gks(a),x))
-z.soE(a,!1)
-z=this.vp
-w=J.U6(z)
-v=w.u8(z,a)+1
-w.UZ(z,v,v+y)}},
-Kt:{
-"^":"a;ph>,OV<",
-static:{hg:[function(a){return a!=null?J.AG(a):"<null>"},"$1","Q8",2,0,17]}},
-Ni:{
-"^":"a;UQ>",
-$isNi:true},
-Vz0:{
-"^":"Pi;oH<,vp>,zz<",
-sxp:function(a){this.pT=a
-F.Wi(this,C.JB,0,1)},
-gxp:function(){return this.pT},
-gT3:function(){return this.jV},
-sT3:function(a){this.jV=a
-F.Wi(this,C.JB,0,1)},
-eE:function(a,b){var z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.UQ(J.U8o(z[a]),b)},
-PV:[function(a,b){var z=this.eE(a,this.pT)
-return J.oE(this.eE(b,this.pT),z)},"$2","gCS",4,0,88],
-zF:[function(a,b){return J.oE(this.eE(a,this.pT),this.eE(b,this.pT))},"$2","gAZ",4,0,88],
-Jd:function(a){var z,y
-new P.VV(1000000,null,null).wE(0)
-z=this.zz
-if(this.jV){y=this.gCS()
-H.rd(z,y)}else{y=this.gAZ()
-H.rd(z,y)}},
-B7: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)
-z.push(b)},
-Gu:function(a,b){var z,y
-z=this.vp
-if(a>=z.length)return H.e(z,a)
-y=J.UQ(J.U8o(z[a]),b)
-z=this.oH
-if(b>=z.length)return H.e(z,b)
-return z[b].gOV().$1(y)},
-Qs:[function(a){var z
-if(!J.xC(a,this.pT)){z=this.oH
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.ew(J.Q4(z[a]),"\u2003")}z=this.oH
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-z=J.Q4(z[a])
-return J.ew(z,this.jV?"\u25bc":"\u25b2")},"$1","gCO",2,0,15,89]}}],["app_bootstrap","index_devtools.html_bootstrap.dart",,E,{
-"^":"",
-Jz:[function(){var z,y,x,w,v
-z=P.EF([C.aP,new E.em(),C.IH,new E.Lb(),C.cg,new E.QA(),C.ET,new E.Cv(),C.WC,new E.ed(),C.S4,new E.wa(),C.Ro,new E.Or(),C.hN,new E.YL(),C.AV,new E.wf(),C.bV,new E.Oa(),C.C0,new E.emv(),C.eZ,new E.Lbd(),C.bk,new E.QAa(),C.lH,new E.CvS(),C.kG,new E.edy(),C.OI,new E.waE(),C.To,new E.Ore(),C.XA,new E.YLa(),C.i4,new E.wfa(),C.qt,new E.Oaa(),C.p1,new E.e0(),C.yL,new E.e1(),C.bJ,new E.e2(),C.ox,new E.e3(),C.Je,new E.e4(),C.iE,new E.e5(),C.f4,new E.e6(),C.VK,new E.e7(),C.aH,new E.e8(),C.aK,new E.e9(),C.GP,new E.e10(),C.vs,new E.e11(),C.Gr,new E.e12(),C.TU,new E.e13(),C.tP,new E.e14(),C.yh,new E.e15(),C.Zb,new E.e16(),C.u7,new E.e17(),C.ne,new E.e18(),C.B0,new E.e19(),C.r1,new E.e20(),C.mr,new E.e21(),C.Ek,new E.e22(),C.Pn,new E.e23(),C.YT,new E.e24(),C.h7,new E.e25(),C.R3,new E.e26(),C.WQ,new E.e27(),C.fV,new E.e28(),C.jU,new E.e29(),C.Gd,new E.e30(),C.OO,new E.e31(),C.Mc,new E.e32(),C.FP,new E.e33(),C.kF,new E.e34(),C.UD,new E.e35(),C.Aq,new E.e36(),C.DS,new E.e37(),C.C9,new E.e38(),C.VF,new E.e39(),C.uU,new E.e40(),C.YJ,new E.e41(),C.eF,new E.e42(),C.oI,new E.e43(),C.ST,new E.e44(),C.QH,new E.e45(),C.qX,new E.e46(),C.rE,new E.e47(),C.nf,new E.e48(),C.pO,new E.e49(),C.EI,new E.e50(),C.JB,new E.e51(),C.d4,new E.e52(),C.cF,new E.e53(),C.Ql,new E.e54(),C.SI,new E.e55(),C.zS,new E.e56(),C.YA,new E.e57(),C.ak,new E.e58(),C.Ge,new E.e59(),C.He,new E.e60(),C.Ss,new E.e61(),C.k6,new E.e62(),C.oj,new E.e63(),C.PJ,new E.e64(),C.q2,new E.e65(),C.d2,new E.e66(),C.kN,new E.e67(),C.fn,new E.e68(),C.yB,new E.e69(),C.eJ,new E.e70(),C.iG,new E.e71(),C.Py,new E.e72(),C.pC,new E.e73(),C.uu,new E.e74(),C.qs,new E.e75(),C.XH,new E.e76(),C.I9,new E.e77(),C.C1,new E.e78(),C.a0,new E.e79(),C.Yg,new E.e80(),C.bR,new E.e81(),C.ai,new E.e82(),C.ob,new E.e83(),C.Iv,new E.e84(),C.Wg,new E.e85(),C.tD,new E.e86(),C.nZ,new E.e87(),C.Of,new E.e88(),C.pY,new E.e89(),C.XL,new E.e90(),C.LA,new E.e91(),C.Lk,new E.e92(),C.dK,new E.e93(),C.xf,new E.e94(),C.rB,new E.e95(),C.bz,new E.e96(),C.Jx,new E.e97(),C.b5,new E.e98(),C.Lc,new E.e99(),C.hf,new E.e100(),C.uk,new E.e101(),C.Zi,new E.e102(),C.TN,new E.e103(),C.kA,new E.e104(),C.GI,new E.e105(),C.Wn,new E.e106(),C.ur,new E.e107(),C.VN,new E.e108(),C.EV,new E.e109(),C.VI,new E.e110(),C.eh,new E.e111(),C.r6,new E.e112(),C.MW,new E.e113(),C.SA,new E.e114(),C.kV,new E.e115(),C.vp,new E.e116(),C.cc,new E.e117(),C.DY,new E.e118(),C.Lx,new E.e119(),C.M3,new E.e120(),C.wT,new E.e121(),C.SR,new E.e122(),C.t6,new E.e123(),C.rP,new E.e124(),C.pX,new E.e125(),C.VD,new E.e126(),C.NN,new E.e127(),C.UX,new E.e128(),C.YS,new E.e129(),C.pu,new E.e130(),C.BJ,new E.e131(),C.td,new E.e132(),C.Gn,new E.e133(),C.zO,new E.e134(),C.vg,new E.e135(),C.Ys,new E.e136(),C.zm,new E.e137(),C.XM,new E.e138(),C.Ic,new E.e139(),C.yG,new E.e140(),C.uI,new E.e141(),C.tW,new E.e142(),C.CG,new E.e143(),C.Wj,new E.e144(),C.vb,new E.e145(),C.UL,new E.e146(),C.AY,new E.e147(),C.QK,new E.e148(),C.AO,new E.e149(),C.I7,new E.e150(),C.xP,new E.e151(),C.Wm,new E.e152(),C.GR,new E.e153(),C.KX,new E.e154(),C.ja,new E.e155(),C.Dj,new E.e156(),C.ir,new E.e157(),C.dx,new E.e158(),C.ni,new E.e159(),C.X2,new E.e160(),C.F3,new E.e161(),C.UY,new E.e162(),C.Aa,new E.e163(),C.nY,new E.e164(),C.tg,new E.e165(),C.HD,new E.e166(),C.iU,new E.e167(),C.eN,new E.e168(),C.ue,new E.e169(),C.nh,new E.e170(),C.L2,new E.e171(),C.Gs,new E.e172(),C.bE,new E.e173(),C.YD,new E.e174(),C.PX,new E.e175(),C.N8,new E.e176(),C.EA,new E.e177(),C.oW,new E.e178(),C.hd,new E.e179(),C.pH,new E.e180(),C.Ve,new E.e181(),C.jM,new E.e182(),C.nt,new E.e183(),C.PM,new E.e184(),C.xA,new E.e185(),C.k5,new E.e186(),C.Nv,new E.e187(),C.Cw,new E.e188(),C.TW,new E.e189(),C.xS,new E.e190(),C.mi,new E.e191(),C.zz,new E.e192(),C.hO,new E.e193(),C.ei,new E.e194(),C.HK,new E.e195(),C.je,new E.e196(),C.Ef,new E.e197(),C.Q1,new E.e198(),C.ID,new E.e199(),C.z6,new E.e200(),C.bc,new E.e201(),C.kw,new E.e202(),C.ep,new E.e203(),C.J2,new E.e204(),C.zU,new E.e205(),C.bn,new E.e206(),C.mh,new E.e207(),C.Fh,new E.e208(),C.LP,new E.e209(),C.jh,new E.e210(),C.fj,new E.e211(),C.xw,new E.e212(),C.zn,new E.e213(),C.RJ,new E.e214(),C.Tc,new E.e215(),C.YE,new E.e216(),C.Uy,new E.e217()],null,null)
-y=P.EF([C.aP,new E.e218(),C.cg,new E.e219(),C.S4,new E.e220(),C.AV,new E.e221(),C.bk,new E.e222(),C.lH,new E.e223(),C.kG,new E.e224(),C.XA,new E.e225(),C.i4,new E.e226(),C.yL,new E.e227(),C.bJ,new E.e228(),C.VK,new E.e229(),C.aH,new E.e230(),C.vs,new E.e231(),C.Gr,new E.e232(),C.tP,new E.e233(),C.yh,new E.e234(),C.Zb,new E.e235(),C.ne,new E.e236(),C.B0,new E.e237(),C.mr,new E.e238(),C.YT,new E.e239(),C.WQ,new E.e240(),C.jU,new E.e241(),C.Gd,new E.e242(),C.OO,new E.e243(),C.Mc,new E.e244(),C.QH,new E.e245(),C.rE,new E.e246(),C.nf,new E.e247(),C.Ql,new E.e248(),C.ak,new E.e249(),C.Ge,new E.e250(),C.He,new E.e251(),C.oj,new E.e252(),C.d2,new E.e253(),C.fn,new E.e254(),C.Py,new E.e255(),C.uu,new E.e256(),C.qs,new E.e257(),C.a0,new E.e258(),C.rB,new E.e259(),C.Lc,new E.e260(),C.hf,new E.e261(),C.uk,new E.e262(),C.Zi,new E.e263(),C.TN,new E.e264(),C.kA,new E.e265(),C.ur,new E.e266(),C.EV,new E.e267(),C.eh,new E.e268(),C.SA,new E.e269(),C.kV,new E.e270(),C.vp,new E.e271(),C.SR,new E.e272(),C.t6,new E.e273(),C.UX,new E.e274(),C.YS,new E.e275(),C.td,new E.e276(),C.zO,new E.e277(),C.Ys,new E.e278(),C.XM,new E.e279(),C.Ic,new E.e280(),C.tW,new E.e281(),C.Wj,new E.e282(),C.vb,new E.e283(),C.QK,new E.e284(),C.AO,new E.e285(),C.xP,new E.e286(),C.GR,new E.e287(),C.KX,new E.e288(),C.ja,new E.e289(),C.Dj,new E.e290(),C.X2,new E.e291(),C.UY,new E.e292(),C.Aa,new E.e293(),C.nY,new E.e294(),C.tg,new E.e295(),C.HD,new E.e296(),C.iU,new E.e297(),C.eN,new E.e298(),C.Gs,new E.e299(),C.bE,new E.e300(),C.YD,new E.e301(),C.PX,new E.e302(),C.pH,new E.e303(),C.Ve,new E.e304(),C.jM,new E.e305(),C.nt,new E.e306(),C.PM,new E.e307(),C.Nv,new E.e308(),C.Cw,new E.e309(),C.TW,new E.e310(),C.mi,new E.e311(),C.zz,new E.e312(),C.z6,new E.e313(),C.kw,new E.e314(),C.zU,new E.e315(),C.RJ,new E.e316(),C.YE,new E.e317()],null,null)
-x=P.EF([C.K4,C.qJ,C.yS,C.Mt,C.OG,C.il,C.nw,C.Mt,C.xE,C.Mt,C.oT,C.il,C.jR,C.Mt,C.Lg,C.qJ,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.BL,C.Mt,C.lE,C.al,C.te,C.Mt,C.iD,C.Mt,C.Ju,C.Mt,C.Wz,C.il,C.MI,C.Mt,C.pF,C.il,C.Wh,C.Mt,C.qF,C.Mt,C.nX,C.il,C.Zj,C.Mt,C.Ep,C.Mt,C.dD,C.al,C.hP,C.Mt,C.tc,C.Mt,C.rR,C.il,C.oG,C.Mt,C.Jf,C.il,C.EZ,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.Ey,C.Mt,C.km,C.Mt,C.vw,C.Mt,C.LT,C.Mt,C.NW,C.l4,C.ms,C.Mt,C.FA,C.Mt,C.JW,C.Mt,C.Mf,C.Mt,C.Dl,C.Mt,C.l4,C.jw,C.ON,C.Mt,C.Sb,C.al,C.Th,C.Mt,C.wH,C.Mt,C.pK,C.Mt,C.il,C.Mt,C.X8,C.Mt,C.Y3,C.qJ,C.NR,C.Mt,C.vu,C.Mt,C.cK,C.il,C.jK,C.Mt,C.qJ,C.jw,C.Mt,C.l4,C.al,C.il],null,null)
-w=P.EF([C.K4,P.EF([C.S4,C.FB,C.AV,C.Qp,C.hf,C.V0],null,null),C.yS,P.EF([C.UX,C.Pt],null,null),C.OG,C.CM,C.nw,P.EF([C.rB,C.hR,C.bz,C.Bk],null,null),C.xE,P.EF([C.XA,C.xY,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.Lg,P.EF([C.S4,C.FB,C.AV,C.Qp,C.B0,C.b6,C.r1,C.nP,C.mr,C.HE],null,null),C.KO,P.EF([C.yh,C.zd],null,null),C.wk,P.EF([C.AV,C.fr,C.eh,C.rH,C.Aa,C.Uz,C.mi,C.yV],null,null),C.jA,P.EF([C.S4,C.FB,C.AV,C.Qp,C.YT,C.LC,C.hf,C.V0,C.UY,C.n6],null,null),C.Jo,C.CM,C.Az,P.EF([C.WQ,C.ah],null,null),C.Vx,P.EF([C.OO,C.Cf],null,null),C.BL,P.EF([C.Mc,C.f0],null,null),C.lE,P.EF([C.Ql,C.TJ,C.ak,C.yI,C.a0,C.P9,C.QK,C.Yo,C.Wm,C.QW],null,null),C.te,P.EF([C.nf,C.V3,C.pO,C.au,C.Lc,C.Pc,C.AO,C.fi],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.hR,C.Zi,C.xx,C.TN,C.Gj,C.vb,C.Mq,C.UL,C.mM],null,null),C.Wz,C.CM,C.MI,P.EF([C.fn,C.fz,C.XM,C.Tt,C.tg,C.DC],null,null),C.pF,C.CM,C.Wh,P.EF([C.yL,C.j5],null,null),C.qF,P.EF([C.vp,C.o0],null,null),C.nX,C.CM,C.Zj,P.EF([C.oj,C.GT],null,null),C.Ep,P.EF([C.vp,C.o0],null,null),C.dD,P.EF([C.pH,C.Fk],null,null),C.hP,P.EF([C.Wj,C.Ah],null,null),C.tc,P.EF([C.vp,C.o0],null,null),C.rR,C.CM,C.oG,P.EF([C.jU,C.bw],null,null),C.Jf,C.CM,C.EZ,P.EF([C.vp,C.o0],null,null),C.FG,C.CM,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,C.CM,C.Xv,P.EF([C.YE,C.Wl],null,null),C.ce,P.EF([C.aH,C.dq,C.He,C.oV,C.vb,C.Mq,C.UL,C.mM,C.Dj,C.Ay,C.Gs,C.iO,C.bE,C.h3,C.YD,C.fP,C.TW,C.H0,C.xS,C.bB,C.zz,C.lS],null,null),C.UJ,C.CM,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.hr,C.rP,C.Nt],null,null),C.lp,C.CM,C.PT,P.EF([C.EV,C.ZQ],null,null),C.Ey,P.EF([C.XA,C.DZ,C.uk,C.p4],null,null),C.km,P.EF([C.rB,C.RU,C.bz,C.Bk,C.uk,C.p4],null,null),C.vw,P.EF([C.uk,C.p4,C.EV,C.ZQ],null,null),C.LT,P.EF([C.Ys,C.Ce],null,null),C.NW,C.CM,C.ms,P.EF([C.cg,C.ll,C.uk,C.p4,C.kV,C.vz],null,null),C.FA,P.EF([C.cg,C.ll,C.kV,C.vz],null,null),C.JW,P.EF([C.aP,C.xD,C.AV,C.Qp,C.hf,C.V0],null,null),C.Mf,P.EF([C.uk,C.p4],null,null),C.Dl,P.EF([C.VK,C.Od],null,null),C.l4,C.CM,C.ON,P.EF([C.vs,C.MP,C.Gr,C.VJ,C.TU,C.Cp,C.SA,C.KI,C.tW,C.kH,C.CG,C.Ml,C.PX,C.jz,C.N8,C.qE,C.nt,C.VS],null,null),C.Sb,P.EF([C.tW,C.kH,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.rZ],null,null),C.il,P.EF([C.uu,C.yY,C.xP,C.TO,C.Wm,C.QW],null,null),C.X8,P.EF([C.td,C.Zk,C.Gn,C.az],null,null),C.Y3,P.EF([C.bk,C.Ud,C.lH,C.dG,C.zU,C.uT],null,null),C.NR,P.EF([C.rE,C.KS],null,null),C.vu,P.EF([C.kw,C.oC],null,null),C.cK,C.CM,C.jK,P.EF([C.yh,C.m2,C.RJ,C.BP],null,null)],null,null)
-v=O.ty(new O.Oj(z,y,x,w,C.CM,P.EF([C.aP,"active",C.IH,"address",C.cg,"anchor",C.ET,"assertsEnabled",C.WC,"bpt",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.kG,"classTable",C.OI,"classes",C.To,"closing",C.XA,"cls",C.i4,"code",C.qt,"coloring",C.p1,"columns",C.yL,"connection",C.bJ,"counters",C.ox,"countersChanged",C.Je,"current",C.iE,"descriptor",C.f4,"descriptors",C.VK,"devtools",C.aH,"displayCutoff",C.aK,"doAction",C.GP,"element",C.vs,"endLine",C.Gr,"endPos",C.TU,"endPosChanged",C.tP,"entry",C.yh,"error",C.Zb,"eval",C.u7,"evalNow",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.WQ,"field",C.fV,"fields",C.jU,"file",C.Gd,"firstTokenPos",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.pO,"functionChanged",C.EI,"functions",C.JB,"getColumnLabel",C.d4,"goto",C.cF,"gotoLink",C.Ql,"hasClass",C.SI,"hasDescriptors",C.zS,"hasDisassembly",C.YA,"hasNoAllocations",C.ak,"hasParent",C.Ge,"hashLinkWorkaround",C.He,"hideTagsChecked",C.Ss,"hits",C.k6,"hoverText",C.oj,"httpServer",C.PJ,"human",C.q2,"idle",C.d2,"imp",C.kN,"imports",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.I9,"isBool",C.C1,"isComment",C.a0,"isDart",C.Yg,"isDartCode",C.bR,"isDouble",C.ai,"isEmpty",C.ob,"isError",C.Iv,"isInstance",C.Wg,"isInt",C.tD,"isList",C.nZ,"isNotEmpty",C.Of,"isNull",C.pY,"isOptimized",C.XL,"isPatch",C.LA,"isPipe",C.Lk,"isString",C.dK,"isType",C.xf,"isUnexpected",C.rB,"isolate",C.bz,"isolateChanged",C.Jx,"isolates",C.b5,"jumpTarget",C.Lc,"kind",C.hf,"label",C.uk,"last",C.Zi,"lastAccumulatorReset",C.TN,"lastServiceGC",C.kA,"lastTokenPos",C.GI,"lastUpdate",C.Wn,"length",C.ur,"lib",C.VN,"libraries",C.EV,"library",C.VI,"line",C.eh,"lineMode",C.r6,"lineNumber",C.MW,"lineNumbers",C.SA,"lines",C.kV,"link",C.vp,"list",C.cc,"listening",C.DY,"loading",C.Lx,"localAddress",C.M3,"localPort",C.wT,"mainPort",C.SR,"map",C.t6,"mapAsString",C.rP,"mapChanged",C.pX,"message",C.VD,"mouseOut",C.NN,"mouseOver",C.UX,"msg",C.YS,"name",C.pu,"nameIsEmpty",C.BJ,"newSpace",C.td,"object",C.Gn,"objectChanged",C.zO,"objectPool",C.vg,"oldSpace",C.Ys,"pad",C.zm,"padding",C.XM,"path",C.Ic,"pause",C.yG,"pauseEvent",C.uI,"pid",C.tW,"pos",C.CG,"posChanged",C.Wj,"process",C.vb,"profile",C.UL,"profileChanged",C.AY,"protocol",C.QK,"qualified",C.AO,"qualifiedName",C.I7,"readClosed",C.xP,"ref",C.Wm,"refChanged",C.GR,"refresh",C.KX,"refreshCoverage",C.ja,"refreshGC",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.Gs,"sampleCount",C.bE,"sampleDepth",C.YD,"sampleRate",C.PX,"script",C.N8,"scriptChanged",C.EA,"scripts",C.oW,"selectExpr",C.hd,"serviceType",C.pH,"small",C.Ve,"socket",C.jM,"socketOwner",C.nt,"startLine",C.PM,"status",C.xA,"styleForHits",C.k5,"subClasses",C.Nv,"subclass",C.Cw,"superClass",C.TW,"tagSelector",C.xS,"tagSelectorChanged",C.mi,"text",C.zz,"timeSpan",C.hO,"tipExclusive",C.ei,"tipKind",C.HK,"tipParent",C.je,"tipTicks",C.Ef,"tipTime",C.Q1,"toggleExpand",C.ID,"toggleExpanded",C.z6,"tokenPos",C.bc,"topFrame",C.kw,"trace",C.ep,"tree",C.J2,"typeChecksEnabled",C.zU,"uncheckedText",C.bn,"updateLineMode",C.mh,"uptime",C.Fh,"url",C.LP,"used",C.jh,"v",C.fj,"variable",C.xw,"variables",C.zn,"version",C.RJ,"vm",C.Tc,"vmName",C.YE,"webSocket",C.Uy,"writeClosed"],null,null),!1))
-$.j8=new O.fH(z,y,C.CM)
-$.Yv=new O.bY(x,w,!1)
-$.qe=v
-$.M6=[new E.e318(),new E.e319(),new E.e320(),new E.e321(),new E.e322(),new E.e323(),new E.e324(),new E.e325(),new E.e326(),new E.e327(),new E.e328(),new E.e329(),new E.e330(),new E.e331(),new E.e332(),new E.e333(),new E.e334(),new E.e335(),new E.e336(),new E.e337(),new E.e338(),new E.e339(),new E.e340(),new E.e341(),new E.e342(),new E.e343(),new E.e344(),new E.e345(),new E.e346(),new E.e347(),new E.e348(),new E.e349(),new E.e350(),new E.e351(),new E.e352(),new E.e353(),new E.e354(),new E.e355(),new E.e356(),new E.e357(),new E.e358(),new E.e359(),new E.e360(),new E.e361(),new E.e362(),new E.e363(),new E.e364(),new E.e365(),new E.e366(),new E.e367(),new E.e368(),new E.e369(),new E.e370(),new E.e371(),new E.e372(),new E.e373(),new E.e374(),new E.e375(),new E.e376(),new E.e377(),new E.e378(),new E.e379(),new E.e380(),new E.e381(),new E.e382(),new E.e383(),new E.e384(),new E.e385(),new E.e386(),new E.e387(),new E.e388(),new E.e389(),new E.e390(),new E.e391()]
-$.UG=!0
-F.E2()},"$0","V7",0,0,18],
-em:{
-"^":"Tp:13;",
-$1:function(a){return J.Jp(a)},
-$isEH:true},
-Lb:{
-"^":"Tp:13;",
-$1:function(a){return a.gYu()},
-$isEH:true},
-QA:{
-"^":"Tp:13;",
-$1:function(a){return J.Ln(a)},
-$isEH:true},
-Cv:{
-"^":"Tp:13;",
-$1:function(a){return a.gA3()},
-$isEH:true},
-ed:{
-"^":"Tp:13;",
-$1:function(a){return a.gqr()},
-$isEH:true},
-wa:{
-"^":"Tp:13;",
-$1:function(a){return J.nG(a)},
-$isEH:true},
-Or:{
-"^":"Tp:13;",
-$1:function(a){return J.aA(a)},
-$isEH:true},
-YL:{
-"^":"Tp:13;",
-$1:function(a){return a.gfj()},
-$isEH:true},
-wf:{
-"^":"Tp:13;",
-$1:function(a){return J.WT(a)},
-$isEH:true},
-Oa:{
-"^":"Tp:13;",
-$1:function(a){return a.gCs()},
-$isEH:true},
-emv:{
-"^":"Tp:13;",
-$1:function(a){return J.Wp(a)},
-$isEH:true},
-Lbd:{
-"^":"Tp:13;",
-$1:function(a){return J.n9(a)},
-$isEH:true},
-QAa:{
-"^":"Tp:13;",
-$1:function(a){return J.K0(a)},
-$isEH:true},
-CvS:{
-"^":"Tp:13;",
-$1:function(a){return J.hn(a)},
-$isEH:true},
-edy:{
-"^":"Tp:13;",
-$1:function(a){return J.yz(a)},
-$isEH:true},
-waE:{
-"^":"Tp:13;",
-$1:function(a){return J.pP(a)},
-$isEH:true},
-Ore:{
-"^":"Tp:13;",
-$1:function(a){return a.gaP()},
-$isEH:true},
-YLa:{
-"^":"Tp:13;",
-$1:function(a){return J.E3(a)},
-$isEH:true},
-wfa:{
-"^":"Tp:13;",
-$1:function(a){return J.on(a)},
-$isEH:true},
-Oaa:{
-"^":"Tp:13;",
-$1:function(a){return J.SM(a)},
-$isEH:true},
-e0:{
-"^":"Tp:13;",
-$1:function(a){return a.goH()},
-$isEH:true},
-e1:{
-"^":"Tp:13;",
-$1:function(a){return J.xe(a)},
-$isEH:true},
-e2:{
-"^":"Tp:13;",
-$1:function(a){return J.OT(a)},
-$isEH:true},
-e3:{
-"^":"Tp:13;",
-$1:function(a){return J.Ok(a)},
-$isEH:true},
-e4:{
-"^":"Tp:13;",
-$1:function(a){return a.gl()},
-$isEH:true},
-e5:{
-"^":"Tp:13;",
-$1:function(a){return a.gSL()},
-$isEH:true},
-e6:{
-"^":"Tp:13;",
-$1:function(a){return a.guH()},
-$isEH:true},
-e7:{
-"^":"Tp:13;",
-$1:function(a){return J.mP(a)},
-$isEH:true},
-e8:{
-"^":"Tp:13;",
-$1:function(a){return J.BT(a)},
-$isEH:true},
-e9:{
-"^":"Tp:13;",
-$1:function(a){return J.vi(a)},
-$isEH:true},
-e10:{
-"^":"Tp:13;",
-$1:function(a){return J.nq(a)},
-$isEH:true},
-e11:{
-"^":"Tp:13;",
-$1:function(a){return J.k0(a)},
-$isEH:true},
-e12:{
-"^":"Tp:13;",
-$1:function(a){return J.rw(a)},
-$isEH:true},
-e13:{
-"^":"Tp:13;",
-$1:function(a){return J.wt(a)},
-$isEH:true},
-e14:{
-"^":"Tp:13;",
-$1:function(a){return a.gw2()},
-$isEH:true},
-e15:{
-"^":"Tp:13;",
-$1:function(a){return J.w8(a)},
-$isEH:true},
-e16:{
-"^":"Tp:13;",
-$1:function(a){return J.is(a)},
-$isEH:true},
-e17:{
-"^":"Tp:13;",
-$1:function(a){return J.yi(a)},
-$isEH:true},
-e18:{
-"^":"Tp:13;",
-$1:function(a){return J.Vl(a)},
-$isEH:true},
-e19:{
-"^":"Tp:13;",
-$1:function(a){return J.kE(a)},
-$isEH:true},
-e20:{
-"^":"Tp:13;",
-$1:function(a){return J.Gl(a)},
-$isEH:true},
-e21:{
-"^":"Tp:13;",
-$1:function(a){return J.Mz(a)},
-$isEH:true},
-e22:{
-"^":"Tp:13;",
-$1:function(a){return J.nb(a)},
-$isEH:true},
-e23:{
-"^":"Tp:13;",
-$1:function(a){return a.gty()},
-$isEH:true},
-e24:{
-"^":"Tp:13;",
-$1:function(a){return J.yn(a)},
-$isEH:true},
-e25:{
-"^":"Tp:13;",
-$1:function(a){return a.gMX()},
-$isEH:true},
-e26:{
-"^":"Tp:13;",
-$1:function(a){return a.gkE()},
-$isEH:true},
-e27:{
-"^":"Tp:13;",
-$1:function(a){return J.pm(a)},
-$isEH:true},
-e28:{
-"^":"Tp:13;",
-$1:function(a){return a.gtJ()},
-$isEH:true},
-e29:{
-"^":"Tp:13;",
-$1:function(a){return J.Ec(a)},
-$isEH:true},
-e30:{
-"^":"Tp:13;",
-$1:function(a){return a.ghY()},
-$isEH:true},
-e31:{
-"^":"Tp:13;",
-$1:function(a){return J.ra(a)},
-$isEH:true},
-e32:{
-"^":"Tp:13;",
-$1:function(a){return J.QZ(a)},
-$isEH:true},
-e33:{
-"^":"Tp:13;",
-$1:function(a){return J.WX(a)},
-$isEH:true},
-e34:{
-"^":"Tp:13;",
-$1:function(a){return J.JD(a)},
-$isEH:true},
-e35:{
-"^":"Tp:13;",
-$1:function(a){return a.gZd()},
-$isEH:true},
-e36:{
-"^":"Tp:13;",
-$1:function(a){return J.lT(a)},
-$isEH:true},
-e37:{
-"^":"Tp:13;",
-$1:function(a){return J.M4(a)},
-$isEH:true},
-e38:{
-"^":"Tp:13;",
-$1:function(a){return a.gkA()},
-$isEH:true},
-e39:{
-"^":"Tp:13;",
-$1:function(a){return a.gGK()},
-$isEH:true},
-e40:{
-"^":"Tp:13;",
-$1:function(a){return a.gan()},
-$isEH:true},
-e41:{
-"^":"Tp:13;",
-$1:function(a){return a.gcQ()},
-$isEH:true},
-e42:{
-"^":"Tp:13;",
-$1:function(a){return a.gS7()},
-$isEH:true},
-e43:{
-"^":"Tp:13;",
-$1:function(a){return a.gJz()},
-$isEH:true},
-e44:{
-"^":"Tp:13;",
-$1:function(a){return J.PY(a)},
-$isEH:true},
-e45:{
-"^":"Tp:13;",
-$1:function(a){return J.bu(a)},
-$isEH:true},
-e46:{
-"^":"Tp:13;",
-$1:function(a){return J.VL(a)},
-$isEH:true},
-e47:{
-"^":"Tp:13;",
-$1:function(a){return J.zN(a)},
-$isEH:true},
-e48:{
-"^":"Tp:13;",
-$1:function(a){return J.m4(a)},
-$isEH:true},
-e49:{
-"^":"Tp:13;",
-$1:function(a){return J.v8(a)},
-$isEH:true},
-e50:{
-"^":"Tp:13;",
-$1:function(a){return a.gmu()},
-$isEH:true},
-e51:{
-"^":"Tp:13;",
-$1:function(a){return a.gCO()},
-$isEH:true},
-e52:{
-"^":"Tp:13;",
-$1:function(a){return J.eU(a)},
-$isEH:true},
-e53:{
-"^":"Tp:13;",
-$1:function(a){return J.DB(a)},
-$isEH:true},
-e54:{
-"^":"Tp:13;",
-$1:function(a){return J.wO(a)},
-$isEH:true},
-e55:{
-"^":"Tp:13;",
-$1:function(a){return a.gGf()},
-$isEH:true},
-e56:{
-"^":"Tp:13;",
-$1:function(a){return a.gUa()},
-$isEH:true},
-e57:{
-"^":"Tp:13;",
-$1:function(a){return a.gMp()},
-$isEH:true},
-e58:{
-"^":"Tp:13;",
-$1:function(a){return J.u1(a)},
-$isEH:true},
-e59:{
-"^":"Tp:13;",
-$1:function(a){return J.z3(a)},
-$isEH:true},
-e60:{
-"^":"Tp:13;",
-$1:function(a){return J.YQ(a)},
-$isEH:true},
-e61:{
-"^":"Tp:13;",
-$1:function(a){return a.gu9()},
-$isEH:true},
-e62:{
-"^":"Tp:13;",
-$1:function(a){return J.fA(a)},
-$isEH:true},
-e63:{
-"^":"Tp:13;",
-$1:function(a){return J.cd(a)},
-$isEH:true},
-e64:{
-"^":"Tp:13;",
-$1:function(a){return a.gL4()},
-$isEH:true},
-e65:{
-"^":"Tp:13;",
-$1:function(a){return a.gaj()},
-$isEH:true},
-e66:{
-"^":"Tp:13;",
-$1:function(a){return a.giq()},
-$isEH:true},
-e67:{
-"^":"Tp:13;",
-$1:function(a){return a.gBm()},
-$isEH:true},
-e68:{
-"^":"Tp:13;",
-$1:function(a){return J.xR(a)},
-$isEH:true},
-e69:{
-"^":"Tp:13;",
-$1:function(a){return a.gWt()},
-$isEH:true},
-e70:{
-"^":"Tp:13;",
-$1:function(a){return a.gNI()},
-$isEH:true},
-e71:{
-"^":"Tp:13;",
-$1:function(a){return a.gva()},
-$isEH:true},
-e72:{
-"^":"Tp:13;",
-$1:function(a){return a.gKt()},
-$isEH:true},
-e73:{
-"^":"Tp:13;",
-$1:function(a){return a.gp2()},
-$isEH:true},
-e74:{
-"^":"Tp:13;",
-$1:function(a){return J.UU(a)},
-$isEH:true},
-e75:{
-"^":"Tp:13;",
-$1:function(a){return J.Ew(a)},
-$isEH:true},
-e76:{
-"^":"Tp:13;",
-$1:function(a){return a.gVM()},
-$isEH:true},
-e77:{
-"^":"Tp:13;",
-$1:function(a){return J.Ja(a)},
-$isEH:true},
-e78:{
-"^":"Tp:13;",
-$1:function(a){return a.gUB()},
-$isEH:true},
-e79:{
-"^":"Tp:13;",
-$1:function(a){return J.pd(a)},
-$isEH:true},
-e80:{
-"^":"Tp:13;",
-$1:function(a){return a.gkU()},
-$isEH:true},
-e81:{
-"^":"Tp:13;",
-$1:function(a){return J.wz(a)},
-$isEH:true},
-e82:{
-"^":"Tp:13;",
-$1:function(a){return J.FN(a)},
-$isEH:true},
-e83:{
-"^":"Tp:13;",
-$1:function(a){return J.ls(a)},
-$isEH:true},
-e84:{
-"^":"Tp:13;",
-$1:function(a){return J.yq(a)},
-$isEH:true},
-e85:{
-"^":"Tp:13;",
-$1:function(a){return J.SZ(a)},
-$isEH:true},
-e86:{
-"^":"Tp:13;",
-$1:function(a){return J.DL(a)},
-$isEH:true},
-e87:{
-"^":"Tp:13;",
-$1:function(a){return J.yx(a)},
-$isEH:true},
-e88:{
-"^":"Tp:13;",
-$1:function(a){return J.cU(a)},
-$isEH:true},
-e89:{
-"^":"Tp:13;",
-$1:function(a){return a.gYG()},
-$isEH:true},
-e90:{
-"^":"Tp:13;",
-$1:function(a){return a.gi2()},
-$isEH:true},
-e91:{
-"^":"Tp:13;",
-$1:function(a){return a.gHY()},
-$isEH:true},
-e92:{
-"^":"Tp:13;",
-$1:function(a){return J.UM(a)},
-$isEH:true},
-e93:{
-"^":"Tp:13;",
-$1:function(a){return J.ZN(a)},
-$isEH:true},
-e94:{
-"^":"Tp:13;",
-$1:function(a){return J.xa(a)},
-$isEH:true},
-e95:{
-"^":"Tp:13;",
-$1:function(a){return J.aT(a)},
-$isEH:true},
-e96:{
-"^":"Tp:13;",
-$1:function(a){return J.hb(a)},
-$isEH:true},
-e97:{
-"^":"Tp:13;",
-$1:function(a){return a.giR()},
-$isEH:true},
-e98:{
-"^":"Tp:13;",
-$1:function(a){return a.gEB()},
-$isEH:true},
-e99:{
-"^":"Tp:13;",
-$1:function(a){return J.Iz(a)},
-$isEH:true},
-e100:{
-"^":"Tp:13;",
-$1:function(a){return J.Q4(a)},
-$isEH:true},
-e101:{
-"^":"Tp:13;",
-$1:function(a){return J.MQ(a)},
-$isEH:true},
-e102:{
-"^":"Tp:13;",
-$1:function(a){return J.tx(a)},
-$isEH:true},
-e103:{
-"^":"Tp:13;",
-$1:function(a){return J.IR(a)},
-$isEH:true},
-e104:{
-"^":"Tp:13;",
-$1:function(a){return a.gSK()},
-$isEH:true},
-e105:{
-"^":"Tp:13;",
-$1:function(a){return a.gPE()},
-$isEH:true},
-e106:{
-"^":"Tp:13;",
-$1:function(a){return J.q8(a)},
-$isEH:true},
-e107:{
-"^":"Tp:13;",
-$1:function(a){return a.ghX()},
-$isEH:true},
-e108:{
-"^":"Tp:13;",
-$1:function(a){return a.gvU()},
-$isEH:true},
-e109:{
-"^":"Tp:13;",
-$1:function(a){return J.jl(a)},
-$isEH:true},
-e110:{
-"^":"Tp:13;",
-$1:function(a){return a.gRd()},
-$isEH:true},
-e111:{
-"^":"Tp:13;",
-$1:function(a){return J.zY(a)},
-$isEH:true},
-e112:{
-"^":"Tp:13;",
-$1:function(a){return J.Fd(a)},
-$isEH:true},
-e113:{
-"^":"Tp:13;",
-$1:function(a){return J.oZ(a)},
-$isEH:true},
-e114:{
-"^":"Tp:13;",
-$1:function(a){return J.de(a)},
-$isEH:true},
-e115:{
-"^":"Tp:13;",
-$1:function(a){return J.Ds(a)},
-$isEH:true},
-e116:{
-"^":"Tp:13;",
-$1:function(a){return J.cO(a)},
-$isEH:true},
-e117:{
-"^":"Tp:13;",
-$1:function(a){return a.gzM()},
-$isEH:true},
-e118:{
-"^":"Tp:13;",
-$1:function(a){return a.gjz()},
-$isEH:true},
-e119:{
-"^":"Tp:13;",
-$1:function(a){return a.giP()},
-$isEH:true},
-e120:{
-"^":"Tp:13;",
-$1:function(a){return a.gLw()},
-$isEH:true},
-e121:{
-"^":"Tp:13;",
-$1:function(a){return a.geH()},
-$isEH:true},
-e122:{
-"^":"Tp:13;",
-$1:function(a){return J.Yf(a)},
-$isEH:true},
-e123:{
-"^":"Tp:13;",
-$1:function(a){return J.kv(a)},
-$isEH:true},
-e124:{
-"^":"Tp:13;",
-$1:function(a){return J.ih(a)},
-$isEH:true},
-e125:{
-"^":"Tp:13;",
-$1:function(a){return J.z2(a)},
-$isEH:true},
-e126:{
-"^":"Tp:13;",
-$1:function(a){return J.ZL(a)},
-$isEH:true},
-e127:{
-"^":"Tp:13;",
-$1:function(a){return J.ba(a)},
-$isEH:true},
-e128:{
-"^":"Tp:13;",
-$1:function(a){return J.Zv(a)},
-$isEH:true},
-e129:{
-"^":"Tp:13;",
-$1:function(a){return J.O6(a)},
-$isEH:true},
-e130:{
-"^":"Tp:13;",
-$1:function(a){return J.HO(a)},
-$isEH:true},
-e131:{
-"^":"Tp:13;",
-$1:function(a){return a.gUY()},
-$isEH:true},
-e132:{
-"^":"Tp:13;",
-$1:function(a){return J.Jj(a)},
-$isEH:true},
-e133:{
-"^":"Tp:13;",
-$1:function(a){return J.t8(a)},
-$isEH:true},
-e134:{
-"^":"Tp:13;",
-$1:function(a){return a.gL1()},
-$isEH:true},
-e135:{
-"^":"Tp:13;",
-$1:function(a){return a.gxQ()},
-$isEH:true},
-e136:{
-"^":"Tp:13;",
-$1:function(a){return J.EC(a)},
-$isEH:true},
-e137:{
-"^":"Tp:13;",
-$1:function(a){return J.JG(a)},
-$isEH:true},
-e138:{
-"^":"Tp:13;",
-$1:function(a){return J.AF(a)},
-$isEH:true},
-e139:{
-"^":"Tp:13;",
-$1:function(a){return J.LB(a)},
-$isEH:true},
-e140:{
-"^":"Tp:13;",
-$1:function(a){return J.Kl(a)},
-$isEH:true},
-e141:{
-"^":"Tp:13;",
-$1:function(a){return a.gU6()},
-$isEH:true},
-e142:{
-"^":"Tp:13;",
-$1:function(a){return J.io(a)},
-$isEH:true},
-e143:{
-"^":"Tp:13;",
-$1:function(a){return J.fy(a)},
-$isEH:true},
-e144:{
-"^":"Tp:13;",
-$1:function(a){return J.Qa(a)},
-$isEH:true},
-e145:{
-"^":"Tp:13;",
-$1:function(a){return J.ks(a)},
-$isEH:true},
-e146:{
-"^":"Tp:13;",
-$1:function(a){return J.CN(a)},
-$isEH:true},
-e147:{
-"^":"Tp:13;",
-$1:function(a){return J.WM(a)},
-$isEH:true},
-e148:{
-"^":"Tp:13;",
-$1:function(a){return J.ul(a)},
-$isEH:true},
-e149:{
-"^":"Tp:13;",
-$1:function(a){return J.Sz(a)},
-$isEH:true},
-e150:{
-"^":"Tp:13;",
-$1:function(a){return a.gm8()},
-$isEH:true},
-e151:{
-"^":"Tp:13;",
-$1:function(a){return J.BZ(a)},
-$isEH:true},
-e152:{
-"^":"Tp:13;",
-$1:function(a){return J.Dd(a)},
-$isEH:true},
-e153:{
-"^":"Tp:13;",
-$1:function(a){return J.Cm(a)},
-$isEH:true},
-e154:{
-"^":"Tp:13;",
-$1:function(a){return J.fU(a)},
-$isEH:true},
-e155:{
-"^":"Tp:13;",
-$1:function(a){return J.GH(a)},
-$isEH:true},
-e156:{
-"^":"Tp:13;",
-$1:function(a){return J.QX(a)},
-$isEH:true},
-e157:{
-"^":"Tp:13;",
-$1:function(a){return a.gLc()},
-$isEH:true},
-e158:{
-"^":"Tp:13;",
-$1:function(a){return a.gNS()},
-$isEH:true},
-e159:{
-"^":"Tp:13;",
-$1:function(a){return a.guh()},
-$isEH:true},
-e160:{
-"^":"Tp:13;",
-$1:function(a){return J.iL(a)},
-$isEH:true},
-e161:{
-"^":"Tp:13;",
-$1:function(a){return J.k7(a)},
-$isEH:true},
-e162:{
-"^":"Tp:13;",
-$1:function(a){return J.uW(a)},
-$isEH:true},
-e163:{
-"^":"Tp:13;",
-$1:function(a){return J.W2(a)},
-$isEH:true},
-e164:{
-"^":"Tp:13;",
-$1:function(a){return J.UT(a)},
-$isEH:true},
-e165:{
-"^":"Tp:13;",
-$1:function(a){return J.Kd(a)},
-$isEH:true},
-e166:{
-"^":"Tp:13;",
-$1:function(a){return J.pU(a)},
-$isEH:true},
-e167:{
-"^":"Tp:13;",
-$1:function(a){return J.jo(a)},
-$isEH:true},
-e168:{
-"^":"Tp:13;",
-$1:function(a){return a.gVc()},
-$isEH:true},
-e169:{
-"^":"Tp:13;",
-$1:function(a){return a.gpF()},
-$isEH:true},
-e170:{
-"^":"Tp:13;",
-$1:function(a){return J.TY(a)},
-$isEH:true},
-e171:{
-"^":"Tp:13;",
-$1:function(a){return a.gA6()},
-$isEH:true},
-e172:{
-"^":"Tp:13;",
-$1:function(a){return J.Ry(a)},
-$isEH:true},
-e173:{
-"^":"Tp:13;",
-$1:function(a){return J.UP(a)},
-$isEH:true},
-e174:{
-"^":"Tp:13;",
-$1:function(a){return J.fw(a)},
-$isEH:true},
-e175:{
-"^":"Tp:13;",
-$1:function(a){return J.zH(a)},
-$isEH:true},
-e176:{
-"^":"Tp:13;",
-$1:function(a){return J.Vi(a)},
-$isEH:true},
-e177:{
-"^":"Tp:13;",
-$1:function(a){return a.gXR()},
-$isEH:true},
-e178:{
-"^":"Tp:13;",
-$1:function(a){return J.P5(a)},
-$isEH:true},
-e179:{
-"^":"Tp:13;",
-$1:function(a){return a.gzS()},
-$isEH:true},
-e180:{
-"^":"Tp:13;",
-$1:function(a){return J.U8(a)},
-$isEH:true},
-e181:{
-"^":"Tp:13;",
-$1:function(a){return J.oN(a)},
-$isEH:true},
-e182:{
-"^":"Tp:13;",
-$1:function(a){return a.gV8()},
-$isEH:true},
-e183:{
-"^":"Tp:13;",
-$1:function(a){return J.HB(a)},
-$isEH:true},
-e184:{
-"^":"Tp:13;",
-$1:function(a){return J.jB(a)},
-$isEH:true},
-e185:{
-"^":"Tp:13;",
-$1:function(a){return J.J0(a)},
-$isEH:true},
-e186:{
-"^":"Tp:13;",
-$1:function(a){return a.gS5()},
-$isEH:true},
-e187:{
-"^":"Tp:13;",
-$1:function(a){return a.gDo()},
-$isEH:true},
-e188:{
-"^":"Tp:13;",
-$1:function(a){return a.guj()},
-$isEH:true},
-e189:{
-"^":"Tp:13;",
-$1:function(a){return J.j1(a)},
-$isEH:true},
-e190:{
-"^":"Tp:13;",
-$1:function(a){return J.Aw(a)},
-$isEH:true},
-e191:{
-"^":"Tp:13;",
-$1:function(a){return J.dY(a)},
-$isEH:true},
-e192:{
-"^":"Tp:13;",
-$1:function(a){return J.OL(a)},
-$isEH:true},
-e193:{
-"^":"Tp:13;",
-$1:function(a){return a.gki()},
-$isEH:true},
-e194:{
-"^":"Tp:13;",
-$1:function(a){return a.gZn()},
-$isEH:true},
-e195:{
-"^":"Tp:13;",
-$1:function(a){return a.gvs()},
-$isEH:true},
-e196:{
-"^":"Tp:13;",
-$1:function(a){return a.gVh()},
-$isEH:true},
-e197:{
-"^":"Tp:13;",
-$1:function(a){return a.gZX()},
-$isEH:true},
-e198:{
-"^":"Tp:13;",
-$1:function(a){return J.SG(a)},
-$isEH:true},
-e199:{
-"^":"Tp:13;",
-$1:function(a){return J.L7(a)},
-$isEH:true},
-e200:{
-"^":"Tp:13;",
-$1:function(a){return a.gVF()},
-$isEH:true},
-e201:{
-"^":"Tp:13;",
-$1:function(a){return a.gkw()},
-$isEH:true},
-e202:{
-"^":"Tp:13;",
-$1:function(a){return J.K2(a)},
-$isEH:true},
-e203:{
-"^":"Tp:13;",
-$1:function(a){return J.uy(a)},
-$isEH:true},
-e204:{
-"^":"Tp:13;",
-$1:function(a){return a.gEy()},
-$isEH:true},
-e205:{
-"^":"Tp:13;",
-$1:function(a){return J.XJ(a)},
-$isEH:true},
-e206:{
-"^":"Tp:13;",
-$1:function(a){return J.Sl(a)},
-$isEH:true},
-e207:{
-"^":"Tp:13;",
-$1:function(a){return a.gJk()},
-$isEH:true},
-e208:{
-"^":"Tp:13;",
-$1:function(a){return J.Nl(a)},
-$isEH:true},
-e209:{
-"^":"Tp:13;",
-$1:function(a){return a.gSU()},
-$isEH:true},
-e210:{
-"^":"Tp:13;",
-$1:function(a){return a.gFc()},
-$isEH:true},
-e211:{
-"^":"Tp:13;",
-$1:function(a){return a.gYY()},
-$isEH:true},
-e212:{
-"^":"Tp:13;",
-$1:function(a){return a.gZ3()},
-$isEH:true},
-e213:{
-"^":"Tp:13;",
-$1:function(a){return J.ry(a)},
-$isEH:true},
-e214:{
-"^":"Tp:13;",
-$1:function(a){return J.I2(a)},
-$isEH:true},
-e215:{
-"^":"Tp:13;",
-$1:function(a){return a.gdN()},
-$isEH:true},
-e216:{
-"^":"Tp:13;",
-$1:function(a){return J.tp(a)},
-$isEH:true},
-e217:{
-"^":"Tp:13;",
-$1:function(a){return a.gaU()},
-$isEH:true},
-e218:{
-"^":"Tp:77;",
-$2:function(a,b){J.RX(a,b)},
-$isEH:true},
-e219:{
-"^":"Tp:77;",
-$2:function(a,b){J.a8(a,b)},
-$isEH:true},
-e220:{
-"^":"Tp:77;",
-$2:function(a,b){J.l7(a,b)},
-$isEH:true},
-e221:{
-"^":"Tp:77;",
-$2:function(a,b){J.kB(a,b)},
-$isEH:true},
-e222:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ae(a,b)},
-$isEH:true},
-e223:{
-"^":"Tp:77;",
-$2:function(a,b){J.IX(a,b)},
-$isEH:true},
-e224:{
-"^":"Tp:77;",
-$2:function(a,b){J.WI(a,b)},
-$isEH:true},
-e225:{
-"^":"Tp:77;",
-$2:function(a,b){J.NZ(a,b)},
-$isEH:true},
-e226:{
-"^":"Tp:77;",
-$2:function(a,b){J.T5(a,b)},
-$isEH:true},
-e227:{
-"^":"Tp:77;",
-$2:function(a,b){J.i0(a,b)},
-$isEH:true},
-e228:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sf(a,b)},
-$isEH:true},
-e229:{
-"^":"Tp:77;",
-$2:function(a,b){J.LM(a,b)},
-$isEH:true},
-e230:{
-"^":"Tp:77;",
-$2:function(a,b){J.qq(a,b)},
-$isEH:true},
-e231:{
-"^":"Tp:77;",
-$2:function(a,b){J.Ac(a,b)},
-$isEH:true},
-e232:{
-"^":"Tp:77;",
-$2:function(a,b){J.Yz(a,b)},
-$isEH:true},
-e233:{
-"^":"Tp:77;",
-$2:function(a,b){a.sw2(b)},
-$isEH:true},
-e234:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qr(a,b)},
-$isEH:true},
-e235:{
-"^":"Tp:77;",
-$2:function(a,b){J.xW(a,b)},
-$isEH:true},
-e236:{
-"^":"Tp:77;",
-$2:function(a,b){J.BC(a,b)},
-$isEH:true},
-e237:{
-"^":"Tp:77;",
-$2:function(a,b){J.pB(a,b)},
-$isEH:true},
-e238:{
-"^":"Tp:77;",
-$2:function(a,b){J.NO(a,b)},
-$isEH:true},
-e239:{
-"^":"Tp:77;",
-$2:function(a,b){J.WB(a,b)},
-$isEH:true},
-e240:{
-"^":"Tp:77;",
-$2:function(a,b){J.JZ(a,b)},
-$isEH:true},
-e241:{
-"^":"Tp:77;",
-$2:function(a,b){J.fR(a,b)},
-$isEH:true},
-e242:{
-"^":"Tp:77;",
-$2:function(a,b){a.shY(b)},
-$isEH:true},
-e243:{
-"^":"Tp:77;",
-$2:function(a,b){J.uP(a,b)},
-$isEH:true},
-e244:{
-"^":"Tp:77;",
-$2:function(a,b){J.vJ(a,b)},
-$isEH:true},
-e245:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nf(a,b)},
-$isEH:true},
-e246:{
-"^":"Tp:77;",
-$2:function(a,b){J.Pl(a,b)},
-$isEH:true},
-e247:{
-"^":"Tp:77;",
-$2:function(a,b){J.C3(a,b)},
-$isEH:true},
-e248:{
-"^":"Tp:77;",
-$2:function(a,b){J.xH(a,b)},
-$isEH:true},
-e249:{
-"^":"Tp:77;",
-$2:function(a,b){J.Nh(a,b)},
-$isEH:true},
-e250:{
-"^":"Tp:77;",
-$2:function(a,b){J.AI(a,b)},
-$isEH:true},
-e251:{
-"^":"Tp:77;",
-$2:function(a,b){J.nA(a,b)},
-$isEH:true},
-e252:{
-"^":"Tp:77;",
-$2:function(a,b){J.fb(a,b)},
-$isEH:true},
-e253:{
-"^":"Tp:77;",
-$2:function(a,b){a.siq(b)},
-$isEH:true},
-e254:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qy(a,b)},
-$isEH:true},
-e255:{
-"^":"Tp:77;",
-$2:function(a,b){a.sKt(b)},
-$isEH:true},
-e256:{
-"^":"Tp:77;",
-$2:function(a,b){J.cV(a,b)},
-$isEH:true},
-e257:{
-"^":"Tp:77;",
-$2:function(a,b){J.mU(a,b)},
-$isEH:true},
-e258:{
-"^":"Tp:77;",
-$2:function(a,b){J.Kz(a,b)},
-$isEH:true},
-e259:{
-"^":"Tp:77;",
-$2:function(a,b){J.uM(a,b)},
-$isEH:true},
-e260:{
-"^":"Tp:77;",
-$2:function(a,b){J.Er(a,b)},
-$isEH:true},
-e261:{
-"^":"Tp:77;",
-$2:function(a,b){J.uX(a,b)},
-$isEH:true},
-e262:{
-"^":"Tp:77;",
-$2:function(a,b){J.hS(a,b)},
-$isEH:true},
-e263:{
-"^":"Tp:77;",
-$2:function(a,b){J.mz(a,b)},
-$isEH:true},
-e264:{
-"^":"Tp:77;",
-$2:function(a,b){J.pA(a,b)},
-$isEH:true},
-e265:{
-"^":"Tp:77;",
-$2:function(a,b){a.sSK(b)},
-$isEH:true},
-e266:{
-"^":"Tp:77;",
-$2:function(a,b){a.shX(b)},
-$isEH:true},
-e267:{
-"^":"Tp:77;",
-$2:function(a,b){J.cl(a,b)},
-$isEH:true},
-e268:{
-"^":"Tp:77;",
-$2:function(a,b){J.Jb(a,b)},
-$isEH:true},
-e269:{
-"^":"Tp:77;",
-$2:function(a,b){J.xQ(a,b)},
-$isEH:true},
-e270:{
-"^":"Tp:77;",
-$2:function(a,b){J.MX(a,b)},
-$isEH:true},
-e271:{
-"^":"Tp:77;",
-$2:function(a,b){J.A4(a,b)},
-$isEH:true},
-e272:{
-"^":"Tp:77;",
-$2:function(a,b){J.wD(a,b)},
-$isEH:true},
-e273:{
-"^":"Tp:77;",
-$2:function(a,b){J.wJ(a,b)},
-$isEH:true},
-e274:{
-"^":"Tp:77;",
-$2:function(a,b){J.oJ(a,b)},
-$isEH:true},
-e275:{
-"^":"Tp:77;",
-$2:function(a,b){J.DF(a,b)},
-$isEH:true},
-e276:{
-"^":"Tp:77;",
-$2:function(a,b){J.h9(a,b)},
-$isEH:true},
-e277:{
-"^":"Tp:77;",
-$2:function(a,b){a.sL1(b)},
-$isEH:true},
-e278:{
-"^":"Tp:77;",
-$2:function(a,b){J.XF(a,b)},
-$isEH:true},
-e279:{
-"^":"Tp:77;",
-$2:function(a,b){J.SF(a,b)},
-$isEH:true},
-e280:{
-"^":"Tp:77;",
-$2:function(a,b){J.Qv(a,b)},
-$isEH:true},
-e281:{
-"^":"Tp:77;",
-$2:function(a,b){J.Xg(a,b)},
-$isEH:true},
-e282:{
-"^":"Tp:77;",
-$2:function(a,b){J.aw(a,b)},
-$isEH:true},
-e283:{
-"^":"Tp:77;",
-$2:function(a,b){J.CJ(a,b)},
-$isEH:true},
-e284:{
-"^":"Tp:77;",
-$2:function(a,b){J.P2(a,b)},
-$isEH:true},
-e285:{
-"^":"Tp:77;",
-$2:function(a,b){J.fv(a,b)},
-$isEH:true},
-e286:{
-"^":"Tp:77;",
-$2:function(a,b){J.PP(a,b)},
-$isEH:true},
-e287:{
-"^":"Tp:77;",
-$2:function(a,b){J.Sj(a,b)},
-$isEH:true},
-e288:{
-"^":"Tp:77;",
-$2:function(a,b){J.tv(a,b)},
-$isEH:true},
-e289:{
-"^":"Tp:77;",
-$2:function(a,b){J.w7(a,b)},
-$isEH:true},
-e290:{
-"^":"Tp:77;",
-$2:function(a,b){J.ME(a,b)},
-$isEH:true},
-e291:{
-"^":"Tp:77;",
-$2:function(a,b){J.kX(a,b)},
-$isEH:true},
-e292:{
-"^":"Tp:77;",
-$2:function(a,b){J.q0(a,b)},
-$isEH:true},
-e293:{
-"^":"Tp:77;",
-$2:function(a,b){J.EJ(a,b)},
-$isEH:true},
-e294:{
-"^":"Tp:77;",
-$2:function(a,b){J.iH(a,b)},
-$isEH:true},
-e295:{
-"^":"Tp:77;",
-$2:function(a,b){J.SO(a,b)},
-$isEH:true},
-e296:{
-"^":"Tp:77;",
-$2:function(a,b){J.B9(a,b)},
-$isEH:true},
-e297:{
-"^":"Tp:77;",
-$2:function(a,b){J.PN(a,b)},
-$isEH:true},
-e298:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVc(b)},
-$isEH:true},
-e299:{
-"^":"Tp:77;",
-$2:function(a,b){J.By(a,b)},
-$isEH:true},
-e300:{
-"^":"Tp:77;",
-$2:function(a,b){J.jd(a,b)},
-$isEH:true},
-e301:{
-"^":"Tp:77;",
-$2:function(a,b){J.Rx(a,b)},
-$isEH:true},
-e302:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZI(a,b)},
-$isEH:true},
-e303:{
-"^":"Tp:77;",
-$2:function(a,b){J.fa(a,b)},
-$isEH:true},
-e304:{
-"^":"Tp:77;",
-$2:function(a,b){J.Cu(a,b)},
-$isEH:true},
-e305:{
-"^":"Tp:77;",
-$2:function(a,b){a.sV8(b)},
-$isEH:true},
-e306:{
-"^":"Tp:77;",
-$2:function(a,b){J.Hn(a,b)},
-$isEH:true},
-e307:{
-"^":"Tp:77;",
-$2:function(a,b){J.Tx(a,b)},
-$isEH:true},
-e308:{
-"^":"Tp:77;",
-$2:function(a,b){a.sDo(b)},
-$isEH:true},
-e309:{
-"^":"Tp:77;",
-$2:function(a,b){a.suj(b)},
-$isEH:true},
-e310:{
-"^":"Tp:77;",
-$2:function(a,b){J.H3(a,b)},
-$isEH:true},
-e311:{
-"^":"Tp:77;",
-$2:function(a,b){J.t3(a,b)},
-$isEH:true},
-e312:{
-"^":"Tp:77;",
-$2:function(a,b){J.my(a,b)},
-$isEH:true},
-e313:{
-"^":"Tp:77;",
-$2:function(a,b){a.sVF(b)},
-$isEH:true},
-e314:{
-"^":"Tp:77;",
-$2:function(a,b){J.yO(a,b)},
-$isEH:true},
-e315:{
-"^":"Tp:77;",
-$2:function(a,b){J.ZU(a,b)},
-$isEH:true},
-e316:{
-"^":"Tp:77;",
-$2:function(a,b){J.tQ(a,b)},
-$isEH:true},
-e317:{
-"^":"Tp:77;",
-$2:function(a,b){J.tH(a,b)},
-$isEH:true},
-e318:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("curly-block",C.Lg)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e319:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-element",C.l4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e320:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-ref",C.il)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e321:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-ref",C.Wz)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e322:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("action-link",C.K4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e323:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-bar",C.LT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e324:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu",C.ms)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e325:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-menu-item",C.FA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e326:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-refresh",C.JW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e327:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("nav-control",C.NW)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e328:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("top-nav-menu",C.Mf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e329:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-nav-menu",C.km)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e330:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-nav-menu",C.vw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e331:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-nav-menu",C.Ey)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e332:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("breakpoint-list",C.yS)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e333:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-ref",C.OG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e334:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-tree",C.nw)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e335:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-box",C.wk)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e336:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("eval-link",C.jA)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e337:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-ref",C.Jo)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e338:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-ref",C.lE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e339:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-ref",C.lp)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e340:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-ref",C.Sb)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e341:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("class-view",C.xE)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e342:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-ref",C.oT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e343:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("code-view",C.jR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e344:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("error-view",C.KO)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e345:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("field-view",C.Az)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e346:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-frame",C.NR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e347:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-list",C.BL)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e348:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("flag-item",C.Vx)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e349:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-inset",C.ON)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e350:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("function-view",C.te)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e351:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-map",C.iD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e352:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-view",C.tU)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e353:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-ref",C.Jf)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e354:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-list-view",C.qF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e355:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-ref",C.nX)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e356:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-view",C.Zj)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e357:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-view",C.Wh)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e358:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-http-server-connection-ref",C.pF)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e359:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-ref",C.FG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e360:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-list-view",C.EZ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e361:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-socket-view",C.pJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e362:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-ref",C.Yy)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e363:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-list-view",C.DD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e364:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-web-socket-view",C.Xv)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e365:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-list-view",C.tc)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e366:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-ref",C.rR)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e367:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-random-access-file-view",C.oG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e368:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-list-view",C.Ep)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e369:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-ref",C.dD)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e370:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("io-process-view",C.hP)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e371:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-ref",C.UJ)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e372:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-summary",C.CT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e373:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-run-state",C.j4)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e374:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-location",C.Io)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e375:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-shared-summary",C.EG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e376:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-counter-chart",C.ca)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e377:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-view",C.mq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e378:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("instance-view",C.MI)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e379:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("json-view",C.Tq)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e380:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("library-view",C.PT)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e381:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("heap-profile",C.Ju)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e382:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("sliding-checkbox",C.Y3)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e383:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("isolate-profile",C.ce)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e384:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("script-view",C.Th)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e385:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("stack-trace",C.vu)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e386:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-view",C.jK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e387:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-view",C.X8)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e388:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("observatory-application",C.Dl)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e389:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-exception-view",C.pK)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e390:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("service-error-view",C.wH)},"$0",null,0,0,null,"call"],
-$isEH:true},
-e391:{
-"^":"Tp:69;",
-$0:[function(){return A.Ad("vm-ref",C.cK)},"$0",null,0,0,null,"call"],
-$isEH:true}},1],["breakpoint_list_element","package:observatory/src/elements/breakpoint_list.dart",,B,{
-"^":"",
-G6:{
-"^":"Vc;BW,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-grs:function(a){return a.BW},
-srs:function(a,b){a.BW=this.ct(a,C.UX,a.BW,b)},
-RF:[function(a,b){J.r0(a.BW).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dw:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.C8.ZL(a)
-C.C8.XI(a)
-return a}}},
-Vc:{
-"^":"uL+Pi;",
-$isd3:true}}],["class_ref_element","package:observatory/src/elements/class_ref.dart",,Q,{
-"^":"",
-eW:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rt:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.YZz.ZL(a)
-C.YZz.XI(a)
-return a}}}}],["class_tree_element","package:observatory/src/elements/class_tree.dart",,O,{
-"^":"",
-CZ:{
-"^":"Y2;od>,Ru>,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-C4:function(a){var z,y,x,w,v,u,t
-z=this.ks
-if(z.length>0)return
-for(y=J.mY(J.Mx(this.Ru)),x=this.od,w=this.yt+1;y.G();){v=y.gl()
-if(v.gi2()===!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;")
-u.$builtinTypeInfo=[null]
-t.nq(t,u)}t.aZ="visibility:hidden;"}z.push(t)}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.Ru))>0}},
-eo:{
-"^":"Vfx;CA,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(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","gQ1",2,0,13,57],
-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)
-u.k7(null)
-z=u
-w=J.Mx(z)
-v=a.CA
-t=z
-s=H.VM([],[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.k7(t)
-w.push(s)
-a.Hm.rT(z)}catch(q){w=H.Ru(q)
-y=w
-x=new H.XO(q,null)
-N.QM("").xH("_update",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
-z=J.Lp(d)
-if(!!J.x(z).$istV)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{l0:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RD.ZL(a)
-C.RD.XI(a)
-return a}}},
-Vfx:{
-"^":"uL+Pi;",
-$isd3:true},
-nc:{
-"^":"Tp:13;a",
-$1:[function(a){J.oD(this.a,a)},"$1",null,2,0,null,96,"call"],
-$isEH:true}}],["class_view_element","package:observatory/src/elements/class_view.dart",,Z,{
-"^":"",
-aC:{
-"^":"Dsd;yB,mN,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gRu:function(a){return a.yB},
-sRu:function(a,b){a.yB=this.ct(a,C.XA,a.yB,b)},
-gCF:function(a){return a.mN},
-sCF:function(a,b){a.mN=this.ct(a,C.tg,a.mN,b)},
-vV:[function(a,b){return a.yB.cv("eval?expr="+P.jW(C.yD,b,C.xM,!1))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return a.yB.cv("retained").ml(new Z.SS(a))},"$1","ghN",2,0,99,100],
-RF:[function(a,b){J.r0(a.yB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{lW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ka.ZL(a)
-C.ka.XI(a)
-return a}}},
-Dsd:{
-"^":"uL+Pi;",
-$isd3:true},
-SS:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.mN=J.Q5(z,C.tg,z.mN,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["code_ref_element","package:observatory/src/elements/code_ref.dart",,O,{
-"^":"",
-VY:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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,13,57],
-static:{On:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IK.ZL(a)
-C.IK.XI(a)
-return a}}}}],["code_view_element","package:observatory/src/elements/code_view.dart",,F,{
-"^":"",
-Be:{
-"^":"tuj;Xx,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtT:function(a){return a.Xx},
-stT:function(a,b){a.Xx=this.ct(a,C.i4,a.Xx,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Xx
-if(z==null)return
-J.SK(z).ml(new F.Bc())},
-RF:[function(a,b){J.r0(a.Xx).Qy(b)},"$1","gvC",2,0,20,90],
-m2:function(a,b){var z,y,x
-z=J.Vs(b).MW.getAttribute("data-jump-target")
-if(z==="")return
-y=H.BU(z,null,null)
-x=(a.shadowRoot||a.webkitShadowRoot).querySelector("#addr-"+H.d(y))
-if(x==null)return
-return x},
-YI:[function(a,b,c,d){var z=this.m2(a,d)
-if(z==null)return
-J.pP(z).h(0,"highlight")},"$3","gKJ",6,0,102,1,94,95],
-Lk:[function(a,b,c,d){var z=this.m2(a,d)
-if(z==null)return
-J.pP(z).Rz(0,"highlight")},"$3","gAF",6,0,102,1,94,95],
-static:{f9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ux.ZL(a)
-C.ux.XI(a)
-return a}}},
-tuj:{
-"^":"uL+Pi;",
-$isd3:true},
-Bc:{
-"^":"Tp:103;",
-$1:[function(a){a.OF()},"$1",null,2,0,null,81,"call"],
-$isEH:true}}],["curly_block_element","package:observatory/src/elements/curly_block.dart",,R,{
-"^":"",
-JI:{
-"^":"Xfs;GV,uo,nx,oM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-goE:function(a){return a.GV},
-soE:function(a,b){a.GV=this.ct(a,C.mr,a.GV,b)},
-gv8:function(a){return a.uo},
-sv8:function(a,b){a.uo=this.ct(a,C.S4,a.uo,b)},
-gFR:function(a){return a.nx},
-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.GV=this.ct(a,C.mr,a.GV,z)},"$1","ghy",2,0,20,57],
-WM:[function(a){var z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)
-a.uo=this.ct(a,C.S4,a.uo,!1)},"$0","gN2",0,0,18],
-ko:[function(a,b,c,d){var z=a.uo
-if(z===!0)return
-if(a.nx!=null){a.uo=this.ct(a,C.S4,z,!0)
-this.AV(a,a.GV!==!0,this.gN2(a))}else{z=a.GV
-a.GV=this.ct(a,C.mr,z,z!==!0)}},"$3","gDI",6,0,80,46,47,81],
-static:{U9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.GV=!1
-a.uo=!1
-a.nx=null
-a.oM=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.O0.ZL(a)
-C.O0.XI(a)
-return a}}},
-Xfs:{
-"^":"xc+Pi;",
-$isd3:true}}],["dart._internal","dart:_internal",,H,{
-"^":"",
-bQ:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)b.$1(z.lo)},
-Ck:function(a,b){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)if(b.$1(z.lo)===!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.Kp(a,0)]);z.G();)b=c.$2(b,z.lo)
-return b},
-rd: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)
-if(!!y.$isWO){x=e
-w=d}else{w=y.eR(d,e).tt(0,!1)
-x=0}if(J.z8(J.ew(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)
-if(!z.$isyN)c=z.tt(c,!1)
-z=J.U6(c)
-y=z.gB(c)
-x=a.length
-if(typeof y!=="number")return H.s(y)
-C.Nm.sB(a,x+y)
-x=a.length
-if(!!a.immutable$list)H.vh(P.f("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())}},
-vf: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())}},
-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.ew(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.ew(x,1))C.Nm.u(c,x,w.t(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(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},
-ZE:function(a,b,c,d){if(c-b<=32)H.w9(a,b,c,d)
-else H.wR(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)
-w=z
-while(!0){if(!(w>b&&J.z8(d.$2(y.t(a,w-1),x),0)))break
-v=w-1
-y.u(a,w,y.t(a,v))
-w=v}y.u(a,w,x)}},
-wR: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.cU(c-b+1,6)
-y=b+z
-x=c-z
-w=C.jn.cU(b+c,2)
-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.z8(d.$2(s,r),0)){n=r
-r=s
-s=n}if(J.z8(d.$2(p,o),0)){n=o
-o=p
-p=n}if(J.z8(d.$2(s,q),0)){n=q
-q=s
-s=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(d.$2(s,p),0)){n=p
-p=s
-s=n}if(J.z8(d.$2(q,p),0)){n=p
-p=q
-q=n}if(J.z8(d.$2(r,o),0)){n=o
-o=r
-r=n}if(J.z8(d.$2(r,q),0)){n=q
-q=r
-r=n}if(J.z8(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))
-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)
-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.Wx(i)
-if(h.D(i,0)){--l
-continue}else{g=l-1
-if(h.C(i,0)){t.u(a,k,t.t(a,m))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f
-break}else{t.u(a,k,t.t(a,l))
-t.u(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.z8(d.$2(j,p),0))for(;!0;)if(J.z8(d.$2(t.t(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(a,l,j)
-l=g}break}}e=!1}h=m-1
-t.u(a,b,t.t(a,h))
-t.u(a,h,r)
-h=l+1
-t.u(a,c,t.t(a,h))
-t.u(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(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))
-f=m+1
-t.u(a,m,t.t(a,l))
-t.u(a,l,j)
-l=g
-m=f}else{t.u(a,k,t.t(a,l))
-t.u(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.ip(this,"aL",0)])},
-aN:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(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)},
-grZ:function(a){if(J.xC(this.gB(this),0))throw H.b(H.DU())
-return this.Zv(0,J.bI(this.gB(this),1))},
-tg:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(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},
-Vr:function(a,b){var z,y
-z=this.gB(this)
-if(typeof z!=="number")return H.s(z)
-y=0
-for(;y<z;++y){if(b.$1(this.Zv(0,y))===!0)return!0
-if(z!==this.gB(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""
-x=H.d(this.Zv(0,0))
-if(!y.n(z,this.gB(this)))throw H.b(P.a4(this))
-w=P.p9(x)
-if(typeof z!=="number")return H.s(z)
-v=1
-for(;v<z;++v){w.vM+=b
-u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}else{w=P.p9("")
-if(typeof z!=="number")return H.s(z)
-v=0
-for(;v<z;++v){u=this.Zv(0,v)
-w.vM+=typeof u==="string"?u:H.d(u)
-if(z!==this.gB(this))throw H.b(P.a4(this))}return w.vM}},
-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.XW(function(a){return{func:"kY",ret:P.QV,args:[{func:"Jm",args:[a]}]}},this.$receiver,"aL")},31],
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(this,"aL",0)])
-C.Nm.sB(z,this.gB(this))}else{y=this.gB(this)
-if(typeof y!=="number")return H.s(y)
-y=Array(y)
-y.fixed$length=init
-z=H.VM(y,[H.ip(this,"aL",0)])}x=0
-while(!0){y=this.gB(this)
-if(typeof y!=="number")return H.s(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)},
-$isyN:true},
-bX:{
-"^":"aL;l6,SH,AN",
-gMa:function(){var z,y
-z=J.q8(this.l6)
-y=this.AN
-if(y==null||J.z8(y,z))return z
-return y},
-gjX:function(){var z,y
-z=J.q8(this.l6)
-y=this.SH
-if(J.z8(y,z))return z
-return y},
-gB:function(a){var z,y,x
-z=J.q8(this.l6)
-y=this.SH
-if(J.J5(y,z))return 0
-x=this.AN
-if(x==null||J.J5(x,z))return J.bI(z,y)
-return J.bI(x,y)},
-Zv:function(a,b){var z=J.ew(this.gjX(),b)
-if(J.u6(b,0)||J.J5(z,this.gMa()))throw H.b(P.TE(b,0,this.gB(this)))
-return J.i9(this.l6,z)},
-eR:function(a,b){if(J.u6(b,0))throw H.b(P.N(b))
-return H.q9(this.l6,J.ew(this.SH,b),this.AN,null)},
-qZ:function(a,b){var z,y,x
-if(b<0)throw H.b(P.N(b))
-z=this.AN
-y=this.SH
-if(z==null)return H.q9(this.l6,y,J.ew(y,b),null)
-else{x=J.ew(y,b)
-if(J.u6(z,x))return this
-return H.q9(this.l6,y,x,null)}},
-Hd:function(a,b,c,d){var z,y,x
-z=this.SH
-y=J.Wx(z)
-if(y.C(z,0))throw H.b(P.N(z))
-x=this.AN
-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:{q9:function(a,b,c,d){var z=H.VM(new H.bX(a,b,c),[d])
-z.Hd(a,b,c,d)
-return z}}},
-a7:{
-"^":"a;l6,SW,G7,lo",
-gl:function(){return this.lo},
-G:function(){var z,y,x,w
-z=this.l6
-y=J.U6(z)
-x=y.gB(z)
-if(!J.xC(this.SW,x))throw H.b(P.a4(z))
-w=this.G7
-if(typeof x!=="number")return H.s(x)
-if(w>=x){this.lo=null
-return!1}this.lo=y.Zv(z,w);++this.G7
-return!0}},
-i1:{
-"^":"mW;l6,T6",
-mb:function(a){return this.T6.$1(a)},
-gA:function(a){var z=new H.MH(null,J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.l6)},
-gl0:function(a){return J.FN(this.l6)},
-grZ:function(a){return this.mb(J.MQ(this.l6))},
-$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])}}},
-xy:{
-"^":"i1;l6,T6",
-$isyN:true},
-MH:{
-"^":"Dk;lo,OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){var z=this.OI
-if(z.G()){this.lo=this.mb(z.gl())
-return!0}this.lo=null
-return!1},
-gl:function(){return this.lo},
-$asDk:function(a,b){return[b]}},
-A8:{
-"^":"aL;CR,T6",
-mb:function(a){return this.T6.$1(a)},
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){return this.mb(J.i9(this.CR,b))},
-$asaL:function(a,b){return[b]},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-U5:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Mo(J.mY(this.l6),this.T6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-Mo:{
-"^":"Dk;OI,T6",
-mb:function(a){return this.T6.$1(a)},
-G:function(){for(var z=this.OI;z.G();)if(this.mb(z.gl())===!0)return!0
-return!1},
-gl:function(){return this.OI.gl()}},
-oA:{
-"^":"mW;l6,T6",
-gA:function(a){var z=new H.Wy(J.mY(this.l6),this.T6,C.Gw,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]}},
-Wy:{
-"^":"a;OI,T6,e0,lo",
-mb:function(a){return this.T6.$1(a)},
-gl:function(){return this.lo},
-G:function(){var z,y
-z=this.e0
-if(z==null)return!1
-for(y=this.OI;!z.G();){this.lo=null
-if(y.G()){this.e0=null
-z=J.mY(this.mb(y.gl()))
-this.e0=z}else return!1}this.lo=this.e0.gl()
-return!0}},
-FuS:{
-"^":"a;",
-G:function(){return!1},
-gl:function(){return}},
-SU7:{
-"^":"a;",
-sB:function(a,b){throw H.b(P.f("Cannot change the length of a fixed-length list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to a fixed-length list"))},
-FV:function(a,b){throw H.b(P.f("Cannot add to a fixed-length list"))},
-V1:function(a){throw H.b(P.f("Cannot clear a fixed-length list"))},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from a fixed-length list"))}},
-Zl:{
-"^":"a;",
-u:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-sB:function(a,b){throw H.b(P.f("Cannot change the length of an unmodifiable list"))},
-Mh:function(a,b,c){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-h:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-xe:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-UG:function(a,b,c){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-FV:function(a,b){throw H.b(P.f("Cannot add to an unmodifiable list"))},
-GT:function(a,b){throw H.b(P.f("Cannot modify an unmodifiable list"))},
-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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){throw H.b(P.f("Cannot remove from an unmodifiable list"))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-w2Y:{
-"^":"ark+Zl;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-iK:{
-"^":"aL;CR",
-gB:function(a){return J.q8(this.CR)},
-Zv:function(a,b){var z,y,x
-z=this.CR
-y=J.U6(z)
-x=y.gB(z)
-if(typeof b!=="number")return H.s(b)
-return y.Zv(z,x-1-b)}},
-IN:{
-"^":"a;fN>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isIN&&J.xC(this.fN,b.fN)},
-giO:function(a){var z=J.v1(this.fN)
-if(typeof z!=="number")return H.s(z)
-return 536870911&664597*z},
-bu:function(a){return"Symbol(\""+H.d(this.fN)+"\")"},
-$isIN:true,
-$isGD:true,
-static:{"^":"RWj,ES1,quP,KGP,eD,fbV"}}}],["dart._js_names","dart:_js_names",,H,{
-"^":"",
-kU:function(a){var z=H.VM(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
-return z}}],["dart.async","dart:async",,P,{
-"^":"",
-xg:function(){if($.jk().scheduleImmediate!=null)return P.vd()
-return P.K7()},
-ZV:[function(a){++init.globalState.Xz.GL
-$.jk().scheduleImmediate(H.tR(new P.C6(a),0))},"$1","vd",2,0,19],
-Bz:[function(a){P.jL(C.ny,a)},"$1","K7",2,0,19],
-VH:function(a,b){var z=H.G3()
-z=H.KT(z,[z,z]).BD(a)
-if(z)return b.O8(a)
-else return b.wY(a)},
-Iw:function(a,b){var z=P.Dt(b)
-P.rT(C.ny,new P.w4(a,z))
-return z},
-YZ:function(a,b){var z,y,x,w,v
-z={}
-z.a=null
-z.b=null
-z.c=0
-z.d=null
-z.e=null
-y=new P.mQ(z,b)
-for(x=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);x.G();)x.lo.Rx(new P.Tw(z,b,z.c++),y)
-y=z.c
-if(y===0)return P.Ab(C.dn,null)
-w=Array(y)
-w.fixed$length=init
-z.b=w
-y=P.WO
-v=H.VM(new P.Zf(P.Dt(y)),[y])
-z.a=v
-return v.MM},
-Cx:function(){var z=$.S6
-for(;z!=null;){J.cG(z)
-z=z.gaw()
-$.S6=z}$.k8=null},
-BG:[function(){var z
-try{P.Cx()}catch(z){H.Ru(z)
-$.ej().$1(P.qZ())
-$.S6=$.S6.gaw()
-throw z}},"$0","qZ",0,0,18],
-IA:function(a){var z,y
-z=$.k8
-if(z==null){z=new P.OM(a,null)
-$.k8=z
-$.S6=z
-$.ej().$1(P.qZ())}else{y=new P.OM(a,null)
-z.aw=y
-$.k8=y}},
-rb:function(a){var z
-if(J.xC($.X3,C.NU)){$.X3.wr(a)
-return}z=$.X3
-z.wr(z.xi(a,!0))},
-x2:function(a,b,c,d,e,f){return e?H.VM(new P.Xq(b,c,d,a,null,0,null),[f]):H.VM(new P.Gh(b,c,d,a,null,0,null),[f])},
-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.HX(b,a,0,null,null,null,null),[d])
-z.SJ=z
-z.iE=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
-return}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-$.X3.hk(y,x)}},
-SN:[function(a){},"$1","Ax",2,0,20,21],
-vF:[function(a,b){$.X3.hk(a,b)},function(a){return P.vF(a,null)},null,"$2","$1","Mm",2,2,22,23,24,25],
-p0:[function(){},"$0","od",0,0,18],
-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.XO(x,null)
-c.$2(z,y)}},
-NX:function(a,b,c,d){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.dR(b,c,d))
-else b.K5(c,d)},
-TB:function(a,b){return new P.uR(a,b)},
-Bb:function(a,b,c){var z=a.ed()
-if(!!J.x(z).$isb8)z.Qy(new P.Q0(b,c))
-else b.rX(c)},
-rT:function(a,b){var z
-if(J.xC($.X3,C.NU))return $.X3.uN(a,b)
-z=$.X3
-return z.uN(a,z.xi(b,!0))},
-jL:function(a,b){var z=a.gVs()
-return H.cy(z<0?0:z,b)},
-Us:function(a){var z=$.X3
-$.X3=a
-return z},
-CK:[function(a,b,c,d,e){a.Gr(new P.FO(d,e))},"$5","wL",10,0,26,27,28,29,24,25],
-T8:[function(a,b,c,d){var z,y
-if(J.xC($.X3,c))return d.$0()
-z=P.Us(c)
-try{y=d.$0()
-return y}finally{$.X3=z}},"$4","lw",8,0,30,27,28,29,31],
-yv:[function(a,b,c,d,e){var z,y
-if(J.xC($.X3,c))return d.$1(e)
-z=P.Us(c)
-try{y=d.$1(e)
-return y}finally{$.X3=z}},"$5","Un",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)
-z=P.Us(c)
-try{y=d.$2(e,f)
-return y}finally{$.X3=z}},"$6","iy",12,0,34,27,28,29,31,9,10],
-Ee:[function(a,b,c,d){return d},"$4","Qk",8,0,35,27,28,29,31],
-cQ:[function(a,b,c,d){return d},"$4","zi",8,0,36,27,28,29,31],
-dL:[function(a,b,c,d){return d},"$4","v3",8,0,37,27,28,29,31],
-Tk:[function(a,b,c,d){P.IA(C.NU!==c?c.ce(d):d)},"$4","G2",8,0,38],
-h8:[function(a,b,c,d,e){return P.jL(d,C.NU!==c?c.ce(e):e)},"$5","KF",10,0,39,27,28,29,40,41],
-XB:[function(a,b,c,d){H.qw(d)},"$4","aW",8,0,42],
-CI:[function(a){J.wl($.X3,a)},"$1","jt",2,0,43],
-UA:[function(a,b,c,d,e){var z
-$.oK=P.jt()
-z=P.YM(null,null,null,null,null)
-return new P.uo(c,d,z)},"$5","Is",10,0,44],
-C6:{
-"^":"Tp:69;a",
-$0:[function(){H.cv()
-this.a.$0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ca:{
-"^":"a;kc>,I4<",
-$isXS:true},
-Ik:{
-"^":"O9;Y8"},
-LR:{
-"^":"yU;Ae@,iE@,SJ@,Y8,pN,o7,Bd,Lj,Gv,lz,Ri",
-gY8:function(){return this.Y8},
-uR:function(a){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&1)===a},
-Ac:function(){var z=this.Ae
-if(typeof z!=="number")return z.w()
-this.Ae=z^1},
-gP4:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&2)!==0},
-dK:function(){var z=this.Ae
-if(typeof z!=="number")return z.k()
-this.Ae=z|4},
-gHj:function(){var z=this.Ae
-if(typeof z!=="number")return z.i()
-return(z&4)!==0},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-static:{"^":"E2b,PR,id"}},
-Ks:{
-"^":"a;iE@,SJ@",
-gUF:function(){return!1},
-im:function(){var z=this.yx
-if(z!=null)return z
-z=P.Dt(null)
-this.yx=z
-return z},
-p1:function(a){var z,y
-z=a.gSJ()
-y=a.giE()
-z.siE(y)
-y.sSJ(z)
-a.sSJ(a)
-a.siE(a)},
-ET:function(a){var z,y,x
-if((this.Gv&4)!==0){z=new P.EM($.X3,0,P.od())
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.yc()
-return z}z=$.X3
-y=a?1:0
-x=new P.LR(null,null,null,this,null,null,null,z,y,null,null)
-x.$builtinTypeInfo=this.$builtinTypeInfo
-x.SJ=x
-x.iE=x
-y=this.SJ
-x.SJ=y
-x.iE=this
-y.siE(x)
-this.SJ=x
-x.Ae=this.Gv&1
-if(this.iE===x)P.ot(this.nL)
-return x},
-j0:function(a){if(a.giE()===a)return
-if(a.gP4())a.dK()
-else{this.p1(a)
-if((this.Gv&2)===0&&this.iE===this)this.Of()}},
-mO:function(a){},
-m4:function(a){},
-q7:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add new events after calling close")
-return new P.lj("Cannot add new events while doing an addStream")},
-h:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.Iv(b)},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"yd",void:true,args:[a]}},this.$receiver,"Ks")},104],
-js:[function(a,b){if(this.Gv>=4)throw H.b(this.q7())
-this.pb(a,b)},function(a){return this.js(a,null)},"JT","$2","$1","gGj",2,2,105,23,24,25],
-S6:function(a){var z,y
-z=this.Gv
-if((z&4)!==0)return this.yx
-if(z>=4)throw H.b(this.q7())
-this.Gv=z|4
-y=this.im()
-this.Pl()
-return y},
-Rg:function(a,b){this.Iv(b)},
-oJ:function(a,b){this.pb(a,b)},
-YB:function(){var z=this.WX
-this.WX=null
-this.Gv&=4294967287
-C.jN.tZ(z)},
-FW:function(a){var z,y,x,w
-z=this.Gv
-if((z&2)!==0)throw H.b(P.w("Cannot fire new event. Controller is already firing an event"))
-y=this.iE
-if(y===this)return
-x=z&1
-this.Gv=z^3
-for(;y!==this;)if(y.uR(x)){z=y.gAe()
-if(typeof z!=="number")return z.k()
-y.sAe(z|2)
-a.$1(y)
-y.Ac()
-w=y.giE()
-if(y.gHj())this.p1(y)
-z=y.gAe()
-if(typeof z!=="number")return z.i()
-y.sAe(z&4294967293)
-y=w}else y=y.giE()
-this.Gv&=4294967293
-if(this.iE===this)this.Of()},
-Of:function(){if((this.Gv&4)!==0&&this.yx.Gv===0)this.yx.OH(null)
-P.ot(this.Ym)}},
-zW:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z=this.iE
-if(z===this)return
-if(z.giE()===this){this.Gv|=2
-this.iE.Rg(0,a)
-this.Gv&=4294967293
-if(this.iE===this)this.Of()
-return}this.FW(new P.tK(this,a))},
-pb:function(a,b){if(this.iE===this)return
-this.FW(new P.ORH(this,a,b))},
-Pl:function(){if(this.iE!==this)this.FW(new P.eB(this))
-else this.yx.OH(null)}},
-tK:{
-"^":"Tp;a,b",
-$1:function(a){a.Rg(0,this.b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-ORH:{
-"^":"Tp;a,b,c",
-$1:function(a){a.oJ(this.b,this.c)},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"KX",args:[[P.KA,a]]}},this.a,"zW")}},
-eB:{
-"^":"Tp;a",
-$1:function(a){a.YB()},
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Mc",args:[[P.LR,a]]}},this.a,"zW")}},
-HX:{
-"^":"Ks;nL,Ym,Gv,iE,SJ,WX,yx",
-Iv:function(a){var z,y
-for(z=this.iE;z!==this;z=z.giE()){y=new P.fZ(a,null)
-y.$builtinTypeInfo=[null]
-z.w6(y)}},
-pb:function(a,b){var z
-for(z=this.iE;z!==this;z=z.giE())z.w6(new P.WG(a,b,null))},
-Pl:function(){var z=this.iE
-if(z!==this)for(;z!==this;z=z.giE())z.w6(C.ZB)
-else this.yx.OH(null)}},
-b8:{
-"^":"a;",
-$isb8:true},
-w4:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y,x,w
-try{this.b.rX(this.a.$0())}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-this.b.K5(z,y)}},"$0",null,0,0,null,"call"],
-$isEH:true},
-mQ:{
-"^":"Tp:77;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,106,107,"call"],
-$isEH:true},
-Tw:{
-"^":"Tp:108;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.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(x)}}else if(y===0&&!this.c)z.a.w0(z.d,z.e)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-oh:{
-"^":"a;",
-$isoh:true},
-Pf0:{
-"^":"a;",
-$isoh:true},
-Zf:{
-"^":"Pf0;MM",
-j3:[function(a,b){var z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.OH(b)},function(a){return this.j3(a,null)},"tZ","$1","$0","gv6",0,2,109,23,21],
-w0:[function(a,b){var z
-if(a==null)throw H.b(P.u("Error must not be null"))
-z=this.MM
-if(z.Gv!==0)throw H.b(P.w("Future already completed"))
-z.CG(a,b)},function(a){return this.w0(a,null)},"pm","$2","$1","gyr",2,2,105,23,24,25]},
-Gc:{
-"^":"a;Gv,Lj<,jk,BQ@,OY,As,qV,o4",
-gcg:function(){return this.Gv>=4},
-gWj:function(){return this.Gv===4},
-gNm:function(){return this.Gv===8},
-swG:function(a){if(a)this.Gv=2
-else this.Gv=0},
-gO1:function(){return this.Gv===2?null:this.OY},
-gyK:function(){return this.Gv===2?null:this.As},
-go7:function(){return this.Gv===2?null:this.qV},
-gIa:function(){return this.Gv===2?null:this.o4},
-Rx:function(a,b){var z,y
-z=$.X3
-y=H.VM(new P.Gc(0,z,null,null,z.wY(a),null,P.VH(b,$.X3),null),[null])
-this.au(y)
-return y},
-ml:function(a){return this.Rx(a,null)},
-co: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.wY(b),y,null),[null])
-this.au(x)
-return x},
-OA:function(a){return this.co(a,null)},
-Qy:function(a){var z,y
-z=$.X3
-y=new P.Gc(0,z,null,null,null,null,null,z.Al(a))
-y.$builtinTypeInfo=this.$builtinTypeInfo
-this.au(y)
-return y},
-gDL:function(){return this.jk},
-gcG:function(){return this.jk},
-Am:function(a){this.Gv=4
-this.jk=a},
-E6:function(a,b){this.Gv=8
-this.jk=new P.Ca(a,b)},
-au:function(a){if(this.Gv>=4)this.Lj.wr(new P.da(this,a))
-else{a.sBQ(this.jk)
-this.jk=a}},
-L3:function(){var z,y,x
-z=this.jk
-this.jk=null
-for(y=null;z!=null;y=z,z=x){x=z.gBQ()
-z.sBQ(y)}return y},
-rX:function(a){var z,y
-z=J.x(a)
-if(!!z.$isb8)if(!!z.$isGc)P.A9(a,this)
-else P.k3(a,this)
-else{y=this.L3()
-this.Am(a)
-P.HZ(this,y)}},
-R8:function(a){var z=this.L3()
-this.Am(a)
-P.HZ(this,z)},
-K5:[function(a,b){var z=this.L3()
-this.E6(a,b)
-P.HZ(this,z)},function(a){return this.K5(a,null)},"Lp","$2","$1","gaq",2,2,22,23,24,25],
-OH:function(a){var z
-if(a==null);else{z=J.x(a)
-if(!!z.$isb8){if(!!z.$isGc){z=a.Gv
-if(z>=4&&z===8){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.cX(this,a))}else P.A9(a,this)}else P.k3(a,this)
-return}}if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.eX(this,a))},
-CG:function(a,b){if(this.Gv!==0)H.vh(P.w("Future already completed"))
-this.Gv=1
-this.Lj.wr(new P.iX(this,a,b))},
-J9:function(a,b){this.OH(a)},
-X8:function(a,b,c){this.CG(a,b)},
-$isGc:true,
-$isb8:true,
-static:{"^":"ewM,JE,C3n,oN1,dh",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},Vu: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.swG(!0)
-a.Rx(new P.U7(b),new P.vr(b))},A9:function(a,b){b.swG(!0)
-if(a.Gv>=4)P.HZ(a,b)
-else a.au(b)},yE:function(a,b){var z
-do{z=b.gBQ()
-b.sBQ(null)
-P.HZ(a,b)
-if(z!=null){b=z
-continue}else break}while(!0)},HZ:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z={}
-z.e=a
-for(y=a;!0;){x={}
-if(!y.gcg())return
-w=z.e.gNm()
-if(w&&b==null){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}if(b==null)return
-if(b.gBQ()!=null){P.yE(z.e,b)
-return}x.b=!0
-u=z.e.gWj()?z.e.gDL():null
-x.c=u
-x.d=!1
-y=!w
-if(!y||b.gO1()!=null||b.gIa()!=null){t=b.gLj()
-if(w&&!z.e.gLj().fC(t)){v=z.e.gcG()
-z.e.gLj().hk(J.w8(v),v.gI4())
-return}s=$.X3
-if(s==null?t!=null:s!==t)$.X3=t
-else s=null
-if(y){if(b.gO1()!=null)x.b=new P.rq(x,b,u,t).$0()}else new P.RW(z,x,b,t).$0()
-if(b.gIa()!=null)new P.RT(z,x,w,b,t).$0()
-if(s!=null)$.X3=s
-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.Gv>=4){b.swG(!0)
-z.e=r
-y=r
-continue}else P.A9(r,b)
-else P.k3(r,b)
-return}}if(x.b===!0){q=b.L3()
-b.Am(x.c)}else{q=b.L3()
-v=x.c
-b.E6(J.w8(v),v.gI4())}z.e=b
-y=b
-b=q}}}},
-da:{
-"^":"Tp:69;a,b",
-$0:[function(){P.HZ(this.a,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-U7:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.R8(a)},"$1",null,2,0,null,21,"call"],
-$isEH:true},
-vr:{
-"^":"Tp:110;b",
-$2:[function(a,b){this.b.K5(a,b)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-cX:{
-"^":"Tp:69;a,b",
-$0:[function(){P.A9(this.b,this.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-eX:{
-"^":"Tp:69;c,d",
-$0:[function(){this.c.R8(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-iX:{
-"^":"Tp:69;a,b,c",
-$0:[function(){this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-rq:{
-"^":"Tp:111;b,d,e,f",
-$0:function(){var z,y,x,w
-try{this.b.c=this.f.FI(this.d.gO1(),this.e)
-return!0}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-this.b.c=new P.Ca(z,y)
-return!1}},
-$isEH:true},
-RW:{
-"^":"Tp:18;c,b,UI,bK",
-$0:function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=this.c.e.gcG()
-r=this.UI
-y=r.gyK()
-x=!0
-if(y!=null)try{x=this.bK.FI(y,J.w8(z))}catch(q){r=H.Ru(q)
-w=r
-v=new H.XO(q,null)
-r=J.w8(z)
-p=w
-o=(r==null?p==null:r===p)?z:new P.Ca(w,v)
-r=this.b
-r.c=o
-r.b=!1
-return}u=r.go7()
-if(x===!0&&u!=null){try{r=u
-p=H.G3()
-p=H.KT(p,[p,p]).BD(r)
-n=this.bK
-m=this.b
-if(p)m.c=n.mg(u,J.w8(z),z.gI4())
-else m.c=n.FI(u,J.w8(z))}catch(q){r=H.Ru(q)
-t=r
-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
-r.c=o
-r.b=!1
-return}this.b.b=!0}else{r=this.b
-r.c=z
-r.b=!1}},
-$isEH:true},
-RT:{
-"^":"Tp:18;c,b,Gq,Rm,w3",
-$0:function(){var z,y,x,w,v,u
-z={}
-z.a=null
-try{z.a=this.w3.Gr(this.Rm.gIa())}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-if(this.Gq){v=J.w8(this.c.e.gcG())
-u=y
-u=v==null?u==null:v===u
-v=u}else v=!1
-u=this.b
-if(v)u.c=this.c.e.gcG()
-else u.c=new P.Ca(y,x)
-u.b=!1}if(!!J.x(z.a).$isb8){v=this.Rm
-v.swG(!0)
-this.b.d=!0
-z.a.Rx(new P.jZ(this.c,v),new P.FZ(z,v))}},
-$isEH:true},
-jZ:{
-"^":"Tp:13;c,HZ",
-$1:[function(a){P.HZ(this.c.e,this.HZ)},"$1",null,2,0,null,112,"call"],
-$isEH:true},
-FZ:{
-"^":"Tp:110;a,mG",
-$2:[function(a,b){var z,y
-z=this.a
-if(!J.x(z.a).$isGc){y=P.Dt(null)
-z.a=y
-y.E6(a,b)}P.HZ(z.a,this.mG)},function(a){return this.$2(a,null)},"$1","$2",null,null,2,2,null,23,24,25,"call"],
-$isEH:true},
-OM:{
-"^":"a;FR>,aw@",
-Ki:function(a){return this.FR.$0()}},
-cb:{
-"^":"a;",
-ez:[function(a,b){return H.VM(new P.c9(b,this),[H.ip(this,"cb",0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"bp",ret:P.cb,args:[{func:"Lf",args:[a]}]}},this.$receiver,"cb")},113],
-lM:[function(a,b){return H.VM(new P.Bg(b,this),[H.ip(this,"cb",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"xv",ret:P.cb,args:[{func:"fA",ret:P.QV,args:[a]}]}},this.$receiver,"cb")},113],
-tg:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Sd(z,this,b,y),!0,new P.kb(y),y.gaq())
-return y},
-aN:function(a,b){var z,y
-z={}
-y=P.Dt(null)
-z.a=null
-z.a=this.KR(new P.lz(z,this,b,y),!0,new P.ib(y),y.gaq())
-return y},
-Vr:function(a,b){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.Ia(z,this,b,y),!0,new P.BSd(y),y.gaq())
-return y},
-gB:function(a){var z,y
-z={}
-y=P.Dt(P.KN)
-z.a=0
-this.KR(new P.PI(z),!0,new P.uO(z,y),y.gaq())
-return y},
-gl0:function(a){var z,y
-z={}
-y=P.Dt(P.a2)
-z.a=null
-z.a=this.KR(new P.qg(z,y),!0,new P.Wd(y),y.gaq())
-return y},
-gtH:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.a=this.KR(new P.xp(z,this,y),!0,new P.OC(y),y.gaq())
-return y},
-grZ:function(a){var z,y
-z={}
-y=P.Dt(H.ip(this,"cb",0))
-z.a=null
-z.b=!1
-this.KR(new P.UH(z,this),!0,new P.Z5(z,y),y.gaq())
-return y},
-$iscb:true},
-Sd:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.Oh(this.c,a),new P.jvH(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Oh:{
-"^":"Tp:69;e,f",
-$0:function(){return J.xC(this.f,this.e)},
-$isEH:true},
-jvH:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-kb:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-lz:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){P.FE(new P.at(this.c,a),new P.mj(),P.TB(this.a.a,this.d))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-at:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-mj:{
-"^":"Tp:13;",
-$1:function(a){},
-$isEH:true},
-ib:{
-"^":"Tp:69;UI",
-$0:[function(){this.UI.rX(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Ia:{
-"^":"Tp;a,b,c,d",
-$1:[function(a){var z,y
-z=this.a
-y=this.d
-P.FE(new P.WN(this.c,a),new P.XPB(z,y),P.TB(z.a,y))},"$1",null,2,0,null,114,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-WN:{
-"^":"Tp:69;e,f",
-$0:function(){return this.e.$1(this.f)},
-$isEH:true},
-XPB:{
-"^":"Tp:115;a,UI",
-$1:function(a){if(a===!0)P.Bb(this.a.a,this.UI,!0)},
-$isEH:true},
-BSd:{
-"^":"Tp:69;bK",
-$0:[function(){this.bK.rX(!1)},"$0",null,0,0,null,"call"],
-$isEH:true},
-PI:{
-"^":"Tp:13;a",
-$1:[function(a){++this.a.a},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-uO:{
-"^":"Tp:69;a,b",
-$0:[function(){this.b.rX(this.a.a)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qg:{
-"^":"Tp:13;a,b",
-$1:[function(a){P.Bb(this.a.a,this.b,!1)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Wd:{
-"^":"Tp:69;c",
-$0:[function(){this.c.rX(!0)},"$0",null,0,0,null,"call"],
-$isEH:true},
-xp:{
-"^":"Tp;a,b,c",
-$1:[function(a){P.Bb(this.a.a,this.c,a)},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-OC:{
-"^":"Tp:69;d",
-$0:[function(){this.d.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-UH:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.a
-z.b=!0
-z.a=a},"$1",null,2,0,null,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Lf",args:[a]}},this.b,"cb")}},
-Z5:{
-"^":"Tp:69;a,c",
-$0:[function(){var z=this.a
-if(z.b){this.c.rX(z.a)
-return}this.c.Lp(new P.lj("No elements"))},"$0",null,0,0,null,"call"],
-$isEH:true},
-Oy:{
-"^":"a;",
-$isOy:true},
-nR:{
-"^":"a;",
-gUF:function(){var z=this.Gv
-return(z&1)!==0?this.gEe().gyD():(z&2)===0},
-gh6:function(){if((this.Gv&8)===0)return this.xG
-return this.xG.gmT()},
-kW:function(){var z,y
-if((this.Gv&8)===0){z=this.xG
-if(z==null){z=new P.qm(null,null,0)
-this.xG=z}return z}y=this.xG
-y.gmT()
-return y.gmT()},
-gEe:function(){if((this.Gv&8)!==0)return this.xG.gmT()
-return this.xG},
-nG:function(){if((this.Gv&4)!==0)return new P.lj("Cannot add event after closing")
-return new P.lj("Cannot add event while adding a stream")},
-im:function(){var z=this.yx
-if(z==null){z=(this.Gv&2)!==0?$.mk():P.Dt(null)
-this.yx=z}return z},
-h:[function(a,b){var z=this.Gv
-if(z>=4)throw H.b(this.nG())
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},"$1","ght",2,0,function(){return H.XW(function(a){return{func:"lU6",void:true,args:[a]}},this.$receiver,"nR")}],
-S6:function(a){var z=this.Gv
-if((z&4)!==0)return this.im()
-if(z>=4)throw H.b(this.nG())
-z|=4
-this.Gv=z
-if((z&1)!==0)this.Pl()
-else if((z&3)===0)this.kW().h(0,C.ZB)
-return this.im()},
-Rg:function(a,b){var z=this.Gv
-if((z&1)!==0)this.Iv(b)
-else if((z&3)===0)this.kW().h(0,H.VM(new P.fZ(b,null),[H.ip(this,"nR",0)]))},
-oJ:function(a,b){var z=this.Gv
-if((z&1)!==0)this.pb(a,b)
-else if((z&3)===0)this.kW().h(0,new P.WG(a,b,null))},
-ET:function(a){var z,y,x,w,v
-if((this.Gv&3)!==0)throw H.b(P.w("Stream has already been listened to."))
-z=$.X3
-y=a?1:0
-x=H.VM(new P.yU(this,null,null,null,z,y,null,null),[null])
-w=this.gh6()
-y=this.Gv|=1
-if((y&8)!==0){v=this.xG
-v.smT(x)
-v.QE(0)}else this.xG=x
-x.WN(w)
-x.J7(new P.UO(this))
-return x},
-j0:function(a){var z,y,x,w,v,u
-z=null
-if((this.Gv&8)!==0)z=this.xG.ed()
-this.xG=null
-this.Gv=this.Gv&4294967286|2
-if(this.gYm()!=null)if(z==null)try{z=this.tA()}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-u=P.Dt(null)
-u.CG(y,x)
-z=u}else z=z.Qy(this.gYm())
-v=new P.A1(this)
-if(z!=null)z=z.Qy(v)
-else v.$0()
-return z},
-mO:function(a){if((this.Gv&8)!==0)this.xG.yy(0)
-P.ot(this.gp4())},
-m4:function(a){if((this.Gv&8)!==0)this.xG.QE(0)
-P.ot(this.gZ9())}},
-UO:{
-"^":"Tp:69;a",
-$0:function(){P.ot(this.a.gnL())},
-$isEH:true},
-A1:{
-"^":"Tp:18;a",
-$0:[function(){var z=this.a.yx
-if(z!=null&&z.Gv===0)z.OH(null)},"$0",null,0,0,null,"call"],
-$isEH:true},
-TT:{
-"^":"a;",
-Iv:function(a){this.gEe().Rg(0,a)},
-pb:function(a,b){this.gEe().oJ(a,b)},
-Pl:function(){this.gEe().YB()}},
-of2:{
-"^":"a;",
-Iv:function(a){this.gEe().w6(H.VM(new P.fZ(a,null),[null]))},
-pb:function(a,b){this.gEe().w6(new P.WG(a,b,null))},
-Pl:function(){this.gEe().w6(C.ZB)}},
-Gh:{
-"^":"ZzD;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-ZzD:{
-"^":"nR+of2;"},
-Xq:{
-"^":"pe;nL<,p4<,Z9<,Ym<,xG,Gv,yx",
-tA:function(){return this.Ym.$0()}},
-pe:{
-"^":"nR+TT;"},
-O9:{
-"^":"ez;Y8",
-w4:function(a){return this.Y8.ET(a)},
-giO:function(a){return(H.eQ(this.Y8)^892482866)>>>0},
-n:function(a,b){if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isO9)return!1
-return b.Y8===this.Y8},
-$isO9:true},
-yU:{
-"^":"KA;Y8<,pN,o7,Bd,Lj,Gv,lz,Ri",
-tA:function(){return this.gY8().j0(this)},
-uO:[function(){this.gY8().mO(this)},"$0","gp4",0,0,18],
-LP:[function(){this.gY8().m4(this)},"$0","gZ9",0,0,18]},
-NOT:{
-"^":"a;"},
-KA:{
-"^":"a;pN,o7<,Bd,Lj<,Gv,lz,Ri",
-WN:function(a){if(a==null)return
-this.Ri=a
-if(!a.gl0(a)){this.Gv=(this.Gv|64)>>>0
-this.Ri.t2(this)}},
-yl:function(a){this.pN=this.Lj.wY(a)},
-fm:function(a,b){if(b==null)b=P.Mm()
-this.o7=P.VH(b,this.Lj)},
-y5:function(a){if(a==null)a=P.od()
-this.Bd=this.Lj.Al(a)},
-Fv:[function(a,b){var z=this.Gv
-if((z&8)!==0)return
-this.Gv=(z+128|4)>>>0
-if(b!=null)b.Qy(this.gDQ(this))
-if(z<128&&this.Ri!=null)this.Ri.FK()
-if((z&4)===0&&(this.Gv&32)===0)this.J7(this.gp4())},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if((z&8)!==0)return
-if(z>=128){z-=128
-this.Gv=z
-if(z<128){if((z&64)!==0){z=this.Ri
-z=!z.gl0(z)}else z=!1
-if(z)this.Ri.t2(this)
-else{z=(this.Gv&4294967291)>>>0
-this.Gv=z
-if((z&32)===0)this.J7(this.gZ9())}}}},"$0","gDQ",0,0,18],
-ed:function(){var z=(this.Gv&4294967279)>>>0
-this.Gv=z
-if((z&8)!==0)return this.lz
-this.tk()
-return this.lz},
-gyD:function(){return(this.Gv&4)!==0},
-gUF:function(){return this.Gv>=128},
-tk:function(){var z=(this.Gv|8)>>>0
-this.Gv=z
-if((z&64)!==0)this.Ri.FK()
-if((this.Gv&32)===0)this.Ri=null
-this.lz=this.tA()},
-Rg:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.Iv(b)
-else this.w6(H.VM(new P.fZ(b,null),[null]))},
-oJ:function(a,b){var z=this.Gv
-if((z&8)!==0)return
-if(z<32)this.pb(a,b)
-else this.w6(new P.WG(a,b,null))},
-YB:function(){var z=this.Gv
-if((z&8)!==0)return
-z=(z|2)>>>0
-this.Gv=z
-if(z<32)this.Pl()
-else this.w6(C.ZB)},
-uO:[function(){},"$0","gp4",0,0,18],
-LP:[function(){},"$0","gZ9",0,0,18],
-tA:function(){},
-w6:function(a){var z,y
-z=this.Ri
-if(z==null){z=new P.qm(null,null,0)
-this.Ri=z}z.h(0,a)
-y=this.Gv
-if((y&64)===0){y=(y|64)>>>0
-this.Gv=y
-if(y<128)this.Ri.t2(this)}},
-Iv:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-this.Lj.M8(this.pN,a)
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-pb:function(a,b){var z,y
-z=this.Gv
-y=new P.x1(this,a,b)
-if((z&1)!==0){this.Gv=(z|16)>>>0
-this.tk()
-z=this.lz
-if(!!J.x(z).$isb8)z.Qy(y)
-else y.$0()}else{y.$0()
-this.Kl((z&4)!==0)}},
-Pl:function(){var z,y
-z=new P.qQ(this)
-this.tk()
-this.Gv=(this.Gv|16)>>>0
-y=this.lz
-if(!!J.x(y).$isb8)y.Qy(z)
-else z.$0()},
-J7:function(a){var z=this.Gv
-this.Gv=(z|32)>>>0
-a.$0()
-this.Gv=(this.Gv&4294967263)>>>0
-this.Kl((z&4)!==0)},
-Kl:function(a){var z,y
-if((this.Gv&64)!==0){z=this.Ri
-z=z.gl0(z)}else z=!1
-if(z){z=(this.Gv&4294967231)>>>0
-this.Gv=z
-if((z&4)!==0)if(z<128){z=this.Ri
-z=z==null||z.gl0(z)}else z=!1
-else z=!1
-if(z)this.Gv=(this.Gv&4294967291)>>>0}for(;!0;a=y){z=this.Gv
-if((z&8)!==0){this.Ri=null
-return}y=(z&4)!==0
-if(a===y)break
-this.Gv=(z^32)>>>0
-if(y)this.uO()
-else this.LP()
-this.Gv=(this.Gv&4294967263)>>>0}z=this.Gv
-if((z&64)!==0&&z<128)this.Ri.t2(this)},
-$isOy:true,
-static:{"^":"Xx,bG,zC,Ir,nav,Dr,JAK,N3S,bsZ"}},
-x1:{
-"^":"Tp:18;a,b,c",
-$0:[function(){var z,y,x,w,v,u
-z=this.a
-y=z.Gv
-if((y&8)!==0&&(y&16)===0)return
-z.Gv=(y|32)>>>0
-y=z.Lj
-if(!y.fC($.X3))$.X3.hk(this.b,this.c)
-else{x=z.o7
-w=H.G3()
-w=H.KT(w,[w,w]).BD(x)
-v=z.o7
-u=this.b
-if(w)y.z8(v,u,this.c)
-else y.M8(v,u)}z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-qQ:{
-"^":"Tp:18;a",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-if((y&16)===0)return
-z.Gv=(y|42)>>>0
-z.Lj.bH(z.Bd)
-z.Gv=(z.Gv&4294967263)>>>0},"$0",null,0,0,null,"call"],
-$isEH:true},
-ez:{
-"^":"cb;",
-KR:function(a,b,c,d){var z=this.w4(!0===b)
-z.yl(a)
-z.fm(0,d)
-z.y5(c)
-return z},
-yI:function(a){return this.KR(a,null,null,null)},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-w4:function(a){var z,y
-z=$.X3
-y=a?1:0
-y=new P.KA(null,null,null,z,y,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-return y}},
-ti:{
-"^":"a;aw@"},
-fZ:{
-"^":"ti;P>,aw",
-dP:function(a){a.Iv(this.P)}},
-WG:{
-"^":"ti;kc>,I4<,aw",
-dP:function(a){a.pb(this.kc,this.I4)}},
-yRf:{
-"^":"a;",
-dP:function(a){a.Pl()},
-gaw:function(){return},
-saw:function(a){throw H.b(P.w("No events after a done."))}},
-B3P:{
-"^":"a;",
-t2:function(a){var z=this.Gv
-if(z===1)return
-if(z>=1){this.Gv=1
-return}P.rb(new P.lg(this,a))
-this.Gv=1},
-FK:function(){if(this.Gv===1)this.Gv=3}},
-lg:{
-"^":"Tp:69;a,b",
-$0:[function(){var z,y
-z=this.a
-y=z.Gv
-z.Gv=0
-if(y===3)return
-z.TO(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-qm:{
-"^":"B3P;zR,N6,Gv",
-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}},
-TO:function(a){var z,y
-z=this.zR
-y=z.gaw()
-this.zR=y
-if(y==null)this.N6=null
-z.dP(a)},
-V1:function(a){if(this.Gv===1)this.Gv=3
-this.N6=null
-this.zR=null}},
-EM:{
-"^":"a;Lj<,Gv,Bd",
-gUF:function(){return this.Gv>=4},
-yc:function(){if((this.Gv&2)!==0)return
-this.Lj.wr(this.gXm())
-this.Gv=(this.Gv|2)>>>0},
-yl:function(a){},
-fm:function(a,b){},
-y5:function(a){this.Bd=a},
-Fv:[function(a,b){this.Gv+=4
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-QE:[function(a){var z=this.Gv
-if(z>=4){z-=4
-this.Gv=z
-if(z<4&&(z&1)===0)this.yc()}},"$0","gDQ",0,0,18],
-ed:function(){return},
-Pl:[function(){var z=(this.Gv&4294967293)>>>0
-this.Gv=z
-if(z>=4)return
-this.Gv=(z|1)>>>0
-z=this.Bd
-if(z!=null)this.Lj.bH(z)},"$0","gXm",0,0,18],
-$isOy:true,
-static:{"^":"D4,ED7,Yi"}},
-dR:{
-"^":"Tp:69;a,b,c",
-$0:[function(){return this.a.K5(this.b,this.c)},"$0",null,0,0,null,"call"],
-$isEH:true},
-uR:{
-"^":"Tp:118;a,b",
-$2:function(a,b){return P.NX(this.a,this.b,a,b)},
-$isEH:true},
-Q0:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.rX(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-og:{
-"^":"cb;",
-KR:function(a,b,c,d){var z,y,x,w,v
-b=!0===b
-z=H.ip(this,"og",0)
-y=H.ip(this,"og",1)
-x=$.X3
-w=b?1:0
-v=H.VM(new P.fB(this,null,null,null,null,x,w,null,null),[z,y])
-v.S8(this,b,z,y)
-v.yl(a)
-v.fm(0,d)
-v.y5(c)
-return v},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)},
-ut:function(a,b){b.Rg(0,a)},
-$ascb:function(a,b){return[b]}},
-fB:{
-"^":"KA;KQ,Ee,pN,o7,Bd,Lj,Gv,lz,Ri",
-Rg:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.Rg.call(this,this,b)},
-oJ:function(a,b){if((this.Gv&2)!==0)return
-P.KA.prototype.oJ.call(this,a,b)},
-uO:[function(){var z=this.Ee
-if(z==null)return
-z.yy(0)},"$0","gp4",0,0,18],
-LP:[function(){var z=this.Ee
-if(z==null)return
-z.QE(0)},"$0","gZ9",0,0,18],
-tA:function(){var z=this.Ee
-if(z!=null){this.Ee=null
-z.ed()}return},
-vx:[function(a){this.KQ.ut(a,this)},"$1","gOa",2,0,function(){return H.XW(function(a,b){return{func:"kA6",void:true,args:[a]}},this.$receiver,"fB")},104],
-xL:[function(a,b){this.oJ(a,b)},"$2","gve",4,0,119,24,25],
-nn:[function(){this.YB()},"$0","gH1",0,0,18],
-S8:function(a,b,c,d){var z,y
-z=this.gOa()
-y=this.gve()
-this.Ee=this.KQ.Sb.zC(z,this.gH1(),y)},
-$asKA:function(a,b){return[b]},
-$asOy:function(a,b){return[b]}},
-nO:{
-"^":"og;qs,Sb",
-wW:function(a){return this.qs.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.wW(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}if(z===!0)J.z4(b,a)},
-$asog:function(a){return[a,a]},
-$ascb:null},
-c9:{
-"^":"og;TN,Sb",
-kn:function(a){return this.TN.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-z=null
-try{z=this.kn(a)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-b.oJ(y,x)
-return}J.z4(b,z)}},
-Bg:{
-"^":"og;pK,Sb",
-GW:function(a){return this.pK.$1(a)},
-ut:function(a,b){var z,y,x,w,v
-try{for(w=J.mY(this.GW(a));w.G();){z=w.gl()
-J.z4(b,z)}}catch(v){w=H.Ru(v)
-y=w
-x=new H.XO(v,null)
-b.oJ(y,x)}}},
-Xa:{
-"^":"a;"},
-Ob:{
-"^":"a;"},
-yQ:{
-"^":"a;E2<,cP<,Ot<,eo<,Ka<,Xp<,fb<,rb<,Zq<,NW,JS>,il<",
-hk:function(a,b){return this.E2.$2(a,b)},
-Gr:function(a){return this.cP.$1(a)},
-FI:function(a,b){return this.Ot.$2(a,b)},
-mg:function(a,b,c){return this.eo.$3(a,b,c)},
-Al:function(a){return this.Ka.$1(a)},
-wY:function(a){return this.Xp.$1(a)},
-O8:function(a){return this.fb.$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.Zq.$2(a,b)},
-Ch:function(a,b){return this.JS.$1(b)},
-qp:function(a){return this.il.$1$specification(a)}},
-AN:{
-"^":"a;"},
-dl:{
-"^":"a;"},
-Id:{
-"^":"a;nU",
-gLj:function(){return this.nU},
-x5:function(a,b,c){var z=this.nU
-for(;z.gtp().gE2()==null;)z=z.geT(z)
-return z.gtp().gE2().$5(z,new P.Id(z.geT(z)),a,b,c)},
-Vn:function(a,b){var z=this.nU
-for(;z.gtp().gcP()==null;)z=z.geT(z)
-return z.gtp().gcP().$4(z,new P.Id(z.geT(z)),a,b)},
-qG:function(a,b,c){var z=this.nU
-for(;z.gtp().gOt()==null;)z=z.geT(z)
-return z.gtp().gOt().$5(z,new P.Id(z.geT(z)),a,b,c)},
-nA:function(a,b,c,d){var z=this.nU
-for(;z.gtp().geo()==null;)z=z.geT(z)
-return z.gtp().geo().$6(z,new P.Id(z.geT(z)),a,b,c,d)},
-TE:function(a,b){var z=this.nU
-for(;z.gtp().gKa()==null;)z=z.geT(z)
-return z.gtp().gKa().$4(z,new P.Id(z.geT(z)),a,b)},
-xO:function(a,b){var z=this.nU
-for(;z.gtp().gXp()==null;)z=z.geT(z)
-return z.gtp().gXp().$4(z,new P.Id(z.geT(z)),a,b)},
-mz:function(a,b){var z=this.nU
-for(;z.gtp().gfb()==null;)z=z.geT(z)
-return z.gtp().gfb().$4(z,new P.Id(z.geT(z)),a,b)},
-RK:function(a,b){var z,y
-z=this.nU
-for(;z.gtp().grb()==null;)z=z.geT(z)
-y=z.geT(z)
-z.gtp().grb().$4(z,new P.Id(y),a,b)},
-dJ:function(a,b,c){var z=this.nU
-for(;z.gtp().gZq()==null;)z=z.geT(z)
-return z.gtp().gZq().$5(z,new P.Id(z.geT(z)),a,b,c)},
-RB:function(a,b,c){var z,y
-z=this.nU
-for(;y=z.gtp(),y.gJS(y)==null;)z=z.geT(z)
-y=z.gtp()
-y.gJS(y).$4(z,new P.Id(z.geT(z)),b,c)},
-ld:function(a,b,c){var z,y
-z=this.nU
-for(;z.gtp().gil()==null;)z=z.geT(z)
-y=z.geT(z)
-return z.gtp().gil().$5(z,new P.Id(y),a,b,c)}},
-fZi:{
-"^":"a;",
-fC:function(a){return this.gC5()===a.gC5()},
-bH:function(a){var z,y,x,w
-try{x=this.Gr(a)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-M8:function(a,b){var z,y,x,w
-try{x=this.FI(a,b)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-z8:function(a,b,c){var z,y,x,w
-try{x=this.mg(a,b,c)
-return x}catch(w){x=H.Ru(w)
-z=x
-y=new H.XO(w,null)
-return this.hk(z,y)}},
-xi:function(a,b){var z=this.Al(a)
-if(b)return new P.TF(this,z)
-else return new P.Xz(this,z)},
-ce:function(a){return this.xi(a,!0)},
-Nf:function(a,b){var z=this.wY(a)
-if(b)return new P.Cg(this,z)
-else return new P.Hs(this,z)},
-up:function(a,b){var z=this.O8(a)
-if(b)return new P.dv(this,z)
-else return new P.wd(this,z)}},
-TF:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.bH(this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Xz:{
-"^":"Tp:69;c,d",
-$0:[function(){return this.c.Gr(this.d)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Cg:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.M8(this.b,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-Hs:{
-"^":"Tp:13;c,d",
-$1:[function(a){return this.c.FI(this.d,a)},"$1",null,2,0,null,33,"call"],
-$isEH:true},
-dv:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){return this.a.z8(this.b,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-wd:{
-"^":"Tp:77;c,d",
-$2:[function(a,b){return this.c.mg(this.d,a,b)},"$2",null,4,0,null,9,10,"call"],
-$isEH:true},
-uo:{
-"^":"fZi;eT>,tp<,Se",
-gC5:function(){return this.eT.gC5()},
-t:function(a,b){var z,y
-z=this.Se
-y=z.t(0,b)
-if(y!=null||z.x4(b))return y
-return this.eT.t(0,b)},
-hk:function(a,b){return new P.Id(this).x5(this,a,b)},
-uI:function(a,b){return new P.Id(this).ld(this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return new P.Id(this).Vn(this,a)},
-FI:function(a,b){return new P.Id(this).qG(this,a,b)},
-mg:function(a,b,c){return new P.Id(this).nA(this,a,b,c)},
-Al:function(a){return new P.Id(this).TE(this,a)},
-wY:function(a){return new P.Id(this).xO(this,a)},
-O8:function(a){return new P.Id(this).mz(this,a)},
-wr:function(a){new P.Id(this).RK(this,a)},
-uN:function(a,b){return new P.Id(this).dJ(this,a,b)},
-Ch:function(a,b){new P.Id(this).RB(0,this,b)}},
-FO:{
-"^":"Tp:69;a,b",
-$0:[function(){P.IA(new P.eM(this.a,this.b))},"$0",null,0,0,null,"call"],
-$isEH:true},
-eM:{
-"^":"Tp:69;c,d",
-$0:[function(){var z,y
-z=this.c
-P.FL("Uncaught Error: "+H.d(z))
-y=this.d
-if(y==null&&!!J.x(z).$isXS)y=z.gI4()
-if(y!=null)P.FL("Stack Trace: \n"+H.d(y)+"\n")
-throw H.b(z)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Uez:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-AHi:{
-"^":"a;",
-gE2:function(){return P.wL()},
-hk:function(a,b){return this.gE2().$2(a,b)},
-gcP:function(){return P.lw()},
-Gr:function(a){return this.gcP().$1(a)},
-gOt:function(){return P.Un()},
-FI:function(a,b){return this.gOt().$2(a,b)},
-geo:function(){return P.iy()},
-mg:function(a,b,c){return this.geo().$3(a,b,c)},
-gKa:function(){return P.Qk()},
-Al:function(a){return this.gKa().$1(a)},
-gXp:function(){return P.zi()},
-wY:function(a){return this.gXp().$1(a)},
-gfb:function(){return P.v3()},
-O8:function(a){return this.gfb().$1(a)},
-grb:function(){return P.G2()},
-wr:function(a){return this.grb().$1(a)},
-RK:function(a,b){return this.grb().$2(a,b)},
-gZq:function(){return P.KF()},
-uN:function(a,b){return this.gZq().$2(a,b)},
-gJS:function(a){return P.aW()},
-Ch:function(a,b){return this.gJS(this).$1(b)},
-gil:function(){return P.Is()},
-qp:function(a){return this.gil().$1$specification(a)}},
-R81:{
-"^":"fZi;",
-geT:function(a){return},
-gtp:function(){return C.dS},
-gC5:function(){return this},
-fC:function(a){return a.gC5()===this},
-t:function(a,b){return},
-hk:function(a,b){return P.CK(this,null,this,a,b)},
-uI:function(a,b){return P.UA(this,null,this,a,b)},
-qp:function(a){return this.uI(a,null)},
-Gr:function(a){return P.T8(this,null,this,a)},
-FI:function(a,b){return P.yv(this,null,this,a,b)},
-mg:function(a,b,c){return P.Mu(this,null,this,a,b,c)},
-Al:function(a){return a},
-wY:function(a){return a},
-O8:function(a){return a},
-wr:function(a){P.Tk(this,null,this,a)},
-uN:function(a,b){return P.h8(this,null,this,a,b)},
-Ch:function(a,b){H.qw(b)
-return}}}],["dart.collection","dart:collection",,P,{
-"^":"",
-EF:function(a,b,c){return H.B7(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])},
-R2:[function(a,b){return J.xC(a,b)},"$2","lZ",4,0,45,46,47],
-T9:[function(a){return J.v1(a)},"$1","py",2,0,48,46],
-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.c7(a,b,c,d,e)},
-RN:function(a,b){return H.VM(new P.PL(0,null,null,null,null),[a,b])},
-l1:function(a,b,c,d){return H.VM(new P.jg(0,null,null,null,null),[d])},
-Ix:function(a,b,c){var z,y
-if(P.nH(a)){if(b==="("&&c===")")return"(...)"
-return b+"..."+c}z=[]
-y=$.Ex()
-y.push(a)
-try{P.T4(a,z)}finally{if(0>=y.length)return H.e(y,0)
-y.pop()}y=P.p9(b)
-y.We(z,", ")
-y.KF(c)
-return y.vM},
-WE:function(a,b,c){var z,y
-if(P.nH(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.gvM()},
-nH:function(a){var z,y
-for(z=0;y=$.Ex(),z<y.length;++z)if(a===y[z])return!0
-return!1},
-T4:function(a,b){var z,y,x,w,v,u,t,s,r,q
-z=a.gA(a)
-y=0
-x=0
-while(!0){if(!(y<80||x<3))break
-if(!z.G())return
-w=H.d(z.gl())
-b.push(w)
-y+=w.length+2;++x}if(!z.G()){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))
-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
-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("...")
-return}}u=H.d(t)
-v=H.d(s)
-y+=v.length+u.length+4}}if(x>b.length+2){y+=5
-q="..."}else q=null
-while(!0){if(!(y>80&&b.length>3))break
-if(0>=b.length)return H.e(b,0)
-y-=b.pop().length+2
-if(q==null){y+=5
-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])},
-vW:function(a){var z,y
-z={}
-if(P.nH(a))return"{...}"
-y=P.p9("")
-try{$.Ex().push(a)
-y.KF("{")
-z.a=!0
-J.Me(a,new P.W0(z,y))
-y.KF("}")}finally{z=$.Ex()
-if(0>=z.length)return H.e(z,0)
-z.pop()}return y.gvM()},
-bA:{
-"^":"a;X5,vv,OX,OB,wV",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.fG(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.fG(this),[H.Kp(this,0)]),new P.oi(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-return z==null?!1:z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-return y==null?!1:y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-FV:function(a,b){H.bQ(b,new P.DJ(this))},
-t:function(a,b){var z,y,x,w
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-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.OX
-if(w==null)y=null
-else{x=w[b]
-y=x===w?null:x}return y}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(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.vv
-if(z==null){z=P.SQ()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.SQ()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.SQ()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null){P.cW(z,y,[a,b]);++this.X5
-this.wV=null}else{w=this.aH(x,a)
-if(w>=0)x[w+1]=b
-else{x.push(a,b);++this.X5
-this.wV=null}}},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return;--this.X5
-this.wV=null
-return y.splice(x,2)[1]},
-V1:function(a){if(this.X5>0){this.wV=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-aN:function(a,b){var z,y,x,w
-z=this.Ig()
-for(y=z.length,x=0;x<y;++x){w=z[x]
-b.$2(w,this.t(0,w))
-if(z!==this.wV)throw H.b(P.a4(this))}},
-Ig:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.wV
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-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.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-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.wV=y
-return y},
-dg:function(a,b,c){if(a[b]==null){++this.X5
-this.wV=null}P.cW(a,b,c)},
-Nv:function(a,b){var z
-if(a!=null&&a[b]!=null){z=P.vL(a,b)
-delete a[b];--this.X5
-this.wV=null
-return z}else return},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isZ0:true,
-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},SQ:function(){var z=Object.create(null)
-P.cW(z,"<non-identifier-key>",z)
-delete z["<non-identifier-key>"]
-return z}}},
-oi:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-DJ:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vP",args:[a,b]}},this.a,"bA")}},
-PL:{
-"^":"bA;X5,vv,OX,OB,wV",
-nm:function(a){return H.CU(a)&0x3ffffff},
-aH:function(a,b){var z,y,x
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2){x=a[y]
-if(x==null?b==null:x===b)return y}return-1}},
-Fq:{
-"^":"bA;m6,Q6,hg,X5,vv,OX,OB,wV",
-C2:function(a,b){return this.m6.$2(a,b)},
-H5:function(a){return this.Q6.$1(a)},
-Ef:function(a){return this.hg.$1(a)},
-t:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.Dl.call(this,b)},
-u:function(a,b,c){P.bA.prototype.ms.call(this,b,c)},
-x4:function(a){if(this.Ef(a)!==!0)return!1
-return P.bA.prototype.Zt.call(this,a)},
-Rz:function(a,b){if(this.Ef(b)!==!0)return
-return P.bA.prototype.bB.call(this,b)},
-nm:function(a){return this.H5(a)&0x3ffffff},
-aH:function(a,b){var z,y
-if(a==null)return-1
-z=a.length
-for(y=0;y<z;y+=2)if(this.C2(a[y],b)===!0)return y
-return-1},
-bu:function(a){return P.vW(this)},
-static:{c7:function(a,b,c,d,e){var z=new P.jG(d)
-return H.VM(new P.Fq(a,b,z,0,null,null,null,null),[d,e])}}},
-jG:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-fG:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z=this.Fb
-z=new P.EQ(z,z.Ig(),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x,w
-z=this.Fb
-y=z.Ig()
-for(x=y.length,w=0;w<x;++w){b.$1(y[w])
-if(y!==z.wV)throw H.b(P.a4(z))}},
-$isyN:true},
-EQ:{
-"^":"a;Fb,wV,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.wV
-y=this.zi
-x=this.Fb
-if(z!==x.wV)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-YB:{
-"^":"a;X5,vv,OX,OB,H9,lX,zN",
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-gvc:function(){return H.VM(new P.i5(this),[H.Kp(this,0)])},
-gUQ:function(a){return H.K1(H.VM(new P.i5(this),[H.Kp(this,0)]),new P.a1(this),H.Kp(this,0),H.Kp(this,1))},
-x4:function(a){var z,y
-if(typeof a==="string"&&a!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[a]!=null}else if(typeof a==="number"&&(a&0x3ffffff)===a){y=this.OX
-if(y==null)return!1
-return y[a]!=null}else return this.Zt(a)},
-Zt:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(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.vv
-if(z==null)return
-y=z[b]
-return y==null?null:y.gcA()}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null)return
-y=x[b]
-return y==null?null:y.gcA()}else return this.Dl(b)},
-Dl:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return y[x].gcA()},
-u:function(a,b,c){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){z=P.Jc()
-this.vv=z}this.dg(z,b,c)}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null){y=P.Jc()
-this.OX=y}this.dg(y,b,c)}else this.ms(b,c)},
-ms:function(a,b){var z,y,x,w
-z=this.OB
-if(z==null){z=P.Jc()
-this.OB=z}y=this.nm(a)
-x=z[y]
-if(x==null)z[y]=[this.pE(a,b)]
-else{w=this.aH(x,a)
-if(w>=0)x[w].scA(b)
-else x.push(this.pE(a,b))}},
-to:function(a,b){var z
-if(this.x4(a))return this.t(0,a)
-z=b.$0()
-this.u(0,a,z)
-return z},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x,w
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-w=y.splice(x,1)[0]
-this.Vb(w)
-return w.gcA()},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$2(z.gkh(),z.gcA())
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-dg:function(a,b,c){var z=a[b]
-if(z==null)a[b]=this.pE(b,c)
-else z.scA(c)},
-Nv:function(a,b){var z
-if(a==null)return
-z=a[b]
-if(z==null)return
-this.Vb(z)
-delete a[b]
-return z.gcA()},
-pE:function(a,b){var z,y
-z=new P.db(a,b,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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].gkh(),b))return y
-return-1},
-bu:function(a){return P.vW(this)},
-$isFo:true,
-$isZ0:true,
-static:{Jc:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-a1:{
-"^":"Tp:13;a",
-$1:[function(a){return this.a.t(0,a)},"$1",null,2,0,null,120,"call"],
-$isEH:true},
-pk:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"oK",args:[a,b]}},this.a,"YB")}},
-db:{
-"^":"a;kh<,cA@,DG@,zQ@"},
-i5:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.X5},
-gl0:function(a){return this.Fb.X5===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.N6(z,z.zN,null,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.zq=z.H9
-return y},
-tg:function(a,b){return this.Fb.x4(b)},
-aN:function(a,b){var z,y,x
-z=this.Fb
-y=z.H9
-x=z.zN
-for(;y!=null;){b.$1(y.gkh())
-if(x!==z.zN)throw H.b(P.a4(z))
-y=y.gDG()}},
-$isyN:true},
-N6:{
-"^":"a;Fb,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.Fb
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gkh()
-this.zq=this.zq.gDG()
-return!0}}}},
-jg:{
-"^":"lN;X5,vv,OX,OB,DM",
-gA:function(a){var z=new P.cN(this,this.Zl(),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},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-return z==null?!1:z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-return y==null?!1:y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV: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.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.UQ(y,x)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.V5()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[b]
-else{if(this.aH(x,b)>=0)return!1
-x.push(b)}++this.X5
-this.DM=null
-return!0},
-FV:function(a,b){var z
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();)this.h(0,z.lo)},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1;--this.X5
-this.DM=null
-y.splice(x,1)
-return!0},
-V1:function(a){if(this.X5>0){this.DM=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0}},
-Zl:function(){var z,y,x,w,v,u,t,s,r,q,p,o
-z=this.DM
-if(z!=null)return z
-y=Array(this.X5)
-y.fixed$length=init
-x=this.vv
-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.OX
-if(s!=null){w=Object.getOwnPropertyNames(s)
-v=w.length
-for(t=0;t<v;++t){y[u]=+w[t];++u}}r=this.OB
-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.DM=y
-return y},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=0;++this.X5
-this.DM=null
-return!0},
-Nv:function(a,b){if(a!=null&&a[b]!=null){delete a[b];--this.X5
-this.DM=null
-return!0}else return!1},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{V5:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-cN:{
-"^":"a;O2,DM,zi,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.DM
-y=this.zi
-x=this.O2
-if(z!==x.DM)throw H.b(P.a4(x))
-else if(y>=z.length){this.fD=null
-return!1}else{this.fD=z[y]
-this.zi=y+1
-return!0}}},
-D0:{
-"^":"lN;X5,vv,OX,OB,H9,lX,zN",
-gA:function(a){var z=H.VM(new P.zQ(this,this.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-gB:function(a){return this.X5},
-gl0:function(a){return this.X5===0},
-gor:function(a){return this.X5!==0},
-tg:function(a,b){var z,y
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null)return!1
-return z[b]!=null}else if(typeof b==="number"&&(b&0x3ffffff)===b){y=this.OX
-if(y==null)return!1
-return y[b]!=null}else return this.bk(b)},
-bk:function(a){var z=this.OB
-if(z==null)return!1
-return this.aH(z[this.nm(a)],a)>=0},
-hV: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.AD(a)},
-AD:function(a){var z,y,x
-z=this.OB
-if(z==null)return
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return
-return J.Nq(J.UQ(y,x))},
-aN:function(a,b){var z,y
-z=this.H9
-y=this.zN
-for(;z!=null;){b.$1(z.gGc(z))
-if(y!==this.zN)throw H.b(P.a4(this))
-z=z.gDG()}},
-grZ:function(a){var z=this.lX
-if(z==null)throw H.b(P.w("No elements"))
-return z.gGc(z)},
-h:function(a,b){var z,y,x
-if(typeof b==="string"&&b!=="__proto__"){z=this.vv
-if(z==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.vv=y
-z=y}return this.jn(z,b)}else if(typeof b==="number"&&(b&0x3ffffff)===b){x=this.OX
-if(x==null){y=Object.create(null)
-y["<non-identifier-key>"]=y
-delete y["<non-identifier-key>"]
-this.OX=y
-x=y}return this.jn(x,b)}else return this.NZ(0,b)},
-NZ:function(a,b){var z,y,x
-z=this.OB
-if(z==null){z=P.T2()
-this.OB=z}y=this.nm(b)
-x=z[y]
-if(x==null)z[y]=[this.xf(b)]
-else{if(this.aH(x,b)>=0)return!1
-x.push(this.xf(b))}return!0},
-Rz:function(a,b){if(typeof b==="string"&&b!=="__proto__")return this.Nv(this.vv,b)
-else if(typeof b==="number"&&(b&0x3ffffff)===b)return this.Nv(this.OX,b)
-else return this.bB(b)},
-bB:function(a){var z,y,x
-z=this.OB
-if(z==null)return!1
-y=z[this.nm(a)]
-x=this.aH(y,a)
-if(x<0)return!1
-this.Vb(y.splice(x,1)[0])
-return!0},
-V1:function(a){if(this.X5>0){this.lX=null
-this.H9=null
-this.OB=null
-this.OX=null
-this.vv=null
-this.X5=0
-this.zN=this.zN+1&67108863}},
-jn:function(a,b){if(a[b]!=null)return!1
-a[b]=this.xf(b)
-return!0},
-Nv:function(a,b){var z
-if(a==null)return!1
-z=a[b]
-if(z==null)return!1
-this.Vb(z)
-delete a[b]
-return!0},
-xf:function(a){var z,y
-z=new P.tj(a,null,null)
-if(this.H9==null){this.lX=z
-this.H9=z}else{y=this.lX
-z.zQ=y
-y.sDG(z)
-this.lX=z}++this.X5
-this.zN=this.zN+1&67108863
-return z},
-Vb:function(a){var z,y
-z=a.gzQ()
-y=a.gDG()
-if(z==null)this.H9=y
-else z.sDG(y)
-if(y==null)this.lX=z
-else y.szQ(z);--this.X5
-this.zN=this.zN+1&67108863},
-nm:function(a){return J.v1(a)&0x3ffffff},
-aH: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
-return-1},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{T2:function(){var z=Object.create(null)
-z["<non-identifier-key>"]=z
-delete z["<non-identifier-key>"]
-return z}}},
-tj:{
-"^":"a;Gc>,DG@,zQ@"},
-zQ:{
-"^":"a;O2,zN,zq,fD",
-gl:function(){return this.fD},
-G:function(){var z=this.O2
-if(this.zN!==z.zN)throw H.b(P.a4(z))
-else{z=this.zq
-if(z==null){this.fD=null
-return!1}else{this.fD=z.gGc(z)
-this.zq=this.zq.gDG()
-return!0}}}},
-Yp:{
-"^":"w2Y;G4",
-gB:function(a){return this.G4.length},
-t:function(a,b){var z=this.G4
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]}},
-lN:{
-"^":"Vj;"},
-mW:{
-"^":"a;",
-ez:[function(a,b){return H.K1(this,b,H.ip(this,"mW",0),null)},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"Uy",ret:P.QV,args:[{func:"YM",args:[a]}]}},this.$receiver,"mW")},31],
-ad:function(a,b){return H.VM(new H.U5(this,b),[H.ip(this,"mW",0)])},
-lM:[function(a,b){return H.VM(new H.oA(this,b),[H.ip(this,"mW",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"RS",ret:P.QV,args:[{func:"tr",ret:P.QV,args:[a]}]}},this.$receiver,"mW")},31],
-tg:function(a,b){var z
-for(z=this.gA(this);z.G();)if(J.xC(z.gl(),b))return!0
-return!1},
-aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
-zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-tt:function(a,b){return P.F(this,b,H.ip(this,"mW",0))},
-br:function(a){return this.tt(a,!0)},
-gB:function(a){var z,y
-z=this.gA(this)
-for(y=0;z.G();)++y
-return y},
-gl0:function(a){return!this.gA(this).G()},
-gor:function(a){return this.gl0(this)!==!0},
-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())
-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.Ix(this,"(",")")},
-$isQV:true,
-$asQV:null},
-ark:{
-"^":"E9h;"},
-E9h:{
-"^":"a+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-lD:{
-"^":"a;",
-gA:function(a){return H.VM(new H.a7(a,this.gB(a),0,null),[H.ip(a,"lD",0)])},
-Zv:function(a,b){return this.t(a,b)},
-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},
-gor:function(a){return!this.gl0(a)},
-grZ:function(a){if(this.gB(a)===0)throw H.b(P.w("No elements"))
-return this.t(a,this.gB(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},
-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=P.p9("")
-z.We(a,b)
-return z.vM},
-ad:function(a,b){return H.VM(new H.U5(a,b),[H.ip(a,"lD",0)])},
-ez:[function(a,b){return H.VM(new H.A8(a,b),[null,null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"fQO",ret:P.QV,args:[{func:"K6",args:[a]}]}},this.$receiver,"lD")},31],
-lM:[function(a,b){return H.VM(new H.oA(a,b),[H.ip(a,"lD",0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"mh",ret:P.QV,args:[{func:"VL",ret:P.QV,args:[a]}]}},this.$receiver,"lD")},31],
-eR:function(a,b){return H.q9(a,b,null,null)},
-tt:function(a,b){var z,y,x
-if(b){z=H.VM([],[H.ip(a,"lD",0)])
-C.Nm.sB(z,this.gB(a))}else{y=Array(this.gB(a))
-y.fixed$length=init
-z=H.VM(y,[H.ip(a,"lD",0)])}for(x=0;x<this.gB(a);++x){y=this.t(a,x)
-if(x>=z.length)return H.e(z,x)
-z[x]=y}return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){var z=this.gB(a)
-this.sB(a,z+1)
-this.u(a,z,b)},
-FV:function(a,b){var z,y,x
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);z.G();){y=z.lo
-x=this.gB(a)
-this.sB(a,x+1)
-this.u(a,x,y)}},
-V1:function(a){this.sB(a,0)},
-GT:function(a,b){if(b==null)b=P.n4()
-H.ZE(a,0,this.gB(a)-1,b)},
-Jd:function(a){return this.GT(a,null)},
-pZ:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.D(b,this.gB(a)))throw H.b(P.TE(b,0,this.gB(a)))
-z=J.Wx(c)
-if(z.C(c,b)||z.D(c,this.gB(a)))throw H.b(P.TE(c,b,this.gB(a)))},
-Mu:function(a,b,c){this.pZ(a,b,c)
-return H.q9(a,b,c,null)},
-UZ:function(a,b,c){var z
-this.pZ(a,b,c)
-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)))
-z=c-b
-if(z===0)return
-if(e<0)throw H.b(P.u(e))
-y=J.x(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))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-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
-return-1},
-u8: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
-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)},
-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)
-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)
-this.Mh(a,b,c)},
-Mh:function(a,b,c){var z,y
-z=J.x(c)
-if(!!z.$isWO)this.vg(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,"[","]")},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-W0:{
-"^":"Tp:77;a,b",
-$2:[function(a,b){var z=this.a
-if(!z.a)this.b.KF(", ")
-z.a=!1
-z=this.b
-z.KF(a)
-z.KF(": ")
-z.KF(b)},"$2",null,4,0,null,121,64,"call"],
-$isEH:true},
-Sw:{
-"^":"mW;v5,av,eZ,qT",
-gA:function(a){var z=new P.KG(this,this.eZ,this.qT,this.av,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-aN:function(a,b){var z,y,x
-z=this.qT
-for(y=this.av;y!==this.eZ;y=(y+1&this.v5.length-1)>>>0){x=this.v5
-if(y<0||y>=x.length)return H.e(x,y)
-b.$1(x[y])
-if(z!==this.qT)H.vh(P.a4(this))}},
-gl0:function(a){return this.av===this.eZ},
-gB:function(a){return(this.eZ-this.av&this.v5.length-1)>>>0},
-grZ:function(a){var z,y,x
-z=this.av
-y=this.eZ
-if(z===y)throw H.b(H.DU())
-z=this.v5
-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.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}this.GP(z)
-return z},
-br:function(a){return this.tt(a,!0)},
-h:function(a,b){this.NZ(0,b)},
-FV:function(a,b){var z,y,x,w,v,u,t,s,r
-z=b.length
-y=this.gB(this)
-x=y+z
-w=this.v5
-v=w.length
-if(x>=v){u=P.Pd(x)
-if(typeof u!=="number")return H.s(u)
-w=Array(u)
-w.fixed$length=init
-t=H.VM(w,[H.Kp(this,0)])
-this.eZ=this.GP(t)
-this.v5=t
-this.av=0
-H.qG(t,y,x,b,0)
-this.eZ+=z}else{x=this.eZ
-s=v-x
-if(z<s){H.qG(w,x,x+z,b,0)
-this.eZ+=z}else{r=z-s
-H.qG(w,x,x+s,b,0)
-x=this.v5
-H.qG(x,0,r,b,s)
-this.eZ=r}}++this.qT},
-V1:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-if(z!==y){for(x=this.v5,w=x.length,v=w-1;z!==y;z=(z+1&v)>>>0){if(z<0||z>=w)return H.e(x,z)
-x[z]=null}this.eZ=0
-this.av=0;++this.qT}},
-bu:function(a){return P.WE(this,"{","}")},
-AR:function(){var z,y,x,w
-z=this.av
-if(z===this.eZ)throw H.b(H.DU());++this.qT
-y=this.v5
-x=y.length
-if(z>=x)return H.e(y,z)
-w=y[z]
-y[z]=null
-this.av=(z+1&x-1)>>>0
-return w},
-NZ:function(a,b){var z,y,x
-z=this.v5
-y=this.eZ
-x=z.length
-if(y<0||y>=x)return H.e(z,y)
-z[y]=b
-x=(y+1&x-1)>>>0
-this.eZ=x
-if(this.av===x)this.M9();++this.qT},
-M9:function(){var z,y,x,w
-z=Array(this.v5.length*2)
-z.fixed$length=init
-y=H.VM(z,[H.Kp(this,0)])
-z=this.v5
-x=this.av
-w=z.length-x
-H.qG(y,0,w,z,x)
-z=this.av
-x=this.v5
-H.qG(y,w,w+z,x,0)
-this.av=0
-this.eZ=this.v5.length
-this.v5=y},
-GP:function(a){var z,y,x,w,v
-z=this.av
-y=this.eZ
-x=this.v5
-if(z<=y){w=y-z
-H.qG(a,0,w,x,z)
-return w}else{v=x.length-z
-H.qG(a,0,v,x,z)
-z=this.eZ
-y=this.v5
-H.qG(a,v,v+z,y,0)
-return this.eZ+v}},
-Eo:function(a,b){var z=Array(8)
-z.fixed$length=init
-this.v5=H.VM(z,[b])},
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{"^":"TNe",Pd:function(a){var z
-if(typeof a!=="number")return a.O()
-a=(a<<2>>>0)-1
-for(;!0;a=z){z=(a&a-1)>>>0
-if(z===0)return a}}}},
-KG:{
-"^":"a;Lz,pP,qT,Dc,fD",
-gl:function(){return this.fD},
-G:function(){var z,y,x
-z=this.Lz
-if(this.qT!==z.qT)H.vh(P.a4(z))
-y=this.Dc
-if(y===this.pP){this.fD=null
-return!1}z=z.v5
-x=z.length
-if(y>=x)return H.e(z,y)
-this.fD=z[y]
-this.Dc=(y+1&x-1)>>>0
-return!0}},
-lfu:{
-"^":"a;",
-gl0:function(a){return this.gB(this)===0},
-gor:function(a){return this.gB(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())},
-Ex:function(a){var z
-for(z=H.VM(new H.a7(a,a.length,0,null),[H.Kp(a,0)]);z.G();)this.Rz(0,z.lo)},
-tt:function(a,b){var z,y,x,w,v
-if(b){z=H.VM([],[H.Kp(this,0)])
-C.Nm.sB(z,this.gB(this))}else{y=Array(this.gB(this))
-y.fixed$length=init
-z=H.VM(y,[H.Kp(this,0)])}for(y=this.gA(this),x=0;y.G();x=v){w=y.gl()
-v=x+1
-if(x>=z.length)return H.e(z,x)
-z[x]=w}return z},
-br:function(a){return this.tt(a,!0)},
-ez:[function(a,b){return H.VM(new H.xy(this,b),[H.Kp(this,0),null])},"$1","gIr",2,0,function(){return H.XW(function(a){return{func:"xPo",ret:P.QV,args:[{func:"ubj",args:[a]}]}},this.$receiver,"lfu")},31],
-bu:function(a){return P.WE(this,"{","}")},
-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.Kp(this,0),null])},"$1","git",2,0,function(){return H.XW(function(a){return{func:"Gba",ret:P.QV,args:[{func:"D6",ret:P.QV,args:[a]}]}},this.$receiver,"lfu")},31],
-aN:function(a,b){var z
-for(z=this.gA(this);z.G();)b.$1(z.gl())},
-zV:function(a,b){var z,y,x
-z=this.gA(this)
-if(!z.G())return""
-y=P.p9("")
-if(b==="")do{x=H.d(z.gl())
-y.vM+=x}while(z.G())
-else{y.KF(H.d(z.gl()))
-for(;z.G();){y.vM+=b
-x=H.d(z.gl())
-y.vM+=x}}return y.vM},
-Vr:function(a,b){var z
-for(z=this.gA(this);z.G();)if(b.$1(z.gl())===!0)return!0
-return!1},
-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())
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:null},
-Vj:{
-"^":"lfu;"},
-oz:{
-"^":"a;G3>,Bb>,T8>",
-$isoz:true},
-jp:{
-"^":"oz;P*,G3,Bb,T8",
-$asoz:function(a,b){return[a]}},
-Xt:{
-"^":"a;",
-vh:function(a){var z,y,x,w,v,u,t,s
-z=this.aY
-if(z==null)return-1
-y=this.iW
-for(x=y,w=x,v=null;!0;){v=this.yV(z.G3,a)
-u=J.Wx(v)
-if(u.D(v,0)){u=z.Bb
-if(u==null)break
-v=this.yV(u.G3,a)
-if(J.z8(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
-x=z
-z=s}else{if(u.C(v,0)){u=z.T8
-if(u==null)break
-v=this.yV(u.G3,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
-w=z
-z=s}}w.T8=z.Bb
-x.Bb=z.T8
-z.Bb=y.T8
-z.T8=y.Bb
-this.aY=z
-y.T8=null
-y.Bb=null;++this.bb
-return v},
-K8:function(a,b){var z,y;++this.J0;++this.qT
-if(this.aY==null){this.aY=a
-return}z=J.u6(b,0)
-y=this.aY
-if(z){a.Bb=y
-a.T8=y.T8
-y.T8=null}else{a.T8=y
-a.Bb=y.Bb
-y.Bb=null}this.aY=a}},
-Ba:{
-"^":"Xt;qW,hg,aY,iW,J0,qT,bb",
-wS:function(a,b){return this.qW.$2(a,b)},
-Ef:function(a){return this.hg.$1(a)},
-yV:function(a,b){return this.wS(a,b)},
-t:function(a,b){if(b==null)throw H.b(P.u(b))
-if(this.Ef(b)!==!0)return
-if(this.aY!=null)if(J.xC(this.vh(b),0))return this.aY.P
-return},
-u:function(a,b,c){var z
-if(b==null)throw H.b(P.u(b))
-z=this.vh(b)
-if(J.xC(z,0)){this.aY.P=c
-return}this.K8(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.aY==null},
-gor:function(a){return this.aY!=null},
-aN:function(a,b){var z,y,x
-z=H.Kp(this,0)
-y=H.VM(new P.HW(this,H.VM([],[P.oz]),this.qT,this.bb,null),[z])
-y.Qf(this,[P.oz,z])
-for(;y.G();){x=y.gl()
-z=J.RE(x)
-b.$2(z.gG3(x),z.gP(x))}},
-gB:function(a){return this.J0},
-V1:function(a){this.aY=null
-this.J0=0;++this.qT},
-gvc:function(){return H.VM(new P.nF(this),[H.Kp(this,0)])},
-gUQ:function(a){var z=new P.ro(this)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-bu:function(a){return P.vW(this)},
-$isBa:true,
-$asXt:function(a,b){return[a]},
-$asZ0:null,
-$isZ0: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])}}},
-An:{
-"^":"Tp:13;a",
-$1:function(a){var z=H.IU(a,this.a)
-return z},
-$isEH:true},
-QG:{
-"^":"Tp;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"lb",args:[a,b]}},this.a,"Ba")}},
-S6B:{
-"^":"a;",
-gl:function(){var z=this.ya
-if(z==null)return
-return this.Wb(z)},
-Az:function(a){var z
-for(z=this.Jt;a!=null;){z.push(a)
-a=a.Bb}},
-G:function(){var z,y,x
-z=this.lT
-if(this.qT!==z.qT)throw H.b(P.a4(z))
-y=this.Jt
-if(y.length===0){this.ya=null
-return!1}if(z.bb!==this.bb&&this.ya!=null){x=this.ya
-C.Nm.sB(y,0)
-if(x==null)this.Az(z.aY)
-else{z.vh(x.G3)
-this.Az(z.aY.T8)}}if(0>=y.length)return H.e(y,0)
-z=y.pop()
-this.ya=z
-this.Az(z.T8)
-return!0},
-Qf:function(a,b){this.Az(a.aY)}},
-nF:{
-"^":"mW;lT",
-gB:function(a){return this.lT.J0},
-gl0:function(a){return this.lT.J0===0},
-gA:function(a){var z,y
-z=this.lT
-y=new P.DN(z,H.VM([],[P.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,0))
-return y},
-$isyN:true},
-ro:{
-"^":"mW;Fb",
-gB:function(a){return this.Fb.J0},
-gl0:function(a){return this.Fb.J0===0},
-gA:function(a){var z,y
-z=this.Fb
-y=new P.ZM(z,H.VM([],[P.oz]),z.qT,z.bb,null)
-y.$builtinTypeInfo=this.$builtinTypeInfo
-y.Qf(z,H.Kp(this,1))
-return y},
-$asmW:function(a,b){return[b]},
-$asQV:function(a,b){return[b]},
-$isyN:true},
-DN:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.G3}},
-ZM:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a.P},
-$asS6B:function(a,b){return[b]}},
-HW:{
-"^":"S6B;lT,Jt,qT,bb,ya",
-Wb:function(a){return a},
-$asS6B:function(a){return[[P.oz,a]]}}}],["dart.convert","dart:convert",,P,{
-"^":"",
-VQ:function(a,b){var z=b==null?new P.hW():b
-return z.$2(null,new P.f1(z).$1(a))},
-jc:function(a,b){var z,y,x,w
-x=a
-if(typeof x!=="string")throw H.b(P.u(a))
-z=null
-try{z=JSON.parse(a)}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.cD(String(y)))}return P.VQ(z,b)},
-NC:[function(a){return a.Lt()},"$1","bx",2,0,49,50],
-hW:{
-"^":"Tp:77;",
-$2:function(a,b){return b},
-$isEH:true},
-f1:{
-"^":"Tp:13;a",
-$1:function(a){var z,y,x,w,v,u,t
-if(a==null||typeof a!="object")return a
-if(Object.getPrototypeOf(a)===Array.prototype){z=a
-for(y=this.a,x=0;x<z.length;++x)z[x]=y.$2(x,this.$1(z[x]))
-return z}w=Object.keys(a)
-v=P.Fl(null,null)
-for(y=this.a,x=0;x<w.length;++x){u=w[x]
-v.u(0,u,y.$2(u,this.$1(a[u])))}t=a.__proto__
-if(typeof t!=="undefined"&&t!==Object.prototype)v.u(0,"__proto__",y.$2("__proto__",this.$1(t)))
-return v},
-$isEH:true},
-Ukr:{
-"^":"a;"},
-zF:{
-"^":"a;"},
-Ziv:{
-"^":"Ukr;",
-$asUkr:function(){return[P.qU,[P.WO,P.KN]]}},
-AJ:{
-"^":"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."},
-static:{Gy:function(a,b){return new P.AJ(a,b)}}},
-K8:{
-"^":"AJ;Ct,FN",
-bu:function(a){return"Cyclic error in JSON stringify"},
-static:{TP:function(a){return new P.K8(a,null)}}},
-pE:{
-"^":"Ukr;qa<,fO",
-pW:function(a,b){return P.jc(a,this.gHe().qa)},
-kV:function(a){return this.pW(a,null)},
-Q0:function(a,b){var z=this.gZE()
-return P.Vg(a,z.SI,z.UM)},
-KP:function(a){return this.Q0(a,null)},
-gZE:function(){return C.Sr},
-gHe:function(){return C.A3},
-$asUkr:function(){return[P.a,P.qU]}},
-ojF:{
-"^":"zF;UM,SI",
-$aszF:function(){return[P.a,P.qU]}},
-c5:{
-"^":"zF;qa<",
-$aszF:function(){return[P.qU,P.a]}},
-Sh:{
-"^":"a;fO,p8,ol",
-iY:function(a){return this.fO.$1(a)},
-Ip:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=z.gB(a)
-if(typeof y!=="number")return H.s(y)
-x=this.p8
-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.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-switch(u){case 8:t=H.Lw(98)
-x.vM+=t
-break
-case 9:t=H.Lw(116)
-x.vM+=t
-break
-case 10:t=H.Lw(110)
-x.vM+=t
-break
-case 12:t=H.Lw(102)
-x.vM+=t
-break
-case 13:t=H.Lw(114)
-x.vM+=t
-break
-default:t=H.Lw(117)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=H.Lw(48)
-x.vM+=t
-t=u>>>4&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-t=u&15
-t=H.Lw(t<10?48+t:87+t)
-x.vM+=t
-break}}else if(u===34||u===92){if(v>w){t=z.Nj(a,w,v)
-x.vM+=t}w=v+1
-t=H.Lw(92)
-x.vM+=t
-t=H.Lw(u)
-x.vM+=t}}if(w===0)x.vM+=typeof a==="string"?a:H.d(a)
-else if(w<y){z=z.Nj(a,w,y)
-x.vM+=z}},
-WD:function(a){var z,y,x,w
-for(z=this.ol,y=z.length,x=0;x<y;++x){w=z[x]
-if(a==null?w==null:a===w)throw H.b(P.TP(a))}z.push(a)},
-C7:function(a){var z,y,x,w
-if(!this.IS(a)){this.WD(a)
-try{z=this.iY(a)
-if(!this.IS(z)){x=P.Gy(a,null)
-throw H.b(x)}x=this.ol
-if(0>=x.length)return H.e(x,0)
-x.pop()}catch(w){x=H.Ru(w)
-y=x
-throw H.b(P.Gy(a,y))}}},
-IS:function(a){var z,y,x,w,v,u
-if(typeof a==="number"){if(!C.CD.gx8(a))return!1
-this.p8.KF(C.CD.bu(a))
-return!0}else if(a===!0){this.p8.KF("true")
-return!0}else if(a===!1){this.p8.KF("false")
-return!0}else if(a==null){this.p8.KF("null")
-return!0}else if(typeof a==="string"){z=this.p8
-z.KF("\"")
-this.Ip(a)
-z.KF("\"")
-return!0}else{z=J.x(a)
-if(!!z.$isWO){this.WD(a)
-y=this.p8
-y.KF("[")
-if(z.gB(a)>0){this.C7(z.t(a,0))
-for(x=1;x<z.gB(a);++x){y.vM+=","
-this.C7(z.t(a,x))}}y.KF("]")
-this.pg(a)
-return!0}else if(!!z.$isZ0){this.WD(a)
-y=this.p8
-y.KF("{")
-for(w=J.mY(a.gvc()),v="\"";w.G();v=",\""){u=w.gl()
-y.vM+=v
-this.Ip(u)
-y.vM+="\":"
-this.C7(z.t(a,u))}y.KF("}")
-this.pg(a)
-return!0}else return!1}},
-pg:function(a){var z=this.ol
-if(0>=z.length)return H.e(z,0)
-z.pop()},
-static:{"^":"Gsm,hyY,IE,Jyf,NoV,HVe,tF,BLm,KQz,i6,ql,NXu,PBv,QVv",xl:function(a,b,c){return new P.Sh(b,a,[])},Vg:function(a,b,c){var z
-b=P.bx()
-z=P.p9("")
-P.xl(z,b,c).C7(a)
-return z.vM}}},
-u5F:{
-"^":"Ziv;Iy",
-goc:function(a){return"utf-8"},
-gZE:function(){return new P.om()}},
-om:{
-"^":"zF;",
-WJ:function(a){var z,y,x
-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.Yu(0,0,y)
-if(x.rw(a,0,z.gB(a))!==z.gB(a))x.I7(z.j(a,J.bI(z.gB(a),1)),0)
-return C.Nm.aM(y,0,x.L8)},
-$aszF:function(){return[P.qU,[P.WO,P.KN]]}},
-Yu:{
-"^":"a;aQ,L8,IT",
-I7:function(a,b){var z,y,x,w,v
-z=this.IT
-y=this.L8
-if((b&64512)===56320){x=65536+((a&1023)<<10>>>0)|b&1023
-w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=(240|x>>>18)>>>0
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|x>>>12&63
-w=y+1
-this.L8=w
-if(y>=v)return H.e(z,y)
-z[y]=128|x>>>6&63
-this.L8=w+1
-if(w>=v)return H.e(z,w)
-z[w]=128|x&63
-return!0}else{w=y+1
-this.L8=w
-v=z.length
-if(y>=v)return H.e(z,y)
-z[y]=224|a>>>12
-y=w+1
-this.L8=y
-if(w>=v)return H.e(z,w)
-z[w]=128|a>>>6&63
-this.L8=y+1
-if(y>=v)return H.e(z,y)
-z[y]=128|a&63
-return!1}},
-rw: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.IT
-y=z.length
-x=J.rY(a)
-w=b
-for(;w<c;++w){v=x.j(a,w)
-if(v<=127){u=this.L8
-if(u>=y)break
-this.L8=u+1
-z[u]=v}else if((v&64512)===55296){if(this.L8+3>=y)break
-t=w+1
-if(this.I7(v,x.j(a,t)))w=t}else if(v<=2047){u=this.L8
-s=u+1
-if(s>=y)break
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=192|v>>>6
-this.L8=s+1
-z[s]=128|v&63}else{u=this.L8
-if(u+2>=y)break
-s=u+1
-this.L8=s
-if(u>=y)return H.e(z,u)
-z[u]=224|v>>>12
-u=s+1
-this.L8=u
-if(s>=y)return H.e(z,s)
-z[s]=128|v>>>6&63
-this.L8=u+1
-if(u>=y)return H.e(z,u)
-z[u]=128|v&63}}return w},
-static:{"^":"Jf4"}}}],["dart.core","dart:core",,P,{
-"^":"",
-Te:function(a){return},
-Wc:[function(a,b){return J.oE(a,b)},"$2","n4",4,0,51,46,47],
-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.vM="\""
-for(y=a.length,x=0,w="\"";x<y;++x){v=C.xB.j(a,x)
-if(v<=31)if(v===10)w=z.vM+="\\n"
-else if(v===13)w=z.vM+="\\r"
-else if(v===9)w=z.vM+="\\t"
-else{w=z.vM+="\\x"
-if(v<16)z.vM=w+"0"
-else{z.vM=w+"1"
-v-=16}w=H.Lw(v<10?48+v:87+v)
-w=z.vM+=w}else if(v===92)w=z.vM+="\\\\"
-else if(v===34)w=z.vM+="\\\""
-else{w=H.Lw(v)
-w=z.vM+=w}}y=w+"\""
-z.vM=y
-return y}return"Instance of '"+H.lh(a)+"'"},
-FM:function(a){return new P.HG(a)},
-ad:[function(a,b){return a==null?b==null:a===b},"$2","N3R",4,0,52],
-xv:[function(a){return H.CU(a)},"$1","J2K",2,0,53],
-O8:function(a,b,c){var z,y,x
-z=J.Zz(a,c)
-if(a!==0&&!0)for(y=z.length,x=0;x<y;++x)z[x]=b
-return z},
-F:function(a,b,c){var z,y
-z=H.VM([],[c])
-for(y=J.mY(a);y.G();)z.push(y.gl())
-if(b)return z
-z.fixed$length=init
-return z},
-FL:function(a){var z,y
-z=H.d(a)
-y=$.oK
-if(y==null)H.qw(z)
-else y.$1(z)},
-qa:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a.gfN(a),b)},
-$isEH:true},
-CL:{
-"^":"Tp:122;a",
-$2:function(a,b){var z=this.a
-if(z.b>0)z.a.KF(", ")
-z.a.KF(J.GL(a))
-z.a.KF(": ")
-z.a.KF(P.hl(b));++z.b},
-$isEH:true},
-a2:{
-"^":"a;",
-$isa2:true},
-"+bool":0,
-Rz:{
-"^":"a;"},
-iP:{
-"^":"a;y3<,aL",
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isiP)return!1
-return J.xC(this.y3,b.y3)&&this.aL===b.aL},
-iM:function(a,b){return J.oE(this.y3,b.gy3())},
-giO:function(a){return this.y3},
-bu:function(a){var z,y,x,w,v,u,t,s
-z=this.aL
-y=P.Gq(z?H.o2(this).getUTCFullYear()+0:H.o2(this).getFullYear()+0)
-x=P.h0(z?H.o2(this).getUTCMonth()+1:H.o2(this).getMonth()+1)
-w=P.h0(z?H.o2(this).getUTCDate()+0:H.o2(this).getDate()+0)
-v=P.h0(z?H.o2(this).getUTCHours()+0:H.o2(this).getHours()+0)
-u=P.h0(z?H.o2(this).getUTCMinutes()+0:H.o2(this).getMinutes()+0)
-t=P.h0(z?H.o2(this).getUTCSeconds()+0:H.o2(this).getSeconds()+0)
-s=P.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},
-h:function(a,b){return P.Wu(J.ew(this.y3,b.gVs()),this.aL)},
-EK:function(){H.o2(this)},
-RM:function(a,b){if(J.yH(a)>8640000000000000)throw H.b(P.u(a))},
-$isiP:true,
-static:{"^":"bS,Vp8,Hq,Kw,h2,KL,EQe,NXt,Hm,Xs,Fz,cRS,E03,KeL,Cgd,NrX,LD,o4I,T3F,f8,yfk,fQ",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,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",H.ol("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$",!1,!0,!1),null,null).ej(a)
-if(z!=null){y=new P.MF()
-x=z.QK
-if(1>=x.length)return H.e(x,1)
-w=H.BU(x[1],null,null)
-if(2>=x.length)return H.e(x,2)
-v=H.BU(x[2],null,null)
-if(3>=x.length)return H.e(x,3)
-u=H.BU(x[3],null,null)
-if(4>=x.length)return H.e(x,4)
-t=y.$1(x[4])
-if(5>=x.length)return H.e(x,5)
-s=y.$1(x[5])
-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.LL(J.vX(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(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)
-l=J.ew(l,60*m)
-if(typeof l!=="number")return H.s(l)
-s=J.bI(s,n*l)}k=!0}else k=!1
-j=H.fu(w,v,u,t,s,r,q,k)
-return P.Wu(p?j+1:j,k)}else throw H.b(P.cD(a))},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)
-y=a<0?"-":""
-if(z>=1000)return""+a
-if(z>=100)return y+"0"+H.d(z)
-if(z>=10)return y+"00"+H.d(z)
-return y+"000"+H.d(z)},pV:function(a){if(a>=100)return""+a
-if(a>=10)return"0"+a
-return"00"+a},h0:function(a){if(a>=10)return""+a
-return"0"+a}}},
-MF:{
-"^":"Tp:123;",
-$1:function(a){if(a==null)return 0
-return H.BU(a,null,null)},
-$isEH:true},
-Rq:{
-"^":"Tp:124;",
-$1:function(a){if(a==null)return 0
-return H.RR(a,null)},
-$isEH:true},
-CP:{
-"^":"FK;",
-$isCP:true},
-"+double":0,
-a6:{
-"^":"a;Fq<",
-g:function(a,b){return P.ii(0,0,this.Fq+b.gFq(),0,0,0)},
-W:function(a,b){return P.ii(0,0,this.Fq-b.gFq(),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.UD(this.Fq*b)),0,0,0)},
-Z:function(a,b){if(J.xC(b,0))throw H.b(P.ts())
-if(typeof b!=="number")return H.s(b)
-return P.ii(0,0,C.CD.Z(this.Fq,b),0,0,0)},
-C:function(a,b){return this.Fq<b.gFq()},
-D:function(a,b){return this.Fq>b.gFq()},
-E:function(a,b){return this.Fq<=b.gFq()},
-F:function(a,b){return this.Fq>=b.gFq()},
-gVs:function(){return C.CD.cU(this.Fq,1000)},
-n:function(a,b){if(b==null)return!1
-if(!J.x(b).$isa6)return!1
-return this.Fq===b.Fq},
-giO:function(a){return this.Fq&0x1FFFFFFF},
-iM:function(a,b){return C.CD.iM(this.Fq,b.gFq())},
-bu:function(a){var z,y,x,w,v
-z=new P.DW()
-y=this.Fq
-if(y<0)return"-"+P.ii(0,0,-y,0,0,0).bu(0)
-x=z.$1(C.CD.JV(C.CD.cU(y,60000000),60))
-w=z.$1(C.CD.JV(C.CD.cU(y,1000000),60))
-v=new P.P7().$1(C.CD.JV(y,1000000))
-return H.d(C.CD.cU(y,3600000000))+":"+H.d(x)+":"+H.d(w)+"."+H.d(v)},
-$isa6:true,
-static:{"^":"Bp7,v7,dko,LoB,zj5,b2H,q9J,IGB,DoM,CvD,MV,IJZ,D9,Wr,fm,rGr",ii:function(a,b,c,d,e,f){return new P.a6(a*86400000000+b*3600000000+e*60000000+f*1000000+d*1000+c)}}},
-P7:{
-"^":"Tp:15;",
-$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},
-DW:{
-"^":"Tp:15;",
-$1:function(a){if(a>=10)return H.d(a)
-return"0"+H.d(a)},
-$isEH:true},
-XS:{
-"^":"a;",
-gI4:function(){return new H.XO(this.$thrownJsError,null)},
-$isXS:true},
-LK:{
-"^":"XS;",
-bu:function(a){return"Throw of null."}},
-AT:{
-"^":"XS;G1>",
-bu:function(a){var z=this.G1
-if(z!=null)return"Illegal argument(s): "+H.d(z)
-return"Illegal argument(s)"},
-static:{u:function(a){return new P.AT(a)}}},
-Sn:{
-"^":"AT;G1",
-bu:function(a){return"RangeError: "+H.d(this.G1)},
-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))}}},
-Np:{
-"^":"XS;",
-static:{EY:function(){return new P.Np()}}},
-JS:{
-"^":"XS;uF,UP,mP,SA,vG",
-bu: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.vM+=", "}v=z.a
-if(x<0)return H.e(y,x)
-u=P.hl(y[x])
-v.vM+=typeof u==="string"?u:H.d(u)}this.SA.aN(0,new P.CL(z))
-return"NoSuchMethodError : method not found: '"+this.UP.bu(0)+"'\nReceiver: "+H.d(P.hl(this.uF))+"\nArguments: ["+z.a.vM+"]"},
-$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},
-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"},
-$isXS:true,
-static:{SY:function(a){return new P.rM(a)}}},
-lj:{
-"^":"XS;G1>",
-bu:function(a){return"Bad state: "+this.G1},
-static:{w:function(a){return new P.lj(a)}}},
-UV:{
-"^":"XS;YA",
-bu:function(a){var z=this.YA
-if(z==null)return"Concurrent modification during iteration."
-return"Concurrent modification during iteration: "+H.d(P.hl(z))+"."},
-static:{a4:function(a){return new P.UV(a)}}},
-qn:{
-"^":"a;",
-bu:function(a){return"Out of Memory"},
-gI4:function(){return},
-$isXS:true},
-KY:{
-"^":"a;",
-bu:function(a){return"Stack Overflow"},
-gI4:function(){return},
-$isXS:true},
-t7:{
-"^":"XS;Wo",
-bu:function(a){return"Reading static variable '"+this.Wo+"' during its initialization"},
-static:{Gz:function(a){return new P.t7(a)}}},
-HG:{
-"^":"a;G1>",
-bu:function(a){var z=this.G1
-if(z==null)return"Exception"
-return"Exception: "+H.d(z)}},
-oe:{
-"^":"a;G1>",
-bu:function(a){return"FormatException: "+H.d(this.G1)},
-static:{cD:function(a){return new P.oe(a)}}},
-eV:{
-"^":"a;",
-bu:function(a){return"IntegerDivisionByZeroException"},
-static:{ts:function(){return new P.eV()}}},
-qo:{
-"^":"a;oc>",
-bu:function(a){return"Expando:"+H.d(this.oc)},
-t:function(a,b){var z=H.of(b,"expando$values")
-return z==null?null:H.of(z,this.J4())},
-u: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.J4(),c)},
-J4:function(){var z,y
-z=H.of(this,"expando$key")
-if(z==null){y=$.Km
-$.Km=y+1
-z="expando$key$"+y
-H.wV(this,"expando$key",z)}return z},
-static:{"^":"Bq,rly,Km"}},
-EH:{
-"^":"a;",
-$isEH:true},
-KN:{
-"^":"FK;",
-$isKN:true},
-"+int":0,
-QV:{
-"^":"a;",
-$isQV:true,
-$asQV:null},
-Dk:{
-"^":"a;"},
-WO:{
-"^":"a;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-"+List":0,
-Z0:{
-"^":"a;",
-$isZ0:true},
-c8:{
-"^":"a;",
-bu:function(a){return"null"}},
-"+Null":0,
-FK:{
-"^":"a;",
-$isFK:true},
-"+num":0,
-a:{
-"^":";",
-n:function(a,b){return this===b},
-giO:function(a){return H.eQ(this)},
-bu:function(a){return H.a5(this)},
-T:function(a,b){throw H.b(P.lr(this,b.gWa(),b.gnd(),b.gVm(),null))},
-gbx:function(a){return new H.cu(H.dJ(this),null)},
-$isa:true},
-ns:{
-"^":"a;",
-$isns:true},
-mE:{
-"^":"a;"},
-VV:{
-"^":"a;dI,yz,wj",
-wE:function(a){var z,y,x
-z=this.yz==null
-if(!z&&this.wj==null)return
-if(z)this.yz=H.Ms()
-else{z=H.Ms()
-y=this.wj
-x=this.yz
-if(typeof y!=="number")return y.W()
-if(typeof x!=="number")return H.s(x)
-this.yz=z-(y-x)
-this.wj=null}}},
-qU:{
-"^":"a;",
-$isqU:true},
-"+String":0,
-WU:{
-"^":"a;Cb,R7,C3,Wn",
-gl:function(){return this.Wn},
-G:function(){var z,y,x,w,v,u
-z=this.C3
-this.R7=z
-y=this.Cb
-x=y.length
-if(z===x){this.Wn=null
-return!1}w=C.xB.j(y,z)
-v=this.R7+1
-if((w&64512)===55296&&v<x){u=C.xB.j(y,v)
-if((u&64512)===56320){this.C3=v+1
-this.Wn=65536+((w&1023)<<10>>>0)+(u&1023)
-return!0}}this.C3=v
-this.Wn=w
-return!0}},
-Rn:{
-"^":"a;vM<",
-gB:function(a){return this.vM.length},
-gl0:function(a){return this.vM.length===0},
-gor:function(a){return this.vM.length!==0},
-KF:function(a){this.vM+=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.vM+=typeof y==="string"?y:H.d(y)}while(z.G())
-else{this.KF(z.gl())
-for(;z.G();){this.vM+=b
-y=z.gl()
-this.vM+=typeof y==="string"?y:H.d(y)}}},
-V1:function(a){this.vM=""},
-bu:function(a){return this.vM},
-PD:function(a){if(typeof a==="string")this.vM=a
-else this.KF(a)},
-static:{p9:function(a){var z=new P.Rn("")
-z.PD(a)
-return z}}},
-GD:{
-"^":"a;",
-$isGD:true},
-uq:{
-"^":"a;",
-$isuq:true},
-q5:{
-"^":"a;Bo,IE,pO,Fi,ku,tP,BJ,hO,lH",
-gJf:function(a){var z
-if(C.xB.nC(this.Bo,"[")){z=this.Bo
-return C.xB.Nj(z,1,z.length-1)}return this.Bo},
-gkb:function(a){var z
-if(J.xC(this.IE,0)){z=this.Fi
-if(z==="http")return 80
-if(z==="https")return 443}return this.IE},
-gIi:function(a){return this.pO},
-x6:function(a,b){var z,y
-z=a==null
-if(z&&!0)return""
-z=!z
-if(z);y=z?P.Xc(a):C.jN.ez(b,new P.uF()).zV(0,"/")
-if((this.gJf(this)!==""||this.Fi==="file")&&J.U6(y).gor(y)&&!C.xB.nC(y,"/"))return"/"+H.d(y)
-return y},
-Ky:function(a,b){if(a==="")return"/"+H.d(b)
-return C.xB.Nj(a,0,J.U6(a).cn(a,"/")+1)+H.d(b)},
-K2:function(a){if(a.length>0&&J.Pp(a,0)===58)return!0
-return J.R7(a,"/.")!==-1},
-KO:function(a){var z,y,x,w,v
-if(!this.K2(a))return a
-z=[]
-for(y=a.split("/"),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),x=!1;y.G();){w=y.lo
-if(J.xC(w,"..")){v=z.length
-if(v!==0)if(v===1){if(0>=v)return H.e(z,0)
-v=!J.xC(z[0],"")}else v=!0
-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
-z=P.p9("")
-y=this.Fi
-if(""!==y){z.KF(y)
-z.KF(":")}if(this.gJf(this)!==""||y==="file"){z.KF("//")
-y=this.ku
-if(""!==y){z.KF(y)
-z.KF("@")}z.KF(this.Bo)
-if(!J.xC(this.IE,0)){z.KF(":")
-z.KF(J.AG(this.IE))}}z.KF(this.pO)
-y=this.tP
-if(""!==y){z.KF("?")
-z.KF(y)}y=this.BJ
-if(""!==y){z.KF("#")
-z.KF(y)}return z.vM},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(b)
-if(!z.$isq5)return!1
-y=this.Fi
-x=b.Fi
-if(y==null?x==null:y===x)if(this.ku===b.ku)if(this.gJf(this)===z.gJf(b))if(J.xC(this.gkb(this),z.gkb(b))){z=this.pO
-y=b.pO
-if(z==null?y==null:z===y){z=this.tP
-y=b.tP
-if(z==null?y==null:z===y){z=this.BJ
-y=b.BJ
-y=z==null?y==null:z===y
-z=y}else z=!1}else z=!1}else z=!1
-else z=!1
-else z=!1
-else z=!1
-return z},
-giO:function(a){var z=new P.XZ()
-return z.$2(this.Fi,z.$2(this.ku,z.$2(this.gJf(this),z.$2(this.gkb(this),z.$2(this.pO,z.$2(this.tP,z.$2(this.BJ,1)))))))},
-n3:function(a,b,c,d,e,f,g,h,i){if(h==="http"&&J.xC(e,80))this.IE=0
-else if(h==="https"&&J.xC(e,443))this.IE=0
-else this.IE=e
-this.pO=this.x6(c,d)},
-$isq5:true,
-static:{"^":"QqF,q7,rU,v5,vI,ilf,Imi,IL,Bd,XrJ,G9,fC,O5i,FsP,j3,mo,u0I,TGN,Yk,Qxt,lL,Bx,Hiw,H5,zst,VFG,nJd,Sp,GPf,JA7,wo,xd,fbQ",hK:function(a0){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j,i,h,g,f,e,d,c,b,a
-x=new P.jY()
-w=new P.Uo(a0)
-v=a0.length
-if(v===0)return P.Wo("","",null,null,0,null,null,null,"")
-if(J.Pp(a0,0)!==47)for(u=0;t=0,u<v;u=s){s=u+1
-if(u>=v)H.vh(P.N(u))
-r=a0.charCodeAt(u)
-if(r<128){q=r>>>4
-if(q>=8)return H.e(C.NL,q)
-q=(C.NL[q]&C.jn.W4(1,r&15))!==0}else q=!1
-if(!q){if(r===58){t=s
-u=t}else{u=s-1
-t=0}break}}else{u=0
-t=0}if(t===u){q=t+1
-q=q<v&&C.xB.j(a0,t)===47&&C.xB.j(a0,q)===47}else q=!1
-if(q){p=t+2
-for(o=-1;q=J.Wx(p),n=-1,q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(J.xC(o,-1)&&r===58);else{q=r===64||r===58
-p=m-1
-if(q){n=C.xB.XU(a0,"@",p)
-if(n===-1){p=u
-break}p=n+1
-for(o=-1;q=J.Wx(p),q.C(p,v);){m=q.g(p,1)
-if(typeof p!=="number"||Math.floor(p)!==p)H.vh(P.u(p))
-if(q.C(p,0))H.vh(P.N(p))
-if(q.F(p,v))H.vh(P.N(p))
-r=a0.charCodeAt(p)
-if(x.$1(r)!==!0)if(r===91)p=w.$1(m)
-else{if(r===58){if(!J.xC(o,-1))throw H.b(P.cD("Double port in host"))}else{p=m-1
-break}p=m
-o=p}else p=m}break}else{n=-1
-break}}p=m
-o=p}else p=m}}else{p=t
-n=-1
-o=-1}for(l=p;x=J.Wx(l),x.C(l,v);l=k){k=x.g(l,1)
-if(typeof l!=="number"||Math.floor(l)!==l)H.vh(P.u(l))
-if(x.C(l,0))H.vh(P.N(l))
-if(x.F(l,v))H.vh(P.N(l))
-r=a0.charCodeAt(l)
-if(r===63||r===35){l=k-1
-break}}x=J.Wx(l)
-if(x.C(l,v)&&C.xB.j(a0,l)===63)for(j=l;w=J.Wx(j),w.C(j,v);j=i){i=w.g(j,1)
-if(typeof j!=="number"||Math.floor(j)!==j)H.vh(P.u(j))
-if(w.C(j,0))H.vh(P.N(j))
-if(w.F(j,v))H.vh(P.N(j))
-if(a0.charCodeAt(j)===35){j=i-1
-break}}else j=l
-h=t>0?C.xB.Nj(a0,0,t-1):null
-z=0
-if(t!==p){g=t+2
-if(n>0){f=C.xB.Nj(a0,g,n)
-g=n+1}else f=""
-w=J.Wx(o)
-if(w.D(o,0)){y=C.xB.Nj(a0,o,p)
-try{z=H.BU(y,null,null)}catch(e){H.Ru(e)
-throw H.b(P.cD("Invalid port: '"+H.d(y)+"'"))}d=C.xB.Nj(a0,g,w.W(o,1))}else d=C.xB.Nj(a0,g,p)}else{d=""
-f=""}c=C.xB.Nj(a0,p,l)
-b=x.C(l,j)?C.xB.Nj(a0,x.g(l,1),j):""
-x=J.Wx(j)
-a=x.C(j,v)?C.xB.Nj(a0,x.g(j,1),v):""
-return P.Wo(a,d,c,null,z,b,null,h,f)},Wo:function(a,b,c,d,e,f,g,h,i){var z=P.Wf(h)
-z=new P.q5(P.mA(b),null,null,z,i,P.LE(f,g),P.o6(a),null,null)
-z.n3(a,b,c,d,e,f,g,h,i)
-return z},mA:function(a){var z,y
-if(a.length===0)return a
-if(C.xB.j(a,0)===91){z=a.length-1
-if(C.xB.j(a,z)!==93)throw H.b(P.cD("Missing end `]` to match `[` in host"))
-P.Uw(C.xB.Nj(a,1,z))
-return a}for(z=a.length,y=0;y<z;++y){if(y>=z)H.vh(P.N(y))
-if(a.charCodeAt(y)===58){P.Uw(a)
-return"["+a+"]"}}return a},Wf:function(a){var z,y,x,w,v,u
-z=new P.QU()
-if(a==null)return""
-y=a.length
-for(x=!0,w=0;w<y;++w){if(w>=y)H.vh(P.N(w))
-v=a.charCodeAt(w)
-if(w===0){if(!(v>=97&&v<=122))u=v>=65&&v<=90
-else u=!0
-u=!u}else u=!1
-if(u)throw H.b(P.u("Illegal scheme: "+a))
-if(z.$1(v)!==!0){if(v<128){u=v>>>4
-if(u>=8)return H.e(C.NL,u)
-u=(C.NL[u]&C.jn.W4(1,v&15))!==0}else u=!1
-if(u);else throw H.b(P.u("Illegal scheme: "+a))
-x=!1}}return x?a:a.toLowerCase()},LE:function(a,b){var z,y,x
-z={}
-y=a==null
-if(y&&!0)return""
-y=!y
-if(y);if(y)return P.Xc(a)
-x=P.p9("")
-z.a=!0
-C.jN.aN(b,new P.yZ(z,x))
-return x.vM},o6:function(a){if(a==null)return""
-return P.Xc(a)},Xc:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z={}
-y=J.U6(a).u8(a,"%")
-z.a=y
-if(y<0)return a
-x=new P.Al()
-w=new P.KM()
-v=new P.wm(a,x,new P.tS())
-u=new P.QE(a)
-z.b=null
-t=a.length
-z.c=0
-s=new P.YP(z,a)
-for(r=y;r<t;){if(t<r+2)throw H.b(P.u("Invalid percent-encoding in URI component: "+a))
-q=C.xB.j(a,r+1)
-p=C.xB.j(a,z.a+2)
-o=u.$1(z.a+1)
-if(x.$1(q)===!0&&x.$1(p)===!0&&w.$1(o)!==!0)r=z.a+=3
-else{s.$0()
-r=w.$1(o)
-n=z.b
-if(r===!0){n.toString
-r=H.Lw(o)
-n.vM+=r}else{n.toString
-n.vM+="%"
-r=v.$1(z.a+1)
-n.toString
-r=H.Lw(r)
-n.vM+=r
-r=z.b
-n=v.$1(z.a+2)
-r.toString
-n=H.Lw(n)
-r.vM+=n}r=z.a+=3
-z.c=r}m=C.xB.XU(a,"%",r)
-if(m>=z.a){z.a=m
-r=m}else{z.a=t
-r=t}}if(z.b==null)return a
-if(z.c!==r)s.$0()
-return J.AG(z.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.Nw(z)),[null,null]).br(0)},Uw:function(a){var z,y,x,w,v,u,t,s,r,q,p,o
-z=new P.x8()
-y=new P.JT(a,z)
-if(J.q8(a)<2)z.$1("address is too short")
-x=[]
-w=0
-u=!1
-t=0
-while(!0){s=J.q8(a)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-s=a
-r=J.q8(s)
-if(typeof r!=="number")return H.s(r)
-if(t>=r)H.vh(P.N(t))
-if(s.charCodeAt(t)===58){if(t===0){++t
-s=a
-if(t>=J.q8(s))H.vh(P.N(t))
-if(s.charCodeAt(t)!==58)z.$1("invalid start colon.")
-w=t}if(t===w){if(u)z.$1("only one wildcard `::` is allowed")
-J.bi(x,-1)
-u=!0}else J.bi(x,y.$2(w,t))
-w=t+1}++t}if(J.q8(x)===0)z.$1("too few parts")
-q=J.xC(w,J.q8(a))
-p=J.xC(J.MQ(x),-1)
-if(q&&!p)z.$1("expected a part after last `:`")
-if(!q)try{J.bi(x,y.$2(w,J.q8(a)))}catch(o){H.Ru(o)
-try{v=P.Dy(J.ZZ(a,w))
-s=J.lf(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.lf(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.$1("invalid end of IPv6 address.")}}if(u){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=new H.oA(x,new P.d9(x))
-s.$builtinTypeInfo=[null,null]
-return P.F(s,!0,H.ip(s,"mW",0))},jW:function(a,b,c,d){var z,y,x,w,v,u,t
-z=new P.rI()
-y=P.p9("")
-x=c.gZE().WJ(b)
-for(w=0;w<x.length;++w){v=x[w]
-u=J.Wx(v)
-if(u.C(v,128)){t=u.m(v,4)
-if(t>=8)return H.e(a,t)
-t=(a[t]&C.jn.W4(1,u.i(v,15)))!==0}else t=!1
-if(t){u=H.Lw(v)
-y.vM+=u}else if(d&&u.n(v,32)){u=H.Lw(43)
-y.vM+=u}else{u=H.Lw(37)
-y.vM+=u
-z.$2(v,y)}}return y.vM}}},
-jY:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.aa,z)
-z=(C.aa[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-Uo:{
-"^":"Tp:126;a",
-$1:function(a){a=J.G0(this.a,"]",a)
-if(a===-1)throw H.b(P.cD("Bad end of IPv6 host"))
-return a+1},
-$isEH:true},
-QU:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=a>>>4
-if(z>=8)return H.e(C.rs,z)
-z=(C.rs[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-uF:{
-"^":"Tp:13;",
-$1:function(a){return P.jW(C.ZJ,a,C.xM,!1)},
-$isEH:true},
-yZ:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z=this.a
-if(!z.a)this.b.KF("&")
-z.a=!1
-z=this.b
-z.KF(P.jW(C.B2,a,C.xM,!0))
-b.gl0(b)
-z.KF("=")
-z.KF(P.jW(C.B2,b,C.xM,!0))},
-$isEH:true},
-Al:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(!(48<=a&&a<=57))z=65<=a&&a<=70
-else z=!0
-return z},
-$isEH:true},
-tS:{
-"^":"Tp:125;",
-$1:function(a){return 97<=a&&a<=102},
-$isEH:true},
-KM:{
-"^":"Tp:125;",
-$1:function(a){var z
-if(a<128){z=C.jn.GG(a,4)
-if(z>=8)return H.e(C.B2,z)
-z=(C.B2[z]&C.jn.W4(1,a&15))!==0}else z=!1
-return z},
-$isEH:true},
-wm:{
-"^":"Tp:126;b,c,d",
-$1:function(a){var z,y
-z=this.b
-y=J.Pp(z,a)
-if(this.d.$1(y)===!0)return y-32
-else if(this.c.$1(y)!==!0)throw H.b(P.u("Invalid URI component: "+z))
-else return y},
-$isEH:true},
-QE:{
-"^":"Tp:126;e",
-$1:function(a){var z,y,x,w,v
-for(z=this.e,y=J.rY(z),x=0,w=0;w<2;++w){v=y.j(z,a+w)
-if(48<=v&&v<=57)x=x*16+v-48
-else{v|=32
-if(97<=v&&v<=102)x=x*16+v-97+10
-else throw H.b(P.u("Invalid percent-encoding in URI component: "+z))}}return x},
-$isEH:true},
-YP:{
-"^":"Tp:18;a,f",
-$0:function(){var z,y,x,w,v
-z=this.a
-y=z.b
-x=z.c
-w=this.f
-v=z.a
-if(y==null)z.b=P.p9(J.Nj(w,x,v))
-else y.KF(J.Nj(w,x,v))},
-$isEH:true},
-XZ:{
-"^":"Tp:127;",
-$2:function(a,b){var z=J.v1(a)
-if(typeof z!=="number")return H.s(z)
-return b*31+z&1073741823},
-$isEH:true},
-JV:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv4 address, "+a))},
-$isEH:true},
-Nw:{
-"^":"Tp:13;a",
-$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,128,"call"],
-$isEH:true},
-x8:{
-"^":"Tp:43;",
-$1:function(a){throw H.b(P.cD("Illegal IPv6 address, "+a))},
-$isEH:true},
-JT:{
-"^":"Tp:88;a,b",
-$2:function(a,b){var z,y
-if(b-a>4)this.b.$1("an IPv6 part can only contain a maximum of 4 hex digits")
-z=H.BU(C.xB.Nj(this.a,a,b),16,null)
-y=J.Wx(z)
-if(y.C(z,0)||y.D(z,65535))this.b.$1("each part must be in the range of `0x0..0xFFFF`")
-return z},
-$isEH:true},
-d9:{
-"^":"Tp:13;c",
-$1:function(a){var z=J.x(a)
-if(z.n(a,-1))return P.O8((9-this.c.length)*2,0,null)
-else return[z.m(a,8)&255,z.i(a,255)]},
-$isEH:true},
-rI:{
-"^":"Tp:77;",
-$2:function(a,b){var z=J.Wx(a)
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.m(a,4))))
-b.KF(H.Lw(C.xB.j("0123456789ABCDEF",z.i(a,15))))},
-$isEH:true}}],["dart.dom.html","dart:html",,W,{
-"^":"",
-H9:function(a,b,c,d){var z,y,x
-z=document.createEvent("CustomEvent")
-J.QD(z,d)
-if(!J.x(d).$isWO)if(!J.x(d).$isZ0){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.bL(d)
-J.avD(z,a,b,c,d)}catch(x){H.Ru(x)
-J.avD(z,a,b,c,null)}else J.avD(z,a,b,c,null)
-return z},
-r3:function(a,b){return document.createElement(a)},
-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.kP(x,"GET",a,!0)
-e.aN(0,new W.bU(x))
-z=H.VM(new W.RO(x,C.LF.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(new W.Tf(y,x)),z.Sg),[H.Kp(z,0)]).Zz()
-z=H.VM(new W.RO(x,C.MD.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(y.gyr()),z.Sg),[H.Kp(z,0)]).Zz()
-x.send()
-return y.MM},
-ED:function(a){var z,y
-z=document.createElement("input",null)
-if(a!=null)try{J.iM(z,a)}catch(y){H.Ru(y)}return z},
-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("setInterval" in a){z=W.P1(a)
-if(!!J.x(z).$isPZ)return z
-return}else return a},
-ju:function(a){return a},
-Z9:function(a){if(!!J.x(a).$isQF)return a
-return P.o7(a,!0)},
-Gi:function(a,b){return new W.uY(a,b)},
-w6:[function(a){return J.N1(a)},"$1","B4",2,0,13,54],
-Hx:[function(a){return J.Z2(a)},"$1","HM",2,0,13,54],
-zI:[function(a,b,c,d){return J.df(a,b,c,d)},"$4","QN",8,0,55,54,56,57,58],
-Ct:function(a,b,c,d,e){var z,y,x,w,v,u,t,s,r,q
-z=J.Xr(d)
-if(z==null)throw H.b(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.m0(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.Gi(x,y),1))}
-t.attachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.B4(),1))}
-t.detachedCallback={value:function(f){return function(){return f(this)}}(H.tR(W.HM(),1))}
-t.attributeChangedCallback={value:function(f){return function(g,h,i){return f(this,g,h,i)}}(H.tR(W.QN(),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)},
-aF:function(a){if(J.xC($.X3,C.NU))return a
-if(a==null)return
-return $.X3.Nf(a,!0)},
-Fs:function(a){if(J.xC($.X3,C.NU))return a
-return $.X3.up(a,!0)},
-Bo:{
-"^":"h4;",
-"%":"HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;jpR|Ao|xc|LPc|hV|uL|Vc|G6|pv|xI|eW|Vfx|eo|Dsd|aC|VY|tuj|Be|Xfs|JI|Vct|ZP|D13|nJ|SaM|Eg|i7|WZq|Gk|pva|Nr|cda|MJ|T53|DK|waa|BS|V4|Vb|V10|Ly|pR|V11|hx|V12|L4|Mb|V13|mO|DE|V14|U1|V15|H8|WS|qh|V16|oF|V17|Q6|uE|V18|Zn|V19|n5|V20|Ma|wN|V21|ds|V22|ou|ZzR|av|V23|uz|V24|kK|oa|V25|St|V26|IW|V27|Qh|V28|Oz|V29|Z4|V30|qk|V31|vj|LU|V32|CX|V33|md|V34|Bm|V35|Ya|V36|Ww|ye|V37|G1|V38|fl|V39|UK|V40|wM|V41|F1|V42|ov|oEY|kn|V43|fI|V44|zM|V45|Rk|V46|Ti|KAf|CY|V47|nm|V48|uw|I5|V49|el"},
-Yyn:{
-"^":"Gv;",
-$isWO:true,
-$asWO:function(){return[W.QI]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.QI]},
-"%":"EntryArray"},
-Ps:{
-"^":"Bo;N:target=,t5:type%,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAnchorElement"},
-fY:{
-"^":"Bo;N:target=,mH:href%,yv:protocol=",
-bu:function(a){return a.toString()},
-"%":"HTMLAreaElement"},
-rZg:{
-"^":"Bo;mH:href%,N:target=",
-"%":"HTMLBaseElement"},
-O4:{
-"^":"Gv;t5:type=",
-$isO4:true,
-"%":";Blob"},
-Fy:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLBodyElement"},
-Ox:{
-"^":"Bo;MB:form=,oc:name%,t5:type%,P:value%",
-"%":"HTMLButtonElement"},
-Ny:{
-"^":"Bo;fg:height},R:width}",
-gVE:function(a){return a.getContext("2d")},
-"%":"HTMLCanvasElement"},
-Oi:{
-"^":"Gv;",
-"%":";CanvasRenderingContext"},
-Gcw:{
-"^":"Oi;",
-A8:function(a,b,c,d,e,f,g,h){var z
-if(g!=null)z=!0
-else z=!1
-if(z){a.putImageData(P.QO(b),c,d,e,f,g,h)
-return}throw H.b(P.u("Incorrect number or type of arguments"))},
-"%":"CanvasRenderingContext2D"},
-nx:{
-"^":"KV;Rn:data=,B:length=,Wq:nextElementSibling=",
-"%":"Comment;CharacterData"},
-QQS:{
-"^":"ea;tT:code=",
-"%":"CloseEvent"},
-di:{
-"^":"w6O;Rn:data=",
-"%":"CompositionEvent"},
-eC:{
-"^":"ea;M3:_dartDetail}",
-gey:function(a){var z=a._dartDetail
-if(z!=null)return z
-return P.o7(a.detail,!0)},
-dF:function(a,b,c,d,e){return a.initCustomEvent(b,c,d,e)},
-$iseC:true,
-"%":"CustomEvent"},
-Q3:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDetailsElement"},
-rV:{
-"^":"Bo;",
-TR:function(a,b){return a.open.$1(b)},
-"%":"HTMLDialogElement"},
-QF:{
-"^":"KV;",
-Xf:function(a){return a.createDocumentFragment()},
-Kb:function(a,b){return a.getElementById(b)},
-ek:function(a,b,c){return a.importNode(b,c)},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.RO(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-$isQF:true,
-"%":"XMLDocument;Document"},
-Aj:{
-"^":"KV;",
-gks:function(a){if(a._docChildren==null)a._docChildren=H.VM(new P.D7(a,new W.wi(a)),[null])
-return a._docChildren},
-Md:function(a,b){return W.vD(a.querySelectorAll(b),null)},
-Wk:function(a,b){return a.querySelector(b)},
-"%":";DocumentFragment"},
-rz:{
-"^":"Gv;G1:message=,oc:name=",
-"%":";DOMError"},
-BK:{
-"^":"Gv;G1:message=",
-goc:function(a){var z=a.name
-if(P.F7()===!0&&z==="SECURITY_ERR")return"SecurityError"
-if(P.F7()===!0&&z==="SYNTAX_ERR")return"SyntaxError"
-return z},
-bu:function(a){return a.toString()},
-$isBK:true,
-"%":"DOMException"},
-h4:{
-"^":"KV;mk:title},xr:className%,jO:id=,ns:tagName=,Wq:nextElementSibling=",
-gQg:function(a){return new W.E9(a)},
-gks: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.UD(a.offsetLeft)),C.CD.yu(C.CD.UD(a.offsetTop)),C.CD.yu(C.CD.UD(a.offsetWidth)),C.CD.yu(C.CD.UD(a.offsetHeight)),null)},
-Es:function(a){},
-dQ:function(a){},
-wN:function(a,b,c,d){},
-gqn:function(a){return a.localName},
-gKD:function(a){return a.namespaceURI},
-bu:function(a){return a.localName},
-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"))},
-X3:function(a,b){var z=a
-do{if(J.RF(z,b))return!0
-z=z.parentElement}while(z!=null)
-return!1},
-er:function(a){return(a.createShadowRoot||a.webkitCreateShadowRoot).call(a)},
-gI:function(a){return new W.DM(a,a)},
-GE:function(a,b){return a.getAttribute(b)},
-Zi:function(a){return a.getBoundingClientRect()},
-Wk:function(a,b){return a.querySelector(b)},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-ZL:function(a){},
-$ish4:true,
-$isPZ:true,
-"%":";Element"},
-lC:{
-"^":"Bo;fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLEmbedElement"},
-Ty:{
-"^":"ea;kc:error=,G1:message=",
-"%":"ErrorEvent"},
-ea:{
-"^":"Gv;It:_selector},Ii:path=,t5:type=",
-gCa:function(a){return W.qc(a.currentTarget)},
-gN:function(a){return W.qc(a.target)},
-e6:function(a){return a.preventDefault()},
-$isea:true,
-"%":"AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"},
-PZ:{
-"^":"Gv;",
-gI:function(a){return new W.Jn(a)},
-YJ:function(a,b,c,d){return a.addEventListener(b,H.tR(c,1),d)},
-BG:function(a,b,c){c=H.tR(c,1)
-return a.addEventListener(b,c)},
-H2:function(a,b){return a.dispatchEvent(b)},
-Si:function(a,b,c,d){return a.removeEventListener(b,H.tR(c,1),d)},
-$isPZ:true,
-"%":";EventTarget"},
-hD:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLFieldSetElement"},
-hH:{
-"^":"O4;oc:name=",
-$ishH:true,
-"%":"File"},
-nS:{
-"^":"rz;tT:code=",
-"%":"FileError"},
-jH:{
-"^":"Bo;B:length=,oc:name%,N:target=",
-"%":"HTMLFormElement"},
-c4:{
-"^":"Gv;B: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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"},
-Vbi:{
-"^":"QF;",
-gQr:function(a){return a.head},
-smk:function(a,b){a.title=b},
-"%":"HTMLDocument"},
-fJ:{
-"^":"rk;xN:responseText=,pf:status=,po:statusText=",
-gbA:function(a){return W.Z9(a.response)},
-R3:function(a,b,c,d,e,f){return a.open(b,c,d,f,e)},
-kP:function(a,b,c,d){return a.open(b,c,d)},
-wR:function(a,b){return a.send(b)},
-$isfJ:true,
-"%":"XMLHttpRequest"},
-rk:{
-"^":"PZ;",
-"%":";XMLHttpRequestEventTarget"},
-GJ:{
-"^":"Bo;fg:height},oc:name%,R:width}",
-"%":"HTMLIFrameElement"},
-Sg:{
-"^":"Gv;Rn:data=,fg:height=,R:width=",
-$isSg:true,
-"%":"ImageData"},
-SL:{
-"^":"Bo;fg:height},R:width}",
-j3:function(a,b){return a.complete.$1(b)},
-"%":"HTMLImageElement"},
-Mi:{
-"^":"Bo;d4:checked%,MB:form=,fg:height},jx:list=,oc:name%,t5:type%,P:value%,R:width}",
-RR:function(a,b){return a.accept.$1(b)},
-$isMi:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true,
-"%":"HTMLInputElement"},
-Gt:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"KeyboardEvent"},
-ttH:{
-"^":"Bo;MB:form=,oc:name%,t5:type=",
-"%":"HTMLKeygenElement"},
-Gx:{
-"^":"Bo;P:value%",
-"%":"HTMLLIElement"},
-xT:{
-"^":"Bo;MB:form=",
-"%":"HTMLLabelElement"},
-mF:{
-"^":"Bo;MB:form=",
-"%":"HTMLLegendElement"},
-Ogt:{
-"^":"Bo;mH:href%,t5:type%",
-"%":"HTMLLinkElement"},
-ZD:{
-"^":"Gv;mH:href=,yv:protocol=",
-RE:function(a){return a.reload()},
-bu:function(a){return a.toString()},
-"%":"Location"},
-p8:{
-"^":"Bo;oc:name%",
-"%":"HTMLMapElement"},
-eL:{
-"^":"Bo;kc:error=",
-xW:function(a){return a.load()},
-yy:[function(a){return a.pause()},"$0","gX0",0,0,18],
-"%":"HTMLAudioElement;HTMLMediaElement",
-static:{"^":"TH<"}},
-mCi:{
-"^":"Gv;tT:code=",
-"%":"MediaError"},
-Br:{
-"^":"Gv;tT:code=",
-"%":"MediaKeyError"},
-wq:{
-"^":"ea;G1:message=",
-"%":"MediaKeyEvent"},
-W7:{
-"^":"ea;G1:message=",
-"%":"MediaKeyMessageEvent"},
-Rv:{
-"^":"PZ;jO:id=,ph:label=",
-"%":"MediaStream"},
-AW:{
-"^":"ea;",
-gRn:function(a){return P.o7(a.data,!0)},
-$isAW:true,
-"%":"MessageEvent"},
-EeC:{
-"^":"Bo;jb:content=,oc:name%",
-"%":"HTMLMetaElement"},
-tJ:{
-"^":"Bo;P:value%",
-"%":"HTMLMeterElement"},
-Hw:{
-"^":"ea;Rn:data=",
-"%":"MIDIMessageEvent"},
-yt:{
-"^":"Imr;",
-fZ: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=",
-"%":"MIDIInput;MIDIPort"},
-AjY:{
-"^":"w6O;GU:altKey=,pL:button=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-nH:function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){a.initMouseEvent(b,c,d,e,f,g,h,i,j,k,l,m,n,o,W.ju(p))
-return},
-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.Yq(J.tG(z)))
-return H.VM(new P.hL(J.Kn(y.x),J.Kn(y.y)),[null])}},
-$isAjY:true,
-"%":"DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"},
-x76:{
-"^":"Gv;",
-jh:function(a,b,c,d,e,f,g,h,i){var z,y
-z={}
-y=new W.tN(z)
-y.$2("childList",h)
-y.$2("attributes",e)
-y.$2("characterData",f)
-y.$2("subtree",i)
-y.$2("attributeOldValue",d)
-y.$2("characterDataOldValue",g)
-y.$2("attributeFilter",c)
-a.observe(b,z)},
-MS:function(a,b,c,d){return this.jh(a,b,c,null,d,null,null,null,null)},
-"%":"MutationObserver|WebKitMutationObserver"},
-Vv:{
-"^":"Gv;N:target=,t5:type=",
-"%":"MutationRecord"},
-qT:{
-"^":"Gv;G1:message=,oc:name=",
-"%":"NavigatorUserMediaError"},
-KV:{
-"^":"PZ;PZ:firstChild=,uD:nextSibling=,M0:ownerDocument=,eT:parentElement=,By:parentNode=,a4:textContent%",
-gyT:function(a){return new W.wi(a)},
-wg:function(a){var z=a.parentNode
-if(z!=null)z.removeChild(a)},
-Tk:function(a,b){var z,y
-try{z=a.parentNode
-J.ky(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.NL
-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)},
-pj: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},
-mx:function(a,b){return a.appendChild(b)},
-tg:function(a,b){return a.contains(b)},
-mK:function(a,b,c){return a.insertBefore(b,c)},
-dR: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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"NodeList|RadioNodeList"},
-VSm:{
-"^":"Bo;t5:type%",
-"%":"HTMLOListElement"},
-G77:{
-"^":"Bo;Rn:data=,MB:form=,fg:height},oc:name%,t5:type%,R:width}",
-"%":"HTMLObjectElement"},
-l9:{
-"^":"Bo;ph:label%",
-"%":"HTMLOptGroupElement"},
-Qlt:{
-"^":"Bo;MB:form=,vH:index=,ph:label%,P:value%",
-$isQlt:true,
-"%":"HTMLOptionElement"},
-wL2:{
-"^":"Bo;MB:form=,oc:name%,t5:type=,P:value%",
-"%":"HTMLOutputElement"},
-HDy:{
-"^":"Bo;oc:name%,P:value%",
-"%":"HTMLParamElement"},
-f5:{
-"^":"ea;",
-$isf5:true,
-"%":"PopStateEvent"},
-mg:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"PositionError"},
-qW:{
-"^":"nx;N:target=",
-"%":"ProcessingInstruction"},
-KR:{
-"^":"Bo;P:value%",
-"%":"HTMLProgressElement"},
-kf:{
-"^":"ea;ox:loaded=",
-$iskf:true,
-"%":"XMLHttpRequestProgressEvent;ProgressEvent"},
-LY:{
-"^":"kf;O3:url=",
-"%":"ResourceProgressEvent"},
-j2:{
-"^":"Bo;t5:type%",
-"%":"HTMLScriptElement"},
-Eag:{
-"^":"ea;i6:lineNumber=",
-"%":"SecurityPolicyViolationEvent"},
-bs:{
-"^":"Bo;MB:form=,B:length%,oc:name%,Mj:selectedIndex%,t5:type=,P:value%",
-$isbs:true,
-"%":"HTMLSelectElement"},
-I0:{
-"^":"Aj;",
-Kb:function(a,b){return a.getElementById(b)},
-$isI0:true,
-"%":"ShadowRoot"},
-yNV:{
-"^":"Bo;t5:type%",
-"%":"HTMLSourceElement"},
-S2:{
-"^":"ea;kc:error=,G1:message=",
-"%":"SpeechRecognitionError"},
-r5:{
-"^":"ea;Cf:results=",
-"%":"SpeechRecognitionEvent"},
-vKL:{
-"^":"Gv;V5:isFinal=,B:length=",
-"%":"SpeechRecognitionResult"},
-G5:{
-"^":"ea;oc:name=",
-"%":"SpeechSynthesisEvent"},
-kI:{
-"^":"ea;G3:key=,O3:url=",
-"%":"StorageEvent"},
-fqq:{
-"^":"Bo;t5:type%",
-"%":"HTMLStyleElement"},
-v6:{
-"^":"Bo;",
-$isv6:true,
-"%":"HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"},
-inA:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableElement"},
-tV:{
-"^":"Bo;RH:rowIndex=",
-iF:function(a,b){return a.insertCell(b)},
-$istV:true,
-"%":"HTMLTableRowElement"},
-BTK:{
-"^":"Bo;",
-gvp:function(a){return H.VM(new W.uB(a.rows),[W.tV])},
-"%":"HTMLTableSectionElement"},
-OH:{
-"^":"Bo;jb:content=",
-$isOH:true,
-"%":";HTMLTemplateElement;GLL|wc|q6"},
-mw:{
-"^":"nx;",
-$ismw:true,
-"%":"CDATASection|Text"},
-AE:{
-"^":"Bo;MB:form=,oc:name%,vp:rows=,t5:type=,P:value%",
-$isAE:true,
-"%":"HTMLTextAreaElement"},
-R0:{
-"^":"w6O;Rn:data=",
-"%":"TextEvent"},
-y6:{
-"^":"w6O;GU:altKey=,EX:ctrlKey=,Nl:metaKey=,qx:shiftKey=",
-"%":"TouchEvent"},
-RH:{
-"^":"Bo;fY:kind%,ph:label%",
-"%":"HTMLTrackElement"},
-w6O:{
-"^":"ea;ey:detail=",
-"%":"FocusEvent|SVGZoomEvent;UIEvent"},
-SW:{
-"^":"eL;fg:height},R:width}",
-"%":"HTMLVideoElement"},
-K5:{
-"^":"PZ;oc:name%,pf:status%",
-oB:function(a,b){return a.requestAnimationFrame(H.tR(b,1))},
-hr: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)},
-S6:function(a){return a.close()},
-kr:function(a,b,c,d){a.postMessage(P.bL(b),c)
-return},
-D9:function(a,b,c){return this.kr(a,b,c,null)},
-bu:function(a){return a.toString()},
-gEr:function(a){return H.VM(new W.RO(a,C.U3.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.RO(a,C.i3.Ph,!1),[null])},
-$isK5:true,
-$isPZ:true,
-"%":"DOMWindow|Window"},
-Bn:{
-"^":"KV;oc:name=,P:value%",
-"%":"Attr"},
-o5:{
-"^":"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)},
-n:function(a,b){var z,y,x
-if(b==null)return!1
-z=J.x(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)
-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
-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)},
-gSR:function(a){return H.VM(new P.hL(a.left,a.top),[null])},
-$istn:true,
-$astn:function(){return[null]},
-"%":"ClientRect|DOMRect"},
-NfA:{
-"^":"Bo;",
-$isPZ:true,
-"%":"HTMLFrameSetElement"},
-rh:{
-"^":"kEI;",
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)throw H.b(P.TE(b,0,z))
-return a[b]},
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]},
-$isXj:true,
-"%":"MozNamedAttrMap|NamedNodeMap"},
-IT:{
-"^":"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))
-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."))},
-grZ:function(a){var z=a.length
-if(z>0)return a[z-1]
-throw H.b(P.w("No elements"))},
-Zv:function(a,b){if(b>>>0!==b||b>=a.length)return H.e(a,b)
-return a[b]},
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]},
-$isXj:true,
-"%":"SpeechRecognitionResultList"},
-VG:{
-"^":"ark;MW,wM",
-tg:function(a,b){return J.x5(this.wM,b)},
-gl0:function(a){return this.MW.firstElementChild==null},
-gB:function(a){return this.wM.length},
-t:function(a,b){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.wM
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-this.MW.replaceChild(c,z[b])},
-sB:function(a,b){throw H.b(P.f("Cannot resize element lists"))},
-h:function(a,b){this.MW.appendChild(b)
-return b},
-gA:function(a){var z=this.br(this)
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.MW;z.G();)y.appendChild(z.lo)},
-GT:function(a,b){throw H.b(P.f("Cannot sort element lists"))},
-Jd:function(a){return this.GT(a,null)},
-YW:function(a,b,c,d,e){throw H.b(P.SY(null))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-xe:function(a,b,c){var z,y,x
-if(b>this.wM.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.wM
-y=z.length
-x=this.MW
-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.SY(null))},
-V1:function(a){J.r4(this.MW)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)this.MW.removeChild(z)
-return z},
-grZ:function(a){var z=this.MW.lastElementChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-$asark:function(){return[W.h4]},
-$asE9h:function(){return[W.h4]},
-$asWO:function(){return[W.h4]},
-$asQV:function(){return[W.h4]}},
-TS:{
-"^":"ark;Sn,Sc",
-gB:function(a){return this.Sn.length},
-t:function(a,b){var z=this.Sn
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){throw H.b(P.f("Cannot modify list"))},
-sB:function(a,b){throw H.b(P.f("Cannot modify list"))},
-GT:function(a,b){throw H.b(P.f("Cannot sort list"))},
-Jd:function(a){return this.GT(a,null)},
-grZ:function(a){return C.t5.grZ(this.Sn)},
-gDD:function(a){return W.or(this.Sc)},
-gEr:function(a){return H.VM(new W.Uc(this,!1,C.U3.Ph),[null])},
-gLm:function(a){return H.VM(new W.Uc(this,!1,C.i3.Ph),[null])},
-nJ:function(a,b){var z=C.t5.ad(this.Sn,new W.HU())
-this.Sc=P.F(z,!0,H.ip(z,"mW",0))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null,
-static:{vD:function(a,b){var z=H.VM(new W.TS(a,null),[b])
-z.nJ(a,b)
-return z}}},
-HU:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-QI:{
-"^":"Gv;"},
-Jn:{
-"^":"a;WK<",
-t:function(a,b){return H.VM(new W.RO(this.gWK(),b,!1),[null])}},
-DM:{
-"^":"Jn;WK:YO<,WK",
-t:function(a,b){var z,y
-z=$.Vp()
-y=J.rY(b)
-if(z.gvc().Fb.x4(y.hc(b)))if(P.F7()===!0)return H.VM(new W.eu(this.YO,z.t(0,y.hc(b)),!1),[null])
-return H.VM(new W.eu(this.YO,b,!1),[null])},
-static:{"^":"fD"}},
-RAp:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-ecX:{
-"^":"RAp+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-bU:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.setRequestHeader(a,b)},
-$isEH:true},
-Tf:{
-"^":"Tp:13;b,c",
-$1:[function(a){var z,y,x
-z=this.c
-y=z.status
-if(typeof y!=="number")return y.F()
-y=y>=200&&y<300||y===0||y===304
-x=this.b
-if(y){y=x.MM
-if(y.Gv!==0)H.vh(P.w("Future already completed"))
-y.OH(z)}else x.pm(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-tN:{
-"^":"Tp:77;a",
-$2:function(a,b){if(b!=null)this.a[a]=b},
-$isEH:true},
-wi:{
-"^":"ark;NL",
-grZ:function(a){var z=this.NL.lastChild
-if(z==null)throw H.b(P.w("No elements"))
-return z},
-h:function(a,b){this.NL.appendChild(b)},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.NL;z.G();)y.appendChild(z.lo)},
-xe:function(a,b,c){var z,y,x
-if(b>this.NL.childNodes.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.NL
-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.NL
-y=z.childNodes
-if(b<0||b>=y.length)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"))},
-V1:function(a){J.r4(this.NL)},
-u:function(a,b,c){var z,y
-z=this.NL
-y=z.childNodes
-if(b>>>0!==b||b>=y.length)return H.e(y,b)
-z.replaceChild(c,y[b])},
-gA:function(a){return C.t5.gA(this.NL.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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-gB:function(a){return this.NL.childNodes.length},
-sB:function(a,b){throw H.b(P.f("Cannot set length on immutable List."))},
-t:function(a,b){var z=this.NL.childNodes
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-$iswi:true,
-$asark:function(){return[W.KV]},
-$asE9h:function(){return[W.KV]},
-$asWO:function(){return[W.KV]},
-$asQV:function(){return[W.KV]}},
-nNL:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-w1p:{
-"^":"nNL+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-yoo:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-kEI:{
-"^":"yoo+Gm;",
-$isWO:true,
-$asWO:function(){return[W.KV]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.KV]}},
-zLC:{
-"^":"Gv+lD;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-x5e:{
-"^":"zLC+Gm;",
-$isWO:true,
-$asWO:function(){return[W.vKL]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[W.vKL]}},
-a7B:{
-"^":"a;",
-FV:function(a,b){J.Me(b,new W.Zc(this))},
-V1:function(a){var z
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)this.Rz(0,z.lo)},
-aN:function(a,b){var z,y
-for(z=this.gvc(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-b.$2(y,this.t(0,y))}},
-gvc:function(){var z,y,x,w
-z=this.MW.attributes
-y=H.VM([],[P.qU])
-for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.FJ(z[w])){if(w>=z.length)return H.e(z,w)
-y.push(J.O6(z[w]))}}return y},
-gUQ:function(a){var z,y,x,w
-z=this.MW.attributes
-y=H.VM([],[P.qU])
-for(x=z.length,w=0;w<x;++w){if(w>=z.length)return H.e(z,w)
-if(this.FJ(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},
-$isZ0:true,
-$asZ0:function(){return[P.qU,P.qU]}},
-Zc:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.u(0,a,b)},
-$isEH:true},
-E9:{
-"^":"a7B;MW",
-x4:function(a){return this.MW.hasAttribute(a)},
-t:function(a,b){return this.MW.getAttribute(b)},
-u:function(a,b,c){this.MW.setAttribute(b,c)},
-Rz:function(a,b){var z,y
-z=this.MW
-y=z.getAttribute(b)
-z.removeAttribute(b)
-return y},
-gB:function(a){return this.gvc().length},
-FJ:function(a){return a.namespaceURI==null}},
-hZ:{
-"^":"As3;n8,Kd",
-lF:function(){var z=P.Ls(null,null,null,P.qU)
-this.Kd.aN(0,new W.Siz(z))
-return z},
-p5:function(a){var z,y
-z=C.Nm.zV(P.F(a,!0,null)," ")
-for(y=this.n8,y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();)J.Pw(y.lo,z)},
-OS:function(a){this.Kd.aN(0,new W.Jt(a))},
-yJ:function(a){this.Kd=H.VM(new H.A8(P.F(this.n8,!0,null),new W.Xw()),[null,null])},
-static:{or:function(a){var z=new W.hZ(a,null)
-z.yJ(a)
-return z}}},
-Xw:{
-"^":"Tp:13;",
-$1:[function(a){return new W.I4(a)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Siz:{
-"^":"Tp:13;a",
-$1:function(a){return this.a.FV(0,a.lF())},
-$isEH:true},
-Jt:{
-"^":"Tp:13;a",
-$1:function(a){return a.OS(this.a)},
-$isEH:true},
-I4:{
-"^":"As3;MW",
-lF:function(){var z,y,x
-z=P.Ls(null,null,null,P.qU)
-for(y=J.uf(this.MW).split(" "),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=J.rr(y.lo)
-if(x.length!==0)z.h(0,x)}return z},
-p5:function(a){P.F(a,!0,null)
-J.Pw(this.MW,a.zV(0," "))}},
-FkO:{
-"^":"a;Ph",
-ly:function(a,b){return H.VM(new W.RO(a,this.Ph,b),[null])},
-LX:function(a){return this.ly(a,!1)}},
-RO:{
-"^":"cb;DK,Ph,Sg",
-KR:function(a,b,c,d){var z=new W.Ov(0,this.DK,this.Ph,W.aF(a),this.Sg)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-z.Zz()
-return z},
-zC:function(a,b,c){return this.KR(a,null,b,c)},
-yI:function(a){return this.KR(a,null,null,null)}},
-eu:{
-"^":"RO;DK,Ph,Sg",
-WO:function(a,b){var z=H.VM(new P.nO(new W.ie(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.rg(b),z),[H.ip(z,"cb",0),null])},
-$iscb:true},
-ie:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-rg:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Uc:{
-"^":"cb;Qx,Sg,Ph",
-WO:function(a,b){var z=H.VM(new P.nO(new W.i2(b),this),[H.ip(this,"cb",0)])
-return H.VM(new P.c9(new W.Hb(b),z),[H.ip(z,"cb",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.cb,null],[P.Oy,null])),[null])
-z.xd(null)
-for(y=this.Qx,y=y.gA(y),x=this.Ph,w=this.Sg;y.G();){v=new W.RO(y.lo,x,w)
-v.$builtinTypeInfo=[null]
-z.h(0,v)}y=z.pY
-y.toString
-return H.VM(new P.Ik(y),[H.Kp(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)},
-$iscb:true},
-i2:{
-"^":"Tp:13;a",
-$1:function(a){return J.So(J.l2(a),this.a)},
-$isEH:true},
-Hb:{
-"^":"Tp:13;b",
-$1:[function(a){J.qd(a,this.b)
-return a},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-Ov:{
-"^":"Oy;VP,DK,Ph,G9,Sg",
-ed:function(){if(this.DK==null)return
-this.Jc()
-this.DK=null
-this.G9=null
-return},
-Fv:[function(a,b){if(this.DK==null)return;++this.VP
-this.Jc()
-if(b!=null)b.Qy(this.gDQ(this))},function(a){return this.Fv(a,null)},"yy","$1","$0","gX0",0,2,116,23,117],
-gUF:function(){return this.VP>0},
-QE:[function(a){if(this.DK==null||this.VP<=0)return;--this.VP
-this.Zz()},"$0","gDQ",0,0,18],
-Zz:function(){var z=this.G9
-if(z!=null&&this.VP<=0)J.FI(this.DK,this.Ph,z,this.Sg)},
-Jc:function(){var z=this.G9
-if(z!=null)J.pW(this.DK,this.Ph,z,this.Sg)}},
-qO:{
-"^":"a;pY,uZ",
-h:function(a,b){var z,y
-z=this.uZ
-if(z.x4(b))return
-y=this.pY
-z.u(0,b,b.zC(y.ght(y),new W.rC(this,b),this.pY.gGj()))},
-Rz:function(a,b){var z=this.uZ.Rz(0,b)
-if(z!=null)z.ed()},
-S6:[function(a){var z,y
-for(z=this.uZ,y=z.gUQ(z),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-z.V1(0)
-this.pY.S6(0)},"$0","gJK",0,0,18],
-xd:function(a){this.pY=P.bK(this.gJK(this),null,!0,a)}},
-rC:{
-"^":"Tp:69;a,b",
-$0:[function(){return this.a.Rz(0,this.b)},"$0",null,0,0,null,"call"],
-$isEH:true},
-Gm:{
-"^":"a;",
-gA:function(a){return H.VM(new W.W9(a,this.gB(a),-1,null),[H.ip(a,"Gm",0)])},
-h:function(a,b){throw H.b(P.f("Cannot add to immutable List."))},
-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."))},
-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."))},
-YW:function(a,b,c,d,e){throw H.b(P.f("Cannot setRange on immutable List."))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){throw H.b(P.f("Cannot removeRange on immutable List."))},
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-uB:{
-"^":"ark;xa",
-gA:function(a){return H.VM(new W.LV(J.mY(this.xa)),[null])},
-gB:function(a){return this.xa.length},
-h:function(a,b){J.bi(this.xa,b)},
-V1:function(a){J.U2(this.xa)},
-t:function(a,b){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-u:function(a,b,c){var z=this.xa
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-z[b]=c},
-sB:function(a,b){J.wg(this.xa,b)},
-GT:function(a,b){J.LH(this.xa,b)},
-Jd:function(a){return this.GT(a,null)},
-XU:function(a,b,c){return J.G0(this.xa,b,c)},
-u8:function(a,b){return this.XU(a,b,0)},
-Pk:function(a,b,c){return J.ff(this.xa,b,c)},
-cn:function(a,b){return this.Pk(a,b,null)},
-xe:function(a,b,c){return J.Vk(this.xa,b,c)},
-YW:function(a,b,c,d,e){J.VZ(this.xa,b,c,d,e)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){J.O2(this.xa,b,c)}},
-LV:{
-"^":"a;qD",
-G:function(){return this.qD.G()},
-gl:function(){return this.qD.QZ}},
-W9:{
-"^":"a;nj,vN,Nq,QZ",
-G:function(){var z,y
-z=this.Nq+1
-y=this.vN
-if(z<y){this.QZ=J.UQ(this.nj,z)
-this.Nq=z
-return!0}this.QZ=null
-this.Nq=y
-return!1},
-gl:function(){return this.QZ}},
-uY:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z=H.Va(this.b)
-Object.defineProperty(a,init.dispatchPropertyName,{value:z,enumerable:false,writable:true,configurable:true})
-a.constructor=a.__proto__.constructor
-return this.a(a)},"$1",null,2,0,null,54,"call"],
-$isEH:true},
-dW:{
-"^":"a;Ui",
-geT:function(a){return W.P1(this.Ui.parent)},
-S6:function(a){return this.Ui.close()},
-kr:function(a,b,c,d){this.Ui.postMessage(P.bL(b),c)},
-D9:function(a,b,c){return this.kr(a,b,c,null)},
-gI:function(a){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-YJ:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-Si:function(a,b,c,d){return H.vh(P.f("You can only attach EventListeners to your own window."))},
-$isPZ:true,
-static:{P1:function(a){if(a===window)return a
-else return new W.dW(a)}}}}],["dart.dom.indexed_db","dart:indexed_db",,P,{
-"^":"",
-hF:{
-"^":"Gv;",
-$ishF:true,
-"%":"IDBKeyRange"}}],["dart.dom.svg","dart:svg",,P,{
-"^":"",
-Y0Y:{
-"^":"tpr;N:target=,mH:href=",
-"%":"SVGAElement"},
-nI:{
-"^":"Rc;mH:href=",
-"%":"SVGAltGlyphElement"},
-eG:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEBlendElement"},
-bd:{
-"^":"d5;t5:type=,UQ:values=,yG:result=,x=,y=",
-"%":"SVGFEColorMatrixElement"},
-pf:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEComponentTransferElement"},
-nQ:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFECompositeElement"},
-W1:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEConvolveMatrixElement"},
-mCz:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDiffuseLightingElement"},
-wfu:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEDisplacementMapElement"},
-ha:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEFloodElement"},
-ym:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEGaussianBlurElement"},
-meI:{
-"^":"d5;yG:result=,x=,y=,mH:href=",
-"%":"SVGFEImageElement"},
-oBW:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEMergeElement"},
-wC:{
-"^":"d5;kp:operator=,yG:result=,x=,y=",
-"%":"SVGFEMorphologyElement"},
-MI8:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFEOffsetElement"},
-Ubr:{
-"^":"d5;x=,y=",
-"%":"SVGFEPointLightElement"},
-bMB:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFESpecularLightingElement"},
-pQ:{
-"^":"d5;x=,y=",
-"%":"SVGFESpotLightElement"},
-Qya:{
-"^":"d5;yG:result=,x=,y=",
-"%":"SVGFETileElement"},
-Fu:{
-"^":"d5;t5:type=,yG:result=,x=,y=",
-"%":"SVGFETurbulenceElement"},
-OE5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGFilterElement"},
-N9:{
-"^":"tpr;x=,y=",
-"%":"SVGForeignObjectElement"},
-d0D:{
-"^":"tpr;",
-"%":"SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"},
-tpr:{
-"^":"d5;",
-"%":"SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"},
-pAv:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGImageElement"},
-NBZ:{
-"^":"d5;x=,y=",
-"%":"SVGMaskElement"},
-Gr5:{
-"^":"d5;x=,y=,mH:href=",
-"%":"SVGPatternElement"},
-MU:{
-"^":"d0D;x=,y=",
-"%":"SVGRectElement"},
-j24:{
-"^":"d5;t5:type%,mH:href=",
-"%":"SVGScriptElement"},
-EUL:{
-"^":"d5;t5:type%",
-smk:function(a,b){a.title=b},
-"%":"SVGStyleElement"},
-d5:{
-"^":"h4;",
-gDD:function(a){if(a._cssClassSet==null)a._cssClassSet=new P.O7(a)
-return a._cssClassSet},
-gks:function(a){return H.VM(new P.D7(a,new W.wi(a)),[W.h4])},
-gEr:function(a){return H.VM(new W.eu(a,C.U3.Ph,!1),[null])},
-gVl:function(a){return H.VM(new W.eu(a,C.T1.Ph,!1),[null])},
-gLm:function(a){return H.VM(new W.eu(a,C.i3.Ph,!1),[null])},
-gVY:function(a){return H.VM(new W.eu(a,C.uh.Ph,!1),[null])},
-gf0:function(a){return H.VM(new W.eu(a,C.Kq.Ph,!1),[null])},
-$isPZ:true,
-"%":"SVGAltGlyphDefElement|SVGAltGlyphItemElement|SVGAnimateElement|SVGAnimateMotionElement|SVGAnimateTransformElement|SVGAnimationElement|SVGComponentTransferFunctionElement|SVGCursorElement|SVGDescElement|SVGDiscardElement|SVGFEDistantLightElement|SVGFEDropShadowElement|SVGFEFuncAElement|SVGFEFuncBElement|SVGFEFuncGElement|SVGFEFuncRElement|SVGFEMergeNodeElement|SVGFontElement|SVGFontFaceElement|SVGFontFaceFormatElement|SVGFontFaceNameElement|SVGFontFaceSrcElement|SVGFontFaceUriElement|SVGGlyphElement|SVGGlyphRefElement|SVGHKernElement|SVGMPathElement|SVGMarkerElement|SVGMetadataElement|SVGMissingGlyphElement|SVGSetElement|SVGStopElement|SVGSymbolElement|SVGTitleElement|SVGVKernElement|SVGViewElement;SVGElement",
-static:{"^":"JQ<"}},
-hy:{
-"^":"tpr;x=,y=",
-Kb:function(a,b){return a.getElementById(b)},
-$ishy:true,
-"%":"SVGSVGElement"},
-mHq:{
-"^":"tpr;",
-"%":";SVGTextContentElement"},
-Rk4:{
-"^":"mHq;mH:href=",
-"%":"SVGTextPathElement"},
-Rc:{
-"^":"mHq;x=,y=",
-"%":"SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"},
-ci:{
-"^":"tpr;x=,y=,mH:href=",
-"%":"SVGUseElement"},
-cuU:{
-"^":"d5;mH:href=",
-"%":"SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"},
-O7:{
-"^":"As3;LO",
-lF:function(){var z,y,x,w
-z=this.LO.getAttribute("class")
-y=P.Ls(null,null,null,P.qU)
-if(z==null)return y
-for(x=z.split(" "),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=J.rr(x.lo)
-if(w.length!==0)y.h(0,w)}return y},
-p5:function(a){this.LO.setAttribute("class",a.zV(0," "))}}}],["dart.dom.web_sql","dart:web_sql",,P,{
-"^":"",
-QmI:{
-"^":"Gv;tT:code=,G1:message=",
-"%":"SQLError"}}],["dart.isolate","dart:isolate",,P,{
-"^":"",
-hM:function(){var z,y,x
-z=$.Vz
-$.Vz=z+1
-y=new H.yo(z,null,!1)
-x=init.globalState.N0
-x.O9(z,y)
-x.PC()
-x=new H.fc(y,null)
-x.TL(y)
-return x},
-XY:{
-"^":"a;",
-$isXY:true,
-static:{N3:function(){return new H.iV((Math.random()*0x100000000>>>0)+(Math.random()*0x100000000>>>0)*4294967296)}}}}],["dart.js","dart:js",,P,{
-"^":"",
-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.im(a,P.F(J.kl(d,P.Xl()),!0,null),P.Te(null)))},"$4","qH",8,0,null,41,59,27,60],
-Dm:function(a,b,c){var z
-if(Object.isExtensible(a))try{Object.defineProperty(a,b,{value:c})
-return!0}catch(z){H.Ru(z)}return!1},
-Om:function(a,b){if(Object.prototype.hasOwnProperty.call(a,b))return a[b]
-return},
-wY:[function(a){var z
-if(a==null)return
-else if(typeof a==="string"||typeof a==="number"||typeof a==="boolean")return a
-else{z=J.x(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.eh
-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,13,61],
-hE:function(a,b,c){var z=P.Om(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)
-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,49,61],
-ND:function(a){if(typeof a=="function")return P.iQ(a,$.Dp(),new P.Nz())
-else if(a instanceof Array)return P.iQ(a,$.Iq(),new P.Jd())
-else return P.iQ(a,$.Iq(),new P.QS())},
-iQ:function(a,b,c){var z=P.Om(a,b)
-if(z==null||!(a instanceof Object)){z=c.$1(a)
-P.Dm(a,b,z)}return z},
-E4:{
-"^":"a;eh",
-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.eh[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.eh[b]=P.wY(c)},
-giO:function(a){return 0},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isE4&&this.eh===b.eh},
-Eg:function(a){return a in this.eh},
-bu:function(a){var z,y
-try{z=String(this.eh)
-return z}catch(y){H.Ru(y)
-return P.a.prototype.bu.call(this,this)}},
-V7:function(a,b){var z,y
-z=this.eh
-y=b==null?null:P.F(H.VM(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)},
-$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]))
-x=z.bind.apply(z,y)
-String(x)
-return P.ND(new x())},Cq:function(a){if(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(P.RN(null,null)).$1(a)}}},
-Xb:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-if(z.x4(a))return z.t(0,a)
-y=J.x(a)
-if(!!y.$isZ0){x={}
-z.u(0,a,x)
-for(z=J.mY(a.gvc());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)
-C.Nm.FV(v,y.ez(a,this))
-return v}else return P.wY(a)},"$1",null,2,0,null,61,"call"],
-$isEH:true},
-r7:{
-"^":"E4;eh",
-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.eh.apply(z,y))},
-PO:function(a){return this.qP(a,null)},
-$isr7:true,
-static:{mt:function(a){return new P.r7(P.xZ(a,!0))}}},
-Tz:{
-"^":"Wk;eh",
-t:function(a,b){var z
-if(typeof b==="number"&&b===C.CD.yu(b)){if(typeof b==="number"&&Math.floor(b)===b)z=b<0||b>=this.gB(this)
-else z=!1
-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)
-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.eh.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])},
-UZ:function(a,b,c){P.BE(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).qZ(0,y))
-this.V7("splice",x)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-GT:function(a,b){this.V7("sort",[b])},
-Jd:function(a){return this.GT(a,null)},
-static:{BE: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))}}},
-Wk:{
-"^":"E4+lD;",
-$isWO:true,
-$asWO:null,
-$isyN:true,
-$isQV:true,
-$asQV:null},
-DV:{
-"^":"Tp:13;",
-$1:function(a){var z=P.xZ(a,!1)
-P.Dm(z,$.Dp(),a)
-return z},
-$isEH:true},
-Hp:{
-"^":"Tp:13;a",
-$1:function(a){return new this.a(a)},
-$isEH:true},
-Nz:{
-"^":"Tp:13;",
-$1:function(a){return new P.r7(a)},
-$isEH:true},
-Jd:{
-"^":"Tp:13;",
-$1:function(a){return H.VM(new P.Tz(a),[null])},
-$isEH:true},
-QS:{
-"^":"Tp:13;",
-$1:function(a){return new P.E4(a)},
-$isEH:true}}],["dart.math","dart:math",,P,{
-"^":"",
-Zm:function(a,b){a=536870911&a+b
-a=536870911&a+((524287&a)<<10>>>0)
-return a^a>>>6},
-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))
-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
-if(a===0)z=b===0?1/b<0:b<0
-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))
-if(a>b)return a
-if(a<b)return b
-if(typeof b==="number"){if(typeof a==="number")if(a===0)return a+b
-if(C.YI.gG0(b))return b
-return a}if(b===0&&C.CD.gzP(a))return b
-return a},
-mgb:{
-"^":"a;",
-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}},
-vY:{
-"^":"a;Pd,Ak",
-Ad:function(){var z,y,x,w,v,u
-z=this.Pd
-y=4294901760*z
-x=(y&4294967295)>>>0
-w=55905*z
-v=(w&4294967295)>>>0
-u=v+x+this.Ak
-z=(u&4294967295)>>>0
-this.Pd=z
-this.Ak=(C.jn.cU(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.Ad()
-return(this.Pd&z)>>>0}do{this.Ad()
-y=this.Pd
-x=y%a}while(y-x+a>=4294967296)
-return x},
-qR:function(a){var z,y,x,w,v,u,t,s
-z=J.u6(a,0)?-1:0
-do{y=J.Wx(a)
-x=y.i(a,4294967295)
-a=J.Ts(y.W(a,x),4294967296)
-y=J.Wx(a)
-w=y.i(a,4294967295)
-a=J.Ts(y.W(a,w),4294967296)
-v=((~x&4294967295)>>>0)+(x<<21>>>0)
-u=(v&4294967295)>>>0
-w=(~w>>>0)+((w<<21|x>>>11)>>>0)+C.jn.cU(v-u,4294967296)&4294967295
-v=((u^(u>>>24|w<<8))>>>0)*265
-x=(v&4294967295)>>>0
-w=((w^w>>>24)>>>0)*265+C.jn.cU(v-x,4294967296)&4294967295
-v=((x^(x>>>14|w<<18))>>>0)*21
-x=(v&4294967295)>>>0
-w=((w^w>>>14)>>>0)*21+C.jn.cU(v-x,4294967296)&4294967295
-x=(x^(x>>>28|w<<4))>>>0
-w=(w^w>>>28)>>>0
-v=(x<<31>>>0)+x
-u=(v&4294967295)>>>0
-y=C.jn.cU(v-u,4294967296)
-v=this.Pd*1037
-t=(v&4294967295)>>>0
-this.Pd=t
-s=(this.Ak*1037+C.jn.cU(v-t,4294967296)&4294967295)>>>0
-this.Ak=s
-this.Pd=(t^u)>>>0
-this.Ak=(s^w+((w<<31|x>>>1)>>>0)+y&4294967295)>>>0}while(!J.xC(a,z))
-if(this.Ak===0&&this.Pd===0)this.Pd=23063
-this.Ad()
-this.Ad()
-this.Ad()
-this.Ad()},
-static:{"^":"tgM,PZi,JYU",r2:function(a){var z=new P.vY(0,0)
-z.qR(a)
-return z}}},
-hL:{
-"^":"a;x>,y>",
-bu:function(a){return"Point("+H.d(this.x)+", "+H.d(this.y)+")"},
-n: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
-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)
-return P.xk(P.Zm(P.Zm(0,z),y))},
-g:function(a,b){var z,y,x,w
-z=this.x
-y=J.RE(b)
-x=y.gx(b)
-if(typeof z!=="number")return z.g()
-if(typeof x!=="number")return H.s(x)
-w=this.y
-y=y.gy(b)
-if(typeof w!=="number")return w.g()
-if(typeof y!=="number")return H.s(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
-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
-y=y.gy(b)
-if(typeof w!=="number")return w.W()
-if(typeof y!=="number")return H.s(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()
-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},
-n:function(a,b){var z,y
-if(b==null)return!1
-z=J.x(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
-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))},
-gSR:function(a){var z=new P.hL(this.gBb(this),this.G6)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z}},
-tn:{
-"^":"HDe;Bb>,G6>,R>,fg>",
-$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])}}}}],["dart.pkg.collection.wrappers","package:collection/wrappers.dart",,Q,{
-"^":"",
-qp:function(){throw H.b(P.f("Cannot modify an unmodifiable Map"))},
-A2:{
-"^":"mAS;Rp"},
-mAS:{
-"^":"Nx+cw;",
-$isZ0:true},
-cw:{
-"^":"a;",
-u:function(a,b,c){return Q.qp()},
-FV:function(a,b){return Q.qp()},
-V1:function(a){return Q.qp()},
-$isZ0:true},
-Nx:{
-"^":"a;",
-t:function(a,b){return this.Rp.t(0,b)},
-u:function(a,b,c){this.Rp.u(0,b,c)},
-FV:function(a,b){this.Rp.FV(0,b)},
-V1:function(a){this.Rp.V1(0)},
-aN:function(a,b){this.Rp.aN(0,b)},
-gl0:function(a){return this.Rp.X5===0},
-gor:function(a){return this.Rp.X5!==0},
-gvc:function(){var z=this.Rp
-return H.VM(new P.i5(z),[H.Kp(z,0)])},
-gB:function(a){return this.Rp.X5},
-gUQ:function(a){var z=this.Rp
-return z.gUQ(z)},
-bu:function(a){return P.vW(this.Rp)},
-$isZ0:true}}],["dart.typed_data.implementation","dart:_native_typed_data",,H,{
-"^":"",
-ic:function(a){a.toString
-return a},
-jZN:function(a){a.toString
-return a},
-aRu:function(a){a.toString
-return a},
-WZ:{
-"^":"Gv;",
-gbx:function(a){return C.E0},
-$isWZ:true,
-"%":"ArrayBuffer"},
-eH:{
-"^":"Gv;",
-J2:function(a,b,c){var z=J.Wx(b)
-if(z.C(b,0)||z.F(b,c))throw H.b(P.TE(b,0,c))
-else throw H.b(P.u("Invalid list index "+H.d(b)))},
-ZF:function(a,b,c){if(b>>>0!==b||b>=c)this.J2(a,b,c)},
-$iseH:true,
-$isAS:true,
-"%":";ArrayBufferView;we|Ui|Ip|Dg|ObS|GVy|Pg"},
-dfL:{
-"^":"eH;",
-gbx:function(a){return C.dP},
-$isAS:true,
-"%":"DataView"},
-zU7:{
-"^":"Dg;",
-gbx:function(a){return C.kq},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float32Array"},
-fS:{
-"^":"Dg;",
-gbx:function(a){return C.lk},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]},
-$isAS:true,
-"%":"Float64Array"},
-PS:{
-"^":"Pg;",
-gbx:function(a){return C.jV},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int16Array"},
-dE:{
-"^":"Pg;",
-gbx:function(a){return C.XI},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int32Array"},
-Eb:{
-"^":"Pg;",
-gbx:function(a){return C.la},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Int8Array"},
-wfF:{
-"^":"Pg;",
-gbx:function(a){return C.M5},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint16Array"},
-Pqh:{
-"^":"Pg;",
-gbx:function(a){return C.Vh},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"Uint32Array"},
-eEV:{
-"^":"Pg;",
-gbx:function(a){return C.Fe},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":"CanvasPixelArray|Uint8ClampedArray"},
-V6a:{
-"^":"Pg;",
-gbx:function(a){return C.HC},
-gB:function(a){return a.length},
-t:function(a,b){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-return a[b]},
-u:function(a,b,c){var z=a.length
-if(b>>>0!==b||b>=z)this.J2(a,b,z)
-a[b]=c},
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]},
-$isAS:true,
-"%":";Uint8Array"},
-we:{
-"^":"eH;",
-gB:function(a){return a.length},
-oZ:function(a,b,c,d,e){var z,y,x
-z=a.length+1
-this.ZF(a,b,z)
-this.ZF(a,c,z)
-if(b>c)throw H.b(P.TE(b,0,c))
-y=c-b
-if(e<0)throw H.b(P.u(e))
-x=d.length
-if(x-e<y)throw H.b(P.w("Not enough elements"))
-if(e!==0||x!==y)d=d.subarray(e,e+y)
-a.set(d,b)},
-$isXj:true},
-Dg:{
-"^":"Ip;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isDg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,a,b,c,d,e)},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-$isDg:true,
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ui:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.CP]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.CP]}},
-Ip:{
-"^":"Ui+SU7;"},
-Pg:{
-"^":"GVy;",
-YW:function(a,b,c,d,e){if(!!J.x(d).$isPg){this.oZ(a,b,c,d,e)
-return}P.lD.prototype.YW.call(this,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]}},
-ObS:{
-"^":"we+lD;",
-$isWO:true,
-$asWO:function(){return[P.KN]},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.KN]}},
-GVy:{
-"^":"ObS+SU7;"}}],["dart2js._js_primitives","dart:_js_primitives",,H,{
-"^":"",
-qw:function(a){if(typeof dartPrint=="function"){dartPrint(a)
-return}if(typeof console=="object"&&typeof console.log!="undefined"){console.log(a)
-return}if(typeof window=="object")return
-if(typeof print=="function"){print(a)
-return}throw"Unable to print message: "+String(a)}}],["error_view_element","package:observatory/src/elements/error_view.dart",,F,{
-"^":"",
-ZP:{
-"^":"Vct;Py,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.Py},
-skc:function(a,b){a.Py=this.ct(a,C.yh,a.Py,b)},
-static:{Zg:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OD.ZL(a)
-C.OD.XI(a)
-return a}}},
-Vct:{
-"^":"uL+Pi;",
-$isd3:true}}],["eval_box_element","package:observatory/src/elements/eval_box.dart",,L,{
-"^":"",
-nJ:{
-"^":"D13;a3,Ek,Ln,y4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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},
-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)},
-az:[function(a,b,c,d){var z=H.Go(J.l2(b),"$isMi").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,102,1,94,95],
-Z1:[function(a,b,c,d){var z,y,x
-J.Kr(b)
-z=a.a3
-a.a3=this.ct(a,C.mi,z,"")
-if(a.Ln!=null){y=P.Fl(null,null)
-x=R.tB(y)
-J.kW(x,"expr",z)
-J.Vk(a.y4,0,x)
-this.LY(a,z).ml(new L.YW(x))}},"$3","gZm",6,0,102,1,94,95],
-o5:[function(a,b){var z=J.iz(J.l2(b),"expr")
-a.a3=this.ct(a,C.mi,a.a3,z)},"$1","gHo",2,0,129,1],
-static:{Rp:function(a){var z,y,x
-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])
-a.Ek="1-line"
-a.y4=z
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.tT.ZL(a)
-C.tT.XI(a)
-return a}}},
-D13:{
-"^":"uL+Pi;",
-$isd3:true},
-YW:{
-"^":"Tp:13;a",
-$1:[function(a){J.kW(this.a,"value",a)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["eval_link_element","package:observatory/src/elements/eval_link.dart",,R,{
-"^":"",
-Eg:{
-"^":"SaM;fe,l1,bY,jv,oy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gv8:function(a){return a.fe},
-sv8: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},
-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)},
-wB:[function(a,b,c,d){var z=a.fe
-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.uv(a)).Qy(new R.Ou(a))}},"$3","gbN",6,0,80,46,47,81],
-static:{fL:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.fe=!1
-a.l1="[evaluate]"
-a.bY=null
-a.jv=""
-a.oy=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.UF.ZL(a)
-C.UF.XI(a)
-return a}}},
-SaM:{
-"^":"xc+Pi;",
-$isd3:true},
-uv:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.oy=J.Q5(z,C.UY,z.oy,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-Ou:{
-"^":"Tp:69;b",
-$0:[function(){var z=this.b
-z.fe=J.Q5(z,C.S4,z.fe,!1)},"$0",null,0,0,null,"call"],
-$isEH:true}}],["field_ref_element","package:observatory/src/elements/field_ref.dart",,D,{
-"^":"",
-i7:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{hSW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MC.ZL(a)
-C.MC.XI(a)
-return a}}}}],["field_view_element","package:observatory/src/elements/field_view.dart",,A,{
-"^":"",
-Gk:{
-"^":"WZq;KV,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gt0:function(a){return a.KV},
-st0:function(a,b){a.KV=this.ct(a,C.WQ,a.KV,b)},
-RF:[function(a,b){J.r0(a.KV).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.by.ZL(a)
-C.by.XI(a)
-return a}}},
-WZq:{
-"^":"uL+Pi;",
-$isd3:true}}],["flag_list_element","package:observatory/src/elements/flag_list.dart",,X,{
-"^":"",
-Nr:{
-"^":"pva;DC,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gpM:function(a){return a.DC},
-spM:function(a,b){a.DC=this.ct(a,C.Mc,a.DC,b)},
-RF:[function(a,b){J.r0(a.DC).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ak:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Mh.ZL(a)
-C.Mh.XI(a)
-return a}}},
-pva:{
-"^":"uL+Pi;",
-$isd3:true},
-MJ:{
-"^":"cda;Zc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJ6:function(a){return a.Zc},
-sJ6:function(a,b){a.Zc=this.ct(a,C.OO,a.Zc,b)},
-static:{IfX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Cl.ZL(a)
-C.Cl.XI(a)
-return a}}},
-cda:{
-"^":"uL+Pi;",
-$isd3:true}}],["function_ref_element","package:observatory/src/elements/function_ref.dart",,U,{
-"^":"",
-DK:{
-"^":"T53;lh,Qz,zg,Fs,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gU4:function(a){return a.lh},
-sU4:function(a,b){a.lh=this.ct(a,C.QK,a.lh,b)},
-Qj:[function(a,b){var z,y,x
-Q.xI.prototype.Qj.call(this,a,b)
-this.ct(a,C.ak,0,1)
-this.ct(a,C.Ql,0,1)
-z=a.tY
-y=z!=null
-if(y){x=J.U6(z)
-x=!J.xC(x.t(z,"kind"),"Collected")&&!J.xC(x.t(z,"kind"),"Native")&&!J.xC(x.t(z,"kind"),"Tag")&&!J.xC(x.t(z,"kind"),"Reused")}else x=!1
-a.Fs=this.ct(a,C.a0,a.Fs,x)
-x=y&&J.UQ(z,"parent")!=null
-a.Qz=this.ct(a,C.ak,a.Qz,x)
-if(y){y=J.U6(z)
-y=y.t(z,"owner")!=null&&J.xC(y.t(z,"owner").gzS(),"Class")}else y=!1
-a.zg=this.ct(a,C.Ql,a.zg,y)},"$1","gLe",2,0,20,57],
-gSY:function(a){return a.Qz},
-sSY:function(a,b){a.Qz=this.ct(a,C.ak,a.Qz,b)},
-gE7:function(a){return a.zg},
-sE7:function(a,b){a.zg=this.ct(a,C.Ql,a.zg,b)},
-gni:function(a){return a.Fs},
-sni:function(a,b){a.Fs=this.ct(a,C.a0,a.Fs,b)},
-static:{v9:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.lh=!0
-a.Qz=!1
-a.zg=!1
-a.Fs=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Xo.ZL(a)
-C.Xo.XI(a)
-return a}}},
-T53:{
-"^":"xI+Pi;",
-$isd3:true}}],["function_view_element","package:observatory/src/elements/function_view.dart",,N,{
-"^":"",
-BS:{
-"^":"waa;P6,Sq,ZZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gig:function(a){return a.P6},
-sig:function(a,b){a.P6=this.ct(a,C.nf,a.P6,b)},
-gUx:function(a){return a.Sq},
-sUx:function(a,b){a.Sq=this.ct(a,C.AO,a.Sq,b)},
-gfY:function(a){return a.ZZ},
-sfY:function(a,b){a.ZZ=this.ct(a,C.Lc,a.ZZ,b)},
-W7:function(a,b){var z,y,x
-z=b!=null
-y=z&&J.UQ(b,"parent")!=null?J.UQ(b,"parent"):null
-if(y!=null)return this.W7(a,y)+"."+H.d(J.UQ(b,"user_name"))
-if(z){z=J.U6(b)
-z=z.t(b,"owner")!=null&&J.xC(z.t(b,"owner").gzS(),"Class")}else z=!1
-x=z?J.UQ(b,"owner"):null
-if(x!=null)return H.d(J.UQ(x,"user_name"))+"."+H.d(J.UQ(b,"user_name"))
-return H.d(J.UQ(b,"user_name"))},
-jC:[function(a,b){var z,y
-this.ct(a,C.AO,0,1)
-this.ct(a,C.Lc,0,1)
-z=this.W7(a,a.P6)
-a.Sq=this.ct(a,C.AO,a.Sq,z)
-z=J.UQ(a.P6,"kind")
-y=a.ZZ
-switch(z){case"kRegularFunction":a.ZZ=this.ct(a,C.Lc,y,"function")
-break
-case"kClosureFunction":a.ZZ=this.ct(a,C.Lc,y,"closure function")
-break
-case"kSignatureFunction":a.ZZ=this.ct(a,C.Lc,y,"signature function")
-break
-case"kGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"getter function")
-break
-case"kSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"setter function")
-break
-case"kConstructor":a.ZZ=this.ct(a,C.Lc,y,"constructor")
-break
-case"kImplicitGetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit getter function")
-break
-case"kImplicitSetterFunction":a.ZZ=this.ct(a,C.Lc,y,"implicit setter function")
-break
-case"kStaticInitializer":a.ZZ=this.ct(a,C.Lc,y,"static initializer")
-break
-case"kMethodExtractor":a.ZZ=this.ct(a,C.Lc,y,"method extractor")
-break
-case"kNoSuchMethodDispatcher":a.ZZ=this.ct(a,C.Lc,y,"noSuchMethod dispatcher")
-break
-case"kInvokeFieldDispatcher":a.ZZ=this.ct(a,C.Lc,y,"invoke field dispatcher")
-break
-default:a.ZZ=this.ct(a,C.Lc,y,"UNKNOWN")
-break}},"$1","gnp",2,0,20,57],
-RF:[function(a,b){J.r0(a.P6).Qy(b)},"$1","gvC",2,0,20,90],
-static:{nz:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.PJ8.ZL(a)
-C.PJ8.XI(a)
-return a}}},
-waa:{
-"^":"uL+Pi;",
-$isd3:true}}],["heap_map_element","package:observatory/src/elements/heap_map.dart",,O,{
-"^":"",
-Hz:{
-"^":"a;zE,mS",
-PY:[function(){return new O.Hz(this.zE,this.mS+4)},"$0","gaw",0,0,132],
-gvH:function(a){return C.CD.cU(this.mS,4)},
-static:{"^":"Q0z",x6:function(a,b){var z,y,x
-z=b.gy(b)
-y=J.DO(a)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=b.gx(b)
-if(typeof x!=="number")return H.s(x)
-return new O.Hz(a,(z*y+x)*4)}}},
-uc:{
-"^":"a;Yu<,tL"},
-Vb:{
-"^":"V4;hi,An,dW,rM,Ge,UL,PA,oj,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#fragmentation")
-a.hi=z
-z=J.Q9(z)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gmo(a)),z.Sg),[H.Kp(z,0)]).Zz()
-z=J.GW(a.hi)
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gJb(a)),z.Sg),[H.Kp(z,0)]).Zz()},
-LV:function(a,b){var z,y,x
-for(z=J.mY(b),y=0;z.G();){x=z.lo
-if(typeof x!=="number")return H.s(x)
-y=y*256+x}return y},
-fJ:function(a,b,c,d){var z=J.uH(c,"@")
-if(0>=z.length)return H.e(z,0)
-a.UL.u(0,b,z[0])
-a.rM.u(0,b,d)
-a.Ge.u(0,this.LV(a,d),b)},
-eD:function(a,b,c){var z,y,x,w,v,u,t,s,r
-for(z=J.mY(J.UQ(b,"members")),y=a.UL,x=a.rM,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.uH(v.r0,"/")),null,null)
-t=u==null?C.pr:P.r2(u)
-s=[t.j1(128),t.j1(128),t.j1(128),255]
-r=J.uH(v.px,"@")
-if(0>=r.length)return H.e(r,0)
-y.u(0,u,r[0])
-x.u(0,u,s)
-w.u(0,this.LV(a,s),u)}this.fJ(a,c,"Free",$.Rl())
-this.fJ(a,0,"",$.Qg())},
-WE:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.dW
-y=J.DO(a.An)
-if(typeof z!=="number")return z.U()
-if(typeof y!=="number")return H.s(y)
-x=z*y
-w=C.CD.cU(O.x6(a.An,b).mS,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)
-z=v>=z}else z=!0
-if(z)return
-s=J.UQ(t,v)
-z=J.U6(s)
-r=z.t(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)
-if(!(o<n))break
-p=y.t(r,o)
-if(typeof p!=="number")return H.s(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.uc(J.ew(z,u*y),J.vX(p,J.UQ(a.oj,"unit_size_bytes")))},
-U8:[function(a,b){var z,y,x,w,v
-z=J.RE(b)
-y=this.WE(a,z.gD7(b))
-x=H.d(y.tL)+"B @ 0x"+J.cR(y.Yu,16)
-z=z.gD7(b)
-z=O.x6(a.An,z)
-w=z.mS
-v=a.UL.t(0,a.Ge.t(0,this.LV(a,C.yp.Mu(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","gmo",2,0,129,2],
-X7:[function(a,b){var z=J.cR(this.WE(a,J.HF(b)).Yu,16)
-window.location.hash="/"+H.d(J.Ds(J.aT(a.oj)))+"/address/"+z},"$1","gJb",2,0,129,2],
-My:function(a){var z,y,x,w,v
-z=a.oj
-if(z==null||a.hi==null)return
-this.eD(a,J.UQ(z,"class_list"),J.UQ(a.oj,"free_class_id"))
-y=J.UQ(a.oj,"pages")
-z=a.hi.parentElement
-z.toString
-x=P.T7(C.CD.yu(C.CD.UD(z.clientLeft)),C.CD.yu(C.CD.UD(z.clientTop)),C.CD.yu(C.CD.UD(z.clientWidth)),C.CD.yu(C.CD.UD(z.clientHeight)),null).R
-z=J.Ts(J.Ts(J.UQ(a.oj,"page_size_bytes"),J.UQ(a.oj,"unit_size_bytes")),x)
-if(typeof z!=="number")return H.s(z)
-z=4+z
-a.dW=z
-w=J.q8(y)
-if(typeof w!=="number")return H.s(w)
-v=P.J(z*w,6000)
-w=P.J3(J.Vf(a.hi).createImageData(x,v))
-a.An=w
-J.No(a.hi,J.DO(w))
-J.OE(a.hi,J.OB(a.An))
-this.ps(a,0)},
-ps:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-z=J.UQ(a.oj,"pages")
-y=J.U6(z)
-x="Loaded "+b+" of "+H.d(y.gB(z))+" pages"
-a.PA=this.ct(a,C.PM,a.PA,x)
-x=a.dW
-if(typeof x!=="number")return H.s(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.An)
-if(typeof x!=="number")return H.s(x)
-x=v>x}else x=!0
-if(x)return
-u=O.x6(a.An,H.VM(new P.hL(0,w),[null]))
-t=J.UQ(y.t(z,b),"objects")
-y=J.U6(t)
-x=a.rM
-s=0
-while(!0){r=y.gB(t)
-if(typeof r!=="number")return H.s(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.mS
-m=n+4
-C.yp.vg(J.Qd(r),n,m,p)
-u=new O.Hz(r,m)}s+=2}while(!0){y=u.mS
-x=C.CD.cU(y,4)
-r=u.zE
-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)
-new P.hL(m,l).$builtinTypeInfo=[null]
-if(!(l<v))break
-x=$.Qg()
-m=y+4
-C.yp.vg(n.gRn(r),y,m,x)
-u=new O.Hz(r,m)}y=J.Vf(a.hi)
-x=a.An
-J.kZ(y,x,0,0,0,w,J.DO(x),v)
-P.Iw(new O.R5(a,b),null)},
-RF:[function(a,b){var z=a.oj
-if(z==null)return
-J.aT(z).cv("heapmap").ml(new O.aG(a)).OA(new O.wx()).Qy(b)},"$1","gvC",2,0,20,90],
-YS7:[function(a,b){P.Iw(new O.oc(a),null)},"$1","gR2",2,0,20,57],
-static:{"^":"nK,Os,SoT,WBO",dF:function(a){var z,y,x,w,v
-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])
-a.rM=z
-a.Ge=y
-a.UL=x
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=w
-a.ZQ=v
-C.Cs.ZL(a)
-C.Cs.XI(a)
-return a}}},
-V4:{
-"^":"uL+Pi;",
-$isd3:true},
-R5:{
-"^":"Tp:69;a,b",
-$0:function(){J.EK(this.a,this.b+1)},
-$isEH:true},
-aG:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oj=J.Q5(z,C.QH,z.oj,a)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-wx:{
-"^":"Tp:77;",
-$2:[function(a,b){N.QM("").To(H.d(a)+" "+H.d(b))},"$2",null,4,0,null,1,134,"call"],
-$isEH:true},
-oc:{
-"^":"Tp:69;a",
-$0:function(){J.vP(this.a)},
-$isEH:true}}],["heap_profile_element","package:observatory/src/elements/heap_profile.dart",,K,{
-"^":"",
-UC:{
-"^":"Vz0;oH,vp,zz,pT,jV,AP,fn",
-eE:function(a,b){var z
-if(b===0){z=this.vp
-if(a>>>0!==a||a>=z.length)return H.e(z,a)
-return J.O6(J.UQ(J.U8o(z[a]),b))}return G.Vz0.prototype.eE.call(this,a,b)}},
-Ly:{
-"^":"V10;MF,uY,GQ,I8,Oc,GM,nc,pp,Ol,Sk,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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.nc},
-sLF:function(a,b){a.nc=this.ct(a,C.kG,a.nc,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)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-z=(a.shadowRoot||a.webkitShadowRoot).querySelector("#newPieChart")
-y=new G.qu(null,P.L5(null,null,null,null,null))
-y.vR=P.zV(J.UQ($.BY,"PieChart"),[z])
-a.I8=y
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#oldPieChart")
-z=new G.qu(null,P.L5(null,null,null,null,null))
-z.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-a.GM=z
-a.pp=(a.shadowRoot||a.webkitShadowRoot).querySelector("#classTableBody")},
-Og:function(a){var z,y,x,w
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,"class")
-if(w==null)continue
-w.gUY().eC(x.t(y,"new"))
-w.gxQ().eC(x.t(y,"old"))}},
-Yz:function(a){var z,y,x,w,v,u,t,s,r,q
-a.nc.B7()
-for(z=J.mY(J.UQ(a.Ol,"members"));z.G();){y=J.UQ(z.gl(),"class")
-if(y==null)continue
-if(y.gMp())continue
-x=y.gUY().gbi().yg
-w=y.gUY().gbi().wf
-v=y.gUY().gl().yg
-u=y.gUY().gl().wf
-t=y.gxQ().gbi().yg
-s=y.gxQ().gbi().wf
-r=y.gxQ().gl().yg
-q=y.gxQ().gl().wf
-J.Jr(a.nc,new G.Ni([y,"",x,w,v,u,"",t,s,r,q]))}J.tO(a.nc)},
-E4:function(a,b,c){var z,y,x,w,v,u
-z=J.UQ(J.TY(a.nc),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))
-w=1
-while(!0){v=J.q8(x.gUQ(z))
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-c$0:{if(C.Nm.tg(C.NG,w))break c$0
-u=J.UQ(y.gks(b),w)
-v=J.RE(u)
-v.smk(u,J.AG(J.UQ(x.gUQ(z),w)))
-v.sa4(u,a.nc.Gu(c,w))}++w}},
-Jh:function(a){var z,y,x,w,v,u,t,s
-z=J.Mx(a.pp)
-if(z.gB(z)>a.nc.gzz().length){z=J.Mx(a.pp)
-y=z.gB(z)-a.nc.gzz().length
-for(x=0;x<y;++x)J.Mx(a.pp).mv(0)}else{z=J.Mx(a.pp)
-if(z.gB(z)<a.nc.gzz().length){z=a.nc.gzz().length
-w=J.Mx(a.pp)
-v=z-w.gB(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))
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-t=z.iF(u,-1)
-t.toString
-new W.I4(t).h(0,"left-border-spacer")
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-z.iF(u,-1)
-J.Mx(a.pp).h(0,u)}}}for(x=0;x<a.nc.gzz().length;++x){z=a.nc.gzz()
-if(x>=z.length)return H.e(z,x)
-s=z[x]
-this.E4(a,J.Mx(a.pp).t(0,x),s)}},
-BB:[function(a,b,c,d){var z,y,x
-if(!!J.x(d).$isv6){z=a.nc.gxp()
-y=d.cellIndex
-x=a.nc
-if(z==null?y!=null:z!==y){x.sxp(y)
-a.nc.sT3(!0)}else x.sT3(!x.gT3())
-J.tO(a.nc)
-this.Jh(a)}},"$3","gQq",6,0,93,1,94,95],
-RF:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile").ml(this.gLv(a)).Qy(b)},"$1","gvC",2,0,20,90],
-zT:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?gc=full").ml(this.gLv(a)).Qy(b)},"$1","gyW",2,0,20,90],
-eJ:[function(a,b){var z=a.Ol
-if(z==null)return
-J.aT(z).cv("/allocationprofile?reset=true").ml(this.gLv(a)).Qy(b)},"$1","gNb",2,0,20,90],
-hz:[function(a,b){a.Ol=this.ct(a,C.vb,a.Ol,b)},"$1","gLv",2,0,135,136],
-n1:[function(a,b){var z,y,x,w,v
-z=a.Ol
-if(z==null)return
-z=J.aT(z)
-z=this.ct(a,C.rB,a.Sk,z)
-a.Sk=z
-z.WU(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.GQ.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-x=J.aT(a.Ol)
-z=a.GQ
-w=x.gUY().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.GQ
-z=J.bI(x.gUY().gCs(),x.gUY().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.GQ
-v=x.gUY().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-z=a.Oc.Yb
-z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-z=a.Oc
-w=x.gxQ().gSU()
-z=z.Yb
-v=[]
-C.Nm.FV(v,C.Nm.ez(["Used",w],P.En()))
-z.V7("addRow",[H.VM(new P.Tz(v),[null])])
-v=a.Oc
-z=J.bI(x.gxQ().gCs(),x.gxQ().gSU())
-v=v.Yb
-w=[]
-C.Nm.FV(w,C.Nm.ez(["Free",z],P.En()))
-v.V7("addRow",[H.VM(new P.Tz(w),[null])])
-w=a.Oc
-v=x.gxQ().gMX()
-w=w.Yb
-z=[]
-C.Nm.FV(z,C.Nm.ez(["External",v],P.En()))
-w.V7("addRow",[H.VM(new P.Tz(z),[null])])
-this.Og(a)
-this.Yz(a)
-this.Jh(a)
-a.I8.W2(a.GQ)
-a.GM.W2(a.Oc)
-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,20,57],
-Ar:[function(a,b){var z,y,x
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-x=b===!0?y.god(z).gUY():y.god(z).gxQ()
-return C.CD.Sy(J.L9(J.vX(x.gpy(),1000),x.gYk()),2)+" ms"},"$1","gOd",2,0,137,138],
-uW:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.AG((b===!0?y.god(z).gUY():y.god(z).gxQ()).gYk())},"$1","gJN",2,0,137,138],
-F9:[function(a,b){var z,y
-z=a.Ol
-if(z==null)return""
-y=J.RE(z)
-return J.cI((b===!0?y.god(z).gUY():y.god(z).gxQ()).gpy(),2)+" secs"},"$1","goN",2,0,137,138],
-Zy:function(a){var z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.GQ=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.GQ.Yb.V7("addColumn",["number","Size"])
-z=P.zV(J.UQ($.BY,"DataTable"),null)
-a.Oc=new G.Kf(z)
-z.V7("addColumn",["string","Type"])
-a.Oc.Yb.V7("addColumn",["number","Size"])
-z=H.VM([],[G.Ni])
-z=this.ct(a,C.kG,a.nc,new K.UC([new G.Kt("Class",G.Q8()),new G.Kt("",G.Q8()),new G.Kt("Accumulated Size (New)",G.YN()),new G.Kt("Accumulated Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh()),new G.Kt("",G.Q8()),new G.Kt("Accumulator Size (Old)",G.YN()),new G.Kt("Accumulator Instances",G.kh()),new G.Kt("Current Size",G.YN()),new G.Kt("Current Instances",G.kh())],z,[],0,!0,null,null))
-a.nc=z
-z.sxp(2)},
-static:{US:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.MF="---"
-a.uY="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.xu.ZL(a)
-C.xu.XI(a)
-C.xu.Zy(a)
-return a}}},
-V10:{
-"^":"uL+Pi;",
-$isd3:true}}],["html_common","dart:html_common",,P,{
-"^":"",
-bL:function(a){var z,y
-z=[]
-y=new P.Tm(new P.wF([],z),new P.rG(z),new P.fh(z)).$1(a)
-new P.uS().$0()
-return y},
-o7:function(a,b){var z=[]
-return new P.xL(b,new P.a9([],z),new P.D6(z),new P.KC(z)).$1(a)},
-J3:function(a){var z,y
-z=J.x(a)
-if(!!z.$isSg){y=z.gRn(a)
-if(y.constructor===Array)if(typeof CanvasPixelArray!=="undefined"){y.constructor=CanvasPixelArray
-y.BYTES_PER_ELEMENT=1}return a}return new P.nl(a.data,a.height,a.width)},
-QO:function(a){if(!!J.x(a).$isnl)return{data:a.Rn,height:a.fg,width:a.R}
-return a},
-F7:function(){var z=$.R6
-if(z==null){z=$.Qz
-if(z==null){z=J.NT(window.navigator.userAgent,"Opera",0)
-$.Qz=z}z=z!==!0&&J.NT(window.navigator.userAgent,"WebKit",0)
-$.R6=z}return z},
-wF:{
-"^":"Tp:48;b,c",
-$1:function(a){var z,y,x
-z=this.b
-y=z.length
-for(x=0;x<y;++x)if(z[x]===a)return x
-z.push(a)
-this.c.push(null)
-return y},
-$isEH:true},
-rG:{
-"^":"Tp:139;d",
-$1:function(a){var z=this.d
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-fh:{
-"^":"Tp:140;e",
-$2:function(a,b){var z=this.e
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-uS:{
-"^":"Tp:69;",
-$0:function(){},
-$isEH:true},
-Tm:{
-"^":"Tp:13;f,UI,bK",
-$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.y3)
-if(!!y.$isSP)throw H.b(P.SY("structured clone of RegExp"))
-if(!!y.$ishH)return a
-if(!!y.$isO4)return a
-if(!!y.$isSg)return a
-if(!!y.$isWZ)return a
-if(!!y.$iseH)return a
-if(!!y.$isZ0){x=this.f.$1(a)
-w=this.UI.$1(x)
-z.a=w
-if(w!=null)return w
-w={}
-z.a=w
-this.bK.$2(x,w)
-y.aN(a,new P.q1(z,this))
-return z.a}if(!!y.$isWO){v=y.gB(a)
-x=this.f.$1(a)
-w=this.UI.$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))
-if(u>=w.length)return H.e(w,u)
-w[u]=z}return w}throw H.b(P.SY("structured clone of other type"))},
-$isEH:true},
-q1:{
-"^":"Tp:77;a,Gq",
-$2:[function(a,b){this.a.a[a]=this.Gq.$1(b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true},
-a9:{
-"^":"Tp:48;a,b",
-$1:function(a){var z,y,x,w
-z=this.a
-y=z.length
-for(x=0;x<y;++x){w=z[x]
-if(w==null?a==null:w===a)return x}z.push(a)
-this.b.push(null)
-return y},
-$isEH:true},
-D6:{
-"^":"Tp:139;c",
-$1:function(a){var z=this.c
-if(a>=z.length)return H.e(z,a)
-return z[a]},
-$isEH:true},
-KC:{
-"^":"Tp:140;d",
-$2:function(a,b){var z=this.d
-if(a>=z.length)return H.e(z,a)
-z[a]=b},
-$isEH:true},
-xL:{
-"^":"Tp:13;e,f,UI,bK",
-$1:function(a){var z,y,x,w,v,u,t
-if(a==null)return a
-if(typeof a==="boolean")return a
-if(typeof a==="number")return a
-if(typeof a==="string")return a
-if(a instanceof Date)return P.Wu(a.getTime(),!0)
-if(a instanceof RegExp)throw H.b(P.SY("structured clone of RegExp"))
-if(Object.getPrototypeOf(a)===Object.prototype){z=this.f.$1(a)
-y=this.UI.$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.Kp(x,0)]);x.G();){w=x.lo
-y.u(0,w,this.$1(a[w]))}return y}if(a instanceof Array){z=this.f.$1(a)
-y=this.UI.$1(z)
-if(y!=null)return y
-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)
-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,
-$isSg:true},
-As3:{
-"^":"a;",
-bu:function(a){return this.lF().zV(0," ")},
-gA:function(a){var z=this.lF()
-z=H.VM(new P.zQ(z,z.zN,null,null),[null])
-z.zq=z.O2.H9
-return z},
-aN:function(a,b){this.lF().aN(0,b)},
-zV:function(a,b){return this.lF().zV(0,b)},
-ez:[function(a,b){var z=this.lF()
-return H.VM(new H.xy(z,b),[H.Kp(z,0),null])},"$1","gIr",2,0,141,31],
-ad:function(a,b){var z=this.lF()
-return H.VM(new H.U5(z,b),[H.Kp(z,0)])},
-lM:[function(a,b){var z=this.lF()
-return H.VM(new H.oA(z,b),[H.Kp(z,0),null])},"$1","git",2,0,142,31],
-Vr:function(a,b){return this.lF().Vr(0,b)},
-gl0:function(a){return this.lF().X5===0},
-gor:function(a){return this.lF().X5!==0},
-gB:function(a){return this.lF().X5},
-tg:function(a,b){return this.lF().tg(0,b)},
-hV:function(a){return this.lF().tg(0,a)?a:null},
-h:function(a,b){return this.OS(new P.GE(b))},
-Rz:function(a,b){var z,y
-z=this.lF()
-y=z.Rz(0,b)
-this.p5(z)
-return y},
-FV:function(a,b){this.OS(new P.rl(b))},
-grZ:function(a){var z=this.lF().lX
-if(z==null)H.vh(P.w("No elements"))
-return z.gGc(z)},
-tt:function(a,b){return this.lF().tt(0,b)},
-br:function(a){return this.tt(a,!0)},
-V1:function(a){this.OS(new P.uQ())},
-OS:function(a){var z,y
-z=this.lF()
-y=a.$1(z)
-this.p5(z)
-return y},
-$isyN:true,
-$isQV:true,
-$asQV:function(){return[P.qU]}},
-GE:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bi(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-rl:{
-"^":"Tp:13;a",
-$1:[function(a){return J.bj(a,this.a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-uQ:{
-"^":"Tp:13;",
-$1:[function(a){return J.U2(a)},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-D7:{
-"^":"ark;Yn,iz",
-gye:function(){var z=this.iz
-return P.F(z.ad(z,new P.hT()),!0,W.h4)},
-aN:function(a,b){H.bQ(this.gye(),b)},
-u:function(a,b,c){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-J.Bj(z[b],c)},
-sB:function(a,b){var z=this.gye().length
-if(b>=z)return
-else if(b<0)throw H.b(P.u("Invalid list length"))
-this.UZ(0,b,z)},
-h:function(a,b){this.iz.NL.appendChild(b)},
-FV:function(a,b){var z,y
-for(z=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]),y=this.iz.NL;z.G();)y.appendChild(z.lo)},
-tg:function(a,b){return!1},
-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"))},
-vg:function(a,b,c,d){return this.YW(a,b,c,d,0)},
-UZ:function(a,b,c){H.bQ(C.Nm.aM(this.gye(),b,c),new P.GS())},
-V1:function(a){J.r4(this.iz.NL)},
-mv:function(a){var z=this.grZ(this)
-if(z!=null)J.Mp(z)
-return z},
-xe:function(a,b,c){this.iz.xe(0,b,c)},
-UG:function(a,b,c){var z,y
-z=this.iz.NL
-y=z.childNodes
-if(b<0||b>=y.length)return H.e(y,b)
-J.qD(z,c,y[b])},
-gB:function(a){return this.gye().length},
-t:function(a,b){var z=this.gye()
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-return z[b]},
-gA:function(a){var z=this.gye()
-return H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)])}},
-hT:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ish4},
-$isEH:true},
-GS:{
-"^":"Tp:13;",
-$1:function(a){return J.Mp(a)},
-$isEH:true}}],["instance_ref_element","package:observatory/src/elements/instance_ref.dart",,B,{
-"^":"",
-pR:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gJp:function(a){var z=a.tY
-if(z!=null)if(J.xC(z.gzS(),"Null"))if(J.xC(J.F8(a.tY),"objects/optimized-out"))return"This object is no longer needed and has been removed by the optimizing compiler."
-else if(J.xC(J.F8(a.tY),"objects/collected"))return"This object has been reclaimed by the garbage collector."
-else if(J.xC(J.F8(a.tY),"objects/expired"))return"The handle to this object has expired.  Consider refreshing the page."
-else if(J.xC(J.F8(a.tY),"objects/not-initialized"))return"This object will be initialized once it is accessed by the program."
-else if(J.xC(J.F8(a.tY),"objects/being-initialized"))return"This object is currently being initialized."
-return Q.xI.prototype.gJp.call(this,a)},
-Gn:[function(a){return this.gNe(a)},"$0","gyX",0,0,69],
-vQ:[function(a,b,c){var z,y
-z=a.tY
-if(b===!0)J.r0(z).ml(new B.qB(a)).Qy(c)
-else{y=J.w1(z)
-y.u(z,"fields",null)
-y.u(z,"elements",null)
-c.$0()}},"$2","gNe",4,0,144,145,90],
-static:{lu:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.EL.ZL(a)
-C.EL.XI(a)
-return a}}},
-qB:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=J.U6(a)
-if(z.t(a,"valueAsString")!=null){z.soc(a,z.t(a,"valueAsString"))
-a.sdN(z.t(a,"valueAsString"))}z=this.a
-y=J.RE(z)
-z.tY=y.ct(z,C.xP,z.tY,a)
-y.ct(z,C.xP,0,1)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["instance_view_element","package:observatory/src/elements/instance_view.dart",,Z,{
-"^":"",
-hx:{
-"^":"V11;Xh,f2,Rr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-ghf:function(a){return a.Xh},
-shf:function(a,b){a.Xh=this.ct(a,C.fn,a.Xh,b)},
-gIi:function(a){return a.f2},
-sIi:function(a,b){a.f2=this.ct(a,C.XM,a.f2,b)},
-gCF:function(a){return a.Rr},
-sCF:function(a,b){a.Rr=this.ct(a,C.tg,a.Rr,b)},
-vV:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-S1:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retained")).ml(new Z.wU(a))},"$1","ghN",2,0,99,100],
-Pr:[function(a,b){return J.aT(a.Xh).cv(J.ew(J.F8(a.Xh),"/retaining_path?limit="+H.d(b))).ml(new Z.cL(a))},"$1","gCI",2,0,99,33],
-RF:[function(a,b){J.r0(a.Xh).Qy(b)},"$1","gvC",2,0,20,90],
-static:{CoW:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Rr=null
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.yd.ZL(a)
-C.yd.XI(a)
-return a}}},
-V11:{
-"^":"uL+Pi;",
-$isd3:true},
-wU:{
-"^":"Tp:101;a",
-$1:[function(a){var z,y
-z=this.a
-y=H.BU(J.UQ(a,"valueAsString"),null,null)
-z.Rr=J.Q5(z,C.tg,z.Rr,y)},"$1",null,2,0,null,82,"call"],
-$isEH:true},
-cL:{
-"^":"Tp:131;a",
-$1:[function(a){var z=this.a
-z.f2=J.Q5(z,C.XM,z.f2,a)},"$1",null,2,0,null,82,"call"],
-$isEH:true}}],["io_view_element","package:observatory/src/elements/io_view.dart",,E,{
-"^":"",
-L4:{
-"^":"V12;PM,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkm:function(a){return a.PM},
-skm:function(a,b){a.PM=this.ct(a,C.qs,a.PM,b)},
-RF:[function(a,b){J.r0(a.PM).Qy(b)},"$1","gvC",2,0,20,90],
-static:{MB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.za.ZL(a)
-C.za.XI(a)
-return a}}},
-V12:{
-"^":"uL+Pi;",
-$isd3:true},
-Mb:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{RVI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ag.ZL(a)
-C.Ag.XI(a)
-return a}}},
-mO:{
-"^":"V13;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ch:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ie.ZL(a)
-C.Ie.XI(a)
-return a}}},
-V13:{
-"^":"uL+Pi;",
-$isd3:true},
-DE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{oB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ig.ZL(a)
-C.Ig.XI(a)
-return a}}},
-U1:{
-"^":"V14;yR,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gql:function(a){return a.yR},
-sql:function(a,b){a.yR=this.ct(a,C.oj,a.yR,b)},
-RF:[function(a,b){J.r0(a.yR).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.yR).Qy(new E.Kv(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{hm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.VLs.ZL(a)
-C.VLs.XI(a)
-return a}}},
-V14:{
-"^":"uL+Pi;",
-$isd3:true},
-Kv:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-H8:{
-"^":"V15;vd,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPB:function(a){return a.vd},
-sPB:function(a,b){a.vd=this.ct(a,C.yL,a.vd,b)},
-RF:[function(a,b){J.r0(a.vd).Qy(b)},"$1","gvC",2,0,20,90],
-TY:[function(a){J.r0(a.vd).Qy(new E.uN(a))},"$0","gW6",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.gW6(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{ZhX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.hh.ZL(a)
-C.hh.XI(a)
-return a}}},
-V15:{
-"^":"uL+Pi;",
-$isd3:true},
-uN:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.AL(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-WS:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{jS:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bP.ZL(a)
-C.bP.XI(a)
-return a}}},
-qh:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Sc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wK.ZL(a)
-C.wK.XI(a)
-return a}}},
-oF:{
-"^":"V16;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{UE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Tl.ZL(a)
-C.Tl.XI(a)
-return a}}},
-V16:{
-"^":"uL+Pi;",
-$isd3:true},
-Q6:{
-"^":"V17;uv,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gj4:function(a){return a.uv},
-sj4:function(a,b){a.uv=this.ct(a,C.Ve,a.uv,b)},
-RF:[function(a,b){J.r0(a.uv).Qy(b)},"$1","gvC",2,0,20,90],
-static:{chF:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.to.ZL(a)
-C.to.XI(a)
-return a}}},
-V17:{
-"^":"uL+Pi;",
-$isd3:true},
-uE:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{P3:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Rr.ZL(a)
-C.Rr.XI(a)
-return a}}},
-Zn:{
-"^":"V18;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{xK:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ij.ZL(a)
-C.ij.XI(a)
-return a}}},
-V18:{
-"^":"uL+Pi;",
-$isd3:true},
-n5:{
-"^":"V19;h1,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gHy:function(a){return a.h1},
-sHy:function(a,b){a.h1=this.ct(a,C.YE,a.h1,b)},
-RF:[function(a,b){J.r0(a.h1).Qy(b)},"$1","gvC",2,0,20,90],
-static:{iOo:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.aV.ZL(a)
-C.aV.XI(a)
-return a}}},
-V19:{
-"^":"uL+Pi;",
-$isd3:true},
-Ma:{
-"^":"V20;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Ii:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.iR.ZL(a)
-C.iR.XI(a)
-return a}}},
-V20:{
-"^":"uL+Pi;",
-$isd3:true},
-wN:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{ML:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.L6.ZL(a)
-C.L6.XI(a)
-return a}}},
-ds:{
-"^":"V21;wT,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gMZ:function(a){return a.wT},
-sMZ:function(a,b){a.wT=this.ct(a,C.jU,a.wT,b)},
-RF:[function(a,b){J.r0(a.wT).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.wT).Qy(new E.Gf(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{pI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wP.ZL(a)
-C.wP.XI(a)
-return a}}},
-V21:{
-"^":"uL+Pi;",
-$isd3:true},
-Gf:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true},
-ou:{
-"^":"V22;Cr,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gjx:function(a){return a.Cr},
-sjx:function(a,b){a.Cr=this.ct(a,C.vp,a.Cr,b)},
-RF:[function(a,b){J.r0(a.Cr).Qy(b)},"$1","gvC",2,0,20,90],
-static:{tX:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.lX.ZL(a)
-C.lX.XI(a)
-return a}}},
-V22:{
-"^":"uL+Pi;",
-$isd3:true},
-av:{
-"^":"ZzR;CB,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gEQ:function(a){return a.CB},
-sEQ:function(a,b){a.CB=this.ct(a,C.pH,a.CB,b)},
-static:{Ci:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.CB=!1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Wa.ZL(a)
-C.Wa.XI(a)
-return a}}},
-ZzR:{
-"^":"xI+Pi;",
-$isd3:true},
-uz:{
-"^":"V23;RX,mZ,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gNN:function(a){return a.RX},
-Fn:function(a){return this.gNN(a).$0()},
-sNN:function(a,b){a.RX=this.ct(a,C.Wj,a.RX,b)},
-RF:[function(a,b){J.r0(a.RX).Qy(b)},"$1","gvC",2,0,20,90],
-nK:[function(a){J.r0(a.RX).Qy(new E.Cc(a))},"$0","guT",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.mZ=P.rT(P.ii(0,0,0,0,0,1),this.guT(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.mZ
-if(z!=null){z.ed()
-a.mZ=null}},
-static:{z1:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.bZ.ZL(a)
-C.bZ.XI(a)
-return a}}},
-V23:{
-"^":"uL+Pi;",
-$isd3:true},
-Cc:{
-"^":"Tp:69;a",
-$0:[function(){var z=this.a
-if(z.mZ!=null)z.mZ=P.rT(P.ii(0,0,0,0,0,1),J.lB(z))},"$0",null,0,0,null,"call"],
-$isEH:true}}],["isolate_profile_element","package:observatory/src/elements/isolate_profile.dart",,X,{
-"^":"",
-Se:{
-"^":"Y2;B1>,YK,H,Zn<,vs<,ki<,Vh<,ZX<,eT,yt,ks,oH,PU,aZ,yq,AP,fn",
-gtT:function(a){return J.on(this.H)},
-C4:function(a){var z,y,x,w,v,u,t,s
-z=this.B1
-y=J.UQ(z,"threshold")
-x=this.ks
-if(x.length>0)return
-for(w=this.H,v=J.mY(J.Mx(w)),u=this.YK;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.on(t).gDu(),u.Av)>y))continue
-x.push(X.SJ(z,u,t,this))}},
-cO:function(){},
-Nh:function(){return J.q8(J.Mx(this.H))>0},
-mW:function(a,b,c,d){var z,y
-z=this.H
-this.Vh=H.d(z.gAv())
-this.ZX=G.P0(J.L9(J.vX(J.UQ(this.B1,"period"),z.gAv()),1000000))
-y=J.RE(z)
-if(J.xC(J.Iz(y.gtT(z)),C.Z7)){this.Zn="Tag (category)"
-if(d==null)this.vs=G.dj(z.gAv(),this.YK.Av)
-else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(z.gAv(),this.YK.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.dj(z.gAv(),this.YK.Av)
-else this.vs=G.dj(z.gAv(),d.H.gAv())
-this.ki=G.dj(y.gtT(z).gDu(),this.YK.Av)}z=this.oH
-z.push(this.vs)
-z.push(this.ki)},
-static:{SJ:function(a,b,c,d){var z,y
-z=H.VM([],[G.Y2])
-y=d!=null?d.yt+1:0
-z=new X.Se(a,b,c,"","","","","",d,y,z,[],"\u2192","cursor: pointer;",!1,null,null)
-z.k7(d)
-z.mW(a,b,c,d)
-return z}}},
-kK:{
-"^":"V24;oi,TH,WT,Uw,Ik,oo,fE,ev,XX,TM,WC,Hm=,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-gEl:function(a){return a.Ik},
-sEl: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
-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)
-z=C.CD.Sy(1000000/w,0)
-a.Ik=this.ct(a,C.YD,a.Ik,z)
-z=G.mG(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,20,57],
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=R.tB([])
-a.Hm=new G.XN(z,null,null)
-this.Zb(a)},
-m5:[function(a,b){this.RF(a,null)},"$1","gb6",2,0,20,57],
-RF:[function(a,b){var z="profile?tags="+H.d(a.TM)
-J.aT(a.oi).cv(z).ml(new X.Xy(a)).Qy(b)},"$1","gvC",2,0,20,90],
-Zb:function(a){if(a.oi==null)return
-this.GN(a)},
-GN:function(a){var z,y,x,w,v
-z=J.aT(a.oi).gBC()
-if(z==null)return
-try{a.Hm.rT(X.SJ(a.oi,z,z,null))}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-N.QM("").xH("_buildStackTree",y,x)}if(J.xC(J.q8(a.Hm.vp),1))a.Hm.qU(0)
-this.ct(a,C.ep,null,a.Hm)},
-ka:[function(a,b){return"padding-left: "+b.gyt()*16+"px;"},"$1","gHn",2,0,91,92],
-Vj:[function(a,b){return C.QC[C.jn.Y(b.gyt()-1,9)]},"$1","gbw",2,0,91,92],
-YF:[function(a,b,c,d){var z,y,x,w,v,u
-w=J.RE(b)
-if(!J.xC(J.F8(w.gN(b)),"expand")&&!J.xC(w.gN(b),d))return
-z=J.Lp(d)
-if(!!J.x(z).$istV)try{w=a.Hm
-v=J.IO(z)
-if(typeof v!=="number")return v.W()
-w.qU(v-1)}catch(u){w=H.Ru(u)
-y=w
-x=new H.XO(u,null)
-N.QM("").xH("toggleExpanded",y,x)}},"$3","gY9",6,0,93,1,94,95],
-static:{"^":"B6",jD:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.WT=""
-a.Uw=""
-a.Ik=""
-a.oo=""
-a.fE=""
-a.ev=""
-a.XX=0.0002
-a.TM="uv"
-a.WC="#tableTree"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kS.ZL(a)
-C.kS.XI(a)
-return a}}},
-V24:{
-"^":"uL+Pi;",
-$isd3:true},
-Xy:{
-"^":"Tp:101;a",
-$1:[function(a){var z=this.a
-z.oi=J.Q5(z,C.vb,z.oi,a)},"$1",null,2,0,null,146,"call"],
-$isEH:true}}],["isolate_ref_element","package:observatory/src/elements/isolate_ref.dart",,N,{
-"^":"",
-oa:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{IB:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.LN.ZL(a)
-C.LN.XI(a)
-return a}}}}],["isolate_summary_element","package:observatory/src/elements/isolate_summary.dart",,D,{
-"^":"",
-St:{
-"^":"V25;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ow},
-sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{N5:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OoF.ZL(a)
-C.OoF.XI(a)
-return a}}},
-V25:{
-"^":"uL+Pi;",
-$isd3:true},
-IW:{
-"^":"V26;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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 a.ow.cv("debug/pause").ml(new D.GG(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ow.cv("debug/resume").ml(new D.r8(a))},"$1","gDQ",2,0,147,14],
-static:{zr:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.F2.ZL(a)
-C.F2.XI(a)
-return a}}},
-V26:{
-"^":"uL+Pi;",
-$isd3:true},
-GG:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-r8:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ow)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Qh:{
-"^":"V27;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kd.ZL(a)
-C.kd.XI(a)
-return a}}},
-V27:{
-"^":"uL+Pi;",
-$isd3:true},
-Oz:{
-"^":"V28;ow,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ow},
-sod:function(a,b){a.ow=this.ct(a,C.rB,a.ow,b)},
-static:{RP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ji.ZL(a)
-C.Ji.XI(a)
-return a}}},
-V28:{
-"^":"uL+Pi;",
-$isd3:true},
-vT:{
-"^":"a;Y0,WL",
-eC:function(a){var z,y,x,w,v,u
-z=this.Y0.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.mY(a.gvc()),x=J.U6(a);y.G();){w=y.gl()
-v=J.uH(x.t(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.Tz(u)
-u.$builtinTypeInfo=[null]
-z.V7("addRow",[u])}}},
-Z4:{
-"^":"V29;wd,iw,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gXE:function(a){return a.wd},
-sXE:function(a,b){a.wd=this.ct(a,C.bJ,a.wd,b)},
-ci:[function(a,b){var z,y,x
-if(a.wd==null)return
-if($.Ib().MM.Gv!==0&&a.iw==null)a.iw=new D.vT(new G.Kf(P.zV(J.UQ($.BY,"DataTable"),null)),null)
-z=a.iw
-if(z==null)return
-z.eC(a.wd)
-y=(a.shadowRoot||a.webkitShadowRoot).querySelector("#counterPieChart")
-if(y!=null){z=a.iw
-x=z.WL
-if(x==null){x=new G.qu(null,P.L5(null,null,null,null,null))
-x.vR=P.zV(J.UQ($.BY,"PieChart"),[y])
-z.WL=x}x.W2(z.Y0)}},"$1","ghU",2,0,20,57],
-static:{d7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wQ.ZL(a)
-C.wQ.XI(a)
-return a}}},
-V29:{
-"^":"uL+Pi;",
-$isd3:true}}],["isolate_view_element","package:observatory/src/elements/isolate_view.dart",,L,{
-"^":"",
-If:{
-"^":"a;X6,YT",
-eC:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.X6.Yb
-if(J.xC(z.nQ("getNumberOfColumns"),0)){z.V7("addColumn",["string","Time"])
-for(y=J.mY(a.gaf());y.G();){x=y.lo
-if(J.xC(x,"Idle"))continue
-z.V7("addColumn",["number",x])}}z.V7("removeRows",[0,z.nQ("getNumberOfRows")])
-w=J.R7(a.gaf(),"Idle")
-v=a.gij()
-for(u=0;u<a.glI().length;++u){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-t=y[u].SP
-s=[]
-if(t>0){if(typeof v!=="number")return H.s(v)
-s.push("t "+C.CD.Sy(t-v,2))}else s.push("")
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-r=y[u].wZ
-if(r===0){q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-s.push(0)}++q}}else{q=0
-while(!0){y=a.glI()
-if(u>=y.length)return H.e(y,u)
-if(!(q<y[u].XE.length))break
-c$1:{if(q===w)break c$1
-y=a.glI()
-if(u>=y.length)return H.e(y,u)
-y=y[u].XE
-if(q>=y.length)return H.e(y,q)
-s.push(C.CD.yu(J.L9(y[q],r)*100))}++q}}y=[]
-C.Nm.FV(y,C.Nm.ez(s,P.En()))
-y=new P.Tz(y)
-y.$builtinTypeInfo=[null]
-z.V7("addRow",[y])}}},
-qk:{
-"^":"V30;ck,ts,LR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-god:function(a){return a.ck},
-sod:function(a,b){a.ck=this.ct(a,C.rB,a.ck,b)},
-vV:[function(a,b){var z=a.ck
-return z.cv(J.ew(J.F8(z.gVc()),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-Vp:[function(a){a.ck.m7().ml(new L.LX(a))},"$0","gJD",0,0,18],
-Es:function(a){Z.uL.prototype.Es.call(this,a)
-a.ts=P.rT(P.ii(0,0,0,0,0,1),this.gJD(a))},
-dQ:function(a){var z
-Z.uL.prototype.dQ.call(this,a)
-z=a.ts
-if(z!=null){z.ed()
-a.ts=null}},
-RF:[function(a,b){J.r0(a.ck).Qy(b)},"$1","gvC",2,0,20,90],
-Fv:[function(a,b){return a.ck.cv("debug/pause").ml(new L.CV(a))},"$1","gX0",2,0,147,14],
-kf:[function(a,b){return a.ck.cv("resume").ml(new L.Vq(a))},"$1","gDQ",2,0,147,14],
-static:{Qtp:function(a){var z,y,x
-z=P.zV(J.UQ($.BY,"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])
-a.LR=new L.If(new G.Kf(z),null)
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=y
-a.ZQ=x
-C.Xe.ZL(a)
-C.Xe.XI(a)
-return a}}},
-V30:{
-"^":"uL+Pi;",
-$isd3:true},
-LX:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w,v
-z=this.a
-y=z.LR
-y.eC(a)
-x=(z.shadowRoot||z.webkitShadowRoot).querySelector("#tagProfileChart")
-if(x!=null){if(y.YT==null){w=P.L5(null,null,null,null,null)
-v=new G.qu(null,w)
-v.vR=P.zV(J.UQ($.BY,"SteppedAreaChart"),[x])
-y.YT=v
-w.u(0,"isStacked",!0)
-y.YT.bG.u(0,"connectSteps",!1)
-y.YT.bG.u(0,"vAxis",P.EF(["minValue",0,"maxValue",100],null,null))}y.YT.W2(y.X6)}if(z.ts!=null)z.ts=P.rT(P.ii(0,0,0,0,0,1),J.OY(z))},"$1",null,2,0,null,148,"call"],
-$isEH:true},
-CV:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-Vq:{
-"^":"Tp:13;a",
-$1:[function(a){return J.r0(this.a.ck)},"$1",null,2,0,null,130,"call"],
-$isEH:true}}],["json_view_element","package:observatory/src/elements/json_view.dart",,Z,{
-"^":"",
-xh:{
-"^":"a;ue,GO",
-LE:function(a,b){var z,y,x,w,v,u,t,s
-z=this.GO
-if(z.tg(0,a))return
-z.h(0,a)
-for(y=J.mY(a.gvc()),x=this.ue,w=J.U6(a),v=b+1;y.G();){u=y.gl()
-t=w.t(a,u)
-s=J.x(t)
-if(!!s.$isZ0){s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": {\n"
-x.vM+=s
-this.LE(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"}\n"}else if(!!s.$isWO){s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": [\n"
-x.vM+=s
-this.QC(t,v)
-s=C.xB.U("  ",b)
-s=x.vM+=s
-x.vM=s+"]\n"}else{s=C.xB.U("  ",b)
-x.vM+=s
-s="\""+H.d(u)+"\": "+H.d(t)
-s=x.vM+=s
-x.vM=s+"\n"}}z.Rz(0,a)},
-QC:function(a,b){var z,y,x,w,v,u
-z=this.GO
-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.$isZ0){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"{\n"
-this.LE(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"}\n"}else if(!!u.$isWO){u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"[\n"
-this.QC(v,w)
-u=C.xB.U("  ",b)
-u=x.vM+=u
-x.vM=u+"]\n"}else{u=C.xB.U("  ",b)
-x.vM+=u
-u=x.vM+=typeof v==="string"?v:H.d(v)
-x.vM=u+"\n"}}z.Rz(0,a)}},
-vj:{
-"^":"V31;Ly,cs,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIr:function(a){return a.Ly},
-ez:function(a,b){return this.gIr(a).$1(b)},
-sIr:function(a,b){a.Ly=this.ct(a,C.SR,a.Ly,b)},
-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
-z=P.p9("")
-y=P.Ls(null,null,null,null)
-x=a.Ly
-z.vM=""
-z.KF("{\n")
-new Z.xh(z,y).LE(x,0)
-z.KF("}\n")
-z=z.vM
-a.cs=this.ct(a,C.t6,a.cs,z)},"$1","ga5",2,0,20,57],
-static:{M7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yt.ZL(a)
-C.Yt.XI(a)
-return a}}},
-V31:{
-"^":"uL+Pi;",
-$isd3:true}}],["library_ref_element","package:observatory/src/elements/library_ref.dart",,R,{
-"^":"",
-LU:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{rA:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Z3.ZL(a)
-C.Z3.XI(a)
-return a}}}}],["library_view_element","package:observatory/src/elements/library_view.dart",,M,{
-"^":"",
-CX:{
-"^":"V32;iI,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gHt:function(a){return a.iI},
-sHt:function(a,b){a.iI=this.ct(a,C.EV,a.iI,b)},
-vV:[function(a,b){return J.aT(a.iI).cv(J.ew(J.F8(a.iI),"/eval?expr="+P.jW(C.yD,b,C.xM,!1)))},"$1","gZm",2,0,97,98],
-RF:[function(a,b){J.r0(a.iI).Qy(b)},"$1","gvC",2,0,20,90],
-static:{Dc:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.MG.ZL(a)
-C.MG.XI(a)
-return a}}},
-V32:{
-"^":"uL+Pi;",
-$isd3:true}}],["logging","package:logging/logging.dart",,N,{
-"^":"",
-Rw:{
-"^":"a;oc>,eT>,n2,Cj>,ks>,Gs",
-gB8:function(){var z,y,x
-z=this.eT
-y=z==null||J.xC(J.O6(z),"")
-x=this.oc
-return y?x:z.gB8()+"."+x},
-gOR:function(){if($.RL){var z=this.n2
-if(z!=null)return z
-z=this.eT
-if(z!=null)return z.gOR()}return $.Y4},
-sOR:function(a){if($.RL&&this.eT!=null)this.n2=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."))
-$.Y4=a}},
-gSZ:function(){return this.tQ()},
-mL:function(a){return a.P>=this.gOR().P},
-Y6:function(a,b,c,d){var z,y,x,w,v
-if(a.P>=this.gOR().P){z=this.gB8()
-y=new P.iP(Date.now(),!1)
-y.EK()
-x=$.xO
-$.xO=x+1
-w=new N.HV(a,b,z,y,x,c,d)
-if($.RL)for(v=this;v!=null;){v.cB(w)
-v=J.Lp(v)}else N.QM("").cB(w)}},
-X2:function(a,b,c){return this.Y6(C.D8,a,b,c)},
-kS:function(a){return this.X2(a,null,null)},
-dL:function(a,b,c){return this.Y6(C.eI,a,b,c)},
-Ny:function(a){return this.dL(a,null,null)},
-ZG:function(a,b,c){return this.Y6(C.IF,a,b,c)},
-To:function(a){return this.ZG(a,null,null)},
-xH:function(a,b,c){return this.Y6(C.nT,a,b,c)},
-j2:function(a){return this.xH(a,null,null)},
-WB:function(a,b,c){return this.Y6(C.Xm,a,b,c)},
-YX:function(a){return this.WB(a,null,null)},
-tQ:function(){if($.RL||this.eT==null){var z=this.Gs
-if(z==null){z=P.bK(null,null,!0,N.HV)
-this.Gs=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])}else return N.QM("").tQ()},
-cB:function(a){var z=this.Gs
-if(z!=null){if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)}},
-QL:function(a,b,c){var z=this.eT
-if(z!=null)J.Tr(z).u(0,this.oc,this)},
-$isRw:true,
-static:{"^":"Uj",QM:function(a){return $.Iu().to(a,new N.aO(a))}}},
-aO:{
-"^":"Tp:69;a",
-$0:function(){var z,y,x,w,v
-z=this.a
-if(C.xB.nC(z,"."))H.vh(P.u("name shouldn't start with a '.'"))
-y=C.xB.cn(z,".")
-if(y===-1)x=z!==""?N.QM(""):null
-else{x=N.QM(C.xB.Nj(z,0,y))
-z=C.xB.yn(z,y+1)}w=P.L5(null,null,null,P.qU,N.Rw)
-v=new N.Rw(z,x,null,w,H.VM(new Q.A2(w),[null,null]),null)
-v.QL(z,x,w)
-return v},
-$isEH:true},
-qV:{
-"^":"a;oc>,P>",
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isqV&&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},
-$isqV:true,
-static:{"^":"X9,tmj,Enk,LkO,tY,kH8,hlK,MHK,fM,lDu,uxc"}},
-HV:{
-"^":"a;OR<,G1>,iJ,Fl<,c0,kc>,I4<",
-bu:function(a){return"["+this.OR.oc+"] "+this.iJ+": "+this.G1},
-$isHV:true,
-static:{"^":"xO"}}}],["","main.dart",,F,{
-"^":"",
-E2:function(){var z,y
-N.QM("").sOR(C.IF)
-N.QM("").gSZ().yI(new F.e392())
-N.QM("").To("Starting Observatory")
-N.QM("").To("Loading Google Charts API")
-z=J.UQ($.Si(),"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.e393())},
-e392:{
-"^":"Tp:150;",
-$1:[function(a){var z
-if(J.xC(a.gOR(),C.nT)){z=J.RE(a)
-if(J.co(z.gG1(a),"Error evaluating expression"))z=J.x5(z.gG1(a),"Can't assign to null: ")===!0||J.x5(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.z2(a)))},"$1",null,2,0,null,149,"call"],
-$isEH:true},
-e393:{
-"^":"Tp:13;",
-$1:[function(a){N.QM("").To("Initializing Polymer")
-A.YK()},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["nav_bar_element","package:observatory/src/elements/nav_bar.dart",,A,{
-"^":"",
-md:{
-"^":"V33;i4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-giC:function(a){return a.i4},
-siC:function(a,b){a.i4=this.ct(a,C.Ys,a.i4,b)},
-static:{DCi:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.i4=!0
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.kD.ZL(a)
-C.kD.XI(a)
-return a}}},
-V33:{
-"^":"uL+Pi;",
-$isd3:true},
-Bm:{
-"^":"V34;KU,V4,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPj:function(a){return a.KU},
-sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU: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:{AJm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.IG.ZL(a)
-C.IG.XI(a)
-return a}}},
-V34:{
-"^":"uL+Pi;",
-$isd3:true},
-Ya:{
-"^":"V35;KU,V4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gPj:function(a){return a.KU},
-sPj:function(a,b){a.KU=this.ct(a,C.kV,a.KU,b)},
-gdU:function(a){return a.V4},
-sdU:function(a,b){a.V4=this.ct(a,C.cg,a.V4,b)},
-static:{vn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.KU="#"
-a.V4="---"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.nn.ZL(a)
-C.nn.XI(a)
-return a}}},
-V35:{
-"^":"uL+Pi;",
-$isd3:true},
-Ww:{
-"^":"V36;rU,SB,z2,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gFR:function(a){return a.rU},
-Ki:function(a){return this.gFR(a).$0()},
-LY:function(a,b){return this.gFR(a).$1(b)},
-sFR:function(a,b){a.rU=this.ct(a,C.AV,a.rU,b)},
-gjl:function(a){return a.SB},
-sjl:function(a,b){a.SB=this.ct(a,C.aP,a.SB,b)},
-gph:function(a){return a.z2},
-sph:function(a,b){a.z2=this.ct(a,C.hf,a.z2,b)},
-W1:[function(a,b,c,d){var z=a.SB
-if(z===!0)return
-a.SB=this.ct(a,C.aP,z,!0)
-if(a.rU!=null)this.LY(a,this.gWd(a))},"$3","gzY",6,0,102,1,94,95],
-ra:[function(a){a.SB=this.ct(a,C.aP,a.SB,!1)},"$0","gWd",0,0,18],
-static:{ZC:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.SB=!1
-a.z2="Refresh"
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.J7.ZL(a)
-C.J7.XI(a)
-return a}}},
-V36:{
-"^":"uL+Pi;",
-$isd3:true},
-ye:{
-"^":"uL;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{Fv:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.br.ZL(a)
-C.br.XI(a)
-return a}}},
-G1:{
-"^":"V37;Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-grZ:function(a){return a.Jo},
-srZ:function(a,b){a.Jo=this.ct(a,C.uk,a.Jo,b)},
-static:{J8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.OKl.ZL(a)
-C.OKl.XI(a)
-return a}}},
-V37:{
-"^":"uL+Pi;",
-$isd3:true},
-fl:{
-"^":"V38;Jo,iy,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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","gQ1",2,0,20,57],
-gu6:function(a){var z=a.iy
-if(z!=null)return J.Ds(z)
-else return""},
-su6:function(a,b){},
-static:{zf:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.RRl.ZL(a)
-C.RRl.XI(a)
-return a}}},
-V38:{
-"^":"uL+Pi;",
-$isd3:true},
-UK:{
-"^":"V39;VW,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-static:{IV:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.ct.ZL(a)
-C.ct.XI(a)
-return a}}},
-V39:{
-"^":"uL+Pi;",
-$isd3:true},
-wM:{
-"^":"V40;Au,Jo,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-static:{GO:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Jo=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HR.ZL(a)
-C.HR.XI(a)
-return a}}},
-V40:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_application_element","package:observatory/src/elements/observatory_application.dart",,V,{
-"^":"",
-F1:{
-"^":"V41;qC,MR,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gzj:function(a){return a.qC},
-szj:function(a,b){a.qC=this.ct(a,C.VK,a.qC,b)},
-Es:function(a){var z,y
-Z.uL.prototype.Es.call(this,a)
-if(a.qC===!0){z=H.VM([],[G.uG])
-y=new U.ho(P.L5(null,null,null,P.qU,P.oh),0,"unknown","unknown",0,!1,!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,!1,null,null,null,null,null)
-y.md()
-y.PI()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.E0(a)
-a.MR=y}else{z=H.VM([],[G.uG])
-y=new U.XK(null,"unknown","unknown",0,!1,!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,!1,null,null,null,null,null)
-y.md()
-y.eY()
-y=new G.mL(z,null,null,new G.OR("/vm",null,null,null,null,null),y,null,a,null,null,null)
-y.Ty(a)
-a.MR=y}},
-static:{JT8:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.qC=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.BH.ZL(a)
-C.BH.XI(a)
-return a}}},
-V41:{
-"^":"uL+Pi;",
-$isd3:true}}],["observatory_element","package:observatory/src/elements/observatory_element.dart",,Z,{
-"^":"",
-uL:{
-"^":"xc;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-Es:function(a){A.zs.prototype.Es.call(this,a)},
-wN:function(a,b,c,d){A.zs.prototype.wN.call(this,a,b,c,d)},
-dQ:function(a){A.zs.prototype.dQ.call(this,a)},
-aR:function(a){A.zs.prototype.aR.call(this,a)},
-cD:[function(a,b,c,d){$.W5.Bs(b,c,d)},"$3","gRh",6,0,151,2,94,95],
-XD:[function(a,b){$.W5.toString
-return"#"+H.d(b)},"$1","gn0",2,0,152,153],
-a7:[function(a,b){return G.mG(b)},"$1","gSs",2,0,154,155],
-Ze:[function(a,b){return G.As(b)},"$1","gbJ",2,0,15,16],
-uG:[function(a,b){return J.xC(b,"Null")},"$1","gHh",2,0,156,157],
-i5:[function(a,b){return J.xC(b,"Error")},"$1","gt3",2,0,156,157],
-OP:[function(a,b){var z=J.x(b)
-return z.n(b,"Smi")||z.n(b,"Mint")||z.n(b,"Bigint")},"$1","gSO",2,0,156,157],
-GA:[function(a,b){return J.xC(b,"Bool")},"$1","gr9",2,0,156,157],
-ff:[function(a,b){return J.xC(b,"String")},"$1","gu7",2,0,156,157],
-wm:[function(a,b){return J.xC(b,"Instance")},"$1","gNs",2,0,156,157],
-JG:[function(a,b){return J.xC(b,"Double")},"$1","gzx",2,0,156,157],
-Cp:[function(a,b){var z=J.x(b)
-return z.n(b,"GrowableObjectArray")||z.n(b,"Array")},"$1","gK4",2,0,156,157],
-tR:[function(a,b){return J.xC(b,"Type")},"$1","gqN",2,0,156,157],
-AC:[function(a,b){return!C.Nm.tg(["Null","Smi","Mint","Bigint","Bool","String","Double","Instance","GrowableObjectArray","Array","Type","Error"],b)},"$1","geS",2,0,156,157],
-static:{EE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Pfz.ZL(a)
-C.Pfz.XI(a)
-return a}}}}],["observe.src.bindable","package:observe/src/bindable.dart",,A,{
-"^":"",
-Ap:{
-"^":"a;",
-sP:function(a,b){},
-$isAp:true}}],["observe.src.change_notifier","package:observe/src/change_notifier.dart",,O,{
-"^":"",
-Pi:{
-"^":"a;",
-gqh:function(a){var z=a.AP
-if(z==null){z=this.gqw(a)
-z=P.bK(this.gym(a),z,!0,null)
-a.AP=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-k0:[function(a){},"$0","gqw",0,0,18],
-NB:[function(a){a.AP=null},"$0","gym",0,0,18],
-HC:[function(a){var z,y,x
-z=a.fn
-a.fn=null
-if(this.gnz(a)&&z!=null){y=a.AP
-x=H.VM(new P.Yp(z),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(x)
-return!0}return!1},"$0","gDx",0,0,111],
-gnz:function(a){var z,y
-z=a.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-ct:function(a,b,c,d){return F.Wi(a,b,c,d)},
-nq:function(a,b){if(!this.gnz(a))return
-if(a.fn==null){a.fn=[]
-P.rb(this.gDx(a))}a.fn.push(b)},
-$isd3:true}}],["observe.src.change_record","package:observe/src/change_record.dart",,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)+">"},
-$isqI:true}}],["observe.src.dirty_check","package:observe/src/dirty_check.dart",,O,{
-"^":"",
-N0:function(){var z,y,x,w,v,u,t,s,r,q
-if($.Td)return
-if($.Oo==null)return
-$.Td=!0
-z=0
-y=null
-do{++z
-if(z===1000)y=[]
-x=$.Oo
-w=[]
-w.$builtinTypeInfo=[F.d3]
-$.Oo=w
-for(w=y!=null,v=!1,u=0;u<x.length;++u){t=x[u]
-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()
-w.j2("Possible loop in Observable.dirtyCheck, stopped checking.")
-for(s=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);s.G();){r=s.lo
-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))+".")}}$.ax=$.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.u3(z),new O.bF(z),null,null,null,null,null,null)},
-YC:{
-"^":"Tp:158;a",
-$2:function(a,b){var z=this.a
-if(z.a)return
-z.a=!0
-a.RK(b,new O.c1(z))},
-$isEH:true},
-c1:{
-"^":"Tp:69;a",
-$0:[function(){this.a.a=!1
-O.N0()},"$0",null,0,0,null,"call"],
-$isEH:true},
-u3:{
-"^":"Tp:30;b",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.yJ(this.b,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
-$isEH:true},
-yJ:{
-"^":"Tp:69;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},
-bF:{
-"^":"Tp:159;UI",
-$4:[function(a,b,c,d){if(d==null)return d
-return new O.f6(this.UI,b,c,d)},"$4",null,8,0,null,27,28,29,31,"call"],
-$isEH:true},
-f6:{
-"^":"Tp:13;bK,Gq,Rm,w3",
-$1:[function(a){this.bK.$2(this.Gq,this.Rm)
-return this.w3.$1(a)},"$1",null,2,0,null,65,"call"],
-$isEH:true}}],["observe.src.list_diff","package:observe/src/list_diff.dart",,G,{
-"^":"",
-B5:function(a,b,c,d,e,f){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-z=f-e+1
-y=J.ew(J.bI(c,b),1)
-x=Array(z)
-for(w=x.length,v=0;v<z;++v){if(typeof y!=="number")return H.s(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)
-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)))
-o=x[v]
-n=x[r]
-m=t-1
-if(p){if(v>=w)return H.e(x,v)
-if(r>=w)return H.e(x,r)
-if(m>=n.length)return H.e(n,m)
-p=n[m]
-if(t>=o.length)return H.e(o,t)
-o[t]=p}else{if(r>=w)return H.e(x,r)
-if(t>=n.length)return H.e(n,t)
-p=n[t]
-if(typeof p!=="number")return p.g()
-if(v>=w)return H.e(x,v)
-n=o.length
-if(m>=n)return H.e(o,m)
-m=o[m]
-if(typeof m!=="number")return m.g()
-m=P.J(p+1,m+1)
-if(t>=n)return H.e(o,t)
-o[t]=m}}return x},
-kJ:function(a){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=a.length
-y=z-1
-if(0>=z)return H.e(a,0)
-x=a[0].length-1
-if(y<0)return H.e(a,y)
-w=a[y]
-if(x<0||x>=w.length)return H.e(w,x)
-v=w[x]
-u=[]
-while(!0){if(!(y>0||x>0))break
-c$0:{if(y===0){u.push(2);--x
-break c$0}if(x===0){u.push(3);--y
-break c$0}w=y-1
-if(w<0)return H.e(a,w)
-t=a[w]
-s=x-1
-r=t.length
-if(s<0||s>=r)return H.e(t,s)
-q=t[s]
-if(x<0||x>=r)return H.e(t,x)
-p=t[x]
-if(y<0)return H.e(a,y)
-t=a[y]
-if(s>=t.length)return H.e(t,s)
-o=t[s]
-n=P.J(P.J(p,o),q)
-if(n===q){if(q==null?v==null:q===v)u.push(0)
-else{u.push(1)
-v=q}x=s
-y=w}else if(n===p){u.push(3)
-v=p
-y=w}else{u.push(2)
-v=o
-x=s}}}return H.VM(new H.iK(u),[null]).br(0)},
-rN:function(a,b,c){var z,y,x
-for(z=J.U6(a),y=0;y<c;++y){x=z.t(a,y)
-if(y>=b.length)return H.e(b,y)
-if(!J.xC(x,b[y]))return y}return c},
-xU:function(a,b,c){var z,y,x,w,v
-z=J.U6(a)
-y=z.gB(a)
-x=b.length
-w=0
-while(!0){if(w<c){--y
-v=z.t(a,y);--x
-if(x<0||x>=b.length)return H.e(b,x)
-v=J.xC(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
-b=x.g(b,w)
-e+=w
-c=z.W(c,v)
-f-=v
-z=J.Wx(c)
-if(J.xC(z.W(c,b),0)&&f-e===0)return C.dn
-if(J.xC(b,c)){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,b,0)
-for(;e<f;e=s){z=t.em
-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)
-u=[]
-x=new P.Yp(u)
-x.$builtinTypeInfo=[null]
-return[new G.DA(a,x,u,b,z)]}r=G.kJ(G.B5(a,b,c,d,e,f))
-q=[]
-q.$builtinTypeInfo=[G.DA]
-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.ew(o,1);++p
-break
-case 1:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break
-case 2:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}t.Ld=J.ew(t.Ld,1)
-o=J.ew(o,1)
-break
-case 3:if(t==null){u=[]
-z=new P.Yp(u)
-z.$builtinTypeInfo=[null]
-t=new G.DA(a,z,u,o,0)}z=t.em
-if(p>>>0!==p||p>=d.length)return H.e(d,p)
-J.bi(z,d[p]);++p
-break}if(t!=null)q.push(t)
-return q},
-m1:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n
-z=J.RE(b)
-y=z.gWA(b)
-z=z.gvH(b)
-x=J.qA(b.gem())
-w=b.gNg()
-if(w==null)w=0
-v=new P.Yp(x)
-v.$builtinTypeInfo=[null]
-u=new G.DA(y,v,x,z,w)
-for(t=!1,s=0,r=0;z=a.length,r<z;++r){if(r<0)return H.e(a,r)
-q=a[r]
-q.Ft=J.ew(q.Ft,s)
-if(t)continue
-z=u.Ft
-y=J.ew(z,u.VD.G4.length)
-x=q.Ft
-p=P.J(y,J.ew(x,q.Ld))-P.y(z,x)
-if(p>=0){C.Nm.KI(a,r);--r
-z=J.bI(q.Ld,q.VD.G4.length)
-if(typeof z!=="number")return H.s(z)
-s-=z
-z=J.ew(u.Ld,J.bI(q.Ld,p))
-u.Ld=z
-y=u.VD.G4.length
-x=q.VD.G4.length
-if(J.xC(z,0)&&y+x-p===0)t=!0
-else{o=q.em
-if(J.u6(u.Ft,q.Ft)){z=u.VD
-z=z.Mu(z,0,J.bI(q.Ft,u.Ft))
-o.toString
-if(typeof o!=="object"||o===null||!!o.fixed$length)H.vh(P.f("insertAll"))
-H.IC(o,0,z)}if(J.z8(J.ew(u.Ft,u.VD.G4.length),J.ew(q.Ft,q.Ld))){z=u.VD
-J.bj(o,z.Mu(z,J.bI(J.ew(q.Ft,q.Ld),u.Ft),u.VD.G4.length))}u.em=o
-u.VD=q.VD
-if(J.u6(q.Ft,u.Ft))u.Ft=q.Ft
-t=!1}}else if(J.u6(u.Ft,q.Ft)){C.Nm.xe(a,r,u);++r
-n=J.bI(u.Ld,u.VD.G4.length)
-q.Ft=J.ew(q.Ft,n)
-if(typeof n!=="number")return H.s(n)
-s+=n
-t=!0}else t=!1}if(!t)a.push(u)},
-hs:function(a,b){var z,y
-z=H.VM([],[G.DA])
-for(y=H.VM(new H.a7(b,b.length,0,null),[H.Kp(b,0)]);y.G();)G.m1(z,y.lo)
-return z},
-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.Kp(y,0)]),x=a.ao;y.G();){w=y.lo
-if(J.xC(w.gNg(),1)&&w.gRt().G4.length===1){v=w.gRt().G4
-if(0>=v.length)return H.e(v,0)
-v=v[0]
-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)
-continue}v=J.RE(w)
-C.Nm.FV(z,G.jj(a,v.gvH(w),J.ew(v.gvH(w),w.gNg()),w.gem(),0,w.gRt().G4.length))}return z},
-DA:{
-"^":"a;WA>,VD,em<,Ft,Ld",
-gvH:function(a){return this.Ft},
-gRt:function(){return this.VD},
-gNg:function(){return this.Ld},
-XP:function(a){var z
-if(typeof a==="number"&&Math.floor(a)===a){z=this.Ft
-if(typeof z!=="number")return H.s(z)
-z=a<z}else z=!0
-if(z)return!1
-if(!J.xC(this.Ld,this.VD.G4.length))return!0
-return J.u6(a,J.ew(this.Ft,this.Ld))},
-bu:function(a){var z,y
-z="#<ListChangeRecord index: "+H.d(this.Ft)+", removed: "
-y=this.VD
-return z+y.bu(y)+", addedCount: "+H.d(this.Ld)+">"},
-$isDA:true,
-static:{K6:function(a,b,c,d){var z
-if(d==null)d=[]
-if(c==null)c=0
-z=new P.Yp(d)
-z.$builtinTypeInfo=[null]
-return new G.DA(a,z,d,b,c)}}}}],["observe.src.metadata","package:observe/src/metadata.dart",,K,{
-"^":"",
-nd:{
-"^":"a;"},
-vly:{
-"^":"a;"}}],["observe.src.observable","package:observe/src/observable.dart",,F,{
-"^":"",
-kM:[function(){return O.N0()},"$0","Jy",0,0,18],
-Wi:function(a,b,c,d){var z=J.RE(a)
-if(z.gnz(a)&&!J.xC(c,d))z.nq(a,H.VM(new T.qI(a,b,c,d),[null]))
-return d},
-d3:{
-"^":"a;R9:ro%,V2:dUC%,me:pt%",
-gqh:function(a){var z
-if(this.gR9(a)==null){z=this.glZ(a)
-this.sR9(a,P.bK(this.gkk(a),z,!0,null))}z=this.gR9(a)
-z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gnz:function(a){var z,y
-if(this.gR9(a)!=null){z=this.gR9(a)
-y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-W7Y:[function(a){var z,y,x,w
-z=$.Oo
-if(z==null){z=H.VM([],[F.d3])
-$.Oo=z}z.push(a)
-$.ax=$.ax+1
-y=P.L5(null,null,null,P.GD,P.a)
-for(z=this.gbx(a),z=$.mX().Me(0,z,new A.Wq(!0,!1,!0,C.FQ,!1,!1,C.Cd,null)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){x=J.O6(z.lo)
-w=$.cp().eA.t(0,x)
-if(w==null)H.vh(O.lA("getter \""+H.d(x)+"\" in "+this.bu(a)))
-y.u(0,x,w.$1(a))}this.sV2(a,y)},"$0","glZ",0,0,18],
-L5:[function(a){if(this.gV2(a)!=null)this.sV2(a,null)},"$0","gkk",0,0,18],
-HC:function(a){var z,y
-z={}
-if(this.gV2(a)==null||!this.gnz(a))return!1
-z.a=this.gme(a)
-this.sme(a,null)
-this.gV2(a).aN(0,new F.X6(z,a))
-if(z.a==null)return!1
-y=this.gR9(a)
-z=H.VM(new P.Yp(z.a),[T.yj])
-if(y.Gv>=4)H.vh(y.q7())
-y.Iv(z)
-return!0},
-nq:function(a,b){if(!this.gnz(a))return
-if(this.gme(a)==null)this.sme(a,[])
-this.gme(a).push(b)},
-$isd3:true},
-X6:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y,x,w,v
-z=this.b
-y=$.cp().jD(z,a)
-if(!J.xC(b,y)){x=this.a
-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.iv(z).u(0,a,y)}},
-$isEH:true}}],["observe.src.observable_box","package:observe/src/observable_box.dart",,A,{
-"^":"",
-Sk:{
-"^":"Pi;",
-gP:function(a){return this.DA},
-sP:function(a,b){this.DA=F.Wi(this,C.Ha,this.DA,b)},
-bu:function(a){return"#<"+new H.cu(H.dJ(this),null).bu(0)+" value: "+H.d(this.DA)+">"}}}],["observe.src.observable_list","package:observe/src/observable_list.dart",,Q,{
-"^":"",
-wn:{
-"^":"uFU;b3@,iT,ao,AP,fn",
-gQV:function(){var z=this.iT
-if(z==null){z=P.bK(new Q.cj(this),null,!0,null)
-this.iT=z}z.toString
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gB:function(a){return this.ao.length},
-sB:function(a,b){var z,y,x,w,v
-z=this.ao
-y=z.length
-if(y===b)return
-this.ct(this,C.Wn,y,b)
-x=y===0
-w=b===0
-this.ct(this,C.ai,x,w)
-this.ct(this,C.nZ,!x,!w)
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x)if(b<y){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))
-x=new H.bX(z,b,y)
-x.$builtinTypeInfo=[null]
-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))
-x=x.br(0)
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,0))}else{v=[]
-x=new P.Yp(v)
-x.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,x,v,y,b-y))}C.Nm.sB(z,b)},
-t:function(a,b){var z=this.ao
-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.ao
-if(b>>>0!==b||b>=z.length)return H.e(z,b)
-y=z[b]
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x){x=[y]
-w=new P.Yp(x)
-w.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,w,x,b,1))}if(b>=z.length)return H.e(z,b)
-z[b]=c},
-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)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.iT
-if(z!=null){x=z.iE
-z=x==null?z!=null:x!==z}else z=!1
-if(z&&y>0){z=this.ao
-H.xF(z,b,y)
-this.iH(G.K6(this,b,y,H.q9(z,b,y,null).br(0)))}H.vf(this.ao,b,c)},
-h:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-this.On(y,y+1)
-x=this.iT
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x)this.iH(G.K6(this,y,1,null))
-C.Nm.h(z,b)},
-FV:function(a,b){var z,y,x,w
-z=this.ao
-y=z.length
-C.Nm.FV(z,b)
-this.On(y,z.length)
-x=z.length-y
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-if(z&&x>0)this.iH(G.K6(this,y,x,null))},
-UZ:function(a,b,c){var z,y,x,w,v,u,t
-z=b>=0
-if(!z||b>this.ao.length)H.vh(P.TE(b,0,this.gB(this)))
-y=c>=b
-if(!y||c>this.ao.length)H.vh(P.TE(c,b,this.gB(this)))
-x=c-b
-w=this.ao
-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.iT
-if(u!=null){t=u.iE
-u=t==null?u!=null:t!==u}else u=!1
-if(u&&x>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=[null]
-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.Yp(z)
-y.$builtinTypeInfo=[null]
-this.iH(new G.DA(this,y,z,b,0))}C.Nm.UZ(w,b,c)},
-UG:function(a,b,c){var z,y,x,w
-if(b<0||b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=J.x(c)
-if(!z.$isWO&&!0)c=z.br(c)
-y=J.q8(c)
-z=this.ao
-x=z.length
-C.Nm.sB(z,x+y)
-w=z.length
-H.qG(z,b+y,w,this,b)
-H.vf(z,b,c)
-this.On(x,z.length)
-z=this.iT
-if(z!=null){w=z.iE
-z=w==null?z!=null:w!==z}else z=!1
-if(z&&y>0)this.iH(G.K6(this,b,y,null))},
-xe:function(a,b,c){var z,y,x
-if(b>this.ao.length)throw H.b(P.TE(b,0,this.gB(this)))
-z=this.ao
-y=z.length
-if(b===y){this.h(0,c)
-return}C.Nm.sB(z,y+1)
-y=z.length
-H.qG(z,b+1,y,this,b)
-y=z.length
-this.On(y-1,y)
-y=this.iT
-if(y!=null){x=y.iE
-y=x==null?y!=null:x!==y}else y=!1
-if(y)this.iH(G.K6(this,b,1,null))
-if(b>=z.length)return H.e(z,b)
-z[b]=c},
-iH:function(a){var z,y
-z=this.iT
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z)return
-if(this.b3==null){this.b3=[]
-P.rb(this.gL6())}this.b3.push(a)},
-On:function(a,b){var z,y
-this.ct(this,C.Wn,a,b)
-z=a===0
-y=b===0
-this.ct(this,C.ai,z,y)
-this.ct(this,C.nZ,!z,!y)},
-Lu:[function(){var z,y,x
-z=this.b3
-if(z==null)return!1
-y=G.Qi(this,z)
-this.b3=null
-z=this.iT
-if(z!=null){x=z.iE
-x=x==null?z!=null:x!==z}else x=!1
-if(x&&y.length!==0){x=H.VM(new P.Yp(y),[G.DA])
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(x)
-return!0}return!1},"$0","gL6",0,0,111],
-$iswn:true,
-static:{ch:function(a,b){var z=H.VM([],[b])
-return H.VM(new Q.wn(null,null,z,null,null),[b])},Y5:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l
-if(a===b)throw H.b(P.u("can't use same list for previous and current"))
-for(z=J.mY(c),y=J.w1(b);z.G();){x=z.gl()
-w=J.RE(x)
-v=J.ew(w.gvH(x),x.gNg())
-u=J.ew(w.gvH(x),x.gRt().G4.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
-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)
-H.qG(a,n,l,a,u)
-H.qG(a,w,n,t,0)}}}}},
-uFU:{
-"^":"ark+Pi;",
-$isd3:true},
-cj:{
-"^":"Tp:69;a",
-$0:function(){this.a.iT=null},
-$isEH:true}}],["observe.src.observable_map","package:observe/src/observable_map.dart",,V,{
-"^":"",
-ya:{
-"^":"yj;G3>,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.G3)+" from: "+H.d(this.jL)+" to: "+H.d(this.zZ)+">"},
-$isya:true},
-qC:{
-"^":"Pi;Zp,AP,fn",
-gvc:function(){return this.Zp.gvc()},
-gUQ:function(a){var z=this.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Zp
-return z.gB(z)},
-gl0:function(a){var z=this.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Zp
-return z.gB(z)!==0},
-t:function(a,b){return this.Zp.t(0,b)},
-u:function(a,b,c){var z,y,x,w
-z=this.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-if(!z){this.Zp.u(0,b,c)
-return}z=this.Zp
-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.G8()}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.Uq,null,null),[null]))}},
-FV:function(a,b){J.Me(b,new V.zT(this))},
-V1:function(a){var z,y,x,w
-z=this.Zp
-y=z.gB(z)
-x=this.AP
-if(x!=null){w=x.iE
-x=w==null?x!=null:w!==x}else x=!1
-if(x&&y>0){z.aN(0,new V.Lo(this))
-F.Wi(this,C.Wn,y,0)
-this.G8()}z.V1(0)},
-aN:function(a,b){return this.Zp.aN(0,b)},
-bu:function(a){return P.vW(this)},
-G8:function(){this.nq(this,H.VM(new T.qI(this,C.SV,null,null),[null]))
-this.nq(this,H.VM(new T.qI(this,C.Uq,null,null),[null]))},
-$isqC:true,
-$isZ0:true,
-static:{AB:function(a,b,c){var z
-if(!!a.$isBa)z=H.VM(new V.qC(P.GV(null,null,b,c),null,null),[b,c])
-else z=!!a.$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])
-return z}}},
-zT:{
-"^":"Tp;a",
-$2:[function(a,b){this.a.u(0,a,b)},"$2",null,4,0,null,75,21,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a,b){return{func:"vPt",args:[a,b]}},this.a,"qC")}},
-Lo:{
-"^":"Tp:77;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}}],["observe.src.observer_transform","package:observe/src/observer_transform.dart",,Y,{
-"^":"",
-Qw:{
-"^":"Ap;TA,xy,i7,at,Cg",
-e5:function(a){return this.xy.$1(a)},
-nM:function(a){return this.at.$1(a)},
-TR:function(a,b){var z
-this.at=b
-z=this.e5(J.mu(this.TA,this.gqy()))
-this.Cg=z
-return z},
-cf:[function(a){var z=this.e5(a)
-if(J.xC(z,this.Cg))return
-this.Cg=z
-return this.nM(z)},"$1","gqy",2,0,13,58],
-S6:function(a){var z=this.TA
-if(z!=null)J.x0(z)
-this.TA=null
-this.xy=null
-this.i7=null
-this.at=null
-this.Cg=null},
-gP:function(a){var z=this.e5(J.Vm(this.TA))
-this.Cg=z
-return z},
-sP:function(a,b){J.ta(this.TA,b)}}}],["observe.src.path_observer","package:observe/src/path_observer.dart",,L,{
-"^":"",
-Hj: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 if(!!J.x(b).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-if(!y){z=a
-y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z)return J.UQ(a,$.b7().ep.t(0,b))
-try{z=a
-y=b
-x=$.cp().eA.t(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.Lm(a)
-v=$.mX().F1(z,C.OV)
-if(!(v!=null&&v.fY===C.WH&&!v.Fo))throw w}else throw w}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't get "+H.d(b)+" in "+H.d(a))
-return},
-iu: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).$isGD){z=a
-y=H.RB(z,"$isab",[P.qU,null],"$asab")
-if(!y){z=a
-y=H.RB(z,"$isZ0",[P.qU,null],"$asZ0")
-z=y&&!C.Nm.tg(C.Zw,b)}else z=!0
-if(z){J.kW(a,$.b7().ep.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.Lm(a)
-if(!$.mX().UK(z,C.OV))throw x}else throw x}}z=$.YV()
-if(z.mL(C.D8))z.kS("can't set "+H.d(b)+" in "+H.d(a))
-return!1},
-cB:function(a){a=J.rr(a)
-if(a==="")return!0
-if(0>=a.length)return H.e(a,0)
-if(a[0]===".")return!1
-return $.uC().zD(a)},
-WR:{
-"^":"qK;HS,XF,xE,cX,GX,vA,Wf",
-gqc:function(){return this.HS==null},
-sP:function(a,b){var z=this.HS
-if(z!=null)z.rL(this.XF,b)},
-gIn:function(){return 2},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){this.xE=L.SE(this,this.XF)
-this.hQ(!0)},
-kH:function(){this.Wf=null
-this.HS=null
-this.XF=null},
-nf:function(a){this.HS.VV(this.XF,a)},
-hQ:function(a){var z,y
-z=this.Wf
-y=this.HS.Tl(this.XF)
-this.Wf=y
-if(a||J.xC(y,z))return!1
-this.zc(this.Wf,z)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-Tv:{
-"^":"a;OK",
-gB:function(a){return this.OK.length},
-gl0:function(a){return this.OK.length===0},
-gPu:function(){return!0},
-bu:function(a){if(!this.gPu())return"<invalid path>"
-return H.VM(new H.A8(this.OK,new L.f7()),[null,null]).zV(0,".")},
-n:function(a,b){var z,y,x,w,v
-if(b==null)return!1
-if(this===b)return!0
-if(!J.x(b).$isTv)return!1
-if(this.gPu()!==b.gPu())return!1
-z=this.OK
-y=z.length
-x=b.OK
-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},
-giO:function(a){var z,y,x,w,v
-for(z=this.OK,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)
-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)},
-Tl:function(a){var z,y
-if(!this.gPu())return
-for(z=this.OK,z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(a==null)return
-a=L.Hj(a,y)}return a},
-rL:function(a,b){var z,y,x
-z=this.OK
-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.Hj(a,z[x])}if(y>=z.length)return H.e(z,y)
-return L.iu(a,z[y],b)},
-VV:function(a,b){var z,y,x,w
-if(!this.gPu()||this.OK.length===0)return
-z=this.OK
-y=z.length-1
-for(x=0;a!=null;x=w){b.$1(a)
-if(x>=y)break
-w=x+1
-if(x>=z.length)return H.e(z,x)
-a=L.Hj(a,z[x])}},
-$isTv:true,
-static:{hk:function(a){var z,y,x,w,v,u,t,s
-if(!!J.x(a).$isWO){z=P.F(a,!1,null)
-y=new H.a7(z,z.length,0,null)
-y.$builtinTypeInfo=[H.Kp(z,0)]
-for(;y.G();){x=y.lo
-if((typeof x!=="number"||Math.floor(x)!==x)&&!J.x(x).$isGD)throw H.b(P.u("List must contain only ints and Symbols"))}return new L.Tv(z)}if(a==null)a=""
-w=$.aB().t(0,a)
-if(w!=null)return w
-if(!L.cB(a))return $.V6()
-v=[]
-y=J.rr(a).split(".")
-u=new H.a7(y,y.length,0,null)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-for(;u.G();){x=u.lo
-if(J.xC(x,""))continue
-t=H.BU(x,10,new L.oq())
-v.push(t!=null?t:$.b7().Nz.t(0,x))}w=new L.Tv(C.Nm.tt(v,!1))
-y=$.aB()
-if(y.X5>=100){y.toString
-u=new P.i5(y)
-u.$builtinTypeInfo=[H.Kp(y,0)]
-s=u.gA(u)
-if(!s.G())H.vh(H.DU())
-y.Rz(0,s.gl())}y.u(0,a,w)
-return w}}},
-oq:{
-"^":"Tp:13;",
-$1:function(a){return},
-$isEH:true},
-f7:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isGD?$.b7().ep.t(0,a):a},"$1",null,2,0,null,143,"call"],
-$isEH:true},
-vH:{
-"^":"Tv;OK",
-gPu:function(){return!1},
-static:{"^":"qr"}},
-YJG:{
-"^":"Tp:69;",
-$0:function(){return new H.VR("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",H.ol("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$",!1,!0,!1),null,null)},
-$isEH:true},
-ww:{
-"^":"qK;xE,cb,cX,GX,vA,Wf",
-gqc:function(){return this.cb==null},
-gIn:function(){return 3},
-TR:function(a,b){return L.qK.prototype.TR.call(this,this,b)},
-NJ:function(){var z,y,x,w
-this.hQ(!0)
-for(z=this.cb,y=z.length,x=0;x<y;x+=2){w=z[x]
-if(w!==C.dV){z=$.xG
-if(z!=null){y=z.IU
-y=y==null?w!=null:y!==w}else y=!0
-if(y){z=new L.zG(w,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.yj.u(0,this.cX,this)
-this.nf(z.gTT(z))
-this.xE=null
-break}}},
-kH:function(){var z,y,x,w
-this.Wf=null
-for(z=0;y=this.cb,x=y.length,z<x;z+=2)if(y[z]===C.dV){w=z+1
-if(w>=x)return H.e(y,w)
-J.x0(y[w])}this.cb=null},
-yN:function(a,b){var z
-if(this.GX!=null||this.cb==null)throw H.b(P.w("Cannot add paths once started."))
-if(!J.x(b).$isTv)b=L.hk(b)
-z=this.cb
-z.push(a)
-z.push(b)},
-ti:function(a){return this.yN(a,null)},
-nf:function(a){var z,y,x,w,v
-for(z=0;y=this.cb,x=y.length,z<x;z+=2){w=y[z]
-if(w!==C.dV){v=z+1
-if(v>=x)return H.e(y,v)
-H.Go(y[v],"$isTv").VV(w,a)}}},
-hQ:function(a){var z,y,x,w,v,u,t,s,r
-J.wg(this.Wf,C.jn.cU(this.cb.length,2))
-for(z=!1,y=null,x=0;w=this.cb,v=w.length,x<v;x+=2){u=x+1
-if(u>=v)return H.e(w,u)
-t=w[u]
-s=w[x]
-if(s===C.dV){H.Go(t,"$isAp")
-r=t.gP(t)}else r=H.Go(t,"$isTv").Tl(s)
-if(a){J.kW(this.Wf,C.jn.cU(x,2),r)
-continue}w=this.Wf
-v=C.jn.cU(x,2)
-if(J.xC(r,J.UQ(w,v)))continue
-w=this.vA
-if(typeof w!=="number")return w.F()
-if(w>=2){if(y==null)y=P.L5(null,null,null,null,null)
-y.u(0,v,J.UQ(this.Wf,v))}J.kW(this.Wf,v,r)
-z=!0}if(!z)return!1
-this.Aw(this.Wf,y,w)
-return!0},
-tF:function(){return this.hQ(!1)},
-$isAp:true},
-iNc:{
-"^":"a;"},
-qK:{
-"^":"Ap;cX<",
-CC:function(){return this.GX.$0()},
-K0:function(a){return this.GX.$1(a)},
-cF:function(a,b){return this.GX.$2(a,b)},
-Mm:function(a,b,c){return this.GX.$3(a,b,c)},
-ga8:function(){return this.GX!=null},
-TR:function(a,b){if(this.GX!=null||this.gqc())throw H.b(P.w("Observer has already been opened."))
-if(X.OS(b)>this.gIn())throw H.b(P.u("callback should take "+this.gIn()+" or fewer arguments"))
-this.GX=b
-this.vA=P.J(this.gIn(),X.RI(b))
-this.NJ()
-return this.Wf},
-gP:function(a){this.hQ(!0)
-return this.Wf},
-S6:function(a){if(this.GX==null)return
-this.kH()
-this.Wf=null
-this.GX=null},
-xV:[function(a){if(this.GX!=null)this.SG()},"$1","gjM",2,0,20,14],
-SG:function(){var z=0
-while(!0){if(!(z<1000&&this.tF()))break;++z}return z>0},
-Aw:function(a,b,c){var z,y,x,w
-try{switch(this.vA){case 0:this.CC()
-break
-case 1:this.K0(a)
-break
-case 2:this.cF(a,b)
-break
-case 3:this.Mm(a,b,c)
-break}}catch(x){w=H.Ru(x)
-z=w
-y=new H.XO(x,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0(z,y)}},
-zc:function(a,b){return this.Aw(a,b,null)}},
-zG:{
-"^":"a;IU,yj,rS,HN,op",
-TR:function(a,b){this.yj.u(0,b.gcX(),b)
-b.nf(this.gTT(this))},
-we:[function(a,b){var z=J.x(b)
-if(!!z.$iswn)this.wq(b.gQV())
-if(!!z.$isd3)this.wq(z.gqh(b))},"$1","gTT",2,0,160,82],
-wq:function(a){var z,y
-if(this.rS==null)this.rS=P.YM(null,null,null,null,null)
-z=this.HN
-y=z!=null?z.Rz(0,a):null
-if(y!=null)this.rS.u(0,a,y)
-else if(!this.rS.x4(a))this.rS.u(0,a,a.yI(this.gCP()))},
-CH:[function(a){var z,y,x,w,v
-if(!this.op)return
-z=this.HN
-if(z==null)z=P.YM(null,null,null,null,null)
-this.HN=this.rS
-this.rS=z
-for(y=this.yj,y=H.VM(new P.ro(y),[H.Kp(y,0),H.Kp(y,1)]),x=y.Fb,w=H.Kp(y,1),y=H.VM(new P.ZM(x,H.VM([],[P.oz]),x.qT,x.bb,null),[H.Kp(y,0),w]),y.Qf(x,w);y.G();){v=y.gl()
-if(v.ga8())v.nf(this.gTT(this))}for(y=this.HN,y=y.gUQ(y),y=H.VM(new H.MH(null,J.mY(y.l6),y.T6),[H.Kp(y,0),H.Kp(y,1)]);y.G();)y.lo.ed()
-this.HN=null},"$0","gTh",0,0,18],
-t9:[function(a){var z,y
-for(z=this.yj,z=H.VM(new P.ro(z),[H.Kp(z,0),H.Kp(z,1)]),z=P.F(z,!1,H.ip(z,"mW",0)),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(y.ga8())y.tF()}this.op=!0
-P.rb(this.gTh(this))},"$1","gCP",2,0,20,161],
-static:{"^":"xG",SE:function(a,b){var z,y
-z=$.xG
-if(z!=null){y=z.IU
-y=y==null?b!=null:y!==b}else y=!0
-if(y){z=new L.zG(b,P.GV(null,null,null,null),null,null,!1)
-$.xG=z}z.yj.u(0,a.cX,a)
-a.nf(z.gTT(z))}}}}],["observe.src.to_observable","package:observe/src/to_observable.dart",,R,{
-"^":"",
-tB:[function(a){var z,y,x
-z=J.x(a)
-if(!!z.$isd3)return a
-if(!!z.$isZ0){y=V.AB(a,null,null)
-z.aN(a,new R.Qe(y))
-return y}if(!!z.$isQV){z=z.ez(a,R.Ft())
-x=Q.ch(null,null)
-x.FV(0,z)
-return x}return a},"$1","Ft",2,0,13,21],
-Qe:{
-"^":"Tp:77;a",
-$2:[function(a,b){this.a.u(0,R.tB(a),R.tB(b))},"$2",null,4,0,null,121,64,"call"],
-$isEH:true}}],["polymer","package:polymer/polymer.dart",,A,{
-"^":"",
-YG:function(a,b,c){if(a==null||$.AM()==null)return
-$.AM().V7("shimStyling",[a,b,c])},
-q3: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).MW.getAttribute("href")
-try{w=new XMLHttpRequest()
-C.W3.kP(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.XO(v,null)
-$.Es().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=$.b7().ep.t(0,a)
-if(z==null)return!1
-y=J.rY(z)
-return y.Tc(z,"Changed")&&!y.n(z,"attributeChanged")},"$1","F4",2,0,62,63],
-Ad:function(a,b){$.Ej().u(0,a,b)
-H.Go(J.UQ($.Si(),"Polymer"),"$isr7").PO([a])},
-h6:function(a,b){var z,y,x,w
-if(a==null)return
-document
-if($.op()===!0)b=document.head
-z=document.createElement("style",null)
-J.t3(z,J.dY(a))
-y=a.getAttribute("element")
-if(y!=null)z.setAttribute("element",y)
-x=b.firstChild
-if(b===document.head){w=W.vD(document.head.querySelectorAll("style[element]"),null)
-if(w.gor(w))x=J.QP(C.t5.grZ(w.Sn))}b.insertBefore(z,x)},
-YK:function(){if($.UG){A.X1($.M6,!0)
-return $.X3}var z=$.X3.qp(O.Ht())
-z.Gr(new A.mS())
-return z},
-X1:function(a,b){var z,y
-if($.AC)throw H.b("Initialization was already done.")
-$.AC=!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("d-auto-binding",C.Jm)
-z=document.createElement("polymer-element",null)
-z.setAttribute("name","d-auto-binding")
-z.setAttribute("extends","template")
-J.UQ($.XX(),"init").qP([],z)
-for(y=H.VM(new H.a7(a,74,0,null),[H.Kp(a,0)]);y.G();)y.lo.$0()},
-JP:function(){var z,y,x,w
-z=$.Si()
-if(J.UQ(z,"Platform")==null)throw H.b(P.w("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."))
-y=J.UQ(z,"Polymer")
-if(y==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."))
-x=$.X3
-y.V7("whenPolymerReady",[x.ce(new A.hp())])
-w=J.UQ($.XX(),"register")
-if(w==null)throw H.b(P.w("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."))
-J.kW($.XX(),"register",P.mt(new A.k2(x,w)))},
-XP:{
-"^":"a;FL>,t5>,P1<,oc>,Q7<,NF<,cK>,kK<,Bj<,Qk,lD,Uj>,PS<,Ve,t4",
-gZf:function(){var z,y
-z=J.Eh(this.FL,"template")
-if(z!=null)y=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-else y=null
-return y},
-Ba:function(a){var z,y,x
-for(z=null,y=this;y!=null;){z=J.Vs(J.nq(y)).MW.getAttribute("extends")
-y=y.gP1()}x=document
-W.Ct(window,x,a,this.t5,z)},
-Cw:function(a){var z=$.Kc()
-if(z==null)return
-J.UQ(z,"urlResolver").V7("resolveDom",[a])},
-Zw:function(a){var z,y,x,w,v,u,t,s,r
-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.gBj()!=null){z=a.gBj()
-y=P.Ls(null,null,null,null)
-y.FV(0,z)
-this.Bj=y}}z=this.t5
-this.pI(z)
-x=J.Vs(this.FL).MW.getAttribute("attributes")
-if(x!=null)for(y=C.xB.Fr(x,$.aQ()),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]),w=this.oc;y.G();){v=J.rr(y.lo)
-if(v==="")continue
-u=$.b7().Nz.t(0,v)
-t=L.hk([u])
-s=this.Q7
-if(s!=null&&s.x4(t))continue
-r=$.mX().CV(z,u)
-if(r==null||r.fY===C.WH||r.V5){window
-s="property for attribute "+v+" of polymer-element name="+H.d(w)+" not found."
-if(typeof console!="undefined")console.warn(s)
-continue}s=this.Q7
-if(s==null){s=P.Fl(null,null)
-this.Q7=s}s.u(0,t,r)}},
-pI:function(a){var z,y,x,w
-for(z=$.mX().Me(0,a,C.aj),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-x=J.RE(y)
-if(x.gV5(y)===!0)continue
-w=this.Q7
-if(w==null){w=P.Fl(null,null)
-this.Q7=w}w.u(0,L.hk([x.goc(y)]),y)
-w=new H.U5(y.gDv(),new A.Zd())
-w.$builtinTypeInfo=[null]
-if(w.Vr(0,new A.Da())){w=this.Bj
-if(w==null){w=P.Ls(null,null,null,null)
-this.Bj=w}x=x.goc(y)
-w.h(0,$.b7().ep.t(0,x))}}},
-Vk:function(){var z,y
-z=P.L5(null,null,null,P.qU,P.a)
-this.kK=z
-y=this.P1
-if(y!=null)z.FV(0,y.gkK())
-J.Vs(this.FL).aN(0,new A.eY(this))},
-W3:function(a){J.Vs(this.FL).aN(0,new A.BO(a))},
-Mi:function(){var z=this.Bg("link[rel=stylesheet]")
-this.Qk=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-f6:function(){var z=this.Bg("style[polymer-scope]")
-this.lD=z
-for(z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.Mp(z.lo)},
-m1:function(){var z,y,x,w,v,u,t,s
-z=this.Qk
-z.toString
-y=H.VM(new H.U5(z,new A.ZG()),[null])
-x=this.gZf()
-if(x!=null){w=P.p9("")
-for(z=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),v=z.OI;z.G();){u=A.q3(v.gl())
-t=w.vM+=typeof u==="string"?u:H.d(u)
-w.vM=t+"\n"}if(w.vM.length>0){s=J.Do(this.FL).createElement("style",null)
-J.t3(s,H.d(w))
-z=J.RE(x)
-z.mK(x,s,z.gPZ(x))}}},
-oP:function(a,b){var z,y,x
-z=J.MK(this.FL,a)
-y=z.br(z)
-x=this.gZf()
-if(x!=null)C.Nm.FV(y,J.MK(x,a))
-return y},
-Bg:function(a){return this.oP(a,null)},
-kO:function(a){var z,y,x,w,v,u
-z=P.p9("")
-y=new A.ua("[polymer-scope="+a+"]")
-for(x=this.Qk,x.toString,x=H.VM(new H.U5(x,y),[null]),x=H.VM(new H.Mo(J.mY(x.l6),x.T6),[H.Kp(x,0)]),w=x.OI;x.G();){v=A.q3(w.gl())
-u=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=u+"\n\n"}for(x=this.lD,x.toString,y=H.VM(new H.U5(x,y),[null]),y=H.VM(new H.Mo(J.mY(y.l6),y.T6),[H.Kp(y,0)]),x=y.OI;y.G();){v=J.dY(x.gl())
-w=z.vM+=typeof v==="string"?v:H.d(v)
-z.vM=w+"\n\n"}return z.vM},
-J3:function(a,b){var z
-if(a==="")return
-z=document.createElement("style",null)
-J.t3(z,a)
-z.setAttribute("element",H.d(this.oc)+"-"+b)
-return z},
-rH:function(){var z,y,x,w,v
-for(z=$.HN(),z=$.mX().Me(0,this.t5,z),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo
-if(this.cK==null)this.cK=P.YM(null,null,null,null,null)
-x=J.RE(y)
-w=x.goc(y)
-v=$.b7().ep.t(0,w)
-w=J.U6(v)
-v=w.Nj(v,0,J.bI(w.gB(v),7))
-this.cK.u(0,L.hk(v),[x.goc(y)])}},
-I9:function(){var z,y,x
-for(z=$.mX().Me(0,this.t5,C.Xk),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();){y=z.lo.gDv()
-x=new H.a7(y,y.length,0,null)
-x.$builtinTypeInfo=[H.Kp(y,0)]
-for(;x.G();)continue}},
-Yl:function(a){var z=P.L5(null,null,null,P.qU,null)
-a.aN(0,new A.Tj(z))
-return z},
-$isXP:true,
-static:{"^":"Kb"}},
-Zd:{
-"^":"Tp:13;",
-$1:function(a){return!!J.x(a).$ishG},
-$isEH:true},
-Da:{
-"^":"Tp:13;",
-$1:function(a){return a.gvn()},
-$isEH:true},
-eY:{
-"^":"Tp:77;a",
-$2:function(a,b){if(C.n7.x4(a)!==!0&&!J.co(a,"on-"))this.a.kK.u(0,a,b)},
-$isEH:true},
-BO:{
-"^":"Tp:77;a",
-$2:function(a,b){var z,y,x
-z=J.rY(a)
-if(z.nC(a,"on-")){y=J.U6(b).u8(b,"{{")
-x=C.xB.cn(b,"}}")
-if(y>=0&&x>=0)this.a.u(0,z.yn(a,3),C.xB.bS(C.xB.Nj(b,y+2,x)))}},
-$isEH:true},
-ZG:{
-"^":"Tp:13;",
-$1:function(a){return J.Vs(a).MW.hasAttribute("polymer-scope")!==!0},
-$isEH:true},
-ua:{
-"^":"Tp:13;a",
-$1:function(a){return J.RF(a,this.a)},
-$isEH:true},
-ix:{
-"^":"Tp:69;",
-$0:function(){return[]},
-$isEH:true},
-Tj:{
-"^":"Tp:162;a",
-$2:function(a,b){this.a.u(0,H.d(a).toLowerCase(),b)},
-$isEH:true},
-Li:{
-"^":"BG9;Mn,cJ",
-US:function(a,b,c){if(J.co(b,"on-"))return this.CZ(a,b,c)
-return this.Mn.US(a,b,c)}},
-BG9:{
-"^":"vE+vA;"},
-vA:{
-"^":"a;",
-XB:function(a){var z
-for(;z=J.RE(a),z.gBy(a)!=null;){if(!!z.$iszs&&J.UQ(a.SD,"eventController")!=null)return J.UQ(z.gXG(a),"eventController")
-a=z.gBy(a)}return!!z.$isI0?a.host:null},
-Y2:function(a,b,c){var z={}
-z.a=a
-return new A.l5(z,this,b,c)},
-CZ:function(a,b,c){var z,y,x,w
-z={}
-y=J.rY(b)
-if(!y.nC(b,"on-"))return
-x=y.yn(b,3)
-z.a=x
-w=C.fE.t(0,x)
-z.a=w!=null?w:z.a
-return new A.li(z,this,a)}},
-l5:{
-"^":"Tp:13;a,b,c,d",
-$1:[function(a){var z,y,x,w
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.XB(this.c)
-z.a=x
-y=x}if(!!J.x(y).$iszs){y=J.x(a)
-if(!!y.$iseC){w=y.gey(a)
-if(w==null)w=J.UQ(P.Cq(a),"detail")}else w=null
-y=y.gCa(a)
-z=z.a
-J.Pj(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,1,"call"],
-$isEH:true},
-li:{
-"^":"Tp:166;a,b,c",
-$3:[function(a,b,c){var z,y,x,w
-z=this.c
-y=this.b.Y2(null,b,z)
-x=J.Ei(b).t(0,this.a.a)
-w=H.VM(new W.Ov(0,x.DK,x.Ph,W.aF(y),x.Sg),[H.Kp(x,0)])
-w.Zz()
-if(c===!0)return
-return new A.d6(w,z)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-d6:{
-"^":"Ap;Jq,ED",
-gP:function(a){return"{{ "+this.ED+" }}"},
-TR:function(a,b){return"{{ "+this.ED+" }}"},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}}},
-hG:{
-"^":"nd;vn<",
-$ishG:true},
-xc:{
-"^":"Ao;AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-XI:function(a){this.Pa(a)},
-static:{G7:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ki.ZL(a)
-C.Ki.XI(a)
-return a}}},
-jpR:{
-"^":"Bo+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-Ao:{
-"^":"jpR+Pi;",
-$isd3:true},
-zs:{
-"^":"a;XG:SD=",
-gFL:function(a){return a.IX},
-gUj:function(a){return},
-gRT:function(a){var z,y
-z=a.IX
-if(z!=null)return J.O6(z)
-y=this.gQg(a).MW.getAttribute("is")
-return y==null||y===""?this.gqn(a):y},
-Pa:function(a){var z,y
-z=this.gCn(a)
-if(z!=null&&z.k8!=null){window
-y="Attributes on "+H.d(this.gRT(a))+" were data bound prior to Polymer upgrading the element. This may result in incorrect binding types."
-if(typeof console!="undefined")console.warn(y)}this.es(a)
-y=this.gM0(a)
-if(!J.xC($.AA().t(0,y),!0)||$.op()===!0)this.rf(a)},
-es:function(a){var z,y
-if(a.IX!=null){window
-z="Element already prepared: "+H.d(this.gRT(a))
-if(typeof console!="undefined")console.warn(z)
-return}a.SD=P.Cq(a)
-z=this.gRT(a)
-a.IX=$.RA().t(0,z)
-this.nt(a)
-z=a.Wz
-if(z!=null){y=this.gnu(a)
-z.toString
-L.qK.prototype.TR.call(J.x(z),z,y)}if(a.IX.gQ7()!=null)this.gqh(a).yI(this.gqY(a))
-this.oR(a)
-this.fk(a)
-this.Uc(a)},
-rf:function(a){if(a.q1)return
-a.q1=!0
-this.Oh(a,a.IX)
-this.gQg(a).Rz(0,"unresolved")
-this.aR(a)},
-aR:function(a){},
-Es:function(a){if(a.IX==null)throw H.b(P.w("polymerCreated was not called for custom element "+H.d(this.gRT(a))+", this should normally be done in the .created() if Polymer is used as a mixin."))
-this.oW(a)
-if(!a.XN){a.XN=!0
-this.rW(a,new A.bl(a))}},
-dQ:function(a){this.x3(a)},
-Oh:function(a,b){if(b!=null){this.Oh(a,b.gP1())
-this.aI(a,J.nq(b))}},
-aI:function(a,b){var z,y,x,w
-z=J.RE(b)
-y=z.Wk(b,"template")
-if(y!=null){x=this.Tp(a,y)
-w=z.gQg(b).MW.getAttribute("name")
-if(w==null)return
-a.Xy.u(0,w,x)}},
-Tp:function(a,b){var z,y,x,w,v,u
-if(b==null)return
-z=this.er(a)
-y=this.gUj(a)
-x=!!J.x(b).$isvy?b:M.Ky(b)
-w=J.MO(x,a,y==null&&J.Xp(x)==null?J.xq(a.IX):y)
-v=$.It().t(0,w)
-u=v!=null?v.gu2():v
-a.Sa.push(u)
-z.appendChild(w)
-this.Ec(a,z)
-u=$.dg()
-if(u!=null)u.V7("register",[z])
-return z},
-Ec:function(a,b){var z,y,x
-if(b==null)return
-for(z=J.MK(b,"[id]"),z=z.gA(z),y=a.ZQ;z.G();){x=z.lo
-y.u(0,J.F8(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.gkK().aN(0,new A.Sv(a))},
-fk:function(a){if(a.IX.gNF()==null)return
-this.gQg(a).aN(0,this.ghW(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.x5(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.Zh(c,w,(x.n(v,C.FQ)||x.n(v,C.eP))&&w!=null?J.Lm(w):v)
-if(u==null?w!=null:u!==w){y=y.goc(z)
-$.cp().Cq(a,y,u)}},"$2","ghW",4,0,167],
-B2:function(a,b){var z=a.IX.gNF()
-if(z==null)return
-return z.t(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},
-JY:function(a,b){var z,y,x
-z=L.hk(b).Tl(a)
-y=this.TW(a,z)
-if(y!=null)this.gQg(a).MW.setAttribute(b,y)
-else if(typeof z==="boolean"){x=this.gQg(a).MW
-x.getAttribute(b)
-x.removeAttribute(b)}},
-nR:function(a,b,c,d){var z,y,x,w,v,u,t
-z=this.B2(a,b)
-if(z==null)return J.FS(M.Ky(a),b,c,d)
-else{y=J.RE(z)
-x=y.goc(z)
-w=$.QX5()
-if(w.mL(C.eI))w.Ny("bindProperty: ["+H.d(c)+"] to ["+H.d(this.gRT(a))+"].["+H.d(x)+"]")
-w=J.RE(c)
-if(w.gP(c)==null)w.sP(c,$.cp().jD(a,x))
-v=new A.lK(a,x,c,null,null)
-v.Jq=this.gqh(a).yI(v.gXQ())
-w=J.mu(c,v.gap())
-v.dY=w
-$.cp().Cq(a,x,w)
-if($.rK&&!0){if(J.C5(M.Ky(a))==null){x=P.Fl(null,null)
-J.nC(M.Ky(a),x)}J.kW(J.C5(M.Ky(a)),b,v)}u=a.IX.gBj()
-y=y.goc(z)
-t=$.b7().ep.t(0,y)
-if(u!=null&&u.tg(0,t))this.JY(a,t)
-return v}},
-Vz:function(a){return this.rf(a)},
-gCd:function(a){return J.C5(M.Ky(a))},
-sCd:function(a,b){J.nC(M.Ky(a),b)},
-gCn:function(a){return J.fe(M.Ky(a))},
-x3:function(a){var z,y
-if(a.Uk===!0)return
-$.UW().Ny("["+H.d(this.gRT(a))+"] asyncUnbindAll")
-z=a.oq
-y=this.gJg(a)
-if(z==null)z=new A.FT(null,null,null)
-z.t6(0,y,null)
-a.oq=z},
-BM:[function(a){if(a.Uk===!0)return
-H.bQ(a.Sa,this.ghb(a))
-a.Sa=[]
-this.Uq(a)
-a.Uk=!0},"$0","gJg",0,0,18],
-oW:function(a){var z
-if(a.Uk===!0){$.UW().j2("["+H.d(this.gRT(a))+"] already unbound, cannot cancel unbindAll")
-return}$.UW().Ny("["+H.d(this.gRT(a))+"] cancelUnbindAll")
-z=a.oq
-if(z!=null){z.TP(0)
-a.oq=null}},
-nt:function(a){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z!=null){y=$.ps
-$.ps=y+1
-x=new L.ww(null,[],y,null,null,null)
-x.Wf=[]
-a.Wz=x
-a.Sa.push([x])
-for(y=H.VM(new P.fG(z),[H.Kp(z,0)]),w=y.Fb,y=H.VM(new P.EQ(w,w.Ig(),0,null),[H.Kp(y,0)]);y.G();){v=y.fD
-x.yN(a,v)
-this.rJ(a,v,v.Tl(a),null)}}},
-FQ:[function(a,b,c,d){J.Me(c,new A.n1(a,b,c,d,J.JR(a.IX),P.l1(null,null,null,null)))},"$3","gnu",6,0,168],
-hu:[function(a,b){var z,y,x,w,v
-for(z=J.mY(b);z.G();){y=z.gl()
-if(!J.x(y).$isqI)continue
-x=y.oc
-w=$.b7().ep.t(0,x)
-v=a.IX.gBj()
-if(v!=null&&v.tg(0,w))this.JY(a,w)}},"$1","gqY",2,0,169,161],
-rJ:function(a,b,c,d){var z,y,x,w,v
-z=J.JR(a.IX)
-if(z==null)return
-y=z.t(0,b)
-if(y==null)return
-if(!!J.x(d).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: unregister "+H.d(b))
-this.iQ(a,H.d(b)+"__array")}if(!!J.x(c).$iswn){x=$.p2()
-if(x.mL(C.eI))x.Ny("["+H.d(this.gRT(a))+"] observeArrayValue: register "+H.d(b))
-w=c.gQV().w4(!1)
-w.yl(new A.R8(a,d,y))
-w.fm(0,null)
-w.y5(null)
-x=H.d(b)+"__array"
-v=a.q9
-if(v==null){v=P.L5(null,null,null,P.qU,P.Oy)
-a.q9=v}v.u(0,x,w)}},
-dvq:[function(a,b){var z,y
-for(z=J.mY(b);z.G();){y=z.gl()
-if(y!=null)J.x0(y)}},"$1","ghb",2,0,170],
-iQ:function(a,b){var z=a.q9.Rz(0,b)
-if(z==null)return!1
-z.ed()
-return!0},
-Uq:function(a){var z,y
-z=a.q9
-if(z==null)return
-for(z=z.gUQ(z),z=H.VM(new H.MH(null,J.mY(z.l6),z.T6),[H.Kp(z,0),H.Kp(z,1)]);z.G();){y=z.lo
-if(y!=null)y.ed()}a.q9.V1(0)
-a.q9=null},
-Uc:function(a){var z,y
-z=a.IX.gPS()
-if(z.gl0(z))return
-y=$.eS()
-if(y.mL(C.eI))y.Ny("["+H.d(this.gRT(a))+"] addHostListeners: "+z.bu(0))
-z.aN(0,new A.SX(a))},
-ea:function(a,b,c,d){var z,y,x,w
-z=$.eS()
-y=z.mL(C.eI)
-if(y)z.Ny(">>> ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))
-if(!!J.x(c).$isEH){x=X.RI(c)
-if(x===-1)z.j2("invalid callback: expected callback of 0, 1, 2, or 3 arguments")
-C.Nm.sB(d,x)
-H.im(c,d,P.Te(null))}else if(typeof c==="string"){w=$.b7().Nz.t(0,c)
-$.cp().Ck(b,w,d,!0,null)}else z.j2("invalid callback")
-if(y)z.To("<<< ["+H.d(this.gRT(a))+"]: dispatch "+H.d(c))},
-rW:function(a,b){var z
-P.rb(F.Jy())
-$.Kc().nQ("flush")
-z=window
-C.ma.hr(z)
-return C.ma.oB(z,W.aF(b))},
-SE:function(a,b,c,d,e,f){var z=W.H9(b,!0,!0,e)
-this.H2(a,z)
-return z},
-Tj:function(a,b){return this.SE(a,b,null,null,null,null)},
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-bl:{
-"^":"Tp:13;a",
-$1:[function(a){return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-Sv:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=J.Vs(this.a)
-if(z.x4(a)!==!0)z.u(0,a,new A.Xi(b).$0())
-z.t(0,a)},
-$isEH:true},
-Xi:{
-"^":"Tp:69;b",
-$0:function(){return this.b},
-$isEH:true},
-n1:{
-"^":"Tp:77;a,b,c,d,e,f",
-$2:[function(a,b){var z,y,x,w,v,u,t,s,r,q,p
-z=this.b
-y=J.UQ(z,a)
-x=this.d
-if(typeof a!=="number")return H.s(a)
-w=2*a+1
-if(w>>>0!==w||w>=x.length)return H.e(x,w)
-v=x[w]
-w=this.e
-if(w==null)return
-u=w.t(0,v)
-if(u==null)return
-for(w=J.mY(u),t=this.a,s=J.RE(t),r=this.c,q=this.f;w.G();){p=w.gl()
-if(!q.h(0,p))continue
-s.rJ(t,v,y,b)
-$.cp().Ck(t,p,[b,y,z,r,x],!0,null)}},"$2",null,4,0,null,83,57,"call"],
-$isEH:true},
-R8:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w
-for(z=J.mY(this.c),y=this.a,x=this.b;z.G();){w=z.gl()
-$.cp().Ck(y,w,[x],!0,null)}},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-SX:{
-"^":"Tp:77;a",
-$2:function(a,b){var z=this.a
-J.mZ(z,a,J.xq(z.IX).Y2(z,z,b))},
-$isEH:true},
-lK:{
-"^":"Ap;I6,iU,q0,Jq,dY",
-AB:[function(a){this.dY=a
-$.cp().Cq(this.I6,this.iU,a)},"$1","gap",2,0,20,58],
-ho:[function(a){var z,y,x,w,v
-for(z=J.mY(a),y=this.iU;z.G();){x=z.gl()
-if(!!J.x(x).$isqI&&J.xC(x.oc,y)){z=this.I6
-w=$.cp().eA.t(0,y)
-if(w==null)H.vh(O.lA("getter \""+H.d(y)+"\" in "+J.AG(z)))
-v=w.$1(z)
-z=this.dY
-if(z==null?v!=null:z!==v)J.ta(this.q0,v)
-return}}},"$1","gXQ",2,0,169,161],
-TR:function(a,b){return J.mu(this.q0,b)},
-gP:function(a){return J.Vm(this.q0)},
-sP:function(a,b){J.ta(this.q0,b)
-return b},
-S6:function(a){var z=this.Jq
-if(z!=null){z.ed()
-this.Jq=null}J.x0(this.q0)}},
-FT:{
-"^":"a;jd,ih,lS",
-Ws:function(){return this.jd.$0()},
-t6:function(a,b,c){var z
-this.TP(0)
-this.jd=b
-z=window
-C.ma.hr(z)
-this.lS=C.ma.oB(z,W.aF(new A.K3(this)))},
-TP:function(a){var z,y
-z=this.lS
-if(z!=null){y=window
-C.ma.hr(y)
-y.cancelAnimationFrame(z)
-this.lS=null}z=this.ih
-if(z!=null){z.ed()
-this.ih=null}}},
-K3:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(z.ih!=null||z.lS!=null){z.TP(0)
-z.Ws()}return},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-mS:{
-"^":"Tp:69;",
-$0:[function(){return A.X1($.M6,$.UG)},"$0",null,0,0,null,"call"],
-$isEH:true},
-hp:{
-"^":"Tp:69;",
-$0:[function(){var z=$.iF().MM
-if(z.Gv!==0)H.vh(P.w("Future already completed"))
-z.OH(null)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-k2:{
-"^":"Tp:174;a,b",
-$3:[function(a,b,c){var z=$.Ej().t(0,b)
-if(z!=null)return this.a.Gr(new A.v4(a,b,z,$.RA().t(0,c)))
-return this.b.qP([b,c],a)},"$3",null,6,0,null,172,56,173,"call"],
-$isEH:true},
-v4:{
-"^":"Tp:69;c,d,e,f",
-$0:[function(){var z,y,x,w,v,u,t,s,r,q,p,o,n,m,l,k,j
-z=this.c
-y=this.d
-x=this.e
-w=this.f
-v=$.Rs()
-u=P.Fl(null,null)
-t=new A.XP(z,x,w,y,null,null,null,null,null,null,null,v,u,null,null)
-$.RA().u(0,y,t)
-t.Zw(w)
-s=t.Q7
-if(s!=null)t.NF=t.Yl(s)
-t.rH()
-t.I9()
-s=J.RE(z)
-r=s.Wk(z,"template")
-if(r!=null)J.Co(!!J.x(r).$isvy?r:M.Ky(r),v)
-t.Mi()
-t.f6()
-t.m1()
-A.h6(t.J3(t.kO("global"),"global"),document.head)
-t.Cw(z)
-t.Vk()
-t.W3(u)
-q=s.gQg(z).MW.getAttribute("assetpath")
-if(q==null)q=""
-p=P.hK(s.gM0(z).baseURI)
-z=P.hK(q)
-o=z.Fi
-if(o!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{if(z.gJf(z)!==""){n=z.ku
-m=z.gJf(z)
-l=z.gkb(z)
-k=p.KO(z.pO)
-j=z.tP}else{v=z.pO
-if(v===""){k=p.pO
-j=z.tP
-j=j!==""?j:p.tP}else{v=J.co(v,"/")
-u=z.pO
-k=v?p.KO(u):p.KO(p.Ky(p.pO,u))
-j=z.tP}n=p.ku
-m=p.gJf(p)
-l=p.gkb(p)}o=p.Fi}t.t4=P.Wo(z.BJ,m,k,null,l,j,null,o,n)
-z=t.gZf()
-A.YG(z,y,w!=null?J.O6(w):null)
-if($.mX().n6(x,C.MT))$.cp().Ck(x,C.MT,[t],!1,null)
-t.Ba(y)
-return},"$0",null,0,0,null,"call"],
-$isEH:true},
-Md:{
-"^":"Tp:69;",
-$0:function(){var z=J.UQ(P.Cq(document.createElement("polymer-element",null)),"__proto__")
-return!!J.x(z).$isKV?P.Cq(z):z},
-$isEH:true}}],["polymer.auto_binding","package:polymer/auto_binding.dart",,Y,{
-"^":"",
-q6:{
-"^":"wc;Hf,ro,dUC,pt,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gk8:function(a){return J.ZH(a.Hf)},
-gzH:function(a){return J.Xp(a.Hf)},
-szH:function(a,b){J.Co(a.Hf,b)},
-V1:function(a){return J.U2(a.Hf)},
-gUj:function(a){return J.Xp(a.Hf)},
-ZK:function(a,b,c){return J.MO(a.Hf,b,c)},
-dX:function(a){var z
-this.Pa(a)
-a.Hf=M.Ky(a)
-z=T.GF(null,C.qY)
-J.Co(a.Hf,new Y.zp(a,z,null))
-$.iF().MM.ml(new Y.lkK(a))},
-$isDT:true,
-$isvy:true,
-static:{zE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Gkp.ZL(a)
-C.Gkp.dX(a)
-return a}}},
-GLL:{
-"^":"OH+zs;XG:SD=",
-$iszs:true,
-$isvy:true,
-$isd3:true,
-$ish4:true,
-$isPZ:true,
-$isKV:true},
-wc:{
-"^":"GLL+d3;R9:ro%,V2:dUC%,me:pt%",
-$isd3:true},
-lkK:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-z.setAttribute("bind","")
-J.mI(z,new Y.oO(z))},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-oO:{
-"^":"Tp:13;b",
-$1:[function(a){var z,y
-z=this.b
-y=J.RE(z)
-y.Ec(z,z.parentNode)
-y.Tj(z,"template-bound")},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-zp:{
-"^":"Li;dq,Mn,cJ",
-Y2:function(a,b,c){var z={}
-z.a=a
-return new Y.PA(z,this,c)}},
-PA:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){var z,y,x,w,v,u
-z=this.a
-y=z.a
-if(y==null||!J.x(y).$iszs){x=this.b.dq
-z.a=x
-y=x}w=J.x(y)
-if(!!w.$iszs){y=J.RE(a)
-w=y.gey(a)
-y=y.gCa(a)
-v=z.a
-u=this.b.dq
-if(v===u)v=J.ZH(u.Hf)
-J.Pj(z.a,v,this.c,[a,w,y])}else throw H.b(P.w("controller "+w.bu(y)+" is not a Dart polymer-element."))},"$1",null,2,0,null,1,"call"],
-$isEH:true}}],["polymer.deserialize","package:polymer/deserialize.dart",,Z,{
-"^":"",
-Zh:function(a,b,c){var z,y,x
-z=$.QL().t(0,c)
-if(z!=null)return z.$2(a,b)
-try{y=C.xr.kV(J.JA(a,"'","\""))
-return y}catch(x){H.Ru(x)
-return a}},
-lP:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Uf:{
-"^":"Tp:77;",
-$2:function(a,b){return a},
-$isEH:true},
-Ra:{
-"^":"Tp:77;",
-$2:function(a,b){var z,y
-try{z=P.zu(a)
-return z}catch(y){H.Ru(y)
-return b}},
-$isEH:true},
-wJY:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,"false")},
-$isEH:true},
-zOQ:{
-"^":"Tp:77;",
-$2:function(a,b){return H.BU(a,null,new Z.fT(b))},
-$isEH:true},
-fT:{
-"^":"Tp:13;a",
-$1:function(a){return this.a},
-$isEH:true},
-W6o:{
-"^":"Tp:77;",
-$2:function(a,b){return H.RR(a,new Z.Lf(b))},
-$isEH:true},
-Lf:{
-"^":"Tp:13;b",
-$1:function(a){return this.b},
-$isEH:true}}],["polymer_expressions","package:polymer_expressions/polymer_expressions.dart",,T,{
-"^":"",
-dA:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.zg(a.gvc(),new T.Fi(a)).zV(0," ")
-else z=!!z.$isQV?z.zV(a," "):a
-return z},"$1","v0",2,0,49,64],
-qN:[function(a){var z=J.x(a)
-if(!!z.$isZ0)z=J.kl(a.gvc(),new T.k9(a)).zV(0,";")
-else z=!!z.$isQV?z.zV(a,";"):a
-return z},"$1","Gu",2,0,49,64],
-Fm:[function(a){return a},"$1","m9",2,0,13,65],
-Fi:{
-"^":"Tp:13;a",
-$1:function(a){return J.xC(this.a.t(0,a),!0)},
-$isEH:true},
-k9:{
-"^":"Tp:13;a",
-$1:[function(a){return H.d(a)+": "+H.d(this.a.t(0,a))},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-QB:{
-"^":"vE;uc,jw,YD,zA,cJ",
-US:function(a,b,c){var z,y,x,w
-z={}
-y=new Y.pa(H.VM([],[Y.qS]),P.p9(""),new P.WU(a,0,0,null),null)
-x=new U.tu()
-x=new T.FX(x,y,null,null)
-y=y.zl()
-x.jQ=y
-x.vi=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)])
-x.Bp()
-w=x.Te()
-if(M.CF(c)){y=J.x(b)
-y=y.n(b,"bind")||y.n(b,"repeat")}else y=!1
-if(y){z=J.x(w)
-if(!!z.$isb4)return new T.H1(this,w.gF5(),z.gkZ(w))
-else return new T.kj(this,w)}z.a=null
-y=!!J.x(c).$ish4
-if(y&&J.xC(b,"class"))z.a=T.v0()
-else if(y&&J.xC(b,"style"))z.a=T.Gu()
-return new T.qb(z,this,w)},
-CE:function(a){var z=this.zA.t(0,a)
-if(z==null)return new T.uK(this,a)
-return new T.Wb(this,a,z)},
-qF:function(a){var z,y,x,w,v
-z=J.RE(a)
-y=z.gBy(a)
-if(y==null)return
-if(M.CF(a)){x=!!z.$isvy?a:M.Ky(a)
-z=J.RE(x)
-w=z.gCn(x)
-v=w==null?z.gk8(x):w.k8
-if(!!J.x(v).$isGK)return v
-else return this.YD.t(0,a)}return this.qF(y)},
-hm:function(a,b){var z,y
-if(a==null)return K.dZ(b,this.jw)
-z=J.x(a)
-if(!!z.$ish4);if(!!J.x(b).$isGK)return b
-y=this.YD
-if(y.t(0,a)!=null){y.t(0,a)
-return y.t(0,a)}else if(z.gBy(a)!=null)return this.b8(z.gBy(a),b)
-else{if(!M.CF(a))throw H.b("expected a template instead of "+H.d(a))
-return this.b8(a,b)}},
-b8:function(a,b){var z,y,x
-if(M.CF(a)){z=!!J.x(a).$isvy?a:M.Ky(a)
-y=J.RE(z)
-if(y.gCn(z)==null)y.gk8(z)
-return this.YD.t(0,a)}else{y=J.RE(a)
-if(y.geT(a)==null){x=this.YD.t(0,a)
-return x!=null?x:K.dZ(b,this.jw)}else return this.b8(y.gBy(a),b)}},
-static:{"^":"DI",GF:function(a,b){var z,y,x
-z=H.VM(new P.qo(null),[K.GK])
-y=H.VM(new P.qo(null),[P.qU])
-x=P.L5(null,null,null,P.qU,P.a)
-x.FV(0,C.va)
-return new T.QB(b,x,z,y,null)}}},
-H1:{
-"^":"Tp:175;b,c,d",
-$3:[function(a,b,c){var z,y
-z=this.b
-z.zA.u(0,b,this.c)
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-z=T.m9()
-return new T.tI(y,z,this.d,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-kj:{
-"^":"Tp:175;e,f",
-$3:[function(a,b,c){var z,y
-z=this.e
-y=!!J.x(a).$isGK?a:K.dZ(a,z.jw)
-z.YD.u(0,b,y)
-if(c===!0)return T.rD(this.f,y,null)
-z=T.m9()
-return new T.tI(y,z,this.f,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-qb:{
-"^":"Tp:175;a,UI,bK",
-$3:[function(a,b,c){var z,y
-z=this.UI.hm(b,a)
-if(c===!0)return T.rD(this.bK,z,this.a.a)
-y=this.a.a
-if(y==null)y=T.m9()
-return new T.tI(z,y,this.bK,null,null,null,null)},"$3",null,6,0,null,163,164,165,"call"],
-$isEH:true},
-uK:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z,y,x
-z=this.a
-y=this.b
-x=z.YD.t(0,y)
-if(x!=null){if(J.xC(a,J.ZH(x)))return x
-return K.dZ(a,z.jw)}else return z.hm(y,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-Wb:{
-"^":"Tp:13;c,d,e",
-$1:[function(a){var z,y,x,w
-z=this.c
-y=this.d
-x=z.YD.t(0,y)
-w=this.e
-if(x!=null)return x.t1(w,a)
-else return z.qF(y).t1(w,a)},"$1",null,2,0,null,163,"call"],
-$isEH:true},
-tI:{
-"^":"Ap;FT,pk,oF,RU,EU,q5,pU",
-Qv:function(a){return this.pk.$1(a)},
-ZW:function(a){return this.RU.$1(a)},
-LZ:[function(a,b){var z,y
-z=this.pU
-y=this.Qv(a)
-this.pU=y
-if(b!==!0&&this.RU!=null&&!J.xC(z,y))this.ZW(this.pU)},function(a){return this.LZ(a,!1)},"Ro","$2$skipChanges","$1","gTJ",2,3,176,177,64,178],
-gP:function(a){if(this.RU!=null)return this.pU
-return T.rD(this.oF,this.FT,this.pk)},
-sP:function(a,b){var z,y,x,w,v
-try{z=K.jX(this.oF,b,this.FT,!1)
-this.LZ(z,!0)}catch(w){v=H.Ru(w)
-y=v
-x=new H.XO(w,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.oF)+"': "+H.d(y),x)}},
-TR:function(a,b){var z,y,x,w,v
-if(this.RU!=null)throw H.b(P.w("already open"))
-this.RU=b
-x=H.VM(new P.Sw(null,0,0,0),[null])
-x.Eo(null,null)
-w=this.oF.RR(0,new K.rdH(x))
-this.q5=w
-x=w.glr().yI(this.gTJ())
-x.fm(0,new T.Tg(this))
-this.EU=x
-try{x=this.q5
-J.NV(x,new K.Ed(this.FT))
-x.gXr()
-this.LZ(this.q5.gXr(),!0)}catch(v){x=H.Ru(v)
-z=x
-y=new H.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.q5)+"': "+H.d(z),y)}return this.pU},
-S6:function(a){var z,y
-if(this.RU==null)return
-this.EU.ed()
-this.EU=null
-this.RU=null
-z=$.Pk()
-y=this.q5
-z.toString
-J.NV(y,z)
-this.q5=null},
-static:{rD:function(a,b,c){var z,y,x,w,v
-try{z=J.NV(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.XO(v,null)
-H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(a)+"': "+H.d(y),x)}return}}},
-Tg:{
-"^":"Tp:77;a",
-$2:[function(a,b){H.VM(new P.Zf(P.Dt(null)),[null]).w0("Error evaluating expression '"+H.d(this.a.q5)+"': "+H.d(a),b)},"$2",null,4,0,null,1,143,"call"],
-$isEH:true},
-yy:{
-"^":"a;"}}],["polymer_expressions.async","package:polymer_expressions/async.dart",,B,{
-"^":"",
-De:{
-"^":"Sk;vq,DA,AP,fn",
-vb:function(a,b){this.vq.yI(new B.fg(b,this))},
-$asSk:function(a){return[null]},
-static:{zR:function(a,b){var z=H.VM(new B.De(a,null,null,null),[b])
-z.vb(a,b)
-return z}}},
-fg:{
-"^":"Tp;a,b",
-$1:[function(a){var z=this.b
-z.DA=F.Wi(z,C.Ha,z.DA,a)},"$1",null,2,0,null,83,"call"],
-$isEH:true,
-$signature:function(){return H.XW(function(a){return{func:"Pw",args:[a]}},this.b,"De")}}}],["polymer_expressions.eval","package:polymer_expressions/eval.dart",,K,{
-"^":"",
-jX:function(a,b,c,d){var z,y,x,w,v,u,t
-z=H.VM([],[U.hw])
-for(;y=J.x(a),!!y.$isuku;){if(!J.xC(y.gkp(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.$iszX){w=a.gTf()
-x=a.gJn()
-v=!0}else{if(!!y.$isx9){w=a.gTf()
-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.Kp(z,0)]);y.G();){u=y.lo
-J.NV(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.NV(w,new K.GQ(c))
-if(t==null)return
-if(v)J.kW(t,J.NV(x,new K.GQ(c)),b)
-else{y=$.b7().Nz.t(0,x)
-$.cp().Cq(t,y,b)}return b},
-dZ:function(a,b){var z,y,x
-z=new K.nk(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.x4("this"))H.vh(K.zq("'this' cannot be used as a variable name."))
-y=x}return y},
-w10:{
-"^":"Tp:77;",
-$2:function(a,b){return J.ew(a,b)},
-$isEH:true},
-w11:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(a,b)},
-$isEH:true},
-w12:{
-"^":"Tp:77;",
-$2:function(a,b){return J.vX(a,b)},
-$isEH:true},
-w13:{
-"^":"Tp:77;",
-$2:function(a,b){return J.L9(a,b)},
-$isEH:true},
-w14:{
-"^":"Tp:77;",
-$2:function(a,b){return J.jO(a,b)},
-$isEH:true},
-w15:{
-"^":"Tp:77;",
-$2:function(a,b){return J.xC(a,b)},
-$isEH:true},
-w16:{
-"^":"Tp:77;",
-$2:function(a,b){return!J.xC(a,b)},
-$isEH:true},
-w17:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b==null:a===b},
-$isEH:true},
-w18:{
-"^":"Tp:77;",
-$2:function(a,b){return a==null?b!=null:a!==b},
-$isEH:true},
-w19:{
-"^":"Tp:77;",
-$2:function(a,b){return J.z8(a,b)},
-$isEH:true},
-w20:{
-"^":"Tp:77;",
-$2:function(a,b){return J.J5(a,b)},
-$isEH:true},
-w21:{
-"^":"Tp:77;",
-$2:function(a,b){return J.u6(a,b)},
-$isEH:true},
-w22:{
-"^":"Tp:77;",
-$2:function(a,b){return J.Bl(a,b)},
-$isEH:true},
-w23:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0||b===!0},
-$isEH:true},
-w24:{
-"^":"Tp:77;",
-$2:function(a,b){return a===!0&&b===!0},
-$isEH:true},
-w25:{
-"^":"Tp:77;",
-$2:function(a,b){var z=H.Og(P.a)
-z=H.KT(z,[z]).BD(b)
-if(z)return b.$1(a)
-throw H.b(K.zq("Filters must be a one-argument function."))},
-$isEH:true},
-Raa:{
-"^":"Tp:13;",
-$1:function(a){return a},
-$isEH:true},
-w0:{
-"^":"Tp:13;",
-$1:function(a){return J.jzo(a)},
-$isEH:true},
-w5:{
-"^":"Tp:13;",
-$1:function(a){return a!==!0},
-$isEH:true},
-GK:{
-"^":"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."))
-return new K.PO(this,a,b)},
-$isGK:true,
-$isab:true,
-$asab:function(){return[P.qU,P.a]}},
-nk:{
-"^":"GK;k8>",
-t:function(a,b){var z,y
-if(J.xC(b,"this"))return this.k8
-z=$.b7().Nz.t(0,b)
-y=this.k8
-if(y==null||z==null)throw H.b(K.zq("variable '"+H.d(b)+"' not found"))
-y=$.cp().jD(y,z)
-return!!J.x(y).$iscb?B.zR(y,null):y},
-NX:function(a){return!J.xC(a,"this")},
-bu:function(a){return"[model: "+H.d(this.k8)+"]"}},
-PO:{
-"^":"GK;eT>,Z0,P>",
-gk8:function(a){var z=this.eT
-z=z.gk8(z)
-return z},
-t:function(a,b){var z
-if(J.xC(this.Z0,b)){z=this.P
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-NX:function(a){if(J.xC(this.Z0,a))return!1
-return this.eT.NX(a)},
-bu:function(a){return this.eT.bu(0)+" > [local: "+H.d(this.Z0)+"]"}},
-Ph:{
-"^":"GK;eT>,Z3<",
-gk8:function(a){return this.eT.k8},
-t:function(a,b){var z=this.Z3
-if(z.x4(b)){z=z.t(0,b)
-return!!J.x(z).$iscb?B.zR(z,null):z}return this.eT.t(0,b)},
-NX:function(a){if(this.Z3.x4(a))return!1
-return!J.xC(a,"this")},
-bu:function(a){var z=this.Z3
-return"[model: "+H.d(this.eT.k8)+"] > [global: "+P.Ix(H.VM(new P.i5(z),[H.Kp(z,0)]),"(",")")+"]"}},
-Ay0:{
-"^":"a;NV?,Y4<",
-glr:function(){var z=this.Zj
-return H.VM(new P.Ik(z),[H.Kp(z,0)])},
-gXr:function(){return this.Y4},
-ab:function(a){},
-tf:function(a){var z
-this.Ra(0,a)
-z=this.NV
-if(z!=null)z.tf(a)},
-PK:function(){var z=this.a9
-if(z!=null){z.ed()
-this.a9=null}},
-Ra:function(a,b){var z,y,x
-this.PK()
-z=this.Y4
-this.ab(b)
-y=this.Y4
-if(y==null?z!=null:y!==z){x=this.Zj
-if(x.Gv>=4)H.vh(x.q7())
-x.Iv(y)}},
-bu:function(a){return this.r3.bu(0)},
-$ishw:true},
-Ed:{
-"^":"cfS;qu",
-xn:function(a){a.Ra(0,this.qu)}},
-me:{
-"^":"cfS;",
-xn:function(a){a.PK()},
-static:{"^":"jC"}},
-GQ:{
-"^":"P55;qu",
-W9:function(a){return J.ZH(this.qu)},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-if(z==null)return
-y=a.goc(a)
-x=$.b7().Nz.t(0,y)
-return $.cp().jD(z,x)},
-CU:function(a){var z=J.NV(a.gTf(),this)
-if(z==null)return
-return J.UQ(z,J.NV(a.gJn(),this))},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(z==null)return
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}if(a.gSf(a)==null)return H.im(z,y,P.Te(null))
-x=a.gSf(a)
-v=$.b7().Nz.t(0,x)
-return $.cp().Ck(z,v,y,!1,null)},
-oD:function(a){return a.gP(a)},
-Zh:function(a){return H.VM(new H.A8(a.ghL(),this.gay()),[null,null]).br(0)},
-o0:function(a){var z,y,x
-z=P.Fl(null,null)
-for(y=a.gRl(a),y=H.VM(new H.a7(y,y.length,0,null),[H.Kp(y,0)]);y.G();){x=y.lo
-z.u(0,J.NV(J.A6(x),this),J.NV(x.gv4(),this))}return z},
-YV:function(a){return H.vh(P.f("should never be called"))},
-qv:function(a){return J.UQ(this.qu,a.gP(a))},
-ex:function(a){var z,y,x,w,v
-z=a.gkp(a)
-y=J.NV(a.gBb(a),this)
-x=J.NV(a.gT8(a),this)
-w=$.Rab().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)
-else if(y==null||x==null)return
-return w.$2(y,x)},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=$.qL().t(0,a.gkp(a))
-if(J.xC(a.gkp(a),"!"))return y.$1(z==null?!1:z)
-return z==null?null:y.$1(z)},
-RD:function(a){return J.xC(J.NV(a.gdc(),this),!0)?J.NV(a.gSl(),this):J.NV(a.gru(),this)},
-kz:function(a){return H.vh(P.f("can't eval an 'in' expression"))},
-xt:function(a){return H.vh(P.f("can't eval an 'as' expression"))}},
-rdH:{
-"^":"P55;lk",
-W9:function(a){return new K.uD(a,null,null,null,P.bK(null,null,!1,null))},
-LT:function(a){return a.wz.RR(0,this)},
-fV:function(a){var z,y
-z=J.NV(a.gTf(),this)
-y=new K.vl(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-CU:function(a){var z,y,x
-z=J.NV(a.gTf(),this)
-y=J.NV(a.gJn(),this)
-x=new K.iT(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-ZR:function(a){var z,y,x,w,v
-z=J.NV(a.gTf(),this)
-if(a.gre()==null)y=null
-else{x=a.gre()
-w=this.gay()
-x.toString
-y=H.VM(new H.A8(x,w),[null,null]).tt(0,!1)}v=new K.c3(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(v)
-if(y!=null)H.bQ(y,new K.zD(v))
-return v},
-oD: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.ghL(),this.gay()),[null,null]).tt(0,!1)
-y=new K.kL(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.XV(y))
-return y},
-o0:function(a){var z,y
-z=H.VM(new H.A8(a.gRl(a),this.gay()),[null,null]).tt(0,!1)
-y=new K.ev(z,a,null,null,null,P.bK(null,null,!1,null))
-H.bQ(z,new K.B8(y))
-return y},
-YV:function(a){var z,y,x
-z=J.NV(a.gG3(a),this)
-y=J.NV(a.gv4(),this)
-x=new K.qR(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-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.NV(a.gBb(a),this)
-y=J.NV(a.gT8(a),this)
-x=new K.kyp(z,y,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(x)
-y.sNV(x)
-return x},
-Hx:function(a){var z,y
-z=J.NV(a.gwz(),this)
-y=new K.mv(z,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(y)
-return y},
-RD:function(a){var z,y,x,w
-z=J.NV(a.gdc(),this)
-y=J.NV(a.gSl(),this)
-x=J.NV(a.gru(),this)
-w=new K.WW(z,y,x,a,null,null,null,P.bK(null,null,!1,null))
-z.sNV(w)
-y.sNV(w)
-x.sNV(w)
-return w},
-kz:function(a){throw H.b(P.f("can't eval an 'in' expression"))},
-xt:function(a){throw H.b(P.f("can't eval an 'as' expression"))}},
-zD:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-XV:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-B8:{
-"^":"Tp:13;a",
-$1:function(a){var z=this.a
-a.sNV(z)
-return z},
-$isEH:true},
-uD:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=J.ZH(a)},
-RR:function(a,b){return b.W9(this)},
-$asAy0:function(){return[U.EO]},
-$isEO:true,
-$ishw:true},
-z0:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z=this.r3
-this.Y4=z.gP(z)},
-RR:function(a,b){return b.oD(this)},
-$asAy0:function(){return[U.no]},
-$asno:function(){return[null]},
-$isno:true,
-$ishw:true},
-kL:{
-"^":"Ay0;hL<,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.VM(new H.A8(this.hL,new K.Hv()),[null,null]).br(0)},
-RR:function(a,b){return b.Zh(this)},
-$asAy0:function(){return[U.c0]},
-$isc0:true,
-$ishw:true},
-Hv:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,83,"call"],
-$isEH:true},
-ev:{
-"^":"Ay0;Rl>,r3,NV,a9,Y4,Zj",
-ab:function(a){this.Y4=H.n3(this.Rl,P.L5(null,null,null,null,null),new K.Ku())},
-RR:function(a,b){return b.o0(this)},
-$asAy0:function(){return[U.Qb]},
-$isQb:true,
-$ishw:true},
-Ku:{
-"^":"Tp:77;",
-$2:function(a,b){J.kW(a,J.A6(b).gY4(),b.gv4().gY4())
-return a},
-$isEH:true},
-qR:{
-"^":"Ay0;G3>,v4<,r3,NV,a9,Y4,Zj",
-RR:function(a,b){return b.YV(this)},
-$asAy0:function(){return[U.ae]},
-$isae:true,
-$ishw:true},
-ek:{
-"^":"Ay0;r3,NV,a9,Y4,Zj",
-gP:function(a){var z=this.r3
-return z.gP(z)},
-ab:function(a){var z,y,x,w
-z=this.r3
-y=J.U6(a)
-this.Y4=y.t(a,z.gP(z))
-if(!a.NX(z.gP(z)))return
-x=y.gk8(a)
-y=J.x(x)
-if(!y.$isd3)return
-z=z.gP(z)
-w=$.b7().Nz.t(0,z)
-this.a9=y.gqh(x).yI(new K.j9(this,a,w))},
-RR:function(a,b){return b.qv(this)},
-$asAy0:function(){return[U.fp]},
-$isfp:true,
-$ishw:true},
-j9:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GC(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GC:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-mv:{
-"^":"Ay0;wz<,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y
-z=this.r3
-y=$.qL().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"!")){z=this.wz.gY4()
-this.Y4=y.$1(z==null?!1:z)}else{z=this.wz
-this.Y4=z.gY4()==null?null:y.$1(z.gY4())}},
-RR:function(a,b){return b.Hx(this)},
-$asAy0:function(){return[U.cJ]},
-$iscJ:true,
-$ishw:true},
-kyp:{
-"^":"Ay0;Bb>,T8>,r3,NV,a9,Y4,Zj",
-gkp:function(a){var z=this.r3
-return z.gkp(z)},
-ab:function(a){var z,y,x
-z=this.r3
-y=$.Rab().t(0,z.gkp(z))
-if(J.xC(z.gkp(z),"&&")||J.xC(z.gkp(z),"||")){z=this.Bb.gY4()
-if(z==null)z=!1
-x=this.T8.gY4()
-this.Y4=y.$2(z,x==null?!1:x)}else if(J.xC(z.gkp(z),"==")||J.xC(z.gkp(z),"!="))this.Y4=y.$2(this.Bb.gY4(),this.T8.gY4())
-else{x=this.Bb
-if(x.gY4()==null||this.T8.gY4()==null)this.Y4=null
-else{if(J.xC(z.gkp(z),"|")&&!!J.x(x.gY4()).$iswn)this.a9=H.Go(x.gY4(),"$iswn").gQV().yI(new K.P8(this,a))
-this.Y4=y.$2(x.gY4(),this.T8.gY4())}}},
-RR:function(a,b){return b.ex(this)},
-$asAy0:function(){return[U.uku]},
-$isuku:true,
-$ishw:true},
-P8:{
-"^":"Tp:13;a,b",
-$1:[function(a){return this.a.tf(this.b)},"$1",null,2,0,null,14,"call"],
-$isEH:true},
-WW:{
-"^":"Ay0;dc<,Sl<,ru<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z=this.dc.gY4()
-this.Y4=(z==null?!1:z)===!0?this.Sl.gY4():this.ru.gY4()},
-RR:function(a,b){return b.RD(this)},
-$asAy0:function(){return[U.mc]},
-$ismc:true,
-$ishw:true},
-vl:{
-"^":"Ay0;Tf<,r3,NV,a9,Y4,Zj",
-goc:function(a){var z=this.r3
-return z.goc(z)},
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.r3
-y=y.goc(y)
-x=$.b7().Nz.t(0,y)
-this.Y4=$.cp().jD(z,x)
-y=J.x(z)
-if(!!y.$isd3)this.a9=y.gqh(z).yI(new K.fk(this,a,x))},
-RR:function(a,b){return b.fV(this)},
-$asAy0:function(){return[U.x9]},
-$isx9:true,
-$ishw:true},
-fk:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.WKb(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-WKb:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-iT:{
-"^":"Ay0;Tf<,Jn<,r3,NV,a9,Y4,Zj",
-ab:function(a){var z,y,x
-z=this.Tf.gY4()
-if(z==null){this.Y4=null
-return}y=this.Jn.gY4()
-x=J.U6(z)
-this.Y4=x.t(z,y)
-if(!!x.$iswn)this.a9=z.gQV().yI(new K.tE(this,a,y))
-else if(!!x.$isd3)this.a9=x.gqh(z).yI(new K.na(this,a,y))},
-RR:function(a,b){return b.CU(this)},
-$asAy0:function(){return[U.zX]},
-$iszX:true,
-$ishw:true},
-tE:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){if(J.VA(a,new K.GST(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-GST:{
-"^":"Tp:13;d",
-$1:[function(a){return a.XP(this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-na:{
-"^":"Tp:13;e,f,UI",
-$1:[function(a){if(J.VA(a,new K.zw(this.UI))===!0)this.e.tf(this.f)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-zw:{
-"^":"Tp:13;bK",
-$1:[function(a){return!!J.x(a).$isya&&J.xC(a.G3,this.bK)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-c3:{
-"^":"Ay0;Tf<,re<,r3,NV,a9,Y4,Zj",
-gSf:function(a){var z=this.r3
-return z.gSf(z)},
-ab:function(a){var z,y,x,w
-z=this.re
-z.toString
-y=H.VM(new H.A8(z,new K.Xh()),[null,null]).br(0)
-x=this.Tf.gY4()
-if(x==null){this.Y4=null
-return}z=this.r3
-if(z.gSf(z)==null){z=H.im(x,y,P.Te(null))
-this.Y4=!!J.x(z).$iscb?B.zR(z,null):z}else{z=z.gSf(z)
-w=$.b7().Nz.t(0,z)
-this.Y4=$.cp().Ck(x,w,y,!1,null)
-z=J.x(x)
-if(!!z.$isd3)this.a9=z.gqh(x).yI(new K.BGc(this,a,w))}},
-RR:function(a,b){return b.ZR(this)},
-$asAy0:function(){return[U.Nb]},
-$isNb:true,
-$ishw:true},
-Xh:{
-"^":"Tp:13;",
-$1:[function(a){return a.gY4()},"$1",null,2,0,null,46,"call"],
-$isEH:true},
-BGc:{
-"^":"Tp:179;a,b,c",
-$1:[function(a){if(J.VA(a,new K.vk(this.c))===!0)this.a.tf(this.b)},"$1",null,2,0,null,171,"call"],
-$isEH:true},
-vk:{
-"^":"Tp:13;d",
-$1:[function(a){return!!J.x(a).$isqI&&J.xC(a.oc,this.d)},"$1",null,2,0,null,81,"call"],
-$isEH:true},
-nD:{
-"^":"a;G1>",
-bu:function(a){return"EvalException: "+this.G1},
-static:{zq:function(a){return new K.nD(a)}}}}],["polymer_expressions.expression","package:polymer_expressions/expression.dart",,U,{
-"^":"",
-Pu:function(a,b){var z,y
-if(a==null?b==null:a===b)return!0
-if(a==null||b==null)return!1
-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},
-b1:function(a){a.toString
-return U.Le(H.n3(a,0,new U.xs()))},
-C0C:function(a,b){var z=J.ew(a,b)
-if(typeof z!=="number")return H.s(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)
-a=536870911&a+((67108863&a)<<3>>>0)
-a=(a^a>>>11)>>>0
-return 536870911&a+((16383&a)<<15>>>0)},
-tu:{
-"^":"a;",
-Bf:[function(a,b,c){return new U.zX(b,c)},"$2","gvH",4,0,180,1,46]},
-hw:{
-"^":"a;",
-$ishw:true},
-EO:{
-"^":"hw;",
-RR:function(a,b){return b.W9(this)},
-$isEO:true},
-no:{
-"^":"hw;P>",
-RR:function(a,b){return b.oD(this)},
-bu:function(a){var z=this.P
-return typeof z==="string"?"\""+H.d(z)+"\"":H.d(z)},
-n:function(a,b){var z
-if(b==null)return!1
-z=H.RB(b,"$isno",[H.Kp(this,0)],"$asno")
-return z&&J.xC(J.Vm(b),this.P)},
-giO:function(a){return J.v1(this.P)},
-$isno:true},
-c0:{
-"^":"hw;hL<",
-RR:function(a,b){return b.Zh(this)},
-bu:function(a){return H.d(this.hL)},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isc0&&U.Pu(b.ghL(),this.hL)},
-giO:function(a){return U.b1(this.hL)},
-$isc0:true},
-Qb:{
-"^":"hw;Rl>",
-RR:function(a,b){return b.o0(this)},
-bu:function(a){return"{"+H.d(this.Rl)+"}"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isQb&&U.Pu(z.gRl(b),this.Rl)},
-giO:function(a){return U.b1(this.Rl)},
-$isQb:true},
-ae:{
-"^":"hw;G3>,v4<",
-RR:function(a,b){return b.YV(this)},
-bu:function(a){return this.G3.bu(0)+": "+H.d(this.v4)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isae&&J.xC(z.gG3(b),this.G3)&&J.xC(b.gv4(),this.v4)},
-giO:function(a){var z,y
-z=J.v1(this.G3.P)
-y=J.v1(this.v4)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isae:true},
-XC:{
-"^":"hw;wz",
-RR:function(a,b){return b.LT(this)},
-bu:function(a){return"("+H.d(this.wz)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isXC&&J.xC(b.wz,this.wz)},
-giO:function(a){return J.v1(this.wz)},
-$isXC:true},
-fp:{
-"^":"hw;P>",
-RR:function(a,b){return b.qv(this)},
-bu:function(a){return this.P},
-n: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)},
-$isfp:true},
-cJ:{
-"^":"hw;kp>,wz<",
-RR:function(a,b){return b.Hx(this)},
-bu:function(a){return H.d(this.kp)+" "+H.d(this.wz)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$iscJ&&J.xC(z.gkp(b),this.kp)&&J.xC(b.gwz(),this.wz)},
-giO:function(a){var z,y
-z=J.v1(this.kp)
-y=J.v1(this.wz)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iscJ:true},
-uku:{
-"^":"hw;kp>,Bb>,T8>",
-RR:function(a,b){return b.ex(this)},
-bu:function(a){return"("+H.d(this.Bb)+" "+H.d(this.kp)+" "+H.d(this.T8)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isuku&&J.xC(z.gkp(b),this.kp)&&J.xC(z.gBb(b),this.Bb)&&J.xC(z.gT8(b),this.T8)},
-giO:function(a){var z,y,x
-z=J.v1(this.kp)
-y=J.v1(this.Bb)
-x=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isuku:true},
-mc:{
-"^":"hw;dc<,Sl<,ru<",
-RR:function(a,b){return b.RD(this)},
-bu:function(a){return"("+H.d(this.dc)+" ? "+H.d(this.Sl)+" : "+H.d(this.ru)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ismc&&J.xC(b.gdc(),this.dc)&&J.xC(b.gSl(),this.Sl)&&J.xC(b.gru(),this.ru)},
-giO:function(a){var z,y,x
-z=J.v1(this.dc)
-y=J.v1(this.Sl)
-x=J.v1(this.ru)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$ismc:true},
-K9:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.kz(this)},
-gF5: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)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$isK9&&b.Bb.n(0,this.Bb)&&J.xC(b.T8,this.T8)},
-giO:function(a){var z,y
-z=this.Bb
-z=z.giO(z)
-y=J.v1(this.T8)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isK9:true,
-$isb4:true},
-px:{
-"^":"hw;Bb>,T8>",
-RR:function(a,b){return b.xt(this)},
-gF5: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)+")"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$ispx&&J.xC(b.Bb,this.Bb)&&b.T8.n(0,this.T8)},
-giO:function(a){var z,y
-z=J.v1(this.Bb)
-y=this.T8
-y=y.giO(y)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$ispx:true,
-$isb4:true},
-zX:{
-"^":"hw;Tf<,Jn<",
-RR:function(a,b){return b.CU(this)},
-bu:function(a){return H.d(this.Tf)+"["+H.d(this.Jn)+"]"},
-n:function(a,b){if(b==null)return!1
-return!!J.x(b).$iszX&&J.xC(b.gTf(),this.Tf)&&J.xC(b.gJn(),this.Jn)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.Jn)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$iszX:true},
-x9:{
-"^":"hw;Tf<,oc>",
-RR:function(a,b){return b.fV(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.oc)},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isx9&&J.xC(b.gTf(),this.Tf)&&J.xC(z.goc(b),this.oc)},
-giO:function(a){var z,y
-z=J.v1(this.Tf)
-y=J.v1(this.oc)
-return U.Le(U.C0C(U.C0C(0,z),y))},
-$isx9:true},
-Nb:{
-"^":"hw;Tf<,Sf>,re<",
-RR:function(a,b){return b.ZR(this)},
-bu:function(a){return H.d(this.Tf)+"."+H.d(this.Sf)+"("+H.d(this.re)+")"},
-n:function(a,b){var z
-if(b==null)return!1
-z=J.x(b)
-return!!z.$isNb&&J.xC(b.gTf(),this.Tf)&&J.xC(z.gSf(b),this.Sf)&&U.Pu(b.gre(),this.re)},
-giO:function(a){var z,y,x
-z=J.v1(this.Tf)
-y=J.v1(this.Sf)
-x=U.b1(this.re)
-return U.Le(U.C0C(U.C0C(U.C0C(0,z),y),x))},
-$isNb:true},
-xs:{
-"^":"Tp:77;",
-$2:function(a,b){return U.C0C(a,J.v1(b))},
-$isEH:true}}],["polymer_expressions.parser","package:polymer_expressions/parser.dart",,T,{
-"^":"",
-FX:{
-"^":"a;rp,Yf,jQ,vi",
-gQi:function(){return this.vi.lo},
-lx:function(a,b){var z
-if(a!=null){z=this.vi.lo
-z=z==null||!J.xC(J.Iz(z),a)}else z=!1
-if(!z)if(b!=null){z=this.vi.lo
-z=z==null||!J.xC(J.Vm(z),b)}else z=!1
-else z=!0
-if(z)throw H.b(Y.RV("Expected kind "+H.d(a)+" ("+H.d(b)+"): "+H.d(this.gQi())))
-this.vi.G()},
-Bp:function(){return this.lx(null,null)},
-GI:function(a){return this.lx(a,null)},
-Te:function(){if(this.vi.lo==null){this.rp.toString
-return C.x4}var z=this.Yq()
-return z==null?null:this.G5(z,0)},
-G5:function(a,b){var z,y,x,w,v,u
-for(;z=this.vi.lo,z!=null;)if(J.xC(J.Iz(z),9))if(J.xC(J.Vm(this.vi.lo),"(")){y=this.rD()
-this.rp.toString
-a=new U.Nb(a,null,y)}else if(J.xC(J.Vm(this.vi.lo),"[")){x=this.Ew()
-this.rp.toString
-a=new U.zX(a,x)}else break
-else if(J.xC(J.Iz(this.vi.lo),3)){this.Bp()
-a=this.j6(a,this.Yq())}else if(J.xC(J.Iz(this.vi.lo),10))if(J.xC(J.Vm(this.vi.lo),"in")){if(!J.x(a).$isfp)H.vh(Y.RV("in... statements must start with an identifier"))
-this.Bp()
-w=this.Te()
-this.rp.toString
-a=new U.K9(a,w)}else if(J.xC(J.Vm(this.vi.lo),"as")){this.Bp()
-w=this.Te()
-if(!J.x(w).$isfp)H.vh(Y.RV("'as' statements must end with an identifier"))
-this.rp.toString
-a=new U.px(a,w)}else break
-else{if(J.xC(J.Iz(this.vi.lo),8)){z=this.vi.lo.gP9()
-if(typeof z!=="number")return z.F()
-if(typeof b!=="number")return H.s(b)
-z=z>=b}else z=!1
-if(z)if(J.xC(J.Vm(this.vi.lo),"?")){this.lx(8,"?")
-v=this.Te()
-this.GI(5)
-u=this.Te()
-this.rp.toString
-a=new U.mc(a,v,u)}else a=this.T1(a)
-else break}return a},
-j6:function(a,b){var z,y
-z=J.x(b)
-if(!!z.$isfp){z=z.gP(b)
-this.rp.toString
-return new U.x9(a,z)}else if(!!z.$isNb&&!!J.x(b.gTf()).$isfp){z=J.Vm(b.gTf())
-y=b.gre()
-this.rp.toString
-return new U.Nb(a,z,y)}else throw H.b(Y.RV("expected identifier: "+H.d(b)))},
-T1:function(a){var z,y,x,w,v
-z=this.vi.lo
-y=J.RE(z)
-if(!C.Nm.tg(C.fW,y.gP(z)))throw H.b(Y.RV("unknown operator: "+H.d(y.gP(z))))
-this.Bp()
-x=this.Yq()
-while(!0){w=this.vi.lo
-if(w!=null)if(J.xC(J.Iz(w),8)||J.xC(J.Iz(this.vi.lo),3)||J.xC(J.Iz(this.vi.lo),9)){w=this.vi.lo.gP9()
-v=z.gP9()
-if(typeof w!=="number")return w.D()
-if(typeof v!=="number")return H.s(v)
-v=w>v
-w=v}else w=!1
-else w=!1
-if(!w)break
-x=this.G5(x,this.vi.lo.gP9())}y=y.gP(z)
-this.rp.toString
-return new U.uku(y,a,x)},
-Yq:function(){var z,y,x,w
-if(J.xC(J.Iz(this.vi.lo),8)){z=J.Vm(this.vi.lo)
-y=J.x(z)
-if(y.n(z,"+")||y.n(z,"-")){this.Bp()
-if(J.xC(J.Iz(this.vi.lo),6)){y=H.BU(H.d(z)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-z=new U.no(y)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{y=this.rp
-if(J.xC(J.Iz(this.vi.lo),7)){x=H.RR(H.d(z)+H.d(J.Vm(this.vi.lo)),null)
-y.toString
-z=new U.no(x)
-z.$builtinTypeInfo=[null]
-this.Bp()
-return z}else{w=this.G5(this.LL(),11)
-y.toString
-return new U.cJ(z,w)}}}else if(y.n(z,"!")){this.Bp()
-w=this.G5(this.LL(),11)
-this.rp.toString
-return new U.cJ(z,w)}else throw H.b(Y.RV("unexpected token: "+H.d(z)))}return this.LL()},
-LL:function(){var z,y
-switch(J.Iz(this.vi.lo)){case 10:z=J.Vm(this.vi.lo)
-if(J.xC(z,"this")){this.Bp()
-this.rp.toString
-return new U.fp("this")}else if(C.Nm.tg(C.oP,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.jf()
-case 1:return this.ef()
-case 6:return this.DS()
-case 7:return this.Xk()
-case 9:if(J.xC(J.Vm(this.vi.lo),"(")){this.Bp()
-y=this.Te()
-this.lx(9,")")
-this.rp.toString
-return new U.XC(y)}else if(J.xC(J.Vm(this.vi.lo),"{"))return this.pH()
-else if(J.xC(J.Vm(this.vi.lo),"["))return this.S9()
-return
-case 5:throw H.b(Y.RV("unexpected token \":\""))
-default:return}},
-S9:function(){var z,y
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"]"))break
-z.push(this.Te())
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"]")
-return new U.c0(z)},
-pH:function(){var z,y,x
-z=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),"}"))break
-y=J.Vm(this.vi.lo)
-this.rp.toString
-x=new U.no(y)
-x.$builtinTypeInfo=[null]
-this.Bp()
-this.lx(5,":")
-z.push(new U.ae(x,this.Te()))
-y=this.vi.lo}while(y!=null&&J.xC(J.Vm(y),","))
-this.lx(9,"}")
-return new U.Qb(z)},
-jf:function(){var z,y,x
-if(J.xC(J.Vm(this.vi.lo),"true")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!0),[null])}if(J.xC(J.Vm(this.vi.lo),"false")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(!1),[null])}if(J.xC(J.Vm(this.vi.lo),"null")){this.Bp()
-this.rp.toString
-return H.VM(new U.no(null),[null])}if(!J.xC(J.Iz(this.vi.lo),2))H.vh(Y.RV("expected identifier: "+H.d(this.gQi())+".value"))
-z=J.Vm(this.vi.lo)
-this.Bp()
-this.rp.toString
-y=new U.fp(z)
-x=this.rD()
-if(x==null)return y
-else return new U.Nb(y,null,x)},
-rD:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"(")){y=[]
-do{this.Bp()
-if(J.xC(J.Iz(this.vi.lo),9)&&J.xC(J.Vm(this.vi.lo),")"))break
-y.push(this.Te())
-z=this.vi.lo}while(z!=null&&J.xC(J.Vm(z),","))
-this.lx(9,")")
-return y}return},
-Ew:function(){var z,y
-z=this.vi.lo
-if(z!=null&&J.xC(J.Iz(z),9)&&J.xC(J.Vm(this.vi.lo),"[")){this.Bp()
-y=this.Te()
-this.lx(9,"]")
-return y}return},
-ef:function(){var z,y
-z=J.Vm(this.vi.lo)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Bu:function(a){var z,y
-z=H.BU(H.d(a)+H.d(J.Vm(this.vi.lo)),null,null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-DS:function(){return this.Bu("")},
-u3:function(a){var z,y
-z=H.RR(H.d(a)+H.d(J.Vm(this.vi.lo)),null)
-this.rp.toString
-y=H.VM(new U.no(z),[null])
-this.Bp()
-return y},
-Xk:function(){return this.u3("")}}}],["polymer_expressions.src.globals","package:polymer_expressions/src/globals.dart",,K,{
-"^":"",
-RS:[function(a){return H.VM(new K.Bt(a),[null])},"$1","y8",2,0,66,67],
-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)+")"},
-$isAep:true},
-Bt:{
-"^":"mW;YR",
-gA:function(a){var z=new K.vR(J.mY(this.YR),0,null)
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-gB:function(a){return J.q8(this.YR)},
-gl0:function(a){return J.FN(this.YR)},
-grZ:function(a){var z,y
-z=this.YR
-y=J.U6(z)
-z=new K.Aep(J.bI(y.gB(z),1),y.grZ(z))
-z.$builtinTypeInfo=this.$builtinTypeInfo
-return z},
-$asmW:function(a){return[[K.Aep,a]]},
-$asQV:function(a){return[[K.Aep,a]]}},
-vR:{
-"^":"Dk;WS,wX,CD",
-gl:function(){return this.CD},
-G:function(){var z=this.WS
-if(z.G()){this.CD=H.VM(new K.Aep(this.wX++,z.gl()),[null])
-return!0}this.CD=null
-return!1},
-$asDk:function(a){return[[K.Aep,a]]}}}],["polymer_expressions.tokenizer","package:polymer_expressions/tokenizer.dart",,Y,{
-"^":"",
-wX:function(a){switch(a){case 102:return 12
-case 110:return 10
-case 114:return 13
-case 116:return 9
-case 118:return 11
-default:return a}},
-qS:{
-"^":"a;fY>,P>,P9<",
-bu:function(a){return"("+this.fY+", '"+this.P+"')"},
-$isqS:true},
-pa:{
-"^":"a;MV,zy,jI,x0",
-zl:function(){var z,y,x,w,v,u,t,s
-z=this.jI
-this.x0=z.G()?z.Wn:null
-for(y=this.MV;x=this.x0,x!=null;)if(x===32||x===9||x===160)this.x0=z.G()?z.Wn:null
-else if(x===34||x===39)this.WG()
-else{if(typeof x!=="number")return H.s(x)
-if(!(97<=x&&x<=122))w=65<=x&&x<=90||x===95||x===36||x>127
-else w=!0
-if(w)this.zI()
-else if(48<=x&&x<=57)this.jj()
-else if(x===46){x=z.G()?z.Wn:null
-this.x0=x
-if(typeof x!=="number")return H.s(x)
-if(48<=x&&x<=57)this.oz()
-else y.push(new Y.qS(3,".",11))}else if(x===44){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(4,",",0))}else if(x===58){this.x0=z.G()?z.Wn:null
-y.push(new Y.qS(5,":",0))}else if(C.Nm.tg(C.bg,x)){v=this.x0
-x=z.G()?z.Wn:null
-this.x0=x
-if(C.Nm.tg(C.bg,x)){x=this.x0
-u=H.eT([v,x])
-if(C.Nm.tg(C.G8,u)){x=z.G()?z.Wn:null
-this.x0=x
-if(x===61)x=v===33||v===61
-else x=!1
-if(x){t=u+"="
-this.x0=z.G()?z.Wn:null}else t=u}else t=H.Lw(v)}else t=H.Lw(v)
-y.push(new Y.qS(8,t,C.lx.t(0,t)))}else if(C.Nm.tg(C.iq,this.x0)){s=H.Lw(this.x0)
-y.push(new Y.qS(9,s,C.lx.t(0,s)))
-this.x0=z.G()?z.Wn:null}else this.x0=z.G()?z.Wn:null}return y},
-WG:function(){var z,y,x,w
-z=this.x0
-y=this.jI
-x=y.G()?y.Wn:null
-this.x0=x
-for(w=this.zy;x==null?z!=null:x!==z;){if(x==null)throw H.b(Y.RV("unterminated string"))
-if(x===92){x=y.G()?y.Wn:null
-this.x0=x
-if(x==null)throw H.b(Y.RV("unterminated string"))
-x=H.Lw(Y.wX(x))
-w.vM+=x}else{x=H.Lw(x)
-w.vM+=x}x=y.G()?y.Wn:null
-this.x0=x}this.MV.push(new Y.qS(1,w.vM,0))
-w.vM=""
-this.x0=y.G()?y.Wn:null},
-zI:function(){var z,y,x,w,v
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(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.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}v=y.vM
-z=this.MV
-if(C.Nm.tg(C.oP,v))z.push(new Y.qS(10,v,0))
-else z.push(new Y.qS(2,v,0))
-y.vM=""},
-jj:function(){var z,y,x,w
-z=this.jI
-y=this.zy
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-y.vM+=x
-this.x0=z.G()?z.Wn:null}if(x===46){z=z.G()?z.Wn:null
-this.x0=z
-if(typeof z!=="number")return H.s(z)
-if(48<=z&&z<=57)this.oz()
-else this.MV.push(new Y.qS(3,".",11))}else{this.MV.push(new Y.qS(6,y.vM,0))
-y.vM=""}},
-oz:function(){var z,y,x,w
-z=this.zy
-z.KF(H.Lw(46))
-y=this.jI
-while(!0){x=this.x0
-if(x!=null){if(typeof x!=="number")return H.s(x)
-w=48<=x&&x<=57}else w=!1
-if(!w)break
-x=H.Lw(x)
-z.vM+=x
-this.x0=y.G()?y.Wn:null}this.MV.push(new Y.qS(7,z.vM,0))
-z.vM=""}},
-hA:{
-"^":"a;G1>",
-bu:function(a){return"ParseException: "+this.G1},
-static:{RV:function(a){return new Y.hA(a)}}}}],["polymer_expressions.visitor","package:polymer_expressions/visitor.dart",,S,{
-"^":"",
-P55:{
-"^":"a;",
-DV:[function(a){return J.NV(a,this)},"$1","gay",2,0,181,143]},
-cfS:{
-"^":"P55;",
-xn:function(a){},
-W9:function(a){this.xn(a)},
-LT:function(a){a.wz.RR(0,this)
-this.xn(a)},
-fV:function(a){J.NV(a.gTf(),this)
-this.xn(a)},
-CU:function(a){J.NV(a.gTf(),this)
-J.NV(a.gJn(),this)
-this.xn(a)},
-ZR:function(a){var z
-J.NV(a.gTf(),this)
-if(a.gre()!=null)for(z=a.gre(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-oD:function(a){this.xn(a)},
-Zh:function(a){var z
-for(z=a.ghL(),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-o0:function(a){var z
-for(z=a.gRl(a),z=H.VM(new H.a7(z,z.length,0,null),[H.Kp(z,0)]);z.G();)J.NV(z.lo,this)
-this.xn(a)},
-YV:function(a){J.NV(a.gG3(a),this)
-J.NV(a.gv4(),this)
-this.xn(a)},
-qv:function(a){this.xn(a)},
-ex:function(a){J.NV(a.gBb(a),this)
-J.NV(a.gT8(a),this)
-this.xn(a)},
-Hx:function(a){J.NV(a.gwz(),this)
-this.xn(a)},
-RD:function(a){J.NV(a.gdc(),this)
-J.NV(a.gSl(),this)
-J.NV(a.gru(),this)
-this.xn(a)},
-kz:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)},
-xt:function(a){a.Bb.RR(0,this)
-a.T8.RR(0,this)
-this.xn(a)}}}],["script_inset_element","package:observatory/src/elements/script_inset.dart",,T,{
-"^":"",
-ov:{
-"^":"V42;oX,GR,cI,Bi=,xo,ZJ,Kf,Oq,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.oX},
-sIs:function(a,b){a.oX=this.ct(a,C.PX,a.oX,b)},
-gBV:function(a){return a.GR},
-sBV:function(a,b){a.GR=this.ct(a,C.tW,a.GR,b)},
-gMl:function(a){return a.cI},
-sMl:function(a,b){a.cI=this.ct(a,C.Gr,a.cI,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)},
-gGd:function(a){return a.Kf},
-sGd:function(a,b){a.Kf=this.ct(a,C.SA,a.Kf,b)},
-Es:function(a){Z.uL.prototype.Es.call(this,a)},
-rh:[function(a,b){this.mC(a)},"$1","grO",2,0,20,57],
-fX:[function(a,b){this.mC(a)},"$1","gIF",2,0,20,57],
-rA:[function(a,b){this.mC(a)},"$1","gP3",2,0,20,57],
-DJ:[function(a,b){if(b==null)return"min-width:32px;"
-else if(J.xC(b,0))return"min-width:32px; background-color:red"
-return"min-width:32px; background-color:green"},"$1","gfq",2,0,15,182],
-mC:function(a){var z,y,x
-if(a.Oq!=null)return
-if(J.iS(a.oX)!==!0){a.Oq=J.SK(a.oX).ml(new T.FW(a))
-return}z=a.GR
-z=z!=null?J.bI(a.oX.q6(z),1):0
-a.xo=this.ct(a,C.nt,a.xo,z)
-z=a.cI
-y=a.oX
-z=z!=null?y.q6(z):J.q8(J.de(y))
-a.ZJ=this.ct(a,C.vs,a.ZJ,z)
-z=a.Bi
-z.V1(z)
-for(x=a.xo;y=J.Wx(x),y.C(x,a.ZJ);x=y.g(x,1))z.h(0,x)},
-static:{"^":"bN,MRW,VnP",T5i:function(a){var z,y,x,w
-z=Q.ch(null,P.KN)
-y=R.tB([])
-x=P.L5(null,null,null,P.qU,W.I0)
-w=P.qU
-w=H.VM(new V.qC(P.YM(null,null,null,w,null),null,null),[w,null])
-a.Bi=z
-a.Kf=y
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=x
-a.ZQ=w
-C.Fa.ZL(a)
-C.Fa.XI(a)
-return a}}},
-V42:{
-"^":"uL+Pi;",
-$isd3:true},
-FW:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-if(J.iS(z.oX)===!0){z.Oq=null
-J.TG(z)}},"$1",null,2,0,null,14,"call"],
-$isEH:true}}],["script_ref_element","package:observatory/src/elements/script_ref.dart",,A,{
-"^":"",
-kn:{
-"^":"oEY;jJ,AP,fn,tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gBV:function(a){return a.jJ},
-sBV:function(a,b){a.jJ=this.ct(a,C.tW,a.jJ,b)},
-gJp:function(a){var z=a.tY
-if(z==null)return Q.xI.prototype.gJp.call(this,a)
-return z.gdN()},
-fX:[function(a,b){this.r6(a,null)},"$1","gIF",2,0,20,57],
-r6:[function(a,b){var z=a.tY
-if(z!=null&&J.iS(z)===!0){this.ct(a,C.YS,0,1)
-this.ct(a,C.Fh,0,1)}},"$1","gvo",2,0,20,14],
-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.gvo(a))}return Q.xI.prototype.goc.call(this,a)},
-gO3:function(a){var z,y
-if(a.tY==null)return Q.xI.prototype.gO3.call(this,a)
-if(J.J5(a.jJ,0)){z=J.iS(a.tY)
-y=a.tY
-if(z===!0)return Q.xI.prototype.gO3.call(this,a)+"#line="+H.d(y.q6(a.jJ))
-else J.SK(y).ml(this.gvo(a))}return Q.xI.prototype.gO3.call(this,a)},
-static:{D2:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.jJ=-1
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Yj.ZL(a)
-C.Yj.XI(a)
-return a}}},
-oEY:{
-"^":"xI+Pi;",
-$isd3:true}}],["script_view_element","package:observatory/src/elements/script_view.dart",,U,{
-"^":"",
-fI:{
-"^":"V43;Uz,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gIs:function(a){return a.Uz},
-sIs:function(a,b){a.Uz=this.ct(a,C.PX,a.Uz,b)},
-Es:function(a){var z
-Z.uL.prototype.Es.call(this,a)
-z=a.Uz
-if(z==null)return
-J.SK(z)},
-RF:[function(a,b){J.r0(a.Uz).Qy(b)},"$1","gvC",2,0,20,90],
-Ur:[function(a,b){J.eg(J.aT(a.Uz)).Qy(b)},"$1","gDX",2,0,20,90],
-static:{dI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.FH.ZL(a)
-C.FH.XI(a)
-return a}}},
-V43:{
-"^":"uL+Pi;",
-$isd3:true}}],["service","package:observatory/service.dart",,D,{
-"^":"",
-hi:function(a,b){var z,y,x,w,v,u,t,s,r
-if(b==null)return
-z=J.U6(b)
-z=z.t(b,"id")!=null&&z.t(b,"type")!=null
-if(!z)N.QM("").YX("Malformed service object: "+H.d(b))
-y=J.UQ(b,"type")
-z=J.rY(y)
-switch(z.nC(y,"@")?z.yn(y,1):y){case"Class":z=D.dy
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.dy
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.vO
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.dy
-t=[]
-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)),x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Code":z=[]
-z.$builtinTypeInfo=[D.Fc]
-x=[]
-x.$builtinTypeInfo=[D.Fc]
-w=D.DP
-v=[]
-v.$builtinTypeInfo=[w]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[w]
-w=P.KN
-u=D.uA
-t=new V.qC(P.YM(null,null,null,w,u),null,null)
-t.$builtinTypeInfo=[w,u]
-s=new D.kx(null,0,0,0,0,0,z,x,v,t,"","",null,null,null,!1,null,null,!1,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Error":s=new D.ft(null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Isolate":z=new V.qC(P.YM(null,null,null,null,null),null,null)
-z.$builtinTypeInfo=[null,null]
-x=P.L5(null,null,null,P.qU,D.af)
-w=[]
-w.$builtinTypeInfo=[P.qU]
-v=[]
-v.$builtinTypeInfo=[D.ER]
-u=D.dy
-t=[]
-t.$builtinTypeInfo=[u]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[u]
-u=D.U4
-r=[]
-r.$builtinTypeInfo=[u]
-r=new Q.wn(null,null,r,null,null)
-r.$builtinTypeInfo=[u]
-u=P.L5(null,null,null,P.qU,P.CP)
-u=R.tB(u)
-s=new D.bv(z,null,!1,!1,!0,!1,x,new D.tL(w,v,null,null,20,0),null,t,null,r,null,null,null,null,null,u,new D.eK(0,0,0,0,0,null,null),new D.eK(0,0,0,0,0,null,null),null,null,null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Library":z=D.U4
-x=[]
-x.$builtinTypeInfo=[z]
-x=new Q.wn(null,null,x,null,null)
-x.$builtinTypeInfo=[z]
-z=D.vx
-w=[]
-w.$builtinTypeInfo=[z]
-w=new Q.wn(null,null,w,null,null)
-w.$builtinTypeInfo=[z]
-z=D.dy
-v=[]
-v.$builtinTypeInfo=[z]
-v=new Q.wn(null,null,v,null,null)
-v.$builtinTypeInfo=[z]
-z=D.vO
-u=[]
-u.$builtinTypeInfo=[z]
-u=new Q.wn(null,null,u,null,null)
-u.$builtinTypeInfo=[z]
-z=D.vO
-t=[]
-t.$builtinTypeInfo=[z]
-t=new Q.wn(null,null,t,null,null)
-t.$builtinTypeInfo=[z]
-s=new D.U4(null,x,w,v,u,t,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceError":s=new D.N7(null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"ServiceException":s=new D.EP(null,null,null,null,null,a,null,null,!1,null,null,null,null,null)
-break
-case"Script":z=D.c2
-x=[]
-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,null,null,null,a,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,!1,null,null,null,null,null)
-break
-default: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,!1,null,null,null,null,null)}s.eC(b)
-return s},
-D5:function(a){var z
-if(a!=null){z=J.U6(a)
-z=z.t(a,"id")!=null&&z.t(a,"type")!=null}else z=!1
-return z},
-kT:function(a,b){var z=J.x(a)
-if(!!z.$isvO)return
-if(!!z.$isqC)D.yX(a,b)
-else if(!!z.$iswn)D.f3(a,b)},
-yX: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.ao,y=0;y<z.length;++y){x=z[y]
-w=J.x(x)
-v=!!w.$isqC
-if(v)u=w.t(x,"id")!=null&&w.t(x,"type")!=null
-else u=!1
-if(u)a.u(0,y,b.Qn(x))
-else if(!!w.$iswn)D.f3(x,b)
-else if(v)D.yX(x,b)}},
-af:{
-"^":"Pi;px@,t7@",
-gwv:function(a){var z=this.Q4
-return z.gwv(z)},
-god:function(a){var z=this.Q4
-return z.god(z)},
-gjO:function(a){return this.r0},
-gzS:function(){return this.mQ},
-gPj:function(a){return this.Q4.Mq(this.r0)},
-gox:function(a){return this.kT},
-gUm:function(){return!1},
-gfS:function(){return!1},
-goc:function(a){return this.gpx()},
-soc:function(a,b){this.spx(this.ct(this,C.YS,this.gpx(),b))},
-gdN:function(){return this.gt7()},
-sdN:function(a){this.st7(this.ct(this,C.Tc,this.gt7(),a))},
-xW:function(a){if(this.kT)return P.Ab(this,null)
-return this.RE(0)},
-RE:function(a){var z
-if(J.xC(this.r0,""))return P.Ab(this,null)
-if(this.kT&&this.gfS())return P.Ab(this,null)
-z=this.VR
-if(z==null){z=this.gwv(this).HL(this.gPj(this)).ml(new D.JM(this)).Qy(new D.Bf(this))
-this.VR=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.rY(x)
-if(w.nC(x,"@"))x=w.yn(x,1)
-w=this.r0
-if(w!=null&&!J.xC(w,z.t(a,"id")));this.r0=z.t(a,"id")
-this.mQ=x
-this.bF(0,a,y)},
-$isaf:true},
-JM:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=J.UQ(a,"type")
-y=J.rY(z)
-if(y.nC(z,"@"))z=y.yn(z,1)
-y=this.a
-if(!J.xC(z,y.mQ))return D.hi(y.Q4,a)
-y.eC(a)
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Bf:{
-"^":"Tp:69;b",
-$0:[function(){this.b.VR=null},"$0",null,0,0,null,"call"],
-$isEH:true},
-xm:{
-"^":"af;"},
-wv:{
-"^":"O1w;",
-gwv:function(a){return this},
-god:function(a){return},
-giR:function(){var z=this.z7
-return z.gUQ(z)},
-gPj:function(a){return H.d(this.r0)},
-Mq:[function(a){return H.d(a)},"$1","gLc",2,0,152,185],
-gYe:function(a){return this.Ox},
-gJk:function(){return this.RW},
-gA3:function(){return this.Ts},
-gEy:function(){return this.Va},
-gU6:function(){return this.bQ},
-gPE:function(){return this.l7},
-jq:function(a){var z,y,x,w
-z=$.rc().R4(0,a)
-if(z==null)return
-y=z.QK
-x=y.input
-w=y.index
-if(0>=y.length)return H.e(y,0)
-y=J.q8(y[0])
-if(typeof y!=="number")return H.s(y)
-return C.xB.yn(x,w+y)},
-TV:function(a){var z,y,x
-z=$.vo().R4(0,a)
-if(z==null)return""
-y=z.QK
-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)
-return J.Nj(a,0,x+y)},
-Qn:function(a){throw H.b(P.SY(null))},
-Tn:function(a){var z
-if(a==="")return P.Ab(null,null)
-z=this.z7.t(0,a)
-if(z!=null)return P.Ab(z,null)
-return this.RE(0).ml(new D.MZ(this,a))},
-cv:function(a){var z,y,x
-if(J.co(a,"isolates/")){z=this.TV(a)
-y=this.jq(a)
-return this.Tn(z).ml(new D.it(this,y))}x=this.yM.t(0,a)
-if(x!=null)return J.r0(x)
-return this.HL(a).ml(new D.lb(this,a))},
-nJm:[function(a,b){return b},"$2","ge1",4,0,77],
-ng:function(a){var z,y,x
-z=null
-try{y=new P.c5(this.ge1())
-z=P.jc(a,y.gqa())}catch(x){H.Ru(x)
-return}return R.tB(z)},
-N7:function(a){var z
-if(!D.D5(a)){z=P.EF(["type","ServiceException","id","","kind","FormatException","response",a,"message","Top level service responses must be service maps."],null,null)
-return P.Vu(D.hi(this,R.tB(z)),null,null)}z=J.U6(a)
-if(J.xC(z.t(a,"type"),"ServiceError"))return P.Vu(D.hi(this,a),null,null)
-else if(J.xC(z.t(a,"type"),"ServiceException"))return P.Vu(D.hi(this,a),null,null)
-return P.Ab(a,null)},
-HL:function(a){return this.z6(0,a).ml(new D.zA(this)).co(new D.tm(this),new D.mR()).co(new D.bp(this),new D.hc())},
-bF:function(a,b,c){var z,y
-if(c)return
-this.kT=!0
-z=J.U6(b)
-y=z.t(b,"version")
-this.Ox=F.Wi(this,C.zn,this.Ox,y)
-y=z.t(b,"architecture")
-this.GY=F.Wi(this,C.ke,this.GY,y)
-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.bQ=F.Wi(this,C.uI,this.bQ,y)
-y=z.t(b,"typeChecksEnabled")
-this.Va=F.Wi(this,C.J2,this.Va,y)
-this.l9(z.t(b,"isolates"))},
-l9:function(a){var z,y,x,w,v,u
-z=this.z7
-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)
-else{u=D.hi(this,w)
-y.u(0,v,u)
-N.QM("").To("New isolate '"+H.d(u.r0)+"'")}}y.aN(0,new D.y2())
-this.z7=y},
-md:function(){this.px=this.ct(this,C.YS,this.px,"vm")
-this.t7=this.ct(this,C.Tc,this.t7,"vm")
-this.yM.u(0,"vm",this)
-var z=P.EF(["id","vm","type","@VM"],null,null)
-this.eC(R.tB(z))},
-$iswv:true},
-O1w:{
-"^":"xm+Pi;",
-$isd3:true},
-MZ:{
-"^":"Tp:13;a,b",
-$1:[function(a){if(!J.x(a).$iswv)return
-return this.a.z7.t(0,this.b)},"$1",null,2,0,null,130,"call"],
-$isEH:true},
-it:{
-"^":"Tp:13;a,b",
-$1:[function(a){var z
-if(a==null)return this.a
-z=this.b
-if(z==null)return J.r0(a)
-else return a.cv(z)},"$1",null,2,0,null,7,"call"],
-$isEH:true},
-lb:{
-"^":"Tp:184;c,d",
-$1:[function(a){var z,y
-z=this.c
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.d,new D.zK(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-zK:{
-"^":"Tp:69;e",
-$0:function(){return this.e},
-$isEH:true},
-zA:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y,x,w
-z=null
-try{z=this.a.ng(a)}catch(x){w=H.Ru(x)
-y=w
-P.FL("Hit V8 bug.")
-w=P.EF(["type","ServiceException","id","","kind","DecodeException","response","This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.","message","Could not decode JSON: "+H.d(y)],null,null)
-w=R.tB(w)
-return P.Vu(D.hi(this.a,w),null,null)}return this.a.N7(z)},"$1",null,2,0,null,133,"call"],
-$isEH:true},
-tm:{
-"^":"Tp:13;b",
-$1:[function(a){var z=this.b.G2
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-mR:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isN7},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-bp:{
-"^":"Tp:13;c",
-$1:[function(a){var z=this.c.Li
-if(z.Gv>=4)H.vh(z.q7())
-z.Iv(a)
-return P.Vu(a,null,null)},"$1",null,2,0,null,86,"call"],
-$isEH:true},
-hc:{
-"^":"Tp:13;",
-$1:[function(a){return!!J.x(a).$isEP},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-y2:{
-"^":"Tp:77;",
-$2:function(a,b){J.r0(b)},
-$isEH:true},
-ER:{
-"^":"a;SP,XE>,wZ",
-eK:function(a){var z,y,x,w,v
-z=this.XE
-H.vf(z,0,a)
-for(y=z.length,x=0;x<y;++x){w=this.wZ
-v=z[x]
-if(typeof v!=="number")return H.s(v)
-this.wZ=w+v}},
-y8:function(a,b){var z,y,x,w,v,u,t
-for(z=this.XE,y=z.length,x=J.U6(a),w=b.length,v=0;v<y;++v){u=x.t(a,v)
-if(v>=w)return H.e(b,v)
-u=J.bI(u,b[v])
-z[v]=u
-t=this.wZ
-if(typeof u!=="number")return H.s(u)
-this.wZ=t+u}},
-k5:function(a,b){var z,y,x,w,v,u
-z=J.U6(b)
-y=this.XE
-x=y.length
-w=0
-while(!0){v=z.gB(b)
-if(typeof v!=="number")return H.s(v)
-if(!(w<v))break
-u=z.t(b,w)
-if(w>=x)return H.e(y,w)
-y[w]=J.z8(y[w],u)?y[w]:u;++w}},
-CJ:function(){var z,y,x
-for(z=this.XE,y=z.length,x=0;x<y;++x)z[x]=0},
-$isER:true},
-tL:{
-"^":"a;af<,lI<,h7,yP,hD,QS",
-gij:function(){return this.h7},
-xZ:function(a,b){var z,y,x,w,v,u
-this.h7=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.QS=J.q8(z.t(b,"counters"))
-for(z=this.hD,x=this.lI,w=0;v=this.QS,w<z;++w){if(typeof v!=="number")return H.s(v)
-v=Array(v)
-v.fixed$length=init
-v.$builtinTypeInfo=[P.KN]
-u=new D.ER(0,v,0)
-u.CJ()
-x.push(u)}if(typeof v!=="number")return H.s(v)
-z=Array(v)
-z.fixed$length=init
-z=new D.ER(0,H.VM(z,[P.KN]),0)
-this.yP=z
-z.eK(y)
-return}z=this.QS
-if(typeof z!=="number")return H.s(z)
-z=Array(z)
-z.fixed$length=init
-u=new D.ER(a,H.VM(z,[P.KN]),0)
-u.y8(y,this.yP.XE)
-this.yP.k5(0,y)
-z=this.lI
-z.push(u)
-if(z.length>this.hD)C.Nm.KI(z,0)}},
-eK:{
-"^":"Pi;mV,ob,pX,yp,uK,AP,fn",
-gSU:function(){return this.mV},
-gCs:function(){return this.ob},
-gMX:function(){return this.pX},
-gYk:function(){return this.yp},
-gpy:function(){return this.uK},
-eC:function(a){var z,y
-z=J.U6(a)
-y=z.t(a,"used")
-this.mV=F.Wi(this,C.LP,this.mV,y)
-y=z.t(a,"capacity")
-this.ob=F.Wi(this,C.bV,this.ob,y)
-y=z.t(a,"external")
-this.pX=F.Wi(this,C.h7,this.pX,y)
-y=z.t(a,"collections")
-this.yp=F.Wi(this,C.J6,this.yp,y)
-z=z.t(a,"time")
-this.uK=F.Wi(this,C.Jl,this.uK,z)}},
-bv:{
-"^":"uz4;V3,Jr,EY,eU,zG,XV,yM,GH,Z2,AI,v9,tW,zb,px:KT@,t7:f5@,i9,SF,Dr,UY<,xQ<,vJ,zf,BC<,FF,bj,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gwv:function(a){return this.Q4},
-god:function(a){return this},
-gXE:function(a){return this.V3},
-sXE:function(a,b){this.V3=F.Wi(this,C.bJ,this.V3,b)},
-gPj:function(a){return"/"+H.d(this.r0)},
-gBP:function(a){return this.Jr},
-gA6:function(){return this.EY},
-gaj:function(){return this.eU},
-gjz:function(){return this.zG},
-Mq:[function(a){return"/"+H.d(this.r0)+"/"+H.d(a)},"$1","gLc",2,0,152,185],
-N3:function(a){var z,y,x,w
-z=H.VM([],[D.kx])
-y=J.U6(a)
-for(x=J.mY(y.t(a,"codes"));x.G();)z.push(J.UQ(x.gl(),"code"))
-this.c2()
-this.pl(a,z)
-w=y.t(a,"exclusive_trie")
-if(w!=null)this.BC=this.Q3(w,z)},
-c2:function(){var z=this.yM
-z.gUQ(z).aN(0,new D.TV())},
-pl:function(a,b){var z,y,x,w
-z=J.U6(a)
-y=z.t(a,"codes")
-x=z.t(a,"samples")
-for(z=J.mY(y);z.G();){w=z.gl()
-J.UQ(w,"code").Il(w,b,x)}},
-Ms:[function(a){return this.cv("coverage").ml(this.gJJ())},"$0","gDX",0,0,186],
-cNN:[function(a){J.Me(J.UQ(a,"coverage"),new D.Yb(this))},"$1","gJJ",2,0,135,187],
-WR:function(){return this.cv("classes").ml(this.geL()).ml(this.gjR())},
-Dw:[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.YZ(z,!1)},"$1","geL",2,0,188,189],
-xk:[function(a){var z,y,x,w
-z=this.AI
-z.V1(z)
-this.Z2=F.Wi(this,C.as,this.Z2,null)
-for(y=J.mY(a);y.G();){x=y.gl()
-if(x.guj()==null)z.h(0,x)
-if(J.xC(x.gdN(),"Object")&&J.xC(x.gi2(),!1)){w=this.Z2
-if(this.gnz(this)&&!J.xC(w,x)){w=new T.qI(this,C.as,w,x)
-w.$builtinTypeInfo=[null]
-this.nq(this,w)}this.Z2=x}}return P.Ab(this.Z2,null)},"$1","gjR",2,0,190,191],
-Qn:function(a){var z,y,x
-if(a==null)return
-z=J.UQ(a,"id")
-y=this.yM
-x=y.t(0,z)
-if(x!=null)return x
-x=D.hi(this,a)
-if(x.gUm())y.u(0,z,x)
-return x},
-cv:function(a){var z=this.yM.t(0,a)
-if(z!=null)return J.r0(z)
-return this.Q4.HL("/"+H.d(this.r0)+"/"+H.d(a)).ml(new D.KQ(this,a))},
-gDZ:function(){return this.Z2},
-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)},
-gdN:function(){return this.f5},
-sdN:function(a){this.f5=F.Wi(this,C.Tc,this.f5,a)},
-geH:function(){return this.i9},
-gw2:function(){return this.SF},
-sw2:function(a){this.SF=F.Wi(this,C.tP,this.SF,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-WU:function(a){var z=J.U6(a)
-this.UY.eC(z.t(a,"new"))
-this.xQ.eC(z.t(a,"old"))},
-bF:function(a,b,c){var z,y,x,w,v,u,t,s,r,q,p
-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.Tc,this.f5,y)
-if(c)return
-this.kT=!0
-this.zG=F.Wi(this,C.DY,this.zG,!1)
-D.kT(b,this)
-if(z.t(b,"rootLib")==null||z.t(b,"timers")==null||z.t(b,"heaps")==null){N.QM("").YX("Malformed 'Isolate' response: "+H.d(b))
-return}y=z.t(b,"rootLib")
-this.v9=F.Wi(this,C.eN,this.v9,y)
-if(z.t(b,"entry")!=null){y=z.t(b,"entry")
-this.SF=F.Wi(this,C.tP,this.SF,y)}if(z.t(b,"topFrame")!=null){y=z.t(b,"topFrame")
-this.zb=F.Wi(this,C.bc,this.zb,y)}else this.zb=F.Wi(this,C.bc,this.zb,null)
-x=z.t(b,"tagCounters")
-if(x!=null){y=J.U6(x)
-w=y.t(x,"names")
-v=y.t(x,"counters")
-y=J.U6(v)
-u=0
-t=0
-while(!0){s=y.gB(v)
-if(typeof s!=="number")return H.s(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=R.tB(s)
-this.V3=F.Wi(this,C.bJ,this.V3,s)
-if(u===0){y=J.U6(w)
-t=0
-while(!0){s=y.gB(w)
-if(typeof s!=="number")return H.s(s)
-if(!(t<s))break
-J.kW(this.V3,y.t(w,t),"0.0%");++t}}else{s=J.U6(w)
-t=0
-while(!0){r=s.gB(w)
-if(typeof r!=="number")return H.s(r)
-if(!(t<r))break
-J.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.Dr
-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.ew(J.ew(J.ew(q.t(0,"time_script_loading"),q.t(0,"time_creating_snapshot")),q.t(0,"time_isolate_initialization")),q.t(0,"time_bootstrap")))
-s.u(y,"dart",q.t(0,"time_dart_execution"))
-this.WU(z.t(b,"heaps"))
-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.Bs,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.zf=F.Wi(this,C.yh,this.zf,y)
-y=this.tW
-y.V1(y)
-for(z=J.mY(z.t(b,"libraries"));z.G();)y.h(0,z.gl())
-y.GT(y,new D.hU())},
-m7:function(){return this.Q4.HL("/"+H.d(this.r0)+"/profile/tag").ml(new D.AP(this))},
-Q3:function(a,b){this.FF=0
-this.bj=a
-if(a==null)return
-if(J.u6(J.q8(a),3))return
-return this.AW(b)},
-AW:function(a){var z,y,x,w,v,u,t,s,r,q
-z=this.bj
-y=this.FF
-if(typeof y!=="number")return y.g()
-this.FF=y+1
-x=J.UQ(z,y)
-if(x>>>0!==x||x>=a.length)return H.e(a,x)
-w=a[x]
-y=this.bj
-z=this.FF
-if(typeof z!=="number")return z.g()
-this.FF=z+1
-v=J.UQ(y,z)
-z=[]
-z.$builtinTypeInfo=[D.t9]
-u=new D.t9(w,v,z,0)
-y=this.bj
-t=this.FF
-if(typeof t!=="number")return t.g()
-this.FF=t+1
-s=J.UQ(y,t)
-if(typeof s!=="number")return H.s(s)
-r=0
-for(;r<s;++r){q=this.AW(a)
-z.push(q)
-y=u.Jv
-t=q.Av
-if(typeof t!=="number")return H.s(t)
-u.Jv=y+t}return u},
-$isbv:true,
-static:{"^":"ZGx"}},
-uz4:{
-"^":"xm+Pi;",
-$isd3:true},
-TV:{
-"^":"Tp:13;",
-$1:function(a){if(!!J.x(a).$iskx){a.xM=F.Wi(a,C.Kj,a.xM,0)
-a.Du=0
-a.fF=0
-a.mM=F.Wi(a,C.eF,a.mM,"")
-a.qH=F.Wi(a,C.uU,a.qH,"")
-C.Nm.sB(a.VS,0)
-C.Nm.sB(a.hw,0)
-a.Oo.V1(0)}},
-$isEH:true},
-Yb:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-z.t(a,"script").SC(z.t(a,"hits"))},"$1",null,2,0,null,192,"call"],
-$isEH:true},
-KQ:{
-"^":"Tp:184;a,b",
-$1:[function(a){var z,y
-z=this.a
-y=D.hi(z,a)
-if(y.gUm())z.yM.to(this.b,new D.Ea(y))
-return y},"$1",null,2,0,null,183,"call"],
-$isEH:true},
-Ea:{
-"^":"Tp:69;c",
-$0:function(){return this.c},
-$isEH:true},
-Qq:{
-"^":"Tp:13;a",
-$1:[function(a){var z=J.U6(a)
-this.a.u(0,z.t(a,"name"),z.t(a,"time"))},"$1",null,2,0,null,193,"call"],
-$isEH:true},
-hU:{
-"^":"Tp:77;",
-$2:function(a,b){return J.oE(J.O6(a),J.O6(b))},
-$isEH:true},
-AP:{
-"^":"Tp:184;a",
-$1:[function(a){var z,y
-z=Date.now()
-new P.iP(z,!1).EK()
-y=this.a.GH
-y.xZ(z/1000,a)
-return y},"$1",null,2,0,null,146,"call"],
-$isEH:true},
-vO:{
-"^":"af;Ce,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gUm:function(){return(J.xC(this.mQ,"Class")||J.xC(this.mQ,"Function")||J.xC(this.mQ,"Field"))&&!J.co(this.r0,$.RQ)},
-gfS:function(){return!1},
-bu:function(a){return P.vW(this.Ce)},
-bF:function(a,b,c){var z,y,x
-this.kT=!c
-z=this.Ce
-z.V1(0)
-z.FV(0,b)
-y=z.Zp
-x=y.t(0,"user_name")
-this.px=this.ct(0,C.YS,this.px,x)
-y=y.t(0,"name")
-this.t7=this.ct(0,C.Tc,this.t7,y)
-D.kT(z,this.Q4)},
-FV:function(a,b){return this.Ce.FV(0,b)},
-V1:function(a){return this.Ce.V1(0)},
-aN:function(a,b){return this.Ce.Zp.aN(0,b)},
-t:function(a,b){return this.Ce.Zp.t(0,b)},
-u:function(a,b,c){this.Ce.u(0,b,c)
-return c},
-gl0:function(a){var z=this.Ce.Zp
-return z.gB(z)===0},
-gor:function(a){var z=this.Ce.Zp
-return z.gB(z)!==0},
-gvc:function(){return this.Ce.Zp.gvc()},
-gUQ:function(a){var z=this.Ce.Zp
-return z.gUQ(z)},
-gB:function(a){var z=this.Ce.Zp
-return z.gB(z)},
-HC:[function(a){var z=this.Ce
-return z.HC(z)},"$0","gDx",0,0,111],
-nq:function(a,b){var z=this.Ce
-return z.nq(z,b)},
-ct:function(a,b,c,d){return F.Wi(this.Ce,b,c,d)},
-k0:[function(a){return},"$0","gqw",0,0,18],
-NB:[function(a){this.Ce.AP=null
-return},"$0","gym",0,0,18],
-gqh:function(a){var z=this.Ce
-return z.gqh(z)},
-gnz:function(a){var z,y
-z=this.Ce.AP
-if(z!=null){y=z.iE
-z=y==null?z!=null:y!==z}else z=!1
-return z},
-$isvO:true,
-$isqC:true,
-$asqC:function(){return[null,null]},
-$isZ0:true,
-$asZ0:function(){return[null,null]},
-$isd3:true,
-static:{"^":"RQ"}},
-ft:{
-"^":"D3;I0,LD,jo,YS,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-gja:function(a){return this.jo},
-sja:function(a,b){this.jo=F.Wi(this,C.ne,this.jo,b)},
-bF:function(a,b,c){var z,y,x
-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.Q4
-x=D.hi(y,z.t(b,"exception"))
-this.jo=F.Wi(this,C.ne,this.jo,x)
-z=D.hi(y,z.t(b,"stacktrace"))
-this.YS=F.Wi(this,C.Pf,this.YS,z)
-z="DartError "+H.d(this.I0)
-z=this.ct(this,C.YS,this.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)}},
-D3:{
-"^":"af+Pi;",
-$isd3:true},
-N7:{
-"^":"wVq;I0,LD,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-bF:function(a,b,c){var z,y
-this.kT=!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.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)},
-$isN7:true},
-wVq:{
-"^":"af+Pi;",
-$isd3:true},
-EP:{
-"^":"dZL;I0,LD,IV,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gG1:function(a){return this.LD},
-gbA:function(a){return this.IV},
-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.px,z)
-this.px=z
-this.t7=this.ct(this,C.Tc,this.t7,z)},
-$isEP:true},
-dZL:{
-"^":"af+Pi;",
-$isd3:true},
-U4:{
-"^":"w8F;dj,Bm<,XR<,DD>,Z3<,mu<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gO3:function(a){return this.dj},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-y=z.t(b,"url")
-x=F.Wi(this,C.Fh,this.dj,y)
-this.dj=x
-if(J.co(x,"file://")||J.co(this.dj,"http://")){y=this.dj
-w=J.U6(y)
-v=w.cn(y,"/")
-if(typeof v!=="number")return v.g()
-x=w.yn(y,v+1)}y=z.t(b,"user_name")
-y=this.ct(this,C.YS,this.px,y)
-this.px=y
-if(J.FN(y)===!0)this.px=this.ct(this,C.YS,this.px,x)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-y=this.Bm
-y.V1(y)
-y.FV(0,z.t(b,"imports"))
-y=this.XR
-y.V1(y)
-y.FV(0,z.t(b,"scripts"))
-y=this.DD
-y.V1(y)
-y.FV(0,z.t(b,"classes"))
-y=this.Z3
-y.V1(y)
-y.FV(0,z.t(b,"variables"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))},
-$isU4:true},
-w8F:{
-"^":"af+Pi;",
-$isd3:true},
-mT:{
-"^":"Pi;wf,yg,AP,fn",
-gWt:function(){return this.wf},
-gfj:function(){return this.yg}},
-Iy:{
-"^":"a;bi<,l<",
-eC:function(a){var z,y,x
-z=this.bi
-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.yg=F.Wi(z,C.hN,z.yg,x)
-x=this.l
-z=J.ew(y.t(a,2),y.t(a,4))
-x.wf=F.Wi(x,C.yB,x.wf,z)
-y=J.ew(y.t(a,3),y.t(a,5))
-x.yg=F.Wi(x,C.hN,x.yg,y)},
-static:{"^":"jZx,xxx,qWF,oQ,S1O,wXu,WVi,Whu"}},
-dy:{
-"^":"V4b;Gz,ar,qX,Xj,vY,u0,J1,E8,Aj,zf,UY<,xQ<,ks>,S5<,tJ<,mu<,p2<,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gHt:function(a){return this.Gz},
-sHt:function(a,b){this.Gz=F.Wi(this,C.EV,this.Gz,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-guj:function(){return this.qX},
-suj:function(a){this.qX=F.Wi(this,C.Cw,this.qX,a)},
-gVM:function(){return this.Xj},
-gi2:function(){return this.J1},
-gVF:function(){return this.Aj},
-sVF:function(a){this.Aj=F.Wi(this,C.z6,this.Aj,a)},
-gkc:function(a){return this.zf},
-skc:function(a,b){this.zf=F.Wi(this,C.yh,this.zf,b)},
-gMp:function(){var z,y
-z=this.UY
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1
-if(z){z=this.xQ
-y=z.bi
-if(J.xC(y.wf,0)&&J.xC(y.yg,0)){z=z.l
-z=J.xC(z.wf,0)&&J.xC(z.yg,0)}else z=!1}else z=!1
-return z},
-gUm:function(){return!0},
-gfS:function(){return!1},
-bu:function(a){return"Service Class: "+H.d(this.t7)},
-bF:function(a,b,c){var z,y,x
-z=J.U6(b)
-y=z.t(b,"user_name")
-this.px=this.ct(this,C.YS,this.px,y)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-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.Xj=F.Wi(this,C.XH,this.Xj,y)
-y=z.t(b,"const")
-this.vY=F.Wi(this,C.bD,this.vY,y)
-y=z.t(b,"finalized")
-this.u0=F.Wi(this,C.WV,this.u0,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.Ih,this.E8,y)
-y=z.t(b,"tokenPos")
-this.Aj=F.Wi(this,C.z6,this.Aj,y)
-y=this.S5
-y.V1(y)
-y.FV(0,z.t(b,"subclasses"))
-y=this.tJ
-y.V1(y)
-y.FV(0,z.t(b,"fields"))
-y=this.mu
-y.V1(y)
-y.FV(0,z.t(b,"functions"))
-y=z.t(b,"super")
-y=F.Wi(this,C.Cw,this.qX,y)
-this.qX=y
-if(y!=null)y.Ib(this)
-y=z.t(b,"error")
-this.zf=F.Wi(this,C.yh,this.zf,y)
-x=z.t(b,"allocationStats")
-if(x!=null){z=J.U6(x)
-this.UY.eC(z.t(x,"new"))
-this.xQ.eC(z.t(x,"old"))}},
-Ib:function(a){var z=this.ks
-if(z.tg(z,a))return
-z.h(0,a)},
-cv:function(a){var z=this.Q4
-return z.god(z).cv(J.ew(this.r0,"/"+H.d(a)))},
-$isdy:true},
-V4b:{
-"^":"af+Pi;",
-$isd3:true},
-c2:{
-"^":"Pi;Rd<,a4>,x9,AP,fn",
-gu9:function(){return this.x9},
-su9:function(a){this.x9=F.Wi(this,C.Ss,this.x9,a)},
-$isc2:true},
-vx:{
-"^":"Zqa;Gd>,d6,I0,U9,nE,mB,wA,y6,FB,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-ghY:function(){return this.U9},
-shY:function(a){var z=this.U9
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.Gd,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.U9=a},
-gSK:function(){return this.nE},
-sSK:function(a){var z=this.nE
-if(this.gnz(this)&&!J.xC(z,a)){z=new T.qI(this,C.kA,z,a)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.nE=a},
-gUm:function(){return!0},
-gfS:function(){return!0},
-rK:function(a){var z,y
-z=J.bI(a,1)
-y=this.Gd.ao
-if(z>>>0!==z||z>=y.length)return H.e(y,z)
-return y[z]},
-q6:function(a){return this.y6.t(0,a)},
-bF:function(a,b,c){var z,y,x,w
-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.wA=y
-x=J.U6(y)
-w=x.cn(y,"/")
-if(typeof w!=="number")return w.g()
-w=x.yn(y,w+1)
-this.mB=w
-this.px=this.ct(this,C.YS,this.px,w)
-w=this.wA
-this.t7=this.ct(this,C.Tc,this.t7,w)
-this.W8(z.t(b,"source"))
-this.PT(z.t(b,"tokenPosTable"))},
-PT:function(a){var z,y,x,w,v,u,t,s,r
-if(a==null)return
-this.y6=P.Fl(null,null)
-this.FB=P.Fl(null,null)
-this.U9=F.Wi(this,C.Gd,this.U9,null)
-this.nE=F.Wi(this,C.kA,this.nE,null)
-for(z=J.mY(a);z.G();){y=z.gl()
-x=J.U6(y)
-w=x.t(y,0)
-v=1
-while(!0){u=x.gB(y)
-if(typeof u!=="number")return H.s(u)
-if(!(v<u))break
-t=x.t(y,v)
-s=x.t(y,v+1)
-u=this.U9
-if(u==null){if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.Gd,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.U9=t
-u=this.nE
-if(this.gnz(this)&&!J.xC(u,t)){u=new T.qI(this,C.kA,u,t)
-u.$builtinTypeInfo=[null]
-this.nq(this,u)}this.nE=t}else{u=J.Bl(u,t)?this.U9:t
-r=this.U9
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.Gd,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.U9=u
-u=J.J5(this.nE,t)?this.nE:t
-r=this.nE
-if(this.gnz(this)&&!J.xC(r,u)){r=new T.qI(this,C.kA,r,u)
-r.$builtinTypeInfo=[null]
-this.nq(this,r)}this.nE=u}this.y6.u(0,t,w)
-this.FB.u(0,t,s)
-v+=2}}},
-SC:function(a){var z,y,x,w,v,u,t
-z=J.U6(a)
-y=this.d6
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(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.ew(u,t):u)
-x+=2}this.zL()},
-W8:function(a){var z,y,x,w
-this.kT=!1
-if(a==null)return
-z=J.uH(a,"\n")
-if(z.length===0)return
-this.kT=!0
-y=this.Gd
-y.V1(y)
-N.QM("").To("Adding "+z.length+" source lines for "+H.d(this.wA))
-for(x=0;x<z.length;x=w){w=x+1
-y.h(0,new D.c2(w,z[x],null,null,null))}this.zL()},
-zL:function(){var z,y,x
-z=this.Gd
-if(z.ao.length===0)return
-for(z=z.gA(z),y=this.d6;z.G();){x=z.lo
-x.su9(y.t(0,x.gRd()))}},
-$isvx:true},
-Zqa:{
-"^":"af+Pi;",
-$isd3:true},
-uA:{
-"^":"a;Yu<,Du<,fF<",
-$isuA:true},
-xb:{
-"^":"Pi;Yu<,JP,VF<,YnP,fY>,ar,MT,AP,fn",
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gJz:function(){return this.MT},
-JM:[function(){var z,y
-z=this.JP
-y=J.x(z)
-if(y.n(z,-1))return"N/A"
-return y.bu(z)},"$0","gkA",0,0,194],
-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
-y=a.q6(z)
-if(y==null)return
-this.ar=F.Wi(this,C.PX,this.ar,a)
-z=J.dY(a.rK(y))
-this.MT=F.Wi(this,C.oI,this.MT,z)},
-$isxb:true},
-DP:{
-"^":"Pi;Yu<,jA,L4<,dh,uH<,AP,fn",
-gEB:function(){return this.dh},
-gUB:function(){return J.xC(this.Yu,0)},
-gGf:function(){return this.uH.ao.length>0},
-dV:[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,194],
-io:[function(a){var z
-if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
-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,195,71],
-HU:[function(a){var z
-if(a==null)return""
-z=a.gOo().Zp.t(0,this.Yu)
-if(z==null)return""
-return D.Tn(z.gDu(),a.glt())+" ("+H.d(z.gDu())+")"},"$1","gGK",2,0,195,71],
-eQ:function(){var z,y,x,w
-y=J.uH(this.L4," ")
-x=y.length
-if(x!==2)return 0
-if(1>=x)return H.e(y,1)
-z=y[1]
-if(J.co(z,"0x"))z=J.ZZ(z,2)
-try{x=H.BU(z,16,null)
-return x}catch(w){H.Ru(w)
-return 0}},
-Sd:function(a){var z,y,x,w,v
-z=this.L4
-if(!J.co(z,"j"))return
-y=this.eQ()
-x=J.x(y)
-if(x.n(y,0)){P.FL("Could not determine jump address for "+H.d(z))
-return}for(z=a.ao,w=0;w<z.length;++w){v=z[w]
-if(J.xC(v.gYu(),y)){z=this.dh
-if(this.gnz(this)&&!J.xC(z,v)){z=new T.qI(this,C.b5,z,v)
-z.$builtinTypeInfo=[null]
-this.nq(this,z)}this.dh=v
-return}}P.FL("Could not find instruction at "+x.WZ(y,16))},
-$isDP:true,
-static:{Tn:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-WAE:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Oci,pg,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
-N.QM("").j2("Unknown code kind "+H.d(a))
-throw H.b(P.EY())}}},
-Fc:{
-"^":"a;tT>,Av<",
-$isFc:true},
-t9:{
-"^":"a;tT>,Av<,ks>,Jv",
-$ist9:true},
-kx:{
-"^":"D3i;I0,xM,Du<,fF<,Oj,Mb,VS,hw,va<,Oo<,mM,qH,Ni,MO,ar,MH,oc*,dN@,TD,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-glt:function(){return this.xM},
-gS7:function(){return this.mM},
-gan:function(){return this.qH},
-gL1:function(){return this.Ni},
-sL1:function(a){this.Ni=F.Wi(this,C.zO,this.Ni,a)},
-gig:function(a){return this.MO},
-sig:function(a,b){this.MO=F.Wi(this,C.nf,this.MO,b)},
-gIs:function(a){return this.ar},
-sIs:function(a,b){this.ar=F.Wi(this,C.PX,this.ar,b)},
-gYG:function(){return this.MH},
-gUm:function(){return!0},
-gfS:function(){return!0},
-tx:[function(a){var z,y
-this.ar=F.Wi(this,C.PX,this.ar,a)
-for(z=this.va,z=z.gA(z);z.G();)for(y=z.lo.guH(),y=y.gA(y);y.G();)y.lo.bR(a)},"$1","gUH",2,0,196,197],
-OF:function(){if(this.ar!=null)return
-if(!J.xC(this.I0,C.l8))return
-var z=this.MO
-if(z==null)return
-if(J.UQ(z,"script")==null){J.SK(this.MO).ml(new D.Em(this))
-return}J.SK(J.UQ(this.MO,"script")).ml(this.gUH())},
-RE:function(a){if(J.xC(this.I0,C.l8))return D.af.prototype.RE.call(this,this)
-return P.Ab(this,null)},
-bd: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)
-if(!(y<x))break
-w=H.BU(z.t(b,y),null,null)
-v=H.BU(z.t(b,y+1),null,null)
-if(w>>>0!==w||w>=c.length)return H.e(c,w)
-a.push(new D.Fc(c[w],v))
-y+=2}H.rd(a,new D.fx())},
-Il:function(a,b,c){var z,y
-this.xM=F.Wi(this,C.Kj,this.xM,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.bd(this.VS,z.t(a,"callers"),b)
-this.bd(this.hw,z.t(a,"callees"),b)
-y=z.t(a,"ticks")
-if(y!=null)this.qL(y)
-z=D.Rd(this.fF,this.xM)+" ("+H.d(this.fF)+")"
-this.mM=F.Wi(this,C.eF,this.mM,z)
-z=D.Rd(this.Du,this.xM)+" ("+H.d(this.Du)+")"
-this.qH=F.Wi(this,C.uU,this.qH,z)},
-bF:function(a,b,c){var z,y,x,w,v
-z=J.U6(b)
-this.oc=z.t(b,"user_name")
-this.dN=z.t(b,"name")
-y=z.t(b,"isOptimized")!=null&&z.t(b,"isOptimized")
-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.Oj=H.BU(z.t(b,"start"),16,null)
-this.Mb=H.BU(z.t(b,"end"),16,null)
-y=this.Q4
-x=y.god(y).Qn(z.t(b,"function"))
-this.MO=F.Wi(this,C.nf,this.MO,x)
-y=y.god(y).Qn(z.t(b,"object_pool"))
-this.Ni=F.Wi(this,C.zO,this.Ni,y)
-w=z.t(b,"disassembly")
-if(w!=null)this.xs(w)
-v=z.t(b,"descriptors")
-if(v!=null)this.WY(J.UQ(v,"members"))
-z=this.va.ao
-this.kT=z.length!==0||!J.xC(this.I0,C.l8)
-z=z.length!==0&&J.xC(this.I0,C.l8)
-this.TD=F.Wi(this,C.zS,this.TD,z)},
-gUa:function(){return this.TD},
-xs:function(a){var z,y,x,w,v,u,t,s
-z=this.va
-z.V1(z)
-y=J.U6(a)
-x=0
-while(!0){w=y.gB(a)
-if(typeof w!=="number")return H.s(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.xb
-s=[]
-s.$builtinTypeInfo=[w]
-s=new Q.wn(null,null,s,null,null)
-s.$builtinTypeInfo=[w]
-z.h(0,new D.DP(t,v,u,null,s,null,null))
-x+=3}for(y=z.gA(z);y.G();)y.lo.Sd(z)},
-QX: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.lo
-if(J.xC(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))},
-WY:function(a){var z
-for(z=J.mY(a);z.G();)this.QX(z.gl())},
-qL:function(a){var z,y,x,w,v
-z=J.U6(a)
-y=this.Oo
-x=0
-while(!0){w=z.gB(a)
-if(typeof w!=="number")return H.s(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)))
-x+=3}},
-tg:function(a,b){J.J5(b,this.Oj)
-return!1},
-gkU:function(){return J.xC(this.I0,C.l8)},
-$iskx:true,
-static:{Rd:function(a,b){return C.CD.Sy(100*J.L9(a,b),2)+"%"}}},
-D3i:{
-"^":"af+Pi;",
-$isd3:true},
-Em:{
-"^":"Tp:13;a",
-$1:[function(a){var z,y
-z=this.a
-y=J.UQ(z.MO,"script")
-if(y==null)return
-J.SK(y).ml(z.gUH())},"$1",null,2,0,null,198,"call"],
-$isEH:true},
-fx:{
-"^":"Tp:77;",
-$2:function(a,b){return J.bI(b.gAv(),a.gAv())},
-$isEH:true},
-l8R:{
-"^":"a;uX",
-bu:function(a){return this.uX},
-static:{"^":"Ll,lTU,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.fO
-else if(z.n(a,"Pipe"))return C.FJ
-else if(z.n(a,"Internal"))return C.wj
-N.QM("").j2("Unknown socket kind "+H.d(a))
-throw H.b(P.EY())}}},
-WP:{
-"^":"Pqb;V8@,je,mI,I0,vu,DB,XK,FH,L7,Wu,tO,HO,kJ,Wm,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-gUm:function(){return!0},
-gHY:function(){return J.xC(this.I0,C.FJ)},
-gfY:function(a){return this.I0},
-sfY:function(a,b){this.I0=F.Wi(this,C.Lc,this.I0,b)},
-gyv: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},
-gkE:function(){return this.Wu},
-giP:function(){return this.tO},
-gLw:function(){return this.HO},
-gNS:function(){return this.kJ},
-guh:function(){return this.Wm},
-bF:function(a,b,c){var z,y
-z=J.U6(b)
-y=z.t(b,"name")
-this.px=this.ct(this,C.YS,this.px,y)
-y=z.t(b,"name")
-this.t7=this.ct(this,C.Tc,this.t7,y)
-y=D.AR(z.t(b,"kind"))
-this.I0=F.Wi(this,C.Lc,this.I0,y)
-if(c)return
-this.kT=!0
-y=this.Q4
-D.kT(b,y.god(y))
-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.kJ=F.Wi(this,C.dx,this.kJ,y)
-y=z.t(b,"remotePort")
-this.Wm=F.Wi(this,C.ni,this.Wm,y)
-y=z.t(b,"fd")
-this.Wu=F.Wi(this,C.R3,this.Wu,y)
-this.V8=z.t(b,"owner")}},
-Pqb:{
-"^":"af+Pi;",
-$isd3:true},
-Qf:{
-"^":"Tp:77;a,b",
-$2:function(a,b){var z,y
-z=J.x(b)
-y=!!z.$isqC
-if(y&&D.D5(b))this.a.u(0,a,this.b.Qn(b))
-else if(!!z.$iswn)D.f3(b,this.b)
-else if(y)D.yX(b,this.b)},
-$isEH:true}}],["service_error_view_element","package:observatory/src/elements/service_error_view.dart",,R,{
-"^":"",
-zM:{
-"^":"V44;S4,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gkc:function(a){return a.S4},
-skc:function(a,b){a.S4=this.ct(a,C.yh,a.S4,b)},
-static:{cE:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.n8.ZL(a)
-C.n8.XI(a)
-return a}}},
-V44:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_exception_view_element","package:observatory/src/elements/service_exception_view.dart",,D,{
-"^":"",
-Rk:{
-"^":"V45;Xc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gja:function(a){return a.Xc},
-sja:function(a,b){a.Xc=this.ct(a,C.ne,a.Xc,b)},
-static:{bZp:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Vd.ZL(a)
-C.Vd.XI(a)
-return a}}},
-V45:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_html","package:observatory/service_html.dart",,U,{
-"^":"",
-XK:{
-"^":"wv;Jf,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-z6:function(a,b){var z
-if(J.VT(this.Jf,"/")&&J.co(b,"/"))b=J.ZZ(b,1)
-N.QM("").To("Fetching "+H.d(b)+" from "+H.d(this.Jf))
-z=this.Jf
-if(typeof z!=="string")return z.g()
-return W.lt(J.ew(z,b),null,null,null,P.EF(["Observatory-Version","1.0"],null,null),null,null,null).ml(new U.dT()).OA(new U.E7())},
-eY:function(){this.Jf="http://"+H.d(window.location.host)+"/"}},
-dT:{
-"^":"Tp:200;",
-$1:[function(a){return J.Du(a)},"$1",null,2,0,null,199,"call"],
-$isEH:true},
-E7:{
-"^":"Tp:13;",
-$1:[function(a){var z,y
-N.QM("").YX("HttpRequest.request failed.")
-z=J.l2(a)
-y=J.RE(z)
-return C.xr.KP(P.EF(["type","ServiceException","id","","response",y.gxN(z),"kind","NetworkException","message","Could not connect to service ("+H.d(y.gpo(z))+"). Check that you started the VM with the following flags: --observe"],null,null))},"$1",null,2,0,null,24,"call"],
-$isEH:true},
-ho:{
-"^":"wv;S3,yb,Ox,GY,RW,Ts,Va,bQ,l7,Li,G2,yM,z7,AP,fn,Q4,r0,mQ,kT,px,t7,VR,AP,fn",
-q3:[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)
-z.Rz(0,y)
-J.KD(v,w)},"$1","gVx",2,0,20,72],
-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)
-J.iA(W.Pv(window.parent),C.xr.KP(y),"*")
-return x.MM},
-PI:function(){var z=H.VM(new W.RO(window,C.ph.Ph,!1),[null])
-H.VM(new W.Ov(0,z.DK,z.Ph,W.aF(this.gVx()),z.Sg),[H.Kp(z,0)]).Zz()
-N.QM("").To("Connected to DartiumVM")}}}],["service_object_view_element","package:observatory/src/elements/service_view.dart",,U,{
-"^":"",
-Ti:{
-"^":"V46;Ll,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gWA:function(a){return a.Ll},
-sWA:function(a,b){a.Ll=this.ct(a,C.td,a.Ll,b)},
-Xq:function(a){var z
-switch(a.Ll.gzS()){case"AllocationProfile":z=W.r3("heap-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"BreakpointList":z=W.r3("breakpoint-list",null)
-J.oJ(z,a.Ll)
-return z
-case"Class":z=W.r3("class-view",null)
-J.NZ(z,a.Ll)
-return z
-case"Code":z=W.r3("code-view",null)
-J.T5(z,a.Ll)
-return z
-case"Error":z=W.r3("error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"Field":z=W.r3("field-view",null)
-J.JZ(z,a.Ll)
-return z
-case"FlagList":z=W.r3("flag-list",null)
-J.vJ(z,a.Ll)
-return z
-case"Function":z=W.r3("function-view",null)
-J.C3(z,a.Ll)
-return z
-case"HeapMap":z=W.r3("heap-map",null)
-J.Nf(z,a.Ll)
-return z
-case"LibraryPrefix":case"TypeRef":case"TypeParameter":case"BoundedType":case"Int32x4":case"Float32x4":case"Float64x4":case"TypedData":case"ExternalTypedData":case"Capability":case"ReceivePort":case"SendPort":case"Stacktrace":case"JSRegExp":case"WeakProperty":case"MirrorReference":case"UserTag":case"Type":case"Array":case"Bool":case"Closure":case"Double":case"GrowableObjectArray":case"Instance":case"Smi":case"Mint":case"Bigint":case"String":z=W.r3("instance-view",null)
-J.Qy(z,a.Ll)
-return z
-case"IO":z=W.r3("io-view",null)
-J.mU(z,a.Ll)
-return z
-case"HttpServerList":z=W.r3("io-http-server-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"HttpServer":z=W.r3("io-http-server-view",null)
-J.fb(z,a.Ll)
-return z
-case"HttpServerConnection":z=W.r3("io-http-server-connection-view",null)
-J.i0(z,a.Ll)
-return z
-case"SocketList":z=W.r3("io-socket-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"Socket":z=W.r3("io-socket-view",null)
-J.Cu(z,a.Ll)
-return z
-case"WebSocketList":z=W.r3("io-web-socket-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"WebSocket":z=W.r3("io-web-socket-view",null)
-J.tH(z,a.Ll)
-return z
-case"Isolate":z=W.r3("isolate-view",null)
-J.uM(z,a.Ll)
-return z
-case"Library":z=W.r3("library-view",null)
-J.cl(z,a.Ll)
-return z
-case"ProcessList":z=W.r3("io-process-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"Process":z=W.r3("io-process-view",null)
-J.aw(z,a.Ll)
-return z
-case"Profile":z=W.r3("isolate-profile",null)
-J.CJ(z,a.Ll)
-return z
-case"RandomAccessFileList":z=W.r3("io-random-access-file-list-view",null)
-J.A4(z,a.Ll)
-return z
-case"RandomAccessFile":z=W.r3("io-random-access-file-view",null)
-J.fR(z,a.Ll)
-return z
-case"ServiceError":z=W.r3("service-error-view",null)
-J.Qr(z,a.Ll)
-return z
-case"ServiceException":z=W.r3("service-exception-view",null)
-J.BC(z,a.Ll)
-return z
-case"Script":z=W.r3("script-view",null)
-J.ZI(z,a.Ll)
-return z
-case"StackTrace":z=W.r3("stack-trace",null)
-J.yO(z,a.Ll)
-return z
-case"VM":z=W.r3("vm-view",null)
-J.tQ(z,a.Ll)
-return z
-default:z=W.r3("json-view",null)
-J.wD(z,a.Ll)
-return z}},
-rm:[function(a,b){var z,y,x
-this.pj(a)
-z=a.Ll
-if(z==null){N.QM("").To("Viewing null object.")
-return}y=z.gzS()
-x=this.Xq(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,13,57],
-$isTi:true,
-static:{HP:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.Ns.ZL(a)
-C.Ns.XI(a)
-return a}}},
-V46:{
-"^":"uL+Pi;",
-$isd3:true}}],["service_ref_element","package:observatory/src/elements/service_ref.dart",,Q,{
-"^":"",
-xI:{
-"^":"pv;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gnv:function(a){return a.tY},
-snv:function(a,b){a.tY=this.ct(a,C.xP,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))
-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,20,57],
-gO3:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-z=J.Ds(z)
-$.W5.toString
-return"#"+H.d(z)},
-gJp:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return z.gdN()},
-goc:function(a){var z=a.tY
-if(z==null)return"NULL REF"
-return J.O6(z)},
-gWw:function(a){return J.FN(this.goc(a))},
-static:{fd:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.HRc.ZL(a)
-C.HRc.XI(a)
-return a}}},
-pv:{
-"^":"uL+Pi;",
-$isd3:true}}],["sliding_checkbox_element","package:observatory/src/elements/sliding_checkbox.dart",,Q,{
-"^":"",
-CY:{
-"^":"KAf;kF,IK,bP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-RC:[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,102,1,201,95],
-static:{Sm:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.zb.ZL(a)
-C.zb.XI(a)
-return a}}},
-KAf:{
-"^":"xc+Pi;",
-$isd3:true}}],["smoke","package:smoke/smoke.dart",,A,{
-"^":"",
-Wq:{
-"^":"a;c1,IW,Mg,nN,ER,Ja,WI,tu",
-WO:function(a,b){return this.tu.$1(b)},
-bu:function(a){var z=P.p9("")
-z.KF("(options:")
-z.KF(this.c1?"fields ":"")
-z.KF(this.IW?"properties ":"")
-z.KF(this.Ja?"methods ":"")
-z.KF(this.Mg?"inherited ":"_")
-z.KF(this.ER?"no finals ":"")
-z.KF("annotations: "+H.d(this.WI))
-z.KF(this.tu!=null?"with matcher":"")
-z.KF(")")
-return z.vM}},
-ES:{
-"^":"a;oc>,fY>,V5>,t5>,Fo,Dv<",
-gZI:function(){return this.fY===C.nU},
-gUd:function(){return this.fY===C.BM},
-gUA:function(){return this.fY===C.WH},
-giO:function(a){var z=this.oc
-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("")
-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(")")
-return z.vM},
-$isES:true},
-iYn:{
-"^":"a;fY>"}}],["smoke.src.common","package:smoke/src/common.dart",,X,{
-"^":"",
-Na:function(a,b,c){var z,y
-z=a.length
-if(z<b){y=Array(b)
-y.fixed$length=init
-H.qG(y,0,z,a,0)
-return y}if(z>c){z=Array(c)
-z.fixed$length=init
-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.Kp(a,0)]
-for(;z.G();){y=z.lo
-b.length
-x=new H.a7(b,1,0,null)
-x.$builtinTypeInfo=[H.Kp(b,0)]
-w=J.x(y)
-for(;x.G();){v=x.lo
-if(w.n(y,v))return!0
-if(!!J.x(v).$isuq){u=w.gbx(y)
-u=$.mX().dM(u,v)}else u=!1
-if(u)return!0}}return!1},
-OS:function(a){var z,y
-z=H.G3()
-y=H.KT(z).BD(a)
-if(y)return 0
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-z=H.KT(z,[z,z,z]).BD(a)
-if(z)return 3
-return 4},
-RI:function(a){var z,y
-z=H.G3()
-y=H.KT(z,[z,z,z]).BD(a)
-if(y)return 3
-y=H.KT(z,[z,z]).BD(a)
-if(y)return 2
-y=H.KT(z,[z]).BD(a)
-if(y)return 1
-z=H.KT(z).BD(a)
-if(z)return 0
-return-1},
-W4:function(a,b,c){var z,y,x,w,v
-z=a.length
-y=b.length
-if(z!==y)return!1
-if(c){x=P.Ls(null,null,null,null)
-x.FV(0,b)
-for(w=0;w<a.length;++w)if(!x.tg(0,a[w]))return!1}else for(w=0;w<z;++w){v=a[w]
-if(w>=y)return H.e(b,w)
-if(v!==b[w])return!1}return!0}}],["smoke.src.implementation","package:smoke/src/implementation.dart",,D,{
-"^":"",
-kP:function(){throw H.b(P.FM("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)."))}}],["smoke.static","package:smoke/static.dart",,O,{
-"^":"",
-Oj:{
-"^":"a;E4e,AH,lk,XO,Yp,af<,yQ"},
-fH:{
-"^":"a;eA,vk,X9",
-jD:function(a,b){var z=this.eA.t(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.vk.t(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
-z=null
-if(!!J.x(a).$isuq){this.X9.t(0,a)
-z=null}else{x=this.eA.t(0,b)
-z=x==null?null:x.$1(a)}if(z==null)throw H.b(O.lA("method \""+H.d(b)+"\" in "+H.d(a)))
-y=null
-if(d){w=X.OS(z)
-if(w>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,w,P.y(w,J.q8(c)))}else{v=X.RI(z)
-u=v>=0?v:J.q8(c)
-c=X.Na(c,w,u)}}try{u=H.im(z,c,P.Te(null))
-return u}catch(t){if(!!J.x(H.Ru(t)).$isJS){if(y!=null)P.FL(y)
-throw t}else throw t}}},
-bY:{
-"^":"a;TB,WF,wa",
-dM:function(a,b){var z,y,x
-if(a.n(0,b)||b.n(0,C.FQ))return!0
-for(z=this.TB;!J.xC(a,C.FQ);a=y){y=z.t(0,a)
-x=J.x(y)
-if(x.n(y,b))return!0
-if(y==null){if(!this.wa)return!1
-throw H.b(O.lA("superclass of \""+H.d(a)+"\" ("+x.bu(y)+")"))}}return!1},
-UK:function(a,b){var z=this.F1(a,b)
-return z!=null&&z.fY===C.WH&&!z.Fo},
-n6:function(a,b){var z,y
-z=this.WF.t(0,a)
-if(z==null){if(!this.wa)return!1
-throw H.b(O.lA("declarations for "+H.d(a)))}y=z.t(0,b)
-return y!=null&&y.fY===C.WH&&y.Fo},
-CV:function(a,b){var z=this.F1(a,b)
-if(z==null){if(!this.wa)return
-throw H.b(O.lA("declaration for "+H.d(a)+"."+H.d(b)))}return z},
-Me:function(a,b,c){var z,y,x,w,v,u
-z=[]
-if(c.Mg){y=this.TB.t(0,b)
-if(y==null){if(this.wa)throw H.b(O.lA("superclass of \""+H.d(b)+"\""))}else if(!y.n(0,c.nN))z=this.Me(0,y,c)}x=this.WF.t(0,b)
-if(x==null){if(!this.wa)return z
-throw H.b(O.lA("declarations for "+H.d(b)))}for(w=J.mY(x.gUQ(x));w.G();){v=w.gl()
-if(!c.c1&&v.gZI())continue
-if(!c.IW&&v.gUd())continue
-if(c.ER&&J.Z6(v)===!0)continue
-if(!c.Ja&&v.gUA())continue
-if(c.tu!=null&&c.WO(0,J.O6(v))!==!0)continue
-u=c.WI
-if(u!=null&&!X.ZO(v.gDv(),u))continue
-z.push(v)}return z},
-F1:function(a,b){var z,y,x,w,v
-for(z=this.TB,y=this.WF;!J.xC(a,C.FQ);a=v){x=y.t(0,a)
-if(x!=null){w=x.t(0,b)
-if(w!=null)return w}v=z.t(0,a)
-if(v==null){if(!this.wa)return
-throw H.b(O.lA("superclass of \""+H.d(a)+"\""))}}return}},
-ut:{
-"^":"a;ep,Nz",
-Ut:function(a){this.ep.aN(0,new O.m8(this))},
-static:{ty:function(a){var z=new O.ut(a.af,P.Fl(null,null))
-z.Ut(a)
-return z}}},
-m8:{
-"^":"Tp:77;a",
-$2:function(a,b){this.a.Nz.u(0,b,a)},
-$isEH:true},
-tk:{
-"^":"a;GB",
-bu:function(a){return"Missing "+this.GB+". Code generation for the smoke package seems incomplete."},
-static:{lA:function(a){return new O.tk(a)}}}}],["stack_frame_element","package:observatory/src/elements/stack_frame.dart",,K,{
-"^":"",
-nm:{
-"^":"V47;xP,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gM6:function(a){return a.xP},
-sM6:function(a,b){a.xP=this.ct(a,C.rE,a.xP,b)},
-static:{an:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dX.ZL(a)
-C.dX.XI(a)
-return a}}},
-V47:{
-"^":"uL+Pi;",
-$isd3:true}}],["stack_trace_element","package:observatory/src/elements/stack_trace.dart",,X,{
-"^":"",
-uw:{
-"^":"V48;ju,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-gtN:function(a){return a.ju},
-stN:function(a,b){a.ju=this.ct(a,C.kw,a.ju,b)},
-RF:[function(a,b){J.r0(a.ju).Qy(b)},"$1","gvC",2,0,20,90],
-static:{HI:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.wB.ZL(a)
-C.wB.XI(a)
-return a}}},
-V48:{
-"^":"uL+Pi;",
-$isd3:true}}],["template_binding","package:template_binding/template_binding.dart",,M,{
-"^":"",
-AD:function(a,b,c,d){var z,y
-if(c){z=null!=d&&!1!==d
-y=J.RE(a)
-if(z)y.gQg(a).MW.setAttribute(b,"")
-else y.gQg(a).Rz(0,b)}else{z=J.Vs(a)
-y=d==null?"":H.d(d)
-z.MW.setAttribute(b,y)}},
-y9:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return M.wp(a)?a:null},
-wp:function(a){var z=J.x(a)
-return!!z.$isQF||!!z.$isI0||!!z.$ishy},
-Lj:function(a,b){var z,y,x,w,v,u
-z=M.pN(a,b)
-if(z==null)z=new M.PW([],null,null)
-for(y=J.RE(a),x=y.gPZ(a),w=null,v=0;x!=null;x=x.nextSibling,++v){u=M.Lj(x,b)
-if(u==null)continue
-if(w==null){w=Array(y.gyT(a).NL.childNodes.length)
-w.fixed$length=init}if(v>=w.length)return H.e(w,v)
-w[v]=u}z.ks=w
-return z},
-X7:function(a,b,c,d,e,f,g,h){var z,y,x,w
-z=b.appendChild(J.Lh(c,a,!1))
-for(y=a.firstChild,x=d!=null,w=0;y!=null;y=y.nextSibling,++w)M.X7(y,z,c,x?d.JW(w):null,e,f,g,null)
-if(d.ghK()){M.Ky(z).bt(a)
-if(f!=null)J.Co(M.Ky(z),f)}M.mV(z,d,e,g)
-return z},
-tA:function(a){var z
-for(;z=J.TmB(a),z!=null;a=z);return a},
-cS:function(a,b){var z,y,x,w,v,u
-if(b==null||b==="")return
-z="#"+H.d(b)
-for(;!0;){a=M.tA(a)
-y=$.It()
-y.toString
-x=H.of(a,"expando$values")
-w=x==null?null:H.of(x,y.J4())
-y=w==null
-if(!y&&w.gO5()!=null)v=J.Eh(w.gO5(),z)
-else{u=J.x(a)
-v=!!u.$isQF||!!u.$isI0||!!u.$ishy?u.Kb(a,b):null}if(v!=null)return v
-if(y)return
-a=w.gCi()
-if(a==null)return}},
-fX:function(a,b,c){if(c==null)return
-return new M.aR(a,b,c)},
-pN:function(a,b){var z,y
-z=J.x(a)
-if(!!z.$ish4)return M.F5(a,b)
-if(!!z.$ismw){y=S.iw(a.textContent,M.fX("text",a,b))
-if(y!=null)return new M.PW(["text",y],null,null)}return},
-rJ:function(a,b,c){var z=a.getAttribute(b)
-if(z==="")z="{{}}"
-return S.iw(z,M.fX(b,a,c))},
-F5:function(a,b){var z,y,x,w,v,u
-z={}
-z.a=null
-y=M.CF(a)
-new W.E9(a).aN(0,new M.Uk(z,a,b,y))
-if(y){x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-v=new M.qf(null,null,null,z,null,null)
-z=M.rJ(a,"if",b)
-v.qd=z
-x=M.rJ(a,"bind",b)
-v.fu=x
-u=M.rJ(a,"repeat",b)
-v.cw=u
-if(z!=null&&x==null&&u==null)v.fu=S.iw("{{}}",M.fX("bind",a,b))
-return v}z=z.a
-return z==null?null:new M.PW(z,null,null)},
-KH:function(a,b,c,d){var z,y,x,w,v,u,t
-if(b.gqz()){z=b.HH(0)
-y=z!=null?z.$3(d,c,!0):b.Pn(0).Tl(d)
-return b.gaW()?y:b.qm(y)}x=J.U6(b)
-w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-v=Array(w)
-v.fixed$length=init
-w=v.length
-u=0
-while(!0){t=x.gB(b)
-if(typeof t!=="number")return H.s(t)
-if(!(u<t))break
-z=b.HH(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)},
-GZ:function(a,b,c,d){var z,y,x,w,v,u,t,s
-if(b.geq())return M.KH(a,b,c,d)
-if(b.gqz()){z=b.HH(0)
-if(z!=null)y=z.$3(d,c,!1)
-else{x=b.Pn(0)
-x=!!J.x(x).$isTv?x:L.hk(x)
-w=$.ps
-$.ps=w+1
-y=new L.WR(x,d,null,w,null,null,null)}return b.gaW()?y:new Y.Qw(y,b.gEO(),null,null,null)}x=$.ps
-$.ps=x+1
-y=new L.ww(null,[],x,null,null,null)
-y.Wf=[]
-x=J.U6(b)
-v=0
-while(!0){w=x.gB(b)
-if(typeof w!=="number")return H.s(w)
-if(!(v<w))break
-c$0:{u=b.AX(v)
-z=b.HH(v)
-if(z!=null){t=z.$3(d,c,u)
-if(u===!0)y.ti(t)
-else{if(y.GX!=null||y.cb==null)H.vh(P.w("Cannot add observers once started."))
-J.mu(t,y.gjM())
-w=y.cb
-w.push(C.dV)
-w.push(t)}break c$0}s=b.Pn(v)
-if(u===!0)y.ti(s.Tl(d))
-else y.yN(d,s)}++v}return new Y.Qw(y,b.gEO(),null,null,null)},
-mV:function(a,b,c,d){var z,y,x,w,v,u,t,s,r,q,p
-z=J.RE(b)
-y=z.gCd(b)
-x=!!J.x(a).$isvy?a:M.Ky(a)
-for(w=J.U6(y),v=J.RE(x),u=0;u<w.gB(y);u+=2){t=w.t(y,u)
-s=w.t(y,u+1)
-r=v.nR(x,t,M.GZ(t,s,a,c),s.geq())
-if(r!=null&&!0)d.push(r)}v.Vz(x)
-if(!z.$isqf)return
-q=M.Ky(a)
-q.sQ2(c)
-p=q.A5(b)
-if(p!=null&&!0)d.push(p)},
-Ky:function(a){var z,y,x,w
-z=$.cm()
-z.toString
-y=H.of(a,"expando$values")
-x=y==null?null:H.of(y,z.J4())
-if(x!=null)return x
-w=J.x(a)
-if(!!w.$isMi)x=new M.ee(a,null,null)
-else if(!!w.$isbs)x=new M.ug(a,null,null)
-else if(!!w.$isAE)x=new M.bH(a,null,null)
-else if(!!w.$ish4){if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(w.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(a))===!0))w=a.tagName==="template"&&w.gKD(a)==="http://www.w3.org/2000/svg"
-else w=!0
-else w=!0
-x=w?new M.DT(null,null,null,!1,null,null,null,null,null,null,a,null,null):new M.V2(a,null,null)}else x=!!w.$ismw?new M.XT(a,null,null):new M.vy(a,null,null)
-z.u(0,a,x)
-return x},
-CF:function(a){var z=J.x(a)
-if(!!z.$ish4)if(!(a.tagName==="TEMPLATE"&&a.namespaceURI==="http://www.w3.org/1999/xhtml"))if(!(z.gQg(a).MW.hasAttribute("template")===!0&&C.z5.x4(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;cJ",
-US:function(a,b,c){return},
-static:{"^":"ac"}},
-V2:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z,y,x,w,v,u
-z={}
-z.a=b
-y=this.grF()
-x=J.x(y)
-w=!!x.$isQlt&&J.xC(z.a,"value")
-v=z.a
-if(w){new W.E9(y).Rz(0,v)
-if(d)return this.nD(c)
-x=this.ge2()
-x.$1(J.mu(c,x))}else{u=J.VT(v,"?")
-if(u){x.gQg(y).Rz(0,z.a)
-x=z.a
-w=J.U6(x)
-z.a=w.Nj(x,0,J.bI(w.gB(x),1))}if(d)return M.AD(this.grF(),z.a,u,c)
-x=new M.IoZ(z,this,u)
-x.$1(J.mu(c,x))}z=z.a
-return $.rK?this.Un(z,c):c},
-nD:[function(a){var z,y,x,w,v,u,t,s
-z=this.grF()
-y=J.RE(z)
-x=y.gBy(z)
-w=J.x(x)
-if(!!w.$isbs){v=J.C5(M.Ky(x))
-if(v!=null){u=J.UQ(v,"value")
-if(!!J.x(u).$isb2){t=x.value
-s=u}else{t=null
-s=null}}else{t=null
-s=null}}else{t=null
-s=null}y.sP(z,a==null?"":H.d(a))
-if(s!=null&&!J.xC(w.gP(x),t)){y=w.gP(x)
-J.ta(s.gvt(),y)}},"$1","ge2",2,0,20,58]},
-IoZ:{
-"^":"Tp:13;a,b,c",
-$1:[function(a){return M.AD(this.b.grF(),this.a.a,this.c,a)},"$1",null,2,0,null,65,"call"],
-$isEH:true},
-b2:{
-"^":"Ap;rF<,E3,vt<,jS",
-zJ:[function(a){return M.pw(this.rF,a,this.jS)},"$1","ghZ",2,0,20,58],
-O2A:[function(a){var z,y,x,w,v
-switch(this.jS){case"value":z=J.Vm(this.rF)
-J.ta(this.vt,z)
-break
-case"checked":z=this.rF
-y=J.RE(z)
-x=y.gd4(z)
-J.ta(this.vt,x)
-if(!!y.$isMi&&J.xC(y.gt5(z),"radio"))for(z=J.mY(M.pt(z));z.G();){w=z.gl()
-v=J.UQ(J.C5(!!J.x(w).$isvy?w:M.Ky(w)),"checked")
-if(v!=null)J.ta(v,!1)}break
-case"selectedIndex":z=J.Lr(this.rF)
-J.ta(this.vt,z)
-break}O.N0()},"$1","gCL",2,0,20,1],
-TR:function(a,b){return J.mu(this.vt,b)},
-gP:function(a){return J.Vm(this.vt)},
-sP:function(a,b){J.ta(this.vt,b)
-return b},
-S6:function(a){var z=this.E3
-if(z!=null){z.ed()
-this.E3=null}z=this.vt
-if(z!=null){J.x0(z)
-this.vt=null}},
-$isb2:true,
-static:{"^":"S8",pw:function(a,b,c){switch(c){case"checked":J.Ae(a,null!=b&&!1!==b)
-return
-case"selectedIndex":J.dk(a,M.h5(b))
-return
-case"value":J.ta(a,b==null?"":H.d(b))
-return}},IP:function(a){var z=J.x(a)
-if(!!z.$isQlt)return H.VM(new W.eu(a,C.i3.Ph,!1),[null])
-switch(z.gt5(a)){case"checkbox":return $.FF().LX(a)
-case"radio":case"select-multiple":case"select-one":return z.gEr(a)
-case"range":if(J.x5(window.navigator.userAgent,new H.VR("Trident|MSIE",H.ol("Trident|MSIE",!1,!0,!1),null,null)))return z.gEr(a)
-break}return z.gLm(a)},pt:function(a){var z,y,x
-z=J.RE(a)
-if(z.gMB(a)!=null){z=z.gMB(a)
-z.toString
-z=new W.wi(z)
-return z.ad(z,new M.qx(a))}else{y=M.y9(a)
-if(y==null)return C.dn
-x=J.MK(y,"input[type=\"radio\"][name=\""+H.d(z.goc(a))+"\"]")
-return x.ad(x,new M.y4(a))}},h5:function(a){if(typeof a==="string")return H.BU(a,null,new M.LG())
-return typeof a==="number"&&Math.floor(a)===a?a:0}}},
-Ufa:{
-"^":"Tp:69;",
-$0:function(){var z,y,x,w,v
-z=document.createElement("div",null).appendChild(W.ED(null))
-y=J.RE(z)
-y.st5(z,"checkbox")
-x=[]
-w=y.gVl(z)
-H.VM(new W.Ov(0,w.DK,w.Ph,W.aF(new M.pp(x)),w.Sg),[H.Kp(w,0)]).Zz()
-y=y.gEr(z)
-H.VM(new W.Ov(0,y.DK,y.Ph,W.aF(new M.ik(x)),y.Sg),[H.Kp(y,0)]).Zz()
-y=window
-v=document.createEvent("MouseEvent")
-J.Dh(v,"click",!0,!0,y,0,0,0,0,0,!1,!1,!1,!1,0,null)
-z.dispatchEvent(v)
-return x.length===1?C.U3:C.Nm.gtH(x)},
-$isEH:true},
-pp:{
-"^":"Tp:13;a",
-$1:[function(a){this.a.push(C.T1)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-ik:{
-"^":"Tp:13;b",
-$1:[function(a){this.b.push(C.U3)},"$1",null,2,0,null,1,"call"],
-$isEH:true},
-qx:{
-"^":"Tp:13;a",
-$1:function(a){var z,y
-z=this.a
-y=J.x(a)
-if(!y.n(a,z))if(!!y.$isMi)if(a.type==="radio"){y=a.name
-z=J.O6(z)
-z=y==null?z==null:y===z}else z=!1
-else z=!1
-else z=!1
-return z},
-$isEH:true},
-y4:{
-"^":"Tp:13;b",
-$1:function(a){var z=J.x(a)
-return!z.n(a,this.b)&&z.gMB(a)==null},
-$isEH:true},
-LG:{
-"^":"Tp:13;",
-$1:function(a){return 0},
-$isEH:true},
-ee:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-z=J.x(b)
-if(!z.n(b,"value")&&!z.n(b,"checked"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-PW:{
-"^":"a;Cd>,ks>,jb>",
-ghK:function(){return!1},
-JW:function(a){var z=this.ks
-if(z==null||a>=z.length)return
-if(a>=z.length)return H.e(z,a)
-return z[a]}},
-qf:{
-"^":"PW;qd,fu,cw,Cd,ks,jb",
-ghK:function(){return!0},
-$isqf:true},
-vy:{
-"^":"a;rF<,Cd*,Vw?",
-nR:function(a,b,c,d){var z
-window
-z="Unhandled binding to Node: "+H.a5(this)+" "+H.d(b)+" "+H.d(c)+" "+d
-if(typeof console!="undefined")console.error(z)
-return},
-Vz:function(a){},
-gCn:function(a){var z=this.Vw
-if(z!=null);else if(J.Lp(this.grF())!=null){z=J.Lp(this.grF())
-z=J.fe(!!J.x(z).$isvy?z:M.Ky(z))}else z=null
-return z},
-Un:function(a,b){var z,y
-z=this.Cd
-if(z==null){z=P.Fl(null,null)
-this.Cd=z}y=z.t(0,a)
-if(y!=null)J.x0(y)
-this.Cd.u(0,a,b)
-return b},
-$isvy:true},
-DH:{
-"^":"a;k8>,EA,Po"},
-ug:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(J.xC(b,"selectedindex"))b="selectedIndex"
-z=J.x(b)
-if(!z.n(b,"selectedIndex")&&!z.n(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return this.Un(b,y)}},
-DT:{
-"^":"V2;Q2?,nF,os<,xU,q4?,IO?,M5?,le,VZ,q8,rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"ref"))return M.V2.prototype.nR.call(this,this,b,c,d)
-z=d?c:J.mu(c,new M.pi(this))
-J.Vs(this.rF).MW.setAttribute("ref",z)
-this.aX()
-if(d)return
-return this.Un("ref",c)},
-A5:function(a){var z=this.os
-if(z!=null)z.NC()
-if(a.qd==null&&a.fu==null&&a.cw==null){z=this.os
-if(z!=null){z.S6(0)
-this.os=null}return}z=this.os
-if(z==null){z=new M.aY(this,[],[],null,!1,null,null,null,null,null,null,null,!1,null,null)
-this.os=z}z.dE(a,this.Q2)
-J.ZW($.pT(),this.rF,["ref"],!0)
-return this.os},
-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.nF
-z=this.q8
-if(z==null){z=this.gNK()
-z=J.NQ(!!J.x(z).$isvy?z:M.Ky(z))
-this.q8=z}y=J.RE(z)
-if(y.gPZ(z)==null)return $.zl()
-x=c==null?$.HT():c
-w=x.cJ
-if(w==null){w=H.VM(new P.qo(null),[null])
-x.cJ=w}v=w.t(0,z)
-if(v==null){v=M.Lj(z,x)
-x.cJ.u(0,z,v)}w=this.le
-if(w==null){u=J.Do(this.rF)
-w=$.Lu()
-t=w.t(0,u)
-if(t==null){t=u.implementation.createHTMLDocument("")
-$.AA().u(0,t,!0)
-M.lo(t)
-w.u(0,u,t)}this.le=t
-w=t}s=J.mx(w)
-w=[]
-r=new M.NK(w,null,null,null)
-q=$.It()
-r.Ci=this.rF
-r.O5=z
-q.u(0,s,r)
-p=new M.DH(b,null,null)
-M.Ky(s).sVw(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.X7(o,s,this.le,l,b,c,w,null)
-M.Ky(k).sVw(p)
-if(m)r.Qo=k}p.EA=s.firstChild
-p.Po=s.lastChild
-r.O5=null
-r.Ci=null
-return s},
-gk8:function(a){return this.Q2},
-gzH:function(a){return this.nF},
-szH:function(a,b){var z
-if(this.nF!=null)throw H.b(P.w("Template must be cleared before a new bindingDelegate can be assigned"))
-this.nF=b
-this.VZ=null
-z=this.os
-if(z!=null){z.Wv=!1
-z.LH=null
-z.TC=null}},
-aX:function(){var z,y
-if(this.os!=null){z=this.q8
-y=this.gNK()
-y=J.NQ(!!J.x(y).$isvy?y:M.Ky(y))
-y=z==null?y==null:z===y
-z=y}else z=!0
-if(z)return
-this.q8=null
-this.os.Io(null)
-this.os.vr(null)},
-V1:function(a){var z,y
-this.Q2=null
-this.nF=null
-z=this.Cd
-if(z!=null){y=z.Rz(0,"ref")
-if(y!=null)J.x0(y)}this.q8=null
-z=this.os
-if(z==null)return
-z.Io(null)
-this.os.S6(0)
-this.os=null},
-gNK:function(){var z,y
-this.GC()
-z=M.cS(this.rF,J.Vs(this.rF).MW.getAttribute("ref"))
-if(z==null){z=this.q4
-if(z==null)return this.rF}y=M.Ky(z).gNK()
-return y!=null?y:z},
-gjb:function(a){var z
-this.GC()
-z=this.IO
-return z!=null?z:H.Go(this.rF,"$isOH").content},
-bt:function(a){var z,y,x,w,v,u,t
-if(this.M5===!0)return!1
-M.oR()
-M.HS()
-this.M5=!0
-z=!!J.x(this.rF).$isOH
-y=!z
-if(y){x=this.rF
-w=J.RE(x)
-if(w.gQg(x).MW.hasAttribute("template")===!0&&C.z5.x4(w.gqn(x))===!0){if(a!=null)throw H.b(P.u("instanceRef should not be supplied for attribute templates."))
-v=M.pZ(this.rF)
-v=!!J.x(v).$isvy?v:M.Ky(v)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH
-u=!0}else{x=this.rF
-w=J.RE(x)
-if(w.gns(x)==="template"&&w.gKD(x)==="http://www.w3.org/2000/svg"){x=this.rF
-w=J.RE(x)
-t=w.gM0(x).createElement("template",null)
-w.gBy(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.Ky(t)
-v.sM5(!0)
-z=!!J.x(v.grF()).$isOH}else{v=this
-z=!1}u=!1}}else{v=this
-u=!1}if(!z)v.sIO(J.mx(M.TA(v.grF())))
-if(a!=null)v.sq4(a)
-else if(y)M.O1(v,this.rF,u)
-else M.GM(J.NQ(v))
-return!0},
-GC:function(){return this.bt(null)},
-$isDT:true,
-static:{"^":"mn,EW,YO,vU,xV,kY",TA:function(a){var z,y,x,w
-z=J.Do(a)
-if(W.Pv(z.defaultView)==null)return z
-y=$.LQ().t(0,z)
-if(y==null){y=z.implementation.createHTMLDocument("")
-for(;x=y.lastChild,x!=null;){w=x.parentNode
-if(w!=null)w.removeChild(x)}$.LQ().u(0,z,y)}return y},pZ:function(a){var z,y,x,w,v,u
-z=J.RE(a)
-y=z.gM0(a).createElement("template",null)
-z.gBy(a).insertBefore(y,a)
-for(x=C.Nm.br(z.gQg(a).gvc()),x=H.VM(new H.a7(x,x.length,0,null),[H.Kp(x,0)]);x.G();){w=x.lo
-switch(w){case"template":v=z.gQg(a).MW
-v.getAttribute(w)
-v.removeAttribute(w)
-break
-case"repeat":case"bind":case"ref":y.toString
-v=z.gQg(a).MW
-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.NQ(a)
-if(c){J.TQ(z,b)
-return}for(y=J.RE(b),x=J.RE(z);w=y.gPZ(b),w!=null;)x.mx(z,w)},GM:function(a){var z,y
-z=new M.CE()
-y=J.MK(a,$.Ze())
-if(M.CF(a))z.$1(a)
-y.aN(y,z)},oR:function(){if($.vU===!0)return
-$.vU=!0
-var z=document.createElement("style",null)
-J.t3(z,H.d($.Ze())+" { display: none; }")
-document.head.appendChild(z)},HS:function(){var z,y
-if($.xV===!0)return
-$.xV=!0
-z=document.createElement("template",null)
-if(!!J.x(z).$isOH){y=z.content.ownerDocument
-if(y.documentElement==null)y.appendChild(y.createElement("html",null)).appendChild(y.createElement("head",null))
-if(J.m5(y).querySelector("base")==null)M.lo(y)}},lo:function(a){var z=a.createElement("base",null)
-J.O5(z,document.baseURI)
-J.m5(a).appendChild(z)}}},
-pi:{
-"^":"Tp:13;a",
-$1:[function(a){var z=this.a
-J.Vs(z.rF).MW.setAttribute("ref",a)
-z.aX()},"$1",null,2,0,null,202,"call"],
-$isEH:true},
-CE:{
-"^":"Tp:20;",
-$1:function(a){if(!M.Ky(a).bt(null))M.GM(J.NQ(!!J.x(a).$isvy?a:M.Ky(a)))},
-$isEH:true},
-MdQ:{
-"^":"Tp:13;",
-$1:[function(a){return H.d(a)+"[template]"},"$1",null,2,0,null,121,"call"],
-$isEH:true},
-DOe:{
-"^":"Tp:77;",
-$2:[function(a,b){var z
-for(z=J.mY(a);z.G();)M.Ky(J.l2(z.gl())).aX()},"$2",null,4,0,null,161,14,"call"],
-$isEH:true},
-lPa:{
-"^":"Tp:69;",
-$0:function(){var z=document.createDocumentFragment()
-$.It().u(0,z,new M.NK([],null,null,null))
-return z},
-$isEH:true},
-NK:{
-"^":"a;u2<,Qo<,Ci<,O5<"},
-aR:{
-"^":"Tp:13;a,b,c",
-$1:function(a){return this.c.US(a,this.a,this.b)},
-$isEH:true},
-Uk:{
-"^":"Tp:77;a,b,c,d",
-$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")
-else z=!1
-if(z)return
-y=S.iw(b,M.fX(a,this.b,this.c))
-if(y!=null){z=this.a
-x=z.a
-if(x==null){w=[]
-z.a=w
-z=w}else z=x
-z.push(a)
-z.push(y)}},
-$isEH:true},
-aY:{
-"^":"Ap;bE,Rj,vy,qg,ky,vL,wC,D2,cM,qe,ur,VC,Wv,LH,TC",
-RV:function(a){return this.LH.$1(a)},
-TR:function(a,b){return H.vh(P.w("binding already opened"))},
-gP:function(a){return this.wC},
-NC:function(){var z,y
-z=this.vL
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.vL=null}z=this.wC
-y=J.x(z)
-if(!!y.$isAp){y.S6(z)
-this.wC=null}},
-dE:function(a,b){var z,y,x
-this.NC()
-z=this.bE.rF
-y=a.qd
-x=y!=null
-this.D2=x
-this.cM=a.cw!=null
-if(x){this.qe=y.eq
-y=M.GZ("if",y,z,b)
-this.vL=y
-if(this.qe===!0){if(!(null!=y&&!1!==y)){this.vr(null)
-return}}else H.Go(y,"$isAp").TR(0,this.gNt())}if(this.cM===!0){y=a.cw
-this.ur=y.eq
-y=M.GZ("repeat",y,z,b)
-this.wC=y}else{y=a.fu
-this.ur=y.eq
-y=M.GZ("bind",y,z,b)
-this.wC=y}if(this.ur!==!0)J.mu(y,this.gNt())
-this.vr(null)},
-vr:[function(a){var z,y
-if(this.D2===!0){z=this.vL
-if(this.qe!==!0){H.Go(z,"$isAp")
-z=z.gP(z)}if(!(null!=z&&!1!==z)){this.Io([])
-return}}y=this.wC
-if(this.ur!==!0){H.Go(y,"$isAp")
-y=y.gP(y)}this.Io(this.cM!==!0?[y]:y)},"$1","gNt",2,0,20,14],
-Io:function(a){var z,y
-z=J.x(a)
-if(!z.$isWO)a=!!z.$isQV?z.br(a):[]
-z=this.vy
-if(a===z)return
-this.Ke()
-this.qg=a
-if(!!J.x(a).$iswn&&this.cM===!0&&this.ur!==!0){if(a.gb3()!=null)a.sb3([])
-this.VC=a.gQV().yI(this.gU0())}y=this.qg
-y=y!=null?y:[]
-this.Vi(G.jj(y,0,J.q8(y),z,0,z.length))},
-xS:function(a){var z,y,x,w
-if(J.xC(a,-1))return this.bE.rF
-z=$.It()
-y=this.Rj
-if(a>>>0!==a||a>=y.length)return H.e(y,a)
-x=z.t(0,y[a]).gQo()
-if(x==null)return this.xS(a-1)
-if(!M.CF(x)||x===this.bE.rF)return x
-w=M.Ky(x).gos()
-if(w==null)return x
-return w.xS(w.Rj.length-1)},
-ne:function(a){var z,y,x,w,v,u,t
-z=this.xS(J.bI(a,1))
-y=this.xS(a)
-J.TmB(this.bE.rF)
-x=C.Nm.KI(this.Rj,a)
-for(w=J.RE(x),v=J.RE(z);!J.xC(y,z);){u=v.guD(z)
-if(u==null?y==null:u===y)y=z
-t=u.parentNode
-if(t!=null)t.removeChild(u)
-w.mx(x,u)}return x},
-Vi:[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.ky||J.FN(a)===!0)return
-u=this.bE
-t=u.rF
-if(J.TmB(t)==null){this.S6(0)
-return}s=this.vy
-Q.Y5(s,this.qg,a)
-z=u.nF
-if(!this.Wv){this.Wv=!0
-r=J.Xp(!!J.x(u.rF).$isDT?u.rF:u)
-if(r!=null){this.LH=r.Mn.CE(t)
-this.TC=null}}q=P.YM(P.N3R(),null,null,null,null)
-for(p=J.w1(a),o=p.gA(a),n=0;o.G();){m=o.gl()
-for(l=m.gRt(),l=l.gA(l),k=J.RE(m);l.G();){j=l.lo
-i=this.ne(J.ew(k.gvH(m),n))
-if(!J.xC(i,$.zl()))q.u(0,j,i)}l=m.gNg()
-if(typeof l!=="number")return H.s(l)
-n-=l}for(p=p.gA(a);p.G();){m=p.gl()
-for(o=J.RE(m),h=o.gvH(m);J.u6(h,J.ew(o.gvH(m),m.gNg()));++h){if(h>>>0!==h||h>=s.length)return H.e(s,h)
-y=s[h]
-x=q.Rz(0,y)
-if(x==null)try{if(this.LH!=null)y=this.RV(y)
-if(y==null)x=$.zl()
-else x=u.ZK(0,y,z)}catch(g){l=H.Ru(g)
-w=l
-v=new H.XO(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.Gv!==0)H.vh(P.w("Future already completed"))
-l.CG(k,v)
-x=$.zl()}l=x
-f=this.xS(h-1)
-e=J.TmB(u.rF)
-C.Nm.xe(this.Rj,h,l)
-e.insertBefore(l,J.p7(f))}}for(u=q.gUQ(q),u=H.VM(new H.MH(null,J.mY(u.l6),u.T6),[H.Kp(u,0),H.Kp(u,1)]);u.G();)this.Ep(u.lo)},"$1","gU0",2,0,203,204],
-Ep:[function(a){var z,y,x
-z=$.It()
-z.toString
-y=H.of(a,"expando$values")
-x=(y==null?null:H.of(y,z.J4())).gu2()
-z=new H.a7(x,x.length,0,null)
-z.$builtinTypeInfo=[H.Kp(x,0)]
-for(;z.G();)J.x0(z.lo)},"$1","gV6",2,0,205],
-Ke:function(){var z=this.VC
-if(z==null)return
-z.ed()
-this.VC=null},
-S6:function(a){var z
-if(this.ky)return
-this.Ke()
-z=this.Rj
-H.bQ(z,this.gV6())
-C.Nm.sB(z,0)
-this.NC()
-this.bE.os=null
-this.ky=!0}},
-XT:{
-"^":"vy;rF,Cd,Vw",
-nR:function(a,b,c,d){var z
-if(!J.xC(b,"text"))return M.vy.prototype.nR.call(this,this,b,c,d)
-if(d){z=c==null?"":H.d(c)
-J.t3(this.rF,z)
-return}z=this.gmt()
-z.$1(J.mu(c,z))
-return $.rK?this.Un(b,c):c},
-ux:[function(a){var z=a==null?"":H.d(a)
-J.t3(this.rF,z)},"$1","gmt",2,0,13,21]},
-bH:{
-"^":"V2;rF,Cd,Vw",
-grF:function(){return this.rF},
-nR:function(a,b,c,d){var z,y,x
-if(!J.xC(b,"value"))return M.V2.prototype.nR.call(this,this,b,c,d)
-J.Vs(this.rF).Rz(0,b)
-if(d){M.pw(this.rF,c,b)
-return}z=this.rF
-y=new M.b2(z,null,c,b)
-y.E3=M.IP(z).yI(y.gCL())
-x=y.ghZ()
-M.pw(z,J.mu(y.vt,x),b)
-return $.rK?this.Un(b,y):y}}}],["template_binding.src.mustache_tokens","package:template_binding/src/mustache_tokens.dart",,S,{
-"^":"",
-jb:{
-"^":"a;iB,eq<,O0",
-gqz:function(){return this.iB.length===5},
-gaW:function(){var z,y
-z=this.iB
-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
-return z},
-gEO:function(){return this.O0},
-qm:function(a){return this.gEO().$1(a)},
-gB:function(a){return C.jn.cU(this.iB.length,4)},
-AX:function(a){var z,y
-z=this.iB
-y=a*4+1
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-Pn:function(a){var z,y
-z=this.iB
-y=a*4+2
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-HH:function(a){var z,y
-z=this.iB
-y=a*4+3
-if(y>=z.length)return H.e(z,y)
-return z[y]},
-ln:[function(a){var z,y,x,w
-if(a==null)a=""
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=H.d(z[0])+H.d(a)
-x=z.length
-w=C.jn.cU(x,4)*4
-if(w>=x)return H.e(z,w)
-return y+H.d(z[w])},"$1","geb",2,0,206,21],
-Xb:[function(a){var z,y,x,w,v,u,t,s
-z=this.iB
-if(0>=z.length)return H.e(z,0)
-y=P.p9(z[0])
-x=C.jn.cU(z.length,4)
-for(w=J.U6(a),v=0;v<x;){u=w.t(a,v)
-if(u!=null)y.vM+=typeof u==="string"?u:H.d(u);++v
-t=v*4
-if(t>=z.length)return H.e(z,t)
-s=z[t]
-y.vM+=typeof s==="string"?s:H.d(s)}return y.vM},"$1","gqt",2,0,207,208],
-l3:function(a,b){this.O0=this.iB.length===5?this.geb():this.gqt()},
-static:{"^":"rz5,xN8,t3a,epG,oM,Ftg",iw:function(a,b){var z,y,x,w,v,u,t,s,r,q,p,o,n,m
-if(a==null||a.length===0)return
-z=a.length
-for(y=b==null,x=J.U6(a),w=null,v=0,u=!0;v<z;){t=x.XU(a,"{{",v)
-s=C.xB.XU(a,"[[",v)
-if(s>=0)r=t<0||s<t
-else r=!1
-if(r){t=s
-q=!0
-p="]]"}else{q=!1
-p="}}"}o=t>=0?C.xB.XU(a,p,t+2):-1
-if(o<0){if(w==null)return
-w.push(C.xB.yn(a,v))
-break}if(w==null)w=[]
-w.push(C.xB.Nj(a,v,t))
-n=C.xB.bS(C.xB.Nj(a,t+2,o))
-w.push(q)
-u=u&&q
-m=y?null:b.$1(n)
-if(m==null)w.push(L.hk(n))
-else w.push(null)
-w.push(m)
-v=o+2}if(v===z)w.push("")
-y=new S.jb(w,u,null)
-y.l3(w,u)
-return y}}}}],["vm_ref_element","package:observatory/src/elements/vm_ref.dart",,X,{
-"^":"",
-I5:{
-"^":"xI;tY,Pe,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-static:{pn:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Pe=!1
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.u2.ZL(a)
-C.u2.XI(a)
-return a}}}}],["vm_view_element","package:observatory/src/elements/vm_view.dart",,U,{
-"^":"",
-el:{
-"^":"V49;uB,lc,AP,fn,AP,fn,IX,q9,Sa,Uk,oq,Wz,q1,SD,XN,Xy,ZQ",
-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)},
-RF:[function(a,b){J.r0(a.uB).Qy(b)},"$1","gvC",2,0,20,90],
-static:{oH:function(a){var z,y
-z=P.L5(null,null,null,P.qU,W.I0)
-y=P.qU
-y=H.VM(new V.qC(P.YM(null,null,null,y,null),null,null),[y,null])
-a.Sa=[]
-a.q1=!1
-a.XN=!1
-a.Xy=z
-a.ZQ=y
-C.dm.ZL(a)
-C.dm.XI(a)
-return a}}},
-V49:{
-"^":"uL+Pi;",
-$isd3:true}}],])
-I.$finishClasses($$,$,null)
-$$=null
-P.KN.$isKN=true
-P.KN.$isRz=true
-P.KN.$asRz=[P.FK]
-P.KN.$isa=true
-P.CP.$isCP=true
-P.CP.$isRz=true
-P.CP.$asRz=[P.FK]
-P.CP.$isa=true
-W.KV.$isKV=true
-W.KV.$isa=true
-W.vKL.$isa=true
-W.QI.$isa=true
-P.qU.$isqU=true
-P.qU.$isRz=true
-P.qU.$asRz=[P.qU]
-P.qU.$isa=true
-P.FK.$isRz=true
-P.FK.$asRz=[P.FK]
-P.FK.$isa=true
-N.qV.$isRz=true
-N.qV.$asRz=[N.qV]
-N.qV.$isa=true
-P.a6.$isa6=true
-P.a6.$isRz=true
-P.a6.$asRz=[P.a6]
-P.a6.$isa=true
-W.h4.$ish4=true
-W.h4.$isKV=true
-W.h4.$isa=true
-P.WO.$isWO=true
-P.WO.$isQV=true
-P.WO.$isa=true
-P.oz.$isa=true
-P.a.$isa=true
-P.ns.$isa=true
-K.Aep.$isAep=true
-K.Aep.$isa=true
-U.mc.$ishw=true
-U.mc.$isa=true
-U.cJ.$ishw=true
-U.cJ.$isa=true
-U.uku.$ishw=true
-U.uku.$isa=true
-U.fp.$isfp=true
-U.fp.$ishw=true
-U.fp.$isa=true
-U.ae.$ishw=true
-U.ae.$isa=true
-U.Qb.$ishw=true
-U.Qb.$isa=true
-U.c0.$ishw=true
-U.c0.$isa=true
-U.no.$ishw=true
-U.no.$isa=true
-U.Nb.$ishw=true
-U.Nb.$isa=true
-U.zX.$iszX=true
-U.zX.$ishw=true
-U.zX.$isa=true
-U.x9.$ishw=true
-U.x9.$isa=true
-U.EO.$isEO=true
-U.EO.$ishw=true
-U.EO.$isa=true
-P.GD.$isGD=true
-P.GD.$isa=true
-P.uq.$isuq=true
-P.uq.$isa=true
-N.Rw.$isa=true
-T.yj.$isyj=true
-T.yj.$isa=true
-W.tV.$ish4=true
-W.tV.$isKV=true
-W.tV.$isa=true
-G.DA.$isDA=true
-G.DA.$isa=true
-G.Y2.$isY2=true
-G.Y2.$isa=true
-F.d3.$isa=true
-A.XP.$isa=true
-W.AjY.$isAjY=true
-W.AjY.$isea=true
-W.AjY.$isa=true
-P.a2.$isa2=true
-P.a2.$isa=true
-G.uG.$isa=true
-P.oh.$isa=true
-D.af.$isaf=true
-D.af.$isa=true
-D.bv.$isaf=true
-D.bv.$isa=true
-W.f5.$isf5=true
-W.f5.$isea=true
-W.f5.$isa=true
-D.Fc.$isa=true
-D.ER.$isa=true
-D.dy.$isdy=true
-D.dy.$isaf=true
-D.dy.$isa=true
-D.vO.$isvO=true
-D.vO.$isaf=true
-D.vO.$isqC=true
-D.vO.$asqC=[null,null]
-D.vO.$isZ0=true
-D.vO.$asZ0=[null,null]
-D.vO.$isa=true
-D.DP.$isa=true
-D.uA.$isa=true
-D.U4.$isaf=true
-D.U4.$isa=true
-D.vx.$isvx=true
-D.vx.$isaf=true
-D.vx.$isa=true
-D.c2.$isa=true
-W.fJ.$isfJ=true
-W.fJ.$isa=true
-W.kf.$isea=true
-W.kf.$isa=true
-D.kx.$iskx=true
-D.kx.$isaf=true
-D.kx.$isa=true
-D.t9.$isa=true
-D.xb.$isa=true
-W.AW.$isea=true
-W.AW.$isa=true
-L.Tv.$isTv=true
-L.Tv.$isa=true
-K.GK.$isa=true
-N.HV.$isHV=true
-N.HV.$isa=true
-H.yo.$isa=true
-H.IY.$isa=true
-H.aX.$isa=true
-W.I0.$isAj=true
-W.I0.$isKV=true
-W.I0.$isa=true
-W.ea.$isea=true
-W.ea.$isa=true
-P.cb.$iscb=true
-P.cb.$isa=true
-P.Oy.$isOy=true
-P.Oy.$isa=true
-Y.qS.$isa=true
-U.hw.$ishw=true
-U.hw.$isa=true
-G.Ni.$isa=true
-P.AN.$isAN=true
-P.AN.$isa=true
-P.dl.$isdl=true
-P.dl.$isa=true
-P.mE.$ismE=true
-P.mE.$isa=true
-V.qC.$isqC=true
-V.qC.$isZ0=true
-V.qC.$isa=true
-P.KA.$isKA=true
-P.KA.$isNOT=true
-P.KA.$isOy=true
-P.KA.$isa=true
-P.LR.$isLR=true
-P.LR.$isKA=true
-P.LR.$isNOT=true
-P.LR.$isOy=true
-P.LR.$isa=true
-P.Rz.$isRz=true
-P.Rz.$isa=true
-P.Ob.$isOb=true
-P.Ob.$isa=true
-P.Z0.$isZ0=true
-P.Z0.$isa=true
-P.Xa.$isXa=true
-P.Xa.$isa=true
-P.QV.$isQV=true
-P.QV.$isa=true
-P.b8.$isb8=true
-P.b8.$isa=true
-P.EH.$isEH=true
-P.EH.$isa=true
-P.NOT.$isNOT=true
-P.NOT.$isa=true
-P.ti.$isti=true
-P.ti.$isa=true
-P.iP.$isiP=true
-P.iP.$isRz=true
-P.iP.$asRz=[null]
-P.iP.$isa=true
-A.Ap.$isAp=true
-A.Ap.$isa=true
-O.Hz.$isHz=true
-O.Hz.$isa=true
-D.N7.$isN7=true
-D.N7.$isaf=true
-D.N7.$isa=true
-D.EP.$isEP=true
-D.EP.$isaf=true
-D.EP.$isa=true
-A.ES.$isES=true
-A.ES.$isa=true
-A.Wq.$isWq=true
-A.Wq.$isa=true
-L.qK.$isqK=true
-L.qK.$isAp=true
-L.qK.$isa=true
-W.Aj.$isAj=true
-W.Aj.$isKV=true
-W.Aj.$isa=true
-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.RE=function(a){if(a==null)return a
-if(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.U6=function(a){if(typeof a=="string")return J.O.prototype
-if(a==null)return a
-if(a.constructor==Array)return J.Q.prototype
-if(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.Wx=function(a){if(typeof a=="number")return J.P.prototype
-if(a==null)return a
-if(!(a instanceof P.a))return J.kdQ.prototype
-return a}
-J.rY=function(a){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.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.m0(a)}
-J.x=function(a){if(typeof a=="number"){if(Math.floor(a)==a)return J.imn.prototype
-return J.Yn.prototype}if(typeof a=="string")return J.O.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(typeof a!="object")return a
-if(a instanceof P.a)return a
-return J.m0(a)}
-J.A4=function(a,b){return J.RE(a).sjx(a,b)}
-J.A6=function(a){return J.RE(a).gG3(a)}
-J.AF=function(a){return J.RE(a).gIi(a)}
-J.AG=function(a){return J.x(a).bu(a)}
-J.AI=function(a,b){return J.RE(a).su6(a,b)}
-J.AL=function(a){return J.RE(a).gW6(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.Aw=function(a){return J.RE(a).gb6(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.BT=function(a){return J.RE(a).gNG(a)}
-J.BZ=function(a){return J.RE(a).gnv(a)}
-J.Bj=function(a,b){return J.RE(a).Tk(a,b)}
-J.Bl=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<=b
-return J.Wx(a).E(a,b)}
-J.By=function(a,b){return J.RE(a).sLW(a,b)}
-J.C3=function(a,b){return J.RE(a).sig(a,b)}
-J.C5=function(a){return J.RE(a).gCd(a)}
-J.CJ=function(a,b){return J.RE(a).sB1(a,b)}
-J.CN=function(a){return J.RE(a).gd0(a)}
-J.Cm=function(a){return J.RE(a).gvC(a)}
-J.Co=function(a,b){return J.RE(a).szH(a,b)}
-J.Cu=function(a,b){return J.RE(a).sj4(a,b)}
-J.DB=function(a){return J.RE(a).gn0(a)}
-J.DF=function(a,b){return J.RE(a).soc(a,b)}
-J.DL=function(a){return J.RE(a).gK4(a)}
-J.DO=function(a){return J.RE(a).gR(a)}
-J.Dd=function(a){return J.RE(a).gLe(a)}
-J.Dh=function(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p){return J.RE(a).nH(a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p)}
-J.Dn=function(a,b){return J.w1(a).zV(a,b)}
-J.Do=function(a){return J.RE(a).gM0(a)}
-J.Ds=function(a){return J.RE(a).gPj(a)}
-J.Du=function(a){return J.RE(a).gxN(a)}
-J.E3=function(a){return J.RE(a).gRu(a)}
-J.EC=function(a){return J.RE(a).giC(a)}
-J.EJ=function(a,b){return J.RE(a).sCf(a,b)}
-J.EK=function(a,b){return J.RE(a).ps(a,b)}
-J.Ec=function(a){return J.RE(a).gMZ(a)}
-J.Eh=function(a,b){return J.RE(a).Wk(a,b)}
-J.Ei=function(a){return J.RE(a).gI(a)}
-J.Er=function(a,b){return J.RE(a).sfY(a,b)}
-J.Ew=function(a){return J.RE(a).gkm(a)}
-J.F8=function(a){return J.RE(a).gjO(a)}
-J.FI=function(a,b,c,d){return J.RE(a).YJ(a,b,c,d)}
-J.FN=function(a){return J.U6(a).gl0(a)}
-J.FS=function(a,b,c,d){return J.RE(a).nR(a,b,c,d)}
-J.Fd=function(a){return J.RE(a).gi6(a)}
-J.G0=function(a,b,c){return J.U6(a).XU(a,b,c)}
-J.GH=function(a){return J.RE(a).gyW(a)}
-J.GL=function(a){return J.RE(a).gfN(a)}
-J.GW=function(a){return J.RE(a).gVY(a)}
-J.Gl=function(a){return J.RE(a).ghy(a)}
-J.H3=function(a,b){return J.RE(a).sZA(a,b)}
-J.H4=function(a,b){return J.RE(a).wR(a,b)}
-J.HB=function(a){return J.RE(a).gxT(a)}
-J.HF=function(a){return J.RE(a).gD7(a)}
-J.HO=function(a){return J.RE(a).gWw(a)}
-J.Hn=function(a,b){return J.RE(a).sxT(a,b)}
-J.I2=function(a){return J.RE(a).gwv(a)}
-J.IO=function(a){return J.RE(a).gRH(a)}
-J.IR=function(a){return J.RE(a).gYt(a)}
-J.IX=function(a,b){return J.RE(a).sEu(a,b)}
-J.Iz=function(a){return J.RE(a).gfY(a)}
-J.J0=function(a){return J.RE(a).gfq(a)}
-J.J5=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>=b
-return J.Wx(a).F(a,b)}
-J.JA=function(a,b,c){return J.rY(a).h8(a,b,c)}
-J.JD=function(a){return J.RE(a).gSs(a)}
-J.JG=function(a){return J.RE(a).gHn(a)}
-J.JR=function(a){return J.RE(a).gcK(a)}
-J.JZ=function(a,b){return J.RE(a).st0(a,b)}
-J.Ja=function(a){return J.RE(a).gr9(a)}
-J.Jb=function(a,b){return J.RE(a).sdu(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,b){return J.RE(a).Id(a,b)}
-J.K0=function(a){return J.RE(a).gd4(a)}
-J.K2=function(a){return J.RE(a).gtN(a)}
-J.KD=function(a,b){return J.RE(a).j3(a,b)}
-J.Kd=function(a){return J.RE(a).gCF(a)}
-J.Kl=function(a){return J.RE(a).gBP(a)}
-J.Kn=function(a){return J.Wx(a).yu(a)}
-J.Kr=function(a){return J.RE(a).e6(a)}
-J.Kz=function(a,b){return J.RE(a).sni(a,b)}
-J.L7=function(a){return J.RE(a).gY9(a)}
-J.L9=function(a,b){if(typeof a=="number"&&typeof b=="number")return a/b
-return J.Wx(a).V(a,b)}
-J.LB=function(a){return J.RE(a).gX0(a)}
-J.LH=function(a,b){return J.w1(a).GT(a,b)}
-J.LL=function(a){return J.Wx(a).HG(a)}
-J.LM=function(a,b){return J.RE(a).szj(a,b)}
-J.Ld=function(a,b){return J.w1(a).eR(a,b)}
-J.Lh=function(a,b,c){return J.RE(a).ek(a,b,c)}
-J.Lm=function(a){return J.x(a).gbx(a)}
-J.Ln=function(a){return J.RE(a).gdU(a)}
-J.Lp=function(a){return J.RE(a).geT(a)}
-J.Lr=function(a){return J.RE(a).gMj(a)}
-J.M4=function(a){return J.RE(a).gJN(a)}
-J.ME=function(a,b){return J.RE(a).sUo(a,b)}
-J.MK=function(a,b){return J.RE(a).Md(a,b)}
-J.MO=function(a,b,c){return J.RE(a).ZK(a,b,c)}
-J.MQ=function(a){return J.w1(a).grZ(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.Mp=function(a){return J.w1(a).wg(a)}
-J.Mx=function(a){return J.RE(a).gks(a)}
-J.Mz=function(a){return J.RE(a).goE(a)}
-J.N1=function(a){return J.RE(a).Es(a)}
-J.NO=function(a,b){return J.RE(a).soE(a,b)}
-J.NQ=function(a){return J.RE(a).gjb(a)}
-J.NT=function(a,b,c){return J.U6(a).eM(a,b,c)}
-J.NV=function(a,b){return J.RE(a).RR(a,b)}
-J.NZ=function(a,b){return J.RE(a).sRu(a,b)}
-J.Nf=function(a,b){return J.RE(a).syw(a,b)}
-J.Nh=function(a,b){return J.RE(a).sSY(a,b)}
-J.Nj=function(a,b,c){return J.rY(a).Nj(a,b,c)}
-J.Nl=function(a){return J.RE(a).gO3(a)}
-J.No=function(a,b){return J.RE(a).sR(a,b)}
-J.Nq=function(a){return J.RE(a).gGc(a)}
-J.O2=function(a,b,c){return J.w1(a).UZ(a,b,c)}
-J.O5=function(a,b){return J.RE(a).smH(a,b)}
-J.O6=function(a){return J.RE(a).goc(a)}
-J.OB=function(a){return J.RE(a).gfg(a)}
-J.OE=function(a,b){return J.RE(a).sfg(a,b)}
-J.OL=function(a){return J.RE(a).gQl(a)}
-J.OT=function(a){return J.RE(a).gXE(a)}
-J.OY=function(a){return J.RE(a).gJD(a)}
-J.Ok=function(a){return J.RE(a).ghU(a)}
-J.P2=function(a,b){return J.RE(a).sU4(a,b)}
-J.P5=function(a){return J.RE(a).gHo(a)}
-J.PN=function(a,b){return J.RE(a).sCI(a,b)}
-J.PP=function(a,b){return J.RE(a).snv(a,b)}
-J.PY=function(a){return J.RE(a).goN(a)}
-J.Pj=function(a,b,c,d){return J.RE(a).ea(a,b,c,d)}
-J.Pl=function(a,b){return J.RE(a).sM6(a,b)}
-J.Pp=function(a,b){return J.rY(a).j(a,b)}
-J.Pw=function(a,b){return J.RE(a).sxr(a,b)}
-J.Q4=function(a){return J.RE(a).gph(a)}
-J.Q5=function(a,b,c,d){return J.RE(a).ct(a,b,c,d)}
-J.Q9=function(a){return J.RE(a).gf0(a)}
-J.QD=function(a,b){return J.RE(a).sM3(a,b)}
-J.QP=function(a){return J.RE(a).gWq(a)}
-J.QT=function(a,b){return J.RE(a).vV(a,b)}
-J.QX=function(a){return J.RE(a).gUo(a)}
-J.QZ=function(a){return J.RE(a).gpM(a)}
-J.Qa=function(a){return J.RE(a).gNN(a)}
-J.Qd=function(a){return J.RE(a).gRn(a)}
-J.Qr=function(a,b){return J.RE(a).skc(a,b)}
-J.Qv=function(a,b){return J.RE(a).sX0(a,b)}
-J.Qy=function(a,b){return J.RE(a).shf(a,b)}
-J.R1=function(a){return J.RE(a).Fn(a)}
-J.R7=function(a,b){return J.U6(a).u8(a,b)}
-J.RF=function(a,b){return J.RE(a).WO(a,b)}
-J.RX=function(a,b){return J.RE(a).sjl(a,b)}
-J.Rx=function(a,b){return J.RE(a).sEl(a,b)}
-J.Ry=function(a){return J.RE(a).gLW(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.SZ=function(a){return J.RE(a).gSO(a)}
-J.Sf=function(a,b){return J.RE(a).sXE(a,b)}
-J.Sj=function(a,b){return J.RE(a).svC(a,b)}
-J.Sl=function(a){return J.RE(a).gxb(a)}
-J.So=function(a,b){return J.RE(a).X3(a,b)}
-J.Sz=function(a){return J.RE(a).gUx(a)}
-J.T5=function(a,b){return J.RE(a).stT(a,b)}
-J.TG=function(a){return J.RE(a).mC(a)}
-J.TQ=function(a,b){return J.RE(a).mx(a,b)}
-J.TY=function(a){return J.RE(a).gvp(a)}
-J.TmB=function(a){return J.RE(a).gBy(a)}
-J.Tr=function(a){return J.RE(a).gCj(a)}
-J.Ts=function(a,b){return J.Wx(a).Z(a,b)}
-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.U8o=function(a){return J.RE(a).gUQ(a)}
-J.UM=function(a){return J.RE(a).gu7(a)}
-J.UN=function(a,b){if(typeof a=="number"&&typeof b=="number")return(a^b)>>>0
-return J.Wx(a).w(a,b)}
-J.UP=function(a){return J.RE(a).gnZ(a)}
-J.UQ=function(a,b){if(a.constructor==Array||typeof a=="string"||H.Gp(a,a[init.dispatchPropertyName]))if(b>>>0===b&&b<a.length)return a[b]
-return J.U6(a).t(a,b)}
-J.UT=function(a){return J.RE(a).gDQ(a)}
-J.UU=function(a){return J.RE(a).gjT(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.VL=function(a){return J.RE(a).gR2(a)}
-J.VT=function(a,b){return J.rY(a).Tc(a,b)}
-J.VZ=function(a,b,c,d,e){return J.w1(a).YW(a,b,c,d,e)}
-J.Vf=function(a){return J.RE(a).gVE(a)}
-J.Vi=function(a){return J.RE(a).grO(a)}
-J.Vk=function(a,b,c){return J.w1(a).xe(a,b,c)}
-J.Vl=function(a){return J.RE(a).gja(a)}
-J.Vm=function(a){return J.RE(a).gP(a)}
-J.Vs=function(a){return J.RE(a).gQg(a)}
-J.W2=function(a){return J.RE(a).gCf(a)}
-J.WB=function(a,b){return J.RE(a).skZ(a,b)}
-J.WI=function(a,b){return J.RE(a).sLF(a,b)}
-J.WM=function(a){return J.RE(a).gyv(a)}
-J.WT=function(a){return J.RE(a).gFR(a)}
-J.WX=function(a){return J.RE(a).gbJ(a)}
-J.Wp=function(a){return J.RE(a).gQU(a)}
-J.XF=function(a,b){return J.RE(a).siC(a,b)}
-J.XJ=function(a){return J.RE(a).gRY(a)}
-J.Xg=function(a,b){return J.RE(a).sBV(a,b)}
-J.Xp=function(a){return J.RE(a).gzH(a)}
-J.YQ=function(a){return J.RE(a).gPL(a)}
-J.Yf=function(a){return J.w1(a).gIr(a)}
-J.Yq=function(a){return J.RE(a).gSR(a)}
-J.Yz=function(a,b){return J.RE(a).sMl(a,b)}
-J.Z2=function(a){return J.RE(a).dQ(a)}
-J.Z6=function(a){return J.RE(a).gV5(a)}
-J.ZH=function(a){return J.RE(a).gk8(a)}
-J.ZI=function(a,b){return J.RE(a).sIs(a,b)}
-J.ZL=function(a){return J.RE(a).gAF(a)}
-J.ZN=function(a){return J.RE(a).gqN(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.rY(a).yn(a,b)}
-J.Zv=function(a){return J.RE(a).grs(a)}
-J.a8=function(a,b){return J.RE(a).sdU(a,b)}
-J.aA=function(a){return J.RE(a).gzY(a)}
-J.aT=function(a){return J.RE(a).god(a)}
-J.avD=function(a,b,c,d,e){return J.RE(a).dF(a,b,c,d,e)}
-J.aw=function(a,b){return J.RE(a).sNN(a,b)}
-J.bI=function(a,b){if(typeof a=="number"&&typeof b=="number")return a-b
-return J.Wx(a).W(a,b)}
-J.ba=function(a){return J.RE(a).gKJ(a)}
-J.bi=function(a,b){return J.w1(a).h(a,b)}
-J.bj=function(a,b){return J.w1(a).FV(a,b)}
-J.bu=function(a){return J.RE(a).gyw(a)}
-J.cG=function(a){return J.RE(a).Ki(a)}
-J.cI=function(a,b){return J.Wx(a).Sy(a,b)}
-J.cO=function(a){return J.RE(a).gjx(a)}
-J.cR=function(a,b){return J.Wx(a).WZ(a,b)}
-J.cU=function(a){return J.RE(a).gHh(a)}
-J.cV=function(a,b){return J.RE(a).sjT(a,b)}
-J.cd=function(a){return J.RE(a).gql(a)}
-J.cl=function(a,b){return J.RE(a).sHt(a,b)}
-J.co=function(a,b){return J.rY(a).nC(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,b,c,d){return J.RE(a).wN(a,b,c,d)}
-J.dk=function(a,b){return J.RE(a).sMj(a,b)}
-J.eU=function(a){return J.RE(a).gRh(a)}
-J.eg=function(a){return J.RE(a).Ms(a)}
-J.ew=function(a,b){if(typeof a=="number"&&typeof b=="number")return a+b
-return J.Qc(a).g(a,b)}
-J.fA=function(a){return J.RE(a).gJp(a)}
-J.fR=function(a,b){return J.RE(a).sMZ(a,b)}
-J.fU=function(a){return J.RE(a).gDX(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).gCn(a)}
-J.ff=function(a,b,c){return J.U6(a).Pk(a,b,c)}
-J.fv=function(a,b){return J.RE(a).sUx(a,b)}
-J.fw=function(a){return J.RE(a).gEl(a)}
-J.fy=function(a){return J.RE(a).gIF(a)}
-J.h9=function(a,b){return J.RE(a).sWA(a,b)}
-J.hS=function(a,b){return J.w1(a).srZ(a,b)}
-J.hb=function(a){return J.RE(a).gQ1(a)}
-J.hn=function(a){return J.RE(a).gEu(a)}
-J.i0=function(a,b){return J.RE(a).sPB(a,b)}
-J.i9=function(a,b){return J.w1(a).Zv(a,b)}
-J.iA=function(a,b,c){return J.RE(a).D9(a,b,c)}
-J.iH=function(a,b){return J.RE(a).sDQ(a,b)}
-J.iL=function(a){return J.RE(a).gNb(a)}
-J.iM=function(a,b){return J.RE(a).st5(a,b)}
-J.iS=function(a){return J.RE(a).gox(a)}
-J.ih=function(a){return J.RE(a).ga5(a)}
-J.io=function(a){return J.RE(a).gBV(a)}
-J.is=function(a){return J.RE(a).gZm(a)}
-J.iv=function(a){return J.RE(a).gV2(a)}
-J.iz=function(a,b){return J.RE(a).GE(a,b)}
-J.j1=function(a){return J.RE(a).gZA(a)}
-J.jB=function(a){return J.RE(a).gpf(a)}
-J.jO=function(a,b){return J.Wx(a).Y(a,b)}
-J.jd=function(a,b){return J.RE(a).snZ(a,b)}
-J.jf=function(a,b){return J.x(a).T(a,b)}
-J.jl=function(a){return J.RE(a).gHt(a)}
-J.jo=function(a){return J.RE(a).gCI(a)}
-J.jzo=function(a){if(typeof a=="number")return-a
-return J.Wx(a).J(a)}
-J.k0=function(a){return J.RE(a).giZ(a)}
-J.k7=function(a){return J.RE(a).gbA(a)}
-J.kB=function(a,b){return J.RE(a).sFR(a,b)}
-J.kE=function(a){return J.w1(a).git(a)}
-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.ki=function(a){return J.RE(a).gqK(a)}
-J.kl=function(a,b){return J.w1(a).ez(a,b)}
-J.ks=function(a){return J.RE(a).gB1(a)}
-J.kv=function(a){return J.RE(a).glp(a)}
-J.ky=function(a,b,c){return J.RE(a).dR(a,b,c)}
-J.l2=function(a){return J.RE(a).gN(a)}
-J.l7=function(a,b){return J.RE(a).sv8(a,b)}
-J.lB=function(a){return J.RE(a).guT(a)}
-J.lT=function(a){return J.RE(a).gOd(a)}
-J.lf=function(a,b){return J.Wx(a).O(a,b)}
-J.ls=function(a){return J.RE(a).gt3(a)}
-J.m4=function(a){return J.RE(a).gig(a)}
-J.m5=function(a){return J.RE(a).gQr(a)}
-J.mI=function(a,b){return J.RE(a).rW(a,b)}
-J.mP=function(a){return J.RE(a).gzj(a)}
-J.mU=function(a,b){return J.RE(a).skm(a,b)}
-J.mY=function(a){return J.w1(a).gA(a)}
-J.mZ=function(a,b,c){return J.RE(a).BG(a,b,c)}
-J.mu=function(a,b){return J.RE(a).TR(a,b)}
-J.mx=function(a){return J.RE(a).Xf(a)}
-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.n0=function(a,b){return J.RE(a).Rf(a,b)}
-J.n9=function(a){return J.RE(a).gQq(a)}
-J.nA=function(a,b){return J.RE(a).sPL(a,b)}
-J.nC=function(a,b){return J.RE(a).sCd(a,b)}
-J.nG=function(a){return J.RE(a).gv8(a)}
-J.nb=function(a){return J.RE(a).gyX(a)}
-J.nq=function(a){return J.RE(a).gFL(a)}
-J.oD=function(a,b){return J.RE(a).hP(a,b)}
-J.oE=function(a,b){return J.Qc(a).iM(a,b)}
-J.oJ=function(a,b){return J.RE(a).srs(a,b)}
-J.oN=function(a){return J.RE(a).gj4(a)}
-J.oZ=function(a){return J.RE(a).gBi(a)}
-J.on=function(a){return J.RE(a).gtT(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.pP=function(a){return J.RE(a).gDD(a)}
-J.pU=function(a){return J.RE(a).ghN(a)}
-J.pW=function(a,b,c,d){return J.RE(a).Si(a,b,c,d)}
-J.pd=function(a){return J.RE(a).gni(a)}
-J.pm=function(a){return J.RE(a).gt0(a)}
-J.q0=function(a,b){return J.RE(a).syG(a,b)}
-J.q8=function(a){return J.U6(a).gB(a)}
-J.qA=function(a){return J.w1(a).br(a)}
-J.qD=function(a,b,c){return J.RE(a).aD(a,b,c)}
-J.qd=function(a,b){return J.RE(a).sIt(a,b)}
-J.qq=function(a,b){return J.RE(a).sNG(a,b)}
-J.r0=function(a){return J.RE(a).RE(a)}
-J.r4=function(a){return J.RE(a).pj(a)}
-J.ra=function(a){return J.RE(a).gJ6(a)}
-J.rr=function(a){return J.rY(a).bS(a)}
-J.rw=function(a){return J.RE(a).gMl(a)}
-J.ry=function(a){return J.RE(a).gYe(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.tO=function(a){return J.w1(a).Jd(a)}
-J.tQ=function(a,b){return J.RE(a).swv(a,b)}
-J.ta=function(a,b){return J.RE(a).sP(a,b)}
-J.tp=function(a){return J.RE(a).gHy(a)}
-J.tv=function(a,b){return J.RE(a).sDX(a,b)}
-J.tx=function(a){return J.RE(a).gcH(a)}
-J.u1=function(a){return J.RE(a).gSY(a)}
-J.u6=function(a,b){if(typeof a=="number"&&typeof b=="number")return a<b
-return J.Wx(a).C(a,b)}
-J.uH=function(a,b){return J.rY(a).Fr(a,b)}
-J.uM=function(a,b){return J.RE(a).sod(a,b)}
-J.uP=function(a,b){return J.RE(a).sJ6(a,b)}
-J.uW=function(a){return J.RE(a).gyG(a)}
-J.uX=function(a,b){return J.RE(a).sph(a,b)}
-J.uf=function(a){return J.RE(a).gxr(a)}
-J.ul=function(a){return J.RE(a).gU4(a)}
-J.uy=function(a){return J.RE(a).gHm(a)}
-J.v1=function(a){return J.x(a).giO(a)}
-J.v8=function(a){return J.RE(a).gnp(a)}
-J.vJ=function(a,b){return J.RE(a).spM(a,b)}
-J.vP=function(a){return J.RE(a).My(a)}
-J.vX=function(a,b){if(typeof a=="number"&&typeof b=="number")return a*b
-return J.Qc(a).U(a,b)}
-J.vi=function(a){return J.RE(a).gNa(a)}
-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.wO=function(a){return J.RE(a).gE7(a)}
-J.wg=function(a,b){return J.U6(a).sB(a,b)}
-J.wl=function(a,b){return J.RE(a).Ch(a,b)}
-J.wt=function(a){return J.RE(a).gP3(a)}
-J.wz=function(a){return J.RE(a).gzx(a)}
-J.x0=function(a){return J.RE(a).S6(a)}
-J.x5=function(a,b){return J.U6(a).tg(a,b)}
-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).sE7(a,b)}
-J.xQ=function(a,b){return J.RE(a).sGd(a,b)}
-J.xR=function(a){return J.RE(a).ghf(a)}
-J.xW=function(a,b){return J.RE(a).sZm(a,b)}
-J.xa=function(a){return J.RE(a).geS(a)}
-J.xe=function(a){return J.RE(a).gPB(a)}
-J.xq=function(a){return J.RE(a).gUj(a)}
-J.yH=function(a){return J.Wx(a).Vy(a)}
-J.yO=function(a,b){return J.RE(a).stN(a,b)}
-J.yi=function(a){return J.RE(a).gbN(a)}
-J.yn=function(a){return J.RE(a).gkZ(a)}
-J.yq=function(a){return J.RE(a).gNs(a)}
-J.yx=function(a){return J.U6(a).gor(a)}
-J.yz=function(a){return J.RE(a).gLF(a)}
-J.z2=function(a){return J.RE(a).gG1(a)}
-J.z3=function(a){return J.RE(a).gu6(a)}
-J.z4=function(a,b){return J.RE(a).Rg(a,b)}
-J.z8=function(a,b){if(typeof a=="number"&&typeof b=="number")return a>b
-return J.Wx(a).D(a,b)}
-J.zH=function(a){return J.RE(a).gIs(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)}
-C.Df=X.hV.prototype
-C.Gkp=Y.q6.prototype
-C.C8=B.G6.prototype
-C.HR=A.wM.prototype
-C.YZz=Q.eW.prototype
-C.RD=O.eo.prototype
-C.ka=Z.aC.prototype
-C.IK=O.VY.prototype
-C.ux=F.Be.prototype
-C.O0=R.JI.prototype
-C.OD=F.ZP.prototype
-C.tT=L.nJ.prototype
-C.UF=R.Eg.prototype
-C.MC=D.i7.prototype
-C.by=A.Gk.prototype
-C.Cl=X.MJ.prototype
-C.Mh=X.Nr.prototype
-C.Xo=U.DK.prototype
-C.PJ8=N.BS.prototype
-C.Cs=O.Vb.prototype
-C.xu=K.Ly.prototype
-C.W3=W.fJ.prototype
-C.bP=E.WS.prototype
-C.hh=E.H8.prototype
-C.Ie=E.mO.prototype
-C.Ig=E.DE.prototype
-C.VLs=E.U1.prototype
-C.lX=E.ou.prototype
-C.Wa=E.av.prototype
-C.bZ=E.uz.prototype
-C.iR=E.Ma.prototype
-C.L6=E.wN.prototype
-C.wP=E.ds.prototype
-C.Ag=E.Mb.prototype
-C.Tl=E.oF.prototype
-C.wK=E.qh.prototype
-C.to=E.Q6.prototype
-C.za=E.L4.prototype
-C.ij=E.Zn.prototype
-C.Rr=E.uE.prototype
-C.aV=E.n5.prototype
-C.EL=B.pR.prototype
-C.yd=Z.hx.prototype
-C.wQ=D.Z4.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.Ji=D.Oz.prototype
-C.OoF=D.St.prototype
-C.Xe=L.qk.prototype
-C.Nm=J.Q.prototype
-C.YI=J.Yn.prototype
-C.jn=J.imn.prototype
-C.jN=J.CDU.prototype
-C.CD=J.P.prototype
-C.xB=J.O.prototype
-C.Yt=Z.vj.prototype
-C.ct=A.UK.prototype
-C.Z3=R.LU.prototype
-C.MG=M.CX.prototype
-C.yp=H.eEV.prototype
-C.kD=A.md.prototype
-C.br=A.ye.prototype
-C.IG=A.Bm.prototype
-C.nn=A.Ya.prototype
-C.J7=A.Ww.prototype
-C.t5=W.BH3.prototype
-C.BH=V.F1.prototype
-C.Pfz=Z.uL.prototype
-C.Sx=J.Ai.prototype
-C.Ki=A.xc.prototype
-C.Fa=T.ov.prototype
-C.Yj=A.kn.prototype
-C.FH=U.fI.prototype
-C.n8=R.zM.prototype
-C.Vd=D.Rk.prototype
-C.Ns=U.Ti.prototype
-C.HRc=Q.xI.prototype
-C.zb=Q.CY.prototype
-C.dX=K.nm.prototype
-C.wB=X.uw.prototype
-C.OKl=A.G1.prototype
-C.vB=J.kdQ.prototype
-C.u2=X.I5.prototype
-C.dm=U.el.prototype
-C.ma=W.K5.prototype
-C.KZ=new H.hJ()
-C.x4=new U.EO()
-C.Gw=new H.FuS()
-C.Eq=new P.qn()
-C.qY=new T.yy()
-C.ZB=new P.yRf()
-C.pr=new P.mgb()
-C.dV=new L.iNc()
-C.NU=new P.R81()
-C.dS=new P.AHi()
-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.nU=new A.iYn(0)
-C.BM=new A.iYn(1)
-C.WH=new A.iYn(2)
-C.hf=new H.IN("label")
-C.Db=H.Kx('qU')
-C.NS=new K.vly()
-C.vrd=new A.hG(!1)
-I.uL=function(a){a.immutable$list=init
-a.fixed$length=init
-return a}
-C.ucP=I.uL([C.NS,C.vrd])
-C.V0=new A.ES(C.hf,C.BM,!1,C.Db,!1,C.ucP)
-C.EV=new H.IN("library")
-C.Jny=H.Kx('U4')
-C.ZQ=new A.ES(C.EV,C.BM,!1,C.Jny,!1,C.ucP)
-C.SR=new H.IN("map")
-C.MR1=H.Kx('vO')
-C.S9=new A.ES(C.SR,C.BM,!1,C.MR1,!1,C.ucP)
-C.UL=new H.IN("profileChanged")
-C.yQP=H.Kx('EH')
-C.dn=I.uL([])
-C.mM=new A.ES(C.UL,C.WH,!1,C.yQP,!1,C.dn)
-C.Ql=new H.IN("hasClass")
-C.HL=H.Kx('a2')
-C.J19=new K.nd()
-C.X0=I.uL([C.NS,C.J19])
-C.TJ=new A.ES(C.Ql,C.BM,!1,C.HL,!1,C.X0)
-C.TU=new H.IN("endPosChanged")
-C.Cp=new A.ES(C.TU,C.WH,!1,C.yQP,!1,C.dn)
-C.ne=new H.IN("exception")
-C.SNu=H.Kx('EP')
-C.rZ=new A.ES(C.ne,C.BM,!1,C.SNu,!1,C.ucP)
-C.Wm=new H.IN("refChanged")
-C.QW=new A.ES(C.Wm,C.WH,!1,C.yQP,!1,C.dn)
-C.UY=new H.IN("result")
-C.SmN=H.Kx('af')
-C.n6=new A.ES(C.UY,C.BM,!1,C.SmN,!1,C.ucP)
-C.QK=new H.IN("qualified")
-C.Yo=new A.ES(C.QK,C.BM,!1,C.HL,!1,C.ucP)
-C.SA=new H.IN("lines")
-C.hAX=H.Kx('WO')
-C.KI=new A.ES(C.SA,C.BM,!1,C.hAX,!1,C.X0)
-C.zU=new H.IN("uncheckedText")
-C.uT=new A.ES(C.zU,C.BM,!1,C.Db,!1,C.ucP)
-C.yh=new H.IN("error")
-C.k5t=H.Kx('ft')
-C.m2=new A.ES(C.yh,C.BM,!1,C.k5t,!1,C.ucP)
-C.aH=new H.IN("displayCutoff")
-C.dq=new A.ES(C.aH,C.BM,!1,C.Db,!1,C.X0)
-C.rB=new H.IN("isolate")
-C.a2p=H.Kx('bv')
-C.hR=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.X0)
-C.XA=new H.IN("cls")
-C.jF=H.Kx('dy')
-C.xY=new A.ES(C.XA,C.BM,!1,C.jF,!1,C.ucP)
-C.bz=new H.IN("isolateChanged")
-C.Bk=new A.ES(C.bz,C.WH,!1,C.yQP,!1,C.dn)
-C.CG=new H.IN("posChanged")
-C.Ml=new A.ES(C.CG,C.WH,!1,C.yQP,!1,C.dn)
-C.oUD=H.Kx('N7')
-C.lJ=new A.ES(C.yh,C.BM,!1,C.oUD,!1,C.ucP)
-C.Gs=new H.IN("sampleCount")
-C.iO=new A.ES(C.Gs,C.BM,!1,C.Db,!1,C.X0)
-C.oj=new H.IN("httpServer")
-C.GT=new A.ES(C.oj,C.BM,!1,C.MR1,!1,C.ucP)
-C.td=new H.IN("object")
-C.Zk=new A.ES(C.td,C.BM,!1,C.SmN,!1,C.ucP)
-C.TW=new H.IN("tagSelector")
-C.H0=new A.ES(C.TW,C.BM,!1,C.Db,!1,C.X0)
-C.He=new H.IN("hideTagsChecked")
-C.oV=new A.ES(C.He,C.BM,!1,C.HL,!1,C.X0)
-C.zz=new H.IN("timeSpan")
-C.lS=new A.ES(C.zz,C.BM,!1,C.Db,!1,C.X0)
-C.AO=new H.IN("qualifiedName")
-C.fi=new A.ES(C.AO,C.BM,!1,C.Db,!1,C.ucP)
-C.mr=new H.IN("expanded")
-C.HE=new A.ES(C.mr,C.BM,!1,C.HL,!1,C.X0)
-C.kw=new H.IN("trace")
-C.oC=new A.ES(C.kw,C.BM,!1,C.MR1,!1,C.ucP)
-C.qX=new H.IN("fragmentationChanged")
-C.dO=new A.ES(C.qX,C.WH,!1,C.yQP,!1,C.dn)
-C.UX=new H.IN("msg")
-C.Pt=new A.ES(C.UX,C.BM,!1,C.MR1,!1,C.ucP)
-C.pO=new H.IN("functionChanged")
-C.au=new A.ES(C.pO,C.WH,!1,C.yQP,!1,C.dn)
-C.rP=new H.IN("mapChanged")
-C.Nt=new A.ES(C.rP,C.WH,!1,C.yQP,!1,C.dn)
-C.bk=new H.IN("checked")
-C.Ud=new A.ES(C.bk,C.BM,!1,C.HL,!1,C.ucP)
-C.kV=new H.IN("link")
-C.vz=new A.ES(C.kV,C.BM,!1,C.Db,!1,C.ucP)
-C.Ve=new H.IN("socket")
-C.Xmq=H.Kx('WP')
-C.X4=new A.ES(C.Ve,C.BM,!1,C.Xmq,!1,C.ucP)
-C.nt=new H.IN("startLine")
-C.yw=H.Kx('KN')
-C.VS=new A.ES(C.nt,C.BM,!1,C.yw,!1,C.X0)
-C.tg=new H.IN("retainedBytes")
-C.DC=new A.ES(C.tg,C.BM,!1,C.yw,!1,C.X0)
-C.YD=new H.IN("sampleRate")
-C.fP=new A.ES(C.YD,C.BM,!1,C.Db,!1,C.X0)
-C.Aa=new H.IN("results")
-C.Gsc=H.Kx('wn')
-C.Uz=new A.ES(C.Aa,C.BM,!1,C.Gsc,!1,C.X0)
-C.B0=new H.IN("expand")
-C.b6=new A.ES(C.B0,C.BM,!1,C.HL,!1,C.ucP)
-C.t6=new H.IN("mapAsString")
-C.hr=new A.ES(C.t6,C.BM,!1,C.Db,!1,C.X0)
-C.qs=new H.IN("io")
-C.MN=new A.ES(C.qs,C.BM,!1,C.MR1,!1,C.ucP)
-C.QH=new H.IN("fragmentation")
-C.C4=new A.ES(C.QH,C.BM,!1,C.MR1,!1,C.ucP)
-C.VK=new H.IN("devtools")
-C.Od=new A.ES(C.VK,C.BM,!1,C.HL,!1,C.ucP)
-C.uu=new H.IN("internal")
-C.yY=new A.ES(C.uu,C.BM,!1,C.HL,!1,C.ucP)
-C.yL=new H.IN("connection")
-C.j5=new A.ES(C.yL,C.BM,!1,C.MR1,!1,C.ucP)
-C.Wj=new H.IN("process")
-C.Ah=new A.ES(C.Wj,C.BM,!1,C.MR1,!1,C.ucP)
-C.nf=new H.IN("function")
-C.V3=new A.ES(C.nf,C.BM,!1,C.MR1,!1,C.ucP)
-C.Lc=new H.IN("kind")
-C.Pc=new A.ES(C.Lc,C.BM,!1,C.Db,!1,C.ucP)
-C.S4=new H.IN("busy")
-C.FB=new A.ES(C.S4,C.BM,!1,C.HL,!1,C.X0)
-C.eh=new H.IN("lineMode")
-C.rH=new A.ES(C.eh,C.BM,!1,C.Db,!1,C.X0)
-C.PM=new H.IN("status")
-C.jv=new A.ES(C.PM,C.BM,!1,C.Db,!1,C.X0)
-C.Zi=new H.IN("lastAccumulatorReset")
-C.xx=new A.ES(C.Zi,C.BM,!1,C.Db,!1,C.X0)
-C.lH=new H.IN("checkedText")
-C.dG=new A.ES(C.lH,C.BM,!1,C.Db,!1,C.ucP)
-C.AV=new H.IN("callback")
-C.wu=H.Kx('Sa')
-C.fr=new A.ES(C.AV,C.BM,!1,C.wu,!1,C.ucP)
-C.vs=new H.IN("endLine")
-C.MP=new A.ES(C.vs,C.BM,!1,C.yw,!1,C.X0)
-C.pH=new H.IN("small")
-C.Fk=new A.ES(C.pH,C.BM,!1,C.HL,!1,C.ucP)
-C.ox=new H.IN("countersChanged")
-C.Rh=new A.ES(C.ox,C.WH,!1,C.yQP,!1,C.dn)
-C.XM=new H.IN("path")
-C.Tt=new A.ES(C.XM,C.BM,!1,C.MR1,!1,C.ucP)
-C.bJ=new H.IN("counters")
-C.jJ=H.Kx('qC')
-C.UI=new A.ES(C.bJ,C.BM,!1,C.jJ,!1,C.ucP)
-C.bE=new H.IN("sampleDepth")
-C.h3=new A.ES(C.bE,C.BM,!1,C.Db,!1,C.X0)
-C.Ys=new H.IN("pad")
-C.Ce=new A.ES(C.Ys,C.BM,!1,C.HL,!1,C.ucP)
-C.N8=new H.IN("scriptChanged")
-C.qE=new A.ES(C.N8,C.WH,!1,C.yQP,!1,C.dn)
-C.YT=new H.IN("expr")
-C.eP=H.Kx('dynamic')
-C.LC=new A.ES(C.YT,C.BM,!1,C.eP,!1,C.ucP)
-C.ak=new H.IN("hasParent")
-C.yI=new A.ES(C.ak,C.BM,!1,C.HL,!1,C.X0)
-C.xS=new H.IN("tagSelectorChanged")
-C.bB=new A.ES(C.xS,C.WH,!1,C.yQP,!1,C.dn)
-C.jU=new H.IN("file")
-C.bw=new A.ES(C.jU,C.BM,!1,C.MR1,!1,C.ucP)
-C.RU=new A.ES(C.rB,C.BM,!1,C.a2p,!1,C.ucP)
-C.DZ=new A.ES(C.XA,C.BM,!1,C.MR1,!1,C.ucP)
-C.YE=new H.IN("webSocket")
-C.Wl=new A.ES(C.YE,C.BM,!1,C.MR1,!1,C.ucP)
-C.Dj=new H.IN("refreshTime")
-C.Ay=new A.ES(C.Dj,C.BM,!1,C.Db,!1,C.X0)
-C.Gr=new H.IN("endPos")
-C.VJ=new A.ES(C.Gr,C.BM,!1,C.yw,!1,C.ucP)
-C.RJ=new H.IN("vm")
-C.n8S=H.Kx('wv')
-C.BP=new A.ES(C.RJ,C.BM,!1,C.n8S,!1,C.ucP)
-C.a0=new H.IN("isDart")
-C.P9=new A.ES(C.a0,C.BM,!1,C.HL,!1,C.X0)
-C.PX=new H.IN("script")
-C.KB=H.Kx('vx')
-C.jz=new A.ES(C.PX,C.BM,!1,C.KB,!1,C.ucP)
-C.aP=new H.IN("active")
-C.xD=new A.ES(C.aP,C.BM,!1,C.HL,!1,C.ucP)
-C.Gn=new H.IN("objectChanged")
-C.az=new A.ES(C.Gn,C.WH,!1,C.yQP,!1,C.dn)
-C.vp=new H.IN("list")
-C.o0=new A.ES(C.vp,C.BM,!1,C.MR1,!1,C.ucP)
-C.i4=new H.IN("code")
-C.pM=H.Kx('kx')
-C.aJ=new A.ES(C.i4,C.BM,!1,C.pM,!1,C.ucP)
-C.kG=new H.IN("classTable")
-C.F9=H.Kx('UC')
-C.Pr=new A.ES(C.kG,C.BM,!1,C.F9,!1,C.X0)
-C.TN=new H.IN("lastServiceGC")
-C.Gj=new A.ES(C.TN,C.BM,!1,C.Db,!1,C.X0)
-C.zd=new A.ES(C.yh,C.BM,!1,C.SmN,!1,C.ucP)
-C.OO=new H.IN("flag")
-C.Cf=new A.ES(C.OO,C.BM,!1,C.jJ,!1,C.ucP)
-C.uk=new H.IN("last")
-C.p4=new A.ES(C.uk,C.BM,!1,C.HL,!1,C.ucP)
-C.WQ=new H.IN("field")
-C.ah=new A.ES(C.WQ,C.BM,!1,C.MR1,!1,C.ucP)
-C.r1=new H.IN("expandChanged")
-C.nP=new A.ES(C.r1,C.WH,!1,C.yQP,!1,C.dn)
-C.Mc=new H.IN("flagList")
-C.f0=new A.ES(C.Mc,C.BM,!1,C.MR1,!1,C.ucP)
-C.fn=new H.IN("instance")
-C.fz=new A.ES(C.fn,C.BM,!1,C.MR1,!1,C.ucP)
-C.rE=new H.IN("frame")
-C.KS=new A.ES(C.rE,C.BM,!1,C.jJ,!1,C.ucP)
-C.cg=new H.IN("anchor")
-C.ll=new A.ES(C.cg,C.BM,!1,C.Db,!1,C.ucP)
-C.ng=I.uL([C.J19])
-C.Qs=new A.ES(C.i4,C.BM,!0,C.pM,!1,C.ng)
-C.mi=new H.IN("text")
-C.yV=new A.ES(C.mi,C.BM,!1,C.Db,!1,C.X0)
-C.tW=new H.IN("pos")
-C.kH=new A.ES(C.tW,C.BM,!1,C.yw,!1,C.ucP)
-C.xP=new H.IN("ref")
-C.TO=new A.ES(C.xP,C.BM,!1,C.SmN,!1,C.ucP)
-C.Qp=new A.ES(C.AV,C.BM,!1,C.eP,!1,C.ucP)
-C.vb=new H.IN("profile")
-C.Mq=new A.ES(C.vb,C.BM,!1,C.MR1,!1,C.ucP)
-C.ny=new P.a6(0)
-C.U3=H.VM(new W.FkO("change"),[W.ea])
-C.T1=H.VM(new W.FkO("click"),[W.AjY])
-C.MD=H.VM(new W.FkO("error"),[W.kf])
-C.i3=H.VM(new W.FkO("input"),[W.ea])
-C.LF=H.VM(new W.FkO("load"),[W.kf])
-C.ph=H.VM(new W.FkO("message"),[W.AW])
-C.uh=H.VM(new W.FkO("mousedown"),[W.AjY])
-C.Kq=H.VM(new W.FkO("mousemove"),[W.AjY])
-C.yf=H.VM(new W.FkO("popstate"),[W.f5])
-C.mp=function(hooks) {
+// The code supports the following hooks:
+// dartPrint(message):
+//    if this function is defined it is called instead of the Dart [print]
+//    method.
+//
+// dartMainRunner(main, args):
+//    if this function is defined, the Dart [main] method will not be invoked
+//    directly. Instead, a closure that will invoke [main], and its arguments
+//    [args] is passed to [dartMainRunner].
+(function($) {
+function dart(){ this.x = 0 }var A = new dart;
+delete A.x;
+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 Isolate() {}
+init();
+
+$ = Isolate.$isolateProperties;
+var $$ = {};
+
+// Native classes
+(function(reflectionData) {
+  "use strict";
+  function map(x) {
+    x = {x: x};
+    delete x.x;
+    return x;
+  }
+  function processStatics(descriptor) {
+    for (var property in descriptor) {
+      if (!hasOwnProperty.call(descriptor, property))
+        continue;
+      if (property === "^")
+        continue;
+      var element = descriptor[property];
+      var firstChar = property.substring(0, 1);
+      var previousProperty;
+      if (firstChar === "+") {
+        mangledGlobalNames[previousProperty] = property.substring(1);
+        var flag = descriptor[property];
+        if (flag > 0)
+          descriptor[previousProperty].$reflectable = flag;
+        if (element && element.length)
+          init.typeInformation[previousProperty] = element;
+      } else if (firstChar === "@") {
+        property = property.substring(1);
+        $[property]["@"] = element;
+      } else if (firstChar === "*") {
+        globalObject[previousProperty].$defaultValues = element;
+        var optionalMethods = descriptor.$methodsWithOptionalArguments;
+        if (!optionalMethods) {
+          descriptor.$methodsWithOptionalArguments = optionalMethods = {};
+        }
+        optionalMethods[property] = previousProperty;
+      } else if (typeof element === "function") {
+        globalObject[previousProperty = property] = element;
+        functions.push(property);
+        init.globalFunctions[property] = element;
+      } else if (element.constructor === Array) {
+        addStubs(globalObject, element, property, true, descriptor, functions);
+      } else {
+        previousProperty = property;
+        var newDesc = {};
+        var previousProp;
+        for (var prop in element) {
+          if (!hasOwnProperty.call(element, prop))
+            continue;
+          firstChar = prop.substring(0, 1);
+          if (prop === "static") {
+            processStatics(init.statics[property] = element[prop]);
+          } else if (firstChar === "+") {
+            mangledNames[previousProp] = prop.substring(1);
+            var flag = element[prop];
+            if (flag > 0)
+              element[previousProp].$reflectable = flag;
+          } else if (firstChar === "@" && prop !== "@") {
+            newDesc[prop.substring(1)]["@"] = element[prop];
+          } else if (firstChar === "*") {
+            newDesc[previousProp].$defaultValues = element[prop];
+            var optionalMethods = newDesc.$methodsWithOptionalArguments;
+            if (!optionalMethods) {
+              newDesc.$methodsWithOptionalArguments = optionalMethods = {};
+            }
+            optionalMethods[prop] = previousProp;
+          } else {
+            var elem = element[prop];
+            if (prop !== "^" && elem != null && elem.constructor === Array && prop !== "<>") {
+              addStubs(newDesc, elem, prop, false, element, []);
+            } else {
+              newDesc[previousProp = prop] = elem;
+            }
+          }
+        }
+        $$[property] = [globalObject, newDesc];
+        classes.push(property);
+      }
+    }
+  }
+  function addStubs(descriptor, array, name, isStatic, originalDescriptor, functions) {
+    var f, funcs = [originalDescriptor[name] = descriptor[name] = f = array[0]];
+    f.$stubName = name;
+    functions.push(name);
+    for (var index = 0; index < array.length; index += 2) {
+      f = array[index + 1];
+      if (typeof f != "function")
+        break;
+      f.$stubName = array[index + 2];
+      funcs.push(f);
+      if (f.$stubName) {
+        originalDescriptor[f.$stubName] = descriptor[f.$stubName] = f;
+        functions.push(f.$stubName);
+      }
+    }
+    for (var i = 0; i < funcs.length; index++, i++) {
+      funcs[i].$callName = array[index + 1];
+    }
+    var getterStubName = array[++index];
+    array = array.slice(++index);
+    var requiredParameterInfo = array[0];
+    var requiredParameterCount = requiredParameterInfo >> 1;
+    var isAccessor = (requiredParameterInfo & 1) === 1;
+    var isSetter = requiredParameterInfo === 3;
+    var isGetter = requiredParameterInfo === 1;
+    var optionalParameterInfo = array[1];
+    var optionalParameterCount = optionalParameterInfo >> 1;
+    var optionalParametersAreNamed = (optionalParameterInfo & 1) === 1;
+    var isIntercepted = requiredParameterCount + optionalParameterCount != funcs[0].length;
+    var functionTypeIndex = array[2];
+    var unmangledNameIndex = 2 * optionalParameterCount + requiredParameterCount + 3;
+    var isReflectable = array.length > unmangledNameIndex;
+    if (getterStubName) {
+      f = tearOff(funcs, array, isStatic, name, isIntercepted);
+      descriptor[name].$getter = f;
+      f.$getterStub = true;
+      if (isStatic)
+        init.globalFunctions[name] = f;
+      originalDescriptor[getterStubName] = descriptor[getterStubName] = f;
+      funcs.push(f);
+      if (getterStubName)
+        functions.push(getterStubName);
+      f.$stubName = getterStubName;
+      f.$callName = null;
+      if (isIntercepted)
+        init.interceptedNames[getterStubName] = true;
+    }
+    if (isReflectable) {
+      for (var i = 0; i < funcs.length; i++) {
+        funcs[i].$reflectable = 1;
+        funcs[i].$reflectionInfo = array;
+      }
+      var mangledNames = isStatic ? init.mangledGlobalNames : init.mangledNames;
+      var unmangledName = array[unmangledNameIndex];
+      var reflectionName = unmangledName;
+      if (getterStubName)
+        mangledNames[getterStubName] = reflectionName;
+      if (isSetter) {
+        reflectionName += "=";
+      } else if (!isGetter) {
+        reflectionName += ":" + requiredParameterCount + ":" + optionalParameterCount;
+      }
+      mangledNames[name] = reflectionName;
+      funcs[0].$reflectionName = reflectionName;
+      funcs[0].$metadataIndex = unmangledNameIndex + 1;
+      if (optionalParameterCount)
+        descriptor[unmangledName + "*"] = funcs[0];
+    }
+  }
+  function tearOffGetterNoCsp(funcs, reflectionInfo, name, isIntercepted) {
+    return isIntercepted ? new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "(x) {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [x], name);" + "return new c(this, funcs[0], x, name);" + "}")(funcs, reflectionInfo, name, H, null) : new Function("funcs", "reflectionInfo", "name", "H", "c", "return function tearOff_" + name + functionCounter++ + "() {" + "if (c === null) c = H.closureFromTearOff(" + "this, funcs, reflectionInfo, false, [], name);" + "return new c(this, funcs[0], null, name);" + "}")(funcs, reflectionInfo, name, H, null);
+  }
+  function tearOffGetterCsp(funcs, reflectionInfo, name, isIntercepted) {
+    var cache = null;
+    return isIntercepted ? function(x) {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [x], name);
+      return new cache(this, funcs[0], x, name);
+    } : function() {
+      if (cache === null)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, false, [], name);
+      return new cache(this, funcs[0], null, name);
+    };
+  }
+  function tearOff(funcs, reflectionInfo, isStatic, name, isIntercepted) {
+    var cache;
+    return isStatic ? function() {
+      if (cache === void 0)
+        cache = H.closureFromTearOff(this, funcs, reflectionInfo, true, [], name).prototype;
+      return cache;
+    } : tearOffGetter(funcs, reflectionInfo, name, isIntercepted);
+  }
+  var functionCounter = 0;
+  var tearOffGetter = typeof dart_precompiled == "function" ? tearOffGetterCsp : tearOffGetterNoCsp;
+  if (!init.libraries)
+    init.libraries = [];
+  if (!init.mangledNames)
+    init.mangledNames = map();
+  if (!init.mangledGlobalNames)
+    init.mangledGlobalNames = map();
+  if (!init.statics)
+    init.statics = map();
+  if (!init.typeInformation)
+    init.typeInformation = map();
+  if (!init.globalFunctions)
+    init.globalFunctions = map();
+  if (!init.interceptedNames)
+    init.interceptedNames = map();
+  var libraries = init.libraries;
+  var mangledNames = init.mangledNames;
+  var mangledGlobalNames = init.mangledGlobalNames;
+  var hasOwnProperty = Object.prototype.hasOwnProperty;
+  var length = reflectionData.length;
+  for (var i = 0; i < length; i++) {
+    var data = reflectionData[i];
+    var name = data[0];
+    var uri = data[1];
+    var metadata = data[2];
+    var globalObject = data[3];
+    var descriptor = data[4];
+    var isRoot = !!data[5];
+    var fields = descriptor && descriptor["^"];
+    if (fields instanceof Array)
+      fields = fields[0];
+    var classes = [];
+    var functions = [];
+    processStatics(descriptor);
+    libraries.push([name, uri, classes, functions, metadata, fields, isRoot, globalObject]);
+  }
+})([
+["_foreign_helper", "dart:_foreign_helper", , H, {
+  "^": "",
+  JS_CONST: {
+    "^": "Object;code>"
+  }
+}],
+["_interceptors", "dart:_interceptors", , J, {
+  "^": "",
+  getInterceptor: function(object) {
+    return void 0;
+  },
+  makeDispatchRecord: function(interceptor, proto, extension, indexability) {
+    return {i: interceptor, p: proto, e: extension, x: indexability};
+  },
+  getNativeInterceptor: function(object) {
+    var record, proto, objectProto, interceptor;
+    record = object[init.dispatchPropertyName];
+    if (record == null)
+      if ($.initNativeDispatchFlag == null) {
+        H.initNativeDispatch();
+        record = object[init.dispatchPropertyName];
+      }
+    if (record != null) {
+      proto = record.p;
+      if (false === proto)
+        return record.i;
+      if (true === proto)
+        return object;
+      objectProto = Object.getPrototypeOf(object);
+      if (proto === objectProto)
+        return record.i;
+      if (record.e === objectProto)
+        throw H.wrapException(P.UnimplementedError$("Return interceptor for " + H.S(proto(object, record))));
+    }
+    interceptor = H.lookupAndCacheInterceptor(object);
+    if (interceptor == null) {
+      proto = Object.getPrototypeOf(object);
+      if (proto == null || proto === Object.prototype)
+        return C.PlainJavaScriptObject_methods;
+      else
+        return C.UnknownJavaScriptObject_methods;
+    }
+    return interceptor;
+  },
+  findIndexForNativeSubclassType: function(type) {
+    var t1, map, t2, i;
+    t1 = $.mapTypeToInterceptor;
+    if (t1 == null)
+      return;
+    map = t1;
+    for (t1 = map.length, t2 = J.getInterceptor(type), i = 0; i + 1 < t1; i += 3) {
+      if (i >= t1)
+        return H.ioore(map, i);
+      if (t2.$eq(type, map[i]))
+        return i;
+    }
+    return;
+  },
+  findInterceptorConstructorForType: function(type) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 1;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1];
+  },
+  findConstructorForNativeSubclassType: function(type, $name) {
+    var index, map, t1;
+    index = J.findIndexForNativeSubclassType(type);
+    if (index == null)
+      return;
+    map = $.mapTypeToInterceptor;
+    t1 = index + 2;
+    if (t1 >= map.length)
+      return H.ioore(map, t1);
+    return map[t1][$name];
+  },
+  Interceptor: {
+    "^": "Object;",
+    $eq: function(receiver, other) {
+      return receiver === other;
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    toString$0: function(receiver) {
+      return H.Primitives_objectToString(receiver);
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(receiver, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68],
+    get$runtimeType: function(receiver) {
+      return new H.TypeImpl(H.getRuntimeTypeString(receiver), null);
+    },
+    "%": "DOMImplementation|Navigator|SVGAnimatedEnumeration|SVGAnimatedLength|SVGAnimatedLengthList|SVGAnimatedNumber|SVGAnimatedNumberList|SVGAnimatedString"
+  },
+  JSBool: {
+    "^": "Interceptor;",
+    toString$0: function(receiver) {
+      return String(receiver);
+    },
+    get$hashCode: function(receiver) {
+      return receiver ? 519018 : 218159;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_EsU;
+    },
+    $isbool: true
+  },
+  JSNull: {
+    "^": "Interceptor;",
+    $eq: function(receiver, other) {
+      return null == other;
+    },
+    toString$0: function(receiver) {
+      return "null";
+    },
+    get$hashCode: function(receiver) {
+      return 0;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_eZO;
+    },
+    noSuchMethod$1: [function(receiver, invocation) {
+      return J.Interceptor.prototype.noSuchMethod$1.call(this, receiver, invocation);
+    }, "call$1", "get$noSuchMethod", 2, 0, null, 68]
+  },
+  JavaScriptObject: {
+    "^": "Interceptor;",
+    get$hashCode: function(_) {
+      return 0;
+    },
+    get$runtimeType: function(_) {
+      return C.Type_XXD;
+    }
+  },
+  PlainJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  UnknownJavaScriptObject: {
+    "^": "JavaScriptObject;"
+  },
+  JSArray: {
+    "^": "Interceptor;",
+    add$1: function(receiver, value) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("add"));
+      receiver.push(value);
+    },
+    removeAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeAt"));
+      return receiver.splice(index, 1)[0];
+    },
+    insert$2: function(receiver, index, value) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0 || index > receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insert"));
+      receiver.splice(index, 0, value);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("insertAll"));
+      H.IterableMixinWorkaround_insertAllList(receiver, index, iterable);
+    },
+    remove$1: function(receiver, element) {
+      var i;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("remove"));
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], element)) {
+          receiver.splice(i, 1);
+          return true;
+        }
+      return false;
+    },
+    where$1: function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, f), [null]);
+    },
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [null, null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E", ret: P.Iterable, args: [{func: "Iterable__E", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    addAll$1: function(receiver, collection) {
+      var t1;
+      for (t1 = J.get$iterator$ax(collection); t1.moveNext$0();)
+        this.add$1(receiver, t1.get$current());
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    forEach$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_forEach(receiver, f);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E", ret: P.Iterable, args: [{func: "dynamic__E", args: [E]}]};
+      }, this.$receiver, "JSArray");
+    }, 31],
+    join$1: function(receiver, separator) {
+      var t1, list, i, t2;
+      t1 = receiver.length;
+      list = Array(t1);
+      list.fixed$length = init;
+      for (i = 0; i < receiver.length; ++i) {
+        t2 = H.S(receiver[i]);
+        if (i >= t1)
+          return H.ioore(list, i);
+        list[i] = t2;
+      }
+      return list.join(separator);
+    },
+    skip$1: function(receiver, n) {
+      return H.SubListIterable$(receiver, n, null, null);
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    sublist$2: function(receiver, start, end) {
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (end < start || end > receiver.length)
+        throw H.wrapException(P.RangeError$range(end, start, receiver.length));
+      if (start === end)
+        return H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(receiver, 0)]);
+      return H.setRuntimeTypeInfo(receiver.slice(start, end), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    getRange$2: function(receiver, start, end) {
+      H.IterableMixinWorkaround__rangeCheck(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    get$first: function(receiver) {
+      if (receiver.length > 0)
+        return receiver[0];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    get$last: function(receiver) {
+      var t1 = receiver.length;
+      if (t1 > 0)
+        return receiver[t1 - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      var receiverLength;
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("removeRange"));
+      receiverLength = receiver.length;
+      if (start < 0 || start > receiverLength)
+        throw H.wrapException(P.RangeError$range(start, 0, receiverLength));
+      if (end < start || end > receiverLength)
+        throw H.wrapException(P.RangeError$range(end, start, receiverLength));
+      H.Lists_copy(receiver, end, receiver, start, receiverLength - end);
+      this.set$length(receiver, receiverLength - (end - start));
+    },
+    any$1: function(receiver, f) {
+      return H.IterableMixinWorkaround_any(receiver, f);
+    },
+    sort$1: function(receiver, compare) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("sort"));
+      H.IterableMixinWorkaround_sortList(receiver, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(receiver, element, start) {
+      return H.Lists_indexOf(receiver, element, start, receiver.length);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, start) {
+      return H.Lists_lastIndexOf(receiver, element, receiver.length - 1);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    contains$1: function(receiver, other) {
+      var i;
+      for (i = 0; i < receiver.length; ++i)
+        if (J.$eq(receiver[i], other))
+          return true;
+      return false;
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    toList$1$growable: function(receiver, growable) {
+      var t1;
+      if (growable)
+        return H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+      else {
+        t1 = H.setRuntimeTypeInfo(receiver.slice(), [H.getTypeArgumentByIndex(receiver, 0)]);
+        t1.fixed$length = init;
+        return t1;
+      }
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, receiver.length, 0, null), [H.getTypeArgumentByIndex(receiver, 0)]);
+    },
+    get$hashCode: function(receiver) {
+      return H.Primitives_objectHashCode(receiver);
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    set$length: function(receiver, newLength) {
+      if (typeof newLength !== "number" || Math.floor(newLength) !== newLength)
+        throw H.wrapException(P.ArgumentError$(newLength));
+      if (newLength < 0)
+        throw H.wrapException(P.RangeError$value(newLength));
+      if (!!receiver.fixed$length)
+        H.throwExpression(P.UnsupportedError$("set length"));
+      receiver.length = newLength;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      if (!!receiver.immutable$list)
+        H.throwExpression(P.UnsupportedError$("indexed set"));
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      receiver[index] = value;
+    },
+    $isJSArray: true,
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {JSArray_JSArray$fixed: function($length, $E) {
+        var t1;
+        if (typeof $length !== "number" || Math.floor($length) !== $length || $length < 0)
+          throw H.wrapException(P.ArgumentError$("Length must be a non-negative integer: " + H.S($length)));
+        t1 = H.setRuntimeTypeInfo(new Array($length), [$E]);
+        t1.fixed$length = init;
+        return t1;
+      }}
+  },
+  JSNumber: {
+    "^": "Interceptor;",
+    compareTo$1: function(receiver, b) {
+      var bIsNegative;
+      if (typeof b !== "number")
+        throw H.wrapException(P.ArgumentError$(b));
+      if (receiver < b)
+        return -1;
+      else if (receiver > b)
+        return 1;
+      else if (receiver === b) {
+        if (receiver === 0) {
+          bIsNegative = this.get$isNegative(b);
+          if (this.get$isNegative(receiver) === bIsNegative)
+            return 0;
+          if (this.get$isNegative(receiver))
+            return -1;
+          return 1;
+        }
+        return 0;
+      } else if (isNaN(receiver)) {
+        if (this.get$isNaN(b))
+          return 0;
+        return 1;
+      } else
+        return -1;
+    },
+    get$isNegative: function(receiver) {
+      return receiver === 0 ? 1 / receiver < 0 : receiver < 0;
+    },
+    get$isNaN: function(receiver) {
+      return isNaN(receiver);
+    },
+    get$isFinite: function(receiver) {
+      return isFinite(receiver);
+    },
+    remainder$1: function(receiver, b) {
+      return receiver % b;
+    },
+    abs$0: function(receiver) {
+      return Math.abs(receiver);
+    },
+    toInt$0: function(receiver) {
+      var t1;
+      if (receiver >= -2147483648 && receiver <= 2147483647)
+        return receiver | 0;
+      if (isFinite(receiver)) {
+        t1 = receiver < 0 ? Math.ceil(receiver) : Math.floor(receiver);
+        return t1 + 0;
+      }
+      throw H.wrapException(P.UnsupportedError$('' + receiver));
+    },
+    round$0: function(receiver) {
+      return this.toInt$0(this.roundToDouble$0(receiver));
+    },
+    roundToDouble$0: function(receiver) {
+      if (receiver < 0)
+        return -Math.round(-receiver);
+      else
+        return Math.round(receiver);
+    },
+    toStringAsFixed$1: function(receiver, fractionDigits) {
+      var result;
+      if (fractionDigits > 20)
+        throw H.wrapException(P.RangeError$(fractionDigits));
+      result = receiver.toFixed(fractionDigits);
+      if (receiver === 0 && this.get$isNegative(receiver))
+        return "-" + result;
+      return result;
+    },
+    toRadixString$1: function(receiver, radix) {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$(radix));
+      return receiver.toString(radix);
+    },
+    toString$0: function(receiver) {
+      if (receiver === 0 && 1 / receiver < 0)
+        return "-0.0";
+      else
+        return "" + receiver;
+    },
+    get$hashCode: function(receiver) {
+      return receiver & 0x1FFFFFFF;
+    },
+    $negate: function(receiver) {
+      return -receiver;
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    $sub: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver - other;
+    },
+    $div: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver / other;
+    },
+    $mul: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver * other;
+    },
+    $mod: function(receiver, other) {
+      var result;
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      result = receiver % other;
+      if (result === 0)
+        return 0;
+      if (result > 0)
+        return result;
+      if (other < 0)
+        return result - other;
+      else
+        return result + other;
+    },
+    $tdiv: function(receiver, other) {
+      if ((receiver | 0) === receiver && (other | 0) === other && 0 !== other && -1 !== other)
+        return receiver / other | 0;
+      else {
+        if (typeof other !== "number")
+          H.throwExpression(P.ArgumentError$(other));
+        return this.toInt$0(receiver / other);
+      }
+    },
+    _tdivFast$1: function(receiver, other) {
+      return (receiver | 0) === receiver ? receiver / other | 0 : this.toInt$0(receiver / other);
+    },
+    $shl: function(receiver, other) {
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    _shlPositive$1: function(receiver, other) {
+      return other > 31 ? 0 : receiver << other >>> 0;
+    },
+    $shr: function(receiver, other) {
+      var t1;
+      if (other < 0)
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    _shrOtherPositive$1: function(receiver, other) {
+      var t1;
+      if (receiver > 0)
+        t1 = other > 31 ? 0 : receiver >>> other;
+      else {
+        t1 = other > 31 ? 31 : other;
+        t1 = receiver >> t1 >>> 0;
+      }
+      return t1;
+    },
+    $and: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver & other) >>> 0;
+    },
+    $xor: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return (receiver ^ other) >>> 0;
+    },
+    $lt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver < other;
+    },
+    $gt: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver > other;
+    },
+    $le: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver <= other;
+    },
+    $ge: function(receiver, other) {
+      if (typeof other !== "number")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver >= other;
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_xM7;
+    },
+    $isnum: true,
+    static: {"^": "JSNumber__MIN_INT32,JSNumber__MAX_INT32"}
+  },
+  JSInt: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_SnA;
+    },
+    $is$double: true,
+    $isnum: true,
+    $is$int: true
+  },
+  JSDouble: {
+    "^": "JSNumber;",
+    get$runtimeType: function(receiver) {
+      return C.Type_qq1;
+    },
+    $is$double: true,
+    $isnum: true
+  },
+  JSString: {
+    "^": "Interceptor;",
+    codeUnitAt$1: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      if (index >= receiver.length)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver.charCodeAt(index);
+    },
+    allMatches$1: function(receiver, str) {
+      return H.allMatchesInStringUnchecked(receiver, str);
+    },
+    matchAsPrefix$2: function(receiver, string, start) {
+      var t1, t2, i, t3;
+      if (start < 0 || start > string.length)
+        throw H.wrapException(P.RangeError$range(start, 0, string.length));
+      t1 = receiver.length;
+      t2 = string.length;
+      if (start + t1 > t2)
+        return;
+      for (i = 0; i < t1; ++i) {
+        t3 = start + i;
+        if (t3 < 0)
+          H.throwExpression(P.RangeError$value(t3));
+        if (t3 >= t2)
+          H.throwExpression(P.RangeError$value(t3));
+        t3 = string.charCodeAt(t3);
+        if (i >= t1)
+          H.throwExpression(P.RangeError$value(i));
+        if (t3 !== receiver.charCodeAt(i))
+          return;
+      }
+      return new H.StringMatch(start, string, receiver);
+    },
+    $add: function(receiver, other) {
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      return receiver + other;
+    },
+    endsWith$1: function(receiver, other) {
+      var otherLength, t1;
+      otherLength = other.length;
+      t1 = receiver.length;
+      if (otherLength > t1)
+        return false;
+      return other === this.substring$1(receiver, t1 - otherLength);
+    },
+    replaceAll$2: function(receiver, from, to) {
+      return H.stringReplaceAllUnchecked(receiver, from, to);
+    },
+    split$1: function(receiver, pattern) {
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (typeof pattern === "string")
+        return receiver.split(pattern);
+      else if (!!J.getInterceptor(pattern).$isJSSyntaxRegExp)
+        return receiver.split(pattern._nativeRegExp);
+      else
+        throw H.wrapException("String.split(Pattern) UNIMPLEMENTED");
+    },
+    startsWith$2: function(receiver, pattern, index) {
+      var endIndex;
+      if (index > receiver.length)
+        throw H.wrapException(P.RangeError$range(index, 0, receiver.length));
+      endIndex = index + pattern.length;
+      if (endIndex > receiver.length)
+        return false;
+      return pattern === receiver.substring(index, endIndex);
+    },
+    startsWith$1: function($receiver, pattern) {
+      return this.startsWith$2($receiver, pattern, 0);
+    },
+    substring$2: function(receiver, startIndex, endIndex) {
+      if (typeof startIndex !== "number" || Math.floor(startIndex) !== startIndex)
+        H.throwExpression(P.ArgumentError$(startIndex));
+      if (endIndex == null)
+        endIndex = receiver.length;
+      if (typeof endIndex !== "number" || Math.floor(endIndex) !== endIndex)
+        H.throwExpression(P.ArgumentError$(endIndex));
+      if (startIndex < 0)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (typeof endIndex !== "number")
+        return H.iae(endIndex);
+      if (startIndex > endIndex)
+        throw H.wrapException(P.RangeError$value(startIndex));
+      if (endIndex > receiver.length)
+        throw H.wrapException(P.RangeError$value(endIndex));
+      return receiver.substring(startIndex, endIndex);
+    },
+    substring$1: function($receiver, startIndex) {
+      return this.substring$2($receiver, startIndex, null);
+    },
+    toLowerCase$0: function(receiver) {
+      return receiver.toLowerCase();
+    },
+    trim$0: function(receiver) {
+      var result, endIndex, startIndex, t1, endIndex0;
+      result = receiver.trim();
+      endIndex = result.length;
+      if (endIndex === 0)
+        return result;
+      if (this.codeUnitAt$1(result, 0) === 133) {
+        startIndex = J.JSString__skipLeadingWhitespace(result, 1);
+        if (startIndex === endIndex)
+          return "";
+      } else
+        startIndex = 0;
+      t1 = endIndex - 1;
+      endIndex0 = this.codeUnitAt$1(result, t1) === 133 ? J.JSString__skipTrailingWhitespace(result, t1) : endIndex;
+      if (startIndex === 0 && endIndex0 === endIndex)
+        return result;
+      return result.substring(startIndex, endIndex0);
+    },
+    $mul: function(receiver, times) {
+      var s, result;
+      if (typeof times !== "number")
+        return H.iae(times);
+      if (0 >= times)
+        return "";
+      if (times === 1 || receiver.length === 0)
+        return receiver;
+      if (times !== times >>> 0)
+        throw H.wrapException(C.C_OutOfMemoryError);
+      for (s = receiver, result = ""; true;) {
+        if ((times & 1) === 1)
+          result = s + result;
+        times = times >>> 1;
+        if (times === 0)
+          break;
+        s += s;
+      }
+      return result;
+    },
+    indexOf$2: function(receiver, pattern, start) {
+      var t1, match, t2, i;
+      if (pattern == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (start < 0 || start > receiver.length)
+        throw H.wrapException(P.RangeError$range(start, 0, receiver.length));
+      if (typeof pattern === "string")
+        return receiver.indexOf(pattern, start);
+      t1 = J.getInterceptor(pattern);
+      if (!!t1.$isJSSyntaxRegExp) {
+        match = pattern._execGlobal$2(receiver, start);
+        return match == null ? -1 : match._match.index;
+      }
+      for (t2 = receiver.length, i = start; i <= t2; ++i)
+        if (t1.matchAsPrefix$2(pattern, receiver, i) != null)
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, pattern) {
+      return this.indexOf$2($receiver, pattern, 0);
+    },
+    lastIndexOf$2: function(receiver, pattern, start) {
+      var t1, t2;
+      start = receiver.length;
+      t1 = pattern.length;
+      t2 = receiver.length;
+      if (start + t1 > t2)
+        start = t2 - t1;
+      return receiver.lastIndexOf(pattern, start);
+    },
+    lastIndexOf$1: function($receiver, pattern) {
+      return this.lastIndexOf$2($receiver, pattern, null);
+    },
+    contains$2: function(receiver, other, startIndex) {
+      if (other == null)
+        H.throwExpression(P.ArgumentError$(null));
+      if (startIndex > receiver.length)
+        throw H.wrapException(P.RangeError$range(startIndex, 0, receiver.length));
+      return H.stringContainsUnchecked(receiver, other, startIndex);
+    },
+    contains$1: function($receiver, other) {
+      return this.contains$2($receiver, other, 0);
+    },
+    get$isEmpty: function(receiver) {
+      return receiver.length === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return receiver.length !== 0;
+    },
+    compareTo$1: function(receiver, other) {
+      var t1;
+      if (typeof other !== "string")
+        throw H.wrapException(P.ArgumentError$(other));
+      if (receiver === other)
+        t1 = 0;
+      else
+        t1 = receiver < other ? -1 : 1;
+      return t1;
+    },
+    toString$0: function(receiver) {
+      return receiver;
+    },
+    get$hashCode: function(receiver) {
+      var t1, hash, i;
+      for (t1 = receiver.length, hash = 0, i = 0; i < t1; ++i) {
+        hash = 536870911 & hash + receiver.charCodeAt(i);
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$runtimeType: function(receiver) {
+      return C.Type_Ejg;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      if (typeof index !== "number" || Math.floor(index) !== index)
+        throw H.wrapException(P.ArgumentError$(index));
+      if (index >= receiver.length || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      return receiver[index];
+    },
+    $isString: true,
+    static: {JSString__isWhitespace: function(codeUnit) {
+        if (codeUnit < 256)
+          switch (codeUnit) {
+            case 9:
+            case 10:
+            case 11:
+            case 12:
+            case 13:
+            case 32:
+            case 133:
+            case 160:
+              return true;
+            default:
+              return false;
+          }
+        switch (codeUnit) {
+          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 true;
+          default:
+            return false;
+        }
+      }, JSString__skipLeadingWhitespace: function(string, index) {
+        var t1, codeUnit;
+        for (t1 = string.length; index < t1;) {
+          if (index >= t1)
+            H.throwExpression(P.RangeError$value(index));
+          codeUnit = string.charCodeAt(index);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+          ++index;
+        }
+        return index;
+      }, JSString__skipTrailingWhitespace: function(string, index) {
+        var t1, index0, codeUnit;
+        for (t1 = string.length; index > 0; index = index0) {
+          index0 = index - 1;
+          if (index0 >= t1)
+            H.throwExpression(P.RangeError$value(index0));
+          codeUnit = string.charCodeAt(index0);
+          if (codeUnit !== 32 && codeUnit !== 13 && !J.JSString__isWhitespace(codeUnit))
+            break;
+        }
+        return index;
+      }}
+  }
+}],
+["_isolate_helper", "dart:_isolate_helper", , H, {
+  "^": "",
+  _callInIsolate: function(isolate, $function) {
+    var result = isolate.eval$1(0, $function);
+    init.globalState.topEventLoop.run$0();
+    return result;
+  },
+  leaveJsAsync: function() {
+    --init.globalState.topEventLoop._activeJsAsyncCount;
+  },
+  startRootIsolate: function(entry, args) {
+    var t1, t2, t3, t4, t5, rootContext;
+    t1 = {};
+    t1.args_0 = args;
+    args = args;
+    t1.args_0 = args;
+    if (args == null) {
+      args = [];
+      t1.args_0 = args;
+      t2 = args;
+    } else
+      t2 = args;
+    if (!J.getInterceptor(t2).$isList)
+      throw H.wrapException(P.ArgumentError$("Arguments to main must be a List: " + H.S(t2)));
+    t2 = new H._Manager(0, 0, 1, null, null, null, null, null, null, null, null, null, entry);
+    t2._Manager$1(entry);
+    init.globalState = t2;
+    if (init.globalState.isWorker === true)
+      return;
+    t2 = init.globalState.nextIsolateId++;
+    t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t4 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t5 = new H.RawReceivePortImpl(0, null, false);
+    rootContext = new H._IsolateContext(t2, t3, t4, new Isolate(), t5, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t4.add$1(0, 0);
+    rootContext._addRegistration$2(0, t5);
+    init.globalState.rootContext = rootContext;
+    init.globalState.currentContext = rootContext;
+    t2 = H.getDynamicRuntimeType();
+    t3 = H.buildFunctionType(t2, [t2])._isTest$1(entry);
+    if (t3)
+      rootContext.eval$1(0, new H.startRootIsolate_closure(t1, entry));
+    else {
+      t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(entry);
+      if (t2)
+        rootContext.eval$1(0, new H.startRootIsolate_closure0(t1, entry));
+      else
+        rootContext.eval$1(0, entry);
+    }
+    init.globalState.topEventLoop.run$0();
+  },
+  IsolateNatives_computeThisScript: function() {
+    var currentScript = init.currentScript;
+    if (currentScript != null)
+      return String(currentScript.src);
+    if (typeof version == "function" && typeof os == "object" && "system" in os)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    if (typeof version == "function" && typeof system == "function")
+      return thisFilename();
+    if (init.globalState.isWorker === true)
+      return H.IsolateNatives_computeThisScriptFromTrace();
+    return;
+  },
+  IsolateNatives_computeThisScriptFromTrace: function() {
+    var stack, matches;
+    stack = new Error().stack;
+    if (stack == null) {
+      stack = function() {
+        try {
+          throw new Error();
+        } catch (e) {
+          return e.stack;
+        }
+
+      }();
+      if (stack == null)
+        throw H.wrapException(P.UnsupportedError$("No stack trace"));
+    }
+    matches = stack.match(new RegExp("^ *at [^(]*\\((.*):[0-9]*:[0-9]*\\)$", "m"));
+    if (matches != null)
+      return matches[1];
+    matches = stack.match(new RegExp("^[^@]*@(.*):[0-9]*$", "m"));
+    if (matches != null)
+      return matches[1];
+    throw H.wrapException(P.UnsupportedError$("Cannot extract URI from \"" + H.S(stack) + "\""));
+  },
+  IsolateNatives__processWorkerMessage: [function(sender, e) {
+    var msg, t1, functionName, entryPoint, args, message, isSpawnUri, startPaused, replyTo, t2, t3, t4, context, replyPort;
+    msg = H._deserializeMessage(e.data);
+    t1 = J.getInterceptor$asx(msg);
+    switch (t1.$index(msg, "command")) {
+      case "start":
+        init.globalState.currentManagerId = t1.$index(msg, "id");
+        functionName = t1.$index(msg, "functionName");
+        entryPoint = functionName == null ? init.globalState.entry : init.globalFunctions[functionName]();
+        args = t1.$index(msg, "args");
+        message = H._deserializeMessage(t1.$index(msg, "msg"));
+        isSpawnUri = t1.$index(msg, "isSpawnUri");
+        startPaused = t1.$index(msg, "startPaused");
+        replyTo = H._deserializeMessage(t1.$index(msg, "replyTo"));
+        t1 = init.globalState.nextIsolateId++;
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+        t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+        t4 = new H.RawReceivePortImpl(0, null, false);
+        context = new H._IsolateContext(t1, t2, t3, new Isolate(), t4, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+        t3.add$1(0, 0);
+        context._addRegistration$2(0, t4);
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, new H.IsolateNatives__processWorkerMessage_closure(entryPoint, args, message, isSpawnUri, startPaused, replyTo), "worker-start"));
+        init.globalState.currentContext = context;
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "spawn-worker":
+        replyPort = t1.$index(msg, "replyPort");
+        H.IsolateNatives_spawn(t1.$index(msg, "functionName"), t1.$index(msg, "uri"), t1.$index(msg, "args"), t1.$index(msg, "msg"), false, t1.$index(msg, "isSpawnUri"), t1.$index(msg, "startPaused")).then$2$onError(new H.IsolateNatives__processWorkerMessage_closure0(replyPort), new H.IsolateNatives__processWorkerMessage_closure1(replyPort));
+        break;
+      case "message":
+        if (t1.$index(msg, "port") != null)
+          J.send$1$x(t1.$index(msg, "port"), t1.$index(msg, "msg"));
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "close":
+        init.globalState.managers.remove$1(0, $.get$IsolateNatives_workerIds().$index(0, sender));
+        sender.terminate();
+        init.globalState.topEventLoop.run$0();
+        break;
+      case "log":
+        H.IsolateNatives__log(t1.$index(msg, "msg"));
+        break;
+      case "print":
+        if (init.globalState.isWorker === true) {
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "print", "msg", msg], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        } else
+          P.print(t1.$index(msg, "msg"));
+        break;
+      case "error":
+        throw H.wrapException(t1.$index(msg, "msg"));
+    }
+  }, "call$2", "IsolateNatives__processWorkerMessage$closure", 4, 0, null, 0, 1],
+  IsolateNatives__log: function(msg) {
+    var trace, t1, t2, exception;
+    if (init.globalState.isWorker === true) {
+      t1 = init.globalState.mainManager;
+      t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "log", "msg", msg], null, null));
+      t1.toString;
+      self.postMessage(t2);
+    } else
+      try {
+        $.get$globalThis().console.log(msg);
+      } catch (exception) {
+        H.unwrapException(exception);
+        trace = new H._StackTrace(exception, null);
+        throw H.wrapException(P.Exception_Exception(trace));
+      }
+
+  },
+  IsolateNatives_spawn: function(functionName, uri, args, message, isLight, isSpawnUri, startPaused) {
+    var port, completer, signalReply, t1, t2, worker;
+    if (uri != null && J.endsWith$1$s(uri, ".dart"))
+      uri = J.$add$ns(uri, ".js");
+    port = P.ReceivePort_ReceivePort();
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+    port.get$first(port).then$1(new H.IsolateNatives_spawn_closure(completer));
+    signalReply = new H._NativeJsSendPort(port._rawPort, init.globalState.currentContext.id);
+    if (init.globalState.supportsWorkers === true && !isLight)
+      if (init.globalState.isWorker === true) {
+        t1 = init.globalState.mainManager;
+        t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "spawn-worker", "functionName", functionName, "args", args, "msg", message, "uri", uri, "isSpawnUri", isSpawnUri, "startPaused", startPaused, "replyPort", signalReply], null, null));
+        t1.toString;
+        self.postMessage(t2);
+      } else {
+        if (uri == null)
+          uri = $.get$IsolateNatives_thisScript();
+        worker = new Worker(uri);
+        worker.onerror = function(f, u, c) {
+          return function(e) {
+            return f(e, u, c);
+          };
+        }(H.IsolateNatives_workerOnError, uri, new H.IsolateNatives_spawn_closure0(completer));
+        worker.onmessage = function(f, a) {
+          return function(e) {
+            e.onerror = null;
+            return f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, worker);
+        t1 = init.globalState.nextManagerId++;
+        $.get$IsolateNatives_workerIds().$indexSet(0, worker, t1);
+        init.globalState.managers.$indexSet(0, t1, worker);
+        worker.postMessage(H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "start", "id", t1, "replyTo", H._serializeMessage(signalReply), "args", args, "msg", H._serializeMessage(message), "isSpawnUri", isSpawnUri, "startPaused", startPaused, "functionName", functionName], null, null)));
+      }
+    else
+      H.IsolateNatives__startNonWorker(functionName, uri, args, message, isSpawnUri, startPaused, signalReply);
+    return completer.future;
+  },
+  IsolateNatives__startNonWorker: function(functionName, uri, args, message, isSpawnUri, startPaused, replyPort) {
+    var t1, t2, t3, t4, t5, t6;
+    t1 = {};
+    t1.args_0 = args;
+    t1.message_1 = message;
+    if (uri != null)
+      throw H.wrapException(P.UnsupportedError$("Currently spawnUri is not supported without web workers."));
+    t1.message_1 = H._serializeMessage(message);
+    t1.args_0 = H._serializeMessage(t1.args_0);
+    t2 = init.globalState.topEventLoop;
+    t3 = init.globalState.nextIsolateId++;
+    t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H.RawReceivePortImpl);
+    t5 = P.LinkedHashSet_LinkedHashSet(null, null, null, P.$int);
+    t6 = new H.RawReceivePortImpl(0, null, false);
+    t4 = new H._IsolateContext(t3, t4, t5, new Isolate(), t6, P.Capability_Capability(), P.Capability_Capability(), false, false, [], P.LinkedHashSet_LinkedHashSet(null, null, null, null), null, null, false, true, P.LinkedHashSet_LinkedHashSet(null, null, null, null));
+    t5.add$1(0, 0);
+    t4._addRegistration$2(0, t6);
+    t2.events._add$1(0, new H._IsolateEvent(t4, new H.IsolateNatives__startNonWorker_closure(t1, functionName, isSpawnUri, startPaused, replyPort), "nonworker start"));
+  },
+  IsolateNatives__startIsolate: function(topLevel, args, message, isSpawnUri, startPaused, replyTo) {
+    var context, t1, t2, t3;
+    context = init.globalState.currentContext;
+    t1 = context.id;
+    $.Primitives_mirrorFunctionCacheName = $.Primitives_mirrorFunctionCacheName + ("_" + t1);
+    $.Primitives_mirrorInvokeCacheName = $.Primitives_mirrorInvokeCacheName + ("_" + t1);
+    t1 = context.controlPort;
+    t2 = init.globalState.currentContext.id;
+    t3 = context.pauseCapability;
+    J.send$1$x(replyTo, ["spawned", new H._NativeJsSendPort(t1, t2), t3, context.terminateCapability]);
+    t2 = new H.IsolateNatives__startIsolate_runStartFunction(topLevel, args, message, isSpawnUri, context);
+    if (startPaused === true) {
+      context.addPause$2(t3, t3);
+      init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(context, t2, "start isolate"));
+    } else
+      t2.call$0();
+  },
+  IsolateNatives_workerOnError: [function($event, uri, onError) {
+    var message;
+    $event.preventDefault();
+    message = $event.message;
+    onError.call$1(message == null ? "Error spawning worker for " + H.S(uri) : "Error spawning worker for " + H.S(uri) + " (" + message + ")");
+    return true;
+  }, "call$3", "IsolateNatives_workerOnError$closure", 6, 0, null, 2, 3, 4],
+  _serializeMessage: function(message) {
+    var t1;
+    if (init.globalState.supportsWorkers === true) {
+      t1 = new H._JsSerializer(0, new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    } else {
+      t1 = new H._JsCopier(new H._MessageTraverserVisitedMap());
+      t1._visited = new H._JsVisitedMap(null);
+      return t1.traverse$1(message);
+    }
+  },
+  _deserializeMessage: function(message) {
+    if (init.globalState.supportsWorkers === true)
+      return new H._JsDeserializer(null).deserialize$1(message);
+    else
+      return message;
+  },
+  _MessageTraverser_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  _Deserializer_isPrimitive: function(x) {
+    return x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean";
+  },
+  startRootIsolate_closure: {
+    "^": "Closure:69;box_0,entry_1",
+    call$0: function() {
+      this.entry_1.call$1(this.box_0.args_0);
+    },
+    $isFunction: true
+  },
+  startRootIsolate_closure0: {
+    "^": "Closure:69;box_0,entry_2",
+    call$0: function() {
+      this.entry_2.call$2(this.box_0.args_0, null);
+    },
+    $isFunction: true
+  },
+  _Manager: {
+    "^": "Object;nextIsolateId,currentManagerId,nextManagerId,currentContext,rootContext,topEventLoop,fromCommandLine,isWorker,supportsWorkers,isolates<,mainManager,managers,entry<",
+    _Manager$1: function(entry) {
+      var t1, t2, t3, $function;
+      t1 = $.get$globalWindow() == null;
+      t2 = $.get$globalWorker();
+      t3 = t1 && $.get$globalPostMessageDefined() === true;
+      this.isWorker = t3;
+      if (!t3)
+        t2 = t2 != null && $.get$IsolateNatives_thisScript() != null;
+      else
+        t2 = true;
+      this.supportsWorkers = t2;
+      this.fromCommandLine = t1 && !t3;
+      t2 = H._IsolateEvent;
+      t3 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [t2]);
+      t3.ListQueue$1(null, t2);
+      this.topEventLoop = new H._EventLoop(t3, 0);
+      this.isolates = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, H._IsolateContext);
+      this.managers = P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, null);
+      if (this.isWorker === true) {
+        t1 = new H._MainManagerStub();
+        this.mainManager = t1;
+        $function = function(f, a) {
+          return function(e) {
+            f(a, e);
+          };
+        }(H.IsolateNatives__processWorkerMessage, t1);
+        $.get$globalThis().onmessage = $function;
+        $.get$globalThis().dartPrint = function(object) {
+        };
+      }
+    }
+  },
+  _IsolateContext: {
+    "^": "Object;id>,ports,weakPorts,isolateStatics<,controlPort<,pauseCapability,terminateCapability,initialized?,isPaused<,delayedEvents<,pauseTokens,doneHandlers,_scheduledControlEvents,_isExecutingEvent,errorsAreFatal,errorPorts",
+    addPause$2: function(authentification, resume) {
+      if (!this.pauseCapability.$eq(0, authentification))
+        return;
+      if (this.pauseTokens.add$1(0, resume) && !this.isPaused)
+        this.isPaused = true;
+      this._updateGlobalState$0();
+    },
+    removePause$1: function(resume) {
+      var t1, t2, $event, t3, t4, t5;
+      if (!this.isPaused)
+        return;
+      t1 = this.pauseTokens;
+      t1.remove$1(0, resume);
+      if (t1._collection$_length === 0) {
+        for (t1 = this.delayedEvents; t2 = t1.length, t2 !== 0;) {
+          if (0 >= t2)
+            return H.ioore(t1, 0);
+          $event = t1.pop();
+          t2 = init.globalState.topEventLoop.events;
+          t3 = t2._head;
+          t4 = t2._collection$_table;
+          t5 = t4.length;
+          t3 = (t3 - 1 & t5 - 1) >>> 0;
+          t2._head = t3;
+          if (t3 < 0 || t3 >= t5)
+            return H.ioore(t4, t3);
+          t4[t3] = $event;
+          if (t3 === t2._tail)
+            t2._grow$0();
+          ++t2._modificationCount;
+        }
+        this.isPaused = false;
+      }
+      this._updateGlobalState$0();
+    },
+    addDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null) {
+        t1 = [];
+        this.doneHandlers = t1;
+      }
+      if (J.contains$1$asx(t1, responsePort))
+        return;
+      this.doneHandlers.push(responsePort);
+    },
+    removeDoneListener$1: function(responsePort) {
+      var t1 = this.doneHandlers;
+      if (t1 == null)
+        return;
+      J.remove$1$ax(t1, responsePort);
+    },
+    setErrorsFatal$2: function(authentification, errorsAreFatal) {
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      this.errorsAreFatal = errorsAreFatal;
+    },
+    handlePing$2: function(responsePort, pingType) {
+      var t1, t2;
+      t1 = J.getInterceptor(pingType);
+      if (!t1.$eq(pingType, 0))
+        t2 = t1.$eq(pingType, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        J.send$1$x(responsePort, null);
+        return;
+      }
+      t2 = new H._IsolateContext_handlePing_respond(responsePort);
+      if (t1.$eq(pingType, 2)) {
+        init.globalState.topEventLoop.events._add$1(0, new H._IsolateEvent(this, t2, "ping"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, t2);
+    },
+    handleKill$2: function(authentification, priority) {
+      var t1, t2;
+      if (!this.terminateCapability.$eq(0, authentification))
+        return;
+      t1 = J.getInterceptor(priority);
+      if (!t1.$eq(priority, 0))
+        t2 = t1.$eq(priority, 1) && !this._isExecutingEvent;
+      else
+        t2 = true;
+      if (t2) {
+        this.kill$0();
+        return;
+      }
+      if (t1.$eq(priority, 2)) {
+        t1 = init.globalState.topEventLoop;
+        t2 = this.get$kill();
+        t1.events._add$1(0, new H._IsolateEvent(this, t2, "kill"));
+        return;
+      }
+      t1 = this._scheduledControlEvents;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+        t1.ListQueue$1(null, null);
+        this._scheduledControlEvents = t1;
+      }
+      t1._add$1(0, this.get$kill());
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      var t1, message;
+      t1 = this.errorPorts;
+      if (t1._collection$_length === 0) {
+        if (this.errorsAreFatal === true && this === init.globalState.rootContext)
+          return;
+        t1 = $.get$globalThis();
+        if (t1.console != null && typeof t1.console.error == "function")
+          t1.console.error(error, stackTrace);
+        else {
+          P.print(error);
+          if (stackTrace != null)
+            P.print(stackTrace);
+        }
+        return;
+      }
+      message = Array(2);
+      message.fixed$length = init;
+      message[0] = J.toString$0(error);
+      message[1] = stackTrace == null ? null : J.toString$0(stackTrace);
+      for (t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]), t1._cell = t1._set._first; t1.moveNext$0();)
+        J.send$1$x(t1._collection$_current, message);
+    },
+    eval$1: [function(_, code) {
+      var old, result, e, s, exception, t1;
+      old = init.globalState.currentContext;
+      init.globalState.currentContext = this;
+      $ = this.isolateStatics;
+      result = null;
+      this._isExecutingEvent = true;
+      try {
+        result = code.call$0();
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.handleUncaughtError$2(e, s);
+        if (this.errorsAreFatal === true) {
+          this.kill$0();
+          if (this === init.globalState.rootContext)
+            throw exception;
+        }
+      }
+ finally {
+        this._isExecutingEvent = false;
+        init.globalState.currentContext = old;
+        if (old != null)
+          $ = old.get$isolateStatics();
+        if (this._scheduledControlEvents != null)
+          for (; t1 = this._scheduledControlEvents, !t1.get$isEmpty(t1);)
+            this._scheduledControlEvents.removeFirst$0().call$0();
+      }
+      return result;
+    }, "call$1", "get$eval", 2, 0, 70, 71],
+    handleControlMessage$1: function(message) {
+      var t1 = J.getInterceptor$asx(message);
+      switch (t1.$index(message, 0)) {
+        case "pause":
+          this.addPause$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "resume":
+          this.removePause$1(t1.$index(message, 1));
+          break;
+        case "add-ondone":
+          this.addDoneListener$1(t1.$index(message, 1));
+          break;
+        case "remove-ondone":
+          this.removeDoneListener$1(t1.$index(message, 1));
+          break;
+        case "set-errors-fatal":
+          this.setErrorsFatal$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "ping":
+          this.handlePing$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "kill":
+          this.handleKill$2(t1.$index(message, 1), t1.$index(message, 2));
+          break;
+        case "getErrors":
+          this.errorPorts.add$1(0, t1.$index(message, 1));
+          break;
+        case "stopErrors":
+          this.errorPorts.remove$1(0, t1.$index(message, 1));
+          break;
+      }
+    },
+    lookup$1: function(portId) {
+      return this.ports.$index(0, portId);
+    },
+    _addRegistration$2: function(portId, port) {
+      var t1 = this.ports;
+      if (t1.containsKey$1(portId))
+        throw H.wrapException(P.Exception_Exception("Registry: ports must be registered only once."));
+      t1.$indexSet(0, portId, port);
+    },
+    _updateGlobalState$0: function() {
+      if (this.ports._collection$_length - this.weakPorts._collection$_length > 0 || this.isPaused || !this.initialized)
+        init.globalState.isolates.$indexSet(0, this.id, this);
+      else
+        this.kill$0();
+    },
+    kill$0: [function() {
+      var t1, t2;
+      t1 = this._scheduledControlEvents;
+      if (t1 != null)
+        t1.clear$0(0);
+      for (t1 = this.ports, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.__isolate_helper$_close$0();
+      t1.clear$0(0);
+      this.weakPorts.clear$0(0);
+      init.globalState.isolates.remove$1(0, this.id);
+      this.errorPorts.clear$0(0);
+      t1 = this.doneHandlers;
+      if (t1 != null) {
+        for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.send$1$x(t1._current, null);
+        this.doneHandlers = null;
+      }
+    }, "call$0", "get$kill", 0, 0, 18],
+    $is_IsolateContext: true
+  },
+  _IsolateContext_handlePing_respond: {
+    "^": "Closure:18;responsePort_0",
+    call$0: [function() {
+      J.send$1$x(this.responsePort_0, null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _EventLoop: {
+    "^": "Object;events,_activeJsAsyncCount",
+    dequeue$0: function() {
+      var t1 = this.events;
+      if (t1._head === t1._tail)
+        return;
+      return t1.removeFirst$0();
+    },
+    runIteration$0: function() {
+      var $event, t1, t2;
+      $event = this.dequeue$0();
+      if ($event == null) {
+        if (init.globalState.rootContext != null && init.globalState.isolates.containsKey$1(init.globalState.rootContext.id) && init.globalState.fromCommandLine === true && init.globalState.rootContext.ports._collection$_length === 0)
+          H.throwExpression(P.Exception_Exception("Program exited with open ReceivePorts."));
+        t1 = init.globalState;
+        if (t1.isWorker === true && t1.isolates._collection$_length === 0 && t1.topEventLoop._activeJsAsyncCount === 0) {
+          t1 = t1.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "close"], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+        return false;
+      }
+      J.process$0$x($event);
+      return true;
+    },
+    _runHelper$0: function() {
+      if ($.get$globalWindow() != null)
+        new H._EventLoop__runHelper_next(this).call$0();
+      else
+        for (; this.runIteration$0();)
+          ;
+    },
+    run$0: function() {
+      var e, trace, exception, t1, t2;
+      if (init.globalState.isWorker !== true)
+        this._runHelper$0();
+      else
+        try {
+          this._runHelper$0();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          trace = new H._StackTrace(exception, null);
+          t1 = init.globalState.mainManager;
+          t2 = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "error", "msg", H.S(e) + "\n" + H.S(trace)], null, null));
+          t1.toString;
+          self.postMessage(t2);
+        }
+
+    }
+  },
+  _EventLoop__runHelper_next: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      if (!this.this_0.runIteration$0())
+        return;
+      P.Timer_Timer(C.Duration_0, this);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _IsolateEvent: {
+    "^": "Object;isolate*,fn,message>",
+    process$0: [function(_) {
+      if (this.isolate.get$isPaused()) {
+        this.isolate.get$delayedEvents().push(this);
+        return;
+      }
+      J.eval$1$x(this.isolate, this.fn);
+    }, "call$0", "get$process", 0, 0, 18],
+    $is_IsolateEvent: true
+  },
+  _MainManagerStub: {
+    "^": "Object;"
+  },
+  IsolateNatives__processWorkerMessage_closure: {
+    "^": "Closure:69;entryPoint_0,args_1,message_2,isSpawnUri_3,startPaused_4,replyTo_5",
+    call$0: [function() {
+      H.IsolateNatives__startIsolate(this.entryPoint_0, this.args_1, this.message_2, this.isSpawnUri_3, this.startPaused_4, this.replyTo_5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure0: {
+    "^": "Closure:13;replyPort_6",
+    call$1: [function(msg) {
+      J.send$1$x(this.replyPort_6, msg);
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__processWorkerMessage_closure1: {
+    "^": "Closure:5;replyPort_7",
+    call$1: [function(errorMessage) {
+      J.send$1$x(this.replyPort_7, ["spawn failed", errorMessage]);
+    }, "call$1", null, 2, 0, null, 73, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure: {
+    "^": "Closure:13;completer_0",
+    call$1: [function(msg) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(msg);
+      t2 = this.completer_0;
+      if (J.$eq(t1.$index(msg, 0), "spawned")) {
+        t1 = t2.future;
+        if (t1._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t1._asyncComplete$1(msg);
+      } else
+        t2.completeError$1(t1.$index(msg, 1));
+    }, "call$1", null, 2, 0, null, 72, "call"],
+    $isFunction: true
+  },
+  IsolateNatives_spawn_closure0: {
+    "^": "Closure:5;completer_1",
+    call$1: [function(message) {
+      return this.completer_1.completeError$1(message);
+    }, "call$1", null, 2, 0, null, 74, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startNonWorker_closure: {
+    "^": "Closure:69;box_0,functionName_1,isSpawnUri_2,startPaused_3,replyPort_4",
+    call$0: [function() {
+      var t1 = this.box_0;
+      H.IsolateNatives__startIsolate(init.globalFunctions[this.functionName_1](), t1.args_0, t1.message_1, this.isSpawnUri_2, this.startPaused_3, this.replyPort_4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IsolateNatives__startIsolate_runStartFunction: {
+    "^": "Closure:18;topLevel_0,args_1,message_2,isSpawnUri_3,context_4",
+    call$0: [function() {
+      var t1, t2, t3;
+      this.context_4.set$initialized(true);
+      if (this.isSpawnUri_3 !== true)
+        this.topLevel_0.call$1(this.message_2);
+      else {
+        t1 = this.topLevel_0;
+        t2 = H.getDynamicRuntimeType();
+        t3 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+        if (t3)
+          t1.call$2(this.args_1, this.message_2);
+        else {
+          t2 = H.buildFunctionType(t2, [t2])._isTest$1(t1);
+          if (t2)
+            t1.call$1(this.args_1);
+          else
+            t1.call$0();
+        }
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseSendPort: {
+    "^": "Object;",
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort: {
+    "^": "_BaseSendPort;_receivePort,_isolateId",
+    send$1: function(_, message) {
+      var t1, t2, isolate, t3, shouldSerialize;
+      t1 = {};
+      t2 = this._isolateId;
+      isolate = init.globalState.isolates.$index(0, t2);
+      if (isolate == null)
+        return;
+      t3 = this._receivePort;
+      if (t3.get$_isClosed())
+        return;
+      shouldSerialize = init.globalState.currentContext != null && init.globalState.currentContext.id !== t2;
+      t1.msg_0 = message;
+      if (shouldSerialize)
+        t1.msg_0 = H._serializeMessage(message);
+      if (isolate.get$controlPort() === t3) {
+        isolate.handleControlMessage$1(t1.msg_0);
+        return;
+      }
+      t2 = init.globalState.topEventLoop;
+      t3 = "receive " + H.S(message);
+      t2.events._add$1(0, new H._IsolateEvent(isolate, new H._NativeJsSendPort_send_closure(t1, this, shouldSerialize), t3));
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_NativeJsSendPort && J.$eq(this._receivePort, other._receivePort);
+    },
+    get$hashCode: function(_) {
+      return J.get$__isolate_helper$_id$x(this._receivePort);
+    },
+    $is_NativeJsSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  _NativeJsSendPort_send_closure: {
+    "^": "Closure:69;box_0,this_1,shouldSerialize_2",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_1._receivePort;
+      if (!t1.get$_isClosed()) {
+        if (this.shouldSerialize_2) {
+          t2 = this.box_0;
+          t2.msg_0 = H._deserializeMessage(t2.msg_0);
+        }
+        J.__isolate_helper$_add$1$x(t1, this.box_0.msg_0);
+      }
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _WorkerSendPort: {
+    "^": "_BaseSendPort;_workerId,_receivePortId,_isolateId",
+    send$1: function(_, message) {
+      var workerMessage, manager;
+      workerMessage = H._serializeMessage(P.LinkedHashMap_LinkedHashMap$_literal(["command", "message", "port", this, "msg", message], null, null));
+      if (init.globalState.isWorker === true) {
+        init.globalState.mainManager.toString;
+        self.postMessage(workerMessage);
+      } else {
+        manager = init.globalState.managers.$index(0, this._workerId);
+        if (manager != null)
+          manager.postMessage(workerMessage);
+      }
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$is_WorkerSendPort && J.$eq(this._workerId, other._workerId) && J.$eq(this._isolateId, other._isolateId) && J.$eq(this._receivePortId, other._receivePortId);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.$shl$n(this._workerId, 16);
+      t2 = J.$shl$n(this._isolateId, 8);
+      t3 = this._receivePortId;
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      return (t1 ^ t2 ^ t3) >>> 0;
+    },
+    $is_WorkerSendPort: true,
+    $isSendPort: true,
+    $isCapability: true
+  },
+  RawReceivePortImpl: {
+    "^": "Object;__isolate_helper$_id>,_handler,_isClosed<",
+    _handler$1: function(arg0) {
+      return this._handler.call$1(arg0);
+    },
+    __isolate_helper$_close$0: function() {
+      this._isClosed = true;
+      this._handler = null;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._isClosed)
+        return;
+      this._isClosed = true;
+      this._handler = null;
+      t1 = init.globalState.currentContext;
+      t2 = this.__isolate_helper$_id;
+      t1.ports.remove$1(0, t2);
+      t1.weakPorts.remove$1(0, t2);
+      t1._updateGlobalState$0();
+    },
+    __isolate_helper$_add$1: function(_, dataEvent) {
+      if (this._isClosed)
+        return;
+      this._handler$1(dataEvent);
+    },
+    $isRawReceivePortImpl: true,
+    static: {"^": "RawReceivePortImpl__nextFreeId"}
+  },
+  ReceivePortImpl: {
+    "^": "Stream;_rawPort,__isolate_helper$_controller",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = this.__isolate_helper$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._ControllerStream(t1), [null]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    close$0: [function(_) {
+      this._rawPort.close$0(0);
+      this.__isolate_helper$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    ReceivePortImpl$fromRawReceivePort$1: function(_rawPort) {
+      var t1 = P.StreamController_StreamController(this.get$close(this), null, null, null, true, null);
+      this.__isolate_helper$_controller = t1;
+      this._rawPort._handler = t1.get$add(t1);
+    },
+    $asStream: function() {
+      return [null];
+    },
+    $isStream: true
+  },
+  _JsSerializer: {
+    "^": "_Serializer;_nextFreeRefId,_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return ["sendport", init.globalState.currentManagerId, x._isolateId, J.get$__isolate_helper$_id$x(x._receivePort)];
+      if (!!x.$is_WorkerSendPort)
+        return ["sendport", x._workerId, x._isolateId, x._receivePortId];
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return ["capability", x.__isolate_helper$_id];
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsCopier: {
+    "^": "_Copier;_visited",
+    visitSendPort$1: function(x) {
+      if (!!x.$is_NativeJsSendPort)
+        return new H._NativeJsSendPort(x._receivePort, x._isolateId);
+      if (!!x.$is_WorkerSendPort)
+        return new H._WorkerSendPort(x._workerId, x._receivePortId, x._isolateId);
+      throw H.wrapException("Illegal underlying port " + x.toString$0(0));
+    },
+    visitCapability$1: function(x) {
+      if (!!x.$isCapabilityImpl)
+        return new H.CapabilityImpl(x.__isolate_helper$_id);
+      throw H.wrapException("Capability not serializable: " + x.toString$0(0));
+    }
+  },
+  _JsDeserializer: {
+    "^": "_Deserializer;_deserialized",
+    deserializeSendPort$1: function(list) {
+      var t1, managerId, isolateId, receivePortId, isolate, receivePort;
+      t1 = J.getInterceptor$asx(list);
+      managerId = t1.$index(list, 1);
+      isolateId = t1.$index(list, 2);
+      receivePortId = t1.$index(list, 3);
+      if (J.$eq(managerId, init.globalState.currentManagerId)) {
+        isolate = init.globalState.isolates.$index(0, isolateId);
+        if (isolate == null)
+          return;
+        receivePort = isolate.lookup$1(receivePortId);
+        if (receivePort == null)
+          return;
+        return new H._NativeJsSendPort(receivePort, isolateId);
+      } else
+        return new H._WorkerSendPort(managerId, receivePortId, isolateId);
+    },
+    deserializeCapability$1: function(list) {
+      return new H.CapabilityImpl(J.$index$asx(list, 1));
+    }
+  },
+  _JsVisitedMap: {
+    "^": "Object;tagged",
+    $index: function(_, object) {
+      return object.__MessageTraverser__attached_info__;
+    },
+    $indexSet: function(_, object, info) {
+      this.tagged.push(object);
+      object.__MessageTraverser__attached_info__ = info;
+    },
+    reset$0: function(_) {
+      this.tagged = [];
+    },
+    cleanup$0: function() {
+      var $length, i, t1;
+      for ($length = this.tagged.length, i = 0; i < $length; ++i) {
+        t1 = this.tagged;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t1[i].__MessageTraverser__attached_info__ = null;
+      }
+      this.tagged = null;
+    }
+  },
+  _MessageTraverserVisitedMap: {
+    "^": "Object;",
+    $index: function(_, object) {
+      return;
+    },
+    $indexSet: function(_, object, info) {
+    },
+    reset$0: function(_) {
+    },
+    cleanup$0: function() {
+    }
+  },
+  _MessageTraverser: {
+    "^": "Object;",
+    traverse$1: function(x) {
+      var result;
+      if (H._MessageTraverser_isPrimitive(x))
+        return this.visitPrimitive$1(x);
+      this._visited.reset$0(0);
+      result = null;
+      try {
+        result = this._dispatch$1(x);
+      } finally {
+        this._visited.cleanup$0();
+      }
+      return result;
+    },
+    _dispatch$1: function(x) {
+      var t1;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return this.visitPrimitive$1(x);
+      t1 = J.getInterceptor(x);
+      if (!!t1.$isList)
+        return this.visitList$1(x);
+      if (!!t1.$isMap)
+        return this.visitMap$1(x);
+      if (!!t1.$isSendPort)
+        return this.visitSendPort$1(x);
+      if (!!t1.$isCapability)
+        return this.visitCapability$1(x);
+      return this.visitObject$1(x);
+    },
+    visitObject$1: function(x) {
+      throw H.wrapException("Message serialization: Illegal value " + H.S(x) + " passed");
+    }
+  },
+  _Copier: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copy, t1, len, i;
+      copy = this._visited.$index(0, list);
+      if (copy != null)
+        return copy;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      copy = Array(len);
+      copy.fixed$length = init;
+      this._visited.$indexSet(0, list, copy);
+      for (i = 0; i < len; ++i)
+        copy[i] = this._dispatch$1(t1.$index(list, i));
+      return copy;
+    },
+    visitMap$1: function(map) {
+      var t1, copy;
+      t1 = {};
+      copy = this._visited.$index(0, map);
+      t1.copy_0 = copy;
+      if (copy != null)
+        return copy;
+      copy = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1.copy_0 = copy;
+      this._visited.$indexSet(0, map, copy);
+      map.forEach$1(0, new H._Copier_visitMap_closure(t1, this));
+      return t1.copy_0;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Copier_visitMap_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function(key, val) {
+      var t1 = this.this_1;
+      J.$indexSet$ax(this.box_0.copy_0, t1._dispatch$1(key), t1._dispatch$1(val));
+    },
+    $isFunction: true
+  },
+  _Serializer: {
+    "^": "_MessageTraverser;",
+    visitPrimitive$1: function(x) {
+      return x;
+    },
+    visitList$1: function(list) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, list);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, list, t1);
+      return ["list", t1, this._serializeList$1(list)];
+    },
+    visitMap$1: function(map) {
+      var copyId, t1;
+      copyId = this._visited.$index(0, map);
+      if (copyId != null)
+        return ["ref", copyId];
+      t1 = this._nextFreeRefId++;
+      this._visited.$indexSet(0, map, t1);
+      return ["map", t1, this._serializeList$1(J.toList$0$ax(map.get$keys())), this._serializeList$1(J.toList$0$ax(map.get$values(map)))];
+    },
+    _serializeList$1: function(list) {
+      var t1, len, result, i, t2;
+      t1 = J.getInterceptor$asx(list);
+      len = t1.get$length(list);
+      result = [];
+      C.JSArray_methods.set$length(result, len);
+      for (i = 0; i < len; ++i) {
+        t2 = this._dispatch$1(t1.$index(list, i));
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t2;
+      }
+      return result;
+    },
+    visitSendPort$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    },
+    visitCapability$1: function(x) {
+      return H.throwExpression(P.UnimplementedError$(null));
+    }
+  },
+  _Deserializer: {
+    "^": "Object;",
+    deserialize$1: function(x) {
+      if (H._Deserializer_isPrimitive(x))
+        return x;
+      this._deserialized = P.HashMap_HashMap(null, null, null, null, null);
+      return this._deserializeHelper$1(x);
+    },
+    _deserializeHelper$1: function(x) {
+      var t1, id;
+      if (x == null || typeof x === "string" || typeof x === "number" || typeof x === "boolean")
+        return x;
+      t1 = J.getInterceptor$asx(x);
+      switch (t1.$index(x, 0)) {
+        case "ref":
+          id = t1.$index(x, 1);
+          return this._deserialized.$index(0, id);
+        case "list":
+          return this._deserializeList$1(x);
+        case "map":
+          return this._deserializeMap$1(x);
+        case "sendport":
+          return this.deserializeSendPort$1(x);
+        case "capability":
+          return this.deserializeCapability$1(x);
+        default:
+          return this.deserializeObject$1(x);
+      }
+    },
+    _deserializeList$1: function(x) {
+      var t1, id, dartList, len, i;
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      dartList = t1.$index(x, 2);
+      this._deserialized.$indexSet(0, id, dartList);
+      t1 = J.getInterceptor$asx(dartList);
+      len = t1.get$length(dartList);
+      if (typeof len !== "number")
+        return H.iae(len);
+      i = 0;
+      for (; i < len; ++i)
+        t1.$indexSet(dartList, i, this._deserializeHelper$1(t1.$index(dartList, i)));
+      return dartList;
+    },
+    _deserializeMap$1: function(x) {
+      var result, t1, id, keys, values, len, t2, i;
+      result = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      t1 = J.getInterceptor$asx(x);
+      id = t1.$index(x, 1);
+      this._deserialized.$indexSet(0, id, result);
+      keys = t1.$index(x, 2);
+      values = t1.$index(x, 3);
+      t1 = J.getInterceptor$asx(keys);
+      len = t1.get$length(keys);
+      if (typeof len !== "number")
+        return H.iae(len);
+      t2 = J.getInterceptor$asx(values);
+      i = 0;
+      for (; i < len; ++i)
+        result.$indexSet(0, this._deserializeHelper$1(t1.$index(keys, i)), this._deserializeHelper$1(t2.$index(values, i)));
+      return result;
+    },
+    deserializeObject$1: function(x) {
+      throw H.wrapException("Unexpected serialized object");
+    }
+  },
+  TimerImpl: {
+    "^": "Object;_once,_inEventLoop,_handle",
+    cancel$0: function() {
+      if ($.get$globalThis().setTimeout != null) {
+        if (this._inEventLoop)
+          throw H.wrapException(P.UnsupportedError$("Timer in event loop cannot be canceled."));
+        if (this._handle == null)
+          return;
+        H.leaveJsAsync();
+        if (this._once)
+          $.get$globalThis().clearTimeout(this._handle);
+        else
+          $.get$globalThis().clearInterval(this._handle);
+        this._handle = null;
+      } else
+        throw H.wrapException(P.UnsupportedError$("Canceling a timer."));
+    },
+    TimerImpl$2: function(milliseconds, callback) {
+      var t1, t2;
+      if (milliseconds === 0)
+        t1 = $.get$globalThis().setTimeout == null || init.globalState.isWorker === true;
+      else
+        t1 = false;
+      if (t1) {
+        this._handle = 1;
+        t1 = init.globalState.topEventLoop;
+        t2 = init.globalState.currentContext;
+        t1.events._add$1(0, new H._IsolateEvent(t2, new H.TimerImpl_internalCallback(this, callback), "timer"));
+        this._inEventLoop = true;
+      } else {
+        t1 = $.get$globalThis();
+        if (t1.setTimeout != null) {
+          ++init.globalState.topEventLoop._activeJsAsyncCount;
+          this._handle = t1.setTimeout(H.convertDartClosureToJS(new H.TimerImpl_internalCallback0(this, callback), 0), milliseconds);
+        } else
+          throw H.wrapException(P.UnsupportedError$("Timer greater than 0."));
+      }
+    },
+    static: {TimerImpl$: function(milliseconds, callback) {
+        var t1 = new H.TimerImpl(true, false, null);
+        t1.TimerImpl$2(milliseconds, callback);
+        return t1;
+      }}
+  },
+  TimerImpl_internalCallback: {
+    "^": "Closure:18;this_0,callback_1",
+    call$0: [function() {
+      this.this_0._handle = null;
+      this.callback_1.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  TimerImpl_internalCallback0: {
+    "^": "Closure:18;this_2,callback_3",
+    call$0: [function() {
+      this.this_2._handle = null;
+      H.leaveJsAsync();
+      this.callback_3.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  CapabilityImpl: {
+    "^": "Object;__isolate_helper$_id>",
+    get$hashCode: function(_) {
+      var hash, t1, t2;
+      hash = this.__isolate_helper$_id;
+      t1 = J.getInterceptor$n(hash);
+      t2 = t1.$shr(hash, 0);
+      t1 = t1.$tdiv(hash, 4294967296);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      hash = t2 ^ t1;
+      hash = (~hash >>> 0) + (hash << 15 >>> 0) & 4294967295;
+      hash = ((hash ^ hash >>> 12) >>> 0) * 5 & 4294967295;
+      hash = ((hash ^ hash >>> 4) >>> 0) * 2057 & 4294967295;
+      return (hash ^ hash >>> 16) >>> 0;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (other === this)
+        return true;
+      if (!!J.getInterceptor(other).$isCapabilityImpl) {
+        t1 = this.__isolate_helper$_id;
+        t2 = other.__isolate_helper$_id;
+        return t1 == null ? t2 == null : t1 === t2;
+      }
+      return false;
+    },
+    $isCapabilityImpl: true,
+    $isCapability: true
+  }
+}],
+["_js_helper", "dart:_js_helper", , H, {
+  "^": "",
+  isJsIndexable: function(object, record) {
+    var result;
+    if (record != null) {
+      result = record.x;
+      if (result != null)
+        return result;
+    }
+    return !!J.getInterceptor(object).$isJavaScriptIndexingBehavior;
+  },
+  S: function(value) {
+    var res;
+    if (typeof value === "string")
+      return value;
+    if (typeof value === "number") {
+      if (value !== 0)
+        return "" + value;
+    } else if (true === value)
+      return "true";
+    else if (false === value)
+      return "false";
+    else if (value == null)
+      return "null";
+    res = J.toString$0(value);
+    if (typeof res !== "string")
+      throw H.wrapException(P.ArgumentError$(value));
+    return res;
+  },
+  Primitives_objectHashCode: function(object) {
+    var hash = object.$identityHash;
+    if (hash == null) {
+      hash = Math.random() * 0x3fffffff | 0;
+      object.$identityHash = hash;
+    }
+    return hash;
+  },
+  Primitives__throwFormatException: [function(string) {
+    throw H.wrapException(P.FormatException$(string));
+  }, "call$1", "Primitives__throwFormatException$closure", 2, 0, 5],
+  Primitives_parseInt: function(source, radix, handleError) {
+    var match, t1, maxCharCode, digitsPart, i, t2;
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    match = /^\s*[+-]?((0x[a-f0-9]+)|(\d+)|([a-z0-9]+))\s*$/i.exec(source);
+    if (radix == null) {
+      if (match != null) {
+        t1 = match.length;
+        if (2 >= t1)
+          return H.ioore(match, 2);
+        if (match[2] != null)
+          return parseInt(source, 16);
+        if (3 >= t1)
+          return H.ioore(match, 3);
+        if (match[3] != null)
+          return parseInt(source, 10);
+        return handleError.call$1(source);
+      }
+      radix = 10;
+    } else {
+      if (radix < 2 || radix > 36)
+        throw H.wrapException(P.RangeError$("Radix " + H.S(radix) + " not in range 2..36"));
+      if (match != null) {
+        if (radix === 10) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] != null;
+        } else
+          t1 = false;
+        if (t1)
+          return parseInt(source, 10);
+        if (!(radix < 10)) {
+          if (3 >= match.length)
+            return H.ioore(match, 3);
+          t1 = match[3] == null;
+        } else
+          t1 = true;
+        if (t1) {
+          maxCharCode = radix <= 10 ? 48 + radix - 1 : 97 + radix - 10 - 1;
+          if (1 >= match.length)
+            return H.ioore(match, 1);
+          digitsPart = match[1];
+          t1 = J.getInterceptor$asx(digitsPart);
+          i = 0;
+          while (true) {
+            t2 = t1.get$length(digitsPart);
+            if (typeof t2 !== "number")
+              return H.iae(t2);
+            if (!(i < t2))
+              break;
+            t1.codeUnitAt$1(digitsPart, 0);
+            if (t1.codeUnitAt$1(digitsPart, i) > maxCharCode)
+              return handleError.call$1(source);
+            ++i;
+          }
+        }
+      }
+    }
+    if (match == null)
+      return handleError.call$1(source);
+    return parseInt(source, radix);
+  },
+  Primitives_parseDouble: function(source, handleError) {
+    var result, trimmed;
+    if (typeof source !== "string")
+      H.throwExpression(P.ArgumentError$(source));
+    if (handleError == null)
+      handleError = H.Primitives__throwFormatException$closure();
+    if (!/^\s*[+-]?(?:Infinity|NaN|(?:\.\d+|\d+(?:\.\d*)?)(?:[eE][+-]?\d+)?)\s*$/.test(source))
+      return handleError.call$1(source);
+    result = parseFloat(source);
+    if (isNaN(result)) {
+      trimmed = J.trim$0$s(source);
+      if (trimmed === "NaN" || trimmed === "+NaN" || trimmed === "-NaN")
+        return result;
+      return handleError.call$1(source);
+    }
+    return result;
+  },
+  Primitives_objectTypeName: function(object) {
+    var $name, decompiled;
+    $name = C.JS_CONST_8ZY(J.getInterceptor(object));
+    if ($name === "Object") {
+      decompiled = String(object.constructor).match(/^\s*function\s*(\S*)\s*\(/)[1];
+      if (typeof decompiled === "string")
+        $name = /^\w+$/.test(decompiled) ? decompiled : $name;
+    }
+    if ($name.length > 1 && C.JSString_methods.codeUnitAt$1($name, 0) === 36)
+      $name = C.JSString_methods.substring$1($name, 1);
+    return ($name + H.joinArguments(H.getRuntimeTypeInfo(object), 0, null)).replace(/[^<,> ]+/g, function(m) {
+      return init.mangledGlobalNames[m] || m;
+    });
+  },
+  Primitives_objectToString: function(object) {
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Primitives_numMicroseconds: function() {
+    if (typeof window != "undefined" && window !== null) {
+      var performance = window.performance;
+      if (performance != null && typeof performance.webkitNow == "function")
+        return C.JSNumber_methods.toInt$0(Math.floor(1000 * performance.webkitNow()));
+    }
+    return 1000 * Date.now();
+  },
+  Primitives__fromCharCodeApply: function(array) {
+    var end, t1, result, i, subarray, t2;
+    end = array.length;
+    for (t1 = end <= 500, result = "", i = 0; i < end; i += 500) {
+      if (t1)
+        subarray = array;
+      else {
+        t2 = i + 500;
+        t2 = t2 < end ? t2 : end;
+        subarray = array.slice(i, t2);
+      }
+      result += String.fromCharCode.apply(null, subarray);
+    }
+    return result;
+  },
+  Primitives_stringFromCodePoints: function(codePoints) {
+    var a, t1, i;
+    a = [];
+    a.$builtinTypeInfo = [P.$int];
+    t1 = new H.ListIterator(codePoints, codePoints.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(codePoints, 0)];
+    for (; t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i <= 65535)
+        a.push(i);
+      else if (i <= 1114111) {
+        a.push(55296 + (C.JSInt_methods._shrOtherPositive$1(i - 65536, 10) & 1023));
+        a.push(56320 + (i & 1023));
+      } else
+        throw H.wrapException(P.ArgumentError$(i));
+    }
+    return H.Primitives__fromCharCodeApply(a);
+  },
+  Primitives_stringFromCharCodes: function(charCodes) {
+    var t1, i;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(charCodes, charCodes.length, 0, null), [H.getTypeArgumentByIndex(charCodes, 0)]); t1.moveNext$0();) {
+      i = t1._current;
+      if (typeof i !== "number" || Math.floor(i) !== i)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i < 0)
+        throw H.wrapException(P.ArgumentError$(i));
+      if (i > 65535)
+        return H.Primitives_stringFromCodePoints(charCodes);
+    }
+    return H.Primitives__fromCharCodeApply(charCodes);
+  },
+  Primitives_stringFromCharCode: function(charCode) {
+    var bits;
+    if (typeof charCode !== "number")
+      return H.iae(charCode);
+    if (0 <= charCode) {
+      if (charCode <= 65535)
+        return String.fromCharCode(charCode);
+      if (charCode <= 1114111) {
+        bits = charCode - 65536;
+        return String.fromCharCode((55296 | C.JSNumber_methods._shrOtherPositive$1(bits, 10)) >>> 0, (56320 | bits & 1023) >>> 0);
+      }
+    }
+    throw H.wrapException(P.RangeError$range(charCode, 0, 1114111));
+  },
+  Primitives_valueFromDecomposedDate: function(years, month, day, hours, minutes, seconds, milliseconds, isUtc) {
+    var jsMonth, value, t1, date;
+    if (typeof years !== "number" || Math.floor(years) !== years)
+      H.throwExpression(P.ArgumentError$(years));
+    if (typeof month !== "number" || Math.floor(month) !== month)
+      H.throwExpression(P.ArgumentError$(month));
+    if (typeof day !== "number" || Math.floor(day) !== day)
+      H.throwExpression(P.ArgumentError$(day));
+    if (typeof hours !== "number" || Math.floor(hours) !== hours)
+      H.throwExpression(P.ArgumentError$(hours));
+    if (typeof minutes !== "number" || Math.floor(minutes) !== minutes)
+      H.throwExpression(P.ArgumentError$(minutes));
+    if (typeof seconds !== "number" || Math.floor(seconds) !== seconds)
+      H.throwExpression(P.ArgumentError$(seconds));
+    jsMonth = J.$sub$n(month, 1);
+    value = isUtc ? Date.UTC(years, jsMonth, day, hours, minutes, seconds, milliseconds) : new Date(years, jsMonth, day, hours, minutes, seconds, milliseconds).valueOf();
+    if (isNaN(value) || value < -8640000000000000 || value > 8640000000000000)
+      throw H.wrapException(P.ArgumentError$(null));
+    t1 = J.getInterceptor$n(years);
+    if (t1.$le(years, 0) || t1.$lt(years, 100)) {
+      date = new Date(value);
+      if (isUtc)
+        date.setUTCFullYear(years);
+      else
+        date.setFullYear(years);
+      return date.valueOf();
+    }
+    return value;
+  },
+  Primitives_lazyAsJsDate: function(receiver) {
+    if (receiver.date === void 0)
+      receiver.date = new Date(receiver.millisecondsSinceEpoch);
+    return receiver.date;
+  },
+  Primitives_getProperty: function(object, key) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    return object[key];
+  },
+  Primitives_setProperty: function(object, key, value) {
+    if (object == null || typeof object === "boolean" || typeof object === "number" || typeof object === "string")
+      throw H.wrapException(P.ArgumentError$(object));
+    object[key] = value;
+  },
+  Primitives_functionNoSuchMethod: function($function, positionalArguments, namedArguments) {
+    var t1, $arguments, namedArgumentList;
+    t1 = {};
+    t1.argumentCount_0 = 0;
+    $arguments = [];
+    namedArgumentList = [];
+    if (positionalArguments != null) {
+      t1.argumentCount_0 = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    }
+    t1.names_1 = "";
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments))
+      namedArguments.forEach$1(0, new H.Primitives_functionNoSuchMethod_closure(t1, $arguments, namedArgumentList));
+    return J.noSuchMethod$1($function, new H.JSInvocationMirror(C.Symbol_call, "call$" + t1.argumentCount_0 + t1.names_1, 0, $arguments, namedArgumentList, null));
+  },
+  Primitives_applyFunction: function($function, positionalArguments, namedArguments) {
+    var t1, jsFunction, info, t2, defaultArguments, t3, i, index, $arguments, argumentCount;
+    t1 = {};
+    if (namedArguments != null && !namedArguments.get$isEmpty(namedArguments)) {
+      jsFunction = J.getInterceptor($function)["call*"];
+      if (jsFunction == null)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      info = H.ReflectionInfo_ReflectionInfo(jsFunction);
+      if (info == null || !info.areOptionalParametersNamed)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      positionalArguments = positionalArguments != null ? P.List_List$from(positionalArguments, true, null) : [];
+      t2 = info.requiredParameterCount;
+      if (t2 !== positionalArguments.length)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      defaultArguments = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+      for (t3 = info.optionalParameterCount, i = 0; i < t3; ++i) {
+        index = i + t2;
+        defaultArguments.$indexSet(0, info.parameterNameInOrder$1(index), init.metadata[info.defaultValueInOrder$1(index)]);
+      }
+      t1.bad_0 = false;
+      namedArguments.forEach$1(0, new H.Primitives_applyFunction_closure(t1, defaultArguments));
+      if (t1.bad_0)
+        return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+      C.JSArray_methods.addAll$1(positionalArguments, defaultArguments.get$values(defaultArguments));
+      return jsFunction.apply($function, positionalArguments);
+    }
+    $arguments = [];
+    if (positionalArguments != null) {
+      argumentCount = positionalArguments.length;
+      C.JSArray_methods.addAll$1($arguments, positionalArguments);
+    } else
+      argumentCount = 0;
+    jsFunction = $function["call$" + argumentCount];
+    if (jsFunction == null)
+      return H.Primitives_functionNoSuchMethod($function, positionalArguments, namedArguments);
+    return jsFunction.apply($function, $arguments);
+  },
+  iae: function(argument) {
+    throw H.wrapException(P.ArgumentError$(argument));
+  },
+  ioore: function(receiver, index) {
+    if (receiver == null)
+      J.get$length$asx(receiver);
+    if (typeof index !== "number" || Math.floor(index) !== index)
+      H.iae(index);
+    throw H.wrapException(P.RangeError$value(index));
+  },
+  wrapException: function(ex) {
+    var wrapper;
+    if (ex == null)
+      ex = new P.NullThrownError();
+    wrapper = new Error();
+    wrapper.dartException = ex;
+    if ("defineProperty" in Object) {
+      Object.defineProperty(wrapper, "message", {get: H.toStringWrapper});
+      wrapper.name = "";
+    } else
+      wrapper.toString = H.toStringWrapper;
+    return wrapper;
+  },
+  toStringWrapper: [function() {
+    return J.toString$0(this.dartException);
+  }, "call$0", "toStringWrapper$closure", 0, 0, null],
+  throwExpression: function(ex) {
+    throw H.wrapException(ex);
+  },
+  unwrapException: function(ex) {
+    var t1, message, number, ieErrorCode, t2, t3, t4, nullLiteralCall, t5, t6, t7, t8, t9, match;
+    t1 = new H.unwrapException_saveStackTrace(ex);
+    if (ex == null)
+      return;
+    if (typeof ex !== "object")
+      return ex;
+    if ("dartException" in ex)
+      return t1.call$1(ex.dartException);
+    else if (!("message" in ex))
+      return ex;
+    message = ex.message;
+    if ("number" in ex && typeof ex.number == "number") {
+      number = ex.number;
+      ieErrorCode = number & 65535;
+      if ((C.JSInt_methods._shrOtherPositive$1(number, 16) & 8191) === 10)
+        switch (ieErrorCode) {
+          case 438:
+            return t1.call$1(H.JsNoSuchMethodError$(H.S(message) + " (Error " + ieErrorCode + ")", null));
+          case 445:
+          case 5007:
+            t2 = H.S(message) + " (Error " + ieErrorCode + ")";
+            return t1.call$1(new H.NullError(t2, null));
+        }
+    }
+    if (ex instanceof TypeError) {
+      t2 = $.get$TypeErrorDecoder_noSuchMethodPattern();
+      t3 = $.get$TypeErrorDecoder_notClosurePattern();
+      t4 = $.get$TypeErrorDecoder_nullCallPattern();
+      nullLiteralCall = $.get$TypeErrorDecoder_nullLiteralCallPattern();
+      t5 = $.get$TypeErrorDecoder_undefinedCallPattern();
+      t6 = $.get$TypeErrorDecoder_undefinedLiteralCallPattern();
+      t7 = $.get$TypeErrorDecoder_nullPropertyPattern();
+      $.get$TypeErrorDecoder_nullLiteralPropertyPattern();
+      t8 = $.get$TypeErrorDecoder_undefinedPropertyPattern();
+      t9 = $.get$TypeErrorDecoder_undefinedLiteralPropertyPattern();
+      match = t2.matchTypeError$1(message);
+      if (match != null)
+        return t1.call$1(H.JsNoSuchMethodError$(message, match));
+      else {
+        match = t3.matchTypeError$1(message);
+        if (match != null) {
+          match.method = "call";
+          return t1.call$1(H.JsNoSuchMethodError$(message, match));
+        } else {
+          match = t4.matchTypeError$1(message);
+          if (match == null) {
+            match = nullLiteralCall.matchTypeError$1(message);
+            if (match == null) {
+              match = t5.matchTypeError$1(message);
+              if (match == null) {
+                match = t6.matchTypeError$1(message);
+                if (match == null) {
+                  match = t7.matchTypeError$1(message);
+                  if (match == null) {
+                    match = nullLiteralCall.matchTypeError$1(message);
+                    if (match == null) {
+                      match = t8.matchTypeError$1(message);
+                      if (match == null) {
+                        match = t9.matchTypeError$1(message);
+                        t2 = match != null;
+                      } else
+                        t2 = true;
+                    } else
+                      t2 = true;
+                  } else
+                    t2 = true;
+                } else
+                  t2 = true;
+              } else
+                t2 = true;
+            } else
+              t2 = true;
+          } else
+            t2 = true;
+          if (t2) {
+            t2 = match == null ? null : match.method;
+            return t1.call$1(new H.NullError(message, t2));
+          }
+        }
+      }
+      t2 = typeof message === "string" ? message : "";
+      return t1.call$1(new H.UnknownJsTypeError(t2));
+    }
+    if (ex instanceof RangeError) {
+      if (typeof message === "string" && message.indexOf("call stack") !== -1)
+        return new P.StackOverflowError();
+      return t1.call$1(new P.ArgumentError(null));
+    }
+    if (typeof InternalError == "function" && ex instanceof InternalError)
+      if (typeof message === "string" && message === "too much recursion")
+        return new P.StackOverflowError();
+    return ex;
+  },
+  objectHashCode: function(object) {
+    if (object == null || typeof object != 'object')
+      return J.get$hashCode$(object);
+    else
+      return H.Primitives_objectHashCode(object);
+  },
+  fillLiteralMap: function(keyValuePairs, result) {
+    var $length, index, index0, index1;
+    $length = keyValuePairs.length;
+    for (index = 0; index < $length; index = index1) {
+      index0 = index + 1;
+      index1 = index0 + 1;
+      result.$indexSet(0, keyValuePairs[index], keyValuePairs[index0]);
+    }
+    return result;
+  },
+  invokeClosure: [function(closure, isolate, numberOfArguments, arg1, arg2, arg3, arg4) {
+    var t1 = J.getInterceptor(numberOfArguments);
+    if (t1.$eq(numberOfArguments, 0))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure(closure));
+    else if (t1.$eq(numberOfArguments, 1))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure0(closure, arg1));
+    else if (t1.$eq(numberOfArguments, 2))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure1(closure, arg1, arg2));
+    else if (t1.$eq(numberOfArguments, 3))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure2(closure, arg1, arg2, arg3));
+    else if (t1.$eq(numberOfArguments, 4))
+      return H._callInIsolate(isolate, new H.invokeClosure_closure3(closure, arg1, arg2, arg3, arg4));
+    else
+      throw H.wrapException(P.Exception_Exception("Unsupported number of arguments for wrapped closure"));
+  }, "call$7", "invokeClosure$closure", 14, 0, null, 6, 7, 8, 9, 10, 11, 12],
+  convertDartClosureToJS: function(closure, arity) {
+    var $function;
+    if (closure == null)
+      return;
+    $function = closure.$identity;
+    if (!!$function)
+      return $function;
+    $function = function(closure, arity, context, invoke) {
+      return function(a1, a2, a3, a4) {
+        return invoke(closure, context, arity, a1, a2, a3, a4);
+      };
+    }(closure, arity, init.globalState.currentContext, H.invokeClosure);
+    closure.$identity = $function;
+    return $function;
+  },
+  Closure_fromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, propertyName) {
+    var $function, callName, functionType, $prototype, $constructor, t1, isIntercepted, trampoline, signatureFunction, getReceiver, i, stub, stubCallName, t2;
+    $function = functions[0];
+    $function.$stubName;
+    callName = $function.$callName;
+    $function.$reflectionInfo = reflectionInfo;
+    functionType = H.ReflectionInfo_ReflectionInfo($function).functionType;
+    $prototype = isStatic ? Object.create(new H.TearOffClosure().constructor.prototype) : Object.create(new H.BoundClosure(null, null, null, null).constructor.prototype);
+    $prototype.$initialize = $prototype.constructor;
+    if (isStatic)
+      $constructor = function() {
+        this.$initialize();
+      };
+    else if (typeof dart_precompiled == "function") {
+      t1 = function(a, b, c, d) {
+        this.$initialize(a, b, c, d);
+      };
+      $constructor = t1;
+    } else {
+      t1 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t1, 1);
+      t1 = new Function("a", "b", "c", "d", "this.$initialize(a,b,c,d);" + t1);
+      $constructor = t1;
+    }
+    $prototype.constructor = $constructor;
+    $constructor.prototype = $prototype;
+    t1 = !isStatic;
+    if (t1) {
+      isIntercepted = jsArguments.length == 1 && true;
+      trampoline = H.Closure_forwardCallTo(receiver, $function, isIntercepted);
+      trampoline.$reflectionInfo = reflectionInfo;
+    } else {
+      $prototype.$name = propertyName;
+      trampoline = $function;
+      isIntercepted = false;
+    }
+    if (typeof functionType == "number")
+      signatureFunction = function(s) {
+        return function() {
+          return init.metadata[s];
+        };
+      }(functionType);
+    else if (t1 && typeof functionType == "function") {
+      getReceiver = isIntercepted ? H.BoundClosure_receiverOf : H.BoundClosure_selfOf;
+      signatureFunction = function(f, r) {
+        return function() {
+          return f.apply({$receiver: r(this)}, arguments);
+        };
+      }(functionType, getReceiver);
+    } else
+      throw H.wrapException("Error in reflectionInfo.");
+    $prototype.$signature = signatureFunction;
+    $prototype[callName] = trampoline;
+    for (t1 = functions.length, i = 1; i < t1; ++i) {
+      stub = functions[i];
+      stubCallName = stub.$callName;
+      if (stubCallName != null) {
+        t2 = isStatic ? stub : H.Closure_forwardCallTo(receiver, stub, isIntercepted);
+        $prototype[stubCallName] = t2;
+      }
+    }
+    $prototype["call*"] = trampoline;
+    return $constructor;
+  },
+  Closure_cspForwardCall: function(arity, isSuperCall, stubName, $function) {
+    var getSelf = H.BoundClosure_selfOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        return function(n, S) {
+          return function() {
+            return S(this)[n]();
+          };
+        }(stubName, getSelf);
+      case 1:
+        return function(n, S) {
+          return function(a) {
+            return S(this)[n](a);
+          };
+        }(stubName, getSelf);
+      case 2:
+        return function(n, S) {
+          return function(a, b) {
+            return S(this)[n](a, b);
+          };
+        }(stubName, getSelf);
+      case 3:
+        return function(n, S) {
+          return function(a, b, c) {
+            return S(this)[n](a, b, c);
+          };
+        }(stubName, getSelf);
+      case 4:
+        return function(n, S) {
+          return function(a, b, c, d) {
+            return S(this)[n](a, b, c, d);
+          };
+        }(stubName, getSelf);
+      case 5:
+        return function(n, S) {
+          return function(a, b, c, d, e) {
+            return S(this)[n](a, b, c, d, e);
+          };
+        }(stubName, getSelf);
+      default:
+        return function(f, s) {
+          return function() {
+            return f.apply(s(this), arguments);
+          };
+        }($function, getSelf);
+    }
+  },
+  Closure_forwardCallTo: function(receiver, $function, isIntercepted) {
+    var stubName, arity, lookedUpFunction, t1, t2, $arguments;
+    if (isIntercepted)
+      return H.Closure_forwardInterceptedCallTo(receiver, $function);
+    stubName = $function.$stubName;
+    arity = $function.length;
+    lookedUpFunction = receiver[stubName];
+    t1 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (typeof dart_precompiled == "function" || !t1 || arity >= 27)
+      return H.Closure_cspForwardCall(arity, !t1, stubName, $function);
+    if (arity === 0) {
+      t1 = $.BoundClosure_selfFieldNameCache;
+      if (t1 == null) {
+        t1 = H.BoundClosure_computeFieldNamed("self");
+        $.BoundClosure_selfFieldNameCache = t1;
+      }
+      t1 = "return function(){return this." + H.S(t1) + "." + H.S(stubName) + "();";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity).join(",");
+    t1 = "return function(" + $arguments + "){return this.";
+    t2 = $.BoundClosure_selfFieldNameCache;
+    if (t2 == null) {
+      t2 = H.BoundClosure_computeFieldNamed("self");
+      $.BoundClosure_selfFieldNameCache = t2;
+    }
+    t2 = t1 + H.S(t2) + "." + H.S(stubName) + "(" + $arguments + ");";
+    t1 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t1, 1);
+    return new Function(t2 + H.S(t1) + "}")();
+  },
+  Closure_cspForwardInterceptedCall: function(arity, isSuperCall, $name, $function) {
+    var getSelf, getReceiver;
+    getSelf = H.BoundClosure_selfOf;
+    getReceiver = H.BoundClosure_receiverOf;
+    switch (isSuperCall ? -1 : arity) {
+      case 0:
+        throw H.wrapException(H.RuntimeError$("Intercepted function with no arguments."));
+      case 1:
+        return function(n, s, r) {
+          return function() {
+            return s(this)[n](r(this));
+          };
+        }($name, getSelf, getReceiver);
+      case 2:
+        return function(n, s, r) {
+          return function(a) {
+            return s(this)[n](r(this), a);
+          };
+        }($name, getSelf, getReceiver);
+      case 3:
+        return function(n, s, r) {
+          return function(a, b) {
+            return s(this)[n](r(this), a, b);
+          };
+        }($name, getSelf, getReceiver);
+      case 4:
+        return function(n, s, r) {
+          return function(a, b, c) {
+            return s(this)[n](r(this), a, b, c);
+          };
+        }($name, getSelf, getReceiver);
+      case 5:
+        return function(n, s, r) {
+          return function(a, b, c, d) {
+            return s(this)[n](r(this), a, b, c, d);
+          };
+        }($name, getSelf, getReceiver);
+      case 6:
+        return function(n, s, r) {
+          return function(a, b, c, d, e) {
+            return s(this)[n](r(this), a, b, c, d, e);
+          };
+        }($name, getSelf, getReceiver);
+      default:
+        return function(f, s, r, a) {
+          return function() {
+            a = [r(this)];
+            Array.prototype.push.apply(a, arguments);
+            return f.apply(s(this), a);
+          };
+        }($function, getSelf, getReceiver);
+    }
+  },
+  Closure_forwardInterceptedCallTo: function(receiver, $function) {
+    var selfField, t1, stubName, arity, isCsp, lookedUpFunction, t2, $arguments;
+    selfField = H.BoundClosure_selfFieldName();
+    t1 = $.BoundClosure_receiverFieldNameCache;
+    if (t1 == null) {
+      t1 = H.BoundClosure_computeFieldNamed("receiver");
+      $.BoundClosure_receiverFieldNameCache = t1;
+    }
+    stubName = $function.$stubName;
+    arity = $function.length;
+    isCsp = typeof dart_precompiled == "function";
+    lookedUpFunction = receiver[stubName];
+    t2 = $function == null ? lookedUpFunction == null : $function === lookedUpFunction;
+    if (isCsp || !t2 || arity >= 28)
+      return H.Closure_cspForwardInterceptedCall(arity, !t2, stubName, $function);
+    if (arity === 1) {
+      t1 = "return function(){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ");";
+      t2 = $.Closure_functionCounter;
+      $.Closure_functionCounter = J.$add$ns(t2, 1);
+      return new Function(t1 + H.S(t2) + "}")();
+    }
+    $arguments = "abcdefghijklmnopqrstuvwxyz".split("").splice(0, arity - 1).join(",");
+    t1 = "return function(" + $arguments + "){return this." + H.S(selfField) + "." + H.S(stubName) + "(this." + H.S(t1) + ", " + $arguments + ");";
+    t2 = $.Closure_functionCounter;
+    $.Closure_functionCounter = J.$add$ns(t2, 1);
+    return new Function(t1 + H.S(t2) + "}")();
+  },
+  closureFromTearOff: function(receiver, functions, reflectionInfo, isStatic, jsArguments, $name) {
+    functions.fixed$length = init;
+    reflectionInfo.fixed$length = init;
+    return H.Closure_fromTearOff(receiver, functions, reflectionInfo, !!isStatic, jsArguments, $name);
+  },
+  propertyTypeCastError: function(value, property) {
+    var t1 = J.getInterceptor$asx(property);
+    throw H.wrapException(H.CastErrorImplementation$(H.Primitives_objectTypeName(value), t1.substring$2(property, 3, t1.get$length(property))));
+  },
+  interceptedTypeCast: function(value, property) {
+    var t1;
+    if (value != null)
+      t1 = typeof value === "object" && J.getInterceptor(value)[property];
+    else
+      t1 = true;
+    if (t1)
+      return value;
+    H.propertyTypeCastError(value, property);
+  },
+  throwCyclicInit: function(staticName) {
+    throw H.wrapException(P.CyclicInitializationError$("Cyclic initialization for static " + H.S(staticName)));
+  },
+  buildFunctionType: function(returnType, parameterTypes, optionalParameterTypes) {
+    return new H.RuntimeFunctionType(returnType, parameterTypes, optionalParameterTypes, null);
+  },
+  buildInterfaceType: function(rti, typeArguments) {
+    var $name = rti.name;
+    if (typeArguments == null || typeArguments.length === 0)
+      return new H.RuntimeTypePlain($name);
+    return new H.RuntimeTypeGeneric($name, typeArguments, null);
+  },
+  getDynamicRuntimeType: function() {
+    return C.C_DynamicRuntimeType;
+  },
+  createRuntimeType: function($name) {
+    return new H.TypeImpl($name, null);
+  },
+  setRuntimeTypeInfo: function(target, typeInfo) {
+    if (target != null)
+      target.$builtinTypeInfo = typeInfo;
+    return target;
+  },
+  getRuntimeTypeInfo: function(target) {
+    if (target == null)
+      return;
+    return target.$builtinTypeInfo;
+  },
+  getRuntimeTypeArguments: function(target, substitutionName) {
+    return H.substitute(target["$as" + H.S(substitutionName)], H.getRuntimeTypeInfo(target));
+  },
+  getRuntimeTypeArgument: function(target, substitutionName, index) {
+    var $arguments = H.getRuntimeTypeArguments(target, substitutionName);
+    return $arguments == null ? null : $arguments[index];
+  },
+  getTypeArgumentByIndex: function(target, index) {
+    var rti = H.getRuntimeTypeInfo(target);
+    return rti == null ? null : rti[index];
+  },
+  runtimeTypeToString: function(type, onTypeVariable) {
+    if (type == null)
+      return "dynamic";
+    else if (typeof type === "object" && type !== null && type.constructor === Array)
+      return type[0].builtin$cls + H.joinArguments(type, 1, onTypeVariable);
+    else if (typeof type == "function")
+      return type.builtin$cls;
+    else if (typeof type === "number" && Math.floor(type) === type)
+      return C.JSInt_methods.toString$0(type);
+    else
+      return;
+  },
+  joinArguments: function(types, startIndex, onTypeVariable) {
+    var buffer, index, firstArgument, allDynamic, argument, str;
+    if (types == null)
+      return "";
+    buffer = P.StringBuffer$("");
+    for (index = startIndex, firstArgument = true, allDynamic = true; index < types.length; ++index) {
+      if (firstArgument)
+        firstArgument = false;
+      else
+        buffer._contents += ", ";
+      argument = types[index];
+      if (argument != null)
+        allDynamic = false;
+      str = H.runtimeTypeToString(argument, onTypeVariable);
+      buffer._contents += typeof str === "string" ? str : H.S(str);
+    }
+    return allDynamic ? "" : "<" + H.S(buffer) + ">";
+  },
+  getRuntimeTypeString: function(object) {
+    var className = J.getInterceptor(object).constructor.builtin$cls;
+    if (object == null)
+      return className;
+    return className + H.joinArguments(object.$builtinTypeInfo, 0, null);
+  },
+  substitute: function(substitution, $arguments) {
+    if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+      $arguments = substitution;
+    else if (typeof substitution == "function") {
+      substitution = H.invokeOn(substitution, null, $arguments);
+      if (typeof substitution === "object" && substitution !== null && substitution.constructor === Array)
+        $arguments = substitution;
+      else if (typeof substitution == "function")
+        $arguments = H.invokeOn(substitution, null, $arguments);
+    }
+    return $arguments;
+  },
+  checkSubtype: function(object, isField, checks, asField) {
+    var $arguments, interceptor;
+    if (object == null)
+      return false;
+    $arguments = H.getRuntimeTypeInfo(object);
+    interceptor = J.getInterceptor(object);
+    if (interceptor[isField] == null)
+      return false;
+    return H.areSubtypes(H.substitute(interceptor[asField], $arguments), checks);
+  },
+  areSubtypes: function(s, t) {
+    var len, i;
+    if (s == null || t == null)
+      return true;
+    len = s.length;
+    for (i = 0; i < len; ++i)
+      if (!H.isSubtype(s[i], t[i]))
+        return false;
+    return true;
+  },
+  computeSignature: function(signature, context, contextName) {
+    return H.invokeOn(signature, context, H.getRuntimeTypeArguments(context, contextName));
+  },
+  checkSubtypeOfRuntimeType: function(o, t) {
+    var rti, type;
+    if (o == null)
+      return t == null || t.builtin$cls === "Object" || t.builtin$cls === "Null";
+    if (t == null)
+      return true;
+    rti = H.getRuntimeTypeInfo(o);
+    o = J.getInterceptor(o);
+    if (rti != null) {
+      type = rti.slice();
+      type.splice(0, 0, o);
+    } else
+      type = o;
+    return H.isSubtype(type, t);
+  },
+  isSubtype: function(s, t) {
+    var targetSignatureFunction, t1, typeOfS, t2, typeOfT, $name, substitution;
+    if (s === t)
+      return true;
+    if (s == null || t == null)
+      return true;
+    if ("func" in t) {
+      if (!("func" in s)) {
+        if ("$is_" + H.S(t.func) in s)
+          return true;
+        targetSignatureFunction = s.$signature;
+        if (targetSignatureFunction == null)
+          return false;
+        s = targetSignatureFunction.apply(s, null);
+      }
+      return H.isFunctionSubtype(s, t);
+    }
+    if (t.builtin$cls === "Function" && "func" in s)
+      return true;
+    t1 = typeof s === "object" && s !== null && s.constructor === Array;
+    typeOfS = t1 ? s[0] : s;
+    t2 = typeof t === "object" && t !== null && t.constructor === Array;
+    typeOfT = t2 ? t[0] : t;
+    $name = H.runtimeTypeToString(typeOfT, null);
+    if (typeOfT !== typeOfS) {
+      if (!("$is" + H.S($name) in typeOfS))
+        return false;
+      substitution = typeOfS["$as" + H.S(H.runtimeTypeToString(typeOfT, null))];
+    } else
+      substitution = null;
+    if (!t1 && substitution == null || !t2)
+      return true;
+    t1 = t1 ? s.slice(1) : null;
+    t2 = t2 ? t.slice(1) : null;
+    return H.areSubtypes(H.substitute(substitution, t1), t2);
+  },
+  areAssignable: function(s, t, allowShorter) {
+    var sLength, tLength, i, t1, t2;
+    if (t == null && s == null)
+      return true;
+    if (t == null)
+      return allowShorter;
+    if (s == null)
+      return false;
+    sLength = s.length;
+    tLength = t.length;
+    if (allowShorter) {
+      if (sLength < tLength)
+        return false;
+    } else if (sLength !== tLength)
+      return false;
+    for (i = 0; i < tLength; ++i) {
+      t1 = s[i];
+      t2 = t[i];
+      if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+        return false;
+    }
+    return true;
+  },
+  areAssignableMaps: function(s, t) {
+    var t1, names, i, $name, tType, sType;
+    if (t == null)
+      return true;
+    if (s == null)
+      return false;
+    t1 = Object.getOwnPropertyNames(t);
+    t1.fixed$length = init;
+    names = t1;
+    for (t1 = names.length, i = 0; i < t1; ++i) {
+      $name = names[i];
+      if (!Object.hasOwnProperty.call(s, $name))
+        return false;
+      tType = t[$name];
+      sType = s[$name];
+      if (!(H.isSubtype(tType, sType) || H.isSubtype(sType, tType)))
+        return false;
+    }
+    return true;
+  },
+  isFunctionSubtype: function(s, t) {
+    var sReturnType, tReturnType, sParameterTypes, tParameterTypes, sOptionalParameterTypes, tOptionalParameterTypes, sParametersLen, tParametersLen, sOptionalParametersLen, tOptionalParametersLen, pos, t1, t2, tPos, sPos;
+    if (!("func" in s))
+      return false;
+    if ("void" in s) {
+      if (!("void" in t) && "ret" in t)
+        return false;
+    } else if (!("void" in t)) {
+      sReturnType = s.ret;
+      tReturnType = t.ret;
+      if (!(H.isSubtype(sReturnType, tReturnType) || H.isSubtype(tReturnType, sReturnType)))
+        return false;
+    }
+    sParameterTypes = s.args;
+    tParameterTypes = t.args;
+    sOptionalParameterTypes = s.opt;
+    tOptionalParameterTypes = t.opt;
+    sParametersLen = sParameterTypes != null ? sParameterTypes.length : 0;
+    tParametersLen = tParameterTypes != null ? tParameterTypes.length : 0;
+    sOptionalParametersLen = sOptionalParameterTypes != null ? sOptionalParameterTypes.length : 0;
+    tOptionalParametersLen = tOptionalParameterTypes != null ? tOptionalParameterTypes.length : 0;
+    if (sParametersLen > tParametersLen)
+      return false;
+    if (sParametersLen + sOptionalParametersLen < tParametersLen + tOptionalParametersLen)
+      return false;
+    if (sParametersLen === tParametersLen) {
+      if (!H.areAssignable(sParameterTypes, tParameterTypes, false))
+        return false;
+      if (!H.areAssignable(sOptionalParameterTypes, tOptionalParameterTypes, true))
+        return false;
+    } else {
+      for (pos = 0; pos < sParametersLen; ++pos) {
+        t1 = sParameterTypes[pos];
+        t2 = tParameterTypes[pos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = pos, sPos = 0; tPos < tParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+      for (tPos = 0; tPos < tOptionalParametersLen; ++sPos, ++tPos) {
+        t1 = sOptionalParameterTypes[sPos];
+        t2 = tOptionalParameterTypes[tPos];
+        if (!(H.isSubtype(t1, t2) || H.isSubtype(t2, t1)))
+          return false;
+      }
+    }
+    return H.areAssignableMaps(s.named, t.named);
+  },
+  invokeOn: function($function, receiver, $arguments) {
+    return $function.apply(receiver, $arguments);
+  },
+  toStringForNativeObject: function(obj) {
+    var t1 = $.getTagFunction;
+    return "Instance of " + (t1 == null ? "<Unknown>" : t1.call$1(obj));
+  },
+  hashCodeForNativeObject: function(object) {
+    return H.Primitives_objectHashCode(object);
+  },
+  defineProperty: function(obj, property, value) {
+    Object.defineProperty(obj, property, {value: value, enumerable: false, writable: true, configurable: true});
+  },
+  lookupAndCacheInterceptor: function(obj) {
+    var tag, record, interceptor, interceptorClass, mark, t1;
+    tag = $.getTagFunction.call$1(obj);
+    record = $.dispatchRecordsForInstanceTags[tag];
+    if (record != null) {
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    interceptor = $.interceptorsForUncacheableTags[tag];
+    if (interceptor != null)
+      return interceptor;
+    interceptorClass = init.interceptorsByTag[tag];
+    if (interceptorClass == null) {
+      tag = $.alternateTagFunction.call$2(obj, tag);
+      if (tag != null) {
+        record = $.dispatchRecordsForInstanceTags[tag];
+        if (record != null) {
+          Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+          return record.i;
+        }
+        interceptor = $.interceptorsForUncacheableTags[tag];
+        if (interceptor != null)
+          return interceptor;
+        interceptorClass = init.interceptorsByTag[tag];
+      }
+    }
+    if (interceptorClass == null)
+      return;
+    interceptor = interceptorClass.prototype;
+    mark = tag[0];
+    if (mark === "!") {
+      record = H.makeLeafDispatchRecord(interceptor);
+      $.dispatchRecordsForInstanceTags[tag] = record;
+      Object.defineProperty(obj, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+      return record.i;
+    }
+    if (mark === "~") {
+      $.interceptorsForUncacheableTags[tag] = interceptor;
+      return interceptor;
+    }
+    if (mark === "-") {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    }
+    if (mark === "+")
+      return H.patchInteriorProto(obj, interceptor);
+    if (mark === "*")
+      throw H.wrapException(P.UnimplementedError$(tag));
+    if (init.leafTags[tag] === true) {
+      t1 = H.makeLeafDispatchRecord(interceptor);
+      Object.defineProperty(Object.getPrototypeOf(obj), init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      return t1.i;
+    } else
+      return H.patchInteriorProto(obj, interceptor);
+  },
+  patchInteriorProto: function(obj, interceptor) {
+    var proto, record;
+    proto = Object.getPrototypeOf(obj);
+    record = J.makeDispatchRecord(interceptor, proto, null, null);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+    return interceptor;
+  },
+  makeLeafDispatchRecord: function(interceptor) {
+    return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+  },
+  makeDefaultDispatchRecord: function(tag, interceptorClass, proto) {
+    var interceptor = interceptorClass.prototype;
+    if (init.leafTags[tag] === true)
+      return J.makeDispatchRecord(interceptor, false, null, !!interceptor.$isJavaScriptIndexingBehavior);
+    else
+      return J.makeDispatchRecord(interceptor, proto, null, null);
+  },
+  initNativeDispatch: function() {
+    if (true === $.initNativeDispatchFlag)
+      return;
+    $.initNativeDispatchFlag = true;
+    H.initNativeDispatchContinue();
+  },
+  initNativeDispatchContinue: function() {
+    var map, tags, fun, i, tag, proto, record, interceptorClass;
+    $.dispatchRecordsForInstanceTags = Object.create(null);
+    $.interceptorsForUncacheableTags = Object.create(null);
+    H.initHooks();
+    map = init.interceptorsByTag;
+    tags = Object.getOwnPropertyNames(map);
+    if (typeof window != "undefined") {
+      window;
+      fun = function() {
+      };
+      for (i = 0; i < tags.length; ++i) {
+        tag = tags[i];
+        proto = $.prototypeForTagFunction.call$1(tag);
+        if (proto != null) {
+          record = H.makeDefaultDispatchRecord(tag, map[tag], proto);
+          if (record != null) {
+            Object.defineProperty(proto, init.dispatchPropertyName, {value: record, enumerable: false, writable: true, configurable: true});
+            fun.prototype = proto;
+          }
+        }
+      }
+    }
+    for (i = 0; i < tags.length; ++i) {
+      tag = tags[i];
+      if (/^[A-Za-z_]/.test(tag)) {
+        interceptorClass = map[tag];
+        map["!" + tag] = interceptorClass;
+        map["~" + tag] = interceptorClass;
+        map["-" + tag] = interceptorClass;
+        map["+" + tag] = interceptorClass;
+        map["*" + tag] = interceptorClass;
+      }
+    }
+  },
+  initHooks: function() {
+    var hooks, transformers, i, transformer, getTag, getUnknownTag, prototypeForTag;
+    hooks = C.JS_CONST_aQP();
+    hooks = H.applyHooksTransformer(C.JS_CONST_0, H.applyHooksTransformer(C.JS_CONST_rr7, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_Fs4, H.applyHooksTransformer(C.JS_CONST_gkc, H.applyHooksTransformer(C.JS_CONST_4hp, H.applyHooksTransformer(C.JS_CONST_QJm(C.JS_CONST_8ZY), hooks)))))));
+    if (typeof dartNativeDispatchHooksTransformer != "undefined") {
+      transformers = dartNativeDispatchHooksTransformer;
+      if (typeof transformers == "function")
+        transformers = [transformers];
+      if (transformers.constructor == Array)
+        for (i = 0; i < transformers.length; ++i) {
+          transformer = transformers[i];
+          if (typeof transformer == "function")
+            hooks = transformer(hooks) || hooks;
+        }
+    }
+    getTag = hooks.getTag;
+    getUnknownTag = hooks.getUnknownTag;
+    prototypeForTag = hooks.prototypeForTag;
+    $.getTagFunction = new H.initHooks_closure(getTag);
+    $.alternateTagFunction = new H.initHooks_closure0(getUnknownTag);
+    $.prototypeForTagFunction = new H.initHooks_closure1(prototypeForTag);
+  },
+  applyHooksTransformer: function(transformer, hooks) {
+    return transformer(hooks) || hooks;
+  },
+  allMatchesInStringUnchecked: function(needle, haystack) {
+    var result, $length, patternLength, startIndex, position, endIndex;
+    result = H.setRuntimeTypeInfo([], [P.Match]);
+    $length = haystack.length;
+    patternLength = needle.length;
+    for (startIndex = 0; true;) {
+      position = C.JSString_methods.indexOf$2(haystack, needle, startIndex);
+      if (position === -1)
+        break;
+      result.push(new H.StringMatch(position, haystack, needle));
+      endIndex = position + patternLength;
+      if (endIndex === $length)
+        break;
+      else
+        startIndex = position === endIndex ? startIndex + 1 : endIndex;
+    }
+    return result;
+  },
+  stringContainsUnchecked: function(receiver, other, startIndex) {
+    var t1, t2;
+    if (typeof other === "string")
+      return C.JSString_methods.indexOf$2(receiver, other, startIndex) !== -1;
+    else {
+      t1 = J.getInterceptor(other);
+      if (!!t1.$isJSSyntaxRegExp) {
+        t1 = C.JSString_methods.substring$1(receiver, startIndex);
+        t2 = other._nativeRegExp;
+        return t2.test(t1);
+      } else
+        return J.get$isNotEmpty$asx(t1.allMatches$1(other, C.JSString_methods.substring$1(receiver, startIndex)));
+    }
+  },
+  stringReplaceAllUnchecked: function(receiver, from, to) {
+    var result, $length, i, t1;
+    if (from === "")
+      if (receiver === "")
+        return to;
+      else {
+        result = P.StringBuffer$("");
+        $length = receiver.length;
+        result.write$1(to);
+        for (i = 0; i < $length; ++i) {
+          t1 = receiver[i];
+          t1 = result._contents += t1;
+          result._contents = t1 + to;
+        }
+        return result._contents;
+      }
+    else
+      return receiver.replace(new RegExp(from.replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), "\\$&"), 'g'), to.replace(/\$/g, "$$$$"));
+  },
+  ConstantMap: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$isNotEmpty: function(_) {
+      return !J.$eq(this.get$length(this), 0);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _throwUnmodifiable$0: function() {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify unmodifiable Map"));
+    },
+    $indexSet: function(_, key, val) {
+      return this._throwUnmodifiable$0();
+    },
+    clear$0: function(_) {
+      return this._throwUnmodifiable$0();
+    },
+    addAll$1: function(_, other) {
+      return this._throwUnmodifiable$0();
+    },
+    $isMap: true
+  },
+  ConstantStringMap: {
+    "^": "ConstantMap;length>,_jsObject,_keys",
+    containsKey$1: function(key) {
+      if (typeof key !== "string")
+        return false;
+      if ("__proto__" === key)
+        return false;
+      return this._jsObject.hasOwnProperty(key);
+    },
+    $index: function(_, key) {
+      if (!this.containsKey$1(key))
+        return;
+      return this._fetch$1(key);
+    },
+    _fetch$1: function(key) {
+      return this._jsObject[key];
+    },
+    forEach$1: function(_, f) {
+      var keys, i, key;
+      keys = this._keys;
+      for (i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        f.call$2(key, this._fetch$1(key));
+      }
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new H._ConstantMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(this._keys, new H.ConstantStringMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    $isEfficientLength: true
+  },
+  ConstantStringMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(key) {
+      return this.this_0._fetch$1(key);
+    }, "call$1", null, 2, 0, null, 76, "call"],
+    $isFunction: true
+  },
+  _ConstantMapKeyIterable: {
+    "^": "IterableBase;__js_helper$_map",
+    get$iterator: function(_) {
+      return J.get$iterator$ax(this.__js_helper$_map._keys);
+    }
+  },
+  JSInvocationMirror: {
+    "^": "Object;__js_helper$_memberName,_internalName,_kind,_arguments,_namedArgumentNames,_namedIndices",
+    get$memberName: function() {
+      return this.__js_helper$_memberName;
+    },
+    get$isMethod: function() {
+      return this._kind === 0;
+    },
+    get$positionalArguments: function() {
+      var t1, argumentCount, list, index;
+      if (this._kind === 1)
+        return C.List_empty;
+      t1 = this._arguments;
+      argumentCount = t1.length - this._namedArgumentNames.length;
+      if (argumentCount === 0)
+        return C.List_empty;
+      list = [];
+      for (index = 0; index < argumentCount; ++index) {
+        if (index >= t1.length)
+          return H.ioore(t1, index);
+        list.push(t1[index]);
+      }
+      list.immutable$list = true;
+      list.fixed$length = true;
+      return list;
+    },
+    get$namedArguments: function() {
+      var t1, namedArgumentCount, t2, namedArgumentsStartIndex, map, i, t3, t4;
+      if (this._kind !== 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      t1 = this._namedArgumentNames;
+      namedArgumentCount = t1.length;
+      t2 = this._arguments;
+      namedArgumentsStartIndex = t2.length - namedArgumentCount;
+      if (namedArgumentCount === 0)
+        return P.LinkedHashMap_LinkedHashMap$_empty(P.Symbol, null);
+      map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, null);
+      for (i = 0; i < namedArgumentCount; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        t4 = namedArgumentsStartIndex + i;
+        if (t4 < 0 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        map.$indexSet(0, new H.Symbol0(t3), t2[t4]);
+      }
+      return map;
+    },
+    static: {"^": "JSInvocationMirror_METHOD,JSInvocationMirror_GETTER,JSInvocationMirror_SETTER"}
+  },
+  ReflectionInfo: {
+    "^": "Object;jsFunction,data>,isAccessor,requiredParameterCount,optionalParameterCount,areOptionalParametersNamed,functionType,cachedSortedIndices",
+    parameterName$1: function(parameter) {
+      var metadataIndex = this.data[parameter + this.optionalParameterCount + 3];
+      return init.metadata[metadataIndex];
+    },
+    defaultValue$1: function(_, parameter) {
+      var t1 = this.requiredParameterCount;
+      if (typeof parameter !== "number")
+        return parameter.$lt();
+      if (parameter < t1)
+        return;
+      return this.data[3 + parameter - t1];
+    },
+    defaultValueInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.defaultValue$1(0, parameter);
+      return this.defaultValue$1(0, this.sortedIndex$1(parameter - t1));
+    },
+    parameterNameInOrder$1: function(parameter) {
+      var t1 = this.requiredParameterCount;
+      if (parameter < t1)
+        return;
+      if (!this.areOptionalParametersNamed || this.optionalParameterCount === 1)
+        return this.parameterName$1(parameter);
+      return this.parameterName$1(this.sortedIndex$1(parameter - t1));
+    },
+    sortedIndex$1: function(unsortedIndex) {
+      var t1, t2, positions, t3, i, index;
+      t1 = {};
+      if (this.cachedSortedIndices == null) {
+        t2 = this.optionalParameterCount;
+        this.cachedSortedIndices = Array(t2);
+        positions = P.LinkedHashMap_LinkedHashMap$_empty(P.String, P.$int);
+        for (t3 = this.requiredParameterCount, i = 0; i < t2; ++i) {
+          index = t3 + i;
+          positions.$indexSet(0, this.parameterName$1(index), index);
+        }
+        t1.index_0 = 0;
+        t2 = positions.get$keys();
+        t2 = P.List_List$from(t2, true, H.getRuntimeTypeArgument(t2, "IterableBase", 0));
+        H.IterableMixinWorkaround_sortList(t2, null);
+        H.IterableMixinWorkaround_forEach(t2, new H.ReflectionInfo_sortedIndex_closure(t1, this, positions));
+      }
+      t1 = this.cachedSortedIndices;
+      if (unsortedIndex < 0 || unsortedIndex >= t1.length)
+        return H.ioore(t1, unsortedIndex);
+      return t1[unsortedIndex];
+    },
+    static: {"^": "ReflectionInfo_REQUIRED_PARAMETERS_INFO,ReflectionInfo_OPTIONAL_PARAMETERS_INFO,ReflectionInfo_FUNCTION_TYPE_INDEX,ReflectionInfo_FIRST_DEFAULT_ARGUMENT", ReflectionInfo_ReflectionInfo: function(jsFunction) {
+        var data, requiredParametersInfo, optionalParametersInfo;
+        data = jsFunction.$reflectionInfo;
+        if (data == null)
+          return;
+        data.fixed$length = init;
+        data = data;
+        requiredParametersInfo = data[0];
+        optionalParametersInfo = data[1];
+        return new H.ReflectionInfo(jsFunction, data, (requiredParametersInfo & 1) === 1, requiredParametersInfo >> 1, optionalParametersInfo >> 1, (optionalParametersInfo & 1) === 1, data[2], null);
+      }}
+  },
+  ReflectionInfo_sortedIndex_closure: {
+    "^": "Closure:5;box_0,this_1,positions_2",
+    call$1: function($name) {
+      var t1, t2, t3;
+      t1 = this.this_1.cachedSortedIndices;
+      t2 = this.box_0.index_0++;
+      t3 = this.positions_2.$index(0, $name);
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      t1[t2] = t3;
+    },
+    $isFunction: true
+  },
+  Primitives_functionNoSuchMethod_closure: {
+    "^": "Closure:77;box_0,arguments_1,namedArgumentList_2",
+    call$2: function($name, argument) {
+      var t1 = this.box_0;
+      t1.names_1 = t1.names_1 + "$" + H.S($name);
+      this.namedArgumentList_2.push($name);
+      this.arguments_1.push(argument);
+      ++t1.argumentCount_0;
+    },
+    $isFunction: true
+  },
+  Primitives_applyFunction_closure: {
+    "^": "Closure:77;box_0,defaultArguments_1",
+    call$2: function(parameter, value) {
+      var t1 = this.defaultArguments_1;
+      if (t1.containsKey$1(parameter))
+        t1.$indexSet(0, parameter, value);
+      else
+        this.box_0.bad_0 = true;
+    },
+    $isFunction: true
+  },
+  TypeErrorDecoder: {
+    "^": "Object;_pattern,_arguments,_argumentsExpr,_expr,_method,_receiver",
+    matchTypeError$1: function(message) {
+      var match, result, t1;
+      match = new RegExp(this._pattern).exec(message);
+      if (match == null)
+        return;
+      result = {};
+      t1 = this._arguments;
+      if (t1 !== -1)
+        result.arguments = match[t1 + 1];
+      t1 = this._argumentsExpr;
+      if (t1 !== -1)
+        result.argumentsExpr = match[t1 + 1];
+      t1 = this._expr;
+      if (t1 !== -1)
+        result.expr = match[t1 + 1];
+      t1 = this._method;
+      if (t1 !== -1)
+        result.method = match[t1 + 1];
+      t1 = this._receiver;
+      if (t1 !== -1)
+        result.receiver = match[t1 + 1];
+      return result;
+    },
+    static: {"^": "TypeErrorDecoder_noSuchMethodPattern,TypeErrorDecoder_notClosurePattern,TypeErrorDecoder_nullCallPattern,TypeErrorDecoder_nullLiteralCallPattern,TypeErrorDecoder_undefinedCallPattern,TypeErrorDecoder_undefinedLiteralCallPattern,TypeErrorDecoder_nullPropertyPattern,TypeErrorDecoder_nullLiteralPropertyPattern,TypeErrorDecoder_undefinedPropertyPattern,TypeErrorDecoder_undefinedLiteralPropertyPattern", TypeErrorDecoder_extractPattern: function(message) {
+        var match, $arguments, argumentsExpr, expr, method, receiver;
+        message = message.replace(String({}), '$receiver$').replace(new RegExp("[[\\]{}()*+?.\\\\^$|]", 'g'), '\\$&');
+        match = message.match(/\\\$[a-zA-Z]+\\\$/g);
+        if (match == null)
+          match = [];
+        $arguments = match.indexOf("\\$arguments\\$");
+        argumentsExpr = match.indexOf("\\$argumentsExpr\\$");
+        expr = match.indexOf("\\$expr\\$");
+        method = match.indexOf("\\$method\\$");
+        receiver = match.indexOf("\\$receiver\\$");
+        return new H.TypeErrorDecoder(message.replace('\\$arguments\\$', '((?:x|[^x])*)').replace('\\$argumentsExpr\\$', '((?:x|[^x])*)').replace('\\$expr\\$', '((?:x|[^x])*)').replace('\\$method\\$', '((?:x|[^x])*)').replace('\\$receiver\\$', '((?:x|[^x])*)'), $arguments, argumentsExpr, expr, method, receiver);
+      }, TypeErrorDecoder_provokeCallErrorOn: function(expression) {
+        return function($expr$) {
+          var $argumentsExpr$ = '$arguments$';
+          try {
+            $expr$.$method$($argumentsExpr$);
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }, TypeErrorDecoder_provokePropertyErrorOn: function(expression) {
+        return function($expr$) {
+          try {
+            $expr$.$method$;
+          } catch (e) {
+            return e.message;
+          }
+
+        }(expression);
+      }}
+  },
+  NullError: {
+    "^": "Error;_message,_method",
+    toString$0: function(_) {
+      var t1 = this._method;
+      if (t1 == null)
+        return "NullError: " + H.S(this._message);
+      return "NullError: Cannot call \"" + H.S(t1) + "\" on null";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true
+  },
+  JsNoSuchMethodError: {
+    "^": "Error;_message,_method,_receiver",
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = this._method;
+      if (t1 == null)
+        return "NoSuchMethodError: " + H.S(this._message);
+      t2 = this._receiver;
+      if (t2 == null)
+        return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" (" + H.S(this._message) + ")";
+      return "NoSuchMethodError: Cannot call \"" + H.S(t1) + "\" on \"" + H.S(t2) + "\" (" + H.S(this._message) + ")";
+    },
+    $isNoSuchMethodError: true,
+    $isError: true,
+    static: {JsNoSuchMethodError$: function(_message, match) {
+        var t1, t2;
+        t1 = match == null;
+        t2 = t1 ? null : match.method;
+        t1 = t1 ? null : match.receiver;
+        return new H.JsNoSuchMethodError(_message, t2, t1);
+      }}
+  },
+  UnknownJsTypeError: {
+    "^": "Error;_message",
+    toString$0: function(_) {
+      var t1 = this._message;
+      return C.JSString_methods.get$isEmpty(t1) ? "Error" : "Error: " + t1;
+    }
+  },
+  unwrapException_saveStackTrace: {
+    "^": "Closure:13;ex_0",
+    call$1: function(error) {
+      if (!!J.getInterceptor(error).$isError)
+        if (error.$thrownJsError == null)
+          error.$thrownJsError = this.ex_0;
+      return error;
+    },
+    $isFunction: true
+  },
+  _StackTrace: {
+    "^": "Object;_exception,_trace",
+    toString$0: function(_) {
+      var t1, trace;
+      t1 = this._trace;
+      if (t1 != null)
+        return t1;
+      t1 = this._exception;
+      trace = typeof t1 === "object" ? t1.stack : null;
+      t1 = trace == null ? "" : trace;
+      this._trace = t1;
+      return t1;
+    }
+  },
+  invokeClosure_closure: {
+    "^": "Closure:69;closure_0",
+    call$0: function() {
+      return this.closure_0.call$0();
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure0: {
+    "^": "Closure:69;closure_1,arg1_2",
+    call$0: function() {
+      return this.closure_1.call$1(this.arg1_2);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure1: {
+    "^": "Closure:69;closure_3,arg1_4,arg2_5",
+    call$0: function() {
+      return this.closure_3.call$2(this.arg1_4, this.arg2_5);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure2: {
+    "^": "Closure:69;closure_6,arg1_7,arg2_8,arg3_9",
+    call$0: function() {
+      return this.closure_6.call$3(this.arg1_7, this.arg2_8, this.arg3_9);
+    },
+    $isFunction: true
+  },
+  invokeClosure_closure3: {
+    "^": "Closure:69;closure_10,arg1_11,arg2_12,arg3_13,arg4_14",
+    call$0: function() {
+      return this.closure_10.call$4(this.arg1_11, this.arg2_12, this.arg3_13, this.arg4_14);
+    },
+    $isFunction: true
+  },
+  Closure: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Closure";
+    },
+    $isFunction: true,
+    get$$call: function() {
+      return this;
+    }
+  },
+  TearOffClosure: {
+    "^": "Closure;"
+  },
+  BoundClosure: {
+    "^": "TearOffClosure;_self,_target,_receiver,__js_helper$_name",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isBoundClosure)
+        return false;
+      return this._self === other._self && this._target === other._target && this._receiver === other._receiver;
+    },
+    get$hashCode: function(_) {
+      var t1, receiverHashCode;
+      t1 = this._receiver;
+      if (t1 == null)
+        receiverHashCode = H.Primitives_objectHashCode(this._self);
+      else
+        receiverHashCode = typeof t1 !== "object" ? J.get$hashCode$(t1) : H.Primitives_objectHashCode(t1);
+      return J.$xor$n(receiverHashCode, H.Primitives_objectHashCode(this._target));
+    },
+    $isBoundClosure: true,
+    static: {"^": "BoundClosure_selfFieldNameCache,BoundClosure_receiverFieldNameCache", BoundClosure_selfOf: function(closure) {
+        return closure._self;
+      }, BoundClosure_receiverOf: function(closure) {
+        return closure._receiver;
+      }, BoundClosure_selfFieldName: function() {
+        var t1 = $.BoundClosure_selfFieldNameCache;
+        if (t1 == null) {
+          t1 = H.BoundClosure_computeFieldNamed("self");
+          $.BoundClosure_selfFieldNameCache = t1;
+        }
+        return t1;
+      }, BoundClosure_computeFieldNamed: function(fieldName) {
+        var template, t1, names, i, $name;
+        template = new H.BoundClosure("self", "target", "receiver", "name");
+        t1 = Object.getOwnPropertyNames(template);
+        t1.fixed$length = init;
+        names = t1;
+        for (t1 = names.length, i = 0; i < t1; ++i) {
+          $name = names[i];
+          if (template[$name] === fieldName)
+            return $name;
+        }
+      }}
+  },
+  CastErrorImplementation: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return this.message;
+    },
+    $isError: true,
+    static: {CastErrorImplementation$: function(actualType, expectedType) {
+        return new H.CastErrorImplementation("CastError: Casting value of type " + H.S(actualType) + " to incompatible type " + H.S(expectedType));
+      }}
+  },
+  RuntimeError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "RuntimeError: " + H.S(this.message);
+    },
+    static: {RuntimeError$: function(message) {
+        return new H.RuntimeError(message);
+      }}
+  },
+  RuntimeType: {
+    "^": "Object;"
+  },
+  RuntimeFunctionType: {
+    "^": "RuntimeType;returnType,parameterTypes,optionalParameterTypes,namedParameters",
+    _isTest$1: function(expression) {
+      var functionTypeObject = this._extractFunctionTypeObjectFrom$1(expression);
+      return functionTypeObject == null ? false : H.isFunctionSubtype(functionTypeObject, this.toRti$0());
+    },
+    _extractFunctionTypeObjectFrom$1: function(o) {
+      var interceptor = J.getInterceptor(o);
+      return "$signature" in interceptor ? interceptor.$signature() : null;
+    },
+    toRti$0: function() {
+      var result, t1, t2, namedRti, keys, i, $name;
+      result = {func: "dynafunc"};
+      t1 = this.returnType;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isVoidRuntimeType)
+        result.void = true;
+      else if (!t2.$isDynamicRuntimeType)
+        result.ret = t1.toRti$0();
+      t1 = this.parameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.args = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0)
+        result.opt = H.RuntimeFunctionType_listToRti(t1);
+      t1 = this.namedParameters;
+      if (t1 != null) {
+        namedRti = {};
+        keys = H.extractKeys(t1);
+        for (t2 = keys.length, i = 0; i < t2; ++i) {
+          $name = keys[i];
+          namedRti[$name] = t1[$name].toRti$0();
+        }
+        result.named = namedRti;
+      }
+      return result;
+    },
+    toString$0: function(_) {
+      var t1, t2, result, needsComma, i, type, keys, $name;
+      t1 = this.parameterTypes;
+      if (t1 != null)
+        for (t2 = t1.length, result = "(", needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+      else {
+        result = "(";
+        needsComma = false;
+      }
+      t1 = this.optionalParameterTypes;
+      if (t1 != null && t1.length !== 0) {
+        result = (needsComma ? result + ", " : result) + "[";
+        for (t2 = t1.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+          type = t1[i];
+          if (needsComma)
+            result += ", ";
+          result += H.S(type);
+        }
+        result += "]";
+      } else {
+        t1 = this.namedParameters;
+        if (t1 != null) {
+          result = (needsComma ? result + ", " : result) + "{";
+          keys = H.extractKeys(t1);
+          for (t2 = keys.length, needsComma = false, i = 0; i < t2; ++i, needsComma = true) {
+            $name = keys[i];
+            if (needsComma)
+              result += ", ";
+            result += H.S(t1[$name].toRti$0()) + " " + $name;
+          }
+          result += "}";
+        }
+      }
+      return result + (") -> " + H.S(this.returnType));
+    },
+    static: {"^": "RuntimeFunctionType_inAssert", RuntimeFunctionType_listToRti: function(list) {
+        var result, t1, i;
+        list = list;
+        result = [];
+        for (t1 = list.length, i = 0; i < t1; ++i)
+          result.push(list[i].toRti$0());
+        return result;
+      }}
+  },
+  DynamicRuntimeType: {
+    "^": "RuntimeType;",
+    toString$0: function(_) {
+      return "dynamic";
+    },
+    toRti$0: function() {
+      return;
+    },
+    $isDynamicRuntimeType: true
+  },
+  RuntimeTypePlain: {
+    "^": "RuntimeType;name>",
+    toRti$0: function() {
+      var t1, rti;
+      t1 = this.name;
+      rti = init.allClasses[t1];
+      if (rti == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "'");
+      return rti;
+    },
+    toString$0: function(_) {
+      return this.name;
+    }
+  },
+  RuntimeTypeGeneric: {
+    "^": "RuntimeType;name>,arguments,rti",
+    toRti$0: function() {
+      var t1, result;
+      t1 = this.rti;
+      if (t1 != null)
+        return t1;
+      t1 = this.name;
+      result = [init.allClasses[t1]];
+      if (0 >= result.length)
+        return H.ioore(result, 0);
+      if (result[0] == null)
+        throw H.wrapException("no type for '" + H.S(t1) + "<...>'");
+      for (t1 = this.arguments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        result.push(t1._current.toRti$0());
+      this.rti = result;
+      return result;
+    },
+    toString$0: function(_) {
+      return H.S(this.name) + "<" + J.join$1$ax(this.arguments, ", ") + ">";
+    }
+  },
+  TypeImpl: {
+    "^": "Object;_typeName,_unmangledName",
+    toString$0: function(_) {
+      var t1, unmangledName;
+      t1 = this._unmangledName;
+      if (t1 != null)
+        return t1;
+      unmangledName = this._typeName.replace(/[^<,> ]+/g, function(m) {
+        return init.mangledGlobalNames[m] || m;
+      });
+      this._unmangledName = unmangledName;
+      return unmangledName;
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this._typeName);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isTypeImpl && J.$eq(this._typeName, other._typeName);
+    },
+    $isTypeImpl: true,
+    $isType: true
+  },
+  initHooks_closure: {
+    "^": "Closure:13;getTag_0",
+    call$1: function(o) {
+      return this.getTag_0(o);
+    },
+    $isFunction: true
+  },
+  initHooks_closure0: {
+    "^": "Closure:78;getUnknownTag_1",
+    call$2: function(o, tag) {
+      return this.getUnknownTag_1(o, tag);
+    },
+    $isFunction: true
+  },
+  initHooks_closure1: {
+    "^": "Closure:5;prototypeForTag_2",
+    call$1: function(tag) {
+      return this.prototypeForTag_2(tag);
+    },
+    $isFunction: true
+  },
+  JSSyntaxRegExp: {
+    "^": "Object;pattern,_nativeRegExp,_nativeGlobalRegExp,_nativeAnchoredRegExp",
+    get$_nativeGlobalVersion: function() {
+      var t1 = this._nativeGlobalRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern, t1.multiline, !t1.ignoreCase, true);
+      this._nativeGlobalRegExp = t1;
+      return t1;
+    },
+    get$_nativeAnchoredVersion: function() {
+      var t1 = this._nativeAnchoredRegExp;
+      if (t1 != null)
+        return t1;
+      t1 = this._nativeRegExp;
+      t1 = H.JSSyntaxRegExp_makeNative(this.pattern + "|()", t1.multiline, !t1.ignoreCase, true);
+      this._nativeAnchoredRegExp = t1;
+      return t1;
+    },
+    firstMatch$1: function(str) {
+      var m;
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      m = this._nativeRegExp.exec(str);
+      if (m == null)
+        return;
+      return H._MatchImplementation$(this, m);
+    },
+    hasMatch$1: function(str) {
+      if (typeof str !== "string")
+        H.throwExpression(P.ArgumentError$(str));
+      return this._nativeRegExp.test(str);
+    },
+    allMatches$1: function(_, str) {
+      return new H._AllMatchesIterable(this, str);
+    },
+    _execGlobal$2: function(string, start) {
+      var regexp, match;
+      regexp = this.get$_nativeGlobalVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      return H._MatchImplementation$(this, match);
+    },
+    _execAnchored$2: function(string, start) {
+      var regexp, match, t1, t2;
+      regexp = this.get$_nativeAnchoredVersion();
+      regexp.lastIndex = start;
+      match = regexp.exec(string);
+      if (match == null)
+        return;
+      t1 = match.length;
+      t2 = t1 - 1;
+      if (t2 < 0)
+        return H.ioore(match, t2);
+      if (match[t2] != null)
+        return;
+      C.JSArray_methods.set$length(match, t2);
+      return H._MatchImplementation$(this, match);
+    },
+    matchAsPrefix$2: function(_, string, start) {
+      var t1;
+      if (start >= 0) {
+        t1 = J.get$length$asx(string);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = start > t1;
+      } else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(P.RangeError$range(start, 0, J.get$length$asx(string)));
+      return this._execAnchored$2(string, start);
+    },
+    matchAsPrefix$1: function($receiver, string) {
+      return this.matchAsPrefix$2($receiver, string, 0);
+    },
+    $isJSSyntaxRegExp: true,
+    $isRegExp: true,
+    static: {JSSyntaxRegExp_makeNative: function(source, multiLine, caseSensitive, global) {
+        var m, i, g, regexp, errorMessage;
+        m = multiLine ? "m" : "";
+        i = caseSensitive ? "" : "i";
+        g = global ? "g" : "";
+        regexp = function() {
+          try {
+            return new RegExp(source, m + i + g);
+          } catch (e) {
+            return e;
+          }
+
+        }();
+        if (regexp instanceof RegExp)
+          return regexp;
+        errorMessage = String(regexp);
+        throw H.wrapException(P.FormatException$("Illegal RegExp pattern: " + source + ", " + errorMessage));
+      }}
+  },
+  _MatchImplementation: {
+    "^": "Object;pattern,_match",
+    $index: function(_, index) {
+      var t1 = this._match;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    _MatchImplementation$2: function(pattern, _match) {
+    },
+    $isMatch: true,
+    static: {_MatchImplementation$: function(pattern, _match) {
+        var t1 = new H._MatchImplementation(pattern, _match);
+        t1._MatchImplementation$2(pattern, _match);
+        return t1;
+      }}
+  },
+  _AllMatchesIterable: {
+    "^": "IterableBase;_re,_string",
+    get$iterator: function(_) {
+      return new H._AllMatchesIterator(this._re, this._string, null);
+    },
+    $asIterableBase: function() {
+      return [P.Match];
+    },
+    $asIterable: function() {
+      return [P.Match];
+    }
+  },
+  _AllMatchesIterator: {
+    "^": "Object;_regExp,_string,__js_helper$_current",
+    get$current: function() {
+      return this.__js_helper$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, index;
+      if (this._string == null)
+        return false;
+      t1 = this.__js_helper$_current;
+      if (t1 != null) {
+        t1 = t1._match;
+        t2 = t1.index;
+        if (0 >= t1.length)
+          return H.ioore(t1, 0);
+        t1 = J.get$length$asx(t1[0]);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        index = t2 + t1;
+        if (this.__js_helper$_current._match.index === index)
+          ++index;
+      } else
+        index = 0;
+      t1 = this._regExp._execGlobal$2(this._string, index);
+      this.__js_helper$_current = t1;
+      if (t1 == null) {
+        this._string = null;
+        return false;
+      }
+      return true;
+    }
+  },
+  StringMatch: {
+    "^": "Object;start,input,pattern",
+    $index: function(_, g) {
+      if (!J.$eq(g, 0))
+        H.throwExpression(P.RangeError$value(g));
+      return this.pattern;
+    },
+    $isMatch: true
+  }
+}],
+["action_link_element", "package:observatory/src/elements/action_link.dart", , X, {
+  "^": "",
+  ActionLinkElement: {
+    "^": "PolymerElement_ChangeNotifier;_action_link_element$__$busy,_action_link_element$__$callback,_action_link_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._action_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._action_link_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._action_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._action_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._action_link_element$__$callback, value);
+    },
+    get$label: function(receiver) {
+      return receiver._action_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._action_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._action_link_element$__$label, value);
+    },
+    doAction$3: [function(receiver, a, b, c) {
+      var t1 = receiver._action_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._action_link_element$__$callback != null) {
+        receiver._action_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$1(receiver, null).whenComplete$1(new X.ActionLinkElement_doAction_closure(receiver));
+      }
+    }, "call$3", "get$doAction", 6, 0, 79, 46, 47, 80],
+    static: {ActionLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._action_link_element$__$busy = false;
+        receiver._action_link_element$__$callback = null;
+        receiver._action_link_element$__$label = "action";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ActionLinkElement_methods.Element$created$0(receiver);
+        C.ActionLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ActionLinkElement_doAction_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      t1._action_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._action_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["app", "package:observatory/app.dart", , G, {
+  "^": "",
+  GoogleChart__initOnceOnComplete: [function(_) {
+    var t1;
+    N.Logger_Logger("").info$1("Google Charts API loaded");
+    t1 = J.$index$asx(J.$index$asx($.get$context(), "google"), "visualization");
+    $.GoogleChart__api = t1;
+    return t1;
+  }, "call$1", "GoogleChart__initOnceOnComplete$closure", 2, 0, 13, 14],
+  Utils_formatPercent: function(a, total) {
+    return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+  },
+  Utils_zeroPad: function(value, pad) {
+    var prefix;
+    for (prefix = ""; pad > 1;) {
+      --pad;
+      if (value < Math.pow(10, pad))
+        prefix += "0";
+    }
+    return prefix + H.S(value);
+  },
+  Utils_formatCommaSeparated: [function(v) {
+    var t1, mod, r;
+    t1 = J.getInterceptor$n(v);
+    if (t1.$lt(v, 1000))
+      return t1.toString$0(v);
+    mod = t1.$mod(v, 1000);
+    v = t1.$tdiv(v, 1000);
+    r = G.Utils_zeroPad(mod, 3);
+    for (; t1 = J.getInterceptor$n(v), t1.$gt(v, 1000);) {
+      r = G.Utils_zeroPad(t1.$mod(v, 1000), 3) + "," + r;
+      v = t1.$tdiv(v, 1000);
+    }
+    return !t1.$eq(v, 0) ? H.S(v) + "," + r : r;
+  }, "call$1", "Utils_formatCommaSeparated$closure", 2, 0, 15],
+  Utils_formatTimePrecise: function(time) {
+    var millis, hours, minutes, seconds;
+    millis = C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(time * 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    millis = C.JSInt_methods.$mod(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(millis, 1000);
+    millis = C.JSInt_methods.$mod(millis, 1000);
+    if (hours > 0)
+      return G.Utils_zeroPad(hours, 2) + ":" + G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+    else
+      return G.Utils_zeroPad(minutes, 2) + ":" + G.Utils_zeroPad(seconds, 2) + "." + G.Utils_zeroPad(millis, 3);
+  },
+  Utils_formatSize: [function(bytes) {
+    var t1 = J.getInterceptor$n(bytes);
+    if (t1.$lt(bytes, 1024))
+      return H.S(bytes) + "B";
+    else if (t1.$lt(bytes, 1048576))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1024), 1) + "KB";
+    else if (t1.$lt(bytes, 1073741824))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1048576), 1) + "MB";
+    else if (t1.$lt(bytes, 1099511627776))
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1073741824), 1) + "GB";
+    else
+      return C.JSNumber_methods.toStringAsFixed$1(t1.$div(bytes, 1099511627776), 1) + "TB";
+  }, "call$1", "Utils_formatSize$closure", 2, 0, 15, 16],
+  Utils_formatTime: function(time) {
+    var millis, hours, minutes, seconds;
+    if (time == null)
+      return "-";
+    millis = J.round$0$n(J.$mul$ns(time, 1000));
+    hours = C.JSInt_methods._tdivFast$1(millis, 3600000);
+    millis = C.JSInt_methods.$mod(millis, 3600000);
+    minutes = C.JSInt_methods._tdivFast$1(millis, 60000);
+    seconds = C.JSInt_methods._tdivFast$1(C.JSInt_methods.$mod(millis, 60000), 1000);
+    P.StringBuffer$("");
+    if (hours !== 0)
+      return "" + hours + "h " + minutes + "m " + seconds + "s";
+    if (minutes !== 0)
+      return "" + minutes + "m " + seconds + "s";
+    return "" + seconds + "s";
+  },
+  Pane: {
+    "^": "ChangeNotifier;",
+    get$element: function(_) {
+      return this._app$__$element;
+    },
+    $isPane: true
+  },
+  ServiceObjectPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      if (J.$eq(url, ""))
+        return;
+      this.app.vm.get$1(url).then$1(new G.ServiceObjectPane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return true;
+    }
+  },
+  ServiceObjectPane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(obj) {
+      J.set$object$x(this.this_0._app$__$element, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassTreePane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("class-tree", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      this.app.vm.get$1(J.substring$1$s(url, 11)).then$1(new G.ClassTreePane_visit_closure(this));
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "class-tree/");
+    },
+    static: {"^": "ClassTreePane__urlPrefix"}
+  },
+  ClassTreePane_visit_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(i) {
+      var t1 = this.this_0._app$__$element;
+      if (t1 != null)
+        J.set$isolate$x(t1, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  ErrorViewPane: {
+    "^": "Pane;app,_app$__$element,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onInstall$0: function() {
+      if (this._app$__$element == null) {
+        var t1 = W._ElementFactoryProvider_createElement_tag("service-view", null);
+        this._app$__$element = F.notifyPropertyChangeHelper(this, C.Symbol_element, this._app$__$element, t1);
+      }
+    },
+    visit$1: function(url) {
+      var t1, t2;
+      t1 = H.interceptedTypeCast(this._app$__$element, "$isServiceObjectViewElement");
+      t2 = this.app.lastErrorOrException;
+      t1._service_object_view_element$__$object = J.notifyPropertyChange$3$x(t1, C.Symbol_object, t1._service_object_view_element$__$object, t2);
+    },
+    canVisit$1: function(url) {
+      return J.startsWith$1$s(url, "error/");
+    }
+  },
+  ObservatoryApplication: {
+    "^": "ChangeNotifier;_paneRegistry,_serviceObjectPane,_currentPane,locationManager,vm>,_app$__$isolate,rootElement,lastErrorOrException,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$isolate: function(_) {
+      return this._app$__$isolate;
+    },
+    set$isolate: function(_, value) {
+      this._app$__$isolate = F.notifyPropertyChangeHelper(this, C.Symbol_isolate, this._app$__$isolate, value);
+    },
+    _initOnce$0: function() {
+      var t1, t2;
+      this._registerPanes$0();
+      t1 = this.vm;
+      t2 = t1.errors;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t2), [H.getTypeArgumentByIndex(t2, 0)]).listen$1(this.get$_app$_onError());
+      t1 = t1.exceptions;
+      H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$1(this.get$_onException());
+      t1 = this.locationManager;
+      $.location = t1;
+      t1._app = this;
+      t2 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_popstate._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(t1.get$_onLocationChange()), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1._onStartup$0();
+    },
+    _registerPanes$0: function() {
+      var t1, t2;
+      if (this._serviceObjectPane != null)
+        return;
+      t1 = this._paneRegistry;
+      t1.push(new G.ClassTreePane(this, null, null, null));
+      t1.push(new G.ErrorViewPane(this, null, null, null));
+      t2 = new G.ServiceObjectPane(this, null, null, null);
+      this._serviceObjectPane = t2;
+      t1.push(t2);
+    },
+    _app$_onError$1: [function(error) {
+      this.lastErrorOrException = error;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_app$_onError", 2, 0, 83, 24],
+    _onException$1: [function(exception) {
+      this.lastErrorOrException = exception;
+      this._visit$2("error/", null);
+    }, "call$1", "get$_onException", 2, 0, 84, 85],
+    _visit$2: function(url, args) {
+      var t1, i, pane;
+      for (t1 = this._paneRegistry, i = 0; i < t1.length; ++i) {
+        pane = t1[i];
+        if (pane.canVisit$1(url)) {
+          this._installPane$1(pane);
+          pane.visit$1(url);
+          return;
+        }
+      }
+      throw H.wrapException(P.FallThroughError$());
+    },
+    _installPane$1: function(pane) {
+      var line, t1, t2;
+      line = "Installing " + J.toString$0(pane);
+      t1 = $.printToZone;
+      if (t1 == null)
+        H.printString(line);
+      else
+        t1.call$1(line);
+      t1 = this._currentPane;
+      if (t1 == null ? pane == null : t1 === pane)
+        return;
+      if (t1 != null) {
+        t2 = t1._app$__$element;
+        if (t1.get$hasObservers(t1) && t2 != null) {
+          t2 = new T.PropertyChangeRecord(t1, C.Symbol_element, t2, null);
+          t2.$builtinTypeInfo = [null];
+          t1.notifyChange$1(t1, t2);
+        }
+        t1._app$__$element = null;
+      }
+      pane.onInstall$0();
+      t1 = this.rootElement;
+      J._clearChildren$0$x(t1);
+      t1.appendChild(pane._app$__$element);
+      this._currentPane = pane;
+    },
+    ObservatoryApplication$1: function(rootElement) {
+      this._initOnce$0();
+    },
+    ObservatoryApplication$devtools$1: function(rootElement) {
+      this._initOnce$0();
+    }
+  },
+  DataTable: {
+    "^": "Object;_app$_table",
+    get$columns: function() {
+      return this._app$_table.callMethod$1("getNumberOfColumns");
+    },
+    get$rows: function(_) {
+      return this._app$_table.callMethod$1("getNumberOfRows");
+    },
+    clearRows$0: function() {
+      var t1 = this._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+    },
+    addRow$1: function(_, row) {
+      var t1 = [];
+      C.JSArray_methods.addAll$1(t1, J.map$1$ax(row, P._convertToJS$closure()));
+      this._app$_table.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+    }
+  },
+  Chart: {
+    "^": "Object;_app$_chart,options",
+    draw$1: function(table) {
+      var jsOptions = P.JsObject_JsObject$jsify(this.options);
+      this._app$_chart.callMethod$2("draw", [table._app$_table, jsOptions]);
+    }
+  },
+  LocationManager: {
+    "^": "Observable;",
+    _go$1: function(url) {
+      var chunks, t1, args;
+      if (J.getInterceptor$s(url).startsWith$1(url, "#"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.startsWith$1(url, "/"))
+        url = C.JSString_methods.substring$1(url, 1);
+      if (C.JSString_methods.contains$1(url, "#")) {
+        chunks = url.split("#");
+        t1 = chunks.length;
+        if (0 >= t1)
+          return H.ioore(chunks, 0);
+        url = chunks[0];
+        if (t1 > 1 && !J.$eq(chunks[1], "")) {
+          if (1 >= chunks.length)
+            return H.ioore(chunks, 1);
+          args = chunks[1];
+        } else
+          args = null;
+      } else
+        args = null;
+      this._app._visit$2(url, args);
+    },
+    onGoto$3: function($event, detail, target) {
+      var href, t1, t2, t3;
+      href = J.get$attributes$x(target)._html$_element.getAttribute("href");
+      t1 = J.getInterceptor$x($event);
+      t2 = t1.get$button($event);
+      if (typeof t2 !== "number")
+        return t2.$gt();
+      if (t2 > 1 || t1.get$metaKey($event) === true || t1.get$ctrlKey($event) === true || t1.get$shiftKey($event) === true || t1.get$altKey($event) === true)
+        return;
+      t2 = $.location;
+      t3 = t2._lastUrl;
+      if (t3 == null ? href != null : t3 !== href) {
+        N.Logger_Logger("").info$1("Navigated to " + H.S(href));
+        window.history.pushState(href, document.title, href);
+        t2._lastUrl = href;
+      }
+      t2._go$1(href);
+      t1.preventDefault$0($event);
+    }
+  },
+  HashLocationManager: {
+    "^": "LocationManager;_initialPath,_app,_lastUrl,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records",
+    _onStartup$0: function() {
+      var initialPath = H.S(window.location.hash);
+      if (window.location.hash === "" || window.location.hash === "#")
+        initialPath = "#" + this._initialPath;
+      window.history.pushState(initialPath, document.title, initialPath);
+      this._go$1(window.location.hash);
+    },
+    _onLocationChange$1: [function(_) {
+      this._go$1(window.location.hash);
+    }, "call$1", "get$_onLocationChange", 2, 0, 86, 14]
+  },
+  TableTreeRow: {
+    "^": "ChangeNotifier;parent>,depth<,children>,columns<",
+    get$expander: function(_) {
+      return this._app$__$expander;
+    },
+    get$expanderStyle: function() {
+      return this._app$__$expanderStyle;
+    },
+    get$expanded: function(_) {
+      return this._expanded;
+    },
+    set$expanded: function(_, expanded) {
+      var t1 = J.$eq(this._expanded, expanded);
+      this._expanded = expanded;
+      if (!t1) {
+        t1 = this._app$__$expander;
+        if (expanded === true) {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u21b3");
+          this.onShow$0(0);
+        } else {
+          this._app$__$expander = F.notifyPropertyChangeHelper(this, C.Symbol_expander, t1, "\u2192");
+          this.onHide$0();
+        }
+      }
+    },
+    toggle$0: function() {
+      this.set$expanded(0, this._expanded !== true);
+      return this._expanded;
+    },
+    TableTreeRow$1: function($parent) {
+      if (!this.hasChildren$0())
+        this._app$__$expanderStyle = F.notifyPropertyChangeHelper(this, C.Symbol_expanderStyle, this._app$__$expanderStyle, "visibility:hidden;");
+    },
+    $isTableTreeRow: true
+  },
+  TableTree: {
+    "^": "ChangeNotifier;rows>,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    initialize$1: function(root) {
+      var t1, t2;
+      t1 = this.rows;
+      t2 = J.getInterceptor$ax(t1);
+      t2.clear$0(t1);
+      root.onShow$0(0);
+      t2.addAll$1(t1, root.children);
+    },
+    toggle$1: function(rowIndex) {
+      var t1, t2, row;
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      row = t2.$index(t1, rowIndex);
+      if (row.toggle$0() === true)
+        t2.insertAll$2(t1, t2.indexOf$1(t1, row) + 1, J.get$children$x(row));
+      else
+        this._collapse$1(row);
+    },
+    _collapse$1: function(row) {
+      var t1, childCount, i, t2, t3;
+      t1 = J.getInterceptor$x(row);
+      childCount = J.get$length$asx(t1.get$children(row));
+      if (childCount === 0)
+        return;
+      for (i = 0; i < childCount; ++i)
+        if (J.get$expanded$x(J.$index$asx(t1.get$children(row), i)) === true)
+          this._collapse$1(J.$index$asx(t1.get$children(row), i));
+      t1.set$expanded(row, false);
+      t1 = this.rows;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.indexOf$1(t1, row) + 1;
+      t2.removeRange$2(t1, t3, t3 + childCount);
+    }
+  },
+  SortedTableColumn: {
+    "^": "Object;label>,formatter<",
+    static: {SortedTableColumn_toStringFormatter: [function(v) {
+        return v != null ? J.toString$0(v) : "<null>";
+      }, "call$1", "SortedTableColumn_toStringFormatter$closure", 2, 0, 17]}
+  },
+  SortedTableRow: {
+    "^": "Object;values>",
+    $isSortedTableRow: true
+  },
+  SortedTable: {
+    "^": "ChangeNotifier;columns<,rows>,sortedRows<",
+    set$sortColumnIndex: function(index) {
+      this._sortColumnIndex = index;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    get$sortColumnIndex: function() {
+      return this._sortColumnIndex;
+    },
+    get$sortDescending: function() {
+      return this._sortDescending;
+    },
+    set$sortDescending: function(descending) {
+      this._sortDescending = descending;
+      F.notifyPropertyChangeHelper(this, C.Symbol_getColumnLabel, 0, 1);
+    },
+    getSortKeyFor$2: function(row, col) {
+      var t1 = this.rows;
+      if (row >>> 0 !== row || row >= t1.length)
+        return H.ioore(t1, row);
+      return J.$index$asx(J.get$values$x(t1[row]), col);
+    },
+    _sortFuncDescending$2: [function(i, j) {
+      var a = this.getSortKeyFor$2(i, this._sortColumnIndex);
+      return J.compareTo$1$ns(this.getSortKeyFor$2(j, this._sortColumnIndex), a);
+    }, "call$2", "get$_sortFuncDescending", 4, 0, 87],
+    _sortFuncAscending$2: [function(i, j) {
+      return J.compareTo$1$ns(this.getSortKeyFor$2(i, this._sortColumnIndex), this.getSortKeyFor$2(j, this._sortColumnIndex));
+    }, "call$2", "get$_sortFuncAscending", 4, 0, 87],
+    sort$0: function(_) {
+      var t1, t2;
+      new P.Stopwatch(1000000, null, null).start$0(0);
+      t1 = this.sortedRows;
+      if (this._sortDescending) {
+        t2 = this.get$_sortFuncDescending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      } else {
+        t2 = this.get$_sortFuncAscending();
+        H.IterableMixinWorkaround_sortList(t1, t2);
+      }
+    },
+    clearRows$0: function() {
+      C.JSArray_methods.set$length(this.rows, 0);
+      C.JSArray_methods.set$length(this.sortedRows, 0);
+    },
+    addRow$1: function(_, row) {
+      var t1 = this.rows;
+      this.sortedRows.push(t1.length);
+      t1.push(row);
+    },
+    getFormattedValue$2: function(row, column) {
+      var t1, value;
+      t1 = this.rows;
+      if (row >= t1.length)
+        return H.ioore(t1, row);
+      value = J.$index$asx(J.get$values$x(t1[row]), column);
+      t1 = this.columns;
+      if (column >= t1.length)
+        return H.ioore(t1, column);
+      return t1[column].get$formatter().call$1(value);
+    },
+    getColumnLabel$1: [function(column) {
+      var t1;
+      if (!J.$eq(column, this._sortColumnIndex)) {
+        t1 = this.columns;
+        if (column >>> 0 !== column || column >= t1.length)
+          return H.ioore(t1, column);
+        return J.$add$ns(J.get$label$x(t1[column]), "\u2003");
+      }
+      t1 = this.columns;
+      if (column >>> 0 !== column || column >= t1.length)
+        return H.ioore(t1, column);
+      t1 = J.get$label$x(t1[column]);
+      return J.$add$ns(t1, this._sortDescending ? "\u25bc" : "\u25b2");
+    }, "call$1", "get$getColumnLabel", 2, 0, 15, 88]
+  }
+}],
+["app_bootstrap", "index_devtools.html_bootstrap.dart", , E, {
+  "^": "",
+  main0: [function() {
+    var t1, t2, t3, t4, t5;
+    t1 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure(), C.Symbol_address, new E.main_closure0(), C.Symbol_anchor, new E.main_closure1(), C.Symbol_assertsEnabled, new E.main_closure2(), C.Symbol_bpt, new E.main_closure3(), C.Symbol_busy, new E.main_closure4(), C.Symbol_buttonClick, new E.main_closure5(), C.Symbol_bytes, new E.main_closure6(), C.Symbol_callback, new E.main_closure7(), C.Symbol_capacity, new E.main_closure8(), C.Symbol_change, new E.main_closure9(), C.Symbol_changeSort, new E.main_closure10(), C.Symbol_checked, new E.main_closure11(), C.Symbol_checkedText, new E.main_closure12(), C.Symbol_classTable, new E.main_closure13(), C.Symbol_classes, new E.main_closure14(), C.Symbol_closing, new E.main_closure15(), C.Symbol_cls, new E.main_closure16(), C.Symbol_code, new E.main_closure17(), C.Symbol_coloring, new E.main_closure18(), C.Symbol_columns, new E.main_closure19(), C.Symbol_connection, new E.main_closure20(), C.Symbol_counters, new E.main_closure21(), C.Symbol_countersChanged, new E.main_closure22(), C.Symbol_current, new E.main_closure23(), C.Symbol_descriptor, new E.main_closure24(), C.Symbol_descriptors, new E.main_closure25(), C.Symbol_devtools, new E.main_closure26(), C.Symbol_displayCutoff, new E.main_closure27(), C.Symbol_doAction, new E.main_closure28(), C.Symbol_element, new E.main_closure29(), C.Symbol_endLine, new E.main_closure30(), C.Symbol_endPos, new E.main_closure31(), C.Symbol_endPosChanged, new E.main_closure32(), C.Symbol_entry, new E.main_closure33(), C.Symbol_error, new E.main_closure34(), C.Symbol_eval, new E.main_closure35(), C.Symbol_evalNow, new E.main_closure36(), C.Symbol_exception, new E.main_closure37(), C.Symbol_expand, new E.main_closure38(), C.Symbol_expandChanged, new E.main_closure39(), C.Symbol_expanded, new E.main_closure40(), C.Symbol_expander, new E.main_closure41(), C.Symbol_expanderStyle, new E.main_closure42(), C.Symbol_expr, new E.main_closure43(), C.Symbol_external, new E.main_closure44(), C.Symbol_fd, new E.main_closure45(), C.Symbol_field, new E.main_closure46(), C.Symbol_fields, new E.main_closure47(), C.Symbol_file, new E.main_closure48(), C.Symbol_firstTokenPos, new E.main_closure49(), C.Symbol_flag, new E.main_closure50(), C.Symbol_flagList, new E.main_closure51(), C.Symbol_formatSize, new E.main_closure52(), C.Symbol_formatTime, new E.main_closure53(), C.Symbol_formattedAddress, new E.main_closure54(), C.Symbol_formattedAverage, new E.main_closure55(), C.Symbol_formattedCollections, new E.main_closure56(), C.Symbol_formattedDeoptId, new E.main_closure57(), C.Symbol_formattedExclusive, new E.main_closure58(), C.Symbol_formattedExclusiveTicks, new E.main_closure59(), C.Symbol_formattedInclusive, new E.main_closure60(), C.Symbol_formattedInclusiveTicks, new E.main_closure61(), C.Symbol_formattedLine, new E.main_closure62(), C.Symbol_formattedTotalCollectionTime, new E.main_closure63(), C.Symbol_fragmentation, new E.main_closure64(), C.Symbol_fragmentationChanged, new E.main_closure65(), C.Symbol_frame, new E.main_closure66(), C.Symbol_function, new E.main_closure67(), C.Symbol_functionChanged, new E.main_closure68(), C.Symbol_functions, new E.main_closure69(), C.Symbol_getColumnLabel, new E.main_closure70(), C.Symbol_goto, new E.main_closure71(), C.Symbol_gotoLink, new E.main_closure72(), C.Symbol_hasClass, new E.main_closure73(), C.Symbol_hasDescriptors, new E.main_closure74(), C.Symbol_hasDisassembly, new E.main_closure75(), C.Symbol_hasNoAllocations, new E.main_closure76(), C.Symbol_hasParent, new E.main_closure77(), C.Symbol_hashLinkWorkaround, new E.main_closure78(), C.Symbol_hideTagsChecked, new E.main_closure79(), C.Symbol_hits, new E.main_closure80(), C.Symbol_hoverText, new E.main_closure81(), C.Symbol_httpServer, new E.main_closure82(), C.Symbol_human, new E.main_closure83(), C.Symbol_idle, new E.main_closure84(), C.Symbol_imp, new E.main_closure85(), C.Symbol_imports, new E.main_closure86(), C.Symbol_instance, new E.main_closure87(), C.Symbol_instances, new E.main_closure88(), C.Symbol_instruction, new E.main_closure89(), C.Symbol_instructions, new E.main_closure90(), C.Symbol_interface, new E.main_closure91(), C.Symbol_interfaces, new E.main_closure92(), C.Symbol_internal, new E.main_closure93(), C.Symbol_io, new E.main_closure94(), C.Symbol_isAbstract, new E.main_closure95(), C.Symbol_isBool, new E.main_closure96(), C.Symbol_isComment, new E.main_closure97(), C.Symbol_isDart, new E.main_closure98(), C.Symbol_isDartCode, new E.main_closure99(), C.Symbol_isDouble, new E.main_closure100(), C.Symbol_isEmpty, new E.main_closure101(), C.Symbol_isError, new E.main_closure102(), C.Symbol_isInstance, new E.main_closure103(), C.Symbol_isInt, new E.main_closure104(), C.Symbol_isList, new E.main_closure105(), C.Symbol_isNotEmpty, new E.main_closure106(), C.Symbol_isNull, new E.main_closure107(), C.Symbol_isOptimized, new E.main_closure108(), C.Symbol_isPatch, new E.main_closure109(), C.Symbol_isPipe, new E.main_closure110(), C.Symbol_isString, new E.main_closure111(), C.Symbol_isType, new E.main_closure112(), C.Symbol_isUnexpected, new E.main_closure113(), C.Symbol_isolate, new E.main_closure114(), C.Symbol_isolateChanged, new E.main_closure115(), C.Symbol_isolates, new E.main_closure116(), C.Symbol_jumpTarget, new E.main_closure117(), C.Symbol_kind, new E.main_closure118(), C.Symbol_label, new E.main_closure119(), C.Symbol_last, new E.main_closure120(), C.Symbol_lastAccumulatorReset, new E.main_closure121(), C.Symbol_lastServiceGC, new E.main_closure122(), C.Symbol_lastTokenPos, new E.main_closure123(), C.Symbol_lastUpdate, new E.main_closure124(), C.Symbol_length, new E.main_closure125(), C.Symbol_lib, new E.main_closure126(), C.Symbol_libraries, new E.main_closure127(), C.Symbol_library, new E.main_closure128(), C.Symbol_line, new E.main_closure129(), C.Symbol_lineMode, new E.main_closure130(), C.Symbol_lineNumber, new E.main_closure131(), C.Symbol_lineNumbers, new E.main_closure132(), C.Symbol_lines, new E.main_closure133(), C.Symbol_link, new E.main_closure134(), C.Symbol_list, new E.main_closure135(), C.Symbol_listening, new E.main_closure136(), C.Symbol_loading, new E.main_closure137(), C.Symbol_localAddress, new E.main_closure138(), C.Symbol_localPort, new E.main_closure139(), C.Symbol_mainPort, new E.main_closure140(), C.Symbol_map, new E.main_closure141(), C.Symbol_mapAsString, new E.main_closure142(), C.Symbol_mapChanged, new E.main_closure143(), C.Symbol_message, new E.main_closure144(), C.Symbol_mouseOut, new E.main_closure145(), C.Symbol_mouseOver, new E.main_closure146(), C.Symbol_msg, new E.main_closure147(), C.Symbol_name, new E.main_closure148(), C.Symbol_nameIsEmpty, new E.main_closure149(), C.Symbol_newSpace, new E.main_closure150(), C.Symbol_object, new E.main_closure151(), C.Symbol_objectChanged, new E.main_closure152(), C.Symbol_objectPool, new E.main_closure153(), C.Symbol_oldSpace, new E.main_closure154(), C.Symbol_pad, new E.main_closure155(), C.Symbol_padding, new E.main_closure156(), C.Symbol_path, new E.main_closure157(), C.Symbol_pause, new E.main_closure158(), C.Symbol_pauseEvent, new E.main_closure159(), C.Symbol_pid, new E.main_closure160(), C.Symbol_pos, new E.main_closure161(), C.Symbol_posChanged, new E.main_closure162(), C.Symbol_process, new E.main_closure163(), C.Symbol_profile, new E.main_closure164(), C.Symbol_profileChanged, new E.main_closure165(), C.Symbol_protocol, new E.main_closure166(), C.Symbol_qualified, new E.main_closure167(), C.Symbol_qualifiedName, new E.main_closure168(), C.Symbol_reachable, new E.main_closure169(), C.Symbol_readClosed, new E.main_closure170(), C.Symbol_ref, new E.main_closure171(), C.Symbol_refChanged, new E.main_closure172(), C.Symbol_refresh, new E.main_closure173(), C.Symbol_refreshCoverage, new E.main_closure174(), C.Symbol_refreshGC, new E.main_closure175(), C.Symbol_refreshTime, new E.main_closure176(), C.Symbol_relativeLink, new E.main_closure177(), C.Symbol_remoteAddress, new E.main_closure178(), C.Symbol_remotePort, new E.main_closure179(), C.Symbol_resetAccumulator, new E.main_closure180(), C.Symbol_response, new E.main_closure181(), C.Symbol_result, new E.main_closure182(), C.Symbol_results, new E.main_closure183(), C.Symbol_resume, new E.main_closure184(), C.Symbol_retainedBytes, new E.main_closure185(), C.Symbol_retainedSize, new E.main_closure186(), C.Symbol_retainingPath, new E.main_closure187(), C.Symbol_rootLib, new E.main_closure188(), C.Symbol_row, new E.main_closure189(), C.Symbol_rows, new E.main_closure190(), C.Symbol_running, new E.main_closure191(), C.Symbol_sampleCount, new E.main_closure192(), C.Symbol_sampleDepth, new E.main_closure193(), C.Symbol_sampleRate, new E.main_closure194(), C.Symbol_script, new E.main_closure195(), C.Symbol_scriptChanged, new E.main_closure196(), C.Symbol_scripts, new E.main_closure197(), C.Symbol_selectExpr, new E.main_closure198(), C.Symbol_serviceType, new E.main_closure199(), C.Symbol_small, new E.main_closure200(), C.Symbol_socket, new E.main_closure201(), C.Symbol_socketOwner, new E.main_closure202(), C.Symbol_startLine, new E.main_closure203(), C.Symbol_status, new E.main_closure204(), C.Symbol_styleForHits, new E.main_closure205(), C.Symbol_subClasses, new E.main_closure206(), C.Symbol_subclass, new E.main_closure207(), C.Symbol_superClass, new E.main_closure208(), C.Symbol_tagSelector, new E.main_closure209(), C.Symbol_tagSelectorChanged, new E.main_closure210(), C.Symbol_text, new E.main_closure211(), C.Symbol_timeSpan, new E.main_closure212(), C.Symbol_tipExclusive, new E.main_closure213(), C.Symbol_tipKind, new E.main_closure214(), C.Symbol_tipParent, new E.main_closure215(), C.Symbol_tipTicks, new E.main_closure216(), C.Symbol_tipTime, new E.main_closure217(), C.Symbol_toggleExpand, new E.main_closure218(), C.Symbol_toggleExpanded, new E.main_closure219(), C.Symbol_tokenPos, new E.main_closure220(), C.Symbol_topFrame, new E.main_closure221(), C.Symbol_trace, new E.main_closure222(), C.Symbol_tree, new E.main_closure223(), C.Symbol_typeChecksEnabled, new E.main_closure224(), C.Symbol_uncheckedText, new E.main_closure225(), C.Symbol_updateLineMode, new E.main_closure226(), C.Symbol_uptime, new E.main_closure227(), C.Symbol_url, new E.main_closure228(), C.Symbol_used, new E.main_closure229(), C.Symbol_v, new E.main_closure230(), C.Symbol_variable, new E.main_closure231(), C.Symbol_variables, new E.main_closure232(), C.Symbol_version, new E.main_closure233(), C.Symbol_vm, new E.main_closure234(), C.Symbol_vmName, new E.main_closure235(), C.Symbol_webSocket, new E.main_closure236(), C.Symbol_writeClosed, new E.main_closure237()], null, null);
+    t2 = P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, new E.main_closure238(), C.Symbol_anchor, new E.main_closure239(), C.Symbol_busy, new E.main_closure240(), C.Symbol_callback, new E.main_closure241(), C.Symbol_checked, new E.main_closure242(), C.Symbol_checkedText, new E.main_closure243(), C.Symbol_classTable, new E.main_closure244(), C.Symbol_cls, new E.main_closure245(), C.Symbol_code, new E.main_closure246(), C.Symbol_connection, new E.main_closure247(), C.Symbol_counters, new E.main_closure248(), C.Symbol_devtools, new E.main_closure249(), C.Symbol_displayCutoff, new E.main_closure250(), C.Symbol_endLine, new E.main_closure251(), C.Symbol_endPos, new E.main_closure252(), C.Symbol_entry, new E.main_closure253(), C.Symbol_error, new E.main_closure254(), C.Symbol_eval, new E.main_closure255(), C.Symbol_exception, new E.main_closure256(), C.Symbol_expand, new E.main_closure257(), C.Symbol_expanded, new E.main_closure258(), C.Symbol_expr, new E.main_closure259(), C.Symbol_field, new E.main_closure260(), C.Symbol_file, new E.main_closure261(), C.Symbol_firstTokenPos, new E.main_closure262(), C.Symbol_flag, new E.main_closure263(), C.Symbol_flagList, new E.main_closure264(), C.Symbol_fragmentation, new E.main_closure265(), C.Symbol_frame, new E.main_closure266(), C.Symbol_function, new E.main_closure267(), C.Symbol_hasClass, new E.main_closure268(), C.Symbol_hasParent, new E.main_closure269(), C.Symbol_hashLinkWorkaround, new E.main_closure270(), C.Symbol_hideTagsChecked, new E.main_closure271(), C.Symbol_httpServer, new E.main_closure272(), C.Symbol_imp, new E.main_closure273(), C.Symbol_instance, new E.main_closure274(), C.Symbol_instances, new E.main_closure275(), C.Symbol_interface, new E.main_closure276(), C.Symbol_internal, new E.main_closure277(), C.Symbol_io, new E.main_closure278(), C.Symbol_isDart, new E.main_closure279(), C.Symbol_isolate, new E.main_closure280(), C.Symbol_kind, new E.main_closure281(), C.Symbol_label, new E.main_closure282(), C.Symbol_last, new E.main_closure283(), C.Symbol_lastAccumulatorReset, new E.main_closure284(), C.Symbol_lastServiceGC, new E.main_closure285(), C.Symbol_lastTokenPos, new E.main_closure286(), C.Symbol_lib, new E.main_closure287(), C.Symbol_library, new E.main_closure288(), C.Symbol_lineMode, new E.main_closure289(), C.Symbol_lines, new E.main_closure290(), C.Symbol_link, new E.main_closure291(), C.Symbol_list, new E.main_closure292(), C.Symbol_map, new E.main_closure293(), C.Symbol_mapAsString, new E.main_closure294(), C.Symbol_msg, new E.main_closure295(), C.Symbol_name, new E.main_closure296(), C.Symbol_object, new E.main_closure297(), C.Symbol_objectPool, new E.main_closure298(), C.Symbol_pad, new E.main_closure299(), C.Symbol_path, new E.main_closure300(), C.Symbol_pause, new E.main_closure301(), C.Symbol_pos, new E.main_closure302(), C.Symbol_process, new E.main_closure303(), C.Symbol_profile, new E.main_closure304(), C.Symbol_qualified, new E.main_closure305(), C.Symbol_qualifiedName, new E.main_closure306(), C.Symbol_reachable, new E.main_closure307(), C.Symbol_ref, new E.main_closure308(), C.Symbol_refresh, new E.main_closure309(), C.Symbol_refreshCoverage, new E.main_closure310(), C.Symbol_refreshGC, new E.main_closure311(), C.Symbol_refreshTime, new E.main_closure312(), C.Symbol_resetAccumulator, new E.main_closure313(), C.Symbol_result, new E.main_closure314(), C.Symbol_results, new E.main_closure315(), C.Symbol_resume, new E.main_closure316(), C.Symbol_retainedBytes, new E.main_closure317(), C.Symbol_retainedSize, new E.main_closure318(), C.Symbol_retainingPath, new E.main_closure319(), C.Symbol_rootLib, new E.main_closure320(), C.Symbol_sampleCount, new E.main_closure321(), C.Symbol_sampleDepth, new E.main_closure322(), C.Symbol_sampleRate, new E.main_closure323(), C.Symbol_script, new E.main_closure324(), C.Symbol_small, new E.main_closure325(), C.Symbol_socket, new E.main_closure326(), C.Symbol_socketOwner, new E.main_closure327(), C.Symbol_startLine, new E.main_closure328(), C.Symbol_status, new E.main_closure329(), C.Symbol_subclass, new E.main_closure330(), C.Symbol_superClass, new E.main_closure331(), C.Symbol_tagSelector, new E.main_closure332(), C.Symbol_text, new E.main_closure333(), C.Symbol_timeSpan, new E.main_closure334(), C.Symbol_tokenPos, new E.main_closure335(), C.Symbol_trace, new E.main_closure336(), C.Symbol_uncheckedText, new E.main_closure337(), C.Symbol_vm, new E.main_closure338(), C.Symbol_webSocket, new E.main_closure339()], null, null);
+    t3 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, C.Type_GNh, C.Type_ON8, C.Type_EOZ, C.Type_ql8, C.Type_UJT, C.Type_dRp, C.Type_EOZ, C.Type_O5a, C.Type_EOZ, C.Type_2jN, C.Type_UJT, C.Type_Aym, C.Type_EOZ, C.Type_cop, C.Type_GNh, C.Type_Npb, C.Type_EOZ, C.Type_8eb, C.Type_EOZ, C.Type_p2P, C.Type_GNh, C.Type_ohY, C.Type_UJT, C.Type_4IJ, C.Type_EOZ, C.Type_7g3, C.Type_EOZ, C.Type_f1j, C.Type_EOZ, C.Type_wgH, C.Type_oyU, C.Type_bDN, C.Type_EOZ, C.Type_SoB, C.Type_EOZ, C.Type_LV6, C.Type_EOZ, C.Type_EVD, C.Type_UJT, C.Type_gqS, C.Type_EOZ, C.Type_uIL, C.Type_UJT, C.Type_L9j, C.Type_EOZ, C.Type_yvP, C.Type_EOZ, C.Type_i7j, C.Type_UJT, C.Type_M6L, C.Type_EOZ, C.Type_8KD, C.Type_EOZ, C.Type_qMZ, C.Type_oyU, C.Type_AHF, C.Type_EOZ, C.Type_IuH, C.Type_EOZ, C.Type_mWg, C.Type_UJT, C.Type_8cK, C.Type_EOZ, C.Type_JmU, C.Type_UJT, C.Type_4m4, C.Type_EOZ, C.Type_B8J, C.Type_UJT, C.Type_61d, C.Type_EOZ, C.Type_TEn, C.Type_EOZ, C.Type_gg4, C.Type_EOZ, C.Type_MUU, C.Type_UJT, C.Type_AyI, C.Type_EOZ, C.Type_cOY, C.Type_EOZ, C.Type_ES1, C.Type_UJT, C.Type_wT1, C.Type_EOZ, C.Type_ECh, C.Type_EOZ, C.Type_aAD, C.Type_EOZ, C.Type_8Gl, C.Type_EOZ, C.Type_iL9, C.Type_EOZ, C.Type_ZKG, C.Type_EOZ, C.Type_Kyy, C.Type_EOZ, C.Type_mpV, C.Type_UJT, C.Type_qph, C.Type_EOZ, C.Type_JFX, C.Type_EOZ, C.Type_wsa, C.Type_EOZ, C.Type_s2l, C.Type_EOZ, C.Type_nV5, C.Type_EOZ, C.Type_9ur, C.Type_sRP, C.Type_KMd, C.Type_EOZ, C.Type_AD4, C.Type_EOZ, C.Type_Sxn, C.Type_EOZ, C.Type_C7R, C.Type_EOZ, C.Type_YgH, C.Type_EOZ, C.Type_sRP, C.Type_I2I, C.Type_a1Y, C.Type_EOZ, C.Type_wBh, C.Type_oyU, C.Type_0e9, C.Type_EOZ, C.Type_FKd, C.Type_EOZ, C.Type_y1j, C.Type_EOZ, C.Type_UJT, C.Type_EOZ, C.Type_Mu6, C.Type_EOZ, C.Type_kuc, C.Type_GNh, C.Type_Jcu, C.Type_EOZ, C.Type_nVV, C.Type_EOZ, C.Type_Eue, C.Type_UJT, C.Type_E0k, C.Type_EOZ, C.Type_GNh, C.Type_I2I, C.Type_EOZ, C.Type_sRP, C.Type_oyU, C.Type_UJT], null, null);
+    t4 = P.LinkedHashMap_LinkedHashMap$_literal([C.Type_kA7, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_ON8, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_msg, C.Declaration_gc6], null, null), C.Type_ql8, C.Map_empty, C.Type_dRp, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_agR, C.Symbol_isolateChanged, C.Declaration_e3c], null, null), C.Type_O5a, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_okX, C.Symbol_instances, C.Declaration_qr9, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_2jN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_AgZ, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Aym, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_code, C.Declaration_woc], null, null), C.Type_cop, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expand, C.Declaration_yXb0, C.Symbol_expandChanged, C.Declaration_Dbk, C.Symbol_expanded, C.Declaration_RQo], null, null), C.Type_Npb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_eea], null, null), C.Type_8eb, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_callback, C.Declaration_IF7, C.Symbol_lineMode, C.Declaration_ww8, C.Symbol_results, C.Declaration_ggw, C.Symbol_text, C.Declaration_ZfX], null, null), C.Type_p2P, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_busy, C.Declaration_izV, C.Symbol_callback, C.Declaration_yXb, C.Symbol_expr, C.Declaration_gLQ, C.Symbol_label, C.Declaration_0g2, C.Symbol_result, C.Declaration_2No], null, null), C.Type_ohY, C.Map_empty, C.Type_4IJ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_field, C.Declaration_iyl], null, null), C.Type_7g3, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flag, C.Declaration_6YB], null, null), C.Type_f1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_flagList, C.Declaration_wE9], null, null), C.Type_wgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_hasClass, C.Declaration_X8B, C.Symbol_hasParent, C.Declaration_0qV, C.Symbol_isDart, C.Declaration_o7e, C.Symbol_qualified, C.Declaration_e24, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_bDN, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_function, C.Declaration_y9n, C.Symbol_functionChanged, C.Declaration_Chj, C.Symbol_kind, C.Declaration_Xdi, C.Symbol_qualifiedName, C.Declaration_i3y], null, null), C.Type_SoB, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_fragmentation, C.Declaration_0Y4, C.Symbol_fragmentationChanged, C.Declaration_ivD, C.Symbol_status, C.Declaration_8sn], null, null), C.Type_LV6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_classTable, C.Declaration_gsm, C.Symbol_isolate, C.Declaration_agR, C.Symbol_lastAccumulatorReset, C.Declaration_vA1, C.Symbol_lastServiceGC, C.Declaration_mPk, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g], null, null), C.Type_EVD, C.Map_empty, C.Type_gqS, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_instance, C.Declaration_o7L, C.Symbol_path, C.Declaration_cMb, C.Symbol_retainedBytes, C.Declaration_CIB], null, null), C.Type_uIL, C.Map_empty, C.Type_L9j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_connection, C.Declaration_yDj], null, null), C.Type_yvP, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_i7j, C.Map_empty, C.Type_M6L, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_httpServer, C.Declaration_BSX], null, null), C.Type_8KD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_qMZ, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_small, C.Declaration_pPA], null, null), C.Type_AHF, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_process, C.Declaration_a13], null, null), C.Type_IuH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_mWg, C.Map_empty, C.Type_8cK, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_file, C.Declaration_Ix1], null, null), C.Type_JmU, C.Map_empty, C.Type_4m4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_B8J, C.Map_empty, C.Type_61d, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_socket, C.Declaration_Iiu], null, null), C.Type_TEn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_io, C.Declaration_bh9], null, null), C.Type_gg4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_list, C.Declaration_BKW], null, null), C.Type_MUU, C.Map_empty, C.Type_AyI, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_webSocket, C.Declaration_mT8], null, null), C.Type_cOY, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_displayCutoff, C.Declaration_CR6, C.Symbol_hideTagsChecked, C.Declaration_a1A, C.Symbol_profile, C.Declaration_EkK, C.Symbol_profileChanged, C.Declaration_j3g, C.Symbol_refreshTime, C.Declaration_ijl, C.Symbol_sampleCount, C.Declaration_ac8, C.Symbol_sampleDepth, C.Declaration_2AE, C.Symbol_sampleRate, C.Declaration_3VL, C.Symbol_tagSelector, C.Declaration_Q0F, C.Symbol_tagSelectorChanged, C.Declaration_ECn, C.Symbol_timeSpan, C.Declaration_dIf], null, null), C.Type_ES1, C.Map_empty, C.Type_wT1, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_counters, C.Declaration_2Qn, C.Symbol_countersChanged, C.Declaration_cJC], null, null), C.Type_ECh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_aAD, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_8Gl, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_iL9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_ZKG, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj], null, null), C.Type_Kyy, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_map, C.Declaration_wzu, C.Symbol_mapAsString, C.Declaration_Qx4, C.Symbol_mapChanged, C.Declaration_iLh], null, null), C.Type_mpV, C.Map_empty, C.Type_qph, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_library, C.Declaration_6ts], null, null), C.Type_JFX, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_cls, C.Declaration_qrv, C.Symbol_last, C.Declaration_06U], null, null), C.Type_wsa, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_isolate, C.Declaration_voj, C.Symbol_isolateChanged, C.Declaration_e3c, C.Symbol_last, C.Declaration_06U], null, null), C.Type_s2l, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U, C.Symbol_library, C.Declaration_6ts], null, null), C.Type_nV5, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pad, C.Declaration_EsU], null, null), C.Type_9ur, C.Map_empty, C.Type_KMd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_last, C.Declaration_06U, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_AD4, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_anchor, C.Declaration_suy, C.Symbol_link, C.Declaration_ibz], null, null), C.Type_Sxn, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, C.Declaration_dw1, C.Symbol_callback, C.Declaration_yXb, C.Symbol_label, C.Declaration_0g2], null, null), C.Type_C7R, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_last, C.Declaration_06U], null, null), C.Type_YgH, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_devtools, C.Declaration_c4R], null, null), C.Type_sRP, C.Map_empty, C.Type_a1Y, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_endLine, C.Declaration_ZcJ, C.Symbol_endPos, C.Declaration_ACG, C.Symbol_endPosChanged, C.Declaration_QAa, C.Symbol_lines, C.Declaration_WfA, C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq, C.Symbol_script, C.Declaration_yx3, C.Symbol_scriptChanged, C.Declaration_ixB, C.Symbol_startLine, C.Declaration_k6K], null, null), C.Type_wBh, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_pos, C.Declaration_i3t, C.Symbol_posChanged, C.Declaration_owq], null, null), C.Type_0e9, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_script, C.Declaration_yx3], null, null), C.Type_FKd, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_4eA], null, null), C.Type_y1j, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_exception, C.Declaration_v0l], null, null), C.Type_UJT, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_internal, C.Declaration_XBb, C.Symbol_ref, C.Declaration_e3c0, C.Symbol_refChanged, C.Declaration_MJ5], null, null), C.Type_Mu6, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_object, C.Declaration_HtW, C.Symbol_objectChanged, C.Declaration_4up], null, null), C.Type_kuc, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_checked, C.Declaration_siO, C.Symbol_checkedText, C.Declaration_cdS, C.Symbol_uncheckedText, C.Declaration_IRg], null, null), C.Type_Jcu, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_frame, C.Declaration_65l], null, null), C.Type_nVV, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_trace, C.Declaration_ssf], null, null), C.Type_Eue, C.Map_empty, C.Type_E0k, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_error, C.Declaration_0, C.Symbol_vm, C.Declaration_Qi2], null, null)], null, null);
+    t5 = O.GeneratedSymbolConverterService$(new O.StaticConfiguration(t1, t2, t3, t4, C.Map_empty, P.LinkedHashMap_LinkedHashMap$_literal([C.Symbol_active, "active", C.Symbol_address, "address", C.Symbol_anchor, "anchor", C.Symbol_assertsEnabled, "assertsEnabled", C.Symbol_bpt, "bpt", C.Symbol_busy, "busy", C.Symbol_buttonClick, "buttonClick", C.Symbol_bytes, "bytes", C.Symbol_callback, "callback", C.Symbol_capacity, "capacity", C.Symbol_change, "change", C.Symbol_changeSort, "changeSort", C.Symbol_checked, "checked", C.Symbol_checkedText, "checkedText", C.Symbol_classTable, "classTable", C.Symbol_classes, "classes", C.Symbol_closing, "closing", C.Symbol_cls, "cls", C.Symbol_code, "code", C.Symbol_coloring, "coloring", C.Symbol_columns, "columns", C.Symbol_connection, "connection", C.Symbol_counters, "counters", C.Symbol_countersChanged, "countersChanged", C.Symbol_current, "current", C.Symbol_descriptor, "descriptor", C.Symbol_descriptors, "descriptors", C.Symbol_devtools, "devtools", C.Symbol_displayCutoff, "displayCutoff", C.Symbol_doAction, "doAction", C.Symbol_element, "element", C.Symbol_endLine, "endLine", C.Symbol_endPos, "endPos", C.Symbol_endPosChanged, "endPosChanged", C.Symbol_entry, "entry", C.Symbol_error, "error", C.Symbol_eval, "eval", C.Symbol_evalNow, "evalNow", C.Symbol_exception, "exception", C.Symbol_expand, "expand", C.Symbol_expandChanged, "expandChanged", C.Symbol_expanded, "expanded", C.Symbol_expander, "expander", C.Symbol_expanderStyle, "expanderStyle", C.Symbol_expr, "expr", C.Symbol_external, "external", C.Symbol_fd, "fd", C.Symbol_field, "field", C.Symbol_fields, "fields", C.Symbol_file, "file", C.Symbol_firstTokenPos, "firstTokenPos", C.Symbol_flag, "flag", C.Symbol_flagList, "flagList", C.Symbol_formatSize, "formatSize", C.Symbol_formatTime, "formatTime", C.Symbol_formattedAddress, "formattedAddress", C.Symbol_formattedAverage, "formattedAverage", C.Symbol_formattedCollections, "formattedCollections", C.Symbol_formattedDeoptId, "formattedDeoptId", C.Symbol_formattedExclusive, "formattedExclusive", C.Symbol_formattedExclusiveTicks, "formattedExclusiveTicks", C.Symbol_formattedInclusive, "formattedInclusive", C.Symbol_formattedInclusiveTicks, "formattedInclusiveTicks", C.Symbol_formattedLine, "formattedLine", C.Symbol_formattedTotalCollectionTime, "formattedTotalCollectionTime", C.Symbol_fragmentation, "fragmentation", C.Symbol_fragmentationChanged, "fragmentationChanged", C.Symbol_frame, "frame", C.Symbol_function, "function", C.Symbol_functionChanged, "functionChanged", C.Symbol_functions, "functions", C.Symbol_getColumnLabel, "getColumnLabel", C.Symbol_goto, "goto", C.Symbol_gotoLink, "gotoLink", C.Symbol_hasClass, "hasClass", C.Symbol_hasDescriptors, "hasDescriptors", C.Symbol_hasDisassembly, "hasDisassembly", C.Symbol_hasNoAllocations, "hasNoAllocations", C.Symbol_hasParent, "hasParent", C.Symbol_hashLinkWorkaround, "hashLinkWorkaround", C.Symbol_hideTagsChecked, "hideTagsChecked", C.Symbol_hits, "hits", C.Symbol_hoverText, "hoverText", C.Symbol_httpServer, "httpServer", C.Symbol_human, "human", C.Symbol_idle, "idle", C.Symbol_imp, "imp", C.Symbol_imports, "imports", C.Symbol_instance, "instance", C.Symbol_instances, "instances", C.Symbol_instruction, "instruction", C.Symbol_instructions, "instructions", C.Symbol_interface, "interface", C.Symbol_interfaces, "interfaces", C.Symbol_internal, "internal", C.Symbol_io, "io", C.Symbol_isAbstract, "isAbstract", C.Symbol_isBool, "isBool", C.Symbol_isComment, "isComment", C.Symbol_isDart, "isDart", C.Symbol_isDartCode, "isDartCode", C.Symbol_isDouble, "isDouble", C.Symbol_isEmpty, "isEmpty", C.Symbol_isError, "isError", C.Symbol_isInstance, "isInstance", C.Symbol_isInt, "isInt", C.Symbol_isList, "isList", C.Symbol_isNotEmpty, "isNotEmpty", C.Symbol_isNull, "isNull", C.Symbol_isOptimized, "isOptimized", C.Symbol_isPatch, "isPatch", C.Symbol_isPipe, "isPipe", C.Symbol_isString, "isString", C.Symbol_isType, "isType", C.Symbol_isUnexpected, "isUnexpected", C.Symbol_isolate, "isolate", C.Symbol_isolateChanged, "isolateChanged", C.Symbol_isolates, "isolates", C.Symbol_jumpTarget, "jumpTarget", C.Symbol_kind, "kind", C.Symbol_label, "label", C.Symbol_last, "last", C.Symbol_lastAccumulatorReset, "lastAccumulatorReset", C.Symbol_lastServiceGC, "lastServiceGC", C.Symbol_lastTokenPos, "lastTokenPos", C.Symbol_lastUpdate, "lastUpdate", C.Symbol_length, "length", C.Symbol_lib, "lib", C.Symbol_libraries, "libraries", C.Symbol_library, "library", C.Symbol_line, "line", C.Symbol_lineMode, "lineMode", C.Symbol_lineNumber, "lineNumber", C.Symbol_lineNumbers, "lineNumbers", C.Symbol_lines, "lines", C.Symbol_link, "link", C.Symbol_list, "list", C.Symbol_listening, "listening", C.Symbol_loading, "loading", C.Symbol_localAddress, "localAddress", C.Symbol_localPort, "localPort", C.Symbol_mainPort, "mainPort", C.Symbol_map, "map", C.Symbol_mapAsString, "mapAsString", C.Symbol_mapChanged, "mapChanged", C.Symbol_message, "message", C.Symbol_mouseOut, "mouseOut", C.Symbol_mouseOver, "mouseOver", C.Symbol_msg, "msg", C.Symbol_name, "name", C.Symbol_nameIsEmpty, "nameIsEmpty", C.Symbol_newSpace, "newSpace", C.Symbol_object, "object", C.Symbol_objectChanged, "objectChanged", C.Symbol_objectPool, "objectPool", C.Symbol_oldSpace, "oldSpace", C.Symbol_pad, "pad", C.Symbol_padding, "padding", C.Symbol_path, "path", C.Symbol_pause, "pause", C.Symbol_pauseEvent, "pauseEvent", C.Symbol_pid, "pid", C.Symbol_pos, "pos", C.Symbol_posChanged, "posChanged", C.Symbol_process, "process", C.Symbol_profile, "profile", C.Symbol_profileChanged, "profileChanged", C.Symbol_protocol, "protocol", C.Symbol_qualified, "qualified", C.Symbol_qualifiedName, "qualifiedName", C.Symbol_reachable, "reachable", C.Symbol_readClosed, "readClosed", C.Symbol_ref, "ref", C.Symbol_refChanged, "refChanged", C.Symbol_refresh, "refresh", C.Symbol_refreshCoverage, "refreshCoverage", C.Symbol_refreshGC, "refreshGC", C.Symbol_refreshTime, "refreshTime", C.Symbol_relativeLink, "relativeLink", C.Symbol_remoteAddress, "remoteAddress", C.Symbol_remotePort, "remotePort", C.Symbol_resetAccumulator, "resetAccumulator", C.Symbol_response, "response", C.Symbol_result, "result", C.Symbol_results, "results", C.Symbol_resume, "resume", C.Symbol_retainedBytes, "retainedBytes", C.Symbol_retainedSize, "retainedSize", C.Symbol_retainingPath, "retainingPath", C.Symbol_rootLib, "rootLib", C.Symbol_row, "row", C.Symbol_rows, "rows", C.Symbol_running, "running", C.Symbol_sampleCount, "sampleCount", C.Symbol_sampleDepth, "sampleDepth", C.Symbol_sampleRate, "sampleRate", C.Symbol_script, "script", C.Symbol_scriptChanged, "scriptChanged", C.Symbol_scripts, "scripts", C.Symbol_selectExpr, "selectExpr", C.Symbol_serviceType, "serviceType", C.Symbol_small, "small", C.Symbol_socket, "socket", C.Symbol_socketOwner, "socketOwner", C.Symbol_startLine, "startLine", C.Symbol_status, "status", C.Symbol_styleForHits, "styleForHits", C.Symbol_subClasses, "subClasses", C.Symbol_subclass, "subclass", C.Symbol_superClass, "superClass", C.Symbol_tagSelector, "tagSelector", C.Symbol_tagSelectorChanged, "tagSelectorChanged", C.Symbol_text, "text", C.Symbol_timeSpan, "timeSpan", C.Symbol_tipExclusive, "tipExclusive", C.Symbol_tipKind, "tipKind", C.Symbol_tipParent, "tipParent", C.Symbol_tipTicks, "tipTicks", C.Symbol_tipTime, "tipTime", C.Symbol_toggleExpand, "toggleExpand", C.Symbol_toggleExpanded, "toggleExpanded", C.Symbol_tokenPos, "tokenPos", C.Symbol_topFrame, "topFrame", C.Symbol_trace, "trace", C.Symbol_tree, "tree", C.Symbol_typeChecksEnabled, "typeChecksEnabled", C.Symbol_uncheckedText, "uncheckedText", C.Symbol_updateLineMode, "updateLineMode", C.Symbol_uptime, "uptime", C.Symbol_url, "url", C.Symbol_used, "used", C.Symbol_v, "v", C.Symbol_variable, "variable", C.Symbol_variables, "variables", C.Symbol_version, "version", C.Symbol_vm, "vm", C.Symbol_vmName, "vmName", C.Symbol_webSocket, "webSocket", C.Symbol_writeClosed, "writeClosed"], null, null), false));
+    $.objectAccessor = new O.GeneratedObjectAccessorService(t1, t2, C.Map_empty);
+    $.typeInspector = new O.GeneratedTypeInspectorService(t3, t4, false);
+    $.symbolConverter = t5;
+    $.initializers = [new E.main_closure340(), new E.main_closure341(), new E.main_closure342(), new E.main_closure343(), new E.main_closure344(), new E.main_closure345(), new E.main_closure346(), new E.main_closure347(), new E.main_closure348(), new E.main_closure349(), new E.main_closure350(), new E.main_closure351(), new E.main_closure352(), new E.main_closure353(), new E.main_closure354(), new E.main_closure355(), new E.main_closure356(), new E.main_closure357(), new E.main_closure358(), new E.main_closure359(), new E.main_closure360(), new E.main_closure361(), new E.main_closure362(), new E.main_closure363(), new E.main_closure364(), new E.main_closure365(), new E.main_closure366(), new E.main_closure367(), new E.main_closure368(), new E.main_closure369(), new E.main_closure370(), new E.main_closure371(), new E.main_closure372(), new E.main_closure373(), new E.main_closure374(), new E.main_closure375(), new E.main_closure376(), new E.main_closure377(), new E.main_closure378(), new E.main_closure379(), new E.main_closure380(), new E.main_closure381(), new E.main_closure382(), new E.main_closure383(), new E.main_closure384(), new E.main_closure385(), new E.main_closure386(), new E.main_closure387(), new E.main_closure388(), new E.main_closure389(), new E.main_closure390(), new E.main_closure391(), new E.main_closure392(), new E.main_closure393(), new E.main_closure394(), new E.main_closure395(), new E.main_closure396(), new E.main_closure397(), new E.main_closure398(), new E.main_closure399(), new E.main_closure400(), new E.main_closure401(), new E.main_closure402(), new E.main_closure403(), new E.main_closure404(), new E.main_closure405(), new E.main_closure406(), new E.main_closure407(), new E.main_closure408(), new E.main_closure409(), new E.main_closure410(), new E.main_closure411(), new E.main_closure412(), new E.main_closure413()];
+    $.deployMode = true;
+    F.main();
+  }, "call$0", "main0$closure", 0, 0, 18],
+  main_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$active$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$address();
+    },
+    $isFunction: true
+  },
+  main_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$anchor$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure2: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$assertsEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure3: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bpt();
+    },
+    $isFunction: true
+  },
+  main_closure4: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$busy$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure5: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$buttonClick$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure6: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$bytes();
+    },
+    $isFunction: true
+  },
+  main_closure7: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$callback$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure8: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$capacity();
+    },
+    $isFunction: true
+  },
+  main_closure9: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$change$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure10: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$changeSort$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure11: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure12: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$checkedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure13: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classTable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure14: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$classes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure15: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$closing();
+    },
+    $isFunction: true
+  },
+  main_closure16: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$cls$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure17: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$code$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure18: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$coloring$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure19: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$columns();
+    },
+    $isFunction: true
+  },
+  main_closure20: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$connection$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure21: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$counters$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure22: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$countersChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure23: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$current();
+    },
+    $isFunction: true
+  },
+  main_closure24: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptor();
+    },
+    $isFunction: true
+  },
+  main_closure25: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$descriptors();
+    },
+    $isFunction: true
+  },
+  main_closure26: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$devtools$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure27: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$displayCutoff$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure28: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$doAction$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure29: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$element$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure30: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure31: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure32: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$endPosChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure33: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$entry();
+    },
+    $isFunction: true
+  },
+  main_closure34: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$error$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure35: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$eval$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure36: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$evalNow$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure37: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$exception$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure38: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expand$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure39: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expandChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure40: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure41: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expander$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure42: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$expanderStyle();
+    },
+    $isFunction: true
+  },
+  main_closure43: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$expr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure44: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$external();
+    },
+    $isFunction: true
+  },
+  main_closure45: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fd();
+    },
+    $isFunction: true
+  },
+  main_closure46: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$field$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure47: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$fields();
+    },
+    $isFunction: true
+  },
+  main_closure48: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$file$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure49: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$firstTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure50: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flag$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure51: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$flagList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure52: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure53: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formatTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure54: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedAddress();
+    },
+    $isFunction: true
+  },
+  main_closure55: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedAverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure56: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedCollections$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure57: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedDeoptId();
+    },
+    $isFunction: true
+  },
+  main_closure58: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure59: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedExclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure60: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusive();
+    },
+    $isFunction: true
+  },
+  main_closure61: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedInclusiveTicks();
+    },
+    $isFunction: true
+  },
+  main_closure62: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$formattedLine();
+    },
+    $isFunction: true
+  },
+  main_closure63: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$formattedTotalCollectionTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure64: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentation$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure65: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$fragmentationChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure66: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$frame$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure67: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$function$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure68: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$functionChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure69: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$functions();
+    },
+    $isFunction: true
+  },
+  main_closure70: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$getColumnLabel();
+    },
+    $isFunction: true
+  },
+  main_closure71: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$$goto$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure72: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$gotoLink$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure73: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasClass$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure74: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDescriptors();
+    },
+    $isFunction: true
+  },
+  main_closure75: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasDisassembly();
+    },
+    $isFunction: true
+  },
+  main_closure76: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hasNoAllocations();
+    },
+    $isFunction: true
+  },
+  main_closure77: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hasParent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure78: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hashLinkWorkaround$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure79: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hideTagsChecked$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure80: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$hits();
+    },
+    $isFunction: true
+  },
+  main_closure81: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$hoverText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure82: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$httpServer$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure83: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$human();
+    },
+    $isFunction: true
+  },
+  main_closure84: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$idle();
+    },
+    $isFunction: true
+  },
+  main_closure85: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imp();
+    },
+    $isFunction: true
+  },
+  main_closure86: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$imports();
+    },
+    $isFunction: true
+  },
+  main_closure87: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure88: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$instances$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure89: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instruction();
+    },
+    $isFunction: true
+  },
+  main_closure90: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$instructions();
+    },
+    $isFunction: true
+  },
+  main_closure91: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$$interface();
+    },
+    $isFunction: true
+  },
+  main_closure92: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$interfaces();
+    },
+    $isFunction: true
+  },
+  main_closure93: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$internal$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure94: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$io$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure95: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isAbstract();
+    },
+    $isFunction: true
+  },
+  main_closure96: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isBool$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure97: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isComment();
+    },
+    $isFunction: true
+  },
+  main_closure98: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDart$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure99: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isDartCode();
+    },
+    $isFunction: true
+  },
+  main_closure100: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isDouble$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure101: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure102: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isError$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure103: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInstance$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure104: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isInt$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure105: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isList$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure106: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNotEmpty$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure107: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isNull$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure108: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isOptimized();
+    },
+    $isFunction: true
+  },
+  main_closure109: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPatch();
+    },
+    $isFunction: true
+  },
+  main_closure110: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isPipe();
+    },
+    $isFunction: true
+  },
+  main_closure111: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure112: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isType$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure113: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isUnexpected$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure114: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure115: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$isolateChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure116: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$isolates();
+    },
+    $isFunction: true
+  },
+  main_closure117: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$jumpTarget();
+    },
+    $isFunction: true
+  },
+  main_closure118: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$kind$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure119: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$label$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure120: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$last$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure121: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastAccumulatorReset$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure122: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lastServiceGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure123: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastTokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure124: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lastUpdate();
+    },
+    $isFunction: true
+  },
+  main_closure125: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$length$asx(o);
+    },
+    $isFunction: true
+  },
+  main_closure126: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$lib();
+    },
+    $isFunction: true
+  },
+  main_closure127: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$libraries();
+    },
+    $isFunction: true
+  },
+  main_closure128: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$library$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure129: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$line();
+    },
+    $isFunction: true
+  },
+  main_closure130: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure131: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumber$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure132: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lineNumbers$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure133: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$lines$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure134: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$link$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure135: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$list$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure136: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$listening();
+    },
+    $isFunction: true
+  },
+  main_closure137: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$loading();
+    },
+    $isFunction: true
+  },
+  main_closure138: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localAddress();
+    },
+    $isFunction: true
+  },
+  main_closure139: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$localPort();
+    },
+    $isFunction: true
+  },
+  main_closure140: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$mainPort();
+    },
+    $isFunction: true
+  },
+  main_closure141: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$map$ax(o);
+    },
+    $isFunction: true
+  },
+  main_closure142: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapAsString$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure143: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mapChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure144: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$message$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure145: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOut$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure146: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$mouseOver$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure147: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$msg$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure148: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$name$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure149: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$nameIsEmpty$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure150: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$newSpace();
+    },
+    $isFunction: true
+  },
+  main_closure151: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$object$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure152: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$objectChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure153: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$objectPool();
+    },
+    $isFunction: true
+  },
+  main_closure154: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$oldSpace();
+    },
+    $isFunction: true
+  },
+  main_closure155: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pad$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure156: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$padding$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure157: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$path$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure158: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pause$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure159: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pauseEvent$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure160: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$pid();
+    },
+    $isFunction: true
+  },
+  main_closure161: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$pos$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure162: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$posChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure163: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$process$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure164: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profile$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure165: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$profileChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure166: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$protocol$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure167: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualified$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure168: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$qualifiedName$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure169: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$reachable$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure170: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$readClosed();
+    },
+    $isFunction: true
+  },
+  main_closure171: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$ref$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure172: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure173: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refresh$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure174: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshCoverage$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure175: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshGC$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure176: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$refreshTime$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure177: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$relativeLink();
+    },
+    $isFunction: true
+  },
+  main_closure178: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remoteAddress();
+    },
+    $isFunction: true
+  },
+  main_closure179: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$remotePort();
+    },
+    $isFunction: true
+  },
+  main_closure180: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resetAccumulator$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure181: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$response$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure182: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$result$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure183: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$results$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure184: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$resume$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure185: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedBytes$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure186: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainedSize$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure187: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$retainingPath$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure188: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$rootLib();
+    },
+    $isFunction: true
+  },
+  main_closure189: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$row();
+    },
+    $isFunction: true
+  },
+  main_closure190: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$rows$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure191: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$running();
+    },
+    $isFunction: true
+  },
+  main_closure192: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleCount$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure193: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleDepth$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure194: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$sampleRate$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure195: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$script$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure196: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$scriptChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure197: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$scripts();
+    },
+    $isFunction: true
+  },
+  main_closure198: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$selectExpr$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure199: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$serviceType();
+    },
+    $isFunction: true
+  },
+  main_closure200: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$small$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure201: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$socket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure202: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$socketOwner();
+    },
+    $isFunction: true
+  },
+  main_closure203: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$startLine$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure204: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$status$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure205: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$styleForHits$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure206: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subClasses();
+    },
+    $isFunction: true
+  },
+  main_closure207: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$subclass();
+    },
+    $isFunction: true
+  },
+  main_closure208: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$superClass();
+    },
+    $isFunction: true
+  },
+  main_closure209: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelector$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure210: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tagSelectorChanged$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure211: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$text$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure212: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$timeSpan$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure213: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipExclusive();
+    },
+    $isFunction: true
+  },
+  main_closure214: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipKind();
+    },
+    $isFunction: true
+  },
+  main_closure215: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipParent();
+    },
+    $isFunction: true
+  },
+  main_closure216: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTicks();
+    },
+    $isFunction: true
+  },
+  main_closure217: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tipTime();
+    },
+    $isFunction: true
+  },
+  main_closure218: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpand$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure219: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$toggleExpanded$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure220: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$tokenPos();
+    },
+    $isFunction: true
+  },
+  main_closure221: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$topFrame();
+    },
+    $isFunction: true
+  },
+  main_closure222: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$trace$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure223: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$tree$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure224: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$typeChecksEnabled();
+    },
+    $isFunction: true
+  },
+  main_closure225: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$uncheckedText$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure226: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$updateLineMode$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure227: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$uptime();
+    },
+    $isFunction: true
+  },
+  main_closure228: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$url$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure229: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$used();
+    },
+    $isFunction: true
+  },
+  main_closure230: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$v();
+    },
+    $isFunction: true
+  },
+  main_closure231: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variable();
+    },
+    $isFunction: true
+  },
+  main_closure232: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$variables();
+    },
+    $isFunction: true
+  },
+  main_closure233: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$version$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure234: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$vm$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure235: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$vmName();
+    },
+    $isFunction: true
+  },
+  main_closure236: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return J.get$webSocket$x(o);
+    },
+    $isFunction: true
+  },
+  main_closure237: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return o.get$writeClosed();
+    },
+    $isFunction: true
+  },
+  main_closure238: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$active$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure239: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$anchor$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure240: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$busy$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure241: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$callback$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure242: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure243: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$checkedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure244: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$classTable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure245: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$cls$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure246: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$code$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure247: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$connection$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure248: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$counters$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure249: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$devtools$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure250: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$displayCutoff$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure251: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure252: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$endPos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure253: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$entry(v);
+    },
+    $isFunction: true
+  },
+  main_closure254: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$error$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure255: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$eval$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure256: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$exception$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure257: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expand$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure258: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expanded$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure259: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$expr$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure260: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$field$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure261: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$file$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure262: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$firstTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure263: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flag$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure264: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$flagList$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure265: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$fragmentation$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure266: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$frame$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure267: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$$function$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure268: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasClass$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure269: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hasParent$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure270: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hashLinkWorkaround$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure271: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$hideTagsChecked$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure272: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$httpServer$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure273: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$imp(v);
+    },
+    $isFunction: true
+  },
+  main_closure274: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instance$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure275: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$instances$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure276: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$$interface(v);
+    },
+    $isFunction: true
+  },
+  main_closure277: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$internal$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure278: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$io$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure279: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isDart$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure280: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$isolate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure281: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$kind$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure282: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$label$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure283: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$last$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure284: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastAccumulatorReset$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure285: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lastServiceGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure286: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lastTokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure287: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$lib(v);
+    },
+    $isFunction: true
+  },
+  main_closure288: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$library$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure289: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lineMode$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure290: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$lines$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure291: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$link$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure292: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$list$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure293: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$map$ax(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure294: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$mapAsString$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure295: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$msg$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure296: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$name$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure297: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$object$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure298: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$objectPool(v);
+    },
+    $isFunction: true
+  },
+  main_closure299: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pad$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure300: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$path$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure301: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pause$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure302: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$pos$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure303: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$process$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure304: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$profile$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure305: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualified$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure306: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$qualifiedName$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure307: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$reachable$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure308: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$ref$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure309: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refresh$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure310: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshCoverage$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure311: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshGC$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure312: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$refreshTime$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure313: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resetAccumulator$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure314: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$result$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure315: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$results$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure316: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$resume$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure317: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedBytes$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure318: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainedSize$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure319: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$retainingPath$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure320: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$rootLib(v);
+    },
+    $isFunction: true
+  },
+  main_closure321: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleCount$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure322: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleDepth$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure323: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$sampleRate$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure324: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$script$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure325: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$small$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure326: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$socket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure327: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$socketOwner(v);
+    },
+    $isFunction: true
+  },
+  main_closure328: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$startLine$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure329: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$status$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure330: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$subclass(v);
+    },
+    $isFunction: true
+  },
+  main_closure331: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$superClass(v);
+    },
+    $isFunction: true
+  },
+  main_closure332: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$tagSelector$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure333: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$text$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure334: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$timeSpan$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure335: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      o.set$tokenPos(v);
+    },
+    $isFunction: true
+  },
+  main_closure336: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$trace$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure337: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$uncheckedText$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure338: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$vm$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure339: {
+    "^": "Closure:75;",
+    call$2: function(o, v) {
+      J.set$webSocket$x(o, v);
+    },
+    $isFunction: true
+  },
+  main_closure340: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("curly-block", C.Type_cop);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure341: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-element", C.Type_sRP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure342: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-ref", C.Type_UJT);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure343: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-ref", C.Type_EVD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure344: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("action-link", C.Type_kA7);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure345: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-bar", C.Type_nV5);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure346: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu", C.Type_KMd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure347: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-menu-item", C.Type_AD4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure348: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-refresh", C.Type_Sxn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure349: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("nav-control", C.Type_9ur);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure350: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("top-nav-menu", C.Type_C7R);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure351: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-nav-menu", C.Type_wsa);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure352: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-nav-menu", C.Type_s2l);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure353: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-nav-menu", C.Type_JFX);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure354: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("breakpoint-list", C.Type_ON8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure355: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-ref", C.Type_ql8);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure356: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-tree", C.Type_dRp);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure357: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-box", C.Type_8eb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure358: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("eval-link", C.Type_p2P);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure359: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-ref", C.Type_ohY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure360: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-ref", C.Type_wgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure361: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-ref", C.Type_mpV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure362: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-ref", C.Type_wBh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure363: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("class-view", C.Type_O5a);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure364: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-ref", C.Type_2jN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure365: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("code-view", C.Type_Aym);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure366: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("error-view", C.Type_Npb);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure367: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("field-view", C.Type_4IJ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure368: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-frame", C.Type_Jcu);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure369: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-list", C.Type_f1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure370: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("flag-item", C.Type_7g3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure371: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-inset", C.Type_a1Y);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure372: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("function-view", C.Type_bDN);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure373: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-map", C.Type_SoB);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure374: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-view", C.Type_TEn);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure375: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-ref", C.Type_JmU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure376: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-list-view", C.Type_yvP);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure377: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-ref", C.Type_i7j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure378: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-view", C.Type_M6L);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure379: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-view", C.Type_L9j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure380: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-http-server-connection-ref", C.Type_uIL);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure381: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-ref", C.Type_B8J);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure382: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-list-view", C.Type_4m4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure383: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-socket-view", C.Type_61d);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure384: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-ref", C.Type_MUU);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure385: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-list-view", C.Type_gg4);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure386: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-web-socket-view", C.Type_AyI);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure387: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-list-view", C.Type_IuH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure388: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-ref", C.Type_mWg);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure389: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-random-access-file-view", C.Type_8cK);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure390: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-list-view", C.Type_8KD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure391: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-ref", C.Type_qMZ);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure392: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("io-process-view", C.Type_AHF);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure393: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-ref", C.Type_ES1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure394: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-summary", C.Type_iL9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure395: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-run-state", C.Type_aAD);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure396: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-location", C.Type_ECh);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure397: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-shared-summary", C.Type_8Gl);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure398: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-counter-chart", C.Type_wT1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure399: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-view", C.Type_ZKG);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure400: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("instance-view", C.Type_gqS);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure401: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("json-view", C.Type_Kyy);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure402: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("library-view", C.Type_qph);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure403: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("heap-profile", C.Type_LV6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure404: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("sliding-checkbox", C.Type_kuc);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure405: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("isolate-profile", C.Type_cOY);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure406: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("script-view", C.Type_0e9);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure407: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("stack-trace", C.Type_nVV);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure408: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-view", C.Type_E0k);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure409: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-view", C.Type_Mu6);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure410: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("observatory-application", C.Type_YgH);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure411: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-exception-view", C.Type_y1j);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure412: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("service-error-view", C.Type_FKd);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  main_closure413: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.Polymer_register("vm-ref", C.Type_Eue);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+},
+1],
+["breakpoint_list_element", "package:observatory/src/elements/breakpoint_list.dart", , B, {
+  "^": "",
+  BreakpointListElement: {
+    "^": "ObservatoryElement_ChangeNotifier;_breakpoint_list_element$__$msg,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$msg: function(receiver) {
+      return receiver._breakpoint_list_element$__$msg;
+    },
+    set$msg: function(receiver, value) {
+      receiver._breakpoint_list_element$__$msg = this.notifyPropertyChange$3(receiver, C.Symbol_msg, receiver._breakpoint_list_element$__$msg, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._breakpoint_list_element$__$msg).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {BreakpointListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.BreakpointListElement_methods.Element$created$0(receiver);
+        C.BreakpointListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["class_ref_element", "package:observatory/src/elements/class_ref.dart", , Q, {
+  "^": "",
+  ClassRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {ClassRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassRefElement_methods.Element$created$0(receiver);
+        C.ClassRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["class_tree_element", "package:observatory/src/elements/class_tree.dart", , O, {
+  "^": "",
+  ClassTreeRow: {
+    "^": "TableTreeRow;isolate>,cls>,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    onShow$0: function(_) {
+      var t1, t2, t3, t4, subClass, t5, row;
+      t1 = this.children;
+      if (t1.length > 0)
+        return;
+      for (t2 = J.get$iterator$ax(J.get$children$x(this.cls)), t3 = this.isolate, t4 = this.depth + 1; t2.moveNext$0();) {
+        subClass = t2.get$current();
+        if (subClass.get$isPatch() === true)
+          continue;
+        t5 = [];
+        t5.$builtinTypeInfo = [G.TableTreeRow];
+        row = new O.ClassTreeRow(t3, subClass, this, t4, t5, [], "\u2192", "cursor: pointer;", false, null, null);
+        if (!row.hasChildren$0()) {
+          t5 = row._app$__$expanderStyle;
+          if (row.get$hasObservers(row) && !J.$eq(t5, "visibility:hidden;")) {
+            t5 = new T.PropertyChangeRecord(row, C.Symbol_expanderStyle, t5, "visibility:hidden;");
+            t5.$builtinTypeInfo = [null];
+            row.notifyChange$1(row, t5);
+          }
+          row._app$__$expanderStyle = "visibility:hidden;";
+        }
+        t1.push(row);
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.cls)) > 0;
+    }
+  },
+  ClassTreeElement: {
+    "^": "ObservatoryElement_ChangeNotifier1;_class_tree_element$__$isolate,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._class_tree_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._class_tree_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._class_tree_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      t1 = receiver._class_tree_element$__$isolate;
+      if (t1 != null)
+        this._update$1(receiver, t1.get$objectClass());
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      receiver._class_tree_element$__$isolate.getClassHierarchy$0().then$1(new O.ClassTreeElement_isolateChanged_closure(receiver));
+    }, "call$1", "get$isolateChanged", 2, 0, 13, 57],
+    _update$1: function(receiver, root) {
+      var rootRow, e, stackTrace, t1, t2, rootRow0, t3, t4, t5, exception;
+      try {
+        t1 = receiver._class_tree_element$__$isolate;
+        t2 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        rootRow0 = new O.ClassTreeRow(t1, root, null, 0, t2, [], "\u2192", "cursor: pointer;", false, null, null);
+        rootRow0.TableTreeRow$1(null);
+        rootRow = rootRow0;
+        t1 = J.get$children$x(rootRow);
+        t2 = receiver._class_tree_element$__$isolate;
+        t3 = rootRow;
+        t4 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t5 = t3 != null ? t3.get$depth() + 1 : 0;
+        t4 = new O.ClassTreeRow(t2, root, t3, t5, t4, [], "\u2192", "cursor: pointer;", false, null, null);
+        t4.TableTreeRow$1(t3);
+        t1.push(t4);
+        receiver.tree.initialize$1(rootRow);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_update", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {ClassTreeElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassTreeElement_methods.Element$created$0(receiver);
+        C.ClassTreeElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier1: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassTreeElement_isolateChanged_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(objectClass) {
+      J._update$1$x(this.this_0, objectClass);
+    }, "call$1", null, 2, 0, null, 95, "call"],
+    $isFunction: true
+  }
+}],
+["class_view_element", "package:observatory/src/elements/class_view.dart", , Z, {
+  "^": "",
+  ClassViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier2;_class_view_element$__$cls,_class_view_element$__$instances,_class_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._class_view_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._class_view_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._class_view_element$__$cls, value);
+    },
+    get$instances: function(receiver) {
+      return receiver._class_view_element$__$instances;
+    },
+    set$instances: function(receiver, value) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._class_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return receiver._class_view_element$__$cls.get$1("eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    reachable$1: [function(receiver, limit) {
+      return receiver._class_view_element$__$cls.get$1("instances?limit=" + H.S(limit)).then$1(new Z.ClassViewElement_reachable_closure(receiver));
+    }, "call$1", "get$reachable", 2, 0, 98, 99],
+    retainedSize$1: [function(receiver, dummy) {
+      return receiver._class_view_element$__$cls.get$1("retained").then$1(new Z.ClassViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    refresh$1: [function(receiver, done) {
+      receiver._class_view_element$__$instances = this.notifyPropertyChange$3(receiver, C.Symbol_instances, receiver._class_view_element$__$instances, null);
+      receiver._class_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._class_view_element$__$retainedBytes, null);
+      J.reload$0$x(receiver._class_view_element$__$cls).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {ClassViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassViewElement_methods.Element$created$0(receiver);
+        C.ClassViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier2: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassViewElement_reachable_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._class_view_element$__$instances = J.notifyPropertyChange$3$x(t1, C.Symbol_instances, t1._class_view_element$__$instances, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  ClassViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._class_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._class_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["code_ref_element", "package:observatory/src/elements/code_ref.dart", , O, {
+  "^": "",
+  CodeRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_code, 0, 1);
+    }, "call$1", "get$refChanged", 2, 0, 13, 57],
+    static: {CodeRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeRefElement_methods.Element$created$0(receiver);
+        C.CodeRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["code_view_element", "package:observatory/src/elements/code_view.dart", , F, {
+  "^": "",
+  CodeViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier3;_code_view_element$__$code,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$code: function(receiver) {
+      return receiver._code_view_element$__$code;
+    },
+    set$code: function(receiver, value) {
+      receiver._code_view_element$__$code = this.notifyPropertyChange$3(receiver, C.Symbol_code, receiver._code_view_element$__$code, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._code_view_element$__$code;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1).then$1(new F.CodeViewElement_attached_closure());
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._code_view_element$__$code).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _findJumpTarget$1: function(receiver, target) {
+      var jumpTarget, address, node;
+      jumpTarget = J.get$attributes$x(target)._html$_element.getAttribute("data-jump-target");
+      if (jumpTarget === "")
+        return;
+      address = H.Primitives_parseInt(jumpTarget, null, null);
+      node = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#addr-" + H.S(address));
+      if (node == null)
+        return;
+      return node;
+    },
+    mouseOver$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).add$1(0, "highlight");
+    }, "call$3", "get$mouseOver", 6, 0, 102, 1, 93, 94],
+    mouseOut$3: [function(receiver, e, detail, target) {
+      var jt = this._findJumpTarget$1(receiver, target);
+      if (jt == null)
+        return;
+      J.get$classes$x(jt).remove$1(0, "highlight");
+    }, "call$3", "get$mouseOut", 6, 0, 102, 1, 93, 94],
+    static: {CodeViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CodeViewElement_methods.Element$created$0(receiver);
+        C.CodeViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier3: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeViewElement_attached_closure: {
+    "^": "Closure:103;",
+    call$1: [function(c) {
+      c.loadScript$0();
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  }
+}],
+["curly_block_element", "package:observatory/src/elements/curly_block.dart", , R, {
+  "^": "",
+  CurlyBlockElement: {
+    "^": "PolymerElement_ChangeNotifier0;_curly_block_element$__$expanded,_curly_block_element$__$busy,_curly_block_element$__$callback,_curly_block_element$__$expand,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$expanded: function(receiver) {
+      return receiver._curly_block_element$__$expanded;
+    },
+    set$expanded: function(receiver, value) {
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, value);
+    },
+    get$busy: function(receiver) {
+      return receiver._curly_block_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._curly_block_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$2: function($receiver, arg0, arg1) {
+      return this.get$callback($receiver).call$2(arg0, arg1);
+    },
+    set$callback: function(receiver, value) {
+      receiver._curly_block_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._curly_block_element$__$callback, value);
+    },
+    get$expand: function(receiver) {
+      return receiver._curly_block_element$__$expand;
+    },
+    set$expand: function(receiver, value) {
+      receiver._curly_block_element$__$expand = this.notifyPropertyChange$3(receiver, C.Symbol_expand, receiver._curly_block_element$__$expand, value);
+    },
+    expandChanged$1: [function(receiver, oldValue) {
+      var t1 = receiver._curly_block_element$__$expand;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, receiver._curly_block_element$__$expanded, t1);
+    }, "call$1", "get$expandChanged", 2, 0, 20, 57],
+    doneCallback$0: [function(receiver) {
+      var t1 = receiver._curly_block_element$__$expanded;
+      receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._curly_block_element$__$busy, false);
+    }, "call$0", "get$doneCallback", 0, 0, 18],
+    toggleExpand$3: [function(receiver, a, b, c) {
+      var t1 = receiver._curly_block_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._curly_block_element$__$callback != null) {
+        receiver._curly_block_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        this.callback$2(receiver, receiver._curly_block_element$__$expanded !== true, this.get$doneCallback(receiver));
+      } else {
+        t1 = receiver._curly_block_element$__$expanded;
+        receiver._curly_block_element$__$expanded = this.notifyPropertyChange$3(receiver, C.Symbol_expanded, t1, t1 !== true);
+      }
+    }, "call$3", "get$toggleExpand", 6, 0, 79, 46, 47, 80],
+    static: {CurlyBlockElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._curly_block_element$__$expanded = false;
+        receiver._curly_block_element$__$busy = false;
+        receiver._curly_block_element$__$callback = null;
+        receiver._curly_block_element$__$expand = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.CurlyBlockElement_methods.Element$created$0(receiver);
+        C.CurlyBlockElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier0: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["dart._internal", "dart:_internal", , H, {
+  "^": "",
+  IterableMixinWorkaround_forEach: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      f.call$1(t1._current);
+  },
+  IterableMixinWorkaround_any: function(iterable, f) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      if (f.call$1(t1._current) === true)
+        return true;
+    return false;
+  },
+  IterableMixinWorkaround_fold: function(iterable, initialValue, combine) {
+    var t1;
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();)
+      initialValue = combine.call$2(initialValue, t1._current);
+    return initialValue;
+  },
+  IterableMixinWorkaround_sortList: function(list, compare) {
+    if (compare == null)
+      compare = P.Comparable_compare$closure();
+    H.Sort__doSort(list, 0, list.length - 1, compare);
+  },
+  IterableMixinWorkaround__rangeCheck: function(list, start, end) {
+    var t1 = J.getInterceptor$n(start);
+    if (t1.$lt(start, 0) || t1.$gt(start, list.length))
+      throw H.wrapException(P.RangeError$range(start, 0, list.length));
+    t1 = J.getInterceptor$n(end);
+    if (t1.$lt(end, start) || t1.$gt(end, list.length))
+      throw H.wrapException(P.RangeError$range(end, start, list.length));
+  },
+  IterableMixinWorkaround_setRangeList: function(list, start, end, from, skipCount) {
+    var $length, t1, otherStart, otherList;
+    H.IterableMixinWorkaround__rangeCheck(list, start, end);
+    $length = J.$sub$n(end, start);
+    if (J.$eq($length, 0))
+      return;
+    if (J.$lt$n(skipCount, 0))
+      throw H.wrapException(P.ArgumentError$(skipCount));
+    t1 = J.getInterceptor(from);
+    if (!!t1.$isList) {
+      otherStart = skipCount;
+      otherList = from;
+    } else {
+      otherList = t1.skip$1(from, skipCount).toList$1$growable(0, false);
+      otherStart = 0;
+    }
+    if (J.$gt$n(J.$add$ns(otherStart, $length), J.get$length$asx(otherList)))
+      throw H.wrapException(H.IterableElementError_tooFew());
+    H.Lists_copy(otherList, otherStart, list, start, $length);
+  },
+  IterableMixinWorkaround_insertAllList: function(list, index, iterable) {
+    var t1, insertionLength, t2, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    t1 = J.getInterceptor(iterable);
+    if (!t1.$isEfficientLength)
+      iterable = t1.toList$1$growable(iterable, false);
+    t1 = J.getInterceptor$asx(iterable);
+    insertionLength = t1.get$length(iterable);
+    t2 = list.length;
+    if (typeof insertionLength !== "number")
+      return H.iae(insertionLength);
+    C.JSArray_methods.set$length(list, t2 + insertionLength);
+    t2 = list.length;
+    if (!!list.immutable$list)
+      H.throwExpression(P.UnsupportedError$("set range"));
+    H.IterableMixinWorkaround_setRangeList(list, index + insertionLength, t2, list, index);
+    for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableMixinWorkaround_setAllList: function(list, index, iterable) {
+    var t1, index0;
+    if (index < 0 || index > list.length)
+      throw H.wrapException(P.RangeError$range(index, 0, list.length));
+    for (t1 = J.get$iterator$ax(iterable); t1.moveNext$0(); index = index0) {
+      index0 = index + 1;
+      C.JSArray_methods.$indexSet(list, index, t1.get$current());
+    }
+  },
+  IterableElementError_noElement: function() {
+    return new P.StateError("No element");
+  },
+  IterableElementError_tooFew: function() {
+    return new P.StateError("Too few elements");
+  },
+  Lists_copy: function(src, srcStart, dst, dstStart, count) {
+    var t1, i, j, t2, t3;
+    t1 = J.getInterceptor$n(srcStart);
+    if (t1.$lt(srcStart, dstStart))
+      for (i = J.$sub$n(t1.$add(srcStart, count), 1), j = J.$sub$n(J.$add$ns(dstStart, count), 1), t1 = J.getInterceptor$asx(src); t2 = J.getInterceptor$n(i), t2.$ge(i, srcStart); i = t2.$sub(i, 1), j = J.$sub$n(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t1.$index(src, i));
+    else
+      for (t2 = J.getInterceptor$asx(src), j = dstStart, i = srcStart; t3 = J.getInterceptor$n(i), t3.$lt(i, t1.$add(srcStart, count)); i = t3.$add(i, 1), j = J.$add$ns(j, 1))
+        C.JSArray_methods.$indexSet(dst, j, t2.$index(src, i));
+  },
+  Lists_indexOf: function(a, element, startIndex, endIndex) {
+    var i;
+    if (startIndex >= a.length)
+      return -1;
+    for (i = startIndex; i < endIndex; ++i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Lists_lastIndexOf: function(a, element, startIndex) {
+    var t1, i;
+    if (typeof startIndex !== "number")
+      return startIndex.$lt();
+    if (startIndex < 0)
+      return -1;
+    t1 = a.length;
+    if (startIndex >= t1)
+      startIndex = t1 - 1;
+    for (i = startIndex; i >= 0; --i) {
+      if (i >= a.length)
+        return H.ioore(a, i);
+      if (J.$eq(a[i], element))
+        return i;
+    }
+    return -1;
+  },
+  Sort__doSort: function(a, left, right, compare) {
+    if (right - left <= 32)
+      H.Sort__insertionSort(a, left, right, compare);
+    else
+      H.Sort__dualPivotQuicksort(a, left, right, compare);
+  },
+  Sort__insertionSort: function(a, left, right, compare) {
+    var i, t1, el, j, j0;
+    for (i = left + 1, t1 = J.getInterceptor$asx(a); i <= right; ++i) {
+      el = t1.$index(a, i);
+      j = i;
+      while (true) {
+        if (!(j > left && J.$gt$n(compare.call$2(t1.$index(a, j - 1), el), 0)))
+          break;
+        j0 = j - 1;
+        t1.$indexSet(a, j, t1.$index(a, j0));
+        j = j0;
+      }
+      t1.$indexSet(a, j, el);
+    }
+  },
+  Sort__dualPivotQuicksort: function(a, left, right, compare) {
+    var sixth, index1, index5, index3, index2, index4, t1, el1, el2, el3, el4, el5, t0, less, great, k, ak, comp, t2, great0, less0, pivots_are_equal;
+    sixth = C.JSInt_methods._tdivFast$1(right - left + 1, 6);
+    index1 = left + sixth;
+    index5 = right - sixth;
+    index3 = C.JSInt_methods._tdivFast$1(left + right, 2);
+    index2 = index3 - sixth;
+    index4 = index3 + sixth;
+    t1 = J.getInterceptor$asx(a);
+    el1 = t1.$index(a, index1);
+    el2 = t1.$index(a, index2);
+    el3 = t1.$index(a, index3);
+    el4 = t1.$index(a, index4);
+    el5 = t1.$index(a, index5);
+    if (J.$gt$n(compare.call$2(el1, el2), 0)) {
+      t0 = el2;
+      el2 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el3), 0)) {
+      t0 = el3;
+      el3 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el1, el4), 0)) {
+      t0 = el4;
+      el4 = el1;
+      el1 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el3, el4), 0)) {
+      t0 = el4;
+      el4 = el3;
+      el3 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el5), 0)) {
+      t0 = el5;
+      el5 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el2, el3), 0)) {
+      t0 = el3;
+      el3 = el2;
+      el2 = t0;
+    }
+    if (J.$gt$n(compare.call$2(el4, el5), 0)) {
+      t0 = el5;
+      el5 = el4;
+      el4 = t0;
+    }
+    t1.$indexSet(a, index1, el1);
+    t1.$indexSet(a, index3, el3);
+    t1.$indexSet(a, index5, el5);
+    t1.$indexSet(a, index2, t1.$index(a, left));
+    t1.$indexSet(a, index4, t1.$index(a, right));
+    less = left + 1;
+    great = right - 1;
+    if (J.$eq(compare.call$2(el2, el4), 0)) {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        comp = compare.call$2(ak, el2);
+        t2 = J.getInterceptor(comp);
+        if (t2.$eq(comp, 0))
+          continue;
+        if (t2.$lt(comp, 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else
+          for (; true;) {
+            comp = compare.call$2(t1.$index(a, great), el2);
+            t2 = J.getInterceptor$n(comp);
+            if (t2.$gt(comp, 0)) {
+              --great;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (t2.$lt(comp, 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+                break;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                break;
+              }
+            }
+          }
+      }
+      pivots_are_equal = true;
+    } else {
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$lt$n(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$gt$n(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$gt$n(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      pivots_are_equal = false;
+    }
+    t2 = less - 1;
+    t1.$indexSet(a, left, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el2);
+    t2 = great + 1;
+    t1.$indexSet(a, right, t1.$index(a, t2));
+    t1.$indexSet(a, t2, el4);
+    H.Sort__doSort(a, left, less - 2, compare);
+    H.Sort__doSort(a, great + 2, right, compare);
+    if (pivots_are_equal)
+      return;
+    if (less < index1 && great > index5) {
+      for (; J.$eq(compare.call$2(t1.$index(a, less), el2), 0);)
+        ++less;
+      for (; J.$eq(compare.call$2(t1.$index(a, great), el4), 0);)
+        --great;
+      for (k = less; k <= great; ++k) {
+        ak = t1.$index(a, k);
+        if (J.$eq(compare.call$2(ak, el2), 0)) {
+          if (k !== less) {
+            t1.$indexSet(a, k, t1.$index(a, less));
+            t1.$indexSet(a, less, ak);
+          }
+          ++less;
+        } else if (J.$eq(compare.call$2(ak, el4), 0))
+          for (; true;)
+            if (J.$eq(compare.call$2(t1.$index(a, great), el4), 0)) {
+              --great;
+              if (great < k)
+                break;
+              continue;
+            } else {
+              great0 = great - 1;
+              if (J.$lt$n(compare.call$2(t1.$index(a, great), el2), 0)) {
+                t1.$indexSet(a, k, t1.$index(a, less));
+                less0 = less + 1;
+                t1.$indexSet(a, less, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+                less = less0;
+              } else {
+                t1.$indexSet(a, k, t1.$index(a, great));
+                t1.$indexSet(a, great, ak);
+                great = great0;
+              }
+              break;
+            }
+      }
+      H.Sort__doSort(a, less, great, compare);
+    } else
+      H.Sort__doSort(a, less, great, compare);
+  },
+  ListIterable: {
+    "^": "IterableBase;",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(this, this.get$length(this), 0, null), [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+    },
+    forEach$1: function(_, action) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        action.call$1(this.elementAt$1(0, i));
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return J.$eq(this.get$length(this), 0);
+    },
+    get$last: function(_) {
+      if (J.$eq(this.get$length(this), 0))
+        throw H.wrapException(H.IterableElementError_noElement());
+      return this.elementAt$1(0, J.$sub$n(this.get$length(this), 1));
+    },
+    contains$1: function(_, element) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (J.$eq(this.elementAt$1(0, i), element))
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    any$1: function(_, test) {
+      var $length, i;
+      $length = this.get$length(this);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      i = 0;
+      for (; i < $length; ++i) {
+        if (test.call$1(this.elementAt$1(0, i)) === true)
+          return true;
+        if ($length !== this.get$length(this))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+      return false;
+    },
+    join$1: function(_, separator) {
+      var $length, t1, first, buffer, i, str;
+      $length = this.get$length(this);
+      if (separator.length !== 0) {
+        t1 = J.getInterceptor($length);
+        if (t1.$eq($length, 0))
+          return "";
+        first = H.S(this.elementAt$1(0, 0));
+        if (!t1.$eq($length, this.get$length(this)))
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        buffer = P.StringBuffer$(first);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 1;
+        for (; i < $length; ++i) {
+          buffer._contents += separator;
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      } else {
+        buffer = P.StringBuffer$("");
+        if (typeof $length !== "number")
+          return H.iae($length);
+        i = 0;
+        for (; i < $length; ++i) {
+          str = this.elementAt$1(0, i);
+          buffer._contents += typeof str === "string" ? str : H.S(str);
+          if ($length !== this.get$length(this))
+            throw H.wrapException(P.ConcurrentModificationError$(this));
+        }
+        return buffer._contents;
+      }
+    },
+    where$1: function(_, test) {
+      return P.IterableBase.prototype.where$1.call(this, this, test);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E0", ret: P.Iterable, args: [{func: "dynamic__E0", args: [E]}]};
+      }, this.$receiver, "ListIterable");
+    }, 31],
+    toList$1$growable: function(_, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = Array(t1);
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(this, "ListIterable", 0)]);
+      }
+      i = 0;
+      while (true) {
+        t1 = this.get$length(this);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (!(i < t1))
+          break;
+        t1 = this.elementAt$1(0, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+        ++i;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    $isEfficientLength: true
+  },
+  SubListIterable: {
+    "^": "ListIterable;_iterable,_start,_endOrLength",
+    get$_endIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._endOrLength;
+      if (t1 == null || J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$_startIndex: function() {
+      var $length, t1;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$gt$n(t1, $length))
+        return $length;
+      return t1;
+    },
+    get$length: function(_) {
+      var $length, t1, t2;
+      $length = J.get$length$asx(this._iterable);
+      t1 = this._start;
+      if (J.$ge$n(t1, $length))
+        return 0;
+      t2 = this._endOrLength;
+      if (t2 == null || J.$ge$n(t2, $length))
+        return J.$sub$n($length, t1);
+      return J.$sub$n(t2, t1);
+    },
+    elementAt$1: function(_, index) {
+      var realIndex = J.$add$ns(this.get$_startIndex(), index);
+      if (J.$lt$n(index, 0) || J.$ge$n(realIndex, this.get$_endIndex()))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      return J.elementAt$1$ax(this._iterable, realIndex);
+    },
+    skip$1: function(_, count) {
+      if (J.$lt$n(count, 0))
+        throw H.wrapException(P.RangeError$value(count));
+      return H.SubListIterable$(this._iterable, J.$add$ns(this._start, count), this._endOrLength, null);
+    },
+    take$1: function(_, count) {
+      var t1, t2, newEnd;
+      if (count < 0)
+        throw H.wrapException(P.RangeError$value(count));
+      t1 = this._endOrLength;
+      t2 = this._start;
+      if (t1 == null)
+        return H.SubListIterable$(this._iterable, t2, J.$add$ns(t2, count), null);
+      else {
+        newEnd = J.$add$ns(t2, count);
+        if (J.$lt$n(t1, newEnd))
+          return this;
+        return H.SubListIterable$(this._iterable, t2, newEnd, null);
+      }
+    },
+    SubListIterable$3: function(_iterable, _start, _endOrLength, $E) {
+      var t1, t2, t3;
+      t1 = this._start;
+      t2 = J.getInterceptor$n(t1);
+      if (t2.$lt(t1, 0))
+        throw H.wrapException(P.RangeError$value(t1));
+      t3 = this._endOrLength;
+      if (t3 != null) {
+        if (J.$lt$n(t3, 0))
+          throw H.wrapException(P.RangeError$value(t3));
+        if (t2.$gt(t1, t3))
+          throw H.wrapException(P.RangeError$range(t1, 0, t3));
+      }
+    },
+    static: {SubListIterable$: function(_iterable, _start, _endOrLength, $E) {
+        var t1 = H.setRuntimeTypeInfo(new H.SubListIterable(_iterable, _start, _endOrLength), [$E]);
+        t1.SubListIterable$3(_iterable, _start, _endOrLength, $E);
+        return t1;
+      }}
+  },
+  ListIterator: {
+    "^": "Object;_iterable,_length,_index,_current",
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2, $length, t3;
+      t1 = this._iterable;
+      t2 = J.getInterceptor$asx(t1);
+      $length = t2.get$length(t1);
+      if (!J.$eq(this._length, $length))
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t3 = this._index;
+      if (typeof $length !== "number")
+        return H.iae($length);
+      if (t3 >= $length) {
+        this._current = null;
+        return false;
+      }
+      this._current = t2.elementAt$1(t1, t3);
+      ++this._index;
+      return true;
+    }
+  },
+  MappedIterable: {
+    "^": "IterableBase;_iterable,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$iterator: function(_) {
+      var t1 = new H.MappedIterator(null, J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._iterable);
+    },
+    get$last: function(_) {
+      return this._f$1(J.get$last$ax(this._iterable));
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    static: {MappedIterable_MappedIterable: function(iterable, $function, $S, $T) {
+        if (!!J.getInterceptor(iterable).$isEfficientLength)
+          return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(iterable, $function), [$S, $T]);
+        return H.setRuntimeTypeInfo(new H.MappedIterable(iterable, $function), [$S, $T]);
+      }}
+  },
+  EfficientLengthMappedIterable: {
+    "^": "MappedIterable;_iterable,_f",
+    $isEfficientLength: true
+  },
+  MappedIterator: {
+    "^": "Iterator;_current,_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      var t1 = this._iterator;
+      if (t1.moveNext$0()) {
+        this._current = this._f$1(t1.get$current());
+        return true;
+      }
+      this._current = null;
+      return false;
+    },
+    get$current: function() {
+      return this._current;
+    },
+    $asIterator: function($S, $T) {
+      return [$T];
+    }
+  },
+  MappedListIterable: {
+    "^": "ListIterable;_source,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      return this._f$1(J.elementAt$1$ax(this._source, index));
+    },
+    $asListIterable: function($S, $T) {
+      return [$T];
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    },
+    $isEfficientLength: true
+  },
+  WhereIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.WhereIterator(J.get$iterator$ax(this._iterable), this._f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  WhereIterator: {
+    "^": "Iterator;_iterator,_f",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    moveNext$0: function() {
+      for (var t1 = this._iterator; t1.moveNext$0();)
+        if (this._f$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$current: function() {
+      return this._iterator.get$current();
+    }
+  },
+  ExpandIterable: {
+    "^": "IterableBase;_iterable,_f",
+    get$iterator: function(_) {
+      var t1 = new H.ExpandIterator(J.get$iterator$ax(this._iterable), this._f, C.C_EmptyIterator, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($S, $T) {
+      return [$T];
+    },
+    $asIterable: function($S, $T) {
+      return [$T];
+    }
+  },
+  ExpandIterator: {
+    "^": "Object;_iterator,_f,_currentExpansion,_current",
+    _f$1: function(arg0) {
+      return this._f.call$1(arg0);
+    },
+    get$current: function() {
+      return this._current;
+    },
+    moveNext$0: function() {
+      var t1, t2;
+      t1 = this._currentExpansion;
+      if (t1 == null)
+        return false;
+      for (t2 = this._iterator; !t1.moveNext$0();) {
+        this._current = null;
+        if (t2.moveNext$0()) {
+          this._currentExpansion = null;
+          t1 = J.get$iterator$ax(this._f$1(t2.get$current()));
+          this._currentExpansion = t1;
+        } else
+          return false;
+      }
+      this._current = this._currentExpansion.get$current();
+      return true;
+    }
+  },
+  EmptyIterator: {
+    "^": "Object;",
+    moveNext$0: function() {
+      return false;
+    },
+    get$current: function() {
+      return;
+    }
+  },
+  FixedLengthListMixin: {
+    "^": "Object;",
+    set$length: function(receiver, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of a fixed-length list"));
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insert$2: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    insertAll$2: function(receiver, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to a fixed-length list"));
+    },
+    clear$0: function(receiver) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear a fixed-length list"));
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from a fixed-length list"));
+    }
+  },
+  UnmodifiableListMixin: {
+    "^": "Object;",
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot change the length of an unmodifiable list"));
+    },
+    setAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    add$1: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insert$2: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    insertAll$2: function(_, at, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    addAll$1: function(_, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to an unmodifiable list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    clear$0: function(_) {
+      throw H.wrapException(P.UnsupportedError$("Cannot clear an unmodifiable list"));
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot remove from an unmodifiable list"));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  UnmodifiableListBase: {
+    "^": "ListBase+UnmodifiableListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ReversedListIterable: {
+    "^": "ListIterable;_source",
+    get$length: function(_) {
+      return J.get$length$asx(this._source);
+    },
+    elementAt$1: function(_, index) {
+      var t1, t2, t3;
+      t1 = this._source;
+      t2 = J.getInterceptor$asx(t1);
+      t3 = t2.get$length(t1);
+      if (typeof index !== "number")
+        return H.iae(index);
+      return t2.elementAt$1(t1, t3 - 1 - index);
+    }
+  },
+  Symbol0: {
+    "^": "Object;_name>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isSymbol0 && J.$eq(this._name, other._name);
+    },
+    get$hashCode: function(_) {
+      var t1 = J.get$hashCode$(this._name);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return 536870911 & 664597 * t1;
+    },
+    toString$0: function(_) {
+      return "Symbol(\"" + H.S(this._name) + "\")";
+    },
+    $isSymbol0: true,
+    $isSymbol: true,
+    static: {"^": "Symbol_reservedWordRE,Symbol_publicIdentifierRE,Symbol_identifierRE,Symbol_operatorRE,Symbol_publicSymbolPattern,Symbol_symbolPattern"}
+  }
+}],
+["dart._js_names", "dart:_js_names", , H, {
+  "^": "",
+  extractKeys: function(victim) {
+    var t1 = H.setRuntimeTypeInfo(function(victim, hasOwnProperty) {
+      var result = [];
+      for (var key in victim) {
+        if (hasOwnProperty.call(victim, key))
+          result.push(key);
+      }
+      return result;
+    }(victim, Object.prototype.hasOwnProperty), [null]);
+    t1.fixed$length = init;
+    return t1;
+  }
+}],
+["dart.async", "dart:async", , P, {
+  "^": "",
+  _AsyncRun__initializeScheduleImmediate: function() {
+    if ($.get$globalThis().scheduleImmediate != null)
+      return P._AsyncRun__scheduleImmediateJsOverride$closure();
+    return P._AsyncRun__scheduleImmediateWithTimer$closure();
+  },
+  _AsyncRun__scheduleImmediateJsOverride: [function(callback) {
+    ++init.globalState.topEventLoop._activeJsAsyncCount;
+    $.get$globalThis().scheduleImmediate(H.convertDartClosureToJS(new P._AsyncRun__scheduleImmediateJsOverride_internalCallback(callback), 0));
+  }, "call$1", "_AsyncRun__scheduleImmediateJsOverride$closure", 2, 0, 19],
+  _AsyncRun__scheduleImmediateWithTimer: [function(callback) {
+    P._createTimer(C.Duration_0, callback);
+  }, "call$1", "_AsyncRun__scheduleImmediateWithTimer$closure", 2, 0, 19],
+  _registerErrorHandler: function(errorHandler, zone) {
+    var t1 = H.getDynamicRuntimeType();
+    t1 = H.buildFunctionType(t1, [t1, t1])._isTest$1(errorHandler);
+    if (t1)
+      return zone.registerBinaryCallback$1(errorHandler);
+    else
+      return zone.registerUnaryCallback$1(errorHandler);
+  },
+  Future_Future: function(computation, $T) {
+    var result = P._Future$($T);
+    P.Timer_Timer(C.Duration_0, new P.Future_Future_closure(computation, result));
+    return result;
+  },
+  Future_wait: function(futures, eagerError) {
+    var t1, t2, t3, values, completer;
+    t1 = {};
+    t1.completer_0 = null;
+    t1.values_1 = null;
+    t1.remaining_2 = 0;
+    t1.error_3 = null;
+    t1.stackTrace_4 = null;
+    t2 = new P.Future_wait_handleError(t1, eagerError);
+    for (t3 = H.setRuntimeTypeInfo(new H.ListIterator(futures, futures.length, 0, null), [H.getTypeArgumentByIndex(futures, 0)]); t3.moveNext$0();)
+      t3._current.then$2$onError(new P.Future_wait_closure(t1, eagerError, t1.remaining_2++), t2);
+    t2 = t1.remaining_2;
+    if (t2 === 0)
+      return P._Future$immediate(C.List_empty, null);
+    values = Array(t2);
+    values.fixed$length = init;
+    t1.values_1 = values;
+    t2 = P.List;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t2)), [t2]);
+    t1.completer_0 = completer;
+    return completer.future;
+  },
+  _asyncRunCallbackLoop: function() {
+    var entry = $._nextCallback;
+    for (; entry != null;) {
+      J.callback$0$x(entry);
+      entry = entry.get$next();
+      $._nextCallback = entry;
+    }
+    $._lastCallback = null;
+  },
+  _asyncRunCallback: [function() {
+    var exception;
+    try {
+      P._asyncRunCallbackLoop();
+    } catch (exception) {
+      H.unwrapException(exception);
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+      $._nextCallback = $._nextCallback.get$next();
+      throw exception;
+    }
+
+  }, "call$0", "_asyncRunCallback$closure", 0, 0, 18],
+  _scheduleAsyncCallback: function(callback) {
+    var t1, t2;
+    t1 = $._lastCallback;
+    if (t1 == null) {
+      t1 = new P._AsyncCallbackEntry(callback, null);
+      $._lastCallback = t1;
+      $._nextCallback = t1;
+      $.get$_AsyncRun_scheduleImmediateClosure().call$1(P._asyncRunCallback$closure());
+    } else {
+      t2 = new P._AsyncCallbackEntry(callback, null);
+      t1.next = t2;
+      $._lastCallback = t2;
+    }
+  },
+  scheduleMicrotask: function(callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone)) {
+      $.Zone__current.scheduleMicrotask$1(callback);
+      return;
+    }
+    t1 = $.Zone__current;
+    t1.scheduleMicrotask$1(t1.bindCallback$2$runGuarded(callback, true));
+  },
+  StreamController_StreamController: function(onCancel, onListen, onPause, onResume, sync, $T) {
+    return sync ? H.setRuntimeTypeInfo(new P._SyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]) : H.setRuntimeTypeInfo(new P._AsyncStreamController(onListen, onPause, onResume, onCancel, null, 0, null), [$T]);
+  },
+  StreamController_StreamController$broadcast: function(onCancel, onListen, sync, $T) {
+    var t1;
+    if (sync) {
+      t1 = H.setRuntimeTypeInfo(new P._SyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    } else {
+      t1 = H.setRuntimeTypeInfo(new P._AsyncBroadcastStreamController(onListen, onCancel, 0, null, null, null, null), [$T]);
+      t1._async$_previous = t1;
+      t1._async$_next = t1;
+    }
+    return t1;
+  },
+  _runGuarded: function(notificationHandler) {
+    var result, e, s, exception, t1;
+    if (notificationHandler == null)
+      return;
+    try {
+      result = notificationHandler.call$0();
+      if (!!J.getInterceptor(result).$isFuture)
+        return result;
+      return;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      $.Zone__current.handleUncaughtError$2(e, s);
+    }
+
+  },
+  _nullDataHandler: [function(value) {
+  }, "call$1", "_nullDataHandler$closure", 2, 0, 20, 21],
+  _nullErrorHandler: [function(error, stackTrace) {
+    $.Zone__current.handleUncaughtError$2(error, stackTrace);
+  }, function(error) {
+    return P._nullErrorHandler(error, null);
+  }, null, "call$2", "call$1", "_nullErrorHandler$closure", 2, 2, 22, 23, 24, 25],
+  _nullDoneHandler: [function() {
+  }, "call$0", "_nullDoneHandler$closure", 0, 0, 18],
+  _runUserCode: function(userCode, onSuccess, onError) {
+    var e, s, exception, t1;
+    try {
+      onSuccess.call$1(userCode.call$0());
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      s = new H._StackTrace(exception, null);
+      onError.call$2(e, s);
+    }
+
+  },
+  _cancelAndError: function(subscription, future, error, stackTrace) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndError_closure(future, error, stackTrace));
+    else
+      future._completeError$2(error, stackTrace);
+  },
+  _cancelAndErrorClosure: function(subscription, future) {
+    return new P._cancelAndErrorClosure_closure(subscription, future);
+  },
+  _cancelAndValue: function(subscription, future, value) {
+    var cancelFuture = subscription.cancel$0();
+    if (!!J.getInterceptor(cancelFuture).$isFuture)
+      cancelFuture.whenComplete$1(new P._cancelAndValue_closure(future, value));
+    else
+      future._complete$1(value);
+  },
+  Timer_Timer: function(duration, callback) {
+    var t1;
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return $.Zone__current.createTimer$2(duration, callback);
+    t1 = $.Zone__current;
+    return t1.createTimer$2(duration, t1.bindCallback$2$runGuarded(callback, true));
+  },
+  _createTimer: function(duration, callback) {
+    var milliseconds = duration.get$inMilliseconds();
+    return H.TimerImpl$(milliseconds < 0 ? 0 : milliseconds, callback);
+  },
+  Zone__enter: function(zone) {
+    var previous = $.Zone__current;
+    $.Zone__current = zone;
+    return previous;
+  },
+  _rootHandleUncaughtError: [function($self, $parent, zone, error, stackTrace) {
+    $self.run$1(new P._rootHandleUncaughtError_closure(error, stackTrace));
+  }, "call$5", "_rootHandleUncaughtError$closure", 10, 0, 26, 27, 28, 29, 24, 25],
+  _rootRun: [function($self, $parent, zone, f) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$0();
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$0();
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$4", "_rootRun$closure", 8, 0, 30, 27, 28, 29, 31],
+  _rootRunUnary: [function($self, $parent, zone, f, arg) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$1(arg);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$1(arg);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$5", "_rootRunUnary$closure", 10, 0, 32, 27, 28, 29, 31, 33],
+  _rootRunBinary: [function($self, $parent, zone, f, arg1, arg2) {
+    var old, t1;
+    if (J.$eq($.Zone__current, zone))
+      return f.call$2(arg1, arg2);
+    old = P.Zone__enter(zone);
+    try {
+      t1 = f.call$2(arg1, arg2);
+      return t1;
+    } finally {
+      $.Zone__current = old;
+    }
+  }, "call$6", "_rootRunBinary$closure", 12, 0, 34, 27, 28, 29, 31, 9, 10],
+  _rootRegisterCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterCallback$closure", 8, 0, 35, 27, 28, 29, 31],
+  _rootRegisterUnaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterUnaryCallback$closure", 8, 0, 36, 27, 28, 29, 31],
+  _rootRegisterBinaryCallback: [function($self, $parent, zone, f) {
+    return f;
+  }, "call$4", "_rootRegisterBinaryCallback$closure", 8, 0, 37, 27, 28, 29, 31],
+  _rootScheduleMicrotask: [function($self, $parent, zone, f) {
+    P._scheduleAsyncCallback(C.C__RootZone !== zone ? zone.bindCallback$1(f) : f);
+  }, "call$4", "_rootScheduleMicrotask$closure", 8, 0, 38],
+  _rootCreateTimer: [function($self, $parent, zone, duration, callback) {
+    return P._createTimer(duration, C.C__RootZone !== zone ? zone.bindCallback$1(callback) : callback);
+  }, "call$5", "_rootCreateTimer$closure", 10, 0, 39, 27, 28, 29, 40, 41],
+  _rootPrint: [function($self, $parent, zone, line) {
+    H.printString(line);
+  }, "call$4", "_rootPrint$closure", 8, 0, 42],
+  _printToZone: [function(line) {
+    J.print$1$x($.Zone__current, line);
+  }, "call$1", "_printToZone$closure", 2, 0, 43],
+  _rootFork: [function($self, $parent, zone, specification, zoneValues) {
+    var copiedMap;
+    $.printToZone = P._printToZone$closure();
+    copiedMap = P.HashMap_HashMap(null, null, null, null, null);
+    return new P._CustomizedZone(zone, specification, copiedMap);
+  }, "call$5", "_rootFork$closure", 10, 0, 44],
+  _AsyncRun__scheduleImmediateJsOverride_internalCallback: {
+    "^": "Closure:69;callback_0",
+    call$0: [function() {
+      H.leaveJsAsync();
+      this.callback_0.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _AsyncError: {
+    "^": "Object;error>,stackTrace<",
+    $isError: true
+  },
+  _BroadcastStream: {
+    "^": "_ControllerStream;_async$_controller"
+  },
+  _BroadcastSubscription: {
+    "^": "_ControllerSubscription;_eventState@,_async$_next@,_async$_previous@,_async$_controller,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    get$_async$_controller: function() {
+      return this._async$_controller;
+    },
+    _expectsEvent$1: function(eventId) {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 1) === eventId;
+    },
+    _toggleEventId$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$xor();
+      this._eventState = t1 ^ 1;
+    },
+    get$_isFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 2) !== 0;
+    },
+    _setRemoveAfterFiring$0: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$or();
+      this._eventState = t1 | 4;
+    },
+    get$_removeAfterFiring: function() {
+      var t1 = this._eventState;
+      if (typeof t1 !== "number")
+        return t1.$and();
+      return (t1 & 4) !== 0;
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    static: {"^": "_BroadcastSubscription__STATE_EVENT_ID,_BroadcastSubscription__STATE_FIRING,_BroadcastSubscription__STATE_REMOVE_AFTER_FIRING"}
+  },
+  _BroadcastStreamController: {
+    "^": "Object;_async$_next@,_async$_previous@",
+    get$isPaused: function() {
+      return false;
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 != null)
+        return t1;
+      t1 = P._Future$(null);
+      this._doneFuture = t1;
+      return t1;
+    },
+    _removeListener$1: function(subscription) {
+      var previous, next;
+      previous = subscription.get$_async$_previous();
+      next = subscription.get$_async$_next();
+      previous.set$_async$_next(next);
+      next.set$_async$_previous(previous);
+      subscription.set$_async$_previous(subscription);
+      subscription.set$_async$_next(subscription);
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription;
+      if ((this._state & 4) !== 0) {
+        t1 = new P._DoneStreamSubscription($.Zone__current, 0, P._nullDoneHandler$closure());
+        t1.$builtinTypeInfo = this.$builtinTypeInfo;
+        t1._schedule$0();
+        return t1;
+      }
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = new P._BroadcastSubscription(null, null, null, this, null, null, null, t1, t2, null, null);
+      subscription.$builtinTypeInfo = this.$builtinTypeInfo;
+      subscription._async$_previous = subscription;
+      subscription._async$_next = subscription;
+      t2 = this._async$_previous;
+      subscription._async$_previous = t2;
+      subscription._async$_next = this;
+      t2.set$_async$_next(subscription);
+      this._async$_previous = subscription;
+      subscription._eventState = this._state & 1;
+      if (this._async$_next === subscription)
+        P._runGuarded(this._onListen);
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      if (subscription.get$_async$_next() === subscription)
+        return;
+      if (subscription.get$_isFiring())
+        subscription._setRemoveAfterFiring$0();
+      else {
+        this._removeListener$1(subscription);
+        if ((this._state & 2) === 0 && this._async$_next === this)
+          this._callOnCancel$0();
+      }
+    },
+    _recordPause$1: function(subscription) {
+    },
+    _recordResume$1: function(subscription) {
+    },
+    _addEventError$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add new events after calling close");
+      return new P.StateError("Cannot add new events while doing an addStream");
+    },
+    add$1: [function(_, data) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendData$1(data);
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T", void: true, args: [T]};
+      }, this.$receiver, "_BroadcastStreamController");
+    }, 104],
+    addError$2: [function(error, stackTrace) {
+      if (this._state >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._sendError$2(error, stackTrace);
+    }, function(error) {
+      return this.addError$2(error, null);
+    }, "addError$1", "call$2", "call$1", "get$addError", 2, 2, 105, 23, 24, 25],
+    close$0: function(_) {
+      var t1, doneFuture;
+      t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._doneFuture;
+      if (t1 >= 4)
+        throw H.wrapException(this._addEventError$0());
+      this._state = t1 | 4;
+      doneFuture = this._ensureDoneFuture$0();
+      this._sendDone$0();
+      return doneFuture;
+    },
+    _async$_add$1: function(_, data) {
+      this._sendData$1(data);
+    },
+    _addError$2: function(error, stackTrace) {
+      this._sendError$2(error, stackTrace);
+    },
+    _close$0: function() {
+      var addState = this._addStreamState;
+      this._addStreamState = null;
+      this._state &= 4294967287;
+      C.JSNull_methods.complete$0(addState);
+    },
+    _forEachListener$1: function(action) {
+      var t1, link, id, link0;
+      t1 = this._state;
+      if ((t1 & 2) !== 0)
+        throw H.wrapException(P.StateError$("Cannot fire new event. Controller is already firing an event"));
+      link = this._async$_next;
+      if (link === this)
+        return;
+      id = t1 & 1;
+      this._state = t1 ^ 3;
+      for (; link !== this;)
+        if (link._expectsEvent$1(id)) {
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$or();
+          link.set$_eventState(t1 | 2);
+          action.call$1(link);
+          link._toggleEventId$0();
+          link0 = link.get$_async$_next();
+          if (link.get$_removeAfterFiring())
+            this._removeListener$1(link);
+          t1 = link.get$_eventState();
+          if (typeof t1 !== "number")
+            return t1.$and();
+          link.set$_eventState(t1 & 4294967293);
+          link = link0;
+        } else
+          link = link.get$_async$_next();
+      this._state &= 4294967293;
+      if (this._async$_next === this)
+        this._callOnCancel$0();
+    },
+    _callOnCancel$0: function() {
+      if ((this._state & 4) !== 0 && this._doneFuture._state === 0)
+        this._doneFuture._asyncComplete$1(null);
+      P._runGuarded(this._onCancel);
+    }
+  },
+  _SyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var t1 = this._async$_next;
+      if (t1 === this)
+        return;
+      if (t1.get$_async$_next() === this) {
+        this._state |= 2;
+        this._async$_next._async$_add$1(0, data);
+        this._state &= 4294967293;
+        if (this._async$_next === this)
+          this._callOnCancel$0();
+        return;
+      }
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendData_closure(this, data));
+    },
+    _sendError$2: function(error, stackTrace) {
+      if (this._async$_next === this)
+        return;
+      this._forEachListener$1(new P._SyncBroadcastStreamController__sendError_closure(this, error, stackTrace));
+    },
+    _sendDone$0: function() {
+      if (this._async$_next !== this)
+        this._forEachListener$1(new P._SyncBroadcastStreamController__sendDone_closure(this));
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  _SyncBroadcastStreamController__sendData_closure: {
+    "^": "Closure;this_0,data_1",
+    call$1: function(subscription) {
+      subscription._async$_add$1(0, this.data_1);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendError_closure: {
+    "^": "Closure;this_0,error_1,stackTrace_2",
+    call$1: function(subscription) {
+      subscription._addError$2(this.error_1, this.stackTrace_2);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BufferingStreamSubscription", args: [[P._BufferingStreamSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _SyncBroadcastStreamController__sendDone_closure: {
+    "^": "Closure;this_0",
+    call$1: function(subscription) {
+      subscription._close$0();
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic___BroadcastSubscription", args: [[P._BroadcastSubscription, T]]};
+      }, this.this_0, "_SyncBroadcastStreamController");
+    }
+  },
+  _AsyncBroadcastStreamController: {
+    "^": "_BroadcastStreamController;_onListen,_onCancel,_state,_async$_next,_async$_previous,_addStreamState,_doneFuture",
+    _sendData$1: function(data) {
+      var link, t1;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next()) {
+        t1 = new P._DelayedData(data, null);
+        t1.$builtinTypeInfo = [null];
+        link._addPending$1(t1);
+      }
+    },
+    _sendError$2: function(error, stackTrace) {
+      var link;
+      for (link = this._async$_next; link !== this; link = link.get$_async$_next())
+        link._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      var link = this._async$_next;
+      if (link !== this)
+        for (; link !== this; link = link.get$_async$_next())
+          link._addPending$1(C.C__DelayedDone);
+      else
+        this._doneFuture._asyncComplete$1(null);
+    }
+  },
+  Future: {
+    "^": "Object;",
+    $isFuture: true
+  },
+  Future_Future_closure: {
+    "^": "Closure:69;computation_0,result_1",
+    call$0: [function() {
+      var e, s, exception, t1;
+      try {
+        this.result_1._complete$1(this.computation_0.call$0());
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.result_1._completeError$2(e, s);
+      }
+
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Future_wait_handleError: {
+    "^": "Closure:75;box_0,eagerError_1",
+    call$2: [function(theError, theStackTrace) {
+      var t1, t2, t3;
+      t1 = this.box_0;
+      t2 = t1.values_1;
+      t1.values_1 = null;
+      t3 = --t1.remaining_2;
+      if (t2 != null)
+        if (t3 === 0 || this.eagerError_1)
+          t1.completer_0.completeError$2(theError, theStackTrace);
+        else {
+          t1.error_3 = theError;
+          t1.stackTrace_4 = theStackTrace;
+        }
+      else if (t3 === 0 && !this.eagerError_1)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$2", null, 4, 0, null, 106, 107, "call"],
+    $isFunction: true
+  },
+  Future_wait_closure: {
+    "^": "Closure:108;box_0,eagerError_2,pos_3",
+    call$1: [function(value) {
+      var t1, t2, t3, t4;
+      t1 = this.box_0;
+      t2 = --t1.remaining_2;
+      t3 = t1.values_1;
+      if (t3 != null) {
+        t4 = this.pos_3;
+        if (t4 < 0 || t4 >= t3.length)
+          return H.ioore(t3, t4);
+        t3[t4] = value;
+        if (t2 === 0) {
+          t1 = t1.completer_0.future;
+          if (t1._state !== 0)
+            H.throwExpression(P.StateError$("Future already completed"));
+          t1._asyncComplete$1(t3);
+        }
+      } else if (t2 === 0 && !this.eagerError_2)
+        t1.completer_0.completeError$2(t1.error_3, t1.stackTrace_4);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _Completer: {
+    "^": "Object;",
+    $isCompleter: true
+  },
+  _AsyncCompleter: {
+    "^": "_Completer;future",
+    complete$1: [function(_, value) {
+      var t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(value);
+    }, function($receiver) {
+      return this.complete$1($receiver, null);
+    }, "complete$0", "call$1", "call$0", "get$complete", 0, 2, 109, 23, 21],
+    completeError$2: [function(error, stackTrace) {
+      var t1;
+      if (error == null)
+        throw H.wrapException(P.ArgumentError$("Error must not be null"));
+      t1 = this.future;
+      if (t1._state !== 0)
+        throw H.wrapException(P.StateError$("Future already completed"));
+      t1._asyncCompleteError$2(error, stackTrace);
+    }, function(error) {
+      return this.completeError$2(error, null);
+    }, "completeError$1", "call$2", "call$1", "get$completeError", 2, 2, 105, 23, 24, 25]
+  },
+  _Future: {
+    "^": "Object;_state,_zone<,_resultOrListeners,_nextListener@,_onValueCallback,_errorTestCallback,_onErrorCallback,_whenCompleteActionCallback",
+    get$_isComplete: function() {
+      return this._state >= 4;
+    },
+    get$_hasValue: function() {
+      return this._state === 4;
+    },
+    get$_hasError: function() {
+      return this._state === 8;
+    },
+    set$_isChained: function(value) {
+      if (value)
+        this._state = 2;
+      else
+        this._state = 0;
+    },
+    get$_onValue: function() {
+      return this._state === 2 ? null : this._onValueCallback;
+    },
+    get$_errorTest: function() {
+      return this._state === 2 ? null : this._errorTestCallback;
+    },
+    get$_onError: function() {
+      return this._state === 2 ? null : this._onErrorCallback;
+    },
+    get$_whenCompleteAction: function() {
+      return this._state === 2 ? null : this._whenCompleteActionCallback;
+    },
+    then$2$onError: function(f, onError) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, t1.registerUnaryCallback$1(f), null, P._registerErrorHandler(onError, $.Zone__current), null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    then$1: function(f) {
+      return this.then$2$onError(f, null);
+    },
+    catchError$2$test: function(onError, test) {
+      var t1, t2, result;
+      t1 = $.Zone__current;
+      t2 = P._registerErrorHandler(onError, t1);
+      result = H.setRuntimeTypeInfo(new P._Future(0, t1, null, null, null, $.Zone__current.registerUnaryCallback$1(test), t2, null), [null]);
+      this._addListener$1(result);
+      return result;
+    },
+    catchError$1: function(onError) {
+      return this.catchError$2$test(onError, null);
+    },
+    whenComplete$1: function(action) {
+      var t1, result;
+      t1 = $.Zone__current;
+      result = new P._Future(0, t1, null, null, null, null, null, t1.registerCallback$1(action));
+      result.$builtinTypeInfo = this.$builtinTypeInfo;
+      this._addListener$1(result);
+      return result;
+    },
+    get$_async$_value: function() {
+      return this._resultOrListeners;
+    },
+    get$_error: function() {
+      return this._resultOrListeners;
+    },
+    _setValue$1: function(value) {
+      this._state = 4;
+      this._resultOrListeners = value;
+    },
+    _setError$2: function(error, stackTrace) {
+      this._state = 8;
+      this._resultOrListeners = new P._AsyncError(error, stackTrace);
+    },
+    _addListener$1: function(listener) {
+      if (this._state >= 4)
+        this._zone.scheduleMicrotask$1(new P._Future__addListener_closure(this, listener));
+      else {
+        listener.set$_nextListener(this._resultOrListeners);
+        this._resultOrListeners = listener;
+      }
+    },
+    _removeListeners$0: function() {
+      var current, prev, next;
+      current = this._resultOrListeners;
+      this._resultOrListeners = null;
+      for (prev = null; current != null; prev = current, current = next) {
+        next = current.get$_nextListener();
+        current.set$_nextListener(prev);
+      }
+      return prev;
+    },
+    _complete$1: function(value) {
+      var t1, listeners;
+      t1 = J.getInterceptor(value);
+      if (!!t1.$isFuture)
+        if (!!t1.$is_Future)
+          P._Future__chainCoreFuture(value, this);
+        else
+          P._Future__chainForeignFuture(value, this);
+      else {
+        listeners = this._removeListeners$0();
+        this._setValue$1(value);
+        P._Future__propagateToListeners(this, listeners);
+      }
+    },
+    _completeWithValue$1: function(value) {
+      var listeners = this._removeListeners$0();
+      this._setValue$1(value);
+      P._Future__propagateToListeners(this, listeners);
+    },
+    _completeError$2: [function(error, stackTrace) {
+      var listeners = this._removeListeners$0();
+      this._setError$2(error, stackTrace);
+      P._Future__propagateToListeners(this, listeners);
+    }, function(error) {
+      return this._completeError$2(error, null);
+    }, "_completeError$1", "call$2", "call$1", "get$_completeError", 2, 2, 22, 23, 24, 25],
+    _asyncComplete$1: function(value) {
+      var t1;
+      if (value == null)
+        ;
+      else {
+        t1 = J.getInterceptor(value);
+        if (!!t1.$isFuture) {
+          if (!!t1.$is_Future) {
+            t1 = value._state;
+            if (t1 >= 4 && t1 === 8) {
+              if (this._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              this._state = 1;
+              this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure(this, value));
+            } else
+              P._Future__chainCoreFuture(value, this);
+          } else
+            P._Future__chainForeignFuture(value, this);
+          return;
+        }
+      }
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncComplete_closure0(this, value));
+    },
+    _asyncCompleteError$2: function(error, stackTrace) {
+      if (this._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      this._state = 1;
+      this._zone.scheduleMicrotask$1(new P._Future__asyncCompleteError_closure(this, error, stackTrace));
+    },
+    _async$_Future$immediate$1: function(value, $T) {
+      this._asyncComplete$1(value);
+    },
+    _async$_Future$immediateError$2: function(error, stackTrace, $T) {
+      this._asyncCompleteError$2(error, stackTrace);
+    },
+    $is_Future: true,
+    $isFuture: true,
+    static: {"^": "_Future__INCOMPLETE,_Future__PENDING_COMPLETE,_Future__CHAINED,_Future__VALUE,_Future__ERROR", _Future$: function($T) {
+        return H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+      }, _Future$immediate: function(value, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediate$1(value, $T);
+        return t1;
+      }, _Future$immediateError: function(error, stackTrace, $T) {
+        var t1 = H.setRuntimeTypeInfo(new P._Future(0, $.Zone__current, null, null, null, null, null, null), [$T]);
+        t1._async$_Future$immediateError$2(error, stackTrace, $T);
+        return t1;
+      }, _Future__chainForeignFuture: function(source, target) {
+        target.set$_isChained(true);
+        source.then$2$onError(new P._Future__chainForeignFuture_closure(target), new P._Future__chainForeignFuture_closure0(target));
+      }, _Future__chainCoreFuture: function(source, target) {
+        target.set$_isChained(true);
+        if (source._state >= 4)
+          P._Future__propagateToListeners(source, target);
+        else
+          source._addListener$1(target);
+      }, _Future__propagateMultipleListeners: function(source, listeners) {
+        var listeners0;
+        do {
+          listeners0 = listeners.get$_nextListener();
+          listeners.set$_nextListener(null);
+          P._Future__propagateToListeners(source, listeners);
+          if (listeners0 != null) {
+            listeners = listeners0;
+            continue;
+          } else
+            break;
+        } while (true);
+      }, _Future__propagateToListeners: function(source, listeners) {
+        var t1, t2, t3, hasError, asyncError, sourceValue, zone, oldZone, chainSource, listeners0;
+        t1 = {};
+        t1.source_4 = source;
+        for (t2 = source; true;) {
+          t3 = {};
+          if (!t2.get$_isComplete())
+            return;
+          hasError = t1.source_4.get$_hasError();
+          if (hasError && listeners == null) {
+            asyncError = t1.source_4.get$_error();
+            t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+            return;
+          }
+          if (listeners == null)
+            return;
+          if (listeners.get$_nextListener() != null) {
+            P._Future__propagateMultipleListeners(t1.source_4, listeners);
+            return;
+          }
+          t3.listenerHasValue_1 = true;
+          sourceValue = t1.source_4.get$_hasValue() ? t1.source_4.get$_async$_value() : null;
+          t3.listenerValueOrError_2 = sourceValue;
+          t3.isPropagationAborted_3 = false;
+          t2 = !hasError;
+          if (!t2 || listeners.get$_onValue() != null || listeners.get$_whenCompleteAction() != null) {
+            zone = listeners.get$_zone();
+            if (hasError && !t1.source_4.get$_zone().inSameErrorZone$1(zone)) {
+              asyncError = t1.source_4.get$_error();
+              t1.source_4.get$_zone().handleUncaughtError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+              return;
+            }
+            oldZone = $.Zone__current;
+            if (oldZone == null ? zone != null : oldZone !== zone)
+              $.Zone__current = zone;
+            else
+              oldZone = null;
+            if (t2) {
+              if (listeners.get$_onValue() != null)
+                t3.listenerHasValue_1 = new P._Future__propagateToListeners_handleValueCallback(t3, listeners, sourceValue, zone).call$0();
+            } else
+              new P._Future__propagateToListeners_handleError(t1, t3, listeners, zone).call$0();
+            if (listeners.get$_whenCompleteAction() != null)
+              new P._Future__propagateToListeners_handleWhenCompleteCallback(t1, t3, hasError, listeners, zone).call$0();
+            if (oldZone != null)
+              $.Zone__current = oldZone;
+            if (t3.isPropagationAborted_3)
+              return;
+            if (t3.listenerHasValue_1 === true) {
+              t2 = t3.listenerValueOrError_2;
+              t2 = (sourceValue == null ? t2 != null : sourceValue !== t2) && !!J.getInterceptor(t2).$isFuture;
+            } else
+              t2 = false;
+            if (t2) {
+              chainSource = t3.listenerValueOrError_2;
+              if (!!J.getInterceptor(chainSource).$is_Future)
+                if (chainSource._state >= 4) {
+                  listeners.set$_isChained(true);
+                  t1.source_4 = chainSource;
+                  t2 = chainSource;
+                  continue;
+                } else
+                  P._Future__chainCoreFuture(chainSource, listeners);
+              else
+                P._Future__chainForeignFuture(chainSource, listeners);
+              return;
+            }
+          }
+          if (t3.listenerHasValue_1 === true) {
+            listeners0 = listeners._removeListeners$0();
+            listeners._setValue$1(t3.listenerValueOrError_2);
+          } else {
+            listeners0 = listeners._removeListeners$0();
+            asyncError = t3.listenerValueOrError_2;
+            listeners._setError$2(J.get$error$x(asyncError), asyncError.get$stackTrace());
+          }
+          t1.source_4 = listeners;
+          t2 = listeners;
+          listeners = listeners0;
+        }
+      }}
+  },
+  _Future__addListener_closure: {
+    "^": "Closure:69;this_0,listener_1",
+    call$0: [function() {
+      P._Future__propagateToListeners(this.this_0, this.listener_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure: {
+    "^": "Closure:13;target_0",
+    call$1: [function(value) {
+      this.target_0._completeWithValue$1(value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true
+  },
+  _Future__chainForeignFuture_closure0: {
+    "^": "Closure:110;target_1",
+    call$2: [function(error, stackTrace) {
+      this.target_1._completeError$2(error, stackTrace);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure: {
+    "^": "Closure:69;this_0,coreFuture_1",
+    call$0: [function() {
+      P._Future__chainCoreFuture(this.coreFuture_1, this.this_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncComplete_closure0: {
+    "^": "Closure:69;this_2,value_3",
+    call$0: [function() {
+      this.this_2._completeWithValue$1(this.value_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__asyncCompleteError_closure: {
+    "^": "Closure:69;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      this.this_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleValueCallback: {
+    "^": "Closure:111;box_1,listener_3,sourceValue_4,zone_5",
+    call$0: function() {
+      var e, s, exception, t1;
+      try {
+        this.box_1.listenerValueOrError_2 = this.zone_5.runUnary$2(this.listener_3.get$_onValue(), this.sourceValue_4);
+        return true;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        this.box_1.listenerValueOrError_2 = new P._AsyncError(e, s);
+        return false;
+      }
+
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleError: {
+    "^": "Closure:18;box_2,box_1,listener_6,zone_7",
+    call$0: function() {
+      var asyncError, test, matchesTest, e, s, errorCallback, e0, s0, t1, exception, t2, listenerValueOrError, t3, t4;
+      asyncError = this.box_2.source_4.get$_error();
+      t1 = this.listener_6;
+      test = t1.get$_errorTest();
+      matchesTest = true;
+      if (test != null)
+        try {
+          matchesTest = this.zone_7.runUnary$2(test, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e, s);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+      errorCallback = t1.get$_onError();
+      if (matchesTest === true && errorCallback != null) {
+        try {
+          t1 = errorCallback;
+          t2 = H.getDynamicRuntimeType();
+          t2 = H.buildFunctionType(t2, [t2, t2])._isTest$1(t1);
+          t3 = this.zone_7;
+          t4 = this.box_1;
+          if (t2)
+            t4.listenerValueOrError_2 = t3.runBinary$3(errorCallback, J.get$error$x(asyncError), asyncError.get$stackTrace());
+          else
+            t4.listenerValueOrError_2 = t3.runUnary$2(errorCallback, J.get$error$x(asyncError));
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          s0 = new H._StackTrace(exception, null);
+          t1 = J.get$error$x(asyncError);
+          t2 = e0;
+          listenerValueOrError = (t1 == null ? t2 == null : t1 === t2) ? asyncError : new P._AsyncError(e0, s0);
+          t1 = this.box_1;
+          t1.listenerValueOrError_2 = listenerValueOrError;
+          t1.listenerHasValue_1 = false;
+          return;
+        }
+
+        this.box_1.listenerHasValue_1 = true;
+      } else {
+        t1 = this.box_1;
+        t1.listenerValueOrError_2 = asyncError;
+        t1.listenerHasValue_1 = false;
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback: {
+    "^": "Closure:18;box_2,box_1,hasError_8,listener_9,zone_10",
+    call$0: function() {
+      var t1, e, s, exception, t2, t3;
+      t1 = {};
+      t1.completeResult_0 = null;
+      try {
+        t1.completeResult_0 = this.zone_10.run$1(this.listener_9.get$_whenCompleteAction());
+      } catch (exception) {
+        t2 = H.unwrapException(exception);
+        e = t2;
+        s = new H._StackTrace(exception, null);
+        if (this.hasError_8) {
+          t2 = J.get$error$x(this.box_2.source_4.get$_error());
+          t3 = e;
+          t3 = t2 == null ? t3 == null : t2 === t3;
+          t2 = t3;
+        } else
+          t2 = false;
+        t3 = this.box_1;
+        if (t2)
+          t3.listenerValueOrError_2 = this.box_2.source_4.get$_error();
+        else
+          t3.listenerValueOrError_2 = new P._AsyncError(e, s);
+        t3.listenerHasValue_1 = false;
+      }
+
+      if (!!J.getInterceptor(t1.completeResult_0).$isFuture) {
+        t2 = this.listener_9;
+        t2.set$_isChained(true);
+        this.box_1.isPropagationAborted_3 = true;
+        t1.completeResult_0.then$2$onError(new P._Future__propagateToListeners_handleWhenCompleteCallback_closure(this.box_2, t2), new P._Future__propagateToListeners_handleWhenCompleteCallback_closure0(t1, t2));
+      }
+    },
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure: {
+    "^": "Closure:13;box_2,listener_11",
+    call$1: [function(ignored) {
+      P._Future__propagateToListeners(this.box_2.source_4, this.listener_11);
+    }, "call$1", null, 2, 0, null, 112, "call"],
+    $isFunction: true
+  },
+  _Future__propagateToListeners_handleWhenCompleteCallback_closure0: {
+    "^": "Closure:110;box_0,listener_12",
+    call$2: [function(error, stackTrace) {
+      var t1, completeResult;
+      t1 = this.box_0;
+      if (!J.getInterceptor(t1.completeResult_0).$is_Future) {
+        completeResult = P._Future$(null);
+        t1.completeResult_0 = completeResult;
+        completeResult._setError$2(error, stackTrace);
+      }
+      P._Future__propagateToListeners(t1.completeResult_0, this.listener_12);
+    }, function(error) {
+      return this.call$2(error, null);
+    }, "call$1", "call$2", null, null, 2, 2, null, 23, 24, 25, "call"],
+    $isFunction: true
+  },
+  _AsyncCallbackEntry: {
+    "^": "Object;callback>,next@",
+    callback$0: function($receiver) {
+      return this.callback.call$0();
+    }
+  },
+  Stream: {
+    "^": "Object;",
+    map$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._MapStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__dynamic__T", ret: P.Stream, args: [{func: "dynamic__T", args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    expand$1: [function(_, convert) {
+      return H.setRuntimeTypeInfo(new P._ExpandStream(convert, this), [H.getRuntimeTypeArgument(this, "Stream", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "Stream__Iterable__T", ret: P.Stream, args: [{func: "Iterable__T", ret: P.Iterable, args: [T]}]};
+      }, this.$receiver, "Stream");
+    }, 113],
+    contains$1: function(_, needle) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_contains_closure(t1, this, needle, future), true, new P.Stream_contains_closure0(future), future.get$_completeError());
+      return future;
+    },
+    forEach$1: function(_, action) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(null);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_forEach_closure(t1, this, action, future), true, new P.Stream_forEach_closure0(future), future.get$_completeError());
+      return future;
+    },
+    any$1: function(_, test) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_any_closure(t1, this, test, future), true, new P.Stream_any_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$length: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.$int);
+      t1.count_0 = 0;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_length_closure(t1), true, new P.Stream_length_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    get$isEmpty: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(P.bool);
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_isEmpty_closure(t1, future), true, new P.Stream_isEmpty_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$first: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.subscription_0 = null;
+      t1.subscription_0 = this.listen$4$cancelOnError$onDone$onError(new P.Stream_first_closure(t1, this, future), true, new P.Stream_first_closure0(future), future.get$_completeError());
+      return future;
+    },
+    get$last: function(_) {
+      var t1, future;
+      t1 = {};
+      future = P._Future$(H.getRuntimeTypeArgument(this, "Stream", 0));
+      t1.result_0 = null;
+      t1.foundResult_1 = false;
+      this.listen$4$cancelOnError$onDone$onError(new P.Stream_last_closure(t1, this), true, new P.Stream_last_closure0(t1, future), future.get$_completeError());
+      return future;
+    },
+    $isStream: true
+  },
+  Stream_contains_closure: {
+    "^": "Closure;box_0,this_1,needle_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_contains__closure(this.needle_2, element), new P.Stream_contains__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_contains__closure: {
+    "^": "Closure:69;needle_4,element_5",
+    call$0: function() {
+      return J.$eq(this.element_5, this.needle_4);
+    },
+    $isFunction: true
+  },
+  Stream_contains__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_contains_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_forEach_closure: {
+    "^": "Closure;box_0,this_1,action_2,future_3",
+    call$1: [function(element) {
+      P._runUserCode(new P.Stream_forEach__closure(this.action_2, element), new P.Stream_forEach__closure0(), P._cancelAndErrorClosure(this.box_0.subscription_0, this.future_3));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_forEach__closure: {
+    "^": "Closure:69;action_4,element_5",
+    call$0: function() {
+      return this.action_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_forEach__closure0: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+    },
+    $isFunction: true
+  },
+  Stream_forEach_closure0: {
+    "^": "Closure:69;future_6",
+    call$0: [function() {
+      this.future_6._complete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_any_closure: {
+    "^": "Closure;box_0,this_1,test_2,future_3",
+    call$1: [function(element) {
+      var t1, t2;
+      t1 = this.box_0;
+      t2 = this.future_3;
+      P._runUserCode(new P.Stream_any__closure(this.test_2, element), new P.Stream_any__closure0(t1, t2), P._cancelAndErrorClosure(t1.subscription_0, t2));
+    }, "call$1", null, 2, 0, null, 114, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_any__closure: {
+    "^": "Closure:69;test_4,element_5",
+    call$0: function() {
+      return this.test_4.call$1(this.element_5);
+    },
+    $isFunction: true
+  },
+  Stream_any__closure0: {
+    "^": "Closure:115;box_0,future_6",
+    call$1: function(isMatch) {
+      if (isMatch === true)
+        P._cancelAndValue(this.box_0.subscription_0, this.future_6, true);
+    },
+    $isFunction: true
+  },
+  Stream_any_closure0: {
+    "^": "Closure:69;future_7",
+    call$0: [function() {
+      this.future_7._complete$1(false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure: {
+    "^": "Closure:13;box_0",
+    call$1: [function(_) {
+      ++this.box_0.count_0;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_length_closure0: {
+    "^": "Closure:69;box_0,future_1",
+    call$0: [function() {
+      this.future_1._complete$1(this.box_0.count_0);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure: {
+    "^": "Closure:13;box_0,future_1",
+    call$1: [function(_) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_1, false);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Stream_isEmpty_closure0: {
+    "^": "Closure:69;future_2",
+    call$0: [function() {
+      this.future_2._complete$1(true);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_first_closure: {
+    "^": "Closure;box_0,this_1,future_2",
+    call$1: [function(value) {
+      P._cancelAndValue(this.box_0.subscription_0, this.future_2, value);
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_first_closure0: {
+    "^": "Closure:69;future_3",
+    call$0: [function() {
+      this.future_3._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  Stream_last_closure: {
+    "^": "Closure;box_0,this_1",
+    call$1: [function(value) {
+      var t1 = this.box_0;
+      t1.foundResult_1 = true;
+      t1.result_0 = value;
+    }, "call$1", null, 2, 0, null, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T", args: [T]};
+      }, this.this_1, "Stream");
+    }
+  },
+  Stream_last_closure0: {
+    "^": "Closure:69;box_0,future_2",
+    call$0: [function() {
+      var t1 = this.box_0;
+      if (t1.foundResult_1) {
+        this.future_2._complete$1(t1.result_0);
+        return;
+      }
+      this.future_2._completeError$1(new P.StateError("No elements"));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  StreamSubscription: {
+    "^": "Object;",
+    $isStreamSubscription: true
+  },
+  _StreamController: {
+    "^": "Object;",
+    get$isPaused: function() {
+      var t1 = this._state;
+      return (t1 & 1) !== 0 ? this.get$_subscription().get$_isInputPaused() : (t1 & 2) === 0;
+    },
+    get$_pendingEvents: function() {
+      if ((this._state & 8) === 0)
+        return this._varData;
+      return this._varData.get$varData();
+    },
+    _ensurePendingEvents$0: function() {
+      var t1, state;
+      if ((this._state & 8) === 0) {
+        t1 = this._varData;
+        if (t1 == null) {
+          t1 = new P._StreamImplEvents(null, null, 0);
+          this._varData = t1;
+        }
+        return t1;
+      }
+      state = this._varData;
+      state.get$varData();
+      return state.get$varData();
+    },
+    get$_subscription: function() {
+      if ((this._state & 8) !== 0)
+        return this._varData.get$varData();
+      return this._varData;
+    },
+    _badEventState$0: function() {
+      if ((this._state & 4) !== 0)
+        return new P.StateError("Cannot add event after closing");
+      return new P.StateError("Cannot add event while adding a stream");
+    },
+    _ensureDoneFuture$0: function() {
+      var t1 = this._doneFuture;
+      if (t1 == null) {
+        t1 = (this._state & 2) !== 0 ? $.get$Future__nullFuture() : P._Future$(null);
+        this._doneFuture = t1;
+      }
+      return t1;
+    },
+    add$1: [function(_, value) {
+      var t1 = this._state;
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    }, "call$1", "get$add", 2, 0, function() {
+      return H.computeSignature(function(T) {
+        return {func: "void__T0", void: true, args: [T]};
+      }, this.$receiver, "_StreamController");
+    }],
+    close$0: function(_) {
+      var t1 = this._state;
+      if ((t1 & 4) !== 0)
+        return this._ensureDoneFuture$0();
+      if (t1 >= 4)
+        throw H.wrapException(this._badEventState$0());
+      t1 |= 4;
+      this._state = t1;
+      if ((t1 & 1) !== 0)
+        this._sendDone$0();
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, C.C__DelayedDone);
+      return this._ensureDoneFuture$0();
+    },
+    _async$_add$1: function(_, value) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendData$1(value);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, H.setRuntimeTypeInfo(new P._DelayedData(value, null), [H.getRuntimeTypeArgument(this, "_StreamController", 0)]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 1) !== 0)
+        this._sendError$2(error, stackTrace);
+      else if ((t1 & 3) === 0)
+        this._ensurePendingEvents$0().add$1(0, new P._DelayedError(error, stackTrace, null));
+    },
+    _subscribe$1: function(cancelOnError) {
+      var t1, t2, subscription, pendingEvents, addState;
+      if ((this._state & 3) !== 0)
+        throw H.wrapException(P.StateError$("Stream has already been listened to."));
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      subscription = H.setRuntimeTypeInfo(new P._ControllerSubscription(this, null, null, null, t1, t2, null, null), [null]);
+      pendingEvents = this.get$_pendingEvents();
+      t2 = this._state |= 1;
+      if ((t2 & 8) !== 0) {
+        addState = this._varData;
+        addState.set$varData(subscription);
+        addState.resume$0(0);
+      } else
+        this._varData = subscription;
+      subscription._setPendingEvents$1(pendingEvents);
+      subscription._guardCallback$1(new P._StreamController__subscribe_closure(this));
+      return subscription;
+    },
+    _recordCancel$1: function(subscription) {
+      var result, e, s, exception, t1, result0;
+      result = null;
+      if ((this._state & 8) !== 0)
+        result = this._varData.cancel$0();
+      this._varData = null;
+      this._state = this._state & 4294967286 | 2;
+      if (this.get$_onCancel() != null)
+        if (result == null)
+          try {
+            result = this._onCancel$0();
+          } catch (exception) {
+            t1 = H.unwrapException(exception);
+            e = t1;
+            s = new H._StackTrace(exception, null);
+            result0 = P._Future$(null);
+            result0._asyncCompleteError$2(e, s);
+            result = result0;
+          }
+
+        else
+          result = result.whenComplete$1(this.get$_onCancel());
+      t1 = new P._StreamController__recordCancel_complete(this);
+      if (result != null)
+        result = result.whenComplete$1(t1);
+      else
+        t1.call$0();
+      return result;
+    },
+    _recordPause$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.pause$0(0);
+      P._runGuarded(this.get$_onPause());
+    },
+    _recordResume$1: function(subscription) {
+      if ((this._state & 8) !== 0)
+        this._varData.resume$0(0);
+      P._runGuarded(this.get$_onResume());
+    }
+  },
+  _StreamController__subscribe_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      P._runGuarded(this.this_0.get$_onListen());
+    },
+    $isFunction: true
+  },
+  _StreamController__recordCancel_complete: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1 = this.this_0._doneFuture;
+      if (t1 != null && t1._state === 0)
+        t1._asyncComplete$1(null);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _SyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._async$_add$1(0, data);
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addError$2(error, stackTrace);
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._close$0();
+    }
+  },
+  _AsyncStreamControllerDispatch: {
+    "^": "Object;",
+    _sendData$1: function(data) {
+      this.get$_subscription()._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _sendError$2: function(error, stackTrace) {
+      this.get$_subscription()._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _sendDone$0: function() {
+      this.get$_subscription()._addPending$1(C.C__DelayedDone);
+    }
+  },
+  _AsyncStreamController: {
+    "^": "_StreamController__AsyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__AsyncStreamControllerDispatch: {
+    "^": "_StreamController+_AsyncStreamControllerDispatch;"
+  },
+  _SyncStreamController: {
+    "^": "_StreamController__SyncStreamControllerDispatch;_onListen<,_onPause<,_onResume<,_onCancel<,_varData,_state,_doneFuture",
+    _onCancel$0: function() {
+      return this._onCancel.call$0();
+    }
+  },
+  _StreamController__SyncStreamControllerDispatch: {
+    "^": "_StreamController+_SyncStreamControllerDispatch;"
+  },
+  _ControllerStream: {
+    "^": "_StreamImpl;_async$_controller",
+    _createSubscription$1: function(cancelOnError) {
+      return this._async$_controller._subscribe$1(cancelOnError);
+    },
+    get$hashCode: function(_) {
+      return (H.Primitives_objectHashCode(this._async$_controller) ^ 892482866) >>> 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$is_ControllerStream)
+        return false;
+      return other._async$_controller === this._async$_controller;
+    },
+    $is_ControllerStream: true
+  },
+  _ControllerSubscription: {
+    "^": "_BufferingStreamSubscription;_async$_controller<,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _onCancel$0: function() {
+      return this.get$_async$_controller()._recordCancel$1(this);
+    },
+    _onPause$0: [function() {
+      this.get$_async$_controller()._recordPause$1(this);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      this.get$_async$_controller()._recordResume$1(this);
+    }, "call$0", "get$_onResume", 0, 0, 18]
+  },
+  _EventSink: {
+    "^": "Object;"
+  },
+  _BufferingStreamSubscription: {
+    "^": "Object;_onData,_onError<,_onDone,_zone<,_state,_cancelFuture,_pending",
+    _setPendingEvents$1: function(pendingEvents) {
+      if (pendingEvents == null)
+        return;
+      this._pending = pendingEvents;
+      if (!pendingEvents.get$isEmpty(pendingEvents)) {
+        this._state = (this._state | 64) >>> 0;
+        this._pending.schedule$1(this);
+      }
+    },
+    onData$1: function(handleData) {
+      this._onData = this._zone.registerUnaryCallback$1(handleData);
+    },
+    onError$1: function(_, handleError) {
+      if (handleError == null)
+        handleError = P._nullErrorHandler$closure();
+      this._onError = P._registerErrorHandler(handleError, this._zone);
+    },
+    onDone$1: function(handleDone) {
+      if (handleDone == null)
+        handleDone = P._nullDoneHandler$closure();
+      this._onDone = this._zone.registerCallback$1(handleDone);
+    },
+    pause$1: [function(_, resumeSignal) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      this._state = (t1 + 128 | 4) >>> 0;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+      if (t1 < 128 && this._pending != null)
+        this._pending.cancelSchedule$0();
+      if ((t1 & 4) === 0 && (this._state & 32) === 0)
+        this._guardCallback$1(this.get$_onPause());
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 >= 128) {
+        t1 -= 128;
+        this._state = t1;
+        if (t1 < 128) {
+          if ((t1 & 64) !== 0) {
+            t1 = this._pending;
+            t1 = !t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+          if (t1)
+            this._pending.schedule$1(this);
+          else {
+            t1 = (this._state & 4294967291) >>> 0;
+            this._state = t1;
+            if ((t1 & 32) === 0)
+              this._guardCallback$1(this.get$_onResume());
+          }
+        }
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      var t1 = (this._state & 4294967279) >>> 0;
+      this._state = t1;
+      if ((t1 & 8) !== 0)
+        return this._cancelFuture;
+      this._cancel$0();
+      return this._cancelFuture;
+    },
+    get$_isInputPaused: function() {
+      return (this._state & 4) !== 0;
+    },
+    get$isPaused: function() {
+      return this._state >= 128;
+    },
+    _cancel$0: function() {
+      var t1 = (this._state | 8) >>> 0;
+      this._state = t1;
+      if ((t1 & 64) !== 0)
+        this._pending.cancelSchedule$0();
+      if ((this._state & 32) === 0)
+        this._pending = null;
+      this._cancelFuture = this._onCancel$0();
+    },
+    _async$_add$1: function(_, data) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendData$1(data);
+      else
+        this._addPending$1(H.setRuntimeTypeInfo(new P._DelayedData(data, null), [null]));
+    },
+    _addError$2: function(error, stackTrace) {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      if (t1 < 32)
+        this._sendError$2(error, stackTrace);
+      else
+        this._addPending$1(new P._DelayedError(error, stackTrace, null));
+    },
+    _close$0: function() {
+      var t1 = this._state;
+      if ((t1 & 8) !== 0)
+        return;
+      t1 = (t1 | 2) >>> 0;
+      this._state = t1;
+      if (t1 < 32)
+        this._sendDone$0();
+      else
+        this._addPending$1(C.C__DelayedDone);
+    },
+    _onPause$0: [function() {
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+    },
+    _addPending$1: function($event) {
+      var pending, t1;
+      pending = this._pending;
+      if (pending == null) {
+        pending = new P._StreamImplEvents(null, null, 0);
+        this._pending = pending;
+      }
+      pending.add$1(0, $event);
+      t1 = this._state;
+      if ((t1 & 64) === 0) {
+        t1 = (t1 | 64) >>> 0;
+        this._state = t1;
+        if (t1 < 128)
+          this._pending.schedule$1(this);
+      }
+    },
+    _sendData$1: function(data) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      this._zone.runUnaryGuarded$2(this._onData, data);
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _sendError$2: function(error, stackTrace) {
+      var t1, t2;
+      t1 = this._state;
+      t2 = new P._BufferingStreamSubscription__sendError_sendError(this, error, stackTrace);
+      if ((t1 & 1) !== 0) {
+        this._state = (t1 | 16) >>> 0;
+        this._cancel$0();
+        t1 = this._cancelFuture;
+        if (!!J.getInterceptor(t1).$isFuture)
+          t1.whenComplete$1(t2);
+        else
+          t2.call$0();
+      } else {
+        t2.call$0();
+        this._checkState$1((t1 & 4) !== 0);
+      }
+    },
+    _sendDone$0: function() {
+      var t1, t2;
+      t1 = new P._BufferingStreamSubscription__sendDone_sendDone(this);
+      this._cancel$0();
+      this._state = (this._state | 16) >>> 0;
+      t2 = this._cancelFuture;
+      if (!!J.getInterceptor(t2).$isFuture)
+        t2.whenComplete$1(t1);
+      else
+        t1.call$0();
+    },
+    _guardCallback$1: function(callback) {
+      var t1 = this._state;
+      this._state = (t1 | 32) >>> 0;
+      callback.call$0();
+      this._state = (this._state & 4294967263) >>> 0;
+      this._checkState$1((t1 & 4) !== 0);
+    },
+    _checkState$1: function(wasInputPaused) {
+      var t1, isInputPaused;
+      if ((this._state & 64) !== 0) {
+        t1 = this._pending;
+        t1 = t1.get$isEmpty(t1);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = (this._state & 4294967231) >>> 0;
+        this._state = t1;
+        if ((t1 & 4) !== 0)
+          if (t1 < 128) {
+            t1 = this._pending;
+            t1 = t1 == null || t1.get$isEmpty(t1);
+          } else
+            t1 = false;
+        else
+          t1 = false;
+        if (t1)
+          this._state = (this._state & 4294967291) >>> 0;
+      }
+      for (; true; wasInputPaused = isInputPaused) {
+        t1 = this._state;
+        if ((t1 & 8) !== 0) {
+          this._pending = null;
+          return;
+        }
+        isInputPaused = (t1 & 4) !== 0;
+        if (wasInputPaused === isInputPaused)
+          break;
+        this._state = (t1 ^ 32) >>> 0;
+        if (isInputPaused)
+          this._onPause$0();
+        else
+          this._onResume$0();
+        this._state = (this._state & 4294967263) >>> 0;
+      }
+      t1 = this._state;
+      if ((t1 & 64) !== 0 && t1 < 128)
+        this._pending.schedule$1(this);
+    },
+    $isStreamSubscription: true,
+    static: {"^": "_BufferingStreamSubscription__STATE_CANCEL_ON_ERROR,_BufferingStreamSubscription__STATE_CLOSED,_BufferingStreamSubscription__STATE_INPUT_PAUSED,_BufferingStreamSubscription__STATE_CANCELED,_BufferingStreamSubscription__STATE_WAIT_FOR_CANCEL,_BufferingStreamSubscription__STATE_IN_CALLBACK,_BufferingStreamSubscription__STATE_HAS_PENDING,_BufferingStreamSubscription__STATE_PAUSE_COUNT,_BufferingStreamSubscription__STATE_PAUSE_COUNT_SHIFT"}
+  },
+  _BufferingStreamSubscription__sendError_sendError: {
+    "^": "Closure:18;this_0,error_1,stackTrace_2",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 8) !== 0 && (t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 32) >>> 0;
+      t2 = t1._zone;
+      if (!t2.inSameErrorZone$1($.Zone__current))
+        $.Zone__current.handleUncaughtError$2(this.error_1, this.stackTrace_2);
+      else {
+        t3 = t1._onError;
+        t4 = H.getDynamicRuntimeType();
+        t4 = H.buildFunctionType(t4, [t4, t4])._isTest$1(t3);
+        t5 = t1._onError;
+        t6 = this.error_1;
+        if (t4)
+          t2.runBinaryGuarded$3(t5, t6, this.stackTrace_2);
+        else
+          t2.runUnaryGuarded$2(t5, t6);
+      }
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BufferingStreamSubscription__sendDone_sendDone: {
+    "^": "Closure:18;this_0",
+    call$0: [function() {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = t1._state;
+      if ((t2 & 16) === 0)
+        return;
+      t1._state = (t2 | 42) >>> 0;
+      t1._zone.runGuarded$1(t1._onDone);
+      t1._state = (t1._state & 4294967263) >>> 0;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImpl: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var subscription = this._createSubscription$1(true === cancelOnError);
+      subscription.onData$1(onData);
+      subscription.onError$1(0, onError);
+      subscription.onDone$1(onDone);
+      return subscription;
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    _createSubscription$1: function(cancelOnError) {
+      var t1, t2;
+      t1 = $.Zone__current;
+      t2 = cancelOnError ? 1 : 0;
+      t2 = new P._BufferingStreamSubscription(null, null, null, t1, t2, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    }
+  },
+  _DelayedEvent: {
+    "^": "Object;next@"
+  },
+  _DelayedData: {
+    "^": "_DelayedEvent;value>,next",
+    perform$1: function(dispatch) {
+      dispatch._sendData$1(this.value);
+    }
+  },
+  _DelayedError: {
+    "^": "_DelayedEvent;error>,stackTrace<,next",
+    perform$1: function(dispatch) {
+      dispatch._sendError$2(this.error, this.stackTrace);
+    }
+  },
+  _DelayedDone: {
+    "^": "Object;",
+    perform$1: function(dispatch) {
+      dispatch._sendDone$0();
+    },
+    get$next: function() {
+      return;
+    },
+    set$next: function(_) {
+      throw H.wrapException(P.StateError$("No events after a done."));
+    }
+  },
+  _PendingEvents: {
+    "^": "Object;",
+    schedule$1: function(dispatch) {
+      var t1 = this._state;
+      if (t1 === 1)
+        return;
+      if (t1 >= 1) {
+        this._state = 1;
+        return;
+      }
+      P.scheduleMicrotask(new P._PendingEvents_schedule_closure(this, dispatch));
+      this._state = 1;
+    },
+    cancelSchedule$0: function() {
+      if (this._state === 1)
+        this._state = 3;
+    }
+  },
+  _PendingEvents_schedule_closure: {
+    "^": "Closure:69;this_0,dispatch_1",
+    call$0: [function() {
+      var t1, oldState;
+      t1 = this.this_0;
+      oldState = t1._state;
+      t1._state = 0;
+      if (oldState === 3)
+        return;
+      t1.handleNext$1(this.dispatch_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _StreamImplEvents: {
+    "^": "_PendingEvents;firstPendingEvent,lastPendingEvent,_state",
+    get$isEmpty: function(_) {
+      return this.lastPendingEvent == null;
+    },
+    add$1: function(_, $event) {
+      var t1 = this.lastPendingEvent;
+      if (t1 == null) {
+        this.lastPendingEvent = $event;
+        this.firstPendingEvent = $event;
+      } else {
+        t1.set$next($event);
+        this.lastPendingEvent = $event;
+      }
+    },
+    handleNext$1: function(dispatch) {
+      var $event, t1;
+      $event = this.firstPendingEvent;
+      t1 = $event.get$next();
+      this.firstPendingEvent = t1;
+      if (t1 == null)
+        this.lastPendingEvent = null;
+      $event.perform$1(dispatch);
+    },
+    clear$0: function(_) {
+      if (this._state === 1)
+        this._state = 3;
+      this.lastPendingEvent = null;
+      this.firstPendingEvent = null;
+    }
+  },
+  _DoneStreamSubscription: {
+    "^": "Object;_zone<,_state,_onDone",
+    get$isPaused: function() {
+      return this._state >= 4;
+    },
+    _schedule$0: function() {
+      if ((this._state & 2) !== 0)
+        return;
+      this._zone.scheduleMicrotask$1(this.get$_sendDone());
+      this._state = (this._state | 2) >>> 0;
+    },
+    onData$1: function(handleData) {
+    },
+    onError$1: function(_, handleError) {
+    },
+    onDone$1: function(handleDone) {
+      this._onDone = handleDone;
+    },
+    pause$1: [function(_, resumeSignal) {
+      this._state += 4;
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    resume$0: [function(_) {
+      var t1 = this._state;
+      if (t1 >= 4) {
+        t1 -= 4;
+        this._state = t1;
+        if (t1 < 4 && (t1 & 1) === 0)
+          this._schedule$0();
+      }
+    }, "call$0", "get$resume", 0, 0, 18],
+    cancel$0: function() {
+      return;
+    },
+    _sendDone$0: [function() {
+      var t1 = (this._state & 4294967293) >>> 0;
+      this._state = t1;
+      if (t1 >= 4)
+        return;
+      this._state = (t1 | 1) >>> 0;
+      t1 = this._onDone;
+      if (t1 != null)
+        this._zone.runGuarded$1(t1);
+    }, "call$0", "get$_sendDone", 0, 0, 18],
+    $isStreamSubscription: true,
+    static: {"^": "_DoneStreamSubscription__DONE_SENT,_DoneStreamSubscription__SCHEDULED,_DoneStreamSubscription__PAUSED"}
+  },
+  _cancelAndError_closure: {
+    "^": "Closure:69;future_0,error_1,stackTrace_2",
+    call$0: [function() {
+      return this.future_0._completeError$2(this.error_1, this.stackTrace_2);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _cancelAndErrorClosure_closure: {
+    "^": "Closure:118;subscription_0,future_1",
+    call$2: function(error, stackTrace) {
+      return P._cancelAndError(this.subscription_0, this.future_1, error, stackTrace);
+    },
+    $isFunction: true
+  },
+  _cancelAndValue_closure: {
+    "^": "Closure:69;future_0,value_1",
+    call$0: [function() {
+      return this.future_0._complete$1(this.value_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _ForwardingStream: {
+    "^": "Stream;",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1, t2, t3, t4, result;
+      cancelOnError = true === cancelOnError;
+      t1 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 0);
+      t2 = H.getRuntimeTypeArgument(this, "_ForwardingStream", 1);
+      t3 = $.Zone__current;
+      t4 = cancelOnError ? 1 : 0;
+      result = H.setRuntimeTypeInfo(new P._ForwardingStreamSubscription(this, null, null, null, null, t3, t4, null, null), [t1, t2]);
+      result._ForwardingStreamSubscription$2(this, cancelOnError, t1, t2);
+      result.onData$1(onData);
+      result.onError$1(0, onError);
+      result.onDone$1(onDone);
+      return result;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    _handleData$2: function(data, sink) {
+      sink._async$_add$1(0, data);
+    },
+    $asStream: function($S, $T) {
+      return [$T];
+    }
+  },
+  _ForwardingStreamSubscription: {
+    "^": "_BufferingStreamSubscription;_stream,_subscription,_onData,_onError,_onDone,_zone,_state,_cancelFuture,_pending",
+    _async$_add$1: function(_, data) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._async$_add$1.call(this, this, data);
+    },
+    _addError$2: function(error, stackTrace) {
+      if ((this._state & 2) !== 0)
+        return;
+      P._BufferingStreamSubscription.prototype._addError$2.call(this, error, stackTrace);
+    },
+    _onPause$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.pause$0(0);
+    }, "call$0", "get$_onPause", 0, 0, 18],
+    _onResume$0: [function() {
+      var t1 = this._subscription;
+      if (t1 == null)
+        return;
+      t1.resume$0(0);
+    }, "call$0", "get$_onResume", 0, 0, 18],
+    _onCancel$0: function() {
+      var t1 = this._subscription;
+      if (t1 != null) {
+        this._subscription = null;
+        t1.cancel$0();
+      }
+      return;
+    },
+    _handleData$1: [function(data) {
+      this._stream._handleData$2(data, this);
+    }, "call$1", "get$_handleData", 2, 0, function() {
+      return H.computeSignature(function(S, T) {
+        return {func: "void__S", void: true, args: [S]};
+      }, this.$receiver, "_ForwardingStreamSubscription");
+    }, 104],
+    _handleError$2: [function(error, stackTrace) {
+      this._addError$2(error, stackTrace);
+    }, "call$2", "get$_handleError", 4, 0, 119, 24, 25],
+    _handleDone$0: [function() {
+      this._close$0();
+    }, "call$0", "get$_handleDone", 0, 0, 18],
+    _ForwardingStreamSubscription$2: function(_stream, cancelOnError, $S, $T) {
+      var t1, t2;
+      t1 = this.get$_handleData();
+      t2 = this.get$_handleError();
+      this._subscription = this._stream._async$_source.listen$3$onDone$onError(t1, this.get$_handleDone(), t2);
+    },
+    $as_BufferingStreamSubscription: function($S, $T) {
+      return [$T];
+    },
+    $asStreamSubscription: function($S, $T) {
+      return [$T];
+    }
+  },
+  _WhereStream: {
+    "^": "_ForwardingStream;_test,_async$_source",
+    _test$1: function(arg0) {
+      return this._test.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var satisfies, e, s, exception, t1;
+      satisfies = null;
+      try {
+        satisfies = this._test$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      if (satisfies === true)
+        J._async$_add$1$x(sink, inputEvent);
+    },
+    $as_ForwardingStream: function($T) {
+      return [$T, $T];
+    },
+    $asStream: null
+  },
+  _MapStream: {
+    "^": "_ForwardingStream;_transform,_async$_source",
+    _transform$1: function(arg0) {
+      return this._transform.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var outputEvent, e, s, exception, t1;
+      outputEvent = null;
+      try {
+        outputEvent = this._transform$1(inputEvent);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+        return;
+      }
+
+      J._async$_add$1$x(sink, outputEvent);
+    }
+  },
+  _ExpandStream: {
+    "^": "_ForwardingStream;_expand,_async$_source",
+    _expand$1: function(arg0) {
+      return this._expand.call$1(arg0);
+    },
+    _handleData$2: function(inputEvent, sink) {
+      var value, e, s, t1, exception;
+      try {
+        for (t1 = J.get$iterator$ax(this._expand$1(inputEvent)); t1.moveNext$0();) {
+          value = t1.get$current();
+          J._async$_add$1$x(sink, value);
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        sink._addError$2(e, s);
+      }
+
+    }
+  },
+  Timer: {
+    "^": "Object;"
+  },
+  ZoneSpecification: {
+    "^": "Object;"
+  },
+  _ZoneSpecification: {
+    "^": "Object;handleUncaughtError<,run<,runUnary<,runBinary<,registerCallback<,registerUnaryCallback<,registerBinaryCallback<,scheduleMicrotask<,createTimer<,createPeriodicTimer,print>,fork<",
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.handleUncaughtError.call$2(arg0, arg1);
+    },
+    run$1: function(arg0) {
+      return this.run.call$1(arg0);
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.runUnary.call$2(arg0, arg1);
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.runBinary.call$3(arg0, arg1, arg2);
+    },
+    registerCallback$1: function(arg0) {
+      return this.registerCallback.call$1(arg0);
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.registerUnaryCallback.call$1(arg0);
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.registerBinaryCallback.call$1(arg0);
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.scheduleMicrotask.call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.scheduleMicrotask.call$2(arg0, arg1);
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.createTimer.call$2(arg0, arg1);
+    },
+    print$1: function($receiver, arg0) {
+      return this.print.call$1(arg0);
+    },
+    fork$1$specification: function(arg0) {
+      return this.fork.call$1$specification(arg0);
+    }
+  },
+  ZoneDelegate: {
+    "^": "Object;"
+  },
+  Zone: {
+    "^": "Object;"
+  },
+  _ZoneDelegate: {
+    "^": "Object;_degelationTarget",
+    get$_zone: function() {
+      return this._degelationTarget;
+    },
+    handleUncaughtError$3: function(zone, error, stackTrace) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$handleUncaughtError() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$handleUncaughtError().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, error, stackTrace);
+    },
+    run$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$run() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$run().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    runUnary$3: function(zone, f, arg) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runUnary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runUnary().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg);
+    },
+    runBinary$4: function(zone, f, arg1, arg2) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$runBinary() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$runBinary().call$6($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f, arg1, arg2);
+    },
+    registerCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerUnaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerUnaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerUnaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    registerBinaryCallback$2: function(zone, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$registerBinaryCallback() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$registerBinaryCallback().call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, f);
+    },
+    scheduleMicrotask$2: function(zone, f) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$scheduleMicrotask() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      $parent.get$_specification().get$scheduleMicrotask().call$4($parent, new P._ZoneDelegate(t1), zone, f);
+    },
+    createTimer$3: function(zone, duration, f) {
+      var $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$createTimer() == null;)
+        $parent = $parent.get$parent($parent);
+      return $parent.get$_specification().get$createTimer().call$5($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, duration, f);
+    },
+    print$2: function(_, zone, line) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; t1 = $parent.get$_specification(), t1.get$print(t1) == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$_specification();
+      t1.get$print(t1).call$4($parent, new P._ZoneDelegate($parent.get$parent($parent)), zone, line);
+    },
+    fork$3: function(zone, specification, zoneValues) {
+      var $parent, t1;
+      $parent = this._degelationTarget;
+      for (; $parent.get$_specification().get$fork() == null;)
+        $parent = $parent.get$parent($parent);
+      t1 = $parent.get$parent($parent);
+      return $parent.get$_specification().get$fork().call$5($parent, new P._ZoneDelegate(t1), zone, specification, zoneValues);
+    }
+  },
+  _BaseZone: {
+    "^": "Object;",
+    inSameErrorZone$1: function(otherZone) {
+      return this.get$_errorZone() === otherZone.get$_errorZone();
+    },
+    runGuarded$1: function(f) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.run$1(f);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runUnaryGuarded$2: function(f, arg) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runUnary$2(f, arg);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    runBinaryGuarded$3: function(f, arg1, arg2) {
+      var e, s, t1, exception;
+      try {
+        t1 = this.runBinary$3(f, arg1, arg2);
+        return t1;
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        return this.handleUncaughtError$2(e, s);
+      }
+
+    },
+    bindCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindCallback_closure0(this, registered);
+    },
+    bindCallback$1: function(f) {
+      return this.bindCallback$2$runGuarded(f, true);
+    },
+    bindUnaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerUnaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindUnaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindUnaryCallback_closure0(this, registered);
+    },
+    bindBinaryCallback$2$runGuarded: function(f, runGuarded) {
+      var registered = this.registerBinaryCallback$1(f);
+      if (runGuarded)
+        return new P._BaseZone_bindBinaryCallback_closure(this, registered);
+      else
+        return new P._BaseZone_bindBinaryCallback_closure0(this, registered);
+    }
+  },
+  _BaseZone_bindCallback_closure: {
+    "^": "Closure:69;this_0,registered_1",
+    call$0: [function() {
+      return this.this_0.runGuarded$1(this.registered_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindCallback_closure0: {
+    "^": "Closure:69;this_2,registered_3",
+    call$0: [function() {
+      return this.this_2.run$1(this.registered_3);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure: {
+    "^": "Closure:13;this_0,registered_1",
+    call$1: [function(arg) {
+      return this.this_0.runUnaryGuarded$2(this.registered_1, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindUnaryCallback_closure0: {
+    "^": "Closure:13;this_2,registered_3",
+    call$1: [function(arg) {
+      return this.this_2.runUnary$2(this.registered_3, arg);
+    }, "call$1", null, 2, 0, null, 33, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure: {
+    "^": "Closure:75;this_0,registered_1",
+    call$2: [function(arg1, arg2) {
+      return this.this_0.runBinaryGuarded$3(this.registered_1, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _BaseZone_bindBinaryCallback_closure0: {
+    "^": "Closure:75;this_2,registered_3",
+    call$2: [function(arg1, arg2) {
+      return this.this_2.runBinary$3(this.registered_3, arg1, arg2);
+    }, "call$2", null, 4, 0, null, 9, 10, "call"],
+    $isFunction: true
+  },
+  _CustomizedZone: {
+    "^": "_BaseZone;parent>,_specification<,_async$_map",
+    get$_errorZone: function() {
+      return this.parent.get$_errorZone();
+    },
+    $index: function(_, key) {
+      var t1, result;
+      t1 = this._async$_map;
+      result = t1.$index(0, key);
+      if (result != null || t1.containsKey$1(key))
+        return result;
+      return this.parent.$index(0, key);
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return new P._ZoneDelegate(this).handleUncaughtError$3(this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return new P._ZoneDelegate(this).fork$3(this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return new P._ZoneDelegate(this).run$2(this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return new P._ZoneDelegate(this).runUnary$3(this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return new P._ZoneDelegate(this).runBinary$4(this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerCallback$2(this, f);
+    },
+    registerUnaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerUnaryCallback$2(this, f);
+    },
+    registerBinaryCallback$1: function(f) {
+      return new P._ZoneDelegate(this).registerBinaryCallback$2(this, f);
+    },
+    scheduleMicrotask$1: function(f) {
+      new P._ZoneDelegate(this).scheduleMicrotask$2(this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return new P._ZoneDelegate(this).createTimer$3(this, duration, f);
+    },
+    print$1: function(_, line) {
+      new P._ZoneDelegate(this).print$2(0, this, line);
+    }
+  },
+  _rootHandleUncaughtError_closure: {
+    "^": "Closure:69;error_0,stackTrace_1",
+    call$0: [function() {
+      P._scheduleAsyncCallback(new P._rootHandleUncaughtError__closure(this.error_0, this.stackTrace_1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootHandleUncaughtError__closure: {
+    "^": "Closure:69;error_2,stackTrace_3",
+    call$0: [function() {
+      var t1, trace;
+      t1 = this.error_2;
+      P.print("Uncaught Error: " + H.S(t1));
+      trace = this.stackTrace_3;
+      if (trace == null && !!J.getInterceptor(t1).$isError)
+        trace = t1.get$stackTrace();
+      if (trace != null)
+        P.print("Stack Trace: \n" + H.S(trace) + "\n");
+      throw H.wrapException(t1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _rootFork_closure: {
+    "^": "Closure:75;copiedMap_0",
+    call$2: [function(key, value) {
+      this.copiedMap_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true
+  },
+  _RootZoneSpecification: {
+    "^": "Object;",
+    get$handleUncaughtError: function() {
+      return P._rootHandleUncaughtError$closure();
+    },
+    handleUncaughtError$2: function(arg0, arg1) {
+      return this.get$handleUncaughtError().call$2(arg0, arg1);
+    },
+    get$run: function() {
+      return P._rootRun$closure();
+    },
+    run$1: function(arg0) {
+      return this.get$run().call$1(arg0);
+    },
+    get$runUnary: function() {
+      return P._rootRunUnary$closure();
+    },
+    runUnary$2: function(arg0, arg1) {
+      return this.get$runUnary().call$2(arg0, arg1);
+    },
+    get$runBinary: function() {
+      return P._rootRunBinary$closure();
+    },
+    runBinary$3: function(arg0, arg1, arg2) {
+      return this.get$runBinary().call$3(arg0, arg1, arg2);
+    },
+    get$registerCallback: function() {
+      return P._rootRegisterCallback$closure();
+    },
+    registerCallback$1: function(arg0) {
+      return this.get$registerCallback().call$1(arg0);
+    },
+    get$registerUnaryCallback: function() {
+      return P._rootRegisterUnaryCallback$closure();
+    },
+    registerUnaryCallback$1: function(arg0) {
+      return this.get$registerUnaryCallback().call$1(arg0);
+    },
+    get$registerBinaryCallback: function() {
+      return P._rootRegisterBinaryCallback$closure();
+    },
+    registerBinaryCallback$1: function(arg0) {
+      return this.get$registerBinaryCallback().call$1(arg0);
+    },
+    get$scheduleMicrotask: function() {
+      return P._rootScheduleMicrotask$closure();
+    },
+    scheduleMicrotask$1: function(arg0) {
+      return this.get$scheduleMicrotask().call$1(arg0);
+    },
+    scheduleMicrotask$2: function(arg0, arg1) {
+      return this.get$scheduleMicrotask().call$2(arg0, arg1);
+    },
+    get$createTimer: function() {
+      return P._rootCreateTimer$closure();
+    },
+    createTimer$2: function(arg0, arg1) {
+      return this.get$createTimer().call$2(arg0, arg1);
+    },
+    get$print: function(_) {
+      return P._rootPrint$closure();
+    },
+    print$1: function($receiver, arg0) {
+      return this.get$print(this).call$1(arg0);
+    },
+    get$fork: function() {
+      return P._rootFork$closure();
+    },
+    fork$1$specification: function(arg0) {
+      return this.get$fork().call$1$specification(arg0);
+    }
+  },
+  _RootZone: {
+    "^": "_BaseZone;",
+    get$parent: function(_) {
+      return;
+    },
+    get$_specification: function() {
+      return C.C__RootZoneSpecification;
+    },
+    get$_errorZone: function() {
+      return this;
+    },
+    inSameErrorZone$1: function(otherZone) {
+      return otherZone.get$_errorZone() === this;
+    },
+    $index: function(_, key) {
+      return;
+    },
+    handleUncaughtError$2: function(error, stackTrace) {
+      return P._rootHandleUncaughtError(this, null, this, error, stackTrace);
+    },
+    fork$2$specification$zoneValues: function(specification, zoneValues) {
+      return P._rootFork(this, null, this, specification, zoneValues);
+    },
+    fork$1$specification: function(specification) {
+      return this.fork$2$specification$zoneValues(specification, null);
+    },
+    run$1: function(f) {
+      return P._rootRun(this, null, this, f);
+    },
+    runUnary$2: function(f, arg) {
+      return P._rootRunUnary(this, null, this, f, arg);
+    },
+    runBinary$3: function(f, arg1, arg2) {
+      return P._rootRunBinary(this, null, this, f, arg1, arg2);
+    },
+    registerCallback$1: function(f) {
+      return f;
+    },
+    registerUnaryCallback$1: function(f) {
+      return f;
+    },
+    registerBinaryCallback$1: function(f) {
+      return f;
+    },
+    scheduleMicrotask$1: function(f) {
+      P._rootScheduleMicrotask(this, null, this, f);
+    },
+    createTimer$2: function(duration, f) {
+      return P._rootCreateTimer(this, null, this, duration, f);
+    },
+    print$1: function(_, line) {
+      H.printString(line);
+      return;
+    }
+  }
+}],
+["dart.collection", "dart:collection", , P, {
+  "^": "",
+  LinkedHashMap_LinkedHashMap$_literal: function(keyValuePairs, $K, $V) {
+    return H.fillLiteralMap(keyValuePairs, H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]));
+  },
+  LinkedHashMap_LinkedHashMap$_empty: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  _defaultEquals: [function(a, b) {
+    return J.$eq(a, b);
+  }, "call$2", "_defaultEquals$closure", 4, 0, 45, 46, 47],
+  _defaultHashCode: [function(a) {
+    return J.get$hashCode$(a);
+  }, "call$1", "_defaultHashCode$closure", 2, 0, 48, 46],
+  HashMap_HashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    var t1;
+    if (equals == null) {
+      t1 = new P._HashMap(0, null, null, null, null);
+      t1.$builtinTypeInfo = [$K, $V];
+      return t1;
+    }
+    hashCode = P._defaultHashCode$closure();
+    return P._CustomHashMap$(equals, hashCode, isValidKey, $K, $V);
+  },
+  HashMap_HashMap$identity: function($K, $V) {
+    return H.setRuntimeTypeInfo(new P._IdentityHashMap(0, null, null, null, null), [$K, $V]);
+  },
+  HashSet_HashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._HashSet(0, null, null, null, null), [$E]);
+  },
+  IterableBase_iterableToShortString: function(iterable, leftDelimiter, rightDelimiter) {
+    var parts, t1;
+    if (P.IterableBase__isToStringVisiting(iterable)) {
+      if (leftDelimiter === "(" && rightDelimiter === ")")
+        return "(...)";
+      return leftDelimiter + "..." + rightDelimiter;
+    }
+    parts = [];
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      P.IterableBase__iterablePartsToStrings(iterable, parts);
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    t1 = P.StringBuffer$(leftDelimiter);
+    t1.writeAll$2(parts, ", ");
+    t1.write$1(rightDelimiter);
+    return t1._contents;
+  },
+  IterableBase_iterableToFullString: function(iterable, leftDelimiter, rightDelimiter) {
+    var buffer, t1;
+    if (P.IterableBase__isToStringVisiting(iterable))
+      return leftDelimiter + "..." + rightDelimiter;
+    buffer = P.StringBuffer$(leftDelimiter);
+    t1 = $.get$IterableBase__toStringVisiting();
+    t1.push(iterable);
+    try {
+      buffer.writeAll$2(iterable, ", ");
+    } finally {
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    buffer.write$1(rightDelimiter);
+    return buffer.get$_contents();
+  },
+  IterableBase__isToStringVisiting: function(o) {
+    var i, t1;
+    for (i = 0; t1 = $.get$IterableBase__toStringVisiting(), i < t1.length; ++i)
+      if (o === t1[i])
+        return true;
+    return false;
+  },
+  IterableBase__iterablePartsToStrings: function(iterable, parts) {
+    var it, $length, count, next, ultimateString, penultimateString, penultimate, ultimate, ultimate0, elision;
+    it = iterable.get$iterator(iterable);
+    $length = 0;
+    count = 0;
+    while (true) {
+      if (!($length < 80 || count < 3))
+        break;
+      if (!it.moveNext$0())
+        return;
+      next = H.S(it.get$current());
+      parts.push(next);
+      $length += next.length + 2;
+      ++count;
+    }
+    if (!it.moveNext$0()) {
+      if (count <= 5)
+        return;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      ultimateString = parts.pop();
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      penultimateString = parts.pop();
+    } else {
+      penultimate = it.get$current();
+      ++count;
+      if (!it.moveNext$0()) {
+        if (count <= 4) {
+          parts.push(H.S(penultimate));
+          return;
+        }
+        ultimateString = H.S(penultimate);
+        if (0 >= parts.length)
+          return H.ioore(parts, 0);
+        penultimateString = parts.pop();
+        $length += ultimateString.length + 2;
+      } else {
+        ultimate = it.get$current();
+        ++count;
+        for (; it.moveNext$0(); penultimate = ultimate, ultimate = ultimate0) {
+          ultimate0 = it.get$current();
+          ++count;
+          if (count > 100) {
+            while (true) {
+              if (!($length > 75 && count > 3))
+                break;
+              if (0 >= parts.length)
+                return H.ioore(parts, 0);
+              $length -= parts.pop().length + 2;
+              --count;
+            }
+            parts.push("...");
+            return;
+          }
+        }
+        penultimateString = H.S(penultimate);
+        ultimateString = H.S(ultimate);
+        $length += ultimateString.length + penultimateString.length + 4;
+      }
+    }
+    if (count > parts.length + 2) {
+      $length += 5;
+      elision = "...";
+    } else
+      elision = null;
+    while (true) {
+      if (!($length > 80 && parts.length > 3))
+        break;
+      if (0 >= parts.length)
+        return H.ioore(parts, 0);
+      $length -= parts.pop().length + 2;
+      if (elision == null) {
+        $length += 5;
+        elision = "...";
+      }
+    }
+    if (elision != null)
+      parts.push(elision);
+    parts.push(penultimateString);
+    parts.push(ultimateString);
+  },
+  LinkedHashMap_LinkedHashMap: function(equals, hashCode, isValidKey, $K, $V) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashMap(0, null, null, null, null, null, 0), [$K, $V]);
+  },
+  LinkedHashSet_LinkedHashSet: function(equals, hashCode, isValidKey, $E) {
+    return H.setRuntimeTypeInfo(new P._LinkedHashSet(0, null, null, null, null, null, 0), [$E]);
+  },
+  Maps_mapToString: function(m) {
+    var t1, result;
+    t1 = {};
+    if (P.IterableBase__isToStringVisiting(m))
+      return "{...}";
+    result = P.StringBuffer$("");
+    try {
+      $.get$IterableBase__toStringVisiting().push(m);
+      result.write$1("{");
+      t1.first_0 = true;
+      J.forEach$1$ax(m, new P.Maps_mapToString_closure(t1, result));
+      result.write$1("}");
+    } finally {
+      t1 = $.get$IterableBase__toStringVisiting();
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    }
+    return result.get$_contents();
+  },
+  _HashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.HashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._HashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        return nums == null ? false : nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P._HashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, t1, entry, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          t1 = null;
+        else {
+          entry = strings[key];
+          t1 = entry === strings ? null : entry;
+        }
+        return t1;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          t1 = null;
+        else {
+          entry = nums[key];
+          t1 = entry === nums ? null : entry;
+        }
+        return t1;
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      return index < 0 ? null : bucket[index + 1];
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._HashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._HashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null) {
+        P._HashMap__setTableEntry(rest, hash, [key, value]);
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      } else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index + 1] = value;
+        else {
+          bucket.push(key, value);
+          ++this._collection$_length;
+          this._collection$_keys = null;
+        }
+      }
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      --this._collection$_length;
+      this._collection$_keys = null;
+      return bucket.splice(index, 2)[1];
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._collection$_keys = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    forEach$1: function(_, action) {
+      var keys, $length, i, key;
+      keys = this._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        key = keys[i];
+        action.call$2(key, this.$index(0, key));
+        if (keys !== this._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+      }
+    },
+    _computeKeys$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._collection$_keys;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; i0 += 2) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._collection$_keys = result;
+      return result;
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      if (table[key] == null) {
+        ++this._collection$_length;
+        this._collection$_keys = null;
+      }
+      P._HashMap__setTableEntry(table, key, value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var value;
+      if (table != null && table[key] != null) {
+        value = P._HashMap__getTableEntry(table, key);
+        delete table[key];
+        --this._collection$_length;
+        this._collection$_keys = null;
+        return value;
+      } else
+        return;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (J.$eq(bucket[i], key))
+          return i;
+      return -1;
+    },
+    $isMap: true,
+    static: {_HashMap__getTableEntry: function(table, key) {
+        var entry = table[key];
+        return entry === table ? null : entry;
+      }, _HashMap__setTableEntry: function(table, key, value) {
+        if (value == null)
+          table[key] = table;
+        else
+          table[key] = value;
+      }, _HashMap__newHashTable: function() {
+        var table = Object.create(null);
+        P._HashMap__setTableEntry(table, "<non-identifier-key>", table);
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _HashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _HashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V", args: [K, V]};
+      }, this.this_0, "_HashMap");
+    }
+  },
+  _IdentityHashMap: {
+    "^": "_HashMap;_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _computeHashCode$1: function(key) {
+      return H.objectHashCode(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i, t1;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2) {
+        t1 = bucket[i];
+        if (t1 == null ? key == null : t1 === key)
+          return i;
+      }
+      return -1;
+    }
+  },
+  _CustomHashMap: {
+    "^": "_HashMap;_equals,_hashCode,_validKey,_collection$_length,_strings,_nums,_rest,_collection$_keys",
+    _equals$2: function(arg0, arg1) {
+      return this._equals.call$2(arg0, arg1);
+    },
+    _hashCode$1: function(arg0) {
+      return this._hashCode.call$1(arg0);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    $index: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._get$1.call(this, key);
+    },
+    $indexSet: function(_, key, value) {
+      P._HashMap.prototype._set$2.call(this, key, value);
+    },
+    containsKey$1: function(key) {
+      if (this._validKey$1(key) !== true)
+        return false;
+      return P._HashMap.prototype._containsKey$1.call(this, key);
+    },
+    remove$1: function(_, key) {
+      if (this._validKey$1(key) !== true)
+        return;
+      return P._HashMap.prototype._remove$1.call(this, key);
+    },
+    _computeHashCode$1: function(key) {
+      return this._hashCode$1(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; i += 2)
+        if (this._equals$2(bucket[i], key) === true)
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    static: {_CustomHashMap$: function(_equals, _hashCode, validKey, $K, $V) {
+        var t1 = new P._CustomHashMap_closure($K);
+        return H.setRuntimeTypeInfo(new P._CustomHashMap(_equals, _hashCode, t1, 0, null, null, null, null), [$K, $V]);
+      }}
+  },
+  _CustomHashMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  HashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1 = this._map;
+      t1 = new P.HashMapKeyIterator(t1, t1._computeKeys$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, keys, $length, i;
+      t1 = this._map;
+      keys = t1._computeKeys$0();
+      for ($length = keys.length, i = 0; i < $length; ++i) {
+        f.call$1(keys[i]);
+        if (keys !== t1._collection$_keys)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+      }
+    },
+    $isEfficientLength: true
+  },
+  HashMapKeyIterator: {
+    "^": "Object;_map,_collection$_keys,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var keys, offset, t1;
+      keys = this._collection$_keys;
+      offset = this._offset;
+      t1 = this._map;
+      if (keys !== t1._collection$_keys)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= keys.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = keys[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashMap: {
+    "^": "Object;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      return H.MappedIterable_MappedIterable(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]), new P._LinkedHashMap_values_closure(this), H.getTypeArgumentByIndex(this, 0), H.getTypeArgumentByIndex(this, 1));
+    },
+    containsKey$1: function(key) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[key] != null;
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[key] != null;
+      } else
+        return this._containsKey$1(key);
+    },
+    _containsKey$1: function(key) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(key)], key) >= 0;
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new P._LinkedHashMap_addAll_closure(this));
+    },
+    $index: function(_, key) {
+      var strings, cell, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return;
+        cell = strings[key];
+        return cell == null ? null : cell.get$_value();
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null)
+          return;
+        cell = nums[key];
+        return cell == null ? null : cell.get$_value();
+      } else
+        return this._get$1(key);
+    },
+    _get$1: function(key) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      return bucket[index].get$_value();
+    },
+    $indexSet: function(_, key, value) {
+      var strings, nums;
+      if (typeof key === "string" && key !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          strings = P._LinkedHashMap__newHashTable();
+          this._strings = strings;
+        }
+        this._addHashTableEntry$3(strings, key, value);
+      } else if (typeof key === "number" && (key & 0x3ffffff) === key) {
+        nums = this._nums;
+        if (nums == null) {
+          nums = P._LinkedHashMap__newHashTable();
+          this._nums = nums;
+        }
+        this._addHashTableEntry$3(nums, key, value);
+      } else
+        this._set$2(key, value);
+    },
+    _set$2: function(key, value) {
+      var rest, hash, bucket, index;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashMap__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(key);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$2(key, value)];
+      else {
+        index = this._findBucketIndex$2(bucket, key);
+        if (index >= 0)
+          bucket[index].set$_value(value);
+        else
+          bucket.push(this._newLinkedCell$2(key, value));
+      }
+    },
+    putIfAbsent$2: function(key, ifAbsent) {
+      var value;
+      if (this.containsKey$1(key))
+        return this.$index(0, key);
+      value = ifAbsent.call$0();
+      this.$indexSet(0, key, value);
+      return value;
+    },
+    remove$1: function(_, key) {
+      if (typeof key === "string" && key !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, key);
+      else if (typeof key === "number" && (key & 0x3ffffff) === key)
+        return this._removeHashTableEntry$2(this._nums, key);
+      else
+        return this._remove$1(key);
+    },
+    _remove$1: function(key) {
+      var rest, bucket, index, cell;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(key)];
+      index = this._findBucketIndex$2(bucket, key);
+      if (index < 0)
+        return;
+      cell = bucket.splice(index, 1)[0];
+      this._unlinkCell$1(cell);
+      return cell.get$_value();
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$2(cell.get$_key(), cell.get$_value());
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    _addHashTableEntry$3: function(table, key, value) {
+      var cell = table[key];
+      if (cell == null)
+        table[key] = this._newLinkedCell$2(key, value);
+      else
+        cell.set$_value(value);
+    },
+    _removeHashTableEntry$2: function(table, key) {
+      var cell;
+      if (table == null)
+        return;
+      cell = table[key];
+      if (cell == null)
+        return;
+      this._unlinkCell$1(cell);
+      delete table[key];
+      return cell.get$_value();
+    },
+    _newLinkedCell$2: function(key, value) {
+      var cell, last;
+      cell = new P.LinkedHashMapCell(key, value, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(key) {
+      return J.get$hashCode$(key) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, key) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i].get$_key(), key))
+          return i;
+      return -1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isLinkedHashMap: true,
+    $isMap: true,
+    static: {_LinkedHashMap__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  _LinkedHashMap_values_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(each) {
+      return this.this_0.$index(0, each);
+    }, "call$1", null, 2, 0, null, 120, "call"],
+    $isFunction: true
+  },
+  _LinkedHashMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V0", args: [K, V]};
+      }, this.this_0, "_LinkedHashMap");
+    }
+  },
+  LinkedHashMapCell: {
+    "^": "Object;_key<,_value@,_next@,_previous@"
+  },
+  LinkedHashMapKeyIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._map._collection$_length === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P.LinkedHashMapKeyIterator(t1, t1._modifications, null, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._cell = t1._first;
+      return t2;
+    },
+    contains$1: function(_, element) {
+      return this._map.containsKey$1(element);
+    },
+    forEach$1: function(_, f) {
+      var t1, cell, modifications;
+      t1 = this._map;
+      cell = t1._first;
+      modifications = t1._modifications;
+      for (; cell != null;) {
+        f.call$1(cell.get$_key());
+        if (modifications !== t1._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(t1));
+        cell = cell.get$_next();
+      }
+    },
+    $isEfficientLength: true
+  },
+  LinkedHashMapKeyIterator: {
+    "^": "Object;_map,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._map;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_key();
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  _HashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_elements",
+    get$iterator: function(_) {
+      var t1 = new P.HashSetIterator(this, this._computeElements$0(), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        return strings == null ? false : strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        return nums == null ? false : nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.$index$asx(bucket, index);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._HashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [element];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(element);
+      }
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    addAll$1: function(_, objects) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(objects, objects.length, 0, null), [H.getTypeArgumentByIndex(objects, 0)]); t1.moveNext$0();)
+        this.add$1(0, t1._current);
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      --this._collection$_length;
+      this._elements = null;
+      bucket.splice(index, 1);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._elements = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+      }
+    },
+    _computeElements$0: function() {
+      var t1, result, strings, names, entries, index, i, nums, rest, bucket, $length, i0;
+      t1 = this._elements;
+      if (t1 != null)
+        return t1;
+      result = Array(this._collection$_length);
+      result.fixed$length = init;
+      strings = this._strings;
+      if (strings != null) {
+        names = Object.getOwnPropertyNames(strings);
+        entries = names.length;
+        for (index = 0, i = 0; i < entries; ++i) {
+          result[index] = names[i];
+          ++index;
+        }
+      } else
+        index = 0;
+      nums = this._nums;
+      if (nums != null) {
+        names = Object.getOwnPropertyNames(nums);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          result[index] = +names[i];
+          ++index;
+        }
+      }
+      rest = this._rest;
+      if (rest != null) {
+        names = Object.getOwnPropertyNames(rest);
+        entries = names.length;
+        for (i = 0; i < entries; ++i) {
+          bucket = rest[names[i]];
+          $length = bucket.length;
+          for (i0 = 0; i0 < $length; ++i0) {
+            result[index] = bucket[i0];
+            ++index;
+          }
+        }
+      }
+      this._elements = result;
+      return result;
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = 0;
+      ++this._collection$_length;
+      this._elements = null;
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      if (table != null && table[element] != null) {
+        delete table[element];
+        --this._collection$_length;
+        this._elements = null;
+        return true;
+      } else
+        return false;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(bucket[i], element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_HashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  HashSetIterator: {
+    "^": "Object;_set,_elements,_offset,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var elements, offset, t1;
+      elements = this._elements;
+      offset = this._offset;
+      t1 = this._set;
+      if (elements !== t1._elements)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else if (offset >= elements.length) {
+        this._collection$_current = null;
+        return false;
+      } else {
+        this._collection$_current = elements[offset];
+        this._offset = offset + 1;
+        return true;
+      }
+    }
+  },
+  _LinkedHashSet: {
+    "^": "_HashSetBase;_collection$_length,_strings,_nums,_rest,_first,_last,_modifications",
+    get$iterator: function(_) {
+      var t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(this, this._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    get$length: function(_) {
+      return this._collection$_length;
+    },
+    get$isEmpty: function(_) {
+      return this._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._collection$_length !== 0;
+    },
+    contains$1: function(_, object) {
+      var strings, nums;
+      if (typeof object === "string" && object !== "__proto__") {
+        strings = this._strings;
+        if (strings == null)
+          return false;
+        return strings[object] != null;
+      } else if (typeof object === "number" && (object & 0x3ffffff) === object) {
+        nums = this._nums;
+        if (nums == null)
+          return false;
+        return nums[object] != null;
+      } else
+        return this._contains$1(object);
+    },
+    _contains$1: function(object) {
+      var rest = this._rest;
+      if (rest == null)
+        return false;
+      return this._findBucketIndex$2(rest[this._computeHashCode$1(object)], object) >= 0;
+    },
+    lookup$1: function(object) {
+      var t1;
+      if (!(typeof object === "string" && object !== "__proto__"))
+        t1 = typeof object === "number" && (object & 0x3ffffff) === object;
+      else
+        t1 = true;
+      if (t1)
+        return this.contains$1(0, object) ? object : null;
+      else
+        return this._lookup$1(object);
+    },
+    _lookup$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return;
+      return J.get$_element$x(J.$index$asx(bucket, index));
+    },
+    forEach$1: function(_, action) {
+      var cell, modifications;
+      cell = this._first;
+      modifications = this._modifications;
+      for (; cell != null;) {
+        action.call$1(cell.get$_element(cell));
+        if (modifications !== this._modifications)
+          throw H.wrapException(P.ConcurrentModificationError$(this));
+        cell = cell.get$_next();
+      }
+    },
+    get$last: function(_) {
+      var t1 = this._last;
+      if (t1 == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    add$1: function(_, element) {
+      var strings, table, nums;
+      if (typeof element === "string" && element !== "__proto__") {
+        strings = this._strings;
+        if (strings == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._strings = table;
+          strings = table;
+        }
+        return this._addHashTableEntry$2(strings, element);
+      } else if (typeof element === "number" && (element & 0x3ffffff) === element) {
+        nums = this._nums;
+        if (nums == null) {
+          table = Object.create(null);
+          table["<non-identifier-key>"] = table;
+          delete table["<non-identifier-key>"];
+          this._nums = table;
+          nums = table;
+        }
+        return this._addHashTableEntry$2(nums, element);
+      } else
+        return this._add$1(0, element);
+    },
+    _add$1: function(_, element) {
+      var rest, hash, bucket;
+      rest = this._rest;
+      if (rest == null) {
+        rest = P._LinkedHashSet__newHashTable();
+        this._rest = rest;
+      }
+      hash = this._computeHashCode$1(element);
+      bucket = rest[hash];
+      if (bucket == null)
+        rest[hash] = [this._newLinkedCell$1(element)];
+      else {
+        if (this._findBucketIndex$2(bucket, element) >= 0)
+          return false;
+        bucket.push(this._newLinkedCell$1(element));
+      }
+      return true;
+    },
+    remove$1: function(_, object) {
+      if (typeof object === "string" && object !== "__proto__")
+        return this._removeHashTableEntry$2(this._strings, object);
+      else if (typeof object === "number" && (object & 0x3ffffff) === object)
+        return this._removeHashTableEntry$2(this._nums, object);
+      else
+        return this._remove$1(object);
+    },
+    _remove$1: function(object) {
+      var rest, bucket, index;
+      rest = this._rest;
+      if (rest == null)
+        return false;
+      bucket = rest[this._computeHashCode$1(object)];
+      index = this._findBucketIndex$2(bucket, object);
+      if (index < 0)
+        return false;
+      this._unlinkCell$1(bucket.splice(index, 1)[0]);
+      return true;
+    },
+    clear$0: function(_) {
+      if (this._collection$_length > 0) {
+        this._last = null;
+        this._first = null;
+        this._rest = null;
+        this._nums = null;
+        this._strings = null;
+        this._collection$_length = 0;
+        this._modifications = this._modifications + 1 & 67108863;
+      }
+    },
+    _addHashTableEntry$2: function(table, element) {
+      if (table[element] != null)
+        return false;
+      table[element] = this._newLinkedCell$1(element);
+      return true;
+    },
+    _removeHashTableEntry$2: function(table, element) {
+      var cell;
+      if (table == null)
+        return false;
+      cell = table[element];
+      if (cell == null)
+        return false;
+      this._unlinkCell$1(cell);
+      delete table[element];
+      return true;
+    },
+    _newLinkedCell$1: function(element) {
+      var cell, last;
+      cell = new P.LinkedHashSetCell(element, null, null);
+      if (this._first == null) {
+        this._last = cell;
+        this._first = cell;
+      } else {
+        last = this._last;
+        cell._previous = last;
+        last.set$_next(cell);
+        this._last = cell;
+      }
+      ++this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+      return cell;
+    },
+    _unlinkCell$1: function(cell) {
+      var previous, next;
+      previous = cell.get$_previous();
+      next = cell.get$_next();
+      if (previous == null)
+        this._first = next;
+      else
+        previous.set$_next(next);
+      if (next == null)
+        this._last = previous;
+      else
+        next.set$_previous(previous);
+      --this._collection$_length;
+      this._modifications = this._modifications + 1 & 67108863;
+    },
+    _computeHashCode$1: function(element) {
+      return J.get$hashCode$(element) & 0x3ffffff;
+    },
+    _findBucketIndex$2: function(bucket, element) {
+      var $length, i;
+      if (bucket == null)
+        return -1;
+      $length = bucket.length;
+      for (i = 0; i < $length; ++i)
+        if (J.$eq(J.get$_element$x(bucket[i]), element))
+          return i;
+      return -1;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_LinkedHashSet__newHashTable: function() {
+        var table = Object.create(null);
+        table["<non-identifier-key>"] = table;
+        delete table["<non-identifier-key>"];
+        return table;
+      }}
+  },
+  LinkedHashSetCell: {
+    "^": "Object;_element>,_next@,_previous@"
+  },
+  LinkedHashSetIterator: {
+    "^": "Object;_set,_modifications,_cell,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._set;
+      if (this._modifications !== t1._modifications)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      else {
+        t1 = this._cell;
+        if (t1 == null) {
+          this._collection$_current = null;
+          return false;
+        } else {
+          this._collection$_current = t1.get$_element(t1);
+          this._cell = this._cell.get$_next();
+          return true;
+        }
+      }
+    }
+  },
+  UnmodifiableListView: {
+    "^": "UnmodifiableListBase;_collection$_source",
+    get$length: function(_) {
+      return this._collection$_source.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._collection$_source;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _HashSetBase: {
+    "^": "SetBase;"
+  },
+  IterableBase: {
+    "^": "Object;",
+    map$1: [function(_, f) {
+      return H.MappedIterable_MappedIterable(this, f, H.getRuntimeTypeArgument(this, "IterableBase", 0), null);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E1", ret: P.Iterable, args: [{func: "dynamic__E1", args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    where$1: function(_, f) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0)]);
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getRuntimeTypeArgument(this, "IterableBase", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E0", ret: P.Iterable, args: [{func: "Iterable__E0", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "IterableBase");
+    }, 31],
+    contains$1: function(_, element) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (J.$eq(t1.get$current(), element))
+          return true;
+      return false;
+    },
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (f.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    toList$1$growable: function(_, growable) {
+      return P.List_List$from(this, growable, H.getRuntimeTypeArgument(this, "IterableBase", 0));
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    get$length: function(_) {
+      var it, count;
+      it = this.get$iterator(this);
+      for (count = 0; it.moveNext$0();)
+        ++count;
+      return count;
+    },
+    get$isEmpty: function(_) {
+      return !this.get$iterator(this).moveNext$0();
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$isEmpty(this) !== true;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    elementAt$1: function(_, index) {
+      var t1, remaining, element, t2;
+      if (typeof index !== "number" || Math.floor(index) !== index || index < 0)
+        throw H.wrapException(P.RangeError$value(index));
+      for (t1 = this.get$iterator(this), remaining = index; t1.moveNext$0();) {
+        element = t1.get$current();
+        t2 = J.getInterceptor(remaining);
+        if (t2.$eq(remaining, 0))
+          return element;
+        remaining = t2.$sub(remaining, 1);
+      }
+      throw H.wrapException(P.RangeError$value(index));
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToShortString(this, "(", ")");
+    },
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListBase: {
+    "^": "Object_ListMixin;"
+  },
+  Object_ListMixin: {
+    "^": "Object+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  ListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new H.ListIterator(receiver, this.get$length(receiver), 0, null), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    elementAt$1: function(receiver, index) {
+      return this.$index(receiver, index);
+    },
+    forEach$1: function(receiver, action) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        action.call$1(this.$index(receiver, i));
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+    },
+    get$isEmpty: function(receiver) {
+      return this.get$length(receiver) === 0;
+    },
+    get$isNotEmpty: function(receiver) {
+      return !this.get$isEmpty(receiver);
+    },
+    get$last: function(receiver) {
+      if (this.get$length(receiver) === 0)
+        throw H.wrapException(P.StateError$("No elements"));
+      return this.$index(receiver, this.get$length(receiver) - 1);
+    },
+    contains$1: function(receiver, element) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        if (J.$eq(this.$index(receiver, i), element))
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    any$1: function(receiver, test) {
+      var $length, i;
+      $length = this.get$length(receiver);
+      for (i = 0; i < $length; ++i) {
+        if (test.call$1(this.$index(receiver, i)) === true)
+          return true;
+        if ($length !== this.get$length(receiver))
+          throw H.wrapException(P.ConcurrentModificationError$(receiver));
+      }
+      return false;
+    },
+    join$1: function(receiver, separator) {
+      var buffer;
+      if (this.get$length(receiver) === 0)
+        return "";
+      buffer = P.StringBuffer$("");
+      buffer.writeAll$2(receiver, separator);
+      return buffer._contents;
+    },
+    where$1: function(receiver, test) {
+      return H.setRuntimeTypeInfo(new H.WhereIterable(receiver, test), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+    },
+    map$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(receiver, f), [null, null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E2", ret: P.Iterable, args: [{func: "dynamic__E2", args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    expand$1: [function(receiver, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(receiver, f), [H.getRuntimeTypeArgument(receiver, "ListMixin", 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E1", ret: P.Iterable, args: [{func: "Iterable__E1", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "ListMixin");
+    }, 31],
+    skip$1: function(receiver, count) {
+      return H.SubListIterable$(receiver, count, null, null);
+    },
+    toList$1$growable: function(receiver, growable) {
+      var result, t1, i;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(receiver));
+      } else {
+        t1 = Array(this.get$length(receiver));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getRuntimeTypeArgument(receiver, "ListMixin", 0)]);
+      }
+      for (i = 0; i < this.get$length(receiver); ++i) {
+        t1 = this.$index(receiver, i);
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = t1;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(receiver, element) {
+      var t1 = this.get$length(receiver);
+      this.set$length(receiver, t1 + 1);
+      this.$indexSet(receiver, t1, element);
+    },
+    addAll$1: function(receiver, iterable) {
+      var t1, element, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]); t1.moveNext$0();) {
+        element = t1._current;
+        t2 = this.get$length(receiver);
+        this.set$length(receiver, t2 + 1);
+        this.$indexSet(receiver, t2, element);
+      }
+    },
+    clear$0: function(receiver) {
+      this.set$length(receiver, 0);
+    },
+    sort$1: function(receiver, compare) {
+      if (compare == null)
+        compare = P.Comparable_compare$closure();
+      H.Sort__doSort(receiver, 0, this.get$length(receiver) - 1, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    _rangeCheck$2: function(receiver, start, end) {
+      var t1 = J.getInterceptor$n(start);
+      if (t1.$lt(start, 0) || t1.$gt(start, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(start, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor$n(end);
+      if (t1.$lt(end, start) || t1.$gt(end, this.get$length(receiver)))
+        throw H.wrapException(P.RangeError$range(end, start, this.get$length(receiver)));
+    },
+    getRange$2: function(receiver, start, end) {
+      this._rangeCheck$2(receiver, start, end);
+      return H.SubListIterable$(receiver, start, end, null);
+    },
+    removeRange$2: function(receiver, start, end) {
+      var $length;
+      this._rangeCheck$2(receiver, start, end);
+      $length = end - start;
+      this.setRange$4(receiver, start, this.get$length(receiver) - $length, receiver, end);
+      this.set$length(receiver, this.get$length(receiver) - $length);
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      var $length, t1, otherStart, otherList, i;
+      if (start < 0 || start > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(receiver)));
+      if (end < start || end > this.get$length(receiver))
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(receiver)));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList) {
+        otherStart = skipCount;
+        otherList = iterable;
+      } else {
+        otherList = t1.skip$1(iterable, skipCount).toList$1$growable(0, false);
+        otherStart = 0;
+      }
+      t1 = J.getInterceptor$asx(otherList);
+      if (otherStart + $length > t1.get$length(otherList))
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (otherStart < start)
+        for (i = $length - 1; i >= 0; --i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+      else
+        for (i = 0; i < $length; ++i)
+          this.$indexSet(receiver, start + i, t1.$index(otherList, otherStart + i));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    indexOf$2: function(receiver, element, startIndex) {
+      var i;
+      if (startIndex >= this.get$length(receiver))
+        return -1;
+      for (i = startIndex; i < this.get$length(receiver); ++i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(receiver, element, startIndex) {
+      var i;
+      startIndex = this.get$length(receiver) - 1;
+      for (i = startIndex; i >= 0; --i)
+        if (J.$eq(this.$index(receiver, i), element))
+          return i;
+      return -1;
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(receiver, index, element) {
+      if (index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      if (index === this.get$length(receiver)) {
+        this.add$1(receiver, element);
+        return;
+      }
+      this.set$length(receiver, this.get$length(receiver) + 1);
+      this.setRange$4(receiver, index + 1, this.get$length(receiver), receiver, index);
+      this.$indexSet(receiver, index, element);
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      var t1, insertionLength;
+      if (index < 0 || index > this.get$length(receiver))
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(receiver)));
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isEfficientLength)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      this.set$length(receiver, this.get$length(receiver) + insertionLength);
+      this.setRange$4(receiver, index + insertionLength, this.get$length(receiver), receiver, index);
+      this.setAll$2(receiver, index, iterable);
+    },
+    setAll$2: function(receiver, index, iterable) {
+      var t1, index0;
+      t1 = J.getInterceptor(iterable);
+      if (!!t1.$isList)
+        this.setRange$3(receiver, index, index + t1.get$length(iterable), iterable);
+      else
+        for (t1 = t1.get$iterator(iterable); t1.moveNext$0(); index = index0) {
+          index0 = index + 1;
+          this.$indexSet(receiver, index, t1.get$current());
+        }
+    },
+    toString$0: function(receiver) {
+      return P.IterableBase_iterableToFullString(receiver, "[", "]");
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  Maps_mapToString_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(k, v) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1(", ");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(k);
+      t1.write$1(": ");
+      t1.write$1(v);
+    },
+    $isFunction: true
+  },
+  ListQueue: {
+    "^": "IterableBase;_collection$_table,_head,_tail,_modificationCount",
+    get$iterator: function(_) {
+      var t1 = new P._ListQueueIterator(this, this._tail, this._modificationCount, this._head, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    forEach$1: function(_, action) {
+      var modificationCount, i, t1;
+      modificationCount = this._modificationCount;
+      for (i = this._head; i !== this._tail; i = (i + 1 & this._collection$_table.length - 1) >>> 0) {
+        t1 = this._collection$_table;
+        if (i < 0 || i >= t1.length)
+          return H.ioore(t1, i);
+        action.call$1(t1[i]);
+        if (modificationCount !== this._modificationCount)
+          H.throwExpression(P.ConcurrentModificationError$(this));
+      }
+    },
+    get$isEmpty: function(_) {
+      return this._head === this._tail;
+    },
+    get$length: function(_) {
+      return (this._tail - this._head & this._collection$_table.length - 1) >>> 0;
+    },
+    get$last: function(_) {
+      var t1, t2, t3;
+      t1 = this._head;
+      t2 = this._tail;
+      if (t1 === t2)
+        throw H.wrapException(H.IterableElementError_noElement());
+      t1 = this._collection$_table;
+      t3 = t1.length;
+      t2 = (t2 - 1 & t3 - 1) >>> 0;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    toList$1$growable: function(_, growable) {
+      var list, t1;
+      if (growable) {
+        list = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(list, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        list = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      this._writeToList$1(list);
+      return list;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    add$1: function(_, element) {
+      this._add$1(0, element);
+    },
+    addAll$1: function(_, elements) {
+      var addCount, $length, t1, t2, t3, newCapacity, newTable, endSpace, preSpace;
+      addCount = elements.length;
+      $length = this.get$length(this);
+      t1 = $length + addCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3) {
+        newCapacity = P.ListQueue__nextPowerOf2(t1);
+        if (typeof newCapacity !== "number")
+          return H.iae(newCapacity);
+        t2 = Array(newCapacity);
+        t2.fixed$length = init;
+        newTable = H.setRuntimeTypeInfo(t2, [H.getTypeArgumentByIndex(this, 0)]);
+        this._tail = this._writeToList$1(newTable);
+        this._collection$_table = newTable;
+        this._head = 0;
+        H.IterableMixinWorkaround_setRangeList(newTable, $length, t1, elements, 0);
+        this._tail += addCount;
+      } else {
+        t1 = this._tail;
+        endSpace = t3 - t1;
+        if (addCount < endSpace) {
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + addCount, elements, 0);
+          this._tail += addCount;
+        } else {
+          preSpace = addCount - endSpace;
+          H.IterableMixinWorkaround_setRangeList(t2, t1, t1 + endSpace, elements, 0);
+          t1 = this._collection$_table;
+          H.IterableMixinWorkaround_setRangeList(t1, 0, preSpace, elements, endSpace);
+          this._tail = preSpace;
+        }
+      }
+      ++this._modificationCount;
+    },
+    clear$0: function(_) {
+      var i, t1, t2, t3, t4;
+      i = this._head;
+      t1 = this._tail;
+      if (i !== t1) {
+        for (t2 = this._collection$_table, t3 = t2.length, t4 = t3 - 1; i !== t1; i = (i + 1 & t4) >>> 0) {
+          if (i < 0 || i >= t3)
+            return H.ioore(t2, i);
+          t2[i] = null;
+        }
+        this._tail = 0;
+        this._head = 0;
+        ++this._modificationCount;
+      }
+    },
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    removeFirst$0: function() {
+      var t1, t2, t3, result;
+      t1 = this._head;
+      if (t1 === this._tail)
+        throw H.wrapException(H.IterableElementError_noElement());
+      ++this._modificationCount;
+      t2 = this._collection$_table;
+      t3 = t2.length;
+      if (t1 >= t3)
+        return H.ioore(t2, t1);
+      result = t2[t1];
+      t2[t1] = null;
+      this._head = (t1 + 1 & t3 - 1) >>> 0;
+      return result;
+    },
+    _add$1: function(_, element) {
+      var t1, t2, t3;
+      t1 = this._collection$_table;
+      t2 = this._tail;
+      t3 = t1.length;
+      if (t2 < 0 || t2 >= t3)
+        return H.ioore(t1, t2);
+      t1[t2] = element;
+      t3 = (t2 + 1 & t3 - 1) >>> 0;
+      this._tail = t3;
+      if (this._head === t3)
+        this._grow$0();
+      ++this._modificationCount;
+    },
+    _grow$0: function() {
+      var t1, newTable, t2, split;
+      t1 = Array(this._collection$_table.length * 2);
+      t1.fixed$length = init;
+      newTable = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      t1 = this._collection$_table;
+      t2 = this._head;
+      split = t1.length - t2;
+      H.IterableMixinWorkaround_setRangeList(newTable, 0, split, t1, t2);
+      t1 = this._head;
+      t2 = this._collection$_table;
+      H.IterableMixinWorkaround_setRangeList(newTable, split, split + t1, t2, 0);
+      this._head = 0;
+      this._tail = this._collection$_table.length;
+      this._collection$_table = newTable;
+    },
+    _writeToList$1: function(target) {
+      var t1, t2, t3, $length, firstPartSize;
+      t1 = this._head;
+      t2 = this._tail;
+      t3 = this._collection$_table;
+      if (t1 <= t2) {
+        $length = t2 - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, $length, t3, t1);
+        return $length;
+      } else {
+        firstPartSize = t3.length - t1;
+        H.IterableMixinWorkaround_setRangeList(target, 0, firstPartSize, t3, t1);
+        t1 = this._tail;
+        t2 = this._collection$_table;
+        H.IterableMixinWorkaround_setRangeList(target, firstPartSize, firstPartSize + t1, t2, 0);
+        return this._tail + firstPartSize;
+      }
+    },
+    ListQueue$1: function(initialCapacity, $E) {
+      var t1 = Array(8);
+      t1.fixed$length = init;
+      this._collection$_table = H.setRuntimeTypeInfo(t1, [$E]);
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {"^": "ListQueue__INITIAL_CAPACITY", ListQueue__nextPowerOf2: function(number) {
+        var nextNumber;
+        if (typeof number !== "number")
+          return number.$shl();
+        number = (number << 2 >>> 0) - 1;
+        for (; true; number = nextNumber) {
+          nextNumber = (number & number - 1) >>> 0;
+          if (nextNumber === 0)
+            return number;
+        }
+      }}
+  },
+  _ListQueueIterator: {
+    "^": "Object;_queue,_end,_modificationCount,_collection$_position,_collection$_current",
+    get$current: function() {
+      return this._collection$_current;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._queue;
+      if (this._modificationCount !== t1._modificationCount)
+        H.throwExpression(P.ConcurrentModificationError$(t1));
+      t2 = this._collection$_position;
+      if (t2 === this._end) {
+        this._collection$_current = null;
+        return false;
+      }
+      t1 = t1._collection$_table;
+      t3 = t1.length;
+      if (t2 >= t3)
+        return H.ioore(t1, t2);
+      this._collection$_current = t1[t2];
+      this._collection$_position = (t2 + 1 & t3 - 1) >>> 0;
+      return true;
+    }
+  },
+  SetMixin: {
+    "^": "Object;",
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    clear$0: function(_) {
+      this.removeAll$1(this.toList$0(0));
+    },
+    addAll$1: function(_, elements) {
+      var t1;
+      for (t1 = J.get$iterator$ax(elements); t1.moveNext$0();)
+        this.add$1(0, t1.get$current());
+    },
+    removeAll$1: function(elements) {
+      var t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(elements, elements.length, 0, null), [H.getTypeArgumentByIndex(elements, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    toList$1$growable: function(_, growable) {
+      var result, t1, i, element, i0;
+      if (growable) {
+        result = H.setRuntimeTypeInfo([], [H.getTypeArgumentByIndex(this, 0)]);
+        C.JSArray_methods.set$length(result, this.get$length(this));
+      } else {
+        t1 = Array(this.get$length(this));
+        t1.fixed$length = init;
+        result = H.setRuntimeTypeInfo(t1, [H.getTypeArgumentByIndex(this, 0)]);
+      }
+      for (t1 = this.get$iterator(this), i = 0; t1.moveNext$0(); i = i0) {
+        element = t1.get$current();
+        i0 = i + 1;
+        if (i >= result.length)
+          return H.ioore(result, i);
+        result[i] = element;
+      }
+      return result;
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    map$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$map", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__dynamic__E3", ret: P.Iterable, args: [{func: "dynamic__E3", args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    toString$0: function(_) {
+      return P.IterableBase_iterableToFullString(this, "{", "}");
+    },
+    where$1: function(_, f) {
+      var t1 = new H.WhereIterable(this, f);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    expand$1: [function(_, f) {
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(this, f), [H.getTypeArgumentByIndex(this, 0), null]);
+    }, "call$1", "get$expand", 2, 0, function() {
+      return H.computeSignature(function(E) {
+        return {func: "Iterable__Iterable__E2", ret: P.Iterable, args: [{func: "Iterable__E2", ret: P.Iterable, args: [E]}]};
+      }, this.$receiver, "SetMixin");
+    }, 31],
+    forEach$1: function(_, f) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        f.call$1(t1.get$current());
+    },
+    join$1: function(_, separator) {
+      var iterator, buffer, t1;
+      iterator = this.get$iterator(this);
+      if (!iterator.moveNext$0())
+        return "";
+      buffer = P.StringBuffer$("");
+      if (separator === "")
+        do {
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        } while (iterator.moveNext$0());
+      else {
+        buffer.write$1(H.S(iterator.get$current()));
+        for (; iterator.moveNext$0();) {
+          buffer._contents += separator;
+          t1 = H.S(iterator.get$current());
+          buffer._contents += t1;
+        }
+      }
+      return buffer._contents;
+    },
+    any$1: function(_, test) {
+      var t1;
+      for (t1 = this.get$iterator(this); t1.moveNext$0();)
+        if (test.call$1(t1.get$current()) === true)
+          return true;
+      return false;
+    },
+    get$last: function(_) {
+      var it, result;
+      it = this.get$iterator(this);
+      if (!it.moveNext$0())
+        throw H.wrapException(H.IterableElementError_noElement());
+      do
+        result = it.get$current();
+      while (it.moveNext$0());
+      return result;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  SetBase: {
+    "^": "SetMixin;"
+  },
+  _SplayTreeNode: {
+    "^": "Object;key>,left>,right>",
+    $is_SplayTreeNode: true
+  },
+  _SplayTreeMapNode: {
+    "^": "_SplayTreeNode;value*,key,left,right",
+    $as_SplayTreeNode: function($K, $V) {
+      return [$K];
+    }
+  },
+  _SplayTree: {
+    "^": "Object;",
+    _splay$1: function(key) {
+      var current, left, right, left0, comp, t1, tmp, current0;
+      current = this._root;
+      if (current == null)
+        return -1;
+      left = this._dummy;
+      for (right = left, left0 = right, comp = null; true;) {
+        comp = this._compare$2(current.key, key);
+        t1 = J.getInterceptor$n(comp);
+        if (t1.$gt(comp, 0)) {
+          t1 = current.left;
+          if (t1 == null)
+            break;
+          comp = this._compare$2(t1.key, key);
+          if (J.$gt$n(comp, 0)) {
+            tmp = current.left;
+            current.left = tmp.right;
+            tmp.right = current;
+            if (tmp.left == null) {
+              current = tmp;
+              break;
+            }
+            current = tmp;
+          }
+          right.left = current;
+          current0 = current.left;
+          right = current;
+          current = current0;
+        } else {
+          if (t1.$lt(comp, 0)) {
+            t1 = current.right;
+            if (t1 == null)
+              break;
+            comp = this._compare$2(t1.key, key);
+            if (J.$lt$n(comp, 0)) {
+              tmp = current.right;
+              current.right = tmp.left;
+              tmp.left = current;
+              if (tmp.right == null) {
+                current = tmp;
+                break;
+              }
+              current = tmp;
+            }
+            left0.right = current;
+            current0 = current.right;
+          } else
+            break;
+          left0 = current;
+          current = current0;
+        }
+      }
+      left0.right = current.left;
+      right.left = current.right;
+      current.left = left.right;
+      current.right = left.left;
+      this._root = current;
+      left.right = null;
+      left.left = null;
+      ++this._splayCount;
+      return comp;
+    },
+    _addNewRoot$2: function(node, comp) {
+      var t1, t2;
+      ++this._count;
+      ++this._modificationCount;
+      if (this._root == null) {
+        this._root = node;
+        return;
+      }
+      t1 = J.$lt$n(comp, 0);
+      t2 = this._root;
+      if (t1) {
+        node.left = t2;
+        node.right = t2.right;
+        t2.right = null;
+      } else {
+        node.right = t2;
+        node.left = t2.left;
+        t2.left = null;
+      }
+      this._root = node;
+    }
+  },
+  SplayTreeMap: {
+    "^": "_SplayTree;_comparator,_validKey,_root,_dummy,_count,_modificationCount,_splayCount",
+    _comparator$2: function(arg0, arg1) {
+      return this._comparator.call$2(arg0, arg1);
+    },
+    _validKey$1: function(arg0) {
+      return this._validKey.call$1(arg0);
+    },
+    _compare$2: function(key1, key2) {
+      return this._comparator$2(key1, key2);
+    },
+    $index: function(_, key) {
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      if (this._validKey$1(key) !== true)
+        return;
+      if (this._root != null)
+        if (J.$eq(this._splay$1(key), 0))
+          return this._root.value;
+      return;
+    },
+    $indexSet: function(_, key, value) {
+      var comp;
+      if (key == null)
+        throw H.wrapException(P.ArgumentError$(key));
+      comp = this._splay$1(key);
+      if (J.$eq(comp, 0)) {
+        this._root.value = value;
+        return;
+      }
+      this._addNewRoot$2(H.setRuntimeTypeInfo(new P._SplayTreeMapNode(value, key, null, null), [null, null]), comp);
+    },
+    addAll$1: function(_, other) {
+      H.IterableMixinWorkaround_forEach(other, new P.SplayTreeMap_addAll_closure(this));
+    },
+    get$isEmpty: function(_) {
+      return this._root == null;
+    },
+    get$isNotEmpty: function(_) {
+      return this._root != null;
+    },
+    forEach$1: function(_, f) {
+      var t1, nodes, node;
+      t1 = H.getTypeArgumentByIndex(this, 0);
+      nodes = H.setRuntimeTypeInfo(new P._SplayTreeNodeIterator(this, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), this._modificationCount, this._splayCount, null), [t1]);
+      nodes._SplayTreeIterator$1(this, [P._SplayTreeNode, t1]);
+      for (; nodes.moveNext$0();) {
+        node = nodes.get$current();
+        t1 = J.getInterceptor$x(node);
+        f.call$2(t1.get$key(node), t1.get$value(node));
+      }
+    },
+    get$length: function(_) {
+      return this._count;
+    },
+    clear$0: function(_) {
+      this._root = null;
+      this._count = 0;
+      ++this._modificationCount;
+    },
+    get$keys: function() {
+      return H.setRuntimeTypeInfo(new P._SplayTreeKeyIterable(this), [H.getTypeArgumentByIndex(this, 0)]);
+    },
+    get$values: function(_) {
+      var t1 = new P._SplayTreeValueIterable(this);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    $isSplayTreeMap: true,
+    $as_SplayTree: function($K, $V) {
+      return [$K];
+    },
+    $asMap: null,
+    $isMap: true,
+    static: {SplayTreeMap$: function(compare, isValidKey, $K, $V) {
+        var t1, t2;
+        t1 = P.Comparable_compare$closure();
+        t2 = new P.SplayTreeMap_closure($K);
+        return H.setRuntimeTypeInfo(new P.SplayTreeMap(t1, t2, null, H.setRuntimeTypeInfo(new P._SplayTreeNode(null, null, null), [$K]), 0, 0, 0), [$K, $V]);
+      }}
+  },
+  SplayTreeMap_closure: {
+    "^": "Closure:13;K_0",
+    call$1: function(v) {
+      var t1 = H.checkSubtypeOfRuntimeType(v, this.K_0);
+      return t1;
+    },
+    $isFunction: true
+  },
+  SplayTreeMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    },
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V1", args: [K, V]};
+      }, this.this_0, "SplayTreeMap");
+    }
+  },
+  _SplayTreeIterator: {
+    "^": "Object;",
+    get$current: function() {
+      var t1 = this._currentNode;
+      if (t1 == null)
+        return;
+      return this._getValue$1(t1);
+    },
+    _findLeftMostDescendent$1: function(node) {
+      var t1;
+      for (t1 = this._workList; node != null;) {
+        t1.push(node);
+        node = node.left;
+      }
+    },
+    moveNext$0: function() {
+      var t1, t2, t3;
+      t1 = this._tree;
+      if (this._modificationCount !== t1._modificationCount)
+        throw H.wrapException(P.ConcurrentModificationError$(t1));
+      t2 = this._workList;
+      if (t2.length === 0) {
+        this._currentNode = null;
+        return false;
+      }
+      if (t1._splayCount !== this._splayCount && this._currentNode != null) {
+        t3 = this._currentNode;
+        C.JSArray_methods.set$length(t2, 0);
+        if (t3 == null)
+          this._findLeftMostDescendent$1(t1._root);
+        else {
+          t1._splay$1(t3.key);
+          this._findLeftMostDescendent$1(t1._root.right);
+        }
+      }
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t1 = t2.pop();
+      this._currentNode = t1;
+      this._findLeftMostDescendent$1(t1.right);
+      return true;
+    },
+    _SplayTreeIterator$1: function(tree, $T) {
+      this._findLeftMostDescendent$1(tree._root);
+    }
+  },
+  _SplayTreeKeyIterable: {
+    "^": "IterableBase;_tree",
+    get$length: function(_) {
+      return this._tree._count;
+    },
+    get$isEmpty: function(_) {
+      return this._tree._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._tree;
+      t2 = new P._SplayTreeKeyIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 0));
+      return t2;
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeValueIterable: {
+    "^": "IterableBase;_map",
+    get$length: function(_) {
+      return this._map._count;
+    },
+    get$isEmpty: function(_) {
+      return this._map._count === 0;
+    },
+    get$iterator: function(_) {
+      var t1, t2;
+      t1 = this._map;
+      t2 = new P._SplayTreeValueIterator(t1, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t1._modificationCount, t1._splayCount, null);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      t2._SplayTreeIterator$1(t1, H.getTypeArgumentByIndex(this, 1));
+      return t2;
+    },
+    $asIterableBase: function($K, $V) {
+      return [$V];
+    },
+    $asIterable: function($K, $V) {
+      return [$V];
+    },
+    $isEfficientLength: true
+  },
+  _SplayTreeKeyIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.key;
+    }
+  },
+  _SplayTreeValueIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node.value;
+    },
+    $as_SplayTreeIterator: function($K, $V) {
+      return [$V];
+    }
+  },
+  _SplayTreeNodeIterator: {
+    "^": "_SplayTreeIterator;_tree,_workList,_modificationCount,_splayCount,_currentNode",
+    _getValue$1: function(node) {
+      return node;
+    },
+    $as_SplayTreeIterator: function($K) {
+      return [[P._SplayTreeNode, $K]];
+    }
+  }
+}],
+["dart.convert", "dart:convert", , P, {
+  "^": "",
+  _convertJsonToDart: function(json, reviver) {
+    var revive = reviver == null ? new P._convertJsonToDart_closure() : reviver;
+    return revive.call$2(null, new P._convertJsonToDart_walk(revive).call$1(json));
+  },
+  _parseJson: function(source, reviver) {
+    var parsed, e, t1, exception;
+    t1 = source;
+    if (typeof t1 !== "string")
+      throw H.wrapException(P.ArgumentError$(source));
+    parsed = null;
+    try {
+      parsed = JSON.parse(source);
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      e = t1;
+      throw H.wrapException(P.FormatException$(String(e)));
+    }
+
+    return P._convertJsonToDart(parsed, reviver);
+  },
+  _defaultToEncodable: [function(object) {
+    return object.toJson$0();
+  }, "call$1", "_defaultToEncodable$closure", 2, 0, 49, 50],
+  _convertJsonToDart_closure: {
+    "^": "Closure:75;",
+    call$2: function(key, value) {
+      return value;
+    },
+    $isFunction: true
+  },
+  _convertJsonToDart_walk: {
+    "^": "Closure:13;revive_0",
+    call$1: function(e) {
+      var list, t1, i, keys, map, key, proto;
+      if (e == null || typeof e != "object")
+        return e;
+      if (Object.getPrototypeOf(e) === Array.prototype) {
+        list = e;
+        for (t1 = this.revive_0, i = 0; i < list.length; ++i)
+          list[i] = t1.call$2(i, this.call$1(list[i]));
+        return list;
+      }
+      keys = Object.keys(e);
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = this.revive_0, i = 0; i < keys.length; ++i) {
+        key = keys[i];
+        map.$indexSet(0, key, t1.call$2(key, this.call$1(e[key])));
+      }
+      proto = e.__proto__;
+      if (typeof proto !== "undefined" && proto !== Object.prototype)
+        map.$indexSet(0, "__proto__", t1.call$2("__proto__", this.call$1(proto)));
+      return map;
+    },
+    $isFunction: true
+  },
+  Codec: {
+    "^": "Object;"
+  },
+  Converter: {
+    "^": "Object;"
+  },
+  Encoding: {
+    "^": "Codec;",
+    $asCodec: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  JsonUnsupportedObjectError: {
+    "^": "Error;unsupportedObject,cause",
+    toString$0: function(_) {
+      if (this.cause != null)
+        return "Converting object to an encodable object failed.";
+      else
+        return "Converting object did not return an encodable object.";
+    },
+    static: {JsonUnsupportedObjectError$: function(unsupportedObject, cause) {
+        return new P.JsonUnsupportedObjectError(unsupportedObject, cause);
+      }}
+  },
+  JsonCyclicError: {
+    "^": "JsonUnsupportedObjectError;unsupportedObject,cause",
+    toString$0: function(_) {
+      return "Cyclic error in JSON stringify";
+    },
+    static: {JsonCyclicError$: function(object) {
+        return new P.JsonCyclicError(object, null);
+      }}
+  },
+  JsonCodec: {
+    "^": "Codec;_reviver<,_toEncodable",
+    decode$2$reviver: function(source, reviver) {
+      return P._parseJson(source, this.get$decoder()._reviver);
+    },
+    decode$1: function(source) {
+      return this.decode$2$reviver(source, null);
+    },
+    encode$2$toEncodable: function(value, toEncodable) {
+      var t1 = this.get$encoder();
+      return P._JsonStringifier_stringify(value, t1._toEncodableFunction, t1.indent);
+    },
+    encode$1: function(value) {
+      return this.encode$2$toEncodable(value, null);
+    },
+    get$encoder: function() {
+      return C.JsonEncoder_null_null;
+    },
+    get$decoder: function() {
+      return C.JsonDecoder_null;
+    },
+    $asCodec: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonEncoder: {
+    "^": "Converter;indent,_toEncodableFunction",
+    $asConverter: function() {
+      return [P.Object, P.String];
+    }
+  },
+  JsonDecoder: {
+    "^": "Converter;_reviver<",
+    $asConverter: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _JsonStringifier: {
+    "^": "Object;_toEncodable,_sink,_convert$_seen",
+    _toEncodable$1: function(arg0) {
+      return this._toEncodable.call$1(arg0);
+    },
+    escape$1: function(s) {
+      var t1, $length, t2, offset, i, charCode, t3;
+      t1 = J.getInterceptor$asx(s);
+      $length = t1.get$length(s);
+      if (typeof $length !== "number")
+        return H.iae($length);
+      t2 = this._sink;
+      offset = 0;
+      i = 0;
+      for (; i < $length; ++i) {
+        charCode = t1.codeUnitAt$1(s, i);
+        if (charCode > 92)
+          continue;
+        if (charCode < 32) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          switch (charCode) {
+            case 8:
+              t3 = H.Primitives_stringFromCharCode(98);
+              t2._contents += t3;
+              break;
+            case 9:
+              t3 = H.Primitives_stringFromCharCode(116);
+              t2._contents += t3;
+              break;
+            case 10:
+              t3 = H.Primitives_stringFromCharCode(110);
+              t2._contents += t3;
+              break;
+            case 12:
+              t3 = H.Primitives_stringFromCharCode(102);
+              t2._contents += t3;
+              break;
+            case 13:
+              t3 = H.Primitives_stringFromCharCode(114);
+              t2._contents += t3;
+              break;
+            default:
+              t3 = H.Primitives_stringFromCharCode(117);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = H.Primitives_stringFromCharCode(48);
+              t2._contents += t3;
+              t3 = charCode >>> 4 & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              t3 = charCode & 15;
+              t3 = H.Primitives_stringFromCharCode(t3 < 10 ? 48 + t3 : 87 + t3);
+              t2._contents += t3;
+              break;
+          }
+        } else if (charCode === 34 || charCode === 92) {
+          if (i > offset) {
+            t3 = t1.substring$2(s, offset, i);
+            t2._contents += t3;
+          }
+          offset = i + 1;
+          t3 = H.Primitives_stringFromCharCode(92);
+          t2._contents += t3;
+          t3 = H.Primitives_stringFromCharCode(charCode);
+          t2._contents += t3;
+        }
+      }
+      if (offset === 0)
+        t2._contents += typeof s === "string" ? s : H.S(s);
+      else if (offset < $length) {
+        t1 = t1.substring$2(s, offset, $length);
+        t2._contents += t1;
+      }
+    },
+    checkCycle$1: function(object) {
+      var t1, t2, i, t3;
+      for (t1 = this._convert$_seen, t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = t1[i];
+        if (object == null ? t3 == null : object === t3)
+          throw H.wrapException(P.JsonCyclicError$(object));
+      }
+      t1.push(object);
+    },
+    stringifyValue$1: function(object) {
+      var customJson, e, t1, exception;
+      if (!this.stringifyJsonValue$1(object)) {
+        this.checkCycle$1(object);
+        try {
+          customJson = this._toEncodable$1(object);
+          if (!this.stringifyJsonValue$1(customJson)) {
+            t1 = P.JsonUnsupportedObjectError$(object, null);
+            throw H.wrapException(t1);
+          }
+          t1 = this._convert$_seen;
+          if (0 >= t1.length)
+            return H.ioore(t1, 0);
+          t1.pop();
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          throw H.wrapException(P.JsonUnsupportedObjectError$(object, e));
+        }
+
+      }
+    },
+    stringifyJsonValue$1: function(object) {
+      var t1, t2, i, t3, separator, key;
+      if (typeof object === "number") {
+        if (!C.JSNumber_methods.get$isFinite(object))
+          return false;
+        this._sink.write$1(C.JSNumber_methods.toString$0(object));
+        return true;
+      } else if (object === true) {
+        this._sink.write$1("true");
+        return true;
+      } else if (object === false) {
+        this._sink.write$1("false");
+        return true;
+      } else if (object == null) {
+        this._sink.write$1("null");
+        return true;
+      } else if (typeof object === "string") {
+        t1 = this._sink;
+        t1.write$1("\"");
+        this.escape$1(object);
+        t1.write$1("\"");
+        return true;
+      } else {
+        t1 = J.getInterceptor(object);
+        if (!!t1.$isList) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("[");
+          if (t1.get$length(object) > 0) {
+            this.stringifyValue$1(t1.$index(object, 0));
+            for (i = 1; i < t1.get$length(object); ++i) {
+              t2._contents += ",";
+              this.stringifyValue$1(t1.$index(object, i));
+            }
+          }
+          t2.write$1("]");
+          this._removeSeen$1(object);
+          return true;
+        } else if (!!t1.$isMap) {
+          this.checkCycle$1(object);
+          t2 = this._sink;
+          t2.write$1("{");
+          for (t3 = J.get$iterator$ax(object.get$keys()), separator = "\""; t3.moveNext$0(); separator = ",\"") {
+            key = t3.get$current();
+            t2._contents += separator;
+            this.escape$1(key);
+            t2._contents += "\":";
+            this.stringifyValue$1(t1.$index(object, key));
+          }
+          t2.write$1("}");
+          this._removeSeen$1(object);
+          return true;
+        } else
+          return false;
+      }
+    },
+    _removeSeen$1: function(object) {
+      var t1 = this._convert$_seen;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1.pop();
+    },
+    static: {"^": "_JsonStringifier_BACKSPACE,_JsonStringifier_TAB,_JsonStringifier_NEWLINE,_JsonStringifier_CARRIAGE_RETURN,_JsonStringifier_FORM_FEED,_JsonStringifier_QUOTE,_JsonStringifier_CHAR_0,_JsonStringifier_BACKSLASH,_JsonStringifier_CHAR_b,_JsonStringifier_CHAR_f,_JsonStringifier_CHAR_n,_JsonStringifier_CHAR_r,_JsonStringifier_CHAR_t,_JsonStringifier_CHAR_u", _JsonStringifier__JsonStringifier: function(sink, toEncodable, indent) {
+        return new P._JsonStringifier(toEncodable, sink, []);
+      }, _JsonStringifier_stringify: function(object, toEncodable, indent) {
+        var output;
+        toEncodable = P._defaultToEncodable$closure();
+        output = P.StringBuffer$("");
+        P._JsonStringifier__JsonStringifier(output, toEncodable, indent).stringifyValue$1(object);
+        return output._contents;
+      }}
+  },
+  Utf8Codec: {
+    "^": "Encoding;_allowMalformed",
+    get$name: function(_) {
+      return "utf-8";
+    },
+    get$encoder: function() {
+      return new P.Utf8Encoder();
+    }
+  },
+  Utf8Encoder: {
+    "^": "Converter;",
+    convert$1: function(string) {
+      var t1, t2, encoder;
+      t1 = J.getInterceptor$asx(string);
+      t2 = J.$mul$ns(t1.get$length(string), 3);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = H.setRuntimeTypeInfo(Array(t2), [P.$int]);
+      encoder = new P._Utf8Encoder(0, 0, t2);
+      if (encoder._fillBuffer$3(string, 0, t1.get$length(string)) !== t1.get$length(string))
+        encoder._writeSurrogate$2(t1.codeUnitAt$1(string, J.$sub$n(t1.get$length(string), 1)), 0);
+      return C.JSArray_methods.sublist$2(t2, 0, encoder._bufferIndex);
+    },
+    $asConverter: function() {
+      return [P.String, [P.List, P.$int]];
+    }
+  },
+  _Utf8Encoder: {
+    "^": "Object;_carry,_bufferIndex,_buffer",
+    _writeSurrogate$2: function(leadingSurrogate, nextCodeUnit) {
+      var t1, t2, rune, t3, t4;
+      t1 = this._buffer;
+      t2 = this._bufferIndex;
+      if ((nextCodeUnit & 64512) === 56320) {
+        rune = 65536 + ((leadingSurrogate & 1023) << 10 >>> 0) | nextCodeUnit & 1023;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = (240 | rune >>> 18) >>> 0;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune >>> 12 & 63;
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | rune >>> 6 & 63;
+        this._bufferIndex = t3 + 1;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | rune & 63;
+        return true;
+      } else {
+        t3 = t2 + 1;
+        this._bufferIndex = t3;
+        t4 = t1.length;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 224 | leadingSurrogate >>> 12;
+        t2 = t3 + 1;
+        this._bufferIndex = t2;
+        if (t3 >= t4)
+          return H.ioore(t1, t3);
+        t1[t3] = 128 | leadingSurrogate >>> 6 & 63;
+        this._bufferIndex = t2 + 1;
+        if (t2 >= t4)
+          return H.ioore(t1, t2);
+        t1[t2] = 128 | leadingSurrogate & 63;
+        return false;
+      }
+    },
+    _fillBuffer$3: function(str, start, end) {
+      var t1, t2, t3, stringIndex, codeUnit, t4, stringIndex0, t5;
+      if (start !== end && (J.codeUnitAt$1$s(str, J.$sub$n(end, 1)) & 64512) === 55296)
+        end = J.$sub$n(end, 1);
+      if (typeof end !== "number")
+        return H.iae(end);
+      t1 = this._buffer;
+      t2 = t1.length;
+      t3 = J.getInterceptor$s(str);
+      stringIndex = start;
+      for (; stringIndex < end; ++stringIndex) {
+        codeUnit = t3.codeUnitAt$1(str, stringIndex);
+        if (codeUnit <= 127) {
+          t4 = this._bufferIndex;
+          if (t4 >= t2)
+            break;
+          this._bufferIndex = t4 + 1;
+          t1[t4] = codeUnit;
+        } else if ((codeUnit & 64512) === 55296) {
+          if (this._bufferIndex + 3 >= t2)
+            break;
+          stringIndex0 = stringIndex + 1;
+          if (this._writeSurrogate$2(codeUnit, t3.codeUnitAt$1(str, stringIndex0)))
+            stringIndex = stringIndex0;
+        } else if (codeUnit <= 2047) {
+          t4 = this._bufferIndex;
+          t5 = t4 + 1;
+          if (t5 >= t2)
+            break;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 192 | codeUnit >>> 6;
+          this._bufferIndex = t5 + 1;
+          t1[t5] = 128 | codeUnit & 63;
+        } else {
+          t4 = this._bufferIndex;
+          if (t4 + 2 >= t2)
+            break;
+          t5 = t4 + 1;
+          this._bufferIndex = t5;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 224 | codeUnit >>> 12;
+          t4 = t5 + 1;
+          this._bufferIndex = t4;
+          if (t5 >= t2)
+            return H.ioore(t1, t5);
+          t1[t5] = 128 | codeUnit >>> 6 & 63;
+          this._bufferIndex = t4 + 1;
+          if (t4 >= t2)
+            return H.ioore(t1, t4);
+          t1[t4] = 128 | codeUnit & 63;
+        }
+      }
+      return stringIndex;
+    },
+    static: {"^": "_Utf8Encoder__DEFAULT_BYTE_BUFFER_SIZE"}
+  }
+}],
+["dart.core", "dart:core", , P, {
+  "^": "",
+  Function__toMangledNames: function(namedArguments) {
+    return;
+  },
+  Comparable_compare: [function(a, b) {
+    return J.compareTo$1$ns(a, b);
+  }, "call$2", "Comparable_compare$closure", 4, 0, 51, 46, 47],
+  Error_safeToString: function(object) {
+    var buffer, t1, i, t2, codeUnit;
+    if (typeof object === "number" || typeof object === "boolean" || null == object)
+      return J.toString$0(object);
+    if (typeof object === "string") {
+      buffer = new P.StringBuffer("");
+      buffer._contents = "\"";
+      for (t1 = object.length, i = 0, t2 = "\""; i < t1; ++i) {
+        codeUnit = C.JSString_methods.codeUnitAt$1(object, i);
+        if (codeUnit <= 31)
+          if (codeUnit === 10)
+            t2 = buffer._contents += "\\n";
+          else if (codeUnit === 13)
+            t2 = buffer._contents += "\\r";
+          else if (codeUnit === 9)
+            t2 = buffer._contents += "\\t";
+          else {
+            t2 = buffer._contents += "\\x";
+            if (codeUnit < 16)
+              buffer._contents = t2 + "0";
+            else {
+              buffer._contents = t2 + "1";
+              codeUnit -= 16;
+            }
+            t2 = H.Primitives_stringFromCharCode(codeUnit < 10 ? 48 + codeUnit : 87 + codeUnit);
+            t2 = buffer._contents += t2;
+          }
+        else if (codeUnit === 92)
+          t2 = buffer._contents += "\\\\";
+        else if (codeUnit === 34)
+          t2 = buffer._contents += "\\\"";
+        else {
+          t2 = H.Primitives_stringFromCharCode(codeUnit);
+          t2 = buffer._contents += t2;
+        }
+      }
+      t1 = t2 + "\"";
+      buffer._contents = t1;
+      return t1;
+    }
+    return "Instance of '" + H.Primitives_objectTypeName(object) + "'";
+  },
+  Exception_Exception: function(message) {
+    return new P._ExceptionImplementation(message);
+  },
+  identical: [function(a, b) {
+    return a == null ? b == null : a === b;
+  }, "call$2", "identical$closure", 4, 0, 52],
+  identityHashCode: [function(object) {
+    return H.objectHashCode(object);
+  }, "call$1", "identityHashCode$closure", 2, 0, 53],
+  List_List$filled: function($length, fill, $E) {
+    var result, t1, i;
+    result = J.JSArray_JSArray$fixed($length, $E);
+    if ($length !== 0 && true)
+      for (t1 = result.length, i = 0; i < t1; ++i)
+        result[i] = fill;
+    return result;
+  },
+  List_List$from: function(other, growable, $E) {
+    var list, t1;
+    list = H.setRuntimeTypeInfo([], [$E]);
+    for (t1 = J.get$iterator$ax(other); t1.moveNext$0();)
+      list.push(t1.get$current());
+    if (growable)
+      return list;
+    list.fixed$length = init;
+    return list;
+  },
+  print: function(object) {
+    var line, t1;
+    line = H.S(object);
+    t1 = $.printToZone;
+    if (t1 == null)
+      H.printString(line);
+    else
+      t1.call$1(line);
+  },
+  Function__toMangledNames_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(symbol, value) {
+      this.result_0.$indexSet(0, symbol.get$_name(symbol), value);
+    },
+    $isFunction: true
+  },
+  NoSuchMethodError_toString_closure: {
+    "^": "Closure:121;box_0",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (t1.i_1 > 0)
+        t1.sb_0.write$1(", ");
+      t1.sb_0.write$1(J.get$_name$x(key));
+      t1.sb_0.write$1(": ");
+      t1.sb_0.write$1(P.Error_safeToString(value));
+      ++t1.i_1;
+    },
+    $isFunction: true
+  },
+  bool: {
+    "^": "Object;",
+    $isbool: true
+  },
+  "+bool": 0,
+  Comparable: {
+    "^": "Object;"
+  },
+  DateTime: {
+    "^": "Object;millisecondsSinceEpoch<,isUtc",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDateTime)
+        return false;
+      return J.$eq(this.millisecondsSinceEpoch, other.millisecondsSinceEpoch) && this.isUtc === other.isUtc;
+    },
+    compareTo$1: function(_, other) {
+      return J.compareTo$1$ns(this.millisecondsSinceEpoch, other.get$millisecondsSinceEpoch());
+    },
+    get$hashCode: function(_) {
+      return this.millisecondsSinceEpoch;
+    },
+    toString$0: function(_) {
+      var t1, y, m, d, h, min, sec, ms;
+      t1 = this.isUtc;
+      y = P.DateTime__fourDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCFullYear() + 0 : H.Primitives_lazyAsJsDate(this).getFullYear() + 0);
+      m = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMonth() + 1 : H.Primitives_lazyAsJsDate(this).getMonth() + 1);
+      d = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCDate() + 0 : H.Primitives_lazyAsJsDate(this).getDate() + 0);
+      h = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCHours() + 0 : H.Primitives_lazyAsJsDate(this).getHours() + 0);
+      min = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMinutes() + 0 : H.Primitives_lazyAsJsDate(this).getMinutes() + 0);
+      sec = P.DateTime__twoDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCSeconds() + 0 : H.Primitives_lazyAsJsDate(this).getSeconds() + 0);
+      ms = P.DateTime__threeDigits(t1 ? H.Primitives_lazyAsJsDate(this).getUTCMilliseconds() + 0 : H.Primitives_lazyAsJsDate(this).getMilliseconds() + 0);
+      if (t1)
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms + "Z";
+      else
+        return y + "-" + m + "-" + d + " " + h + ":" + min + ":" + sec + "." + ms;
+    },
+    add$1: function(_, duration) {
+      return P.DateTime$fromMillisecondsSinceEpoch(J.$add$ns(this.millisecondsSinceEpoch, duration.get$inMilliseconds()), this.isUtc);
+    },
+    DateTime$_now$0: function() {
+      H.Primitives_lazyAsJsDate(this);
+    },
+    DateTime$fromMillisecondsSinceEpoch$2$isUtc: function(millisecondsSinceEpoch, isUtc) {
+      if (J.abs$0$n(millisecondsSinceEpoch) > 8640000000000000)
+        throw H.wrapException(P.ArgumentError$(millisecondsSinceEpoch));
+    },
+    $isDateTime: true,
+    static: {"^": "DateTime_MONDAY,DateTime_TUESDAY,DateTime_WEDNESDAY,DateTime_THURSDAY,DateTime_FRIDAY,DateTime_SATURDAY,DateTime_SUNDAY,DateTime_DAYS_PER_WEEK,DateTime_JANUARY,DateTime_FEBRUARY,DateTime_MARCH,DateTime_APRIL,DateTime_MAY,DateTime_JUNE,DateTime_JULY,DateTime_AUGUST,DateTime_SEPTEMBER,DateTime_OCTOBER,DateTime_NOVEMBER,DateTime_DECEMBER,DateTime_MONTHS_PER_YEAR,DateTime__MAX_MILLISECONDS_SINCE_EPOCH", DateTime_parse: function(formattedString) {
+        var match, t1, t2, years, month, day, hour, minute, second, millisecond, addOneMillisecond, t3, sign, hourDifference, minuteDifference, isUtc, millisecondsSinceEpoch;
+        match = new H.JSSyntaxRegExp("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", H.JSSyntaxRegExp_makeNative("^([+-]?\\d{4,5})-?(\\d\\d)-?(\\d\\d)(?:[ T](\\d\\d)(?::?(\\d\\d)(?::?(\\d\\d)(.\\d{1,6})?)?)?( ?[zZ]| ?([-+])(\\d\\d)(?::?(\\d\\d))?)?)?$", false, true, false), null, null).firstMatch$1(formattedString);
+        if (match != null) {
+          t1 = new P.DateTime_parse_parseIntOrZero();
+          t2 = match._match;
+          if (1 >= t2.length)
+            return H.ioore(t2, 1);
+          years = H.Primitives_parseInt(t2[1], null, null);
+          if (2 >= t2.length)
+            return H.ioore(t2, 2);
+          month = H.Primitives_parseInt(t2[2], null, null);
+          if (3 >= t2.length)
+            return H.ioore(t2, 3);
+          day = H.Primitives_parseInt(t2[3], null, null);
+          if (4 >= t2.length)
+            return H.ioore(t2, 4);
+          hour = t1.call$1(t2[4]);
+          if (5 >= t2.length)
+            return H.ioore(t2, 5);
+          minute = t1.call$1(t2[5]);
+          if (6 >= t2.length)
+            return H.ioore(t2, 6);
+          second = t1.call$1(t2[6]);
+          if (7 >= t2.length)
+            return H.ioore(t2, 7);
+          millisecond = J.round$0$n(J.$mul$ns(new P.DateTime_parse_parseDoubleOrZero().call$1(t2[7]), 1000));
+          if (millisecond === 1000) {
+            addOneMillisecond = true;
+            millisecond = 999;
+          } else
+            addOneMillisecond = false;
+          t3 = t2.length;
+          if (8 >= t3)
+            return H.ioore(t2, 8);
+          if (t2[8] != null) {
+            if (9 >= t3)
+              return H.ioore(t2, 9);
+            t3 = t2[9];
+            if (t3 != null) {
+              sign = J.$eq(t3, "-") ? -1 : 1;
+              if (10 >= t2.length)
+                return H.ioore(t2, 10);
+              hourDifference = H.Primitives_parseInt(t2[10], null, null);
+              if (11 >= t2.length)
+                return H.ioore(t2, 11);
+              minuteDifference = t1.call$1(t2[11]);
+              if (typeof hourDifference !== "number")
+                return H.iae(hourDifference);
+              minuteDifference = J.$add$ns(minuteDifference, 60 * hourDifference);
+              if (typeof minuteDifference !== "number")
+                return H.iae(minuteDifference);
+              minute = J.$sub$n(minute, sign * minuteDifference);
+            }
+            isUtc = true;
+          } else
+            isUtc = false;
+          millisecondsSinceEpoch = H.Primitives_valueFromDecomposedDate(years, month, day, hour, minute, second, millisecond, isUtc);
+          return P.DateTime$fromMillisecondsSinceEpoch(addOneMillisecond ? millisecondsSinceEpoch + 1 : millisecondsSinceEpoch, isUtc);
+        } else
+          throw H.wrapException(P.FormatException$(formattedString));
+      }, DateTime$fromMillisecondsSinceEpoch: function(millisecondsSinceEpoch, isUtc) {
+        var t1 = new P.DateTime(millisecondsSinceEpoch, isUtc);
+        t1.DateTime$fromMillisecondsSinceEpoch$2$isUtc(millisecondsSinceEpoch, isUtc);
+        return t1;
+      }, DateTime__fourDigits: function(n) {
+        var absN, sign;
+        absN = Math.abs(n);
+        sign = n < 0 ? "-" : "";
+        if (absN >= 1000)
+          return "" + n;
+        if (absN >= 100)
+          return sign + "0" + H.S(absN);
+        if (absN >= 10)
+          return sign + "00" + H.S(absN);
+        return sign + "000" + H.S(absN);
+      }, DateTime__threeDigits: function(n) {
+        if (n >= 100)
+          return "" + n;
+        if (n >= 10)
+          return "0" + n;
+        return "00" + n;
+      }, DateTime__twoDigits: function(n) {
+        if (n >= 10)
+          return "" + n;
+        return "0" + n;
+      }}
+  },
+  DateTime_parse_parseIntOrZero: {
+    "^": "Closure:122;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseInt(matched, null, null);
+    },
+    $isFunction: true
+  },
+  DateTime_parse_parseDoubleOrZero: {
+    "^": "Closure:123;",
+    call$1: function(matched) {
+      if (matched == null)
+        return 0;
+      return H.Primitives_parseDouble(matched, null);
+    },
+    $isFunction: true
+  },
+  $double: {
+    "^": "num;",
+    $is$double: true
+  },
+  "+double": 0,
+  Duration: {
+    "^": "Object;_duration<",
+    $add: function(_, other) {
+      return P.Duration$(0, 0, this._duration + other.get$_duration(), 0, 0, 0);
+    },
+    $sub: function(_, other) {
+      return P.Duration$(0, 0, this._duration - other.get$_duration(), 0, 0, 0);
+    },
+    $mul: function(_, factor) {
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      return P.Duration$(0, 0, C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(this._duration * factor)), 0, 0, 0);
+    },
+    $tdiv: function(_, quotient) {
+      if (J.$eq(quotient, 0))
+        throw H.wrapException(P.IntegerDivisionByZeroException$());
+      if (typeof quotient !== "number")
+        return H.iae(quotient);
+      return P.Duration$(0, 0, C.JSNumber_methods.$tdiv(this._duration, quotient), 0, 0, 0);
+    },
+    $lt: function(_, other) {
+      return this._duration < other.get$_duration();
+    },
+    $gt: function(_, other) {
+      return this._duration > other.get$_duration();
+    },
+    $le: function(_, other) {
+      return this._duration <= other.get$_duration();
+    },
+    $ge: function(_, other) {
+      return this._duration >= other.get$_duration();
+    },
+    get$inMilliseconds: function() {
+      return C.JSNumber_methods._tdivFast$1(this._duration, 1000);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isDuration)
+        return false;
+      return this._duration === other._duration;
+    },
+    get$hashCode: function(_) {
+      return this._duration & 0x1FFFFFFF;
+    },
+    compareTo$1: function(_, other) {
+      return C.JSNumber_methods.compareTo$1(this._duration, other.get$_duration());
+    },
+    toString$0: function(_) {
+      var t1, t2, twoDigitMinutes, twoDigitSeconds, sixDigitUs;
+      t1 = new P.Duration_toString_twoDigits();
+      t2 = this._duration;
+      if (t2 < 0)
+        return "-" + P.Duration$(0, 0, -t2, 0, 0, 0).toString$0(0);
+      twoDigitMinutes = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 60000000), 60));
+      twoDigitSeconds = t1.call$1(C.JSNumber_methods.remainder$1(C.JSNumber_methods._tdivFast$1(t2, 1000000), 60));
+      sixDigitUs = new P.Duration_toString_sixDigits().call$1(C.JSNumber_methods.remainder$1(t2, 1000000));
+      return H.S(C.JSNumber_methods._tdivFast$1(t2, 3600000000)) + ":" + H.S(twoDigitMinutes) + ":" + H.S(twoDigitSeconds) + "." + H.S(sixDigitUs);
+    },
+    $isDuration: true,
+    static: {"^": "Duration_MICROSECONDS_PER_MILLISECOND,Duration_MILLISECONDS_PER_SECOND,Duration_SECONDS_PER_MINUTE,Duration_MINUTES_PER_HOUR,Duration_HOURS_PER_DAY,Duration_MICROSECONDS_PER_SECOND,Duration_MICROSECONDS_PER_MINUTE,Duration_MICROSECONDS_PER_HOUR,Duration_MICROSECONDS_PER_DAY,Duration_MILLISECONDS_PER_MINUTE,Duration_MILLISECONDS_PER_HOUR,Duration_MILLISECONDS_PER_DAY,Duration_SECONDS_PER_HOUR,Duration_SECONDS_PER_DAY,Duration_MINUTES_PER_DAY,Duration_ZERO", Duration$: function(days, hours, microseconds, milliseconds, minutes, seconds) {
+        return new P.Duration(days * 86400000000 + hours * 3600000000 + minutes * 60000000 + seconds * 1000000 + milliseconds * 1000 + microseconds);
+      }}
+  },
+  Duration_toString_sixDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 100000)
+        return H.S(n);
+      if (n >= 10000)
+        return "0" + H.S(n);
+      if (n >= 1000)
+        return "00" + H.S(n);
+      if (n >= 100)
+        return "000" + H.S(n);
+      if (n >= 10)
+        return "0000" + H.S(n);
+      return "00000" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Duration_toString_twoDigits: {
+    "^": "Closure:15;",
+    call$1: function(n) {
+      if (n >= 10)
+        return H.S(n);
+      return "0" + H.S(n);
+    },
+    $isFunction: true
+  },
+  Error: {
+    "^": "Object;",
+    get$stackTrace: function() {
+      return new H._StackTrace(this.$thrownJsError, null);
+    },
+    $isError: true
+  },
+  NullThrownError: {
+    "^": "Error;",
+    toString$0: function(_) {
+      return "Throw of null.";
+    }
+  },
+  ArgumentError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 != null)
+        return "Illegal argument(s): " + H.S(t1);
+      return "Illegal argument(s)";
+    },
+    static: {ArgumentError$: function(message) {
+        return new P.ArgumentError(message);
+      }}
+  },
+  RangeError: {
+    "^": "ArgumentError;message",
+    toString$0: function(_) {
+      return "RangeError: " + H.S(this.message);
+    },
+    static: {RangeError$: function(message) {
+        return new P.RangeError(message);
+      }, RangeError$value: function(value) {
+        return new P.RangeError("value " + H.S(value));
+      }, RangeError$range: function(value, start, end) {
+        return new P.RangeError("value " + H.S(value) + " not in range " + H.S(start) + ".." + H.S(end));
+      }}
+  },
+  FallThroughError: {
+    "^": "Error;",
+    static: {FallThroughError$: function() {
+        return new P.FallThroughError();
+      }}
+  },
+  NoSuchMethodError: {
+    "^": "Error;_core$_receiver,_memberName,_core$_arguments,_namedArguments,_existingArgumentNames",
+    toString$0: function(_) {
+      var t1, t2, t3, t4, t5, str;
+      t1 = {};
+      t1.sb_0 = P.StringBuffer$("");
+      t1.i_1 = 0;
+      for (t2 = this._core$_arguments, t3 = 0; t4 = t2.length, t3 < t4; t3 = ++t1.i_1) {
+        if (t3 > 0) {
+          t5 = t1.sb_0;
+          t5._contents += ", ";
+        }
+        t5 = t1.sb_0;
+        if (t3 < 0)
+          return H.ioore(t2, t3);
+        str = P.Error_safeToString(t2[t3]);
+        t5._contents += typeof str === "string" ? str : H.S(str);
+      }
+      this._namedArguments.forEach$1(0, new P.NoSuchMethodError_toString_closure(t1));
+      return "NoSuchMethodError : method not found: '" + this._memberName.toString$0(0) + "'\nReceiver: " + H.S(P.Error_safeToString(this._core$_receiver)) + "\nArguments: [" + t1.sb_0._contents + "]";
+    },
+    $isNoSuchMethodError: true,
+    static: {NoSuchMethodError$: function(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames) {
+        return new P.NoSuchMethodError(receiver, memberName, positionalArguments, namedArguments, existingArgumentNames);
+      }}
+  },
+  UnsupportedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Unsupported operation: " + this.message;
+    },
+    static: {UnsupportedError$: function(message) {
+        return new P.UnsupportedError(message);
+      }}
+  },
+  UnimplementedError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      return t1 != null ? "UnimplementedError: " + H.S(t1) : "UnimplementedError";
+    },
+    $isError: true,
+    static: {UnimplementedError$: function(message) {
+        return new P.UnimplementedError(message);
+      }}
+  },
+  StateError: {
+    "^": "Error;message>",
+    toString$0: function(_) {
+      return "Bad state: " + this.message;
+    },
+    static: {StateError$: function(message) {
+        return new P.StateError(message);
+      }}
+  },
+  ConcurrentModificationError: {
+    "^": "Error;modifiedObject",
+    toString$0: function(_) {
+      var t1 = this.modifiedObject;
+      if (t1 == null)
+        return "Concurrent modification during iteration.";
+      return "Concurrent modification during iteration: " + H.S(P.Error_safeToString(t1)) + ".";
+    },
+    static: {ConcurrentModificationError$: function(modifiedObject) {
+        return new P.ConcurrentModificationError(modifiedObject);
+      }}
+  },
+  OutOfMemoryError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Out of Memory";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  StackOverflowError: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "Stack Overflow";
+    },
+    get$stackTrace: function() {
+      return;
+    },
+    $isError: true
+  },
+  CyclicInitializationError: {
+    "^": "Error;variableName",
+    toString$0: function(_) {
+      return "Reading static variable '" + this.variableName + "' during its initialization";
+    },
+    static: {CyclicInitializationError$: function(variableName) {
+        return new P.CyclicInitializationError(variableName);
+      }}
+  },
+  _ExceptionImplementation: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      var t1 = this.message;
+      if (t1 == null)
+        return "Exception";
+      return "Exception: " + H.S(t1);
+    }
+  },
+  FormatException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "FormatException: " + H.S(this.message);
+    },
+    static: {FormatException$: function(message) {
+        return new P.FormatException(message);
+      }}
+  },
+  IntegerDivisionByZeroException: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "IntegerDivisionByZeroException";
+    },
+    static: {IntegerDivisionByZeroException$: function() {
+        return new P.IntegerDivisionByZeroException();
+      }}
+  },
+  Expando: {
+    "^": "Object;name>",
+    toString$0: function(_) {
+      return "Expando:" + H.S(this.name);
+    },
+    $index: function(_, object) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      return values == null ? null : H.Primitives_getProperty(values, this._getKey$0());
+    },
+    $indexSet: function(_, object, value) {
+      var values = H.Primitives_getProperty(object, "expando$values");
+      if (values == null) {
+        values = new P.Object();
+        H.Primitives_setProperty(object, "expando$values", values);
+      }
+      H.Primitives_setProperty(values, this._getKey$0(), value);
+    },
+    _getKey$0: function() {
+      var key, t1;
+      key = H.Primitives_getProperty(this, "expando$key");
+      if (key == null) {
+        t1 = $.Expando__keyCount;
+        $.Expando__keyCount = t1 + 1;
+        key = "expando$key$" + t1;
+        H.Primitives_setProperty(this, "expando$key", key);
+      }
+      return key;
+    },
+    static: {"^": "Expando__KEY_PROPERTY_NAME,Expando__EXPANDO_PROPERTY_NAME,Expando__keyCount"}
+  },
+  Function: {
+    "^": "Object;",
+    $isFunction: true
+  },
+  $int: {
+    "^": "num;",
+    $is$int: true
+  },
+  "+int": 0,
+  Iterable: {
+    "^": "Object;",
+    $isIterable: true,
+    $asIterable: null
+  },
+  Iterator: {
+    "^": "Object;"
+  },
+  List: {
+    "^": "Object;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  "+List": 0,
+  Map: {
+    "^": "Object;",
+    $isMap: true
+  },
+  Null: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return "null";
+    }
+  },
+  "+Null": 0,
+  num: {
+    "^": "Object;",
+    $isnum: true
+  },
+  "+num": 0,
+  Object: {
+    "^": ";",
+    $eq: function(_, other) {
+      return this === other;
+    },
+    get$hashCode: function(_) {
+      return H.Primitives_objectHashCode(this);
+    },
+    toString$0: function(_) {
+      return H.Primitives_objectToString(this);
+    },
+    noSuchMethod$1: function(_, invocation) {
+      throw H.wrapException(P.NoSuchMethodError$(this, invocation.get$memberName(), invocation.get$positionalArguments(), invocation.get$namedArguments(), null));
+    },
+    get$runtimeType: function(_) {
+      return new H.TypeImpl(H.getRuntimeTypeString(this), null);
+    },
+    $isObject: true
+  },
+  Match: {
+    "^": "Object;",
+    $isMatch: true
+  },
+  StackTrace: {
+    "^": "Object;"
+  },
+  Stopwatch: {
+    "^": "Object;frequency,_core$_start,_stop",
+    start$0: function(_) {
+      var t1, t2, t3;
+      t1 = this._core$_start == null;
+      if (!t1 && this._stop == null)
+        return;
+      if (t1)
+        this._core$_start = H.Primitives_numMicroseconds();
+      else {
+        t1 = H.Primitives_numMicroseconds();
+        t2 = this._stop;
+        t3 = this._core$_start;
+        if (typeof t2 !== "number")
+          return t2.$sub();
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        this._core$_start = t1 - (t2 - t3);
+        this._stop = null;
+      }
+    }
+  },
+  String: {
+    "^": "Object;",
+    $isString: true
+  },
+  "+String": 0,
+  RuneIterator: {
+    "^": "Object;string,_core$_position,_nextPosition,_currentCodePoint",
+    get$current: function() {
+      return this._currentCodePoint;
+    },
+    moveNext$0: function() {
+      var t1, t2, t3, codeUnit, nextPosition, nextCodeUnit;
+      t1 = this._nextPosition;
+      this._core$_position = t1;
+      t2 = this.string;
+      t3 = t2.length;
+      if (t1 === t3) {
+        this._currentCodePoint = null;
+        return false;
+      }
+      codeUnit = C.JSString_methods.codeUnitAt$1(t2, t1);
+      nextPosition = this._core$_position + 1;
+      if ((codeUnit & 64512) === 55296 && nextPosition < t3) {
+        nextCodeUnit = C.JSString_methods.codeUnitAt$1(t2, nextPosition);
+        if ((nextCodeUnit & 64512) === 56320) {
+          this._nextPosition = nextPosition + 1;
+          this._currentCodePoint = 65536 + ((codeUnit & 1023) << 10 >>> 0) + (nextCodeUnit & 1023);
+          return true;
+        }
+      }
+      this._nextPosition = nextPosition;
+      this._currentCodePoint = codeUnit;
+      return true;
+    }
+  },
+  StringBuffer: {
+    "^": "Object;_contents<",
+    get$length: function(_) {
+      return this._contents.length;
+    },
+    get$isEmpty: function(_) {
+      return this._contents.length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._contents.length !== 0;
+    },
+    write$1: function(obj) {
+      this._contents += typeof obj === "string" ? obj : H.S(obj);
+    },
+    writeAll$2: function(objects, separator) {
+      var iterator, str;
+      iterator = J.get$iterator$ax(objects);
+      if (!iterator.moveNext$0())
+        return;
+      if (separator.length === 0)
+        do {
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        } while (iterator.moveNext$0());
+      else {
+        this.write$1(iterator.get$current());
+        for (; iterator.moveNext$0();) {
+          this._contents += separator;
+          str = iterator.get$current();
+          this._contents += typeof str === "string" ? str : H.S(str);
+        }
+      }
+    },
+    clear$0: function(_) {
+      this._contents = "";
+    },
+    toString$0: function(_) {
+      return this._contents;
+    },
+    StringBuffer$1: function($content) {
+      if (typeof $content === "string")
+        this._contents = $content;
+      else
+        this.write$1($content);
+    },
+    static: {StringBuffer$: function($content) {
+        var t1 = new P.StringBuffer("");
+        t1.StringBuffer$1($content);
+        return t1;
+      }}
+  },
+  Symbol: {
+    "^": "Object;",
+    $isSymbol: true
+  },
+  Type: {
+    "^": "Object;",
+    $isType: true
+  },
+  Uri: {
+    "^": "Object;_host,_port,_path,scheme,userInfo,query,fragment,_pathSegments,_queryParameters",
+    get$host: function(_) {
+      var t1;
+      if (C.JSString_methods.startsWith$1(this._host, "[")) {
+        t1 = this._host;
+        return C.JSString_methods.substring$2(t1, 1, t1.length - 1);
+      }
+      return this._host;
+    },
+    get$port: function(_) {
+      var t1;
+      if (J.$eq(this._port, 0)) {
+        t1 = this.scheme;
+        if (t1 === "http")
+          return 80;
+        if (t1 === "https")
+          return 443;
+      }
+      return this._port;
+    },
+    get$path: function(_) {
+      return this._path;
+    },
+    _makePath$2: function(path, pathSegments) {
+      var t1, result;
+      t1 = path == null;
+      if (t1 && true)
+        return "";
+      t1 = !t1;
+      if (t1)
+        ;
+      result = t1 ? P.Uri__normalize(path) : C.JSNull_methods.map$1(pathSegments, new P.Uri__makePath_closure()).join$1(0, "/");
+      if ((this.get$host(this) !== "" || this.scheme === "file") && J.getInterceptor$asx(result).get$isNotEmpty(result) && !C.JSString_methods.startsWith$1(result, "/"))
+        return "/" + H.S(result);
+      return result;
+    },
+    _merge$2: function(base, reference) {
+      if (base === "")
+        return "/" + H.S(reference);
+      return C.JSString_methods.substring$2(base, 0, J.getInterceptor$asx(base).lastIndexOf$1(base, "/") + 1) + H.S(reference);
+    },
+    _hasDotSegments$1: function(path) {
+      if (path.length > 0 && J.codeUnitAt$1$s(path, 0) === 58)
+        return true;
+      return J.indexOf$1$asx(path, "/.") !== -1;
+    },
+    _removeDotSegments$1: function(path) {
+      var output, t1, appendSlash, segment, t2;
+      if (!this._hasDotSegments$1(path))
+        return path;
+      output = [];
+      for (t1 = path.split("/"), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), appendSlash = false; t1.moveNext$0();) {
+        segment = t1._current;
+        if (J.$eq(segment, "..")) {
+          t2 = output.length;
+          if (t2 !== 0)
+            if (t2 === 1) {
+              if (0 >= t2)
+                return H.ioore(output, 0);
+              t2 = !J.$eq(output[0], "");
+            } else
+              t2 = true;
+          else
+            t2 = false;
+          if (t2) {
+            if (0 >= output.length)
+              return H.ioore(output, 0);
+            output.pop();
+          }
+          appendSlash = true;
+        } else if ("." === segment)
+          appendSlash = true;
+        else {
+          output.push(segment);
+          appendSlash = false;
+        }
+      }
+      if (appendSlash)
+        output.push("");
+      return C.JSArray_methods.join$1(output, "/");
+    },
+    toString$0: function(_) {
+      var sb, t1;
+      sb = P.StringBuffer$("");
+      t1 = this.scheme;
+      if ("" !== t1) {
+        sb.write$1(t1);
+        sb.write$1(":");
+      }
+      if (this.get$host(this) !== "" || t1 === "file") {
+        sb.write$1("//");
+        t1 = this.userInfo;
+        if ("" !== t1) {
+          sb.write$1(t1);
+          sb.write$1("@");
+        }
+        sb.write$1(this._host);
+        if (!J.$eq(this._port, 0)) {
+          sb.write$1(":");
+          sb.write$1(J.toString$0(this._port));
+        }
+      }
+      sb.write$1(this._path);
+      t1 = this.query;
+      if ("" !== t1) {
+        sb.write$1("?");
+        sb.write$1(t1);
+      }
+      t1 = this.fragment;
+      if ("" !== t1) {
+        sb.write$1("#");
+        sb.write$1(t1);
+      }
+      return sb._contents;
+    },
+    $eq: function(_, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isUri)
+        return false;
+      t2 = this.scheme;
+      t3 = other.scheme;
+      if (t2 == null ? t3 == null : t2 === t3)
+        if (this.userInfo === other.userInfo)
+          if (this.get$host(this) === t1.get$host(other))
+            if (J.$eq(this.get$port(this), t1.get$port(other))) {
+              t1 = this._path;
+              t2 = other._path;
+              if (t1 == null ? t2 == null : t1 === t2) {
+                t1 = this.query;
+                t2 = other.query;
+                if (t1 == null ? t2 == null : t1 === t2) {
+                  t1 = this.fragment;
+                  t2 = other.fragment;
+                  t2 = t1 == null ? t2 == null : t1 === t2;
+                  t1 = t2;
+                } else
+                  t1 = false;
+              } else
+                t1 = false;
+            } else
+              t1 = false;
+          else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = new P.Uri_hashCode_combine();
+      return t1.call$2(this.scheme, t1.call$2(this.userInfo, t1.call$2(this.get$host(this), t1.call$2(this.get$port(this), t1.call$2(this._path, t1.call$2(this.query, t1.call$2(this.fragment, 1)))))));
+    },
+    Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+      if (scheme === "http" && J.$eq(port, 80))
+        this._port = 0;
+      else if (scheme === "https" && J.$eq(port, 443))
+        this._port = 0;
+      else
+        this._port = port;
+      this._path = this._makePath$2(path, pathSegments);
+    },
+    $isUri: true,
+    static: {"^": "Uri__SPACE,Uri__DOUBLE_QUOTE,Uri__NUMBER_SIGN,Uri__PERCENT,Uri__ASTERISK,Uri__PLUS,Uri__SLASH,Uri__ZERO,Uri__NINE,Uri__COLON,Uri__LESS,Uri__GREATER,Uri__QUESTION,Uri__AT_SIGN,Uri__UPPER_CASE_A,Uri__UPPER_CASE_F,Uri__UPPER_CASE_Z,Uri__LEFT_BRACKET,Uri__BACKSLASH,Uri__RIGHT_BRACKET,Uri__LOWER_CASE_A,Uri__LOWER_CASE_F,Uri__LOWER_CASE_Z,Uri__BAR,Uri__unreservedTable,Uri__unreserved2396Table,Uri__encodeFullTable,Uri__schemeTable,Uri__schemeLowerTable,Uri__subDelimitersTable,Uri__regNameTable,Uri__pathCharTable,Uri__queryCharTable", Uri_parse: function(uri) {
+        var port, portStr, t1, t2, $length, index, schemeEndIndex, index0, codeUnit, t3, authorityEndIndex, portIndex, userInfoEndIndex, authorityEndIndex0, pathEndIndex, pathEndIndex0, queryEndIndex, queryEndIndex0, scheme, startIndex, userInfo, exception, host, path, query, fragment;
+        t1 = new P.Uri_parse_isRegName();
+        t2 = new P.Uri_parse_ipV6Address(uri);
+        $length = uri.length;
+        if ($length === 0)
+          return P.Uri$("", "", null, null, 0, null, null, null, "");
+        if (J.codeUnitAt$1$s(uri, 0) !== 47)
+          for (index = 0; schemeEndIndex = 0, index < $length; index = index0) {
+            index0 = index + 1;
+            if (index >= $length)
+              H.throwExpression(P.RangeError$value(index));
+            codeUnit = uri.charCodeAt(index);
+            if (codeUnit < 128) {
+              t3 = codeUnit >>> 4;
+              if (t3 >= 8)
+                return H.ioore(C.List_JYB, t3);
+              t3 = (C.List_JYB[t3] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t3 = false;
+            if (!t3) {
+              if (codeUnit === 58) {
+                schemeEndIndex = index0;
+                index = schemeEndIndex;
+              } else {
+                index = index0 - 1;
+                schemeEndIndex = 0;
+              }
+              break;
+            }
+          }
+        else {
+          index = 0;
+          schemeEndIndex = 0;
+        }
+        if (schemeEndIndex === index) {
+          t3 = schemeEndIndex + 1;
+          t3 = t3 < $length && C.JSString_methods.codeUnitAt$1(uri, schemeEndIndex) === 47 && C.JSString_methods.codeUnitAt$1(uri, t3) === 47;
+        } else
+          t3 = false;
+        if (t3) {
+          authorityEndIndex = schemeEndIndex + 2;
+          for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), userInfoEndIndex = -1, t3.$lt(authorityEndIndex, $length);) {
+            authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+            if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+              H.throwExpression(P.ArgumentError$(authorityEndIndex));
+            if (t3.$lt(authorityEndIndex, 0))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            if (t3.$ge(authorityEndIndex, $length))
+              H.throwExpression(P.RangeError$value(authorityEndIndex));
+            codeUnit = uri.charCodeAt(authorityEndIndex);
+            if (t1.call$1(codeUnit) !== true)
+              if (codeUnit === 91)
+                authorityEndIndex = t2.call$1(authorityEndIndex0);
+              else {
+                if (J.$eq(portIndex, -1) && codeUnit === 58)
+                  ;
+                else {
+                  t3 = codeUnit === 64 || codeUnit === 58;
+                  authorityEndIndex = authorityEndIndex0 - 1;
+                  if (t3) {
+                    userInfoEndIndex = C.JSString_methods.indexOf$2(uri, "@", authorityEndIndex);
+                    if (userInfoEndIndex === -1) {
+                      authorityEndIndex = index;
+                      break;
+                    }
+                    authorityEndIndex = userInfoEndIndex + 1;
+                    for (portIndex = -1; t3 = J.getInterceptor$n(authorityEndIndex), t3.$lt(authorityEndIndex, $length);) {
+                      authorityEndIndex0 = t3.$add(authorityEndIndex, 1);
+                      if (typeof authorityEndIndex !== "number" || Math.floor(authorityEndIndex) !== authorityEndIndex)
+                        H.throwExpression(P.ArgumentError$(authorityEndIndex));
+                      if (t3.$lt(authorityEndIndex, 0))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      if (t3.$ge(authorityEndIndex, $length))
+                        H.throwExpression(P.RangeError$value(authorityEndIndex));
+                      codeUnit = uri.charCodeAt(authorityEndIndex);
+                      if (t1.call$1(codeUnit) !== true)
+                        if (codeUnit === 91)
+                          authorityEndIndex = t2.call$1(authorityEndIndex0);
+                        else {
+                          if (codeUnit === 58) {
+                            if (!J.$eq(portIndex, -1))
+                              throw H.wrapException(P.FormatException$("Double port in host"));
+                          } else {
+                            authorityEndIndex = authorityEndIndex0 - 1;
+                            break;
+                          }
+                          authorityEndIndex = authorityEndIndex0;
+                          portIndex = authorityEndIndex;
+                        }
+                      else
+                        authorityEndIndex = authorityEndIndex0;
+                    }
+                    break;
+                  } else {
+                    userInfoEndIndex = -1;
+                    break;
+                  }
+                }
+                authorityEndIndex = authorityEndIndex0;
+                portIndex = authorityEndIndex;
+              }
+            else
+              authorityEndIndex = authorityEndIndex0;
+          }
+        } else {
+          authorityEndIndex = schemeEndIndex;
+          userInfoEndIndex = -1;
+          portIndex = -1;
+        }
+        for (pathEndIndex = authorityEndIndex; t1 = J.getInterceptor$n(pathEndIndex), t1.$lt(pathEndIndex, $length); pathEndIndex = pathEndIndex0) {
+          pathEndIndex0 = t1.$add(pathEndIndex, 1);
+          if (typeof pathEndIndex !== "number" || Math.floor(pathEndIndex) !== pathEndIndex)
+            H.throwExpression(P.ArgumentError$(pathEndIndex));
+          if (t1.$lt(pathEndIndex, 0))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          if (t1.$ge(pathEndIndex, $length))
+            H.throwExpression(P.RangeError$value(pathEndIndex));
+          codeUnit = uri.charCodeAt(pathEndIndex);
+          if (codeUnit === 63 || codeUnit === 35) {
+            pathEndIndex = pathEndIndex0 - 1;
+            break;
+          }
+        }
+        t1 = J.getInterceptor$n(pathEndIndex);
+        if (t1.$lt(pathEndIndex, $length) && C.JSString_methods.codeUnitAt$1(uri, pathEndIndex) === 63)
+          for (queryEndIndex = pathEndIndex; t2 = J.getInterceptor$n(queryEndIndex), t2.$lt(queryEndIndex, $length); queryEndIndex = queryEndIndex0) {
+            queryEndIndex0 = t2.$add(queryEndIndex, 1);
+            if (typeof queryEndIndex !== "number" || Math.floor(queryEndIndex) !== queryEndIndex)
+              H.throwExpression(P.ArgumentError$(queryEndIndex));
+            if (t2.$lt(queryEndIndex, 0))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (t2.$ge(queryEndIndex, $length))
+              H.throwExpression(P.RangeError$value(queryEndIndex));
+            if (uri.charCodeAt(queryEndIndex) === 35) {
+              queryEndIndex = queryEndIndex0 - 1;
+              break;
+            }
+          }
+        else
+          queryEndIndex = pathEndIndex;
+        scheme = schemeEndIndex > 0 ? C.JSString_methods.substring$2(uri, 0, schemeEndIndex - 1) : null;
+        port = 0;
+        if (schemeEndIndex !== authorityEndIndex) {
+          startIndex = schemeEndIndex + 2;
+          if (userInfoEndIndex > 0) {
+            userInfo = C.JSString_methods.substring$2(uri, startIndex, userInfoEndIndex);
+            startIndex = userInfoEndIndex + 1;
+          } else
+            userInfo = "";
+          t2 = J.getInterceptor$n(portIndex);
+          if (t2.$gt(portIndex, 0)) {
+            portStr = C.JSString_methods.substring$2(uri, portIndex, authorityEndIndex);
+            try {
+              port = H.Primitives_parseInt(portStr, null, null);
+            } catch (exception) {
+              H.unwrapException(exception);
+              throw H.wrapException(P.FormatException$("Invalid port: '" + H.S(portStr) + "'"));
+            }
+
+            host = C.JSString_methods.substring$2(uri, startIndex, t2.$sub(portIndex, 1));
+          } else
+            host = C.JSString_methods.substring$2(uri, startIndex, authorityEndIndex);
+        } else {
+          host = "";
+          userInfo = "";
+        }
+        path = C.JSString_methods.substring$2(uri, authorityEndIndex, pathEndIndex);
+        query = t1.$lt(pathEndIndex, queryEndIndex) ? C.JSString_methods.substring$2(uri, t1.$add(pathEndIndex, 1), queryEndIndex) : "";
+        t1 = J.getInterceptor$n(queryEndIndex);
+        fragment = t1.$lt(queryEndIndex, $length) ? C.JSString_methods.substring$2(uri, t1.$add(queryEndIndex, 1), $length) : "";
+        return P.Uri$(fragment, host, path, null, port, query, null, scheme, userInfo);
+      }, Uri$: function(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo) {
+        var t1 = P.Uri__makeScheme(scheme);
+        t1 = new P.Uri(P.Uri__makeHost(host), null, null, t1, userInfo, P.Uri__makeQuery(query, queryParameters), P.Uri__makeFragment(fragment), null, null);
+        t1.Uri$9$fragment$host$path$pathSegments$port$query$queryParameters$scheme$userInfo(fragment, host, path, pathSegments, port, query, queryParameters, scheme, userInfo);
+        return t1;
+      }, Uri__makeHost: function(host) {
+        var t1, i;
+        if (host.length === 0)
+          return host;
+        if (C.JSString_methods.codeUnitAt$1(host, 0) === 91) {
+          t1 = host.length - 1;
+          if (C.JSString_methods.codeUnitAt$1(host, t1) !== 93)
+            throw H.wrapException(P.FormatException$("Missing end `]` to match `[` in host"));
+          P.Uri_parseIPv6Address(C.JSString_methods.substring$2(host, 1, t1));
+          return host;
+        }
+        for (t1 = host.length, i = 0; i < t1; ++i) {
+          if (i >= t1)
+            H.throwExpression(P.RangeError$value(i));
+          if (host.charCodeAt(i) === 58) {
+            P.Uri_parseIPv6Address(host);
+            return "[" + host + "]";
+          }
+        }
+        return host;
+      }, Uri__makeScheme: function(scheme) {
+        var t1, $length, allLowercase, i, codeUnit, t2;
+        t1 = new P.Uri__makeScheme_isSchemeLowerCharacter();
+        if (scheme == null)
+          return "";
+        $length = scheme.length;
+        for (allLowercase = true, i = 0; i < $length; ++i) {
+          if (i >= $length)
+            H.throwExpression(P.RangeError$value(i));
+          codeUnit = scheme.charCodeAt(i);
+          if (i === 0) {
+            if (!(codeUnit >= 97 && codeUnit <= 122))
+              t2 = codeUnit >= 65 && codeUnit <= 90;
+            else
+              t2 = true;
+            t2 = !t2;
+          } else
+            t2 = false;
+          if (t2)
+            throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+          if (t1.call$1(codeUnit) !== true) {
+            if (codeUnit < 128) {
+              t2 = codeUnit >>> 4;
+              if (t2 >= 8)
+                return H.ioore(C.List_JYB, t2);
+              t2 = (C.List_JYB[t2] & C.JSInt_methods._shlPositive$1(1, codeUnit & 15)) !== 0;
+            } else
+              t2 = false;
+            if (t2)
+              ;
+            else
+              throw H.wrapException(P.ArgumentError$("Illegal scheme: " + scheme));
+            allLowercase = false;
+          }
+        }
+        return allLowercase ? scheme : scheme.toLowerCase();
+      }, Uri__makeQuery: function(query, queryParameters) {
+        var t1, t2, result;
+        t1 = {};
+        t2 = query == null;
+        if (t2 && true)
+          return "";
+        t2 = !t2;
+        if (t2)
+          ;
+        if (t2)
+          return P.Uri__normalize(query);
+        result = P.StringBuffer$("");
+        t1.first_0 = true;
+        C.JSNull_methods.forEach$1(queryParameters, new P.Uri__makeQuery_closure(t1, result));
+        return result._contents;
+      }, Uri__makeFragment: function(fragment) {
+        if (fragment == null)
+          return "";
+        return P.Uri__normalize(fragment);
+      }, Uri__normalize: function(component) {
+        var t1, index, t2, t3, t4, t5, $length, t6, t7, codeUnit1, codeUnit2, decodedCodeUnit, t8, next;
+        t1 = {};
+        index = J.getInterceptor$asx(component).indexOf$1(component, "%");
+        t1.index_0 = index;
+        if (index < 0)
+          return component;
+        t2 = new P.Uri__normalize_isNormalizedHexDigit();
+        t3 = new P.Uri__normalize_isUnreserved();
+        t4 = new P.Uri__normalize_normalizeHexDigit(component, t2, new P.Uri__normalize_isLowerCaseHexDigit());
+        t5 = new P.Uri__normalize_decodeHexDigitPair(component);
+        t1.result_1 = null;
+        $length = component.length;
+        t1.prevIndex_2 = 0;
+        t6 = new P.Uri__normalize_fillResult(t1, component);
+        for (t7 = index; t7 < $length;) {
+          if ($length < t7 + 2)
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + component));
+          codeUnit1 = C.JSString_methods.codeUnitAt$1(component, t7 + 1);
+          codeUnit2 = C.JSString_methods.codeUnitAt$1(component, t1.index_0 + 2);
+          decodedCodeUnit = t5.call$1(t1.index_0 + 1);
+          if (t2.call$1(codeUnit1) === true && t2.call$1(codeUnit2) === true && t3.call$1(decodedCodeUnit) !== true)
+            t7 = t1.index_0 += 3;
+          else {
+            t6.call$0();
+            t7 = t3.call$1(decodedCodeUnit);
+            t8 = t1.result_1;
+            if (t7 === true) {
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(decodedCodeUnit);
+              t8._contents += t7;
+            } else {
+              t8.toString;
+              t8._contents += "%";
+              t7 = t4.call$1(t1.index_0 + 1);
+              t8.toString;
+              t7 = H.Primitives_stringFromCharCode(t7);
+              t8._contents += t7;
+              t7 = t1.result_1;
+              t8 = t4.call$1(t1.index_0 + 2);
+              t7.toString;
+              t8 = H.Primitives_stringFromCharCode(t8);
+              t7._contents += t8;
+            }
+            t7 = t1.index_0 += 3;
+            t1.prevIndex_2 = t7;
+          }
+          next = C.JSString_methods.indexOf$2(component, "%", t7);
+          if (next >= t1.index_0) {
+            t1.index_0 = next;
+            t7 = next;
+          } else {
+            t1.index_0 = $length;
+            t7 = $length;
+          }
+        }
+        if (t1.result_1 == null)
+          return component;
+        if (t1.prevIndex_2 !== t7)
+          t6.call$0();
+        return J.toString$0(t1.result_1);
+      }, Uri_parseIPv4Address: function(host) {
+        var t1, bytes;
+        t1 = new P.Uri_parseIPv4Address_error();
+        bytes = host.split(".");
+        if (bytes.length !== 4)
+          t1.call$1("IPv4 address should contain exactly 4 parts");
+        return H.setRuntimeTypeInfo(new H.MappedListIterable(bytes, new P.Uri_parseIPv4Address_closure(t1)), [null, null]).toList$0(0);
+      }, Uri_parseIPv6Address: function(host) {
+        var error, parseHex, parts, partStart, last, wildcardSeen, i, t1, t2, atEnd, isLastWildcard, exception;
+        error = new P.Uri_parseIPv6Address_error();
+        parseHex = new P.Uri_parseIPv6Address_parseHex(host, error);
+        if (J.get$length$asx(host) < 2)
+          error.call$1("address is too short");
+        parts = [];
+        partStart = 0;
+        wildcardSeen = false;
+        i = 0;
+        while (true) {
+          t1 = J.get$length$asx(host);
+          if (typeof t1 !== "number")
+            return H.iae(t1);
+          if (!(i < t1))
+            break;
+          t1 = host;
+          t2 = J.get$length$asx(t1);
+          if (typeof t2 !== "number")
+            return H.iae(t2);
+          if (i >= t2)
+            H.throwExpression(P.RangeError$value(i));
+          if (t1.charCodeAt(i) === 58) {
+            if (i === 0) {
+              ++i;
+              t1 = host;
+              if (i >= J.get$length$asx(t1))
+                H.throwExpression(P.RangeError$value(i));
+              if (t1.charCodeAt(i) !== 58)
+                error.call$1("invalid start colon.");
+              partStart = i;
+            }
+            if (i === partStart) {
+              if (wildcardSeen)
+                error.call$1("only one wildcard `::` is allowed");
+              J.add$1$ax(parts, -1);
+              wildcardSeen = true;
+            } else
+              J.add$1$ax(parts, parseHex.call$2(partStart, i));
+            partStart = i + 1;
+          }
+          ++i;
+        }
+        if (J.get$length$asx(parts) === 0)
+          error.call$1("too few parts");
+        atEnd = J.$eq(partStart, J.get$length$asx(host));
+        isLastWildcard = J.$eq(J.get$last$ax(parts), -1);
+        if (atEnd && !isLastWildcard)
+          error.call$1("expected a part after last `:`");
+        if (!atEnd)
+          try {
+            J.add$1$ax(parts, parseHex.call$2(partStart, J.get$length$asx(host)));
+          } catch (exception) {
+            H.unwrapException(exception);
+            try {
+              last = P.Uri_parseIPv4Address(J.substring$1$s(host, partStart));
+              t1 = J.$shl$n(J.$index$asx(last, 0), 8);
+              t2 = J.$index$asx(last, 1);
+              if (typeof t2 !== "number")
+                return H.iae(t2);
+              J.add$1$ax(parts, (t1 | t2) >>> 0);
+              t2 = J.$shl$n(J.$index$asx(last, 2), 8);
+              t1 = J.$index$asx(last, 3);
+              if (typeof t1 !== "number")
+                return H.iae(t1);
+              J.add$1$ax(parts, (t2 | t1) >>> 0);
+            } catch (exception) {
+              H.unwrapException(exception);
+              error.call$1("invalid end of IPv6 address.");
+            }
+
+          }
+
+        if (wildcardSeen) {
+          if (J.get$length$asx(parts) > 7)
+            error.call$1("an address with a wildcard must have less than 7 parts");
+        } else if (J.get$length$asx(parts) !== 8)
+          error.call$1("an address without a wildcard must contain exactly 8 parts");
+        t1 = new H.ExpandIterable(parts, new P.Uri_parseIPv6Address_closure(parts));
+        t1.$builtinTypeInfo = [null, null];
+        return P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+      }, Uri__uriEncode: function(canonicalTable, text, encoding, spaceToPlus) {
+        var t1, result, bytes, i, $byte, t2, t3;
+        t1 = new P.Uri__uriEncode_byteToHex();
+        result = P.StringBuffer$("");
+        bytes = encoding.get$encoder().convert$1(text);
+        for (i = 0; i < bytes.length; ++i) {
+          $byte = bytes[i];
+          t2 = J.getInterceptor$n($byte);
+          if (t2.$lt($byte, 128)) {
+            t3 = t2.$shr($byte, 4);
+            if (t3 >= 8)
+              return H.ioore(canonicalTable, t3);
+            t3 = (canonicalTable[t3] & C.JSInt_methods._shlPositive$1(1, t2.$and($byte, 15))) !== 0;
+          } else
+            t3 = false;
+          if (t3) {
+            t2 = H.Primitives_stringFromCharCode($byte);
+            result._contents += t2;
+          } else if (spaceToPlus && t2.$eq($byte, 32)) {
+            t2 = H.Primitives_stringFromCharCode(43);
+            result._contents += t2;
+          } else {
+            t2 = H.Primitives_stringFromCharCode(37);
+            result._contents += t2;
+            t1.call$2($byte, result);
+          }
+        }
+        return result._contents;
+      }}
+  },
+  Uri_parse_isRegName: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_qNA, t1);
+        t1 = (C.List_qNA[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri_parse_ipV6Address: {
+    "^": "Closure:125;uri_0",
+    call$1: function(index) {
+      index = J.indexOf$2$asx(this.uri_0, "]", index);
+      if (index === -1)
+        throw H.wrapException(P.FormatException$("Bad end of IPv6 host"));
+      return index + 1;
+    },
+    $isFunction: true
+  },
+  Uri__makeScheme_isSchemeLowerCharacter: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = ch >>> 4;
+        if (t1 >= 8)
+          return H.ioore(C.List_6Pr, t1);
+        t1 = (C.List_6Pr[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__makePath_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return P.Uri__uriEncode(C.List_qg4, s, C.Utf8Codec_false, false);
+    },
+    $isFunction: true
+  },
+  Uri__makeQuery_closure: {
+    "^": "Closure:75;box_0,result_1",
+    call$2: function(key, value) {
+      var t1 = this.box_0;
+      if (!t1.first_0)
+        this.result_1.write$1("&");
+      t1.first_0 = false;
+      t1 = this.result_1;
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, key, C.Utf8Codec_false, true));
+      value.get$isEmpty(value);
+      t1.write$1("=");
+      t1.write$1(P.Uri__uriEncode(C.List_nxB, value, C.Utf8Codec_false, true));
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isNormalizedHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      var t1;
+      if (!(48 <= digit && digit <= 57))
+        t1 = 65 <= digit && digit <= 70;
+      else
+        t1 = true;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isLowerCaseHexDigit: {
+    "^": "Closure:124;",
+    call$1: function(digit) {
+      return 97 <= digit && digit <= 102;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_isUnreserved: {
+    "^": "Closure:124;",
+    call$1: function(ch) {
+      var t1;
+      if (ch < 128) {
+        t1 = C.JSInt_methods._shrOtherPositive$1(ch, 4);
+        if (t1 >= 8)
+          return H.ioore(C.List_nxB, t1);
+        t1 = (C.List_nxB[t1] & C.JSInt_methods._shlPositive$1(1, ch & 15)) !== 0;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_normalizeHexDigit: {
+    "^": "Closure:125;component_1,isNormalizedHexDigit_2,isLowerCaseHexDigit_3",
+    call$1: function(index) {
+      var t1, codeUnit;
+      t1 = this.component_1;
+      codeUnit = J.codeUnitAt$1$s(t1, index);
+      if (this.isLowerCaseHexDigit_3.call$1(codeUnit) === true)
+        return codeUnit - 32;
+      else if (this.isNormalizedHexDigit_2.call$1(codeUnit) !== true)
+        throw H.wrapException(P.ArgumentError$("Invalid URI component: " + t1));
+      else
+        return codeUnit;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_decodeHexDigitPair: {
+    "^": "Closure:125;component_4",
+    call$1: function(index) {
+      var t1, t2, $byte, i, codeUnit;
+      for (t1 = this.component_4, t2 = J.getInterceptor$s(t1), $byte = 0, i = 0; i < 2; ++i) {
+        codeUnit = t2.codeUnitAt$1(t1, index + i);
+        if (48 <= codeUnit && codeUnit <= 57)
+          $byte = $byte * 16 + codeUnit - 48;
+        else {
+          codeUnit |= 32;
+          if (97 <= codeUnit && codeUnit <= 102)
+            $byte = $byte * 16 + codeUnit - 97 + 10;
+          else
+            throw H.wrapException(P.ArgumentError$("Invalid percent-encoding in URI component: " + t1));
+        }
+      }
+      return $byte;
+    },
+    $isFunction: true
+  },
+  Uri__normalize_fillResult: {
+    "^": "Closure:18;box_0,component_5",
+    call$0: function() {
+      var t1, t2, t3, t4, t5;
+      t1 = this.box_0;
+      t2 = t1.result_1;
+      t3 = t1.prevIndex_2;
+      t4 = this.component_5;
+      t5 = t1.index_0;
+      if (t2 == null)
+        t1.result_1 = P.StringBuffer$(J.substring$2$s(t4, t3, t5));
+      else
+        t2.write$1(J.substring$2$s(t4, t3, t5));
+    },
+    $isFunction: true
+  },
+  Uri_hashCode_combine: {
+    "^": "Closure:126;",
+    call$2: function(part, current) {
+      var t1 = J.get$hashCode$(part);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return current * 31 + t1 & 1073741823;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv4 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv4Address_closure: {
+    "^": "Closure:13;error_0",
+    call$1: [function(byteString) {
+      var $byte, t1;
+      $byte = H.Primitives_parseInt(byteString, null, null);
+      t1 = J.getInterceptor$n($byte);
+      if (t1.$lt($byte, 0) || t1.$gt($byte, 255))
+        this.error_0.call$1("each part must be in the range of `0..255`");
+      return $byte;
+    }, "call$1", null, 2, 0, null, 127, "call"],
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_error: {
+    "^": "Closure:43;",
+    call$1: function(msg) {
+      throw H.wrapException(P.FormatException$("Illegal IPv6 address, " + msg));
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_parseHex: {
+    "^": "Closure:87;host_0,error_1",
+    call$2: function(start, end) {
+      var value, t1;
+      if (end - start > 4)
+        this.error_1.call$1("an IPv6 part can only contain a maximum of 4 hex digits");
+      value = H.Primitives_parseInt(C.JSString_methods.substring$2(this.host_0, start, end), 16, null);
+      t1 = J.getInterceptor$n(value);
+      if (t1.$lt(value, 0) || t1.$gt(value, 65535))
+        this.error_1.call$1("each part must be in the range of `0x0..0xFFFF`");
+      return value;
+    },
+    $isFunction: true
+  },
+  Uri_parseIPv6Address_closure: {
+    "^": "Closure:13;parts_2",
+    call$1: function(value) {
+      var t1 = J.getInterceptor(value);
+      if (t1.$eq(value, -1))
+        return P.List_List$filled((9 - this.parts_2.length) * 2, 0, null);
+      else
+        return [t1.$shr(value, 8) & 255, t1.$and(value, 255)];
+    },
+    $isFunction: true
+  },
+  Uri__uriEncode_byteToHex: {
+    "^": "Closure:75;",
+    call$2: function($byte, buffer) {
+      var t1 = J.getInterceptor$n($byte);
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$shr($byte, 4))));
+      buffer.write$1(H.Primitives_stringFromCharCode(C.JSString_methods.codeUnitAt$1("0123456789ABCDEF", t1.$and($byte, 15))));
+    },
+    $isFunction: true
+  }
+}],
+["dart.dom.html", "dart:html", , W, {
+  "^": "",
+  CustomEvent_CustomEvent: function(type, canBubble, cancelable, detail) {
+    var e, t1, exception;
+    e = document.createEvent("CustomEvent");
+    J.set$_dartDetail$x(e, detail);
+    if (!J.getInterceptor(detail).$isList)
+      if (!J.getInterceptor(detail).$isMap) {
+        t1 = detail;
+        if (typeof t1 !== "string") {
+          t1 = detail;
+          t1 = typeof t1 === "number";
+        } else
+          t1 = true;
+      } else
+        t1 = true;
+    else
+      t1 = true;
+    if (t1)
+      try {
+        detail = P._convertDartToNative_PrepareForStructuredClone(detail);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, detail);
+      } catch (exception) {
+        H.unwrapException(exception);
+        J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+      }
+
+    else
+      J._initCustomEvent$4$x(e, type, canBubble, cancelable, null);
+    return e;
+  },
+  _ElementFactoryProvider_createElement_tag: function(tag, typeExtension) {
+    return document.createElement(tag);
+  },
+  HttpRequest_request: function(url, method, mimeType, onProgress, requestHeaders, responseType, sendData, withCredentials) {
+    var t1, completer, xhr;
+    t1 = W.HttpRequest;
+    completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(t1)), [t1]);
+    xhr = new XMLHttpRequest();
+    C.HttpRequest_methods.open$3$async(xhr, "GET", url, true);
+    requestHeaders.forEach$1(0, new W.HttpRequest_request_closure(xhr));
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_load._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new W.HttpRequest_request_closure0(completer, xhr)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    t1 = H.setRuntimeTypeInfo(new W._EventStream(xhr, C.EventStreamProvider_error._eventType, false), [null]);
+    H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(completer.get$completeError()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    xhr.send();
+    return completer.future;
+  },
+  InputElement_InputElement: function(type) {
+    var e, exception;
+    e = document.createElement("input", null);
+    if (type != null)
+      try {
+        J.set$type$x(e, type);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return e;
+  },
+  _JenkinsSmiHash_combine: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _convertNativeToDart_Window: function(win) {
+    if (win == null)
+      return;
+    return W._DOMWindowCrossFrame__createSafe(win);
+  },
+  _convertNativeToDart_EventTarget: function(e) {
+    var $window;
+    if (e == null)
+      return;
+    if ("setInterval" in e) {
+      $window = W._DOMWindowCrossFrame__createSafe(e);
+      if (!!J.getInterceptor($window).$isEventTarget)
+        return $window;
+      return;
+    } else
+      return e;
+  },
+  _convertDartToNative_EventTarget: function(e) {
+    return e;
+  },
+  _convertNativeToDart_XHR_Response: function(o) {
+    if (!!J.getInterceptor(o).$isDocument)
+      return o;
+    return P.convertNativeToDart_AcceptStructuredClone(o, true);
+  },
+  _callConstructor: function($constructor, interceptor) {
+    return new W._callConstructor_closure($constructor, interceptor);
+  },
+  _callAttached: [function(receiver) {
+    return J.attached$0$x(receiver);
+  }, "call$1", "_callAttached$closure", 2, 0, 13, 54],
+  _callDetached: [function(receiver) {
+    return J.detached$0$x(receiver);
+  }, "call$1", "_callDetached$closure", 2, 0, 13, 54],
+  _callAttributeChanged: [function(receiver, $name, oldValue, newValue) {
+    return J.attributeChanged$3$x(receiver, $name, oldValue, newValue);
+  }, "call$4", "_callAttributeChanged$closure", 8, 0, 55, 54, 56, 57, 58],
+  _registerCustomElement: function(context, $document, tag, type, extendsTagName) {
+    var interceptorClass, interceptor, $constructor, baseClassName, t1, baseConstructor, properties, proto, t2, options;
+    interceptorClass = J.findInterceptorConstructorForType(type);
+    if (interceptorClass == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    interceptor = interceptorClass.prototype;
+    $constructor = J.findConstructorForNativeSubclassType(type, "created");
+    if ($constructor == null)
+      throw H.wrapException(P.ArgumentError$(H.S(type) + " has no constructor called 'created'"));
+    J.getNativeInterceptor(W._ElementFactoryProvider_createElement_tag("article", null));
+    baseClassName = interceptorClass.$nativeSuperclassTag;
+    if (baseClassName == null)
+      throw H.wrapException(P.ArgumentError$(type));
+    t1 = extendsTagName == null;
+    if (t1) {
+      if (!J.$eq(baseClassName, "HTMLElement"))
+        throw H.wrapException(P.UnsupportedError$("Class must provide extendsTag if base native class is not HtmlElement"));
+    } else if (!($document.createElement(extendsTagName) instanceof window[baseClassName]))
+      throw H.wrapException(P.UnsupportedError$("extendsTag does not match base native class"));
+    baseConstructor = context[baseClassName];
+    properties = {};
+    properties.createdCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callConstructor($constructor, interceptor), 1))};
+    properties.attachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callAttached$closure(), 1))};
+    properties.detachedCallback = {value: function(invokeCallback) {
+        return function() {
+          return invokeCallback(this);
+        };
+      }(H.convertDartClosureToJS(W._callDetached$closure(), 1))};
+    properties.attributeChangedCallback = {value: function(invokeCallback) {
+        return function(arg1, arg2, arg3) {
+          return invokeCallback(this, arg1, arg2, arg3);
+        };
+      }(H.convertDartClosureToJS(W._callAttributeChanged$closure(), 4))};
+    proto = Object.create(baseConstructor.prototype, properties);
+    t2 = H.makeLeafDispatchRecord(interceptor);
+    Object.defineProperty(proto, init.dispatchPropertyName, {value: t2, enumerable: false, writable: true, configurable: true});
+    options = {prototype: proto};
+    if (!t1)
+      options.extends = extendsTagName;
+    $document.registerElement(tag, options);
+  },
+  _wrapZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    if (callback == null)
+      return;
+    return $.Zone__current.bindUnaryCallback$2$runGuarded(callback, true);
+  },
+  _wrapBinaryZone: function(callback) {
+    if (J.$eq($.Zone__current, C.C__RootZone))
+      return callback;
+    return $.Zone__current.bindBinaryCallback$2$runGuarded(callback, true);
+  },
+  HtmlElement: {
+    "^": "Element;",
+    "%": "HTMLAppletElement|HTMLBRElement|HTMLContentElement|HTMLDListElement|HTMLDataListElement|HTMLDirectoryElement|HTMLDivElement|HTMLFontElement|HTMLFrameElement|HTMLHRElement|HTMLHeadElement|HTMLHeadingElement|HTMLHtmlElement|HTMLMarqueeElement|HTMLMenuElement|HTMLModElement|HTMLParagraphElement|HTMLPreElement|HTMLQuoteElement|HTMLShadowElement|HTMLSpanElement|HTMLTableCaptionElement|HTMLTableColElement|HTMLTitleElement|HTMLUListElement|HTMLUnknownElement;HTMLElement;HtmlElement_Polymer|HtmlElement_Polymer_ChangeNotifier|PolymerElement|PolymerElement_ChangeNotifier|ActionLinkElement|ObservatoryElement|ObservatoryElement_ChangeNotifier|BreakpointListElement|ObservatoryElement_ChangeNotifier0|ServiceRefElement|ClassRefElement|ObservatoryElement_ChangeNotifier1|ClassTreeElement|ObservatoryElement_ChangeNotifier2|ClassViewElement|CodeRefElement|ObservatoryElement_ChangeNotifier3|CodeViewElement|PolymerElement_ChangeNotifier0|CurlyBlockElement|ObservatoryElement_ChangeNotifier4|ErrorViewElement|ObservatoryElement_ChangeNotifier5|EvalBoxElement|PolymerElement_ChangeNotifier1|EvalLinkElement|FieldRefElement|ObservatoryElement_ChangeNotifier6|FieldViewElement|ObservatoryElement_ChangeNotifier7|FlagListElement|ObservatoryElement_ChangeNotifier8|FlagItemElement|ServiceRefElement_ChangeNotifier|FunctionRefElement|ObservatoryElement_ChangeNotifier9|FunctionViewElement|ObservatoryElement_ChangeNotifier10|HeapMapElement|ObservatoryElement_ChangeNotifier11|HeapProfileElement|InstanceRefElement|ObservatoryElement_ChangeNotifier12|InstanceViewElement|ObservatoryElement_ChangeNotifier13|IOViewElement|IORefElement|ObservatoryElement_ChangeNotifier14|IOHttpServerListViewElement|IOHttpServerRefElement|ObservatoryElement_ChangeNotifier15|IOHttpServerViewElement|ObservatoryElement_ChangeNotifier16|IOHttpServerConnectionViewElement|IOHttpServerConnectionRefElement|IOSocketRefElement|ObservatoryElement_ChangeNotifier17|IOSocketListViewElement|ObservatoryElement_ChangeNotifier18|IOSocketViewElement|IOWebSocketRefElement|ObservatoryElement_ChangeNotifier19|IOWebSocketListViewElement|ObservatoryElement_ChangeNotifier20|IOWebSocketViewElement|ObservatoryElement_ChangeNotifier21|IORandomAccessFileListViewElement|IORandomAccessFileRefElement|ObservatoryElement_ChangeNotifier22|IORandomAccessFileViewElement|ObservatoryElement_ChangeNotifier23|IOProcessListViewElement|ServiceRefElement_ChangeNotifier0|IOProcessRefElement|ObservatoryElement_ChangeNotifier24|IOProcessViewElement|ObservatoryElement_ChangeNotifier25|IsolateProfileElement|IsolateRefElement|ObservatoryElement_ChangeNotifier26|IsolateSummaryElement|ObservatoryElement_ChangeNotifier27|IsolateRunStateElement|ObservatoryElement_ChangeNotifier28|IsolateLocationElement|ObservatoryElement_ChangeNotifier29|IsolateSharedSummaryElement|ObservatoryElement_ChangeNotifier30|IsolateCounterChartElement|ObservatoryElement_ChangeNotifier31|IsolateViewElement|ObservatoryElement_ChangeNotifier32|JsonViewElement|LibraryRefElement|ObservatoryElement_ChangeNotifier33|LibraryViewElement|ObservatoryElement_ChangeNotifier34|NavBarElement|ObservatoryElement_ChangeNotifier35|NavMenuElement|ObservatoryElement_ChangeNotifier36|NavMenuItemElement|ObservatoryElement_ChangeNotifier37|NavRefreshElement|NavControlElement|ObservatoryElement_ChangeNotifier38|TopNavMenuElement|ObservatoryElement_ChangeNotifier39|IsolateNavMenuElement|ObservatoryElement_ChangeNotifier40|LibraryNavMenuElement|ObservatoryElement_ChangeNotifier41|ClassNavMenuElement|ObservatoryElement_ChangeNotifier42|ObservatoryApplicationElement|ObservatoryElement_ChangeNotifier43|ScriptInsetElement|ServiceRefElement_ChangeNotifier1|ScriptRefElement|ObservatoryElement_ChangeNotifier44|ScriptViewElement|ObservatoryElement_ChangeNotifier45|ServiceErrorViewElement|ObservatoryElement_ChangeNotifier46|ServiceExceptionViewElement|ObservatoryElement_ChangeNotifier47|ServiceObjectViewElement|PolymerElement_ChangeNotifier2|SlidingCheckboxElement|ObservatoryElement_ChangeNotifier48|StackFrameElement|ObservatoryElement_ChangeNotifier49|StackTraceElement|VMRefElement|ObservatoryElement_ChangeNotifier50|VMViewElement"
+  },
+  _EntryArray: {
+    "^": "Interceptor;",
+    $isList: true,
+    $asList: function() {
+      return [W.Entry];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Entry];
+    },
+    "%": "EntryArray"
+  },
+  AnchorElement: {
+    "^": "HtmlElement;target=,type%,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAnchorElement"
+  },
+  AreaElement: {
+    "^": "HtmlElement;target=,href%,protocol=",
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "HTMLAreaElement"
+  },
+  BaseElement: {
+    "^": "HtmlElement;href%,target=",
+    "%": "HTMLBaseElement"
+  },
+  Blob: {
+    "^": "Interceptor;type=",
+    $isBlob: true,
+    "%": ";Blob"
+  },
+  BodyElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLBodyElement"
+  },
+  ButtonElement: {
+    "^": "HtmlElement;form=,name%,type%,value%",
+    "%": "HTMLButtonElement"
+  },
+  CanvasElement: {
+    "^": "HtmlElement;height},width}",
+    get$context2D: function(receiver) {
+      return receiver.getContext("2d");
+    },
+    "%": "HTMLCanvasElement"
+  },
+  CanvasRenderingContext: {
+    "^": "Interceptor;",
+    "%": ";CanvasRenderingContext"
+  },
+  CanvasRenderingContext2D: {
+    "^": "CanvasRenderingContext;",
+    putImageData$7: function(receiver, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+      var t1;
+      if (dirtyWidth != null)
+        t1 = true;
+      else
+        t1 = false;
+      if (t1) {
+        receiver.putImageData(P.convertDartToNative_ImageData(imagedata), dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+        return;
+      }
+      throw H.wrapException(P.ArgumentError$("Incorrect number or type of arguments"));
+    },
+    "%": "CanvasRenderingContext2D"
+  },
+  CharacterData: {
+    "^": "Node;data=,length=,nextElementSibling=",
+    "%": "Comment;CharacterData"
+  },
+  CloseEvent: {
+    "^": "Event;code=",
+    "%": "CloseEvent"
+  },
+  CompositionEvent: {
+    "^": "UIEvent;data=",
+    "%": "CompositionEvent"
+  },
+  CustomEvent: {
+    "^": "Event;_dartDetail}",
+    get$detail: function(receiver) {
+      var t1 = receiver._dartDetail;
+      if (t1 != null)
+        return t1;
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.detail, true);
+    },
+    _initCustomEvent$4: function(receiver, typeArg, canBubbleArg, cancelableArg, detailArg) {
+      return receiver.initCustomEvent(typeArg, canBubbleArg, cancelableArg, detailArg);
+    },
+    $isCustomEvent: true,
+    "%": "CustomEvent"
+  },
+  DetailsElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDetailsElement"
+  },
+  DialogElement: {
+    "^": "HtmlElement;",
+    open$1: function($receiver, arg0) {
+      return $receiver.open.call$1(arg0);
+    },
+    "%": "HTMLDialogElement"
+  },
+  Document: {
+    "^": "Node;",
+    createDocumentFragment$0: function(receiver) {
+      return receiver.createDocumentFragment();
+    },
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    importNode$2: function(receiver, node, deep) {
+      return receiver.importNode(node, deep);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    $isDocument: true,
+    "%": "XMLDocument;Document"
+  },
+  DocumentFragment: {
+    "^": "Node;",
+    get$children: function(receiver) {
+      if (receiver._docChildren == null)
+        receiver._docChildren = H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [null]);
+      return receiver._docChildren;
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    "%": ";DocumentFragment"
+  },
+  DomError: {
+    "^": "Interceptor;message=,name=",
+    "%": ";DOMError"
+  },
+  DomException: {
+    "^": "Interceptor;message=",
+    get$name: function(receiver) {
+      var errorName = receiver.name;
+      if (P.Device_isWebKit() === true && errorName === "SECURITY_ERR")
+        return "SecurityError";
+      if (P.Device_isWebKit() === true && errorName === "SYNTAX_ERR")
+        return "SyntaxError";
+      return errorName;
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    $isDomException: true,
+    "%": "DOMException"
+  },
+  Element: {
+    "^": "Node;title},className%,id=,tagName=,nextElementSibling=",
+    get$attributes: function(receiver) {
+      return new W._ElementAttributeMap(receiver);
+    },
+    get$children: function(receiver) {
+      return new W._ChildrenElementList(receiver, receiver.children);
+    },
+    querySelectorAll$1: function(receiver, selectors) {
+      return W._FrozenElementList$_wrap(receiver.querySelectorAll(selectors), null);
+    },
+    get$classes: function(receiver) {
+      return new W._ElementCssClassSet(receiver);
+    },
+    get$offset: function(receiver) {
+      return P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(receiver.offsetHeight)), null);
+    },
+    attached$0: function(receiver) {
+    },
+    detached$0: function(receiver) {
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+    },
+    get$localName: function(receiver) {
+      return receiver.localName;
+    },
+    get$namespaceUri: function(receiver) {
+      return receiver.namespaceURI;
+    },
+    toString$0: function(receiver) {
+      return receiver.localName;
+    },
+    matches$1: function(receiver, selectors) {
+      if (!!receiver.matches)
+        return receiver.matches(selectors);
+      else if (!!receiver.webkitMatchesSelector)
+        return receiver.webkitMatchesSelector(selectors);
+      else if (!!receiver.mozMatchesSelector)
+        return receiver.mozMatchesSelector(selectors);
+      else if (!!receiver.msMatchesSelector)
+        return receiver.msMatchesSelector(selectors);
+      else if (!!receiver.oMatchesSelector)
+        return receiver.oMatchesSelector(selectors);
+      else
+        throw H.wrapException(P.UnsupportedError$("Not supported on this platform"));
+    },
+    matchesWithAncestors$1: function(receiver, selectors) {
+      var elem = receiver;
+      do {
+        if (J.matches$1$x(elem, selectors))
+          return true;
+        elem = elem.parentElement;
+      } while (elem != null);
+      return false;
+    },
+    createShadowRoot$0: function(receiver) {
+      return (receiver.createShadowRoot || receiver.webkitCreateShadowRoot).call(receiver);
+    },
+    get$on: function(receiver) {
+      return new W.ElementEvents(receiver, receiver);
+    },
+    getAttribute$1: function(receiver, $name) {
+      return receiver.getAttribute($name);
+    },
+    getBoundingClientRect$0: function(receiver) {
+      return receiver.getBoundingClientRect();
+    },
+    querySelector$1: function(receiver, selectors) {
+      return receiver.querySelector(selectors);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    Element$created$0: function(receiver) {
+    },
+    $isElement: true,
+    $isEventTarget: true,
+    "%": ";Element"
+  },
+  EmbedElement: {
+    "^": "HtmlElement;height},name%,type%,width}",
+    "%": "HTMLEmbedElement"
+  },
+  ErrorEvent: {
+    "^": "Event;error=,message=",
+    "%": "ErrorEvent"
+  },
+  Event: {
+    "^": "Interceptor;_selector},path=,type=",
+    get$currentTarget: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.currentTarget);
+    },
+    get$target: function(receiver) {
+      return W._convertNativeToDart_EventTarget(receiver.target);
+    },
+    preventDefault$0: function(receiver) {
+      return receiver.preventDefault();
+    },
+    $isEvent: true,
+    "%": "AudioProcessingEvent|AutocompleteErrorEvent|BeforeLoadEvent|BeforeUnloadEvent|CSSFontFaceLoadEvent|DeviceMotionEvent|DeviceOrientationEvent|HashChangeEvent|IDBVersionChangeEvent|InstallEvent|InstallPhaseEvent|MIDIConnectionEvent|MediaKeyNeededEvent|MediaStreamEvent|MediaStreamTrackEvent|MutationEvent|OfflineAudioCompletionEvent|OverflowEvent|PageTransitionEvent|RTCDTMFToneChangeEvent|RTCDataChannelEvent|RTCIceCandidateEvent|SpeechInputEvent|TrackEvent|TransitionEvent|WebGLContextEvent|WebKitAnimationEvent|WebKitTransitionEvent;Event"
+  },
+  EventTarget: {
+    "^": "Interceptor;",
+    get$on: function(receiver) {
+      return new W.Events(receiver);
+    },
+    addEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.addEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    addEventListener$2: function($receiver, type, listener) {
+      listener = H.convertDartClosureToJS(listener, 1);
+      return $receiver.addEventListener(type, listener);
+    },
+    dispatchEvent$1: function(receiver, $event) {
+      return receiver.dispatchEvent($event);
+    },
+    removeEventListener$3: function(receiver, type, listener, useCapture) {
+      return receiver.removeEventListener(type, H.convertDartClosureToJS(listener, 1), useCapture);
+    },
+    $isEventTarget: true,
+    "%": ";EventTarget"
+  },
+  FieldSetElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLFieldSetElement"
+  },
+  File: {
+    "^": "Blob;name=",
+    $isFile: true,
+    "%": "File"
+  },
+  FileError: {
+    "^": "DomError;code=",
+    "%": "FileError"
+  },
+  FormElement: {
+    "^": "HtmlElement;length=,name%,target=",
+    "%": "HTMLFormElement"
+  },
+  History: {
+    "^": "Interceptor;length=",
+    "%": "History"
+  },
+  HtmlCollection: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "HTMLCollection|HTMLFormControlsCollection|HTMLOptionsCollection"
+  },
+  HtmlDocument: {
+    "^": "Document;",
+    get$head: function(receiver) {
+      return receiver.head;
+    },
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "HTMLDocument"
+  },
+  HttpRequest: {
+    "^": "HttpRequestEventTarget;responseText=,status=,statusText=",
+    get$response: function(receiver) {
+      return W._convertNativeToDart_XHR_Response(receiver.response);
+    },
+    open$5$async$password$user: function(receiver, method, url, async, password, user) {
+      return receiver.open(method, url, async, user, password);
+    },
+    open$3$async: function($receiver, method, url, async) {
+      return $receiver.open(method, url, async);
+    },
+    send$1: function(receiver, data) {
+      return receiver.send(data);
+    },
+    $isHttpRequest: true,
+    "%": "XMLHttpRequest"
+  },
+  HttpRequestEventTarget: {
+    "^": "EventTarget;",
+    "%": ";XMLHttpRequestEventTarget"
+  },
+  IFrameElement: {
+    "^": "HtmlElement;height},name%,width}",
+    "%": "HTMLIFrameElement"
+  },
+  ImageData: {
+    "^": "Interceptor;data=,height=,width=",
+    $isImageData: true,
+    "%": "ImageData"
+  },
+  ImageElement: {
+    "^": "HtmlElement;height},width}",
+    complete$1: function($receiver, arg0) {
+      return $receiver.complete.call$1(arg0);
+    },
+    "%": "HTMLImageElement"
+  },
+  InputElement: {
+    "^": "HtmlElement;checked%,form=,height},list=,name%,type%,value%,width}",
+    accept$1: function($receiver, arg0) {
+      return $receiver.accept.call$1(arg0);
+    },
+    $isInputElement: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true,
+    "%": "HTMLInputElement"
+  },
+  KeyboardEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "KeyboardEvent"
+  },
+  KeygenElement: {
+    "^": "HtmlElement;form=,name%,type=",
+    "%": "HTMLKeygenElement"
+  },
+  LIElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLLIElement"
+  },
+  LabelElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLabelElement"
+  },
+  LegendElement: {
+    "^": "HtmlElement;form=",
+    "%": "HTMLLegendElement"
+  },
+  LinkElement: {
+    "^": "HtmlElement;href%,type%",
+    "%": "HTMLLinkElement"
+  },
+  Location: {
+    "^": "Interceptor;href=,protocol=",
+    reload$0: function(receiver) {
+      return receiver.reload();
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    "%": "Location"
+  },
+  MapElement: {
+    "^": "HtmlElement;name%",
+    "%": "HTMLMapElement"
+  },
+  MediaElement: {
+    "^": "HtmlElement;error=",
+    load$0: function(receiver) {
+      return receiver.load();
+    },
+    pause$0: [function(receiver) {
+      return receiver.pause();
+    }, "call$0", "get$pause", 0, 0, 18],
+    "%": "HTMLAudioElement;HTMLMediaElement",
+    static: {"^": "MediaElement_pauseEvent<"}
+  },
+  MediaError: {
+    "^": "Interceptor;code=",
+    "%": "MediaError"
+  },
+  MediaKeyError: {
+    "^": "Interceptor;code=",
+    "%": "MediaKeyError"
+  },
+  MediaKeyEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyEvent"
+  },
+  MediaKeyMessageEvent: {
+    "^": "Event;message=",
+    "%": "MediaKeyMessageEvent"
+  },
+  MediaStream: {
+    "^": "EventTarget;id=,label=",
+    "%": "MediaStream"
+  },
+  MessageEvent: {
+    "^": "Event;",
+    get$data: function(receiver) {
+      return P.convertNativeToDart_AcceptStructuredClone(receiver.data, true);
+    },
+    $isMessageEvent: true,
+    "%": "MessageEvent"
+  },
+  MetaElement: {
+    "^": "HtmlElement;content=,name%",
+    "%": "HTMLMetaElement"
+  },
+  MeterElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLMeterElement"
+  },
+  MidiMessageEvent: {
+    "^": "Event;data=",
+    "%": "MIDIMessageEvent"
+  },
+  MidiOutput: {
+    "^": "MidiPort;",
+    send$2: function(receiver, data, timestamp) {
+      return receiver.send(data, timestamp);
+    },
+    send$1: function($receiver, data) {
+      return $receiver.send(data);
+    },
+    "%": "MIDIOutput"
+  },
+  MidiPort: {
+    "^": "EventTarget;id=,name=,type=,version=",
+    "%": "MIDIInput;MIDIPort"
+  },
+  MouseEvent: {
+    "^": "UIEvent;altKey=,button=,ctrlKey=,metaKey=,shiftKey=",
+    _initMouseEvent$15: function(receiver, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) {
+      receiver.initMouseEvent(type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, W._convertDartToNative_EventTarget(relatedTarget));
+      return;
+    },
+    get$offset: function(receiver) {
+      var target, point;
+      if (!!receiver.offsetX)
+        return H.setRuntimeTypeInfo(new P.Point(receiver.offsetX, receiver.offsetY), [null]);
+      else {
+        if (!J.getInterceptor(W._convertNativeToDart_EventTarget(receiver.target)).$isElement)
+          throw H.wrapException(P.UnsupportedError$("offsetX is only supported on elements"));
+        target = W._convertNativeToDart_EventTarget(receiver.target);
+        point = H.setRuntimeTypeInfo(new P.Point(receiver.clientX, receiver.clientY), [null]).$sub(0, J.get$topLeft$x(J.getBoundingClientRect$0$x(target)));
+        return H.setRuntimeTypeInfo(new P.Point(J.toInt$0$n(point.x), J.toInt$0$n(point.y)), [null]);
+      }
+    },
+    $isMouseEvent: true,
+    "%": "DragEvent|MSPointerEvent|MouseEvent|MouseScrollEvent|MouseWheelEvent|PointerEvent|WheelEvent"
+  },
+  MutationObserver: {
+    "^": "Interceptor;",
+    observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree: function(receiver, target, attributeFilter, attributeOldValue, attributes, characterData, characterDataOldValue, childList, subtree) {
+      var parsedOptions, t1;
+      parsedOptions = {};
+      t1 = new W.MutationObserver_observe_override(parsedOptions);
+      t1.call$2("childList", childList);
+      t1.call$2("attributes", attributes);
+      t1.call$2("characterData", characterData);
+      t1.call$2("subtree", subtree);
+      t1.call$2("attributeOldValue", attributeOldValue);
+      t1.call$2("characterDataOldValue", characterDataOldValue);
+      t1.call$2("attributeFilter", attributeFilter);
+      receiver.observe(target, parsedOptions);
+    },
+    observe$3$attributeFilter$attributes: function($receiver, target, attributeFilter, attributes) {
+      return this.observe$8$attributeFilter$attributeOldValue$attributes$characterData$characterDataOldValue$childList$subtree($receiver, target, attributeFilter, null, attributes, null, null, null, null);
+    },
+    "%": "MutationObserver|WebKitMutationObserver"
+  },
+  MutationRecord: {
+    "^": "Interceptor;target=,type=",
+    "%": "MutationRecord"
+  },
+  NavigatorUserMediaError: {
+    "^": "Interceptor;message=,name=",
+    "%": "NavigatorUserMediaError"
+  },
+  Node: {
+    "^": "EventTarget;firstChild=,nextNode:nextSibling=,ownerDocument=,parent:parentElement=,parentNode=,text:textContent%",
+    get$nodes: function(receiver) {
+      return new W._ChildNodeListLazy(receiver);
+    },
+    remove$0: function(receiver) {
+      var t1 = receiver.parentNode;
+      if (t1 != null)
+        t1.removeChild(receiver);
+    },
+    replaceWith$1: function(receiver, otherNode) {
+      var $parent, exception;
+      try {
+        $parent = receiver.parentNode;
+        J._replaceChild$2$x($parent, otherNode, receiver);
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+      return receiver;
+    },
+    insertAllBefore$2: function(receiver, newNodes, refChild) {
+      var t1, len, i;
+      t1 = J.getInterceptor(newNodes);
+      if (!!t1.$is_ChildNodeListLazy) {
+        t1 = newNodes._this;
+        if (t1 === receiver)
+          throw H.wrapException(P.ArgumentError$(newNodes));
+        for (len = t1.childNodes.length, i = 0; i < len; ++i)
+          receiver.insertBefore(t1.firstChild, refChild);
+      } else
+        for (t1 = t1.get$iterator(newNodes); t1.moveNext$0();)
+          receiver.insertBefore(t1.get$current(), refChild);
+    },
+    _clearChildren$0: function(receiver) {
+      var t1;
+      for (; t1 = receiver.firstChild, t1 != null;)
+        receiver.removeChild(t1);
+    },
+    toString$0: function(receiver) {
+      var t1 = receiver.nodeValue;
+      return t1 == null ? J.Interceptor.prototype.toString$0.call(this, receiver) : t1;
+    },
+    append$1: function(receiver, newChild) {
+      return receiver.appendChild(newChild);
+    },
+    contains$1: function(receiver, other) {
+      return receiver.contains(other);
+    },
+    insertBefore$2: function(receiver, newChild, refChild) {
+      return receiver.insertBefore(newChild, refChild);
+    },
+    _replaceChild$2: function(receiver, newChild, oldChild) {
+      return receiver.replaceChild(newChild, oldChild);
+    },
+    $isNode: true,
+    "%": "DocumentType|Notation;Node"
+  },
+  NodeList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin0;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "NodeList|RadioNodeList"
+  },
+  OListElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLOListElement"
+  },
+  ObjectElement: {
+    "^": "HtmlElement;data=,form=,height},name%,type%,width}",
+    "%": "HTMLObjectElement"
+  },
+  OptGroupElement: {
+    "^": "HtmlElement;label%",
+    "%": "HTMLOptGroupElement"
+  },
+  OptionElement: {
+    "^": "HtmlElement;form=,index=,label%,value%",
+    $isOptionElement: true,
+    "%": "HTMLOptionElement"
+  },
+  OutputElement: {
+    "^": "HtmlElement;form=,name%,type=,value%",
+    "%": "HTMLOutputElement"
+  },
+  ParamElement: {
+    "^": "HtmlElement;name%,value%",
+    "%": "HTMLParamElement"
+  },
+  PopStateEvent: {
+    "^": "Event;",
+    $isPopStateEvent: true,
+    "%": "PopStateEvent"
+  },
+  PositionError: {
+    "^": "Interceptor;code=,message=",
+    "%": "PositionError"
+  },
+  ProcessingInstruction: {
+    "^": "CharacterData;target=",
+    "%": "ProcessingInstruction"
+  },
+  ProgressElement: {
+    "^": "HtmlElement;value%",
+    "%": "HTMLProgressElement"
+  },
+  ProgressEvent: {
+    "^": "Event;loaded=",
+    $isProgressEvent: true,
+    "%": "XMLHttpRequestProgressEvent;ProgressEvent"
+  },
+  ResourceProgressEvent: {
+    "^": "ProgressEvent;url=",
+    "%": "ResourceProgressEvent"
+  },
+  ScriptElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLScriptElement"
+  },
+  SecurityPolicyViolationEvent: {
+    "^": "Event;lineNumber=",
+    "%": "SecurityPolicyViolationEvent"
+  },
+  SelectElement: {
+    "^": "HtmlElement;form=,length%,name%,selectedIndex%,type=,value%",
+    $isSelectElement: true,
+    "%": "HTMLSelectElement"
+  },
+  ShadowRoot: {
+    "^": "DocumentFragment;",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isShadowRoot: true,
+    "%": "ShadowRoot"
+  },
+  SourceElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLSourceElement"
+  },
+  SpeechRecognitionError: {
+    "^": "Event;error=,message=",
+    "%": "SpeechRecognitionError"
+  },
+  SpeechRecognitionEvent: {
+    "^": "Event;results=",
+    "%": "SpeechRecognitionEvent"
+  },
+  SpeechRecognitionResult: {
+    "^": "Interceptor;isFinal=,length=",
+    "%": "SpeechRecognitionResult"
+  },
+  SpeechSynthesisEvent: {
+    "^": "Event;name=",
+    "%": "SpeechSynthesisEvent"
+  },
+  StorageEvent: {
+    "^": "Event;key=,url=",
+    "%": "StorageEvent"
+  },
+  StyleElement: {
+    "^": "HtmlElement;type%",
+    "%": "HTMLStyleElement"
+  },
+  TableCellElement: {
+    "^": "HtmlElement;",
+    $isTableCellElement: true,
+    "%": "HTMLTableCellElement|HTMLTableDataCellElement|HTMLTableHeaderCellElement"
+  },
+  TableElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableElement"
+  },
+  TableRowElement: {
+    "^": "HtmlElement;rowIndex=",
+    insertCell$1: function(receiver, index) {
+      return receiver.insertCell(index);
+    },
+    $isTableRowElement: true,
+    "%": "HTMLTableRowElement"
+  },
+  TableSectionElement: {
+    "^": "HtmlElement;",
+    get$rows: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._WrappedList(receiver.rows), [W.TableRowElement]);
+    },
+    "%": "HTMLTableSectionElement"
+  },
+  TemplateElement: {
+    "^": "HtmlElement;content=",
+    $isTemplateElement: true,
+    "%": ";HTMLTemplateElement;TemplateElement_Polymer|TemplateElement_Polymer_Observable|AutoBindingElement"
+  },
+  Text: {
+    "^": "CharacterData;",
+    $isText: true,
+    "%": "CDATASection|Text"
+  },
+  TextAreaElement: {
+    "^": "HtmlElement;form=,name%,rows=,type=,value%",
+    $isTextAreaElement: true,
+    "%": "HTMLTextAreaElement"
+  },
+  TextEvent: {
+    "^": "UIEvent;data=",
+    "%": "TextEvent"
+  },
+  TouchEvent: {
+    "^": "UIEvent;altKey=,ctrlKey=,metaKey=,shiftKey=",
+    "%": "TouchEvent"
+  },
+  TrackElement: {
+    "^": "HtmlElement;kind%,label%",
+    "%": "HTMLTrackElement"
+  },
+  UIEvent: {
+    "^": "Event;detail=",
+    "%": "FocusEvent|SVGZoomEvent;UIEvent"
+  },
+  VideoElement: {
+    "^": "MediaElement;height},width}",
+    "%": "HTMLVideoElement"
+  },
+  Window: {
+    "^": "EventTarget;name%,status%",
+    _requestAnimationFrame$1: function(receiver, callback) {
+      return receiver.requestAnimationFrame(H.convertDartClosureToJS(callback, 1));
+    },
+    _ensureRequestAnimationFrame$0: function(receiver) {
+      if (!!(receiver.requestAnimationFrame && receiver.cancelAnimationFrame))
+        return;
+      (function($this) {
+        var vendors = ['ms', 'moz', 'webkit', 'o'];
+        for (var i = 0; i < vendors.length && !$this.requestAnimationFrame; ++i) {
+          $this.requestAnimationFrame = $this[vendors[i] + 'RequestAnimationFrame'];
+          $this.cancelAnimationFrame = $this[vendors[i] + 'CancelAnimationFrame'] || $this[vendors[i] + 'CancelRequestAnimationFrame'];
+        }
+        if ($this.requestAnimationFrame && $this.cancelAnimationFrame)
+          return;
+        $this.requestAnimationFrame = function(callback) {
+          return window.setTimeout(function() {
+            callback(Date.now());
+          }, 16);
+        };
+        $this.cancelAnimationFrame = function(id) {
+          clearTimeout(id);
+        };
+      })(receiver);
+    },
+    get$parent: function(receiver) {
+      return W._convertNativeToDart_Window(receiver.parent);
+    },
+    close$0: function(receiver) {
+      return receiver.close();
+    },
+    postMessage$3: function(receiver, message, targetOrigin, messagePorts) {
+      receiver.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+      return;
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    toString$0: function(receiver) {
+      return receiver.toString();
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._EventStream(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    $isWindow: true,
+    $isEventTarget: true,
+    "%": "DOMWindow|Window"
+  },
+  _Attr: {
+    "^": "Node;name=,value%",
+    "%": "Attr"
+  },
+  _ClientRect: {
+    "^": "Interceptor;bottom=,height=,left=,right=,top=,width=",
+    toString$0: function(receiver) {
+      return "Rectangle (" + H.S(receiver.left) + ", " + H.S(receiver.top) + ") " + H.S(receiver.width) + " x " + H.S(receiver.height);
+    },
+    $eq: function(receiver, other) {
+      var t1, t2, t3;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      t2 = receiver.left;
+      t3 = t1.get$left(other);
+      if (t2 == null ? t3 == null : t2 === t3) {
+        t2 = receiver.top;
+        t3 = t1.get$top(other);
+        if (t2 == null ? t3 == null : t2 === t3) {
+          t2 = receiver.width;
+          t3 = t1.get$width(other);
+          if (t2 == null ? t3 == null : t2 === t3) {
+            t2 = receiver.height;
+            t1 = t1.get$height(other);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(receiver) {
+      var t1, t2, t3, t4, hash;
+      t1 = J.get$hashCode$(receiver.left);
+      t2 = J.get$hashCode$(receiver.top);
+      t3 = J.get$hashCode$(receiver.width);
+      t4 = J.get$hashCode$(receiver.height);
+      t4 = W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(W._JenkinsSmiHash_combine(0, t1), t2), t3), t4);
+      hash = 536870911 & t4 + ((67108863 & t4) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    get$topLeft: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.Point(receiver.left, receiver.top), [null]);
+    },
+    $isRectangle: true,
+    $asRectangle: function() {
+      return [null];
+    },
+    "%": "ClientRect|DOMRect"
+  },
+  _HTMLFrameSetElement: {
+    "^": "HtmlElement;",
+    $isEventTarget: true,
+    "%": "HTMLFrameSetElement"
+  },
+  _NamedNodeMap: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin1;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "MozNamedAttrMap|NamedNodeMap"
+  },
+  _SpeechRecognitionResultList: {
+    "^": "Interceptor_ListMixin_ImmutableListMixin2;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        throw H.wrapException(P.RangeError$range(index, 0, t1));
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot assign element of immutable List."));
+    },
+    set$length: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize immutable List."));
+    },
+    get$last: function(receiver) {
+      var len = receiver.length;
+      if (len > 0)
+        return receiver[len - 1];
+      throw H.wrapException(P.StateError$("No elements"));
+    },
+    elementAt$1: function(receiver, index) {
+      if (index >>> 0 !== index || index >= receiver.length)
+        return H.ioore(receiver, index);
+      return receiver[index];
+    },
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isJavaScriptIndexingBehavior: true,
+    "%": "SpeechRecognitionResultList"
+  },
+  _ChildrenElementList: {
+    "^": "ListBase;_html$_element,_childElements",
+    contains$1: function(_, element) {
+      return J.contains$1$asx(this._childElements, element);
+    },
+    get$isEmpty: function(_) {
+      return this._html$_element.firstElementChild == null;
+    },
+    get$length: function(_) {
+      return this._childElements.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._childElements;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      this._html$_element.replaceChild(value, t1[index]);
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot resize element lists"));
+    },
+    add$1: function(_, value) {
+      this._html$_element.appendChild(value);
+      return value;
+    },
+    get$iterator: function(_) {
+      var t1 = this.toList$0(this);
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._html$_element; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort element lists"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._childElements.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._childElements;
+      t2 = t1.length;
+      t3 = this._html$_element;
+      if (index === t2)
+        t3.appendChild(element);
+      else {
+        if (index >= t2)
+          return H.ioore(t1, index);
+        t3.insertBefore(element, t1[index]);
+      }
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._html$_element);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        this._html$_element.removeChild(result);
+      return result;
+    },
+    get$last: function(_) {
+      var result = this._html$_element.lastElementChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    $asListBase: function() {
+      return [W.Element];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Element];
+    },
+    $asList: function() {
+      return [W.Element];
+    },
+    $asIterable: function() {
+      return [W.Element];
+    }
+  },
+  _FrozenElementList: {
+    "^": "ListBase;_nodeList,_elementList",
+    get$length: function(_) {
+      return this._nodeList.length;
+    },
+    $index: function(_, index) {
+      var t1 = this._nodeList;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    set$length: function(_, newLength) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify list"));
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    get$last: function(_) {
+      return C.NodeList_methods.get$last(this._nodeList);
+    },
+    get$classes: function(_) {
+      return W._MultiElementCssClassSet$(this._elementList);
+    },
+    get$onChange: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_change._eventType), [null]);
+    },
+    get$onInput: function(_) {
+      return H.setRuntimeTypeInfo(new W._ElementListEventStreamImpl(this, false, C.EventStreamProvider_input._eventType), [null]);
+    },
+    _html$_FrozenElementList$_wrap$1: function(_nodeList, $T) {
+      var t1 = C.NodeList_methods.where$1(this._nodeList, new W._FrozenElementList$_wrap_closure());
+      this._elementList = P.List_List$from(t1, true, H.getRuntimeTypeArgument(t1, "IterableBase", 0));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null,
+    static: {_FrozenElementList$_wrap: function(_nodeList, $T) {
+        var t1 = H.setRuntimeTypeInfo(new W._FrozenElementList(_nodeList, null), [$T]);
+        t1._html$_FrozenElementList$_wrap$1(_nodeList, $T);
+        return t1;
+      }}
+  },
+  _FrozenElementList$_wrap_closure: {
+    "^": "Closure:13;",
+    call$1: function(e) {
+      return !!J.getInterceptor(e).$isElement;
+    },
+    $isFunction: true
+  },
+  Entry: {
+    "^": "Interceptor;"
+  },
+  Events: {
+    "^": "Object;_ptr<",
+    $index: function(_, type) {
+      return H.setRuntimeTypeInfo(new W._EventStream(this.get$_ptr(), type, false), [null]);
+    }
+  },
+  ElementEvents: {
+    "^": "Events;_ptr:html$ElementEvents$_ptr<,_ptr",
+    $index: function(_, type) {
+      var t1, t2;
+      t1 = $.get$ElementEvents_webkitEvents();
+      t2 = J.getInterceptor$s(type);
+      if (t1.get$keys()._map.containsKey$1(t2.toLowerCase$0(type)))
+        if (P.Device_isWebKit() === true)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, t1.$index(0, t2.toLowerCase$0(type)), false), [null]);
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(this.html$ElementEvents$_ptr, type, false), [null]);
+    },
+    static: {"^": "ElementEvents_webkitEvents"}
+  },
+  Interceptor_ListMixin: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin: {
+    "^": "Interceptor_ListMixin+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  HttpRequest_request_closure: {
+    "^": "Closure:75;xhr_0",
+    call$2: function(header, value) {
+      this.xhr_0.setRequestHeader(header, value);
+    },
+    $isFunction: true
+  },
+  HttpRequest_request_closure0: {
+    "^": "Closure:13;completer_1,xhr_2",
+    call$1: [function(e) {
+      var t1, t2, t3;
+      t1 = this.xhr_2;
+      t2 = t1.status;
+      if (typeof t2 !== "number")
+        return t2.$ge();
+      t2 = t2 >= 200 && t2 < 300 || t2 === 0 || t2 === 304;
+      t3 = this.completer_1;
+      if (t2) {
+        t2 = t3.future;
+        if (t2._state !== 0)
+          H.throwExpression(P.StateError$("Future already completed"));
+        t2._asyncComplete$1(t1);
+      } else
+        t3.completeError$1(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  MutationObserver_observe_override: {
+    "^": "Closure:75;parsedOptions_0",
+    call$2: function(key, value) {
+      if (value != null)
+        this.parsedOptions_0[key] = value;
+    },
+    $isFunction: true
+  },
+  _ChildNodeListLazy: {
+    "^": "ListBase;_this",
+    get$last: function(_) {
+      var result = this._this.lastChild;
+      if (result == null)
+        throw H.wrapException(P.StateError$("No elements"));
+      return result;
+    },
+    add$1: function(_, value) {
+      this._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    insert$2: function(_, index, node) {
+      var t1, t2, t3;
+      if (index > this._this.childNodes.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._this;
+      t2 = t1.childNodes;
+      t3 = t2.length;
+      if (index === t3)
+        t1.appendChild(node);
+      else {
+        if (index >= t3)
+          return H.ioore(t2, index);
+        t1.insertBefore(node, t2[index]);
+      }
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    setAll$2: function(_, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setAll on Node list"));
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._this);
+    },
+    $indexSet: function(_, index, value) {
+      var t1, t2;
+      t1 = this._this;
+      t2 = t1.childNodes;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      t1.replaceChild(value, t2[index]);
+    },
+    get$iterator: function(_) {
+      return C.NodeList_methods.get$iterator(this._this.childNodes);
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort Node list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on Node list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    get$length: function(_) {
+      return this._this.childNodes.length;
+    },
+    set$length: function(_, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot set length on immutable List."));
+    },
+    $index: function(_, index) {
+      var t1 = this._this.childNodes;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $is_ChildNodeListLazy: true,
+    $asListBase: function() {
+      return [W.Node];
+    },
+    $asObject_ListMixin: function() {
+      return [W.Node];
+    },
+    $asList: function() {
+      return [W.Node];
+    },
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin0: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin0: {
+    "^": "Interceptor_ListMixin0+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin1: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin1: {
+    "^": "Interceptor_ListMixin1+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.Node];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.Node];
+    }
+  },
+  Interceptor_ListMixin2: {
+    "^": "Interceptor+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  Interceptor_ListMixin_ImmutableListMixin2: {
+    "^": "Interceptor_ListMixin2+ImmutableListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [W.SpeechRecognitionResult];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [W.SpeechRecognitionResult];
+    }
+  },
+  _AttributeMap: {
+    "^": "Object;",
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new W._AttributeMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        this.remove$1(0, t1._current);
+    },
+    forEach$1: function(_, f) {
+      var t1, key;
+      for (t1 = this.get$keys(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        key = t1._current;
+        f.call$2(key, this.$index(0, key));
+      }
+    },
+    get$keys: function() {
+      var attributes, keys, len, i;
+      attributes = this._html$_element.attributes;
+      keys = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          keys.push(J.get$name$x(attributes[i]));
+        }
+      }
+      return keys;
+    },
+    get$values: function(_) {
+      var attributes, values, len, i;
+      attributes = this._html$_element.attributes;
+      values = H.setRuntimeTypeInfo([], [P.String]);
+      for (len = attributes.length, i = 0; i < len; ++i) {
+        if (i >= attributes.length)
+          return H.ioore(attributes, i);
+        if (this._matches$1(attributes[i])) {
+          if (i >= attributes.length)
+            return H.ioore(attributes, i);
+          values.push(J.get$value$x(attributes[i]));
+        }
+      }
+      return values;
+    },
+    get$isEmpty: function(_) {
+      return this.get$length(this) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.get$length(this) !== 0;
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [P.String, P.String];
+    }
+  },
+  _AttributeMap_addAll_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0.$indexSet(0, k, v);
+    },
+    $isFunction: true
+  },
+  _ElementAttributeMap: {
+    "^": "_AttributeMap;_html$_element",
+    containsKey$1: function(key) {
+      return this._html$_element.hasAttribute(key);
+    },
+    $index: function(_, key) {
+      return this._html$_element.getAttribute(key);
+    },
+    $indexSet: function(_, key, value) {
+      this._html$_element.setAttribute(key, value);
+    },
+    remove$1: function(_, key) {
+      var t1, value;
+      t1 = this._html$_element;
+      value = t1.getAttribute(key);
+      t1.removeAttribute(key);
+      return value;
+    },
+    get$length: function(_) {
+      return this.get$keys().length;
+    },
+    _matches$1: function(node) {
+      return node.namespaceURI == null;
+    }
+  },
+  _MultiElementCssClassSet: {
+    "^": "CssClassSetImpl;_elementIterable,_elementCssClassSetIterable",
+    readClasses$0: function() {
+      var s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_readClasses_closure(s));
+      return s;
+    },
+    writeClasses$1: function(s) {
+      var classes, t1;
+      classes = C.JSArray_methods.join$1(P.List_List$from(s, true, null), " ");
+      for (t1 = this._elementIterable, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.set$className$x(t1._current, classes);
+    },
+    modify$1: function(f) {
+      this._elementCssClassSetIterable.forEach$1(0, new W._MultiElementCssClassSet_modify_closure(f));
+    },
+    _MultiElementCssClassSet$1: function(_elementIterable) {
+      this._elementCssClassSetIterable = H.setRuntimeTypeInfo(new H.MappedListIterable(P.List_List$from(this._elementIterable, true, null), new W._MultiElementCssClassSet_closure()), [null, null]);
+    },
+    static: {_MultiElementCssClassSet$: function(_elementIterable) {
+        var t1 = new W._MultiElementCssClassSet(_elementIterable, null);
+        t1._MultiElementCssClassSet$1(_elementIterable);
+        return t1;
+      }}
+  },
+  _MultiElementCssClassSet_closure: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return new W._ElementCssClassSet(e);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_readClasses_closure: {
+    "^": "Closure:13;s_0",
+    call$1: function(e) {
+      return this.s_0.addAll$1(0, e.readClasses$0());
+    },
+    $isFunction: true
+  },
+  _MultiElementCssClassSet_modify_closure: {
+    "^": "Closure:13;f_0",
+    call$1: function(e) {
+      return e.modify$1(this.f_0);
+    },
+    $isFunction: true
+  },
+  _ElementCssClassSet: {
+    "^": "CssClassSetImpl;_html$_element",
+    readClasses$0: function() {
+      var s, t1, trimmed;
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      for (t1 = J.get$className$x(this._html$_element).split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      P.List_List$from(s, true, null);
+      J.set$className$x(this._html$_element, s.join$1(0, " "));
+    }
+  },
+  EventStreamProvider: {
+    "^": "Object;_eventType",
+    forTarget$2$useCapture: function(e, useCapture) {
+      return H.setRuntimeTypeInfo(new W._EventStream(e, this._eventType, useCapture), [null]);
+    },
+    forTarget$1: function(e) {
+      return this.forTarget$2$useCapture(e, false);
+    }
+  },
+  _EventStream: {
+    "^": "Stream;_html$_target,_eventType,_useCapture",
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var t1 = new W._EventStreamSubscription(0, this._html$_target, this._eventType, W._wrapZone(onData), this._useCapture);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      t1._tryResume$0();
+      return t1;
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    }
+  },
+  _ElementEventStreamImpl: {
+    "^": "_EventStream;_html$_target,_eventType,_useCapture",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    $isStream: true
+  },
+  _ElementEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl: {
+    "^": "Stream;_targetList,_useCapture,_eventType",
+    matches$1: function(_, selector) {
+      var t1 = H.setRuntimeTypeInfo(new P._WhereStream(new W._ElementListEventStreamImpl_matches_closure(selector), this), [H.getRuntimeTypeArgument(this, "Stream", 0)]);
+      return H.setRuntimeTypeInfo(new P._MapStream(new W._ElementListEventStreamImpl_matches_closure0(selector), t1), [H.getRuntimeTypeArgument(t1, "Stream", 0), null]);
+    },
+    listen$4$cancelOnError$onDone$onError: function(onData, cancelOnError, onDone, onError) {
+      var pool, t1, t2, t3, t4;
+      pool = H.setRuntimeTypeInfo(new W._StreamPool(null, P.LinkedHashMap_LinkedHashMap(null, null, null, [P.Stream, null], [P.StreamSubscription, null])), [null]);
+      pool._html$_StreamPool$broadcast$0(null);
+      for (t1 = this._targetList, t1 = t1.get$iterator(t1), t2 = this._eventType, t3 = this._useCapture; t1.moveNext$0();) {
+        t4 = new W._EventStream(t1._current, t2, t3);
+        t4.$builtinTypeInfo = [null];
+        pool.add$1(0, t4);
+      }
+      t1 = pool._html$_controller;
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]).listen$4$cancelOnError$onDone$onError(onData, cancelOnError, onDone, onError);
+    },
+    listen$3$onDone$onError: function(onData, onDone, onError) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, onDone, onError);
+    },
+    listen$1: function(onData) {
+      return this.listen$4$cancelOnError$onDone$onError(onData, null, null, null);
+    },
+    $isStream: true
+  },
+  _ElementListEventStreamImpl_matches_closure: {
+    "^": "Closure:13;selector_0",
+    call$1: function($event) {
+      return J.matchesWithAncestors$1$x(J.get$target$x($event), this.selector_0);
+    },
+    $isFunction: true
+  },
+  _ElementListEventStreamImpl_matches_closure0: {
+    "^": "Closure:13;selector_1",
+    call$1: [function(e) {
+      J.set$_selector$x(e, this.selector_1);
+      return e;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _EventStreamSubscription: {
+    "^": "StreamSubscription;_pauseCount,_html$_target,_eventType,_html$_onData,_useCapture",
+    cancel$0: function() {
+      if (this._html$_target == null)
+        return;
+      this._unlisten$0();
+      this._html$_target = null;
+      this._html$_onData = null;
+      return;
+    },
+    pause$1: [function(_, resumeSignal) {
+      if (this._html$_target == null)
+        return;
+      ++this._pauseCount;
+      this._unlisten$0();
+      if (resumeSignal != null)
+        resumeSignal.whenComplete$1(this.get$resume(this));
+    }, function($receiver) {
+      return this.pause$1($receiver, null);
+    }, "pause$0", "call$1", "call$0", "get$pause", 0, 2, 116, 23, 117],
+    get$isPaused: function() {
+      return this._pauseCount > 0;
+    },
+    resume$0: [function(_) {
+      if (this._html$_target == null || this._pauseCount <= 0)
+        return;
+      --this._pauseCount;
+      this._tryResume$0();
+    }, "call$0", "get$resume", 0, 0, 18],
+    _tryResume$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null && this._pauseCount <= 0)
+        J.addEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    },
+    _unlisten$0: function() {
+      var t1 = this._html$_onData;
+      if (t1 != null)
+        J.removeEventListener$3$x(this._html$_target, this._eventType, t1, this._useCapture);
+    }
+  },
+  _StreamPool: {
+    "^": "Object;_html$_controller,_subscriptions",
+    add$1: function(_, stream) {
+      var t1, t2;
+      t1 = this._subscriptions;
+      if (t1.containsKey$1(stream))
+        return;
+      t2 = this._html$_controller;
+      t1.$indexSet(0, stream, stream.listen$3$onDone$onError(t2.get$add(t2), new W._StreamPool_add_closure(this, stream), this._html$_controller.get$addError()));
+    },
+    remove$1: function(_, stream) {
+      var subscription = this._subscriptions.remove$1(0, stream);
+      if (subscription != null)
+        subscription.cancel$0();
+    },
+    close$0: [function(_) {
+      var t1, t2;
+      for (t1 = this._subscriptions, t2 = t1.get$values(t1), t2 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0), H.getTypeArgumentByIndex(t2, 1)]); t2.moveNext$0();)
+        t2._current.cancel$0();
+      t1.clear$0(0);
+      this._html$_controller.close$0(0);
+    }, "call$0", "get$close", 0, 0, 18],
+    _html$_StreamPool$broadcast$0: function($T) {
+      this._html$_controller = P.StreamController_StreamController$broadcast(this.get$close(this), null, true, $T);
+    }
+  },
+  _StreamPool_add_closure: {
+    "^": "Closure:69;this_0,stream_1",
+    call$0: [function() {
+      return this.this_0.remove$1(0, this.stream_1);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ImmutableListMixin: {
+    "^": "Object;",
+    get$iterator: function(receiver) {
+      return H.setRuntimeTypeInfo(new W.FixedSizeListIterator(receiver, this.get$length(receiver), -1, null), [H.getRuntimeTypeArgument(receiver, "ImmutableListMixin", 0)]);
+    },
+    add$1: function(receiver, value) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    addAll$1: function(receiver, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    sort$1: function(receiver, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort immutable List."));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    insert$2: function(receiver, index, element) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    insertAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot add to immutable List."));
+    },
+    setAll$2: function(receiver, index, iterable) {
+      throw H.wrapException(P.UnsupportedError$("Cannot modify an immutable List."));
+    },
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on immutable List."));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(receiver, start, end) {
+      throw H.wrapException(P.UnsupportedError$("Cannot removeRange on immutable List."));
+    },
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _WrappedList: {
+    "^": "ListBase;_list",
+    get$iterator: function(_) {
+      return H.setRuntimeTypeInfo(new W._WrappedIterator(J.get$iterator$ax(this._list)), [null]);
+    },
+    get$length: function(_) {
+      return this._list.length;
+    },
+    add$1: function(_, element) {
+      J.add$1$ax(this._list, element);
+    },
+    clear$0: function(_) {
+      J.clear$0$ax(this._list);
+    },
+    $index: function(_, index) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this._list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    set$length: function(_, newLength) {
+      J.set$length$asx(this._list, newLength);
+    },
+    sort$1: function(_, compare) {
+      J.sort$1$ax(this._list, compare);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    indexOf$2: function(_, element, start) {
+      return J.indexOf$2$asx(this._list, element, start);
+    },
+    indexOf$1: function($receiver, element) {
+      return this.indexOf$2($receiver, element, 0);
+    },
+    lastIndexOf$2: function(_, element, start) {
+      return J.lastIndexOf$2$asx(this._list, element, start);
+    },
+    lastIndexOf$1: function($receiver, element) {
+      return this.lastIndexOf$2($receiver, element, null);
+    },
+    insert$2: function(_, index, element) {
+      return J.insert$2$ax(this._list, index, element);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      J.setRange$4$ax(this._list, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      J.removeRange$2$ax(this._list, start, end);
+    }
+  },
+  _WrappedIterator: {
+    "^": "Object;_html$_iterator",
+    moveNext$0: function() {
+      return this._html$_iterator.moveNext$0();
+    },
+    get$current: function() {
+      return this._html$_iterator._html$_current;
+    }
+  },
+  FixedSizeListIterator: {
+    "^": "Object;_array,_html$_length,_position,_html$_current",
+    moveNext$0: function() {
+      var nextPosition, t1;
+      nextPosition = this._position + 1;
+      t1 = this._html$_length;
+      if (nextPosition < t1) {
+        this._html$_current = J.$index$asx(this._array, nextPosition);
+        this._position = nextPosition;
+        return true;
+      }
+      this._html$_current = null;
+      this._position = t1;
+      return false;
+    },
+    get$current: function() {
+      return this._html$_current;
+    }
+  },
+  _callConstructor_closure: {
+    "^": "Closure:13;constructor_0,interceptor_1",
+    call$1: [function(receiver) {
+      var t1 = H.makeLeafDispatchRecord(this.interceptor_1);
+      Object.defineProperty(receiver, init.dispatchPropertyName, {value: t1, enumerable: false, writable: true, configurable: true});
+      receiver.constructor = receiver.__proto__.constructor;
+      return this.constructor_0(receiver);
+    }, "call$1", null, 2, 0, null, 54, "call"],
+    $isFunction: true
+  },
+  _DOMWindowCrossFrame: {
+    "^": "Object;_window",
+    get$parent: function(_) {
+      return W._DOMWindowCrossFrame__createSafe(this._window.parent);
+    },
+    close$0: function(_) {
+      return this._window.close();
+    },
+    postMessage$3: function(_, message, targetOrigin, messagePorts) {
+      this._window.postMessage(P._convertDartToNative_PrepareForStructuredClone(message), targetOrigin);
+    },
+    postMessage$2: function($receiver, message, targetOrigin) {
+      return this.postMessage$3($receiver, message, targetOrigin, null);
+    },
+    get$on: function(_) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    addEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    removeEventListener$3: function(_, type, listener, useCapture) {
+      return H.throwExpression(P.UnsupportedError$("You can only attach EventListeners to your own window."));
+    },
+    $isEventTarget: true,
+    static: {_DOMWindowCrossFrame__createSafe: function(w) {
+        if (w === window)
+          return w;
+        else
+          return new W._DOMWindowCrossFrame(w);
+      }}
+  }
+}],
+["dart.dom.indexed_db", "dart:indexed_db", , P, {
+  "^": "",
+  KeyRange: {
+    "^": "Interceptor;",
+    $isKeyRange: true,
+    "%": "IDBKeyRange"
+  }
+}],
+["dart.dom.svg", "dart:svg", , P, {
+  "^": "",
+  AElement: {
+    "^": "GraphicsElement;target=,href=",
+    "%": "SVGAElement"
+  },
+  AltGlyphElement: {
+    "^": "TextPositioningElement;href=",
+    "%": "SVGAltGlyphElement"
+  },
+  FEBlendElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEBlendElement"
+  },
+  FEColorMatrixElement: {
+    "^": "SvgElement;type=,values=,result=,x=,y=",
+    "%": "SVGFEColorMatrixElement"
+  },
+  FEComponentTransferElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEComponentTransferElement"
+  },
+  FECompositeElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFECompositeElement"
+  },
+  FEConvolveMatrixElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEConvolveMatrixElement"
+  },
+  FEDiffuseLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDiffuseLightingElement"
+  },
+  FEDisplacementMapElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEDisplacementMapElement"
+  },
+  FEFloodElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEFloodElement"
+  },
+  FEGaussianBlurElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEGaussianBlurElement"
+  },
+  FEImageElement: {
+    "^": "SvgElement;result=,x=,y=,href=",
+    "%": "SVGFEImageElement"
+  },
+  FEMergeElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEMergeElement"
+  },
+  FEMorphologyElement: {
+    "^": "SvgElement;operator=,result=,x=,y=",
+    "%": "SVGFEMorphologyElement"
+  },
+  FEOffsetElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFEOffsetElement"
+  },
+  FEPointLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFEPointLightElement"
+  },
+  FESpecularLightingElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFESpecularLightingElement"
+  },
+  FESpotLightElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGFESpotLightElement"
+  },
+  FETileElement: {
+    "^": "SvgElement;result=,x=,y=",
+    "%": "SVGFETileElement"
+  },
+  FETurbulenceElement: {
+    "^": "SvgElement;type=,result=,x=,y=",
+    "%": "SVGFETurbulenceElement"
+  },
+  FilterElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGFilterElement"
+  },
+  ForeignObjectElement: {
+    "^": "GraphicsElement;x=,y=",
+    "%": "SVGForeignObjectElement"
+  },
+  GeometryElement: {
+    "^": "GraphicsElement;",
+    "%": "SVGCircleElement|SVGEllipseElement|SVGLineElement|SVGPathElement|SVGPolygonElement|SVGPolylineElement;SVGGeometryElement"
+  },
+  GraphicsElement: {
+    "^": "SvgElement;",
+    "%": "SVGClipPathElement|SVGDefsElement|SVGGElement|SVGSwitchElement;SVGGraphicsElement"
+  },
+  ImageElement0: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGImageElement"
+  },
+  MaskElement: {
+    "^": "SvgElement;x=,y=",
+    "%": "SVGMaskElement"
+  },
+  PatternElement: {
+    "^": "SvgElement;x=,y=,href=",
+    "%": "SVGPatternElement"
+  },
+  RectElement: {
+    "^": "GeometryElement;x=,y=",
+    "%": "SVGRectElement"
+  },
+  ScriptElement0: {
+    "^": "SvgElement;type%,href=",
+    "%": "SVGScriptElement"
+  },
+  StyleElement0: {
+    "^": "SvgElement;type%",
+    set$title: function(receiver, value) {
+      receiver.title = value;
+    },
+    "%": "SVGStyleElement"
+  },
+  SvgElement: {
+    "^": "Element;",
+    get$classes: function(receiver) {
+      if (receiver._cssClassSet == null)
+        receiver._cssClassSet = new P._AttributeClassSet(receiver);
+      return receiver._cssClassSet;
+    },
+    get$children: function(receiver) {
+      return H.setRuntimeTypeInfo(new P.FilteredElementList(receiver, new W._ChildNodeListLazy(receiver)), [W.Element]);
+    },
+    get$onChange: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_change._eventType, false), [null]);
+    },
+    get$onClick: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_click._eventType, false), [null]);
+    },
+    get$onInput: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_input._eventType, false), [null]);
+    },
+    get$onMouseDown: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousedown._eventType, false), [null]);
+    },
+    get$onMouseMove: function(receiver) {
+      return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(receiver, C.EventStreamProvider_mousemove._eventType, false), [null]);
+    },
+    $isEventTarget: 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: {"^": "SvgElement_pauseEvent<"}
+  },
+  SvgSvgElement: {
+    "^": "GraphicsElement;x=,y=",
+    getElementById$1: function(receiver, elementId) {
+      return receiver.getElementById(elementId);
+    },
+    $isSvgSvgElement: true,
+    "%": "SVGSVGElement"
+  },
+  TextContentElement: {
+    "^": "GraphicsElement;",
+    "%": ";SVGTextContentElement"
+  },
+  TextPathElement: {
+    "^": "TextContentElement;href=",
+    "%": "SVGTextPathElement"
+  },
+  TextPositioningElement: {
+    "^": "TextContentElement;x=,y=",
+    "%": "SVGTSpanElement|SVGTextElement;SVGTextPositioningElement"
+  },
+  UseElement: {
+    "^": "GraphicsElement;x=,y=,href=",
+    "%": "SVGUseElement"
+  },
+  _GradientElement: {
+    "^": "SvgElement;href=",
+    "%": "SVGGradientElement|SVGLinearGradientElement|SVGRadialGradientElement"
+  },
+  _AttributeClassSet: {
+    "^": "CssClassSetImpl;_svg$_element",
+    readClasses$0: function() {
+      var classname, s, t1, trimmed;
+      classname = this._svg$_element.getAttribute("class");
+      s = P.LinkedHashSet_LinkedHashSet(null, null, null, P.String);
+      if (classname == null)
+        return s;
+      for (t1 = classname.split(" "), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        trimmed = J.trim$0$s(t1._current);
+        if (trimmed.length !== 0)
+          s.add$1(0, trimmed);
+      }
+      return s;
+    },
+    writeClasses$1: function(s) {
+      this._svg$_element.setAttribute("class", s.join$1(0, " "));
+    }
+  }
+}],
+["dart.dom.web_sql", "dart:web_sql", , P, {
+  "^": "",
+  SqlError: {
+    "^": "Interceptor;code=,message=",
+    "%": "SQLError"
+  }
+}],
+["dart.isolate", "dart:isolate", , P, {
+  "^": "",
+  ReceivePort_ReceivePort: function() {
+    var t1, t2, t3;
+    t1 = $.RawReceivePortImpl__nextFreeId;
+    $.RawReceivePortImpl__nextFreeId = t1 + 1;
+    t2 = new H.RawReceivePortImpl(t1, null, false);
+    t3 = init.globalState.currentContext;
+    t3._addRegistration$2(t1, t2);
+    t3._updateGlobalState$0();
+    t3 = new H.ReceivePortImpl(t2, null);
+    t3.ReceivePortImpl$fromRawReceivePort$1(t2);
+    return t3;
+  },
+  Capability: {
+    "^": "Object;",
+    $isCapability: true,
+    static: {Capability_Capability: function() {
+        return new H.CapabilityImpl((Math.random() * 0x100000000 >>> 0) + (Math.random() * 0x100000000 >>> 0) * 4294967296);
+      }}
+  }
+}],
+["dart.js", "dart:js", , P, {
+  "^": "",
+  _convertDartFunction: function(f, captureThis) {
+    return function(_call, f, captureThis) {
+      return function() {
+        return _call(f, captureThis, this, Array.prototype.slice.apply(arguments));
+      };
+    }(P._callDartFunction, f, captureThis);
+  },
+  _callDartFunction: [function(callback, captureThis, $self, $arguments) {
+    var arguments0;
+    if (captureThis === true) {
+      arguments0 = [$self];
+      C.JSArray_methods.addAll$1(arguments0, $arguments);
+      $arguments = arguments0;
+    }
+    return P._convertToJS(H.Primitives_applyFunction(callback, P.List_List$from(J.map$1$ax($arguments, P._convertToDart$closure()), true, null), P.Function__toMangledNames(null)));
+  }, "call$4", "_callDartFunction$closure", 8, 0, null, 41, 59, 27, 60],
+  _defineProperty: function(o, $name, value) {
+    var exception;
+    if (Object.isExtensible(o))
+      try {
+        Object.defineProperty(o, $name, {value: value});
+        return true;
+      } catch (exception) {
+        H.unwrapException(exception);
+      }
+
+    return false;
+  },
+  _getOwnProperty: function(o, $name) {
+    if (Object.prototype.hasOwnProperty.call(o, $name))
+      return o[$name];
+    return;
+  },
+  _convertToJS: [function(o) {
+    var t1;
+    if (o == null)
+      return;
+    else if (typeof o === "string" || typeof o === "number" || typeof o === "boolean")
+      return o;
+    else {
+      t1 = J.getInterceptor(o);
+      if (!!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow)
+        return o;
+      else if (!!t1.$isDateTime)
+        return H.Primitives_lazyAsJsDate(o);
+      else if (!!t1.$isJsObject)
+        return o._js$_jsObject;
+      else if (!!t1.$isFunction)
+        return P._getJsProxy(o, "$dart_jsFunction", new P._convertToJS_closure());
+      else
+        return P._getJsProxy(o, "_$dart_jsObject", new P._convertToJS_closure0($.get$_dartProxyCtor()));
+    }
+  }, "call$1", "_convertToJS$closure", 2, 0, 13, 61],
+  _getJsProxy: function(o, propertyName, createProxy) {
+    var jsProxy = P._getOwnProperty(o, propertyName);
+    if (jsProxy == null) {
+      jsProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, jsProxy);
+    }
+    return jsProxy;
+  },
+  _convertToDart: [function(o) {
+    var t1;
+    if (o == null || typeof o == "string" || typeof o == "number" || typeof o == "boolean")
+      return o;
+    else {
+      if (o instanceof Object) {
+        t1 = J.getInterceptor(o);
+        t1 = !!t1.$isBlob || !!t1.$isEvent || !!t1.$isKeyRange || !!t1.$isImageData || !!t1.$isNode || !!t1.$isTypedData || !!t1.$isWindow;
+      } else
+        t1 = false;
+      if (t1)
+        return o;
+      else if (o instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(o.getTime(), false);
+      else if (o.constructor === $.get$_dartProxyCtor())
+        return o.o;
+      else
+        return P._wrapToDart(o);
+    }
+  }, "call$1", "_convertToDart$closure", 2, 0, 49, 61],
+  _wrapToDart: function(o) {
+    if (typeof o == "function")
+      return P._getDartProxy(o, $.get$_DART_CLOSURE_PROPERTY_NAME(), new P._wrapToDart_closure());
+    else if (o instanceof Array)
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure0());
+    else
+      return P._getDartProxy(o, $.get$_DART_OBJECT_PROPERTY_NAME(), new P._wrapToDart_closure1());
+  },
+  _getDartProxy: function(o, propertyName, createProxy) {
+    var dartProxy = P._getOwnProperty(o, propertyName);
+    if (dartProxy == null || !(o instanceof Object)) {
+      dartProxy = createProxy.call$1(o);
+      P._defineProperty(o, propertyName, dartProxy);
+    }
+    return dartProxy;
+  },
+  JsObject: {
+    "^": "Object;_js$_jsObject",
+    $index: function(_, property) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      return P._convertToDart(this._js$_jsObject[property]);
+    },
+    $indexSet: function(_, property, value) {
+      if (typeof property !== "string" && typeof property !== "number")
+        throw H.wrapException(P.ArgumentError$("property is not a String or num"));
+      this._js$_jsObject[property] = P._convertToJS(value);
+    },
+    get$hashCode: function(_) {
+      return 0;
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isJsObject && this._js$_jsObject === other._js$_jsObject;
+    },
+    hasProperty$1: function(property) {
+      return property in this._js$_jsObject;
+    },
+    toString$0: function(_) {
+      var t1, exception;
+      try {
+        t1 = String(this._js$_jsObject);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return P.Object.prototype.toString$0.call(this, this);
+      }
+
+    },
+    callMethod$2: function(method, args) {
+      var t1, t2;
+      t1 = this._js$_jsObject;
+      t2 = args == null ? null : P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(t1[method].apply(t1, t2));
+    },
+    callMethod$1: function(method) {
+      return this.callMethod$2(method, null);
+    },
+    $isJsObject: true,
+    static: {JsObject_JsObject: function($constructor, $arguments) {
+        var constr, args, factoryFunction;
+        constr = P._convertToJS($constructor);
+        if ($arguments == null)
+          return P._wrapToDart(new constr());
+        args = [null];
+        C.JSArray_methods.addAll$1(args, H.setRuntimeTypeInfo(new H.MappedListIterable($arguments, P._convertToJS$closure()), [null, null]));
+        factoryFunction = constr.bind.apply(constr, args);
+        String(factoryFunction);
+        return P._wrapToDart(new factoryFunction());
+      }, JsObject_JsObject$fromBrowserObject: function(object) {
+        if (object == null)
+          throw H.wrapException(P.ArgumentError$("object cannot be a num, string, bool, or null"));
+        return P._wrapToDart(P._convertToJS(object));
+      }, JsObject_JsObject$jsify: function(object) {
+        return P._wrapToDart(P.JsObject__convertDataTree(object));
+      }, JsObject__convertDataTree: function(data) {
+        return new P.JsObject__convertDataTree__convert(P.HashMap_HashMap$identity(null, null)).call$1(data);
+      }}
+  },
+  JsObject__convertDataTree__convert: {
+    "^": "Closure:13;_convertedObjects_0",
+    call$1: [function(o) {
+      var t1, t2, convertedMap, key, convertedList;
+      t1 = this._convertedObjects_0;
+      if (t1.containsKey$1(o))
+        return t1.$index(0, o);
+      t2 = J.getInterceptor(o);
+      if (!!t2.$isMap) {
+        convertedMap = {};
+        t1.$indexSet(0, o, convertedMap);
+        for (t1 = J.get$iterator$ax(o.get$keys()); t1.moveNext$0();) {
+          key = t1.get$current();
+          convertedMap[key] = this.call$1(t2.$index(o, key));
+        }
+        return convertedMap;
+      } else if (!!t2.$isIterable) {
+        convertedList = [];
+        t1.$indexSet(0, o, convertedList);
+        C.JSArray_methods.addAll$1(convertedList, t2.map$1(o, this));
+        return convertedList;
+      } else
+        return P._convertToJS(o);
+    }, "call$1", null, 2, 0, null, 61, "call"],
+    $isFunction: true
+  },
+  JsFunction: {
+    "^": "JsObject;_js$_jsObject",
+    apply$2$thisArg: function(args, thisArg) {
+      var t1, t2;
+      t1 = P._convertToJS(thisArg);
+      t2 = P.List_List$from(H.setRuntimeTypeInfo(new H.MappedListIterable(args, P._convertToJS$closure()), [null, null]), true, null);
+      return P._convertToDart(this._js$_jsObject.apply(t1, t2));
+    },
+    apply$1: function(args) {
+      return this.apply$2$thisArg(args, null);
+    },
+    $isJsFunction: true,
+    static: {JsFunction_JsFunction$withThis: function(f) {
+        return new P.JsFunction(P._convertDartFunction(f, true));
+      }}
+  },
+  JsArray: {
+    "^": "JsObject_ListMixin;_js$_jsObject",
+    $index: function(_, index) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      return P.JsObject.prototype.$index.call(this, this, index);
+    },
+    $indexSet: function(_, index, value) {
+      var t1;
+      if (typeof index === "number" && index === C.JSNumber_methods.toInt$0(index)) {
+        if (typeof index === "number" && Math.floor(index) === index)
+          t1 = index < 0 || index >= this.get$length(this);
+        else
+          t1 = false;
+        if (t1)
+          H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      }
+      P.JsObject.prototype.$indexSet.call(this, this, index, value);
+    },
+    get$length: function(_) {
+      var len = this._js$_jsObject.length;
+      if (typeof len === "number" && len >>> 0 === len)
+        return len;
+      throw H.wrapException(P.StateError$("Bad JsArray length"));
+    },
+    set$length: function(_, $length) {
+      P.JsObject.prototype.$indexSet.call(this, this, "length", $length);
+    },
+    add$1: function(_, value) {
+      this.callMethod$2("push", [value]);
+    },
+    addAll$1: function(_, iterable) {
+      this.callMethod$2("push", iterable instanceof Array ? iterable : P.List_List$from(iterable, true, null));
+    },
+    insert$2: function(_, index, element) {
+      if (index >= this.get$length(this) + 1)
+        H.throwExpression(P.RangeError$range(index, 0, this.get$length(this)));
+      this.callMethod$2("splice", [index, 0, element]);
+    },
+    removeRange$2: function(_, start, end) {
+      P.JsArray__checkRange(start, end, this.get$length(this));
+      this.callMethod$2("splice", [start, end - start]);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      var t1, $length, args;
+      t1 = this.get$length(this);
+      if (start < 0 || start > t1)
+        H.throwExpression(P.RangeError$range(start, 0, t1));
+      if (end < start || end > t1)
+        H.throwExpression(P.RangeError$range(end, start, t1));
+      $length = end - start;
+      if ($length === 0)
+        return;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      args = [start, $length];
+      C.JSArray_methods.addAll$1(args, J.skip$1$ax(iterable, skipCount).take$1(0, $length));
+      this.callMethod$2("splice", args);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    sort$1: function(_, compare) {
+      this.callMethod$2("sort", [compare]);
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    static: {JsArray__checkRange: function(start, end, $length) {
+        if (start < 0 || start > $length)
+          throw H.wrapException(P.RangeError$range(start, 0, $length));
+        if (end < start || end > $length)
+          throw H.wrapException(P.RangeError$range(end, start, $length));
+      }}
+  },
+  JsObject_ListMixin: {
+    "^": "JsObject+ListMixin;",
+    $isList: true,
+    $asList: null,
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: null
+  },
+  _convertToJS_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      var jsFunction = P._convertDartFunction(o, false);
+      P._defineProperty(jsFunction, $.get$_DART_CLOSURE_PROPERTY_NAME(), o);
+      return jsFunction;
+    },
+    $isFunction: true
+  },
+  _convertToJS_closure0: {
+    "^": "Closure:13;ctor_0",
+    call$1: function(o) {
+      return new this.ctor_0(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsFunction(o);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure0: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return H.setRuntimeTypeInfo(new P.JsArray(o), [null]);
+    },
+    $isFunction: true
+  },
+  _wrapToDart_closure1: {
+    "^": "Closure:13;",
+    call$1: function(o) {
+      return new P.JsObject(o);
+    },
+    $isFunction: true
+  }
+}],
+["dart.math", "dart:math", , P, {
+  "^": "",
+  _JenkinsSmiHash_combine0: function(hash, value) {
+    hash = 536870911 & hash + value;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish: function(hash) {
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash ^= hash >>> 11;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  min: function(a, b) {
+    var t1;
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(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;
+      if (a === 0)
+        t1 = b === 0 ? 1 / b < 0 : b < 0;
+      else
+        t1 = false;
+      if (t1 || isNaN(b))
+        return b;
+      return a;
+    }
+    return a;
+  },
+  max: function(a, b) {
+    if (typeof a !== "number")
+      throw H.wrapException(P.ArgumentError$(a));
+    if (typeof b !== "number")
+      throw H.wrapException(P.ArgumentError$(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;
+      if (C.JSDouble_methods.get$isNaN(b))
+        return b;
+      return a;
+    }
+    if (b === 0 && C.JSNumber_methods.get$isNegative(a))
+      return b;
+    return a;
+  },
+  _JSRandom: {
+    "^": "Object;",
+    nextInt$1: function(max) {
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      return Math.random() * max >>> 0;
+    }
+  },
+  _Random: {
+    "^": "Object;_lo,_hi",
+    _nextState$0: function() {
+      var t1, tmpHi, tmpHiLo, tmpLo, tmpLoLo, newLo;
+      t1 = this._lo;
+      tmpHi = 4294901760 * t1;
+      tmpHiLo = (tmpHi & 4294967295) >>> 0;
+      tmpLo = 55905 * t1;
+      tmpLoLo = (tmpLo & 4294967295) >>> 0;
+      newLo = tmpLoLo + tmpHiLo + this._hi;
+      t1 = (newLo & 4294967295) >>> 0;
+      this._lo = t1;
+      this._hi = (C.JSInt_methods._tdivFast$1(tmpLo - tmpLoLo + (tmpHi - tmpHiLo) + (newLo - t1), 4294967296) & 4294967295) >>> 0;
+    },
+    nextInt$1: function(max) {
+      var t1, rnd32, result;
+      if (max <= 0 || max > 4294967296)
+        throw H.wrapException(P.RangeError$("max must be in range 0 < max \u2264 2^32, was " + max));
+      t1 = max - 1;
+      if ((max & t1) === 0) {
+        this._nextState$0();
+        return (this._lo & t1) >>> 0;
+      }
+      do {
+        this._nextState$0();
+        rnd32 = this._lo;
+        result = rnd32 % max;
+      } while (rnd32 - result + max >= 4294967296);
+      return result;
+    },
+    _Random$1: function(seed) {
+      var empty_seed, t1, low, high, tmplow, low0, t2, t3;
+      empty_seed = J.$lt$n(seed, 0) ? -1 : 0;
+      do {
+        t1 = J.getInterceptor$n(seed);
+        low = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, low), 4294967296);
+        t1 = J.getInterceptor$n(seed);
+        high = t1.$and(seed, 4294967295);
+        seed = J.$tdiv$n(t1.$sub(seed, high), 4294967296);
+        tmplow = ((~low & 4294967295) >>> 0) + (low << 21 >>> 0);
+        low0 = (tmplow & 4294967295) >>> 0;
+        high = (~high >>> 0) + ((high << 21 | low >>> 11) >>> 0) + C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296) & 4294967295;
+        tmplow = ((low0 ^ (low0 >>> 24 | high << 8)) >>> 0) * 265;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 24) >>> 0) * 265 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        tmplow = ((low ^ (low >>> 14 | high << 18)) >>> 0) * 21;
+        low = (tmplow & 4294967295) >>> 0;
+        high = ((high ^ high >>> 14) >>> 0) * 21 + C.JSInt_methods._tdivFast$1(tmplow - low, 4294967296) & 4294967295;
+        low = (low ^ (low >>> 28 | high << 4)) >>> 0;
+        high = (high ^ high >>> 28) >>> 0;
+        tmplow = (low << 31 >>> 0) + low;
+        low0 = (tmplow & 4294967295) >>> 0;
+        t1 = C.JSInt_methods._tdivFast$1(tmplow - low0, 4294967296);
+        tmplow = this._lo * 1037;
+        t2 = (tmplow & 4294967295) >>> 0;
+        this._lo = t2;
+        t3 = (this._hi * 1037 + C.JSInt_methods._tdivFast$1(tmplow - t2, 4294967296) & 4294967295) >>> 0;
+        this._hi = t3;
+        this._lo = (t2 ^ low0) >>> 0;
+        this._hi = (t3 ^ high + ((high << 31 | low >>> 1) >>> 0) + t1 & 4294967295) >>> 0;
+      } while (!J.$eq(seed, empty_seed));
+      if (this._hi === 0 && this._lo === 0)
+        this._lo = 23063;
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+      this._nextState$0();
+    },
+    static: {"^": "_Random__POW2_53_D,_Random__POW2_27_D,_Random__MASK32", _Random$: function(seed) {
+        var t1 = new P._Random(0, 0);
+        t1._Random$1(seed);
+        return t1;
+      }}
+  },
+  Point: {
+    "^": "Object;x>,y>",
+    toString$0: function(_) {
+      return "Point(" + H.S(this.x) + ", " + H.S(this.y) + ")";
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      if (!J.getInterceptor(other).$isPoint)
+        return false;
+      t1 = this.x;
+      t2 = other.x;
+      if (t1 == null ? t2 == null : t1 === t2) {
+        t1 = this.y;
+        t2 = other.y;
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.x);
+      t2 = J.get$hashCode$(this.y);
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, t1), t2));
+    },
+    $add: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$add();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$add();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 + t3, t4 + t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $sub: function(_, other) {
+      var t1, t2, t3, t4;
+      t1 = this.x;
+      t2 = J.getInterceptor$x(other);
+      t3 = t2.get$x(other);
+      if (typeof t1 !== "number")
+        return t1.$sub();
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      t4 = this.y;
+      t2 = t2.get$y(other);
+      if (typeof t4 !== "number")
+        return t4.$sub();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      t2 = new P.Point(t1 - t3, t4 - t2);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $mul: function(_, factor) {
+      var t1, t2;
+      t1 = this.x;
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof factor !== "number")
+        return H.iae(factor);
+      t2 = this.y;
+      if (typeof t2 !== "number")
+        return t2.$mul();
+      t2 = new P.Point(t1 * factor, t2 * factor);
+      t2.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t2;
+    },
+    $isPoint: true
+  },
+  _RectangleBase: {
+    "^": "Object;",
+    get$right: function(_) {
+      return this.get$left(this) + this.width;
+    },
+    get$bottom: function(_) {
+      return this.get$top(this) + this.height;
+    },
+    toString$0: function(_) {
+      return "Rectangle (" + this.get$left(this) + ", " + this.top + ") " + this.width + " x " + this.height;
+    },
+    $eq: function(_, other) {
+      var t1, t2;
+      if (other == null)
+        return false;
+      t1 = J.getInterceptor(other);
+      if (!t1.$isRectangle)
+        return false;
+      if (this.get$left(this) === t1.get$left(other)) {
+        t2 = this.top;
+        t1 = t2 === t1.get$top(other) && this.left + this.width === t1.get$right(other) && t2 + this.height === t1.get$bottom(other);
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.top;
+      return P._JenkinsSmiHash_finish(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(P._JenkinsSmiHash_combine0(0, this.get$left(this) & 0x1FFFFFFF), t1 & 0x1FFFFFFF), this.left + this.width & 0x1FFFFFFF), t1 + this.height & 0x1FFFFFFF));
+    },
+    get$topLeft: function(_) {
+      var t1 = new P.Point(this.get$left(this), this.top);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    }
+  },
+  Rectangle: {
+    "^": "_RectangleBase;left>,top>,width>,height>",
+    $isRectangle: true,
+    $asRectangle: null,
+    static: {Rectangle$: function(left, $top, width, height, $T) {
+        var t1, t2;
+        t1 = width < 0 ? -width * 0 : width;
+        t2 = height < 0 ? -height * 0 : height;
+        return H.setRuntimeTypeInfo(new P.Rectangle(left, $top, t1, t2), [$T]);
+      }}
+  }
+}],
+["dart.pkg.collection.wrappers", "package:collection/wrappers.dart", , Q, {
+  "^": "",
+  UnmodifiableMapMixin__throw: function() {
+    throw H.wrapException(P.UnsupportedError$("Cannot modify an unmodifiable Map"));
+  },
+  UnmodifiableMapView: {
+    "^": "DelegatingMap_UnmodifiableMapMixin;_base"
+  },
+  DelegatingMap_UnmodifiableMapMixin: {
+    "^": "DelegatingMap+UnmodifiableMapMixin;",
+    $isMap: true
+  },
+  UnmodifiableMapMixin: {
+    "^": "Object;",
+    $indexSet: function(_, key, value) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    addAll$1: function(_, other) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    clear$0: function(_) {
+      return Q.UnmodifiableMapMixin__throw();
+    },
+    $isMap: true
+  },
+  DelegatingMap: {
+    "^": "Object;",
+    $index: function(_, key) {
+      return this._base.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      this._base.$indexSet(0, key, value);
+    },
+    addAll$1: function(_, other) {
+      this._base.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      this._base.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      this._base.forEach$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this._base._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this._base._collection$_length !== 0;
+    },
+    get$keys: function() {
+      var t1 = this._base;
+      return H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._base._collection$_length;
+    },
+    get$values: function(_) {
+      var t1 = this._base;
+      return t1.get$values(t1);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._base);
+    },
+    $isMap: true
+  }
+}],
+["dart.typed_data.implementation", "dart:_native_typed_data", , H, {
+  "^": "",
+  NativeTypedArray$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfDouble$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeTypedArrayOfInt$: function(receiver) {
+    receiver.toString;
+    return receiver;
+  },
+  NativeByteBuffer: {
+    "^": "Interceptor;",
+    get$runtimeType: function(receiver) {
+      return C.Type_wAg;
+    },
+    $isNativeByteBuffer: true,
+    "%": "ArrayBuffer"
+  },
+  NativeTypedData: {
+    "^": "Interceptor;",
+    _invalidIndex$2: function(receiver, index, $length) {
+      var t1 = J.getInterceptor$n(index);
+      if (t1.$lt(index, 0) || t1.$ge(index, $length))
+        throw H.wrapException(P.RangeError$range(index, 0, $length));
+      else
+        throw H.wrapException(P.ArgumentError$("Invalid list index " + H.S(index)));
+    },
+    _checkIndex$2: function(receiver, index, $length) {
+      if (index >>> 0 !== index || index >= $length)
+        this._invalidIndex$2(receiver, index, $length);
+    },
+    $isNativeTypedData: true,
+    $isTypedData: true,
+    "%": ";ArrayBufferView;NativeTypedArray|NativeTypedArray_ListMixin|NativeTypedArray_ListMixin_FixedLengthListMixin|NativeTypedArrayOfDouble|NativeTypedArray_ListMixin0|NativeTypedArray_ListMixin_FixedLengthListMixin0|NativeTypedArrayOfInt"
+  },
+  NativeByteData: {
+    "^": "NativeTypedData;",
+    get$runtimeType: function(receiver) {
+      return C.Type_oGP;
+    },
+    $isTypedData: true,
+    "%": "DataView"
+  },
+  NativeFloat32List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_Art;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float32Array"
+  },
+  NativeFloat64List: {
+    "^": "NativeTypedArrayOfDouble;",
+    get$runtimeType: function(receiver) {
+      return C.Type_ckn;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    },
+    $isTypedData: true,
+    "%": "Float64Array"
+  },
+  NativeInt16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_UoK;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int16Array"
+  },
+  NativeInt32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_dTZ;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int32Array"
+  },
+  NativeInt8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_mp3;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Int8Array"
+  },
+  NativeUint16List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_CAk;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint16Array"
+  },
+  NativeUint32List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_irB;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "Uint32Array"
+  },
+  NativeUint8ClampedList: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_QuW;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": "CanvasPixelArray|Uint8ClampedArray"
+  },
+  NativeUint8List: {
+    "^": "NativeTypedArrayOfInt;",
+    get$runtimeType: function(receiver) {
+      return C.Type_6L0;
+    },
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    $index: function(receiver, index) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      return receiver[index];
+    },
+    $indexSet: function(receiver, index, value) {
+      var t1 = receiver.length;
+      if (index >>> 0 !== index || index >= t1)
+        this._invalidIndex$2(receiver, index, t1);
+      receiver[index] = value;
+    },
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    },
+    $isTypedData: true,
+    "%": ";Uint8Array"
+  },
+  NativeTypedArray: {
+    "^": "NativeTypedData;",
+    get$length: function(receiver) {
+      return receiver.length;
+    },
+    _setRangeFast$4: function(receiver, start, end, source, skipCount) {
+      var t1, count, sourceLength;
+      t1 = receiver.length + 1;
+      this._checkIndex$2(receiver, start, t1);
+      this._checkIndex$2(receiver, end, t1);
+      if (start > end)
+        throw H.wrapException(P.RangeError$range(start, 0, end));
+      count = end - start;
+      if (skipCount < 0)
+        throw H.wrapException(P.ArgumentError$(skipCount));
+      sourceLength = source.length;
+      if (sourceLength - skipCount < count)
+        throw H.wrapException(P.StateError$("Not enough elements"));
+      if (skipCount !== 0 || sourceLength !== count)
+        source = source.subarray(skipCount, skipCount + count);
+      receiver.set(source, start);
+    },
+    $isJavaScriptIndexingBehavior: true
+  },
+  NativeTypedArrayOfDouble: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfDouble) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfDouble: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$double];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$double];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin: {
+    "^": "NativeTypedArray_ListMixin+FixedLengthListMixin;"
+  },
+  NativeTypedArrayOfInt: {
+    "^": "NativeTypedArray_ListMixin_FixedLengthListMixin0;",
+    setRange$4: function(receiver, start, end, iterable, skipCount) {
+      if (!!J.getInterceptor(iterable).$isNativeTypedArrayOfInt) {
+        this._setRangeFast$4(receiver, start, end, iterable, skipCount);
+        return;
+      }
+      P.ListMixin.prototype.setRange$4.call(this, receiver, start, end, iterable, skipCount);
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    $isNativeTypedArrayOfInt: true,
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin0: {
+    "^": "NativeTypedArray+ListMixin;",
+    $isList: true,
+    $asList: function() {
+      return [P.$int];
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.$int];
+    }
+  },
+  NativeTypedArray_ListMixin_FixedLengthListMixin0: {
+    "^": "NativeTypedArray_ListMixin0+FixedLengthListMixin;"
+  }
+}],
+["dart2js._js_primitives", "dart:_js_primitives", , H, {
+  "^": "",
+  printString: function(string) {
+    if (typeof dartPrint == "function") {
+      dartPrint(string);
+      return;
+    }
+    if (typeof console == "object" && typeof console.log != "undefined") {
+      console.log(string);
+      return;
+    }
+    if (typeof window == "object")
+      return;
+    if (typeof print == "function") {
+      print(string);
+      return;
+    }
+    throw "Unable to print message: " + String(string);
+  }
+}],
+["error_view_element", "package:observatory/src/elements/error_view.dart", , F, {
+  "^": "",
+  ErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier4;_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._error_view_element$__$error, value);
+    },
+    static: {ErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ErrorViewElement_methods.Element$created$0(receiver);
+        C.ErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier4: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["eval_box_element", "package:observatory/src/elements/eval_box.dart", , L, {
+  "^": "",
+  EvalBoxElement: {
+    "^": "ObservatoryElement_ChangeNotifier5;_eval_box_element$__$text,_eval_box_element$__$lineMode,_eval_box_element$__$callback,_eval_box_element$__$results,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$text: function(receiver) {
+      return receiver._eval_box_element$__$text;
+    },
+    set$text: function(receiver, value) {
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, value);
+    },
+    get$lineMode: function(receiver) {
+      return receiver._eval_box_element$__$lineMode;
+    },
+    set$lineMode: function(receiver, value) {
+      receiver._eval_box_element$__$lineMode = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_box_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_box_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_box_element$__$callback, value);
+    },
+    get$results: function(receiver) {
+      return receiver._eval_box_element$__$results;
+    },
+    set$results: function(receiver, value) {
+      receiver._eval_box_element$__$results = this.notifyPropertyChange$3(receiver, C.Symbol_results, receiver._eval_box_element$__$results, value);
+    },
+    updateLineMode$3: [function(receiver, e, detail, target) {
+      var t1 = H.interceptedTypeCast(J.get$target$x(e), "$isInputElement").value;
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_lineMode, receiver._eval_box_element$__$lineMode, t1);
+      receiver._eval_box_element$__$lineMode = t1;
+      if (J.$eq(t1, "1-line")) {
+        t1 = J.replaceAll$2$s(receiver._eval_box_element$__$text, "\n", " ");
+        receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+      }
+    }, "call$3", "get$updateLineMode", 6, 0, 102, 1, 93, 94],
+    eval$3: [function(receiver, e, detail, target) {
+      var expr, t1, map;
+      J.preventDefault$0$x(e);
+      expr = receiver._eval_box_element$__$text;
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, expr, "");
+      if (receiver._eval_box_element$__$callback != null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        map = R._toObservableDeep(t1);
+        J.$indexSet$ax(map, "expr", expr);
+        J.insert$2$ax(receiver._eval_box_element$__$results, 0, map);
+        this.callback$1(receiver, expr).then$1(new L.EvalBoxElement_eval_closure(map));
+      }
+    }, "call$3", "get$eval", 6, 0, 102, 1, 93, 94],
+    selectExpr$1: [function(receiver, e) {
+      var t1 = J.getAttribute$1$x(J.get$target$x(e), "expr");
+      receiver._eval_box_element$__$text = this.notifyPropertyChange$3(receiver, C.Symbol_text, receiver._eval_box_element$__$text, t1);
+    }, "call$1", "get$selectExpr", 2, 0, 128, 1],
+    static: {EvalBoxElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = R._toObservableDeep([]);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver._eval_box_element$__$lineMode = "1-line";
+        receiver._eval_box_element$__$results = t1;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.EvalBoxElement_methods.Element$created$0(receiver);
+        C.EvalBoxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier5: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalBoxElement_eval_closure: {
+    "^": "Closure:13;map_0",
+    call$1: [function(result) {
+      J.$indexSet$ax(this.map_0, "value", result);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["eval_link_element", "package:observatory/src/elements/eval_link.dart", , R, {
+  "^": "",
+  EvalLinkElement: {
+    "^": "PolymerElement_ChangeNotifier1;_eval_link_element$__$busy,_eval_link_element$__$label,_eval_link_element$__$callback,_eval_link_element$__$expr,_eval_link_element$__$result,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$busy: function(receiver) {
+      return receiver._eval_link_element$__$busy;
+    },
+    set$busy: function(receiver, value) {
+      receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, receiver._eval_link_element$__$busy, value);
+    },
+    get$label: function(receiver) {
+      return receiver._eval_link_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._eval_link_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._eval_link_element$__$label, value);
+    },
+    get$callback: function(receiver) {
+      return receiver._eval_link_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._eval_link_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._eval_link_element$__$callback, value);
+    },
+    get$expr: function(receiver) {
+      return receiver._eval_link_element$__$expr;
+    },
+    set$expr: function(receiver, value) {
+      receiver._eval_link_element$__$expr = this.notifyPropertyChange$3(receiver, C.Symbol_expr, receiver._eval_link_element$__$expr, value);
+    },
+    get$result: function(receiver) {
+      return receiver._eval_link_element$__$result;
+    },
+    set$result: function(receiver, value) {
+      receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, value);
+    },
+    evalNow$3: [function(receiver, a, b, c) {
+      var t1 = receiver._eval_link_element$__$busy;
+      if (t1 === true)
+        return;
+      if (receiver._eval_link_element$__$callback != null) {
+        receiver._eval_link_element$__$busy = this.notifyPropertyChange$3(receiver, C.Symbol_busy, t1, true);
+        receiver._eval_link_element$__$result = this.notifyPropertyChange$3(receiver, C.Symbol_result, receiver._eval_link_element$__$result, null);
+        this.callback$1(receiver, receiver._eval_link_element$__$expr).then$1(new R.EvalLinkElement_evalNow_closure(receiver)).whenComplete$1(new R.EvalLinkElement_evalNow_closure0(receiver));
+      }
+    }, "call$3", "get$evalNow", 6, 0, 79, 46, 47, 80],
+    static: {EvalLinkElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._eval_link_element$__$busy = false;
+        receiver._eval_link_element$__$label = "[evaluate]";
+        receiver._eval_link_element$__$callback = null;
+        receiver._eval_link_element$__$expr = "";
+        receiver._eval_link_element$__$result = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.EvalLinkElement_methods.Element$created$0(receiver);
+        C.EvalLinkElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier1: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  EvalLinkElement_evalNow_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._eval_link_element$__$result = J.notifyPropertyChange$3$x(t1, C.Symbol_result, t1._eval_link_element$__$result, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  EvalLinkElement_evalNow_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      var t1 = this.this_1;
+      t1._eval_link_element$__$busy = J.notifyPropertyChange$3$x(t1, C.Symbol_busy, t1._eval_link_element$__$busy, false);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["field_ref_element", "package:observatory/src/elements/field_ref.dart", , D, {
+  "^": "",
+  FieldRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {FieldRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldRefElement_methods.Element$created$0(receiver);
+        C.FieldRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["field_view_element", "package:observatory/src/elements/field_view.dart", , A, {
+  "^": "",
+  FieldViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier6;_field_view_element$__$field,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$field: function(receiver) {
+      return receiver._field_view_element$__$field;
+    },
+    set$field: function(receiver, value) {
+      receiver._field_view_element$__$field = this.notifyPropertyChange$3(receiver, C.Symbol_field, receiver._field_view_element$__$field, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._field_view_element$__$field).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FieldViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FieldViewElement_methods.Element$created$0(receiver);
+        C.FieldViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier6: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["flag_list_element", "package:observatory/src/elements/flag_list.dart", , X, {
+  "^": "",
+  FlagListElement: {
+    "^": "ObservatoryElement_ChangeNotifier7;_flag_list_element$__$flagList,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flagList: function(receiver) {
+      return receiver._flag_list_element$__$flagList;
+    },
+    set$flagList: function(receiver, value) {
+      receiver._flag_list_element$__$flagList = this.notifyPropertyChange$3(receiver, C.Symbol_flagList, receiver._flag_list_element$__$flagList, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._flag_list_element$__$flagList).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FlagListElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagListElement_methods.Element$created$0(receiver);
+        C.FlagListElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier7: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  FlagItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier8;_flag_list_element$__$flag,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$flag: function(receiver) {
+      return receiver._flag_list_element$__$flag;
+    },
+    set$flag: function(receiver, value) {
+      receiver._flag_list_element$__$flag = this.notifyPropertyChange$3(receiver, C.Symbol_flag, receiver._flag_list_element$__$flag, value);
+    },
+    static: {FlagItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FlagItemElement_methods.Element$created$0(receiver);
+        C.FlagItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier8: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_ref_element", "package:observatory/src/elements/function_ref.dart", , U, {
+  "^": "",
+  FunctionRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier;_function_ref_element$__$qualified,_function_ref_element$__$hasParent,_function_ref_element$__$hasClass,_function_ref_element$__$isDart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$qualified: function(receiver) {
+      return receiver._function_ref_element$__$qualified;
+    },
+    set$qualified: function(receiver, value) {
+      receiver._function_ref_element$__$qualified = this.notifyPropertyChange$3(receiver, C.Symbol_qualified, receiver._function_ref_element$__$qualified, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      var refMap, t1, t2;
+      Q.ServiceRefElement.prototype.refChanged$1.call(this, receiver, oldValue);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, 0, 1);
+      refMap = receiver._service_ref_element$__$ref;
+      t1 = refMap != null;
+      if (t1) {
+        t2 = J.getInterceptor$asx(refMap);
+        t2 = !J.$eq(t2.$index(refMap, "kind"), "Collected") && !J.$eq(t2.$index(refMap, "kind"), "Native") && !J.$eq(t2.$index(refMap, "kind"), "Tag") && !J.$eq(t2.$index(refMap, "kind"), "Reused");
+      } else
+        t2 = false;
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, t2);
+      t2 = t1 && J.$index$asx(refMap, "parent") != null;
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, t2);
+      if (t1) {
+        t1 = J.getInterceptor$asx(refMap);
+        t1 = t1.$index(refMap, "owner") != null && J.$eq(t1.$index(refMap, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, t1);
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$hasParent: function(receiver) {
+      return receiver._function_ref_element$__$hasParent;
+    },
+    set$hasParent: function(receiver, value) {
+      receiver._function_ref_element$__$hasParent = this.notifyPropertyChange$3(receiver, C.Symbol_hasParent, receiver._function_ref_element$__$hasParent, value);
+    },
+    get$hasClass: function(receiver) {
+      return receiver._function_ref_element$__$hasClass;
+    },
+    set$hasClass: function(receiver, value) {
+      receiver._function_ref_element$__$hasClass = this.notifyPropertyChange$3(receiver, C.Symbol_hasClass, receiver._function_ref_element$__$hasClass, value);
+    },
+    get$isDart: function(receiver) {
+      return receiver._function_ref_element$__$isDart;
+    },
+    set$isDart: function(receiver, value) {
+      receiver._function_ref_element$__$isDart = this.notifyPropertyChange$3(receiver, C.Symbol_isDart, receiver._function_ref_element$__$isDart, value);
+    },
+    static: {FunctionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._function_ref_element$__$qualified = true;
+        receiver._function_ref_element$__$hasParent = false;
+        receiver._function_ref_element$__$hasClass = false;
+        receiver._function_ref_element$__$isDart = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionRefElement_methods.Element$created$0(receiver);
+        C.FunctionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["function_view_element", "package:observatory/src/elements/function_view.dart", , N, {
+  "^": "",
+  FunctionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier9;_function_view_element$__$function,_function_view_element$__$qualifiedName,_function_view_element$__$kind,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$$function: function(receiver) {
+      return receiver._function_view_element$__$function;
+    },
+    set$$function: function(receiver, value) {
+      receiver._function_view_element$__$function = this.notifyPropertyChange$3(receiver, C.Symbol_function, receiver._function_view_element$__$function, value);
+    },
+    get$qualifiedName: function(receiver) {
+      return receiver._function_view_element$__$qualifiedName;
+    },
+    set$qualifiedName: function(receiver, value) {
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, value);
+    },
+    get$kind: function(receiver) {
+      return receiver._function_view_element$__$kind;
+    },
+    set$kind: function(receiver, value) {
+      receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, receiver._function_view_element$__$kind, value);
+    },
+    _getQualifiedName$1: function(receiver, $function) {
+      var t1, $parent, cls;
+      t1 = $function != null;
+      $parent = t1 && J.$index$asx($function, "parent") != null ? J.$index$asx($function, "parent") : null;
+      if ($parent != null)
+        return this._getQualifiedName$1(receiver, $parent) + "." + H.S(J.$index$asx($function, "user_name"));
+      if (t1) {
+        t1 = J.getInterceptor$asx($function);
+        t1 = t1.$index($function, "owner") != null && J.$eq(t1.$index($function, "owner").get$serviceType(), "Class");
+      } else
+        t1 = false;
+      cls = t1 ? J.$index$asx($function, "owner") : null;
+      if (cls != null)
+        return H.S(J.$index$asx(cls, "user_name")) + "." + H.S(J.$index$asx($function, "user_name"));
+      return H.S(J.$index$asx($function, "user_name"));
+    },
+    functionChanged$1: [function(receiver, oldValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_kind, 0, 1);
+      t1 = this._getQualifiedName$1(receiver, receiver._function_view_element$__$function);
+      receiver._function_view_element$__$qualifiedName = this.notifyPropertyChange$3(receiver, C.Symbol_qualifiedName, receiver._function_view_element$__$qualifiedName, t1);
+      t1 = J.$index$asx(receiver._function_view_element$__$function, "kind");
+      t2 = receiver._function_view_element$__$kind;
+      switch (t1) {
+        case "kRegularFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "function");
+          break;
+        case "kClosureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "closure function");
+          break;
+        case "kSignatureFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "signature function");
+          break;
+        case "kGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "getter function");
+          break;
+        case "kSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "setter function");
+          break;
+        case "kConstructor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "constructor");
+          break;
+        case "kImplicitGetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit getter function");
+          break;
+        case "kImplicitSetterFunction":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "implicit setter function");
+          break;
+        case "kStaticInitializer":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "static initializer");
+          break;
+        case "kMethodExtractor":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "method extractor");
+          break;
+        case "kNoSuchMethodDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "noSuchMethod dispatcher");
+          break;
+        case "kInvokeFieldDispatcher":
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "invoke field dispatcher");
+          break;
+        default:
+          receiver._function_view_element$__$kind = this.notifyPropertyChange$3(receiver, C.Symbol_kind, t2, "UNKNOWN");
+          break;
+      }
+    }, "call$1", "get$functionChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._function_view_element$__$function).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {FunctionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.FunctionViewElement_methods.Element$created$0(receiver);
+        C.FunctionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier9: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["heap_map_element", "package:observatory/src/elements/heap_map.dart", , O, {
+  "^": "",
+  PixelReference: {
+    "^": "Object;_data,_dataIndex",
+    next$0: [function() {
+      return new O.PixelReference(this._data, this._dataIndex + 4);
+    }, "call$0", "get$next", 0, 0, 131],
+    get$index: function(_) {
+      return C.JSNumber_methods._tdivFast$1(this._dataIndex, 4);
+    },
+    static: {"^": "PixelReference_NUM_COLOR_COMPONENTS", PixelReference$: function(data, point) {
+        var t1, t2, t3;
+        t1 = point.get$y(point);
+        t2 = J.get$width$x(data);
+        if (typeof t1 !== "number")
+          return t1.$mul();
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t3 = point.get$x(point);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        return new O.PixelReference(data, (t1 * t2 + t3) * 4);
+      }}
+  },
+  ObjectInfo: {
+    "^": "Object;address<,size"
+  },
+  HeapMapElement: {
+    "^": "ObservatoryElement_ChangeNotifier10;_fragmentationCanvas,_fragmentationData,_pageHeight,_classIdToColor,_colorToClassId,_classIdToName,_heap_map_element$__$status,_heap_map_element$__$fragmentation,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$status: function(receiver) {
+      return receiver._heap_map_element$__$status;
+    },
+    set$status: function(receiver, value) {
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, value);
+    },
+    get$fragmentation: function(receiver) {
+      return receiver._heap_map_element$__$fragmentation;
+    },
+    set$fragmentation: function(receiver, value) {
+      receiver._heap_map_element$__$fragmentation = this.notifyPropertyChange$3(receiver, C.Symbol_fragmentation, receiver._heap_map_element$__$fragmentation, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#fragmentation");
+      receiver._fragmentationCanvas = t1;
+      t1 = J.get$onMouseMove$x(t1);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleMouseMove(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = J.get$onMouseDown$x(receiver._fragmentationCanvas);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_handleClick(receiver)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+    },
+    _packColor$1: function(receiver, color) {
+      var t1, packed, component;
+      for (t1 = J.get$iterator$ax(color), packed = 0; t1.moveNext$0();) {
+        component = t1._current;
+        if (typeof component !== "number")
+          return H.iae(component);
+        packed = packed * 256 + component;
+      }
+      return packed;
+    },
+    _addClass$3: function(receiver, classId, $name, color) {
+      var t1 = J.split$1$s($name, "@");
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      receiver._classIdToName.$indexSet(0, classId, t1[0]);
+      receiver._classIdToColor.$indexSet(0, classId, color);
+      receiver._colorToClassId.$indexSet(0, this._packColor$1(receiver, color), classId);
+    },
+    _updateClassList$2: function(receiver, classList, freeClassId) {
+      var t1, t2, t3, t4, member, classId, rng, color, t5;
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")), t2 = receiver._classIdToName, t3 = receiver._classIdToColor, t4 = receiver._colorToClassId; t1.moveNext$0();) {
+        member = t1.get$current();
+        if (!J.getInterceptor(member).$isClass) {
+          N.Logger_Logger("").info$1(H.S(member));
+          continue;
+        }
+        classId = H.Primitives_parseInt(C.JSArray_methods.get$last(J.split$1$s(member._id, "/")), null, null);
+        rng = classId == null ? C.C__JSRandom : P._Random$(classId);
+        color = [rng.nextInt$1(128), rng.nextInt$1(128), rng.nextInt$1(128), 255];
+        t5 = J.split$1$s(member._service$__$name, "@");
+        if (0 >= t5.length)
+          return H.ioore(t5, 0);
+        t2.$indexSet(0, classId, t5[0]);
+        t3.$indexSet(0, classId, color);
+        t4.$indexSet(0, this._packColor$1(receiver, color), classId);
+      }
+      this._addClass$3(receiver, freeClassId, "Free", $.get$HeapMapElement__freeColor());
+      this._addClass$3(receiver, 0, "", $.get$HeapMapElement__pageSeparationColor());
+    },
+    _objectAt$1: function(receiver, point) {
+      var t1, t2, pagePixels, index, pageIndex, pageOffset, pages, page, objects, offset, size, i, t3;
+      t1 = receiver._pageHeight;
+      t2 = J.get$width$x(receiver._fragmentationData);
+      if (typeof t1 !== "number")
+        return t1.$mul();
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      pagePixels = t1 * t2;
+      index = C.JSNumber_methods._tdivFast$1(O.PixelReference$(receiver._fragmentationData, point)._dataIndex, 4);
+      pageIndex = C.JSNumber_methods.$tdiv(index, pagePixels);
+      pageOffset = C.JSNumber_methods.$mod(index, pagePixels);
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      if (!(pageIndex < 0)) {
+        t1 = J.get$length$asx(pages);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = pageIndex >= t1;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      page = J.$index$asx(pages, pageIndex);
+      t1 = J.getInterceptor$asx(page);
+      objects = t1.$index(page, "objects");
+      t2 = J.getInterceptor$asx(objects);
+      offset = 0;
+      size = 0;
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        size = t2.$index(objects, i);
+        if (typeof size !== "number")
+          return H.iae(size);
+        offset += size;
+        if (offset > pageOffset) {
+          pageOffset = offset - size;
+          break;
+        }
+        i += 2;
+      }
+      t1 = H.Primitives_parseInt(t1.$index(page, "object_start"), null, null);
+      t2 = J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes");
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      return new O.ObjectInfo(J.$add$ns(t1, pageOffset * t2), J.$mul$ns(size, J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")));
+    },
+    _handleMouseMove$1: [function(receiver, $event) {
+      var t1, info, addressString, t2, className;
+      t1 = J.getInterceptor$x($event);
+      info = this._objectAt$1(receiver, t1.get$offset($event));
+      addressString = H.S(info.size) + "B @ 0x" + J.toRadixString$1$n(info.address, 16);
+      t1 = t1.get$offset($event);
+      t1 = O.PixelReference$(receiver._fragmentationData, t1);
+      t2 = t1._dataIndex;
+      className = receiver._classIdToName.$index(0, receiver._colorToClassId.$index(0, this._packColor$1(receiver, C.NativeUint8ClampedList_methods.getRange$2(J.get$data$x(t1._data), t2, t2 + 4))));
+      t1 = J.$eq(className, "") ? "-" : H.S(className) + " " + addressString;
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t1);
+    }, "call$1", "get$_handleMouseMove", 2, 0, 128, 2],
+    _handleClick$1: [function(receiver, $event) {
+      var address = J.toRadixString$1$n(this._objectAt$1(receiver, J.get$offset$x($event)).address, 16);
+      window.location.hash = "/" + H.S(J.get$link$x(J.get$isolate$x(receiver._heap_map_element$__$fragmentation))) + "/address/" + address;
+    }, "call$1", "get$_handleClick", 2, 0, 128, 2],
+    _updateFragmentationData$0: function(receiver) {
+      var t1, pages, width, t2, height;
+      t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null || receiver._fragmentationCanvas == null)
+        return;
+      this._updateClassList$2(receiver, J.$index$asx(t1, "class_list"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "free_class_id"));
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = receiver._fragmentationCanvas.parentElement;
+      t1.toString;
+      width = P.Rectangle$(C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientLeft)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientTop)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientWidth)), C.JSNumber_methods.toInt$0(C.JSNumber_methods.roundToDouble$0(t1.clientHeight)), null).width;
+      t1 = J.$tdiv$n(J.$tdiv$n(J.$index$asx(receiver._heap_map_element$__$fragmentation, "page_size_bytes"), J.$index$asx(receiver._heap_map_element$__$fragmentation, "unit_size_bytes")), width);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = 4 + t1;
+      receiver._pageHeight = t1;
+      t2 = J.get$length$asx(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      height = P.min(t1 * t2, 6000);
+      t2 = P.convertNativeToDart_ImageData(J.get$context2D$x(receiver._fragmentationCanvas).createImageData(width, height));
+      receiver._fragmentationData = t2;
+      J.set$width$x(receiver._fragmentationCanvas, J.get$width$x(t2));
+      J.set$height$x(receiver._fragmentationCanvas, J.get$height$x(receiver._fragmentationData));
+      this._renderPages$1(receiver, 0);
+    },
+    _renderPages$1: function(receiver, startPage) {
+      var pages, t1, t2, startY, endY, pixel, objects, i, t3, count, color, count0, t4, t5, t6;
+      pages = J.$index$asx(receiver._heap_map_element$__$fragmentation, "pages");
+      t1 = J.getInterceptor$asx(pages);
+      t2 = "Loaded " + startPage + " of " + H.S(t1.get$length(pages)) + " pages";
+      receiver._heap_map_element$__$status = this.notifyPropertyChange$3(receiver, C.Symbol_status, receiver._heap_map_element$__$status, t2);
+      t2 = receiver._pageHeight;
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      startY = startPage * t2;
+      endY = startY + t2;
+      t2 = t1.get$length(pages);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(startPage >= t2)) {
+        t2 = J.get$height$x(receiver._fragmentationData);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        t2 = endY > t2;
+      } else
+        t2 = true;
+      if (t2)
+        return;
+      pixel = O.PixelReference$(receiver._fragmentationData, H.setRuntimeTypeInfo(new P.Point(0, startY), [null]));
+      objects = J.$index$asx(t1.$index(pages, startPage), "objects");
+      t1 = J.getInterceptor$asx(objects);
+      t2 = receiver._classIdToColor;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(objects);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        count = t1.$index(objects, i);
+        color = t2.$index(0, t1.$index(objects, i + 1));
+        for (; t3 = J.getInterceptor$n(count), count0 = t3.$sub(count, 1), t3.$gt(count, 0); count = count0) {
+          t3 = pixel._data;
+          t4 = pixel._dataIndex;
+          t5 = t4 + 4;
+          C.NativeUint8ClampedList_methods.setRange$3(J.get$data$x(t3), t4, t5, color);
+          pixel = new O.PixelReference(t3, t5);
+        }
+        i += 2;
+      }
+      while (true) {
+        t1 = pixel._dataIndex;
+        t2 = C.JSNumber_methods._tdivFast$1(t1, 4);
+        t3 = pixel._data;
+        t4 = J.getInterceptor$x(t3);
+        t5 = t4.get$width(t3);
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        t5 = C.JSNumber_methods.$mod(t2, t5);
+        t6 = t4.get$width(t3);
+        if (typeof t6 !== "number")
+          return H.iae(t6);
+        t6 = C.JSNumber_methods.$tdiv(t2, t6);
+        new P.Point(t5, t6).$builtinTypeInfo = [null];
+        if (!(t6 < endY))
+          break;
+        t2 = $.get$HeapMapElement__pageSeparationColor();
+        t5 = t1 + 4;
+        C.NativeUint8ClampedList_methods.setRange$3(t4.get$data(t3), t1, t5, t2);
+        pixel = new O.PixelReference(t3, t5);
+      }
+      t1 = J.get$context2D$x(receiver._fragmentationCanvas);
+      t2 = receiver._fragmentationData;
+      J.putImageData$7$x(t1, t2, 0, 0, 0, startY, J.get$width$x(t2), endY);
+      P.Future_Future(new O.HeapMapElement__renderPages_closure(receiver, startPage), null);
+    },
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_map_element$__$fragmentation;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("heapmap").then$1(new O.HeapMapElement_refresh_closure(receiver)).catchError$1(new O.HeapMapElement_refresh_closure0()).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    fragmentationChanged$1: [function(receiver, oldValue) {
+      P.Future_Future(new O.HeapMapElement_fragmentationChanged_closure(receiver), null);
+    }, "call$1", "get$fragmentationChanged", 2, 0, 20, 57],
+    static: {"^": "HeapMapElement__freeColor,HeapMapElement__pageSeparationColor,HeapMapElement__PAGE_SEPARATION_HEIGHT,HeapMapElement__MAX_CANVAS_HEIGHT", HeapMapElement$created: function(receiver) {
+        var t1, t2, t3, t4, t5;
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t4 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t5 = P.String;
+        t5 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t5, null), null, null), [t5, null]);
+        receiver._classIdToColor = t1;
+        receiver._colorToClassId = t2;
+        receiver._classIdToName = t3;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t4;
+        receiver.polymer$Polymer$$ = t5;
+        C.HeapMapElement_methods.Element$created$0(receiver);
+        C.HeapMapElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier10: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  HeapMapElement__renderPages_closure: {
+    "^": "Closure:69;this_0,startPage_1",
+    call$0: function() {
+      J._renderPages$1$x(this.this_0, this.startPage_1 + 1);
+    },
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(response) {
+      var t1 = this.this_0;
+      t1._heap_map_element$__$fragmentation = J.notifyPropertyChange$3$x(t1, C.Symbol_fragmentation, t1._heap_map_element$__$fragmentation, response);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_refresh_closure0: {
+    "^": "Closure:75;",
+    call$2: [function(e, st) {
+      N.Logger_Logger("").info$1(H.S(e) + " " + H.S(st));
+    }, "call$2", null, 4, 0, null, 1, 133, "call"],
+    $isFunction: true
+  },
+  HeapMapElement_fragmentationChanged_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      J._updateFragmentationData$0$x(this.this_0);
+    },
+    $isFunction: true
+  }
+}],
+["heap_profile_element", "package:observatory/src/elements/heap_profile.dart", , K, {
+  "^": "",
+  ClassSortedTable: {
+    "^": "SortedTable;columns,rows,sortedRows,_sortColumnIndex,_sortDescending,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getSortKeyFor$2: function(row, col) {
+      var t1;
+      if (col === 0) {
+        t1 = this.rows;
+        if (row >>> 0 !== row || row >= t1.length)
+          return H.ioore(t1, row);
+        return J.get$name$x(J.$index$asx(J.get$values$x(t1[row]), col));
+      }
+      return G.SortedTable.prototype.getSortKeyFor$2.call(this, row, col);
+    }
+  },
+  HeapProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier11;_heap_profile_element$__$lastServiceGC,_heap_profile_element$__$lastAccumulatorReset,_newPieDataTable,_newPieChart,_oldPieDataTable,_oldPieChart,_heap_profile_element$__$classTable,_classTableBody,_heap_profile_element$__$profile,_heap_profile_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$lastServiceGC: function(receiver) {
+      return receiver._heap_profile_element$__$lastServiceGC;
+    },
+    set$lastServiceGC: function(receiver, value) {
+      receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, value);
+    },
+    get$lastAccumulatorReset: function(receiver) {
+      return receiver._heap_profile_element$__$lastAccumulatorReset;
+    },
+    set$lastAccumulatorReset: function(receiver, value) {
+      receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, value);
+    },
+    get$classTable: function(receiver) {
+      return receiver._heap_profile_element$__$classTable;
+    },
+    set$classTable: function(receiver, value) {
+      receiver._heap_profile_element$__$classTable = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, value);
+    },
+    get$profile: function(receiver) {
+      return receiver._heap_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._heap_profile_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._heap_profile_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#newPieChart");
+      t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t1]);
+      receiver._newPieChart = t2;
+      t2 = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#oldPieChart");
+      t1 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+      t1._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [t2]);
+      receiver._oldPieChart = t1;
+      receiver._classTableBody = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#classTableBody");
+    },
+    _updateClasses$0: function(receiver) {
+      var t1, clsAllocations, t2, cls;
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        clsAllocations = t1.get$current();
+        t2 = J.getInterceptor$asx(clsAllocations);
+        cls = t2.$index(clsAllocations, "class");
+        if (cls == null)
+          continue;
+        cls.get$newSpace().update$1(t2.$index(clsAllocations, "new"));
+        cls.get$oldSpace().update$1(t2.$index(clsAllocations, "old"));
+      }
+    },
+    _updateClassTable$0: function(receiver) {
+      var t1, cls, t2, t3, t4, t5, t6, t7, t8, t9;
+      receiver._heap_profile_element$__$classTable.clearRows$0();
+      for (t1 = J.get$iterator$ax(J.$index$asx(receiver._heap_profile_element$__$profile, "members")); t1.moveNext$0();) {
+        cls = J.$index$asx(t1.get$current(), "class");
+        if (cls == null)
+          continue;
+        if (cls.get$hasNoAllocations())
+          continue;
+        t2 = cls.get$newSpace().get$accumulated()._service$__$bytes;
+        t3 = cls.get$newSpace().get$accumulated()._service$__$instances;
+        t4 = cls.get$newSpace().get$current()._service$__$bytes;
+        t5 = cls.get$newSpace().get$current()._service$__$instances;
+        t6 = cls.get$oldSpace().get$accumulated()._service$__$bytes;
+        t7 = cls.get$oldSpace().get$accumulated()._service$__$instances;
+        t8 = cls.get$oldSpace().get$current()._service$__$bytes;
+        t9 = cls.get$oldSpace().get$current()._service$__$instances;
+        J.addRow$1$x(receiver._heap_profile_element$__$classTable, new G.SortedTableRow([cls, "", t2, t3, t4, t5, "", t6, t7, t8, t9]));
+      }
+      J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+    },
+    _fillClassTableDomRow$2: function(receiver, tr, rowIndex) {
+      var row, t1, t2, i, t3, cell;
+      row = J.$index$asx(J.get$rows$x(receiver._heap_profile_element$__$classTable), rowIndex);
+      t1 = J.getInterceptor$x(tr);
+      t2 = J.getInterceptor$x(row);
+      J.set$ref$x(J.$index$asx(J.get$children$x(J.$index$asx(t1.get$children(tr), 0)), 0), J.$index$asx(t2.get$values(row), 0));
+      i = 1;
+      while (true) {
+        t3 = J.get$length$asx(t2.get$values(row));
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        c$0: {
+          if (C.JSArray_methods.contains$1(C.List_1_6, i))
+            break c$0;
+          cell = J.$index$asx(t1.get$children(tr), i);
+          t3 = J.getInterceptor$x(cell);
+          t3.set$title(cell, J.toString$0(J.$index$asx(t2.get$values(row), i)));
+          t3.set$text(cell, receiver._heap_profile_element$__$classTable.getFormattedValue$2(rowIndex, i));
+        }
+        ++i;
+      }
+    },
+    _updateClassTableInDom$0: function(receiver) {
+      var t1, deadRows, i, t2, newRows, tr, cell, rowIndex;
+      t1 = J.get$children$x(receiver._classTableBody);
+      if (t1.get$length(t1) > receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+        t1 = J.get$children$x(receiver._classTableBody);
+        deadRows = t1.get$length(t1) - receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+        for (i = 0; i < deadRows; ++i)
+          J.get$children$x(receiver._classTableBody).removeLast$0(0);
+      } else {
+        t1 = J.get$children$x(receiver._classTableBody);
+        if (t1.get$length(t1) < receiver._heap_profile_element$__$classTable.get$sortedRows().length) {
+          t1 = receiver._heap_profile_element$__$classTable.get$sortedRows().length;
+          t2 = J.get$children$x(receiver._classTableBody);
+          newRows = t1 - t2.get$length(t2);
+          for (i = 0; i < newRows; ++i) {
+            tr = document.createElement("tr", null);
+            t1 = J.getInterceptor$x(tr);
+            t1.insertCell$1(tr, -1).appendChild(W._ElementFactoryProvider_createElement_tag("class-ref", null));
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            cell = t1.insertCell$1(tr, -1);
+            cell.toString;
+            new W._ElementCssClassSet(cell).add$1(0, "left-border-spacer");
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            t1.insertCell$1(tr, -1);
+            J.get$children$x(receiver._classTableBody).add$1(0, tr);
+          }
+        }
+      }
+      for (i = 0; i < receiver._heap_profile_element$__$classTable.get$sortedRows().length; ++i) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortedRows();
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        rowIndex = t1[i];
+        this._fillClassTableDomRow$2(receiver, J.get$children$x(receiver._classTableBody).$index(0, i), rowIndex);
+      }
+    },
+    changeSort$3: [function(receiver, e, detail, target) {
+      var t1, t2, t3;
+      if (!!J.getInterceptor(target).$isTableCellElement) {
+        t1 = receiver._heap_profile_element$__$classTable.get$sortColumnIndex();
+        t2 = target.cellIndex;
+        t3 = receiver._heap_profile_element$__$classTable;
+        if (t1 == null ? t2 != null : t1 !== t2) {
+          t3.set$sortColumnIndex(t2);
+          receiver._heap_profile_element$__$classTable.set$sortDescending(true);
+        } else
+          t3.set$sortDescending(!t3.get$sortDescending());
+        J.sort$0$ax(receiver._heap_profile_element$__$classTable);
+        this._updateClassTableInDom$0(receiver);
+      }
+    }, "call$3", "get$changeSort", 6, 0, 92, 1, 93, 94],
+    refresh$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshGC$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?gc=full").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refreshGC", 2, 0, 20, 89],
+    resetAccumulator$1: [function(receiver, done) {
+      var t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      J.get$isolate$x(t1).get$1("/allocationprofile?reset=true").then$1(this.get$_heap_profile_element$_update(receiver)).whenComplete$1(done);
+    }, "call$1", "get$resetAccumulator", 2, 0, 20, 89],
+    _heap_profile_element$_update$1: [function(receiver, newProfile) {
+      receiver._heap_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._heap_profile_element$__$profile, newProfile);
+    }, "call$1", "get$_heap_profile_element$_update", 2, 0, 134, 135],
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, millis, isolate, t2, t3;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      t1 = J.get$isolate$x(t1);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._heap_profile_element$__$isolate, t1);
+      receiver._heap_profile_element$__$isolate = t1;
+      t1.updateHeapsFromMap$1(J.$index$asx(receiver._heap_profile_element$__$profile, "heaps"));
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastAccumulatorReset"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastAccumulatorReset = this.notifyPropertyChange$3(receiver, C.Symbol_lastAccumulatorReset, receiver._heap_profile_element$__$lastAccumulatorReset, t1);
+      }
+      millis = H.Primitives_parseInt(J.$index$asx(receiver._heap_profile_element$__$profile, "dateLastServiceGC"), null, null);
+      if (!J.$eq(millis, 0)) {
+        t1 = P.DateTime$fromMillisecondsSinceEpoch(millis, false).toString$0(0);
+        receiver._heap_profile_element$__$lastServiceGC = this.notifyPropertyChange$3(receiver, C.Symbol_lastServiceGC, receiver._heap_profile_element$__$lastServiceGC, t1);
+      }
+      t1 = receiver._newPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      isolate = J.get$isolate$x(receiver._heap_profile_element$__$profile);
+      t1 = receiver._newPieDataTable;
+      t2 = isolate.get$newSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._newPieDataTable;
+      t1 = J.$sub$n(isolate.get$newSpace().get$capacity(), isolate.get$newSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._newPieDataTable;
+      t3 = isolate.get$newSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      t1 = receiver._oldPieDataTable._app$_table;
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      t1 = receiver._oldPieDataTable;
+      t2 = isolate.get$oldSpace().get$used();
+      t1 = t1._app$_table;
+      t3 = [];
+      C.JSArray_methods.addAll$1(t3, C.JSArray_methods.map$1(["Used", t2], P._convertToJS$closure()));
+      t1.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t3), [null])]);
+      t3 = receiver._oldPieDataTable;
+      t1 = J.$sub$n(isolate.get$oldSpace().get$capacity(), isolate.get$oldSpace().get$used());
+      t3 = t3._app$_table;
+      t2 = [];
+      C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(["Free", t1], P._convertToJS$closure()));
+      t3.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t2), [null])]);
+      t2 = receiver._oldPieDataTable;
+      t3 = isolate.get$oldSpace().get$external();
+      t2 = t2._app$_table;
+      t1 = [];
+      C.JSArray_methods.addAll$1(t1, C.JSArray_methods.map$1(["External", t3], P._convertToJS$closure()));
+      t2.callMethod$2("addRow", [H.setRuntimeTypeInfo(new P.JsArray(t1), [null])]);
+      this._updateClasses$0(receiver);
+      this._updateClassTable$0(receiver);
+      this._updateClassTableInDom$0(receiver);
+      receiver._newPieChart.draw$1(receiver._newPieDataTable);
+      receiver._oldPieChart.draw$1(receiver._oldPieDataTable);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedAverage, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedTotalCollectionTime, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_formattedCollections, 0, 1);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    formattedAverage$1: [function(receiver, newSpace) {
+      var t1, t2, heap;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      heap = newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace();
+      return C.JSNumber_methods.toStringAsFixed$1(J.$div$n(J.$mul$ns(heap.get$totalCollectionTimeInSeconds(), 1000), heap.get$collections()), 2) + " ms";
+    }, "call$1", "get$formattedAverage", 2, 0, 136, 137],
+    formattedCollections$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toString$0((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$collections());
+    }, "call$1", "get$formattedCollections", 2, 0, 136, 137],
+    formattedTotalCollectionTime$1: [function(receiver, newSpace) {
+      var t1, t2;
+      t1 = receiver._heap_profile_element$__$profile;
+      if (t1 == null)
+        return "";
+      t2 = J.getInterceptor$x(t1);
+      return J.toStringAsFixed$1$n((newSpace === true ? t2.get$isolate(t1).get$newSpace() : t2.get$isolate(t1).get$oldSpace()).get$totalCollectionTimeInSeconds(), 2) + " secs";
+    }, "call$1", "get$formattedTotalCollectionTime", 2, 0, 136, 137],
+    HeapProfileElement$created$0: function(receiver) {
+      var t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._newPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._newPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+      receiver._oldPieDataTable = new G.DataTable(t1);
+      t1.callMethod$2("addColumn", ["string", "Type"]);
+      receiver._oldPieDataTable._app$_table.callMethod$2("addColumn", ["number", "Size"]);
+      t1 = H.setRuntimeTypeInfo([], [G.SortedTableRow]);
+      t1 = this.notifyPropertyChange$3(receiver, C.Symbol_classTable, receiver._heap_profile_element$__$classTable, new K.ClassSortedTable([new G.SortedTableColumn("Class", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulated Size (New)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulated Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("", G.SortedTableColumn_toStringFormatter$closure()), new G.SortedTableColumn("Accumulator Size (Old)", G.Utils_formatSize$closure()), new G.SortedTableColumn("Accumulator Instances", G.Utils_formatCommaSeparated$closure()), new G.SortedTableColumn("Current Size", G.Utils_formatSize$closure()), new G.SortedTableColumn("Current Instances", G.Utils_formatCommaSeparated$closure())], t1, [], 0, true, null, null));
+      receiver._heap_profile_element$__$classTable = t1;
+      t1.set$sortColumnIndex(2);
+    },
+    static: {HeapProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._heap_profile_element$__$lastServiceGC = "---";
+        receiver._heap_profile_element$__$lastAccumulatorReset = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.HeapProfileElement_methods.Element$created$0(receiver);
+        C.HeapProfileElement_methods.PolymerElement$created$0(receiver);
+        C.HeapProfileElement_methods.HeapProfileElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier11: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["html_common", "dart:html_common", , P, {
+  "^": "",
+  _convertDartToNative_PrepareForStructuredClone: function(value) {
+    var copies, copy;
+    copies = [];
+    copy = new P._convertDartToNative_PrepareForStructuredClone_walk(new P._convertDartToNative_PrepareForStructuredClone_findSlot([], copies), new P._convertDartToNative_PrepareForStructuredClone_readSlot(copies), new P._convertDartToNative_PrepareForStructuredClone_writeSlot(copies)).call$1(value);
+    new P._convertDartToNative_PrepareForStructuredClone_cleanupSlots().call$0();
+    return copy;
+  },
+  convertNativeToDart_AcceptStructuredClone: function(object, mustCopy) {
+    var copies = [];
+    return new P.convertNativeToDart_AcceptStructuredClone_walk(mustCopy, new P.convertNativeToDart_AcceptStructuredClone_findSlot([], copies), new P.convertNativeToDart_AcceptStructuredClone_readSlot(copies), new P.convertNativeToDart_AcceptStructuredClone_writeSlot(copies)).call$1(object);
+  },
+  convertNativeToDart_ImageData: function(nativeImageData) {
+    var t1, data;
+    t1 = J.getInterceptor(nativeImageData);
+    if (!!t1.$isImageData) {
+      data = t1.get$data(nativeImageData);
+      if (data.constructor === Array)
+        if (typeof CanvasPixelArray !== "undefined") {
+          data.constructor = CanvasPixelArray;
+          data.BYTES_PER_ELEMENT = 1;
+        }
+      return nativeImageData;
+    }
+    return new P._TypedImageData(nativeImageData.data, nativeImageData.height, nativeImageData.width);
+  },
+  convertDartToNative_ImageData: function(imageData) {
+    if (!!J.getInterceptor(imageData).$is_TypedImageData)
+      return {data: imageData.data, height: imageData.height, width: imageData.width};
+    return imageData;
+  },
+  Device_isWebKit: function() {
+    var t1 = $.Device__isWebKit;
+    if (t1 == null) {
+      t1 = $.Device__isOpera;
+      if (t1 == null) {
+        t1 = J.contains$2$asx(window.navigator.userAgent, "Opera", 0);
+        $.Device__isOpera = t1;
+      }
+      t1 = t1 !== true && J.contains$2$asx(window.navigator.userAgent, "WebKit", 0);
+      $.Device__isWebKit = t1;
+    }
+    return t1;
+  },
+  _convertDartToNative_PrepareForStructuredClone_findSlot: {
+    "^": "Closure:48;values_1,copies_2",
+    call$1: function(value) {
+      var t1, $length, i;
+      t1 = this.values_1;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i)
+        if (t1[i] === value)
+          return i;
+      t1.push(value);
+      this.copies_2.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_readSlot: {
+    "^": "Closure:138;copies_3",
+    call$1: function(i) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_4",
+    call$2: function(i, x) {
+      var t1 = this.copies_4;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_cleanupSlots: {
+    "^": "Closure:69;",
+    call$0: function() {
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk: {
+    "^": "Closure:13;findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var t1, t2, slot, copy, $length, i;
+      t1 = {};
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      t2 = J.getInterceptor(e);
+      if (!!t2.$isDateTime)
+        return new Date(e.millisecondsSinceEpoch);
+      if (!!t2.$isRegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (!!t2.$isFile)
+        return e;
+      if (!!t2.$isBlob)
+        return e;
+      if (!!t2.$isImageData)
+        return e;
+      if (!!t2.$isNativeByteBuffer)
+        return e;
+      if (!!t2.$isNativeTypedData)
+        return e;
+      if (!!t2.$isMap) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        t1.copy_0 = copy;
+        if (copy != null)
+          return copy;
+        copy = {};
+        t1.copy_0 = copy;
+        this.writeSlot_7.call$2(slot, copy);
+        t2.forEach$1(e, new P._convertDartToNative_PrepareForStructuredClone_walk_closure(t1, this));
+        return t1.copy_0;
+      }
+      if (!!t2.$isList) {
+        $length = t2.get$length(e);
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null) {
+          if (true === copy) {
+            copy = new Array($length);
+            this.writeSlot_7.call$2(slot, copy);
+          }
+          return copy;
+        }
+        copy = new Array($length);
+        this.writeSlot_7.call$2(slot, copy);
+        for (i = 0; i < $length; ++i) {
+          t1 = this.call$1(t2.$index(e, i));
+          if (i >= copy.length)
+            return H.ioore(copy, i);
+          copy[i] = t1;
+        }
+        return copy;
+      }
+      throw H.wrapException(P.UnimplementedError$("structured clone of other type"));
+    },
+    $isFunction: true
+  },
+  _convertDartToNative_PrepareForStructuredClone_walk_closure: {
+    "^": "Closure:75;box_0,walk_8",
+    call$2: function(key, value) {
+      this.box_0.copy_0[key] = this.walk_8.call$1(value);
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_findSlot: {
+    "^": "Closure:48;values_0,copies_1",
+    call$1: function(value) {
+      var t1, $length, i, t2;
+      t1 = this.values_0;
+      $length = t1.length;
+      for (i = 0; i < $length; ++i) {
+        t2 = t1[i];
+        if (t2 == null ? value == null : t2 === value)
+          return i;
+      }
+      t1.push(value);
+      this.copies_1.push(null);
+      return $length;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_readSlot: {
+    "^": "Closure:138;copies_2",
+    call$1: function(i) {
+      var t1 = this.copies_2;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      return t1[i];
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_writeSlot: {
+    "^": "Closure:139;copies_3",
+    call$2: function(i, x) {
+      var t1 = this.copies_3;
+      if (i >= t1.length)
+        return H.ioore(t1, i);
+      t1[i] = x;
+    },
+    $isFunction: true
+  },
+  convertNativeToDart_AcceptStructuredClone_walk: {
+    "^": "Closure:13;mustCopy_4,findSlot_5,readSlot_6,writeSlot_7",
+    call$1: function(e) {
+      var slot, copy, t1, key, $length, t2, i;
+      if (e == null)
+        return e;
+      if (typeof e === "boolean")
+        return e;
+      if (typeof e === "number")
+        return e;
+      if (typeof e === "string")
+        return e;
+      if (e instanceof Date)
+        return P.DateTime$fromMillisecondsSinceEpoch(e.getTime(), true);
+      if (e instanceof RegExp)
+        throw H.wrapException(P.UnimplementedError$("structured clone of RegExp"));
+      if (Object.getPrototypeOf(e) === Object.prototype) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        copy = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.writeSlot_7.call$2(slot, copy);
+        for (t1 = Object.keys(e), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          key = t1._current;
+          copy.$indexSet(0, key, this.call$1(e[key]));
+        }
+        return copy;
+      }
+      if (e instanceof Array) {
+        slot = this.findSlot_5.call$1(e);
+        copy = this.readSlot_6.call$1(slot);
+        if (copy != null)
+          return copy;
+        t1 = J.getInterceptor$asx(e);
+        $length = t1.get$length(e);
+        copy = this.mustCopy_4 ? new Array($length) : e;
+        this.writeSlot_7.call$2(slot, copy);
+        if (typeof $length !== "number")
+          return H.iae($length);
+        t2 = J.getInterceptor$ax(copy);
+        i = 0;
+        for (; i < $length; ++i)
+          t2.$indexSet(copy, i, this.call$1(t1.$index(e, i)));
+        return copy;
+      }
+      return e;
+    },
+    $isFunction: true
+  },
+  _TypedImageData: {
+    "^": "Object;data>,height>,width>",
+    $is_TypedImageData: true,
+    $isImageData: true
+  },
+  CssClassSetImpl: {
+    "^": "Object;",
+    toString$0: function(_) {
+      return this.readClasses$0().join$1(0, " ");
+    },
+    get$iterator: function(_) {
+      var t1 = this.readClasses$0();
+      t1 = H.setRuntimeTypeInfo(new P.LinkedHashSetIterator(t1, t1._modifications, null, null), [null]);
+      t1._cell = t1._set._first;
+      return t1;
+    },
+    forEach$1: function(_, f) {
+      this.readClasses$0().forEach$1(0, f);
+    },
+    join$1: function(_, separator) {
+      return this.readClasses$0().join$1(0, separator);
+    },
+    map$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.EfficientLengthMappedIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$map", 2, 0, 140, 31],
+    where$1: function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.WhereIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    expand$1: [function(_, f) {
+      var t1 = this.readClasses$0();
+      return H.setRuntimeTypeInfo(new H.ExpandIterable(t1, f), [H.getTypeArgumentByIndex(t1, 0), null]);
+    }, "call$1", "get$expand", 2, 0, 141, 31],
+    any$1: function(_, f) {
+      return this.readClasses$0().any$1(0, f);
+    },
+    get$isEmpty: function(_) {
+      return this.readClasses$0()._collection$_length === 0;
+    },
+    get$isNotEmpty: function(_) {
+      return this.readClasses$0()._collection$_length !== 0;
+    },
+    get$length: function(_) {
+      return this.readClasses$0()._collection$_length;
+    },
+    contains$1: function(_, value) {
+      return this.readClasses$0().contains$1(0, value);
+    },
+    lookup$1: function(value) {
+      return this.readClasses$0().contains$1(0, value) ? value : null;
+    },
+    add$1: function(_, value) {
+      return this.modify$1(new P.CssClassSetImpl_add_closure(value));
+    },
+    remove$1: function(_, value) {
+      var s, result;
+      s = this.readClasses$0();
+      result = s.remove$1(0, value);
+      this.writeClasses$1(s);
+      return result;
+    },
+    addAll$1: function(_, iterable) {
+      this.modify$1(new P.CssClassSetImpl_addAll_closure(iterable));
+    },
+    get$last: function(_) {
+      var t1 = this.readClasses$0()._last;
+      if (t1 == null)
+        H.throwExpression(P.StateError$("No elements"));
+      return t1.get$_element(t1);
+    },
+    toList$1$growable: function(_, growable) {
+      return this.readClasses$0().toList$1$growable(0, growable);
+    },
+    toList$0: function($receiver) {
+      return this.toList$1$growable($receiver, true);
+    },
+    clear$0: function(_) {
+      this.modify$1(new P.CssClassSetImpl_clear_closure());
+    },
+    modify$1: function(f) {
+      var s, ret;
+      s = this.readClasses$0();
+      ret = f.call$1(s);
+      this.writeClasses$1(s);
+      return ret;
+    },
+    $isEfficientLength: true,
+    $isIterable: true,
+    $asIterable: function() {
+      return [P.String];
+    }
+  },
+  CssClassSetImpl_add_closure: {
+    "^": "Closure:13;value_0",
+    call$1: [function(s) {
+      return J.add$1$ax(s, this.value_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_addAll_closure: {
+    "^": "Closure:13;iterable_0",
+    call$1: [function(s) {
+      return J.addAll$1$ax(s, this.iterable_0);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  CssClassSetImpl_clear_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return J.clear$0$ax(s);
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  FilteredElementList: {
+    "^": "ListBase;_html_common$_node,_childNodes",
+    get$_filtered: function() {
+      var t1 = this._childNodes;
+      return P.List_List$from(t1.where$1(t1, new P.FilteredElementList__filtered_closure()), true, W.Element);
+    },
+    forEach$1: function(_, f) {
+      H.IterableMixinWorkaround_forEach(this.get$_filtered(), f);
+    },
+    $indexSet: function(_, index, value) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      J.replaceWith$1$x(t1[index], value);
+    },
+    set$length: function(_, newLength) {
+      var len = this.get$_filtered().length;
+      if (newLength >= len)
+        return;
+      else if (newLength < 0)
+        throw H.wrapException(P.ArgumentError$("Invalid list length"));
+      this.removeRange$2(0, newLength, len);
+    },
+    add$1: function(_, value) {
+      this._childNodes._this.appendChild(value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, t2;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(iterable, iterable.length, 0, null), [H.getTypeArgumentByIndex(iterable, 0)]), t2 = this._childNodes._this; t1.moveNext$0();)
+        t2.appendChild(t1._current);
+    },
+    contains$1: function(_, needle) {
+      return false;
+    },
+    sort$1: function(_, compare) {
+      throw H.wrapException(P.UnsupportedError$("Cannot sort filtered list"));
+    },
+    sort$0: function($receiver) {
+      return this.sort$1($receiver, null);
+    },
+    setRange$4: function(_, start, end, iterable, skipCount) {
+      throw H.wrapException(P.UnsupportedError$("Cannot setRange on filtered list"));
+    },
+    setRange$3: function($receiver, start, end, iterable) {
+      return this.setRange$4($receiver, start, end, iterable, 0);
+    },
+    removeRange$2: function(_, start, end) {
+      H.IterableMixinWorkaround_forEach(C.JSArray_methods.sublist$2(this.get$_filtered(), start, end), new P.FilteredElementList_removeRange_closure());
+    },
+    clear$0: function(_) {
+      J._clearChildren$0$x(this._childNodes._this);
+    },
+    removeLast$0: function(_) {
+      var result = this.get$last(this);
+      if (result != null)
+        J.remove$0$ax(result);
+      return result;
+    },
+    insert$2: function(_, index, value) {
+      this._childNodes.insert$2(0, index, value);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, t2;
+      t1 = this._childNodes._this;
+      t2 = t1.childNodes;
+      if (index < 0 || index >= t2.length)
+        return H.ioore(t2, index);
+      J.insertAllBefore$2$x(t1, iterable, t2[index]);
+    },
+    get$length: function(_) {
+      return this.get$_filtered().length;
+    },
+    $index: function(_, index) {
+      var t1 = this.get$_filtered();
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    get$iterator: function(_) {
+      var t1 = this.get$_filtered();
+      return H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]);
+    }
+  },
+  FilteredElementList__filtered_closure: {
+    "^": "Closure:13;",
+    call$1: function(n) {
+      return !!J.getInterceptor(n).$isElement;
+    },
+    $isFunction: true
+  },
+  FilteredElementList_removeRange_closure: {
+    "^": "Closure:13;",
+    call$1: function(el) {
+      return J.remove$0$ax(el);
+    },
+    $isFunction: true
+  }
+}],
+["instance_ref_element", "package:observatory/src/elements/instance_ref.dart", , B, {
+  "^": "",
+  InstanceRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null)
+        if (J.$eq(t1.get$serviceType(), "Null"))
+          if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/optimized-out"))
+            return "This object is no longer needed and has been removed by the optimizing compiler.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/collected"))
+            return "This object has been reclaimed by the garbage collector.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/expired"))
+            return "The handle to this object has expired.  Consider refreshing the page.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/not-initialized"))
+            return "This object will be initialized once it is accessed by the program.";
+          else if (J.$eq(J.get$id$x(receiver._service_ref_element$__$ref), "objects/being-initialized"))
+            return "This object is currently being initialized.";
+      return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+    },
+    expander$0: [function(receiver) {
+      return this.get$expandEvent(receiver);
+    }, "call$0", "get$expander", 0, 0, 69],
+    expandEvent$2: [function(receiver, expand, done) {
+      var t1, t2;
+      t1 = receiver._service_ref_element$__$ref;
+      if (expand === true)
+        J.reload$0$x(t1).then$1(new B.InstanceRefElement_expandEvent_closure(receiver)).whenComplete$1(done);
+      else {
+        t2 = J.getInterceptor$ax(t1);
+        t2.$indexSet(t1, "fields", null);
+        t2.$indexSet(t1, "elements", null);
+        done.call$0();
+      }
+    }, "call$2", "get$expandEvent", 4, 0, 143, 144, 89],
+    static: {InstanceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceRefElement_methods.Element$created$0(receiver);
+        C.InstanceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  InstanceRefElement_expandEvent_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(result);
+      if (t1.$index(result, "valueAsString") != null) {
+        t1.set$name(result, t1.$index(result, "valueAsString"));
+        result.set$vmName(t1.$index(result, "valueAsString"));
+      }
+      t1 = this.this_0;
+      t2 = J.getInterceptor$x(t1);
+      t1._service_ref_element$__$ref = t2.notifyPropertyChange$3(t1, C.Symbol_ref, t1._service_ref_element$__$ref, result);
+      t2.notifyPropertyChange$3(t1, C.Symbol_ref, 0, 1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["instance_view_element", "package:observatory/src/elements/instance_view.dart", , Z, {
+  "^": "",
+  InstanceViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier12;_instance_view_element$__$instance,_instance_view_element$__$path,_instance_view_element$__$retainedBytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$instance: function(receiver) {
+      return receiver._instance_view_element$__$instance;
+    },
+    set$instance: function(receiver, value) {
+      receiver._instance_view_element$__$instance = this.notifyPropertyChange$3(receiver, C.Symbol_instance, receiver._instance_view_element$__$instance, value);
+    },
+    get$path: function(receiver) {
+      return receiver._instance_view_element$__$path;
+    },
+    set$path: function(receiver, value) {
+      receiver._instance_view_element$__$path = this.notifyPropertyChange$3(receiver, C.Symbol_path, receiver._instance_view_element$__$path, value);
+    },
+    get$retainedBytes: function(receiver) {
+      return receiver._instance_view_element$__$retainedBytes;
+    },
+    set$retainedBytes: function(receiver, value) {
+      receiver._instance_view_element$__$retainedBytes = this.notifyPropertyChange$3(receiver, C.Symbol_retainedBytes, receiver._instance_view_element$__$retainedBytes, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    retainedSize$1: [function(receiver, dummy) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retained")).then$1(new Z.InstanceViewElement_retainedSize_closure(receiver));
+    }, "call$1", "get$retainedSize", 2, 0, 98, 100],
+    retainingPath$1: [function(receiver, arg) {
+      return J.get$isolate$x(receiver._instance_view_element$__$instance).get$1(J.$add$ns(J.get$id$x(receiver._instance_view_element$__$instance), "/retaining_path?limit=" + H.S(arg))).then$1(new Z.InstanceViewElement_retainingPath_closure(receiver));
+    }, "call$1", "get$retainingPath", 2, 0, 98, 33],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._instance_view_element$__$instance).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {InstanceViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._instance_view_element$__$retainedBytes = null;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.InstanceViewElement_methods.Element$created$0(receiver);
+        C.InstanceViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier12: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  InstanceViewElement_retainedSize_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(obj) {
+      var t1, t2;
+      t1 = this.this_0;
+      t2 = H.Primitives_parseInt(J.$index$asx(obj, "valueAsString"), null, null);
+      t1._instance_view_element$__$retainedBytes = J.notifyPropertyChange$3$x(t1, C.Symbol_retainedBytes, t1._instance_view_element$__$retainedBytes, t2);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  },
+  InstanceViewElement_retainingPath_closure: {
+    "^": "Closure:130;this_0",
+    call$1: [function(obj) {
+      var t1 = this.this_0;
+      t1._instance_view_element$__$path = J.notifyPropertyChange$3$x(t1, C.Symbol_path, t1._instance_view_element$__$path, obj);
+    }, "call$1", null, 2, 0, null, 81, "call"],
+    $isFunction: true
+  }
+}],
+["io_view_element", "package:observatory/src/elements/io_view.dart", , E, {
+  "^": "",
+  IOViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier13;_io_view_element$__$io,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$io: function(receiver) {
+      return receiver._io_view_element$__$io;
+    },
+    set$io: function(receiver, value) {
+      receiver._io_view_element$__$io = this.notifyPropertyChange$3(receiver, C.Symbol_io, receiver._io_view_element$__$io, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$io).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOViewElement_methods.Element$created$0(receiver);
+        C.IOViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier13: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORefElement_methods.Element$created$0(receiver);
+        C.IORefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier14;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOHttpServerListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerListViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier14: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOHttpServerViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier15;_io_view_element$__$httpServer,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$httpServer: function(receiver) {
+      return receiver._io_view_element$__$httpServer;
+    },
+    set$httpServer: function(receiver, value) {
+      receiver._io_view_element$__$httpServer = this.notifyPropertyChange$3(receiver, C.Symbol_httpServer, receiver._io_view_element$__$httpServer, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$httpServer).whenComplete$1(new E.IOHttpServerViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier15: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier16;_io_view_element$__$connection,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$connection: function(receiver) {
+      return receiver._io_view_element$__$connection;
+    },
+    set$connection: function(receiver, value) {
+      receiver._io_view_element$__$connection = this.notifyPropertyChange$3(receiver, C.Symbol_connection, receiver._io_view_element$__$connection, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateHttpServer$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$connection).whenComplete$1(new E.IOHttpServerConnectionViewElement__updateHttpServer_closure(receiver));
+    }, "call$0", "get$_updateHttpServer", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateHttpServer(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOHttpServerConnectionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionViewElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier16: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOHttpServerConnectionViewElement__updateHttpServer_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateHttpServer$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOHttpServerConnectionRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOHttpServerConnectionRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOHttpServerConnectionRefElement_methods.Element$created$0(receiver);
+        C.IOHttpServerConnectionRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketRefElement_methods.Element$created$0(receiver);
+        C.IOSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier17;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier17: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier18;_io_view_element$__$socket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$socket: function(receiver) {
+      return receiver._io_view_element$__$socket;
+    },
+    set$socket: function(receiver, value) {
+      receiver._io_view_element$__$socket = this.notifyPropertyChange$3(receiver, C.Symbol_socket, receiver._io_view_element$__$socket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$socket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOSocketViewElement_methods.Element$created$0(receiver);
+        C.IOSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier18: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IOWebSocketRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketRefElement_methods.Element$created$0(receiver);
+        C.IOWebSocketRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IOWebSocketListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier19;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketListViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier19: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOWebSocketViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier20;_io_view_element$__$webSocket,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$webSocket: function(receiver) {
+      return receiver._io_view_element$__$webSocket;
+    },
+    set$webSocket: function(receiver, value) {
+      receiver._io_view_element$__$webSocket = this.notifyPropertyChange$3(receiver, C.Symbol_webSocket, receiver._io_view_element$__$webSocket, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$webSocket).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOWebSocketViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOWebSocketViewElement_methods.Element$created$0(receiver);
+        C.IOWebSocketViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier20: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier21;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IORandomAccessFileListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileListViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier21: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IORandomAccessFileRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileRefElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  IORandomAccessFileViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier22;_io_view_element$__$file,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$file: function(receiver) {
+      return receiver._io_view_element$__$file;
+    },
+    set$file: function(receiver, value) {
+      receiver._io_view_element$__$file = this.notifyPropertyChange$3(receiver, C.Symbol_file, receiver._io_view_element$__$file, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$file).whenComplete$1(new E.IORandomAccessFileViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IORandomAccessFileViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IORandomAccessFileViewElement_methods.Element$created$0(receiver);
+        C.IORandomAccessFileViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier22: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IORandomAccessFileViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  IOProcessListViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier23;_io_view_element$__$list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$list: function(receiver) {
+      return receiver._io_view_element$__$list;
+    },
+    set$list: function(receiver, value) {
+      receiver._io_view_element$__$list = this.notifyPropertyChange$3(receiver, C.Symbol_list, receiver._io_view_element$__$list, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$list).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {IOProcessListViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessListViewElement_methods.Element$created$0(receiver);
+        C.IOProcessListViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier23: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier0;_io_view_element$__$small,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$small: function(receiver) {
+      return receiver._io_view_element$__$small;
+    },
+    set$small: function(receiver, value) {
+      receiver._io_view_element$__$small = this.notifyPropertyChange$3(receiver, C.Symbol_small, receiver._io_view_element$__$small, value);
+    },
+    static: {IOProcessRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._io_view_element$__$small = false;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessRefElement_methods.Element$created$0(receiver);
+        C.IOProcessRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier0: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier24;_io_view_element$__$process,_updateTimer,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$process: function(receiver) {
+      return receiver._io_view_element$__$process;
+    },
+    process$0: function($receiver) {
+      return this.get$process($receiver).call$0();
+    },
+    set$process: function(receiver, value) {
+      receiver._io_view_element$__$process = this.notifyPropertyChange$3(receiver, C.Symbol_process, receiver._io_view_element$__$process, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _updateFile$0: [function(receiver) {
+      J.reload$0$x(receiver._io_view_element$__$process).whenComplete$1(new E.IOProcessViewElement__updateFile_closure(receiver));
+    }, "call$0", "get$_updateFile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateFile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._updateTimer = null;
+      }
+    },
+    static: {IOProcessViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IOProcessViewElement_methods.Element$created$0(receiver);
+        C.IOProcessViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier24: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IOProcessViewElement__updateFile_closure: {
+    "^": "Closure:69;this_0",
+    call$0: [function() {
+      var t1 = this.this_0;
+      if (t1._updateTimer != null)
+        t1._updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateFile$x(t1));
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_profile_element", "package:observatory/src/elements/isolate_profile.dart", , X, {
+  "^": "",
+  ProfileCodeTrieNodeTreeRow: {
+    "^": "TableTreeRow;profile>,root,node,tipKind<,tipParent<,tipExclusive<,tipTicks<,tipTime<,parent,depth,children,columns,_app$__$expander,_app$__$expanderStyle,_expanded,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$code: function(_) {
+      return J.get$code$x(this.node);
+    },
+    onShow$0: function(_) {
+      var t1, threshold, t2, t3, t4, t5, childNode, t6;
+      t1 = this.profile;
+      threshold = J.$index$asx(t1, "threshold");
+      t2 = this.children;
+      if (t2.length > 0)
+        return;
+      for (t3 = this.node, t4 = J.get$iterator$ax(J.get$children$x(t3)), t5 = this.root; t4.moveNext$0();) {
+        childNode = t4.get$current();
+        t6 = J.$div$n(childNode.get$count(), t3.get$count());
+        if (typeof threshold !== "number")
+          return H.iae(threshold);
+        if (!(t6 > threshold || J.$div$n(J.get$code$x(childNode).get$exclusiveTicks(), t5.count) > threshold))
+          continue;
+        t2.push(X.ProfileCodeTrieNodeTreeRow$(t1, t5, childNode, this));
+      }
+    },
+    onHide$0: function() {
+    },
+    hasChildren$0: function() {
+      return J.get$length$asx(J.get$children$x(this.node)) > 0;
+    },
+    ProfileCodeTrieNodeTreeRow$4: function(profile, root, node, $parent) {
+      var t1, t2;
+      t1 = this.node;
+      this.tipTicks = H.S(t1.get$count());
+      this.tipTime = G.Utils_formatTimePrecise(J.$div$n(J.$mul$ns(J.$index$asx(this.profile, "period"), t1.get$count()), 1000000));
+      t2 = J.getInterceptor$x(t1);
+      if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Tag)) {
+        this.tipKind = "Tag (category)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t1.get$count(), this.root.count);
+      } else {
+        if (J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Collected) || J.$eq(J.get$kind$x(t2.get$code(t1)), C.CodeKind_Reused))
+          this.tipKind = "Garbage Collected Code";
+        else
+          this.tipKind = H.S(J.get$kind$x(t2.get$code(t1))) + " (Function)";
+        if ($parent == null)
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), this.root.count);
+        else
+          this.tipParent = G.Utils_formatPercent(t1.get$count(), $parent.node.get$count());
+        this.tipExclusive = G.Utils_formatPercent(t2.get$code(t1).get$exclusiveTicks(), this.root.count);
+      }
+      t1 = this.columns;
+      t1.push(this.tipParent);
+      t1.push(this.tipExclusive);
+    },
+    static: {ProfileCodeTrieNodeTreeRow$: function(profile, root, node, $parent) {
+        var t1, t2;
+        t1 = H.setRuntimeTypeInfo([], [G.TableTreeRow]);
+        t2 = $parent != null ? $parent.depth + 1 : 0;
+        t1 = new X.ProfileCodeTrieNodeTreeRow(profile, root, node, "", "", "", "", "", $parent, t2, t1, [], "\u2192", "cursor: pointer;", false, null, null);
+        t1.TableTreeRow$1($parent);
+        t1.ProfileCodeTrieNodeTreeRow$4(profile, root, node, $parent);
+        return t1;
+      }}
+  },
+  IsolateProfileElement: {
+    "^": "ObservatoryElement_ChangeNotifier25;_isolate_profile_element$__$profile,_isolate_profile_element$__$hideTagsChecked,_isolate_profile_element$__$sampleCount,_isolate_profile_element$__$refreshTime,_isolate_profile_element$__$sampleRate,_isolate_profile_element$__$sampleDepth,_isolate_profile_element$__$displayCutoff,_isolate_profile_element$__$timeSpan,displayThreshold,_isolate_profile_element$__$tagSelector,_isolate_profile_element$_id,tree=,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$profile: function(receiver) {
+      return receiver._isolate_profile_element$__$profile;
+    },
+    set$profile: function(receiver, value) {
+      receiver._isolate_profile_element$__$profile = this.notifyPropertyChange$3(receiver, C.Symbol_profile, receiver._isolate_profile_element$__$profile, value);
+    },
+    get$hideTagsChecked: function(receiver) {
+      return receiver._isolate_profile_element$__$hideTagsChecked;
+    },
+    set$hideTagsChecked: function(receiver, value) {
+      receiver._isolate_profile_element$__$hideTagsChecked = this.notifyPropertyChange$3(receiver, C.Symbol_hideTagsChecked, receiver._isolate_profile_element$__$hideTagsChecked, value);
+    },
+    get$sampleCount: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleCount;
+    },
+    set$sampleCount: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, value);
+    },
+    get$refreshTime: function(receiver) {
+      return receiver._isolate_profile_element$__$refreshTime;
+    },
+    set$refreshTime: function(receiver, value) {
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, value);
+    },
+    get$sampleRate: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleRate;
+    },
+    set$sampleRate: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, value);
+    },
+    get$sampleDepth: function(receiver) {
+      return receiver._isolate_profile_element$__$sampleDepth;
+    },
+    set$sampleDepth: function(receiver, value) {
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, value);
+    },
+    get$displayCutoff: function(receiver) {
+      return receiver._isolate_profile_element$__$displayCutoff;
+    },
+    set$displayCutoff: function(receiver, value) {
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, value);
+    },
+    get$timeSpan: function(receiver) {
+      return receiver._isolate_profile_element$__$timeSpan;
+    },
+    set$timeSpan: function(receiver, value) {
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, value);
+    },
+    get$tagSelector: function(receiver) {
+      return receiver._isolate_profile_element$__$tagSelector;
+    },
+    set$tagSelector: function(receiver, value) {
+      receiver._isolate_profile_element$__$tagSelector = this.notifyPropertyChange$3(receiver, C.Symbol_tagSelector, receiver._isolate_profile_element$__$tagSelector, value);
+    },
+    profileChanged$1: [function(receiver, oldValue) {
+      var t1, totalSamples, now, period, t2;
+      t1 = receiver._isolate_profile_element$__$profile;
+      if (t1 == null)
+        return;
+      totalSamples = J.$index$asx(t1, "samples");
+      now = new P.DateTime(Date.now(), false);
+      now.DateTime$_now$0();
+      t1 = J.toString$0(totalSamples);
+      receiver._isolate_profile_element$__$sampleCount = this.notifyPropertyChange$3(receiver, C.Symbol_sampleCount, receiver._isolate_profile_element$__$sampleCount, t1);
+      t1 = now.toString$0(0);
+      receiver._isolate_profile_element$__$refreshTime = this.notifyPropertyChange$3(receiver, C.Symbol_refreshTime, receiver._isolate_profile_element$__$refreshTime, t1);
+      t1 = J.toString$0(J.$index$asx(receiver._isolate_profile_element$__$profile, "depth"));
+      receiver._isolate_profile_element$__$sampleDepth = this.notifyPropertyChange$3(receiver, C.Symbol_sampleDepth, receiver._isolate_profile_element$__$sampleDepth, t1);
+      period = J.$index$asx(receiver._isolate_profile_element$__$profile, "period");
+      if (typeof period !== "number")
+        return H.iae(period);
+      t1 = C.JSNumber_methods.toStringAsFixed$1(1000000 / period, 0);
+      receiver._isolate_profile_element$__$sampleRate = this.notifyPropertyChange$3(receiver, C.Symbol_sampleRate, receiver._isolate_profile_element$__$sampleRate, t1);
+      t1 = G.Utils_formatTime(J.$index$asx(receiver._isolate_profile_element$__$profile, "timeSpan"));
+      receiver._isolate_profile_element$__$timeSpan = this.notifyPropertyChange$3(receiver, C.Symbol_timeSpan, receiver._isolate_profile_element$__$timeSpan, t1);
+      t1 = receiver.displayThreshold;
+      t2 = C.JSDouble_methods.toString$0(t1 * 100) + "%";
+      receiver._isolate_profile_element$__$displayCutoff = this.notifyPropertyChange$3(receiver, C.Symbol_displayCutoff, receiver._isolate_profile_element$__$displayCutoff, t2);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).processProfile$1(receiver._isolate_profile_element$__$profile);
+      J.$indexSet$ax(receiver._isolate_profile_element$__$profile, "threshold", t1);
+      this._isolate_profile_element$_update$0(receiver);
+    }, "call$1", "get$profileChanged", 2, 0, 20, 57],
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = R._toObservableDeep([]);
+      receiver.tree = new G.TableTree(t1, null, null);
+      this._isolate_profile_element$_update$0(receiver);
+    },
+    tagSelectorChanged$1: [function(receiver, oldValue) {
+      this.refresh$1(receiver, null);
+    }, "call$1", "get$tagSelectorChanged", 2, 0, 20, 57],
+    refresh$1: [function(receiver, done) {
+      var request = "profile?tags=" + H.S(receiver._isolate_profile_element$__$tagSelector);
+      J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$1(request).then$1(new X.IsolateProfileElement_refresh_closure(receiver)).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    _isolate_profile_element$_update$0: function(receiver) {
+      if (receiver._isolate_profile_element$__$profile == null)
+        return;
+      this._buildStackTree$0(receiver);
+    },
+    _buildStackTree$0: function(receiver) {
+      var root, e, stackTrace, exception, t1;
+      root = J.get$isolate$x(receiver._isolate_profile_element$__$profile).get$profileTrieRoot();
+      if (root == null)
+        return;
+      try {
+        receiver.tree.initialize$1(X.ProfileCodeTrieNodeTreeRow$(receiver._isolate_profile_element$__$profile, root, root, null));
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        stackTrace = new H._StackTrace(exception, null);
+        N.Logger_Logger("").warning$3("_buildStackTree", e, stackTrace);
+      }
+
+      if (J.$eq(J.get$length$asx(receiver.tree.rows), 1))
+        receiver.tree.toggle$1(0);
+      this.notifyPropertyChange$3(receiver, C.Symbol_tree, null, receiver.tree);
+    },
+    padding$1: [function(receiver, row) {
+      return "padding-left: " + row.get$depth() * 16 + "px;";
+    }, "call$1", "get$padding", 2, 0, 90, 91],
+    coloring$1: [function(receiver, row) {
+      return C.List_mBx[C.JSInt_methods.$mod(row.get$depth() - 1, 9)];
+    }, "call$1", "get$coloring", 2, 0, 90, 91],
+    toggleExpanded$3: [function(receiver, e, detail, target) {
+      var row, e0, stackTrace, t1, t2, exception;
+      t1 = J.getInterceptor$x(e);
+      if (!J.$eq(J.get$id$x(t1.get$target(e)), "expand") && !J.$eq(t1.get$target(e), target))
+        return;
+      row = J.get$parent$x(target);
+      if (!!J.getInterceptor(row).$isTableRowElement)
+        try {
+          t1 = receiver.tree;
+          t2 = J.get$rowIndex$x(row);
+          if (typeof t2 !== "number")
+            return t2.$sub();
+          t1.toggle$1(t2 - 1);
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e0 = t1;
+          stackTrace = new H._StackTrace(exception, null);
+          N.Logger_Logger("").warning$3("toggleExpanded", e0, stackTrace);
+        }
+
+    }, "call$3", "get$toggleExpanded", 6, 0, 92, 1, 93, 94],
+    static: {"^": "IsolateProfileElement_MICROSECONDS_PER_SECOND", IsolateProfileElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._isolate_profile_element$__$sampleCount = "";
+        receiver._isolate_profile_element$__$refreshTime = "";
+        receiver._isolate_profile_element$__$sampleRate = "";
+        receiver._isolate_profile_element$__$sampleDepth = "";
+        receiver._isolate_profile_element$__$displayCutoff = "";
+        receiver._isolate_profile_element$__$timeSpan = "";
+        receiver.displayThreshold = 0.0002;
+        receiver._isolate_profile_element$__$tagSelector = "uv";
+        receiver._isolate_profile_element$_id = "#tableTree";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateProfileElement_methods.Element$created$0(receiver);
+        C.IsolateProfileElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier25: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateProfileElement_refresh_closure: {
+    "^": "Closure:101;this_0",
+    call$1: [function(m) {
+      var t1 = this.this_0;
+      t1._isolate_profile_element$__$profile = J.notifyPropertyChange$3$x(t1, C.Symbol_profile, t1._isolate_profile_element$__$profile, m);
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  }
+}],
+["isolate_ref_element", "package:observatory/src/elements/isolate_ref.dart", , N, {
+  "^": "",
+  IsolateRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {IsolateRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRefElement_methods.Element$created$0(receiver);
+        C.IsolateRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["isolate_summary_element", "package:observatory/src/elements/isolate_summary.dart", , D, {
+  "^": "",
+  IsolateSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier26;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier26: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement: {
+    "^": "ObservatoryElement_ChangeNotifier27;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/pause").then$1(new D.IsolateRunStateElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_summary_element$__$isolate.get$1("debug/resume").then$1(new D.IsolateRunStateElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateRunStateElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateRunStateElement_methods.Element$created$0(receiver);
+        C.IsolateRunStateElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier27: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateRunStateElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateRunStateElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_summary_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateLocationElement: {
+    "^": "ObservatoryElement_ChangeNotifier28;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateLocationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateLocationElement_methods.Element$created$0(receiver);
+        C.IsolateLocationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier28: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateSharedSummaryElement: {
+    "^": "ObservatoryElement_ChangeNotifier29;_isolate_summary_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_summary_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_summary_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_summary_element$__$isolate, value);
+    },
+    static: {IsolateSharedSummaryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateSharedSummaryElement_methods.Element$created$0(receiver);
+        C.IsolateSharedSummaryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier29: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  CounterChart: {
+    "^": "Object;_table,_chart",
+    update$1: function(counters) {
+      var t1, t2, t3, key, t4, t5;
+      t1 = this._table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Name"]);
+        t1.callMethod$2("addColumn", ["number", "Value"]);
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      for (t2 = J.get$iterator$ax(counters.get$keys()), t3 = J.getInterceptor$asx(counters); t2.moveNext$0();) {
+        key = t2.get$current();
+        t4 = J.split$1$s(t3.$index(counters, key), "%");
+        if (0 >= t4.length)
+          return H.ioore(t4, 0);
+        t5 = [];
+        C.JSArray_methods.addAll$1(t5, C.JSArray_methods.map$1([key, H.Primitives_parseDouble(t4[0], null)], P._convertToJS$closure()));
+        t5 = new P.JsArray(t5);
+        t5.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t5]);
+      }
+    }
+  },
+  IsolateCounterChartElement: {
+    "^": "ObservatoryElement_ChangeNotifier30;_isolate_summary_element$__$counters,chart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$counters: function(receiver) {
+      return receiver._isolate_summary_element$__$counters;
+    },
+    set$counters: function(receiver, value) {
+      receiver._isolate_summary_element$__$counters = this.notifyPropertyChange$3(receiver, C.Symbol_counters, receiver._isolate_summary_element$__$counters, value);
+    },
+    countersChanged$1: [function(receiver, oldValue) {
+      var t1, element, t2;
+      if (receiver._isolate_summary_element$__$counters == null)
+        return;
+      if ($.get$GoogleChart__completer().future._state !== 0 && receiver.chart == null)
+        receiver.chart = new D.CounterChart(new G.DataTable(P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null)), null);
+      t1 = receiver.chart;
+      if (t1 == null)
+        return;
+      t1.update$1(receiver._isolate_summary_element$__$counters);
+      element = (receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#counterPieChart");
+      if (element != null) {
+        t1 = receiver.chart;
+        t2 = t1._chart;
+        if (t2 == null) {
+          t2 = new G.Chart(null, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null));
+          t2._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "PieChart"), [element]);
+          t1._chart = t2;
+        }
+        t2.draw$1(t1._table);
+      }
+    }, "call$1", "get$countersChanged", 2, 0, 20, 57],
+    static: {IsolateCounterChartElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateCounterChartElement_methods.Element$created$0(receiver);
+        C.IsolateCounterChartElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier30: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["isolate_view_element", "package:observatory/src/elements/isolate_view.dart", , L, {
+  "^": "",
+  TagProfileChart: {
+    "^": "Object;_isolate_view_element$_table,_isolate_view_element$_chart",
+    update$1: function(tagProfile) {
+      var t1, t2, tagName, idleIndex, t, i, snapshotTime, row, sum, j;
+      t1 = this._isolate_view_element$_table._app$_table;
+      if (J.$eq(t1.callMethod$1("getNumberOfColumns"), 0)) {
+        t1.callMethod$2("addColumn", ["string", "Time"]);
+        for (t2 = J.get$iterator$ax(tagProfile.get$names()); t2.moveNext$0();) {
+          tagName = t2._current;
+          if (J.$eq(tagName, "Idle"))
+            continue;
+          t1.callMethod$2("addColumn", ["number", tagName]);
+        }
+      }
+      t1.callMethod$2("removeRows", [0, t1.callMethod$1("getNumberOfRows")]);
+      idleIndex = J.indexOf$1$asx(tagProfile.get$names(), "Idle");
+      t = tagProfile.get$updatedAtSeconds();
+      for (i = 0; i < tagProfile.get$snapshots().length; ++i) {
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        snapshotTime = t2[i].seconds;
+        row = [];
+        if (snapshotTime > 0) {
+          if (typeof t !== "number")
+            return H.iae(t);
+          row.push("t " + C.JSNumber_methods.toStringAsFixed$1(snapshotTime - t, 2));
+        } else
+          row.push("");
+        t2 = tagProfile.get$snapshots();
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        sum = t2[i]._sum;
+        if (sum === 0) {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              row.push(0);
+            }
+            ++j;
+          }
+        } else {
+          j = 0;
+          while (true) {
+            t2 = tagProfile.get$snapshots();
+            if (i >= t2.length)
+              return H.ioore(t2, i);
+            if (!(j < t2[i].counters.length))
+              break;
+            c$1: {
+              if (j === idleIndex)
+                break c$1;
+              t2 = tagProfile.get$snapshots();
+              if (i >= t2.length)
+                return H.ioore(t2, i);
+              t2 = t2[i].counters;
+              if (j >= t2.length)
+                return H.ioore(t2, j);
+              row.push(C.JSNumber_methods.toInt$0(J.$div$n(t2[j], sum) * 100));
+            }
+            ++j;
+          }
+        }
+        t2 = [];
+        C.JSArray_methods.addAll$1(t2, C.JSArray_methods.map$1(row, P._convertToJS$closure()));
+        t2 = new P.JsArray(t2);
+        t2.$builtinTypeInfo = [null];
+        t1.callMethod$2("addRow", [t2]);
+      }
+    }
+  },
+  IsolateViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier31;_isolate_view_element$__$isolate,_isolate_view_element$_updateTimer,tagProfileChart,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$isolate: function(receiver) {
+      return receiver._isolate_view_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._isolate_view_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._isolate_view_element$__$isolate, value);
+    },
+    eval$1: [function(receiver, text) {
+      var t1 = receiver._isolate_view_element$__$isolate;
+      return t1.get$1(J.$add$ns(J.get$id$x(t1.get$rootLib()), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    _updateTagProfile$0: [function(receiver) {
+      receiver._isolate_view_element$__$isolate.updateTagProfile$0().then$1(new L.IsolateViewElement__updateTagProfile_closure(receiver));
+    }, "call$0", "get$_updateTagProfile", 0, 0, 18],
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      receiver._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), this.get$_updateTagProfile(receiver));
+    },
+    detached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.detached$0.call(this, receiver);
+      t1 = receiver._isolate_view_element$_updateTimer;
+      if (t1 != null) {
+        t1.cancel$0();
+        receiver._isolate_view_element$_updateTimer = null;
+      }
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._isolate_view_element$__$isolate).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    pause$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("debug/pause").then$1(new L.IsolateViewElement_pause_closure(receiver));
+    }, "call$1", "get$pause", 2, 0, 146, 14],
+    resume$1: [function(receiver, _) {
+      return receiver._isolate_view_element$__$isolate.get$1("resume").then$1(new L.IsolateViewElement_resume_closure(receiver));
+    }, "call$1", "get$resume", 2, 0, 146, 14],
+    static: {IsolateViewElement$created: function(receiver) {
+        var t1, t2, t3;
+        t1 = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "DataTable"), null);
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t3 = P.String;
+        t3 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, null), null, null), [t3, null]);
+        receiver.tagProfileChart = new L.TagProfileChart(new G.DataTable(t1), null);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t2;
+        receiver.polymer$Polymer$$ = t3;
+        C.IsolateViewElement_methods.Element$created$0(receiver);
+        C.IsolateViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier31: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateViewElement__updateTagProfile_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(tagProfile) {
+      var t1, t2, element, t3, t4;
+      t1 = this.this_0;
+      t2 = t1.tagProfileChart;
+      t2.update$1(tagProfile);
+      element = (t1.shadowRoot || t1.webkitShadowRoot).querySelector("#tagProfileChart");
+      if (element != null) {
+        if (t2._isolate_view_element$_chart == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t4 = new G.Chart(null, t3);
+          t4._app$_chart = P.JsObject_JsObject(J.$index$asx($.GoogleChart__api, "SteppedAreaChart"), [element]);
+          t2._isolate_view_element$_chart = t4;
+          t3.$indexSet(0, "isStacked", true);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "connectSteps", false);
+          t2._isolate_view_element$_chart.options.$indexSet(0, "vAxis", P.LinkedHashMap_LinkedHashMap$_literal(["minValue", 0, "maxValue", 100], null, null));
+        }
+        t2._isolate_view_element$_chart.draw$1(t2._isolate_view_element$_table);
+      }
+      if (t1._isolate_view_element$_updateTimer != null)
+        t1._isolate_view_element$_updateTimer = P.Timer_Timer(P.Duration$(0, 0, 0, 0, 0, 1), J.get$_updateTagProfile$x(t1));
+    }, "call$1", null, 2, 0, null, 147, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_pause_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  IsolateViewElement_resume_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(result) {
+      return J.reload$0$x(this.this_0._isolate_view_element$__$isolate);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  }
+}],
+["json_view_element", "package:observatory/src/elements/json_view.dart", , Z, {
+  "^": "",
+  JsonPrettyPrinter: {
+    "^": "Object;_json_view_element$_buffer,_seen",
+    _printMap$2: function(map, depth) {
+      var t1, t2, t3, t4, t5, k, v, t6;
+      t1 = this._seen;
+      if (t1.contains$1(0, map))
+        return;
+      t1.add$1(0, map);
+      for (t2 = J.get$iterator$ax(map.get$keys()), t3 = this._json_view_element$_buffer, t4 = J.getInterceptor$asx(map), t5 = depth + 1; t2.moveNext$0();) {
+        k = t2.get$current();
+        v = t4.$index(map, k);
+        t6 = J.getInterceptor(v);
+        if (!!t6.$isMap) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": {\n";
+          t3._contents += t6;
+          this._printMap$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "}\n";
+        } else if (!!t6.$isList) {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": [\n";
+          t3._contents += t6;
+          this._printList$2(v, t5);
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "]\n";
+        } else {
+          t6 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t6;
+          t6 = "\"" + H.S(k) + "\": " + H.S(v);
+          t6 = t3._contents += t6;
+          t3._contents = t6 + "\n";
+        }
+      }
+      t1.remove$1(0, map);
+    },
+    _printList$2: function(list, depth) {
+      var t1, t2, t3, t4, v, t5;
+      t1 = this._seen;
+      if (t1.contains$1(0, list))
+        return;
+      t1.add$1(0, list);
+      for (t2 = J.get$iterator$ax(list), t3 = this._json_view_element$_buffer, t4 = depth + 1; t2.moveNext$0();) {
+        v = t2.get$current();
+        t5 = J.getInterceptor(v);
+        if (!!t5.$isMap) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "{\n";
+          this._printMap$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "}\n";
+        } else if (!!t5.$isList) {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "[\n";
+          this._printList$2(v, t4);
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t5 = t3._contents += t5;
+          t3._contents = t5 + "]\n";
+        } else {
+          t5 = C.JSString_methods.$mul("  ", depth);
+          t3._contents += t5;
+          t5 = t3._contents += typeof v === "string" ? v : H.S(v);
+          t3._contents = t5 + "\n";
+        }
+      }
+      t1.remove$1(0, list);
+    }
+  },
+  JsonViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier32;_json_view_element$__$map,_json_view_element$__$mapAsString,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$map: function(receiver) {
+      return receiver._json_view_element$__$map;
+    },
+    map$1: function($receiver, arg0) {
+      return this.get$map($receiver).call$1(arg0);
+    },
+    set$map: function(receiver, value) {
+      receiver._json_view_element$__$map = this.notifyPropertyChange$3(receiver, C.Symbol_map, receiver._json_view_element$__$map, value);
+    },
+    get$mapAsString: function(receiver) {
+      return receiver._json_view_element$__$mapAsString;
+    },
+    set$mapAsString: function(receiver, value) {
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, value);
+    },
+    mapChanged$1: [function(receiver, oldValue) {
+      var t1, t2, t3;
+      t1 = P.StringBuffer$("");
+      t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      t3 = receiver._json_view_element$__$map;
+      t1._contents = "";
+      t1.write$1("{\n");
+      new Z.JsonPrettyPrinter(t1, t2)._printMap$2(t3, 0);
+      t1.write$1("}\n");
+      t1 = t1._contents;
+      receiver._json_view_element$__$mapAsString = this.notifyPropertyChange$3(receiver, C.Symbol_mapAsString, receiver._json_view_element$__$mapAsString, t1);
+    }, "call$1", "get$mapChanged", 2, 0, 20, 57],
+    static: {JsonViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.JsonViewElement_methods.Element$created$0(receiver);
+        C.JsonViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier32: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["library_ref_element", "package:observatory/src/elements/library_ref.dart", , R, {
+  "^": "",
+  LibraryRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {LibraryRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryRefElement_methods.Element$created$0(receiver);
+        C.LibraryRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["library_view_element", "package:observatory/src/elements/library_view.dart", , M, {
+  "^": "",
+  LibraryViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier33;_library_view_element$__$library,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._library_view_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._library_view_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._library_view_element$__$library, value);
+    },
+    eval$1: [function(receiver, text) {
+      return J.get$isolate$x(receiver._library_view_element$__$library).get$1(J.$add$ns(J.get$id$x(receiver._library_view_element$__$library), "/eval?expr=" + P.Uri__uriEncode(C.List_KIf, text, C.Utf8Codec_false, false)));
+    }, "call$1", "get$eval", 2, 0, 96, 97],
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._library_view_element$__$library).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {LibraryViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryViewElement_methods.Element$created$0(receiver);
+        C.LibraryViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier33: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["logging", "package:logging/logging.dart", , N, {
+  "^": "",
+  Logger: {
+    "^": "Object;name>,parent>,_level,_children>,children>,_controller",
+    get$fullName: function() {
+      var t1, t2, t3;
+      t1 = this.parent;
+      t2 = t1 == null || J.$eq(J.get$name$x(t1), "");
+      t3 = this.name;
+      return t2 ? t3 : t1.get$fullName() + "." + t3;
+    },
+    get$level: function() {
+      if ($.hierarchicalLoggingEnabled) {
+        var t1 = this._level;
+        if (t1 != null)
+          return t1;
+        t1 = this.parent;
+        if (t1 != null)
+          return t1.get$level();
+      }
+      return $._rootLevel;
+    },
+    set$level: function(value) {
+      if ($.hierarchicalLoggingEnabled && this.parent != null)
+        this._level = value;
+      else {
+        if (this.parent != null)
+          throw H.wrapException(P.UnsupportedError$("Please set \"hierarchicalLoggingEnabled\" to true if you want to change the level on a non-root logger."));
+        $._rootLevel = value;
+      }
+    },
+    get$onRecord: function() {
+      return this._getStream$0();
+    },
+    isLoggable$1: function(value) {
+      return value.value >= this.get$level().value;
+    },
+    log$4: function(logLevel, message, error, stackTrace) {
+      var t1, t2, t3, record, target;
+      if (logLevel.value >= this.get$level().value) {
+        t1 = this.get$fullName();
+        t2 = new P.DateTime(Date.now(), false);
+        t2.DateTime$_now$0();
+        t3 = $.LogRecord__nextNumber;
+        $.LogRecord__nextNumber = t3 + 1;
+        record = new N.LogRecord(logLevel, message, t1, t2, t3, error, stackTrace);
+        if ($.hierarchicalLoggingEnabled)
+          for (target = this; target != null;) {
+            target._publish$1(record);
+            target = J.get$parent$x(target);
+          }
+        else
+          N.Logger_Logger("")._publish$1(record);
+      }
+    },
+    finer$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINER_400, message, error, stackTrace);
+    },
+    finer$1: function(message) {
+      return this.finer$3(message, null, null);
+    },
+    fine$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_FINE_500, message, error, stackTrace);
+    },
+    fine$1: function(message) {
+      return this.fine$3(message, null, null);
+    },
+    info$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_INFO_800, message, error, stackTrace);
+    },
+    info$1: function(message) {
+      return this.info$3(message, null, null);
+    },
+    warning$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_WARNING_900, message, error, stackTrace);
+    },
+    warning$1: function(message) {
+      return this.warning$3(message, null, null);
+    },
+    severe$3: function(message, error, stackTrace) {
+      return this.log$4(C.Level_SEVERE_1000, message, error, stackTrace);
+    },
+    severe$1: function(message) {
+      return this.severe$3(message, null, null);
+    },
+    _getStream$0: function() {
+      if ($.hierarchicalLoggingEnabled || this.parent == null) {
+        var t1 = this._controller;
+        if (t1 == null) {
+          t1 = P.StreamController_StreamController$broadcast(null, null, true, N.LogRecord);
+          this._controller = t1;
+        }
+        t1.toString;
+        return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+      } else
+        return N.Logger_Logger("")._getStream$0();
+    },
+    _publish$1: function(record) {
+      var t1 = this._controller;
+      if (t1 != null) {
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(record);
+      }
+    },
+    Logger$_internal$3: function($name, $parent, children) {
+      var t1 = this.parent;
+      if (t1 != null)
+        J.get$_children$x(t1).$indexSet(0, this.name, this);
+    },
+    $isLogger: true,
+    static: {"^": "Logger__loggers", Logger_Logger: function($name) {
+        return $.get$Logger__loggers().putIfAbsent$2($name, new N.Logger_Logger_closure($name));
+      }}
+  },
+  Logger_Logger_closure: {
+    "^": "Closure:69;name_0",
+    call$0: function() {
+      var thisName, dot, $parent, t1, t2;
+      thisName = this.name_0;
+      if (C.JSString_methods.startsWith$1(thisName, "."))
+        H.throwExpression(P.ArgumentError$("name shouldn't start with a '.'"));
+      dot = C.JSString_methods.lastIndexOf$1(thisName, ".");
+      if (dot === -1)
+        $parent = thisName !== "" ? N.Logger_Logger("") : null;
+      else {
+        $parent = N.Logger_Logger(C.JSString_methods.substring$2(thisName, 0, dot));
+        thisName = C.JSString_methods.substring$1(thisName, dot + 1);
+      }
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, N.Logger);
+      t2 = new N.Logger(thisName, $parent, null, t1, H.setRuntimeTypeInfo(new Q.UnmodifiableMapView(t1), [null, null]), null);
+      t2.Logger$_internal$3(thisName, $parent, t1);
+      return t2;
+    },
+    $isFunction: true
+  },
+  Level: {
+    "^": "Object;name>,value>",
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isLevel && this.value === other.value;
+    },
+    $lt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value < t1;
+    },
+    $le: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value <= t1;
+    },
+    $gt: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value > t1;
+    },
+    $ge: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value >= t1;
+    },
+    compareTo$1: function(_, other) {
+      var t1 = J.get$value$x(other);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return this.value - t1;
+    },
+    get$hashCode: function(_) {
+      return this.value;
+    },
+    toString$0: function(_) {
+      return this.name;
+    },
+    $isLevel: true,
+    static: {"^": "Level_ALL,Level_OFF,Level_FINEST,Level_FINER,Level_FINE,Level_CONFIG,Level_INFO,Level_WARNING,Level_SEVERE,Level_SHOUT,Level_LEVELS"}
+  },
+  LogRecord: {
+    "^": "Object;level<,message>,loggerName,time<,sequenceNumber,error>,stackTrace<",
+    toString$0: function(_) {
+      return "[" + this.level.name + "] " + this.loggerName + ": " + this.message;
+    },
+    $isLogRecord: true,
+    static: {"^": "LogRecord__nextNumber"}
+  }
+}],
+["", "main.dart", , F, {
+  "^": "",
+  main: function() {
+    var t1, t2;
+    N.Logger_Logger("").set$level(C.Level_INFO_800);
+    N.Logger_Logger("").get$onRecord().listen$1(new F.main_closure414());
+    N.Logger_Logger("").info$1("Starting Observatory");
+    N.Logger_Logger("").info$1("Loading Google Charts API");
+    t1 = J.$index$asx($.get$context(), "google");
+    t2 = $.get$GoogleChart__completer();
+    t1.callMethod$2("load", ["visualization", "1", P.JsObject_JsObject$jsify(P.LinkedHashMap_LinkedHashMap$_literal(["packages", ["corechart", "table"], "callback", P.JsFunction_JsFunction$withThis(t2.get$complete(t2))], null, null))]);
+    $.get$GoogleChart__completer().future.then$1(G.GoogleChart__initOnceOnComplete$closure()).then$1(new F.main_closure415());
+  },
+  main_closure414: {
+    "^": "Closure:149;",
+    call$1: [function(rec) {
+      var t1;
+      if (J.$eq(rec.get$level(), C.Level_WARNING_900)) {
+        t1 = J.getInterceptor$x(rec);
+        if (J.startsWith$1$s(t1.get$message(rec), "Error evaluating expression"))
+          t1 = J.contains$1$asx(t1.get$message(rec), "Can't assign to null: ") === true || J.contains$1$asx(t1.get$message(rec), "Expression is not assignable: ") === true;
+        else
+          t1 = false;
+      } else
+        t1 = false;
+      if (t1)
+        return;
+      P.print(rec.get$level().name + ": " + rec.get$time().toString$0(0) + ": " + H.S(J.get$message$x(rec)));
+    }, "call$1", null, 2, 0, null, 148, "call"],
+    $isFunction: true
+  },
+  main_closure415: {
+    "^": "Closure:13;",
+    call$1: [function(_) {
+      N.Logger_Logger("").info$1("Initializing Polymer");
+      A.initPolymer();
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["nav_bar_element", "package:observatory/src/elements/nav_bar.dart", , A, {
+  "^": "",
+  NavBarElement: {
+    "^": "ObservatoryElement_ChangeNotifier34;_nav_bar_element$__$pad,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pad: function(receiver) {
+      return receiver._nav_bar_element$__$pad;
+    },
+    set$pad: function(receiver, value) {
+      receiver._nav_bar_element$__$pad = this.notifyPropertyChange$3(receiver, C.Symbol_pad, receiver._nav_bar_element$__$pad, value);
+    },
+    static: {NavBarElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$pad = true;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavBarElement_methods.Element$created$0(receiver);
+        C.NavBarElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier34: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier35;_nav_bar_element$__$link,_nav_bar_element$__$anchor,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {NavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuElement_methods.Element$created$0(receiver);
+        C.NavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier35: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavMenuItemElement: {
+    "^": "ObservatoryElement_ChangeNotifier36;_nav_bar_element$__$link,_nav_bar_element$__$anchor,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$link: function(receiver) {
+      return receiver._nav_bar_element$__$link;
+    },
+    set$link: function(receiver, value) {
+      receiver._nav_bar_element$__$link = this.notifyPropertyChange$3(receiver, C.Symbol_link, receiver._nav_bar_element$__$link, value);
+    },
+    get$anchor: function(receiver) {
+      return receiver._nav_bar_element$__$anchor;
+    },
+    set$anchor: function(receiver, value) {
+      receiver._nav_bar_element$__$anchor = this.notifyPropertyChange$3(receiver, C.Symbol_anchor, receiver._nav_bar_element$__$anchor, value);
+    },
+    static: {NavMenuItemElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$link = "#";
+        receiver._nav_bar_element$__$anchor = "---";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavMenuItemElement_methods.Element$created$0(receiver);
+        C.NavMenuItemElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier36: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavRefreshElement: {
+    "^": "ObservatoryElement_ChangeNotifier37;_nav_bar_element$__$callback,_nav_bar_element$__$active,_nav_bar_element$__$label,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$callback: function(receiver) {
+      return receiver._nav_bar_element$__$callback;
+    },
+    callback$0: function($receiver) {
+      return this.get$callback($receiver).call$0();
+    },
+    callback$1: function($receiver, arg0) {
+      return this.get$callback($receiver).call$1(arg0);
+    },
+    set$callback: function(receiver, value) {
+      receiver._nav_bar_element$__$callback = this.notifyPropertyChange$3(receiver, C.Symbol_callback, receiver._nav_bar_element$__$callback, value);
+    },
+    get$active: function(receiver) {
+      return receiver._nav_bar_element$__$active;
+    },
+    set$active: function(receiver, value) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, value);
+    },
+    get$label: function(receiver) {
+      return receiver._nav_bar_element$__$label;
+    },
+    set$label: function(receiver, value) {
+      receiver._nav_bar_element$__$label = this.notifyPropertyChange$3(receiver, C.Symbol_label, receiver._nav_bar_element$__$label, value);
+    },
+    buttonClick$3: [function(receiver, e, detail, target) {
+      var t1 = receiver._nav_bar_element$__$active;
+      if (t1 === true)
+        return;
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, t1, true);
+      if (receiver._nav_bar_element$__$callback != null)
+        this.callback$1(receiver, this.get$refreshDone(receiver));
+    }, "call$3", "get$buttonClick", 6, 0, 102, 1, 93, 94],
+    refreshDone$0: [function(receiver) {
+      receiver._nav_bar_element$__$active = this.notifyPropertyChange$3(receiver, C.Symbol_active, receiver._nav_bar_element$__$active, false);
+    }, "call$0", "get$refreshDone", 0, 0, 18],
+    static: {NavRefreshElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$active = false;
+        receiver._nav_bar_element$__$label = "Refresh";
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavRefreshElement_methods.Element$created$0(receiver);
+        C.NavRefreshElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier37: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  NavControlElement: {
+    "^": "ObservatoryElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {NavControlElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.NavControlElement_methods.Element$created$0(receiver);
+        C.NavControlElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TopNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier38;_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {TopNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.TopNavMenuElement_methods.Element$created$0(receiver);
+        C.TopNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier38: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  IsolateNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier39;_nav_bar_element$__$last,_nav_bar_element$__$isolate,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    get$isolate: function(receiver) {
+      return receiver._nav_bar_element$__$isolate;
+    },
+    set$isolate: function(receiver, value) {
+      receiver._nav_bar_element$__$isolate = this.notifyPropertyChange$3(receiver, C.Symbol_isolate, receiver._nav_bar_element$__$isolate, value);
+    },
+    isolateChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_hashLinkWorkaround, 0, 1);
+    }, "call$1", "get$isolateChanged", 2, 0, 20, 57],
+    get$hashLinkWorkaround: function(receiver) {
+      var t1 = receiver._nav_bar_element$__$isolate;
+      if (t1 != null)
+        return J.get$link$x(t1);
+      else
+        return "";
+    },
+    set$hashLinkWorkaround: function(receiver, x) {
+    },
+    static: {IsolateNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.IsolateNavMenuElement_methods.Element$created$0(receiver);
+        C.IsolateNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier39: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  LibraryNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier40;_nav_bar_element$__$library,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$library: function(receiver) {
+      return receiver._nav_bar_element$__$library;
+    },
+    set$library: function(receiver, value) {
+      receiver._nav_bar_element$__$library = this.notifyPropertyChange$3(receiver, C.Symbol_library, receiver._nav_bar_element$__$library, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {LibraryNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.LibraryNavMenuElement_methods.Element$created$0(receiver);
+        C.LibraryNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier40: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ClassNavMenuElement: {
+    "^": "ObservatoryElement_ChangeNotifier41;_nav_bar_element$__$cls,_nav_bar_element$__$last,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$cls: function(receiver) {
+      return receiver._nav_bar_element$__$cls;
+    },
+    set$cls: function(receiver, value) {
+      receiver._nav_bar_element$__$cls = this.notifyPropertyChange$3(receiver, C.Symbol_cls, receiver._nav_bar_element$__$cls, value);
+    },
+    get$last: function(receiver) {
+      return receiver._nav_bar_element$__$last;
+    },
+    set$last: function(receiver, value) {
+      receiver._nav_bar_element$__$last = this.notifyPropertyChange$3(receiver, C.Symbol_last, receiver._nav_bar_element$__$last, value);
+    },
+    static: {ClassNavMenuElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._nav_bar_element$__$last = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ClassNavMenuElement_methods.Element$created$0(receiver);
+        C.ClassNavMenuElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier41: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_application_element", "package:observatory/src/elements/observatory_application.dart", , V, {
+  "^": "",
+  ObservatoryApplicationElement: {
+    "^": "ObservatoryElement_ChangeNotifier42;_observatory_application_element$__$devtools,app,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$devtools: function(receiver) {
+      return receiver._observatory_application_element$__$devtools;
+    },
+    set$devtools: function(receiver, value) {
+      receiver._observatory_application_element$__$devtools = this.notifyPropertyChange$3(receiver, C.Symbol_devtools, receiver._observatory_application_element$__$devtools, value);
+    },
+    attached$0: function(receiver) {
+      var t1, t2;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      if (receiver._observatory_application_element$__$devtools === true) {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.DartiumVM(P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Completer), 0, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.DartiumVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$devtools$1(receiver);
+        receiver.app = t2;
+      } else {
+        t1 = H.setRuntimeTypeInfo([], [G.Pane]);
+        t2 = new U.HttpVM(null, "unknown", "unknown", 0, false, false, "", null, P.StreamController_StreamController$broadcast(null, null, false, null), P.StreamController_StreamController$broadcast(null, null, false, null), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject), P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate), null, null, null, null, null, false, null, null, null, null, null);
+        t2.VM$0();
+        t2.HttpVM$0();
+        t2 = new G.ObservatoryApplication(t1, null, null, new G.HashLocationManager("/vm", null, null, null, null, null), t2, null, receiver, null, null, null);
+        t2.ObservatoryApplication$1(receiver);
+        receiver.app = t2;
+      }
+    },
+    static: {ObservatoryApplicationElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._observatory_application_element$__$devtools = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryApplicationElement_methods.Element$created$0(receiver);
+        C.ObservatoryApplicationElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier42: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["observatory_element", "package:observatory/src/elements/observatory_element.dart", , Z, {
+  "^": "",
+  ObservatoryElement: {
+    "^": "PolymerElement;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    attached$0: function(receiver) {
+      A.Polymer.prototype.attached$0.call(this, receiver);
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      A.Polymer.prototype.attributeChanged$3.call(this, receiver, $name, oldValue, newValue);
+    },
+    detached$0: function(receiver) {
+      A.Polymer.prototype.detached$0.call(this, receiver);
+    },
+    ready$0: function(receiver) {
+      A.Polymer.prototype.ready$0.call(this, receiver);
+    },
+    goto$3: [function(receiver, $event, detail, target) {
+      $.location.onGoto$3($event, detail, target);
+    }, "call$3", "get$$goto", 6, 0, 150, 2, 93, 94],
+    gotoLink$1: [function(receiver, url) {
+      $.location.toString;
+      return "#" + H.S(url);
+    }, "call$1", "get$gotoLink", 2, 0, 151, 152],
+    formatTime$1: [function(receiver, time) {
+      return G.Utils_formatTime(time);
+    }, "call$1", "get$formatTime", 2, 0, 153, 154],
+    formatSize$1: [function(receiver, bytes) {
+      return G.Utils_formatSize(bytes);
+    }, "call$1", "get$formatSize", 2, 0, 15, 16],
+    isNull$1: [function(receiver, type) {
+      return J.$eq(type, "Null");
+    }, "call$1", "get$isNull", 2, 0, 155, 156],
+    isError$1: [function(receiver, type) {
+      return J.$eq(type, "Error");
+    }, "call$1", "get$isError", 2, 0, 155, 156],
+    isInt$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "Smi") || t1.$eq(type, "Mint") || t1.$eq(type, "Bigint");
+    }, "call$1", "get$isInt", 2, 0, 155, 156],
+    isBool$1: [function(receiver, type) {
+      return J.$eq(type, "Bool");
+    }, "call$1", "get$isBool", 2, 0, 155, 156],
+    isString$1: [function(receiver, type) {
+      return J.$eq(type, "String");
+    }, "call$1", "get$isString", 2, 0, 155, 156],
+    isInstance$1: [function(receiver, type) {
+      return J.$eq(type, "Instance");
+    }, "call$1", "get$isInstance", 2, 0, 155, 156],
+    isDouble$1: [function(receiver, type) {
+      return J.$eq(type, "Double");
+    }, "call$1", "get$isDouble", 2, 0, 155, 156],
+    isList$1: [function(receiver, type) {
+      var t1 = J.getInterceptor(type);
+      return t1.$eq(type, "GrowableObjectArray") || t1.$eq(type, "Array");
+    }, "call$1", "get$isList", 2, 0, 155, 156],
+    isType$1: [function(receiver, type) {
+      return J.$eq(type, "Type");
+    }, "call$1", "get$isType", 2, 0, 155, 156],
+    isUnexpected$1: [function(receiver, type) {
+      return !C.JSArray_methods.contains$1(["Null", "Smi", "Mint", "Bigint", "Bool", "String", "Double", "Instance", "GrowableObjectArray", "Array", "Type", "Error"], type);
+    }, "call$1", "get$isUnexpected", 2, 0, 155, 156],
+    static: {ObservatoryElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ObservatoryElement_methods.Element$created$0(receiver);
+        C.ObservatoryElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["observe.src.bindable", "package:observe/src/bindable.dart", , A, {
+  "^": "",
+  Bindable: {
+    "^": "Object;",
+    set$value: function(_, newValue) {
+    },
+    $isBindable: true
+  }
+}],
+["observe.src.change_notifier", "package:observe/src/change_notifier.dart", , O, {
+  "^": "",
+  ChangeNotifier: {
+    "^": "Object;",
+    get$changes: function(receiver) {
+      var t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 == null) {
+        t1 = this.get$observed(receiver);
+        t1 = P.StreamController_StreamController$broadcast(this.get$unobserved(receiver), t1, true, null);
+        receiver.change_notifier$ChangeNotifier$_changes = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    observed$0: [function(receiver) {
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(receiver) {
+      receiver.change_notifier$ChangeNotifier$_changes = null;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    deliverChanges$0: [function(receiver) {
+      var records, t1, t2;
+      records = receiver.change_notifier$ChangeNotifier$_change_notifier$_records;
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records = null;
+      if (this.get$hasObservers(receiver) && records != null) {
+        t1 = receiver.change_notifier$ChangeNotifier$_changes;
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [T.ChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      t1 = receiver.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    notifyPropertyChange$3: function(receiver, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(receiver, field, oldValue, newValue);
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (receiver.change_notifier$ChangeNotifier$_change_notifier$_records == null) {
+        receiver.change_notifier$ChangeNotifier$_change_notifier$_records = [];
+        P.scheduleMicrotask(this.get$deliverChanges(receiver));
+      }
+      receiver.change_notifier$ChangeNotifier$_change_notifier$_records.push(record);
+    },
+    $isObservable: true
+  }
+}],
+["observe.src.change_record", "package:observe/src/change_record.dart", , T, {
+  "^": "",
+  ChangeRecord: {
+    "^": "Object;",
+    $isChangeRecord: true
+  },
+  PropertyChangeRecord: {
+    "^": "ChangeRecord;object>,name>,oldValue,newValue",
+    toString$0: function(_) {
+      return "#<PropertyChangeRecord " + H.S(this.name) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isPropertyChangeRecord: true
+  }
+}],
+["observe.src.dirty_check", "package:observe/src/dirty_check.dart", , O, {
+  "^": "",
+  dirtyCheckObservables: function() {
+    var cycles, debugLoop, toCheck, t1, anyChanged, i, observer, t2, info, t3;
+    if ($._delivering)
+      return;
+    if ($._allObservables == null)
+      return;
+    $._delivering = true;
+    cycles = 0;
+    debugLoop = null;
+    do {
+      ++cycles;
+      if (cycles === 1000)
+        debugLoop = [];
+      toCheck = $._allObservables;
+      t1 = [];
+      t1.$builtinTypeInfo = [F.Observable];
+      $._allObservables = t1;
+      for (t1 = debugLoop != null, anyChanged = false, i = 0; i < toCheck.length; ++i) {
+        observer = toCheck[i];
+        t2 = J.getInterceptor$x(observer);
+        if (t2.get$hasObservers(observer)) {
+          if (t2.deliverChanges$0(observer)) {
+            if (t1)
+              debugLoop.push([i, observer]);
+            anyChanged = true;
+          }
+          $._allObservables.push(observer);
+        }
+      }
+    } while (cycles < 1000 && anyChanged);
+    if (t1 && anyChanged) {
+      t1 = $.get$_logger();
+      t1.warning$1("Possible loop in Observable.dirtyCheck, stopped checking.");
+      for (t2 = H.setRuntimeTypeInfo(new H.ListIterator(debugLoop, debugLoop.length, 0, null), [H.getTypeArgumentByIndex(debugLoop, 0)]); t2.moveNext$0();) {
+        info = t2._current;
+        t3 = J.getInterceptor$asx(info);
+        t1.warning$1("In last iteration Observable changed at index " + H.S(t3.$index(info, 0)) + ", object: " + H.S(t3.$index(info, 1)) + ".");
+      }
+    }
+    $._allObservablesCount = $._allObservables.length;
+    $._delivering = false;
+  },
+  dirtyCheckZoneSpec: function() {
+    var t1 = {};
+    t1.pending_0 = false;
+    t1 = new O.dirtyCheckZoneSpec_enqueueDirtyCheck(t1);
+    return new P._ZoneSpecification(null, null, null, null, new O.dirtyCheckZoneSpec_wrapCallback(t1), new O.dirtyCheckZoneSpec_wrapUnaryCallback(t1), null, null, null, null, null, null);
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck: {
+    "^": "Closure:157;box_0",
+    call$2: function($parent, zone) {
+      var t1 = this.box_0;
+      if (t1.pending_0)
+        return;
+      t1.pending_0 = true;
+      $parent.scheduleMicrotask$2(zone, new O.dirtyCheckZoneSpec_enqueueDirtyCheck_closure(t1));
+    },
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_enqueueDirtyCheck_closure: {
+    "^": "Closure:69;box_0",
+    call$0: [function() {
+      this.box_0.pending_0 = false;
+      O.dirtyCheckObservables();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback: {
+    "^": "Closure:30;enqueueDirtyCheck_1",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapCallback_closure(this.enqueueDirtyCheck_1, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapCallback_closure: {
+    "^": "Closure:69;enqueueDirtyCheck_2,parent_3,zone_4,f_5",
+    call$0: [function() {
+      this.enqueueDirtyCheck_2.call$2(this.parent_3, this.zone_4);
+      return this.f_5.call$0();
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback: {
+    "^": "Closure:158;enqueueDirtyCheck_6",
+    call$4: [function($self, $parent, zone, f) {
+      if (f == null)
+        return f;
+      return new O.dirtyCheckZoneSpec_wrapUnaryCallback_closure(this.enqueueDirtyCheck_6, $parent, zone, f);
+    }, "call$4", null, 8, 0, null, 27, 28, 29, 31, "call"],
+    $isFunction: true
+  },
+  dirtyCheckZoneSpec_wrapUnaryCallback_closure: {
+    "^": "Closure:13;enqueueDirtyCheck_7,parent_8,zone_9,f_10",
+    call$1: [function(x) {
+      this.enqueueDirtyCheck_7.call$2(this.parent_8, this.zone_9);
+      return this.f_10.call$1(x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  }
+}],
+["observe.src.list_diff", "package:observe/src/list_diff.dart", , G, {
+  "^": "",
+  _calcEditDistances: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var rowCount, columnCount, distances, t1, i, t2, j, t3, t4, t5, t6, t7, t8, t9;
+    rowCount = oldEnd - oldStart + 1;
+    columnCount = J.$add$ns(J.$sub$n(currentEnd, currentStart), 1);
+    distances = Array(rowCount);
+    for (t1 = distances.length, i = 0; i < rowCount; ++i) {
+      if (typeof columnCount !== "number")
+        return H.iae(columnCount);
+      t2 = Array(columnCount);
+      if (i >= t1)
+        return H.ioore(distances, i);
+      distances[i] = t2;
+      if (0 >= t2.length)
+        return H.ioore(t2, 0);
+      t2[0] = i;
+    }
+    if (typeof columnCount !== "number")
+      return H.iae(columnCount);
+    j = 0;
+    for (; j < columnCount; ++j) {
+      if (0 >= t1)
+        return H.ioore(distances, 0);
+      t2 = distances[0];
+      if (j >= t2.length)
+        return H.ioore(t2, j);
+      t2[j] = j;
+    }
+    for (t2 = J.getInterceptor$ns(currentStart), t3 = J.getInterceptor$asx(current), i = 1; i < rowCount; ++i)
+      for (t4 = i - 1, t5 = oldStart + i - 1, j = 1; j < columnCount; ++j) {
+        if (t5 >>> 0 !== t5 || t5 >= old.length)
+          return H.ioore(old, t5);
+        t6 = J.$eq(old[t5], t3.$index(current, J.$sub$n(t2.$add(currentStart, j), 1)));
+        t7 = distances[i];
+        t8 = distances[t4];
+        t9 = j - 1;
+        if (t6) {
+          if (i >= t1)
+            return H.ioore(distances, i);
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (t9 >= t8.length)
+            return H.ioore(t8, t9);
+          t6 = t8[t9];
+          if (j >= t7.length)
+            return H.ioore(t7, j);
+          t7[j] = t6;
+        } else {
+          if (t4 >= t1)
+            return H.ioore(distances, t4);
+          if (j >= t8.length)
+            return H.ioore(t8, j);
+          t6 = t8[j];
+          if (typeof t6 !== "number")
+            return t6.$add();
+          if (i >= t1)
+            return H.ioore(distances, i);
+          t8 = t7.length;
+          if (t9 >= t8)
+            return H.ioore(t7, t9);
+          t9 = t7[t9];
+          if (typeof t9 !== "number")
+            return t9.$add();
+          t9 = P.min(t6 + 1, t9 + 1);
+          if (j >= t8)
+            return H.ioore(t7, j);
+          t7[j] = t9;
+        }
+      }
+    return distances;
+  },
+  _spliceOperationsFromEditDistances: function(distances) {
+    var t1, i, j, t2, current, edits, t3, t4, t5, northWest, west, north, min;
+    t1 = distances.length;
+    i = t1 - 1;
+    if (0 >= t1)
+      return H.ioore(distances, 0);
+    j = distances[0].length - 1;
+    if (i < 0)
+      return H.ioore(distances, i);
+    t2 = distances[i];
+    if (j < 0 || j >= t2.length)
+      return H.ioore(t2, j);
+    current = t2[j];
+    edits = [];
+    while (true) {
+      if (!(i > 0 || j > 0))
+        break;
+      c$0: {
+        if (i === 0) {
+          edits.push(2);
+          --j;
+          break c$0;
+        }
+        if (j === 0) {
+          edits.push(3);
+          --i;
+          break c$0;
+        }
+        t2 = i - 1;
+        if (t2 < 0)
+          return H.ioore(distances, t2);
+        t3 = distances[t2];
+        t4 = j - 1;
+        t5 = t3.length;
+        if (t4 < 0 || t4 >= t5)
+          return H.ioore(t3, t4);
+        northWest = t3[t4];
+        if (j < 0 || j >= t5)
+          return H.ioore(t3, j);
+        west = t3[j];
+        if (i < 0)
+          return H.ioore(distances, i);
+        t3 = distances[i];
+        if (t4 >= t3.length)
+          return H.ioore(t3, t4);
+        north = t3[t4];
+        min = P.min(P.min(west, north), northWest);
+        if (min === northWest) {
+          if (northWest == null ? current == null : northWest === current)
+            edits.push(0);
+          else {
+            edits.push(1);
+            current = northWest;
+          }
+          j = t4;
+          i = t2;
+        } else if (min === west) {
+          edits.push(3);
+          current = west;
+          i = t2;
+        } else {
+          edits.push(2);
+          current = north;
+          j = t4;
+        }
+      }
+    }
+    return H.setRuntimeTypeInfo(new H.ReversedListIterable(edits), [null]).toList$0(0);
+  },
+  _sharedPrefix: function(arr1, arr2, searchLength) {
+    var t1, i, t2;
+    for (t1 = J.getInterceptor$asx(arr1), i = 0; i < searchLength; ++i) {
+      t2 = t1.$index(arr1, i);
+      if (i >= arr2.length)
+        return H.ioore(arr2, i);
+      if (!J.$eq(t2, arr2[i]))
+        return i;
+    }
+    return searchLength;
+  },
+  _sharedSuffix: function(arr1, arr2, searchLength) {
+    var t1, index1, index2, count, t2;
+    t1 = J.getInterceptor$asx(arr1);
+    index1 = t1.get$length(arr1);
+    index2 = arr2.length;
+    count = 0;
+    while (true) {
+      if (count < searchLength) {
+        --index1;
+        t2 = t1.$index(arr1, index1);
+        --index2;
+        if (index2 < 0 || index2 >= arr2.length)
+          return H.ioore(arr2, index2);
+        t2 = J.$eq(t2, arr2[index2]);
+      } else
+        t2 = false;
+      if (!t2)
+        break;
+      ++count;
+    }
+    return count;
+  },
+  calcSplices: function(current, currentStart, currentEnd, old, oldStart, oldEnd) {
+    var t1, minLength, t2, prefixCount, suffixCount, removed, splice, oldStart0, ops, splices, oldIndex, index, i;
+    t1 = J.getInterceptor$n(currentEnd);
+    minLength = P.min(t1.$sub(currentEnd, currentStart), oldEnd - oldStart);
+    t2 = J.getInterceptor(currentStart);
+    prefixCount = t2.$eq(currentStart, 0) && oldStart === 0 ? G._sharedPrefix(current, old, minLength) : 0;
+    suffixCount = t1.$eq(currentEnd, J.get$length$asx(current)) && oldEnd === old.length ? G._sharedSuffix(current, old, minLength - prefixCount) : 0;
+    currentStart = t2.$add(currentStart, prefixCount);
+    oldStart += prefixCount;
+    currentEnd = t1.$sub(currentEnd, suffixCount);
+    oldEnd -= suffixCount;
+    t1 = J.getInterceptor$n(currentEnd);
+    if (J.$eq(t1.$sub(currentEnd, currentStart), 0) && oldEnd - oldStart === 0)
+      return C.List_empty;
+    if (J.$eq(currentStart, currentEnd)) {
+      removed = [];
+      t1 = new P.UnmodifiableListView(removed);
+      t1.$builtinTypeInfo = [null];
+      splice = new G.ListChangeRecord(current, t1, removed, currentStart, 0);
+      for (; oldStart < oldEnd; oldStart = oldStart0) {
+        t1 = splice._removed;
+        oldStart0 = oldStart + 1;
+        if (oldStart >>> 0 !== oldStart || oldStart >= old.length)
+          return H.ioore(old, oldStart);
+        J.add$1$ax(t1, old[oldStart]);
+      }
+      return [splice];
+    } else if (oldStart === oldEnd) {
+      t1 = t1.$sub(currentEnd, currentStart);
+      removed = [];
+      t2 = new P.UnmodifiableListView(removed);
+      t2.$builtinTypeInfo = [null];
+      return [new G.ListChangeRecord(current, t2, removed, currentStart, t1)];
+    }
+    ops = G._spliceOperationsFromEditDistances(G._calcEditDistances(current, currentStart, currentEnd, old, oldStart, oldEnd));
+    splices = [];
+    splices.$builtinTypeInfo = [G.ListChangeRecord];
+    for (oldIndex = oldStart, index = currentStart, splice = null, i = 0; i < ops.length; ++i)
+      switch (ops[i]) {
+        case 0:
+          if (splice != null) {
+            splices.push(splice);
+            splice = null;
+          }
+          index = J.$add$ns(index, 1);
+          ++oldIndex;
+          break;
+        case 1:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+        case 2:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          splice._addedCount = J.$add$ns(splice._addedCount, 1);
+          index = J.$add$ns(index, 1);
+          break;
+        case 3:
+          if (splice == null) {
+            removed = [];
+            t1 = new P.UnmodifiableListView(removed);
+            t1.$builtinTypeInfo = [null];
+            splice = new G.ListChangeRecord(current, t1, removed, index, 0);
+          }
+          t1 = splice._removed;
+          if (oldIndex >>> 0 !== oldIndex || oldIndex >= old.length)
+            return H.ioore(old, oldIndex);
+          J.add$1$ax(t1, old[oldIndex]);
+          ++oldIndex;
+          break;
+      }
+    if (splice != null)
+      splices.push(splice);
+    return splices;
+  },
+  _mergeSplice: function(splices, record) {
+    var t1, t2, t3, addedCount, t4, splice, inserted, insertionOffset, i, current, intersectCount, removed, offset;
+    t1 = J.getInterceptor$x(record);
+    t2 = t1.get$object(record);
+    t1 = t1.get$index(record);
+    t3 = J.toList$0$ax(record.get$_removed());
+    addedCount = record.get$addedCount();
+    if (addedCount == null)
+      addedCount = 0;
+    t4 = new P.UnmodifiableListView(t3);
+    t4.$builtinTypeInfo = [null];
+    splice = new G.ListChangeRecord(t2, t4, t3, t1, addedCount);
+    for (inserted = false, insertionOffset = 0, i = 0; t1 = splices.length, i < t1; ++i) {
+      if (i < 0)
+        return H.ioore(splices, i);
+      current = splices[i];
+      current._list_diff$_index = J.$add$ns(current._list_diff$_index, insertionOffset);
+      if (inserted)
+        continue;
+      t1 = splice._list_diff$_index;
+      t2 = J.$add$ns(t1, splice._unmodifiableRemoved._collection$_source.length);
+      t3 = current._list_diff$_index;
+      intersectCount = P.min(t2, J.$add$ns(t3, current._addedCount)) - P.max(t1, t3);
+      if (intersectCount >= 0) {
+        C.JSArray_methods.removeAt$1(splices, i);
+        --i;
+        t1 = J.$sub$n(current._addedCount, current._unmodifiableRemoved._collection$_source.length);
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        insertionOffset -= t1;
+        t1 = J.$add$ns(splice._addedCount, J.$sub$n(current._addedCount, intersectCount));
+        splice._addedCount = t1;
+        t2 = splice._unmodifiableRemoved._collection$_source.length;
+        t3 = current._unmodifiableRemoved._collection$_source.length;
+        if (J.$eq(t1, 0) && t2 + t3 - intersectCount === 0)
+          inserted = true;
+        else {
+          removed = current._removed;
+          if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+            t1 = splice._unmodifiableRemoved;
+            t1 = t1.getRange$2(t1, 0, J.$sub$n(current._list_diff$_index, splice._list_diff$_index));
+            removed.toString;
+            if (typeof removed !== "object" || removed === null || !!removed.fixed$length)
+              H.throwExpression(P.UnsupportedError$("insertAll"));
+            H.IterableMixinWorkaround_insertAllList(removed, 0, t1);
+          }
+          if (J.$gt$n(J.$add$ns(splice._list_diff$_index, splice._unmodifiableRemoved._collection$_source.length), J.$add$ns(current._list_diff$_index, current._addedCount))) {
+            t1 = splice._unmodifiableRemoved;
+            J.addAll$1$ax(removed, t1.getRange$2(t1, J.$sub$n(J.$add$ns(current._list_diff$_index, current._addedCount), splice._list_diff$_index), splice._unmodifiableRemoved._collection$_source.length));
+          }
+          splice._removed = removed;
+          splice._unmodifiableRemoved = current._unmodifiableRemoved;
+          if (J.$lt$n(current._list_diff$_index, splice._list_diff$_index))
+            splice._list_diff$_index = current._list_diff$_index;
+          inserted = false;
+        }
+      } else if (J.$lt$n(splice._list_diff$_index, current._list_diff$_index)) {
+        C.JSArray_methods.insert$2(splices, i, splice);
+        ++i;
+        offset = J.$sub$n(splice._addedCount, splice._unmodifiableRemoved._collection$_source.length);
+        current._list_diff$_index = J.$add$ns(current._list_diff$_index, offset);
+        if (typeof offset !== "number")
+          return H.iae(offset);
+        insertionOffset += offset;
+        inserted = true;
+      } else
+        inserted = false;
+    }
+    if (!inserted)
+      splices.push(splice);
+  },
+  _createInitialSplices: function(list, records) {
+    var splices, t1;
+    splices = H.setRuntimeTypeInfo([], [G.ListChangeRecord]);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(records, records.length, 0, null), [H.getTypeArgumentByIndex(records, 0)]); t1.moveNext$0();)
+      G._mergeSplice(splices, t1._current);
+    return splices;
+  },
+  projectListSplices: function(list, records) {
+    var splices, t1, t2, splice, t3, t4;
+    if (records.length <= 1)
+      return records;
+    splices = [];
+    for (t1 = G._createInitialSplices(list, records), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]), t2 = list._observable_list$_list; t1.moveNext$0();) {
+      splice = t1._current;
+      if (J.$eq(splice.get$addedCount(), 1) && splice.get$removed()._collection$_source.length === 1) {
+        t3 = splice.get$removed()._collection$_source;
+        if (0 >= t3.length)
+          return H.ioore(t3, 0);
+        t3 = t3[0];
+        t4 = J.get$index$x(splice);
+        if (t4 >>> 0 !== t4 || t4 >= t2.length)
+          return H.ioore(t2, t4);
+        if (!J.$eq(t3, t2[t4]))
+          splices.push(splice);
+        continue;
+      }
+      t3 = J.getInterceptor$x(splice);
+      C.JSArray_methods.addAll$1(splices, G.calcSplices(list, t3.get$index(splice), J.$add$ns(t3.get$index(splice), splice.get$addedCount()), splice.get$_removed(), 0, splice.get$removed()._collection$_source.length));
+    }
+    return splices;
+  },
+  ListChangeRecord: {
+    "^": "Object;object>,_unmodifiableRemoved,_removed<,_list_diff$_index,_addedCount",
+    get$index: function(_) {
+      return this._list_diff$_index;
+    },
+    get$removed: function() {
+      return this._unmodifiableRemoved;
+    },
+    get$addedCount: function() {
+      return this._addedCount;
+    },
+    indexChanged$1: function(key) {
+      var t1;
+      if (typeof key === "number" && Math.floor(key) === key) {
+        t1 = this._list_diff$_index;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        t1 = key < t1;
+      } else
+        t1 = true;
+      if (t1)
+        return false;
+      if (!J.$eq(this._addedCount, this._unmodifiableRemoved._collection$_source.length))
+        return true;
+      return J.$lt$n(key, J.$add$ns(this._list_diff$_index, this._addedCount));
+    },
+    toString$0: function(_) {
+      var t1, t2;
+      t1 = "#<ListChangeRecord index: " + H.S(this._list_diff$_index) + ", removed: ";
+      t2 = this._unmodifiableRemoved;
+      return t1 + t2.toString$0(t2) + ", addedCount: " + H.S(this._addedCount) + ">";
+    },
+    $isListChangeRecord: true,
+    static: {ListChangeRecord_ListChangeRecord: function(object, index, addedCount, removed) {
+        var t1;
+        if (removed == null)
+          removed = [];
+        if (addedCount == null)
+          addedCount = 0;
+        t1 = new P.UnmodifiableListView(removed);
+        t1.$builtinTypeInfo = [null];
+        return new G.ListChangeRecord(object, t1, removed, index, addedCount);
+      }}
+  }
+}],
+["observe.src.metadata", "package:observe/src/metadata.dart", , K, {
+  "^": "",
+  ObservableProperty: {
+    "^": "Object;"
+  },
+  Reflectable: {
+    "^": "Object;"
+  }
+}],
+["observe.src.observable", "package:observe/src/observable.dart", , F, {
+  "^": "",
+  Observable_dirtyCheck: [function() {
+    return O.dirtyCheckObservables();
+  }, "call$0", "Observable_dirtyCheck$closure", 0, 0, 18],
+  notifyPropertyChangeHelper: function(obj, field, oldValue, newValue) {
+    var t1 = J.getInterceptor$x(obj);
+    if (t1.get$hasObservers(obj) && !J.$eq(oldValue, newValue))
+      t1.notifyChange$1(obj, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(obj, field, oldValue, newValue), [null]));
+    return newValue;
+  },
+  Observable: {
+    "^": "Object;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    get$changes: function(receiver) {
+      var t1;
+      if (this.get$_observable$_changes(receiver) == null) {
+        t1 = this.get$_observable$_observed(receiver);
+        this.set$_observable$_changes(receiver, P.StreamController_StreamController$broadcast(this.get$_unobserved(receiver), t1, true, null));
+      }
+      t1 = this.get$_observable$_changes(receiver);
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$hasObservers: function(receiver) {
+      var t1, t2;
+      if (this.get$_observable$_changes(receiver) != null) {
+        t1 = this.get$_observable$_changes(receiver);
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    _observable$_observed$0: [function(receiver) {
+      var t1, values, $name, getter;
+      t1 = $._allObservables;
+      if (t1 == null) {
+        t1 = H.setRuntimeTypeInfo([], [F.Observable]);
+        $._allObservables = t1;
+      }
+      t1.push(receiver);
+      $._allObservablesCount = $._allObservablesCount + 1;
+      values = P.LinkedHashMap_LinkedHashMap(null, null, null, P.Symbol, P.Object);
+      for (t1 = this.get$runtimeType(receiver), t1 = $.get$typeInspector().query$2(0, t1, new A.QueryOptions(true, false, true, C.Type_HqF, false, false, C.List_GGa, null)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        $name = J.get$name$x(t1._current);
+        getter = $.get$objectAccessor()._getters.$index(0, $name);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + this.toString$0(receiver)));
+        values.$indexSet(0, $name, getter.call$1(receiver));
+      }
+      this.set$_values(receiver, values);
+    }, "call$0", "get$_observable$_observed", 0, 0, 18],
+    _unobserved$0: [function(receiver) {
+      if (this.get$_values(receiver) != null)
+        this.set$_values(receiver, null);
+    }, "call$0", "get$_unobserved", 0, 0, 18],
+    deliverChanges$0: function(receiver) {
+      var t1, t2;
+      t1 = {};
+      if (this.get$_values(receiver) == null || !this.get$hasObservers(receiver))
+        return false;
+      t1.records_0 = this.get$_records(receiver);
+      this.set$_records(receiver, null);
+      this.get$_values(receiver).forEach$1(0, new F.Observable_deliverChanges_closure(t1, receiver));
+      if (t1.records_0 == null)
+        return false;
+      t2 = this.get$_observable$_changes(receiver);
+      t1 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(t1.records_0), [T.ChangeRecord]);
+      if (t2._state >= 4)
+        H.throwExpression(t2._addEventError$0());
+      t2._sendData$1(t1);
+      return true;
+    },
+    notifyChange$1: function(receiver, record) {
+      if (!this.get$hasObservers(receiver))
+        return;
+      if (this.get$_records(receiver) == null)
+        this.set$_records(receiver, []);
+      this.get$_records(receiver).push(record);
+    },
+    $isObservable: true
+  },
+  Observable_deliverChanges_closure: {
+    "^": "Closure:75;box_0,this_1",
+    call$2: function($name, oldValue) {
+      var t1, newValue, t2, t3, records;
+      t1 = this.this_1;
+      newValue = $.get$objectAccessor().read$2(t1, $name);
+      if (!J.$eq(oldValue, newValue)) {
+        t2 = this.box_0;
+        t3 = t2.records_0;
+        if (t3 == null) {
+          records = [];
+          t2.records_0 = records;
+          t2 = records;
+        } else
+          t2 = t3;
+        t2.push(H.setRuntimeTypeInfo(new T.PropertyChangeRecord(t1, $name, oldValue, newValue), [null]));
+        J.get$_values$x(t1).$indexSet(0, $name, newValue);
+      }
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_box", "package:observe/src/observable_box.dart", , A, {
+  "^": "",
+  ObservableBox: {
+    "^": "ChangeNotifier;",
+    get$value: function(_) {
+      return this._observable_box$_value;
+    },
+    set$value: function(_, newValue) {
+      this._observable_box$_value = F.notifyPropertyChangeHelper(this, C.Symbol_value, this._observable_box$_value, newValue);
+    },
+    toString$0: function(_) {
+      return "#<" + new H.TypeImpl(H.getRuntimeTypeString(this), null).toString$0(0) + " value: " + H.S(this._observable_box$_value) + ">";
+    }
+  }
+}],
+["observe.src.observable_list", "package:observe/src/observable_list.dart", , Q, {
+  "^": "",
+  ObservableList: {
+    "^": "ListBase_ChangeNotifier;_listRecords@,_listChanges,_observable_list$_list,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$listChanges: function() {
+      var t1 = this._listChanges;
+      if (t1 == null) {
+        t1 = P.StreamController_StreamController$broadcast(new Q.ObservableList_listChanges_closure(this), null, true, null);
+        this._listChanges = t1;
+      }
+      t1.toString;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$length: function(_) {
+      return this._observable_list$_list.length;
+    },
+    set$length: function(_, value) {
+      var t1, len, t2, t3, removed;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      if (len === value)
+        return;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, value);
+      t2 = len === 0;
+      t3 = value === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t2, t3);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t2, !t3);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        if (value < len) {
+          if (value < 0 || value > t1.length)
+            H.throwExpression(P.RangeError$range(value, 0, t1.length));
+          if (len < value || len > t1.length)
+            H.throwExpression(P.RangeError$range(len, value, t1.length));
+          t2 = new H.SubListIterable(t1, value, len);
+          t2.$builtinTypeInfo = [null];
+          if (value < 0)
+            H.throwExpression(P.RangeError$value(value));
+          if (len < 0)
+            H.throwExpression(P.RangeError$value(len));
+          if (value > len)
+            H.throwExpression(P.RangeError$range(value, 0, len));
+          t2 = t2.toList$0(0);
+          t3 = new P.UnmodifiableListView(t2);
+          t3.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t3, t2, value, 0));
+        } else {
+          removed = [];
+          t2 = new P.UnmodifiableListView(removed);
+          t2.$builtinTypeInfo = [null];
+          this._recordChange$1(new G.ListChangeRecord(this, t2, removed, len, value - len));
+        }
+      C.JSArray_methods.set$length(t1, value);
+    },
+    $index: function(_, index) {
+      var t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    },
+    $indexSet: function(_, index, value) {
+      var t1, oldValue, t2, t3;
+      t1 = this._observable_list$_list;
+      if (index >>> 0 !== index || index >= t1.length)
+        return H.ioore(t1, index);
+      oldValue = t1[index];
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2) {
+        t2 = [oldValue];
+        t3 = new P.UnmodifiableListView(t2);
+        t3.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t3, t2, index, 1));
+      }
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = value;
+    },
+    get$isEmpty: function(_) {
+      return P.ListMixin.prototype.get$isEmpty.call(this, this);
+    },
+    get$isNotEmpty: function(_) {
+      return P.ListMixin.prototype.get$isNotEmpty.call(this, this);
+    },
+    setAll$2: function(_, index, iterable) {
+      var t1, len, t2;
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      len = J.get$length$asx(iterable);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && len > 0) {
+        t1 = this._observable_list$_list;
+        H.IterableMixinWorkaround__rangeCheck(t1, index, len);
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, len, H.SubListIterable$(t1, index, len, null).toList$0(0)));
+      }
+      H.IterableMixinWorkaround_setAllList(this._observable_list$_list, index, iterable);
+    },
+    add$1: function(_, value) {
+      var t1, len, t2, t3;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      this._notifyChangeLength$2(len, len + 1);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, 1, null));
+      C.JSArray_methods.add$1(t1, value);
+    },
+    addAll$1: function(_, iterable) {
+      var t1, len, added, t2;
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.addAll$1(t1, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      added = t1.length - len;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && added > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, len, added, null));
+    },
+    removeRange$2: function(_, start, end) {
+      var t1, t2, rangeLength, t3, len, t4, t5;
+      t1 = start >= 0;
+      if (!t1 || start > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(start, 0, this.get$length(this)));
+      t2 = end >= start;
+      if (!t2 || end > this._observable_list$_list.length)
+        H.throwExpression(P.RangeError$range(end, start, this.get$length(this)));
+      rangeLength = end - start;
+      t3 = this._observable_list$_list;
+      len = t3.length;
+      t4 = len - rangeLength;
+      this.notifyPropertyChange$3(this, C.Symbol_length, len, t4);
+      t5 = len === 0;
+      t4 = t4 === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t5, t4);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t5, !t4);
+      t4 = this._listChanges;
+      if (t4 != null) {
+        t5 = t4._async$_next;
+        t4 = t5 == null ? t4 != null : t5 !== t4;
+      } else
+        t4 = false;
+      if (t4 && rangeLength > 0) {
+        if (!t1 || start > t3.length)
+          H.throwExpression(P.RangeError$range(start, 0, t3.length));
+        if (!t2 || end > t3.length)
+          H.throwExpression(P.RangeError$range(end, start, t3.length));
+        t1 = new H.SubListIterable(t3, start, end);
+        t1.$builtinTypeInfo = [null];
+        if (start < 0)
+          H.throwExpression(P.RangeError$value(start));
+        if (end < 0)
+          H.throwExpression(P.RangeError$value(end));
+        if (start > end)
+          H.throwExpression(P.RangeError$range(start, 0, end));
+        t1 = t1.toList$0(0);
+        t2 = new P.UnmodifiableListView(t1);
+        t2.$builtinTypeInfo = [null];
+        this._recordChange$1(new G.ListChangeRecord(this, t2, t1, start, 0));
+      }
+      C.JSArray_methods.removeRange$2(t3, start, end);
+    },
+    insertAll$2: function(_, index, iterable) {
+      var t1, insertionLength, len, t2;
+      if (index < 0 || index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = J.getInterceptor(iterable);
+      if (!t1.$isList && true)
+        iterable = t1.toList$0(iterable);
+      insertionLength = J.get$length$asx(iterable);
+      t1 = this._observable_list$_list;
+      len = t1.length;
+      C.JSArray_methods.set$length(t1, len + insertionLength);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + insertionLength, t2, this, index);
+      H.IterableMixinWorkaround_setAllList(t1, index, iterable);
+      this._notifyChangeLength$2(len, t1.length);
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (t1 && insertionLength > 0)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, insertionLength, null));
+    },
+    insert$2: function(_, index, element) {
+      var t1, t2, t3;
+      if (index > this._observable_list$_list.length)
+        throw H.wrapException(P.RangeError$range(index, 0, this.get$length(this)));
+      t1 = this._observable_list$_list;
+      t2 = t1.length;
+      if (index === t2) {
+        this.add$1(0, element);
+        return;
+      }
+      C.JSArray_methods.set$length(t1, t2 + 1);
+      t2 = t1.length;
+      H.IterableMixinWorkaround_setRangeList(t1, index + 1, t2, this, index);
+      t2 = t1.length;
+      this._notifyChangeLength$2(t2 - 1, t2);
+      t2 = this._listChanges;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2)
+        this._recordChange$1(G.ListChangeRecord_ListChangeRecord(this, index, 1, null));
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      t1[index] = element;
+    },
+    _recordChange$1: function(record) {
+      var t1, t2;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1)
+        return;
+      if (this._listRecords == null) {
+        this._listRecords = [];
+        P.scheduleMicrotask(this.get$deliverListChanges());
+      }
+      this._listRecords.push(record);
+    },
+    _notifyChangeLength$2: function(oldValue, newValue) {
+      var t1, t2;
+      this.notifyPropertyChange$3(this, C.Symbol_length, oldValue, newValue);
+      t1 = oldValue === 0;
+      t2 = newValue === 0;
+      this.notifyPropertyChange$3(this, C.Symbol_isEmpty, t1, t2);
+      this.notifyPropertyChange$3(this, C.Symbol_isNotEmpty, !t1, !t2);
+    },
+    deliverListChanges$0: [function() {
+      var t1, records, t2;
+      t1 = this._listRecords;
+      if (t1 == null)
+        return false;
+      records = G.projectListSplices(this, t1);
+      this._listRecords = null;
+      t1 = this._listChanges;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t2 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t2 = false;
+      if (t2 && records.length !== 0) {
+        t2 = H.setRuntimeTypeInfo(new P.UnmodifiableListView(records), [G.ListChangeRecord]);
+        if (t1._state >= 4)
+          H.throwExpression(t1._addEventError$0());
+        t1._sendData$1(t2);
+        return true;
+      }
+      return false;
+    }, "call$0", "get$deliverListChanges", 0, 0, 111],
+    $isObservableList: true,
+    static: {ObservableList$: function($length, $E) {
+        var t1 = H.setRuntimeTypeInfo([], [$E]);
+        return H.setRuntimeTypeInfo(new Q.ObservableList(null, null, t1, null, null), [$E]);
+      }, ObservableList_applyChangeRecords: function(previous, current, changeRecords) {
+        var t1, t2, change, t3, addEnd, removeEnd, addedItems, t4, t5, removeLength, insertLength, delta, insertEnd, newEnd, newLength;
+        if (previous === current)
+          throw H.wrapException(P.ArgumentError$("can't use same list for previous and current"));
+        for (t1 = J.get$iterator$ax(changeRecords), t2 = J.getInterceptor$ax(current); t1.moveNext$0();) {
+          change = t1.get$current();
+          t3 = J.getInterceptor$x(change);
+          addEnd = J.$add$ns(t3.get$index(change), change.get$addedCount());
+          removeEnd = J.$add$ns(t3.get$index(change), change.get$removed()._collection$_source.length);
+          addedItems = t2.getRange$2(current, t3.get$index(change), addEnd);
+          t3 = t3.get$index(change);
+          t4 = J.getInterceptor$n(t3);
+          if (t4.$lt(t3, 0) || t4.$gt(t3, previous.length))
+            H.throwExpression(P.RangeError$range(t3, 0, previous.length));
+          t5 = J.getInterceptor$n(removeEnd);
+          if (t5.$lt(removeEnd, t3) || t5.$gt(removeEnd, previous.length))
+            H.throwExpression(P.RangeError$range(removeEnd, t3, previous.length));
+          removeLength = t5.$sub(removeEnd, t3);
+          insertLength = addedItems.get$length(addedItems);
+          t5 = J.getInterceptor$n(removeLength);
+          if (t5.$ge(removeLength, insertLength)) {
+            delta = t5.$sub(removeLength, insertLength);
+            insertEnd = t4.$add(t3, insertLength);
+            t4 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newEnd = t4 - delta;
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+            if (delta !== 0) {
+              H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newEnd, previous, removeEnd);
+              C.JSArray_methods.set$length(previous, newEnd);
+            }
+          } else {
+            delta = J.$sub$n(insertLength, removeLength);
+            t5 = previous.length;
+            if (typeof delta !== "number")
+              return H.iae(delta);
+            newLength = t5 + delta;
+            insertEnd = t4.$add(t3, insertLength);
+            C.JSArray_methods.set$length(previous, newLength);
+            H.IterableMixinWorkaround_setRangeList(previous, insertEnd, newLength, previous, removeEnd);
+            H.IterableMixinWorkaround_setRangeList(previous, t3, insertEnd, addedItems, 0);
+          }
+        }
+      }}
+  },
+  ListBase_ChangeNotifier: {
+    "^": "ListBase+ChangeNotifier;",
+    $isObservable: true
+  },
+  ObservableList_listChanges_closure: {
+    "^": "Closure:69;this_0",
+    call$0: function() {
+      this.this_0._listChanges = null;
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observable_map", "package:observe/src/observable_map.dart", , V, {
+  "^": "",
+  MapChangeRecord: {
+    "^": "ChangeRecord;key>,oldValue,newValue,isInsert,isRemove",
+    toString$0: function(_) {
+      var kind;
+      if (this.isInsert)
+        kind = "insert";
+      else
+        kind = this.isRemove ? "remove" : "set";
+      return "#<MapChangeRecord " + kind + " " + H.S(this.key) + " from: " + H.S(this.oldValue) + " to: " + H.S(this.newValue) + ">";
+    },
+    $isMapChangeRecord: true
+  },
+  ObservableMap: {
+    "^": "ChangeNotifier;_observable_map$_map,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$keys: function() {
+      return this._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    $index: function(_, key) {
+      return this._observable_map$_map.$index(0, key);
+    },
+    $indexSet: function(_, key, value) {
+      var t1, t2, len, oldValue;
+      t1 = this.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      if (!t1) {
+        this._observable_map$_map.$indexSet(0, key, value);
+        return;
+      }
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      oldValue = t1.$index(0, key);
+      t1.$indexSet(0, key, value);
+      if (len !== t1.get$length(t1)) {
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, t1.get$length(t1));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, null, value, true, false), [null, null]));
+        this._notifyKeysValuesChanged$0();
+      } else if (!J.$eq(oldValue, value)) {
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, oldValue, value, false, false), [null, null]));
+        this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+      }
+    },
+    addAll$1: function(_, other) {
+      J.forEach$1$ax(other, new V.ObservableMap_addAll_closure(this));
+    },
+    clear$0: function(_) {
+      var t1, len, t2, t3;
+      t1 = this._observable_map$_map;
+      len = t1.get$length(t1);
+      t2 = this.change_notifier$ChangeNotifier$_changes;
+      if (t2 != null) {
+        t3 = t2._async$_next;
+        t2 = t3 == null ? t2 != null : t3 !== t2;
+      } else
+        t2 = false;
+      if (t2 && len > 0) {
+        t1.forEach$1(0, new V.ObservableMap_clear_closure(this));
+        F.notifyPropertyChangeHelper(this, C.Symbol_length, len, 0);
+        this._notifyKeysValuesChanged$0();
+      }
+      t1.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._observable_map$_map.forEach$1(0, f);
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this);
+    },
+    _notifyKeysValuesChanged$0: function() {
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_keys, null, null), [null]));
+      this.notifyChange$1(this, H.setRuntimeTypeInfo(new T.PropertyChangeRecord(this, C.Symbol_values, null, null), [null]));
+    },
+    $isObservableMap: true,
+    $isMap: true,
+    static: {ObservableMap_ObservableMap$createFromType: function(other, $K, $V) {
+        var result;
+        if (!!other.$isSplayTreeMap)
+          result = H.setRuntimeTypeInfo(new V.ObservableMap(P.SplayTreeMap$(null, null, $K, $V), null, null), [$K, $V]);
+        else
+          result = !!other.$isLinkedHashMap ? H.setRuntimeTypeInfo(new V.ObservableMap(P.LinkedHashMap_LinkedHashMap(null, null, null, $K, $V), null, null), [$K, $V]) : H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, $K, $V), null, null), [$K, $V]);
+        return result;
+      }}
+  },
+  ObservableMap_addAll_closure: {
+    "^": "Closure;this_0",
+    call$2: [function(key, value) {
+      this.this_0.$indexSet(0, key, value);
+    }, "call$2", null, 4, 0, null, 76, 21, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(K, V) {
+        return {func: "dynamic__K_V2", args: [K, V]};
+      }, this.this_0, "ObservableMap");
+    }
+  },
+  ObservableMap_clear_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(key, value) {
+      var t1 = this.this_0;
+      t1.notifyChange$1(t1, H.setRuntimeTypeInfo(new V.MapChangeRecord(key, value, null, false, true), [null, null]));
+    },
+    $isFunction: true
+  }
+}],
+["observe.src.observer_transform", "package:observe/src/observer_transform.dart", , Y, {
+  "^": "",
+  ObserverTransform: {
+    "^": "Bindable;_bindable,_getTransformer,_setTransformer,_observer_transform$_notifyCallback,_observer_transform$_value",
+    _getTransformer$1: function(arg0) {
+      return this._getTransformer.call$1(arg0);
+    },
+    _observer_transform$_notifyCallback$1: function(arg0) {
+      return this._observer_transform$_notifyCallback.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      var t1;
+      this._observer_transform$_notifyCallback = callback;
+      t1 = this._getTransformer$1(J.open$1$x(this._bindable, this.get$_observedCallback()));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    _observedCallback$1: [function(newValue) {
+      var value = this._getTransformer$1(newValue);
+      if (J.$eq(value, this._observer_transform$_value))
+        return;
+      this._observer_transform$_value = value;
+      return this._observer_transform$_notifyCallback$1(value);
+    }, "call$1", "get$_observedCallback", 2, 0, 13, 58],
+    close$0: function(_) {
+      var t1 = this._bindable;
+      if (t1 != null)
+        J.close$0$x(t1);
+      this._bindable = null;
+      this._getTransformer = null;
+      this._setTransformer = null;
+      this._observer_transform$_notifyCallback = null;
+      this._observer_transform$_value = null;
+    },
+    get$value: function(_) {
+      var t1 = this._getTransformer$1(J.get$value$x(this._bindable));
+      this._observer_transform$_value = t1;
+      return t1;
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._bindable, newValue);
+    }
+  }
+}],
+["observe.src.path_observer", "package:observe/src/path_observer.dart", , L, {
+  "^": "",
+  _getObjectProperty: function(object, property) {
+    var t1, t2, getter, exception, decl;
+    if (object == null)
+      return;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object)))
+        return J.$index$asx(object, property);
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1)
+        return J.$index$asx(object, $.get$symbolConverter()._names.$index(0, property));
+      try {
+        t1 = object;
+        t2 = property;
+        getter = $.get$objectAccessor()._getters.$index(0, t2);
+        if (getter == null)
+          H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + H.S(t1)));
+        t1 = getter.call$1(t1);
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          decl = $.get$typeInspector()._findDeclaration$2(t1, C.Symbol_noSuchMethod);
+          if (!(decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't get " + H.S(property) + " in " + H.S(object));
+    return;
+  },
+  _setObjectProperty: function(object, property, value) {
+    var t1, t2, exception;
+    if (object == null)
+      return false;
+    t1 = property;
+    if (typeof t1 === "number" && Math.floor(t1) === t1) {
+      if (!!J.getInterceptor(object).$isList && J.$ge$n(property, 0) && J.$lt$n(property, J.get$length$asx(object))) {
+        J.$indexSet$ax(object, property, value);
+        return true;
+      }
+    } else if (!!J.getInterceptor(property).$isSymbol) {
+      t1 = object;
+      t2 = H.checkSubtype(t1, "$isIndexable", [P.String, null], "$asIndexable");
+      if (!t2) {
+        t1 = object;
+        t2 = H.checkSubtype(t1, "$isMap", [P.String, null], "$asMap");
+        t1 = t2 && !C.JSArray_methods.contains$1(C.List_8QI, property);
+      } else
+        t1 = true;
+      if (t1) {
+        J.$indexSet$ax(object, $.get$symbolConverter()._names.$index(0, property), value);
+        return true;
+      }
+      try {
+        $.get$objectAccessor().write$3(object, property, value);
+        return true;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          t1 = J.get$runtimeType$(object);
+          if (!$.get$typeInspector().hasInstanceMethod$2(t1, C.Symbol_noSuchMethod))
+            throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+    t1 = $.get$_logger0();
+    if (t1.isLoggable$1(C.Level_FINER_400))
+      t1.finer$1("can't set " + H.S(property) + " in " + H.S(object));
+    return false;
+  },
+  _isPathValid: function(s) {
+    s = J.trim$0$s(s);
+    if (s === "")
+      return true;
+    if (0 >= s.length)
+      return H.ioore(s, 0);
+    if (s[0] === ".")
+      return false;
+    return $.get$_pathRegExp().hasMatch$1(s);
+  },
+  PathObserver: {
+    "^": "_Observer;_path_observer$_path,_object,_directObserver,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._path_observer$_path == null;
+    },
+    set$value: function(_, newValue) {
+      var t1 = this._path_observer$_path;
+      if (t1 != null)
+        t1.setValueFrom$2(this._object, newValue);
+    },
+    get$_reportArgumentCount: function() {
+      return 2;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      this._directObserver = L._ObservedSet__ObservedSet(this, this._object);
+      this._check$1$skipChanges(true);
+    },
+    _disconnect$0: function() {
+      this._path_observer$_value = null;
+      this._path_observer$_path = null;
+      this._object = null;
+    },
+    _iterateObjects$1: function(observe) {
+      this._path_observer$_path._iterateObjects$2(this._object, observe);
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var oldValue, t1;
+      oldValue = this._path_observer$_value;
+      t1 = this._path_observer$_path.getValueFrom$1(this._object);
+      this._path_observer$_value = t1;
+      if (skipChanges || J.$eq(t1, oldValue))
+        return false;
+      this._report$2(this._path_observer$_value, oldValue);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  PropertyPath: {
+    "^": "Object;_segments",
+    get$length: function(_) {
+      return this._segments.length;
+    },
+    get$isEmpty: function(_) {
+      return this._segments.length === 0;
+    },
+    get$isValid: function() {
+      return true;
+    },
+    toString$0: function(_) {
+      if (!this.get$isValid())
+        return "<invalid path>";
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(this._segments, new L.PropertyPath_toString_closure()), [null, null]).join$1(0, ".");
+    },
+    $eq: function(_, other) {
+      var t1, len, t2, i, t3;
+      if (other == null)
+        return false;
+      if (this === other)
+        return true;
+      if (!J.getInterceptor(other).$isPropertyPath)
+        return false;
+      if (this.get$isValid() !== other.get$isValid())
+        return false;
+      t1 = this._segments;
+      len = t1.length;
+      t2 = other._segments;
+      if (len !== t2.length)
+        return false;
+      for (i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t3 = t1[i];
+        if (i >= t2.length)
+          return H.ioore(t2, i);
+        if (!J.$eq(t3, t2[i]))
+          return false;
+      }
+      return true;
+    },
+    get$hashCode: function(_) {
+      var t1, len, hash, i, t2;
+      for (t1 = this._segments, len = t1.length, hash = 0, i = 0; i < len; ++i) {
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        t2 = J.get$hashCode$(t1[i]);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        hash = 536870911 & hash + t2;
+        hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+        hash ^= hash >>> 6;
+      }
+      hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+      hash ^= hash >>> 11;
+      return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+    },
+    getValueFrom$1: function(obj) {
+      var t1, segment;
+      if (!this.get$isValid())
+        return;
+      for (t1 = this._segments, t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        segment = t1._current;
+        if (obj == null)
+          return;
+        obj = L._getObjectProperty(obj, segment);
+      }
+      return obj;
+    },
+    setValueFrom$2: function(obj, value) {
+      var t1, end, i;
+      t1 = this._segments;
+      end = t1.length - 1;
+      if (end < 0)
+        return false;
+      for (i = 0; i < end; ++i) {
+        if (obj == null)
+          return false;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+      if (end >= t1.length)
+        return H.ioore(t1, end);
+      return L._setObjectProperty(obj, t1[end], value);
+    },
+    _iterateObjects$2: function(obj, observe) {
+      var t1, last, i, i0;
+      if (!this.get$isValid() || this._segments.length === 0)
+        return;
+      t1 = this._segments;
+      last = t1.length - 1;
+      for (i = 0; obj != null; i = i0) {
+        observe.call$1(obj);
+        if (i >= last)
+          break;
+        i0 = i + 1;
+        if (i >= t1.length)
+          return H.ioore(t1, i);
+        obj = L._getObjectProperty(obj, t1[i]);
+      }
+    },
+    $isPropertyPath: true,
+    static: {PropertyPath_PropertyPath: function(path) {
+        var copy, t1, segment, pathObj, segments, t2, index, it;
+        if (!!J.getInterceptor(path).$isList) {
+          copy = P.List_List$from(path, false, null);
+          t1 = new H.ListIterator(copy, copy.length, 0, null);
+          t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(copy, 0)];
+          for (; t1.moveNext$0();) {
+            segment = t1._current;
+            if ((typeof segment !== "number" || Math.floor(segment) !== segment) && !J.getInterceptor(segment).$isSymbol)
+              throw H.wrapException(P.ArgumentError$("List must contain only ints and Symbols"));
+          }
+          return new L.PropertyPath(copy);
+        }
+        if (path == null)
+          path = "";
+        pathObj = $.get$_pathCache().$index(0, path);
+        if (pathObj != null)
+          return pathObj;
+        if (!L._isPathValid(path))
+          return $.get$_InvalidPropertyPath__instance();
+        segments = [];
+        t1 = J.trim$0$s(path).split(".");
+        t2 = new H.ListIterator(t1, t1.length, 0, null);
+        t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+        for (; t2.moveNext$0();) {
+          segment = t2._current;
+          if (J.$eq(segment, ""))
+            continue;
+          index = H.Primitives_parseInt(segment, 10, new L.PropertyPath_PropertyPath_closure());
+          segments.push(index != null ? index : $.get$symbolConverter()._symbols.$index(0, segment));
+        }
+        pathObj = new L.PropertyPath(C.JSArray_methods.toList$1$growable(segments, false));
+        t1 = $.get$_pathCache();
+        if (t1._collection$_length >= 100) {
+          t1.toString;
+          t2 = new P.LinkedHashMapKeyIterable(t1);
+          t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(t1, 0)];
+          it = t2.get$iterator(t2);
+          if (!it.moveNext$0())
+            H.throwExpression(H.IterableElementError_noElement());
+          t1.remove$1(0, it.get$current());
+        }
+        t1.$indexSet(0, path, pathObj);
+        return pathObj;
+      }}
+  },
+  PropertyPath_PropertyPath_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return;
+    },
+    $isFunction: true
+  },
+  PropertyPath_toString_closure: {
+    "^": "Closure:13;",
+    call$1: [function(s) {
+      return !!J.getInterceptor(s).$isSymbol ? $.get$symbolConverter()._names.$index(0, s) : s;
+    }, "call$1", null, 2, 0, null, 142, "call"],
+    $isFunction: true
+  },
+  _InvalidPropertyPath: {
+    "^": "PropertyPath;_segments",
+    get$isValid: function() {
+      return false;
+    },
+    static: {"^": "_InvalidPropertyPath__instance"}
+  },
+  closure7: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return new H.JSSyntaxRegExp("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$", H.JSSyntaxRegExp_makeNative("^(?:(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))(?:\\.(?:[$_a-zA-Z]+[$_a-zA-Z0-9]*|(?:[0-9]|[1-9]+[0-9]+)))*$", false, true, false), null, null);
+    },
+    $isFunction: true
+  },
+  CompoundObserver: {
+    "^": "_Observer;_directObserver,_observed,_birthId,_notifyCallback,_notifyArgumentCount,_path_observer$_value",
+    get$_path_observer$_isClosed: function() {
+      return this._observed == null;
+    },
+    get$_reportArgumentCount: function() {
+      return 3;
+    },
+    open$1: function(_, callback) {
+      return L._Observer.prototype.open$1.call(this, this, callback);
+    },
+    _connect$0: function() {
+      var t1, t2, i, object;
+      this._check$1$skipChanges(true);
+      for (t1 = this._observed, t2 = t1.length, i = 0; i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t1 = $._ObservedSet__lastSet;
+          if (t1 != null) {
+            t2 = t1._rootObject;
+            t2 = t2 == null ? object != null : t2 !== object;
+          } else
+            t2 = true;
+          if (t2) {
+            t1 = new L._ObservedSet(object, P.SplayTreeMap$(null, null, null, null), null, null, false);
+            $._ObservedSet__lastSet = t1;
+          }
+          t1._path_observer$_observers.$indexSet(0, this._birthId, this);
+          this._iterateObjects$1(t1.get$observe(t1));
+          this._directObserver = null;
+          break;
+        }
+      }
+    },
+    _disconnect$0: function() {
+      var i, t1, t2, t3;
+      this._path_observer$_value = null;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2)
+        if (t1[i] === C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          J.close$0$x(t1[t3]);
+        }
+      this._observed = null;
+    },
+    addPath$2: function(object, path) {
+      var t1;
+      if (this._notifyCallback != null || this._observed == null)
+        throw H.wrapException(P.StateError$("Cannot add paths once started."));
+      if (!J.getInterceptor(path).$isPropertyPath)
+        path = L.PropertyPath_PropertyPath(path);
+      t1 = this._observed;
+      t1.push(object);
+      t1.push(path);
+    },
+    addPath$1: function(object) {
+      return this.addPath$2(object, null);
+    },
+    _iterateObjects$1: function(observe) {
+      var i, t1, t2, object, t3;
+      for (i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        object = t1[i];
+        if (object !== C.C__ObserverSentinel) {
+          t3 = i + 1;
+          if (t3 >= t2)
+            return H.ioore(t1, t3);
+          H.interceptedTypeCast(t1[t3], "$isPropertyPath")._iterateObjects$2(object, observe);
+        }
+      }
+    },
+    _check$1$skipChanges: function(skipChanges) {
+      var changed, oldValues, i, t1, t2, t3, pathOrObserver, object, value;
+      J.set$length$asx(this._path_observer$_value, C.JSInt_methods._tdivFast$1(this._observed.length, 2));
+      for (changed = false, oldValues = null, i = 0; t1 = this._observed, t2 = t1.length, i < t2; i += 2) {
+        t3 = i + 1;
+        if (t3 >= t2)
+          return H.ioore(t1, t3);
+        pathOrObserver = t1[t3];
+        object = t1[i];
+        if (object === C.C__ObserverSentinel) {
+          H.interceptedTypeCast(pathOrObserver, "$isBindable");
+          value = pathOrObserver.get$value(pathOrObserver);
+        } else
+          value = H.interceptedTypeCast(pathOrObserver, "$isPropertyPath").getValueFrom$1(object);
+        if (skipChanges) {
+          J.$indexSet$ax(this._path_observer$_value, C.JSInt_methods._tdivFast$1(i, 2), value);
+          continue;
+        }
+        t1 = this._path_observer$_value;
+        t2 = C.JSInt_methods._tdivFast$1(i, 2);
+        if (J.$eq(value, J.$index$asx(t1, t2)))
+          continue;
+        t1 = this._notifyArgumentCount;
+        if (typeof t1 !== "number")
+          return t1.$ge();
+        if (t1 >= 2) {
+          if (oldValues == null)
+            oldValues = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          oldValues.$indexSet(0, t2, J.$index$asx(this._path_observer$_value, t2));
+        }
+        J.$indexSet$ax(this._path_observer$_value, t2, value);
+        changed = true;
+      }
+      if (!changed)
+        return false;
+      this._report$3(this._path_observer$_value, oldValues, t1);
+      return true;
+    },
+    _check$0: function() {
+      return this._check$1$skipChanges(false);
+    },
+    $isBindable: true
+  },
+  _ObserverSentinel: {
+    "^": "Object;"
+  },
+  _Observer: {
+    "^": "Bindable;_birthId<",
+    _notifyCallback$0: function() {
+      return this._notifyCallback.call$0();
+    },
+    _notifyCallback$1: function(arg0) {
+      return this._notifyCallback.call$1(arg0);
+    },
+    _notifyCallback$2: function(arg0, arg1) {
+      return this._notifyCallback.call$2(arg0, arg1);
+    },
+    _notifyCallback$3: function(arg0, arg1, arg2) {
+      return this._notifyCallback.call$3(arg0, arg1, arg2);
+    },
+    get$_isOpen: function() {
+      return this._notifyCallback != null;
+    },
+    open$1: function(_, callback) {
+      if (this._notifyCallback != null || this.get$_path_observer$_isClosed())
+        throw H.wrapException(P.StateError$("Observer has already been opened."));
+      if (X.minArgs(callback) > this.get$_reportArgumentCount())
+        throw H.wrapException(P.ArgumentError$("callback should take " + this.get$_reportArgumentCount() + " or fewer arguments"));
+      this._notifyCallback = callback;
+      this._notifyArgumentCount = P.min(this.get$_reportArgumentCount(), X.maxArgs(callback));
+      this._connect$0();
+      return this._path_observer$_value;
+    },
+    get$value: function(_) {
+      this._check$1$skipChanges(true);
+      return this._path_observer$_value;
+    },
+    close$0: function(_) {
+      if (this._notifyCallback == null)
+        return;
+      this._disconnect$0();
+      this._path_observer$_value = null;
+      this._notifyCallback = null;
+    },
+    _deliver$1: [function(_) {
+      if (this._notifyCallback != null)
+        this._dirtyCheck$0();
+    }, "call$1", "get$_deliver", 2, 0, 20, 14],
+    _dirtyCheck$0: function() {
+      var cycles = 0;
+      while (true) {
+        if (!(cycles < 1000 && this._check$0()))
+          break;
+        ++cycles;
+      }
+      return cycles > 0;
+    },
+    _report$3: function(newValue, oldValue, extraArg) {
+      var e, s, exception, t1;
+      try {
+        switch (this._notifyArgumentCount) {
+          case 0:
+            this._notifyCallback$0();
+            break;
+          case 1:
+            this._notifyCallback$1(newValue);
+            break;
+          case 2:
+            this._notifyCallback$2(newValue, oldValue);
+            break;
+          case 3:
+            this._notifyCallback$3(newValue, oldValue, extraArg);
+            break;
+        }
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2(e, s);
+      }
+
+    },
+    _report$2: function(newValue, oldValue) {
+      return this._report$3(newValue, oldValue, null);
+    }
+  },
+  _ObservedSet: {
+    "^": "Object;_rootObject,_path_observer$_observers,_objects,_toRemove,_resetNeeded",
+    open$1: function(_, obs) {
+      this._path_observer$_observers.$indexSet(0, obs.get$_birthId(), obs);
+      obs._iterateObjects$1(this.get$observe(this));
+    },
+    observe$1: [function(_, obj) {
+      var t1 = J.getInterceptor(obj);
+      if (!!t1.$isObservableList)
+        this._observeStream$1(obj.get$listChanges());
+      if (!!t1.$isObservable)
+        this._observeStream$1(t1.get$changes(obj));
+    }, "call$1", "get$observe", 2, 0, 159, 81],
+    _observeStream$1: function(stream) {
+      var t1, sub;
+      if (this._objects == null)
+        this._objects = P.HashMap_HashMap(null, null, null, null, null);
+      t1 = this._toRemove;
+      sub = t1 != null ? t1.remove$1(0, stream) : null;
+      if (sub != null)
+        this._objects.$indexSet(0, stream, sub);
+      else if (!this._objects.containsKey$1(stream))
+        this._objects.$indexSet(0, stream, stream.listen$1(this.get$_path_observer$_callback()));
+    },
+    reset$0: [function(_) {
+      var objs, t1, t2, t3, observer;
+      if (!this._resetNeeded)
+        return;
+      objs = this._toRemove;
+      if (objs == null)
+        objs = P.HashMap_HashMap(null, null, null, null, null);
+      this._toRemove = this._objects;
+      this._objects = objs;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t2 = t1._map, t3 = H.getTypeArgumentByIndex(t1, 1), t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterator(t2, H.setRuntimeTypeInfo([], [P._SplayTreeNode]), t2._modificationCount, t2._splayCount, null), [H.getTypeArgumentByIndex(t1, 0), t3]), t1._SplayTreeIterator$1(t2, t3); t1.moveNext$0();) {
+        observer = t1.get$current();
+        if (observer.get$_isOpen())
+          observer._iterateObjects$1(this.get$observe(this));
+      }
+      for (t1 = this._toRemove, t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        t1._current.cancel$0();
+      this._toRemove = null;
+    }, "call$0", "get$reset", 0, 0, 18],
+    _path_observer$_callback$1: [function(records) {
+      var t1, observer;
+      for (t1 = this._path_observer$_observers, t1 = H.setRuntimeTypeInfo(new P._SplayTreeValueIterable(t1), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]), t1 = P.List_List$from(t1, false, H.getRuntimeTypeArgument(t1, "IterableBase", 0)), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        observer = t1._current;
+        if (observer.get$_isOpen())
+          observer._check$0();
+      }
+      this._resetNeeded = true;
+      P.scheduleMicrotask(this.get$reset(this));
+    }, "call$1", "get$_path_observer$_callback", 2, 0, 20, 160],
+    static: {"^": "_ObservedSet__lastSet", _ObservedSet__ObservedSet: function(observer, rootObj) {
+        var t1, t2;
+        t1 = $._ObservedSet__lastSet;
+        if (t1 != null) {
+          t2 = t1._rootObject;
+          t2 = t2 == null ? rootObj != null : t2 !== rootObj;
+        } else
+          t2 = true;
+        if (t2) {
+          t1 = new L._ObservedSet(rootObj, P.SplayTreeMap$(null, null, null, null), null, null, false);
+          $._ObservedSet__lastSet = t1;
+        }
+        t1._path_observer$_observers.$indexSet(0, observer._birthId, observer);
+        observer._iterateObjects$1(t1.get$observe(t1));
+      }}
+  }
+}],
+["observe.src.to_observable", "package:observe/src/to_observable.dart", , R, {
+  "^": "",
+  _toObservableDeep: [function(value) {
+    var t1, result, t2;
+    t1 = J.getInterceptor(value);
+    if (!!t1.$isObservable)
+      return value;
+    if (!!t1.$isMap) {
+      result = V.ObservableMap_ObservableMap$createFromType(value, null, null);
+      t1.forEach$1(value, new R._toObservableDeep_closure(result));
+      return result;
+    }
+    if (!!t1.$isIterable) {
+      t1 = t1.map$1(value, R._toObservableDeep$closure());
+      t2 = Q.ObservableList$(null, null);
+      t2.addAll$1(0, t1);
+      return t2;
+    }
+    return value;
+  }, "call$1", "_toObservableDeep$closure", 2, 0, 13, 21],
+  _toObservableDeep_closure: {
+    "^": "Closure:75;result_0",
+    call$2: function(k, v) {
+      this.result_0.$indexSet(0, R._toObservableDeep(k), R._toObservableDeep(v));
+    },
+    $isFunction: true
+  }
+}],
+["polymer", "package:polymer/polymer.dart", , A, {
+  "^": "",
+  _shimShadowDomStyling: function(template, $name, extendee) {
+    if (template == null || $.get$_ShadowCss() == null)
+      return;
+    $.get$_ShadowCss().callMethod$2("shimStyling", [template, $name, extendee]);
+  },
+  _cssTextFromSheet: function(sheet) {
+    var href, e, t, t1, exception;
+    if (sheet == null)
+      return "";
+    if ($.deployMode)
+      return "";
+    t1 = J.getInterceptor$x(sheet);
+    href = t1.get$href(sheet);
+    if (J.$eq(href, ""))
+      href = t1.get$attributes(sheet)._html$_element.getAttribute("href");
+    try {
+      t1 = new XMLHttpRequest();
+      C.HttpRequest_methods.open$3$async(t1, "GET", href, false);
+      t1.send();
+      t1 = t1.responseText;
+      return t1;
+    } catch (exception) {
+      t1 = H.unwrapException(exception);
+      if (!!J.getInterceptor(t1).$isDomException) {
+        e = t1;
+        t = new H._StackTrace(exception, null);
+        $.get$_sheetLog().fine$1("failed to XHR stylesheet text href=\"" + H.S(href) + "\" error: " + H.S(e) + ", trace: " + H.S(t));
+        return "";
+      } else
+        throw exception;
+    }
+
+  },
+  _isObserverMethod: [function(symbol) {
+    var $name, t1;
+    $name = $.get$symbolConverter()._names.$index(0, symbol);
+    if ($name == null)
+      return false;
+    t1 = J.getInterceptor$s($name);
+    return t1.endsWith$1($name, "Changed") && !t1.$eq($name, "attributeChanged");
+  }, "call$1", "_isObserverMethod$closure", 2, 0, 62, 63],
+  Polymer_register: function($name, type) {
+    $.get$_typesByName().$indexSet(0, $name, type);
+    H.interceptedTypeCast(J.$index$asx($.get$context(), "Polymer"), "$isJsFunction").apply$1([$name]);
+  },
+  Polymer_applyStyleToScope: function(style, scope) {
+    var clone, attr, refNode, styleElement;
+    if (style == null)
+      return;
+    document;
+    if ($.get$_hasShadowDomPolyfill() === true)
+      scope = document.head;
+    clone = document.createElement("style", null);
+    J.set$text$x(clone, J.get$text$x(style));
+    attr = style.getAttribute("element");
+    if (attr != null)
+      clone.setAttribute("element", attr);
+    refNode = scope.firstChild;
+    if (scope === document.head) {
+      styleElement = W._FrozenElementList$_wrap(document.head.querySelectorAll("style[element]"), null);
+      if (styleElement.get$isNotEmpty(styleElement))
+        refNode = J.get$nextElementSibling$x(C.NodeList_methods.get$last(styleElement._nodeList));
+    }
+    scope.insertBefore(clone, refNode);
+  },
+  initPolymer: function() {
+    if ($.deployMode) {
+      A.startPolymer($.initializers, true);
+      return $.Zone__current;
+    }
+    var t1 = $.Zone__current.fork$1$specification(O.dirtyCheckZoneSpec());
+    t1.run$1(new A.initPolymer_closure());
+    return t1;
+  },
+  startPolymer: function(initializers, deployMode) {
+    var poly, t1;
+    if ($._startPolymerCalled)
+      throw H.wrapException("Initialization was already done.");
+    $._startPolymerCalled = true;
+    A._hookJsPolymer();
+    $._deployMode = deployMode;
+    if (initializers == null)
+      throw H.wrapException("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.Polymer_register("d-auto-binding", C.Type_s8b);
+    poly = document.createElement("polymer-element", null);
+    poly.setAttribute("name", "d-auto-binding");
+    poly.setAttribute("extends", "template");
+    J.$index$asx($.get$_polymerElementProto(), "init").apply$2$thisArg([], poly);
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(initializers, 74, 0, null), [H.getTypeArgumentByIndex(initializers, 0)]); t1.moveNext$0();)
+      t1._current.call$0();
+  },
+  _hookJsPolymer: function() {
+    var t1, polymerJs, zone, originalRegister;
+    t1 = $.get$context();
+    if (J.$index$asx(t1, "Platform") == null)
+      throw H.wrapException(P.StateError$("platform.js, dart_support.js must be loaded at the top of your application, before any other scripts or HTML imports that use polymer. Putting these two script tags at the top of your <head> element should address this issue: <script src=\"packages/web_components/platform.js\"></script> and  <script src=\"packages/web_components/dart_support.js\"></script>."));
+    polymerJs = J.$index$asx(t1, "Polymer");
+    if (polymerJs == null)
+      throw H.wrapException(P.StateError$("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."));
+    zone = $.Zone__current;
+    polymerJs.callMethod$2("whenPolymerReady", [zone.bindCallback$1(new A._hookJsPolymer_closure())]);
+    originalRegister = J.$index$asx($.get$_polymerElementProto(), "register");
+    if (originalRegister == null)
+      throw H.wrapException(P.StateError$("polymer.js must expose \"register\" function on polymer-element to enable polymer.dart to interoperate."));
+    J.$indexSet$ax($.get$_polymerElementProto(), "register", P.JsFunction_JsFunction$withThis(new A._hookJsPolymer_registerDart(zone, originalRegister)));
+  },
+  PolymerDeclaration: {
+    "^": "Object;element>,type>,superDeclaration<,name>,_polymer$_publish<,_publishLC<,_observe>,_instanceAttributes<,_reflect<,_sheets,_styles,syntax>,_eventDelegates<,_templateDelegates,_rootUri",
+    get$templateContent: function() {
+      var template, t1;
+      template = J.querySelector$1$x(this.element, "template");
+      if (template != null)
+        t1 = J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template));
+      else
+        t1 = null;
+      return t1;
+    },
+    registerType$1: function($name) {
+      var baseTag, decl, t1;
+      for (baseTag = null, decl = this; decl != null;) {
+        baseTag = J.get$attributes$x(J.get$element$x(decl))._html$_element.getAttribute("extends");
+        decl = decl.get$superDeclaration();
+      }
+      t1 = document;
+      W._registerCustomElement(window, t1, $name, this.type, baseTag);
+    },
+    resolveElementPaths$1: function(node) {
+      var t1 = $.get$_Platform();
+      if (t1 == null)
+        return;
+      J.$index$asx(t1, "urlResolver").callMethod$2("resolveDom", [node]);
+    },
+    publishAttributes$1: function(superDecl) {
+      var t1, t2, attrs, t3, attr, property, path, t4, decl;
+      if (superDecl != null) {
+        if (superDecl.get$_polymer$_publish() != null) {
+          t1 = superDecl.get$_polymer$_publish();
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._polymer$_publish = t2;
+        }
+        if (superDecl.get$_reflect() != null) {
+          t1 = superDecl.get$_reflect();
+          t2 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+          t2.addAll$1(0, t1);
+          this._reflect = t2;
+        }
+      }
+      t1 = this.type;
+      this._getPublishedProperties$1(t1);
+      attrs = J.get$attributes$x(this.element)._html$_element.getAttribute("attributes");
+      if (attrs != null)
+        for (t2 = C.JSString_methods.split$1(attrs, $.get$_ATTRIBUTES_REGEX()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]), t3 = this.name; t2.moveNext$0();) {
+          attr = J.trim$0$s(t2._current);
+          if (attr === "")
+            continue;
+          property = $.get$symbolConverter()._symbols.$index(0, attr);
+          path = L.PropertyPath_PropertyPath([property]);
+          t4 = this._polymer$_publish;
+          if (t4 != null && t4.containsKey$1(path))
+            continue;
+          decl = $.get$typeInspector().getDeclaration$2(t1, property);
+          if (decl == null || decl.kind === C.DeclarationKind_2 || decl.isFinal) {
+            window;
+            t4 = "property for attribute " + attr + " of polymer-element name=" + H.S(t3) + " not found.";
+            if (typeof console != "undefined")
+              console.warn(t4);
+            continue;
+          }
+          t4 = this._polymer$_publish;
+          if (t4 == null) {
+            t4 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            this._polymer$_publish = t4;
+          }
+          t4.$indexSet(0, path, decl);
+        }
+    },
+    _getPublishedProperties$1: function(type) {
+      var t1, decl, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, type, C.QueryOptions_sAl), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        t2 = J.getInterceptor$x(decl);
+        if (t2.get$isFinal(decl) === true)
+          continue;
+        t3 = this._polymer$_publish;
+        if (t3 == null) {
+          t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+          this._polymer$_publish = t3;
+        }
+        t3.$indexSet(0, L.PropertyPath_PropertyPath([t2.get$name(decl)]), decl);
+        t3 = new H.WhereIterable(decl.get$annotations(), new A.PolymerDeclaration__getPublishedProperties_closure());
+        t3.$builtinTypeInfo = [null];
+        if (t3.any$1(0, new A.PolymerDeclaration__getPublishedProperties_closure0())) {
+          t3 = this._reflect;
+          if (t3 == null) {
+            t3 = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+            this._reflect = t3;
+          }
+          t2 = t2.get$name(decl);
+          t3.add$1(0, $.get$symbolConverter()._names.$index(0, t2));
+        }
+      }
+    },
+    accumulateInstanceAttributes$0: function() {
+      var t1, t2;
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      this._instanceAttributes = t1;
+      t2 = this.superDeclaration;
+      if (t2 != null)
+        t1.addAll$1(0, t2.get$_instanceAttributes());
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_accumulateInstanceAttributes_closure(this));
+    },
+    addAttributeDelegates$1: function(delegates) {
+      J.get$attributes$x(this.element).forEach$1(0, new A.PolymerDeclaration_addAttributeDelegates_closure(delegates));
+    },
+    cacheSheets$0: function() {
+      var t1 = this.findNodes$1("link[rel=stylesheet]");
+      this._sheets = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    cacheStyles$0: function() {
+      var t1 = this.findNodes$1("style[polymer-scope]");
+      this._styles = t1;
+      for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.remove$0$ax(t1._current);
+    },
+    installLocalSheets$0: function() {
+      var t1, sheets, $content, cssText, t2, str, t3, style;
+      t1 = this._sheets;
+      t1.toString;
+      sheets = H.setRuntimeTypeInfo(new H.WhereIterable(t1, new A.PolymerDeclaration_installLocalSheets_closure()), [null]);
+      $content = this.get$templateContent();
+      if ($content != null) {
+        cssText = P.StringBuffer$("");
+        for (t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(sheets._iterable), sheets._f), [H.getTypeArgumentByIndex(sheets, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+          str = A._cssTextFromSheet(t2.get$current());
+          t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+          cssText._contents = t3 + "\n";
+        }
+        if (cssText._contents.length > 0) {
+          style = J.get$ownerDocument$x(this.element).createElement("style", null);
+          J.set$text$x(style, H.S(cssText));
+          t1 = J.getInterceptor$x($content);
+          t1.insertBefore$2($content, style, t1.get$firstChild($content));
+        }
+      }
+    },
+    findNodes$2: function(selector, matcher) {
+      var t1, nodes, $content;
+      t1 = J.querySelectorAll$1$x(this.element, selector);
+      nodes = t1.toList$0(t1);
+      $content = this.get$templateContent();
+      if ($content != null)
+        C.JSArray_methods.addAll$1(nodes, J.querySelectorAll$1$x($content, selector));
+      return nodes;
+    },
+    findNodes$1: function(selector) {
+      return this.findNodes$2(selector, null);
+    },
+    cssTextForScope$1: function(scopeDescriptor) {
+      var cssText, t1, t2, t3, str, t4;
+      cssText = P.StringBuffer$("");
+      t1 = new A.PolymerDeclaration_cssTextForScope_matcher("[polymer-scope=" + scopeDescriptor + "]");
+      for (t2 = this._sheets, t2.toString, t2 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t2 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t2._iterable), t2._f), [H.getTypeArgumentByIndex(t2, 0)]), t3 = t2._iterator; t2.moveNext$0();) {
+        str = A._cssTextFromSheet(t3.get$current());
+        t4 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t4 + "\n\n";
+      }
+      for (t2 = this._styles, t2.toString, t1 = H.setRuntimeTypeInfo(new H.WhereIterable(t2, t1), [null]), t1 = H.setRuntimeTypeInfo(new H.WhereIterator(J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0)]), t2 = t1._iterator; t1.moveNext$0();) {
+        str = J.get$text$x(t2.get$current());
+        t3 = cssText._contents += typeof str === "string" ? str : H.S(str);
+        cssText._contents = t3 + "\n\n";
+      }
+      return cssText._contents;
+    },
+    cssTextToScopeStyle$2: function(cssText, scopeDescriptor) {
+      var t1;
+      if (cssText === "")
+        return;
+      t1 = document.createElement("style", null);
+      J.set$text$x(t1, cssText);
+      t1.setAttribute("element", H.S(this.name) + "-" + scopeDescriptor);
+      return t1;
+    },
+    inferObservers$0: function() {
+      var t1, decl, t2, t3, $name;
+      for (t1 = $.get$_changedMethodQueryOptions(), t1 = $.get$typeInspector().query$2(0, this.type, t1), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        decl = t1._current;
+        if (this._observe == null)
+          this._observe = P.HashMap_HashMap(null, null, null, null, null);
+        t2 = J.getInterceptor$x(decl);
+        t3 = t2.get$name(decl);
+        $name = $.get$symbolConverter()._names.$index(0, t3);
+        t3 = J.getInterceptor$asx($name);
+        $name = t3.substring$2($name, 0, J.$sub$n(t3.get$length($name), 7));
+        this._observe.$indexSet(0, L.PropertyPath_PropertyPath($name), [t2.get$name(decl)]);
+      }
+    },
+    explodeObservers$0: function() {
+      var t1, t2, t3;
+      for (t1 = $.get$typeInspector().query$2(0, this.type, C.QueryOptions_xw8), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        t2 = t1._current.get$annotations();
+        t3 = new H.ListIterator(t2, t2.length, 0, null);
+        t3.$builtinTypeInfo = [H.getTypeArgumentByIndex(t2, 0)];
+        for (; t3.moveNext$0();)
+          continue;
+      }
+    },
+    _lowerCaseMap$1: function(properties) {
+      var map = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, null);
+      properties.forEach$1(0, new A.PolymerDeclaration__lowerCaseMap_closure(map));
+      return map;
+    },
+    $isPolymerDeclaration: true,
+    static: {"^": "PolymerDeclaration__polymerSyntax"}
+  },
+  PolymerDeclaration__getPublishedProperties_closure: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return !!J.getInterceptor(a).$isPublishedProperty;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__getPublishedProperties_closure0: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a.get$reflect();
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_accumulateInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      if (C.Map_EJn7R.containsKey$1($name) !== true && !J.startsWith$1$s($name, "on-"))
+        this.this_0._instanceAttributes.$indexSet(0, $name, value);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_addAttributeDelegates_closure: {
+    "^": "Closure:75;delegates_0",
+    call$2: function($name, value) {
+      var t1, start, end;
+      t1 = J.getInterceptor$s($name);
+      if (t1.startsWith$1($name, "on-")) {
+        start = J.getInterceptor$asx(value).indexOf$1(value, "{{");
+        end = C.JSString_methods.lastIndexOf$1(value, "}}");
+        if (start >= 0 && end >= 0)
+          this.delegates_0.$indexSet(0, t1.substring$1($name, 3), C.JSString_methods.trim$0(C.JSString_methods.substring$2(value, start + 2, end)));
+      }
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_installLocalSheets_closure: {
+    "^": "Closure:13;",
+    call$1: function(s) {
+      return J.get$attributes$x(s)._html$_element.hasAttribute("polymer-scope") !== true;
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_cssTextForScope_matcher: {
+    "^": "Closure:13;selector_0",
+    call$1: function(s) {
+      return J.matches$1$x(s, this.selector_0);
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration_explodeObservers_closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      return [];
+    },
+    $isFunction: true
+  },
+  PolymerDeclaration__lowerCaseMap_closure: {
+    "^": "Closure:161;map_0",
+    call$2: function(path, value) {
+      this.map_0.$indexSet(0, H.S(path).toLowerCase(), value);
+    },
+    $isFunction: true
+  },
+  PolymerExpressions: {
+    "^": "BindingDelegate_PolymerEventBindings;_delegate,_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      if (J.startsWith$1$s($name, "on-"))
+        return this.prepareEventBinding$3(path, $name, node);
+      return this._delegate.prepareBinding$3(path, $name, node);
+    }
+  },
+  BindingDelegate_PolymerEventBindings: {
+    "^": "BindingDelegate+PolymerEventBindings;"
+  },
+  PolymerEventBindings: {
+    "^": "Object;",
+    findController$1: function(node) {
+      var t1;
+      for (; t1 = J.getInterceptor$x(node), t1.get$parentNode(node) != null;) {
+        if (!!t1.$isPolymer && J.$index$asx(node.polymer$Polymer$_jsElem, "eventController") != null)
+          return J.$index$asx(t1.get$_jsElem(node), "eventController");
+        node = t1.get$parentNode(node);
+      }
+      return !!t1.$isShadowRoot ? node.host : null;
+    },
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new A.PolymerEventBindings_getEventHandler_closure(t1, this, target, method);
+    },
+    prepareEventBinding$3: function(path, $name, node) {
+      var t1, t2, eventType, translated;
+      t1 = {};
+      t2 = J.getInterceptor$s($name);
+      if (!t2.startsWith$1($name, "on-"))
+        return;
+      eventType = t2.substring$1($name, 3);
+      t1.eventType_0 = eventType;
+      translated = C.Map_AmMJ5.$index(0, eventType);
+      t1.eventType_0 = translated != null ? translated : t1.eventType_0;
+      return new A.PolymerEventBindings_prepareEventBinding_closure(t1, this, path);
+    }
+  },
+  PolymerEventBindings_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,target_2,method_3",
+    call$1: [function(e) {
+      var t1, t2, controller, detail;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1.findController$1(this.target_2);
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      if (!!J.getInterceptor(t2).$isPolymer) {
+        t2 = J.getInterceptor(e);
+        if (!!t2.$isCustomEvent) {
+          detail = t2.get$detail(e);
+          if (detail == null)
+            detail = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(e), "detail");
+        } else
+          detail = null;
+        t2 = t2.get$currentTarget(e);
+        t1 = t1.controller_0;
+        J.dispatchMethod$3$x(t1, t1, this.method_3, [e, detail, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + H.S(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  PolymerEventBindings_prepareEventBinding_closure: {
+    "^": "Closure:165;box_0,this_1,path_2",
+    call$3: [function(model, node, oneTime) {
+      var t1, handler, t2, sub;
+      t1 = this.path_2;
+      handler = this.this_1.getEventHandler$3(null, node, t1);
+      t2 = J.get$on$x(node).$index(0, this.box_0.eventType_0);
+      sub = H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(handler), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)]);
+      sub._tryResume$0();
+      if (oneTime === true)
+        return;
+      return new A._EventBindable(sub, t1);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  _EventBindable: {
+    "^": "Bindable;_sub,_polymer$_path",
+    get$value: function(_) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    open$1: function(_, callback) {
+      return "{{ " + this._polymer$_path + " }}";
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+    }
+  },
+  PublishedProperty: {
+    "^": "ObservableProperty;reflect<",
+    $isPublishedProperty: true
+  },
+  PolymerElement: {
+    "^": "HtmlElement_Polymer_ChangeNotifier;change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    PolymerElement$created$0: function(receiver) {
+      this.polymerCreated$0(receiver);
+    },
+    static: {PolymerElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.PolymerElement_methods.Element$created$0(receiver);
+        C.PolymerElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  HtmlElement_Polymer: {
+    "^": "HtmlElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  HtmlElement_Polymer_ChangeNotifier: {
+    "^": "HtmlElement_Polymer+ChangeNotifier;",
+    $isObservable: true
+  },
+  Polymer: {
+    "^": "Object;_jsElem:polymer$Polymer$_jsElem=",
+    get$element: function(receiver) {
+      return receiver.polymer$Polymer$_polymer$_element;
+    },
+    get$syntax: function(receiver) {
+      return;
+    },
+    get$_polymer$_name: function(receiver) {
+      var t1, isAttr;
+      t1 = receiver.polymer$Polymer$_polymer$_element;
+      if (t1 != null)
+        return J.get$name$x(t1);
+      isAttr = this.get$attributes(receiver)._html$_element.getAttribute("is");
+      return isAttr == null || isAttr === "" ? this.get$localName(receiver) : isAttr;
+    },
+    polymerCreated$0: function(receiver) {
+      var t, t1;
+      t = this.get$templateInstance(receiver);
+      if (t != null && t.model != null) {
+        window;
+        t1 = "Attributes on " + H.S(this.get$_polymer$_name(receiver)) + " were data bound prior to Polymer upgrading the element. This may result in incorrect binding types.";
+        if (typeof console != "undefined")
+          console.warn(t1);
+      }
+      this.prepareElement$0(receiver);
+      t1 = this.get$ownerDocument(receiver);
+      if (!J.$eq($.get$_isStagingDocument().$index(0, t1), true) || $.get$_hasShadowDomPolyfill() === true)
+        this.makeElementReady$0(receiver);
+    },
+    prepareElement$0: function(receiver) {
+      var t1, t2;
+      if (receiver.polymer$Polymer$_polymer$_element != null) {
+        window;
+        t1 = "Element already prepared: " + H.S(this.get$_polymer$_name(receiver));
+        if (typeof console != "undefined")
+          console.warn(t1);
+        return;
+      }
+      receiver.polymer$Polymer$_jsElem = P.JsObject_JsObject$fromBrowserObject(receiver);
+      t1 = this.get$_polymer$_name(receiver);
+      receiver.polymer$Polymer$_polymer$_element = $.get$_declarations().$index(0, t1);
+      this.createPropertyObserver$0(receiver);
+      t1 = receiver.polymer$Polymer$_propertyObserver;
+      if (t1 != null) {
+        t2 = this.get$notifyPropertyChanges(receiver);
+        t1.toString;
+        L._Observer.prototype.open$1.call(J.getInterceptor(t1), t1, t2);
+      }
+      if (receiver.polymer$Polymer$_polymer$_element.get$_polymer$_publish() != null)
+        this.get$changes(receiver).listen$1(this.get$_propertyChange(receiver));
+      this.copyInstanceAttributes$0(receiver);
+      this.takeAttributes$0(receiver);
+      this.addHostListeners$0(receiver);
+    },
+    makeElementReady$0: function(receiver) {
+      if (receiver.polymer$Polymer$_readied)
+        return;
+      receiver.polymer$Polymer$_readied = true;
+      this.parseDeclarations$1(receiver, receiver.polymer$Polymer$_polymer$_element);
+      this.get$attributes(receiver).remove$1(0, "unresolved");
+      this.ready$0(receiver);
+    },
+    ready$0: function(receiver) {
+    },
+    attached$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element == null)
+        throw H.wrapException(P.StateError$("polymerCreated was not called for custom element " + H.S(this.get$_polymer$_name(receiver)) + ", this should normally be done in the .created() if Polymer is used as a mixin."));
+      this.cancelUnbindAll$0(receiver);
+      if (!receiver.polymer$Polymer$_hasBeenAttached) {
+        receiver.polymer$Polymer$_hasBeenAttached = true;
+        this.async$1(receiver, new A.Polymer_attached_closure(receiver));
+      }
+    },
+    detached$0: function(receiver) {
+      this.asyncUnbindAll$0(receiver);
+    },
+    parseDeclarations$1: function(receiver, declaration) {
+      if (declaration != null) {
+        this.parseDeclarations$1(receiver, declaration.get$superDeclaration());
+        this.parseDeclaration$1(receiver, J.get$element$x(declaration));
+      }
+    },
+    parseDeclaration$1: function(receiver, elementElement) {
+      var t1, template, root, $name;
+      t1 = J.getInterceptor$x(elementElement);
+      template = t1.querySelector$1(elementElement, "template");
+      if (template != null) {
+        root = this.shadowFromTemplate$1(receiver, template);
+        $name = t1.get$attributes(elementElement)._html$_element.getAttribute("name");
+        if ($name == null)
+          return;
+        receiver.polymer$Polymer$shadowRoots.$indexSet(0, $name, root);
+      }
+    },
+    shadowFromTemplate$1: function(receiver, template) {
+      var root, syntax, t, dom, ext, t1;
+      if (template == null)
+        return;
+      root = this.createShadowRoot$0(receiver);
+      syntax = this.get$syntax(receiver);
+      t = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+      dom = J.createInstance$2$x(t, receiver, syntax == null && J.get$bindingDelegate$x(t) == null ? J.get$syntax$x(receiver.polymer$Polymer$_polymer$_element) : syntax);
+      ext = $.get$_instanceExtension().$index(0, dom);
+      t1 = ext != null ? ext.get$_bindings() : ext;
+      receiver.polymer$Polymer$_observers.push(t1);
+      root.appendChild(dom);
+      this.marshalNodeReferences$1(receiver, root);
+      t1 = $.get$_PolymerGestures();
+      if (t1 != null)
+        t1.callMethod$2("register", [root]);
+      return root;
+    },
+    marshalNodeReferences$1: function(receiver, root) {
+      var t1, t2, n;
+      if (root == null)
+        return;
+      for (t1 = J.querySelectorAll$1$x(root, "[id]"), t1 = t1.get$iterator(t1), t2 = receiver.polymer$Polymer$$; t1.moveNext$0();) {
+        n = t1._current;
+        t2.$indexSet(0, J.get$id$x(n), n);
+      }
+    },
+    attributeChanged$3: function(receiver, $name, oldValue, newValue) {
+      var t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "class") && !t1.$eq($name, "style"))
+        this.attributeToProperty$2(receiver, $name, newValue);
+    },
+    copyInstanceAttributes$0: function(receiver) {
+      receiver.polymer$Polymer$_polymer$_element.get$_instanceAttributes().forEach$1(0, new A.Polymer_copyInstanceAttributes_closure(receiver));
+    },
+    takeAttributes$0: function(receiver) {
+      if (receiver.polymer$Polymer$_polymer$_element.get$_publishLC() == null)
+        return;
+      this.get$attributes(receiver).forEach$1(0, this.get$attributeToProperty(receiver));
+    },
+    attributeToProperty$2: [function(receiver, $name, value) {
+      var decl, t1, t2, currentValue, type, newValue;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return;
+      if (value == null || J.contains$1$asx(value, $.get$Polymer_bindPattern()) === true)
+        return;
+      t1 = J.getInterceptor$x(decl);
+      t2 = t1.get$name(decl);
+      currentValue = $.get$objectAccessor().read$2(receiver, t2);
+      type = t1.get$type(decl);
+      t2 = J.getInterceptor(type);
+      newValue = Z.deserializeValue(value, currentValue, (t2.$eq(type, C.Type_HqF) || t2.$eq(type, C.Type_dynamic)) && currentValue != null ? J.get$runtimeType$(currentValue) : type);
+      if (newValue == null ? currentValue != null : newValue !== currentValue) {
+        t1 = t1.get$name(decl);
+        $.get$objectAccessor().write$3(receiver, t1, newValue);
+      }
+    }, "call$2", "get$attributeToProperty", 4, 0, 166],
+    propertyForAttribute$1: function(receiver, $name) {
+      var publishLC = receiver.polymer$Polymer$_polymer$_element.get$_publishLC();
+      if (publishLC == null)
+        return;
+      return publishLC.$index(0, $name);
+    },
+    serializeValue$1: function(receiver, value) {
+      if (value == null)
+        return;
+      if (typeof value === "boolean")
+        return value ? "" : null;
+      else if (typeof value === "string" || typeof value === "number")
+        return H.S(value);
+      return;
+    },
+    reflectPropertyToAttribute$1: function(receiver, path) {
+      var propValue, serializedValue, t1;
+      propValue = L.PropertyPath_PropertyPath(path).getValueFrom$1(receiver);
+      serializedValue = this.serializeValue$1(receiver, propValue);
+      if (serializedValue != null)
+        this.get$attributes(receiver)._html$_element.setAttribute(path, serializedValue);
+      else if (typeof propValue === "boolean") {
+        t1 = this.get$attributes(receiver)._html$_element;
+        t1.getAttribute(path);
+        t1.removeAttribute(path);
+      }
+    },
+    bind$3$oneTime: function(receiver, $name, bindable, oneTime) {
+      var decl, t1, t2, t3, observer, reflect, propName;
+      decl = this.propertyForAttribute$1(receiver, $name);
+      if (decl == null)
+        return J.bind$3$oneTime$x(M.nodeBindFallback(receiver), $name, bindable, oneTime);
+      else {
+        t1 = J.getInterceptor$x(decl);
+        t2 = t1.get$name(decl);
+        t3 = $.get$_bindLog();
+        if (t3.isLoggable$1(C.Level_FINE_500))
+          t3.fine$1("bindProperty: [" + H.S(bindable) + "] to [" + H.S(this.get$_polymer$_name(receiver)) + "].[" + H.S(t2) + "]");
+        t3 = J.getInterceptor$x(bindable);
+        if (t3.get$value(bindable) == null)
+          t3.set$value(bindable, $.get$objectAccessor().read$2(receiver, t2));
+        observer = new A._PolymerBinding(receiver, t2, bindable, null, null);
+        observer._sub = this.get$changes(receiver).listen$1(observer.get$_propertyValueChanged());
+        t3 = J.open$1$x(bindable, observer.get$_updateNode());
+        observer._lastValue = t3;
+        $.get$objectAccessor().write$3(receiver, t2, t3);
+        if ($.enableBindingsReflection && true) {
+          if (J.get$bindings$x(M.nodeBindFallback(receiver)) == null) {
+            t2 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+            J.set$bindings$x(M.nodeBindFallback(receiver), t2);
+          }
+          J.$indexSet$ax(J.get$bindings$x(M.nodeBindFallback(receiver)), $name, observer);
+        }
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        t1 = t1.get$name(decl);
+        propName = $.get$symbolConverter()._names.$index(0, t1);
+        if (reflect != null && reflect.contains$1(0, propName))
+          this.reflectPropertyToAttribute$1(receiver, propName);
+        return observer;
+      }
+    },
+    bindFinished$0: function(receiver) {
+      return this.makeElementReady$0(receiver);
+    },
+    get$bindings: function(receiver) {
+      return J.get$bindings$x(M.nodeBindFallback(receiver));
+    },
+    set$bindings: function(receiver, value) {
+      J.set$bindings$x(M.nodeBindFallback(receiver), value);
+    },
+    get$templateInstance: function(receiver) {
+      return J.get$templateInstance$x(M.nodeBindFallback(receiver));
+    },
+    asyncUnbindAll$0: function(receiver) {
+      var job, t1;
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] asyncUnbindAll");
+      job = receiver.polymer$Polymer$_unbindAllJob;
+      t1 = this.get$unbindAll(receiver);
+      if (job == null)
+        job = new A.PolymerJob(null, null, null);
+      job.start$2(0, t1, null);
+      receiver.polymer$Polymer$_unbindAllJob = job;
+    },
+    unbindAll$0: [function(receiver) {
+      if (receiver.polymer$Polymer$_unbound === true)
+        return;
+      H.IterableMixinWorkaround_forEach(receiver.polymer$Polymer$_observers, this.get$closeObserverList(receiver));
+      receiver.polymer$Polymer$_observers = [];
+      this.closeNamedObservers$0(receiver);
+      receiver.polymer$Polymer$_unbound = true;
+    }, "call$0", "get$unbindAll", 0, 0, 18],
+    cancelUnbindAll$0: function(receiver) {
+      var t1;
+      if (receiver.polymer$Polymer$_unbound === true) {
+        $.get$_unbindLog().warning$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] already unbound, cannot cancel unbindAll");
+        return;
+      }
+      $.get$_unbindLog().fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] cancelUnbindAll");
+      t1 = receiver.polymer$Polymer$_unbindAllJob;
+      if (t1 != null) {
+        t1.stop$0(0);
+        receiver.polymer$Polymer$_unbindAllJob = null;
+      }
+    },
+    createPropertyObserver$0: function(receiver) {
+      var observe, t1, o, t2, path;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe != null) {
+        t1 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t1 + 1;
+        o = new L.CompoundObserver(null, [], t1, null, null, null);
+        o._path_observer$_value = [];
+        receiver.polymer$Polymer$_propertyObserver = o;
+        receiver.polymer$Polymer$_observers.push([o]);
+        for (t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterable(observe), [H.getTypeArgumentByIndex(observe, 0)]), t2 = t1._map, t1 = H.setRuntimeTypeInfo(new P.HashMapKeyIterator(t2, t2._computeKeys$0(), 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+          path = t1._collection$_current;
+          o.addPath$2(receiver, path);
+          this.observeArrayValue$3(receiver, path, path.getValueFrom$1(receiver), null);
+        }
+      }
+    },
+    notifyPropertyChanges$3: [function(receiver, newValues, oldValues, paths) {
+      J.forEach$1$ax(oldValues, new A.Polymer_notifyPropertyChanges_closure(receiver, newValues, oldValues, paths, J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element), P.HashSet_HashSet(null, null, null, null)));
+    }, "call$3", "get$notifyPropertyChanges", 6, 0, 167],
+    _propertyChange$1: [function(receiver, records) {
+      var t1, record, t2, $name, reflect;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!J.getInterceptor(record).$isPropertyChangeRecord)
+          continue;
+        t2 = record.name;
+        $name = $.get$symbolConverter()._names.$index(0, t2);
+        reflect = receiver.polymer$Polymer$_polymer$_element.get$_reflect();
+        if (reflect != null && reflect.contains$1(0, $name))
+          this.reflectPropertyToAttribute$1(receiver, $name);
+      }
+    }, "call$1", "get$_propertyChange", 2, 0, 168, 160],
+    observeArrayValue$3: function(receiver, $name, value, old) {
+      var observe, callbacks, t1, subscription, t2;
+      observe = J.get$_observe$x(receiver.polymer$Polymer$_polymer$_element);
+      if (observe == null)
+        return;
+      callbacks = observe.$index(0, $name);
+      if (callbacks == null)
+        return;
+      if (!!J.getInterceptor(old).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: unregister " + H.S($name));
+        this.closeNamedObserver$1(receiver, H.S($name) + "__array");
+      }
+      if (!!J.getInterceptor(value).$isObservableList) {
+        t1 = $.get$_observeLog();
+        if (t1.isLoggable$1(C.Level_FINE_500))
+          t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] observeArrayValue: register " + H.S($name));
+        subscription = value.get$listChanges()._createSubscription$1(false);
+        subscription.onData$1(new A.Polymer_observeArrayValue_closure(receiver, old, callbacks));
+        subscription.onError$1(0, null);
+        subscription.onDone$1(null);
+        t1 = H.S($name) + "__array";
+        t2 = receiver.polymer$Polymer$_namedObservers;
+        if (t2 == null) {
+          t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.StreamSubscription);
+          receiver.polymer$Polymer$_namedObservers = t2;
+        }
+        t2.$indexSet(0, t1, subscription);
+      }
+    },
+    closeObserverList$1: [function(receiver, observers) {
+      var t1, o;
+      for (t1 = J.get$iterator$ax(observers); t1.moveNext$0();) {
+        o = t1.get$current();
+        if (o != null)
+          J.close$0$x(o);
+      }
+    }, "call$1", "get$closeObserverList", 2, 0, 169],
+    closeNamedObserver$1: function(receiver, $name) {
+      var sub = receiver.polymer$Polymer$_namedObservers.remove$1(0, $name);
+      if (sub == null)
+        return false;
+      sub.cancel$0();
+      return true;
+    },
+    closeNamedObservers$0: function(receiver) {
+      var t1, sub;
+      t1 = receiver.polymer$Polymer$_namedObservers;
+      if (t1 == null)
+        return;
+      for (t1 = t1.get$values(t1), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();) {
+        sub = t1._current;
+        if (sub != null)
+          sub.cancel$0();
+      }
+      receiver.polymer$Polymer$_namedObservers.clear$0(0);
+      receiver.polymer$Polymer$_namedObservers = null;
+    },
+    addHostListeners$0: function(receiver) {
+      var events, t1;
+      events = receiver.polymer$Polymer$_polymer$_element.get$_eventDelegates();
+      if (events.get$isEmpty(events))
+        return;
+      t1 = $.get$_eventsLog();
+      if (t1.isLoggable$1(C.Level_FINE_500))
+        t1.fine$1("[" + H.S(this.get$_polymer$_name(receiver)) + "] addHostListeners: " + events.toString$0(0));
+      events.forEach$1(0, new A.Polymer_addHostListeners_closure(receiver));
+    },
+    dispatchMethod$3: function(receiver, object, callbackOrMethod, args) {
+      var t1, log, maxArgs, t2;
+      t1 = $.get$_eventsLog();
+      log = t1.isLoggable$1(C.Level_FINE_500);
+      if (log)
+        t1.fine$1(">>> [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+      if (!!J.getInterceptor(callbackOrMethod).$isFunction) {
+        maxArgs = X.maxArgs(callbackOrMethod);
+        if (maxArgs === -1)
+          t1.warning$1("invalid callback: expected callback of 0, 1, 2, or 3 arguments");
+        C.JSArray_methods.set$length(args, maxArgs);
+        H.Primitives_applyFunction(callbackOrMethod, args, P.Function__toMangledNames(null));
+      } else if (typeof callbackOrMethod === "string") {
+        t2 = $.get$symbolConverter()._symbols.$index(0, callbackOrMethod);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(object, t2, args, true, null);
+      } else
+        t1.warning$1("invalid callback");
+      if (log)
+        t1.info$1("<<< [" + H.S(this.get$_polymer$_name(receiver)) + "]: dispatch " + H.S(callbackOrMethod));
+    },
+    async$1: function(receiver, method) {
+      var t1;
+      P.scheduleMicrotask(F.Observable_dirtyCheck$closure());
+      $.get$_Platform().callMethod$1("flush");
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      return C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(method));
+    },
+    fire$5$canBubble$cancelable$detail$onNode: function(receiver, type, canBubble, cancelable, detail, onNode) {
+      var $event = W.CustomEvent_CustomEvent(type, true, true, detail);
+      this.dispatchEvent$1(receiver, $event);
+      return $event;
+    },
+    fire$1: function($receiver, type) {
+      return this.fire$5$canBubble$cancelable$detail$onNode($receiver, type, null, null, null, null);
+    },
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  Polymer_attached_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function($name, value) {
+      var t1 = J.get$attributes$x(this.this_0);
+      if (t1.containsKey$1($name) !== true)
+        t1.$indexSet(0, $name, new A.Polymer_copyInstanceAttributes__closure(value).call$0());
+      t1.$index(0, $name);
+    },
+    $isFunction: true
+  },
+  Polymer_copyInstanceAttributes__closure: {
+    "^": "Closure:69;value_1",
+    call$0: function() {
+      return this.value_1;
+    },
+    $isFunction: true
+  },
+  Polymer_notifyPropertyChanges_closure: {
+    "^": "Closure:75;this_0,newValues_1,oldValues_2,paths_3,observe_4,called_5",
+    call$2: [function(i, oldValue) {
+      var t1, newValue, t2, t3, path, methods, t4, t5, t6, t7, method;
+      t1 = this.newValues_1;
+      newValue = J.$index$asx(t1, i);
+      t2 = this.paths_3;
+      if (typeof i !== "number")
+        return H.iae(i);
+      t3 = 2 * i + 1;
+      if (t3 >>> 0 !== t3 || t3 >= t2.length)
+        return H.ioore(t2, t3);
+      path = t2[t3];
+      t3 = this.observe_4;
+      if (t3 == null)
+        return;
+      methods = t3.$index(0, path);
+      if (methods == null)
+        return;
+      for (t3 = J.get$iterator$ax(methods), t4 = this.this_0, t5 = J.getInterceptor$x(t4), t6 = this.oldValues_2, t7 = this.called_5; t3.moveNext$0();) {
+        method = t3.get$current();
+        if (!t7.add$1(0, method))
+          continue;
+        t5.observeArrayValue$3(t4, path, newValue, oldValue);
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t4, method, [oldValue, newValue, t1, t6, t2], true, null);
+      }
+    }, "call$2", null, 4, 0, null, 82, 57, "call"],
+    $isFunction: true
+  },
+  Polymer_observeArrayValue_closure: {
+    "^": "Closure:13;this_0,old_1,callbacks_2",
+    call$1: [function(changes) {
+      var t1, t2, t3, callback;
+      for (t1 = J.get$iterator$ax(this.callbacks_2), t2 = this.this_0, t3 = this.old_1; t1.moveNext$0();) {
+        callback = t1.get$current();
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t2, callback, [t3], true, null);
+      }
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  Polymer_addHostListeners_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(type, methodName) {
+      var t1 = this.this_0;
+      J.addEventListener$2$x(t1, type, J.get$syntax$x(t1.polymer$Polymer$_polymer$_element).getEventHandler$3(t1, t1, methodName));
+    },
+    $isFunction: true
+  },
+  _PolymerBinding: {
+    "^": "Bindable;_polymer$_target,_property,_polymer$_bindable,_sub,_lastValue",
+    _updateNode$1: [function(newValue) {
+      this._lastValue = newValue;
+      $.get$objectAccessor().write$3(this._polymer$_target, this._property, newValue);
+    }, "call$1", "get$_updateNode", 2, 0, 20, 58],
+    _propertyValueChanged$1: [function(records) {
+      var t1, t2, record, getter, newValue;
+      for (t1 = J.get$iterator$ax(records), t2 = this._property; t1.moveNext$0();) {
+        record = t1.get$current();
+        if (!!J.getInterceptor(record).$isPropertyChangeRecord && J.$eq(record.name, t2)) {
+          t1 = this._polymer$_target;
+          getter = $.get$objectAccessor()._getters.$index(0, t2);
+          if (getter == null)
+            H.throwExpression(O.MissingCodeException$("getter \"" + H.S(t2) + "\" in " + J.toString$0(t1)));
+          newValue = getter.call$1(t1);
+          t1 = this._lastValue;
+          if (t1 == null ? newValue != null : t1 !== newValue)
+            J.set$value$x(this._polymer$_bindable, newValue);
+          return;
+        }
+      }
+    }, "call$1", "get$_propertyValueChanged", 2, 0, 168, 160],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._polymer$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._polymer$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._polymer$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._sub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._sub = null;
+      }
+      J.close$0$x(this._polymer$_bindable);
+    }
+  },
+  PolymerJob: {
+    "^": "Object;_callback,_timer,_polymer$_id",
+    _callback$0: function() {
+      return this._callback.call$0();
+    },
+    start$2: function(_, callback, wait) {
+      var t1;
+      this.stop$0(0);
+      this._callback = callback;
+      t1 = window;
+      C.Window_methods._ensureRequestAnimationFrame$0(t1);
+      this._polymer$_id = C.Window_methods._requestAnimationFrame$1(t1, W._wrapZone(new A.PolymerJob_start_closure(this)));
+    },
+    stop$0: function(_) {
+      var t1, t2;
+      t1 = this._polymer$_id;
+      if (t1 != null) {
+        t2 = window;
+        C.Window_methods._ensureRequestAnimationFrame$0(t2);
+        t2.cancelAnimationFrame(t1);
+        this._polymer$_id = null;
+      }
+      t1 = this._timer;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._timer = null;
+      }
+    }
+  },
+  PolymerJob_start_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (t1._timer != null || t1._polymer$_id != null) {
+        t1.stop$0(0);
+        t1._callback$0();
+      }
+      return;
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  initPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      return A.startPolymer($.initializers, $.deployMode);
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_closure: {
+    "^": "Closure:69;",
+    call$0: [function() {
+      var t1 = $.get$Polymer__onReady().future;
+      if (t1._state !== 0)
+        H.throwExpression(P.StateError$("Future already completed"));
+      t1._asyncComplete$1(null);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart: {
+    "^": "Closure:173;zone_0,originalRegister_1",
+    call$3: [function(jsElem, $name, extendee) {
+      var type = $.get$_typesByName().$index(0, $name);
+      if (type != null)
+        return this.zone_0.run$1(new A._hookJsPolymer_registerDart_closure(jsElem, $name, type, $.get$_declarations().$index(0, extendee)));
+      return this.originalRegister_1.apply$2$thisArg([$name, extendee], jsElem);
+    }, "call$3", null, 6, 0, null, 171, 56, 172, "call"],
+    $isFunction: true
+  },
+  _hookJsPolymer_registerDart_closure: {
+    "^": "Closure:69;jsElem_2,name_3,type_4,extendsDecl_5",
+    call$0: [function() {
+      var t1, t2, t3, t4, t5, t6, t7, t8, t9, assetPath, base, targetScheme, targetUserInfo, targetHost, targetPort, targetPath, targetQuery;
+      t1 = this.jsElem_2;
+      t2 = this.name_3;
+      t3 = this.type_4;
+      t4 = this.extendsDecl_5;
+      t5 = $.get$PolymerDeclaration__polymerSyntax();
+      t6 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      t7 = new A.PolymerDeclaration(t1, t3, t4, t2, null, null, null, null, null, null, null, t5, t6, null, null);
+      $.get$_declarations().$indexSet(0, t2, t7);
+      t7.publishAttributes$1(t4);
+      t8 = t7._polymer$_publish;
+      if (t8 != null)
+        t7._publishLC = t7._lowerCaseMap$1(t8);
+      t7.inferObservers$0();
+      t7.explodeObservers$0();
+      t8 = J.getInterceptor$x(t1);
+      t9 = t8.querySelector$1(t1, "template");
+      if (t9 != null)
+        J.set$bindingDelegate$x(!!J.getInterceptor(t9).$isNodeBindExtension ? t9 : M.nodeBindFallback(t9), t5);
+      t7.cacheSheets$0();
+      t7.cacheStyles$0();
+      t7.installLocalSheets$0();
+      A.Polymer_applyStyleToScope(t7.cssTextToScopeStyle$2(t7.cssTextForScope$1("global"), "global"), document.head);
+      t7.resolveElementPaths$1(t1);
+      t7.accumulateInstanceAttributes$0();
+      t7.addAttributeDelegates$1(t6);
+      assetPath = t8.get$attributes(t1)._html$_element.getAttribute("assetpath");
+      if (assetPath == null)
+        assetPath = "";
+      base = P.Uri_parse(t8.get$ownerDocument(t1).baseURI);
+      t1 = P.Uri_parse(assetPath);
+      targetScheme = t1.scheme;
+      if (targetScheme !== "") {
+        targetUserInfo = t1.userInfo;
+        targetHost = t1.get$host(t1);
+        targetPort = t1.get$port(t1);
+        targetPath = base._removeDotSegments$1(t1._path);
+        targetQuery = t1.query;
+      } else {
+        if (t1.get$host(t1) !== "") {
+          targetUserInfo = t1.userInfo;
+          targetHost = t1.get$host(t1);
+          targetPort = t1.get$port(t1);
+          targetPath = base._removeDotSegments$1(t1._path);
+          targetQuery = t1.query;
+        } else {
+          t5 = t1._path;
+          if (t5 === "") {
+            targetPath = base._path;
+            targetQuery = t1.query;
+            targetQuery = targetQuery !== "" ? targetQuery : base.query;
+          } else {
+            t5 = J.startsWith$1$s(t5, "/");
+            t6 = t1._path;
+            targetPath = t5 ? base._removeDotSegments$1(t6) : base._removeDotSegments$1(base._merge$2(base._path, t6));
+            targetQuery = t1.query;
+          }
+          targetUserInfo = base.userInfo;
+          targetHost = base.get$host(base);
+          targetPort = base.get$port(base);
+        }
+        targetScheme = base.scheme;
+      }
+      t7._rootUri = P.Uri$(t1.fragment, targetHost, targetPath, null, targetPort, targetQuery, null, targetScheme, targetUserInfo);
+      t1 = t7.get$templateContent();
+      A._shimShadowDomStyling(t1, t2, t4 != null ? J.get$name$x(t4) : null);
+      if ($.get$typeInspector().hasStaticMethod$2(t3, C.Symbol_registerCallback))
+        $.get$objectAccessor().invoke$5$adjust$namedArgs(t3, C.Symbol_registerCallback, [t7], false, null);
+      t7.registerType$1(t2);
+      return;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  closure: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var proto = J.$index$asx(P.JsObject_JsObject$fromBrowserObject(document.createElement("polymer-element", null)), "__proto__");
+      return !!J.getInterceptor(proto).$isNode ? P.JsObject_JsObject$fromBrowserObject(proto) : proto;
+    },
+    $isFunction: true
+  }
+}],
+["polymer.auto_binding", "package:polymer/auto_binding.dart", , Y, {
+  "^": "",
+  AutoBindingElement: {
+    "^": "TemplateElement_Polymer_Observable;_auto_binding$_self,observable$Observable$_observable$_changes,observable$Observable$_values,observable$Observable$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$model: function(receiver) {
+      return J.get$model$x(receiver._auto_binding$_self);
+    },
+    get$bindingDelegate: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    set$bindingDelegate: function(receiver, value) {
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, value);
+    },
+    clear$0: function(receiver) {
+      return J.clear$0$ax(receiver._auto_binding$_self);
+    },
+    get$syntax: function(receiver) {
+      return J.get$bindingDelegate$x(receiver._auto_binding$_self);
+    },
+    createInstance$2: function(receiver, model, delegate) {
+      return J.createInstance$2$x(receiver._auto_binding$_self, model, delegate);
+    },
+    AutoBindingElement$created$0: function(receiver) {
+      var t1;
+      this.polymerCreated$0(receiver);
+      receiver._auto_binding$_self = M.nodeBindFallback(receiver);
+      t1 = T.PolymerExpressions$(null, C.C_ScopeFactory);
+      J.set$bindingDelegate$x(receiver._auto_binding$_self, new Y._AutoBindingSyntax(receiver, t1, null));
+      $.get$Polymer__onReady().future.then$1(new Y.AutoBindingElement$created_closure(receiver));
+    },
+    $isTemplateBindExtension: true,
+    $isNodeBindExtension: true,
+    static: {AutoBindingElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.AutoBindingElement_methods.Element$created$0(receiver);
+        C.AutoBindingElement_methods.AutoBindingElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  TemplateElement_Polymer: {
+    "^": "TemplateElement+Polymer;_jsElem:polymer$Polymer$_jsElem=",
+    $isPolymer: true,
+    $isNodeBindExtension: true,
+    $isObservable: true,
+    $isElement: true,
+    $isEventTarget: true,
+    $isNode: true
+  },
+  TemplateElement_Polymer_Observable: {
+    "^": "TemplateElement_Polymer+Observable;_observable$_changes:observable$Observable$_observable$_changes%,_values:observable$Observable$_values%,_records:observable$Observable$_records%",
+    $isObservable: true
+  },
+  AutoBindingElement$created_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      t1.setAttribute("bind", "");
+      J.async$1$x(t1, new Y.AutoBindingElement$created__closure(t1));
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  AutoBindingElement$created__closure: {
+    "^": "Closure:13;this_1",
+    call$1: [function(_) {
+      var t1, t2;
+      t1 = this.this_1;
+      t2 = J.getInterceptor$x(t1);
+      t2.marshalNodeReferences$1(t1, t1.parentNode);
+      t2.fire$1(t1, "template-bound");
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  _AutoBindingSyntax: {
+    "^": "PolymerExpressions;_auto_binding$_node,_delegate,_bindingMaps",
+    getEventHandler$3: function(controller, target, method) {
+      var t1 = {};
+      t1.controller_0 = controller;
+      return new Y._AutoBindingSyntax_getEventHandler_closure(t1, this, method);
+    }
+  },
+  _AutoBindingSyntax_getEventHandler_closure: {
+    "^": "Closure:13;box_0,this_1,method_2",
+    call$1: [function(e) {
+      var t1, t2, controller, t3, obj, t4;
+      t1 = this.box_0;
+      t2 = t1.controller_0;
+      if (t2 == null || !J.getInterceptor(t2).$isPolymer) {
+        controller = this.this_1._auto_binding$_node;
+        t1.controller_0 = controller;
+        t2 = controller;
+      }
+      t3 = J.getInterceptor(t2);
+      if (!!t3.$isPolymer) {
+        t2 = J.getInterceptor$x(e);
+        t3 = t2.get$detail(e);
+        t2 = t2.get$currentTarget(e);
+        obj = t1.controller_0;
+        t4 = this.this_1._auto_binding$_node;
+        if (obj === t4)
+          obj = J.get$model$x(t4._auto_binding$_self);
+        J.dispatchMethod$3$x(t1.controller_0, obj, this.method_2, [e, t3, t2]);
+      } else
+        throw H.wrapException(P.StateError$("controller " + t3.toString$0(t2) + " is not a Dart polymer-element."));
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  }
+}],
+["polymer.deserialize", "package:polymer/deserialize.dart", , Z, {
+  "^": "",
+  deserializeValue: function(value, currentValue, type) {
+    var handler, t1, exception;
+    handler = $.get$_typeHandlers().$index(0, type);
+    if (handler != null)
+      return handler.call$2(value, currentValue);
+    try {
+      t1 = C.JsonCodec_null_null.decode$1(J.replaceAll$2$s(value, "'", "\""));
+      return t1;
+    } catch (exception) {
+      H.unwrapException(exception);
+      return value;
+    }
+
+  },
+  closure0: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure1: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return x;
+    },
+    $isFunction: true
+  },
+  closure2: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      var t1, exception;
+      try {
+        t1 = P.DateTime_parse(x);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return def;
+      }
+
+    },
+    $isFunction: true
+  },
+  closure3: {
+    "^": "Closure:75;",
+    call$2: function(x, _) {
+      return !J.$eq(x, "false");
+    },
+    $isFunction: true
+  },
+  closure4: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseInt(x, null, new Z._closure0(def));
+    },
+    $isFunction: true
+  },
+  _closure0: {
+    "^": "Closure:13;def_0",
+    call$1: function(_) {
+      return this.def_0;
+    },
+    $isFunction: true
+  },
+  closure5: {
+    "^": "Closure:75;",
+    call$2: function(x, def) {
+      return H.Primitives_parseDouble(x, new Z._closure(def));
+    },
+    $isFunction: true
+  },
+  _closure: {
+    "^": "Closure:13;def_1",
+    call$1: function(_) {
+      return this.def_1;
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions", "package:polymer_expressions/polymer_expressions.dart", , T, {
+  "^": "",
+  _classAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.where$1$ax(v.get$keys(), new T._classAttributeConverter_closure(v)).join$1(0, " ");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, " ") : v;
+    return t1;
+  }, "call$1", "_classAttributeConverter$closure", 2, 0, 49, 64],
+  _styleAttributeConverter: [function(v) {
+    var t1 = J.getInterceptor(v);
+    if (!!t1.$isMap)
+      t1 = J.map$1$ax(v.get$keys(), new T._styleAttributeConverter_closure(v)).join$1(0, ";");
+    else
+      t1 = !!t1.$isIterable ? t1.join$1(v, ";") : v;
+    return t1;
+  }, "call$1", "_styleAttributeConverter$closure", 2, 0, 49, 64],
+  _identity: [function(x) {
+    return x;
+  }, "call$1", "_identity$closure", 2, 0, 13, 65],
+  _classAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: function(k) {
+      return J.$eq(this.v_0.$index(0, k), true);
+    },
+    $isFunction: true
+  },
+  _styleAttributeConverter_closure: {
+    "^": "Closure:13;v_0",
+    call$1: [function(k) {
+      return H.S(k) + ": " + H.S(this.v_0.$index(0, k));
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions0: {
+    "^": "BindingDelegate;_scopeFactory,globals,_scopes,_scopeIdents,_bindingMaps",
+    prepareBinding$3: function(path, $name, boundNode) {
+      var t1, t2, t3, expr;
+      t1 = {};
+      t2 = new Y.Tokenizer(H.setRuntimeTypeInfo([], [Y.Token]), P.StringBuffer$(""), new P.RuneIterator(path, 0, 0, null), null);
+      t3 = new U.AstFactory();
+      t3 = new T.Parser(t3, t2, null, null);
+      t2 = t2.tokenize$0();
+      t3._tokens = t2;
+      t3._parser$_iterator = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]);
+      t3._advance$0();
+      expr = t3._parseExpression$0();
+      if (M.isSemanticTemplate(boundNode)) {
+        t2 = J.getInterceptor($name);
+        t2 = t2.$eq($name, "bind") || t2.$eq($name, "repeat");
+      } else
+        t2 = false;
+      if (t2) {
+        t1 = J.getInterceptor(expr);
+        if (!!t1.$isHasIdentifier)
+          return new T.PolymerExpressions_prepareBinding_closure(this, expr.get$identifier(), t1.get$expr(expr));
+        else
+          return new T.PolymerExpressions_prepareBinding_closure0(this, expr);
+      }
+      t1.converter_0 = null;
+      t2 = !!J.getInterceptor(boundNode).$isElement;
+      if (t2 && J.$eq($name, "class"))
+        t1.converter_0 = T._classAttributeConverter$closure();
+      else if (t2 && J.$eq($name, "style"))
+        t1.converter_0 = T._styleAttributeConverter$closure();
+      return new T.PolymerExpressions_prepareBinding_closure1(t1, this, expr);
+    },
+    prepareInstanceModel$1: function(template) {
+      var ident = this._scopeIdents.$index(0, template);
+      if (ident == null)
+        return new T.PolymerExpressions_prepareInstanceModel_closure(this, template);
+      return new T.PolymerExpressions_prepareInstanceModel_closure0(this, template, ident);
+    },
+    _getParentScope$1: function(node) {
+      var t1, $parent, templateExtension, templateInstance, model;
+      t1 = J.getInterceptor$x(node);
+      $parent = t1.get$parentNode(node);
+      if ($parent == null)
+        return;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!t1.$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        templateInstance = t1.get$templateInstance(templateExtension);
+        model = templateInstance == null ? t1.get$model(templateExtension) : templateInstance.model;
+        if (!!J.getInterceptor(model).$isScope)
+          return model;
+        else
+          return this._scopes.$index(0, node);
+      }
+      return this._getParentScope$1($parent);
+    },
+    _getScopeForModel$2: function(node, model) {
+      var t1, t2;
+      if (node == null)
+        return K.Scope_Scope(model, this.globals);
+      t1 = J.getInterceptor(node);
+      if (!!t1.$isElement)
+        ;
+      if (!!J.getInterceptor(model).$isScope)
+        return model;
+      t2 = this._scopes;
+      if (t2.$index(0, node) != null) {
+        t2.$index(0, node);
+        return t2.$index(0, node);
+      } else if (t1.get$parentNode(node) != null)
+        return this._getContainingScope$2(t1.get$parentNode(node), model);
+      else {
+        if (!M.isSemanticTemplate(node))
+          throw H.wrapException("expected a template instead of " + H.S(node));
+        return this._getContainingScope$2(node, model);
+      }
+    },
+    _getContainingScope$2: function(node, model) {
+      var templateExtension, t1, scope;
+      if (M.isSemanticTemplate(node)) {
+        templateExtension = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+        t1 = J.getInterceptor$x(templateExtension);
+        if (t1.get$templateInstance(templateExtension) == null)
+          t1.get$model(templateExtension);
+        return this._scopes.$index(0, node);
+      } else {
+        t1 = J.getInterceptor$x(node);
+        if (t1.get$parent(node) == null) {
+          scope = this._scopes.$index(0, node);
+          return scope != null ? scope : K.Scope_Scope(model, this.globals);
+        } else
+          return this._getContainingScope$2(t1.get$parentNode(node), model);
+      }
+    },
+    static: {"^": "PolymerExpressions_DEFAULT_GLOBALS", PolymerExpressions$: function(globals, scopeFactory) {
+        var t1, t2, t3;
+        t1 = H.setRuntimeTypeInfo(new P.Expando(null), [K.Scope]);
+        t2 = H.setRuntimeTypeInfo(new P.Expando(null), [P.String]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+        t3.addAll$1(0, C.Map_wgEsG);
+        return new T.PolymerExpressions0(scopeFactory, t3, t1, t2, null);
+      }}
+  },
+  PolymerExpressions_prepareBinding_closure: {
+    "^": "Closure:175;this_1,identifier_2,bindExpr_3",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_1;
+      t1._scopeIdents.$indexSet(0, node, this.identifier_2);
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.bindExpr_3, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure0: {
+    "^": "Closure:175;this_4,expr_5",
+    call$3: [function(model, node, oneTime) {
+      var t1, scope;
+      t1 = this.this_4;
+      scope = !!J.getInterceptor(model).$isScope ? model : K.Scope_Scope(model, t1.globals);
+      t1._scopes.$indexSet(0, node, scope);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_5, scope, null);
+      t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_5, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareBinding_closure1: {
+    "^": "Closure:175;box_0,this_6,expr_7",
+    call$3: [function(model, node, oneTime) {
+      var scope, t1;
+      scope = this.this_6._getScopeForModel$2(node, model);
+      if (oneTime === true)
+        return T._Binding__oneTime(this.expr_7, scope, this.box_0.converter_0);
+      t1 = this.box_0.converter_0;
+      if (t1 == null)
+        t1 = T._identity$closure();
+      return new T._Binding(scope, t1, this.expr_7, null, null, null, null);
+    }, "call$3", null, 6, 0, null, 162, 163, 164, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure: {
+    "^": "Closure:13;this_0,template_1",
+    call$1: [function(model) {
+      var t1, t2, existingScope;
+      t1 = this.this_0;
+      t2 = this.template_1;
+      existingScope = t1._scopes.$index(0, t2);
+      if (existingScope != null) {
+        if (J.$eq(model, J.get$model$x(existingScope)))
+          return existingScope;
+        return K.Scope_Scope(model, t1.globals);
+      } else
+        return t1._getScopeForModel$2(t2, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  PolymerExpressions_prepareInstanceModel_closure0: {
+    "^": "Closure:13;this_2,template_3,ident_4",
+    call$1: [function(model) {
+      var t1, t2, existingScope, t3;
+      t1 = this.this_2;
+      t2 = this.template_3;
+      existingScope = t1._scopes.$index(0, t2);
+      t3 = this.ident_4;
+      if (existingScope != null)
+        return existingScope.childScope$2(t3, model);
+      else
+        return t1._getParentScope$1(t2).childScope$2(t3, model);
+    }, "call$1", null, 2, 0, null, 162, "call"],
+    $isFunction: true
+  },
+  _Binding: {
+    "^": "Bindable;_scope,_converter,_polymer_expressions$_expr,_polymer_expressions$_callback,_polymer_expressions$_sub,_observer,_polymer_expressions$_value",
+    _converter$1: function(arg0) {
+      return this._converter.call$1(arg0);
+    },
+    _polymer_expressions$_callback$1: function(arg0) {
+      return this._polymer_expressions$_callback.call$1(arg0);
+    },
+    _polymer_expressions$_check$2$skipChanges: [function(v, skipChanges) {
+      var oldValue, t1;
+      oldValue = this._polymer_expressions$_value;
+      t1 = this._converter$1(v);
+      this._polymer_expressions$_value = t1;
+      if (skipChanges !== true && this._polymer_expressions$_callback != null && !J.$eq(oldValue, t1))
+        this._polymer_expressions$_callback$1(this._polymer_expressions$_value);
+    }, function(v) {
+      return this._polymer_expressions$_check$2$skipChanges(v, false);
+    }, "_polymer_expressions$_check$1", "call$2$skipChanges", "call$1", "get$_polymer_expressions$_check", 2, 3, 176, 177, 64, 178],
+    get$value: function(_) {
+      if (this._polymer_expressions$_callback != null)
+        return this._polymer_expressions$_value;
+      return T._Binding__oneTime(this._polymer_expressions$_expr, this._scope, this._converter);
+    },
+    set$value: function(_, v) {
+      var newValue, e, s, exception, t1;
+      try {
+        newValue = K.assign(this._polymer_expressions$_expr, v, this._scope, false);
+        this._polymer_expressions$_check$2$skipChanges(newValue, true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._polymer_expressions$_expr) + "': " + H.S(e), s);
+      }
+
+    },
+    open$1: function(_, callback) {
+      var e, s, t1, observer, exception;
+      if (this._polymer_expressions$_callback != null)
+        throw H.wrapException(P.StateError$("already open"));
+      this._polymer_expressions$_callback = callback;
+      t1 = H.setRuntimeTypeInfo(new P.ListQueue(null, 0, 0, 0), [null]);
+      t1.ListQueue$1(null, null);
+      observer = this._polymer_expressions$_expr.accept$1(0, new K.ObserverBuilder(t1));
+      this._observer = observer;
+      t1 = observer.get$onUpdate().listen$1(this.get$_polymer_expressions$_check());
+      t1.onError$1(0, new T._Binding_open_closure(this));
+      this._polymer_expressions$_sub = t1;
+      try {
+        t1 = this._observer;
+        J.accept$1$x(t1, new K.Updater(this._scope));
+        t1.get$currentValue();
+        this._polymer_expressions$_check$2$skipChanges(this._observer.get$currentValue(), true);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        s = new H._StackTrace(exception, null);
+        H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this._observer) + "': " + H.S(e), s);
+      }
+
+      return this._polymer_expressions$_value;
+    },
+    close$0: function(_) {
+      var t1, t2;
+      if (this._polymer_expressions$_callback == null)
+        return;
+      this._polymer_expressions$_sub.cancel$0();
+      this._polymer_expressions$_sub = null;
+      this._polymer_expressions$_callback = null;
+      t1 = $.get$Closer__instance();
+      t2 = this._observer;
+      t1.toString;
+      J.accept$1$x(t2, t1);
+      this._observer = null;
+    },
+    static: {_Binding__oneTime: function(expr, scope, converter) {
+        var value, e, s, t1, exception;
+        try {
+          value = J.accept$1$x(expr, new K.EvalVisitor(scope));
+          t1 = converter == null ? value : converter.call$1(value);
+          return t1;
+        } catch (exception) {
+          t1 = H.unwrapException(exception);
+          e = t1;
+          s = new H._StackTrace(exception, null);
+          H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(expr) + "': " + H.S(e), s);
+        }
+
+        return;
+      }}
+  },
+  _Binding_open_closure: {
+    "^": "Closure:75;this_0",
+    call$2: [function(e, s) {
+      H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]).completeError$2("Error evaluating expression '" + H.S(this.this_0._observer) + "': " + H.S(e), s);
+    }, "call$2", null, 4, 0, null, 1, 142, "call"],
+    $isFunction: true
+  },
+  ScopeFactory: {
+    "^": "Object;"
+  }
+}],
+["polymer_expressions.async", "package:polymer_expressions/async.dart", , B, {
+  "^": "",
+  StreamBinding: {
+    "^": "ObservableBox;stream,_observable_box$_value,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    StreamBinding$1: function(stream, $T) {
+      this.stream.listen$1(new B.StreamBinding_closure($T, this));
+    },
+    $asObservableBox: function($T) {
+      return [null];
+    },
+    static: {StreamBinding$: function(stream, $T) {
+        var t1 = H.setRuntimeTypeInfo(new B.StreamBinding(stream, null, null, null), [$T]);
+        t1.StreamBinding$1(stream, $T);
+        return t1;
+      }}
+  },
+  StreamBinding_closure: {
+    "^": "Closure;T_0,this_1",
+    call$1: [function(i) {
+      var t1 = this.this_1;
+      t1._observable_box$_value = F.notifyPropertyChangeHelper(t1, C.Symbol_value, t1._observable_box$_value, i);
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true,
+    $signature: function() {
+      return H.computeSignature(function(T) {
+        return {func: "dynamic__T0", args: [T]};
+      }, this.this_1, "StreamBinding");
+    }
+  }
+}],
+["polymer_expressions.eval", "package:polymer_expressions/eval.dart", , K, {
+  "^": "",
+  assign: function(expr, value, scope, checkAssignability) {
+    var filters, t1, property, expression, isIndex, filterExpr, o;
+    filters = H.setRuntimeTypeInfo([], [U.Expression]);
+    for (; t1 = J.getInterceptor(expr), !!t1.$isBinaryOperator;) {
+      if (!J.$eq(t1.get$operator(expr), "|"))
+        break;
+      filters.push(t1.get$right(expr));
+      expr = t1.get$left(expr);
+    }
+    if (!!t1.$isIdentifier) {
+      property = t1.get$value(expr);
+      expression = C.C_EmptyExpression;
+      isIndex = false;
+    } else if (!!t1.$isIndex) {
+      expression = expr.get$receiver();
+      property = expr.get$argument();
+      isIndex = true;
+    } else {
+      if (!!t1.$isGetter) {
+        expression = expr.get$receiver();
+        property = t1.get$name(expr);
+      } else {
+        if (checkAssignability)
+          throw H.wrapException(K.EvalException$("Expression is not assignable: " + H.S(expr)));
+        return;
+      }
+      isIndex = false;
+    }
+    for (t1 = H.setRuntimeTypeInfo(new H.ListIterator(filters, filters.length, 0, null), [H.getTypeArgumentByIndex(filters, 0)]); t1.moveNext$0();) {
+      filterExpr = t1._current;
+      J.accept$1$x(filterExpr, new K.EvalVisitor(scope));
+      if (checkAssignability)
+        throw H.wrapException(K.EvalException$("filter must implement Transformer to be assignable: " + H.S(filterExpr)));
+      else
+        return;
+    }
+    o = J.accept$1$x(expression, new K.EvalVisitor(scope));
+    if (o == null)
+      return;
+    if (isIndex)
+      J.$indexSet$ax(o, J.accept$1$x(property, new K.EvalVisitor(scope)), value);
+    else {
+      t1 = $.get$symbolConverter()._symbols.$index(0, property);
+      $.get$objectAccessor().write$3(o, t1, value);
+    }
+    return value;
+  },
+  Scope_Scope: function(model, variables) {
+    var scope, t1, t2;
+    scope = new K._ModelScope(model);
+    if (variables == null)
+      t1 = scope;
+    else {
+      t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Object);
+      t1.addAll$1(0, variables);
+      t2 = new K._GlobalsScope(scope, t1);
+      if (t1.containsKey$1("this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      t1 = t2;
+    }
+    return t1;
+  },
+  closure14: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$add$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure15: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure16: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mul$ns(a, b);
+    },
+    $isFunction: true
+  },
+  closure17: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$div$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure18: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$mod$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure19: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure20: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return !J.$eq(a, b);
+    },
+    $isFunction: true
+  },
+  closure21: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b == null : a === b;
+    },
+    $isFunction: true
+  },
+  closure22: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a == null ? b != null : a !== b;
+    },
+    $isFunction: true
+  },
+  closure23: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$gt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure24: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$ge$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure25: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$lt$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure26: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$le$n(a, b);
+    },
+    $isFunction: true
+  },
+  closure27: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true || b === true;
+    },
+    $isFunction: true
+  },
+  closure28: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return a === true && b === true;
+    },
+    $isFunction: true
+  },
+  closure29: {
+    "^": "Closure:75;",
+    call$2: function(a, f) {
+      var t1 = H.buildInterfaceType(P.Object);
+      t1 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+      if (t1)
+        return f.call$1(a);
+      throw H.wrapException(K.EvalException$("Filters must be a one-argument function."));
+    },
+    $isFunction: true
+  },
+  closure11: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a;
+    },
+    $isFunction: true
+  },
+  closure12: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return J.$negate$n(a);
+    },
+    $isFunction: true
+  },
+  closure13: {
+    "^": "Closure:13;",
+    call$1: function(a) {
+      return a !== true;
+    },
+    $isFunction: true
+  },
+  Scope: {
+    "^": "Object;",
+    $indexSet: function(_, $name, value) {
+      throw H.wrapException(P.UnsupportedError$("[]= is not supported in Scope."));
+    },
+    childScope$2: function($name, value) {
+      if (J.$eq($name, "this"))
+        H.throwExpression(K.EvalException$("'this' cannot be used as a variable name."));
+      return new K._LocalVariableScope(this, $name, value);
+    },
+    $isScope: true,
+    $isIndexable: true,
+    $asIndexable: function() {
+      return [P.String, P.Object];
+    }
+  },
+  _ModelScope: {
+    "^": "Scope;model>",
+    $index: function(_, $name) {
+      var symbol, t1;
+      if (J.$eq($name, "this"))
+        return this.model;
+      symbol = $.get$symbolConverter()._symbols.$index(0, $name);
+      t1 = this.model;
+      if (t1 == null || symbol == null)
+        throw H.wrapException(K.EvalException$("variable '" + H.S($name) + "' not found"));
+      t1 = $.get$objectAccessor().read$2(t1, symbol);
+      return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+    },
+    _isModelProperty$1: function($name) {
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      return "[model: " + H.S(this.model) + "]";
+    }
+  },
+  _LocalVariableScope: {
+    "^": "Scope;parent>,varName,value>",
+    get$model: function(_) {
+      var t1 = this.parent;
+      t1 = t1.get$model(t1);
+      return t1;
+    },
+    $index: function(_, $name) {
+      var t1;
+      if (J.$eq(this.varName, $name)) {
+        t1 = this.value;
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (J.$eq(this.varName, $name))
+        return false;
+      return this.parent._isModelProperty$1($name);
+    },
+    toString$0: function(_) {
+      return this.parent.toString$0(0) + " > [local: " + H.S(this.varName) + "]";
+    }
+  },
+  _GlobalsScope: {
+    "^": "Scope;parent>,variables<",
+    get$model: function(_) {
+      return this.parent.model;
+    },
+    $index: function(_, $name) {
+      var t1 = this.variables;
+      if (t1.containsKey$1($name)) {
+        t1 = t1.$index(0, $name);
+        return !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      }
+      return this.parent.$index(0, $name);
+    },
+    _isModelProperty$1: function($name) {
+      if (this.variables.containsKey$1($name))
+        return false;
+      return !J.$eq($name, "this");
+    },
+    toString$0: function(_) {
+      var t1 = this.variables;
+      return "[model: " + H.S(this.parent.model) + "] > [global: " + P.IterableBase_iterableToShortString(H.setRuntimeTypeInfo(new P.LinkedHashMapKeyIterable(t1), [H.getTypeArgumentByIndex(t1, 0)]), "(", ")") + "]";
+    }
+  },
+  ExpressionObserver: {
+    "^": "Object;_parent?,_eval$_value<",
+    get$onUpdate: function() {
+      var t1 = this._eval$_controller;
+      return H.setRuntimeTypeInfo(new P._BroadcastStream(t1), [H.getTypeArgumentByIndex(t1, 0)]);
+    },
+    get$currentValue: function() {
+      return this._eval$_value;
+    },
+    _updateSelf$1: function(scope) {
+    },
+    _invalidate$1: function(scope) {
+      var t1;
+      this._eval$_observe$1(0, scope);
+      t1 = this._parent;
+      if (t1 != null)
+        t1._invalidate$1(scope);
+    },
+    _eval$_unobserve$0: function() {
+      var t1 = this._eval$_subscription;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eval$_subscription = null;
+      }
+    },
+    _eval$_observe$1: function(_, scope) {
+      var _oldValue, t1, t2;
+      this._eval$_unobserve$0();
+      _oldValue = this._eval$_value;
+      this._updateSelf$1(scope);
+      t1 = this._eval$_value;
+      if (t1 == null ? _oldValue != null : t1 !== _oldValue) {
+        t2 = this._eval$_controller;
+        if (t2._state >= 4)
+          H.throwExpression(t2._addEventError$0());
+        t2._sendData$1(t1);
+      }
+    },
+    toString$0: function(_) {
+      return this._eval$_expr.toString$0(0);
+    },
+    $isExpression: true
+  },
+  Updater: {
+    "^": "RecursiveVisitor;scope",
+    visitExpression$1: function(e) {
+      e._eval$_observe$1(0, this.scope);
+    }
+  },
+  Closer: {
+    "^": "RecursiveVisitor;",
+    visitExpression$1: function(e) {
+      e._eval$_unobserve$0();
+    },
+    static: {"^": "Closer__instance"}
+  },
+  EvalVisitor: {
+    "^": "Visitor;scope",
+    visitEmptyExpression$1: function(e) {
+      return J.get$model$x(this.scope);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, t1, symbol;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      if (receiver == null)
+        return;
+      t1 = g.get$name(g);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().read$2(receiver, symbol);
+    },
+    visitIndex$1: function(i) {
+      var receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      return J.$index$asx(receiver, J.accept$1$x(i.get$argument(), this));
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, symbol;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (receiver == null)
+        return;
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      if (i.get$method(i) == null)
+        return H.Primitives_applyFunction(receiver, args, P.Function__toMangledNames(null));
+      t1 = i.get$method(i);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      return $.get$objectAccessor().invoke$5$adjust$namedArgs(receiver, symbol, args, false, null);
+    },
+    visitLiteral$1: function(l) {
+      return l.get$value(l);
+    },
+    visitListLiteral$1: function(l) {
+      return H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$0(0);
+    },
+    visitMapLiteral$1: function(l) {
+      var map, t1, entry;
+      map = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();) {
+        entry = t1._current;
+        map.$indexSet(0, J.accept$1$x(J.get$key$x(entry), this), J.accept$1$x(entry.get$entryValue(), this));
+      }
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      return H.throwExpression(P.UnsupportedError$("should never be called"));
+    },
+    visitIdentifier$1: function(i) {
+      return J.$index$asx(this.scope, i.get$value(i));
+    },
+    visitBinaryOperator$1: function(o) {
+      var operator, left, right, f, t1;
+      operator = o.get$operator(o);
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      f = $.get$_BINARY_OPERATORS().$index(0, operator);
+      t1 = J.getInterceptor(operator);
+      if (t1.$eq(operator, "&&") || t1.$eq(operator, "||")) {
+        t1 = left == null ? false : left;
+        return f.call$2(t1, right == null ? false : right);
+      } else if (t1.$eq(operator, "==") || t1.$eq(operator, "!="))
+        return f.call$2(left, right);
+      else if (left == null || right == null)
+        return;
+      return f.call$2(left, right);
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, f;
+      expr = J.accept$1$x(o.get$child(), this);
+      f = $.get$_UNARY_OPERATORS().$index(0, o.get$operator(o));
+      if (J.$eq(o.get$operator(o), "!"))
+        return f.call$1(expr == null ? false : expr);
+      return expr == null ? null : f.call$1(expr);
+    },
+    visitTernaryOperator$1: function(o) {
+      return J.$eq(J.accept$1$x(o.get$condition(), this), true) ? J.accept$1$x(o.get$trueExpr(), this) : J.accept$1$x(o.get$falseExpr(), this);
+    },
+    visitInExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      return H.throwExpression(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder: {
+    "^": "Visitor;parents",
+    visitEmptyExpression$1: function(e) {
+      return new K.EmptyObserver(e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitParenthesizedExpression$1: function(e) {
+      return e.child.accept$1(0, this);
+    },
+    visitGetter$1: function(g) {
+      var receiver, getter;
+      receiver = J.accept$1$x(g.get$receiver(), this);
+      getter = new K.GetterObserver(receiver, g, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(getter);
+      return getter;
+    },
+    visitIndex$1: function(i) {
+      var receiver, arg, index;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      arg = J.accept$1$x(i.get$argument(), this);
+      index = new K.IndexObserver(receiver, arg, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(index);
+      arg.set$_parent(index);
+      return index;
+    },
+    visitInvoke$1: function(i) {
+      var receiver, args, t1, t2, invoke;
+      receiver = J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() == null)
+        args = null;
+      else {
+        t1 = i.get$arguments();
+        t2 = this.get$visit();
+        t1.toString;
+        args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, t2), [null, null]).toList$1$growable(0, false);
+      }
+      invoke = new K.InvokeObserver(receiver, args, i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      receiver.set$_parent(invoke);
+      if (args != null)
+        H.IterableMixinWorkaround_forEach(args, new K.ObserverBuilder_visitInvoke_closure(invoke));
+      return invoke;
+    },
+    visitLiteral$1: function(l) {
+      return new K.LiteralObserver(l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitListLiteral$1: function(l) {
+      var items, list;
+      items = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$items(), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      list = new K.ListLiteralObserver(items, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(items, new K.ObserverBuilder_visitListLiteral_closure(list));
+      return list;
+    },
+    visitMapLiteral$1: function(l) {
+      var entries, map;
+      entries = H.setRuntimeTypeInfo(new H.MappedListIterable(l.get$entries(l), this.get$visit()), [null, null]).toList$1$growable(0, false);
+      map = new K.MapLiteralObserver(entries, l, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      H.IterableMixinWorkaround_forEach(entries, new K.ObserverBuilder_visitMapLiteral_closure(map));
+      return map;
+    },
+    visitMapLiteralEntry$1: function(e) {
+      var key, value, entry;
+      key = J.accept$1$x(e.get$key(e), this);
+      value = J.accept$1$x(e.get$entryValue(), this);
+      entry = new K.MapLiteralEntryObserver(key, value, e, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      key.set$_parent(entry);
+      value.set$_parent(entry);
+      return entry;
+    },
+    visitIdentifier$1: function(i) {
+      return new K.IdentifierObserver(i, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+    },
+    visitBinaryOperator$1: function(o) {
+      var left, right, binary;
+      left = J.accept$1$x(o.get$left(o), this);
+      right = J.accept$1$x(o.get$right(o), this);
+      binary = new K.BinaryObserver(left, right, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      left.set$_parent(binary);
+      right.set$_parent(binary);
+      return binary;
+    },
+    visitUnaryOperator$1: function(o) {
+      var expr, unary;
+      expr = J.accept$1$x(o.get$child(), this);
+      unary = new K.UnaryObserver(expr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      expr.set$_parent(unary);
+      return unary;
+    },
+    visitTernaryOperator$1: function(o) {
+      var condition, trueExpr, falseExpr, ternary;
+      condition = J.accept$1$x(o.get$condition(), this);
+      trueExpr = J.accept$1$x(o.get$trueExpr(), this);
+      falseExpr = J.accept$1$x(o.get$falseExpr(), this);
+      ternary = new K.TernaryObserver(condition, trueExpr, falseExpr, o, null, null, null, P.StreamController_StreamController$broadcast(null, null, false, null));
+      condition.set$_parent(ternary);
+      trueExpr.set$_parent(ternary);
+      falseExpr.set$_parent(ternary);
+      return ternary;
+    },
+    visitInExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'in' expression"));
+    },
+    visitAsExpression$1: function(i) {
+      throw H.wrapException(P.UnsupportedError$("can't eval an 'as' expression"));
+    }
+  },
+  ObserverBuilder_visitInvoke_closure: {
+    "^": "Closure:13;invoke_0",
+    call$1: function(a) {
+      var t1 = this.invoke_0;
+      a.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitListLiteral_closure: {
+    "^": "Closure:13;list_0",
+    call$1: function(e) {
+      var t1 = this.list_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  ObserverBuilder_visitMapLiteral_closure: {
+    "^": "Closure:13;map_0",
+    call$1: function(e) {
+      var t1 = this.map_0;
+      e.set$_parent(t1);
+      return t1;
+    },
+    $isFunction: true
+  },
+  EmptyObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = J.get$model$x(scope);
+    },
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.EmptyExpression];
+    },
+    $isEmptyExpression: true,
+    $isExpression: true
+  },
+  LiteralObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1 = this._eval$_expr;
+      this._eval$_value = t1.get$value(t1);
+    },
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Literal];
+    },
+    $asLiteral: function() {
+      return [null];
+    },
+    $isLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver: {
+    "^": "ExpressionObserver;items<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.setRuntimeTypeInfo(new H.MappedListIterable(this.items, new K.ListLiteralObserver__updateSelf_closure()), [null, null]).toList$0(0);
+    },
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.ListLiteral];
+    },
+    $isListLiteral: true,
+    $isExpression: true
+  },
+  ListLiteralObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(i) {
+      return i.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 82, "call"],
+    $isFunction: true
+  },
+  MapLiteralObserver: {
+    "^": "ExpressionObserver;entries>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      this._eval$_value = H.IterableMixinWorkaround_fold(this.entries, P.LinkedHashMap_LinkedHashMap(null, null, null, null, null), new K.MapLiteralObserver__updateSelf_closure());
+    },
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteral];
+    },
+    $isMapLiteral: true,
+    $isExpression: true
+  },
+  MapLiteralObserver__updateSelf_closure: {
+    "^": "Closure:75;",
+    call$2: function(m, e) {
+      J.$indexSet$ax(m, J.get$key$x(e).get$_eval$_value(), e.get$entryValue().get$_eval$_value());
+      return m;
+    },
+    $isFunction: true
+  },
+  MapLiteralEntryObserver: {
+    "^": "ExpressionObserver;key>,entryValue<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.MapLiteralEntry];
+    },
+    $isMapLiteralEntry: true,
+    $isExpression: true
+  },
+  IdentifierObserver: {
+    "^": "ExpressionObserver;_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$value: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$value(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, t2, model, symbol;
+      t1 = this._eval$_expr;
+      t2 = J.getInterceptor$asx(scope);
+      this._eval$_value = t2.$index(scope, t1.get$value(t1));
+      if (!scope._isModelProperty$1(t1.get$value(t1)))
+        return;
+      model = t2.get$model(scope);
+      t2 = J.getInterceptor(model);
+      if (!t2.$isObservable)
+        return;
+      t1 = t1.get$value(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_subscription = t2.get$changes(model).listen$1(new K.IdentifierObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Identifier];
+    },
+    $isIdentifier: true,
+    $isExpression: true
+  },
+  IdentifierObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IdentifierObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IdentifierObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  UnaryObserver: {
+    "^": "ExpressionObserver;child<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f;
+      t1 = this._eval$_expr;
+      f = $.get$_UNARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "!")) {
+        t1 = this.child.get$_eval$_value();
+        this._eval$_value = f.call$1(t1 == null ? false : t1);
+      } else {
+        t1 = this.child;
+        this._eval$_value = t1.get$_eval$_value() == null ? null : f.call$1(t1.get$_eval$_value());
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.UnaryOperator];
+    },
+    $isUnaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver: {
+    "^": "ExpressionObserver;left>,right>,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$operator: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$operator(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, f, t2;
+      t1 = this._eval$_expr;
+      f = $.get$_BINARY_OPERATORS().$index(0, t1.get$operator(t1));
+      if (J.$eq(t1.get$operator(t1), "&&") || J.$eq(t1.get$operator(t1), "||")) {
+        t1 = this.left.get$_eval$_value();
+        if (t1 == null)
+          t1 = false;
+        t2 = this.right.get$_eval$_value();
+        this._eval$_value = f.call$2(t1, t2 == null ? false : t2);
+      } else if (J.$eq(t1.get$operator(t1), "==") || J.$eq(t1.get$operator(t1), "!="))
+        this._eval$_value = f.call$2(this.left.get$_eval$_value(), this.right.get$_eval$_value());
+      else {
+        t2 = this.left;
+        if (t2.get$_eval$_value() == null || this.right.get$_eval$_value() == null)
+          this._eval$_value = null;
+        else {
+          if (J.$eq(t1.get$operator(t1), "|") && !!J.getInterceptor(t2.get$_eval$_value()).$isObservableList)
+            this._eval$_subscription = H.interceptedTypeCast(t2.get$_eval$_value(), "$isObservableList").get$listChanges().listen$1(new K.BinaryObserver__updateSelf_closure(this, scope));
+          this._eval$_value = f.call$2(t2.get$_eval$_value(), this.right.get$_eval$_value());
+        }
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.BinaryOperator];
+    },
+    $isBinaryOperator: true,
+    $isExpression: true
+  },
+  BinaryObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1",
+    call$1: [function(_) {
+      return this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  },
+  TernaryObserver: {
+    "^": "ExpressionObserver;condition<,trueExpr<,falseExpr<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var t1 = this.condition.get$_eval$_value();
+      this._eval$_value = (t1 == null ? false : t1) === true ? this.trueExpr.get$_eval$_value() : this.falseExpr.get$_eval$_value();
+    },
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.TernaryOperator];
+    },
+    $isTernaryOperator: true,
+    $isExpression: true
+  },
+  GetterObserver: {
+    "^": "ExpressionObserver;receiver<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$name: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$name(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var receiverValue, t1, symbol;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      t1 = t1.get$name(t1);
+      symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+      this._eval$_value = $.get$objectAccessor().read$2(receiverValue, symbol);
+      t1 = J.getInterceptor(receiverValue);
+      if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.GetterObserver__updateSelf_closure(this, scope, symbol));
+    },
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Getter];
+    },
+    $isGetter: true,
+    $isExpression: true
+  },
+  GetterObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.GetterObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  GetterObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver: {
+    "^": "ExpressionObserver;receiver<,argument<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    _updateSelf$1: function(scope) {
+      var receiverValue, key, t1;
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      key = this.argument.get$_eval$_value();
+      t1 = J.getInterceptor$asx(receiverValue);
+      this._eval$_value = t1.$index(receiverValue, key);
+      if (!!t1.$isObservableList)
+        this._eval$_subscription = receiverValue.get$listChanges().listen$1(new K.IndexObserver__updateSelf_closure(this, scope, key));
+      else if (!!t1.$isObservable)
+        this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.IndexObserver__updateSelf_closure0(this, scope, key));
+    },
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Index];
+    },
+    $isIndex: true,
+    $isExpression: true
+  },
+  IndexObserver__updateSelf_closure: {
+    "^": "Closure:13;this_0,scope_1,key_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure0(this.key_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure0: {
+    "^": "Closure:13;key_3",
+    call$1: [function(c) {
+      return c.indexChanged$1(this.key_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf_closure0: {
+    "^": "Closure:13;this_4,scope_5,key_6",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.IndexObserver__updateSelf__closure(this.key_6)) === true)
+        this.this_4._invalidate$1(this.scope_5);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  IndexObserver__updateSelf__closure: {
+    "^": "Closure:13;key_7",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isMapChangeRecord && J.$eq(c.key, this.key_7);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  InvokeObserver: {
+    "^": "ExpressionObserver;receiver<,arguments<,_eval$_expr,_parent,_eval$_subscription,_eval$_value,_eval$_controller",
+    get$method: function(_) {
+      var t1 = this._eval$_expr;
+      return t1.get$method(t1);
+    },
+    _updateSelf$1: function(scope) {
+      var t1, args, receiverValue, symbol;
+      t1 = this.arguments;
+      t1.toString;
+      args = H.setRuntimeTypeInfo(new H.MappedListIterable(t1, new K.InvokeObserver__updateSelf_closure()), [null, null]).toList$0(0);
+      receiverValue = this.receiver.get$_eval$_value();
+      if (receiverValue == null) {
+        this._eval$_value = null;
+        return;
+      }
+      t1 = this._eval$_expr;
+      if (t1.get$method(t1) == null) {
+        t1 = H.Primitives_applyFunction(receiverValue, args, P.Function__toMangledNames(null));
+        this._eval$_value = !!J.getInterceptor(t1).$isStream ? B.StreamBinding$(t1, null) : t1;
+      } else {
+        t1 = t1.get$method(t1);
+        symbol = $.get$symbolConverter()._symbols.$index(0, t1);
+        this._eval$_value = $.get$objectAccessor().invoke$5$adjust$namedArgs(receiverValue, symbol, args, false, null);
+        t1 = J.getInterceptor(receiverValue);
+        if (!!t1.$isObservable)
+          this._eval$_subscription = t1.get$changes(receiverValue).listen$1(new K.InvokeObserver__updateSelf_closure0(this, scope, symbol));
+      }
+    },
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    $asExpressionObserver: function() {
+      return [U.Invoke];
+    },
+    $isInvoke: true,
+    $isExpression: true
+  },
+  InvokeObserver__updateSelf_closure: {
+    "^": "Closure:13;",
+    call$1: [function(a) {
+      return a.get$_eval$_value();
+    }, "call$1", null, 2, 0, null, 46, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf_closure0: {
+    "^": "Closure:179;this_0,scope_1,symbol_2",
+    call$1: [function(changes) {
+      if (J.any$1$ax(changes, new K.InvokeObserver__updateSelf__closure(this.symbol_2)) === true)
+        this.this_0._invalidate$1(this.scope_1);
+    }, "call$1", null, 2, 0, null, 170, "call"],
+    $isFunction: true
+  },
+  InvokeObserver__updateSelf__closure: {
+    "^": "Closure:13;symbol_3",
+    call$1: [function(c) {
+      return !!J.getInterceptor(c).$isPropertyChangeRecord && J.$eq(c.name, this.symbol_3);
+    }, "call$1", null, 2, 0, null, 80, "call"],
+    $isFunction: true
+  },
+  EvalException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "EvalException: " + this.message;
+    },
+    static: {EvalException$: function(message) {
+        return new K.EvalException(message);
+      }}
+  }
+}],
+["polymer_expressions.expression", "package:polymer_expressions/expression.dart", , U, {
+  "^": "",
+  _listEquals: function(a, b) {
+    var i, t1;
+    if (a == null ? b == null : a === b)
+      return true;
+    if (a == null || b == null)
+      return false;
+    if (a.length !== b.length)
+      return false;
+    for (i = 0; i < a.length; ++i) {
+      t1 = a[i];
+      if (i >= b.length)
+        return H.ioore(b, i);
+      if (!J.$eq(t1, b[i]))
+        return false;
+    }
+    return true;
+  },
+  _hashList: function(l) {
+    l.toString;
+    return U._JenkinsSmiHash_finish0(H.IterableMixinWorkaround_fold(l, 0, new U._hashList_closure()));
+  },
+  _JenkinsSmiHash_combine1: function(hash, value) {
+    var t1 = J.$add$ns(hash, value);
+    if (typeof t1 !== "number")
+      return H.iae(t1);
+    hash = 536870911 & t1;
+    hash = 536870911 & hash + ((524287 & hash) << 10 >>> 0);
+    return hash ^ hash >>> 6;
+  },
+  _JenkinsSmiHash_finish0: function(hash) {
+    if (typeof hash !== "number")
+      return H.iae(hash);
+    hash = 536870911 & hash + ((67108863 & hash) << 3 >>> 0);
+    hash = (hash ^ hash >>> 11) >>> 0;
+    return 536870911 & hash + ((16383 & hash) << 15 >>> 0);
+  },
+  AstFactory: {
+    "^": "Object;",
+    index$2: [function(_, e, a) {
+      return new U.Index(e, a);
+    }, "call$2", "get$index", 4, 0, 180, 1, 46]
+  },
+  Expression: {
+    "^": "Object;",
+    $isExpression: true
+  },
+  EmptyExpression: {
+    "^": "Expression;",
+    accept$1: function(_, v) {
+      return v.visitEmptyExpression$1(this);
+    },
+    $isEmptyExpression: true
+  },
+  Literal: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitLiteral$1(this);
+    },
+    toString$0: function(_) {
+      var t1 = this.value;
+      return typeof t1 === "string" ? "\"" + H.S(t1) + "\"" : H.S(t1);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = H.checkSubtype(o, "$isLiteral", [H.getTypeArgumentByIndex(this, 0)], "$asLiteral");
+      return t1 && J.$eq(J.get$value$x(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isLiteral: true
+  },
+  ListLiteral: {
+    "^": "Expression;items<",
+    accept$1: function(_, v) {
+      return v.visitListLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.items);
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isListLiteral && U._listEquals(o.get$items(), this.items);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.items);
+    },
+    $isListLiteral: true
+  },
+  MapLiteral: {
+    "^": "Expression;entries>",
+    accept$1: function(_, v) {
+      return v.visitMapLiteral$1(this);
+    },
+    toString$0: function(_) {
+      return "{" + H.S(this.entries) + "}";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteral && U._listEquals(t1.get$entries(o), this.entries);
+    },
+    get$hashCode: function(_) {
+      return U._hashList(this.entries);
+    },
+    $isMapLiteral: true
+  },
+  MapLiteralEntry: {
+    "^": "Expression;key>,entryValue<",
+    accept$1: function(_, v) {
+      return v.visitMapLiteralEntry$1(this);
+    },
+    toString$0: function(_) {
+      return this.key.toString$0(0) + ": " + H.S(this.entryValue);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isMapLiteralEntry && J.$eq(t1.get$key(o), this.key) && J.$eq(o.get$entryValue(), this.entryValue);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.key.value);
+      t2 = J.get$hashCode$(this.entryValue);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isMapLiteralEntry: true
+  },
+  ParenthesizedExpression: {
+    "^": "Expression;child",
+    accept$1: function(_, v) {
+      return v.visitParenthesizedExpression$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.child) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isParenthesizedExpression && J.$eq(o.child, this.child);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.child);
+    },
+    $isParenthesizedExpression: true
+  },
+  Identifier: {
+    "^": "Expression;value>",
+    accept$1: function(_, v) {
+      return v.visitIdentifier$1(this);
+    },
+    toString$0: function(_) {
+      return this.value;
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isIdentifier && J.$eq(t1.get$value(o), this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    $isIdentifier: true
+  },
+  UnaryOperator: {
+    "^": "Expression;operator>,child<",
+    accept$1: function(_, v) {
+      return v.visitUnaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.operator) + " " + H.S(this.child);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isUnaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(o.get$child(), this.child);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.child);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isUnaryOperator: true
+  },
+  BinaryOperator: {
+    "^": "Expression;operator>,left>,right>",
+    accept$1: function(_, v) {
+      return v.visitBinaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " " + H.S(this.operator) + " " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isBinaryOperator && J.$eq(t1.get$operator(o), this.operator) && J.$eq(t1.get$left(o), this.left) && J.$eq(t1.get$right(o), this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.operator);
+      t2 = J.get$hashCode$(this.left);
+      t3 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isBinaryOperator: true
+  },
+  TernaryOperator: {
+    "^": "Expression;condition<,trueExpr<,falseExpr<",
+    accept$1: function(_, v) {
+      return v.visitTernaryOperator$1(this);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.condition) + " ? " + H.S(this.trueExpr) + " : " + H.S(this.falseExpr) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isTernaryOperator && J.$eq(o.get$condition(), this.condition) && J.$eq(o.get$trueExpr(), this.trueExpr) && J.$eq(o.get$falseExpr(), this.falseExpr);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.condition);
+      t2 = J.get$hashCode$(this.trueExpr);
+      t3 = J.get$hashCode$(this.falseExpr);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isTernaryOperator: true
+  },
+  InExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitInExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.left;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.right;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " in " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isInExpression && o.left.$eq(0, this.left) && J.$eq(o.right, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = this.left;
+      t1 = t1.get$hashCode(t1);
+      t2 = J.get$hashCode$(this.right);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isInExpression: true,
+    $isHasIdentifier: true
+  },
+  AsExpression: {
+    "^": "Expression;left>,right>",
+    accept$1: function(_, v) {
+      return v.visitAsExpression$1(this);
+    },
+    get$identifier: function() {
+      var t1 = this.right;
+      return t1.get$value(t1);
+    },
+    get$expr: function(_) {
+      return this.left;
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.left) + " as " + H.S(this.right) + ")";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isAsExpression && J.$eq(o.left, this.left) && o.right.$eq(0, this.right);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.left);
+      t2 = this.right;
+      t2 = t2.get$hashCode(t2);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isAsExpression: true,
+    $isHasIdentifier: true
+  },
+  Index: {
+    "^": "Expression;receiver<,argument<",
+    accept$1: function(_, v) {
+      return v.visitIndex$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "[" + H.S(this.argument) + "]";
+    },
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndex && J.$eq(o.get$receiver(), this.receiver) && J.$eq(o.get$argument(), this.argument);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.argument);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isIndex: true
+  },
+  Getter: {
+    "^": "Expression;receiver<,name>",
+    accept$1: function(_, v) {
+      return v.visitGetter$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.name);
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isGetter && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$name(o), this.name);
+    },
+    get$hashCode: function(_) {
+      var t1, t2;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.name);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2));
+    },
+    $isGetter: true
+  },
+  Invoke: {
+    "^": "Expression;receiver<,method>,arguments<",
+    accept$1: function(_, v) {
+      return v.visitInvoke$1(this);
+    },
+    toString$0: function(_) {
+      return H.S(this.receiver) + "." + H.S(this.method) + "(" + H.S(this.arguments) + ")";
+    },
+    $eq: function(_, o) {
+      var t1;
+      if (o == null)
+        return false;
+      t1 = J.getInterceptor(o);
+      return !!t1.$isInvoke && J.$eq(o.get$receiver(), this.receiver) && J.$eq(t1.get$method(o), this.method) && U._listEquals(o.get$arguments(), this.arguments);
+    },
+    get$hashCode: function(_) {
+      var t1, t2, t3;
+      t1 = J.get$hashCode$(this.receiver);
+      t2 = J.get$hashCode$(this.method);
+      t3 = U._hashList(this.arguments);
+      return U._JenkinsSmiHash_finish0(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(U._JenkinsSmiHash_combine1(0, t1), t2), t3));
+    },
+    $isInvoke: true
+  },
+  _hashList_closure: {
+    "^": "Closure:75;",
+    call$2: function(h, item) {
+      return U._JenkinsSmiHash_combine1(h, J.get$hashCode$(item));
+    },
+    $isFunction: true
+  }
+}],
+["polymer_expressions.parser", "package:polymer_expressions/parser.dart", , T, {
+  "^": "",
+  Parser: {
+    "^": "Object;_astFactory,_tokenizer,_tokens,_parser$_iterator",
+    get$_token: function() {
+      return this._parser$_iterator._current;
+    },
+    _advance$2: function(kind, value) {
+      var t1;
+      if (kind != null) {
+        t1 = this._parser$_iterator._current;
+        t1 = t1 == null || !J.$eq(J.get$kind$x(t1), kind);
+      } else
+        t1 = false;
+      if (!t1)
+        if (value != null) {
+          t1 = this._parser$_iterator._current;
+          t1 = t1 == null || !J.$eq(J.get$value$x(t1), value);
+        } else
+          t1 = false;
+      else
+        t1 = true;
+      if (t1)
+        throw H.wrapException(Y.ParseException$("Expected kind " + H.S(kind) + " (" + H.S(value) + "): " + H.S(this.get$_token())));
+      this._parser$_iterator.moveNext$0();
+    },
+    _advance$0: function() {
+      return this._advance$2(null, null);
+    },
+    _advance$1: function(kind) {
+      return this._advance$2(kind, null);
+    },
+    _parseExpression$0: function() {
+      if (this._parser$_iterator._current == null) {
+        this._astFactory.toString;
+        return C.C_EmptyExpression;
+      }
+      var expr = this._parseUnary$0();
+      return expr == null ? null : this._parsePrecedence$2(expr, 0);
+    },
+    _parsePrecedence$2: function(left, precedence) {
+      var t1, args, indexExpr, right, trueExpr, falseExpr;
+      for (; t1 = this._parser$_iterator._current, t1 != null;)
+        if (J.$eq(J.get$kind$x(t1), 9))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            args = this._parseArguments$0();
+            this._astFactory.toString;
+            left = new U.Invoke(left, null, args);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+            indexExpr = this._parseIndex$0();
+            this._astFactory.toString;
+            left = new U.Index(left, indexExpr);
+          } else
+            break;
+        else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 3)) {
+          this._advance$0();
+          left = this._makeInvokeOrGetter$2(left, this._parseUnary$0());
+        } else if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 10))
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "in")) {
+            if (!J.getInterceptor(left).$isIdentifier)
+              H.throwExpression(Y.ParseException$("in... statements must start with an identifier"));
+            this._advance$0();
+            right = this._parseExpression$0();
+            this._astFactory.toString;
+            left = new U.InExpression(left, right);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "as")) {
+            this._advance$0();
+            right = this._parseExpression$0();
+            if (!J.getInterceptor(right).$isIdentifier)
+              H.throwExpression(Y.ParseException$("'as' statements must end with an identifier"));
+            this._astFactory.toString;
+            left = new U.AsExpression(left, right);
+          } else
+            break;
+        else {
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+            t1 = this._parser$_iterator._current.get$precedence();
+            if (typeof t1 !== "number")
+              return t1.$ge();
+            if (typeof precedence !== "number")
+              return H.iae(precedence);
+            t1 = t1 >= precedence;
+          } else
+            t1 = false;
+          if (t1)
+            if (J.$eq(J.get$value$x(this._parser$_iterator._current), "?")) {
+              this._advance$2(8, "?");
+              trueExpr = this._parseExpression$0();
+              this._advance$1(5);
+              falseExpr = this._parseExpression$0();
+              this._astFactory.toString;
+              left = new U.TernaryOperator(left, trueExpr, falseExpr);
+            } else
+              left = this._parseBinary$1(left);
+          else
+            break;
+        }
+      return left;
+    },
+    _makeInvokeOrGetter$2: function(left, right) {
+      var t1, t2;
+      t1 = J.getInterceptor(right);
+      if (!!t1.$isIdentifier) {
+        t1 = t1.get$value(right);
+        this._astFactory.toString;
+        return new U.Getter(left, t1);
+      } else if (!!t1.$isInvoke && !!J.getInterceptor(right.get$receiver()).$isIdentifier) {
+        t1 = J.get$value$x(right.get$receiver());
+        t2 = right.get$arguments();
+        this._astFactory.toString;
+        return new U.Invoke(left, t1, t2);
+      } else
+        throw H.wrapException(Y.ParseException$("expected identifier: " + H.S(right)));
+    },
+    _parseBinary$1: function(left) {
+      var op, t1, right, t2, t3;
+      op = this._parser$_iterator._current;
+      t1 = J.getInterceptor$x(op);
+      if (!C.JSArray_methods.contains$1(C.List_EuK, t1.get$value(op)))
+        throw H.wrapException(Y.ParseException$("unknown operator: " + H.S(t1.get$value(op))));
+      this._advance$0();
+      right = this._parseUnary$0();
+      while (true) {
+        t2 = this._parser$_iterator._current;
+        if (t2 != null)
+          if (J.$eq(J.get$kind$x(t2), 8) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 3) || J.$eq(J.get$kind$x(this._parser$_iterator._current), 9)) {
+            t2 = this._parser$_iterator._current.get$precedence();
+            t3 = op.get$precedence();
+            if (typeof t2 !== "number")
+              return t2.$gt();
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            t3 = t2 > t3;
+            t2 = t3;
+          } else
+            t2 = false;
+        else
+          t2 = false;
+        if (!t2)
+          break;
+        right = this._parsePrecedence$2(right, this._parser$_iterator._current.get$precedence());
+      }
+      t1 = t1.get$value(op);
+      this._astFactory.toString;
+      return new U.BinaryOperator(t1, left, right);
+    },
+    _parseUnary$0: function() {
+      var value, t1, t2, expr;
+      if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 8)) {
+        value = J.get$value$x(this._parser$_iterator._current);
+        t1 = J.getInterceptor(value);
+        if (t1.$eq(value, "+") || t1.$eq(value, "-")) {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 6)) {
+            t1 = H.Primitives_parseInt(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+            this._astFactory.toString;
+            value = new U.Literal(t1);
+            value.$builtinTypeInfo = [null];
+            this._advance$0();
+            return value;
+          } else {
+            t1 = this._astFactory;
+            if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 7)) {
+              t2 = H.Primitives_parseDouble(H.S(value) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+              t1.toString;
+              value = new U.Literal(t2);
+              value.$builtinTypeInfo = [null];
+              this._advance$0();
+              return value;
+            } else {
+              expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+              t1.toString;
+              return new U.UnaryOperator(value, expr);
+            }
+          }
+        } else if (t1.$eq(value, "!")) {
+          this._advance$0();
+          expr = this._parsePrecedence$2(this._parsePrimary$0(), 11);
+          this._astFactory.toString;
+          return new U.UnaryOperator(value, expr);
+        } else
+          throw H.wrapException(Y.ParseException$("unexpected token: " + H.S(value)));
+      }
+      return this._parsePrimary$0();
+    },
+    _parsePrimary$0: function() {
+      var keyword, expr;
+      switch (J.get$kind$x(this._parser$_iterator._current)) {
+        case 10:
+          keyword = J.get$value$x(this._parser$_iterator._current);
+          if (J.$eq(keyword, "this")) {
+            this._advance$0();
+            this._astFactory.toString;
+            return new U.Identifier("this");
+          } else if (C.JSArray_methods.contains$1(C.List_as_in_this, keyword))
+            throw H.wrapException(Y.ParseException$("unexpected keyword: " + H.S(keyword)));
+          throw H.wrapException(Y.ParseException$("unrecognized keyword: " + H.S(keyword)));
+        case 2:
+          return this._parseInvokeOrIdentifier$0();
+        case 1:
+          return this._parseString$0();
+        case 6:
+          return this._parseInteger$0();
+        case 7:
+          return this._parseDecimal$0();
+        case 9:
+          if (J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+            this._advance$0();
+            expr = this._parseExpression$0();
+            this._advance$2(9, ")");
+            this._astFactory.toString;
+            return new U.ParenthesizedExpression(expr);
+          } else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "{"))
+            return this._parseMapLiteral$0();
+          else if (J.$eq(J.get$value$x(this._parser$_iterator._current), "["))
+            return this._parseListLiteral$0();
+          return;
+        case 5:
+          throw H.wrapException(Y.ParseException$("unexpected token \":\""));
+        default:
+          return;
+      }
+    },
+    _parseListLiteral$0: function() {
+      var items, t1;
+      items = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "]"))
+          break;
+        items.push(this._parseExpression$0());
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "]");
+      return new U.ListLiteral(items);
+    },
+    _parseMapLiteral$0: function() {
+      var entries, t1, value;
+      entries = [];
+      do {
+        this._advance$0();
+        if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "}"))
+          break;
+        t1 = J.get$value$x(this._parser$_iterator._current);
+        this._astFactory.toString;
+        value = new U.Literal(t1);
+        value.$builtinTypeInfo = [null];
+        this._advance$0();
+        this._advance$2(5, ":");
+        entries.push(new U.MapLiteralEntry(value, this._parseExpression$0()));
+        t1 = this._parser$_iterator._current;
+      } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+      this._advance$2(9, "}");
+      return new U.MapLiteral(entries);
+    },
+    _parseInvokeOrIdentifier$0: function() {
+      var value, identifier, args;
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "true")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(true), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "false")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(false), [null]);
+      }
+      if (J.$eq(J.get$value$x(this._parser$_iterator._current), "null")) {
+        this._advance$0();
+        this._astFactory.toString;
+        return H.setRuntimeTypeInfo(new U.Literal(null), [null]);
+      }
+      if (!J.$eq(J.get$kind$x(this._parser$_iterator._current), 2))
+        H.throwExpression(Y.ParseException$("expected identifier: " + H.S(this.get$_token()) + ".value"));
+      value = J.get$value$x(this._parser$_iterator._current);
+      this._advance$0();
+      this._astFactory.toString;
+      identifier = new U.Identifier(value);
+      args = this._parseArguments$0();
+      if (args == null)
+        return identifier;
+      else
+        return new U.Invoke(identifier, null, args);
+    },
+    _parseArguments$0: function() {
+      var t1, args;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "(")) {
+        args = [];
+        do {
+          this._advance$0();
+          if (J.$eq(J.get$kind$x(this._parser$_iterator._current), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), ")"))
+            break;
+          args.push(this._parseExpression$0());
+          t1 = this._parser$_iterator._current;
+        } while (t1 != null && J.$eq(J.get$value$x(t1), ","));
+        this._advance$2(9, ")");
+        return args;
+      }
+      return;
+    },
+    _parseIndex$0: function() {
+      var t1, expr;
+      t1 = this._parser$_iterator._current;
+      if (t1 != null && J.$eq(J.get$kind$x(t1), 9) && J.$eq(J.get$value$x(this._parser$_iterator._current), "[")) {
+        this._advance$0();
+        expr = this._parseExpression$0();
+        this._advance$2(9, "]");
+        return expr;
+      }
+      return;
+    },
+    _parseString$0: function() {
+      var t1, value;
+      t1 = J.get$value$x(this._parser$_iterator._current);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseInt(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null, null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseInteger$0: function() {
+      return this._parseInteger$1("");
+    },
+    _parseDecimal$1: function(prefix) {
+      var t1, value;
+      t1 = H.Primitives_parseDouble(H.S(prefix) + H.S(J.get$value$x(this._parser$_iterator._current)), null);
+      this._astFactory.toString;
+      value = H.setRuntimeTypeInfo(new U.Literal(t1), [null]);
+      this._advance$0();
+      return value;
+    },
+    _parseDecimal$0: function() {
+      return this._parseDecimal$1("");
+    }
+  }
+}],
+["polymer_expressions.src.globals", "package:polymer_expressions/src/globals.dart", , K, {
+  "^": "",
+  enumerate: [function(iterable) {
+    return H.setRuntimeTypeInfo(new K.EnumerateIterable(iterable), [null]);
+  }, "call$1", "enumerate$closure", 2, 0, 66, 67],
+  IndexedValue: {
+    "^": "Object;index>,value>",
+    $eq: function(_, o) {
+      if (o == null)
+        return false;
+      return !!J.getInterceptor(o).$isIndexedValue && J.$eq(o.index, this.index) && J.$eq(o.value, this.value);
+    },
+    get$hashCode: function(_) {
+      return J.get$hashCode$(this.value);
+    },
+    toString$0: function(_) {
+      return "(" + H.S(this.index) + ", " + H.S(this.value) + ")";
+    },
+    $isIndexedValue: true
+  },
+  EnumerateIterable: {
+    "^": "IterableBase;_globals$_iterable",
+    get$iterator: function(_) {
+      var t1 = new K.EnumerateIterator(J.get$iterator$ax(this._globals$_iterable), 0, null);
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    get$length: function(_) {
+      return J.get$length$asx(this._globals$_iterable);
+    },
+    get$isEmpty: function(_) {
+      return J.get$isEmpty$asx(this._globals$_iterable);
+    },
+    get$last: function(_) {
+      var t1, t2;
+      t1 = this._globals$_iterable;
+      t2 = J.getInterceptor$asx(t1);
+      t1 = new K.IndexedValue(J.$sub$n(t2.get$length(t1), 1), t2.get$last(t1));
+      t1.$builtinTypeInfo = this.$builtinTypeInfo;
+      return t1;
+    },
+    $asIterableBase: function($V) {
+      return [[K.IndexedValue, $V]];
+    },
+    $asIterable: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  },
+  EnumerateIterator: {
+    "^": "Iterator;_globals$_iterator,_globals$_index,_globals$_current",
+    get$current: function() {
+      return this._globals$_current;
+    },
+    moveNext$0: function() {
+      var t1 = this._globals$_iterator;
+      if (t1.moveNext$0()) {
+        this._globals$_current = H.setRuntimeTypeInfo(new K.IndexedValue(this._globals$_index++, t1.get$current()), [null]);
+        return true;
+      }
+      this._globals$_current = null;
+      return false;
+    },
+    $asIterator: function($V) {
+      return [[K.IndexedValue, $V]];
+    }
+  }
+}],
+["polymer_expressions.tokenizer", "package:polymer_expressions/tokenizer.dart", , Y, {
+  "^": "",
+  escape: function(c) {
+    switch (c) {
+      case 102:
+        return 12;
+      case 110:
+        return 10;
+      case 114:
+        return 13;
+      case 116:
+        return 9;
+      case 118:
+        return 11;
+      default:
+        return c;
+    }
+  },
+  Token: {
+    "^": "Object;kind>,value>,precedence<",
+    toString$0: function(_) {
+      return "(" + this.kind + ", '" + this.value + "')";
+    },
+    $isToken: true
+  },
+  Tokenizer: {
+    "^": "Object;_tokenizer$_tokens,_sb,_tokenizer$_iterator,_tokenizer$_next",
+    tokenize$0: function() {
+      var t1, t2, t3, t4, startChar, op2, op, value;
+      t1 = this._tokenizer$_iterator;
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      for (t2 = this._tokenizer$_tokens; t3 = this._tokenizer$_next, t3 != null;)
+        if (t3 === 32 || t3 === 9 || t3 === 160)
+          this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        else if (t3 === 34 || t3 === 39)
+          this.tokenizeString$0();
+        else {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            t4 = 65 <= t3 && t3 <= 90 || t3 === 95 || t3 === 36 || t3 > 127;
+          else
+            t4 = true;
+          if (t4)
+            this.tokenizeIdentifierOrKeyword$0();
+          else if (48 <= t3 && t3 <= 57)
+            this.tokenizeNumber$0();
+          else if (t3 === 46) {
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (48 <= t3 && t3 <= 57)
+              this.tokenizeFraction$0();
+            else
+              t2.push(new Y.Token(3, ".", 11));
+          } else if (t3 === 44) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(4, ",", 0));
+          } else if (t3 === 58) {
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+            t2.push(new Y.Token(5, ":", 0));
+          } else if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+            startChar = this._tokenizer$_next;
+            t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+            this._tokenizer$_next = t3;
+            if (C.JSArray_methods.contains$1(C.List_mC8, t3)) {
+              t3 = this._tokenizer$_next;
+              op2 = H.Primitives_stringFromCharCodes([startChar, t3]);
+              if (C.JSArray_methods.contains$1(C.List_Ynd, op2)) {
+                t3 = t1.moveNext$0() ? t1._currentCodePoint : null;
+                this._tokenizer$_next = t3;
+                if (t3 === 61)
+                  t3 = startChar === 33 || startChar === 61;
+                else
+                  t3 = false;
+                if (t3) {
+                  op = op2 + "=";
+                  this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+                } else
+                  op = op2;
+              } else
+                op = H.Primitives_stringFromCharCode(startChar);
+            } else
+              op = H.Primitives_stringFromCharCode(startChar);
+            t2.push(new Y.Token(8, op, C.Map_L0K61.$index(0, op)));
+          } else if (C.JSArray_methods.contains$1(C.List_ww8, this._tokenizer$_next)) {
+            value = H.Primitives_stringFromCharCode(this._tokenizer$_next);
+            t2.push(new Y.Token(9, value, C.Map_L0K61.$index(0, value)));
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+          } else
+            this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+        }
+      return t2;
+    },
+    tokenizeString$0: function() {
+      var quoteChar, t1, t2, t3;
+      quoteChar = this._tokenizer$_next;
+      t1 = this._tokenizer$_iterator;
+      t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+      this._tokenizer$_next = t2;
+      for (t3 = this._sb; t2 == null ? quoteChar != null : t2 !== quoteChar;) {
+        if (t2 == null)
+          throw H.wrapException(Y.ParseException$("unterminated string"));
+        if (t2 === 92) {
+          t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+          this._tokenizer$_next = t2;
+          if (t2 == null)
+            throw H.wrapException(Y.ParseException$("unterminated string"));
+          t2 = H.Primitives_stringFromCharCode(Y.escape(t2));
+          t3._contents += t2;
+        } else {
+          t2 = H.Primitives_stringFromCharCode(t2);
+          t3._contents += t2;
+        }
+        t2 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t2;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(1, t3._contents, 0));
+      t3._contents = "";
+      this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+    },
+    tokenizeIdentifierOrKeyword$0: function() {
+      var t1, t2, t3, t4, value;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(97 <= t3 && t3 <= 122))
+            if (!(65 <= t3 && t3 <= 90))
+              t4 = 48 <= t3 && t3 <= 57 || t3 === 95 || t3 === 36 || t3 > 127;
+            else
+              t4 = true;
+          else
+            t4 = true;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      value = t2._contents;
+      t1 = this._tokenizer$_tokens;
+      if (C.JSArray_methods.contains$1(C.List_as_in_this, value))
+        t1.push(new Y.Token(10, value, 0));
+      else
+        t1.push(new Y.Token(2, value, 0));
+      t2._contents = "";
+    },
+    tokenizeNumber$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._tokenizer$_iterator;
+      t2 = this._sb;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t2._contents += t3;
+        this._tokenizer$_next = t1.moveNext$0() ? t1._currentCodePoint : null;
+      }
+      if (t3 === 46) {
+        t1 = t1.moveNext$0() ? t1._currentCodePoint : null;
+        this._tokenizer$_next = t1;
+        if (typeof t1 !== "number")
+          return H.iae(t1);
+        if (48 <= t1 && t1 <= 57)
+          this.tokenizeFraction$0();
+        else
+          this._tokenizer$_tokens.push(new Y.Token(3, ".", 11));
+      } else {
+        this._tokenizer$_tokens.push(new Y.Token(6, t2._contents, 0));
+        t2._contents = "";
+      }
+    },
+    tokenizeFraction$0: function() {
+      var t1, t2, t3, t4;
+      t1 = this._sb;
+      t1.write$1(H.Primitives_stringFromCharCode(46));
+      t2 = this._tokenizer$_iterator;
+      while (true) {
+        t3 = this._tokenizer$_next;
+        if (t3 != null) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t4 = 48 <= t3 && t3 <= 57;
+        } else
+          t4 = false;
+        if (!t4)
+          break;
+        t3 = H.Primitives_stringFromCharCode(t3);
+        t1._contents += t3;
+        this._tokenizer$_next = t2.moveNext$0() ? t2._currentCodePoint : null;
+      }
+      this._tokenizer$_tokens.push(new Y.Token(7, t1._contents, 0));
+      t1._contents = "";
+    }
+  },
+  ParseException: {
+    "^": "Object;message>",
+    toString$0: function(_) {
+      return "ParseException: " + this.message;
+    },
+    static: {ParseException$: function(message) {
+        return new Y.ParseException(message);
+      }}
+  }
+}],
+["polymer_expressions.visitor", "package:polymer_expressions/visitor.dart", , S, {
+  "^": "",
+  Visitor: {
+    "^": "Object;",
+    visit$1: [function(s) {
+      return J.accept$1$x(s, this);
+    }, "call$1", "get$visit", 2, 0, 181, 142]
+  },
+  RecursiveVisitor: {
+    "^": "Visitor;",
+    visitExpression$1: function(e) {
+    },
+    visitEmptyExpression$1: function(e) {
+      this.visitExpression$1(e);
+    },
+    visitParenthesizedExpression$1: function(e) {
+      e.child.accept$1(0, this);
+      this.visitExpression$1(e);
+    },
+    visitGetter$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      this.visitExpression$1(i);
+    },
+    visitIndex$1: function(i) {
+      J.accept$1$x(i.get$receiver(), this);
+      J.accept$1$x(i.get$argument(), this);
+      this.visitExpression$1(i);
+    },
+    visitInvoke$1: function(i) {
+      var t1;
+      J.accept$1$x(i.get$receiver(), this);
+      if (i.get$arguments() != null)
+        for (t1 = i.get$arguments(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+          J.accept$1$x(t1._current, this);
+      this.visitExpression$1(i);
+    },
+    visitLiteral$1: function(l) {
+      this.visitExpression$1(l);
+    },
+    visitListLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$items(), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteral$1: function(l) {
+      var t1;
+      for (t1 = l.get$entries(l), t1 = H.setRuntimeTypeInfo(new H.ListIterator(t1, t1.length, 0, null), [H.getTypeArgumentByIndex(t1, 0)]); t1.moveNext$0();)
+        J.accept$1$x(t1._current, this);
+      this.visitExpression$1(l);
+    },
+    visitMapLiteralEntry$1: function(e) {
+      J.accept$1$x(e.get$key(e), this);
+      J.accept$1$x(e.get$entryValue(), this);
+      this.visitExpression$1(e);
+    },
+    visitIdentifier$1: function(i) {
+      this.visitExpression$1(i);
+    },
+    visitBinaryOperator$1: function(o) {
+      J.accept$1$x(o.get$left(o), this);
+      J.accept$1$x(o.get$right(o), this);
+      this.visitExpression$1(o);
+    },
+    visitUnaryOperator$1: function(o) {
+      J.accept$1$x(o.get$child(), this);
+      this.visitExpression$1(o);
+    },
+    visitTernaryOperator$1: function(o) {
+      J.accept$1$x(o.get$condition(), this);
+      J.accept$1$x(o.get$trueExpr(), this);
+      J.accept$1$x(o.get$falseExpr(), this);
+      this.visitExpression$1(o);
+    },
+    visitInExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    },
+    visitAsExpression$1: function(c) {
+      c.left.accept$1(0, this);
+      c.right.accept$1(0, this);
+      this.visitExpression$1(c);
+    }
+  }
+}],
+["script_inset_element", "package:observatory/src/elements/script_inset.dart", , T, {
+  "^": "",
+  ScriptInsetElement: {
+    "^": "ObservatoryElement_ChangeNotifier43;_script_inset_element$__$script,_script_inset_element$__$pos,_script_inset_element$__$endPos,lineNumbers=,_script_inset_element$__$startLine,_script_inset_element$__$endLine,_script_inset_element$__$lines,_updateFuture,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_inset_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_inset_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_inset_element$__$script, value);
+    },
+    get$pos: function(receiver) {
+      return receiver._script_inset_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_inset_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_inset_element$__$pos, value);
+    },
+    get$endPos: function(receiver) {
+      return receiver._script_inset_element$__$endPos;
+    },
+    set$endPos: function(receiver, value) {
+      receiver._script_inset_element$__$endPos = this.notifyPropertyChange$3(receiver, C.Symbol_endPos, receiver._script_inset_element$__$endPos, value);
+    },
+    get$startLine: function(receiver) {
+      return receiver._script_inset_element$__$startLine;
+    },
+    set$startLine: function(receiver, value) {
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, value);
+    },
+    get$endLine: function(receiver) {
+      return receiver._script_inset_element$__$endLine;
+    },
+    set$endLine: function(receiver, value) {
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, value);
+    },
+    get$lines: function(receiver) {
+      return receiver._script_inset_element$__$lines;
+    },
+    set$lines: function(receiver, value) {
+      receiver._script_inset_element$__$lines = this.notifyPropertyChange$3(receiver, C.Symbol_lines, receiver._script_inset_element$__$lines, value);
+    },
+    attached$0: function(receiver) {
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+    },
+    scriptChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$scriptChanged", 2, 0, 20, 57],
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    endPosChanged$1: [function(receiver, oldValue) {
+      this._updateLines$0(receiver);
+    }, "call$1", "get$endPosChanged", 2, 0, 20, 57],
+    styleForHits$1: [function(receiver, hits) {
+      if (hits == null)
+        return "min-width:32px;";
+      else if (J.$eq(hits, 0))
+        return "min-width:32px; background-color:red";
+      return "min-width:32px; background-color:green";
+    }, "call$1", "get$styleForHits", 2, 0, 15, 182],
+    _updateLines$0: function(receiver) {
+      var t1, t2, i;
+      if (receiver._updateFuture != null)
+        return;
+      if (J.get$loaded$x(receiver._script_inset_element$__$script) !== true) {
+        receiver._updateFuture = J.load$0$x(receiver._script_inset_element$__$script).then$1(new T.ScriptInsetElement__updateLines_closure(receiver));
+        return;
+      }
+      t1 = receiver._script_inset_element$__$pos;
+      t1 = t1 != null ? J.$sub$n(receiver._script_inset_element$__$script.tokenToLine$1(t1), 1) : 0;
+      receiver._script_inset_element$__$startLine = this.notifyPropertyChange$3(receiver, C.Symbol_startLine, receiver._script_inset_element$__$startLine, t1);
+      t1 = receiver._script_inset_element$__$endPos;
+      t2 = receiver._script_inset_element$__$script;
+      t1 = t1 != null ? t2.tokenToLine$1(t1) : J.get$length$asx(J.get$lines$x(t2));
+      receiver._script_inset_element$__$endLine = this.notifyPropertyChange$3(receiver, C.Symbol_endLine, receiver._script_inset_element$__$endLine, t1);
+      t1 = receiver.lineNumbers;
+      t1.clear$0(t1);
+      for (i = receiver._script_inset_element$__$startLine; t2 = J.getInterceptor$n(i), t2.$lt(i, receiver._script_inset_element$__$endLine); i = t2.$add(i, 1))
+        t1.add$1(0, i);
+    },
+    static: {"^": "ScriptInsetElement_hitStyleNone,ScriptInsetElement_hitStyleExecuted,ScriptInsetElement_hitStyleNotExecuted", ScriptInsetElement$created: function(receiver) {
+        var t1, t2, t3, t4;
+        t1 = Q.ObservableList$(null, P.$int);
+        t2 = R._toObservableDeep([]);
+        t3 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t4 = P.String;
+        t4 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t4, null), null, null), [t4, null]);
+        receiver.lineNumbers = t1;
+        receiver._script_inset_element$__$lines = t2;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t3;
+        receiver.polymer$Polymer$$ = t4;
+        C.ScriptInsetElement_methods.Element$created$0(receiver);
+        C.ScriptInsetElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier43: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptInsetElement__updateLines_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(_) {
+      var t1 = this.this_0;
+      if (J.get$loaded$x(t1._script_inset_element$__$script) === true) {
+        t1._updateFuture = null;
+        J._updateLines$0$x(t1);
+      }
+    }, "call$1", null, 2, 0, null, 14, "call"],
+    $isFunction: true
+  }
+}],
+["script_ref_element", "package:observatory/src/elements/script_ref.dart", , A, {
+  "^": "",
+  ScriptRefElement: {
+    "^": "ServiceRefElement_ChangeNotifier1;_script_ref_element$__$pos,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$pos: function(receiver) {
+      return receiver._script_ref_element$__$pos;
+    },
+    set$pos: function(receiver, value) {
+      receiver._script_ref_element$__$pos = this.notifyPropertyChange$3(receiver, C.Symbol_pos, receiver._script_ref_element$__$pos, value);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return Q.ServiceRefElement.prototype.get$hoverText.call(this, receiver);
+      return t1.get$vmName();
+    },
+    posChanged$1: [function(receiver, oldValue) {
+      this._updateProperties$1(receiver, null);
+    }, "call$1", "get$posChanged", 2, 0, 20, 57],
+    _updateProperties$1: [function(receiver, _) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 != null && J.get$loaded$x(t1) === true) {
+        this.notifyPropertyChange$3(receiver, C.Symbol_name, 0, 1);
+        this.notifyPropertyChange$3(receiver, C.Symbol_url, 0, 1);
+      }
+    }, "call$1", "get$_updateProperties", 2, 0, 20, 14],
+    get$name: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return H.S(Q.ServiceRefElement.prototype.get$name.call(this, receiver)) + ":" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$name.call(this, receiver);
+    },
+    get$url: function(receiver) {
+      var t1, script;
+      if (receiver._service_ref_element$__$ref == null)
+        return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+      if (J.$ge$n(receiver._script_ref_element$__$pos, 0)) {
+        t1 = J.get$loaded$x(receiver._service_ref_element$__$ref);
+        script = receiver._service_ref_element$__$ref;
+        if (t1 === true)
+          return Q.ServiceRefElement.prototype.get$url.call(this, receiver) + "#line=" + H.S(script.tokenToLine$1(receiver._script_ref_element$__$pos));
+        else
+          J.load$0$x(script).then$1(this.get$_updateProperties(receiver));
+      }
+      return Q.ServiceRefElement.prototype.get$url.call(this, receiver);
+    },
+    static: {ScriptRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._script_ref_element$__$pos = -1;
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptRefElement_methods.Element$created$0(receiver);
+        C.ScriptRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ServiceRefElement_ChangeNotifier1: {
+    "^": "ServiceRefElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["script_view_element", "package:observatory/src/elements/script_view.dart", , U, {
+  "^": "",
+  ScriptViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier44;_script_view_element$__$script,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$script: function(receiver) {
+      return receiver._script_view_element$__$script;
+    },
+    set$script: function(receiver, value) {
+      receiver._script_view_element$__$script = this.notifyPropertyChange$3(receiver, C.Symbol_script, receiver._script_view_element$__$script, value);
+    },
+    attached$0: function(receiver) {
+      var t1;
+      Z.ObservatoryElement.prototype.attached$0.call(this, receiver);
+      t1 = receiver._script_view_element$__$script;
+      if (t1 == null)
+        return;
+      J.load$0$x(t1);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._script_view_element$__$script).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    refreshCoverage$1: [function(receiver, done) {
+      J.refreshCoverage$0$x(J.get$isolate$x(receiver._script_view_element$__$script)).whenComplete$1(done);
+    }, "call$1", "get$refreshCoverage", 2, 0, 20, 89],
+    static: {ScriptViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ScriptViewElement_methods.Element$created$0(receiver);
+        C.ScriptViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier44: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service", "package:observatory/service.dart", , D, {
+  "^": "",
+  ServiceObject_ServiceObject$_fromMap: function(owner, map) {
+    var t1, type, t2, t3, t4, t5, t6, obj, t7;
+    if (map == null)
+      return;
+    t1 = J.getInterceptor$asx(map);
+    t1 = t1.$index(map, "id") != null && t1.$index(map, "type") != null;
+    if (!t1)
+      N.Logger_Logger("").severe$1("Malformed service object: " + H.S(map));
+    type = J.$index$asx(map, "type");
+    t1 = J.getInterceptor$s(type);
+    switch (t1.startsWith$1(type, "@") ? t1.substring$1(type, 1) : type) {
+      case "Class":
+        t1 = D.Class;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Class(null, null, null, null, null, null, null, null, null, null, new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), new D.Allocations(new D.AllocationCount(0, 0, null, null), new D.AllocationCount(0, 0, null, null)), t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Code":
+        t1 = [];
+        t1.$builtinTypeInfo = [D.CodeCallCount];
+        t2 = [];
+        t2.$builtinTypeInfo = [D.CodeCallCount];
+        t3 = D.CodeInstruction;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t3 = P.$int;
+        t5 = D.CodeTick;
+        t6 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, t3, t5), null, null);
+        t6.$builtinTypeInfo = [t3, t5];
+        obj = new D.Code(null, 0, 0, 0, 0, 0, t1, t2, t4, t6, "", "", null, null, null, false, null, null, false, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Error":
+        obj = new D.DartError(null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Isolate":
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        t2 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.ServiceObject);
+        t3 = [];
+        t3.$builtinTypeInfo = [P.String];
+        t4 = [];
+        t4.$builtinTypeInfo = [D.TagProfileSnapshot];
+        t5 = D.Class;
+        t6 = [];
+        t6.$builtinTypeInfo = [t5];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t5];
+        t5 = D.Library;
+        t7 = [];
+        t7.$builtinTypeInfo = [t5];
+        t7 = new Q.ObservableList(null, null, t7, null, null);
+        t7.$builtinTypeInfo = [t5];
+        t5 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.$double);
+        t5 = R._toObservableDeep(t5);
+        obj = new D.Isolate(t1, null, false, false, true, false, t2, new D.TagProfile(t3, t4, null, null, 20, 0), null, t6, null, t7, null, null, null, null, null, t5, new D.HeapSpace(0, 0, 0, 0, 0, null, null), new D.HeapSpace(0, 0, 0, 0, 0, null, null), null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Library":
+        t1 = D.Library;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        t1 = D.Script;
+        t3 = [];
+        t3.$builtinTypeInfo = [t1];
+        t3 = new Q.ObservableList(null, null, t3, null, null);
+        t3.$builtinTypeInfo = [t1];
+        t1 = D.Class;
+        t4 = [];
+        t4.$builtinTypeInfo = [t1];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t5 = [];
+        t5.$builtinTypeInfo = [t1];
+        t5 = new Q.ObservableList(null, null, t5, null, null);
+        t5.$builtinTypeInfo = [t1];
+        t1 = D.ServiceMap;
+        t6 = [];
+        t6.$builtinTypeInfo = [t1];
+        t6 = new Q.ObservableList(null, null, t6, null, null);
+        t6.$builtinTypeInfo = [t1];
+        obj = new D.Library(null, t2, t3, t4, t5, t6, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceError":
+        obj = new D.ServiceError(null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "ServiceException":
+        obj = new D.ServiceException(null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Script":
+        t1 = D.ScriptLine;
+        t2 = [];
+        t2.$builtinTypeInfo = [t1];
+        t2 = new Q.ObservableList(null, null, t2, null, null);
+        t2.$builtinTypeInfo = [t1];
+        obj = new D.Script(t2, P.LinkedHashMap_LinkedHashMap(null, null, null, P.$int, P.$int), null, null, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      case "Socket":
+        obj = new D.Socket(null, null, null, null, "", false, false, false, false, null, null, null, null, null, null, null, owner, null, null, false, null, null, null, null, null);
+        break;
+      default:
+        t1 = new V.ObservableMap(P.HashMap_HashMap(null, null, null, null, null), null, null);
+        t1.$builtinTypeInfo = [null, null];
+        obj = new D.ServiceMap(t1, owner, null, null, false, null, null, null, null, null);
+    }
+    obj.update$1(map);
+    return obj;
+  },
+  _isServiceMap: function(m) {
+    var t1;
+    if (m != null) {
+      t1 = J.getInterceptor$asx(m);
+      t1 = t1.$index(m, "id") != null && t1.$index(m, "type") != null;
+    } else
+      t1 = false;
+    return t1;
+  },
+  _upgradeCollection: function(collection, owner) {
+    var t1 = J.getInterceptor(collection);
+    if (!!t1.$isServiceMap)
+      return;
+    if (!!t1.$isObservableMap)
+      D._upgradeObservableMap(collection, owner);
+    else if (!!t1.$isObservableList)
+      D._upgradeObservableList(collection, owner);
+  },
+  _upgradeObservableMap: function(map, owner) {
+    map.forEach$1(0, new D._upgradeObservableMap_closure(map, owner));
+  },
+  _upgradeObservableList: function(list, owner) {
+    var t1, i, v, t2, t3, t4;
+    for (t1 = list._observable_list$_list, i = 0; i < t1.length; ++i) {
+      v = t1[i];
+      t2 = J.getInterceptor(v);
+      t3 = !!t2.$isObservableMap;
+      if (t3)
+        t4 = t2.$index(v, "id") != null && t2.$index(v, "type") != null;
+      else
+        t4 = false;
+      if (t4)
+        list.$indexSet(0, i, owner.getFromMap$1(v));
+      else if (!!t2.$isObservableList)
+        D._upgradeObservableList(v, owner);
+      else if (t3)
+        D._upgradeObservableMap(v, owner);
+    }
+  },
+  ServiceObject: {
+    "^": "ChangeNotifier;_service$__$name@,_service$__$vmName@",
+    get$vm: function(_) {
+      var t1 = this._owner;
+      return t1.get$vm(t1);
+    },
+    get$isolate: function(_) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1);
+    },
+    get$id: function(_) {
+      return this._id;
+    },
+    get$serviceType: function() {
+      return this._serviceType;
+    },
+    get$link: function(_) {
+      return this._owner.relativeLink$1(this._id);
+    },
+    get$loaded: function(_) {
+      return this._loaded;
+    },
+    get$canCache: function() {
+      return false;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    get$name: function(_) {
+      return this.get$_service$__$name();
+    },
+    set$name: function(_, value) {
+      this.set$_service$__$name(this.notifyPropertyChange$3(this, C.Symbol_name, this.get$_service$__$name(), value));
+    },
+    get$vmName: function() {
+      return this.get$_service$__$vmName();
+    },
+    set$vmName: function(value) {
+      this.set$_service$__$vmName(this.notifyPropertyChange$3(this, C.Symbol_vmName, this.get$_service$__$vmName(), value));
+    },
+    load$0: function(_) {
+      if (this._loaded)
+        return P._Future$immediate(this, null);
+      return this.reload$0(0);
+    },
+    reload$0: function(_) {
+      var t1;
+      if (J.$eq(this._id, ""))
+        return P._Future$immediate(this, null);
+      if (this._loaded && this.get$immutable())
+        return P._Future$immediate(this, null);
+      t1 = this._inProgressReload;
+      if (t1 == null) {
+        t1 = this.get$vm(this).getAsMap$1(this.get$link(this)).then$1(new D.ServiceObject_reload_closure(this)).whenComplete$1(new D.ServiceObject_reload_closure0(this));
+        this._inProgressReload = t1;
+      }
+      return t1;
+    },
+    update$1: function(map) {
+      var t1, mapIsRef, mapType, t2;
+      t1 = J.getInterceptor$asx(map);
+      mapIsRef = J.startsWith$1$s(t1.$index(map, "type"), "@");
+      mapType = t1.$index(map, "type");
+      t2 = J.getInterceptor$s(mapType);
+      if (t2.startsWith$1(mapType, "@"))
+        mapType = t2.substring$1(mapType, 1);
+      t2 = this._id;
+      if (t2 != null && !J.$eq(t2, t1.$index(map, "id")))
+        ;
+      this._id = t1.$index(map, "id");
+      this._serviceType = mapType;
+      this._service$_update$2(0, map, mapIsRef);
+    },
+    $isServiceObject: true
+  },
+  ServiceObject_reload_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(map) {
+      var mapType, t1;
+      mapType = J.$index$asx(map, "type");
+      t1 = J.getInterceptor$s(mapType);
+      if (t1.startsWith$1(mapType, "@"))
+        mapType = t1.substring$1(mapType, 1);
+      t1 = this.this_0;
+      if (!J.$eq(mapType, t1._serviceType))
+        return D.ServiceObject_ServiceObject$_fromMap(t1._owner, map);
+      t1.update$1(map);
+      return t1;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  ServiceObject_reload_closure0: {
+    "^": "Closure:69;this_1",
+    call$0: [function() {
+      this.this_1._inProgressReload = null;
+    }, "call$0", null, 0, 0, null, "call"],
+    $isFunction: true
+  },
+  ServiceObjectOwner: {
+    "^": "ServiceObject;"
+  },
+  VM: {
+    "^": "ServiceObjectOwner_ChangeNotifier;",
+    get$vm: function(_) {
+      return this;
+    },
+    get$isolate: function(_) {
+      return;
+    },
+    get$isolates: function() {
+      var t1 = this._isolateCache;
+      return t1.get$values(t1);
+    },
+    get$link: function(_) {
+      return H.S(this._id);
+    },
+    relativeLink$1: [function(id) {
+      return H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    get$version: function(_) {
+      return this._service$__$version;
+    },
+    get$uptime: function() {
+      return this._service$__$uptime;
+    },
+    get$assertsEnabled: function() {
+      return this._service$__$assertsEnabled;
+    },
+    get$typeChecksEnabled: function() {
+      return this._service$__$typeChecksEnabled;
+    },
+    get$pid: function() {
+      return this._service$__$pid;
+    },
+    get$lastUpdate: function() {
+      return this._service$__$lastUpdate;
+    },
+    _parseObjectId$1: function(id) {
+      var m, t1, t2, t3;
+      m = $.get$VM__currentObjectMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return;
+      t1 = m._match;
+      t2 = t1.input;
+      t3 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return C.JSString_methods.substring$1(t2, t3 + t1);
+    },
+    _parseIsolateId$1: function(id) {
+      var m, t1, t2;
+      m = $.get$VM__currentIsolateMatcher().matchAsPrefix$1(0, id);
+      if (m == null)
+        return "";
+      t1 = m._match;
+      t2 = t1.index;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t1 = J.get$length$asx(t1[0]);
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      return J.substring$2$s(id, 0, t2 + t1);
+    },
+    getFromMap$1: function(map) {
+      throw H.wrapException(P.UnimplementedError$(null));
+    },
+    _getIsolate$1: function(isolateId) {
+      var isolate;
+      if (isolateId === "")
+        return P._Future$immediate(null, null);
+      isolate = this._isolateCache.$index(0, isolateId);
+      if (isolate != null)
+        return P._Future$immediate(isolate, null);
+      return this.reload$0(0).then$1(new D.VM__getIsolate_closure(this, isolateId));
+    },
+    get$1: function(id) {
+      var isolateId, objectId, obj;
+      if (J.startsWith$1$s(id, "isolates/")) {
+        isolateId = this._parseIsolateId$1(id);
+        objectId = this._parseObjectId$1(id);
+        return this._getIsolate$1(isolateId).then$1(new D.VM_get_closure(this, objectId));
+      }
+      obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this.getAsMap$1(id).then$1(new D.VM_get_closure0(this, id));
+    },
+    _service$_reviver$2: [function(key, value) {
+      return value;
+    }, "call$2", "get$_service$_reviver", 4, 0, 75],
+    _parseJSON$1: function(response) {
+      var map, decoder, exception;
+      map = null;
+      try {
+        decoder = new P.JsonDecoder(this.get$_service$_reviver());
+        map = P._parseJson(response, decoder.get$_reviver());
+      } catch (exception) {
+        H.unwrapException(exception);
+        return;
+      }
+
+      return R._toObservableDeep(map);
+    },
+    _processMap$1: function(map) {
+      var t1;
+      if (!D._isServiceMap(map)) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "FormatException", "response", map, "message", "Top level service responses must be service maps."], null, null);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, R._toObservableDeep(t1)), null, null);
+      }
+      t1 = J.getInterceptor$asx(map);
+      if (J.$eq(t1.$index(map, "type"), "ServiceError"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      else if (J.$eq(t1.$index(map, "type"), "ServiceException"))
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this, map), null, null);
+      return P._Future$immediate(map, null);
+    },
+    getAsMap$1: function(id) {
+      return this.getString$1(0, id).then$1(new D.VM_getAsMap_closure(this)).catchError$2$test(new D.VM_getAsMap_closure0(this), new D.VM_getAsMap_closure1()).catchError$2$test(new D.VM_getAsMap_closure2(this), new D.VM_getAsMap_closure3());
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "version");
+      this._service$__$version = F.notifyPropertyChangeHelper(this, C.Symbol_version, this._service$__$version, t2);
+      t2 = t1.$index(map, "architecture");
+      this._service$__$architecture = F.notifyPropertyChangeHelper(this, C.Symbol_architecture, this._service$__$architecture, t2);
+      t2 = t1.$index(map, "uptime");
+      this._service$__$uptime = F.notifyPropertyChangeHelper(this, C.Symbol_uptime, this._service$__$uptime, t2);
+      t2 = P.DateTime$fromMillisecondsSinceEpoch(H.Primitives_parseInt(t1.$index(map, "date"), null, null), false);
+      this._service$__$lastUpdate = F.notifyPropertyChangeHelper(this, C.Symbol_lastUpdate, this._service$__$lastUpdate, t2);
+      t2 = t1.$index(map, "assertsEnabled");
+      this._service$__$assertsEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_assertsEnabled, this._service$__$assertsEnabled, t2);
+      t2 = t1.$index(map, "pid");
+      this._service$__$pid = F.notifyPropertyChangeHelper(this, C.Symbol_pid, this._service$__$pid, t2);
+      t2 = t1.$index(map, "typeChecksEnabled");
+      this._service$__$typeChecksEnabled = F.notifyPropertyChangeHelper(this, C.Symbol_typeChecksEnabled, this._service$__$typeChecksEnabled, t2);
+      this._updateIsolates$1(t1.$index(map, "isolates"));
+    },
+    _updateIsolates$1: function(newIsolates) {
+      var oldIsolateCache, newIsolateCache, t1, isolateMap, isolateId, isolate;
+      oldIsolateCache = this._isolateCache;
+      newIsolateCache = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, D.Isolate);
+      for (t1 = J.get$iterator$ax(newIsolates); t1.moveNext$0();) {
+        isolateMap = t1.get$current();
+        isolateId = J.$index$asx(isolateMap, "id");
+        isolate = oldIsolateCache.$index(0, isolateId);
+        if (isolate != null)
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+        else {
+          isolate = D.ServiceObject_ServiceObject$_fromMap(this, isolateMap);
+          newIsolateCache.$indexSet(0, isolateId, isolate);
+          N.Logger_Logger("").info$1("New isolate '" + H.S(isolate._id) + "'");
+        }
+      }
+      newIsolateCache.forEach$1(0, new D.VM__updateIsolates_closure());
+      this._isolateCache = newIsolateCache;
+    },
+    VM$0: function() {
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, "vm");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, "vm");
+      this._cache.$indexSet(0, "vm", this);
+      var t1 = P.LinkedHashMap_LinkedHashMap$_literal(["id", "vm", "type", "@VM"], null, null);
+      this.update$1(R._toObservableDeep(t1));
+    },
+    $isVM: true
+  },
+  ServiceObjectOwner_ChangeNotifier: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  VM__getIsolate_closure: {
+    "^": "Closure:13;this_0,isolateId_1",
+    call$1: [function(result) {
+      if (!J.getInterceptor(result).$isVM)
+        return;
+      return this.this_0._isolateCache.$index(0, this.isolateId_1);
+    }, "call$1", null, 2, 0, null, 129, "call"],
+    $isFunction: true
+  },
+  VM_get_closure: {
+    "^": "Closure:13;this_0,objectId_1",
+    call$1: [function(isolate) {
+      var t1;
+      if (isolate == null)
+        return this.this_0;
+      t1 = this.objectId_1;
+      if (t1 == null)
+        return J.reload$0$x(isolate);
+      else
+        return isolate.get$1(t1);
+    }, "call$1", null, 2, 0, null, 7, "call"],
+    $isFunction: true
+  },
+  VM_get_closure0: {
+    "^": "Closure:184;this_2,id_3",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_2;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_3, new D.VM_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  VM_get__closure: {
+    "^": "Closure:69;obj_4",
+    call$0: function() {
+      return this.obj_4;
+    },
+    $isFunction: true
+  },
+  VM_getAsMap_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(response) {
+      var map, e, exception, t1;
+      map = null;
+      try {
+        map = this.this_0._parseJSON$1(response);
+      } catch (exception) {
+        t1 = H.unwrapException(exception);
+        e = t1;
+        P.print("Hit V8 bug.");
+        t1 = P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "kind", "DecodeException", "response", "This is likely a result of a known V8 bug. Although the the bug has been fixed the fix may not be in your Chrome version. For more information see dartbug.com/18385. Observatory is still functioning and you should try your action again.", "message", "Could not decode JSON: " + H.S(e)], null, null);
+        t1 = R._toObservableDeep(t1);
+        return P._Future$immediateError(D.ServiceObject_ServiceObject$_fromMap(this.this_0, t1), null, null);
+      }
+
+      return this.this_0._processMap$1(map);
+    }, "call$1", null, 2, 0, null, 132, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure0: {
+    "^": "Closure:13;this_1",
+    call$1: [function(error) {
+      var t1 = this.this_1.errors;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(error);
+      return P._Future$immediateError(error, null, null);
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure1: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceError;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure2: {
+    "^": "Closure:13;this_2",
+    call$1: [function(exception) {
+      var t1 = this.this_2.exceptions;
+      if (t1._state >= 4)
+        H.throwExpression(t1._addEventError$0());
+      t1._sendData$1(exception);
+      return P._Future$immediateError(exception, null, null);
+    }, "call$1", null, 2, 0, null, 85, "call"],
+    $isFunction: true
+  },
+  VM_getAsMap_closure3: {
+    "^": "Closure:13;",
+    call$1: [function(e) {
+      return !!J.getInterceptor(e).$isServiceException;
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  VM__updateIsolates_closure: {
+    "^": "Closure:75;",
+    call$2: function(isolateId, isolate) {
+      J.reload$0$x(isolate);
+    },
+    $isFunction: true
+  },
+  TagProfileSnapshot: {
+    "^": "Object;seconds,counters>,_sum",
+    set$1: function(counters) {
+      var t1, t2, i, t3, t4;
+      t1 = this.counters;
+      H.IterableMixinWorkaround_setAllList(t1, 0, counters);
+      for (t2 = t1.length, i = 0; i < t2; ++i) {
+        t3 = this._sum;
+        t4 = t1[i];
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        this._sum = t3 + t4;
+      }
+    },
+    delta$2: function(counters, old_counters) {
+      var t1, t2, t3, t4, i, t5, t6;
+      for (t1 = this.counters, t2 = t1.length, t3 = J.getInterceptor$asx(counters), t4 = old_counters.length, i = 0; i < t2; ++i) {
+        t5 = t3.$index(counters, i);
+        if (i >= t4)
+          return H.ioore(old_counters, i);
+        t5 = J.$sub$n(t5, old_counters[i]);
+        t1[i] = t5;
+        t6 = this._sum;
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        this._sum = t6 + t5;
+      }
+    },
+    max$1: function(_, counters) {
+      var t1, t2, t3, i, t4, c;
+      t1 = J.getInterceptor$asx(counters);
+      t2 = this.counters;
+      t3 = t2.length;
+      i = 0;
+      while (true) {
+        t4 = t1.get$length(counters);
+        if (typeof t4 !== "number")
+          return H.iae(t4);
+        if (!(i < t4))
+          break;
+        c = t1.$index(counters, i);
+        if (i >= t3)
+          return H.ioore(t2, i);
+        t2[i] = J.$gt$n(t2[i], c) ? t2[i] : c;
+        ++i;
+      }
+    },
+    zero$0: function() {
+      var t1, t2, i;
+      for (t1 = this.counters, t2 = t1.length, i = 0; i < t2; ++i)
+        t1[i] = 0;
+    },
+    $isTagProfileSnapshot: true
+  },
+  TagProfile: {
+    "^": "Object;names<,snapshots<,_seconds,_maxSnapshot,_historySize,_countersLength",
+    get$updatedAtSeconds: function() {
+      return this._seconds;
+    },
+    _processTagProfile$2: function(seconds, tagProfile) {
+      var t1, counters, t2, i, t3, snapshot;
+      this._seconds = seconds;
+      t1 = J.getInterceptor$asx(tagProfile);
+      counters = t1.$index(tagProfile, "counters");
+      t2 = this.names;
+      if (t2.length === 0) {
+        C.JSArray_methods.addAll$1(t2, t1.$index(tagProfile, "names"));
+        this._countersLength = J.get$length$asx(t1.$index(tagProfile, "counters"));
+        for (t1 = this._historySize, t2 = this.snapshots, i = 0; t3 = this._countersLength, i < t1; ++i) {
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          t3 = Array(t3);
+          t3.fixed$length = init;
+          t3.$builtinTypeInfo = [P.$int];
+          snapshot = new D.TagProfileSnapshot(0, t3, 0);
+          snapshot.zero$0();
+          t2.push(snapshot);
+        }
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        t1 = Array(t3);
+        t1.fixed$length = init;
+        t1 = new D.TagProfileSnapshot(0, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+        this._maxSnapshot = t1;
+        t1.set$1(counters);
+        return;
+      }
+      t1 = this._countersLength;
+      if (typeof t1 !== "number")
+        return H.iae(t1);
+      t1 = Array(t1);
+      t1.fixed$length = init;
+      snapshot = new D.TagProfileSnapshot(seconds, H.setRuntimeTypeInfo(t1, [P.$int]), 0);
+      snapshot.delta$2(counters, this._maxSnapshot.counters);
+      this._maxSnapshot.max$1(0, counters);
+      t1 = this.snapshots;
+      t1.push(snapshot);
+      if (t1.length > this._historySize)
+        C.JSArray_methods.removeAt$1(t1, 0);
+    }
+  },
+  HeapSpace: {
+    "^": "ChangeNotifier;_service$__$used,_service$__$capacity,_service$__$external,_service$__$collections,_service$__$totalCollectionTimeInSeconds,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$used: function() {
+      return this._service$__$used;
+    },
+    get$capacity: function() {
+      return this._service$__$capacity;
+    },
+    get$external: function() {
+      return this._service$__$external;
+    },
+    get$collections: function() {
+      return this._service$__$collections;
+    },
+    get$totalCollectionTimeInSeconds: function() {
+      return this._service$__$totalCollectionTimeInSeconds;
+    },
+    update$1: function(heapMap) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(heapMap);
+      t2 = t1.$index(heapMap, "used");
+      this._service$__$used = F.notifyPropertyChangeHelper(this, C.Symbol_used, this._service$__$used, t2);
+      t2 = t1.$index(heapMap, "capacity");
+      this._service$__$capacity = F.notifyPropertyChangeHelper(this, C.Symbol_capacity, this._service$__$capacity, t2);
+      t2 = t1.$index(heapMap, "external");
+      this._service$__$external = F.notifyPropertyChangeHelper(this, C.Symbol_external, this._service$__$external, t2);
+      t2 = t1.$index(heapMap, "collections");
+      this._service$__$collections = F.notifyPropertyChangeHelper(this, C.Symbol_collections, this._service$__$collections, t2);
+      t1 = t1.$index(heapMap, "time");
+      this._service$__$totalCollectionTimeInSeconds = F.notifyPropertyChangeHelper(this, C.Symbol_totalCollectionTimeInSeconds, this._service$__$totalCollectionTimeInSeconds, t1);
+    }
+  },
+  Isolate: {
+    "^": "ServiceObjectOwner_ChangeNotifier0;_service$__$counters,_service$__$pauseEvent,_service$__$running,_service$__$idle,_service$__$loading,_service$__$ioEnabled,_cache,tagProfile,_service$__$objectClass,rootClasses,_service$__$rootLib,_service$__$libraries,_service$__$topFrame,_service$__$name:service$Isolate$_service$__$name@,_service$__$vmName:service$Isolate$_service$__$vmName@,_service$__$mainPort,_service$__$entry,timers,newSpace<,oldSpace<,_service$__$fileAndLine,_service$__$error,profileTrieRoot<,_trieDataCursor,_trieData,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$vm: function(_) {
+      return this._owner;
+    },
+    get$isolate: function(_) {
+      return this;
+    },
+    get$counters: function(_) {
+      return this._service$__$counters;
+    },
+    set$counters: function(_, value) {
+      this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, value);
+    },
+    get$link: function(_) {
+      return "/" + H.S(this._id);
+    },
+    get$pauseEvent: function(_) {
+      return this._service$__$pauseEvent;
+    },
+    get$running: function() {
+      return this._service$__$running;
+    },
+    get$idle: function() {
+      return this._service$__$idle;
+    },
+    get$loading: function() {
+      return this._service$__$loading;
+    },
+    relativeLink$1: [function(id) {
+      return "/" + H.S(this._id) + "/" + H.S(id);
+    }, "call$1", "get$relativeLink", 2, 0, 151, 185],
+    processProfile$1: function(profile) {
+      var codeTable, t1, t2, exclusiveTrie;
+      codeTable = H.setRuntimeTypeInfo([], [D.Code]);
+      t1 = J.getInterceptor$asx(profile);
+      for (t2 = J.get$iterator$ax(t1.$index(profile, "codes")); t2.moveNext$0();)
+        codeTable.push(J.$index$asx(t2.get$current(), "code"));
+      this._resetProfileData$0();
+      this._updateProfileData$2(profile, codeTable);
+      exclusiveTrie = t1.$index(profile, "exclusive_trie");
+      if (exclusiveTrie != null)
+        this.profileTrieRoot = this._processProfileTrie$2(exclusiveTrie, codeTable);
+    },
+    _resetProfileData$0: function() {
+      var t1 = this._cache;
+      t1.get$values(t1).forEach$1(0, new D.Isolate__resetProfileData_closure());
+    },
+    _updateProfileData$2: function(profile, codeTable) {
+      var t1, codeRegions, sampleCount, codeRegion;
+      t1 = J.getInterceptor$asx(profile);
+      codeRegions = t1.$index(profile, "codes");
+      sampleCount = t1.$index(profile, "samples");
+      for (t1 = J.get$iterator$ax(codeRegions); t1.moveNext$0();) {
+        codeRegion = t1.get$current();
+        J.$index$asx(codeRegion, "code").updateProfileData$3(codeRegion, codeTable, sampleCount);
+      }
+    },
+    refreshCoverage$0: [function(_) {
+      return this.get$1("coverage").then$1(this.get$_processCoverage());
+    }, "call$0", "get$refreshCoverage", 0, 0, 186],
+    _processCoverage$1: [function(coverage) {
+      J.forEach$1$ax(J.$index$asx(coverage, "coverage"), new D.Isolate__processCoverage_closure(this));
+    }, "call$1", "get$_processCoverage", 2, 0, 134, 187],
+    getClassHierarchy$0: function() {
+      return this.get$1("classes").then$1(this.get$_loadClasses()).then$1(this.get$_buildClassHierarchy());
+    },
+    _loadClasses$1: [function(classList) {
+      var futureClasses, t1, cls, t2;
+      futureClasses = [];
+      for (t1 = J.get$iterator$ax(J.$index$asx(classList, "members")); t1.moveNext$0();) {
+        cls = t1.get$current();
+        t2 = J.getInterceptor(cls);
+        if (!!t2.$isClass)
+          futureClasses.push(t2.load$0(cls));
+      }
+      return P.Future_wait(futureClasses, false);
+    }, "call$1", "get$_loadClasses", 2, 0, 188, 189],
+    _buildClassHierarchy$1: [function(classes) {
+      var t1, t2, cls, t3;
+      t1 = this.rootClasses;
+      t1.clear$0(t1);
+      this._service$__$objectClass = F.notifyPropertyChangeHelper(this, C.Symbol_objectClass, this._service$__$objectClass, null);
+      for (t2 = J.get$iterator$ax(classes); t2.moveNext$0();) {
+        cls = t2.get$current();
+        if (cls.get$superClass() == null)
+          t1.add$1(0, cls);
+        if (J.$eq(cls.get$vmName(), "Object") && J.$eq(cls.get$isPatch(), false)) {
+          t3 = this._service$__$objectClass;
+          if (this.get$hasObservers(this) && !J.$eq(t3, cls)) {
+            t3 = new T.PropertyChangeRecord(this, C.Symbol_objectClass, t3, cls);
+            t3.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t3);
+          }
+          this._service$__$objectClass = cls;
+        }
+      }
+      return P._Future$immediate(this._service$__$objectClass, null);
+    }, "call$1", "get$_buildClassHierarchy", 2, 0, 190, 191],
+    getFromMap$1: function(map) {
+      var id, t1, obj;
+      if (map == null)
+        return;
+      id = J.$index$asx(map, "id");
+      t1 = this._cache;
+      obj = t1.$index(0, id);
+      if (obj != null)
+        return obj;
+      obj = D.ServiceObject_ServiceObject$_fromMap(this, map);
+      if (obj.get$canCache())
+        t1.$indexSet(0, id, obj);
+      return obj;
+    },
+    get$1: function(id) {
+      var obj = this._cache.$index(0, id);
+      if (obj != null)
+        return J.reload$0$x(obj);
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/" + H.S(id)).then$1(new D.Isolate_get_closure(this, id));
+    },
+    get$objectClass: function() {
+      return this._service$__$objectClass;
+    },
+    get$rootLib: function() {
+      return this._service$__$rootLib;
+    },
+    set$rootLib: function(value) {
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, value);
+    },
+    get$libraries: function() {
+      return this._service$__$libraries;
+    },
+    get$topFrame: function() {
+      return this._service$__$topFrame;
+    },
+    get$name: function(_) {
+      return this.service$Isolate$_service$__$name;
+    },
+    set$name: function(_, value) {
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, value);
+    },
+    get$vmName: function() {
+      return this.service$Isolate$_service$__$vmName;
+    },
+    set$vmName: function(value) {
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, value);
+    },
+    get$mainPort: function() {
+      return this._service$__$mainPort;
+    },
+    get$entry: function() {
+      return this._service$__$entry;
+    },
+    set$entry: function(value) {
+      this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    updateHeapsFromMap$1: function(map) {
+      var t1 = J.getInterceptor$asx(map);
+      this.newSpace.update$1(t1.$index(map, "new"));
+      this.oldSpace.update$1(t1.$index(map, "old"));
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, countersMap, names, counts, sum, i, t3, t4, timerMap, features;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "mainPort");
+      this._service$__$mainPort = F.notifyPropertyChangeHelper(this, C.Symbol_mainPort, this._service$__$mainPort, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$name = F.notifyPropertyChangeHelper(this, C.Symbol_name, this.service$Isolate$_service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this.service$Isolate$_service$__$vmName = F.notifyPropertyChangeHelper(this, C.Symbol_vmName, this.service$Isolate$_service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      this._service$__$loading = F.notifyPropertyChangeHelper(this, C.Symbol_loading, this._service$__$loading, false);
+      D._upgradeCollection(map, this);
+      if (t1.$index(map, "rootLib") == null || t1.$index(map, "timers") == null || t1.$index(map, "heaps") == null) {
+        N.Logger_Logger("").severe$1("Malformed 'Isolate' response: " + H.S(map));
+        return;
+      }
+      t2 = t1.$index(map, "rootLib");
+      this._service$__$rootLib = F.notifyPropertyChangeHelper(this, C.Symbol_rootLib, this._service$__$rootLib, t2);
+      if (t1.$index(map, "entry") != null) {
+        t2 = t1.$index(map, "entry");
+        this._service$__$entry = F.notifyPropertyChangeHelper(this, C.Symbol_entry, this._service$__$entry, t2);
+      }
+      if (t1.$index(map, "topFrame") != null) {
+        t2 = t1.$index(map, "topFrame");
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, t2);
+      } else
+        this._service$__$topFrame = F.notifyPropertyChangeHelper(this, C.Symbol_topFrame, this._service$__$topFrame, null);
+      countersMap = t1.$index(map, "tagCounters");
+      if (countersMap != null) {
+        t2 = J.getInterceptor$asx(countersMap);
+        names = t2.$index(countersMap, "names");
+        counts = t2.$index(countersMap, "counters");
+        t2 = J.getInterceptor$asx(counts);
+        sum = 0;
+        i = 0;
+        while (true) {
+          t3 = t2.get$length(counts);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(i < t3))
+            break;
+          t3 = t2.$index(counts, i);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          sum += t3;
+          ++i;
+        }
+        t3 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        t3 = R._toObservableDeep(t3);
+        this._service$__$counters = F.notifyPropertyChangeHelper(this, C.Symbol_counters, this._service$__$counters, t3);
+        if (sum === 0) {
+          t2 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t3 = t2.get$length(names);
+            if (typeof t3 !== "number")
+              return H.iae(t3);
+            if (!(i < t3))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t2.$index(names, i), "0.0%");
+            ++i;
+          }
+        } else {
+          t3 = J.getInterceptor$asx(names);
+          i = 0;
+          while (true) {
+            t4 = t3.get$length(names);
+            if (typeof t4 !== "number")
+              return H.iae(t4);
+            if (!(i < t4))
+              break;
+            J.$indexSet$ax(this._service$__$counters, t3.$index(names, i), C.JSNumber_methods.toStringAsFixed$1(J.$div$n(t2.$index(counts, i), sum) * 100, 2) + "%");
+            ++i;
+          }
+        }
+      }
+      timerMap = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      J.forEach$1$ax(t1.$index(map, "timers"), new D.Isolate__update_closure(timerMap));
+      t2 = this.timers;
+      t3 = J.getInterceptor$ax(t2);
+      t3.$indexSet(t2, "total", timerMap.$index(0, "time_total_runtime"));
+      t3.$indexSet(t2, "compile", timerMap.$index(0, "time_compilation"));
+      t3.$indexSet(t2, "gc", 0);
+      t3.$indexSet(t2, "init", J.$add$ns(J.$add$ns(J.$add$ns(timerMap.$index(0, "time_script_loading"), timerMap.$index(0, "time_creating_snapshot")), timerMap.$index(0, "time_isolate_initialization")), timerMap.$index(0, "time_bootstrap")));
+      t3.$indexSet(t2, "dart", timerMap.$index(0, "time_dart_execution"));
+      this.updateHeapsFromMap$1(t1.$index(map, "heaps"));
+      features = t1.$index(map, "features");
+      if (features != null)
+        for (t2 = J.get$iterator$ax(features); t2.moveNext$0();)
+          if (J.$eq(t2.get$current(), "io")) {
+            t3 = this._service$__$ioEnabled;
+            if (this.get$hasObservers(this) && !J.$eq(t3, true)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_ioEnabled, t3, true);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$ioEnabled = true;
+          }
+      t2 = t1.$index(map, "pauseEvent");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_pauseEvent, this._service$__$pauseEvent, t2);
+      this._service$__$pauseEvent = t2;
+      t2 = t2 == null && t1.$index(map, "topFrame") != null;
+      this._service$__$running = F.notifyPropertyChangeHelper(this, C.Symbol_running, this._service$__$running, t2);
+      t2 = this._service$__$pauseEvent == null && t1.$index(map, "topFrame") == null;
+      this._service$__$idle = F.notifyPropertyChangeHelper(this, C.Symbol_idle, this._service$__$idle, t2);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      t2 = this._service$__$libraries;
+      t2.clear$0(t2);
+      for (t1 = J.get$iterator$ax(t1.$index(map, "libraries")); t1.moveNext$0();)
+        t2.add$1(0, t1.get$current());
+      t2.sort$1(t2, new D.Isolate__update_closure0());
+    },
+    updateTagProfile$0: function() {
+      return this._owner.getAsMap$1("/" + H.S(this._id) + "/profile/tag").then$1(new D.Isolate_updateTagProfile_closure(this));
+    },
+    _processProfileTrie$2: function(data, codeTable) {
+      this._trieDataCursor = 0;
+      this._trieData = data;
+      if (data == null)
+        return;
+      if (J.$lt$n(J.get$length$asx(data), 3))
+        return;
+      return this._readTrieNode$1(codeTable);
+    },
+    _readTrieNode$1: function(codeTable) {
+      var t1, t2, index, code, count, node, t3, children, i, child;
+      t1 = this._trieData;
+      t2 = this._trieDataCursor;
+      if (typeof t2 !== "number")
+        return t2.$add();
+      this._trieDataCursor = t2 + 1;
+      index = J.$index$asx(t1, t2);
+      if (index >>> 0 !== index || index >= codeTable.length)
+        return H.ioore(codeTable, index);
+      code = codeTable[index];
+      t2 = this._trieData;
+      t1 = this._trieDataCursor;
+      if (typeof t1 !== "number")
+        return t1.$add();
+      this._trieDataCursor = t1 + 1;
+      count = J.$index$asx(t2, t1);
+      t1 = [];
+      t1.$builtinTypeInfo = [D.CodeTrieNode];
+      node = new D.CodeTrieNode(code, count, t1, 0);
+      t2 = this._trieData;
+      t3 = this._trieDataCursor;
+      if (typeof t3 !== "number")
+        return t3.$add();
+      this._trieDataCursor = t3 + 1;
+      children = J.$index$asx(t2, t3);
+      if (typeof children !== "number")
+        return H.iae(children);
+      i = 0;
+      for (; i < children; ++i) {
+        child = this._readTrieNode$1(codeTable);
+        t1.push(child);
+        t2 = node.summedChildCount;
+        t3 = child.count;
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        node.summedChildCount = t2 + t3;
+      }
+      return node;
+    },
+    $isIsolate: true,
+    static: {"^": "Isolate_TAG_ROOT_ID"}
+  },
+  ServiceObjectOwner_ChangeNotifier0: {
+    "^": "ServiceObjectOwner+ChangeNotifier;",
+    $isObservable: true
+  },
+  Isolate__resetProfileData_closure: {
+    "^": "Closure:13;",
+    call$1: function(value) {
+      if (!!J.getInterceptor(value).$isCode) {
+        value._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(value, C.Symbol_totalSamplesInProfile, value._service$__$totalSamplesInProfile, 0);
+        value.exclusiveTicks = 0;
+        value.inclusiveTicks = 0;
+        value._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedInclusiveTicks, value._service$__$formattedInclusiveTicks, "");
+        value._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(value, C.Symbol_formattedExclusiveTicks, value._service$__$formattedExclusiveTicks, "");
+        C.JSArray_methods.set$length(value.callers, 0);
+        C.JSArray_methods.set$length(value.callees, 0);
+        value.addressTicks.clear$0(0);
+      }
+    },
+    $isFunction: true
+  },
+  Isolate__processCoverage_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(scriptCoverage) {
+      var t1 = J.getInterceptor$asx(scriptCoverage);
+      t1.$index(scriptCoverage, "script")._processHits$1(t1.$index(scriptCoverage, "hits"));
+    }, "call$1", null, 2, 0, null, 192, "call"],
+    $isFunction: true
+  },
+  Isolate_get_closure: {
+    "^": "Closure:184;this_0,id_1",
+    call$1: [function(map) {
+      var t1, obj;
+      t1 = this.this_0;
+      obj = D.ServiceObject_ServiceObject$_fromMap(t1, map);
+      if (obj.get$canCache())
+        t1._cache.putIfAbsent$2(this.id_1, new D.Isolate_get__closure(obj));
+      return obj;
+    }, "call$1", null, 2, 0, null, 183, "call"],
+    $isFunction: true
+  },
+  Isolate_get__closure: {
+    "^": "Closure:69;obj_2",
+    call$0: function() {
+      return this.obj_2;
+    },
+    $isFunction: true
+  },
+  Isolate__update_closure: {
+    "^": "Closure:13;timerMap_0",
+    call$1: [function(timer) {
+      var t1 = J.getInterceptor$asx(timer);
+      this.timerMap_0.$indexSet(0, t1.$index(timer, "name"), t1.$index(timer, "time"));
+    }, "call$1", null, 2, 0, null, 193, "call"],
+    $isFunction: true
+  },
+  Isolate__update_closure0: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.compareTo$1$ns(J.get$name$x(a), J.get$name$x(b));
+    },
+    $isFunction: true
+  },
+  Isolate_updateTagProfile_closure: {
+    "^": "Closure:184;this_0",
+    call$1: [function(m) {
+      var t1, t2;
+      t1 = Date.now();
+      new P.DateTime(t1, false).DateTime$_now$0();
+      t2 = this.this_0.tagProfile;
+      t2._processTagProfile$2(t1 / 1000, m);
+      return t2;
+    }, "call$1", null, 2, 0, null, 145, "call"],
+    $isFunction: true
+  },
+  ServiceMap: {
+    "^": "ServiceObject;_service$_map,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return (J.$eq(this._serviceType, "Class") || J.$eq(this._serviceType, "Function") || J.$eq(this._serviceType, "Field")) && !J.startsWith$1$s(this._id, $.ServiceMap_objectIdRingPrefix);
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return P.Maps_mapToString(this._service$_map);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      this._loaded = !mapIsRef;
+      t1 = this._service$_map;
+      t1.clear$0(0);
+      t1.addAll$1(0, map);
+      t2 = t1._observable_map$_map;
+      t3 = t2.$index(0, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(0, C.Symbol_name, this._service$__$name, t3);
+      t2 = t2.$index(0, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(0, C.Symbol_vmName, this._service$__$vmName, t2);
+      D._upgradeCollection(t1, this._owner);
+    },
+    addAll$1: function(_, other) {
+      return this._service$_map.addAll$1(0, other);
+    },
+    clear$0: function(_) {
+      return this._service$_map.clear$0(0);
+    },
+    forEach$1: function(_, f) {
+      return this._service$_map._observable_map$_map.forEach$1(0, f);
+    },
+    $index: function(_, k) {
+      return this._service$_map._observable_map$_map.$index(0, k);
+    },
+    $indexSet: function(_, k, v) {
+      this._service$_map.$indexSet(0, k, v);
+      return v;
+    },
+    get$isEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) === 0;
+    },
+    get$isNotEmpty: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1) !== 0;
+    },
+    get$keys: function() {
+      return this._service$_map._observable_map$_map.get$keys();
+    },
+    get$values: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$values(t1);
+    },
+    get$length: function(_) {
+      var t1 = this._service$_map._observable_map$_map;
+      return t1.get$length(t1);
+    },
+    deliverChanges$0: [function(_) {
+      var t1 = this._service$_map;
+      return t1.deliverChanges$0(t1);
+    }, "call$0", "get$deliverChanges", 0, 0, 111],
+    notifyChange$1: function(_, record) {
+      var t1 = this._service$_map;
+      return t1.notifyChange$1(t1, record);
+    },
+    notifyPropertyChange$3: function(_, field, oldValue, newValue) {
+      return F.notifyPropertyChangeHelper(this._service$_map, field, oldValue, newValue);
+    },
+    observed$0: [function(_) {
+      return;
+    }, "call$0", "get$observed", 0, 0, 18],
+    unobserved$0: [function(_) {
+      this._service$_map.change_notifier$ChangeNotifier$_changes = null;
+      return;
+    }, "call$0", "get$unobserved", 0, 0, 18],
+    get$changes: function(_) {
+      var t1 = this._service$_map;
+      return t1.get$changes(t1);
+    },
+    get$hasObservers: function(_) {
+      var t1, t2;
+      t1 = this._service$_map.change_notifier$ChangeNotifier$_changes;
+      if (t1 != null) {
+        t2 = t1._async$_next;
+        t1 = t2 == null ? t1 != null : t2 !== t1;
+      } else
+        t1 = false;
+      return t1;
+    },
+    $isServiceMap: true,
+    $isObservableMap: true,
+    $asObservableMap: function() {
+      return [null, null];
+    },
+    $isMap: true,
+    $asMap: function() {
+      return [null, null];
+    },
+    $isObservable: true,
+    static: {"^": "ServiceMap_objectIdRingPrefix"}
+  },
+  DartError: {
+    "^": "ServiceObject_ChangeNotifier;_service$__$kind,_service$__$message,_service$__$exception,_service$__$stacktrace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$exception: function(_) {
+      return this._service$__$exception;
+    },
+    set$exception: function(_, value) {
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, value);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t2 = this._owner;
+      t3 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "exception"));
+      this._service$__$exception = F.notifyPropertyChangeHelper(this, C.Symbol_exception, this._service$__$exception, t3);
+      t1 = D.ServiceObject_ServiceObject$_fromMap(t2, t1.$index(map, "stacktrace"));
+      this._service$__$stacktrace = F.notifyPropertyChangeHelper(this, C.Symbol_stacktrace, this._service$__$stacktrace, t1);
+      t1 = "DartError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    }
+  },
+  ServiceObject_ChangeNotifier: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceError: {
+    "^": "ServiceObject_ChangeNotifier0;_service$__$kind,_service$__$message,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      this._loaded = true;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t1 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t1);
+      t1 = "ServiceError " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceError: true
+  },
+  ServiceObject_ChangeNotifier0: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ServiceException: {
+    "^": "ServiceObject_ChangeNotifier1;_service$__$kind,_service$__$message,_service$__$response,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$message: function(_) {
+      return this._service$__$message;
+    },
+    get$response: function(_) {
+      return this._service$__$response;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "message");
+      this._service$__$message = F.notifyPropertyChangeHelper(this, C.Symbol_message, this._service$__$message, t2);
+      t1 = t1.$index(map, "response");
+      this._service$__$response = F.notifyPropertyChangeHelper(this, C.Symbol_response, this._service$__$response, t1);
+      t1 = "ServiceException " + H.S(this._service$__$kind);
+      t1 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t1);
+      this._service$__$name = t1;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t1);
+    },
+    $isServiceException: true
+  },
+  ServiceObject_ChangeNotifier1: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Library: {
+    "^": "ServiceObject_ChangeNotifier2;_service$__$url,imports<,scripts<,classes>,variables<,functions<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$url: function(_) {
+      return this._service$__$url;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, shortUrl, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "url");
+      shortUrl = F.notifyPropertyChangeHelper(this, C.Symbol_url, this._service$__$url, t2);
+      this._service$__$url = shortUrl;
+      if (J.startsWith$1$s(shortUrl, "file://") || J.startsWith$1$s(this._service$__$url, "http://")) {
+        t2 = this._service$__$url;
+        t3 = J.getInterceptor$asx(t2);
+        t4 = t3.lastIndexOf$1(t2, "/");
+        if (typeof t4 !== "number")
+          return t4.$add();
+        shortUrl = t3.substring$1(t2, t4 + 1);
+      }
+      t2 = t1.$index(map, "user_name");
+      t2 = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      this._service$__$name = t2;
+      if (J.get$isEmpty$asx(t2) === true)
+        this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, shortUrl);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = this.imports;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "imports"));
+      t2 = this.scripts;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "scripts"));
+      t2 = this.classes;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "classes"));
+      t2 = this.variables;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "variables"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+    },
+    $isLibrary: true
+  },
+  ServiceObject_ChangeNotifier2: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  AllocationCount: {
+    "^": "ChangeNotifier;_service$__$instances,_service$__$bytes,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$instances: function(_) {
+      return this._service$__$instances;
+    },
+    set$instances: function(_, value) {
+      this._service$__$instances = F.notifyPropertyChangeHelper(this, C.Symbol_instances, this._service$__$instances, value);
+    },
+    get$bytes: function() {
+      return this._service$__$bytes;
+    }
+  },
+  Allocations: {
+    "^": "Object;accumulated<,current<",
+    update$1: function(stats) {
+      var t1, t2, t3;
+      t1 = this.accumulated;
+      t2 = J.getInterceptor$asx(stats);
+      t3 = t2.$index(stats, 6);
+      t1._service$__$instances = F.notifyPropertyChangeHelper(t1, C.Symbol_instances, t1._service$__$instances, t3);
+      t3 = t2.$index(stats, 7);
+      t1._service$__$bytes = F.notifyPropertyChangeHelper(t1, C.Symbol_bytes, t1._service$__$bytes, t3);
+      t3 = this.current;
+      t1 = J.$add$ns(t2.$index(stats, 2), t2.$index(stats, 4));
+      t3._service$__$instances = F.notifyPropertyChangeHelper(t3, C.Symbol_instances, t3._service$__$instances, t1);
+      t2 = J.$add$ns(t2.$index(stats, 3), t2.$index(stats, 5));
+      t3._service$__$bytes = F.notifyPropertyChangeHelper(t3, C.Symbol_bytes, t3._service$__$bytes, t2);
+    },
+    static: {"^": "Allocations_ALLOCATED_BEFORE_GC,Allocations_ALLOCATED_BEFORE_GC_SIZE,Allocations_LIVE_AFTER_GC,Allocations_LIVE_AFTER_GC_SIZE,Allocations_ALLOCATED_SINCE_GC,Allocations_ALLOCATED_SINCE_GC_SIZE,Allocations_ACCUMULATED,Allocations_ACCUMULATED_SIZE"}
+  },
+  Class: {
+    "^": "ServiceObject_ChangeNotifier3;_service$__$library,_service$__$script,_service$__$superClass,_service$__$isAbstract,_service$__$isConst,_service$__$isFinalized,_service$__$isPatch,_service$__$isImplemented,_service$__$tokenPos,_service$__$error,newSpace<,oldSpace<,children>,subClasses<,fields<,functions<,interfaces<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$library: function(_) {
+      return this._service$__$library;
+    },
+    set$library: function(_, value) {
+      this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$superClass: function() {
+      return this._service$__$superClass;
+    },
+    set$superClass: function(value) {
+      this._service$__$superClass = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, value);
+    },
+    get$isAbstract: function() {
+      return this._service$__$isAbstract;
+    },
+    get$isPatch: function() {
+      return this._service$__$isPatch;
+    },
+    get$tokenPos: function() {
+      return this._service$__$tokenPos;
+    },
+    set$tokenPos: function(value) {
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, value);
+    },
+    get$error: function(_) {
+      return this._service$__$error;
+    },
+    set$error: function(_, value) {
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, value);
+    },
+    get$hasNoAllocations: function() {
+      var t1, t2;
+      t1 = this.newSpace;
+      t2 = t1.accumulated;
+      if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+        t1 = t1.current;
+        t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+      } else
+        t1 = false;
+      if (t1) {
+        t1 = this.oldSpace;
+        t2 = t1.accumulated;
+        if (J.$eq(t2._service$__$instances, 0) && J.$eq(t2._service$__$bytes, 0)) {
+          t1 = t1.current;
+          t1 = J.$eq(t1._service$__$instances, 0) && J.$eq(t1._service$__$bytes, 0);
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return false;
+    },
+    toString$0: function(_) {
+      return "Service Class: " + H.S(this._service$__$vmName);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, allocationStats;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "user_name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      if (!!J.getInterceptor(t1.$index(map, "library")).$isLibrary) {
+        t2 = t1.$index(map, "library");
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, t2);
+      } else
+        this._service$__$library = F.notifyPropertyChangeHelper(this, C.Symbol_library, this._service$__$library, null);
+      t2 = t1.$index(map, "script");
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, t2);
+      t2 = t1.$index(map, "abstract");
+      this._service$__$isAbstract = F.notifyPropertyChangeHelper(this, C.Symbol_isAbstract, this._service$__$isAbstract, t2);
+      t2 = t1.$index(map, "const");
+      this._service$__$isConst = F.notifyPropertyChangeHelper(this, C.Symbol_isConst, this._service$__$isConst, t2);
+      t2 = t1.$index(map, "finalized");
+      this._service$__$isFinalized = F.notifyPropertyChangeHelper(this, C.Symbol_isFinalized, this._service$__$isFinalized, t2);
+      t2 = t1.$index(map, "patch");
+      this._service$__$isPatch = F.notifyPropertyChangeHelper(this, C.Symbol_isPatch, this._service$__$isPatch, t2);
+      t2 = t1.$index(map, "implemented");
+      this._service$__$isImplemented = F.notifyPropertyChangeHelper(this, C.Symbol_isImplemented, this._service$__$isImplemented, t2);
+      t2 = t1.$index(map, "tokenPos");
+      this._service$__$tokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_tokenPos, this._service$__$tokenPos, t2);
+      t2 = this.subClasses;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "subclasses"));
+      t2 = this.fields;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "fields"));
+      t2 = this.functions;
+      t2.clear$0(t2);
+      t2.addAll$1(0, t1.$index(map, "functions"));
+      t2 = t1.$index(map, "super");
+      t2 = F.notifyPropertyChangeHelper(this, C.Symbol_superClass, this._service$__$superClass, t2);
+      this._service$__$superClass = t2;
+      if (t2 != null)
+        t2._addToChildren$1(this);
+      t2 = t1.$index(map, "error");
+      this._service$__$error = F.notifyPropertyChangeHelper(this, C.Symbol_error, this._service$__$error, t2);
+      allocationStats = t1.$index(map, "allocationStats");
+      if (allocationStats != null) {
+        t1 = J.getInterceptor$asx(allocationStats);
+        this.newSpace.update$1(t1.$index(allocationStats, "new"));
+        this.oldSpace.update$1(t1.$index(allocationStats, "old"));
+      }
+    },
+    _addToChildren$1: function(cls) {
+      var t1 = this.children;
+      if (t1.contains$1(t1, cls))
+        return;
+      t1.add$1(0, cls);
+    },
+    get$1: function(command) {
+      var t1 = this._owner;
+      return t1.get$isolate(t1).get$1(J.$add$ns(this._id, "/" + H.S(command)));
+    },
+    $isClass: true
+  },
+  ServiceObject_ChangeNotifier3: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  ScriptLine: {
+    "^": "ChangeNotifier;line<,text>,_service$__$hits,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$hits: function() {
+      return this._service$__$hits;
+    },
+    set$hits: function(value) {
+      this._service$__$hits = F.notifyPropertyChangeHelper(this, C.Symbol_hits, this._service$__$hits, value);
+    },
+    $isScriptLine: true
+  },
+  Script: {
+    "^": "ServiceObject_ChangeNotifier4;lines>,_hits,_service$__$kind,_service$__$firstTokenPos,_service$__$lastTokenPos,_shortUrl,_url,_tokenToLine,_tokenToCol,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$firstTokenPos: function() {
+      return this._service$__$firstTokenPos;
+    },
+    set$firstTokenPos: function(value) {
+      var t1 = this._service$__$firstTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$firstTokenPos = value;
+    },
+    get$lastTokenPos: function() {
+      return this._service$__$lastTokenPos;
+    },
+    set$lastTokenPos: function(value) {
+      var t1 = this._service$__$lastTokenPos;
+      if (this.get$hasObservers(this) && !J.$eq(t1, value)) {
+        t1 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t1, value);
+        t1.$builtinTypeInfo = [null];
+        this.notifyChange$1(this, t1);
+      }
+      this._service$__$lastTokenPos = value;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    getLine$1: function(line) {
+      var t1, t2;
+      t1 = J.$sub$n(line, 1);
+      t2 = this.lines._observable_list$_list;
+      if (t1 >>> 0 !== t1 || t1 >= t2.length)
+        return H.ioore(t2, t1);
+      return t2[t1];
+    },
+    tokenToLine$1: function(token) {
+      return this._tokenToLine.$index(0, token);
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2, t3, t4;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "kind");
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      t2 = t1.$index(map, "name");
+      this._url = t2;
+      t3 = J.getInterceptor$asx(t2);
+      t4 = t3.lastIndexOf$1(t2, "/");
+      if (typeof t4 !== "number")
+        return t4.$add();
+      t4 = t3.substring$1(t2, t4 + 1);
+      this._shortUrl = t4;
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t4);
+      t4 = this._url;
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t4);
+      this._processSource$1(t1.$index(map, "source"));
+      this._parseTokenPosTable$1(t1.$index(map, "tokenPosTable"));
+    },
+    _parseTokenPosTable$1: function(table) {
+      var t1, line, t2, lineNumber, pos, t3, tokenOffset, colNumber, t4;
+      if (table == null)
+        return;
+      this._tokenToLine = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._tokenToCol = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      this._service$__$firstTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_firstTokenPos, this._service$__$firstTokenPos, null);
+      this._service$__$lastTokenPos = F.notifyPropertyChangeHelper(this, C.Symbol_lastTokenPos, this._service$__$lastTokenPos, null);
+      for (t1 = J.get$iterator$ax(table); t1.moveNext$0();) {
+        line = t1.get$current();
+        t2 = J.getInterceptor$asx(line);
+        lineNumber = t2.$index(line, 0);
+        pos = 1;
+        while (true) {
+          t3 = t2.get$length(line);
+          if (typeof t3 !== "number")
+            return H.iae(t3);
+          if (!(pos < t3))
+            break;
+          tokenOffset = t2.$index(line, pos);
+          colNumber = t2.$index(line, pos + 1);
+          t3 = this._service$__$firstTokenPos;
+          if (t3 == null) {
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$firstTokenPos = tokenOffset;
+            t3 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t3, tokenOffset)) {
+              t3 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t3, tokenOffset);
+              t3.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t3);
+            }
+            this._service$__$lastTokenPos = tokenOffset;
+          } else {
+            t3 = J.$le$n(t3, tokenOffset) ? this._service$__$firstTokenPos : tokenOffset;
+            t4 = this._service$__$firstTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_firstTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$firstTokenPos = t3;
+            t3 = J.$ge$n(this._service$__$lastTokenPos, tokenOffset) ? this._service$__$lastTokenPos : tokenOffset;
+            t4 = this._service$__$lastTokenPos;
+            if (this.get$hasObservers(this) && !J.$eq(t4, t3)) {
+              t4 = new T.PropertyChangeRecord(this, C.Symbol_lastTokenPos, t4, t3);
+              t4.$builtinTypeInfo = [null];
+              this.notifyChange$1(this, t4);
+            }
+            this._service$__$lastTokenPos = t3;
+          }
+          this._tokenToLine.$indexSet(0, tokenOffset, lineNumber);
+          this._tokenToCol.$indexSet(0, tokenOffset, colNumber);
+          pos += 2;
+        }
+      }
+    },
+    _processHits$1: function(scriptHits) {
+      var t1, t2, i, t3, line, hit, oldHits;
+      t1 = J.getInterceptor$asx(scriptHits);
+      t2 = this._hits;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(scriptHits);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        line = t1.$index(scriptHits, i);
+        hit = t1.$index(scriptHits, i + 1);
+        oldHits = t2.$index(0, line);
+        t2.$indexSet(0, line, oldHits != null ? J.$add$ns(hit, oldHits) : hit);
+        i += 2;
+      }
+      this._applyHitsToLines$0();
+    },
+    _processSource$1: function(source) {
+      var sourceLines, t1, i, i0;
+      this._loaded = false;
+      if (source == null)
+        return;
+      sourceLines = J.split$1$s(source, "\n");
+      if (sourceLines.length === 0)
+        return;
+      this._loaded = true;
+      t1 = this.lines;
+      t1.clear$0(t1);
+      N.Logger_Logger("").info$1("Adding " + sourceLines.length + " source lines for " + H.S(this._url));
+      for (i = 0; i < sourceLines.length; i = i0) {
+        i0 = i + 1;
+        t1.add$1(0, new D.ScriptLine(i0, sourceLines[i], null, null, null));
+      }
+      this._applyHitsToLines$0();
+    },
+    _applyHitsToLines$0: function() {
+      var t1, t2, line;
+      t1 = this.lines;
+      if (t1._observable_list$_list.length === 0)
+        return;
+      for (t1 = t1.get$iterator(t1), t2 = this._hits; t1.moveNext$0();) {
+        line = t1._current;
+        line.set$hits(t2.$index(0, line.get$line()));
+      }
+    },
+    $isScript: true
+  },
+  ServiceObject_ChangeNotifier4: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  CodeTick: {
+    "^": "Object;address<,exclusiveTicks<,inclusiveTicks<",
+    $isCodeTick: true
+  },
+  PcDescriptor: {
+    "^": "ChangeNotifier;address<,deoptId,tokenPos<,tryIndex,kind>,_service$__$script,_service$__$formattedLine,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$formattedLine: function() {
+      return this._service$__$formattedLine;
+    },
+    formattedDeoptId$0: [function() {
+      var t1, t2;
+      t1 = this.deoptId;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, -1))
+        return "N/A";
+      return t2.toString$0(t1);
+    }, "call$0", "get$formattedDeoptId", 0, 0, 194],
+    processScript$1: function(script) {
+      var t1, line;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, null);
+      t1 = this.tokenPos;
+      if (J.$eq(t1, -1))
+        return;
+      line = script.tokenToLine$1(t1);
+      if (line == null)
+        return;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      t1 = J.get$text$x(script.getLine$1(line));
+      this._service$__$formattedLine = F.notifyPropertyChangeHelper(this, C.Symbol_formattedLine, this._service$__$formattedLine, t1);
+    },
+    $isPcDescriptor: true
+  },
+  CodeInstruction: {
+    "^": "ChangeNotifier;address<,machine,human<,_service$__$jumpTarget,descriptors<,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$jumpTarget: function() {
+      return this._service$__$jumpTarget;
+    },
+    get$isComment: function() {
+      return J.$eq(this.address, 0);
+    },
+    get$hasDescriptors: function() {
+      return this.descriptors._observable_list$_list.length > 0;
+    },
+    formattedAddress$0: [function() {
+      var t1, t2;
+      t1 = this.address;
+      t2 = J.getInterceptor(t1);
+      if (t2.$eq(t1, 0))
+        return "";
+      return "0x" + t2.toRadixString$1(t1, 16);
+    }, "call$0", "get$formattedAddress", 0, 0, 194],
+    formattedInclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      if (J.$eq(tick.get$inclusiveTicks(), tick.get$exclusiveTicks()))
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$inclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$inclusiveTicks()) + ")";
+    }, "call$1", "get$formattedInclusive", 2, 0, 195, 71],
+    formattedExclusive$1: [function(code) {
+      var tick;
+      if (code == null)
+        return "";
+      tick = code.get$addressTicks()._observable_map$_map.$index(0, this.address);
+      if (tick == null)
+        return "";
+      return D.CodeInstruction_formatPercent(tick.get$exclusiveTicks(), code.get$totalSamplesInProfile()) + " (" + H.S(tick.get$exclusiveTicks()) + ")";
+    }, "call$1", "get$formattedExclusive", 2, 0, 195, 71],
+    _getJumpAddress$0: function() {
+      var address, chunks, t1, exception;
+      chunks = J.split$1$s(this.human, " ");
+      t1 = chunks.length;
+      if (t1 !== 2)
+        return 0;
+      if (1 >= t1)
+        return H.ioore(chunks, 1);
+      address = chunks[1];
+      if (J.startsWith$1$s(address, "0x"))
+        address = J.substring$1$s(address, 2);
+      try {
+        t1 = H.Primitives_parseInt(address, 16, null);
+        return t1;
+      } catch (exception) {
+        H.unwrapException(exception);
+        return 0;
+      }
+
+    },
+    _resolveJumpTarget$1: function(instructions) {
+      var t1, address, t2, i, instruction;
+      t1 = this.human;
+      if (!J.startsWith$1$s(t1, "j"))
+        return;
+      address = this._getJumpAddress$0();
+      t2 = J.getInterceptor(address);
+      if (t2.$eq(address, 0)) {
+        P.print("Could not determine jump address for " + H.S(t1));
+        return;
+      }
+      for (t1 = instructions._observable_list$_list, i = 0; i < t1.length; ++i) {
+        instruction = t1[i];
+        if (J.$eq(instruction.get$address(), address)) {
+          t1 = this._service$__$jumpTarget;
+          if (this.get$hasObservers(this) && !J.$eq(t1, instruction)) {
+            t1 = new T.PropertyChangeRecord(this, C.Symbol_jumpTarget, t1, instruction);
+            t1.$builtinTypeInfo = [null];
+            this.notifyChange$1(this, t1);
+          }
+          this._service$__$jumpTarget = instruction;
+          return;
+        }
+      }
+      P.print("Could not find instruction at " + t2.toRadixString$1(address, 16));
+    },
+    $isCodeInstruction: true,
+    static: {CodeInstruction_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  CodeKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "CodeKind_Native0,CodeKind_Dart0,CodeKind_Collected0,CodeKind_Reused0,CodeKind_Tag0", CodeKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Native"))
+          return C.CodeKind_Native;
+        else if (t1.$eq(s, "Dart"))
+          return C.CodeKind_Dart;
+        else if (t1.$eq(s, "Collected"))
+          return C.CodeKind_Collected;
+        else if (t1.$eq(s, "Reused"))
+          return C.CodeKind_Reused;
+        else if (t1.$eq(s, "Tag"))
+          return C.CodeKind_Tag;
+        N.Logger_Logger("").warning$1("Unknown code kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  CodeCallCount: {
+    "^": "Object;code>,count<",
+    $isCodeCallCount: true
+  },
+  CodeTrieNode: {
+    "^": "Object;code>,count<,children>,summedChildCount",
+    $isCodeTrieNode: true
+  },
+  Code: {
+    "^": "ServiceObject_ChangeNotifier5;_service$__$kind,_service$__$totalSamplesInProfile,exclusiveTicks<,inclusiveTicks<,startAddress,endAddress,callers,callees,instructions<,addressTicks<,_service$__$formattedInclusiveTicks,_service$__$formattedExclusiveTicks,_service$__$objectPool,_service$__$function,_service$__$script,_service$__$isOptimized,name*,vmName@,_service$__$hasDisassembly,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$totalSamplesInProfile: function() {
+      return this._service$__$totalSamplesInProfile;
+    },
+    get$formattedInclusiveTicks: function() {
+      return this._service$__$formattedInclusiveTicks;
+    },
+    get$formattedExclusiveTicks: function() {
+      return this._service$__$formattedExclusiveTicks;
+    },
+    get$objectPool: function() {
+      return this._service$__$objectPool;
+    },
+    set$objectPool: function(value) {
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, value);
+    },
+    get$$function: function(_) {
+      return this._service$__$function;
+    },
+    set$$function: function(_, value) {
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, value);
+    },
+    get$script: function(_) {
+      return this._service$__$script;
+    },
+    set$script: function(_, value) {
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, value);
+    },
+    get$isOptimized: function() {
+      return this._service$__$isOptimized;
+    },
+    get$canCache: function() {
+      return true;
+    },
+    get$immutable: function() {
+      return true;
+    },
+    _updateDescriptors$1: [function(script) {
+      var t1, t2;
+      this._service$__$script = F.notifyPropertyChangeHelper(this, C.Symbol_script, this._service$__$script, script);
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();)
+        for (t2 = t1._current.get$descriptors(), t2 = t2.get$iterator(t2); t2.moveNext$0();)
+          t2._current.processScript$1(script);
+    }, "call$1", "get$_updateDescriptors", 2, 0, 196, 197],
+    loadScript$0: function() {
+      if (this._service$__$script != null)
+        return;
+      if (!J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return;
+      var t1 = this._service$__$function;
+      if (t1 == null)
+        return;
+      if (J.$index$asx(t1, "script") == null) {
+        J.load$0$x(this._service$__$function).then$1(new D.Code_loadScript_closure(this));
+        return;
+      }
+      J.load$0$x(J.$index$asx(this._service$__$function, "script")).then$1(this.get$_updateDescriptors());
+    },
+    reload$0: function(_) {
+      if (J.$eq(this._service$__$kind, C.CodeKind_Dart))
+        return D.ServiceObject.prototype.reload$0.call(this, this);
+      return P._Future$immediate(this, null);
+    },
+    _resolveCalls$3: function(calls, data, codes) {
+      var t1, i, t2, index, count;
+      t1 = J.getInterceptor$asx(data);
+      i = 0;
+      while (true) {
+        t2 = t1.get$length(data);
+        if (typeof t2 !== "number")
+          return H.iae(t2);
+        if (!(i < t2))
+          break;
+        index = H.Primitives_parseInt(t1.$index(data, i), null, null);
+        count = H.Primitives_parseInt(t1.$index(data, i + 1), null, null);
+        if (index >>> 0 !== index || index >= codes.length)
+          return H.ioore(codes, index);
+        calls.push(new D.CodeCallCount(codes[index], count));
+        i += 2;
+      }
+      H.IterableMixinWorkaround_sortList(calls, new D.Code__resolveCalls_closure());
+    },
+    updateProfileData$3: function(profileData, codeTable, sampleCount) {
+      var t1, ticks;
+      this._service$__$totalSamplesInProfile = F.notifyPropertyChangeHelper(this, C.Symbol_totalSamplesInProfile, this._service$__$totalSamplesInProfile, sampleCount);
+      t1 = J.getInterceptor$asx(profileData);
+      this.inclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "inclusive_ticks"), null, null);
+      this.exclusiveTicks = H.Primitives_parseInt(t1.$index(profileData, "exclusive_ticks"), null, null);
+      this._resolveCalls$3(this.callers, t1.$index(profileData, "callers"), codeTable);
+      this._resolveCalls$3(this.callees, t1.$index(profileData, "callees"), codeTable);
+      ticks = t1.$index(profileData, "ticks");
+      if (ticks != null)
+        this._processTicks$1(ticks);
+      t1 = D.Code_formatPercent(this.inclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.inclusiveTicks) + ")";
+      this._service$__$formattedInclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedInclusiveTicks, this._service$__$formattedInclusiveTicks, t1);
+      t1 = D.Code_formatPercent(this.exclusiveTicks, this._service$__$totalSamplesInProfile) + " (" + H.S(this.exclusiveTicks) + ")";
+      this._service$__$formattedExclusiveTicks = F.notifyPropertyChangeHelper(this, C.Symbol_formattedExclusiveTicks, this._service$__$formattedExclusiveTicks, t1);
+    },
+    _service$_update$2: function(_, m, mapIsRef) {
+      var t1, t2, t3, disassembly, descriptors;
+      t1 = J.getInterceptor$asx(m);
+      this.name = t1.$index(m, "user_name");
+      this.vmName = t1.$index(m, "name");
+      t2 = t1.$index(m, "isOptimized") != null && t1.$index(m, "isOptimized");
+      this._service$__$isOptimized = F.notifyPropertyChangeHelper(this, C.Symbol_isOptimized, this._service$__$isOptimized, t2);
+      t2 = D.CodeKind_fromString(t1.$index(m, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      this.startAddress = H.Primitives_parseInt(t1.$index(m, "start"), 16, null);
+      this.endAddress = H.Primitives_parseInt(t1.$index(m, "end"), 16, null);
+      t2 = this._owner;
+      t3 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "function"));
+      this._service$__$function = F.notifyPropertyChangeHelper(this, C.Symbol_function, this._service$__$function, t3);
+      t2 = t2.get$isolate(t2).getFromMap$1(t1.$index(m, "object_pool"));
+      this._service$__$objectPool = F.notifyPropertyChangeHelper(this, C.Symbol_objectPool, this._service$__$objectPool, t2);
+      disassembly = t1.$index(m, "disassembly");
+      if (disassembly != null)
+        this._processDisassembly$1(disassembly);
+      descriptors = t1.$index(m, "descriptors");
+      if (descriptors != null)
+        this._processDescriptors$1(J.$index$asx(descriptors, "members"));
+      t1 = this.instructions._observable_list$_list;
+      this._loaded = t1.length !== 0 || !J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      t1 = t1.length !== 0 && J.$eq(this._service$__$kind, C.CodeKind_Dart);
+      this._service$__$hasDisassembly = F.notifyPropertyChangeHelper(this, C.Symbol_hasDisassembly, this._service$__$hasDisassembly, t1);
+    },
+    get$hasDisassembly: function() {
+      return this._service$__$hasDisassembly;
+    },
+    _processDisassembly$1: function(disassembly) {
+      var t1, t2, i, t3, machine, human, address, t4;
+      t1 = this.instructions;
+      t1.clear$0(t1);
+      t2 = J.getInterceptor$asx(disassembly);
+      i = 0;
+      while (true) {
+        t3 = t2.get$length(disassembly);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        machine = t2.$index(disassembly, i + 1);
+        human = t2.$index(disassembly, i + 2);
+        address = !J.$eq(t2.$index(disassembly, i), "") ? H.Primitives_parseInt(t2.$index(disassembly, i), null, null) : 0;
+        t3 = D.PcDescriptor;
+        t4 = [];
+        t4.$builtinTypeInfo = [t3];
+        t4 = new Q.ObservableList(null, null, t4, null, null);
+        t4.$builtinTypeInfo = [t3];
+        t1.add$1(0, new D.CodeInstruction(address, machine, human, null, t4, null, null));
+        i += 3;
+      }
+      for (t2 = t1.get$iterator(t1); t2.moveNext$0();)
+        t2._current._resolveJumpTarget$1(t1);
+    },
+    _processDescriptor$1: function(d) {
+      var t1, address, deoptId, tokenPos, tryIndex, kind, instruction;
+      t1 = J.getInterceptor$asx(d);
+      address = H.Primitives_parseInt(t1.$index(d, "pc"), 16, null);
+      deoptId = t1.$index(d, "deoptId");
+      tokenPos = t1.$index(d, "tokenPos");
+      tryIndex = t1.$index(d, "tryIndex");
+      kind = J.trim$0$s(t1.$index(d, "kind"));
+      for (t1 = this.instructions, t1 = t1.get$iterator(t1); t1.moveNext$0();) {
+        instruction = t1._current;
+        if (J.$eq(instruction.get$address(), address)) {
+          instruction.get$descriptors().add$1(0, new D.PcDescriptor(address, deoptId, tokenPos, tryIndex, kind, null, null, null, null));
+          return;
+        }
+      }
+      N.Logger_Logger("").warning$1("Could not find instruction with pc descriptor address: " + H.S(address));
+    },
+    _processDescriptors$1: function(descriptors) {
+      var t1;
+      for (t1 = J.get$iterator$ax(descriptors); t1.moveNext$0();)
+        this._processDescriptor$1(t1.get$current());
+    },
+    _processTicks$1: function(profileTicks) {
+      var t1, t2, i, t3, address;
+      t1 = J.getInterceptor$asx(profileTicks);
+      t2 = this.addressTicks;
+      i = 0;
+      while (true) {
+        t3 = t1.get$length(profileTicks);
+        if (typeof t3 !== "number")
+          return H.iae(t3);
+        if (!(i < t3))
+          break;
+        address = H.Primitives_parseInt(t1.$index(profileTicks, i), 16, null);
+        t2.$indexSet(0, address, new D.CodeTick(address, H.Primitives_parseInt(t1.$index(profileTicks, i + 1), null, null), H.Primitives_parseInt(t1.$index(profileTicks, i + 2), null, null)));
+        i += 3;
+      }
+    },
+    contains$1: function(_, address) {
+      J.$ge$n(address, this.startAddress);
+      return false;
+    },
+    get$isDartCode: function() {
+      return J.$eq(this._service$__$kind, C.CodeKind_Dart);
+    },
+    $isCode: true,
+    static: {Code_formatPercent: function(a, total) {
+        return C.JSNumber_methods.toStringAsFixed$1(100 * J.$div$n(a, total), 2) + "%";
+      }}
+  },
+  ServiceObject_ChangeNotifier5: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  Code_loadScript_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(func) {
+      var t1, script;
+      t1 = this.this_0;
+      script = J.$index$asx(t1._service$__$function, "script");
+      if (script == null)
+        return;
+      J.load$0$x(script).then$1(t1.get$_updateDescriptors());
+    }, "call$1", null, 2, 0, null, 198, "call"],
+    $isFunction: true
+  },
+  Code__resolveCalls_closure: {
+    "^": "Closure:75;",
+    call$2: function(a, b) {
+      return J.$sub$n(b.get$count(), a.get$count());
+    },
+    $isFunction: true
+  },
+  SocketKind: {
+    "^": "Object;_service$_value",
+    toString$0: function(_) {
+      return this._service$_value;
+    },
+    static: {"^": "SocketKind_Listening0,SocketKind_Normal0,SocketKind_Pipe0,SocketKind_Internal0", SocketKind_fromString: function(s) {
+        var t1 = J.getInterceptor(s);
+        if (t1.$eq(s, "Listening"))
+          return C.SocketKind_Listening;
+        else if (t1.$eq(s, "Normal"))
+          return C.SocketKind_Normal;
+        else if (t1.$eq(s, "Pipe"))
+          return C.SocketKind_Pipe;
+        else if (t1.$eq(s, "Internal"))
+          return C.SocketKind_Internal;
+        N.Logger_Logger("").warning$1("Unknown socket kind " + H.S(s));
+        throw H.wrapException(P.FallThroughError$());
+      }}
+  },
+  Socket: {
+    "^": "ServiceObject_ChangeNotifier6;socketOwner@,_service$__$latest,_service$__$previous,_service$__$kind,_service$__$protocol,_service$__$readClosed,_service$__$writeClosed,_service$__$closing,_service$__$listening,_service$__$fd,_service$__$localAddress,_service$__$localPort,_service$__$remoteAddress,_service$__$remotePort,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    get$canCache: function() {
+      return true;
+    },
+    get$isPipe: function() {
+      return J.$eq(this._service$__$kind, C.SocketKind_Pipe);
+    },
+    get$kind: function(_) {
+      return this._service$__$kind;
+    },
+    set$kind: function(_, value) {
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, value);
+    },
+    get$protocol: function(_) {
+      return this._service$__$protocol;
+    },
+    get$readClosed: function() {
+      return this._service$__$readClosed;
+    },
+    get$writeClosed: function() {
+      return this._service$__$writeClosed;
+    },
+    get$closing: function() {
+      return this._service$__$closing;
+    },
+    get$listening: function() {
+      return this._service$__$listening;
+    },
+    get$fd: function() {
+      return this._service$__$fd;
+    },
+    get$localAddress: function() {
+      return this._service$__$localAddress;
+    },
+    get$localPort: function() {
+      return this._service$__$localPort;
+    },
+    get$remoteAddress: function() {
+      return this._service$__$remoteAddress;
+    },
+    get$remotePort: function() {
+      return this._service$__$remotePort;
+    },
+    _service$_update$2: function(_, map, mapIsRef) {
+      var t1, t2;
+      t1 = J.getInterceptor$asx(map);
+      t2 = t1.$index(map, "name");
+      this._service$__$name = this.notifyPropertyChange$3(this, C.Symbol_name, this._service$__$name, t2);
+      t2 = t1.$index(map, "name");
+      this._service$__$vmName = this.notifyPropertyChange$3(this, C.Symbol_vmName, this._service$__$vmName, t2);
+      t2 = D.SocketKind_fromString(t1.$index(map, "kind"));
+      this._service$__$kind = F.notifyPropertyChangeHelper(this, C.Symbol_kind, this._service$__$kind, t2);
+      if (mapIsRef)
+        return;
+      this._loaded = true;
+      t2 = this._owner;
+      D._upgradeCollection(map, t2.get$isolate(t2));
+      t2 = t1.$index(map, "readClosed");
+      this._service$__$readClosed = F.notifyPropertyChangeHelper(this, C.Symbol_readClosed, this._service$__$readClosed, t2);
+      t2 = t1.$index(map, "writeClosed");
+      this._service$__$writeClosed = F.notifyPropertyChangeHelper(this, C.Symbol_writeClosed, this._service$__$writeClosed, t2);
+      t2 = t1.$index(map, "closing");
+      this._service$__$closing = F.notifyPropertyChangeHelper(this, C.Symbol_closing, this._service$__$closing, t2);
+      t2 = t1.$index(map, "listening");
+      this._service$__$listening = F.notifyPropertyChangeHelper(this, C.Symbol_listening, this._service$__$listening, t2);
+      t2 = t1.$index(map, "protocol");
+      this._service$__$protocol = F.notifyPropertyChangeHelper(this, C.Symbol_protocol, this._service$__$protocol, t2);
+      t2 = t1.$index(map, "localAddress");
+      this._service$__$localAddress = F.notifyPropertyChangeHelper(this, C.Symbol_localAddress, this._service$__$localAddress, t2);
+      t2 = t1.$index(map, "localPort");
+      this._service$__$localPort = F.notifyPropertyChangeHelper(this, C.Symbol_localPort, this._service$__$localPort, t2);
+      t2 = t1.$index(map, "remoteAddress");
+      this._service$__$remoteAddress = F.notifyPropertyChangeHelper(this, C.Symbol_remoteAddress, this._service$__$remoteAddress, t2);
+      t2 = t1.$index(map, "remotePort");
+      this._service$__$remotePort = F.notifyPropertyChangeHelper(this, C.Symbol_remotePort, this._service$__$remotePort, t2);
+      t2 = t1.$index(map, "fd");
+      this._service$__$fd = F.notifyPropertyChangeHelper(this, C.Symbol_fd, this._service$__$fd, t2);
+      this.socketOwner = t1.$index(map, "owner");
+    }
+  },
+  ServiceObject_ChangeNotifier6: {
+    "^": "ServiceObject+ChangeNotifier;",
+    $isObservable: true
+  },
+  _upgradeObservableMap_closure: {
+    "^": "Closure:75;map_0,owner_1",
+    call$2: function(k, v) {
+      var t1, t2;
+      t1 = J.getInterceptor(v);
+      t2 = !!t1.$isObservableMap;
+      if (t2 && D._isServiceMap(v))
+        this.map_0.$indexSet(0, k, this.owner_1.getFromMap$1(v));
+      else if (!!t1.$isObservableList)
+        D._upgradeObservableList(v, this.owner_1);
+      else if (t2)
+        D._upgradeObservableMap(v, this.owner_1);
+    },
+    $isFunction: true
+  }
+}],
+["service_error_view_element", "package:observatory/src/elements/service_error_view.dart", , R, {
+  "^": "",
+  ServiceErrorViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier45;_service_error_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$error: function(receiver) {
+      return receiver._service_error_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._service_error_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._service_error_view_element$__$error, value);
+    },
+    static: {ServiceErrorViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceErrorViewElement_methods.Element$created$0(receiver);
+        C.ServiceErrorViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier45: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_exception_view_element", "package:observatory/src/elements/service_exception_view.dart", , D, {
+  "^": "",
+  ServiceExceptionViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier46;_service_exception_view_element$__$exception,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$exception: function(receiver) {
+      return receiver._service_exception_view_element$__$exception;
+    },
+    set$exception: function(receiver, value) {
+      receiver._service_exception_view_element$__$exception = this.notifyPropertyChange$3(receiver, C.Symbol_exception, receiver._service_exception_view_element$__$exception, value);
+    },
+    static: {ServiceExceptionViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceExceptionViewElement_methods.Element$created$0(receiver);
+        C.ServiceExceptionViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier46: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_html", "package:observatory/service_html.dart", , U, {
+  "^": "",
+  HttpVM: {
+    "^": "VM;host,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    getString$1: function(_, id) {
+      var t1;
+      if (J.endsWith$1$s(this.host, "/") && J.startsWith$1$s(id, "/"))
+        id = J.substring$1$s(id, 1);
+      N.Logger_Logger("").info$1("Fetching " + H.S(id) + " from " + H.S(this.host));
+      t1 = this.host;
+      if (typeof t1 !== "string")
+        return t1.$add();
+      return W.HttpRequest_request(J.$add$ns(t1, id), null, null, null, P.LinkedHashMap_LinkedHashMap$_literal(["Observatory-Version", "1.0"], null, null), null, null, null).then$1(new U.HttpVM_getString_closure()).catchError$1(new U.HttpVM_getString_closure0());
+    },
+    HttpVM$0: function() {
+      this.host = "http://" + H.S(window.location.host) + "/";
+    }
+  },
+  HttpVM_getString_closure: {
+    "^": "Closure:200;",
+    call$1: [function(request) {
+      return J.get$responseText$x(request);
+    }, "call$1", null, 2, 0, null, 199, "call"],
+    $isFunction: true
+  },
+  HttpVM_getString_closure0: {
+    "^": "Closure:13;",
+    call$1: [function(error) {
+      var request, t1;
+      N.Logger_Logger("").severe$1("HttpRequest.request failed.");
+      request = J.get$target$x(error);
+      t1 = J.getInterceptor$x(request);
+      return C.JsonCodec_null_null.encode$1(P.LinkedHashMap_LinkedHashMap$_literal(["type", "ServiceException", "id", "", "response", t1.get$responseText(request), "kind", "NetworkException", "message", "Could not connect to service (" + H.S(t1.get$statusText(request)) + "). Check that you started the VM with the following flags: --observe"], null, null));
+    }, "call$1", null, 2, 0, null, 24, "call"],
+    $isFunction: true
+  },
+  DartiumVM: {
+    "^": "VM;_pendingRequests,_requestSerial,_service$__$version,_service$__$architecture,_service$__$uptime,_service$__$assertsEnabled,_service$__$typeChecksEnabled,_service$__$pid,_service$__$lastUpdate,exceptions,errors,_cache,_isolateCache,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,_owner,_id,_serviceType,_loaded,_service$__$name,_service$__$vmName,_inProgressReload,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records",
+    _messageHandler$1: [function(msg) {
+      var t1, id, $name, data, completer;
+      t1 = J.getInterceptor$x(msg);
+      id = J.$index$asx(t1.get$data(msg), "id");
+      $name = J.$index$asx(t1.get$data(msg), "name");
+      data = J.$index$asx(t1.get$data(msg), "data");
+      if (!J.$eq($name, "observatoryData"))
+        return;
+      t1 = this._pendingRequests;
+      completer = t1.$index(0, id);
+      t1.remove$1(0, id);
+      J.complete$1$x(completer, data);
+    }, "call$1", "get$_messageHandler", 2, 0, 20, 72],
+    getString$1: function(_, path) {
+      var idString, message, completer;
+      idString = "" + this._requestSerial;
+      message = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+      message.$indexSet(0, "id", idString);
+      message.$indexSet(0, "method", "observatoryQuery");
+      message.$indexSet(0, "query", H.S(path));
+      ++this._requestSerial;
+      completer = H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+      this._pendingRequests.$indexSet(0, idString, completer);
+      J.postMessage$2$x(W._convertNativeToDart_Window(window.parent), C.JsonCodec_null_null.encode$1(message), "*");
+      return completer.future;
+    },
+    DartiumVM$0: function() {
+      var t1 = H.setRuntimeTypeInfo(new W._EventStream(window, C.EventStreamProvider_message._eventType, false), [null]);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(this.get$_messageHandler()), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      N.Logger_Logger("").info$1("Connected to DartiumVM");
+    }
+  }
+}],
+["service_object_view_element", "package:observatory/src/elements/service_view.dart", , U, {
+  "^": "",
+  ServiceObjectViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier47;_service_object_view_element$__$object,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$object: function(receiver) {
+      return receiver._service_object_view_element$__$object;
+    },
+    set$object: function(receiver, value) {
+      receiver._service_object_view_element$__$object = this.notifyPropertyChange$3(receiver, C.Symbol_object, receiver._service_object_view_element$__$object, value);
+    },
+    _constructElementForObject$0: function(receiver) {
+      var element;
+      switch (receiver._service_object_view_element$__$object.get$serviceType()) {
+        case "AllocationProfile":
+          element = W._ElementFactoryProvider_createElement_tag("heap-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "BreakpointList":
+          element = W._ElementFactoryProvider_createElement_tag("breakpoint-list", null);
+          J.set$msg$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Class":
+          element = W._ElementFactoryProvider_createElement_tag("class-view", null);
+          J.set$cls$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Code":
+          element = W._ElementFactoryProvider_createElement_tag("code-view", null);
+          J.set$code$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Error":
+          element = W._ElementFactoryProvider_createElement_tag("error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Field":
+          element = W._ElementFactoryProvider_createElement_tag("field-view", null);
+          J.set$field$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "FlagList":
+          element = W._ElementFactoryProvider_createElement_tag("flag-list", null);
+          J.set$flagList$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Function":
+          element = W._ElementFactoryProvider_createElement_tag("function-view", null);
+          J.set$$function$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HeapMap":
+          element = W._ElementFactoryProvider_createElement_tag("heap-map", null);
+          J.set$fragmentation$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "LibraryPrefix":
+        case "TypeRef":
+        case "TypeParameter":
+        case "BoundedType":
+        case "Int32x4":
+        case "Float32x4":
+        case "Float64x4":
+        case "TypedData":
+        case "ExternalTypedData":
+        case "Capability":
+        case "ReceivePort":
+        case "SendPort":
+        case "Stacktrace":
+        case "JSRegExp":
+        case "WeakProperty":
+        case "MirrorReference":
+        case "UserTag":
+        case "Type":
+        case "Array":
+        case "Bool":
+        case "Closure":
+        case "Double":
+        case "GrowableObjectArray":
+        case "Instance":
+        case "Smi":
+        case "Mint":
+        case "Bigint":
+        case "String":
+          element = W._ElementFactoryProvider_createElement_tag("instance-view", null);
+          J.set$instance$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "IO":
+          element = W._ElementFactoryProvider_createElement_tag("io-view", null);
+          J.set$io$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerList":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServer":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-view", null);
+          J.set$httpServer$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "HttpServerConnection":
+          element = W._ElementFactoryProvider_createElement_tag("io-http-server-connection-view", null);
+          J.set$connection$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "SocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Socket":
+          element = W._ElementFactoryProvider_createElement_tag("io-socket-view", null);
+          J.set$socket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocketList":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "WebSocket":
+          element = W._ElementFactoryProvider_createElement_tag("io-web-socket-view", null);
+          J.set$webSocket$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Isolate":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-view", null);
+          J.set$isolate$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Library":
+          element = W._ElementFactoryProvider_createElement_tag("library-view", null);
+          J.set$library$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ProcessList":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Process":
+          element = W._ElementFactoryProvider_createElement_tag("io-process-view", null);
+          J.set$process$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Profile":
+          element = W._ElementFactoryProvider_createElement_tag("isolate-profile", null);
+          J.set$profile$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFileList":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-list-view", null);
+          J.set$list$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "RandomAccessFile":
+          element = W._ElementFactoryProvider_createElement_tag("io-random-access-file-view", null);
+          J.set$file$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceError":
+          element = W._ElementFactoryProvider_createElement_tag("service-error-view", null);
+          J.set$error$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "ServiceException":
+          element = W._ElementFactoryProvider_createElement_tag("service-exception-view", null);
+          J.set$exception$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "Script":
+          element = W._ElementFactoryProvider_createElement_tag("script-view", null);
+          J.set$script$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "StackTrace":
+          element = W._ElementFactoryProvider_createElement_tag("stack-trace", null);
+          J.set$trace$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        case "VM":
+          element = W._ElementFactoryProvider_createElement_tag("vm-view", null);
+          J.set$vm$x(element, receiver._service_object_view_element$__$object);
+          return element;
+        default:
+          element = W._ElementFactoryProvider_createElement_tag("json-view", null);
+          J.set$map$ax(element, receiver._service_object_view_element$__$object);
+          return element;
+      }
+    },
+    objectChanged$1: [function(receiver, oldValue) {
+      var t1, type, element;
+      this._clearChildren$0(receiver);
+      t1 = receiver._service_object_view_element$__$object;
+      if (t1 == null) {
+        N.Logger_Logger("").info$1("Viewing null object.");
+        return;
+      }
+      type = t1.get$serviceType();
+      element = this._constructElementForObject$0(receiver);
+      if (element == null) {
+        N.Logger_Logger("").info$1("Unable to find a view element for '" + H.S(type) + "'");
+        return;
+      }
+      receiver.appendChild(element);
+      N.Logger_Logger("").info$1("Viewing object of '" + H.S(type) + "'");
+    }, "call$1", "get$objectChanged", 2, 0, 13, 57],
+    $isServiceObjectViewElement: true,
+    static: {ServiceObjectViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceObjectViewElement_methods.Element$created$0(receiver);
+        C.ServiceObjectViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier47: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["service_ref_element", "package:observatory/src/elements/service_ref.dart", , Q, {
+  "^": "",
+  ServiceRefElement: {
+    "^": "ObservatoryElement_ChangeNotifier0;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$ref: function(receiver) {
+      return receiver._service_ref_element$__$ref;
+    },
+    set$ref: function(receiver, value) {
+      receiver._service_ref_element$__$ref = this.notifyPropertyChange$3(receiver, C.Symbol_ref, receiver._service_ref_element$__$ref, value);
+    },
+    get$internal: function(receiver) {
+      return receiver._service_ref_element$__$internal;
+    },
+    set$internal: function(receiver, value) {
+      receiver._service_ref_element$__$internal = this.notifyPropertyChange$3(receiver, C.Symbol_internal, receiver._service_ref_element$__$internal, value);
+    },
+    refChanged$1: [function(receiver, oldValue) {
+      this.notifyPropertyChange$3(receiver, C.Symbol_url, "", this.get$url(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_name, [], this.get$name(receiver));
+      this.notifyPropertyChange$3(receiver, C.Symbol_nameIsEmpty, 0, 1);
+      this.notifyPropertyChange$3(receiver, C.Symbol_hoverText, "", this.get$hoverText(receiver));
+    }, "call$1", "get$refChanged", 2, 0, 20, 57],
+    get$url: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      t1 = J.get$link$x(t1);
+      $.location.toString;
+      return "#" + H.S(t1);
+    },
+    get$hoverText: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return t1.get$vmName();
+    },
+    get$name: function(receiver) {
+      var t1 = receiver._service_ref_element$__$ref;
+      if (t1 == null)
+        return "NULL REF";
+      return J.get$name$x(t1);
+    },
+    get$nameIsEmpty: function(receiver) {
+      return J.get$isEmpty$asx(this.get$name(receiver));
+    },
+    static: {ServiceRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.ServiceRefElement_methods.Element$created$0(receiver);
+        C.ServiceRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier0: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["sliding_checkbox_element", "package:observatory/src/elements/sliding_checkbox.dart", , Q, {
+  "^": "",
+  SlidingCheckboxElement: {
+    "^": "PolymerElement_ChangeNotifier2;_sliding_checkbox_element$__$checked,_sliding_checkbox_element$__$checkedText,_sliding_checkbox_element$__$uncheckedText,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$checked: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checked;
+    },
+    set$checked: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, value);
+    },
+    get$checkedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$checkedText;
+    },
+    set$checkedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$checkedText = this.notifyPropertyChange$3(receiver, C.Symbol_checkedText, receiver._sliding_checkbox_element$__$checkedText, value);
+    },
+    get$uncheckedText: function(receiver) {
+      return receiver._sliding_checkbox_element$__$uncheckedText;
+    },
+    set$uncheckedText: function(receiver, value) {
+      receiver._sliding_checkbox_element$__$uncheckedText = this.notifyPropertyChange$3(receiver, C.Symbol_uncheckedText, receiver._sliding_checkbox_element$__$uncheckedText, value);
+    },
+    change$3: [function(receiver, e, details, target) {
+      var t1 = J.get$checked$x((receiver.shadowRoot || receiver.webkitShadowRoot).querySelector("#slide-switch"));
+      receiver._sliding_checkbox_element$__$checked = this.notifyPropertyChange$3(receiver, C.Symbol_checked, receiver._sliding_checkbox_element$__$checked, t1);
+    }, "call$3", "get$change", 6, 0, 102, 1, 201, 94],
+    static: {SlidingCheckboxElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.SlidingCheckboxElement_methods.Element$created$0(receiver);
+        C.SlidingCheckboxElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  PolymerElement_ChangeNotifier2: {
+    "^": "PolymerElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["smoke", "package:smoke/smoke.dart", , A, {
+  "^": "",
+  QueryOptions: {
+    "^": "Object;includeFields,includeProperties,includeInherited,includeUpTo,excludeFinal,includeMethods,withAnnotations,matches",
+    matches$1: function($receiver, arg0) {
+      return this.matches.call$1(arg0);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(options:");
+      t1.write$1(this.includeFields ? "fields " : "");
+      t1.write$1(this.includeProperties ? "properties " : "");
+      t1.write$1(this.includeMethods ? "methods " : "");
+      t1.write$1(this.includeInherited ? "inherited " : "_");
+      t1.write$1(this.excludeFinal ? "no finals " : "");
+      t1.write$1("annotations: " + H.S(this.withAnnotations));
+      t1.write$1(this.matches != null ? "with matcher" : "");
+      t1.write$1(")");
+      return t1._contents;
+    }
+  },
+  Declaration: {
+    "^": "Object;name>,kind>,isFinal>,type>,isStatic,annotations<",
+    get$isField: function() {
+      return this.kind === C.DeclarationKind_0;
+    },
+    get$isProperty: function() {
+      return this.kind === C.DeclarationKind_1;
+    },
+    get$isMethod: function() {
+      return this.kind === C.DeclarationKind_2;
+    },
+    get$hashCode: function(_) {
+      var t1 = this.name;
+      return t1.get$hashCode(t1);
+    },
+    $eq: function(_, other) {
+      if (other == null)
+        return false;
+      return !!J.getInterceptor(other).$isDeclaration && this.name.$eq(0, other.name) && this.kind === other.kind && this.isFinal === other.isFinal && this.type.$eq(0, other.type) && this.isStatic === other.isStatic && X.compareLists(this.annotations, other.annotations, false);
+    },
+    toString$0: function(_) {
+      var t1 = P.StringBuffer$("");
+      t1.write$1("(declaration ");
+      t1.write$1(this.name);
+      t1.write$1(this.kind === C.DeclarationKind_1 ? " (property) " : " (method) ");
+      t1.write$1(this.isFinal ? "final " : "");
+      t1.write$1(this.isStatic ? "static " : "");
+      t1.write$1(this.annotations);
+      t1.write$1(")");
+      return t1._contents;
+    },
+    $isDeclaration: true
+  },
+  DeclarationKind: {
+    "^": "Object;kind>"
+  }
+}],
+["smoke.src.common", "package:smoke/src/common.dart", , X, {
+  "^": "",
+  adjustList: function(input, min, max) {
+    var t1, t2;
+    t1 = input.length;
+    if (t1 < min) {
+      t2 = Array(min);
+      t2.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t2, 0, t1, input, 0);
+      return t2;
+    }
+    if (t1 > max) {
+      t1 = Array(max);
+      t1.fixed$length = init;
+      H.IterableMixinWorkaround_setRangeList(t1, 0, max, input, 0);
+      return t1;
+    }
+    return input;
+  },
+  matchesAnnotation: function(metadata, queryAnnotations) {
+    var t1, meta, t2, t3, queryMeta, t4;
+    t1 = new H.ListIterator(metadata, metadata.length, 0, null);
+    t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(metadata, 0)];
+    for (; t1.moveNext$0();) {
+      meta = t1._current;
+      queryAnnotations.length;
+      t2 = new H.ListIterator(queryAnnotations, 1, 0, null);
+      t2.$builtinTypeInfo = [H.getTypeArgumentByIndex(queryAnnotations, 0)];
+      t3 = J.getInterceptor(meta);
+      for (; t2.moveNext$0();) {
+        queryMeta = t2._current;
+        if (t3.$eq(meta, queryMeta))
+          return true;
+        if (!!J.getInterceptor(queryMeta).$isType) {
+          t4 = t3.get$runtimeType(meta);
+          t4 = $.get$typeInspector().isSubclassOf$2(t4, queryMeta);
+        } else
+          t4 = false;
+        if (t4)
+          return true;
+      }
+    }
+    return false;
+  },
+  minArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t2)
+      return 0;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t1 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t1)
+      return 3;
+    return 4;
+  },
+  maxArgs: function(f) {
+    var t1, t2;
+    t1 = H.getDynamicRuntimeType();
+    t2 = H.buildFunctionType(t1, [t1, t1, t1])._isTest$1(f);
+    if (t2)
+      return 3;
+    t2 = H.buildFunctionType(t1, [t1, t1])._isTest$1(f);
+    if (t2)
+      return 2;
+    t2 = H.buildFunctionType(t1, [t1])._isTest$1(f);
+    if (t2)
+      return 1;
+    t1 = H.buildFunctionType(t1)._isTest$1(f);
+    if (t1)
+      return 0;
+    return -1;
+  },
+  compareLists: function(a, b, unordered) {
+    var t1, t2, bSet, i, t3;
+    t1 = a.length;
+    t2 = b.length;
+    if (t1 !== t2)
+      return false;
+    if (unordered) {
+      bSet = P.LinkedHashSet_LinkedHashSet(null, null, null, null);
+      bSet.addAll$1(0, b);
+      for (i = 0; i < a.length; ++i)
+        if (!bSet.contains$1(0, a[i]))
+          return false;
+    } else
+      for (i = 0; i < t1; ++i) {
+        t3 = a[i];
+        if (i >= t2)
+          return H.ioore(b, i);
+        if (t3 !== b[i])
+          return false;
+      }
+    return true;
+  }
+}],
+["smoke.src.implementation", "package:smoke/src/implementation.dart", , D, {
+  "^": "",
+  throwNotConfiguredError: function() {
+    throw H.wrapException(P.Exception_Exception("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)."));
+  }
+}],
+["smoke.static", "package:smoke/static.dart", , O, {
+  "^": "",
+  StaticConfiguration: {
+    "^": "Object;getters,setters,parents,declarations,staticMethods,names<,checkedMode"
+  },
+  GeneratedObjectAccessorService: {
+    "^": "Object;_getters,_setters,_staticMethods",
+    read$2: function(object, $name) {
+      var getter = this._getters.$index(0, $name);
+      if (getter == null)
+        throw H.wrapException(O.MissingCodeException$("getter \"" + H.S($name) + "\" in " + H.S(object)));
+      return getter.call$1(object);
+    },
+    write$3: function(object, $name, value) {
+      var setter = this._setters.$index(0, $name);
+      if (setter == null)
+        throw H.wrapException(O.MissingCodeException$("setter \"" + H.S($name) + "\" in " + H.S(object)));
+      setter.call$2(object, value);
+    },
+    invoke$5$adjust$namedArgs: function(object, $name, args, adjust, namedArgs) {
+      var method, tentativeError, getter, min, max, t1, exception;
+      method = null;
+      if (!!J.getInterceptor(object).$isType) {
+        this._staticMethods.$index(0, object);
+        method = null;
+      } else {
+        getter = this._getters.$index(0, $name);
+        method = getter == null ? null : getter.call$1(object);
+      }
+      if (method == null)
+        throw H.wrapException(O.MissingCodeException$("method \"" + H.S($name) + "\" in " + H.S(object)));
+      tentativeError = null;
+      if (adjust) {
+        min = X.minArgs(method);
+        if (min > 3) {
+          tentativeError = "we tried to adjust the arguments for calling \"" + H.S($name) + "\", but we couldn't determine the exact number of arguments it expects (it is more than 3).";
+          args = X.adjustList(args, min, P.max(min, J.get$length$asx(args)));
+        } else {
+          max = X.maxArgs(method);
+          t1 = max >= 0 ? max : J.get$length$asx(args);
+          args = X.adjustList(args, min, t1);
+        }
+      }
+      try {
+        t1 = H.Primitives_applyFunction(method, args, P.Function__toMangledNames(null));
+        return t1;
+      } catch (exception) {
+        if (!!J.getInterceptor(H.unwrapException(exception)).$isNoSuchMethodError) {
+          if (tentativeError != null)
+            P.print(tentativeError);
+          throw exception;
+        } else
+          throw exception;
+      }
+
+    }
+  },
+  GeneratedTypeInspectorService: {
+    "^": "Object;_parents,_declarations,_checkedMode",
+    isSubclassOf$2: function(type, supertype) {
+      var t1, parentType, t2;
+      if (type.$eq(0, supertype) || supertype.$eq(0, C.Type_HqF))
+        return true;
+      for (t1 = this._parents; !J.$eq(type, C.Type_HqF); type = parentType) {
+        parentType = t1.$index(0, type);
+        t2 = J.getInterceptor(parentType);
+        if (t2.$eq(parentType, supertype))
+          return true;
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return false;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\" (" + t2.toString$0(parentType) + ")"));
+        }
+      }
+      return false;
+    },
+    hasInstanceMethod$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && !decl.isStatic;
+    },
+    hasStaticMethod$2: function(type, $name) {
+      var map, decl;
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return false;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      decl = map.$index(0, $name);
+      return decl != null && decl.kind === C.DeclarationKind_2 && decl.isStatic;
+    },
+    getDeclaration$2: function(type, $name) {
+      var decl = this._findDeclaration$2(type, $name);
+      if (decl == null) {
+        if (!this._checkedMode)
+          return;
+        throw H.wrapException(O.MissingCodeException$("declaration for " + H.S(type) + "." + H.S($name)));
+      }
+      return decl;
+    },
+    query$2: function(_, type, options) {
+      var result, superclass, map, t1, decl, t2;
+      result = [];
+      if (options.includeInherited) {
+        superclass = this._parents.$index(0, type);
+        if (superclass == null) {
+          if (this._checkedMode)
+            throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        } else if (!superclass.$eq(0, options.includeUpTo))
+          result = this.query$2(0, superclass, options);
+      }
+      map = this._declarations.$index(0, type);
+      if (map == null) {
+        if (!this._checkedMode)
+          return result;
+        throw H.wrapException(O.MissingCodeException$("declarations for " + H.S(type)));
+      }
+      for (t1 = J.get$iterator$ax(map.get$values(map)); t1.moveNext$0();) {
+        decl = t1.get$current();
+        if (!options.includeFields && decl.get$isField())
+          continue;
+        if (!options.includeProperties && decl.get$isProperty())
+          continue;
+        if (options.excludeFinal && J.get$isFinal$x(decl) === true)
+          continue;
+        if (!options.includeMethods && decl.get$isMethod())
+          continue;
+        if (options.matches != null && options.matches$1(0, J.get$name$x(decl)) !== true)
+          continue;
+        t2 = options.withAnnotations;
+        if (t2 != null && !X.matchesAnnotation(decl.get$annotations(), t2))
+          continue;
+        result.push(decl);
+      }
+      return result;
+    },
+    _findDeclaration$2: function(type, $name) {
+      var t1, t2, declarations, declaration, parentType;
+      for (t1 = this._parents, t2 = this._declarations; !J.$eq(type, C.Type_HqF); type = parentType) {
+        declarations = t2.$index(0, type);
+        if (declarations != null) {
+          declaration = declarations.$index(0, $name);
+          if (declaration != null)
+            return declaration;
+        }
+        parentType = t1.$index(0, type);
+        if (parentType == null) {
+          if (!this._checkedMode)
+            return;
+          throw H.wrapException(O.MissingCodeException$("superclass of \"" + H.S(type) + "\""));
+        }
+      }
+      return;
+    }
+  },
+  GeneratedSymbolConverterService: {
+    "^": "Object;_names,_symbols",
+    GeneratedSymbolConverterService$1: function(configuration) {
+      this._names.forEach$1(0, new O.GeneratedSymbolConverterService_closure(this));
+    },
+    static: {GeneratedSymbolConverterService$: function(configuration) {
+        var t1 = new O.GeneratedSymbolConverterService(configuration.names, P.LinkedHashMap_LinkedHashMap$_empty(null, null));
+        t1.GeneratedSymbolConverterService$1(configuration);
+        return t1;
+      }}
+  },
+  GeneratedSymbolConverterService_closure: {
+    "^": "Closure:75;this_0",
+    call$2: function(k, v) {
+      this.this_0._symbols.$indexSet(0, v, k);
+    },
+    $isFunction: true
+  },
+  MissingCodeException: {
+    "^": "Object;description",
+    toString$0: function(_) {
+      return "Missing " + this.description + ". Code generation for the smoke package seems incomplete.";
+    },
+    static: {MissingCodeException$: function(description) {
+        return new O.MissingCodeException(description);
+      }}
+  }
+}],
+["stack_frame_element", "package:observatory/src/elements/stack_frame.dart", , K, {
+  "^": "",
+  StackFrameElement: {
+    "^": "ObservatoryElement_ChangeNotifier48;_stack_frame_element$__$frame,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$frame: function(receiver) {
+      return receiver._stack_frame_element$__$frame;
+    },
+    set$frame: function(receiver, value) {
+      receiver._stack_frame_element$__$frame = this.notifyPropertyChange$3(receiver, C.Symbol_frame, receiver._stack_frame_element$__$frame, value);
+    },
+    static: {StackFrameElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackFrameElement_methods.Element$created$0(receiver);
+        C.StackFrameElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier48: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["stack_trace_element", "package:observatory/src/elements/stack_trace.dart", , X, {
+  "^": "",
+  StackTraceElement: {
+    "^": "ObservatoryElement_ChangeNotifier49;_stack_trace_element$__$trace,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$trace: function(receiver) {
+      return receiver._stack_trace_element$__$trace;
+    },
+    set$trace: function(receiver, value) {
+      receiver._stack_trace_element$__$trace = this.notifyPropertyChange$3(receiver, C.Symbol_trace, receiver._stack_trace_element$__$trace, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._stack_trace_element$__$trace).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {StackTraceElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.StackTraceElement_methods.Element$created$0(receiver);
+        C.StackTraceElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier49: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+["template_binding", "package:template_binding/template_binding.dart", , M, {
+  "^": "",
+  _updateAttribute: function(node, $name, conditional, value) {
+    var t1, t2;
+    if (conditional) {
+      t1 = null != value && false !== value;
+      t2 = J.getInterceptor$x(node);
+      if (t1)
+        t2.get$attributes(node)._html$_element.setAttribute($name, "");
+      else
+        t2.get$attributes(node).remove$1(0, $name);
+    } else {
+      t1 = J.get$attributes$x(node);
+      t2 = value == null ? "" : H.S(value);
+      t1._html$_element.setAttribute($name, t2);
+    }
+  },
+  _getTreeScope: function(node) {
+    var $parent;
+    for (; $parent = J.get$parentNode$x(node), $parent != null; node = $parent)
+      ;
+    return M._hasGetElementById(node) ? node : null;
+  },
+  _hasGetElementById: function(node) {
+    var t1 = J.getInterceptor(node);
+    return !!t1.$isDocument || !!t1.$isShadowRoot || !!t1.$isSvgSvgElement;
+  },
+  _createInstanceBindingMap: function(node, delegate) {
+    var map, t1, c, children, index, childMap;
+    map = M._getBindings(node, delegate);
+    if (map == null)
+      map = new M._InstanceBindingMap([], null, null);
+    for (t1 = J.getInterceptor$x(node), c = t1.get$firstChild(node), children = null, index = 0; c != null; c = c.nextSibling, ++index) {
+      childMap = M._createInstanceBindingMap(c, delegate);
+      if (childMap == null)
+        continue;
+      if (children == null) {
+        children = Array(t1.get$nodes(node)._this.childNodes.length);
+        children.fixed$length = init;
+      }
+      if (index >= children.length)
+        return H.ioore(children, index);
+      children[index] = childMap;
+    }
+    map.children = children;
+    return map;
+  },
+  _cloneAndBindInstance: function(node, $parent, stagingDocument, bindings, model, delegate, instanceBindings, instanceRecord) {
+    var clone, c, t1, i;
+    clone = $parent.appendChild(J.importNode$2$x(stagingDocument, node, false));
+    for (c = node.firstChild, t1 = bindings != null, i = 0; c != null; c = c.nextSibling, ++i)
+      M._cloneAndBindInstance(c, clone, stagingDocument, t1 ? bindings.getChild$1(i) : null, model, delegate, instanceBindings, null);
+    if (bindings.get$isTemplate()) {
+      M.nodeBindFallback(clone)._decorate$1(node);
+      if (delegate != null)
+        J.set$bindingDelegate$x(M.nodeBindFallback(clone), delegate);
+    }
+    M._processBindings(clone, bindings, model, instanceBindings);
+    return clone;
+  },
+  _getFragmentRoot: function(node) {
+    var p;
+    for (; p = J.get$parentNode$x(node), p != null; node = p)
+      ;
+    return node;
+  },
+  _searchRefId: function(node, id) {
+    var selector, t1, values, instance, ref, t2;
+    if (id == null || id === "")
+      return;
+    selector = "#" + H.S(id);
+    for (; true;) {
+      node = M._getFragmentRoot(node);
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(node, "expando$values");
+      instance = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+      t1 = instance == null;
+      if (!t1 && instance.get$_protoContent() != null)
+        ref = J.querySelector$1$x(instance.get$_protoContent(), selector);
+      else {
+        t2 = J.getInterceptor(node);
+        ref = !!t2.$isDocument || !!t2.$isShadowRoot || !!t2.$isSvgSvgElement ? t2.getElementById$1(node, id) : null;
+      }
+      if (ref != null)
+        return ref;
+      if (t1)
+        return;
+      node = instance.get$_templateCreator();
+      if (node == null)
+        return;
+    }
+  },
+  _getDelegateFactory: function($name, node, delegate) {
+    if (delegate == null)
+      return;
+    return new M._getDelegateFactory_closure($name, node, delegate);
+  },
+  _getBindings: function(node, delegate) {
+    var t1, tokens;
+    t1 = J.getInterceptor(node);
+    if (!!t1.$isElement)
+      return M._parseAttributeBindings(node, delegate);
+    if (!!t1.$isText) {
+      tokens = S.MustacheTokens_parse(node.textContent, M._getDelegateFactory("text", node, delegate));
+      if (tokens != null)
+        return new M._InstanceBindingMap(["text", tokens], null, null);
+    }
+    return;
+  },
+  _parseWithDefault: function(element, $name, delegate) {
+    var v = element.getAttribute($name);
+    if (v === "")
+      v = "{{}}";
+    return S.MustacheTokens_parse(v, M._getDelegateFactory($name, element, delegate));
+  },
+  _parseAttributeBindings: function(element, delegate) {
+    var t1, isTemplateNode, t2, bindings, result, t3;
+    t1 = {};
+    t1.bindings_0 = null;
+    isTemplateNode = M.isSemanticTemplate(element);
+    new W._ElementAttributeMap(element).forEach$1(0, new M._parseAttributeBindings_closure(t1, element, delegate, isTemplateNode));
+    if (isTemplateNode) {
+      t2 = t1.bindings_0;
+      if (t2 == null) {
+        bindings = [];
+        t1.bindings_0 = bindings;
+        t1 = bindings;
+      } else
+        t1 = t2;
+      result = new M._TemplateBindingMap(null, null, null, t1, null, null);
+      t1 = M._parseWithDefault(element, "if", delegate);
+      result._if = t1;
+      t2 = M._parseWithDefault(element, "bind", delegate);
+      result._bind = t2;
+      t3 = M._parseWithDefault(element, "repeat", delegate);
+      result._repeat = t3;
+      if (t1 != null && t2 == null && t3 == null)
+        result._bind = S.MustacheTokens_parse("{{}}", M._getDelegateFactory("bind", element, delegate));
+      return result;
+    }
+    t1 = t1.bindings_0;
+    return t1 == null ? null : new M._InstanceBindingMap(t1, null, null);
+  },
+  _processOneTimeBinding: function($name, tokens, node, model) {
+    var delegateFn, value, t1, t2, values, i, t3;
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      value = delegateFn != null ? delegateFn.call$3(model, node, true) : tokens.getPath$1(0).getValueFrom$1(model);
+      return tokens.get$isSimplePath() ? value : tokens.combinator$1(value);
+    }
+    t1 = J.getInterceptor$asx(tokens);
+    t2 = t1.get$length(tokens);
+    if (typeof t2 !== "number")
+      return H.iae(t2);
+    values = Array(t2);
+    values.fixed$length = init;
+    t2 = values.length;
+    i = 0;
+    while (true) {
+      t3 = t1.get$length(tokens);
+      if (typeof t3 !== "number")
+        return H.iae(t3);
+      if (!(i < t3))
+        break;
+      delegateFn = tokens.getPrepareBinding$1(i);
+      t3 = delegateFn != null ? delegateFn.call$3(model, node, false) : tokens.getPath$1(i).getValueFrom$1(model);
+      if (i >= t2)
+        return H.ioore(values, i);
+      values[i] = t3;
+      ++i;
+    }
+    return tokens.combinator$1(values);
+  },
+  _processBinding: function($name, tokens, node, model) {
+    var delegateFn, observer, t1, t2, i, oneTime, value, path;
+    if (tokens.get$onlyOneTime())
+      return M._processOneTimeBinding($name, tokens, node, model);
+    if (tokens.get$hasOnePath()) {
+      delegateFn = tokens.getPrepareBinding$1(0);
+      if (delegateFn != null)
+        observer = delegateFn.call$3(model, node, false);
+      else {
+        t1 = tokens.getPath$1(0);
+        t1 = !!J.getInterceptor(t1).$isPropertyPath ? t1 : L.PropertyPath_PropertyPath(t1);
+        t2 = $._Observer__nextBirthId;
+        $._Observer__nextBirthId = t2 + 1;
+        observer = new L.PathObserver(t1, model, null, t2, null, null, null);
+      }
+      return tokens.get$isSimplePath() ? observer : new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+    }
+    t1 = $._Observer__nextBirthId;
+    $._Observer__nextBirthId = t1 + 1;
+    observer = new L.CompoundObserver(null, [], t1, null, null, null);
+    observer._path_observer$_value = [];
+    t1 = J.getInterceptor$asx(tokens);
+    i = 0;
+    while (true) {
+      t2 = t1.get$length(tokens);
+      if (typeof t2 !== "number")
+        return H.iae(t2);
+      if (!(i < t2))
+        break;
+      c$0: {
+        oneTime = tokens.getOneTime$1(i);
+        delegateFn = tokens.getPrepareBinding$1(i);
+        if (delegateFn != null) {
+          value = delegateFn.call$3(model, node, oneTime);
+          if (oneTime === true)
+            observer.addPath$1(value);
+          else {
+            if (observer._notifyCallback != null || observer._observed == null)
+              H.throwExpression(P.StateError$("Cannot add observers once started."));
+            J.open$1$x(value, observer.get$_deliver());
+            t2 = observer._observed;
+            t2.push(C.C__ObserverSentinel);
+            t2.push(value);
+          }
+          break c$0;
+        }
+        path = tokens.getPath$1(i);
+        if (oneTime === true)
+          observer.addPath$1(path.getValueFrom$1(model));
+        else
+          observer.addPath$2(model, path);
+      }
+      ++i;
+    }
+    return new Y.ObserverTransform(observer, tokens.get$combinator(), null, null, null);
+  },
+  _processBindings: function(node, map, model, instanceBindings) {
+    var t1, bindings, nodeExt, t2, t3, i, $name, tokens, binding, templateExt, iter;
+    t1 = J.getInterceptor$x(map);
+    bindings = t1.get$bindings(map);
+    nodeExt = !!J.getInterceptor(node).$isNodeBindExtension ? node : M.nodeBindFallback(node);
+    for (t2 = J.getInterceptor$asx(bindings), t3 = J.getInterceptor$x(nodeExt), i = 0; i < t2.get$length(bindings); i += 2) {
+      $name = t2.$index(bindings, i);
+      tokens = t2.$index(bindings, i + 1);
+      binding = t3.bind$3$oneTime(nodeExt, $name, M._processBinding($name, tokens, node, model), tokens.get$onlyOneTime());
+      if (binding != null && true)
+        instanceBindings.push(binding);
+    }
+    t3.bindFinished$0(nodeExt);
+    if (!t1.$is_TemplateBindingMap)
+      return;
+    templateExt = M.nodeBindFallback(node);
+    templateExt.set$_model(model);
+    iter = templateExt._processBindingDirectives$1(map);
+    if (iter != null && true)
+      instanceBindings.push(iter);
+  },
+  nodeBindFallback: function(node) {
+    var t1, values, extension, t2;
+    t1 = $.get$_expando();
+    t1.toString;
+    values = H.Primitives_getProperty(node, "expando$values");
+    extension = values == null ? null : H.Primitives_getProperty(values, t1._getKey$0());
+    if (extension != null)
+      return extension;
+    t2 = J.getInterceptor(node);
+    if (!!t2.$isInputElement)
+      extension = new M._InputElementExtension(node, null, null);
+    else if (!!t2.$isSelectElement)
+      extension = new M._SelectElementExtension(node, null, null);
+    else if (!!t2.$isTextAreaElement)
+      extension = new M._TextAreaElementExtension(node, null, null);
+    else if (!!t2.$isElement) {
+      if (!(node.tagName === "TEMPLATE" && node.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t2.get$attributes(node)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(node)) === true))
+          t2 = node.tagName === "template" && t2.get$namespaceUri(node) === "http://www.w3.org/2000/svg";
+        else
+          t2 = true;
+      else
+        t2 = true;
+      extension = t2 ? new M.TemplateBindExtension(null, null, null, false, null, null, null, null, null, null, node, null, null) : new M._ElementExtension(node, null, null);
+    } else
+      extension = !!t2.$isText ? new M._TextExtension(node, null, null) : new M.NodeBindExtension(node, null, null);
+    t1.$indexSet(0, node, extension);
+    return extension;
+  },
+  isSemanticTemplate: function(n) {
+    var t1 = J.getInterceptor(n);
+    if (!!t1.$isElement)
+      if (!(n.tagName === "TEMPLATE" && n.namespaceURI === "http://www.w3.org/1999/xhtml"))
+        if (!(t1.get$attributes(n)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t1.get$localName(n)) === true))
+          t1 = n.tagName === "template" && t1.get$namespaceUri(n) === "http://www.w3.org/2000/svg";
+        else
+          t1 = true;
+      else
+        t1 = true;
+    else
+      t1 = false;
+    return t1;
+  },
+  BindingDelegate: {
+    "^": "Object;_bindingMaps",
+    prepareBinding$3: function(path, $name, node) {
+      return;
+    },
+    static: {"^": "BindingDelegate__DEFAULT"}
+  },
+  _ElementExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, node, t2, t3, t4, conditional;
+      t1 = {};
+      t1.name_0 = $name;
+      node = this.get$_node();
+      t2 = J.getInterceptor(node);
+      t3 = !!t2.$isOptionElement && J.$eq(t1.name_0, "value");
+      t4 = t1.name_0;
+      if (t3) {
+        new W._ElementAttributeMap(node).remove$1(0, t4);
+        if (oneTime)
+          return this._updateOption$1(value);
+        t2 = this.get$_updateOption();
+        t2.call$1(J.open$1$x(value, t2));
+      } else {
+        conditional = J.endsWith$1$s(t4, "?");
+        if (conditional) {
+          t2.get$attributes(node).remove$1(0, t1.name_0);
+          t2 = t1.name_0;
+          t3 = J.getInterceptor$asx(t2);
+          t1.name_0 = t3.substring$2(t2, 0, J.$sub$n(t3.get$length(t2), 1));
+        }
+        if (oneTime)
+          return M._updateAttribute(this.get$_node(), t1.name_0, conditional, value);
+        t2 = new M._ElementExtension_bind_closure(t1, this, conditional);
+        t2.call$1(J.open$1$x(value, t2));
+      }
+      t1 = t1.name_0;
+      return $.enableBindingsReflection ? this._updateBindings$2(t1, value) : value;
+    },
+    _updateOption$1: [function(newValue) {
+      var node, t1, select, t2, bindings, valueBinding, oldValue, selectBinding;
+      node = this.get$_node();
+      t1 = J.getInterceptor$x(node);
+      select = t1.get$parentNode(node);
+      t2 = J.getInterceptor(select);
+      if (!!t2.$isSelectElement) {
+        bindings = J.get$bindings$x(M.nodeBindFallback(select));
+        if (bindings != null) {
+          valueBinding = J.$index$asx(bindings, "value");
+          if (!!J.getInterceptor(valueBinding).$is_InputBinding) {
+            oldValue = select.value;
+            selectBinding = valueBinding;
+          } else {
+            oldValue = null;
+            selectBinding = null;
+          }
+        } else {
+          oldValue = null;
+          selectBinding = null;
+        }
+      } else {
+        oldValue = null;
+        selectBinding = null;
+      }
+      t1.set$value(node, newValue == null ? "" : H.S(newValue));
+      if (selectBinding != null && !J.$eq(t2.get$value(select), oldValue)) {
+        t1 = t2.get$value(select);
+        J.set$value$x(selectBinding.get$_template_binding$_bindable(), t1);
+      }
+    }, "call$1", "get$_updateOption", 2, 0, 20, 58]
+  },
+  _ElementExtension_bind_closure: {
+    "^": "Closure:13;box_0,this_1,conditional_2",
+    call$1: [function(x) {
+      return M._updateAttribute(this.this_1.get$_node(), this.box_0.name_0, this.conditional_2, x);
+    }, "call$1", null, 2, 0, null, 65, "call"],
+    $isFunction: true
+  },
+  _InputBinding: {
+    "^": "Bindable;_node<,_eventSub,_template_binding$_bindable<,_propertyName",
+    _template_binding$_updateNode$1: [function(newValue) {
+      return M._InputBinding__updateProperty(this._node, newValue, this._propertyName);
+    }, "call$1", "get$_template_binding$_updateNode", 2, 0, 20, 58],
+    _nodeChanged$1: [function(e) {
+      var t1, t2, t3, r, checkedBinding;
+      switch (this._propertyName) {
+        case "value":
+          t1 = J.get$value$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+        case "checked":
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          t3 = t2.get$checked(t1);
+          J.set$value$x(this._template_binding$_bindable, t3);
+          if (!!t2.$isInputElement && J.$eq(t2.get$type(t1), "radio"))
+            for (t1 = J.get$iterator$ax(M._InputBinding__getAssociatedRadioButtons(t1)); t1.moveNext$0();) {
+              r = t1.get$current();
+              checkedBinding = J.$index$asx(J.get$bindings$x(!!J.getInterceptor(r).$isNodeBindExtension ? r : M.nodeBindFallback(r)), "checked");
+              if (checkedBinding != null)
+                J.set$value$x(checkedBinding, false);
+            }
+          break;
+        case "selectedIndex":
+          t1 = J.get$selectedIndex$x(this._node);
+          J.set$value$x(this._template_binding$_bindable, t1);
+          break;
+      }
+      O.dirtyCheckObservables();
+    }, "call$1", "get$_nodeChanged", 2, 0, 20, 1],
+    open$1: function(_, callback) {
+      return J.open$1$x(this._template_binding$_bindable, callback);
+    },
+    get$value: function(_) {
+      return J.get$value$x(this._template_binding$_bindable);
+    },
+    set$value: function(_, newValue) {
+      J.set$value$x(this._template_binding$_bindable, newValue);
+      return newValue;
+    },
+    close$0: function(_) {
+      var t1 = this._eventSub;
+      if (t1 != null) {
+        t1.cancel$0();
+        this._eventSub = null;
+      }
+      t1 = this._template_binding$_bindable;
+      if (t1 != null) {
+        J.close$0$x(t1);
+        this._template_binding$_bindable = null;
+      }
+    },
+    $is_InputBinding: true,
+    static: {"^": "_InputBinding__checkboxEventType", _InputBinding__updateProperty: function(node, newValue, propertyName) {
+        switch (propertyName) {
+          case "checked":
+            J.set$checked$x(node, null != newValue && false !== newValue);
+            return;
+          case "selectedIndex":
+            J.set$selectedIndex$x(node, M._InputBinding__toInt(newValue));
+            return;
+          case "value":
+            J.set$value$x(node, newValue == null ? "" : H.S(newValue));
+            return;
+        }
+      }, _InputBinding__getStreamForInputType: function(element) {
+        var t1 = J.getInterceptor(element);
+        if (!!t1.$isOptionElement)
+          return H.setRuntimeTypeInfo(new W._ElementEventStreamImpl(element, C.EventStreamProvider_input._eventType, false), [null]);
+        switch (t1.get$type(element)) {
+          case "checkbox":
+            return $.get$_InputBinding__checkboxEventType().forTarget$1(element);
+          case "radio":
+          case "select-multiple":
+          case "select-one":
+            return t1.get$onChange(element);
+          case "range":
+            if (J.contains$1$asx(window.navigator.userAgent, new H.JSSyntaxRegExp("Trident|MSIE", H.JSSyntaxRegExp_makeNative("Trident|MSIE", false, true, false), null, null)))
+              return t1.get$onChange(element);
+            break;
+        }
+        return t1.get$onInput(element);
+      }, _InputBinding__getAssociatedRadioButtons: function(element) {
+        var t1, treeScope, radios;
+        t1 = J.getInterceptor$x(element);
+        if (t1.get$form(element) != null) {
+          t1 = t1.get$form(element);
+          t1.toString;
+          t1 = new W._ChildNodeListLazy(t1);
+          return t1.where$1(t1, new M._InputBinding__getAssociatedRadioButtons_closure(element));
+        } else {
+          treeScope = M._getTreeScope(element);
+          if (treeScope == null)
+            return C.List_empty;
+          radios = J.querySelectorAll$1$x(treeScope, "input[type=\"radio\"][name=\"" + H.S(t1.get$name(element)) + "\"]");
+          return radios.where$1(radios, new M._InputBinding__getAssociatedRadioButtons_closure0(element));
+        }
+      }, _InputBinding__toInt: function(value) {
+        if (typeof value === "string")
+          return H.Primitives_parseInt(value, null, new M._InputBinding__toInt_closure());
+        return typeof value === "number" && Math.floor(value) === value ? value : 0;
+      }}
+  },
+  closure10: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var checkbox, t1, fired, t2, $event;
+      checkbox = document.createElement("div", null).appendChild(W.InputElement_InputElement(null));
+      t1 = J.getInterceptor$x(checkbox);
+      t1.set$type(checkbox, "checkbox");
+      fired = [];
+      t2 = t1.get$onClick(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t2._html$_target, t2._eventType, W._wrapZone(new M._closure1(fired)), t2._useCapture), [H.getTypeArgumentByIndex(t2, 0)])._tryResume$0();
+      t1 = t1.get$onChange(checkbox);
+      H.setRuntimeTypeInfo(new W._EventStreamSubscription(0, t1._html$_target, t1._eventType, W._wrapZone(new M._closure2(fired)), t1._useCapture), [H.getTypeArgumentByIndex(t1, 0)])._tryResume$0();
+      t1 = window;
+      $event = document.createEvent("MouseEvent");
+      J._initMouseEvent$15$x($event, "click", true, true, t1, 0, 0, 0, 0, 0, false, false, false, false, 0, null);
+      checkbox.dispatchEvent($event);
+      return fired.length === 1 ? C.EventStreamProvider_change : C.JSArray_methods.get$first(fired);
+    },
+    $isFunction: true
+  },
+  _closure1: {
+    "^": "Closure:13;fired_0",
+    call$1: [function(e) {
+      this.fired_0.push(C.EventStreamProvider_click);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _closure2: {
+    "^": "Closure:13;fired_1",
+    call$1: [function(e) {
+      this.fired_1.push(C.EventStreamProvider_change);
+    }, "call$1", null, 2, 0, null, 1, "call"],
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure: {
+    "^": "Closure:13;element_0",
+    call$1: function(el) {
+      var t1, t2;
+      t1 = this.element_0;
+      t2 = J.getInterceptor(el);
+      if (!t2.$eq(el, t1))
+        if (!!t2.$isInputElement)
+          if (el.type === "radio") {
+            t2 = el.name;
+            t1 = J.get$name$x(t1);
+            t1 = t2 == null ? t1 == null : t2 === t1;
+          } else
+            t1 = false;
+        else
+          t1 = false;
+      else
+        t1 = false;
+      return t1;
+    },
+    $isFunction: true
+  },
+  _InputBinding__getAssociatedRadioButtons_closure0: {
+    "^": "Closure:13;element_1",
+    call$1: function(el) {
+      var t1 = J.getInterceptor(el);
+      return !t1.$eq(el, this.element_1) && t1.get$form(el) == null;
+    },
+    $isFunction: true
+  },
+  _InputBinding__toInt_closure: {
+    "^": "Closure:13;",
+    call$1: function(_) {
+      return 0;
+    },
+    $isFunction: true
+  },
+  _InputElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "value") && !t1.$eq($name, "checked"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  _InstanceBindingMap: {
+    "^": "Object;bindings>,children>,content>",
+    get$isTemplate: function() {
+      return false;
+    },
+    getChild$1: function(index) {
+      var t1 = this.children;
+      if (t1 == null || index >= t1.length)
+        return;
+      if (index >= t1.length)
+        return H.ioore(t1, index);
+      return t1[index];
+    }
+  },
+  _TemplateBindingMap: {
+    "^": "_InstanceBindingMap;_if,_bind,_repeat,bindings,children,content",
+    get$isTemplate: function() {
+      return true;
+    },
+    $is_TemplateBindingMap: true
+  },
+  NodeBindExtension: {
+    "^": "Object;_node<,bindings*,_templateInstance?",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      window;
+      t1 = "Unhandled binding to Node: " + H.Primitives_objectToString(this) + " " + H.S($name) + " " + H.S(value) + " " + oneTime;
+      if (typeof console != "undefined")
+        console.error(t1);
+      return;
+    },
+    bindFinished$0: function(_) {
+    },
+    get$templateInstance: function(_) {
+      var t1 = this._templateInstance;
+      if (t1 != null)
+        ;
+      else if (J.get$parent$x(this.get$_node()) != null) {
+        t1 = J.get$parent$x(this.get$_node());
+        t1 = J.get$templateInstance$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+      } else
+        t1 = null;
+      return t1;
+    },
+    _updateBindings$2: function($name, binding) {
+      var t1, old;
+      t1 = this.bindings;
+      if (t1 == null) {
+        t1 = P.LinkedHashMap_LinkedHashMap$_empty(null, null);
+        this.bindings = t1;
+      }
+      old = t1.$index(0, $name);
+      if (old != null)
+        J.close$0$x(old);
+      this.bindings.$indexSet(0, $name, binding);
+      return binding;
+    },
+    $isNodeBindExtension: true
+  },
+  TemplateInstance: {
+    "^": "Object;model>,_firstNode,_lastNode"
+  },
+  _SelectElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (J.$eq($name, "selectedindex"))
+        $name = "selectedIndex";
+      t1 = J.getInterceptor($name);
+      if (!t1.$eq($name, "selectedIndex") && !t1.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return this._updateBindings$2($name, t2);
+    }
+  },
+  TemplateBindExtension: {
+    "^": "_ElementExtension;_model?,_bindingDelegate,_template_binding$_iterator<,_setModelScheduled,_templateInstanceRef?,_content?,_templateIsDecorated?,_stagingDocument,_bindingMap,_refContent,_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var ref;
+      if (!J.$eq($name, "ref"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      ref = oneTime ? value : J.open$1$x(value, new M.TemplateBindExtension_bind_closure(this));
+      J.get$attributes$x(this._node)._html$_element.setAttribute("ref", ref);
+      this._refChanged$0();
+      if (oneTime)
+        return;
+      return this._updateBindings$2("ref", value);
+    },
+    _processBindingDirectives$1: function(directives) {
+      var t1 = this._template_binding$_iterator;
+      if (t1 != null)
+        t1._closeDependencies$0();
+      if (directives._if == null && directives._bind == null && directives._repeat == null) {
+        t1 = this._template_binding$_iterator;
+        if (t1 != null) {
+          t1.close$0(0);
+          this._template_binding$_iterator = null;
+        }
+        return;
+      }
+      t1 = this._template_binding$_iterator;
+      if (t1 == null) {
+        t1 = new M._TemplateIterator(this, [], [], null, false, null, null, null, null, null, null, null, false, null, null);
+        this._template_binding$_iterator = t1;
+      }
+      t1._updateDependencies$2(directives, this._model);
+      J.observe$3$attributeFilter$attributes$x($.get$TemplateBindExtension__templateObserver(), this._node, ["ref"], true);
+      return this._template_binding$_iterator;
+    },
+    createInstance$2: function(_, model, delegate) {
+      var t1, t2, delegate0, t3, map, owner, doc, instance, instanceExt, t4, instanceRecord, c, i, collectTerminator, childMap, clone;
+      if (delegate == null)
+        delegate = this._bindingDelegate;
+      t1 = this._refContent;
+      if (t1 == null) {
+        t1 = this.get$_ref();
+        t1 = J.get$content$x(!!J.getInterceptor(t1).$isNodeBindExtension ? t1 : M.nodeBindFallback(t1));
+        this._refContent = t1;
+      }
+      t2 = J.getInterceptor$x(t1);
+      if (t2.get$firstChild(t1) == null)
+        return $.get$_emptyInstance();
+      delegate0 = delegate == null ? $.get$BindingDelegate__DEFAULT() : delegate;
+      t3 = delegate0._bindingMaps;
+      if (t3 == null) {
+        t3 = H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+        delegate0._bindingMaps = t3;
+      }
+      map = t3.$index(0, t1);
+      if (map == null) {
+        map = M._createInstanceBindingMap(t1, delegate0);
+        delegate0._bindingMaps.$indexSet(0, t1, map);
+      }
+      t3 = this._stagingDocument;
+      if (t3 == null) {
+        owner = J.get$ownerDocument$x(this._node);
+        t3 = $.get$TemplateBindExtension__ownerStagingDocument();
+        doc = t3.$index(0, owner);
+        if (doc == null) {
+          doc = owner.implementation.createHTMLDocument("");
+          $.get$_isStagingDocument().$indexSet(0, doc, true);
+          M.TemplateBindExtension__baseUriWorkaround(doc);
+          t3.$indexSet(0, owner, doc);
+        }
+        this._stagingDocument = doc;
+        t3 = doc;
+      }
+      instance = J.createDocumentFragment$0$x(t3);
+      t3 = [];
+      instanceExt = new M._InstanceExtension(t3, null, null, null);
+      t4 = $.get$_instanceExtension();
+      instanceExt._templateCreator = this._node;
+      instanceExt._protoContent = t1;
+      t4.$indexSet(0, instance, instanceExt);
+      instanceRecord = new M.TemplateInstance(model, null, null);
+      M.nodeBindFallback(instance).set$_templateInstance(instanceRecord);
+      for (c = t2.get$firstChild(t1), t1 = map != null, i = 0, collectTerminator = false; c != null; c = c.nextSibling, ++i) {
+        if (c.nextSibling == null)
+          collectTerminator = true;
+        childMap = t1 ? map.getChild$1(i) : null;
+        clone = M._cloneAndBindInstance(c, instance, this._stagingDocument, childMap, model, delegate, t3, null);
+        M.nodeBindFallback(clone).set$_templateInstance(instanceRecord);
+        if (collectTerminator)
+          instanceExt._terminator = clone;
+      }
+      instanceRecord._firstNode = instance.firstChild;
+      instanceRecord._lastNode = instance.lastChild;
+      instanceExt._protoContent = null;
+      instanceExt._templateCreator = null;
+      return instance;
+    },
+    get$model: function(_) {
+      return this._model;
+    },
+    get$bindingDelegate: function(_) {
+      return this._bindingDelegate;
+    },
+    set$bindingDelegate: function(_, value) {
+      var t1;
+      if (this._bindingDelegate != null)
+        throw H.wrapException(P.StateError$("Template must be cleared before a new bindingDelegate can be assigned"));
+      this._bindingDelegate = value;
+      this._bindingMap = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 != null) {
+        t1._initPrepareFunctions = false;
+        t1._instanceModelFn = null;
+        t1._instancePositionChangedFn = null;
+      }
+    },
+    _refChanged$0: function() {
+      var t1, t2;
+      if (this._template_binding$_iterator != null) {
+        t1 = this._refContent;
+        t2 = this.get$_ref();
+        t2 = J.get$content$x(!!J.getInterceptor(t2).$isNodeBindExtension ? t2 : M.nodeBindFallback(t2));
+        t2 = t1 == null ? t2 == null : t1 === t2;
+        t1 = t2;
+      } else
+        t1 = true;
+      if (t1)
+        return;
+      this._refContent = null;
+      this._template_binding$_iterator._valueChanged$1(null);
+      this._template_binding$_iterator._updateIteratedValue$1(null);
+    },
+    clear$0: function(_) {
+      var t1, ref;
+      this._model = null;
+      this._bindingDelegate = null;
+      t1 = this.bindings;
+      if (t1 != null) {
+        ref = t1.remove$1(0, "ref");
+        if (ref != null)
+          J.close$0$x(ref);
+      }
+      this._refContent = null;
+      t1 = this._template_binding$_iterator;
+      if (t1 == null)
+        return;
+      t1._valueChanged$1(null);
+      this._template_binding$_iterator.close$0(0);
+      this._template_binding$_iterator = null;
+    },
+    get$_ref: function() {
+      var ref, nextRef;
+      this._decorate$0();
+      ref = M._searchRefId(this._node, J.get$attributes$x(this._node)._html$_element.getAttribute("ref"));
+      if (ref == null) {
+        ref = this._templateInstanceRef;
+        if (ref == null)
+          return this._node;
+      }
+      nextRef = M.nodeBindFallback(ref).get$_ref();
+      return nextRef != null ? nextRef : ref;
+    },
+    get$content: function(_) {
+      var t1;
+      this._decorate$0();
+      t1 = this._content;
+      return t1 != null ? t1 : H.interceptedTypeCast(this._node, "$isTemplateElement").content;
+    },
+    _decorate$1: function(instanceRef) {
+      var isNativeHtmlTemplate, liftContents, t1, t2, templateElementExt, liftRoot, template;
+      if (this._templateIsDecorated === true)
+        return false;
+      M.TemplateBindExtension__injectStylesheet();
+      M.TemplateBindExtension__globalBaseUriWorkaround();
+      this._templateIsDecorated = true;
+      isNativeHtmlTemplate = !!J.getInterceptor(this._node).$isTemplateElement;
+      liftContents = !isNativeHtmlTemplate;
+      if (liftContents) {
+        t1 = this._node;
+        t2 = J.getInterceptor$x(t1);
+        if (t2.get$attributes(t1)._html$_element.hasAttribute("template") === true && C.Map_05eTF.containsKey$1(t2.get$localName(t1)) === true) {
+          if (instanceRef != null)
+            throw H.wrapException(P.ArgumentError$("instanceRef should not be supplied for attribute templates."));
+          templateElementExt = M.TemplateBindExtension__extractTemplateFromAttributeTemplate(this._node);
+          templateElementExt = !!J.getInterceptor(templateElementExt).$isNodeBindExtension ? templateElementExt : M.nodeBindFallback(templateElementExt);
+          templateElementExt.set$_templateIsDecorated(true);
+          isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          liftRoot = true;
+        } else {
+          t1 = this._node;
+          t2 = J.getInterceptor$x(t1);
+          if (t2.get$tagName(t1) === "template" && t2.get$namespaceUri(t1) === "http://www.w3.org/2000/svg") {
+            t1 = this._node;
+            t2 = J.getInterceptor$x(t1);
+            template = t2.get$ownerDocument(t1).createElement("template", null);
+            t2.get$parentNode(t1).insertBefore(template, t1);
+            template.toString;
+            new W._ElementAttributeMap(template).addAll$1(0, t2.get$attributes(t1));
+            t2.get$attributes(t1).clear$0(0);
+            t2.remove$0(t1);
+            templateElementExt = !!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template);
+            templateElementExt.set$_templateIsDecorated(true);
+            isNativeHtmlTemplate = !!J.getInterceptor(templateElementExt.get$_node()).$isTemplateElement;
+          } else {
+            templateElementExt = this;
+            isNativeHtmlTemplate = false;
+          }
+          liftRoot = false;
+        }
+      } else {
+        templateElementExt = this;
+        liftRoot = false;
+      }
+      if (!isNativeHtmlTemplate)
+        templateElementExt.set$_content(J.createDocumentFragment$0$x(M.TemplateBindExtension__getOrCreateTemplateContentsOwner(templateElementExt.get$_node())));
+      if (instanceRef != null)
+        templateElementExt.set$_templateInstanceRef(instanceRef);
+      else if (liftContents)
+        M.TemplateBindExtension__liftNonNativeChildrenIntoContent(templateElementExt, this._node, liftRoot);
+      else
+        M.TemplateBindExtension_bootstrap(J.get$content$x(templateElementExt));
+      return true;
+    },
+    _decorate$0: function() {
+      return this._decorate$1(null);
+    },
+    $isTemplateBindExtension: true,
+    static: {"^": "TemplateBindExtension__contentsOwner,TemplateBindExtension__ownerStagingDocument,TemplateBindExtension__allTemplatesSelectors,TemplateBindExtension__initStyles,TemplateBindExtension__initBaseUriWorkaround,TemplateBindExtension__templateObserver", TemplateBindExtension__getOrCreateTemplateContentsOwner: function(template) {
+        var doc, d, t1, t2;
+        doc = J.get$ownerDocument$x(template);
+        if (W._convertNativeToDart_Window(doc.defaultView) == null)
+          return doc;
+        d = $.get$TemplateBindExtension__contentsOwner().$index(0, doc);
+        if (d == null) {
+          d = doc.implementation.createHTMLDocument("");
+          for (; t1 = d.lastChild, t1 != null;) {
+            t2 = t1.parentNode;
+            if (t2 != null)
+              t2.removeChild(t1);
+          }
+          $.get$TemplateBindExtension__contentsOwner().$indexSet(0, doc, d);
+        }
+        return d;
+      }, TemplateBindExtension__extractTemplateFromAttributeTemplate: function(el) {
+        var t1, template, t2, $name, t3, value;
+        t1 = J.getInterceptor$x(el);
+        template = t1.get$ownerDocument(el).createElement("template", null);
+        t1.get$parentNode(el).insertBefore(template, el);
+        for (t2 = C.JSArray_methods.toList$0(t1.get$attributes(el).get$keys()), t2 = H.setRuntimeTypeInfo(new H.ListIterator(t2, t2.length, 0, null), [H.getTypeArgumentByIndex(t2, 0)]); t2.moveNext$0();) {
+          $name = t2._current;
+          switch ($name) {
+            case "template":
+              t3 = t1.get$attributes(el)._html$_element;
+              t3.getAttribute($name);
+              t3.removeAttribute($name);
+              break;
+            case "repeat":
+            case "bind":
+            case "ref":
+              template.toString;
+              t3 = t1.get$attributes(el)._html$_element;
+              value = t3.getAttribute($name);
+              t3.removeAttribute($name);
+              template.setAttribute($name, value);
+              break;
+          }
+        }
+        return template;
+      }, TemplateBindExtension__liftNonNativeChildrenIntoContent: function(template, el, useRoot) {
+        var $content, t1, t2, child;
+        $content = J.get$content$x(template);
+        if (useRoot) {
+          J.append$1$x($content, el);
+          return;
+        }
+        for (t1 = J.getInterceptor$x(el), t2 = J.getInterceptor$x($content); child = t1.get$firstChild(el), child != null;)
+          t2.append$1($content, child);
+      }, TemplateBindExtension_bootstrap: function($content) {
+        var t1, descendents;
+        t1 = new M.TemplateBindExtension_bootstrap__bootstrap();
+        descendents = J.querySelectorAll$1$x($content, $.get$TemplateBindExtension__allTemplatesSelectors());
+        if (M.isSemanticTemplate($content))
+          t1.call$1($content);
+        descendents.forEach$1(descendents, t1);
+      }, TemplateBindExtension__injectStylesheet: function() {
+        if ($.TemplateBindExtension__initStyles === true)
+          return;
+        $.TemplateBindExtension__initStyles = true;
+        var style = document.createElement("style", null);
+        J.set$text$x(style, H.S($.get$TemplateBindExtension__allTemplatesSelectors()) + " { display: none; }");
+        document.head.appendChild(style);
+      }, TemplateBindExtension__globalBaseUriWorkaround: function() {
+        var t, d;
+        if ($.TemplateBindExtension__initBaseUriWorkaround === true)
+          return;
+        $.TemplateBindExtension__initBaseUriWorkaround = true;
+        t = document.createElement("template", null);
+        if (!!J.getInterceptor(t).$isTemplateElement) {
+          d = t.content.ownerDocument;
+          if (d.documentElement == null)
+            d.appendChild(d.createElement("html", null)).appendChild(d.createElement("head", null));
+          if (J.get$head$x(d).querySelector("base") == null)
+            M.TemplateBindExtension__baseUriWorkaround(d);
+        }
+      }, TemplateBindExtension__baseUriWorkaround: function(doc) {
+        var base = doc.createElement("base", null);
+        J.set$href$x(base, document.baseURI);
+        J.get$head$x(doc).appendChild(base);
+      }}
+  },
+  TemplateBindExtension_bind_closure: {
+    "^": "Closure:13;this_0",
+    call$1: [function(ref) {
+      var t1 = this.this_0;
+      J.get$attributes$x(t1._node)._html$_element.setAttribute("ref", ref);
+      t1._refChanged$0();
+    }, "call$1", null, 2, 0, null, 202, "call"],
+    $isFunction: true
+  },
+  TemplateBindExtension_bootstrap__bootstrap: {
+    "^": "Closure:20;",
+    call$1: function(template) {
+      if (!M.nodeBindFallback(template)._decorate$1(null))
+        M.TemplateBindExtension_bootstrap(J.get$content$x(!!J.getInterceptor(template).$isNodeBindExtension ? template : M.nodeBindFallback(template)));
+    },
+    $isFunction: true
+  },
+  closure6: {
+    "^": "Closure:13;",
+    call$1: [function(k) {
+      return H.S(k) + "[template]";
+    }, "call$1", null, 2, 0, null, 174, "call"],
+    $isFunction: true
+  },
+  closure8: {
+    "^": "Closure:75;",
+    call$2: [function(records, _) {
+      var t1;
+      for (t1 = J.get$iterator$ax(records); t1.moveNext$0();)
+        M.nodeBindFallback(J.get$target$x(t1.get$current()))._refChanged$0();
+    }, "call$2", null, 4, 0, null, 160, 14, "call"],
+    $isFunction: true
+  },
+  closure9: {
+    "^": "Closure:69;",
+    call$0: function() {
+      var empty = document.createDocumentFragment();
+      $.get$_instanceExtension().$indexSet(0, empty, new M._InstanceExtension([], null, null, null));
+      return empty;
+    },
+    $isFunction: true
+  },
+  _InstanceExtension: {
+    "^": "Object;_bindings<,_terminator<,_templateCreator<,_protoContent<"
+  },
+  _getDelegateFactory_closure: {
+    "^": "Closure:13;name_0,node_1,delegate_2",
+    call$1: function(pathString) {
+      return this.delegate_2.prepareBinding$3(pathString, this.name_0, this.node_1);
+    },
+    $isFunction: true
+  },
+  _parseAttributeBindings_closure: {
+    "^": "Closure:75;box_0,element_1,delegate_2,isTemplateNode_3",
+    call$2: function($name, value) {
+      var t1, tokens, t2, bindings;
+      for (; t1 = J.getInterceptor$asx($name), J.$eq(t1.$index($name, 0), "_");)
+        $name = t1.substring$1($name, 1);
+      if (this.isTemplateNode_3)
+        t1 = t1.$eq($name, "bind") || t1.$eq($name, "if") || t1.$eq($name, "repeat");
+      else
+        t1 = false;
+      if (t1)
+        return;
+      tokens = S.MustacheTokens_parse(value, M._getDelegateFactory($name, this.element_1, this.delegate_2));
+      if (tokens != null) {
+        t1 = this.box_0;
+        t2 = t1.bindings_0;
+        if (t2 == null) {
+          bindings = [];
+          t1.bindings_0 = bindings;
+          t1 = bindings;
+        } else
+          t1 = t2;
+        t1.push($name);
+        t1.push(tokens);
+      }
+    },
+    $isFunction: true
+  },
+  _TemplateIterator: {
+    "^": "Bindable;_templateExt,_instances,_iteratedValue,_presentValue,_closed,_ifValue,_template_binding$_value,_hasIf,_hasRepeat,_ifOneTime,_oneTime,_listSub,_initPrepareFunctions,_instanceModelFn,_instancePositionChangedFn",
+    _instanceModelFn$1: function(arg0) {
+      return this._instanceModelFn.call$1(arg0);
+    },
+    open$1: function(_, callback) {
+      return H.throwExpression(P.StateError$("binding already opened"));
+    },
+    get$value: function(_) {
+      return this._template_binding$_value;
+    },
+    _closeDependencies$0: function() {
+      var t1, t2;
+      t1 = this._ifValue;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._ifValue = null;
+      }
+      t1 = this._template_binding$_value;
+      t2 = J.getInterceptor(t1);
+      if (!!t2.$isBindable) {
+        t2.close$0(t1);
+        this._template_binding$_value = null;
+      }
+    },
+    _updateDependencies$2: function(directives, model) {
+      var template, t1, t2;
+      this._closeDependencies$0();
+      template = this._templateExt._node;
+      t1 = directives._if;
+      t2 = t1 != null;
+      this._hasIf = t2;
+      this._hasRepeat = directives._repeat != null;
+      if (t2) {
+        this._ifOneTime = t1.onlyOneTime;
+        t1 = M._processBinding("if", t1, template, model);
+        this._ifValue = t1;
+        if (this._ifOneTime === true) {
+          if (!(null != t1 && false !== t1)) {
+            this._updateIteratedValue$1(null);
+            return;
+          }
+        } else
+          H.interceptedTypeCast(t1, "$isBindable").open$1(0, this.get$_updateIteratedValue());
+      }
+      if (this._hasRepeat === true) {
+        t1 = directives._repeat;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("repeat", t1, template, model);
+        this._template_binding$_value = t1;
+      } else {
+        t1 = directives._bind;
+        this._oneTime = t1.onlyOneTime;
+        t1 = M._processBinding("bind", t1, template, model);
+        this._template_binding$_value = t1;
+      }
+      if (this._oneTime !== true)
+        J.open$1$x(t1, this.get$_updateIteratedValue());
+      this._updateIteratedValue$1(null);
+    },
+    _updateIteratedValue$1: [function(_) {
+      var ifValue, value;
+      if (this._hasIf === true) {
+        ifValue = this._ifValue;
+        if (this._ifOneTime !== true) {
+          H.interceptedTypeCast(ifValue, "$isBindable");
+          ifValue = ifValue.get$value(ifValue);
+        }
+        if (!(null != ifValue && false !== ifValue)) {
+          this._valueChanged$1([]);
+          return;
+        }
+      }
+      value = this._template_binding$_value;
+      if (this._oneTime !== true) {
+        H.interceptedTypeCast(value, "$isBindable");
+        value = value.get$value(value);
+      }
+      this._valueChanged$1(this._hasRepeat !== true ? [value] : value);
+    }, "call$1", "get$_updateIteratedValue", 2, 0, 20, 14],
+    _valueChanged$1: function(value) {
+      var t1, t2;
+      t1 = J.getInterceptor(value);
+      if (!t1.$isList)
+        value = !!t1.$isIterable ? t1.toList$0(value) : [];
+      t1 = this._iteratedValue;
+      if (value === t1)
+        return;
+      this._unobserve$0();
+      this._presentValue = value;
+      if (!!J.getInterceptor(value).$isObservableList && this._hasRepeat === true && this._oneTime !== true) {
+        if (value.get$_listRecords() != null)
+          value.set$_listRecords([]);
+        this._listSub = value.get$listChanges().listen$1(this.get$_handleSplices());
+      }
+      t2 = this._presentValue;
+      t2 = t2 != null ? t2 : [];
+      this._handleSplices$1(G.calcSplices(t2, 0, J.get$length$asx(t2), t1, 0, t1.length));
+    },
+    _getLastInstanceNode$1: function(index) {
+      var t1, t2, terminator, subtemplateIterator;
+      if (J.$eq(index, -1))
+        return this._templateExt._node;
+      t1 = $.get$_instanceExtension();
+      t2 = this._instances;
+      if (index >>> 0 !== index || index >= t2.length)
+        return H.ioore(t2, index);
+      terminator = t1.$index(0, t2[index]).get$_terminator();
+      if (terminator == null)
+        return this._getLastInstanceNode$1(index - 1);
+      if (!M.isSemanticTemplate(terminator) || terminator === this._templateExt._node)
+        return terminator;
+      subtemplateIterator = M.nodeBindFallback(terminator).get$_template_binding$_iterator();
+      if (subtemplateIterator == null)
+        return terminator;
+      return subtemplateIterator._getLastInstanceNode$1(subtemplateIterator._instances.length - 1);
+    },
+    _extractInstanceAt$1: function(index) {
+      var previousInstanceLast, lastNode, instance, t1, t2, node, t3;
+      previousInstanceLast = this._getLastInstanceNode$1(J.$sub$n(index, 1));
+      lastNode = this._getLastInstanceNode$1(index);
+      J.get$parentNode$x(this._templateExt._node);
+      instance = C.JSArray_methods.removeAt$1(this._instances, index);
+      for (t1 = J.getInterceptor$x(instance), t2 = J.getInterceptor$x(previousInstanceLast); !J.$eq(lastNode, previousInstanceLast);) {
+        node = t2.get$nextNode(previousInstanceLast);
+        if (node == null ? lastNode == null : node === lastNode)
+          lastNode = previousInstanceLast;
+        t3 = node.parentNode;
+        if (t3 != null)
+          t3.removeChild(node);
+        t1.append$1(instance, node);
+      }
+      return instance;
+    },
+    _handleSplices$1: [function(splices) {
+      var delegate, model, instance, e, s, t1, template, t2, delegate0, instanceCache, t3, t4, removeDelta, splice, t5, t6, model0, instance0, addIndex, exception, previousInstanceLast, $parent;
+      if (this._closed || J.get$isEmpty$asx(splices) === true)
+        return;
+      t1 = this._templateExt;
+      template = t1._node;
+      if (J.get$parentNode$x(template) == null) {
+        this.close$0(0);
+        return;
+      }
+      t2 = this._iteratedValue;
+      Q.ObservableList_applyChangeRecords(t2, this._presentValue, splices);
+      delegate = t1._bindingDelegate;
+      if (!this._initPrepareFunctions) {
+        this._initPrepareFunctions = true;
+        delegate0 = J.get$bindingDelegate$x(!!J.getInterceptor(t1._node).$isTemplateBindExtension ? t1._node : t1);
+        if (delegate0 != null) {
+          this._instanceModelFn = delegate0._delegate.prepareInstanceModel$1(template);
+          this._instancePositionChangedFn = null;
+        }
+      }
+      instanceCache = P.HashMap_HashMap(P.identical$closure(), null, null, null, null);
+      for (t3 = J.getInterceptor$ax(splices), t4 = t3.get$iterator(splices), removeDelta = 0; t4.moveNext$0();) {
+        splice = t4.get$current();
+        for (t5 = splice.get$removed(), t5 = t5.get$iterator(t5), t6 = J.getInterceptor$x(splice); t5.moveNext$0();) {
+          model0 = t5._current;
+          instance0 = this._extractInstanceAt$1(J.$add$ns(t6.get$index(splice), removeDelta));
+          if (!J.$eq(instance0, $.get$_emptyInstance()))
+            instanceCache.$indexSet(0, model0, instance0);
+        }
+        t5 = splice.get$addedCount();
+        if (typeof t5 !== "number")
+          return H.iae(t5);
+        removeDelta -= t5;
+      }
+      for (t3 = t3.get$iterator(splices); t3.moveNext$0();) {
+        splice = t3.get$current();
+        for (t4 = J.getInterceptor$x(splice), addIndex = t4.get$index(splice); J.$lt$n(addIndex, J.$add$ns(t4.get$index(splice), splice.get$addedCount())); ++addIndex) {
+          if (addIndex >>> 0 !== addIndex || addIndex >= t2.length)
+            return H.ioore(t2, addIndex);
+          model = t2[addIndex];
+          instance = instanceCache.remove$1(0, model);
+          if (instance == null)
+            try {
+              if (this._instanceModelFn != null)
+                model = this._instanceModelFn$1(model);
+              if (model == null)
+                instance = $.get$_emptyInstance();
+              else
+                instance = t1.createInstance$2(0, model, delegate);
+            } catch (exception) {
+              t5 = H.unwrapException(exception);
+              e = t5;
+              s = new H._StackTrace(exception, null);
+              t5 = new P._Future(0, $.Zone__current, null, null, null, null, null, null);
+              t5.$builtinTypeInfo = [null];
+              new P._AsyncCompleter(t5).$builtinTypeInfo = [null];
+              t6 = e;
+              if (t6 == null)
+                H.throwExpression(P.ArgumentError$("Error must not be null"));
+              if (t5._state !== 0)
+                H.throwExpression(P.StateError$("Future already completed"));
+              t5._asyncCompleteError$2(t6, s);
+              instance = $.get$_emptyInstance();
+            }
+
+          t5 = instance;
+          previousInstanceLast = this._getLastInstanceNode$1(addIndex - 1);
+          $parent = J.get$parentNode$x(t1._node);
+          C.JSArray_methods.insert$2(this._instances, addIndex, t5);
+          $parent.insertBefore(t5, J.get$nextNode$x(previousInstanceLast));
+        }
+      }
+      for (t1 = instanceCache.get$values(instanceCache), t1 = H.setRuntimeTypeInfo(new H.MappedIterator(null, J.get$iterator$ax(t1._iterable), t1._f), [H.getTypeArgumentByIndex(t1, 0), H.getTypeArgumentByIndex(t1, 1)]); t1.moveNext$0();)
+        this._closeInstanceBindings$1(t1._current);
+    }, "call$1", "get$_handleSplices", 2, 0, 203, 204],
+    _closeInstanceBindings$1: [function(instance) {
+      var t1, values, bindings;
+      t1 = $.get$_instanceExtension();
+      t1.toString;
+      values = H.Primitives_getProperty(instance, "expando$values");
+      bindings = (values == null ? null : H.Primitives_getProperty(values, t1._getKey$0())).get$_bindings();
+      t1 = new H.ListIterator(bindings, bindings.length, 0, null);
+      t1.$builtinTypeInfo = [H.getTypeArgumentByIndex(bindings, 0)];
+      for (; t1.moveNext$0();)
+        J.close$0$x(t1._current);
+    }, "call$1", "get$_closeInstanceBindings", 2, 0, 205],
+    _unobserve$0: function() {
+      var t1 = this._listSub;
+      if (t1 == null)
+        return;
+      t1.cancel$0();
+      this._listSub = null;
+    },
+    close$0: function(_) {
+      var t1;
+      if (this._closed)
+        return;
+      this._unobserve$0();
+      t1 = this._instances;
+      H.IterableMixinWorkaround_forEach(t1, this.get$_closeInstanceBindings());
+      C.JSArray_methods.set$length(t1, 0);
+      this._closeDependencies$0();
+      this._templateExt._template_binding$_iterator = null;
+      this._closed = true;
+    }
+  },
+  _TextExtension: {
+    "^": "NodeBindExtension;_node,bindings,_templateInstance",
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1;
+      if (!J.$eq($name, "text"))
+        return M.NodeBindExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      if (oneTime) {
+        t1 = value == null ? "" : H.S(value);
+        J.set$text$x(this._node, t1);
+        return;
+      }
+      t1 = this.get$_updateText();
+      t1.call$1(J.open$1$x(value, t1));
+      return $.enableBindingsReflection ? this._updateBindings$2($name, value) : value;
+    },
+    _updateText$1: [function(value) {
+      var t1 = value == null ? "" : H.S(value);
+      J.set$text$x(this._node, t1);
+    }, "call$1", "get$_updateText", 2, 0, 13, 21]
+  },
+  _TextAreaElementExtension: {
+    "^": "_ElementExtension;_node,bindings,_templateInstance",
+    get$_node: function() {
+      return this._node;
+    },
+    bind$3$oneTime: function(_, $name, value, oneTime) {
+      var t1, t2, t3;
+      if (!J.$eq($name, "value"))
+        return M._ElementExtension.prototype.bind$3$oneTime.call(this, this, $name, value, oneTime);
+      J.get$attributes$x(this._node).remove$1(0, $name);
+      if (oneTime) {
+        M._InputBinding__updateProperty(this._node, value, $name);
+        return;
+      }
+      t1 = this._node;
+      t2 = new M._InputBinding(t1, null, value, $name);
+      t2._eventSub = M._InputBinding__getStreamForInputType(t1).listen$1(t2.get$_nodeChanged());
+      t3 = t2.get$_template_binding$_updateNode();
+      M._InputBinding__updateProperty(t1, J.open$1$x(t2._template_binding$_bindable, t3), $name);
+      return $.enableBindingsReflection ? this._updateBindings$2($name, t2) : t2;
+    }
+  }
+}],
+["template_binding.src.mustache_tokens", "package:template_binding/src/mustache_tokens.dart", , S, {
+  "^": "",
+  MustacheTokens: {
+    "^": "Object;_mustache_tokens$_tokens,onlyOneTime<,_combinator",
+    get$hasOnePath: function() {
+      return this._mustache_tokens$_tokens.length === 5;
+    },
+    get$isSimplePath: function() {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = t1.length;
+      if (t2 === 5) {
+        if (0 >= t2)
+          return H.ioore(t1, 0);
+        if (J.$eq(t1[0], "")) {
+          if (4 >= t1.length)
+            return H.ioore(t1, 4);
+          t1 = J.$eq(t1[4], "");
+        } else
+          t1 = false;
+      } else
+        t1 = false;
+      return t1;
+    },
+    get$combinator: function() {
+      return this._combinator;
+    },
+    combinator$1: function(arg0) {
+      return this.get$combinator().call$1(arg0);
+    },
+    get$length: function(_) {
+      return C.JSInt_methods._tdivFast$1(this._mustache_tokens$_tokens.length, 4);
+    },
+    getOneTime$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 1;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPath$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 2;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    getPrepareBinding$1: function(i) {
+      var t1, t2;
+      t1 = this._mustache_tokens$_tokens;
+      t2 = i * 4 + 3;
+      if (t2 >= t1.length)
+        return H.ioore(t1, t2);
+      return t1[t2];
+    },
+    _singleCombinator$1: [function(value) {
+      var t1, t2, t3, t4;
+      if (value == null)
+        value = "";
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      t2 = H.S(t1[0]) + H.S(value);
+      t3 = t1.length;
+      t4 = C.JSInt_methods._tdivFast$1(t3, 4) * 4;
+      if (t4 >= t3)
+        return H.ioore(t1, t4);
+      return t2 + H.S(t1[t4]);
+    }, "call$1", "get$_singleCombinator", 2, 0, 206, 21],
+    _listCombinator$1: [function(values) {
+      var t1, newValue, len, t2, i, value, t3, str;
+      t1 = this._mustache_tokens$_tokens;
+      if (0 >= t1.length)
+        return H.ioore(t1, 0);
+      newValue = P.StringBuffer$(t1[0]);
+      len = C.JSInt_methods._tdivFast$1(t1.length, 4);
+      for (t2 = J.getInterceptor$asx(values), i = 0; i < len;) {
+        value = t2.$index(values, i);
+        if (value != null)
+          newValue._contents += typeof value === "string" ? value : H.S(value);
+        ++i;
+        t3 = i * 4;
+        if (t3 >= t1.length)
+          return H.ioore(t1, t3);
+        str = t1[t3];
+        newValue._contents += typeof str === "string" ? str : H.S(str);
+      }
+      return newValue._contents;
+    }, "call$1", "get$_listCombinator", 2, 0, 207, 208],
+    MustacheTokens$_$2: function(_tokens, onlyOneTime) {
+      this._combinator = this._mustache_tokens$_tokens.length === 5 ? this.get$_singleCombinator() : this.get$_listCombinator();
+    },
+    static: {"^": "MustacheTokens__TOKEN_TEXT,MustacheTokens__TOKEN_ONETIME,MustacheTokens__TOKEN_PATH,MustacheTokens__TOKEN_PREPAREFN,MustacheTokens__TOKEN_SIZE,MustacheTokens__TOKEN_ENDTEXT", MustacheTokens_parse: function(s, fnFactory) {
+        var $length, t1, t2, tokens, lastIndex, onlyOneTime, startIndex, oneTimeStart, t3, oneTime, terminator, endIndex, pathString, delegateFn;
+        if (s == null || s.length === 0)
+          return;
+        $length = s.length;
+        for (t1 = fnFactory == null, t2 = J.getInterceptor$asx(s), tokens = null, lastIndex = 0, onlyOneTime = true; lastIndex < $length;) {
+          startIndex = t2.indexOf$2(s, "{{", lastIndex);
+          oneTimeStart = C.JSString_methods.indexOf$2(s, "[[", lastIndex);
+          if (oneTimeStart >= 0)
+            t3 = startIndex < 0 || oneTimeStart < startIndex;
+          else
+            t3 = false;
+          if (t3) {
+            startIndex = oneTimeStart;
+            oneTime = true;
+            terminator = "]]";
+          } else {
+            oneTime = false;
+            terminator = "}}";
+          }
+          endIndex = startIndex >= 0 ? C.JSString_methods.indexOf$2(s, terminator, startIndex + 2) : -1;
+          if (endIndex < 0) {
+            if (tokens == null)
+              return;
+            tokens.push(C.JSString_methods.substring$1(s, lastIndex));
+            break;
+          }
+          if (tokens == null)
+            tokens = [];
+          tokens.push(C.JSString_methods.substring$2(s, lastIndex, startIndex));
+          pathString = C.JSString_methods.trim$0(C.JSString_methods.substring$2(s, startIndex + 2, endIndex));
+          tokens.push(oneTime);
+          onlyOneTime = onlyOneTime && oneTime;
+          delegateFn = t1 ? null : fnFactory.call$1(pathString);
+          if (delegateFn == null)
+            tokens.push(L.PropertyPath_PropertyPath(pathString));
+          else
+            tokens.push(null);
+          tokens.push(delegateFn);
+          lastIndex = endIndex + 2;
+        }
+        if (lastIndex === $length)
+          tokens.push("");
+        t1 = new S.MustacheTokens(tokens, onlyOneTime, null);
+        t1.MustacheTokens$_$2(tokens, onlyOneTime);
+        return t1;
+      }}
+  }
+}],
+["vm_ref_element", "package:observatory/src/elements/vm_ref.dart", , X, {
+  "^": "",
+  VMRefElement: {
+    "^": "ServiceRefElement;_service_ref_element$__$ref,_service_ref_element$__$internal,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    static: {VMRefElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver._service_ref_element$__$internal = false;
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMRefElement_methods.Element$created$0(receiver);
+        C.VMRefElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  }
+}],
+["vm_view_element", "package:observatory/src/elements/vm_view.dart", , U, {
+  "^": "",
+  VMViewElement: {
+    "^": "ObservatoryElement_ChangeNotifier50;_vm_view_element$__$vm,_vm_view_element$__$error,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,change_notifier$ChangeNotifier$_changes,change_notifier$ChangeNotifier$_change_notifier$_records,polymer$Polymer$_polymer$_element,polymer$Polymer$_namedObservers,polymer$Polymer$_observers,polymer$Polymer$_unbound,polymer$Polymer$_unbindAllJob,polymer$Polymer$_propertyObserver,polymer$Polymer$_readied,polymer$Polymer$_jsElem,polymer$Polymer$_hasBeenAttached,polymer$Polymer$shadowRoots,polymer$Polymer$$",
+    get$vm: function(receiver) {
+      return receiver._vm_view_element$__$vm;
+    },
+    set$vm: function(receiver, value) {
+      receiver._vm_view_element$__$vm = this.notifyPropertyChange$3(receiver, C.Symbol_vm, receiver._vm_view_element$__$vm, value);
+    },
+    get$error: function(receiver) {
+      return receiver._vm_view_element$__$error;
+    },
+    set$error: function(receiver, value) {
+      receiver._vm_view_element$__$error = this.notifyPropertyChange$3(receiver, C.Symbol_error, receiver._vm_view_element$__$error, value);
+    },
+    refresh$1: [function(receiver, done) {
+      J.reload$0$x(receiver._vm_view_element$__$vm).whenComplete$1(done);
+    }, "call$1", "get$refresh", 2, 0, 20, 89],
+    static: {VMViewElement$created: function(receiver) {
+        var t1, t2;
+        t1 = P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, W.ShadowRoot);
+        t2 = P.String;
+        t2 = H.setRuntimeTypeInfo(new V.ObservableMap(P.HashMap_HashMap(null, null, null, t2, null), null, null), [t2, null]);
+        receiver.polymer$Polymer$_observers = [];
+        receiver.polymer$Polymer$_readied = false;
+        receiver.polymer$Polymer$_hasBeenAttached = false;
+        receiver.polymer$Polymer$shadowRoots = t1;
+        receiver.polymer$Polymer$$ = t2;
+        C.VMViewElement_methods.Element$created$0(receiver);
+        C.VMViewElement_methods.PolymerElement$created$0(receiver);
+        return receiver;
+      }}
+  },
+  ObservatoryElement_ChangeNotifier50: {
+    "^": "ObservatoryElement+ChangeNotifier;",
+    $isObservable: true
+  }
+}],
+]);
+Isolate.$finishClasses($$, $, null);
+$$ = null;
+
+// Runtime type support
+P.$int.$is$int = true;
+P.$int.$isComparable = true;
+P.$int.$asComparable = [P.num];
+P.$int.$isObject = true;
+P.$double.$is$double = true;
+P.$double.$isComparable = true;
+P.$double.$asComparable = [P.num];
+P.$double.$isObject = true;
+W.Node.$isNode = true;
+W.Node.$isObject = true;
+W.SpeechRecognitionResult.$isObject = true;
+W.Entry.$isObject = true;
+P.String.$isString = true;
+P.String.$isComparable = true;
+P.String.$asComparable = [P.String];
+P.String.$isObject = true;
+P.num.$isComparable = true;
+P.num.$asComparable = [P.num];
+P.num.$isObject = true;
+N.Level.$isComparable = true;
+N.Level.$asComparable = [N.Level];
+N.Level.$isObject = true;
+P.Duration.$isDuration = true;
+P.Duration.$isComparable = true;
+P.Duration.$asComparable = [P.Duration];
+P.Duration.$isObject = true;
+W.Element.$isElement = true;
+W.Element.$isNode = true;
+W.Element.$isObject = true;
+P.List.$isList = true;
+P.List.$isIterable = true;
+P.List.$isObject = true;
+P._SplayTreeNode.$isObject = true;
+P.Object.$isObject = true;
+P.Match.$isObject = true;
+K.IndexedValue.$isIndexedValue = true;
+K.IndexedValue.$isObject = true;
+U.TernaryOperator.$isExpression = true;
+U.TernaryOperator.$isObject = true;
+U.UnaryOperator.$isExpression = true;
+U.UnaryOperator.$isObject = true;
+U.BinaryOperator.$isExpression = true;
+U.BinaryOperator.$isObject = true;
+U.Identifier.$isIdentifier = true;
+U.Identifier.$isExpression = true;
+U.Identifier.$isObject = true;
+U.MapLiteralEntry.$isExpression = true;
+U.MapLiteralEntry.$isObject = true;
+U.MapLiteral.$isExpression = true;
+U.MapLiteral.$isObject = true;
+U.ListLiteral.$isExpression = true;
+U.ListLiteral.$isObject = true;
+U.Literal.$isExpression = true;
+U.Literal.$isObject = true;
+U.Invoke.$isExpression = true;
+U.Invoke.$isObject = true;
+U.Index.$isIndex = true;
+U.Index.$isExpression = true;
+U.Index.$isObject = true;
+U.Getter.$isExpression = true;
+U.Getter.$isObject = true;
+U.EmptyExpression.$isEmptyExpression = true;
+U.EmptyExpression.$isExpression = true;
+U.EmptyExpression.$isObject = true;
+P.Symbol.$isSymbol = true;
+P.Symbol.$isObject = true;
+P.Type.$isType = true;
+P.Type.$isObject = true;
+N.Logger.$isObject = true;
+T.ChangeRecord.$isChangeRecord = true;
+T.ChangeRecord.$isObject = true;
+W.TableRowElement.$isElement = true;
+W.TableRowElement.$isNode = true;
+W.TableRowElement.$isObject = true;
+G.ListChangeRecord.$isListChangeRecord = true;
+G.ListChangeRecord.$isObject = true;
+G.TableTreeRow.$isTableTreeRow = true;
+G.TableTreeRow.$isObject = true;
+F.Observable.$isObject = true;
+A.PolymerDeclaration.$isObject = true;
+W.MouseEvent.$isMouseEvent = true;
+W.MouseEvent.$isEvent = true;
+W.MouseEvent.$isObject = true;
+P.bool.$isbool = true;
+P.bool.$isObject = true;
+G.Pane.$isObject = true;
+P.Completer.$isObject = true;
+D.ServiceObject.$isServiceObject = true;
+D.ServiceObject.$isObject = true;
+D.Isolate.$isServiceObject = true;
+D.Isolate.$isObject = true;
+W.PopStateEvent.$isPopStateEvent = true;
+W.PopStateEvent.$isEvent = true;
+W.PopStateEvent.$isObject = true;
+D.CodeCallCount.$isObject = true;
+D.TagProfileSnapshot.$isObject = true;
+D.Class.$isClass = true;
+D.Class.$isServiceObject = true;
+D.Class.$isObject = true;
+D.ServiceMap.$isServiceMap = true;
+D.ServiceMap.$isServiceObject = true;
+D.ServiceMap.$isObservableMap = true;
+D.ServiceMap.$asObservableMap = [null, null];
+D.ServiceMap.$isMap = true;
+D.ServiceMap.$asMap = [null, null];
+D.ServiceMap.$isObject = true;
+D.CodeInstruction.$isObject = true;
+D.CodeTick.$isObject = true;
+D.Library.$isServiceObject = true;
+D.Library.$isObject = true;
+D.Script.$isScript = true;
+D.Script.$isServiceObject = true;
+D.Script.$isObject = true;
+D.ScriptLine.$isObject = true;
+W.HttpRequest.$isHttpRequest = true;
+W.HttpRequest.$isObject = true;
+W.ProgressEvent.$isEvent = true;
+W.ProgressEvent.$isObject = true;
+D.Code.$isCode = true;
+D.Code.$isServiceObject = true;
+D.Code.$isObject = true;
+D.CodeTrieNode.$isObject = true;
+D.PcDescriptor.$isObject = true;
+W.MessageEvent.$isEvent = true;
+W.MessageEvent.$isObject = true;
+L.PropertyPath.$isPropertyPath = true;
+L.PropertyPath.$isObject = true;
+K.Scope.$isObject = true;
+N.LogRecord.$isLogRecord = true;
+N.LogRecord.$isObject = true;
+H.RawReceivePortImpl.$isObject = true;
+H._IsolateEvent.$isObject = true;
+H._IsolateContext.$isObject = true;
+W.ShadowRoot.$isDocumentFragment = true;
+W.ShadowRoot.$isNode = true;
+W.ShadowRoot.$isObject = true;
+W.Event.$isEvent = true;
+W.Event.$isObject = true;
+P.Stream.$isStream = true;
+P.Stream.$isObject = true;
+P.StreamSubscription.$isStreamSubscription = true;
+P.StreamSubscription.$isObject = true;
+Y.Token.$isObject = true;
+U.Expression.$isExpression = true;
+U.Expression.$isObject = true;
+G.SortedTableRow.$isObject = true;
+P.ZoneDelegate.$isZoneDelegate = true;
+P.ZoneDelegate.$isObject = true;
+P.Zone.$isZone = true;
+P.Zone.$isObject = true;
+P.StackTrace.$isStackTrace = true;
+P.StackTrace.$isObject = true;
+V.ObservableMap.$isObservableMap = true;
+V.ObservableMap.$isMap = true;
+V.ObservableMap.$isObject = true;
+P._BufferingStreamSubscription.$is_BufferingStreamSubscription = true;
+P._BufferingStreamSubscription.$is_EventSink = true;
+P._BufferingStreamSubscription.$isStreamSubscription = true;
+P._BufferingStreamSubscription.$isObject = true;
+P._BroadcastSubscription.$is_BroadcastSubscription = true;
+P._BroadcastSubscription.$is_BufferingStreamSubscription = true;
+P._BroadcastSubscription.$is_EventSink = true;
+P._BroadcastSubscription.$isStreamSubscription = true;
+P._BroadcastSubscription.$isObject = true;
+P.Comparable.$isComparable = true;
+P.Comparable.$isObject = true;
+P.ZoneSpecification.$isZoneSpecification = true;
+P.ZoneSpecification.$isObject = true;
+P.Map.$isMap = true;
+P.Map.$isObject = true;
+P.Timer.$isTimer = true;
+P.Timer.$isObject = true;
+P.Iterable.$isIterable = true;
+P.Iterable.$isObject = true;
+P.Future.$isFuture = true;
+P.Future.$isObject = true;
+P.Function.$isFunction = true;
+P.Function.$isObject = true;
+P._EventSink.$is_EventSink = true;
+P._EventSink.$isObject = true;
+P._DelayedEvent.$is_DelayedEvent = true;
+P._DelayedEvent.$isObject = true;
+P.DateTime.$isDateTime = true;
+P.DateTime.$isComparable = true;
+P.DateTime.$asComparable = [null];
+P.DateTime.$isObject = true;
+A.Bindable.$isBindable = true;
+A.Bindable.$isObject = true;
+O.PixelReference.$isPixelReference = true;
+O.PixelReference.$isObject = true;
+D.ServiceError.$isServiceError = true;
+D.ServiceError.$isServiceObject = true;
+D.ServiceError.$isObject = true;
+D.ServiceException.$isServiceException = true;
+D.ServiceException.$isServiceObject = true;
+D.ServiceException.$isObject = true;
+A.Declaration.$isDeclaration = true;
+A.Declaration.$isObject = true;
+A.QueryOptions.$isQueryOptions = true;
+A.QueryOptions.$isObject = true;
+L._Observer.$is_Observer = true;
+L._Observer.$isBindable = true;
+L._Observer.$isObject = true;
+W.DocumentFragment.$isDocumentFragment = true;
+W.DocumentFragment.$isNode = true;
+W.DocumentFragment.$isObject = true;
+// getInterceptor methods
+J.getInterceptor = function(receiver) {
+  if (typeof receiver == "number") {
+    if (Math.floor(receiver) == receiver)
+      return J.JSInt.prototype;
+    return J.JSDouble.prototype;
+  }
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return J.JSNull.prototype;
+  if (typeof receiver == "boolean")
+    return J.JSBool.prototype;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$asx = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$ax = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (receiver.constructor == Array)
+    return J.JSArray.prototype;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.getInterceptor$n = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$ns = function(receiver) {
+  if (typeof receiver == "number")
+    return J.JSNumber.prototype;
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$s = function(receiver) {
+  if (typeof receiver == "string")
+    return J.JSString.prototype;
+  if (receiver == null)
+    return receiver;
+  if (!(receiver instanceof P.Object))
+    return J.UnknownJavaScriptObject.prototype;
+  return receiver;
+};
+J.getInterceptor$x = function(receiver) {
+  if (receiver == null)
+    return receiver;
+  if (typeof receiver != "object")
+    return receiver;
+  if (receiver instanceof P.Object)
+    return receiver;
+  return J.getNativeInterceptor(receiver);
+};
+J.$add$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver + a0;
+  return J.getInterceptor$ns(receiver).$add(receiver, a0);
+};
+J.$div$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver / a0;
+  return J.getInterceptor$n(receiver).$div(receiver, a0);
+};
+J.$eq = function(receiver, a0) {
+  if (receiver == null)
+    return a0 == null;
+  if (typeof receiver != "object")
+    return a0 != null && receiver === a0;
+  return J.getInterceptor(receiver).$eq(receiver, a0);
+};
+J.$ge$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver >= a0;
+  return J.getInterceptor$n(receiver).$ge(receiver, a0);
+};
+J.$gt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver > a0;
+  return J.getInterceptor$n(receiver).$gt(receiver, a0);
+};
+J.$index$asx = function(receiver, a0) {
+  if (receiver.constructor == Array || typeof receiver == "string" || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName]))
+    if (a0 >>> 0 === a0 && a0 < receiver.length)
+      return receiver[a0];
+  return J.getInterceptor$asx(receiver).$index(receiver, a0);
+};
+J.$indexSet$ax = function(receiver, a0, a1) {
+  if ((receiver.constructor == Array || H.isJsIndexable(receiver, receiver[init.dispatchPropertyName])) && !receiver.immutable$list && a0 >>> 0 === a0 && a0 < receiver.length)
+    return receiver[a0] = a1;
+  return J.getInterceptor$ax(receiver).$indexSet(receiver, a0, a1);
+};
+J.$le$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver <= a0;
+  return J.getInterceptor$n(receiver).$le(receiver, a0);
+};
+J.$lt$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver < a0;
+  return J.getInterceptor$n(receiver).$lt(receiver, a0);
+};
+J.$mod$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$mod(receiver, a0);
+};
+J.$mul$ns = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver * a0;
+  return J.getInterceptor$ns(receiver).$mul(receiver, a0);
+};
+J.$negate$n = function(receiver) {
+  if (typeof receiver == "number")
+    return -receiver;
+  return J.getInterceptor$n(receiver).$negate(receiver);
+};
+J.$shl$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$shl(receiver, a0);
+};
+J.$sub$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return receiver - a0;
+  return J.getInterceptor$n(receiver).$sub(receiver, a0);
+};
+J.$tdiv$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).$tdiv(receiver, a0);
+};
+J.$xor$n = function(receiver, a0) {
+  if (typeof receiver == "number" && typeof a0 == "number")
+    return (receiver ^ a0) >>> 0;
+  return J.getInterceptor$n(receiver).$xor(receiver, a0);
+};
+J.__isolate_helper$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).__isolate_helper$_add$1(receiver, a0);
+};
+J._async$_add$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._async$_add$1(receiver, a0);
+};
+J._clearChildren$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._clearChildren$0(receiver);
+};
+J._initCustomEvent$4$x = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$x(receiver)._initCustomEvent$4(receiver, a0, a1, a2, a3);
+};
+J._initMouseEvent$15$x = function(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14) {
+  return J.getInterceptor$x(receiver)._initMouseEvent$15(receiver, a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14);
+};
+J._renderPages$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._renderPages$1(receiver, a0);
+};
+J._replaceChild$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver)._replaceChild$2(receiver, a0, a1);
+};
+J._update$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver)._update$1(receiver, a0);
+};
+J._updateFragmentationData$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateFragmentationData$0(receiver);
+};
+J._updateLines$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver)._updateLines$0(receiver);
+};
+J.abs$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).abs$0(receiver);
+};
+J.accept$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).accept$1(receiver, a0);
+};
+J.add$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).add$1(receiver, a0);
+};
+J.addAll$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).addAll$1(receiver, a0);
+};
+J.addEventListener$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).addEventListener$2(receiver, a0, a1);
+};
+J.addEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).addEventListener$3(receiver, a0, a1, a2);
+};
+J.addRow$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).addRow$1(receiver, a0);
+};
+J.any$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).any$1(receiver, a0);
+};
+J.append$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).append$1(receiver, a0);
+};
+J.async$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).async$1(receiver, a0);
+};
+J.attached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).attached$0(receiver);
+};
+J.attributeChanged$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).attributeChanged$3(receiver, a0, a1, a2);
+};
+J.bind$3$oneTime$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).bind$3$oneTime(receiver, a0, a1, a2);
+};
+J.callback$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).callback$0(receiver);
+};
+J.clear$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).clear$0(receiver);
+};
+J.close$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).close$0(receiver);
+};
+J.codeUnitAt$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).codeUnitAt$1(receiver, a0);
+};
+J.compareTo$1$ns = function(receiver, a0) {
+  return J.getInterceptor$ns(receiver).compareTo$1(receiver, a0);
+};
+J.complete$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).complete$1(receiver, a0);
+};
+J.contains$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).contains$1(receiver, a0);
+};
+J.contains$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).contains$2(receiver, a0, a1);
+};
+J.createDocumentFragment$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).createDocumentFragment$0(receiver);
+};
+J.createInstance$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).createInstance$2(receiver, a0, a1);
+};
+J.detached$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).detached$0(receiver);
+};
+J.dispatchMethod$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).dispatchMethod$3(receiver, a0, a1, a2);
+};
+J.elementAt$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).elementAt$1(receiver, a0);
+};
+J.endsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).endsWith$1(receiver, a0);
+};
+J.eval$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).eval$1(receiver, a0);
+};
+J.forEach$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).forEach$1(receiver, a0);
+};
+J.get$$function$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$function(receiver);
+};
+J.get$$goto$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$$goto(receiver);
+};
+J.get$__isolate_helper$_id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$__isolate_helper$_id(receiver);
+};
+J.get$_children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_children(receiver);
+};
+J.get$_element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_element(receiver);
+};
+J.get$_name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_name(receiver);
+};
+J.get$_observe$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_observe(receiver);
+};
+J.get$_updateFile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateFile(receiver);
+};
+J.get$_updateHttpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateHttpServer(receiver);
+};
+J.get$_updateTagProfile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_updateTagProfile(receiver);
+};
+J.get$_values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$_values(receiver);
+};
+J.get$active$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$active(receiver);
+};
+J.get$anchor$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$anchor(receiver);
+};
+J.get$attributes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$attributes(receiver);
+};
+J.get$bindingDelegate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindingDelegate(receiver);
+};
+J.get$bindings$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$bindings(receiver);
+};
+J.get$busy$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$busy(receiver);
+};
+J.get$buttonClick$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$buttonClick(receiver);
+};
+J.get$callback$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$callback(receiver);
+};
+J.get$change$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$change(receiver);
+};
+J.get$changeSort$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$changeSort(receiver);
+};
+J.get$checked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checked(receiver);
+};
+J.get$checkedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$checkedText(receiver);
+};
+J.get$children$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$children(receiver);
+};
+J.get$className$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$className(receiver);
+};
+J.get$classTable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classTable(receiver);
+};
+J.get$classes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$classes(receiver);
+};
+J.get$cls$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$cls(receiver);
+};
+J.get$code$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$code(receiver);
+};
+J.get$coloring$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$coloring(receiver);
+};
+J.get$connection$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$connection(receiver);
+};
+J.get$content$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$content(receiver);
+};
+J.get$context2D$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$context2D(receiver);
+};
+J.get$counters$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$counters(receiver);
+};
+J.get$countersChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$countersChanged(receiver);
+};
+J.get$data$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$data(receiver);
+};
+J.get$devtools$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$devtools(receiver);
+};
+J.get$displayCutoff$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$displayCutoff(receiver);
+};
+J.get$doAction$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$doAction(receiver);
+};
+J.get$element$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$element(receiver);
+};
+J.get$endLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endLine(receiver);
+};
+J.get$endPos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPos(receiver);
+};
+J.get$endPosChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$endPosChanged(receiver);
+};
+J.get$error$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$error(receiver);
+};
+J.get$eval$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$eval(receiver);
+};
+J.get$evalNow$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$evalNow(receiver);
+};
+J.get$exception$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$exception(receiver);
+};
+J.get$expand$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$expand(receiver);
+};
+J.get$expandChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expandChanged(receiver);
+};
+J.get$expanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expanded(receiver);
+};
+J.get$expander$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expander(receiver);
+};
+J.get$expr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$expr(receiver);
+};
+J.get$field$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$field(receiver);
+};
+J.get$file$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$file(receiver);
+};
+J.get$flag$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flag(receiver);
+};
+J.get$flagList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$flagList(receiver);
+};
+J.get$formatSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatSize(receiver);
+};
+J.get$formatTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formatTime(receiver);
+};
+J.get$formattedAverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedAverage(receiver);
+};
+J.get$formattedCollections$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedCollections(receiver);
+};
+J.get$formattedTotalCollectionTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$formattedTotalCollectionTime(receiver);
+};
+J.get$fragmentation$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentation(receiver);
+};
+J.get$fragmentationChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$fragmentationChanged(receiver);
+};
+J.get$frame$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$frame(receiver);
+};
+J.get$functionChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$functionChanged(receiver);
+};
+J.get$gotoLink$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$gotoLink(receiver);
+};
+J.get$hasClass$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasClass(receiver);
+};
+J.get$hasParent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hasParent(receiver);
+};
+J.get$hashCode$ = function(receiver) {
+  return J.getInterceptor(receiver).get$hashCode(receiver);
+};
+J.get$hashLinkWorkaround$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hashLinkWorkaround(receiver);
+};
+J.get$head$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$head(receiver);
+};
+J.get$height$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$height(receiver);
+};
+J.get$hideTagsChecked$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hideTagsChecked(receiver);
+};
+J.get$hoverText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$hoverText(receiver);
+};
+J.get$httpServer$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$httpServer(receiver);
+};
+J.get$id$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$id(receiver);
+};
+J.get$index$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$index(receiver);
+};
+J.get$instance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instance(receiver);
+};
+J.get$instances$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$instances(receiver);
+};
+J.get$internal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$internal(receiver);
+};
+J.get$io$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$io(receiver);
+};
+J.get$isBool$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isBool(receiver);
+};
+J.get$isDart$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDart(receiver);
+};
+J.get$isDouble$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isDouble(receiver);
+};
+J.get$isEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isEmpty(receiver);
+};
+J.get$isError$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isError(receiver);
+};
+J.get$isFinal$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isFinal(receiver);
+};
+J.get$isInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInstance(receiver);
+};
+J.get$isInt$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isInt(receiver);
+};
+J.get$isList$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isList(receiver);
+};
+J.get$isNotEmpty$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$isNotEmpty(receiver);
+};
+J.get$isNull$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isNull(receiver);
+};
+J.get$isString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isString(receiver);
+};
+J.get$isType$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isType(receiver);
+};
+J.get$isUnexpected$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isUnexpected(receiver);
+};
+J.get$isolate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolate(receiver);
+};
+J.get$isolateChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$isolateChanged(receiver);
+};
+J.get$iterator$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$iterator(receiver);
+};
+J.get$key$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$key(receiver);
+};
+J.get$kind$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$kind(receiver);
+};
+J.get$label$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$label(receiver);
+};
+J.get$last$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$last(receiver);
+};
+J.get$lastAccumulatorReset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastAccumulatorReset(receiver);
+};
+J.get$lastServiceGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lastServiceGC(receiver);
+};
+J.get$length$asx = function(receiver) {
+  return J.getInterceptor$asx(receiver).get$length(receiver);
+};
+J.get$library$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$library(receiver);
+};
+J.get$lineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineMode(receiver);
+};
+J.get$lineNumber$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumber(receiver);
+};
+J.get$lineNumbers$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lineNumbers(receiver);
+};
+J.get$lines$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$lines(receiver);
+};
+J.get$link$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$link(receiver);
+};
+J.get$list$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$list(receiver);
+};
+J.get$loaded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$loaded(receiver);
+};
+J.get$map$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).get$map(receiver);
+};
+J.get$mapAsString$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapAsString(receiver);
+};
+J.get$mapChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mapChanged(receiver);
+};
+J.get$message$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$message(receiver);
+};
+J.get$model$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$model(receiver);
+};
+J.get$mouseOut$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOut(receiver);
+};
+J.get$mouseOver$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$mouseOver(receiver);
+};
+J.get$msg$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$msg(receiver);
+};
+J.get$name$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$name(receiver);
+};
+J.get$nameIsEmpty$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nameIsEmpty(receiver);
+};
+J.get$nextElementSibling$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextElementSibling(receiver);
+};
+J.get$nextNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$nextNode(receiver);
+};
+J.get$object$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$object(receiver);
+};
+J.get$objectChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$objectChanged(receiver);
+};
+J.get$offset$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$offset(receiver);
+};
+J.get$on$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$on(receiver);
+};
+J.get$onMouseDown$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseDown(receiver);
+};
+J.get$onMouseMove$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$onMouseMove(receiver);
+};
+J.get$ownerDocument$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ownerDocument(receiver);
+};
+J.get$pad$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pad(receiver);
+};
+J.get$padding$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$padding(receiver);
+};
+J.get$parent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parent(receiver);
+};
+J.get$parentNode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$parentNode(receiver);
+};
+J.get$path$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$path(receiver);
+};
+J.get$pause$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pause(receiver);
+};
+J.get$pauseEvent$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pauseEvent(receiver);
+};
+J.get$pos$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$pos(receiver);
+};
+J.get$posChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$posChanged(receiver);
+};
+J.get$process$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$process(receiver);
+};
+J.get$profile$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profile(receiver);
+};
+J.get$profileChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$profileChanged(receiver);
+};
+J.get$protocol$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$protocol(receiver);
+};
+J.get$qualified$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualified(receiver);
+};
+J.get$qualifiedName$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$qualifiedName(receiver);
+};
+J.get$reachable$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$reachable(receiver);
+};
+J.get$ref$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$ref(receiver);
+};
+J.get$refChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refChanged(receiver);
+};
+J.get$refresh$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refresh(receiver);
+};
+J.get$refreshCoverage$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshCoverage(receiver);
+};
+J.get$refreshGC$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshGC(receiver);
+};
+J.get$refreshTime$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$refreshTime(receiver);
+};
+J.get$resetAccumulator$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resetAccumulator(receiver);
+};
+J.get$response$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$response(receiver);
+};
+J.get$responseText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$responseText(receiver);
+};
+J.get$result$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$result(receiver);
+};
+J.get$results$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$results(receiver);
+};
+J.get$resume$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$resume(receiver);
+};
+J.get$retainedBytes$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedBytes(receiver);
+};
+J.get$retainedSize$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainedSize(receiver);
+};
+J.get$retainingPath$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$retainingPath(receiver);
+};
+J.get$rowIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rowIndex(receiver);
+};
+J.get$rows$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$rows(receiver);
+};
+J.get$runtimeType$ = function(receiver) {
+  return J.getInterceptor(receiver).get$runtimeType(receiver);
+};
+J.get$sampleCount$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleCount(receiver);
+};
+J.get$sampleDepth$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleDepth(receiver);
+};
+J.get$sampleRate$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$sampleRate(receiver);
+};
+J.get$script$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$script(receiver);
+};
+J.get$scriptChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$scriptChanged(receiver);
+};
+J.get$selectExpr$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectExpr(receiver);
+};
+J.get$selectedIndex$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$selectedIndex(receiver);
+};
+J.get$small$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$small(receiver);
+};
+J.get$socket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$socket(receiver);
+};
+J.get$startLine$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$startLine(receiver);
+};
+J.get$status$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$status(receiver);
+};
+J.get$styleForHits$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$styleForHits(receiver);
+};
+J.get$syntax$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$syntax(receiver);
+};
+J.get$tagSelector$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelector(receiver);
+};
+J.get$tagSelectorChanged$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tagSelectorChanged(receiver);
+};
+J.get$target$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$target(receiver);
+};
+J.get$templateInstance$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$templateInstance(receiver);
+};
+J.get$text$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$text(receiver);
+};
+J.get$timeSpan$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$timeSpan(receiver);
+};
+J.get$toggleExpand$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpand(receiver);
+};
+J.get$toggleExpanded$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$toggleExpanded(receiver);
+};
+J.get$topLeft$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$topLeft(receiver);
+};
+J.get$trace$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$trace(receiver);
+};
+J.get$tree$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$tree(receiver);
+};
+J.get$uncheckedText$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$uncheckedText(receiver);
+};
+J.get$updateLineMode$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$updateLineMode(receiver);
+};
+J.get$url$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$url(receiver);
+};
+J.get$value$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$value(receiver);
+};
+J.get$values$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$values(receiver);
+};
+J.get$version$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$version(receiver);
+};
+J.get$vm$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$vm(receiver);
+};
+J.get$webSocket$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$webSocket(receiver);
+};
+J.get$width$x = function(receiver) {
+  return J.getInterceptor$x(receiver).get$width(receiver);
+};
+J.getAttribute$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).getAttribute$1(receiver, a0);
+};
+J.getBoundingClientRect$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).getBoundingClientRect$0(receiver);
+};
+J.importNode$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).importNode$2(receiver, a0, a1);
+};
+J.indexOf$1$asx = function(receiver, a0) {
+  return J.getInterceptor$asx(receiver).indexOf$1(receiver, a0);
+};
+J.indexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).indexOf$2(receiver, a0, a1);
+};
+J.insert$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).insert$2(receiver, a0, a1);
+};
+J.insertAllBefore$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).insertAllBefore$2(receiver, a0, a1);
+};
+J.join$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).join$1(receiver, a0);
+};
+J.lastIndexOf$2$asx = function(receiver, a0, a1) {
+  return J.getInterceptor$asx(receiver).lastIndexOf$2(receiver, a0, a1);
+};
+J.load$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).load$0(receiver);
+};
+J.map$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).map$1(receiver, a0);
+};
+J.matches$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matches$1(receiver, a0);
+};
+J.matchesWithAncestors$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).matchesWithAncestors$1(receiver, a0);
+};
+J.noSuchMethod$1 = function(receiver, a0) {
+  return J.getInterceptor(receiver).noSuchMethod$1(receiver, a0);
+};
+J.notifyPropertyChange$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).notifyPropertyChange$3(receiver, a0, a1, a2);
+};
+J.observe$3$attributeFilter$attributes$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).observe$3$attributeFilter$attributes(receiver, a0, a1, a2);
+};
+J.open$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).open$1(receiver, a0);
+};
+J.postMessage$2$x = function(receiver, a0, a1) {
+  return J.getInterceptor$x(receiver).postMessage$2(receiver, a0, a1);
+};
+J.preventDefault$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).preventDefault$0(receiver);
+};
+J.print$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).print$1(receiver, a0);
+};
+J.process$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).process$0(receiver);
+};
+J.putImageData$7$x = function(receiver, a0, a1, a2, a3, a4, a5, a6) {
+  return J.getInterceptor$x(receiver).putImageData$7(receiver, a0, a1, a2, a3, a4, a5, a6);
+};
+J.querySelector$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelector$1(receiver, a0);
+};
+J.querySelectorAll$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).querySelectorAll$1(receiver, a0);
+};
+J.refreshCoverage$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).refreshCoverage$0(receiver);
+};
+J.reload$0$x = function(receiver) {
+  return J.getInterceptor$x(receiver).reload$0(receiver);
+};
+J.remove$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).remove$0(receiver);
+};
+J.remove$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).remove$1(receiver, a0);
+};
+J.removeEventListener$3$x = function(receiver, a0, a1, a2) {
+  return J.getInterceptor$x(receiver).removeEventListener$3(receiver, a0, a1, a2);
+};
+J.removeRange$2$ax = function(receiver, a0, a1) {
+  return J.getInterceptor$ax(receiver).removeRange$2(receiver, a0, a1);
+};
+J.replaceAll$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).replaceAll$2(receiver, a0, a1);
+};
+J.replaceWith$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).replaceWith$1(receiver, a0);
+};
+J.round$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).round$0(receiver);
+};
+J.send$1$x = function(receiver, a0) {
+  return J.getInterceptor$x(receiver).send$1(receiver, a0);
+};
+J.set$$function$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$$function(receiver, value);
+};
+J.set$_dartDetail$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_dartDetail(receiver, value);
+};
+J.set$_selector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$_selector(receiver, value);
+};
+J.set$active$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$active(receiver, value);
+};
+J.set$anchor$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$anchor(receiver, value);
+};
+J.set$bindingDelegate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindingDelegate(receiver, value);
+};
+J.set$bindings$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$bindings(receiver, value);
+};
+J.set$busy$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$busy(receiver, value);
+};
+J.set$callback$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$callback(receiver, value);
+};
+J.set$checked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checked(receiver, value);
+};
+J.set$checkedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$checkedText(receiver, value);
+};
+J.set$className$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$className(receiver, value);
+};
+J.set$classTable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$classTable(receiver, value);
+};
+J.set$cls$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$cls(receiver, value);
+};
+J.set$code$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$code(receiver, value);
+};
+J.set$connection$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$connection(receiver, value);
+};
+J.set$counters$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$counters(receiver, value);
+};
+J.set$devtools$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$devtools(receiver, value);
+};
+J.set$displayCutoff$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$displayCutoff(receiver, value);
+};
+J.set$endLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endLine(receiver, value);
+};
+J.set$endPos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$endPos(receiver, value);
+};
+J.set$error$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$error(receiver, value);
+};
+J.set$eval$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$eval(receiver, value);
+};
+J.set$exception$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$exception(receiver, value);
+};
+J.set$expand$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$expand(receiver, value);
+};
+J.set$expanded$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expanded(receiver, value);
+};
+J.set$expr$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$expr(receiver, value);
+};
+J.set$field$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$field(receiver, value);
+};
+J.set$file$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$file(receiver, value);
+};
+J.set$flag$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flag(receiver, value);
+};
+J.set$flagList$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$flagList(receiver, value);
+};
+J.set$fragmentation$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$fragmentation(receiver, value);
+};
+J.set$frame$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$frame(receiver, value);
+};
+J.set$hasClass$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasClass(receiver, value);
+};
+J.set$hasParent$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hasParent(receiver, value);
+};
+J.set$hashLinkWorkaround$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hashLinkWorkaround(receiver, value);
+};
+J.set$height$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$height(receiver, value);
+};
+J.set$hideTagsChecked$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$hideTagsChecked(receiver, value);
+};
+J.set$href$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$href(receiver, value);
+};
+J.set$httpServer$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$httpServer(receiver, value);
+};
+J.set$instance$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instance(receiver, value);
+};
+J.set$instances$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$instances(receiver, value);
+};
+J.set$internal$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$internal(receiver, value);
+};
+J.set$io$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$io(receiver, value);
+};
+J.set$isDart$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isDart(receiver, value);
+};
+J.set$isolate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$isolate(receiver, value);
+};
+J.set$kind$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$kind(receiver, value);
+};
+J.set$label$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$label(receiver, value);
+};
+J.set$last$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$last(receiver, value);
+};
+J.set$lastAccumulatorReset$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastAccumulatorReset(receiver, value);
+};
+J.set$lastServiceGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lastServiceGC(receiver, value);
+};
+J.set$length$asx = function(receiver, value) {
+  return J.getInterceptor$asx(receiver).set$length(receiver, value);
+};
+J.set$library$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$library(receiver, value);
+};
+J.set$lineMode$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lineMode(receiver, value);
+};
+J.set$lines$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$lines(receiver, value);
+};
+J.set$link$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$link(receiver, value);
+};
+J.set$list$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$list(receiver, value);
+};
+J.set$map$ax = function(receiver, value) {
+  return J.getInterceptor$ax(receiver).set$map(receiver, value);
+};
+J.set$mapAsString$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$mapAsString(receiver, value);
+};
+J.set$msg$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$msg(receiver, value);
+};
+J.set$name$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$name(receiver, value);
+};
+J.set$object$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$object(receiver, value);
+};
+J.set$pad$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pad(receiver, value);
+};
+J.set$path$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$path(receiver, value);
+};
+J.set$pause$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pause(receiver, value);
+};
+J.set$pos$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$pos(receiver, value);
+};
+J.set$process$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$process(receiver, value);
+};
+J.set$profile$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$profile(receiver, value);
+};
+J.set$qualified$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualified(receiver, value);
+};
+J.set$qualifiedName$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$qualifiedName(receiver, value);
+};
+J.set$reachable$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$reachable(receiver, value);
+};
+J.set$ref$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$ref(receiver, value);
+};
+J.set$refresh$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refresh(receiver, value);
+};
+J.set$refreshCoverage$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshCoverage(receiver, value);
+};
+J.set$refreshGC$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshGC(receiver, value);
+};
+J.set$refreshTime$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$refreshTime(receiver, value);
+};
+J.set$resetAccumulator$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resetAccumulator(receiver, value);
+};
+J.set$result$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$result(receiver, value);
+};
+J.set$results$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$results(receiver, value);
+};
+J.set$resume$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$resume(receiver, value);
+};
+J.set$retainedBytes$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedBytes(receiver, value);
+};
+J.set$retainedSize$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainedSize(receiver, value);
+};
+J.set$retainingPath$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$retainingPath(receiver, value);
+};
+J.set$sampleCount$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleCount(receiver, value);
+};
+J.set$sampleDepth$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleDepth(receiver, value);
+};
+J.set$sampleRate$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$sampleRate(receiver, value);
+};
+J.set$script$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$script(receiver, value);
+};
+J.set$selectedIndex$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$selectedIndex(receiver, value);
+};
+J.set$small$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$small(receiver, value);
+};
+J.set$socket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$socket(receiver, value);
+};
+J.set$startLine$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$startLine(receiver, value);
+};
+J.set$status$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$status(receiver, value);
+};
+J.set$tagSelector$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$tagSelector(receiver, value);
+};
+J.set$text$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$text(receiver, value);
+};
+J.set$timeSpan$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$timeSpan(receiver, value);
+};
+J.set$trace$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$trace(receiver, value);
+};
+J.set$type$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$type(receiver, value);
+};
+J.set$uncheckedText$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$uncheckedText(receiver, value);
+};
+J.set$value$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$value(receiver, value);
+};
+J.set$vm$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$vm(receiver, value);
+};
+J.set$webSocket$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$webSocket(receiver, value);
+};
+J.set$width$x = function(receiver, value) {
+  return J.getInterceptor$x(receiver).set$width(receiver, value);
+};
+J.setRange$4$ax = function(receiver, a0, a1, a2, a3) {
+  return J.getInterceptor$ax(receiver).setRange$4(receiver, a0, a1, a2, a3);
+};
+J.skip$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).skip$1(receiver, a0);
+};
+J.sort$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).sort$0(receiver);
+};
+J.sort$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).sort$1(receiver, a0);
+};
+J.split$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).split$1(receiver, a0);
+};
+J.startsWith$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).startsWith$1(receiver, a0);
+};
+J.substring$1$s = function(receiver, a0) {
+  return J.getInterceptor$s(receiver).substring$1(receiver, a0);
+};
+J.substring$2$s = function(receiver, a0, a1) {
+  return J.getInterceptor$s(receiver).substring$2(receiver, a0, a1);
+};
+J.toInt$0$n = function(receiver) {
+  return J.getInterceptor$n(receiver).toInt$0(receiver);
+};
+J.toList$0$ax = function(receiver) {
+  return J.getInterceptor$ax(receiver).toList$0(receiver);
+};
+J.toRadixString$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toRadixString$1(receiver, a0);
+};
+J.toString$0 = function(receiver) {
+  return J.getInterceptor(receiver).toString$0(receiver);
+};
+J.toStringAsFixed$1$n = function(receiver, a0) {
+  return J.getInterceptor$n(receiver).toStringAsFixed$1(receiver, a0);
+};
+J.trim$0$s = function(receiver) {
+  return J.getInterceptor$s(receiver).trim$0(receiver);
+};
+J.where$1$ax = function(receiver, a0) {
+  return J.getInterceptor$ax(receiver).where$1(receiver, a0);
+};
+C.ActionLinkElement_methods = X.ActionLinkElement.prototype;
+C.AutoBindingElement_methods = Y.AutoBindingElement.prototype;
+C.BreakpointListElement_methods = B.BreakpointListElement.prototype;
+C.ClassNavMenuElement_methods = A.ClassNavMenuElement.prototype;
+C.ClassRefElement_methods = Q.ClassRefElement.prototype;
+C.ClassTreeElement_methods = O.ClassTreeElement.prototype;
+C.ClassViewElement_methods = Z.ClassViewElement.prototype;
+C.CodeRefElement_methods = O.CodeRefElement.prototype;
+C.CodeViewElement_methods = F.CodeViewElement.prototype;
+C.CurlyBlockElement_methods = R.CurlyBlockElement.prototype;
+C.ErrorViewElement_methods = F.ErrorViewElement.prototype;
+C.EvalBoxElement_methods = L.EvalBoxElement.prototype;
+C.EvalLinkElement_methods = R.EvalLinkElement.prototype;
+C.FieldRefElement_methods = D.FieldRefElement.prototype;
+C.FieldViewElement_methods = A.FieldViewElement.prototype;
+C.FlagItemElement_methods = X.FlagItemElement.prototype;
+C.FlagListElement_methods = X.FlagListElement.prototype;
+C.FunctionRefElement_methods = U.FunctionRefElement.prototype;
+C.FunctionViewElement_methods = N.FunctionViewElement.prototype;
+C.HeapMapElement_methods = O.HeapMapElement.prototype;
+C.HeapProfileElement_methods = K.HeapProfileElement.prototype;
+C.HttpRequest_methods = W.HttpRequest.prototype;
+C.IOHttpServerConnectionRefElement_methods = E.IOHttpServerConnectionRefElement.prototype;
+C.IOHttpServerConnectionViewElement_methods = E.IOHttpServerConnectionViewElement.prototype;
+C.IOHttpServerListViewElement_methods = E.IOHttpServerListViewElement.prototype;
+C.IOHttpServerRefElement_methods = E.IOHttpServerRefElement.prototype;
+C.IOHttpServerViewElement_methods = E.IOHttpServerViewElement.prototype;
+C.IOProcessListViewElement_methods = E.IOProcessListViewElement.prototype;
+C.IOProcessRefElement_methods = E.IOProcessRefElement.prototype;
+C.IOProcessViewElement_methods = E.IOProcessViewElement.prototype;
+C.IORandomAccessFileListViewElement_methods = E.IORandomAccessFileListViewElement.prototype;
+C.IORandomAccessFileRefElement_methods = E.IORandomAccessFileRefElement.prototype;
+C.IORandomAccessFileViewElement_methods = E.IORandomAccessFileViewElement.prototype;
+C.IORefElement_methods = E.IORefElement.prototype;
+C.IOSocketListViewElement_methods = E.IOSocketListViewElement.prototype;
+C.IOSocketRefElement_methods = E.IOSocketRefElement.prototype;
+C.IOSocketViewElement_methods = E.IOSocketViewElement.prototype;
+C.IOViewElement_methods = E.IOViewElement.prototype;
+C.IOWebSocketListViewElement_methods = E.IOWebSocketListViewElement.prototype;
+C.IOWebSocketRefElement_methods = E.IOWebSocketRefElement.prototype;
+C.IOWebSocketViewElement_methods = E.IOWebSocketViewElement.prototype;
+C.InstanceRefElement_methods = B.InstanceRefElement.prototype;
+C.InstanceViewElement_methods = Z.InstanceViewElement.prototype;
+C.IsolateCounterChartElement_methods = D.IsolateCounterChartElement.prototype;
+C.IsolateLocationElement_methods = D.IsolateLocationElement.prototype;
+C.IsolateNavMenuElement_methods = A.IsolateNavMenuElement.prototype;
+C.IsolateProfileElement_methods = X.IsolateProfileElement.prototype;
+C.IsolateRefElement_methods = N.IsolateRefElement.prototype;
+C.IsolateRunStateElement_methods = D.IsolateRunStateElement.prototype;
+C.IsolateSharedSummaryElement_methods = D.IsolateSharedSummaryElement.prototype;
+C.IsolateSummaryElement_methods = D.IsolateSummaryElement.prototype;
+C.IsolateViewElement_methods = L.IsolateViewElement.prototype;
+C.JSArray_methods = J.JSArray.prototype;
+C.JSDouble_methods = J.JSDouble.prototype;
+C.JSInt_methods = J.JSInt.prototype;
+C.JSNull_methods = J.JSNull.prototype;
+C.JSNumber_methods = J.JSNumber.prototype;
+C.JSString_methods = J.JSString.prototype;
+C.JsonViewElement_methods = Z.JsonViewElement.prototype;
+C.LibraryNavMenuElement_methods = A.LibraryNavMenuElement.prototype;
+C.LibraryRefElement_methods = R.LibraryRefElement.prototype;
+C.LibraryViewElement_methods = M.LibraryViewElement.prototype;
+C.NativeUint8ClampedList_methods = H.NativeUint8ClampedList.prototype;
+C.NavBarElement_methods = A.NavBarElement.prototype;
+C.NavControlElement_methods = A.NavControlElement.prototype;
+C.NavMenuElement_methods = A.NavMenuElement.prototype;
+C.NavMenuItemElement_methods = A.NavMenuItemElement.prototype;
+C.NavRefreshElement_methods = A.NavRefreshElement.prototype;
+C.NodeList_methods = W.NodeList.prototype;
+C.ObservatoryApplicationElement_methods = V.ObservatoryApplicationElement.prototype;
+C.ObservatoryElement_methods = Z.ObservatoryElement.prototype;
+C.PlainJavaScriptObject_methods = J.PlainJavaScriptObject.prototype;
+C.PolymerElement_methods = A.PolymerElement.prototype;
+C.ScriptInsetElement_methods = T.ScriptInsetElement.prototype;
+C.ScriptRefElement_methods = A.ScriptRefElement.prototype;
+C.ScriptViewElement_methods = U.ScriptViewElement.prototype;
+C.ServiceErrorViewElement_methods = R.ServiceErrorViewElement.prototype;
+C.ServiceExceptionViewElement_methods = D.ServiceExceptionViewElement.prototype;
+C.ServiceObjectViewElement_methods = U.ServiceObjectViewElement.prototype;
+C.ServiceRefElement_methods = Q.ServiceRefElement.prototype;
+C.SlidingCheckboxElement_methods = Q.SlidingCheckboxElement.prototype;
+C.StackFrameElement_methods = K.StackFrameElement.prototype;
+C.StackTraceElement_methods = X.StackTraceElement.prototype;
+C.TopNavMenuElement_methods = A.TopNavMenuElement.prototype;
+C.UnknownJavaScriptObject_methods = J.UnknownJavaScriptObject.prototype;
+C.VMRefElement_methods = X.VMRefElement.prototype;
+C.VMViewElement_methods = U.VMViewElement.prototype;
+C.Window_methods = W.Window.prototype;
+C.C_DynamicRuntimeType = new H.DynamicRuntimeType();
+C.C_EmptyExpression = new U.EmptyExpression();
+C.C_EmptyIterator = new H.EmptyIterator();
+C.C_OutOfMemoryError = new P.OutOfMemoryError();
+C.C_ScopeFactory = new T.ScopeFactory();
+C.C__DelayedDone = new P._DelayedDone();
+C.C__JSRandom = new P._JSRandom();
+C.C__ObserverSentinel = new L._ObserverSentinel();
+C.C__RootZone = new P._RootZone();
+C.C__RootZoneSpecification = new P._RootZoneSpecification();
+C.CodeKind_Collected = new D.CodeKind("Collected");
+C.CodeKind_Dart = new D.CodeKind("Dart");
+C.CodeKind_Native = new D.CodeKind("Native");
+C.CodeKind_Reused = new D.CodeKind("Reused");
+C.CodeKind_Tag = new D.CodeKind("Tag");
+C.DeclarationKind_0 = new A.DeclarationKind(0);
+C.DeclarationKind_1 = new A.DeclarationKind(1);
+C.DeclarationKind_2 = new A.DeclarationKind(2);
+C.Symbol_error = new H.Symbol0("error");
+C.Type_UOR = H.createRuntimeType('DartError');
+C.C_Reflectable = new K.Reflectable();
+C.PublishedProperty_false = new A.PublishedProperty(false);
+Isolate.makeConstantList = function(list) {
+  list.immutable$list = init;
+  list.fixed$length = init;
+  return list;
+};
+;
+C.List_bTJ = Isolate.makeConstantList([C.C_Reflectable, C.PublishedProperty_false]);
+C.Declaration_0 = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_UOR, false, C.List_bTJ);
+C.Symbol_last = new H.Symbol0("last");
+C.Type_EsU = H.createRuntimeType('bool');
+C.Declaration_06U = new A.Declaration(C.Symbol_last, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_fragmentation = new H.Symbol0("fragmentation");
+C.Type_bAc = H.createRuntimeType('ServiceMap');
+C.Declaration_0Y4 = new A.Declaration(C.Symbol_fragmentation, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_label = new H.Symbol0("label");
+C.Type_Ejg = H.createRuntimeType('String');
+C.Declaration_0g2 = new A.Declaration(C.Symbol_label, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_hasParent = new H.Symbol0("hasParent");
+C.C_ObservableProperty = new K.ObservableProperty();
+C.List_Reflectable_ObservableProperty = Isolate.makeConstantList([C.C_Reflectable, C.C_ObservableProperty]);
+C.Declaration_0qV = new A.Declaration(C.Symbol_hasParent, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleDepth = new H.Symbol0("sampleDepth");
+C.Declaration_2AE = new A.Declaration(C.Symbol_sampleDepth, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_result = new H.Symbol0("result");
+C.Type_rPh = H.createRuntimeType('ServiceObject');
+C.Declaration_2No = new A.Declaration(C.Symbol_result, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_counters = new H.Symbol0("counters");
+C.Type_caQ = H.createRuntimeType('ObservableMap');
+C.Declaration_2Qn = new A.Declaration(C.Symbol_counters, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_sampleRate = new H.Symbol0("sampleRate");
+C.Declaration_3VL = new A.Declaration(C.Symbol_sampleRate, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Type_Tby = H.createRuntimeType('ServiceError');
+C.Declaration_4eA = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_Tby, false, C.List_bTJ);
+C.Symbol_objectChanged = new H.Symbol0("objectChanged");
+C.Type_EjN = H.createRuntimeType('Function');
+C.List_empty = Isolate.makeConstantList([]);
+C.Declaration_4up = new A.Declaration(C.Symbol_objectChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_frame = new H.Symbol0("frame");
+C.Declaration_65l = new A.Declaration(C.Symbol_frame, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_flag = new H.Symbol0("flag");
+C.Declaration_6YB = new A.Declaration(C.Symbol_flag, C.DeclarationKind_1, false, C.Type_caQ, false, C.List_bTJ);
+C.Symbol_library = new H.Symbol0("library");
+C.Type_azP = H.createRuntimeType('Library');
+C.Declaration_6ts = new A.Declaration(C.Symbol_library, C.DeclarationKind_1, false, C.Type_azP, false, C.List_bTJ);
+C.Symbol_status = new H.Symbol0("status");
+C.Declaration_8sn = new A.Declaration(C.Symbol_status, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPos = new H.Symbol0("endPos");
+C.Type_SnA = H.createRuntimeType('$int');
+C.Declaration_ACG = new A.Declaration(C.Symbol_endPos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_code = new H.Symbol0("code");
+C.Type_Zyt = H.createRuntimeType('Code');
+C.List_ObservableProperty = Isolate.makeConstantList([C.C_ObservableProperty]);
+C.Declaration_AgZ = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, true, C.Type_Zyt, false, C.List_ObservableProperty);
+C.Symbol_list = new H.Symbol0("list");
+C.Declaration_BKW = new A.Declaration(C.Symbol_list, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_httpServer = new H.Symbol0("httpServer");
+C.Declaration_BSX = new A.Declaration(C.Symbol_httpServer, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_retainedBytes = new H.Symbol0("retainedBytes");
+C.Declaration_CIB = new A.Declaration(C.Symbol_retainedBytes, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_displayCutoff = new H.Symbol0("displayCutoff");
+C.Declaration_CR6 = new A.Declaration(C.Symbol_displayCutoff, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_functionChanged = new H.Symbol0("functionChanged");
+C.Declaration_Chj = new A.Declaration(C.Symbol_functionChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_expandChanged = new H.Symbol0("expandChanged");
+C.Declaration_Dbk = new A.Declaration(C.Symbol_expandChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelectorChanged = new H.Symbol0("tagSelectorChanged");
+C.Declaration_ECn = new A.Declaration(C.Symbol_tagSelectorChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_profile = new H.Symbol0("profile");
+C.Declaration_EkK = new A.Declaration(C.Symbol_profile, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_pad = new H.Symbol0("pad");
+C.Declaration_EsU = new A.Declaration(C.Symbol_pad, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_object = new H.Symbol0("object");
+C.Declaration_HtW = new A.Declaration(C.Symbol_object, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_callback = new H.Symbol0("callback");
+C.Type_yvU = H.createRuntimeType('evalType');
+C.Declaration_IF7 = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_yvU, false, C.List_bTJ);
+C.Symbol_uncheckedText = new H.Symbol0("uncheckedText");
+C.Declaration_IRg = new A.Declaration(C.Symbol_uncheckedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_socket = new H.Symbol0("socket");
+C.Type_Qs5 = H.createRuntimeType('Socket');
+C.Declaration_Iiu = new A.Declaration(C.Symbol_socket, C.DeclarationKind_1, false, C.Type_Qs5, false, C.List_bTJ);
+C.Symbol_file = new H.Symbol0("file");
+C.Declaration_Ix1 = new A.Declaration(C.Symbol_file, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_refChanged = new H.Symbol0("refChanged");
+C.Declaration_MJ5 = new A.Declaration(C.Symbol_refChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_tagSelector = new H.Symbol0("tagSelector");
+C.Declaration_Q0F = new A.Declaration(C.Symbol_tagSelector, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_endPosChanged = new H.Symbol0("endPosChanged");
+C.Declaration_QAa = new A.Declaration(C.Symbol_endPosChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_vm = new H.Symbol0("vm");
+C.Type_GP5 = H.createRuntimeType('VM');
+C.Declaration_Qi2 = new A.Declaration(C.Symbol_vm, C.DeclarationKind_1, false, C.Type_GP5, false, C.List_bTJ);
+C.Symbol_mapAsString = new H.Symbol0("mapAsString");
+C.Declaration_Qx4 = new A.Declaration(C.Symbol_mapAsString, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_expanded = new H.Symbol0("expanded");
+C.Declaration_RQo = new A.Declaration(C.Symbol_expanded, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lines = new H.Symbol0("lines");
+C.Type_UWS = H.createRuntimeType('List');
+C.Declaration_WfA = new A.Declaration(C.Symbol_lines, C.DeclarationKind_1, false, C.Type_UWS, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_hasClass = new H.Symbol0("hasClass");
+C.Declaration_X8B = new A.Declaration(C.Symbol_hasClass, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_internal = new H.Symbol0("internal");
+C.Declaration_XBb = new A.Declaration(C.Symbol_internal, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_kind = new H.Symbol0("kind");
+C.Declaration_Xdi = new A.Declaration(C.Symbol_kind, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_endLine = new H.Symbol0("endLine");
+C.Declaration_ZcJ = new A.Declaration(C.Symbol_endLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_text = new H.Symbol0("text");
+C.Declaration_ZfX = new A.Declaration(C.Symbol_text, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_process = new H.Symbol0("process");
+C.Declaration_a13 = new A.Declaration(C.Symbol_process, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_hideTagsChecked = new H.Symbol0("hideTagsChecked");
+C.Declaration_a1A = new A.Declaration(C.Symbol_hideTagsChecked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_sampleCount = new H.Symbol0("sampleCount");
+C.Declaration_ac8 = new A.Declaration(C.Symbol_sampleCount, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_isolate = new H.Symbol0("isolate");
+C.Type_B8J0 = H.createRuntimeType('Isolate');
+C.Declaration_agR = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_io = new H.Symbol0("io");
+C.Declaration_bh9 = new A.Declaration(C.Symbol_io, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_devtools = new H.Symbol0("devtools");
+C.Declaration_c4R = new A.Declaration(C.Symbol_devtools, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_countersChanged = new H.Symbol0("countersChanged");
+C.Declaration_cJC = new A.Declaration(C.Symbol_countersChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_path = new H.Symbol0("path");
+C.Declaration_cMb = new A.Declaration(C.Symbol_path, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checkedText = new H.Symbol0("checkedText");
+C.Declaration_cdS = new A.Declaration(C.Symbol_checkedText, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_timeSpan = new H.Symbol0("timeSpan");
+C.Declaration_dIf = new A.Declaration(C.Symbol_timeSpan, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_active = new H.Symbol0("active");
+C.Declaration_dw1 = new A.Declaration(C.Symbol_active, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_qualified = new H.Symbol0("qualified");
+C.Declaration_e24 = new A.Declaration(C.Symbol_qualified, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_isolateChanged = new H.Symbol0("isolateChanged");
+C.Declaration_e3c = new A.Declaration(C.Symbol_isolateChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_ref = new H.Symbol0("ref");
+C.Declaration_e3c0 = new A.Declaration(C.Symbol_ref, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Declaration_eea = new A.Declaration(C.Symbol_error, C.DeclarationKind_1, false, C.Type_rPh, false, C.List_bTJ);
+C.Symbol_expr = new H.Symbol0("expr");
+C.Type_dynamic = H.createRuntimeType('dynamic');
+C.Declaration_gLQ = new A.Declaration(C.Symbol_expr, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_msg = new H.Symbol0("msg");
+C.Declaration_gc6 = new A.Declaration(C.Symbol_msg, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_results = new H.Symbol0("results");
+C.Type_pe4 = H.createRuntimeType('ObservableList');
+C.Declaration_ggw = new A.Declaration(C.Symbol_results, C.DeclarationKind_1, false, C.Type_pe4, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_classTable = new H.Symbol0("classTable");
+C.Type_Gx6 = H.createRuntimeType('ClassSortedTable');
+C.Declaration_gsm = new A.Declaration(C.Symbol_classTable, C.DeclarationKind_1, false, C.Type_Gx6, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_pos = new H.Symbol0("pos");
+C.Declaration_i3t = new A.Declaration(C.Symbol_pos, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_bTJ);
+C.Symbol_qualifiedName = new H.Symbol0("qualifiedName");
+C.Declaration_i3y = new A.Declaration(C.Symbol_qualifiedName, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_mapChanged = new H.Symbol0("mapChanged");
+C.Declaration_iLh = new A.Declaration(C.Symbol_mapChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_link = new H.Symbol0("link");
+C.Declaration_ibz = new A.Declaration(C.Symbol_link, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_refreshTime = new H.Symbol0("refreshTime");
+C.Declaration_ijl = new A.Declaration(C.Symbol_refreshTime, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_fragmentationChanged = new H.Symbol0("fragmentationChanged");
+C.Declaration_ivD = new A.Declaration(C.Symbol_fragmentationChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_scriptChanged = new H.Symbol0("scriptChanged");
+C.Declaration_ixB = new A.Declaration(C.Symbol_scriptChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_field = new H.Symbol0("field");
+C.Declaration_iyl = new A.Declaration(C.Symbol_field, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_busy = new H.Symbol0("busy");
+C.Declaration_izV = new A.Declaration(C.Symbol_busy, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_profileChanged = new H.Symbol0("profileChanged");
+C.Declaration_j3g = new A.Declaration(C.Symbol_profileChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_startLine = new H.Symbol0("startLine");
+C.Declaration_k6K = new A.Declaration(C.Symbol_startLine, C.DeclarationKind_1, false, C.Type_SnA, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_lastServiceGC = new H.Symbol0("lastServiceGC");
+C.Declaration_mPk = new A.Declaration(C.Symbol_lastServiceGC, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_webSocket = new H.Symbol0("webSocket");
+C.Declaration_mT8 = new A.Declaration(C.Symbol_webSocket, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_instance = new H.Symbol0("instance");
+C.Declaration_o7L = new A.Declaration(C.Symbol_instance, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_isDart = new H.Symbol0("isDart");
+C.Declaration_o7e = new A.Declaration(C.Symbol_isDart, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_cls = new H.Symbol0("cls");
+C.Type_Tzp = H.createRuntimeType('Class');
+C.Declaration_okX = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_Tzp, false, C.List_bTJ);
+C.Symbol_posChanged = new H.Symbol0("posChanged");
+C.Declaration_owq = new A.Declaration(C.Symbol_posChanged, C.DeclarationKind_2, false, C.Type_EjN, false, C.List_empty);
+C.Symbol_small = new H.Symbol0("small");
+C.Declaration_pPA = new A.Declaration(C.Symbol_small, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_instances = new H.Symbol0("instances");
+C.Declaration_qr9 = new A.Declaration(C.Symbol_instances, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_qrv = new A.Declaration(C.Symbol_cls, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_checked = new H.Symbol0("checked");
+C.Declaration_siO = new A.Declaration(C.Symbol_checked, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_trace = new H.Symbol0("trace");
+C.Declaration_ssf = new A.Declaration(C.Symbol_trace, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_anchor = new H.Symbol0("anchor");
+C.Declaration_suy = new A.Declaration(C.Symbol_anchor, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_bTJ);
+C.Symbol_exception = new H.Symbol0("exception");
+C.Type_zzJ = H.createRuntimeType('ServiceException');
+C.Declaration_v0l = new A.Declaration(C.Symbol_exception, C.DeclarationKind_1, false, C.Type_zzJ, false, C.List_bTJ);
+C.Symbol_lastAccumulatorReset = new H.Symbol0("lastAccumulatorReset");
+C.Declaration_vA1 = new A.Declaration(C.Symbol_lastAccumulatorReset, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Declaration_voj = new A.Declaration(C.Symbol_isolate, C.DeclarationKind_1, false, C.Type_B8J0, false, C.List_bTJ);
+C.Symbol_flagList = new H.Symbol0("flagList");
+C.Declaration_wE9 = new A.Declaration(C.Symbol_flagList, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_woc = new A.Declaration(C.Symbol_code, C.DeclarationKind_1, false, C.Type_Zyt, false, C.List_bTJ);
+C.Symbol_lineMode = new H.Symbol0("lineMode");
+C.Declaration_ww8 = new A.Declaration(C.Symbol_lineMode, C.DeclarationKind_1, false, C.Type_Ejg, false, C.List_Reflectable_ObservableProperty);
+C.Symbol_map = new H.Symbol0("map");
+C.Declaration_wzu = new A.Declaration(C.Symbol_map, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_function = new H.Symbol0("function");
+C.Declaration_y9n = new A.Declaration(C.Symbol_function, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Symbol_connection = new H.Symbol0("connection");
+C.Declaration_yDj = new A.Declaration(C.Symbol_connection, C.DeclarationKind_1, false, C.Type_bAc, false, C.List_bTJ);
+C.Declaration_yXb = new A.Declaration(C.Symbol_callback, C.DeclarationKind_1, false, C.Type_dynamic, false, C.List_bTJ);
+C.Symbol_expand = new H.Symbol0("expand");
+C.Declaration_yXb0 = new A.Declaration(C.Symbol_expand, C.DeclarationKind_1, false, C.Type_EsU, false, C.List_bTJ);
+C.Symbol_script = new H.Symbol0("script");
+C.Type_cgs = H.createRuntimeType('Script');
+C.Declaration_yx3 = new A.Declaration(C.Symbol_script, C.DeclarationKind_1, false, C.Type_cgs, false, C.List_bTJ);
+C.Duration_0 = new P.Duration(0);
+C.EventStreamProvider_change = H.setRuntimeTypeInfo(new W.EventStreamProvider("change"), [W.Event]);
+C.EventStreamProvider_click = H.setRuntimeTypeInfo(new W.EventStreamProvider("click"), [W.MouseEvent]);
+C.EventStreamProvider_error = H.setRuntimeTypeInfo(new W.EventStreamProvider("error"), [W.ProgressEvent]);
+C.EventStreamProvider_input = H.setRuntimeTypeInfo(new W.EventStreamProvider("input"), [W.Event]);
+C.EventStreamProvider_load = H.setRuntimeTypeInfo(new W.EventStreamProvider("load"), [W.ProgressEvent]);
+C.EventStreamProvider_message = H.setRuntimeTypeInfo(new W.EventStreamProvider("message"), [W.MessageEvent]);
+C.EventStreamProvider_mousedown = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousedown"), [W.MouseEvent]);
+C.EventStreamProvider_mousemove = H.setRuntimeTypeInfo(new W.EventStreamProvider("mousemove"), [W.MouseEvent]);
+C.EventStreamProvider_popstate = H.setRuntimeTypeInfo(new W.EventStreamProvider("popstate"), [W.PopStateEvent]);
+C.JS_CONST_0 = function(hooks) {
   if (typeof dartExperimentalFixupGetTag != "function") return hooks;
   hooks.getTag = dartExperimentalFixupGetTag(hooks.getTag);
-}
-C.lR=function(hooks) {
+};
+C.JS_CONST_4hp = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Firefox") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19330,8 +35830,8 @@
     return quickMap[tag] || tag;
   }
   hooks.getTag = getTagFirefox;
-}
-C.w2=function getTagFallback(o) {
+};
+C.JS_CONST_8ZY = function getTagFallback(o) {
   var constructor = o.constructor;
   if (typeof constructor == "function") {
     var name = constructor.name;
@@ -19344,10 +35844,10 @@
   }
   var s = Object.prototype.toString.call(o);
   return s.substring(8, s.length - 1);
-}
-C.XQ=function(hooks) { return hooks; }
-
-C.ku=function(getTagFallback) {
+};
+C.JS_CONST_Fs4 = function(hooks) { return hooks; }
+;
+C.JS_CONST_QJm = function(getTagFallback) {
   return function(hooks) {
     if (typeof navigator != "object") return hooks;
     var ua = navigator.userAgent;
@@ -19360,8 +35860,8 @@
     }
     hooks.getTag = getTagFallback;
   };
-}
-C.MA=function() {
+};
+C.JS_CONST_aQP = function() {
   function typeNameInChrome(o) {
     var name = o.constructor.name;
     if (name) return name;
@@ -19393,8 +35893,8 @@
     getUnknownTag: isBrowser ? getUnknownTagGenericBrowser : getUnknownTag,
     prototypeForTag: prototypeForTag,
     discriminator: discriminator };
-}
-C.M1=function(hooks) {
+};
+C.JS_CONST_gkc = function(hooks) {
   var userAgent = typeof navigator == "object" ? navigator.userAgent : "";
   if (userAgent.indexOf("Trident/") == -1) return hooks;
   var getTag = hooks.getTag;
@@ -19422,8 +35922,8 @@
   }
   hooks.getTag = getTagIE;
   hooks.prototypeForTag = prototypeForTagIE;
-}
-C.hQ=function(hooks) {
+};
+C.JS_CONST_rr7 = function(hooks) {
   var getTag = hooks.getTag;
   var prototypeForTag = hooks.prototypeForTag;
   function getTagFixed(o) {
@@ -19440,593 +35940,1171 @@
   }
   hooks.getTag = getTagFixed;
   hooks.prototypeForTag = prototypeForTagFixed;
-}
-C.xr=new P.pE(null,null)
-C.A3=new P.c5(null)
-C.Sr=new P.ojF(null,null)
-C.D8=new N.qV("FINER",400)
-C.eI=new N.qV("FINE",500)
-C.IF=new N.qV("INFO",800)
-C.Xm=new N.qV("SEVERE",1000)
-C.nT=new N.qV("WARNING",900)
-C.NG=I.uL([1,6])
-C.rs=I.uL([0,0,26624,1023,0,0,65534,2047])
-C.SV=new H.IN("keys")
-C.Uq=new H.IN("values")
-C.Wn=new H.IN("length")
-C.ai=new H.IN("isEmpty")
-C.nZ=new H.IN("isNotEmpty")
-C.Zw=I.uL([C.SV,C.Uq,C.Wn,C.ai,C.nZ])
-C.fW=H.VM(I.uL(["+","-","*","/","%","^","==","!=",">","<",">=","<=","||","&&","&","===","!==","|"]),[P.qU])
-C.NL=I.uL([0,0,26624,1023,65534,2047,65534,2047])
-C.yD=I.uL([0,0,26498,1023,65534,34815,65534,18431])
-C.N4=H.Kx('nd')
-C.Cd=I.uL([C.N4])
-C.G8=I.uL(["==","!=","<=",">=","||","&&"])
-C.oP=I.uL(["as","in","this"])
-C.QC=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.B2=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,32722,12287,65535,34815,65534,18431])
-C.iq=I.uL([40,41,91,93,123,125])
-C.zao=I.uL(["caption","col","colgroup","option","optgroup","tbody","td","tfoot","th","thead","tr"])
-C.z5=new H.Px(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.uL(["domfocusout","domfocusin","dommousescroll","animationend","animationiteration","animationstart","doubleclick","fullscreenchange","fullscreenerror","keyadded","keyerror","keymessage","needkey","speechchange"])
-C.fE=new H.Px(14,{domfocusout:"DOMFocusOut",domfocusin:"DOMFocusIn",dommousescroll:"DOMMouseScroll",animationend:"webkitAnimationEnd",animationiteration:"webkitAnimationIteration",animationstart:"webkitAnimationStart",doubleclick:"dblclick",fullscreenchange:"webkitfullscreenchange",fullscreenerror:"webkitfullscreenerror",keyadded:"webkitkeyadded",keyerror:"webkitkeyerror",keymessage:"webkitkeymessage",needkey:"webkitneedkey",speechchange:"webkitSpeechChange"},C.Vgv)
-C.rW=I.uL(["name","extends","constructor","noscript","assetpath","cache-csstext","attributes"])
-C.n7=new H.Px(7,{name:1,extends:1,constructor:1,noscript:1,assetpath:1,"cache-csstext":1,attributes:1},C.rW)
-C.Y1=I.uL(["!",":",",",")","]","}","?","||","&&","|","^","&","!=","==","!==","===",">=",">","<=","<","+","-","%","/","*","(","[",".","{"])
-C.lx=new H.Px(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.CM=new H.Px(0,{},C.dn)
-C.MEG=I.uL(["enumerate"])
-C.va=new H.Px(1,{enumerate:K.y8()},C.MEG)
-C.tq=H.Kx('Bo')
-C.MS=H.Kx('wA')
-C.wE=I.uL([C.MS])
-C.Xk=new A.Wq(!1,!1,!0,C.tq,!1,!0,C.wE,null)
-C.uDk=H.Kx('hG')
-C.tmF=I.uL([C.uDk])
-C.aj=new A.Wq(!0,!0,!0,C.tq,!1,!1,C.tmF,null)
-C.wj=new D.l8R("Internal")
-C.Cn=new D.l8R("Listening")
-C.fO=new D.l8R("Normal")
-C.FJ=new D.l8R("Pipe")
-C.IH=new H.IN("address")
-C.ke=new H.IN("architecture")
-C.ET=new H.IN("assertsEnabled")
-C.WC=new H.IN("bpt")
-C.Ro=new H.IN("buttonClick")
-C.hN=new H.IN("bytes")
-C.Ka=new H.IN("call")
-C.bV=new H.IN("capacity")
-C.C0=new H.IN("change")
-C.eZ=new H.IN("changeSort")
-C.OI=new H.IN("classes")
-C.To=new H.IN("closing")
-C.J6=new H.IN("collections")
-C.qt=new H.IN("coloring")
-C.p1=new H.IN("columns")
-C.Je=new H.IN("current")
-C.iE=new H.IN("descriptor")
-C.f4=new H.IN("descriptors")
-C.aK=new H.IN("doAction")
-C.GP=new H.IN("element")
-C.tP=new H.IN("entry")
-C.Zb=new H.IN("eval")
-C.u7=new H.IN("evalNow")
-C.Ek=new H.IN("expander")
-C.Pn=new H.IN("expanderStyle")
-C.h7=new H.IN("external")
-C.R3=new H.IN("fd")
-C.fV=new H.IN("fields")
-C.Gd=new H.IN("firstTokenPos")
-C.FP=new H.IN("formatSize")
-C.kF=new H.IN("formatTime")
-C.UD=new H.IN("formattedAddress")
-C.Aq=new H.IN("formattedAverage")
-C.DS=new H.IN("formattedCollections")
-C.C9=new H.IN("formattedDeoptId")
-C.VF=new H.IN("formattedExclusive")
-C.uU=new H.IN("formattedExclusiveTicks")
-C.YJ=new H.IN("formattedInclusive")
-C.eF=new H.IN("formattedInclusiveTicks")
-C.oI=new H.IN("formattedLine")
-C.ST=new H.IN("formattedTotalCollectionTime")
-C.EI=new H.IN("functions")
-C.JB=new H.IN("getColumnLabel")
-C.d4=new H.IN("goto")
-C.cF=new H.IN("gotoLink")
-C.SI=new H.IN("hasDescriptors")
-C.zS=new H.IN("hasDisassembly")
-C.YA=new H.IN("hasNoAllocations")
-C.Ge=new H.IN("hashLinkWorkaround")
-C.Ss=new H.IN("hits")
-C.k6=new H.IN("hoverText")
-C.PJ=new H.IN("human")
-C.q2=new H.IN("idle")
-C.d2=new H.IN("imp")
-C.kN=new H.IN("imports")
-C.yB=new H.IN("instances")
-C.eJ=new H.IN("instruction")
-C.iG=new H.IN("instructions")
-C.Py=new H.IN("interface")
-C.pC=new H.IN("interfaces")
-C.Bs=new H.IN("ioEnabled")
-C.XH=new H.IN("isAbstract")
-C.I9=new H.IN("isBool")
-C.C1=new H.IN("isComment")
-C.bD=new H.IN("isConst")
-C.Yg=new H.IN("isDartCode")
-C.bR=new H.IN("isDouble")
-C.ob=new H.IN("isError")
-C.WV=new H.IN("isFinalized")
-C.Ih=new H.IN("isImplemented")
-C.Iv=new H.IN("isInstance")
-C.Wg=new H.IN("isInt")
-C.tD=new H.IN("isList")
-C.Of=new H.IN("isNull")
-C.pY=new H.IN("isOptimized")
-C.XL=new H.IN("isPatch")
-C.LA=new H.IN("isPipe")
-C.Lk=new H.IN("isString")
-C.dK=new H.IN("isType")
-C.xf=new H.IN("isUnexpected")
-C.Jx=new H.IN("isolates")
-C.b5=new H.IN("jumpTarget")
-C.kA=new H.IN("lastTokenPos")
-C.GI=new H.IN("lastUpdate")
-C.ur=new H.IN("lib")
-C.VN=new H.IN("libraries")
-C.VI=new H.IN("line")
-C.r6=new H.IN("lineNumber")
-C.MW=new H.IN("lineNumbers")
-C.cc=new H.IN("listening")
-C.DY=new H.IN("loading")
-C.Lx=new H.IN("localAddress")
-C.M3=new H.IN("localPort")
-C.wT=new H.IN("mainPort")
-C.pX=new H.IN("message")
-C.VD=new H.IN("mouseOut")
-C.NN=new H.IN("mouseOver")
-C.YS=new H.IN("name")
-C.pu=new H.IN("nameIsEmpty")
-C.BJ=new H.IN("newSpace")
-C.OV=new H.IN("noSuchMethod")
-C.as=new H.IN("objectClass")
-C.zO=new H.IN("objectPool")
-C.vg=new H.IN("oldSpace")
-C.zm=new H.IN("padding")
-C.Ic=new H.IN("pause")
-C.yG=new H.IN("pauseEvent")
-C.uI=new H.IN("pid")
-C.AY=new H.IN("protocol")
-C.I7=new H.IN("readClosed")
-C.GR=new H.IN("refresh")
-C.KX=new H.IN("refreshCoverage")
-C.ja=new H.IN("refreshGC")
-C.MT=new H.IN("registerCallback")
-C.ir=new H.IN("relativeLink")
-C.dx=new H.IN("remoteAddress")
-C.ni=new H.IN("remotePort")
-C.X2=new H.IN("resetAccumulator")
-C.F3=new H.IN("response")
-C.nY=new H.IN("resume")
-C.HD=new H.IN("retainedSize")
-C.iU=new H.IN("retainingPath")
-C.eN=new H.IN("rootLib")
-C.ue=new H.IN("row")
-C.nh=new H.IN("rows")
-C.L2=new H.IN("running")
-C.EA=new H.IN("scripts")
-C.oW=new H.IN("selectExpr")
-C.hd=new H.IN("serviceType")
-C.jM=new H.IN("socketOwner")
-C.Pf=new H.IN("stacktrace")
-C.xA=new H.IN("styleForHits")
-C.k5=new H.IN("subClasses")
-C.Nv=new H.IN("subclass")
-C.Cw=new H.IN("superClass")
-C.hO=new H.IN("tipExclusive")
-C.ei=new H.IN("tipKind")
-C.HK=new H.IN("tipParent")
-C.je=new H.IN("tipTicks")
-C.Ef=new H.IN("tipTime")
-C.Q1=new H.IN("toggleExpand")
-C.ID=new H.IN("toggleExpanded")
-C.z6=new H.IN("tokenPos")
-C.bc=new H.IN("topFrame")
-C.Jl=new H.IN("totalCollectionTimeInSeconds")
-C.Kj=new H.IN("totalSamplesInProfile")
-C.ep=new H.IN("tree")
-C.J2=new H.IN("typeChecksEnabled")
-C.bn=new H.IN("updateLineMode")
-C.mh=new H.IN("uptime")
-C.Fh=new H.IN("url")
-C.LP=new H.IN("used")
-C.jh=new H.IN("v")
-C.Ha=new H.IN("value")
-C.fj=new H.IN("variable")
-C.xw=new H.IN("variables")
-C.zn=new H.IN("version")
-C.Tc=new H.IN("vmName")
-C.Uy=new H.IN("writeClosed")
-C.MI=H.Kx('hx')
-C.hP=H.Kx('uz')
-C.Mf=H.Kx('G1')
-C.q0S=H.Kx('Dg')
-C.Dl=H.Kx('F1')
-C.Jf=H.Kx('Mb')
-C.UJ=H.Kx('oa')
-C.E0=H.Kx('aI')
-C.Y3=H.Kx('CY')
-C.lU=H.Kx('Hl')
-C.kq=H.Kx('Nn')
-C.j4=H.Kx('IW')
-C.dP=H.Kx('vm')
-C.Vx=H.Kx('MJ')
-C.Vh=H.Kx('Pz')
-C.HC=H.Kx('F0')
-C.rR=H.Kx('wN')
-C.yS=H.Kx('G6')
-C.Sb=H.Kx('kn')
-C.FQ=H.Kx('a')
-C.Yc=H.Kx('iP')
-C.EZ=H.Kx('oF')
-C.vw=H.Kx('UK')
-C.Jo=H.Kx('i7')
-C.BL=H.Kx('Nr')
-C.ON=H.Kx('ov')
-C.jR=H.Kx('Be')
-C.al=H.Kx('es')
-C.PT=H.Kx('CX')
-C.iD=H.Kx('Vb')
-C.ce=H.Kx('kK')
-C.dD=H.Kx('av')
-C.FA=H.Kx('Ya')
-C.Th=H.Kx('fI')
-C.tU=H.Kx('L4')
-C.yT=H.Kx('FK')
-C.cK=H.Kx('I5')
-C.jA=H.Kx('Eg')
-C.K4=H.Kx('hV')
-C.Mt=H.Kx('hu')
-C.la=H.Kx('ZX')
-C.CR=H.Kx('CP')
-C.xE=H.Kx('aC')
-C.vu=H.Kx('uw')
-C.ca=H.Kx('Z4')
-C.pJ=H.Kx('Q6')
-C.Yy=H.Kx('uE')
-C.M5=H.Kx('yc')
-C.Yxm=H.Kx('Pg')
-C.il=H.Kx('xI')
-C.lk=H.Kx('mJ')
-C.lp=H.Kx('LU')
-C.oG=H.Kx('ds')
-C.EG=H.Kx('Oz')
-C.nw=H.Kx('eo')
-C.OG=H.Kx('eW')
-C.km=H.Kx('fl')
-C.jV=H.Kx('rF')
-C.Tq=H.Kx('vj')
-C.JW=H.Kx('Ww')
-C.xeh=H.Kx('ve')
-C.CT=H.Kx('St')
-C.wH=H.Kx('zM')
-C.l4=H.Kx('uL')
-C.LT=H.Kx('md')
-C.Wh=H.Kx('H8')
-C.Zj=H.Kx('U1')
-C.FG=H.Kx('qh')
-C.Fe=H.Kx('zt')
-C.NR=H.Kx('nm')
-C.DD=H.Kx('Zn')
-C.qF=H.Kx('mO')
-C.Ey=H.Kx('wM')
-C.pF=H.Kx('WS')
-C.nX=H.Kx('DE')
-C.jw=H.Kx('xc')
-C.NW=H.Kx('ye')
-C.ig=H.Kx('we')
-C.Xv=H.Kx('n5')
-C.XI=H.Kx('cn')
-C.KO=H.Kx('ZP')
-C.Jm=H.Kx('q6')
-C.Wz=H.Kx('pR')
-C.Ep=H.Kx('ou')
-C.tc=H.Kx('Ma')
-C.Io=H.Kx('Qh')
-C.wk=H.Kx('nJ')
-C.te=H.Kx('BS')
-C.ms=H.Kx('Bm')
-C.qJ=H.Kx('pG')
-C.pK=H.Kx('Rk')
-C.lE=H.Kx('DK')
-C.Az=H.Kx('Gk')
-C.GX=H.Kx('c8')
-C.X8=H.Kx('Ti')
-C.Lg=H.Kx('JI')
-C.Ju=H.Kx('Ly')
-C.mq=H.Kx('qk')
-C.XWY=H.Kx('uEY')
-C.oT=H.Kx('VY')
-C.jK=H.Kx('el')
-C.xM=new P.u5F(!1)
-$.libraries_to_load = {}
-$.Vz=1
-$.z7="$cachedFunction"
-$.eb="$cachedInvocation"
-$.OK=0
-$.bf=null
-$.P4=null
-$.Ot=!1
-$.NF=null
-$.TX=null
-$.x7=null
-$.q4=null
-$.vv=null
-$.Bv=null
-$.W5=null
-$.BY=null
-$.oK=null
-$.S6=null
-$.k8=null
-$.X3=C.NU
-$.Km=0
-$.Qz=null
-$.R6=null
-$.RL=!1
-$.Y4=C.IF
-$.xO=0
-$.ax=0
-$.Oo=null
-$.Td=!1
-$.ps=0
-$.xG=null
-$.ok=!1
-$.AC=!1
-$.M6=null
-$.UG=!0
-$.RQ="objects/"
-$.vU=null
-$.xV=null
-$.rK=!1
-$.Au=[C.tq,W.Bo,{},C.MI,Z.hx,{created:Z.CoW},C.hP,E.uz,{created:E.z1},C.Mf,A.G1,{created:A.J8},C.q0S,H.Dg,{"":H.jZN},C.Dl,V.F1,{created:V.JT8},C.Jf,E.Mb,{created:E.RVI},C.UJ,N.oa,{created:N.IB},C.Y3,Q.CY,{created:Q.Sm},C.j4,D.IW,{created:D.zr},C.Vx,X.MJ,{created:X.IfX},C.rR,E.wN,{created:E.ML},C.yS,B.G6,{created:B.Dw},C.Sb,A.kn,{created:A.D2},C.EZ,E.oF,{created:E.UE},C.vw,A.UK,{created:A.IV},C.Jo,D.i7,{created:D.hSW},C.BL,X.Nr,{created:X.Ak},C.ON,T.ov,{created:T.T5i},C.jR,F.Be,{created:F.f9},C.PT,M.CX,{created:M.Dc},C.iD,O.Vb,{created:O.dF},C.ce,X.kK,{created:X.jD},C.dD,E.av,{created:E.Ci},C.FA,A.Ya,{created:A.vn},C.Th,U.fI,{created:U.dI},C.tU,E.L4,{created:E.MB},C.cK,X.I5,{created:X.pn},C.jA,R.Eg,{created:R.fL},C.K4,X.hV,{created:X.zy},C.xE,Z.aC,{created:Z.lW},C.vu,X.uw,{created:X.HI},C.ca,D.Z4,{created:D.d7},C.pJ,E.Q6,{created:E.chF},C.Yy,E.uE,{created:E.P3},C.Yxm,H.Pg,{"":H.aRu},C.il,Q.xI,{created:Q.fd},C.lp,R.LU,{created:R.rA},C.oG,E.ds,{created:E.pI},C.EG,D.Oz,{created:D.RP},C.nw,O.eo,{created:O.l0},C.OG,Q.eW,{created:Q.rt},C.km,A.fl,{created:A.zf},C.Tq,Z.vj,{created:Z.M7},C.JW,A.Ww,{created:A.ZC},C.xeh,W.ve,{},C.CT,D.St,{created:D.N5},C.wH,R.zM,{created:R.cE},C.l4,Z.uL,{created:Z.EE},C.LT,A.md,{created:A.DCi},C.Wh,E.H8,{created:E.ZhX},C.Zj,E.U1,{created:E.hm},C.FG,E.qh,{created:E.Sc},C.NR,K.nm,{created:K.an},C.DD,E.Zn,{created:E.xK},C.qF,E.mO,{created:E.Ch},C.Ey,A.wM,{created:A.GO},C.pF,E.WS,{created:E.jS},C.nX,E.DE,{created:E.oB},C.jw,A.xc,{created:A.G7},C.NW,A.ye,{created:A.Fv},C.ig,H.we,{"":H.ic},C.Xv,E.n5,{created:E.iOo},C.KO,F.ZP,{created:F.Zg},C.Jm,Y.q6,{created:Y.zE},C.Wz,B.pR,{created:B.lu},C.Ep,E.ou,{created:E.tX},C.tc,E.Ma,{created:E.Ii},C.Io,D.Qh,{created:D.Qj},C.wk,L.nJ,{created:L.Rp},C.te,N.BS,{created:N.nz},C.ms,A.Bm,{created:A.AJm},C.pK,D.Rk,{created:D.bZp},C.lE,U.DK,{created:U.v9},C.Az,A.Gk,{created:A.nv},C.X8,U.Ti,{created:U.HP},C.Lg,R.JI,{created:R.U9},C.Ju,K.Ly,{created:K.US},C.mq,L.qk,{created:L.Qtp},C.XWY,W.uEY,{},C.oT,O.VY,{created:O.On},C.jK,U.el,{created:U.oH}]
-I.$lazy($,"globalThis","DX","jk",function(){return function(){return this}()})
-I.$lazy($,"globalWindow","vQ","Vr",function(){return $.jk().window})
-I.$lazy($,"globalWorker","u9","rm",function(){return $.jk().Worker})
-I.$lazy($,"globalPostMessageDefined","Wdn","ey",function(){return $.jk().postMessage!==void 0})
-I.$lazy($,"thisScript","SU","Zt",function(){return H.yl()})
-I.$lazy($,"workerIds","rS","p6",function(){return H.VM(new P.qo(null),[P.KN])})
-I.$lazy($,"noSuchMethodPattern","lm","WD",function(){return H.cM(H.S7({toString:function(){return"$receiver$"}}))})
-I.$lazy($,"notClosurePattern","k1","Up",function(){return H.cM(H.S7({$method$:null,toString:function(){return"$receiver$"}}))})
-I.$lazy($,"nullCallPattern","Re","PH",function(){return H.cM(H.S7(null))})
-I.$lazy($,"nullLiteralCallPattern","fN","D1",function(){return H.cM(function(){var $argumentsExpr$='$arguments$'
-try{null.$method$($argumentsExpr$)}catch(z){return z.message}}())})
-I.$lazy($,"undefinedCallPattern","qi","rx",function(){return H.cM(H.S7(void 0))})
-I.$lazy($,"undefinedLiteralCallPattern","cz","kQ",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","Bi",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","A7","ko",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($,"scheduleImmediateClosure","lI","ej",function(){return P.xg()})
-I.$lazy($,"_nullFuture","bq","mk",function(){return P.Ab(null,null)})
-I.$lazy($,"_toStringVisiting","nM","Ex",function(){return[]})
-I.$lazy($,"webkitEvents","fD","Vp",function(){return P.EF(["animationend","webkitAnimationEnd","animationiteration","webkitAnimationIteration","animationstart","webkitAnimationStart","fullscreenchange","webkitfullscreenchange","fullscreenerror","webkitfullscreenerror","keyadded","webkitkeyadded","keyerror","webkitkeyerror","keymessage","webkitkeymessage","needkey","webkitneedkey","pointerlockchange","webkitpointerlockchange","pointerlockerror","webkitpointerlockerror","resourcetimingbufferfull","webkitresourcetimingbufferfull","transitionend","webkitTransitionEnd","speechchange","webkitSpeechChange"],null,null)})
-I.$lazy($,"context","Lt","Si",function(){return P.ND(function(){return this}())})
-I.$lazy($,"_DART_OBJECT_PROPERTY_NAME","kt","Iq",function(){return init.getIsolateTag("_$dart_dartObject")})
-I.$lazy($,"_DART_CLOSURE_PROPERTY_NAME","Ri","Dp",function(){return init.getIsolateTag("_$dart_dartClosure")})
-I.$lazy($,"_dartProxyCtor","fK","iW",function(){return function DartObject(a){this.o=a}})
-I.$lazy($,"_freeColor","nK","Rl",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.Rw)})
-I.$lazy($,"_logger","y7","S5",function(){return N.QM("Observable.dirtyCheck")})
-I.$lazy($,"_instance","qr","V6",function(){return new L.vH([])})
-I.$lazy($,"_pathRegExp","tC","uC",function(){return new L.YJG().$0()})
-I.$lazy($,"_logger","y7Y","YV",function(){return N.QM("observe.PathObserver")})
-I.$lazy($,"_pathCache","un","aB",function(){return P.L5(null,null,null,P.qU,L.Tv)})
-I.$lazy($,"_polymerSyntax","Kb","Rs",function(){return new A.Li(T.GF(null,C.qY),null)})
-I.$lazy($,"_typesByName","Hi","Ej",function(){return P.L5(null,null,null,P.qU,P.uq)})
-I.$lazy($,"_declarations","ef","RA",function(){return P.L5(null,null,null,P.qU,A.XP)})
-I.$lazy($,"_hasShadowDomPolyfill","jQ","op",function(){return $.Si().Eg("ShadowDOMPolyfill")})
-I.$lazy($,"_ShadowCss","qP","AM",function(){var z=$.Kc()
-return z!=null?J.UQ(z,"ShadowCSS"):null})
-I.$lazy($,"_sheetLog","dz","Es",function(){return N.QM("polymer.stylesheet")})
-I.$lazy($,"_changedMethodQueryOptions","SC","HN",function(){return new A.Wq(!1,!1,!0,C.tq,!1,!0,null,A.F4())})
-I.$lazy($,"_ATTRIBUTES_REGEX","mD","aQ",function(){return new H.VR("\\s|,",H.ol("\\s|,",!1,!0,!1),null,null)})
-I.$lazy($,"_Platform","WF","Kc",function(){return J.UQ($.Si(),"Platform")})
-I.$lazy($,"bindPattern","ZA","iB",function(){return new H.VR("\\{\\{([^{}]*)}}",H.ol("\\{\\{([^{}]*)}}",!1,!0,!1),null,null)})
-I.$lazy($,"_onReady","R9","iF",function(){return H.VM(new P.Zf(P.Dt(null)),[null])})
-I.$lazy($,"_observeLog","i8","p2",function(){return N.QM("polymer.observe")})
-I.$lazy($,"_eventsLog","fo","eS",function(){return N.QM("polymer.events")})
-I.$lazy($,"_unbindLog","Ne","UW",function(){return N.QM("polymer.unbind")})
-I.$lazy($,"_bindLog","xz","QX5",function(){return N.QM("polymer.bind")})
-I.$lazy($,"_PolymerGestures","NB","dg",function(){return J.UQ($.Si(),"PolymerGestures")})
-I.$lazy($,"_polymerElementProto","LW","XX",function(){return new A.Md().$0()})
-I.$lazy($,"_typeHandlers","lq","QL",function(){return P.EF([C.Db,new Z.lP(),C.GX,new Z.Uf(),C.Yc,new Z.Ra(),C.HL,new Z.wJY(),C.yw,new Z.zOQ(),C.CR,new Z.W6o()],null,null)})
-I.$lazy($,"_BINARY_OPERATORS","Af","Rab",function(){return P.EF(["+",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","qM","qL",function(){return P.EF(["+",new K.Raa(),"-",new K.w0(),"!",new K.w5()],null,null)})
-I.$lazy($,"_instance","jC","Pk",function(){return new K.me()})
-I.$lazy($,"_currentIsolateMatcher","mb","vo",function(){return new H.VR("isolates/\\d+",H.ol("isolates/\\d+",!1,!0,!1),null,null)})
-I.$lazy($,"_currentObjectMatcher","d0","rc",function(){return new H.VR("isolates/\\d+/",H.ol("isolates/\\d+/",!1,!0,!1),null,null)})
-I.$lazy($,"objectAccessor","j8","cp",function(){return D.kP()})
-I.$lazy($,"typeInspector","Yv","mX",function(){return D.kP()})
-I.$lazy($,"symbolConverter","qe","b7",function(){return D.kP()})
-I.$lazy($,"_DEFAULT","ac","HT",function(){return new M.vE(null)})
-I.$lazy($,"_checkboxEventType","S8","FF",function(){return new M.Ufa().$0()})
-I.$lazy($,"_contentsOwner","mn","LQ",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_ownerStagingDocument","EW","Lu",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_allTemplatesSelectors","YO","Ze",function(){return"template, "+J.kl(C.z5.gvc(),new M.MdQ()).zV(0,", ")})
-I.$lazy($,"_templateObserver","kY","pT",function(){return new (window.MutationObserver||window.WebKitMutationObserver||window.MozMutationObserver)(H.tR(W.Fs(new M.DOe()),2))})
-I.$lazy($,"_emptyInstance","oL","zl",function(){return new M.lPa().$0()})
-I.$lazy($,"_instanceExtension","AH","It",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_isStagingDocument","Fg","AA",function(){return H.VM(new P.qo(null),[null])})
-I.$lazy($,"_expando","fF","cm",function(){return H.VM(new P.qo("template_binding"),[null])})
+};
+C.JsonCodec_null_null = new P.JsonCodec(null, null);
+C.JsonDecoder_null = new P.JsonDecoder(null);
+C.JsonEncoder_null_null = new P.JsonEncoder(null, null);
+C.Level_FINER_400 = new N.Level("FINER", 400);
+C.Level_FINE_500 = new N.Level("FINE", 500);
+C.Level_INFO_800 = new N.Level("INFO", 800);
+C.Level_SEVERE_1000 = new N.Level("SEVERE", 1000);
+C.Level_WARNING_900 = new N.Level("WARNING", 900);
+C.List_1_6 = Isolate.makeConstantList([1, 6]);
+C.List_6Pr = Isolate.makeConstantList([0, 0, 26624, 1023, 0, 0, 65534, 2047]);
+C.Symbol_keys = new H.Symbol0("keys");
+C.Symbol_values = new H.Symbol0("values");
+C.Symbol_length = new H.Symbol0("length");
+C.Symbol_isEmpty = new H.Symbol0("isEmpty");
+C.Symbol_isNotEmpty = new H.Symbol0("isNotEmpty");
+C.List_8QI = Isolate.makeConstantList([C.Symbol_keys, C.Symbol_values, C.Symbol_length, C.Symbol_isEmpty, C.Symbol_isNotEmpty]);
+C.List_EuK = H.setRuntimeTypeInfo(Isolate.makeConstantList(["+", "-", "*", "/", "%", "^", "==", "!=", ">", "<", ">=", "<=", "||", "&&", "&", "===", "!==", "|"]), [P.String]);
+C.Type_6WV = H.createRuntimeType('ObservableProperty');
+C.List_GGa = Isolate.makeConstantList([C.Type_6WV]);
+C.List_JYB = Isolate.makeConstantList([0, 0, 26624, 1023, 65534, 2047, 65534, 2047]);
+C.List_KIf = Isolate.makeConstantList([0, 0, 26498, 1023, 65534, 34815, 65534, 18431]);
+C.List_Ynd = Isolate.makeConstantList(["==", "!=", "<=", ">=", "||", "&&"]);
+C.List_as_in_this = Isolate.makeConstantList(["as", "in", "this"]);
+C.List_mBx = Isolate.makeConstantList(["rowColor0", "rowColor1", "rowColor2", "rowColor3", "rowColor4", "rowColor5", "rowColor6", "rowColor7", "rowColor8"]);
+C.List_mC8 = Isolate.makeConstantList([43, 45, 42, 47, 33, 38, 37, 60, 61, 62, 63, 94, 124]);
+C.List_nxB = Isolate.makeConstantList([0, 0, 24576, 1023, 65534, 34815, 65534, 18431]);
+C.List_qNA = Isolate.makeConstantList([0, 0, 32754, 11263, 65534, 34815, 65534, 18431]);
+C.List_qg4 = Isolate.makeConstantList([0, 0, 32722, 12287, 65535, 34815, 65534, 18431]);
+C.List_ww8 = Isolate.makeConstantList([40, 41, 91, 93, 123, 125]);
+C.List_05B = Isolate.makeConstantList(["caption", "col", "colgroup", "option", "optgroup", "tbody", "td", "tfoot", "th", "thead", "tr"]);
+C.Map_05eTF = new H.ConstantStringMap(11, {caption: null, col: null, colgroup: null, option: null, optgroup: null, tbody: null, td: null, tfoot: null, th: null, thead: null, tr: null}, C.List_05B);
+C.List_AmO = Isolate.makeConstantList(["domfocusout", "domfocusin", "dommousescroll", "animationend", "animationiteration", "animationstart", "doubleclick", "fullscreenchange", "fullscreenerror", "keyadded", "keyerror", "keymessage", "needkey", "speechchange"]);
+C.Map_AmMJ5 = new H.ConstantStringMap(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.List_AmO);
+C.List_EJ5 = Isolate.makeConstantList(["name", "extends", "constructor", "noscript", "assetpath", "cache-csstext", "attributes"]);
+C.Map_EJn7R = new H.ConstantStringMap(7, {name: 1, extends: 1, constructor: 1, noscript: 1, assetpath: 1, "cache-csstext": 1, attributes: 1}, C.List_EJ5);
+C.List_L0C = Isolate.makeConstantList(["!", ":", ",", ")", "]", "}", "?", "||", "&&", "|", "^", "&", "!=", "==", "!==", "===", ">=", ">", "<=", "<", "+", "-", "%", "/", "*", "(", "[", ".", "{"]);
+C.Map_L0K61 = new H.ConstantStringMap(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.List_L0C);
+C.Map_empty = new H.ConstantStringMap(0, {}, C.List_empty);
+C.List_enumerate = Isolate.makeConstantList(["enumerate"]);
+C.Map_wgEsG = new H.ConstantStringMap(1, {enumerate: K.enumerate$closure()}, C.List_enumerate);
+C.Type_fPs = H.createRuntimeType('HtmlElement');
+C.Type_oGx = H.createRuntimeType('PublishedProperty');
+C.List_JQl = Isolate.makeConstantList([C.Type_oGx]);
+C.QueryOptions_sAl = new A.QueryOptions(true, true, true, C.Type_fPs, false, false, C.List_JQl, null);
+C.Type_oqK = H.createRuntimeType('ObserveProperty');
+C.List_M2f = Isolate.makeConstantList([C.Type_oqK]);
+C.QueryOptions_xw8 = new A.QueryOptions(false, false, true, C.Type_fPs, false, true, C.List_M2f, null);
+C.SocketKind_Internal = new D.SocketKind("Internal");
+C.SocketKind_Listening = new D.SocketKind("Listening");
+C.SocketKind_Normal = new D.SocketKind("Normal");
+C.SocketKind_Pipe = new D.SocketKind("Pipe");
+C.Symbol_address = new H.Symbol0("address");
+C.Symbol_architecture = new H.Symbol0("architecture");
+C.Symbol_assertsEnabled = new H.Symbol0("assertsEnabled");
+C.Symbol_bpt = new H.Symbol0("bpt");
+C.Symbol_buttonClick = new H.Symbol0("buttonClick");
+C.Symbol_bytes = new H.Symbol0("bytes");
+C.Symbol_call = new H.Symbol0("call");
+C.Symbol_capacity = new H.Symbol0("capacity");
+C.Symbol_change = new H.Symbol0("change");
+C.Symbol_changeSort = new H.Symbol0("changeSort");
+C.Symbol_classes = new H.Symbol0("classes");
+C.Symbol_closing = new H.Symbol0("closing");
+C.Symbol_collections = new H.Symbol0("collections");
+C.Symbol_coloring = new H.Symbol0("coloring");
+C.Symbol_columns = new H.Symbol0("columns");
+C.Symbol_current = new H.Symbol0("current");
+C.Symbol_descriptor = new H.Symbol0("descriptor");
+C.Symbol_descriptors = new H.Symbol0("descriptors");
+C.Symbol_doAction = new H.Symbol0("doAction");
+C.Symbol_element = new H.Symbol0("element");
+C.Symbol_entry = new H.Symbol0("entry");
+C.Symbol_eval = new H.Symbol0("eval");
+C.Symbol_evalNow = new H.Symbol0("evalNow");
+C.Symbol_expander = new H.Symbol0("expander");
+C.Symbol_expanderStyle = new H.Symbol0("expanderStyle");
+C.Symbol_external = new H.Symbol0("external");
+C.Symbol_fd = new H.Symbol0("fd");
+C.Symbol_fields = new H.Symbol0("fields");
+C.Symbol_firstTokenPos = new H.Symbol0("firstTokenPos");
+C.Symbol_formatSize = new H.Symbol0("formatSize");
+C.Symbol_formatTime = new H.Symbol0("formatTime");
+C.Symbol_formattedAddress = new H.Symbol0("formattedAddress");
+C.Symbol_formattedAverage = new H.Symbol0("formattedAverage");
+C.Symbol_formattedCollections = new H.Symbol0("formattedCollections");
+C.Symbol_formattedDeoptId = new H.Symbol0("formattedDeoptId");
+C.Symbol_formattedExclusive = new H.Symbol0("formattedExclusive");
+C.Symbol_formattedExclusiveTicks = new H.Symbol0("formattedExclusiveTicks");
+C.Symbol_formattedInclusive = new H.Symbol0("formattedInclusive");
+C.Symbol_formattedInclusiveTicks = new H.Symbol0("formattedInclusiveTicks");
+C.Symbol_formattedLine = new H.Symbol0("formattedLine");
+C.Symbol_formattedTotalCollectionTime = new H.Symbol0("formattedTotalCollectionTime");
+C.Symbol_functions = new H.Symbol0("functions");
+C.Symbol_getColumnLabel = new H.Symbol0("getColumnLabel");
+C.Symbol_goto = new H.Symbol0("goto");
+C.Symbol_gotoLink = new H.Symbol0("gotoLink");
+C.Symbol_hasDescriptors = new H.Symbol0("hasDescriptors");
+C.Symbol_hasDisassembly = new H.Symbol0("hasDisassembly");
+C.Symbol_hasNoAllocations = new H.Symbol0("hasNoAllocations");
+C.Symbol_hashLinkWorkaround = new H.Symbol0("hashLinkWorkaround");
+C.Symbol_hits = new H.Symbol0("hits");
+C.Symbol_hoverText = new H.Symbol0("hoverText");
+C.Symbol_human = new H.Symbol0("human");
+C.Symbol_idle = new H.Symbol0("idle");
+C.Symbol_imp = new H.Symbol0("imp");
+C.Symbol_imports = new H.Symbol0("imports");
+C.Symbol_instruction = new H.Symbol0("instruction");
+C.Symbol_instructions = new H.Symbol0("instructions");
+C.Symbol_interface = new H.Symbol0("interface");
+C.Symbol_interfaces = new H.Symbol0("interfaces");
+C.Symbol_ioEnabled = new H.Symbol0("ioEnabled");
+C.Symbol_isAbstract = new H.Symbol0("isAbstract");
+C.Symbol_isBool = new H.Symbol0("isBool");
+C.Symbol_isComment = new H.Symbol0("isComment");
+C.Symbol_isConst = new H.Symbol0("isConst");
+C.Symbol_isDartCode = new H.Symbol0("isDartCode");
+C.Symbol_isDouble = new H.Symbol0("isDouble");
+C.Symbol_isError = new H.Symbol0("isError");
+C.Symbol_isFinalized = new H.Symbol0("isFinalized");
+C.Symbol_isImplemented = new H.Symbol0("isImplemented");
+C.Symbol_isInstance = new H.Symbol0("isInstance");
+C.Symbol_isInt = new H.Symbol0("isInt");
+C.Symbol_isList = new H.Symbol0("isList");
+C.Symbol_isNull = new H.Symbol0("isNull");
+C.Symbol_isOptimized = new H.Symbol0("isOptimized");
+C.Symbol_isPatch = new H.Symbol0("isPatch");
+C.Symbol_isPipe = new H.Symbol0("isPipe");
+C.Symbol_isString = new H.Symbol0("isString");
+C.Symbol_isType = new H.Symbol0("isType");
+C.Symbol_isUnexpected = new H.Symbol0("isUnexpected");
+C.Symbol_isolates = new H.Symbol0("isolates");
+C.Symbol_jumpTarget = new H.Symbol0("jumpTarget");
+C.Symbol_lastTokenPos = new H.Symbol0("lastTokenPos");
+C.Symbol_lastUpdate = new H.Symbol0("lastUpdate");
+C.Symbol_lib = new H.Symbol0("lib");
+C.Symbol_libraries = new H.Symbol0("libraries");
+C.Symbol_line = new H.Symbol0("line");
+C.Symbol_lineNumber = new H.Symbol0("lineNumber");
+C.Symbol_lineNumbers = new H.Symbol0("lineNumbers");
+C.Symbol_listening = new H.Symbol0("listening");
+C.Symbol_loading = new H.Symbol0("loading");
+C.Symbol_localAddress = new H.Symbol0("localAddress");
+C.Symbol_localPort = new H.Symbol0("localPort");
+C.Symbol_mainPort = new H.Symbol0("mainPort");
+C.Symbol_message = new H.Symbol0("message");
+C.Symbol_mouseOut = new H.Symbol0("mouseOut");
+C.Symbol_mouseOver = new H.Symbol0("mouseOver");
+C.Symbol_name = new H.Symbol0("name");
+C.Symbol_nameIsEmpty = new H.Symbol0("nameIsEmpty");
+C.Symbol_newSpace = new H.Symbol0("newSpace");
+C.Symbol_noSuchMethod = new H.Symbol0("noSuchMethod");
+C.Symbol_objectClass = new H.Symbol0("objectClass");
+C.Symbol_objectPool = new H.Symbol0("objectPool");
+C.Symbol_oldSpace = new H.Symbol0("oldSpace");
+C.Symbol_padding = new H.Symbol0("padding");
+C.Symbol_pause = new H.Symbol0("pause");
+C.Symbol_pauseEvent = new H.Symbol0("pauseEvent");
+C.Symbol_pid = new H.Symbol0("pid");
+C.Symbol_protocol = new H.Symbol0("protocol");
+C.Symbol_reachable = new H.Symbol0("reachable");
+C.Symbol_readClosed = new H.Symbol0("readClosed");
+C.Symbol_refresh = new H.Symbol0("refresh");
+C.Symbol_refreshCoverage = new H.Symbol0("refreshCoverage");
+C.Symbol_refreshGC = new H.Symbol0("refreshGC");
+C.Symbol_registerCallback = new H.Symbol0("registerCallback");
+C.Symbol_relativeLink = new H.Symbol0("relativeLink");
+C.Symbol_remoteAddress = new H.Symbol0("remoteAddress");
+C.Symbol_remotePort = new H.Symbol0("remotePort");
+C.Symbol_resetAccumulator = new H.Symbol0("resetAccumulator");
+C.Symbol_response = new H.Symbol0("response");
+C.Symbol_resume = new H.Symbol0("resume");
+C.Symbol_retainedSize = new H.Symbol0("retainedSize");
+C.Symbol_retainingPath = new H.Symbol0("retainingPath");
+C.Symbol_rootLib = new H.Symbol0("rootLib");
+C.Symbol_row = new H.Symbol0("row");
+C.Symbol_rows = new H.Symbol0("rows");
+C.Symbol_running = new H.Symbol0("running");
+C.Symbol_scripts = new H.Symbol0("scripts");
+C.Symbol_selectExpr = new H.Symbol0("selectExpr");
+C.Symbol_serviceType = new H.Symbol0("serviceType");
+C.Symbol_socketOwner = new H.Symbol0("socketOwner");
+C.Symbol_stacktrace = new H.Symbol0("stacktrace");
+C.Symbol_styleForHits = new H.Symbol0("styleForHits");
+C.Symbol_subClasses = new H.Symbol0("subClasses");
+C.Symbol_subclass = new H.Symbol0("subclass");
+C.Symbol_superClass = new H.Symbol0("superClass");
+C.Symbol_tipExclusive = new H.Symbol0("tipExclusive");
+C.Symbol_tipKind = new H.Symbol0("tipKind");
+C.Symbol_tipParent = new H.Symbol0("tipParent");
+C.Symbol_tipTicks = new H.Symbol0("tipTicks");
+C.Symbol_tipTime = new H.Symbol0("tipTime");
+C.Symbol_toggleExpand = new H.Symbol0("toggleExpand");
+C.Symbol_toggleExpanded = new H.Symbol0("toggleExpanded");
+C.Symbol_tokenPos = new H.Symbol0("tokenPos");
+C.Symbol_topFrame = new H.Symbol0("topFrame");
+C.Symbol_totalCollectionTimeInSeconds = new H.Symbol0("totalCollectionTimeInSeconds");
+C.Symbol_totalSamplesInProfile = new H.Symbol0("totalSamplesInProfile");
+C.Symbol_tree = new H.Symbol0("tree");
+C.Symbol_typeChecksEnabled = new H.Symbol0("typeChecksEnabled");
+C.Symbol_updateLineMode = new H.Symbol0("updateLineMode");
+C.Symbol_uptime = new H.Symbol0("uptime");
+C.Symbol_url = new H.Symbol0("url");
+C.Symbol_used = new H.Symbol0("used");
+C.Symbol_v = new H.Symbol0("v");
+C.Symbol_value = new H.Symbol0("value");
+C.Symbol_variable = new H.Symbol0("variable");
+C.Symbol_variables = new H.Symbol0("variables");
+C.Symbol_version = new H.Symbol0("version");
+C.Symbol_vmName = new H.Symbol0("vmName");
+C.Symbol_writeClosed = new H.Symbol0("writeClosed");
+C.Type_0e9 = H.createRuntimeType('ScriptViewElement');
+C.Type_2jN = H.createRuntimeType('CodeRefElement');
+C.Type_4IJ = H.createRuntimeType('FieldViewElement');
+C.Type_4m4 = H.createRuntimeType('IOSocketListViewElement');
+C.Type_61d = H.createRuntimeType('IOSocketViewElement');
+C.Type_6L0 = H.createRuntimeType('Uint8List');
+C.Type_7g3 = H.createRuntimeType('FlagItemElement');
+C.Type_8Gl = H.createRuntimeType('IsolateSharedSummaryElement');
+C.Type_8KD = H.createRuntimeType('IOProcessListViewElement');
+C.Type_8cK = H.createRuntimeType('IORandomAccessFileViewElement');
+C.Type_8eb = H.createRuntimeType('EvalBoxElement');
+C.Type_9ur = H.createRuntimeType('NavControlElement');
+C.Type_AD4 = H.createRuntimeType('NavMenuItemElement');
+C.Type_AHF = H.createRuntimeType('IOProcessViewElement');
+C.Type_AHF0 = H.createRuntimeType('NativeTypedArray');
+C.Type_Art = H.createRuntimeType('Float32List');
+C.Type_AyI = H.createRuntimeType('IOWebSocketViewElement');
+C.Type_Aym = H.createRuntimeType('CodeViewElement');
+C.Type_B8J = H.createRuntimeType('IOSocketRefElement');
+C.Type_C7R = H.createRuntimeType('TopNavMenuElement');
+C.Type_CAk = H.createRuntimeType('Uint16List');
+C.Type_E0k = H.createRuntimeType('VMViewElement');
+C.Type_ECh = H.createRuntimeType('IsolateLocationElement');
+C.Type_EOZ = H.createRuntimeType('_M1');
+C.Type_EQs = H.createRuntimeType('GlobalEventHandlers');
+C.Type_ES1 = H.createRuntimeType('IsolateRefElement');
+C.Type_EVD = H.createRuntimeType('InstanceRefElement');
+C.Type_Eue = H.createRuntimeType('VMRefElement');
+C.Type_FKd = H.createRuntimeType('ServiceErrorViewElement');
+C.Type_GNh = H.createRuntimeType('_M0');
+C.Type_HqF = H.createRuntimeType('Object');
+C.Type_I2I = H.createRuntimeType('PolymerElement');
+C.Type_IuH = H.createRuntimeType('IORandomAccessFileListViewElement');
+C.Type_JFX = H.createRuntimeType('ClassNavMenuElement');
+C.Type_Jcu = H.createRuntimeType('StackFrameElement');
+C.Type_JmU = H.createRuntimeType('IORefElement');
+C.Type_KMd = H.createRuntimeType('NavMenuElement');
+C.Type_Kyy = H.createRuntimeType('JsonViewElement');
+C.Type_L9j = H.createRuntimeType('IOHttpServerConnectionViewElement');
+C.Type_LV6 = H.createRuntimeType('HeapProfileElement');
+C.Type_M6L = H.createRuntimeType('IOHttpServerViewElement');
+C.Type_MUU = H.createRuntimeType('IOWebSocketRefElement');
+C.Type_Mu6 = H.createRuntimeType('ServiceObjectViewElement');
+C.Type_NlB = H.createRuntimeType('NativeTypedArrayOfDouble');
+C.Type_Npb = H.createRuntimeType('ErrorViewElement');
+C.Type_O5a = H.createRuntimeType('ClassViewElement');
+C.Type_ON8 = H.createRuntimeType('BreakpointListElement');
+C.Type_QuW = H.createRuntimeType('Uint8ClampedList');
+C.Type_QyU = H.createRuntimeType('WindowEventHandlers');
+C.Type_SoB = H.createRuntimeType('HeapMapElement');
+C.Type_Sxn = H.createRuntimeType('NavRefreshElement');
+C.Type_TEn = H.createRuntimeType('IOViewElement');
+C.Type_UJT = H.createRuntimeType('ServiceRefElement');
+C.Type_UoK = H.createRuntimeType('Int16List');
+C.Type_XXD = H.createRuntimeType('JSObject');
+C.Type_YgH = H.createRuntimeType('ObservatoryApplicationElement');
+C.Type_ZKG = H.createRuntimeType('IsolateViewElement');
+C.Type_a1Y = H.createRuntimeType('ScriptInsetElement');
+C.Type_aAD = H.createRuntimeType('IsolateRunStateElement');
+C.Type_bDN = H.createRuntimeType('FunctionViewElement');
+C.Type_cOY = H.createRuntimeType('IsolateProfileElement');
+C.Type_ckn = H.createRuntimeType('Float64List');
+C.Type_cop = H.createRuntimeType('CurlyBlockElement');
+C.Type_dRp = H.createRuntimeType('ClassTreeElement');
+C.Type_dTZ = H.createRuntimeType('Int32List');
+C.Type_dVs = H.createRuntimeType('DateTime');
+C.Type_eZO = H.createRuntimeType('Null');
+C.Type_f1j = H.createRuntimeType('FlagListElement');
+C.Type_gg4 = H.createRuntimeType('IOWebSocketListViewElement');
+C.Type_gqS = H.createRuntimeType('InstanceViewElement');
+C.Type_i7j = H.createRuntimeType('IOHttpServerRefElement');
+C.Type_iL9 = H.createRuntimeType('IsolateSummaryElement');
+C.Type_irB = H.createRuntimeType('Uint32List');
+C.Type_kA7 = H.createRuntimeType('ActionLinkElement');
+C.Type_kuc = H.createRuntimeType('SlidingCheckboxElement');
+C.Type_mWg = H.createRuntimeType('IORandomAccessFileRefElement');
+C.Type_mp3 = H.createRuntimeType('Int8List');
+C.Type_mpV = H.createRuntimeType('LibraryRefElement');
+C.Type_nV5 = H.createRuntimeType('NavBarElement');
+C.Type_nVV = H.createRuntimeType('StackTraceElement');
+C.Type_oGP = H.createRuntimeType('ByteData');
+C.Type_ohY = H.createRuntimeType('FieldRefElement');
+C.Type_oyU = H.createRuntimeType('_M2');
+C.Type_p2P = H.createRuntimeType('EvalLinkElement');
+C.Type_qMZ = H.createRuntimeType('IOProcessRefElement');
+C.Type_ql8 = H.createRuntimeType('ClassRefElement');
+C.Type_qph = H.createRuntimeType('LibraryViewElement');
+C.Type_qq1 = H.createRuntimeType('$double');
+C.Type_s2l = H.createRuntimeType('LibraryNavMenuElement');
+C.Type_s8b = H.createRuntimeType('AutoBindingElement');
+C.Type_sRP = H.createRuntimeType('ObservatoryElement');
+C.Type_uIL = H.createRuntimeType('IOHttpServerConnectionRefElement');
+C.Type_wAg = H.createRuntimeType('ByteBuffer');
+C.Type_wBh = H.createRuntimeType('ScriptRefElement');
+C.Type_wOW = H.createRuntimeType('NativeTypedArrayOfInt');
+C.Type_wT1 = H.createRuntimeType('IsolateCounterChartElement');
+C.Type_wgH = H.createRuntimeType('FunctionRefElement');
+C.Type_wsa = H.createRuntimeType('IsolateNavMenuElement');
+C.Type_xM7 = H.createRuntimeType('num');
+C.Type_y1j = H.createRuntimeType('ServiceExceptionViewElement');
+C.Type_yvP = H.createRuntimeType('IOHttpServerListViewElement');
+C.Utf8Codec_false = new P.Utf8Codec(false);
+$.libraries_to_load = {};
+$.RawReceivePortImpl__nextFreeId = 1;
+$.Primitives_mirrorFunctionCacheName = "$cachedFunction";
+$.Primitives_mirrorInvokeCacheName = "$cachedInvocation";
+$.Closure_functionCounter = 0;
+$.BoundClosure_selfFieldNameCache = null;
+$.BoundClosure_receiverFieldNameCache = null;
+$.RuntimeFunctionType_inAssert = false;
+$.getTagFunction = null;
+$.alternateTagFunction = null;
+$.prototypeForTagFunction = null;
+$.dispatchRecordsForInstanceTags = null;
+$.interceptorsForUncacheableTags = null;
+$.initNativeDispatchFlag = null;
+$.location = null;
+$.GoogleChart__api = null;
+$.printToZone = null;
+$._nextCallback = null;
+$._lastCallback = null;
+$.Zone__current = C.C__RootZone;
+$.Expando__keyCount = 0;
+$.Device__isOpera = null;
+$.Device__isWebKit = null;
+$.hierarchicalLoggingEnabled = false;
+$._rootLevel = C.Level_INFO_800;
+$.LogRecord__nextNumber = 0;
+$._allObservablesCount = 0;
+$._allObservables = null;
+$._delivering = false;
+$._Observer__nextBirthId = 0;
+$._ObservedSet__lastSet = null;
+$._deployMode = false;
+$._startPolymerCalled = false;
+$.initializers = null;
+$.deployMode = true;
+$.ServiceMap_objectIdRingPrefix = "objects/";
+$.TemplateBindExtension__initStyles = null;
+$.TemplateBindExtension__initBaseUriWorkaround = null;
+$.enableBindingsReflection = false;
+$.mapTypeToInterceptor = [C.Type_fPs, W.HtmlElement, {}, C.Type_0e9, U.ScriptViewElement, {created: U.ScriptViewElement$created}, C.Type_2jN, O.CodeRefElement, {created: O.CodeRefElement$created}, C.Type_4IJ, A.FieldViewElement, {created: A.FieldViewElement$created}, C.Type_4m4, E.IOSocketListViewElement, {created: E.IOSocketListViewElement$created}, C.Type_61d, E.IOSocketViewElement, {created: E.IOSocketViewElement$created}, C.Type_7g3, X.FlagItemElement, {created: X.FlagItemElement$created}, C.Type_8Gl, D.IsolateSharedSummaryElement, {created: D.IsolateSharedSummaryElement$created}, C.Type_8KD, E.IOProcessListViewElement, {created: E.IOProcessListViewElement$created}, C.Type_8cK, E.IORandomAccessFileViewElement, {created: E.IORandomAccessFileViewElement$created}, C.Type_8eb, L.EvalBoxElement, {created: L.EvalBoxElement$created}, C.Type_9ur, A.NavControlElement, {created: A.NavControlElement$created}, C.Type_AD4, A.NavMenuItemElement, {created: A.NavMenuItemElement$created}, C.Type_AHF, E.IOProcessViewElement, {created: E.IOProcessViewElement$created}, C.Type_AHF0, H.NativeTypedArray, {"": H.NativeTypedArray$}, C.Type_AyI, E.IOWebSocketViewElement, {created: E.IOWebSocketViewElement$created}, C.Type_Aym, F.CodeViewElement, {created: F.CodeViewElement$created}, C.Type_B8J, E.IOSocketRefElement, {created: E.IOSocketRefElement$created}, C.Type_C7R, A.TopNavMenuElement, {created: A.TopNavMenuElement$created}, C.Type_E0k, U.VMViewElement, {created: U.VMViewElement$created}, C.Type_ECh, D.IsolateLocationElement, {created: D.IsolateLocationElement$created}, C.Type_EQs, W.GlobalEventHandlers, {}, C.Type_ES1, N.IsolateRefElement, {created: N.IsolateRefElement$created}, C.Type_EVD, B.InstanceRefElement, {created: B.InstanceRefElement$created}, C.Type_Eue, X.VMRefElement, {created: X.VMRefElement$created}, C.Type_FKd, R.ServiceErrorViewElement, {created: R.ServiceErrorViewElement$created}, C.Type_I2I, A.PolymerElement, {created: A.PolymerElement$created}, C.Type_IuH, E.IORandomAccessFileListViewElement, {created: E.IORandomAccessFileListViewElement$created}, C.Type_JFX, A.ClassNavMenuElement, {created: A.ClassNavMenuElement$created}, C.Type_Jcu, K.StackFrameElement, {created: K.StackFrameElement$created}, C.Type_JmU, E.IORefElement, {created: E.IORefElement$created}, C.Type_KMd, A.NavMenuElement, {created: A.NavMenuElement$created}, C.Type_Kyy, Z.JsonViewElement, {created: Z.JsonViewElement$created}, C.Type_L9j, E.IOHttpServerConnectionViewElement, {created: E.IOHttpServerConnectionViewElement$created}, C.Type_LV6, K.HeapProfileElement, {created: K.HeapProfileElement$created}, C.Type_M6L, E.IOHttpServerViewElement, {created: E.IOHttpServerViewElement$created}, C.Type_MUU, E.IOWebSocketRefElement, {created: E.IOWebSocketRefElement$created}, C.Type_Mu6, U.ServiceObjectViewElement, {created: U.ServiceObjectViewElement$created}, C.Type_NlB, H.NativeTypedArrayOfDouble, {"": H.NativeTypedArrayOfDouble$}, C.Type_Npb, F.ErrorViewElement, {created: F.ErrorViewElement$created}, C.Type_O5a, Z.ClassViewElement, {created: Z.ClassViewElement$created}, C.Type_ON8, B.BreakpointListElement, {created: B.BreakpointListElement$created}, C.Type_QyU, W.WindowEventHandlers, {}, C.Type_SoB, O.HeapMapElement, {created: O.HeapMapElement$created}, C.Type_Sxn, A.NavRefreshElement, {created: A.NavRefreshElement$created}, C.Type_TEn, E.IOViewElement, {created: E.IOViewElement$created}, C.Type_UJT, Q.ServiceRefElement, {created: Q.ServiceRefElement$created}, C.Type_YgH, V.ObservatoryApplicationElement, {created: V.ObservatoryApplicationElement$created}, C.Type_ZKG, L.IsolateViewElement, {created: L.IsolateViewElement$created}, C.Type_a1Y, T.ScriptInsetElement, {created: T.ScriptInsetElement$created}, C.Type_aAD, D.IsolateRunStateElement, {created: D.IsolateRunStateElement$created}, C.Type_bDN, N.FunctionViewElement, {created: N.FunctionViewElement$created}, C.Type_cOY, X.IsolateProfileElement, {created: X.IsolateProfileElement$created}, C.Type_cop, R.CurlyBlockElement, {created: R.CurlyBlockElement$created}, C.Type_dRp, O.ClassTreeElement, {created: O.ClassTreeElement$created}, C.Type_f1j, X.FlagListElement, {created: X.FlagListElement$created}, C.Type_gg4, E.IOWebSocketListViewElement, {created: E.IOWebSocketListViewElement$created}, C.Type_gqS, Z.InstanceViewElement, {created: Z.InstanceViewElement$created}, C.Type_i7j, E.IOHttpServerRefElement, {created: E.IOHttpServerRefElement$created}, C.Type_iL9, D.IsolateSummaryElement, {created: D.IsolateSummaryElement$created}, C.Type_kA7, X.ActionLinkElement, {created: X.ActionLinkElement$created}, C.Type_kuc, Q.SlidingCheckboxElement, {created: Q.SlidingCheckboxElement$created}, C.Type_mWg, E.IORandomAccessFileRefElement, {created: E.IORandomAccessFileRefElement$created}, C.Type_mpV, R.LibraryRefElement, {created: R.LibraryRefElement$created}, C.Type_nV5, A.NavBarElement, {created: A.NavBarElement$created}, C.Type_nVV, X.StackTraceElement, {created: X.StackTraceElement$created}, C.Type_ohY, D.FieldRefElement, {created: D.FieldRefElement$created}, C.Type_p2P, R.EvalLinkElement, {created: R.EvalLinkElement$created}, C.Type_qMZ, E.IOProcessRefElement, {created: E.IOProcessRefElement$created}, C.Type_ql8, Q.ClassRefElement, {created: Q.ClassRefElement$created}, C.Type_qph, M.LibraryViewElement, {created: M.LibraryViewElement$created}, C.Type_s2l, A.LibraryNavMenuElement, {created: A.LibraryNavMenuElement$created}, C.Type_s8b, Y.AutoBindingElement, {created: Y.AutoBindingElement$created}, C.Type_sRP, Z.ObservatoryElement, {created: Z.ObservatoryElement$created}, C.Type_uIL, E.IOHttpServerConnectionRefElement, {created: E.IOHttpServerConnectionRefElement$created}, C.Type_wBh, A.ScriptRefElement, {created: A.ScriptRefElement$created}, C.Type_wOW, H.NativeTypedArrayOfInt, {"": H.NativeTypedArrayOfInt$}, C.Type_wT1, D.IsolateCounterChartElement, {created: D.IsolateCounterChartElement$created}, C.Type_wgH, U.FunctionRefElement, {created: U.FunctionRefElement$created}, C.Type_wsa, A.IsolateNavMenuElement, {created: A.IsolateNavMenuElement$created}, C.Type_y1j, D.ServiceExceptionViewElement, {created: D.ServiceExceptionViewElement$created}, C.Type_yvP, E.IOHttpServerListViewElement, {created: E.IOHttpServerListViewElement$created}];
+Isolate.$lazy($, "globalThis", "globalThis", "get$globalThis", function() {
+  return function() {
+    return this;
+  }();
+});
+Isolate.$lazy($, "globalWindow", "globalWindow", "get$globalWindow", function() {
+  return $.get$globalThis().window;
+});
+Isolate.$lazy($, "globalWorker", "globalWorker", "get$globalWorker", function() {
+  return $.get$globalThis().Worker;
+});
+Isolate.$lazy($, "globalPostMessageDefined", "globalPostMessageDefined", "get$globalPostMessageDefined", function() {
+  return $.get$globalThis().postMessage !== void 0;
+});
+Isolate.$lazy($, "thisScript", "IsolateNatives_thisScript", "get$IsolateNatives_thisScript", function() {
+  return H.IsolateNatives_computeThisScript();
+});
+Isolate.$lazy($, "workerIds", "IsolateNatives_workerIds", "get$IsolateNatives_workerIds", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [P.$int]);
+});
+Isolate.$lazy($, "noSuchMethodPattern", "TypeErrorDecoder_noSuchMethodPattern", "get$TypeErrorDecoder_noSuchMethodPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "notClosurePattern", "TypeErrorDecoder_notClosurePattern", "get$TypeErrorDecoder_notClosurePattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn({$method$: null, toString: function() {
+      return "$receiver$";
+    }}));
+});
+Isolate.$lazy($, "nullCallPattern", "TypeErrorDecoder_nullCallPattern", "get$TypeErrorDecoder_nullCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralCallPattern", "TypeErrorDecoder_nullLiteralCallPattern", "get$TypeErrorDecoder_nullLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      null.$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
 
-init.functionAliases={Sa:209}
-init.metadata=["sender","e","event","uri","onError",{func:"pd",args:[P.qU]},"closure","isolate","numberOfArguments","arg1","arg2","arg3","arg4",{func:"aB",args:[null]},"_",{func:"Pt",ret:P.qU,args:[P.KN]},"bytes",{func:"RJ",ret:P.qU,args:[null]},{func:"kl",void:true},{func:"n9",void:true,args:[{func:"kl",void:true}]},{func:"a0",void:true,args:[null]},"value",{func:"Mx",void:true,args:[null],opt:[P.mE]},,"error","stackTrace",{func:"pA",void:true,args:[P.dl,P.AN,P.dl,null,P.mE]},"self","parent","zone",{func:"QN",args:[P.dl,P.AN,P.dl,{func:"NT"}]},"f",{func:"wD",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]},null]},"arg",{func:"ta",args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]},null,null]},{func:"HQ",ret:{func:"NT"},args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"v7",ret:{func:"aB",args:[null]},args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"Gt",ret:{func:"bh",args:[null,null]},args:[P.dl,P.AN,P.dl,{func:"bh",args:[null,null]}]},{func:"iV",void:true,args:[P.dl,P.AN,P.dl,{func:"NT"}]},{func:"zo",ret:P.Xa,args:[P.dl,P.AN,P.dl,P.a6,{func:"kl",void:true}]},"duration","callback",{func:"Xg",void:true,args:[P.dl,P.AN,P.dl,P.qU]},{func:"kx",void:true,args:[P.qU]},{func:"Jj",ret:P.dl,args:[P.dl,P.AN,P.dl,P.Ob,P.Z0]},{func:"Gl",ret:P.a2,args:[null,null]},"a","b",{func:"bX",ret:P.KN,args:[null]},{func:"uJ",ret:P.a,args:[null]},"object",{func:"P2",ret:P.KN,args:[P.Rz,P.Rz]},{func:"zv",ret:P.a2,args:[P.a,P.a]},{func:"ZY",ret:P.KN,args:[P.a]},"receiver",{func:"wI",args:[null,null,null,null]},"name","oldValue","newValue","captureThis","arguments","o",{func:"VH",ret:P.a2,args:[P.GD]},"symbol","v","x",{func:"qq",ret:[P.QV,K.Aep],args:[P.QV]},"iterable","invocation",{func:"NT"},{func:"rz",args:[P.EH]},"code","msg","errorMessage","message","key","val",{func:"bh",args:[null,null]},{func:"Za",args:[P.qU,null]},{func:"TS",args:[null,P.qU]},{func:"ZT",void:true,args:[null,null,null]},"c","obj","i",{func:"F3",void:true,args:[D.N7]},{func:"GJ",void:true,args:[D.EP]},"exception",{func:"f4",void:true,args:[W.f5]},{func:"HE",ret:P.KN,args:[P.KN,P.KN]},"column","done",{func:"Df",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:"aK",ret:[P.b8,D.af],args:[null]},"dummy",{func:"Q5",args:[D.vO]},{func:"Np",void:true,args:[W.ea,null,W.KV]},{func:"VI",args:[D.kx]},"data",{func:"uu",void:true,args:[P.a],opt:[P.mE]},"theError","theStackTrace",{func:"jK",args:[P.a]},{func:"cq",void:true,opt:[null]},{func:"Hp",args:[null],opt:[null]},{func:"Uf",ret:P.a2},"ignored","convert","element",{func:"zk",args:[P.a2]},{func:"c3",void:true,opt:[P.b8]},"resumeSignal",{func:"ha",args:[null,P.mE]},{func:"N5",void:true,args:[null,P.mE]},"each","k",{func:"lv",args:[P.GD,null]},{func:"nY",ret:P.KN,args:[P.qU]},{func:"ZhR",ret:P.CP,args:[P.qU]},{func:"cd",ret:P.a2,args:[P.KN]},{func:"Dt",ret:P.KN,args:[P.KN]},{func:"wJ",ret:P.KN,args:[null,null]},"byteString",{func:"QO",void:true,args:[W.AjY]},"result",{func:"jH",args:[D.af]},{func:"Rb",ret:O.Hz},"response","st",{func:"D8",void:true,args:[D.vO]},"newProfile",{func:"Yi",ret:P.qU,args:[P.a2]},"newSpace",{func:"Z5",args:[P.KN]},{func:"MG",args:[P.KN,null]},{func:"xD",ret:P.QV,args:[{func:"pd",args:[P.qU]}]},{func:"Qd",ret:P.QV,args:[{func:"uW2",ret:P.QV,args:[P.qU]}]},"s",{func:"S0",void:true,args:[P.a2,null]},"expand","m",{func:"KDY",ret:P.b8,args:[null]},"tagProfile","rec",{func:"IM",args:[N.HV]},{func:"Fe",void:true,args:[W.AjY,null,W.h4]},{func:"If",ret:P.qU,args:[P.qU]},"url",{func:"nxg",ret:P.qU,args:[P.CP]},"time",{func:"xc",ret:P.a2,args:[P.qU]},"type",{func:"Aa",args:[P.AN,P.dl]},{func:"h2",args:[P.dl,P.AN,P.dl,{func:"aB",args:[null]}]},{func:"DF",void:true,args:[P.a]},"records",{func:"qk",args:[L.Tv,null]},"model","node","oneTime",{func:"oYt",args:[null,null,null]},{func:"rd",void:true,args:[P.qU,P.qU]},{func:"aA",void:true,args:[P.WO,P.Z0,P.WO]},{func:"K7",void:true,args:[[P.WO,T.yj]]},{func:"QY",void:true,args:[[P.QV,A.Ap]]},"changes","jsElem","extendee",{func:"QP",args:[null,P.qU,P.qU]},{func:"tw",args:[null,W.KV,P.a2]},{func:"MJ",args:[null],named:{skipChanges:P.a2}},!1,"skipChanges",{func:"ZD",args:[[P.WO,T.yj]]},{func:"Cx",ret:U.zX,args:[U.hw,U.hw]},{func:"Qc",args:[U.hw]},"hits","map",{func:"JC",args:[V.qC]},"id",{func:"rl",ret:P.b8},"coverage",{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","scriptCoverage","timer",{func:"I6a",ret:P.qU},{func:"xA",ret:P.qU,args:[D.kx]},{func:"qQ",void:true,args:[D.vx]},"script","func","request",{func:"c3A",args:[W.fJ]},"details","ref",{func:"PzC",void:true,args:[[P.WO,G.DA]]},"splices",{func:"nl",void:true,args:[W.Aj]},{func:"en",ret:P.qU,args:[P.a]},{func:"i8i",ret:P.qU,args:[[P.WO,P.a]]},"values",{func:"VT",ret:P.b8,args:[P.qU]},];$=null
-I = I.$finishIsolateConstructor(I)
-$=new I()
-function convertToFastObject(a){function MyClass(){}MyClass.prototype=a
-new MyClass()
-return a}
-A = convertToFastObject(A)
-B = convertToFastObject(B)
-C = convertToFastObject(C)
-D = convertToFastObject(D)
-E = convertToFastObject(E)
-F = convertToFastObject(F)
-G = convertToFastObject(G)
-H = convertToFastObject(H)
-J = convertToFastObject(J)
-K = convertToFastObject(K)
-L = convertToFastObject(L)
-M = convertToFastObject(M)
-N = convertToFastObject(N)
-O = convertToFastObject(O)
-P = convertToFastObject(P)
-Q = convertToFastObject(Q)
-R = convertToFastObject(R)
-S = convertToFastObject(S)
-T = convertToFastObject(T)
-U = convertToFastObject(U)
-V = convertToFastObject(V)
-W = convertToFastObject(W)
-X = convertToFastObject(X)
-Y = convertToFastObject(Y)
-Z = convertToFastObject(Z)
-!function(){function intern(a){var u={}
-u[a]=1
-return Object.keys(convertToFastObject(u))[0]}init.getIsolateTag=function(a){return intern("___dart_"+a+init.isolateTag)}
-var z="___dart_isolate_tags_"
-var y=Object[z]||(Object[z]=Object.create(null))
-var x="_ZxYxX"
-for(var w=0;;w++){var v=intern(x+"_"+w+"_")
-if(!(v in y)){y[v]=1
-init.isolateTag=v
-break}}}()
-init.dispatchPropertyName=init.getIsolateTag("dispatch_record")
-;(function(a){if(typeof document==="undefined"){a(null)
-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.V7(),b)},[])}else{(function(b){H.wW(E.V7(),b)})([])}})
-function init(){I.p={}
-function generateAccessor(a,b,c){var y=a.split("-")
-var x=y[0]
-var w=x.length
-var v=x.charCodeAt(w-1)
-var u
-if(y.length>1)u=true
-else u=false
-v=v>=60&&v<=64?v-59:v>=123&&v<=126?v-117:v>=37&&v<=43?v-27:0
-if(v){var t=v&3
-var s=v>>2
-var r=x=x.substring(0,w-1)
-var q=x.indexOf(":")
-if(q>0){r=x.substring(0,q)
-x=x.substring(q+1)}if(t){var p=t&2?"r":""
-var o=t&1?"this":"r"
-var n="return "+o+"."+x
-var m=c+".prototype.g"+r+"="
-var l="function("+p+"){"+n+"}"
-if(u)b.push(m+"$reflectable("+l+");\n")
-else b.push(m+l+";\n")}if(s){var p=s&2?"r,v":"v"
-var o=s&1?"this":"r"
-var n=o+"."+x+"=v"
-var m=c+".prototype.s"+r+"="
-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+"("
-var w=""
-for(var v=0;v<c.length;v++){if(v!=0)x+=", "
-var u=generateAccessor(c[v],y,b)
-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+="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("")
-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
-a.prototype=x
-return x}}()
-I.$finishClasses=function(a,b,c){var y={}
-if(!init.allClasses)init.allClasses={}
-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]
-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 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={}
-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={}
-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.ag(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
-Isolate.prototype.constructor=Isolate
-Isolate.p=y
-Isolate.$finishClasses=a.$finishClasses
-Isolate.uL=a.uL
-return Isolate}}
+  }());
+});
+Isolate.$lazy($, "undefinedCallPattern", "TypeErrorDecoder_undefinedCallPattern", "get$TypeErrorDecoder_undefinedCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokeCallErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralCallPattern", "TypeErrorDecoder_undefinedLiteralCallPattern", "get$TypeErrorDecoder_undefinedLiteralCallPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    var $argumentsExpr$ = '$arguments$';
+    try {
+      (void 0).$method$($argumentsExpr$);
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "nullPropertyPattern", "TypeErrorDecoder_nullPropertyPattern", "get$TypeErrorDecoder_nullPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(null));
+});
+Isolate.$lazy($, "nullLiteralPropertyPattern", "TypeErrorDecoder_nullLiteralPropertyPattern", "get$TypeErrorDecoder_nullLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      null.$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "undefinedPropertyPattern", "TypeErrorDecoder_undefinedPropertyPattern", "get$TypeErrorDecoder_undefinedPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(H.TypeErrorDecoder_provokePropertyErrorOn(void 0));
+});
+Isolate.$lazy($, "undefinedLiteralPropertyPattern", "TypeErrorDecoder_undefinedLiteralPropertyPattern", "get$TypeErrorDecoder_undefinedLiteralPropertyPattern", function() {
+  return H.TypeErrorDecoder_extractPattern(function() {
+    try {
+      (void 0).$method$;
+    } catch (e) {
+      return e.message;
+    }
+
+  }());
+});
+Isolate.$lazy($, "_completer", "GoogleChart__completer", "get$GoogleChart__completer", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "scheduleImmediateClosure", "_AsyncRun_scheduleImmediateClosure", "get$_AsyncRun_scheduleImmediateClosure", function() {
+  return P._AsyncRun__initializeScheduleImmediate();
+});
+Isolate.$lazy($, "_nullFuture", "Future__nullFuture", "get$Future__nullFuture", function() {
+  return P._Future$immediate(null, null);
+});
+Isolate.$lazy($, "_toStringVisiting", "IterableBase__toStringVisiting", "get$IterableBase__toStringVisiting", function() {
+  return [];
+});
+Isolate.$lazy($, "webkitEvents", "ElementEvents_webkitEvents", "get$ElementEvents_webkitEvents", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["animationend", "webkitAnimationEnd", "animationiteration", "webkitAnimationIteration", "animationstart", "webkitAnimationStart", "fullscreenchange", "webkitfullscreenchange", "fullscreenerror", "webkitfullscreenerror", "keyadded", "webkitkeyadded", "keyerror", "webkitkeyerror", "keymessage", "webkitkeymessage", "needkey", "webkitneedkey", "pointerlockchange", "webkitpointerlockchange", "pointerlockerror", "webkitpointerlockerror", "resourcetimingbufferfull", "webkitresourcetimingbufferfull", "transitionend", "webkitTransitionEnd", "speechchange", "webkitSpeechChange"], null, null);
+});
+Isolate.$lazy($, "context", "context", "get$context", function() {
+  return P._wrapToDart(function() {
+    return this;
+  }());
+});
+Isolate.$lazy($, "_DART_OBJECT_PROPERTY_NAME", "_DART_OBJECT_PROPERTY_NAME", "get$_DART_OBJECT_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartObject");
+});
+Isolate.$lazy($, "_DART_CLOSURE_PROPERTY_NAME", "_DART_CLOSURE_PROPERTY_NAME", "get$_DART_CLOSURE_PROPERTY_NAME", function() {
+  return init.getIsolateTag("_$dart_dartClosure");
+});
+Isolate.$lazy($, "_dartProxyCtor", "_dartProxyCtor", "get$_dartProxyCtor", function() {
+  return function DartObject(o) {
+    this.o = o;
+  };
+});
+Isolate.$lazy($, "_freeColor", "HeapMapElement__freeColor", "get$HeapMapElement__freeColor", function() {
+  return [255, 255, 255, 255];
+});
+Isolate.$lazy($, "_pageSeparationColor", "HeapMapElement__pageSeparationColor", "get$HeapMapElement__pageSeparationColor", function() {
+  return [0, 0, 0, 255];
+});
+Isolate.$lazy($, "_loggers", "Logger__loggers", "get$Logger__loggers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_empty(P.String, N.Logger);
+});
+Isolate.$lazy($, "_logger", "_logger", "get$_logger", function() {
+  return N.Logger_Logger("Observable.dirtyCheck");
+});
+Isolate.$lazy($, "_instance", "_InvalidPropertyPath__instance", "get$_InvalidPropertyPath__instance", function() {
+  return new L._InvalidPropertyPath([]);
+});
+Isolate.$lazy($, "_pathRegExp", "_pathRegExp", "get$_pathRegExp", function() {
+  return new L.closure7().call$0();
+});
+Isolate.$lazy($, "_logger", "_logger0", "get$_logger0", function() {
+  return N.Logger_Logger("observe.PathObserver");
+});
+Isolate.$lazy($, "_pathCache", "_pathCache", "get$_pathCache", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, L.PropertyPath);
+});
+Isolate.$lazy($, "_polymerSyntax", "PolymerDeclaration__polymerSyntax", "get$PolymerDeclaration__polymerSyntax", function() {
+  return new A.PolymerExpressions(T.PolymerExpressions$(null, C.C_ScopeFactory), null);
+});
+Isolate.$lazy($, "_typesByName", "_typesByName", "get$_typesByName", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, P.Type);
+});
+Isolate.$lazy($, "_declarations", "_declarations", "get$_declarations", function() {
+  return P.LinkedHashMap_LinkedHashMap(null, null, null, P.String, A.PolymerDeclaration);
+});
+Isolate.$lazy($, "_hasShadowDomPolyfill", "_hasShadowDomPolyfill", "get$_hasShadowDomPolyfill", function() {
+  return $.get$context().hasProperty$1("ShadowDOMPolyfill");
+});
+Isolate.$lazy($, "_ShadowCss", "_ShadowCss", "get$_ShadowCss", function() {
+  var t1 = $.get$_Platform();
+  return t1 != null ? J.$index$asx(t1, "ShadowCSS") : null;
+});
+Isolate.$lazy($, "_sheetLog", "_sheetLog", "get$_sheetLog", function() {
+  return N.Logger_Logger("polymer.stylesheet");
+});
+Isolate.$lazy($, "_changedMethodQueryOptions", "_changedMethodQueryOptions", "get$_changedMethodQueryOptions", function() {
+  return new A.QueryOptions(false, false, true, C.Type_fPs, false, true, null, A._isObserverMethod$closure());
+});
+Isolate.$lazy($, "_ATTRIBUTES_REGEX", "_ATTRIBUTES_REGEX", "get$_ATTRIBUTES_REGEX", function() {
+  return new H.JSSyntaxRegExp("\\s|,", H.JSSyntaxRegExp_makeNative("\\s|,", false, true, false), null, null);
+});
+Isolate.$lazy($, "_Platform", "_Platform", "get$_Platform", function() {
+  return J.$index$asx($.get$context(), "Platform");
+});
+Isolate.$lazy($, "bindPattern", "Polymer_bindPattern", "get$Polymer_bindPattern", function() {
+  return new H.JSSyntaxRegExp("\\{\\{([^{}]*)}}", H.JSSyntaxRegExp_makeNative("\\{\\{([^{}]*)}}", false, true, false), null, null);
+});
+Isolate.$lazy($, "_onReady", "Polymer__onReady", "get$Polymer__onReady", function() {
+  return H.setRuntimeTypeInfo(new P._AsyncCompleter(P._Future$(null)), [null]);
+});
+Isolate.$lazy($, "_observeLog", "_observeLog", "get$_observeLog", function() {
+  return N.Logger_Logger("polymer.observe");
+});
+Isolate.$lazy($, "_eventsLog", "_eventsLog", "get$_eventsLog", function() {
+  return N.Logger_Logger("polymer.events");
+});
+Isolate.$lazy($, "_unbindLog", "_unbindLog", "get$_unbindLog", function() {
+  return N.Logger_Logger("polymer.unbind");
+});
+Isolate.$lazy($, "_bindLog", "_bindLog", "get$_bindLog", function() {
+  return N.Logger_Logger("polymer.bind");
+});
+Isolate.$lazy($, "_PolymerGestures", "_PolymerGestures", "get$_PolymerGestures", function() {
+  return J.$index$asx($.get$context(), "PolymerGestures");
+});
+Isolate.$lazy($, "_polymerElementProto", "_polymerElementProto", "get$_polymerElementProto", function() {
+  return new A.closure().call$0();
+});
+Isolate.$lazy($, "_typeHandlers", "_typeHandlers", "get$_typeHandlers", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal([C.Type_Ejg, new Z.closure0(), C.Type_eZO, new Z.closure1(), C.Type_dVs, new Z.closure2(), C.Type_EsU, new Z.closure3(), C.Type_SnA, new Z.closure4(), C.Type_qq1, new Z.closure5()], null, null);
+});
+Isolate.$lazy($, "_BINARY_OPERATORS", "_BINARY_OPERATORS", "get$_BINARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure14(), "-", new K.closure15(), "*", new K.closure16(), "/", new K.closure17(), "%", new K.closure18(), "==", new K.closure19(), "!=", new K.closure20(), "===", new K.closure21(), "!==", new K.closure22(), ">", new K.closure23(), ">=", new K.closure24(), "<", new K.closure25(), "<=", new K.closure26(), "||", new K.closure27(), "&&", new K.closure28(), "|", new K.closure29()], null, null);
+});
+Isolate.$lazy($, "_UNARY_OPERATORS", "_UNARY_OPERATORS", "get$_UNARY_OPERATORS", function() {
+  return P.LinkedHashMap_LinkedHashMap$_literal(["+", new K.closure11(), "-", new K.closure12(), "!", new K.closure13()], null, null);
+});
+Isolate.$lazy($, "_instance", "Closer__instance", "get$Closer__instance", function() {
+  return new K.Closer();
+});
+Isolate.$lazy($, "_currentIsolateMatcher", "VM__currentIsolateMatcher", "get$VM__currentIsolateMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+", H.JSSyntaxRegExp_makeNative("isolates/\\d+", false, true, false), null, null);
+});
+Isolate.$lazy($, "_currentObjectMatcher", "VM__currentObjectMatcher", "get$VM__currentObjectMatcher", function() {
+  return new H.JSSyntaxRegExp("isolates/\\d+/", H.JSSyntaxRegExp_makeNative("isolates/\\d+/", false, true, false), null, null);
+});
+Isolate.$lazy($, "objectAccessor", "objectAccessor", "get$objectAccessor", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "typeInspector", "typeInspector", "get$typeInspector", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "symbolConverter", "symbolConverter", "get$symbolConverter", function() {
+  return D.throwNotConfiguredError();
+});
+Isolate.$lazy($, "_DEFAULT", "BindingDelegate__DEFAULT", "get$BindingDelegate__DEFAULT", function() {
+  return new M.BindingDelegate(null);
+});
+Isolate.$lazy($, "_checkboxEventType", "_InputBinding__checkboxEventType", "get$_InputBinding__checkboxEventType", function() {
+  return new M.closure10().call$0();
+});
+Isolate.$lazy($, "_contentsOwner", "TemplateBindExtension__contentsOwner", "get$TemplateBindExtension__contentsOwner", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_ownerStagingDocument", "TemplateBindExtension__ownerStagingDocument", "get$TemplateBindExtension__ownerStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_allTemplatesSelectors", "TemplateBindExtension__allTemplatesSelectors", "get$TemplateBindExtension__allTemplatesSelectors", function() {
+  return "template, " + J.map$1$ax(C.Map_05eTF.get$keys(), new M.closure6()).join$1(0, ", ");
+});
+Isolate.$lazy($, "_templateObserver", "TemplateBindExtension__templateObserver", "get$TemplateBindExtension__templateObserver", function() {
+  return new (window.MutationObserver || window.WebKitMutationObserver || window.MozMutationObserver)(H.convertDartClosureToJS(W._wrapBinaryZone(new M.closure8()), 2));
+});
+Isolate.$lazy($, "_emptyInstance", "_emptyInstance", "get$_emptyInstance", function() {
+  return new M.closure9().call$0();
+});
+Isolate.$lazy($, "_instanceExtension", "_instanceExtension", "get$_instanceExtension", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_isStagingDocument", "_isStagingDocument", "get$_isStagingDocument", function() {
+  return H.setRuntimeTypeInfo(new P.Expando(null), [null]);
+});
+Isolate.$lazy($, "_expando", "_expando", "get$_expando", function() {
+  return H.setRuntimeTypeInfo(new P.Expando("template_binding"), [null]);
+});
+// Native classes
+
+init.functionAliases = {evalType: 209};
+;
+init.metadata = ["sender",
+"e",
+"event",
+"uri",
+"onError",
+{func: "dynamic__String", args: [P.String]},
+"closure",
+"isolate",
+"numberOfArguments",
+"arg1",
+"arg2",
+"arg3",
+"arg4",
+{func: "args1", args: [null]},
+"_",
+{func: "String__int", ret: P.String, args: [P.$int]},
+"bytes",
+{func: "String__dynamic", ret: P.String, args: [null]},
+{func: "void_", void: true},
+{func: "void__void_", void: true, args: [{func: "void_", void: true}]},
+{func: "void__dynamic", void: true, args: [null]},
+"value",
+{func: "void__dynamic__StackTrace", void: true, args: [null], opt: [P.StackTrace]},
+,
+"error",
+"stackTrace",
+{func: "void__Zone_ZoneDelegate_Zone_dynamic_StackTrace", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, null, P.StackTrace]},
+"self",
+"parent",
+"zone",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args0", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+"f",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}, null]},
+"arg",
+{func: "dynamic__Zone_ZoneDelegate_Zone_args2_dynamic_dynamic", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}, null, null]},
+{func: "ZoneCallback__Zone_ZoneDelegate_Zone_args0", ret: {func: "args0"}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "ZoneUnaryCallback__Zone_ZoneDelegate_Zone_args1", ret: {func: "args1", args: [null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "ZoneBinaryCallback__Zone_ZoneDelegate_Zone_args2", ret: {func: "args2", args: [null, null]}, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args2", args: [null, null]}]},
+{func: "void__Zone_ZoneDelegate_Zone_args0", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args0"}]},
+{func: "Timer__Zone_ZoneDelegate_Zone_Duration_void_", ret: P.Timer, args: [P.Zone, P.ZoneDelegate, P.Zone, P.Duration, {func: "void_", void: true}]},
+"duration",
+"callback",
+{func: "void__Zone_ZoneDelegate_Zone_String", void: true, args: [P.Zone, P.ZoneDelegate, P.Zone, P.String]},
+{func: "void__String", void: true, args: [P.String]},
+{func: "Zone__Zone_ZoneDelegate_Zone_ZoneSpecification_Map", ret: P.Zone, args: [P.Zone, P.ZoneDelegate, P.Zone, P.ZoneSpecification, P.Map]},
+{func: "bool__dynamic_dynamic", ret: P.bool, args: [null, null]},
+"a",
+"b",
+{func: "int__dynamic", ret: P.$int, args: [null]},
+{func: "Object__dynamic", ret: P.Object, args: [null]},
+"object",
+{func: "int__Comparable_Comparable", ret: P.$int, args: [P.Comparable, P.Comparable]},
+{func: "bool__Object_Object", ret: P.bool, args: [P.Object, P.Object]},
+{func: "int__Object", ret: P.$int, args: [P.Object]},
+"receiver",
+{func: "args4", args: [null, null, null, null]},
+"name",
+"oldValue",
+"newValue",
+"captureThis",
+"arguments",
+"o",
+{func: "bool__Symbol", ret: P.bool, args: [P.Symbol]},
+"symbol",
+"v",
+"x",
+{func: "Iterable__Iterable", ret: [P.Iterable, K.IndexedValue], args: [P.Iterable]},
+"iterable",
+"invocation",
+{func: "args0"},
+{func: "dynamic__Function", args: [P.Function]},
+"code",
+"msg",
+"errorMessage",
+"message",
+{func: "args2", args: [null, null]},
+"key",
+{func: "dynamic__String_dynamic", args: [P.String, null]},
+{func: "dynamic__dynamic_String", args: [null, P.String]},
+{func: "void__dynamic_dynamic_dynamic", void: true, args: [null, null, null]},
+"c",
+"obj",
+"i",
+{func: "void__ServiceError", void: true, args: [D.ServiceError]},
+{func: "void__ServiceException", void: true, args: [D.ServiceException]},
+"exception",
+{func: "void__PopStateEvent", void: true, args: [W.PopStateEvent]},
+{func: "int__int_int", ret: P.$int, args: [P.$int, P.$int]},
+"column",
+"done",
+{func: "String__TableTreeRow", ret: P.String, args: [G.TableTreeRow]},
+"row",
+{func: "void__Event_dynamic_Element", void: true, args: [W.Event, null, W.Element]},
+"detail",
+"target",
+"objectClass",
+{func: "Future__String", ret: [P.Future, D.ServiceObject], args: [P.String]},
+"text",
+{func: "Future__dynamic", ret: [P.Future, D.ServiceObject], args: [null]},
+"limit",
+"dummy",
+{func: "dynamic__ServiceMap", args: [D.ServiceMap]},
+{func: "void__Event_dynamic_Node", void: true, args: [W.Event, null, W.Node]},
+{func: "dynamic__Code", args: [D.Code]},
+"data",
+{func: "void__Object__StackTrace", void: true, args: [P.Object], opt: [P.StackTrace]},
+"theError",
+"theStackTrace",
+{func: "dynamic__Object", args: [P.Object]},
+{func: "void___dynamic", void: true, opt: [null]},
+{func: "dynamic__dynamic__dynamic", args: [null], opt: [null]},
+{func: "bool_", ret: P.bool},
+"ignored",
+"convert",
+"element",
+{func: "dynamic__bool", args: [P.bool]},
+{func: "void___Future", void: true, opt: [P.Future]},
+"resumeSignal",
+{func: "dynamic__dynamic_StackTrace", args: [null, P.StackTrace]},
+{func: "void__dynamic_StackTrace", void: true, args: [null, P.StackTrace]},
+"each",
+{func: "dynamic__Symbol_dynamic", args: [P.Symbol, null]},
+{func: "int__String", ret: P.$int, args: [P.String]},
+{func: "double__String", ret: P.$double, args: [P.String]},
+{func: "bool__int", ret: P.bool, args: [P.$int]},
+{func: "int__int", ret: P.$int, args: [P.$int]},
+{func: "int__dynamic_dynamic", ret: P.$int, args: [null, null]},
+"byteString",
+{func: "void__MouseEvent", void: true, args: [W.MouseEvent]},
+"result",
+{func: "dynamic__ServiceObject", args: [D.ServiceObject]},
+{func: "PixelReference_", ret: O.PixelReference},
+"response",
+"st",
+{func: "void__ServiceMap", void: true, args: [D.ServiceMap]},
+"newProfile",
+{func: "String__bool", ret: P.String, args: [P.bool]},
+"newSpace",
+{func: "dynamic__int", args: [P.$int]},
+{func: "dynamic__int_dynamic", args: [P.$int, null]},
+{func: "Iterable__dynamic__String", ret: P.Iterable, args: [{func: "dynamic__String", args: [P.String]}]},
+{func: "Iterable__Iterable__String", ret: P.Iterable, args: [{func: "Iterable__String", ret: P.Iterable, args: [P.String]}]},
+"s",
+{func: "void__bool_dynamic", void: true, args: [P.bool, null]},
+"expand",
+"m",
+{func: "Future__dynamic0", ret: P.Future, args: [null]},
+"tagProfile",
+"rec",
+{func: "dynamic__LogRecord", args: [N.LogRecord]},
+{func: "void__MouseEvent_dynamic_Element", void: true, args: [W.MouseEvent, null, W.Element]},
+{func: "String__String", ret: P.String, args: [P.String]},
+"url",
+{func: "String__double", ret: P.String, args: [P.$double]},
+"time",
+{func: "bool__String", ret: P.bool, args: [P.String]},
+"type",
+{func: "dynamic__ZoneDelegate_Zone", args: [P.ZoneDelegate, P.Zone]},
+{func: "dynamic__Zone_ZoneDelegate_Zone_args1", args: [P.Zone, P.ZoneDelegate, P.Zone, {func: "args1", args: [null]}]},
+{func: "void__Object", void: true, args: [P.Object]},
+"records",
+{func: "dynamic__PropertyPath_dynamic", args: [L.PropertyPath, null]},
+"model",
+"node",
+"oneTime",
+{func: "args3", args: [null, null, null]},
+{func: "void__String_String", void: true, args: [P.String, P.String]},
+{func: "void__List_Map_List", void: true, args: [P.List, P.Map, P.List]},
+{func: "void__List", void: true, args: [[P.List, T.ChangeRecord]]},
+{func: "void__Iterable", void: true, args: [[P.Iterable, A.Bindable]]},
+"changes",
+"jsElem",
+"extendee",
+{func: "dynamic__dynamic_String_String", args: [null, P.String, P.String]},
+"k",
+{func: "dynamic__dynamic_Node_bool", args: [null, W.Node, P.bool]},
+{func: "dynamic__dynamic__bool", args: [null], named: {skipChanges: P.bool}},
+false,
+"skipChanges",
+{func: "dynamic__List", args: [[P.List, T.ChangeRecord]]},
+{func: "Index__Expression_Expression", ret: U.Index, args: [U.Expression, U.Expression]},
+{func: "dynamic__Expression", args: [U.Expression]},
+"hits",
+"map",
+{func: "dynamic__ObservableMap", args: [V.ObservableMap]},
+"id",
+{func: "Future_", ret: P.Future},
+"coverage",
+{func: "Future__ServiceMap", ret: [P.Future, [P.List, D.Class]], args: [D.ServiceMap]},
+"classList",
+{func: "Future__List", ret: [P.Future, D.Class], args: [[P.List, D.Class]]},
+"classes",
+"scriptCoverage",
+"timer",
+{func: "String_", ret: P.String},
+{func: "String__Code", ret: P.String, args: [D.Code]},
+{func: "void__Script", void: true, args: [D.Script]},
+"script",
+"func",
+"request",
+{func: "dynamic__HttpRequest", args: [W.HttpRequest]},
+"details",
+"ref",
+{func: "void__List0", void: true, args: [[P.List, G.ListChangeRecord]]},
+"splices",
+{func: "void__DocumentFragment", void: true, args: [W.DocumentFragment]},
+{func: "String__Object", ret: P.String, args: [P.Object]},
+{func: "String__List", ret: P.String, args: [[P.List, P.Object]]},
+"values",
+{func: "Future__String0", ret: P.Future, args: [P.String]},
+];
+$ = null;
+Isolate = Isolate.$finishIsolateConstructor(Isolate);
+$ = new Isolate();
+function convertToFastObject(properties) {
+  function MyClass() {
+  }
+  MyClass.prototype = properties;
+  new MyClass();
+  return properties;
+}
+;
+A = convertToFastObject(A);
+B = convertToFastObject(B);
+C = convertToFastObject(C);
+D = convertToFastObject(D);
+E = convertToFastObject(E);
+F = convertToFastObject(F);
+G = convertToFastObject(G);
+H = convertToFastObject(H);
+J = convertToFastObject(J);
+K = convertToFastObject(K);
+L = convertToFastObject(L);
+M = convertToFastObject(M);
+N = convertToFastObject(N);
+O = convertToFastObject(O);
+P = convertToFastObject(P);
+Q = convertToFastObject(Q);
+R = convertToFastObject(R);
+S = convertToFastObject(S);
+T = convertToFastObject(T);
+U = convertToFastObject(U);
+V = convertToFastObject(V);
+W = convertToFastObject(W);
+X = convertToFastObject(X);
+Y = convertToFastObject(Y);
+Z = convertToFastObject(Z);
+!function() {
+  function intern(s) {
+    var o = {};
+    o[s] = 1;
+    return Object.keys(convertToFastObject(o))[0];
+  }
+  init.getIsolateTag = function(name) {
+    return intern("___dart_" + name + init.isolateTag);
+  };
+  var tableProperty = "___dart_isolate_tags_";
+  var usedProperties = Object[tableProperty] || (Object[tableProperty] = Object.create(null));
+  var rootProperty = "_ZxYxX";
+  for (var i = 0;; i++) {
+    var property = intern(rootProperty + "_" + i + "_");
+    if (!(property in usedProperties)) {
+      usedProperties[property] = 1;
+      init.isolateTag = property;
+      break;
+    }
+  }
+}();
+init.dispatchPropertyName = init.getIsolateTag("dispatch_record");
+// BEGIN invoke [main].
+;(function(callback) {
+  if (typeof document === "undefined") {
+    callback(null);
+    return;
+  }
+  if (document.currentScript) {
+    callback(document.currentScript);
+    return;
+  }
+  var scripts = document.scripts;
+  function onLoad(event) {
+    for (var i = 0; i < scripts.length; ++i) {
+      scripts[i].removeEventListener("load", onLoad, false);
+    }
+    callback(event.target);
+  }
+  for (var i = 0; i < scripts.length; ++i) {
+    scripts[i].addEventListener("load", onLoad, false);
+  }
+})(function(currentScript) {
+  init.currentScript = currentScript;
+  if (typeof dartMainRunner === "function") {
+    dartMainRunner(function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    }, []);
+  } else {
+    (function(a) {
+      H.startRootIsolate(E.main0$closure(), a);
+    })([]);
+  }
+});
+;
+// END invoke [main].
+function init() {
+  Isolate.$isolateProperties = {};
+  function generateAccessor(fieldDescriptor, accessors, cls) {
+    var fieldInformation = fieldDescriptor.split("-");
+    var field = fieldInformation[0];
+    var len = field.length;
+    var code = field.charCodeAt(len - 1);
+    var reflectable;
+    if (fieldInformation.length > 1)
+      reflectable = true;
+    else
+      reflectable = false;
+    code = code >= 60 && code <= 64 ? code - 59 : code >= 123 && code <= 126 ? code - 117 : code >= 37 && code <= 43 ? code - 27 : 0;
+    if (code) {
+      var getterCode = code & 3;
+      var setterCode = code >> 2;
+      var accessorName = field = field.substring(0, len - 1);
+      var divider = field.indexOf(":");
+      if (divider > 0) {
+        accessorName = field.substring(0, divider);
+        field = field.substring(divider + 1);
+      }
+      if (getterCode) {
+        var args = getterCode & 2 ? "receiver" : "";
+        var receiver = getterCode & 1 ? "this" : "receiver";
+        var body = "return " + receiver + "." + field;
+        var property = cls + ".prototype.get$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+      if (setterCode) {
+        var args = setterCode & 2 ? "receiver, value" : "value";
+        var receiver = setterCode & 1 ? "this" : "receiver";
+        var body = receiver + "." + field + " = value";
+        var property = cls + ".prototype.set$" + accessorName + "=";
+        var fn = "function(" + args + "){" + body + "}";
+        if (reflectable)
+          accessors.push(property + "$reflectable(" + fn + ");\n");
+        else
+          accessors.push(property + fn + ";\n");
+      }
+    }
+    return field;
+  }
+  Isolate.$isolateProperties.$generateAccessor = generateAccessor;
+  function defineClass(name, cls, fields) {
+    var accessors = [];
+    var str = "function " + cls + "(";
+    var body = "";
+    for (var i = 0; i < fields.length; i++) {
+      if (i != 0)
+        str += ", ";
+      var field = generateAccessor(fields[i], accessors, cls);
+      var parameter = "parameter_" + field;
+      str += parameter;
+      body += "this." + field + " = " + parameter + ";\n";
+    }
+    str += ") {\n" + body + "}\n";
+    str += cls + ".builtin$cls=\"" + name + "\";\n";
+    str += "$desc=$collectedClasses." + cls + ";\n";
+    str += "if($desc instanceof Array) $desc = $desc[1];\n";
+    str += cls + ".prototype = $desc;\n";
+    if (typeof defineClass.name != "string") {
+      str += cls + ".name=\"" + cls + "\";\n";
+    }
+    str += accessors.join("");
+    return str;
+  }
+  var inheritFrom = function() {
+    function tmp() {
+    }
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    return function(constructor, superConstructor) {
+      tmp.prototype = superConstructor.prototype;
+      var object = new tmp();
+      var properties = constructor.prototype;
+      for (var member in properties)
+        if (hasOwnProperty.call(properties, member))
+          object[member] = properties[member];
+      object.constructor = constructor;
+      constructor.prototype = object;
+      return object;
+    };
+  }();
+  Isolate.$finishClasses = function(collectedClasses, isolateProperties, existingIsolateProperties) {
+    var pendingClasses = {};
+    if (!init.allClasses)
+      init.allClasses = {};
+    var allClasses = init.allClasses;
+    var hasOwnProperty = Object.prototype.hasOwnProperty;
+    if (typeof dart_precompiled == "function") {
+      var constructors = dart_precompiled(collectedClasses);
+    } else {
+      var combinedConstructorFunction = "function $reflectable(fn){fn.$reflectable=1;return fn};\n" + "var $desc;\n";
+      var constructorsList = [];
+    }
+    for (var cls in collectedClasses) {
+      if (hasOwnProperty.call(collectedClasses, cls)) {
+        var desc = collectedClasses[cls];
+        if (desc instanceof Array)
+          desc = desc[1];
+        var classData = desc["^"], supr, name = cls, fields = classData;
+        if (typeof classData == "string") {
+          var split = classData.split("/");
+          if (split.length == 2) {
+            name = split[0];
+            fields = split[1];
+          }
+        }
+        var s = fields.split(";");
+        fields = s[1] == "" ? [] : s[1].split(",");
+        supr = s[0];
+        split = supr.split(":");
+        if (split.length == 2) {
+          supr = split[0];
+          var functionSignature = split[1];
+          if (functionSignature)
+            desc.$signature = function(s) {
+              return function() {
+                return init.metadata[s];
+              };
+            }(functionSignature);
+        }
+        if (supr && supr.indexOf("+") > 0) {
+          s = supr.split("+");
+          supr = s[0];
+          var mixin = collectedClasses[s[1]];
+          if (mixin instanceof Array)
+            mixin = mixin[1];
+          for (var d in mixin) {
+            if (hasOwnProperty.call(mixin, d) && !hasOwnProperty.call(desc, d))
+              desc[d] = mixin[d];
+          }
+        }
+        if (typeof dart_precompiled != "function") {
+          combinedConstructorFunction += defineClass(name, cls, fields);
+          constructorsList.push(cls);
+        }
+        if (supr)
+          pendingClasses[cls] = supr;
+      }
+    }
+    if (typeof dart_precompiled != "function") {
+      combinedConstructorFunction += "return [\n  " + constructorsList.join(",\n  ") + "\n]";
+      var constructors = new Function("$collectedClasses", combinedConstructorFunction)(collectedClasses);
+      combinedConstructorFunction = null;
+    }
+    for (var i = 0; i < constructors.length; i++) {
+      var constructor = constructors[i];
+      var cls = constructor.name;
+      var desc = collectedClasses[cls];
+      var globalObject = isolateProperties;
+      if (desc instanceof Array) {
+        globalObject = desc[0] || isolateProperties;
+        desc = desc[1];
+      }
+      allClasses[cls] = constructor;
+      globalObject[cls] = constructor;
+    }
+    constructors = null;
+    var finishedClasses = {};
+    init.interceptorsByTag = Object.create(null);
+    init.leafTags = {};
+    function finishClass(cls) {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      if (hasOwnProperty.call(finishedClasses, cls))
+        return;
+      finishedClasses[cls] = true;
+      var superclass = pendingClasses[cls];
+      if (!superclass || typeof superclass != "string")
+        return;
+      finishClass(superclass);
+      var constructor = allClasses[cls];
+      var superConstructor = allClasses[superclass];
+      if (!superConstructor)
+        superConstructor = existingIsolateProperties[superclass];
+      var prototype = inheritFrom(constructor, superConstructor);
+      if (hasOwnProperty.call(prototype, "%")) {
+        var nativeSpec = prototype["%"].split(";");
+        if (nativeSpec[0]) {
+          var tags = nativeSpec[0].split("|");
+          for (var i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = true;
+          }
+        }
+        if (nativeSpec[1]) {
+          tags = nativeSpec[1].split("|");
+          if (nativeSpec[2]) {
+            var subclasses = nativeSpec[2].split("|");
+            for (var i = 0; i < subclasses.length; i++) {
+              var subclass = allClasses[subclasses[i]];
+              subclass.$nativeSuperclassTag = tags[0];
+            }
+          }
+          for (i = 0; i < tags.length; i++) {
+            init.interceptorsByTag[tags[i]] = constructor;
+            init.leafTags[tags[i]] = false;
+          }
+        }
+      }
+    }
+    for (var cls in pendingClasses)
+      finishClass(cls);
+  };
+  Isolate.$lazy = function(prototype, staticName, fieldName, getterName, lazyValue) {
+    var sentinelUndefined = {};
+    var sentinelInProgress = {};
+    prototype[fieldName] = sentinelUndefined;
+    prototype[getterName] = function() {
+      var result = $[fieldName];
+      try {
+        if (result === sentinelUndefined) {
+          $[fieldName] = sentinelInProgress;
+          try {
+            result = $[fieldName] = lazyValue();
+          } finally {
+            if (result === sentinelUndefined)
+              if ($[fieldName] === sentinelInProgress)
+                $[fieldName] = null;
+          }
+        } else {
+          if (result === sentinelInProgress)
+            H.throwCyclicInit(staticName);
+        }
+        return result;
+      } finally {
+        $[getterName] = function() {
+          return this[fieldName];
+        };
+      }
+    };
+  };
+  Isolate.$finishIsolateConstructor = function(oldIsolate) {
+    var isolateProperties = oldIsolate.$isolateProperties;
+    function Isolate() {
+      var hasOwnProperty = Object.prototype.hasOwnProperty;
+      for (var staticName in isolateProperties)
+        if (hasOwnProperty.call(isolateProperties, staticName))
+          this[staticName] = isolateProperties[staticName];
+      function ForceEfficientMap() {
+      }
+      ForceEfficientMap.prototype = this;
+      new ForceEfficientMap();
+    }
+    Isolate.prototype = oldIsolate.prototype;
+    Isolate.prototype.constructor = Isolate;
+    Isolate.$isolateProperties = isolateProperties;
+    Isolate.$finishClasses = oldIsolate.$finishClasses;
+    Isolate.makeConstantList = oldIsolate.makeConstantList;
+    return Isolate;
+  };
+}
 })()
+
+//# sourceMappingURL=index_devtools.html_bootstrap.dart.js.map
+//@ sourceMappingURL=index_devtools.html_bootstrap.dart.js.map
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
index e1479c3..28c5e00 100644
--- a/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/deployed/web/packages/observatory/src/elements/class_view.html
@@ -134,11 +134,34 @@
       </template>
       
       <template if="{{ !cls.hasNoAllocations }}">
-        current instances ({{ cls.newSpace.current.instances + cls.oldSpace.current.instances }})
+        instances
           <div class="memberItem">
-            <div class="memberName">shallow size</div>
+            <div class="memberName">currently allocated</div>
             <div class="memberValue">
-              {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }}
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}"
+                           label="[more]"
+                           expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
deleted file mode 100644
index 85a6554..0000000
--- a/runtime/bin/vmservice/client/deployed/web/packages/polymer/src/js/polymer/polymer.concat.js
+++ /dev/null
@@ -1,2392 +0,0 @@
-/*
- * 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.
- */
-Polymer = {};
-
-/*
- * 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.
- */
-
-// 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 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) {
-
-  // 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;
-  }
-  
-  // exports
-
-  scope.extend = extend;
-
-})(Polymer);
-
-/* 
- * 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) {
-  
-  // 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 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) {
-
-  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);
-  };
-  
-  // TODO(sorvell): remove when we're sure imports does not need
-  // to load stylesheets
-  /*
-  HTMLImports.importer.preloadSelectors += 
-      ', polymer-element link[rel=stylesheet]';
-  */
-})(Polymer);
-
-/*
- * 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) {
-    // 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')
-        _super = memoizeSuper(caller, nom, getPrototypeOf(this));
-      }
-      if (!_super) {
-        // if _super is falsey, there is no super implementation
-        //console.warn('called $super(' + nom + ') where there is no super implementation');
-      } else {
-        // our super function
-        var fn = _super[nom];
-        // memoize information so 'fn' can call 'super'
-        if (!fn._super) {
-          memoizeSuper(fn, nom, _super);
-        }
-        // invoke the inherited method
-        // if 'fn' is not function valued, this will throw
-        return fn.apply(this, arrayOfArgs || []);
-      }
-    }
-
-    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);
-      }
-    }
-
-    function memoizeSuper(method, name, proto) {
-      // find and cache next prototype containing `name`
-      // we need the prototype so we can do another lookup
-      // from here
-      method._super = nextSuper(proto, name, method);
-      if (method._super) {
-        // _super is a prototype, the actual method is _super[name]
-        // tag super method with it's name for further lookups
-        method._super[name].nom = name;
-      }
-      return method._super;
-    }
-
-    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__;
-      }
-    }
-
-    // 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 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) {
-
-  var typeHandlers = {
-    string: function(value) {
-      return value;
-    },
-    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 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) {
-
-  // 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 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) {
-
-  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.
-      */
-    fire: function(type, detail, onNode, bubbles, cancelable) {
-      var node = onNode || this;
-      var detail = 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);
-      }
-    }
-  };
-
-  // 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 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) {
-
-  // 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.
-      // We do, however, leverage the event hookup code in PolymerExpressions
-      // so that we have a common code path for handling declarative events.
-      var self = this, bindable, eventName;
-      for (var n in events) {
-        eventName = EVENT_PREFIX + n;
-        bindable = PolymerExpressions.prepareEventBinding(
-          Path.get(events[n]),
-          eventName, 
-          {
-            resolveEventHandler: function(model, path, node) {
-              var fn = path.getValueFrom(self);
-              if (fn) {
-                return fn.bind(self);
-              }
-            }
-          }
-        );
-        bindable(this, this, false);
-      }
-    },
-    // 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;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // 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 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-
-  // magic words
-
-  var OBSERVE_SUFFIX = 'Changed';
-
-  // element api
-
-  var empty = [];
-
-  var properties = {
-    observeProperties: function() {
-      var n$ = this._observeNames, pn$ = this._publishNames;
-      if ((n$ && n$.length) || (pn$ && pn$.length)) {
-        var self = this;
-        var o = this._propertyObserver = new CompoundObserver();
-        // keep track of property observer so we can shut it down
-        this.registerObservers([o]);
-        for (var i=0, l=n$.length, n; (i<l) && (n=n$[i]); i++) {
-          o.addPath(this, n);
-          // observer array properties
-          var pd = Object.getOwnPropertyDescriptor(this.__proto__, n);
-          if (pd && pd.value) {
-            this.observeArrayValue(n, pd.value, null);
-          }
-        }
-        for (var i=0, l=pn$.length, n; (i<l) && (n=pn$[i]); i++) {
-          if (!this.observe || (this.observe[n] === undefined)) {
-            o.addPath(this, n);
-          }
-        }
-        o.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];
-        if (this.publish[name] !== undefined) {
-          this.reflectPropertyToAttribute(name);
-        }
-        method = this.observe[name];
-        if (method) {
-          this.observeArrayValue(name, newValues[i], oldValues[i]);
-          if (!called[method]) {
-            called[method] = true;
-            // observes the value if it is an array
-            this.invokeMethod(method, [oldValues[i], newValues[i], arguments]);
-          }
-        }
-      }
-    },
-    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(value, old) {
-            this.invokeMethod(callbackName, [old]);
-          }, this);
-          this.registerNamedObserver(name + '__array', observer);
-        }
-      }
-    },
-    bindProperty: function(property, observable) {
-      // apply Polymer two-way reference binding
-      return bindProperties(this, property, observable);
-    },
-    invokeMethod: function(method, args) {
-      var fn = this[method] || method;
-      if (typeof fn === 'function') {
-        fn.apply(this, args);
-      }
-    },
-    registerObservers: function(observers) {
-      this._observers.push(observers);
-    },
-    // observer array items are arrays of observers.
-    closeObservers: function() {
-      for (var i=0, l=this._observers.length; i<l; i++) {
-        this.closeObserverArray(this._observers[i]);
-      }
-      this._observers = [];
-    },
-    closeObserverArray: function(observerArray) {
-      for (var i=0, l=observerArray.length, o; i<l; i++) {
-        o = observerArray[i];
-        if (o && o.close) {
-          o.close();
-        }
-      }
-    },
-    // 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) {
-        var keys=Object.keys(this._namedObservers);
-        for (var i=0, l=keys.length, k, o; (i < l) && (k=keys[i]); i++) {
-          o = this._namedObservers[k];
-          o.close();
-        }
-        this._namedObservers = {};
-      }
-    }
-  };
-
-  // property binding
-  // bind a property in A to a path in B by converting A[property] to a
-  // getter/setter pair that accesses B[...path...]
-  function bindProperties(inA, inProperty, observable) {
-    log.bind && console.log(LOG_BIND_PROPS, inB.localName || 'object', inPath, inA.localName, inProperty);
-    // capture A's value if B's value is null or undefined,
-    // otherwise use B's value
-    // TODO(sorvell): need to review, can do with ObserverTransform
-    var v = observable.discardChanges();
-    if (v === null || v === undefined) {
-      observable.setValue(inA[inProperty]);
-    }
-    return Observer.defineComputedProperty(inA, inProperty, observable);
-  }
-
-  // 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]';
-  var LOG_BIND_PROPS = "[%s]: bindProperties: [%s] to [%s].[%s]";
-
-  // exports
-
-  scope.api.instance.properties = properties;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // imports
-
-  var log = window.logFlags || 0;
-  var events = scope.api.instance.events;
-
-  var syntax = new PolymerExpressions();
-  syntax.resolveEventHandler = function(model, path, node) {
-    var ctlr = findEventController(node);
-    if (ctlr) {
-      var fn = path.getValueFrom(ctlr);
-      if (fn) {
-        return fn.bind(ctlr);
-      }
-    }
-  }
-
-  // An event controller is the host element for the shadowRoot in which 
-  // the node exists, or the first ancestor with a 'lightDomController'
-  // property.
-  function findEventController(node) {
-    while (node.parentNode) {
-      if (node.lightDomController) {
-        return node;
-      }
-      node = node.parentNode;
-    }
-    return node.host;
-  };
-
-  // element api supporting mdv
-
-  var mdv = {
-    syntax: syntax,
-    instanceTemplate: function(template) {
-      var dom = template.createInstance(this, this.syntax);
-      this.registerObservers(dom.bindings_);
-      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);
-        this.reflectPropertyToAttribute(property);
-        // 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.path = observable.path_;
-          this.bindings_ = this.bindings_ || {};
-          this.bindings_[name] = observer;
-        }
-        return 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 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) {
-
-  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();
-    },
-    // system entry point, do not override
-    prepareElement: function() {
-      this._elementPrepared = true;
-      // install shadowRoots storage
-      this.shadowRoots = {};
-      // storage for closeable observers.
-      this._observers = [];
-      // install property observers
-      this.observeProperties();
-      // install boilerplate attributes
-      this.copyInstanceAttributes();
-      // process input attributes
-      this.takeAttributes();
-      // add event listeners
-      this.addHostListeners();
-      // 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 a lightDOMController 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.lightDomController = true;
-        // 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);
-      // set up pointer gestures
-      PointerGestures.register(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 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  
-  // 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 (window.ShadowDOMPolyfill) {
-        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
-      scope._scopeStyles[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) {
-      scope._scopeStyles = scope._scopeStyles || {};
-      return scope._scopeStyles[name];
-    }
-  };
-  
-  // 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 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) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-
-  // imperative implementation: Polymer()
-
-  // specify an 'own' prototype for tag `name`
-  function element(name, prototype) {
-    if (arguments.length === 1 && typeof arguments[0] !== 'string') {
-      prototype = name;
-      var script = document._currentScript;
-      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];
-  }
-
-  // exports
-
-  scope.getRegisteredPrototype = getRegisteredPrototype;
-  scope.waitingForPrototype = waitingForPrototype;
-
-  // 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.
-
-  var declarations = Platform.deliverDeclarations();
-  if (declarations) {
-    for (var i=0, l=declarations.length, d; (i<l) && (d=declarations[i]); i++) {
-      element.apply(null, d);
-    }
-  }
-
-})(Polymer);
-
-/* 
- * 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) {
-
-var path = {
-  resolveElementPaths: function(node) {
-    Platform.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 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.styles;
-  var STYLE_SCOPE_ATTRIBUTE = api.STYLE_SCOPE_ATTRIBUTE;
-
-  // 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 content = this.templateContent();
-      if (content) {
-        this.convertSheetsToStyles(content);
-      }
-      var styles = this.findLoadableStyles(content);
-      if (styles.length) {
-        Platform.styleResolver.loadStyles(styles, callback);
-      } else 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;
-    },
-    templateContent: function() {
-      var template = this.querySelector('template');
-      return template && templateContent(template);
-    },
-    /**
-     * 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 (window.ShadowDOMPolyfill) {
-        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 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) {
-
-  // imports
-
-  var log = window.logFlags || {};
-  var api = scope.api.instance.events;
-  var EVENT_PREFIX = api.EVENT_PREFIX;
-  // 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);
-    }
-  };
-
-  var prefixLength = EVENT_PREFIX.length;
-
-  // exports
-  scope.api.declaration.events = events;
-
-})(Polymer);
-/*
- * 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) {
-
-  // 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);
-        }
-      }
-    },
-    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);
-      }
-    },
-    requireProperties: function(properties, prototype, base) {
-      // ensure a prototype value for each property
-      for (var n in properties) {
-        if (prototype[n] === undefined && base[n] === undefined) {
-          prototype[n] = properties[n];
-        }
-      }
-    },
-    lowerCaseMap: function(properties) {
-      var map = {};
-      for (var n in properties) {
-        map[n.toLowerCase()] = n;
-      }
-      return map;
-    }
-  };
-
-  // exports
-
-  scope.api.declaration.properties = properties;
-
-})(Polymer);
-
-/*
- * 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) {
-
-  // 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
-      var attributes = this.getAttribute(ATTRIBUTES_ATTRIBUTE);
-      if (attributes) {
-        // get properties to publish
-        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();
-          // do not override explicit entries
-          if (n && publish[n] === undefined && base[n] === undefined) {
-            publish[n] = null;
-          }
-        }
-      }
-    },
-    // 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 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) {
-
-  // imports
-  
-  var api = scope.api;
-  var isBase = scope.isBase;
-  var extend = scope.extend;
-
-  // 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 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);
-      // 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 (window.ShadowDOMPolyfill) {
-        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 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) {
-
-  var queue = {
-    // tell the queue to wait for an element to be ready
-    wait: function(element, check, go) {
-      if (this.indexOf(element) === -1) {
-        this.add(element);
-        element.__check = check;
-        element.__go = go;
-      }
-      return (this.indexOf(element) !== 0);
-    },
-    add: function(element) {
-      //console.log('queueing', element.name);
-      queueForElement(element).push(element);
-    },
-    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) {
-        readied.__go.call(readied);
-        readied.__check = readied.__go = null;
-        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.__check.call(element);
-      }
-      if (this.canReady()) {
-        this.ready();
-        return true;
-      }
-    },
-    nextElement: function() {
-      return nextQueued();
-    },
-    canReady: function() {
-      return !this.waitToReady && this.isEmpty();
-    },
-    isEmpty: function() {
-      return !importQueue.length && !mainQueue.length;
-    },
-    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.
-      if (CustomElements.ready === false) {
-        CustomElements.upgradeDocumentTree(document);
-        CustomElements.ready = true;
-      }
-      if (readyCallbacks) {
-        var fn;
-        while (readyCallbacks.length) {
-          fn = readyCallbacks.shift();
-          fn();
-        }
-      }
-    },
-    addReadyCallback: function(callback) {
-      if (callback) {
-        readyCallbacks.push(callback);
-      }
-    },
-    waitToReady: true
-  };
-
-  var importQueue = [];
-  var mainQueue = [];
-  var readyCallbacks = [];
-
-  function queueForElement(element) {
-    return document.contains(element) ? mainQueue : importQueue;
-  }
-
-  function nextQueued() {
-    return importQueue.length ? importQueue[0] : mainQueue[0];
-  }
-
-  var polymerReadied = false; 
-
-  document.addEventListener('WebComponentsReady', function() {
-    CustomElements.ready = false;
-  });
-  
-  function whenPolymerReady(callback) {
-    queue.waitToReady = true;
-    CustomElements.ready = false;
-    HTMLImports.whenImportsReady(function() {
-      queue.addReadyCallback(callback);
-      queue.waitToReady = false;
-      queue.check();
-    });
-  }
-
-  // exports
-  scope.queue = queue;
-  scope.whenPolymerReady = whenPolymerReady;
-})(Polymer);
-
-/*
- * 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) {
-
-  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 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) {
-
-  // imports
-
-  var extend = scope.extend;
-  var api = scope.api;
-  var queue = scope.queue;
-  var whenPolymerReady = scope.whenPolymerReady;
-  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');
-      // initiate any async resource fetches
-      this.loadResources();
-      // register when all constraints are met
-      this.registerWhenReady();
-    },
-
-    registerWhenReady: function() {
-     if (this.registered
-       || this.waitingForPrototype(this.name)
-       || this.waitingForQueue()
-       || this.waitingForResources()) {
-          return;
-      }
-      // TODO(sorvell): ends up calling '_register' by virtue
-      // of `waitingForQueue` (see below)
-      queue.go(this);
-    },
-
-    // TODO(sorvell): refactor, this method is private-ish, but it's being
-    // called by the queue object.
-    _register: function() {
-      //console.log('registering', this.name);
-      //console.group('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;
-      //console.groupEnd();
-    },
-
-    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;
-        // TODO(sorvell): CustomElements polyfill awareness:
-        // noscript elements should upgrade in logical order
-        // script injection ensures this under native custom elements;
-        // under imports + ce polyfills, scripts run before upgrades.
-        // dependencies should be ready at upgrade time so register
-        // prototype at this time.
-        if (window.CustomElements && !CustomElements.useNative) {
-          Polymer(name);
-        } else {
-          var script = document.createElement('script');
-          script.textContent = 'Polymer(\'' + name + '\');';
-          this.appendChild(script);
-        }
-      }
-    },
-
-    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.wait(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);
-  }
-
-  // exports
-
-  scope.getRegisteredPrototype = getRegisteredPrototype;
-  
-  // boot tasks
-
-  whenPolymerReady(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);
-
-//# sourceMappingURL=polymer.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js b/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
deleted file mode 100644
index 9fa19b5..0000000
--- a/runtime/bin/vmservice/client/deployed/web/packages/web_components/platform.concat.js
+++ /dev/null
@@ -1,17703 +0,0 @@
-/*
- * 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});
-      },
-      get: function(key) {
-        var entry;
-        return (entry = key[this.name]) && entry[0] === key ?
-            entry[1] : undefined;
-      },
-      delete: function(key) {
-        this.set(key, undefined);
-      }
-    };
-
-    window.WeakMap = WeakMap;
-  })();
-}
-
-// 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.
-
-(function(global) {
-  'use strict';
-
-  // 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 document has CSP securityPolicy object and we can see that
-    // eval is not supported. This avoids an error message in console even when the exception
-    // is caught
-    if (global.document &&
-        'securityPolicy' in global.document &&
-        !global.document.securityPolicy.allowsEval) {
-      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;
-  }
-
-  function toNumber(s) {
-    return +s;
-  }
-
-  function isObject(obj) {
-    return obj === Object(obj);
-  }
-
-  var numberIsNaN = global.Number.isNaN || function isNaN(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 ident = identStart + '+' + identPart + '*';
-  var elementIndex = '(?:[0-9]|[1-9]+[0-9]+)';
-  var identOrElementIndex = '(?:' + ident + '|' + elementIndex + ')';
-  var path = '(?:' + identOrElementIndex + ')(?:\\s*\\.\\s*' + identOrElementIndex + ')*';
-  var pathRegExp = new RegExp('^' + path + '$');
-
-  function isPathValid(s) {
-    if (typeof s != 'string')
-      return false;
-    s = s.trim();
-
-    if (s == '')
-      return true;
-
-    if (s[0] == '.')
-      return false;
-
-    return pathRegExp.test(s);
-  }
-
-  var constructorIsPrivate = {};
-
-  function Path(s, privateToken) {
-    if (privateToken !== constructorIsPrivate)
-      throw Error('Use Path.get to retrieve path objects');
-
-    if (s.trim() == '')
-      return this;
-
-    if (isIndex(s)) {
-      this.push(s);
-      return this;
-    }
-
-    s.split(/\s*\.\s*/).filter(function(part) {
-      return part;
-    }).forEach(function(part) {
-      this.push(part);
-    }, this);
-
-    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 = '';
-
-    if (typeof pathString !== 'string')
-      pathString = String(pathString);
-
-    var path = pathCache[pathString];
-    if (path)
-      return path;
-    if (!isPathValid(pathString))
-      return invalidPath;
-    var path = new Path(pathString, constructorIsPrivate);
-    pathCache[pathString] = path;
-    return path;
-  }
-
-  Path.get = getPath;
-
-  Path.prototype = createObject({
-    __proto__: [],
-    valid: true,
-
-    toString: function() {
-      return this.join('.');
-    },
-
-    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);
-      }
-    },
-
-    compiledGetValueFromFn: function() {
-      var accessors = this.map(function(ident) {
-        return isIndex(ident) ? '["' + ident + '"]' : '.' + ident;
-      });
-
-      var str = '';
-      var pathString = 'obj';
-      str += 'if (obj != null';
-      var i = 0;
-      for (; i < (this.length - 1); i++) {
-        var ident = this[i];
-        pathString += accessors[i];
-        str += ' &&\n     ' + pathString + ' != null';
-      }
-      str += ')\n';
-
-      pathString += accessors[i];
-
-      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 (global.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);
-      }
-    };
-  }
-
-  function getObservedObject(observer, object, arrayObserve) {
-    var dir = observedObjectCache.pop() || newObservedObject();
-    dir.open(observer);
-    dir.observe(object, arrayObserve);
-    return dir;
-  }
-
-  var emptyArray = [];
-  var observedSetCache = [];
-
-  function newObservedSet() {
-    var observers = [];
-    var observerCount = 0;
-    var objects = [];
-    var toRemove = emptyArray;
-    var resetNeeded = false;
-    var resetScheduled = false;
-
-    function observe(obj) {
-      if (!obj)
-        return;
-
-      var index = toRemove.indexOf(obj);
-      if (index >= 0) {
-        toRemove[index] = undefined;
-        objects.push(obj);
-      } else if (objects.indexOf(obj) < 0) {
-        objects.push(obj);
-        Object.observe(obj, callback);
-      }
-
-      observe(Object.getPrototypeOf(obj));
-    }
-
-    function reset() {
-      var objs = toRemove === emptyArray ? [] : toRemove;
-      toRemove = objects;
-      objects = objs;
-
-      var observer;
-      for (var id in observers) {
-        observer = observers[id];
-        if (!observer || observer.state_ != OPENED)
-          continue;
-
-        observer.iterateObjects_(observe);
-      }
-
-      for (var i = 0; i < toRemove.length; i++) {
-        var obj = toRemove[i];
-        if (obj)
-          Object.unobserve(obj, callback);
-      }
-
-      toRemove.length = 0;
-    }
-
-    function scheduledReset() {
-      resetScheduled = false;
-      if (!resetNeeded)
-        return;
-
-      reset();
-    }
-
-    function scheduleReset() {
-      if (resetScheduled)
-        return;
-
-      resetNeeded = true;
-      resetScheduled = true;
-      runEOM(scheduledReset);
-    }
-
-    function callback() {
-      reset();
-
-      var observer;
-
-      for (var id in observers) {
-        observer = observers[id];
-        if (!observer || observer.state_ != OPENED)
-          continue;
-
-        observer.check_();
-      }
-    }
-
-    var record = {
-      object: undefined,
-      objects: objects,
-      open: function(obs) {
-        observers[obs.id_] = obs;
-        observerCount++;
-        obs.iterateObjects_(observe);
-      },
-      close: function(obs) {
-        var anyLeft = false;
-
-        observers[obs.id_] = undefined;
-        observerCount--;
-
-        if (observerCount) {
-          scheduleReset();
-          return;
-        }
-        resetNeeded = false;
-
-        for (var i = 0; i < objects.length; i++) {
-          Object.unobserve(objects[i], callback);
-          Observer.unobservedCount++;
-        }
-
-        observers.length = 0;
-        objects.length = 0;
-        observedSetCache.push(this);
-      },
-      reset: scheduleReset
-    };
-
-    return record;
-  }
-
-  var lastObservedSet;
-
-  function getObservedSet(observer, obj) {
-    if (!lastObservedSet || lastObservedSet.object !== obj) {
-      lastObservedSet = observedSetCache.pop() || newObservedSet();
-      lastObservedSet.object = obj;
-    }
-    lastObservedSet.open(observer);
-    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.state_ = OPENED;
-      this.connect_();
-      return this.value_;
-    },
-
-    close: function() {
-      if (this.state_ != OPENED)
-        return;
-
-      removeFromAll(this);
-      this.state_ = CLOSED;
-      this.disconnect_();
-      this.value_ = undefined;
-      this.callback_ = undefined;
-      this.target_ = undefined;
-    },
-
-    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;
-
-  var hasDebugForceFullDelivery = hasObserve && (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;
-
-    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 (global.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_ = path instanceof Path ? path : getPath(path);
-    this.directObserver_ = undefined;
-  }
-
-  PathObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    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]);
-      return true;
-    },
-
-    setValue: function(newValue) {
-      if (this.path_)
-        this.path_.setValueFrom(this.object_, newValue);
-    }
-  });
-
-  function CompoundObserver() {
-    Observer.call(this);
-
-    this.value_ = [];
-    this.directObserver_ = undefined;
-    this.observed_ = [];
-  }
-
-  var observerSentinel = {};
-
-  CompoundObserver.prototype = createObject({
-    __proto__: Observer.prototype,
-
-    connect_: function() {
-      this.check_(undefined, true);
-
-      if (!hasObserve)
-        return;
-
-      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 (this.directObserver_) {
-        if (needsDirectObserver) {
-          this.directObserver_.reset();
-          return;
-        }
-        this.directObserver_.close();
-        this.directObserver_ = undefined;
-        return;
-      }
-
-      if (needsDirectObserver)
-        this.directObserver_ = getObservedSet(this, object);
-    },
-
-    closeObservers_: 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;
-    },
-
-    disconnect_: function() {
-      this.value_ = undefined;
-
-      if (this.directObserver_) {
-        this.directObserver_.close(this);
-        this.directObserver_ = undefined;
-      }
-
-      this.closeObservers_();
-    },
-
-    addPath: function(object, path) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add paths once started.');
-
-      this.observed_.push(object, path instanceof Path ? path : getPath(path));
-    },
-
-    addObserver: function(observer) {
-      if (this.state_ != UNOPENED && this.state_ != RESETTING)
-        throw Error('Cannot add observers once started.');
-
-      observer.open(this.deliver, this);
-      this.observed_.push(observerSentinel, observer);
-    },
-
-    startReset: function() {
-      if (this.state_ != OPENED)
-        throw Error('Can only reset while open');
-
-      this.state_ = RESETTING;
-      this.closeObservers_();
-    },
-
-    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 pathOrObserver = this.observed_[i+1];
-        var object = this.observed_[i];
-        var value = object === observerSentinel ?
-            pathOrObserver.discardChanges() :
-            pathOrObserver.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 notifyFunction(object, name) {
-    if (typeof Object.observe !== 'function')
-      return;
-
-    var notifier = Object.getNotifier(object);
-    return function(type, oldValue) {
-      var changeRecord = {
-        object: object,
-        type: type,
-        name: name
-      };
-      if (arguments.length === 2)
-        changeRecord.oldValue = oldValue;
-      notifier.notify(changeRecord);
-    }
-  }
-
-  Observer.defineComputedProperty = function(target, name, observable) {
-    var notify = notifyFunction(target, name);
-    var value = observable.open(function(newValue, oldValue) {
-      value = newValue;
-      if (notify)
-        notify('update', oldValue);
-    });
-
-    Object.defineProperty(target, name, {
-      get: function() {
-        observable.deliver();
-        return value;
-      },
-      set: function(newValue) {
-        observable.setValue(newValue);
-        return newValue;
-      },
-      configurable: true
-    });
-
-    return {
-      close: function() {
-        observable.close();
-        Object.defineProperty(target, name, {
-          value: value,
-          writable: true,
-          configurable: 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.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);
-
-// prepoulate window.Platform.flags for default controls
-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.warn('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);
-
-// select ShadowDOM impl
-if (Platform.flags.shadow) {
-
-// 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);
-
-  // Don't test for eval if document has CSP securityPolicy object and we can
-  // see that eval is not supported. This avoids an error message in console
-  // even when the exception is caught
-  var hasEval = !('securityPolicy' in document) ||
-      document.securityPolicy.allowsEval;
-  if (hasEval) {
-    try {
-      var f = new Function('', 'return true;');
-      hasEval = f();
-    } catch (ex) {
-      hasEval = false;
-    }
-  }
-
-  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) {
-    getOwnPropertyNames(from).forEach(function(name) {
-      defineProperty(to, name, getOwnPropertyDescriptor(from, name));
-    });
-    return to;
-  };
-
-  function mixinStatics(to, from) {
-    getOwnPropertyNames(from).forEach(function(name) {
-      switch (name) {
-        case 'arguments':
-        case 'caller':
-        case 'length':
-        case 'name':
-        case 'prototype':
-        case 'toString':
-          return;
-      }
-      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];
-    }
-  }
-
-  // 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);
-  }
-
-  function getGetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name) :
-        function() { return this.impl[name]; };
-  }
-
-  function getSetter(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('v', 'this.impl.' + name + ' = v') :
-        function(v) { this.impl[name] = v; };
-  }
-
-  function getMethod(name) {
-    return hasEval && isIdentifierName(name) ?
-        new Function('return this.impl.' + name +
-                     '.apply(this.impl, arguments)') :
-        function() { return this.impl[name].apply(this.impl, 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;
-    }
-  }
-
-  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) {
-        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);
-    defineProperty(wrapperPrototype, 'constructor', {
-      value: wrapperConstructor,
-      configurable: true,
-      enumerable: false,
-      writable: true
-    });
-    // 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;
-  }
-
-  var OriginalDOMImplementation = window.DOMImplementation;
-  var OriginalEventTarget = window.EventTarget;
-  var OriginalEvent = window.Event;
-  var OriginalNode = window.Node;
-  var OriginalWindow = window.Window;
-  var OriginalRange = window.Range;
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-  var OriginalSVGElementInstance = window.SVGElementInstance;
-
-  function isWrapper(object) {
-    return object instanceof wrappers.EventTarget ||
-           object instanceof wrappers.Event ||
-           object instanceof wrappers.Range ||
-           object instanceof wrappers.DOMImplementation ||
-           object instanceof wrappers.CanvasRenderingContext2D ||
-           wrappers.WebGLRenderingContext &&
-               object instanceof wrappers.WebGLRenderingContext;
-  }
-
-  function isNative(object) {
-    return OriginalEventTarget && object instanceof OriginalEventTarget ||
-           object instanceof OriginalNode ||
-           object instanceof OriginalEvent ||
-           object instanceof OriginalWindow ||
-           object instanceof OriginalRange ||
-           object instanceof OriginalDOMImplementation ||
-           object instanceof OriginalCanvasRenderingContext2D ||
-           OriginalWebGLRenderingContext &&
-               object instanceof OriginalWebGLRenderingContext ||
-           OriginalSVGElementInstance &&
-               object instanceof OriginalSVGElementInstance;
-  }
-
-  /**
-   * 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.polymerWrapper_ ||
-        (impl.polymerWrapper_ = 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.impl;
-  }
-
-  /**
-   * 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.polymerWrapper_ = wrapper;
-  }
-
-  function defineGetter(constructor, name, getter) {
-    defineProperty(constructor.prototype, name, {
-      get: getter,
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  function defineWrapGetter(constructor, name) {
-    defineGetter(constructor, name, function() {
-      return wrap(this.impl[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.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 (isScheduled)
-      return;
-    setEndOfMicrotask(notifyObservers);
-    isScheduled = true;
-  }
-
-  // http://dom.spec.whatwg.org/#mutation-observers
-  function notifyObservers() {
-    isScheduled = false;
-
-    do {
-      var notifyList = globalMutationObservers.slice();
-      var anyNonEmpty = false;
-      for (var i = 0; i < notifyList.length; i++) {
-        var mo = notifyList[i];
-        var queue = mo.takeRecords();
-        removeTransientObserversFor(mo);
-        if (queue.length) {
-          mo.callback_(queue, mo);
-          anyNonEmpty = true;
-        }
-      }
-    } while (anyNonEmpty);
-  }
-
-  /**
-   * @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;
-        }
-      }
-    }
-
-    var anyRecordsEnqueued = false;
-
-    // 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.
-      observer.records_.push(record);
-
-      anyRecordsEnqueued = true;
-    }
-
-    if (anyRecordsEnqueued)
-      scheduleCallback();
-  }
-
-  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 will leak. There is no way to implement this without WeakRefs :'(
-    globalMutationObservers.push(this);
-  }
-
-  MutationObserver.prototype = {
-    // 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;
-
-      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.
-   * @constructor
-   */
-  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.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 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 isInsertionPoint(node) {
-    var localName = node.localName;
-    return localName === 'content' || localName === 'shadow';
-  }
-
-  function isShadowHost(node) {
-    return !!node.shadowRoot;
-  }
-
-  function getEventParent(node) {
-    var dv;
-    return node.parentNode || (dv = node.defaultView) && wrap(dv) || null;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-parent
-  function calculateParents(node, context, ancestors) {
-    if (ancestors.length)
-      return ancestors.shift();
-
-    // 1.
-    if (isShadowRoot(node))
-      return getInsertionParent(node) || node.host;
-
-    // 2.
-    var eventParents = scope.eventParentsTable.get(node);
-    if (eventParents) {
-      // Copy over the remaining event parents for next iteration.
-      for (var i = 1; i < eventParents.length; i++) {
-        ancestors[i - 1] = eventParents[i];
-      }
-      return eventParents[0];
-    }
-
-    // 3.
-    if (context && isInsertionPoint(node)) {
-      var parentNode = node.parentNode;
-      if (parentNode && isShadowHost(parentNode)) {
-        var trees = scope.getShadowTrees(parentNode);
-        var p = getInsertionParent(context);
-        for (var i = 0; i < trees.length; i++) {
-          if (trees[i].contains(p))
-            return p;
-        }
-      }
-    }
-
-    return getEventParent(node);
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#event-retargeting
-  function retarget(node) {
-    var stack = [];  // 1.
-    var ancestor = node;  // 2.
-    var targets = [];
-    var ancestors = [];
-    while (ancestor) {  // 3.
-      var context = null;  // 3.2.
-      // TODO(arv): Change order of these. If the stack is empty we always end
-      // up pushing ancestor, no matter what.
-      if (isInsertionPoint(ancestor)) {  // 3.1.
-        context = topMostNotInsertionPoint(stack);  // 3.1.1.
-        var top = stack[stack.length - 1] || ancestor;  // 3.1.2.
-        stack.push(top);
-      } else if (!stack.length) {
-        stack.push(ancestor);  // 3.3.
-      }
-      var target = stack[stack.length - 1];  // 3.4.
-      targets.push({target: target, currentTarget: ancestor});  // 3.5.
-      if (isShadowRoot(ancestor))  // 3.6.
-        stack.pop();  // 3.6.1.
-
-      ancestor = calculateParents(ancestor, context, ancestors);  // 3.7.
-    }
-    return targets;
-  }
-
-  function topMostNotInsertionPoint(stack) {
-    for (var i = stack.length - 1; i >= 0; i--) {
-      if (!isInsertionPoint(stack[i]))
-        return stack[i];
-    }
-    return null;
-  }
-
-  // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-adjusted-related-target
-  function adjustRelatedTarget(target, related) {
-    var ancestors = [];
-    while (target) {  // 3.
-      var stack = [];  // 3.1.
-      var ancestor = related;  // 3.2.
-      var last = undefined;  // 3.3. Needs to be reset every iteration.
-      while (ancestor) {
-        var context = null;
-        if (!stack.length) {
-          stack.push(ancestor);
-        } else {
-          if (isInsertionPoint(ancestor)) {  // 3.4.3.
-            context = topMostNotInsertionPoint(stack);
-            // isDistributed is more general than checking whether last is
-            // assigned into ancestor.
-            if (isDistributed(last)) {  // 3.4.3.2.
-              var head = stack[stack.length - 1];
-              stack.push(head);
-            }
-          }
-        }
-
-        if (inSameTree(ancestor, target))  // 3.4.4.
-          return stack[stack.length - 1];
-
-        if (isShadowRoot(ancestor))  // 3.4.5.
-          stack.pop();
-
-        last = ancestor;  // 3.4.6.
-        ancestor = calculateParents(ancestor, context, ancestors);  // 3.4.7.
-      }
-      if (isShadowRoot(target))  // 3.5.
-        target = target.host;
-      else
-        target = target.parentNode;  // 3.6.
-    }
-  }
-
-  function getInsertionParent(node) {
-    return scope.insertionParentTable.get(node);
-  }
-
-  function isDistributed(node) {
-    return getInsertionParent(node);
-  }
-
-  function inSameTree(a, b) {
-    return getTreeScope(a) === getTreeScope(b);
-  }
-
-  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));
-  }
-
-  function isLoadLikeEvent(event) {
-    switch (event.type) {
-      case 'beforeunload':
-      case 'load':
-      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 = retarget(originalWrapperTarget);
-
-    // For window "load" events the "load" event is dispatched at the window but
-    // the target is set to the document.
-    //
-    // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-end.html#the-end
-    //
-    // TODO(arv): Find a less hacky way to do this.
-    if (eventPath.length === 2 &&
-        eventPath[0].target instanceof wrappers.Document &&
-        isLoadLikeEvent(event)) {
-      eventPath.shift();
-    }
-
-    eventPathTable.set(event, eventPath);
-
-    if (dispatchCapturing(event, eventPath)) {
-      if (dispatchAtTarget(event, eventPath)) {
-        dispatchBubbling(event, eventPath);
-      }
-    }
-
-    eventPhaseTable.set(event, Event.NONE);
-    currentTargetTable.delete(event, null);
-    currentlyDispatchingEvents.delete(event);
-
-    return event.defaultPrevented;
-  }
-
-  function dispatchCapturing(event, eventPath) {
-    var phase;
-
-    for (var i = eventPath.length - 1; i > 0; i--) {
-      var target = eventPath[i].target;
-      var currentTarget = eventPath[i].currentTarget;
-      if (target === currentTarget)
-        continue;
-
-      phase = Event.CAPTURING_PHASE;
-      if (!invoke(eventPath[i], event, phase))
-        return false;
-    }
-
-    return true;
-  }
-
-  function dispatchAtTarget(event, eventPath) {
-    var phase = Event.AT_TARGET;
-    return invoke(eventPath[0], event, phase);
-  }
-
-  function dispatchBubbling(event, eventPath) {
-    var bubbles = event.bubbles;
-    var phase;
-
-    for (var i = 1; i < eventPath.length; i++) {
-      var target = eventPath[i].target;
-      var currentTarget = eventPath[i].currentTarget;
-      if (target === currentTarget)
-        phase = Event.AT_TARGET;
-      else if (bubbles && !stopImmediatePropagationTable.get(event))
-        phase = Event.BUBBLING_PHASE;
-      else
-        continue;
-
-      if (!invoke(eventPath[i], event, phase))
-        return;
-    }
-  }
-
-  function invoke(tuple, event, phase) {
-    var target = tuple.target;
-    var currentTarget = tuple.currentTarget;
-
-    var listeners = listenersTable.get(currentTarget);
-    if (!listeners)
-      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 = adjustRelatedTarget(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);
-
-    for (var i = 0; i < listeners.length; i++) {
-      var listener = listeners[i];
-      if (listener.removed) {
-        anyRemoved = true;
-        continue;
-      }
-
-      if (listener.type !== type ||
-          !listener.capture && phase === Event.CAPTURING_PHASE ||
-          listener.capture && phase === Event.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 (window.onerror)
-          window.onerror(ex.message);
-        else
-          console.error(ex, ex.stack);
-      }
-    }
-
-    if (anyRemoved) {
-      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;
-      if (!OriginalBeforeUnloadEvent && impl.type === 'beforeunload')
-        return new BeforeUnloadEvent(impl);
-      this.impl = impl;
-    } 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 nodeList = new wrappers.NodeList();
-      var eventPath = eventPathTable.get(this);
-      if (eventPath) {
-        var index = 0;
-        var lastIndex = eventPath.length - 1;
-        var baseRoot = getTreeScope(currentTargetTable.get(this));
-
-        for (var i = 0; i <= lastIndex; i++) {
-          var currentTarget = eventPath[i].currentTarget;
-          var currentRoot = getTreeScope(currentTarget);
-          if (currentRoot.contains(baseRoot) &&
-              // Make sure we do not add Window to the path.
-              (i !== lastIndex || currentTarget instanceof wrappers.Node)) {
-            nodeList[index++] = currentTarget;
-          }
-        }
-        nodeList.length = index;
-      }
-      return nodeList;
-    },
-    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)
-        this.impl = type;
-      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 this.impl.returnValue;
-    },
-    set returnValue(v) {
-      this.impl.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) {
-    this.impl = impl;
-  }
-
-  // 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 = [];
-        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(document.impl, x, y));
-    var targets = retarget(element, this)
-    for (var i = 0; i < targets.length; i++) {
-      var target = targets[i];
-      if (target.currentTarget === self)
-        return target.target;
-    }
-    return null;
-  }
-
-  /**
-   * 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.adjustRelatedTarget = adjustRelatedTarget;
-  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 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 wrap = scope.wrap;
-
-  function nonEnum(obj, prop) {
-    Object.defineProperty(obj, prop, {enumerable: false});
-  }
-
-  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(this.impl[name].apply(this.impl, 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 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, node.impl, false));
-    else
-      clone = wrap(originalCloneNode.call(node.impl, 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(this.impl, unwrap(childWrapper), refNode);
-      } else {
-        if (!previousNode)
-          this.firstChild_ = nodes[0];
-        if (!refWrapper)
-          this.lastChild_ = nodes[nodes.length - 1];
-
-        var parentNode = refNode ? refNode.parentNode : this.impl;
-
-        // 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(this.impl, 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(this.impl, 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(this.impl.parentNode);
-    },
-
-    /** @type {Node} */
-    get firstChild() {
-      return this.firstChild_ !== undefined ?
-          this.firstChild_ : wrap(this.impl.firstChild);
-    },
-
-    /** @type {Node} */
-    get lastChild() {
-      return this.lastChild_ !== undefined ?
-          this.lastChild_ : wrap(this.impl.lastChild);
-    },
-
-    /** @type {Node} */
-    get nextSibling() {
-      return this.nextSibling_ !== undefined ?
-          this.nextSibling_ : wrap(this.impl.nextSibling);
-    },
-
-    /** @type {Node} */
-    get previousSibling() {
-      return this.previousSibling_ !== undefined ?
-          this.previousSibling_ : wrap(this.impl.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 this.impl.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) {
-      var removedNodes = snapshotNodeList(this.childNodes);
-
-      if (this.invalidateShadowRenderer()) {
-        removeAllChildNodes(this);
-        if (textContent !== '') {
-          var textNode = this.impl.ownerDocument.createTextNode(textContent);
-          this.appendChild(textNode);
-        }
-      } else {
-        clearChildNodes(this);
-        this.impl.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(this.impl,
-                                                  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.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';
-
-  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 findAll(node, selector, results) {
-    var el = node.firstElementChild;
-    while (el) {
-      if (el.matches(selector))
-        results[results.length++] = el;
-      findAll(el, selector, results);
-      el = el.nextElementSibling;
-    }
-    return results;
-  }
-
-  // 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
-
-  var SelectorsInterface = {
-    querySelector: function(selector) {
-      return findOne(this, selector);
-    },
-    querySelectorAll: function(selector) {
-      return findAll(this, selector, new NodeList())
-    }
-  };
-
-  var GetElementsByInterface = {
-    getElementsByTagName: function(tagName) {
-      // TODO(arv): Check tagName?
-      return this.querySelectorAll(tagName);
-    },
-    getElementsByClassName: function(className) {
-      // TODO(arv): Check className?
-      return this.querySelectorAll('.' + className);
-    },
-    getElementsByTagNameNS: function(ns, tagName) {
-      if (ns === '*')
-        return this.getElementsByTagName(tagName);
-
-      // TODO(arv): Check tagName?
-      var result = new NodeList;
-      var els = this.getElementsByTagName(tagName);
-      for (var i = 0, j = 0; i < els.length; i++) {
-        if (els[i].namespaceURI === ns)
-          result[j++] = els[i];
-      }
-      result.length = j;
-      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 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 this.impl.data;
-    },
-    set data(value) {
-      var oldValue = this.impl.data;
-      enqueueMutation(this, 'characterData', {
-        oldValue: oldValue
-      });
-      this.impl.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 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 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 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
-    });
-  }
-
-  function Element(node) {
-    Node.call(this, node);
-  }
-  Element.prototype = Object.create(Node.prototype);
-  mixin(Element.prototype, {
-    createShadowRoot: function() {
-      var newShadowRoot = new wrappers.ShadowRoot(this);
-      this.impl.polymerShadowRoot_ = newShadowRoot;
-
-      var renderer = scope.getRendererForHost(this);
-      renderer.invalidate();
-
-      return newShadowRoot;
-    },
-
-    get shadowRoot() {
-      return this.impl.polymerShadowRoot_ || null;
-    },
-
-    setAttribute: function(name, value) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.setAttribute(name, value);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    removeAttribute: function(name) {
-      var oldValue = this.impl.getAttribute(name);
-      this.impl.removeAttribute(name);
-      enqueAttributeChange(this, name, oldValue);
-      invalidateRendererBasedOnAttribute(this, name);
-    },
-
-    matches: function(selector) {
-      return originalMatches.call(this.impl, selector);
-    }
-  });
-
-  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;
-  }
-
-  /**
-   * Useful for generating the accessor pair for a property that reflects an
-   * attribute.
-   */
-  function setterDirtiesAttribute(prototype, propertyName, opt_attrName) {
-    var attrName = opt_attrName || propertyName;
-    Object.defineProperty(prototype, propertyName, {
-      get: function() {
-        return this.impl[propertyName];
-      },
-      set: function(v) {
-        this.impl[propertyName] = v;
-        invalidateRendererBasedOnAttribute(this, attrName);
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  setterDirtiesAttribute(Element.prototype, 'id');
-  setterDirtiesAttribute(Element.prototype, 'className', 'class');
-
-  mixin(Element.prototype, ChildNodeInterface);
-  mixin(Element.prototype, GetElementsByInterface);
-  mixin(Element.prototype, ParentNodeInterface);
-  mixin(Element.prototype, SelectorsInterface);
-
-  registerWrapper(OriginalElement, Element,
-                  document.createElementNS(null, 'x'));
-
-  // TODO(arv): Export setterDirtiesAttribute and apply it to more bindings
-  // that reflect attributes.
-  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 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 {
-        this.impl.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);
-    }
-  });
-
-  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 this.impl[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();
-        this.impl[name] = v;
-      },
-      configurable: true,
-      enumerable: true
-    });
-  }
-
-  [
-    'scrollLeft',
-    'scrollTop',
-  ].forEach(getterAndSetterRequiresRendering);
-
-  function methodRequiresRendering(name) {
-    Object.defineProperty(HTMLElement.prototype, name, {
-      value: function() {
-        scope.renderAllPending();
-        return this.impl[name].apply(this.impl, 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 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 = this.impl.getContext.apply(this.impl, 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, {
-    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
-
-    // TODO: attribute boolean resetStyleInheritance;
-  });
-
-  if (OriginalHTMLContentElement)
-    registerWrapper(OriginalHTMLContentElement, HTMLContentElement);
-
-  scope.wrappers.HTMLContentElement = HTMLContentElement;
-})(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 registerWrapper = scope.registerWrapper;
-
-  var OriginalHTMLShadowElement = window.HTMLShadowElement;
-
-  function HTMLShadowElement(node) {
-    HTMLElement.call(this, node);
-  }
-  HTMLShadowElement.prototype = Object.create(HTMLElement.prototype);
-  mixin(HTMLShadowElement.prototype, {
-    // TODO: attribute boolean resetStyleInheritance;
-  });
-
-  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 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, {
-    get content() {
-      if (OriginalHTMLTemplateElement)
-        return wrap(this.impl.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;
-
-  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;
-
-  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, {
-    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 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;
-
-  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 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(this.impl.correspondingElement);
-    },
-
-    /** @type {SVGUseElement} */
-    get correspondingUseElement() {
-      return wrap(this.impl.correspondingUseElement);
-    },
-
-    /** @type {SVGElementInstance} */
-    get parentNode() {
-      return wrap(this.impl.parentNode);
-    },
-
-    /** @type {SVGElementInstanceList} */
-    get childNodes() {
-      throw new Error('Not implemented');
-    },
-
-    /** @type {SVGElementInstance} */
-    get firstChild() {
-      return wrap(this.impl.firstChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get lastChild() {
-      return wrap(this.impl.lastChild);
-    },
-
-    /** @type {SVGElementInstance} */
-    get previousSibling() {
-      return wrap(this.impl.previousSibling);
-    },
-
-    /** @type {SVGElementInstance} */
-    get nextSibling() {
-      return wrap(this.impl.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 unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalCanvasRenderingContext2D = window.CanvasRenderingContext2D;
-
-  function CanvasRenderingContext2D(impl) {
-    this.impl = impl;
-  }
-
-  mixin(CanvasRenderingContext2D.prototype, {
-    get canvas() {
-      return wrap(this.impl.canvas);
-    },
-
-    drawImage: function() {
-      arguments[0] = unwrapIfNeeded(arguments[0]);
-      this.impl.drawImage.apply(this.impl, arguments);
-    },
-
-    createPattern: function() {
-      arguments[0] = unwrap(arguments[0]);
-      return this.impl.createPattern.apply(this.impl, 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 unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalWebGLRenderingContext = window.WebGLRenderingContext;
-
-  // IE10 does not have WebGL.
-  if (!OriginalWebGLRenderingContext)
-    return;
-
-  function WebGLRenderingContext(impl) {
-    this.impl = impl;
-  }
-
-  mixin(WebGLRenderingContext.prototype, {
-    get canvas() {
-      return wrap(this.impl.canvas);
-    },
-
-    texImage2D: function() {
-      arguments[5] = unwrapIfNeeded(arguments[5]);
-      this.impl.texImage2D.apply(this.impl, arguments);
-    },
-
-    texSubImage2D: function() {
-      arguments[6] = unwrapIfNeeded(arguments[6]);
-      this.impl.texSubImage2D.apply(this.impl, 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 unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalRange = window.Range;
-
-  function Range(impl) {
-    this.impl = impl;
-  }
-  Range.prototype = {
-    get startContainer() {
-      return wrap(this.impl.startContainer);
-    },
-    get endContainer() {
-      return wrap(this.impl.endContainer);
-    },
-    get commonAncestorContainer() {
-      return wrap(this.impl.commonAncestorContainer);
-    },
-    setStart: function(refNode,offset) {
-      this.impl.setStart(unwrapIfNeeded(refNode), offset);
-    },
-    setEnd: function(refNode,offset) {
-      this.impl.setEnd(unwrapIfNeeded(refNode), offset);
-    },
-    setStartBefore: function(refNode) {
-      this.impl.setStartBefore(unwrapIfNeeded(refNode));
-    },
-    setStartAfter: function(refNode) {
-      this.impl.setStartAfter(unwrapIfNeeded(refNode));
-    },
-    setEndBefore: function(refNode) {
-      this.impl.setEndBefore(unwrapIfNeeded(refNode));
-    },
-    setEndAfter: function(refNode) {
-      this.impl.setEndAfter(unwrapIfNeeded(refNode));
-    },
-    selectNode: function(refNode) {
-      this.impl.selectNode(unwrapIfNeeded(refNode));
-    },
-    selectNodeContents: function(refNode) {
-      this.impl.selectNodeContents(unwrapIfNeeded(refNode));
-    },
-    compareBoundaryPoints: function(how, sourceRange) {
-      return this.impl.compareBoundaryPoints(how, unwrap(sourceRange));
-    },
-    extractContents: function() {
-      return wrap(this.impl.extractContents());
-    },
-    cloneContents: function() {
-      return wrap(this.impl.cloneContents());
-    },
-    insertNode: function(node) {
-      this.impl.insertNode(unwrapIfNeeded(node));
-    },
-    surroundContents: function(newParent) {
-      this.impl.surroundContents(unwrapIfNeeded(newParent));
-    },
-    cloneRange: function() {
-      return wrap(this.impl.cloneRange());
-    },
-    isPointInRange: function(node, offset) {
-      return this.impl.isPointInRange(unwrapIfNeeded(node), offset);
-    },
-    comparePoint: function(node, offset) {
-      return this.impl.comparePoint(unwrapIfNeeded(node), offset);
-    },
-    intersectsNode: function(node) {
-      return this.impl.intersectsNode(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return this.impl.toString();
-    }
-  };
-
-  // IE9 does not have createContextualFragment.
-  if (OriginalRange.prototype.createContextualFragment) {
-    Range.prototype.createContextualFragment = function(html) {
-      return wrap(this.impl.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 unwrap = scope.unwrap;
-
-  var shadowHostTable = new WeakMap();
-  var nextOlderShadowTreeTable = new WeakMap();
-
-  var spaceCharRe = /[ \t\n\r\f]/;
-
-  function ShadowRoot(hostWrapper) {
-    var node = unwrap(hostWrapper.impl.ownerDocument.createDocumentFragment());
-    DocumentFragment.call(this, node);
-
-    // createDocumentFragment associates the node with a wrapper
-    // DocumentFragment instance. Override that.
-    rewrap(node, this);
-
-    this.treeScope_ = new TreeScope(this, getTreeScope(hostWrapper));
-
-    var oldShadowRoot = hostWrapper.shadowRoot;
-    nextOlderShadowTreeTable.set(this, oldShadowRoot);
-
-    shadowHostTable.set(this, hostWrapper);
-  }
-  ShadowRoot.prototype = Object.create(DocumentFragment.prototype);
-  mixin(ShadowRoot.prototype, {
-    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 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;
-    }
-
-    parentNode.insertBefore(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;
-
-    parentNode.removeChild(node);
-  }
-
-  var distributedChildNodesTable = new WeakMap();
-  var eventParentsTable = new WeakMap();
-  var insertionParentTable = new WeakMap();
-  var rendererForHostTable = new WeakMap();
-
-  function distributeChildToInsertionPoint(child, insertionPoint) {
-    getDistributedChildNodes(insertionPoint).push(child);
-    assignToInsertionPoint(child, insertionPoint);
-
-    var eventParents = eventParentsTable.get(child);
-    if (!eventParents)
-      eventParentsTable.set(child, eventParents = []);
-    eventParents.push(insertionPoint);
-  }
-
-  function resetDistributedChildNodes(insertionPoint) {
-    distributedChildNodesTable.set(insertionPoint, []);
-  }
-
-  function getDistributedChildNodes(insertionPoint) {
-    var rv = distributedChildNodesTable.get(insertionPoint);
-    if (!rv)
-      distributedChildNodesTable.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;
-  }
-
-  /**
-   * Visits all nodes in the tree that fulfils the |predicate|. If the |visitor|
-   * function returns |false| the traversal is aborted.
-   * @param {!Node} tree
-   * @param {function(!Node) : boolean} predicate
-   * @param {function(!Node) : *} visitor
-   */
-  function visit(tree, predicate, visitor) {
-    // This operates on logical DOM.
-    for (var node = tree.firstChild; node; node = node.nextSibling) {
-      if (predicate(node)) {
-        if (visitor(node) === false)
-          return;
-      } else {
-        visit(node, predicate, visitor);
-      }
-    }
-  }
-
-  // Matching Insertion Points
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#matching-insertion-points
-
-  // TODO(arv): Verify this... I don't remember why I picked this regexp.
-  var selectorMatchRegExp = /^[*.:#[a-zA-Z_|]/;
-
-  var allowedPseudoRegExp = new RegExp('^:(' + [
-    'link',
-    'visited',
-    'target',
-    'enabled',
-    'disabled',
-    'checked',
-    'indeterminate',
-    'nth-child',
-    'nth-last-child',
-    'nth-of-type',
-    'nth-last-of-type',
-    'first-child',
-    'last-child',
-    'first-of-type',
-    'last-of-type',
-    'only-of-type',
-  ].join('|') + ')');
-
-
-  /**
-   * @param {Element} node
-   * @oaram {Element} point The insertion point element.
-   * @return {boolean} Whether the node matches the insertion point.
-   */
-  function matchesCriteria(node, point) {
-    var select = point.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;
-
-    // The native matches function in IE9 does not correctly work with elements
-    // that are not in the document.
-    // TODO(arv): Implement matching in JS.
-    // https://github.com/Polymer/ShadowDOM/issues/361
-    if (select === '*' || select === node.localName)
-      return true;
-
-    // TODO(arv): This does not seem right. Need to check for a simple selector.
-    if (!selectorMatchRegExp.test(select))
-      return false;
-
-    // TODO(arv): This no longer matches the spec.
-    if (select[0] === ':' && !allowedPseudoRegExp.test(select))
-      return false;
-
-    try {
-      return node.matches(select);
-    } catch (ex) {
-      // Invalid selector.
-      return false;
-    }
-  }
-
-  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();
-      this.treeComposition();
-
-      var host = this.host;
-      var shadowRoot = host.shadowRoot;
-
-      this.associateNode(host);
-      var topMostRenderer = !renderNode;
-      var renderNode = opt_renderNode || new RenderNode(host);
-
-      for (var node = shadowRoot.firstChild; node; node = node.nextSibling) {
-        this.renderNode(shadowRoot, renderNode, node, false);
-      }
-
-      if (topMostRenderer)
-        renderNode.sync();
-
-      this.dirty = false;
-    },
-
-    get parentRenderer() {
-      return getTreeScope(this.host).renderer;
-    },
-
-    invalidate: function() {
-      if (!this.dirty) {
-        this.dirty = true;
-        pendingDirtyRenderers.push(this);
-        if (renderTimer)
-          return;
-        renderTimer = window[request](handleRequestAnimationFrame, 0);
-      }
-    },
-
-    renderNode: function(shadowRoot, renderNode, node, isNested) {
-      if (isShadowHost(node)) {
-        renderNode = renderNode.append(node);
-        var renderer = getRendererForHost(node);
-        renderer.dirty = true;  // Need to rerender due to reprojection.
-        renderer.render(renderNode);
-      } else if (isInsertionPoint(node)) {
-        this.renderInsertionPoint(shadowRoot, renderNode, node, isNested);
-      } else if (isShadowInsertionPoint(node)) {
-        this.renderShadowInsertionPoint(shadowRoot, renderNode, node);
-      } else {
-        this.renderAsAnyDomTree(shadowRoot, renderNode, node, isNested);
-      }
-    },
-
-    renderAsAnyDomTree: function(shadowRoot, renderNode, node, isNested) {
-      renderNode = renderNode.append(node);
-
-      if (isShadowHost(node)) {
-        var renderer = getRendererForHost(node);
-        renderNode.skip = !renderer.dirty;
-        renderer.render(renderNode);
-      } else {
-        for (var child = node.firstChild; child; child = child.nextSibling) {
-          this.renderNode(shadowRoot, renderNode, child, isNested);
-        }
-      }
-    },
-
-    renderInsertionPoint: function(shadowRoot, renderNode, insertionPoint,
-                                   isNested) {
-      var distributedChildNodes = getDistributedChildNodes(insertionPoint);
-      if (distributedChildNodes.length) {
-        this.associateNode(insertionPoint);
-
-        for (var i = 0; i < distributedChildNodes.length; i++) {
-          var child = distributedChildNodes[i];
-          if (isInsertionPoint(child) && isNested)
-            this.renderInsertionPoint(shadowRoot, renderNode, child, isNested);
-          else
-            this.renderAsAnyDomTree(shadowRoot, renderNode, child, isNested);
-        }
-      } else {
-        this.renderFallbackContent(shadowRoot, renderNode, insertionPoint);
-      }
-      this.associateNode(insertionPoint.parentNode);
-    },
-
-    renderShadowInsertionPoint: function(shadowRoot, renderNode,
-                                         shadowInsertionPoint) {
-      var nextOlderTree = shadowRoot.olderShadowRoot;
-      if (nextOlderTree) {
-        assignToInsertionPoint(nextOlderTree, shadowInsertionPoint);
-        this.associateNode(shadowInsertionPoint.parentNode);
-        for (var node = nextOlderTree.firstChild;
-             node;
-             node = node.nextSibling) {
-          this.renderNode(nextOlderTree, renderNode, node, true);
-        }
-      } else {
-        this.renderFallbackContent(shadowRoot, renderNode,
-                                   shadowInsertionPoint);
-      }
-    },
-
-    renderFallbackContent: function(shadowRoot, renderNode, fallbackHost) {
-      this.associateNode(fallbackHost);
-      this.associateNode(fallbackHost.parentNode);
-      for (var node = fallbackHost.firstChild; node; node = node.nextSibling) {
-        this.renderAsAnyDomTree(shadowRoot, renderNode, node, false);
-      }
-    },
-
-    /**
-     * 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];
-    },
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-distribution-algorithm
-    distribute: function(tree, pool) {
-      var self = this;
-
-      visit(tree, isActiveInsertionPoint,
-          function(insertionPoint) {
-            resetDistributedChildNodes(insertionPoint);
-            self.updateDependentAttributes(
-                insertionPoint.getAttribute('select'));
-
-            for (var i = 0; i < pool.length; i++) {  // 1.2
-              var node = pool[i];  // 1.2.1
-              if (node === undefined)  // removed
-                continue;
-              if (matchesCriteria(node, insertionPoint)) {  // 1.2.2
-                distributeChildToInsertionPoint(node, insertionPoint);  // 1.2.2.1
-                pool[i] = undefined;  // 1.2.2.2
-              }
-            }
-          });
-    },
-
-    // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#dfn-tree-composition
-    treeComposition: function () {
-      var shadowHost = this.host;
-      var tree = shadowHost.shadowRoot;  // 1.
-      var pool = [];  // 2.
-
-      for (var child = shadowHost.firstChild;
-           child;
-           child = child.nextSibling) {  // 3.
-        if (isInsertionPoint(child)) {  // 3.2.
-          var reprojected = getDistributedChildNodes(child);  // 3.2.1.
-          // if reprojected is undef... reset it?
-          if (!reprojected || !reprojected.length)  // 3.2.2.
-            reprojected = getChildNodesSnapshot(child);
-          pool.push.apply(pool, reprojected);  // 3.2.3.
-        } else {
-          pool.push(child); // 3.3.
-        }
-      }
-
-      var shadowInsertionPoint, point;
-      while (tree) {  // 4.
-        // 4.1.
-        shadowInsertionPoint = undefined;  // Reset every iteration.
-        visit(tree, isActiveShadowInsertionPoint, function(point) {
-          shadowInsertionPoint = point;
-          return false;
-        });
-        point = shadowInsertionPoint;
-
-        this.distribute(tree, pool);  // 4.2.
-        if (point) {  // 4.3.
-          var nextOlderTree = tree.olderShadowRoot;  // 4.3.1.
-          if (!nextOlderTree) {
-            break;  // 4.3.1.1.
-          } else {
-            tree = nextOlderTree;  // 4.3.2.2.
-            assignToInsertionPoint(tree, point);  // 4.3.2.2.
-            continue;  // 4.3.2.3.
-          }
-        } else {
-          break;  // 4.4.
-        }
-      }
-    },
-
-    associateNode: function(node) {
-      node.impl.polymerShadowRenderer_ = this;
-    }
-  };
-
-  function isInsertionPoint(node) {
-    // Should this include <shadow>?
-    return node instanceof HTMLContentElement;
-  }
-
-  function isActiveInsertionPoint(node) {
-    // <content> inside another <content> or <shadow> is considered inactive.
-    return node instanceof HTMLContentElement;
-  }
-
-  function isShadowInsertionPoint(node) {
-    return node instanceof HTMLShadowElement;
-  }
-
-  function isActiveShadowInsertionPoint(node) {
-    // <shadow> inside another <content> or <shadow> is considered inactive.
-    return 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 assignToInsertionPoint(tree, point) {
-    insertionParentTable.set(tree, point);
-  }
-
-  // http://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#rendering-shadow-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 = this.impl.polymerShadowRenderer_;
-    if (renderer) {
-      renderer.invalidate();
-      return true;
-    }
-
-    return false;
-  };
-
-  HTMLContentElement.prototype.getDistributedNodes = function() {
-    // TODO(arv): We should only rerender the dirty ancestor renderers (from
-    // the root and down).
-    renderAllPending();
-    return getDistributedChildNodes(this);
-  };
-
-  HTMLShadowElement.prototype.nodeIsInserted_ =
-  HTMLContentElement.prototype.nodeIsInserted_ = function() {
-    // Invalidate old renderer if any.
-    this.invalidateShadowRenderer();
-
-    var shadowRoot = getShadowRootAncestor(this);
-    var renderer;
-    if (shadowRoot)
-      renderer = getRendererForShadowRoot(shadowRoot);
-    this.impl.polymerShadowRenderer_ = renderer;
-    if (renderer)
-      renderer.invalidate();
-  };
-
-  scope.eventParentsTable = eventParentsTable;
-  scope.getRendererForHost = getRendererForHost;
-  scope.getShadowTrees = getShadowTrees;
-  scope.insertionParentTable = insertionParentTable;
-  scope.renderAllPending = renderAllPending;
-
-  // 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 unwrap = scope.unwrap;
-  var unwrapIfNeeded = scope.unwrapIfNeeded;
-  var wrap = scope.wrap;
-
-  var OriginalSelection = window.Selection;
-
-  function Selection(impl) {
-    this.impl = impl;
-  }
-  Selection.prototype = {
-    get anchorNode() {
-      return wrap(this.impl.anchorNode);
-    },
-    get focusNode() {
-      return wrap(this.impl.focusNode);
-    },
-    addRange: function(range) {
-      this.impl.addRange(unwrap(range));
-    },
-    collapse: function(node, index) {
-      this.impl.collapse(unwrapIfNeeded(node), index);
-    },
-    containsNode: function(node, allowPartial) {
-      return this.impl.containsNode(unwrapIfNeeded(node), allowPartial);
-    },
-    extend: function(node, offset) {
-      this.impl.extend(unwrapIfNeeded(node), offset);
-    },
-    getRangeAt: function(index) {
-      return wrap(this.impl.getRangeAt(index));
-    },
-    removeRange: function(range) {
-      this.impl.removeRange(unwrap(range));
-    },
-    selectAllChildren: function(node) {
-      this.impl.selectAllChildren(unwrapIfNeeded(node));
-    },
-    toString: function() {
-      return this.impl.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 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(this.impl, arguments));
-    };
-  }
-
-  [
-    'createComment',
-    'createDocumentFragment',
-    'createElement',
-    'createElementNS',
-    'createEvent',
-    'createEventNS',
-    'createRange',
-    'createTextNode',
-    'getElementById'
-  ].forEach(wrapMethod);
-
-  var originalAdoptNode = document.adoptNode;
-
-  function adoptNodeNoRemove(node, doc) {
-    originalAdoptNode.call(doc.impl, 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, this.impl);
-    },
-    getSelection: function() {
-      renderAllPending();
-      return new Selection(originalGetSelection.call(unwrap(this)));
-    }
-  });
-
-  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);
-          }
-        }
-        this.impl = node;
-      }
-      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',
-    '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;
-    }
-  });
-
-  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) {
-    this.impl = impl;
-  }
-
-  function wrapImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return wrap(original.apply(this.impl, arguments));
-    };
-  }
-
-  function forwardImplMethod(constructor, name) {
-    var original = document.implementation[name];
-    constructor.prototype[name] = function() {
-      return original.apply(this.impl, 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 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);
-  };
-
-  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.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)));
-    },
-  });
-
-  registerWrapper(OriginalWindow, 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;
-
-  OriginalDataTransfer.prototype.setDragImage = function(image, x, y) {
-    OriginalDataTransferSetDragImage.call(this, unwrap(image), x, y);
-  };
-
-})(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 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() {
-
-  // 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;
-})();
-
-/*
- * 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.
- */
-
-/*
-  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.convertCombinators(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 ^ and ^^ combinators by replacing with space.
-  */
-  convertCombinators: function(cssText) {
-    for (var i=0; i < combinatorsRe.length; i++) {
-      cssText = cssText.replace(combinatorsRe[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)) {
-          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 if (rule.cssText) {
-          cssText += rule.cssText + '\n\n';
-        }
-      }, this);
-    }
-    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.applySimpleSelectorScope(p, scopeSelector);
-      }
-      r.push(p);
-    }, this);
-    return r.join(', ');
-  },
-  selectorNeedsScoping: function(selector, scopeSelector) {
-    var re = this.makeScopeMatcher(scopeSelector);
-    return !selector.match(re);
-  },
-  makeScopeMatcher: function(scopeSelector) {
-    scopeSelector = scopeSelector.replace(/\[/g, '\\[').replace(/\[/g, '\\]');
-    return new RegExp('^(' + scopeSelector + ')' + selectorReSuffix, 'm');
-  },
-  // 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]*'([^']*)'[^}]*}([^{]*?){/gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentRuleRe = /\/\*\s@polyfill-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentRuleRe = /(polyfill-rule)[^}]*(content\:[\s]*'([^']*)'[^;]*;)[^}]*}/gim,
-    // TODO(sorvell): remove either content or comment
-    cssCommentUnscopedRuleRe = /\/\*\s@polyfill-unscoped-rule([^*]*\*+([^/*][^*]*\*+)*)\//gim,
-    cssContentUnscopedRuleRe = /(polyfill-unscoped-rule)[^}]*(content\:[\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'),
-    combinatorsRe = [
-      /\^\^/g,
-      /\^/g,
-      /\/shadow\//g,
-      /\/shadow-deep\//g,
-      /::shadow/g,
-      /\/deep\//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 = style.sheet.cssRules;
-      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 = urlResolver.resolveCssText(
-              elt.__resource, elt.href);
-        } else {
-          urlResolver.resolveStyle(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 {
-            head.appendChild(style);
-          }
-        }
-        style.__importParsed = true;
-        this.markParsingComplete(elt);
-      }
-
-      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 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() {
-
-  // poor man's adapter for template.content on various platform scenarios
-  window.templateContent = window.templateContent || function(inTemplate) {
-    return inTemplate.content;
-  };
-
-  // 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.templateContent = function(inTemplate) {
-    // if MDV exists, it may need to boostrap this template to reveal content
-    if (window.HTMLTemplateElement && HTMLTemplateElement.bootstrap) {
-      HTMLTemplateElement.bootstrap(inTemplate);
-    }
-    // fallback when there is no Shadow DOM polyfill, no MDV polyfill, and no
-    // native template support
-    if (!inTemplate.content && !inTemplate._content) {
-      var frag = document.createDocumentFragment();
-      while (inTemplate.firstChild) {
-        frag.appendChild(inTemplate.firstChild);
-      }
-      inTemplate._content = frag;
-    }
-    return inTemplate.content || inTemplate._content;
-  };
-
-})();
-}
-/* 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');
-    }
-  };
-
-  scope.URL = jURL;
-
-})(window);
-
-/*
- * 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) {
-
-// 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);
-    };
-  };
-}
-
-// 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);
-  }
-}
-
-// export
-
-scope.mixin = mixin;
-
-})(window.Platform);
-// Copyright 2011 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.
-
-(function(scope) {
-
-  'use strict';
-
-  // 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;
-
-  // 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);
-        };
-    })();
-  }
-
-  // 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;
-  }
-  // 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) {
-    elementDeclarations.push(arguments);
-  }
-  window.Polymer = polymerStub;
-
-  // deliver queued delcarations
-  scope.deliverDeclarations = function() {
-    scope.deliverDeclarations = function() {
-     throw 'Possible attempt to load Polymer twice';
-    };
-    return elementDeclarations;
-  }
-
-  // Once DOMContent has loaded, any main document scripts that depend on
-  // Polymer() should have run. Calling Polymer() now is an error until
-  // polymer is imported.
-  window.addEventListener('DOMContentLoaded', function() {
-    if (window.Polymer === polymerStub) {
-      window.Polymer = function() {
-        console.error('You tried to use polymer without loading it first. To ' +
-          'load polymer, <link rel="import" href="' + 
-          'components/polymer/polymer.html">');
-      };
-    }
-  });
-
-  // exports
-  scope.createDOM = createDOM;
-
-})(window.Platform);
-
-/*
- * 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.
- */
-
-// poor man's adapter for template.content on various platform scenarios
-window.templateContent = window.templateContent || function(inTemplate) {
-  return inTemplate.content;
-};
-(function(scope) {
-  
-  scope = scope || (window.Inspector = {});
-  
-  var inspector;
-
-  window.sinspect = function(inNode, inProxy) {
-    if (!inspector) {
-      inspector = window.open('', 'ShadowDOM Inspector', null, true);
-      inspector.document.write(inspectorHTML);
-      //inspector.document.close();
-      inspector.api = {
-        shadowize: shadowize
-      };
-    }
-    inspect(inNode || wrap(document.body), inProxy);
-  };
-
-  var inspectorHTML = [
-    '<!DOCTYPE html>',
-    '<html>',
-    '  <head>',
-    '    <title>ShadowDOM Inspector</title>',
-    '    <style>',
-    '      body {',
-    '      }',
-    '      pre {',
-    '        font: 9pt "Courier New", monospace;',
-    '        line-height: 1.5em;',
-    '      }',
-    '      tag {',
-    '        color: purple;',
-    '      }',
-    '      ul {',
-    '         margin: 0;',
-    '         padding: 0;',
-    '         list-style: none;',
-    '      }',
-    '      li {',
-    '         display: inline-block;',
-    '         background-color: #f1f1f1;',
-    '         padding: 4px 6px;',
-    '         border-radius: 4px;',
-    '         margin-right: 4px;',
-    '      }',
-    '    </style>',
-    '  </head>',
-    '  <body>',
-    '    <ul id="crumbs">',
-    '    </ul>',
-    '    <div id="tree"></div>',
-    '  </body>',
-    '</html>'
-  ].join('\n');
-  
-  var crumbs = [];
-
-  var displayCrumbs = function() {
-    // alias our document
-    var d = inspector.document;
-    // get crumbbar
-    var cb = d.querySelector('#crumbs');
-    // clear crumbs
-    cb.textContent = '';
-    // build new crumbs
-    for (var i=0, c; c=crumbs[i]; i++) {
-      var a = d.createElement('a');
-      a.href = '#';
-      a.textContent = c.localName;
-      a.idx = i;
-      a.onclick = function(event) {
-        var c;
-        while (crumbs.length > this.idx) {
-          c = crumbs.pop();
-        }
-        inspect(c.shadow || c, c);
-        event.preventDefault();
-      };
-      cb.appendChild(d.createElement('li')).appendChild(a);
-    }
-  };
-
-  var inspect = function(inNode, inProxy) {
-    // alias our document
-    var d = inspector.document;
-    // reset list of drillable nodes
-    drillable = [];
-    // memoize our crumb proxy
-    var proxy = inProxy || inNode;
-    crumbs.push(proxy);
-    // update crumbs
-    displayCrumbs();
-    // reflect local tree
-    d.body.querySelector('#tree').innerHTML =
-        '<pre>' + output(inNode, inNode.childNodes) + '</pre>';
-  };
-
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-  var blacklisted = {STYLE:1, SCRIPT:1, "#comment": 1, TEMPLATE: 1};
-  var blacklist = function(inNode) {
-    return blacklisted[inNode.nodeName];
-  };
-
-  var output = function(inNode, inChildNodes, inIndent) {
-    if (blacklist(inNode)) {
-      return '';
-    }
-    var indent = inIndent || '';
-    if (inNode.localName || inNode.nodeType == 11) {
-      var name = inNode.localName || 'shadow-root';
-      //inChildNodes = ShadowDOM.localNodes(inNode);
-      var info = indent + describe(inNode);
-      // if only textNodes
-      // TODO(sjmiles): make correct for ShadowDOM
-      /*if (!inNode.children.length && inNode.localName !== 'content' && inNode.localName !== 'shadow') {
-        info += catTextContent(inChildNodes);
-      } else*/ {
-        // TODO(sjmiles): native <shadow> has no reference to its projection
-        if (name == 'content' /*|| name == 'shadow'*/) {
-          inChildNodes = inNode.getDistributedNodes();
-        }
-        info += '<br/>';
-        var ind = indent + '&nbsp;&nbsp;';
-        forEach(inChildNodes, function(n) {
-          info += output(n, n.childNodes, ind);
-        });
-        info += indent;
-      }
-      if (!({br:1}[name])) {
-        info += '<tag>&lt;/' + name + '&gt;</tag>';
-        info += '<br/>';
-      }
-    } else {
-      var text = inNode.textContent.trim();
-      info = text ? indent + '"' + text + '"' + '<br/>' : '';
-    }
-    return info;
-  };
-
-  var catTextContent = function(inChildNodes) {
-    var info = '';
-    forEach(inChildNodes, function(n) {
-      info += n.textContent.trim();
-    });
-    return info;
-  };
-
-  var drillable = [];
-
-  var describe = function(inNode) {
-    var tag = '<tag>' + '&lt;';
-    var name = inNode.localName || 'shadow-root';
-    if (inNode.webkitShadowRoot || inNode.shadowRoot) {
-      tag += ' <button idx="' + drillable.length +
-        '" onclick="api.shadowize.call(this)">' + name + '</button>';
-      drillable.push(inNode);
-    } else {
-      tag += name || 'shadow-root';
-    }
-    if (inNode.attributes) {
-      forEach(inNode.attributes, function(a) {
-        tag += ' ' + a.name + (a.value ? '="' + a.value + '"' : '');
-      });
-    }
-    tag += '&gt;'+ '</tag>';
-    return tag;
-  };
-
-  // remote api
-
-  shadowize = function() {
-    var idx = Number(this.attributes.idx.value);
-    //alert(idx);
-    var node = drillable[idx];
-    if (node) {
-      inspect(node.webkitShadowRoot || node.shadowRoot, node)
-    } else {
-      console.log("bad shadowize node");
-      console.dir(this);
-    }
-  };
-  
-  // export
-  
-  scope.output = output;
-  
-})(window.Inspector);
-
-
-
-/*
- * 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) {
-
-  // 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);
-
-(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:
-        module = dependsOrFactory.apply(this);
-        break;
-      default:
-        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;
-  scope.module = module;
-  scope.using = using;
-
-})(window);
-/*
- * 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) {
-
-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 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) {
-
-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) {
-    cssText = replaceUrlsInCssText(cssText, baseUrl, CSS_URL_REGEXP);
-    return replaceUrlsInCssText(cssText, baseUrl, 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];
-      if (attr && attr.value &&
-         (attr.value.search(URL_TEMPLATE_SEARCH) < 0)) {
-        var urlPath = resolveRelativeUrl(url, attr.value);
-        attr.value = urlPath;
-      }
-    });
-  }
-};
-
-var CSS_URL_REGEXP = /(url\()([^)]*)(\))/g;
-var CSS_IMPORT_REGEXP = /(@import[\s]+(?!url\())([^;]*)(;)/g;
-var URL_ATTRS = ['href', 'src', 'action'];
-var URL_ATTRS_SELECTOR = '[' + URL_ATTRS.join('],[') + ']';
-var URL_TEMPLATE_SEARCH = '{{.*}}';
-
-function replaceUrlsInCssText(cssText, baseUrl, regexp) {
-  return cssText.replace(regexp, function(m, pre, url, post) {
-    var urlPath = url.replace(/["']/g, '');
-    urlPath = resolveRelativeUrl(baseUrl, urlPath);
-    return pre + '\'' + urlPath + '\'' + post;
-  });
-}
-
-function resolveRelativeUrl(baseUrl, url) {
-  var u = new URL(url, baseUrl);
-  return makeDocumentRelPath(u.href);
-}
-
-function makeDocumentRelPath(url) {
-  var root = document.baseURI;
-  var u = new URL(url, root);
-  if (u.host === root.host && u.port === root.port &&
-      u.protocol === root.protocol) {
-    return makeRelPath(root.pathname, u.pathname);
-  } else {
-    return url;
-  }
-}
-
-// make a relative path from source to target
-function makeRelPath(source, target) {
-  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('/');
-}
-
-// exports
-scope.urlResolver = urlResolver;
-
-})(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 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.
- */
-window.HTMLImports = window.HTMLImports || {flags:{}};
-/*
- * 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) {
-
-  // 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) {
-          this.receive(url, elt, err, resource);
-        }.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) {
-      this.cache[url] = resource;
-      var $p = this.pending[url];
-      for (var i=0, l=$p.length, p; (i<l) && (p=$p[i]); i++) {
-        //if (!err) {
-          this.onload(url, p, resource);
-        //}
-        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) {
-          next.call(nextContext, !xhr.ok(request) && request,
-              request.response || request.responseText, url);
-        }
-      });
-      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 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) {
-
-var IMPORT_LINK_TYPE = 'import';
-var flags = scope.flags;
-var isIe = /Trident/.test(navigator.userAgent);
-// TODO(sorvell): SD polyfill intrusion
-var mainDoc = window.ShadowDOMPolyfill ? 
-    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-// 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'
-  },
-  // 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);
-    }
-  },
-  // 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.
-  markParsing: function(elt) {
-    flags.parse && console.log('parsing', elt);
-    this.parsingElement = elt;
-  },
-  markParsingComplete: function(elt) {
-    elt.__importParsed = true;
-    if (elt.__importElement) {
-      elt.__importElement.__importParsed = true;
-    }
-    this.parsingElement = null;
-    flags.parse && console.log('completed', elt);
-    this.parseNext();
-  },
-  parseImport: function(elt) {
-    elt.import.__importParsed = true;
-    // 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);
-    }
-    // fire load event
-    if (elt.__resource) {
-      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.markParsingComplete(elt);
-  },
-  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);
-    document.head.appendChild(elt);
-  },
-  // 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);
-    };
-    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;  
-    });
-    document.head.appendChild(script);
-  },
-  // determine the next element in the tree which should be parsed
-  nextToParse: function() {
-    return !this.parsingElement && this.nextToParseInDoc(mainDoc);
-  },
-  nextToParseInDoc: function(doc, link) {
-    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;
-  },
-  // return the set of parse selectors relevant for this node.
-  parseSelectorsForNode: function(node) {
-    var doc = node.ownerDocument || node;
-    return doc === mainDoc ? this.documentSelectors : this.importsSelectors;
-  },
-  isParsed: function(node) {
-    return node.__importParsed;
-  },
-  hasResource: function(node) {
-    if (nodeIsImport(node) && !node.import) {
-      return false;
-    }
-    return true;
-  }
-};
-
-function nodeIsImport(elt) {
-  return (elt.localName === 'link') && (elt.rel === IMPORT_LINK_TYPE);
-}
-
-function generateScriptDataUrl(script) {
-  var scriptContent = generateScriptContent(script), b64;
-  try {
-    b64 = btoa(scriptContent);
-  } catch(e) {
-    b64 = btoa(unescape(encodeURIComponent(scriptContent)));
-    console.warn('Script contained non-latin characters that were forced ' +
-      'to latin. Some characters may be wrong.', script);
-  }
-  return 'data:text/javascript;base64,' + b64;
-}
-
-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;
-scope.isIE = isIe;
-
-})(HTMLImports);
-
-/*
- * 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) {
-
-var hasNative = ('import' in document.createElement('link'));
-var useNative = hasNative;
-var flags = scope.flags;
-var IMPORT_LINK_TYPE = 'import';
-
-// TODO(sorvell): SD polyfill intrusion
-var mainDoc = window.ShadowDOMPolyfill ? 
-    ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-if (!useNative) {
-
-  // imports
-  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 === mainDoc ? this.documentPreloadSelectors :
-          this.importsPreloadSelectors;
-    },
-    loaded: function(url, elt, resource) {
-      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;
-      if (isDocumentLink(elt)) {
-        var doc = this.documents[url];
-        // if we've never seen a document at this url
-        if (!doc) {
-          // generate an HTMLDocument from data
-          doc = makeDocument(resource, url);
-          doc.__importLink = elt;
-          // TODO(sorvell): 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;
-  }
-} else {
-  // do nothing if using native imports
-  var importer = {};
-}
-
-// 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() {
-    return HTMLImports.currentScript || document.currentScript;
-  },
-  configurable: true
-};
-
-Object.defineProperty(document, '_currentScript', currentScriptDescriptor);
-Object.defineProperty(mainDoc, '_currentScript', currentScriptDescriptor);
-
-// Polyfill document.baseURI for browsers without it.
-if (!document.baseURI) {
-  var baseURIDescriptor = {
-    get: function() {
-      return window.location.href;
-    },
-    configurable: true
-  };
-
-  Object.defineProperty(document, 'baseURI', baseURIDescriptor);
-  Object.defineProperty(mainDoc, 'baseURI', baseURIDescriptor);
-}
-
-// 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 whenImportsReady(callback, doc) {
-  doc = doc || mainDoc;
-  // 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 = HTMLImports.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();
-  }
-}
-
-// 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) {
-      // go async to ensure parser isn't stuck on a script tag
-      requestAnimationFrame(callback);
-    }
-  }
-  function loadedImport(e) {
-    loaded++;
-    checkDone();
-  }
-  if (l) {
-    for (var i=0, imp; (i<l) && (imp=imports[i]); i++) {
-      if (isImportLoaded(imp)) {
-        loadedImport.call(imp);
-      } else {
-        imp.addEventListener('load', loadedImport);
-        imp.addEventListener('error', loadedImport);
-      }
-    }
-  } else {
-    checkDone();
-  }
-}
-
-function isImportLoaded(link) {
-  return useNative ? (link.import && (link.import.readyState !== 'loading')) :
-      link.__importParsed;
-}
-
-// exports
-scope.hasNative = hasNative;
-scope.useNative = useNative;
-scope.importer = importer;
-scope.whenImportsReady = whenImportsReady;
-scope.IMPORT_LINK_TYPE = IMPORT_LINK_TYPE;
-scope.isImportLoaded = isImportLoaded;
-scope.importLoader = importLoader;
-
-})(window.HTMLImports);
-
- /*
-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){
-
-var IMPORT_LINK_TYPE = scope.IMPORT_LINK_TYPE;
-var importSelector = 'link[rel=' + IMPORT_LINK_TYPE + ']';
-var importer = scope.importer;
-
-// 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
-function addedNodes(nodes) {
-  for (var i=0, l=nodes.length, n; (i<l) && (n=nodes[i]); i++) {
-    if (shouldLoadNode(n)) {
-      importer.loadNode(n);
-    }
-    if (n.children && n.children.length) {
-      addedNodes(n.children);
-    }
-  }
-}
-
-function shouldLoadNode(node) {
-  return (node.nodeType === 1) && matches.call(node,
-      importer.loadSelectorsForNode(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 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(){
-
-// bootstrap
-
-// 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;
-  };
-}
-
-// TODO(sorvell): SD polyfill intrusion
-var doc = window.ShadowDOMPolyfill ? 
-    window.ShadowDOMPolyfill.wrapIfNeeded(document) : document;
-
-// 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.
-HTMLImports.whenImportsReady(function() {
-  HTMLImports.ready = true;
-  HTMLImports.readyTime = new Date().getTime();
-  doc.dispatchEvent(
-    new CustomEvent('HTMLImportsLoaded', {bubbles: true})
-  );
-});
-
-
-// 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 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.
- */
-window.CustomElements = window.CustomElements || {flags:{}};
- /*
-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){
-
-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) {
-  if (!root.__watched) {
-    observe(root);
-    root.__watched = true;
-  }
-}
-
-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();
-};
-
-var observer = new MutationObserver(handler);
-
-function takeRecords() {
-  // TODO(sjmiles): ask Raf why we have to call handler ourselves
-  handler(observer.takeRecords());
-  takeMutations();
-}
-
-var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-
-function observe(inRoot) {
-  observer.observe(inRoot, {childList: true, subtree: true});
-}
-
-function observeDocument(doc) {
-  observe(doc);
-}
-
-function upgradeDocument(doc) {
-  logFlags.dom && console.group('upgradeDocument: ', (doc.baseURI).split('/').pop());
-  addedNode(doc);
-  logFlags.dom && console.groupEnd();
-}
-
-function upgradeDocumentTree(doc) {
-  doc = wrapIfNeeded(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 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.
- */
-
-/**
- * Implements `document.register`
- * @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);
-// TODO(sorvell): See https://github.com/Polymer/polymer/issues/399
-// we'll address this by defaulting to CE polyfill in the presence of the SD
-// polyfill. This will avoid spamming excess attached/detached callbacks.
-// If there is a compelling need to run CE native with SD polyfill,
-// we'll need to fix this issue.
-var useNative = !flags.register && hasNative && !window.ShadowDOMPolyfill;
-
-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);
-        nativePrototype = Object.getPrototypeOf(inst);
-      }
-      // 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)) {
-        var 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);
-    }
-    // remove 'unresolved' attr, which is a standin for :unresolved.
-    element.removeAttribute('unresolved');
-    // 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) {
-    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 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) {
-
-// 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 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){
-
-// bootstrap parsing
-function bootstrap() {
-  // parse document
-  CustomElements.parser.parse(document);
-  // one more pass before register is 'live'
-  CustomElements.upgradeDocument(document);
-  // choose async
-  var async = window.Platform && Platform.endOfMicrotask ? 
-    Platform.endOfMicrotask :
-    setTimeout;
-  async(function() {
-    // set internal 'ready' flag, now document.registerElement will trigger 
-    // synchronous upgrades
-    CustomElements.ready = true;
-    // 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})
-    );
-
-    // install upgrade hook if HTMLImports are available
-    if (window.HTMLImports) {
-      HTMLImports.__importsParsingHook = function(elt) {
-        CustomElements.parser.parse(elt.import);
-      }
-    }
-  });
-}
-
-// CustomEvent shim for IE
-if (typeof window.CustomEvent !== 'function') {
-  window.CustomEvent = function(inType) {
-    var e = document.createEvent('HTMLEvents');
-    e.initEvent(inType, true, true);
-    return e;
-  };
-}
-
-// 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 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() {
-
-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 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) {
-  var endOfMicrotask = scope.endOfMicrotask;
-
-  // Generic url loader
-  function Loader(regex) {
-    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);
-      this.fetch(matches, {}, callback);
-    },
-    // build a mapping of url -> text from matches
-    fetch: function(matches, map, callback) {
-      var inflight = matches.length;
-
-      // return early if there is no fetching to be done
-      if (!inflight) {
-        return callback(map);
-      }
-
-      var done = function() {
-        if (--inflight === 0) {
-          callback(map);
-        }
-      };
-
-      // map url -> responseText
-      var handleXhr = function(err, request) {
-        var match = request.match;
-        var key = match.url;
-        // handle errors with an empty string
-        if (err) {
-          map[key] = '';
-          return done();
-        }
-        var response = request.response || request.responseText;
-        map[key] = response;
-        this.fetch(this.extractUrls(response, key), map, done);
-      };
-
-      var m, req, url;
-      for (var i = 0; i < inflight; i++) {
-        m = matches[i];
-        url = m.url;
-        // if this url has already been requested, skip requesting it again
-        if (map[url]) {
-          // Async call to done to simplify the inflight logic
-          endOfMicrotask(done);
-          continue;
-        }
-        req = this.xhr(url, handleXhr, this);
-        req.match = m;
-        // tag the map with an XHR request to deduplicate at the same level
-        map[url] = req;
-      }
-    },
-    xhr: function(url, callback, scope) {
-      var request = new XMLHttpRequest();
-      request.open('GET', url, true);
-      request.send();
-      request.onload = function() {
-        callback.call(scope, null, request);
-      };
-      request.onerror = function() {
-        callback.call(scope, null, request);
-      };
-      return request;
-    }
-  };
-
-  scope.Loader = Loader;
-})(window.Platform);
-
-/*
- * 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) {
-
-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, callback) {
-    var text = style.textContent;
-    var url = style.ownerDocument.baseURI;
-    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
-      intermediate = urlResolver.resolveCssText(map[url], url);
-      // flatten intermediate @imports
-      intermediate = this.flatten(intermediate, url, map);
-      text = text.replace(match.matched, intermediate);
-    }
-    return text;
-  },
-  loadStyles: function(styles, 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, loadedStyle);
-    }
-  }
-};
-
-var styleResolver = new StyleResolver();
-
-// exports
-scope.styleResolver = styleResolver;
-
-})(window.Platform);
-
-/*
- * 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) {
-  scope = scope || {};
-  scope.external = scope.external || {};
-  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) {
-      if (inRoot) {
-        var t = inRoot.elementFromPoint(x, y);
-        var st, sr, os;
-        // is element a shadow host?
-        sr = this.targetingShadow(t);
-        while (sr) {
-          // find the the element inside the shadow root
-          st = sr.elementFromPoint(x, y);
-          if (!st) {
-            // check for older shadows
-            sr = this.olderShadow(sr);
-          } else {
-            // shadowed element may contain a shadow root
-            var ssr = this.targetingShadow(st);
-            return this.searchRoot(ssr, x, y) || st;
-          }
-        }
-        // light dom element is the target
-        return t;
-      }
-    },
-    owner: function(element) {
-      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) {
-      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);
-    }
-  };
-  scope.targetFinding = target;
-  scope.findTarget = target.findTarget.bind(target);
-
-  window.PointerEventsPolyfill = scope;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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() {
-  function shadowSelector(v) {
-    return 'body /shadow-deep/ ' + selector(v);
-  }
-  function selector(v) {
-    return '[touch-action="' + v + '"]';
-  }
-  function rule(v) {
-    return '{ -ms-touch-action: ' + v + '; touch-action: ' + v + '; touch-action-delay: none; }';
-  }
-  var attrib2css = [
-    'none',
-    'auto',
-    'pan-x',
-    'pan-y',
-    {
-      rule: 'pan-x pan-y',
-      selectors: [
-        'pan-x pan-y',
-        'pan-y pan-x'
-      ]
-    }
-  ];
-  var styles = '';
-  // only install stylesheet if the browser has touch action support
-  var head = document.head;
-  var hasNativePE = window.PointerEvent || window.MSPointerEvent;
-  // only add shadow selectors if shadowdom is supported
-  var hasShadowRoot = !window.ShadowDOMPolyfill && document.head.createShadowRoot;
-
-  if (hasNativePE) {
-    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 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.
- */
-
-/**
- * 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
-  ];
-
-  function PointerEvent(inType, inDict) {
-    inDict = inDict || Object.create(null);
-
-    var e = document.createEvent('Event');
-    e.initEvent(inType, inDict.bubbles || false, inDict.cancelable || false);
-
-    // 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;
-    return e;
-  }
-
-  // attach to window
-  if (!scope.PointerEvent) {
-    scope.PointerEvent = PointerEvent;
-  }
-})(window);
-
-/*
- * 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.
- */
-
-/**
- * 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.PointerEventsPolyfill);
-
-/*
- * 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) {
-  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'
-  ];
-
-  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
-  ];
-
-  var HAS_SVG_INSTANCE = (typeof SVGElementInstance !== 'undefined');
-
-  /**
-   * 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 = {
-    pointermap: new scope.PointerMap(),
-    eventMap: Object.create(null),
-    captureInfo: Object.create(null),
-    // Scope objects for native events.
-    // This exists for ease of testing.
-    eventSources: Object.create(null),
-    eventSourceList: [],
-    /**
-     * 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);
-      }
-    },
-    register: function(element) {
-      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);
-      }
-    },
-    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);
-      }
-    },
-    contains: scope.external.contains || function(container, contained) {
-      return container.contains(contained);
-    },
-    // EVENTS
-    down: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerdown', inEvent);
-    },
-    move: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointermove', inEvent);
-    },
-    up: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerup', inEvent);
-    },
-    enter: function(inEvent) {
-      inEvent.bubbles = false;
-      this.fireEvent('pointerenter', inEvent);
-    },
-    leave: function(inEvent) {
-      inEvent.bubbles = false;
-      this.fireEvent('pointerleave', inEvent);
-    },
-    over: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerover', inEvent);
-    },
-    out: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointerout', inEvent);
-    },
-    cancel: function(inEvent) {
-      inEvent.bubbles = true;
-      this.fireEvent('pointercancel', inEvent);
-    },
-    leaveOut: function(event) {
-      this.out(event);
-      if (!this.contains(event.target, event.relatedTarget)) {
-        this.leave(event);
-      }
-    },
-    enterOver: function(event) {
-      this.over(event);
-      if (!this.contains(event.target, event.relatedTarget)) {
-        this.enter(event);
-      }
-    },
-    // LISTENER LOGIC
-    eventHandler: function(inEvent) {
-      // This is used to prevent multiple dispatch of pointerevents 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.
-      if (inEvent._handledByPE) {
-        return;
-      }
-      var type = inEvent.type;
-      var fn = this.eventMap && this.eventMap[type];
-      if (fn) {
-        fn(inEvent);
-      }
-      inEvent._handledByPE = true;
-    },
-    // set up event listeners
-    listen: function(target, events) {
-      events.forEach(function(e) {
-        this.addEvent(target, e);
-      }, this);
-    },
-    // remove event listeners
-    unlisten: function(target, events) {
-      events.forEach(function(e) {
-        this.removeEvent(target, e);
-      }, this);
-    },
-    addEvent: scope.external.addEvent || function(target, eventName) {
-      target.addEventListener(eventName, this.boundHandler);
-    },
-    removeEvent: scope.external.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) {
-      // relatedTarget must be null if pointer is captured
-      if (this.captureInfo[inEvent.pointerId]) {
-        inEvent.relatedTarget = null;
-      }
-      var e = new PointerEvent(inType, inEvent);
-      if (inEvent.preventDefault) {
-        e.preventDefault = inEvent.preventDefault;
-      }
-      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 (HAS_SVG_INSTANCE && (p === 'target' || p === 'relatedTarget')) {
-          if (eventCopy[p] instanceof SVGElementInstance) {
-            eventCopy[p] = eventCopy[p].correspondingUseElement;
-          }
-        }
-      }
-      // keep the semantics of preventDefault
-      if (inEvent.preventDefault) {
-        eventCopy.preventDefault = function() {
-          inEvent.preventDefault();
-        };
-      }
-      return eventCopy;
-    },
-    getTarget: function(inEvent) {
-      // if pointer capture is set, route all events for the specified pointerId
-      // to the capture target
-      return this.captureInfo[inEvent.pointerId] || inEvent._target;
-    },
-    setCapture: function(inPointerId, inTarget) {
-      if (this.captureInfo[inPointerId]) {
-        this.releaseCapture(inPointerId);
-      }
-      this.captureInfo[inPointerId] = inTarget;
-      var e = document.createEvent('Event');
-      e.initEvent('gotpointercapture', true, false);
-      e.pointerId = inPointerId;
-      this.implicitRelease = this.releaseCapture.bind(this, inPointerId);
-      document.addEventListener('pointerup', this.implicitRelease);
-      document.addEventListener('pointercancel', this.implicitRelease);
-      e._target = inTarget;
-      this.asyncDispatchEvent(e);
-    },
-    releaseCapture: function(inPointerId) {
-      var t = this.captureInfo[inPointerId];
-      if (t) {
-        var e = document.createEvent('Event');
-        e.initEvent('lostpointercapture', true, false);
-        e.pointerId = inPointerId;
-        this.captureInfo[inPointerId] = undefined;
-        document.removeEventListener('pointerup', this.implicitRelease);
-        document.removeEventListener('pointercancel', this.implicitRelease);
-        e._target = t;
-        this.asyncDispatchEvent(e);
-      }
-    },
-    /**
-     * 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: scope.external.dispatchEvent || function(inEvent) {
-      var t = this.getTarget(inEvent);
-      if (t) {
-        return t.dispatchEvent(inEvent);
-      }
-    },
-    asyncDispatchEvent: function(inEvent) {
-      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent));
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  scope.dispatcher = dispatcher;
-  scope.register = dispatcher.register.bind(dispatcher);
-  scope.unregister = dispatcher.unregister.bind(dispatcher);
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * This module uses Mutation Observers to dynamically adjust which nodes will
- * generate Pointer Events.
- *
- * All nodes that wish to generate Pointer Events must have the attribute
- * `touch-action` set to `none`.
- */
-(function(scope) {
-  var forEach = Array.prototype.forEach.call.bind(Array.prototype.forEach);
-  var map = Array.prototype.map.call.bind(Array.prototype.map);
-  var toArray = Array.prototype.slice.call.bind(Array.prototype.slice);
-  var filter = Array.prototype.filter.call.bind(Array.prototype.filter);
-  var MO = window.MutationObserver || window.WebKitMutationObserver;
-  var SELECTOR = '[touch-action]';
-  var OBSERVER_INIT = {
-    subtree: true,
-    childList: true,
-    attributes: true,
-    attributeOldValue: true,
-    attributeFilter: ['touch-action']
-  };
-
-  function Installer(add, remove, changed, binder) {
-    this.addCallback = add.bind(binder);
-    this.removeCallback = remove.bind(binder);
-    this.changedCallback = changed.bind(binder);
-    if (MO) {
-      this.observer = new MO(this.mutationWatcher.bind(this));
-    }
-  }
-
-  Installer.prototype = {
-    watchSubtree: function(target) {
-      // Only watch scopes that can target find, as these are top-level.
-      // Otherwise we can see duplicate additions and removals that add noise.
-      //
-      // TODO(dfreedman): For some instances with ShadowDOMPolyfill, we can see
-      // a removal without an insertion when a node is redistributed among
-      // shadows. Since it all ends up correct in the document, watching only
-      // the document will yield the correct mutations to watch.
-      if (scope.targetFinding.canTarget(target)) {
-        this.observer.observe(target, OBSERVER_INIT);
-      }
-    },
-    enableOnSubtree: function(target) {
-      this.watchSubtree(target);
-      if (target === document && document.readyState !== 'complete') {
-        this.installOnLoad();
-      } else {
-        this.installNewSubtree(target);
-      }
-    },
-    installNewSubtree: function(target) {
-      forEach(this.findElements(target), this.addElement, this);
-    },
-    findElements: function(target) {
-      if (target.querySelectorAll) {
-        return target.querySelectorAll(SELECTOR);
-      }
-      return [];
-    },
-    removeElement: function(el) {
-      this.removeCallback(el);
-    },
-    addElement: function(el) {
-      this.addCallback(el);
-    },
-    elementChanged: function(el, oldValue) {
-      this.changedCallback(el, oldValue);
-    },
-    concatLists: function(accum, list) {
-      return accum.concat(toArray(list));
-    },
-    // register all touch-action = none nodes on document load
-    installOnLoad: function() {
-      document.addEventListener('readystatechange', function() {
-        if (document.readyState === 'complete') {
-          this.installNewSubtree(document);
-        }
-      }.bind(this));
-    },
-    isElement: function(n) {
-      return n.nodeType === Node.ELEMENT_NODE;
-    },
-    flattenMutationTree: function(inNodes) {
-      // find children with touch-action
-      var tree = map(inNodes, this.findElements, this);
-      // make sure the added nodes are accounted for
-      tree.push(filter(inNodes, this.isElement));
-      // flatten the list
-      return tree.reduce(this.concatLists, []);
-    },
-    mutationWatcher: function(mutations) {
-      mutations.forEach(this.mutationHandler, this);
-    },
-    mutationHandler: function(m) {
-      if (m.type === 'childList') {
-        var added = this.flattenMutationTree(m.addedNodes);
-        added.forEach(this.addElement, this);
-        var removed = this.flattenMutationTree(m.removedNodes);
-        removed.forEach(this.removeElement, this);
-      } else if (m.type === 'attributes') {
-        this.elementChanged(m.target, m.oldValue);
-      }
-    }
-  };
-
-  if (!MO) {
-    Installer.prototype.watchSubtree = function(){
-      console.warn('PointerEventsPolyfill: MutationObservers not found, touch-action will not be dynamically detected');
-    };
-  }
-
-  scope.Installer = Installer;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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) {
-  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',
-      'mouseover',
-      'mouseout'
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      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);
-      // forward mouse preventDefault
-      var pd = e.preventDefault;
-      e.preventDefault = function() {
-        inEvent.preventDefault();
-        pd();
-      };
-      e.pointerId = this.POINTER_ID;
-      e.isPrimary = true;
-      e.pointerType = this.POINTER_TYPE;
-      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.cancel(inEvent);
-        }
-        var e = this.prepareEvent(inEvent);
-        pointermap.set(this.POINTER_ID, inEvent);
-        dispatcher.down(e);
-      }
-    },
-    mousemove: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.move(e);
-      }
-    },
-    mouseup: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var p = pointermap.get(this.POINTER_ID);
-        if (p && p.button === inEvent.button) {
-          var e = this.prepareEvent(inEvent);
-          dispatcher.up(e);
-          this.cleanupMouse();
-        }
-      }
-    },
-    mouseover: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.enterOver(e);
-      }
-    },
-    mouseout: function(inEvent) {
-      if (!this.isEventSimulatedFromTouch(inEvent)) {
-        var e = this.prepareEvent(inEvent);
-        dispatcher.leaveOut(e);
-      }
-    },
-    cancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.cancel(e);
-      this.cleanupMouse();
-    },
-    cleanupMouse: function() {
-      pointermap['delete'](this.POINTER_ID);
-    }
-  };
-
-  scope.mouseEvents = mouseEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var captureInfo = dispatcher.captureInfo;
-  var findTarget = scope.findTarget;
-  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 ATTRIB = 'touch-action';
-  var INSTALLER;
-  // The presence of touch event handlers blocks scrolling, and so we must be careful to
-  // avoid adding handlers unnecessarily.  Chrome plans to add a touch-action-delay property
-  // (crbug.com/329559) to address this, and once we have that we can opt-in to a simpler
-  // handler registration mechanism.  Rather than try to predict how exactly to opt-in to
-  // that we'll just leave this disabled until there is a build of Chrome to test.
-  var HAS_TOUCH_ACTION_DELAY = false;
-  
-  // handler block for native touch events
-  var touchEvents = {
-    events: [
-      'touchstart',
-      'touchmove',
-      'touchend',
-      'touchcancel'
-    ],
-    register: function(target) {
-      if (HAS_TOUCH_ACTION_DELAY) {
-        dispatcher.listen(target, this.events);
-      } else {
-        INSTALLER.enableOnSubtree(target);
-      }
-    },
-    unregister: function(target) {
-      if (HAS_TOUCH_ACTION_DELAY) {
-        dispatcher.unlisten(target, this.events);
-      } else {
-        // TODO(dfreedman): is it worth it to disconnect the MO?
-      }
-    },
-    elementAdded: function(el) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      if (st) {
-        el._scrollType = st;
-        dispatcher.listen(el, this.events);
-        // set touch-action on shadows as well
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-          dispatcher.listen(s, this.events);
-        }, this);
-      }
-    },
-    elementRemoved: function(el) {
-      el._scrollType = undefined;
-      dispatcher.unlisten(el, this.events);
-      // remove touch-action from shadow
-      allShadows(el).forEach(function(s) {
-        s._scrollType = undefined;
-        dispatcher.unlisten(s, this.events);
-      }, this);
-    },
-    elementChanged: function(el, oldValue) {
-      var a = el.getAttribute(ATTRIB);
-      var st = this.touchActionToScrollType(a);
-      var oldSt = this.touchActionToScrollType(oldValue);
-      // simply update scrollType if listeners are already established
-      if (st && oldSt) {
-        el._scrollType = st;
-        allShadows(el).forEach(function(s) {
-          s._scrollType = st;
-        }, this);
-      } else if (oldSt) {
-        this.elementRemoved(el);
-      } else if (st) {
-        this.elementAdded(el);
-      }
-    },
-    scrollTypes: {
-      EMITTER: 'none',
-      XSCROLLER: 'pan-x',
-      YSCROLLER: 'pan-y',
-      SCROLLER: /^(?:pan-x pan-y)|(?:pan-y pan-x)|auto$/
-    },
-    touchActionToScrollType: function(touchAction) {
-      var t = touchAction;
-      var st = this.scrollTypes;
-      if (t === 'none') {
-        return 'none';
-      } else if (t === st.XSCROLLER) {
-        return 'X';
-      } else if (t === st.YSCROLLER) {
-        return 'Y';
-      } else if (st.SCROLLER.exec(t)) {
-        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 = false;
-        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;
-    },
-    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 = captureInfo[id] || findTarget(e);
-      e.bubbles = true;
-      e.cancelable = true;
-      e.detail = this.clickCount;
-      e.button = 0;
-      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;
-      // 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; i < tl.length; i++) {
-        t = tl[i];
-        inFunction.call(this, this.touchToPointer(t));
-      }
-    },
-    // 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 scrollAxis = inEvent.currentTarget._scrollType;
-        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;
-        }
-        this.firstXY = null;
-        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.out;
-            d.push(p);
-          }
-        }, this);
-        d.forEach(this.cancelOut, this);
-      }
-    },
-    touchstart: function(inEvent) {
-      this.vacuumTouches(inEvent);
-      this.setPrimaryTouch(inEvent.changedTouches[0]);
-      this.dedupSynthMouse(inEvent);
-      if (!this.scrolling) {
-        this.clickCount++;
-        this.processTouches(inEvent, this.overDown);
-      }
-    },
-    overDown: function(inPointer) {
-      var p = pointermap.set(inPointer.pointerId, {
-        target: inPointer.target,
-        out: inPointer,
-        outTarget: inPointer.target
-      });
-      dispatcher.over(inPointer);
-      dispatcher.enter(inPointer);
-      dispatcher.down(inPointer);
-    },
-    touchmove: function(inEvent) {
-      if (!this.scrolling) {
-        if (this.shouldScroll(inEvent)) {
-          this.scrolling = true;
-          this.touchcancel(inEvent);
-        } else {
-          inEvent.preventDefault();
-          this.processTouches(inEvent, this.moveOverOut);
-        }
-      }
-    },
-    moveOverOut: function(inPointer) {
-      var event = inPointer;
-      var pointer = pointermap.get(event.pointerId);
-      // a finger drifted off the screen, ignore it
-      if (!pointer) {
-        return;
-      }
-      var outEvent = pointer.out;
-      var outTarget = pointer.outTarget;
-      dispatcher.move(event);
-      if (outEvent && outTarget !== event.target) {
-        outEvent.relatedTarget = event.target;
-        event.relatedTarget = outTarget;
-        // recover from retargeting by shadow
-        outEvent.target = outTarget;
-        if (event.target) {
-          dispatcher.leaveOut(outEvent);
-          dispatcher.enterOver(event);
-        } else {
-          // clean up case when finger leaves the screen
-          event.target = outTarget;
-          event.relatedTarget = null;
-          this.cancelOut(event);
-        }
-      }
-      pointer.out = event;
-      pointer.outTarget = event.target;
-    },
-    touchend: function(inEvent) {
-      this.dedupSynthMouse(inEvent);
-      this.processTouches(inEvent, this.upOut);
-    },
-    upOut: function(inPointer) {
-      if (!this.scrolling) {
-        dispatcher.up(inPointer);
-        dispatcher.out(inPointer);
-        dispatcher.leave(inPointer);
-      }
-      this.cleanUpPointer(inPointer);
-    },
-    touchcancel: function(inEvent) {
-      this.processTouches(inEvent, this.cancelOut);
-    },
-    cancelOut: function(inPointer) {
-      dispatcher.cancel(inPointer);
-      dispatcher.out(inPointer);
-      dispatcher.leave(inPointer);
-      this.cleanUpPointer(inPointer);
-    },
-    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);
-      }
-    }
-  };
-
-  if (!HAS_TOUCH_ACTION_DELAY) {
-    INSTALLER = new scope.Installer(touchEvents.elementAdded, touchEvents.elementRemoved, touchEvents.elementChanged, touchEvents);
-  }
-
-  scope.touchEvents = touchEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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) {
-  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',
-      'MSPointerOut',
-      'MSPointerOver',
-      'MSPointerCancel',
-      'MSGotPointerCapture',
-      'MSLostPointerCapture'
-    ],
-    register: function(target) {
-      dispatcher.listen(target, this.events);
-    },
-    unregister: function(target) {
-      dispatcher.unlisten(target, this.events);
-    },
-    POINTER_TYPES: [
-      '',
-      'unavailable',
-      'touch',
-      'pen',
-      'mouse'
-    ],
-    prepareEvent: function(inEvent) {
-      var e = inEvent;
-      if (HAS_BITMAP_TYPE) {
-        e = dispatcher.cloneEvent(inEvent);
-        e.pointerType = this.POINTER_TYPES[inEvent.pointerType];
-      }
-      return e;
-    },
-    cleanup: function(id) {
-      pointermap['delete'](id);
-    },
-    MSPointerDown: function(inEvent) {
-      pointermap.set(inEvent.pointerId, inEvent);
-      var e = this.prepareEvent(inEvent);
-      dispatcher.down(e);
-    },
-    MSPointerMove: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.move(e);
-    },
-    MSPointerUp: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.up(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    MSPointerOut: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.leaveOut(e);
-    },
-    MSPointerOver: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.enterOver(e);
-    },
-    MSPointerCancel: function(inEvent) {
-      var e = this.prepareEvent(inEvent);
-      dispatcher.cancel(e);
-      this.cleanup(inEvent.pointerId);
-    },
-    MSLostPointerCapture: function(inEvent) {
-      var e = dispatcher.makeEvent('lostpointercapture', inEvent);
-      dispatcher.dispatchEvent(e);
-    },
-    MSGotPointerCapture: function(inEvent) {
-      var e = dispatcher.makeEvent('gotpointercapture', inEvent);
-      dispatcher.dispatchEvent(e);
-    }
-  };
-
-  scope.msEvents = msEvents;
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * 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;
-
-  // only activate if this platform does not have pointer events
-  if (window.PointerEvent !== scope.PointerEvent) {
-
-    if (window.navigator.msPointerEnabled) {
-      var tp = window.navigator.msMaxTouchPoints;
-      Object.defineProperty(window.navigator, 'maxTouchPoints', {
-        value: tp,
-        enumerable: true
-      });
-      dispatcher.registerSource('ms', scope.msEvents);
-    } else {
-      dispatcher.registerSource('mouse', scope.mouseEvents);
-      if (window.ontouchstart !== undefined) {
-        dispatcher.registerSource('touch', scope.touchEvents);
-      }
-    }
-
-    dispatcher.register(document);
-  }
-})(window.PointerEventsPolyfill);
-
-/*
- * 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) {
-  var dispatcher = scope.dispatcher;
-  var n = window.navigator;
-  var s, r;
-  function assertDown(id) {
-    if (!dispatcher.pointermap.has(id)) {
-      throw new Error('InvalidPointerId');
-    }
-  }
-  if (n.msPointerEnabled) {
-    s = function(pointerId) {
-      assertDown(pointerId);
-      this.msSetPointerCapture(pointerId);
-    };
-    r = function(pointerId) {
-      assertDown(pointerId);
-      this.msReleasePointerCapture(pointerId);
-    };
-  } else {
-    s = function setPointerCapture(pointerId) {
-      assertDown(pointerId);
-      dispatcher.setCapture(pointerId, this);
-    };
-    r = function releasePointerCapture(pointerId) {
-      assertDown(pointerId);
-      dispatcher.releaseCapture(pointerId, this);
-    };
-  }
-  if (window.Element && !Element.prototype.setPointerCapture) {
-    Object.defineProperties(Element.prototype, {
-      'setPointerCapture': {
-        value: s
-      },
-      'releasePointerCapture': {
-        value: r
-      }
-    });
-  }
-})(window.PointerEventsPolyfill);
-
-/*
- * 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.
- */
-
-/**
- * PointerGestureEvent is the constructor for all PointerGesture events.
- *
- * @module PointerGestures
- * @class PointerGestureEvent
- * @extends UIEvent
- * @constructor
- * @param {String} inType Event type
- * @param {Object} [inDict] Dictionary of properties to initialize on the event
- */
-
-function PointerGestureEvent(inType, inDict) {
-  var dict = inDict || {};
-  var e = document.createEvent('Event');
-  var props = {
-    bubbles: Boolean(dict.bubbles) === dict.bubbles || true,
-    cancelable: Boolean(dict.cancelable) === dict.cancelable || true
-  };
-
-  e.initEvent(inType, props.bubbles, props.cancelable);
-
-  var keys = Object.keys(dict), k;
-  for (var i = 0; i < keys.length; i++) {
-    k = keys[i];
-    e[k] = dict[k];
-  }
-
-  e.preventTap = this.preventTap;
-
-  return e;
-}
-
-/**
- * Allows for any gesture to prevent the tap gesture.
- *
- * @method preventTap
- */
-PointerGestureEvent.prototype.preventTap = function() {
-  this.tapPrevented = true;
-};
-
-
-/*
- * 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) {
-  /**
-   * This class contains the gesture recognizers that create the PointerGesture
-   * events.
-   *
-   * @class PointerGestures
-   * @static
-   */
-  scope = scope || {};
-  scope.utils = {
-    LCA: {
-      // Determines the lowest node in the ancestor chain of a and b
-      find: function(a, b) {
-        if (a === b) {
-          return a;
-        }
-        // fast case, a is a direct descendant of b or vice versa
-        if (a.contains) {
-          if (a.contains(b)) {
-            return a;
-          }
-          if (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 = this.walk(a, 1);
-          b = this.walk(b, 1);
-        }
-        return a;
-      },
-      walk: function(n, u) {
-        for (var i = 0; i < u; i++) {
-          n = n.parentNode;
-        }
-        return n;
-      },
-      depth: function(n) {
-        var d = 0;
-        while(n) {
-          d++;
-          n = n.parentNode;
-        }
-        return d;
-      }
-    }
-  };
-  scope.findLCA = function(a, b) {
-    return scope.utils.LCA.find(a, b);
-  }
-  window.PointerGestures = scope;
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * 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.PointerGestures);
-
-/*
- * 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) {
-  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',
-    'screenX',
-    'screenY',
-    'pageX',
-    'pageY',
-    'tapPrevented'
-  ];
-
-  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
-  ];
-
-  var dispatcher = {
-    handledEvents: new WeakMap(),
-    targets: new WeakMap(),
-    handlers: {},
-    recognizers: {},
-    events: {},
-    // Add a new gesture recognizer to the event listeners.
-    // Recognizer needs an `events` property.
-    registerRecognizer: function(inName, inRecognizer) {
-      var r = inRecognizer;
-      this.recognizers[inName] = r;
-      r.events.forEach(function(e) {
-        if (r[e]) {
-          this.events[e] = true;
-          var f = r[e].bind(r);
-          this.addHandler(e, f);
-        }
-      }, this);
-    },
-    addHandler: function(inEvent, inFn) {
-      var e = inEvent;
-      if (!this.handlers[e]) {
-        this.handlers[e] = [];
-      }
-      this.handlers[e].push(inFn);
-    },
-    // add event listeners for inTarget
-    registerTarget: function(inTarget) {
-      this.listen(Object.keys(this.events), inTarget);
-    },
-    // remove event listeners for inTarget
-    unregisterTarget: function(inTarget) {
-      this.unlisten(Object.keys(this.events), inTarget);
-    },
-    // LISTENER LOGIC
-    eventHandler: function(inEvent) {
-      if (this.handledEvents.get(inEvent)) {
-        return;
-      }
-      var type = inEvent.type, fns = this.handlers[type];
-      if (fns) {
-        this.makeQueue(fns, inEvent);
-      }
-      this.handledEvents.set(inEvent, true);
-    },
-    // queue event for async dispatch
-    makeQueue: function(inHandlerFns, inEvent) {
-      // must clone events to keep the (possibly shadowed) target correct for
-      // async dispatching
-      var e = this.cloneEvent(inEvent);
-      requestAnimationFrame(this.runQueue.bind(this, inHandlerFns, e));
-    },
-    // Dispatch the queued events
-    runQueue: function(inHandlers, inEvent) {
-      this.currentPointerId = inEvent.pointerId;
-      for (var i = 0, f, l = inHandlers.length; (i < l) && (f = inHandlers[i]); i++) {
-        f(inEvent);
-      }
-      this.currentPointerId = 0;
-    },
-    // set up event listeners
-    listen: function(inEvents, inTarget) {
-      inEvents.forEach(function(e) {
-        this.addEvent(e, this.boundHandler, false, inTarget);
-      }, this);
-    },
-    // remove event listeners
-    unlisten: function(inEvents) {
-      inEvents.forEach(function(e) {
-        this.removeEvent(e, this.boundHandler, false, inTarget);
-      }, this);
-    },
-    addEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
-      inTarget.addEventListener(inEventName, inEventHandler, inCapture);
-    },
-    removeEvent: function(inEventName, inEventHandler, inCapture, inTarget) {
-      inTarget.removeEventListener(inEventName, inEventHandler, inCapture);
-    },
-    // EVENT CREATION AND TRACKING
-    // Creates a new Event of type `inType`, based on the information in
-    // `inEvent`.
-    makeEvent: function(inType, inDict) {
-      return new PointerGestureEvent(inType, inDict);
-    },
-    /*
-     * Returns a snapshot of inEvent, with writable properties.
-     *
-     * @method cloneEvent
-     * @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 = {}, p;
-      for (var i = 0; i < CLONE_PROPS.length; i++) {
-        p = CLONE_PROPS[i];
-        eventCopy[p] = inEvent[p] || CLONE_DEFAULTS[i];
-      }
-      return eventCopy;
-    },
-    // Dispatches the event to its target.
-    dispatchEvent: function(inEvent, inTarget) {
-      var t = inTarget || this.targets.get(inEvent);
-      if (t) {
-        t.dispatchEvent(inEvent);
-        if (inEvent.tapPrevented) {
-          this.preventTap(this.currentPointerId);
-        }
-      }
-    },
-    asyncDispatchEvent: function(inEvent, inTarget) {
-      requestAnimationFrame(this.dispatchEvent.bind(this, inEvent, inTarget));
-    },
-    preventTap: function(inPointerId) {
-      var t = this.recognizers.tap;
-      if (t){
-        t.preventTap(inPointerId);
-      }
-    }
-  };
-  dispatcher.boundHandler = dispatcher.eventHandler.bind(dispatcher);
-  // recognizers call into the dispatcher and load later
-  // solve the chicken and egg problem by having registerScopes module run last
-  dispatcher.registerQueue = [];
-  dispatcher.immediateRegister = false;
-  scope.dispatcher = dispatcher;
-  /**
-   * Enable gesture events for a given scope, typically
-   * [ShadowRoots](https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#shadow-root-object).
-   *
-   * @for PointerGestures
-   * @method register
-   * @param {ShadowRoot} scope A top level scope to enable gesture
-   * support on.
-   */
-  scope.register = function(inScope) {
-    if (dispatcher.immediateRegister) {
-      var pe = window.PointerEventsPolyfill;
-      if (pe) {
-        pe.register(inScope);
-      }
-      scope.dispatcher.registerTarget(inScope);
-    } else {
-      dispatcher.registerQueue.push(inScope);
-    }
-  };
-  scope.register(document);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * 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 released
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  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: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    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;
-    },
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !this.heldPointer) {
-        this.heldPointer = inEvent;
-        this.target = inEvent.target;
-        this.holdJob = setInterval(this.pulse.bind(this), this.HOLD_DELAY);
-      }
-    },
-    pointerup: function(inEvent) {
-      if (this.heldPointer && this.heldPointer.pointerId === inEvent.pointerId) {
-        this.cancel();
-      }
-    },
-    pointercancel: function(inEvent) {
-      this.cancel();
-    },
-    pointermove: 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 = {
-        pointerType: this.heldPointer.pointerType,
-        clientX: this.heldPointer.clientX,
-        clientY: this.heldPointer.clientY
-      };
-      if (inHoldTime) {
-        p.holdTime = inHoldTime;
-      }
-      var e = dispatcher.makeEvent(inType, p);
-      dispatcher.dispatchEvent(e, this.target);
-      if (e.tapPrevented) {
-        dispatcher.preventTap(this.heldPointer.pointerId);
-      }
-    }
-  };
-  dispatcher.registerRecognizer('hold', hold);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * 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 pointermap = new scope.PointerMap();
-   var track = {
-     events: [
-       'pointerdown',
-       'pointermove',
-       'pointerup',
-       'pointercancel'
-     ],
-     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);
-       }
-       if (dd.y) {
-         t.yDirection = this.clampDir(dd.y);
-       }
-       var trackData = {
-         dx: d.x,
-         dy: d.y,
-         ddx: dd.x,
-         ddy: dd.y,
-         clientX: inEvent.clientX,
-         clientY: inEvent.clientY,
-         pageX: inEvent.pageX,
-         pageY: inEvent.pageY,
-         screenX: inEvent.screenX,
-         screenY: inEvent.screenY,
-         xDirection: t.xDirection,
-         yDirection: t.yDirection,
-         trackInfo: t.trackInfo,
-         relatedTarget: inEvent.target,
-         pointerType: inEvent.pointerType
-       };
-       var e = dispatcher.makeEvent(inType, trackData);
-       t.lastMoveEvent = inEvent;
-       dispatcher.dispatchEvent(e, t.downTarget);
-     },
-     pointerdown: 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);
-       }
-     },
-     pointermove: 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;
-             this.fireTrack('trackstart', p.downEvent, p);
-             this.fireTrack('track', inEvent, p);
-           }
-         } else {
-           this.fireTrack('track', inEvent, p);
-         }
-       }
-     },
-     pointerup: function(inEvent) {
-       var p = pointermap.get(inEvent.pointerId);
-       if (p) {
-         if (p.tracking) {
-           this.fireTrack('trackend', inEvent, p);
-         }
-         pointermap.delete(inEvent.pointerId);
-       }
-     },
-     pointercancel: function(inEvent) {
-       this.pointerup(inEvent);
-     }
-   };
-   dispatcher.registerRecognizer('track', track);
- })(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * This event denotes a rapid down/move/up sequence from a pointer.
- *
- * The event is sent to the first element the pointer went down on.
- *
- * @module PointerGestures
- * @submodule Events
- * @class flick
- */
-/**
- * Signed velocity of the flick in the x direction.
- * @property xVelocity
- * @type Number
- */
-/**
- * Signed velocity of the flick in the y direction.
- * @type Number
- * @property yVelocity
- */
-/**
- * Unsigned total velocity of the flick.
- * @type Number
- * @property velocity
- */
-/**
- * Angle of the flick in degrees, with 0 along the
- * positive x axis.
- * @type Number
- * @property angle
- */
-/**
- * Axis with the greatest absolute velocity. Denoted
- * with 'x' or 'y'.
- * @type String
- * @property majorAxis
- */
-/**
- * Type of the pointer that made the flick.
- * @type String
- * @property pointerType
- */
-
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  var flick = {
-    // TODO(dfreedman): value should be low enough for low speed flicks, but
-    // high enough to remove accidental flicks
-    MIN_VELOCITY: 0.5 /* px/ms */,
-    MAX_QUEUE: 4,
-    moveQueue: [],
-    target: null,
-    pointerId: null,
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !this.pointerId) {
-        this.pointerId = inEvent.pointerId;
-        this.target = inEvent.target;
-        this.addMove(inEvent);
-      }
-    },
-    pointermove: function(inEvent) {
-      if (inEvent.pointerId === this.pointerId) {
-        this.addMove(inEvent);
-      }
-    },
-    pointerup: function(inEvent) {
-      if (inEvent.pointerId === this.pointerId) {
-        this.fireFlick(inEvent);
-      }
-      this.cleanup();
-    },
-    pointercancel: function(inEvent) {
-      this.cleanup();
-    },
-    cleanup: function() {
-      this.moveQueue = [];
-      this.target = null;
-      this.pointerId = null;
-    },
-    addMove: function(inEvent) {
-      if (this.moveQueue.length >= this.MAX_QUEUE) {
-        this.moveQueue.shift();
-      }
-      this.moveQueue.push(inEvent);
-    },
-    fireFlick: function(inEvent) {
-      var e = inEvent;
-      var l = this.moveQueue.length;
-      var dt, dx, dy, tx, ty, tv, x = 0, y = 0, v = 0;
-      // flick based off the fastest segment of movement
-      for (var i = 0, m; i < l && (m = this.moveQueue[i]); i++) {
-        dt = e.timeStamp - m.timeStamp;
-        dx = e.clientX - m.clientX, dy = e.clientY - m.clientY;
-        tx = dx / dt, ty = dy / dt, tv = Math.sqrt(tx * tx + ty * ty);
-        if (tv > v) {
-          x = tx, y = ty, v = tv;
-        }
-      }
-      var ma = Math.abs(x) > Math.abs(y) ? 'x' : 'y';
-      var a = this.calcAngle(x, y);
-      if (Math.abs(v) >= this.MIN_VELOCITY) {
-        var ev = dispatcher.makeEvent('flick', {
-          xVelocity: x,
-          yVelocity: y,
-          velocity: v,
-          angle: a,
-          majorAxis: ma,
-          pointerType: inEvent.pointerType
-        });
-        dispatcher.dispatchEvent(ev, this.target);
-      }
-    },
-    calcAngle: function(inX, inY) {
-      return (Math.atan2(inY, inX) * 180 / Math.PI);
-    }
-  };
-  dispatcher.registerRecognizer('flick', flick);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/*
- * Basic strategy: find the farthest apart points, use as diameter of circle
- * react to size change and rotation of the chord
- */
-
-/**
- * @module PointerGestures
- * @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 PointerGestures
- * @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 pointermap = new scope.PointerMap();
-  var RAD_TO_DEG = 180 / Math.PI;
-  var pinch = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel'
-    ],
-    reference: {},
-    pointerdown: function(ev) {
-      pointermap.set(ev.pointerId, ev);
-      if (pointermap.pointers() == 2) {
-        var points = this.calcChord();
-        var angle = this.calcAngle(points);
-        this.reference = {
-          angle: angle,
-          diameter: points.diameter,
-          target: scope.findLCA(points.a.target, points.b.target)
-        };
-      }
-    },
-    pointerup: function(ev) {
-      pointermap.delete(ev.pointerId);
-    },
-    pointermove: function(ev) {
-      if (pointermap.has(ev.pointerId)) {
-        pointermap.set(ev.pointerId, ev);
-        if (pointermap.pointers() > 1) {
-          this.calcPinchRotate();
-        }
-      }
-    },
-    pointercancel: function(ev) {
-      this.pointerup(ev);
-    },
-    dispatchPinch: function(diameter, points) {
-      var zoom = diameter / this.reference.diameter;
-      var ev = dispatcher.makeEvent('pinch', {
-        scale: zoom,
-        centerX: points.center.x,
-        centerY: points.center.y
-      });
-      dispatcher.dispatchEvent(ev, this.reference.target);
-    },
-    dispatchRotate: function(angle, points) {
-      var diff = Math.round((angle - this.reference.angle) % 360);
-      var ev = dispatcher.makeEvent('rotate', {
-        angle: diff,
-        centerX: points.center.x,
-        centerY: points.center.y
-      });
-      dispatcher.dispatchEvent(ev, this.reference.target);
-    },
-    calcPinchRotate: function() {
-      var points = this.calcChord();
-      var diameter = points.diameter;
-      var angle = this.calcAngle(points);
-      if (diameter != this.reference.diameter) {
-        this.dispatchPinch(diameter, points);
-      }
-      if (angle != this.reference.angle) {
-        this.dispatchRotate(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.registerRecognizer('pinch', pinch);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * 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 pointermap = new scope.PointerMap();
-  var tap = {
-    events: [
-      'pointerdown',
-      'pointermove',
-      'pointerup',
-      'pointercancel',
-      'keyup'
-    ],
-    pointerdown: function(inEvent) {
-      if (inEvent.isPrimary && !inEvent.tapPrevented) {
-        pointermap.set(inEvent.pointerId, {
-          target: inEvent.target,
-          buttons: inEvent.buttons,
-          x: inEvent.clientX,
-          y: inEvent.clientY
-        });
-      }
-    },
-    pointermove: function(inEvent) {
-      if (inEvent.isPrimary) {
-        var start = pointermap.get(inEvent.pointerId);
-        if (start) {
-          if (inEvent.tapPrevented) {
-            pointermap.delete(inEvent.pointerId);
-          }
-        }
-      }
-    },
-    shouldTap: function(e, downState) {
-      if (!e.tapPrevented) {
-        if (e.pointerType === 'mouse') {
-          // only allow left click to tap for mouse
-          return downState.buttons === 1;
-        } else {
-          return true;
-        }
-      }
-    },
-    pointerup: function(inEvent) {
-      var start = pointermap.get(inEvent.pointerId);
-      if (start && this.shouldTap(inEvent, start)) {
-        var t = scope.findLCA(start.target, inEvent.target);
-        if (t) {
-          var e = dispatcher.makeEvent('tap', {
-            x: inEvent.clientX,
-            y: inEvent.clientY,
-            detail: inEvent.detail,
-            pointerType: inEvent.pointerType
-          });
-          dispatcher.dispatchEvent(e, t);
-        }
-      }
-      pointermap.delete(inEvent.pointerId);
-    },
-    pointercancel: function(inEvent) {
-      pointermap.delete(inEvent.pointerId);
-    },
-    keyup: function(inEvent) {
-      var code = inEvent.keyCode;
-      // 32 == spacebar
-      if (code === 32) {
-        var t = inEvent.target;
-        if (!(t instanceof HTMLInputElement || t instanceof HTMLTextAreaElement)) {
-          dispatcher.dispatchEvent(dispatcher.makeEvent('tap', {
-            x: 0,
-            y: 0,
-            detail: 0,
-            pointerType: 'unavailable'
-          }), t);
-        }
-      }
-    },
-    preventTap: function(inPointerId) {
-      pointermap.delete(inPointerId);
-    }
-  };
-  dispatcher.registerRecognizer('tap', tap);
-})(window.PointerGestures);
-
-/*
- * 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.
- */
-
-/**
- * Because recognizers are loaded after dispatcher, we have to wait to register
- * scopes until after all the recognizers.
- */
-(function(scope) {
-  var dispatcher = scope.dispatcher;
-  function registerScopes() {
-    dispatcher.immediateRegister = true;
-    var rq = dispatcher.registerQueue;
-    rq.forEach(scope.register);
-    rq.length = 0;
-  }
-  if (document.readyState === 'complete') {
-    registerScopes();
-  } else {
-    // register scopes after a steadystate is reached
-    // less MutationObserver churn
-    document.addEventListener('readystatechange', function() {
-      if (document.readyState === 'complete') {
-        registerScopes();
-      }
-    });
-  }
-})(window.PointerGestures);
-
-// 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);
-  };
-
-  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('');
-
-        // 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);
-
-      if (!this.refContent_)
-        this.refContent_ = this.ref_.content;
-      var content = this.refContent_;
-      if (content.firstChild === null)
-        return emptyInstance;
-
-      var map = this.bindingMap_;
-      if (!map || map.content !== content) {
-        // TODO(rafaelw): Setup a MutationObserver on content to detect
-        // when the instanceMap is invalid.
-        map = createInstanceBindingMap(content,
-            delegate_ && delegate_.prepareBinding) || [];
-        map.content = content;
-        this.bindingMap_ = map;
-      }
-
-      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();
-    },
-
-    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 {
-        raw: bindingDelegate,
-        prepareBinding: delegateFn('prepareBinding'),
-        prepareInstanceModel: delegateFn('prepareInstanceModel'),
-        prepareInstancePositionChanged:
-            delegateFn('prepareInstancePositionChanged')
-      };
-    },
-
-    // TODO(rafaelw): Assigning .bindingDelegate always succeeds. It may
-    // make sense to issue a warning or even throw if the template is already
-    // "activated", since this would be a strange thing to do.
-    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);
-    }
-
-    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;
-  }
-
-  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_;
-
-      if (directives.if) {
-        deps.hasIf = true;
-        deps.ifOneTime = directives.if.onlyOneTime;
-        deps.ifValue = processBinding(IF, directives.if, template, model);
-
-        // oneTime if & predicate is false. nothing else to do.
-        if (deps.ifOneTime && !deps.ifValue) {
-          this.updateIteratedValue();
-          return;
-        }
-
-        if (!deps.ifOneTime)
-          deps.ifValue.open(this.updateIteratedValue, 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);
-      }
-
-      if (!deps.oneTime)
-        deps.value.open(this.updateIteratedValue, this);
-
-      this.updateIteratedValue();
-    },
-
-    updateIteratedValue: function() {
-      if (this.deps.hasIf) {
-        var ifValue = this.deps.ifValue;
-        if (!this.deps.ifOneTime)
-          ifValue = ifValue.discardChanges();
-        if (!ifValue) {
-          this.valueChanged();
-          return;
-        }
-      }
-
-      var value = this.deps.value;
-      if (!this.deps.oneTime)
-        value = value.discardChanges();
-      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) 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, property;
-
-        expr = parsePrimaryExpression();
-
-        while (match('.') || match('[')) {
-            if (match('[')) {
-                property = parseComputedMember();
-                expr = delegate.createMemberExpression('[', expr, property);
-            } else {
-                property = parseNonComputedMember();
-                expr = delegate.createMemberExpression('.', expr, property);
-            }
-        }
-
-        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';
-
-  // 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;
-      };
-
-  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) {
-    // convert literal computed property access where literal value is a value
-    // path to ident dot-access.
-    if (accessor == '[' &&
-        property instanceof Literal &&
-        Path.get(property.value).valid) {
-      accessor = '.';
-      property = new IdentPath(property.value);
-    }
-
-    this.dynamicDeps = typeof object == 'function' || object.dynamic;
-
-    this.dynamic = typeof property == 'function' ||
-                   property.dynamic ||
-                   accessor == '[';
-
-    this.simplePath =
-        !this.dynamic &&
-        !this.dynamicDeps &&
-        property instanceof IdentPath &&
-        (object instanceof MemberExpression || object instanceof IdentPath);
-
-    this.object = this.simplePath ? object : getFn(object);
-    this.property = accessor == '.' ? property : getFn(property);
-  }
-
-  MemberExpression.prototype = {
-    get fullPath() {
-      if (!this.fullPath_) {
-        var last = this.object instanceof IdentPath ?
-            this.object.name : this.object.fullPath;
-        this.fullPath_ = Path.get(last + '.' + this.property.name);
-      }
-
-      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.property instanceof IdentPath) {
-          var path = Path.get(this.property.name);
-
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-
-            if (observer)
-              observer.addPath(context, path);
-
-            return path.getValueFrom(context);
-          }
-        } else {
-          // Computed property.
-          var property = this.property;
-
-          this.valueFn_ = function(model, observer) {
-            var context = object(model, observer);
-            var propName = property(model, observer);
-            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(value, toModelDirection, filterRegistry, model,
-                        observer) {
-      var fn = filterRegistry[this.name];
-      var context = model;
-      if (fn) {
-        context = undefined;
-      } else {
-        fn = context[this.name];
-        if (!fn) {
-          console.error('Cannot find 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('No ' + (toModelDirection ? 'toModel' : 'toDOM') +
-                      ' found on' + this.name);
-        return;
-      }
-
-      var args = [value];
-      for (var i = 0; i < this.args.length; i++) {
-        args[i + 1] = getFn(this.args[i])(model, observer);
-      }
-
-      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) {
-        return unaryOperators[op](argument(model, observer));
-      };
-    },
-
-    createBinaryExpression: function(op, left, right) {
-      if (!binaryOperators[op])
-        throw Error('Disallowed operator: ' + op);
-
-      left = getFn(left);
-      right = getFn(right);
-
-      return function(model, observer) {
-        return binaryOperators[op](left(model, observer),
-                                   right(model, observer));
-      };
-    },
-
-    createConditionalExpression: function(test, consequent, alternate) {
-      test = getFn(test);
-      consequent = getFn(consequent);
-      alternate = getFn(alternate);
-
-      return function(model, observer) {
-        return test(model, observer) ?
-            consequent(model, observer) : alternate(model, observer);
-      }
-    },
-
-    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;
-    },
-
-    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) {
-        var arr = []
-        for (var i = 0; i < elements.length; i++)
-          arr.push(elements[i](model, observer));
-        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) {
-        var obj = {};
-        for (var i = 0; i < properties.length; i++)
-          obj[properties[i].key] = properties[i].value(model, observer);
-        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);
-      for (var i = 0; i < this.filters.length; i++) {
-        value = this.filters[i].transform(value, false, filterRegistry, model,
-                                          observer);
-      }
-
-      return value;
-    },
-
-    setValue: function(model, newValue, filterRegistry) {
-      var count = this.filters ? this.filters.length : 0;
-      while (count-- > 0) {
-        newValue = this.filters[count].transform(newValue, true, filterRegistry,
-                                                 model);
-      }
-
-      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();
-    });
-  }
-
-  function isEventHandler(name) {
-    return name[0] === 'o' &&
-           name[1] === 'n' &&
-           name[2] === '-';
-  }
-
-  var mixedCaseEventTypes = {};
-  [
-    'webkitAnimationStart',
-    'webkitAnimationEnd',
-    'webkitTransitionEnd',
-    'DOMFocusOut',
-    'DOMFocusIn',
-    'DOMMouseScroll'
-  ].forEach(function(e) {
-    mixedCaseEventTypes[e.toLowerCase()] = e;
-  });
-
-  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 resolveEventReceiver(model, path, node) {
-    if (path.length == 0)
-      return undefined;
-
-    if (path.length == 1)
-      return findScope(model, path[0]);
-
-    for (var i = 0; model != null && i < path.length - 1; i++) {
-      model = model[path[i]];
-    }
-
-    return model;
-  }
-
-  function prepareEventBinding(path, name, polymerExpressions) {
-    var eventType = name.substring(3);
-    eventType = mixedCaseEventTypes[eventType] || eventType;
-
-    return function(model, node, oneTime) {
-      var fn, receiver, handler;
-      if (typeof polymerExpressions.resolveEventHandler == 'function') {
-        handler = function(e) {
-          fn = fn || polymerExpressions.resolveEventHandler(model, path, node);
-          fn(e, e.detail, e.currentTarget);
-
-          if (Platform && typeof Platform.flush == 'function')
-            Platform.flush();
-        };
-      } else {
-        handler = function(e) {
-          fn = fn || path.getValueFrom(model);
-          receiver = receiver || resolveEventReceiver(model, path, node);
-
-          fn.apply(receiver, [e, e.detail, e.currentTarget]);
-
-          if (Platform && typeof Platform.flush == 'function')
-            Platform.flush();
-        };
-      }
-
-      node.addEventListener(eventType, handler);
-
-      if (oneTime)
-        return;
-
-      function bindingValue() {
-        return '{{ ' + path + ' }}';
-      }
-
-      return {
-        open: bindingValue,
-        discardChanges: bindingValue,
-        close: function() {
-          node.removeEventListener(eventType, handler);
-        }
-      };
-    }
-  }
-
-  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 (isEventHandler(name)) {
-        if (!path.valid) {
-          console.error('on-* bindings must be simple path expressions');
-          return;
-        }
-
-        return prepareEventBinding(path, name, this);
-      }
-
-      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) {
-        var scope = Object.create(parentScope);
-        scope[scopeName] = model;
-        scope[indexName] = undefined;
-        scope[parentScopeName] = parentScope;
-        return scope;
-      };
-    }
-  };
-
-  global.PolymerExpressions = PolymerExpressions;
-  if (global.exposeGetExpression)
-    global.getExpression_ = getExpression;
-
-  global.PolymerExpressions.prepareEventBinding = prepareEventBinding;
-})(this);
-
-/*
- * 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) {
-
-// 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);
-
-
-//# sourceMappingURL=platform.concat.js.map
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/app.dart b/runtime/bin/vmservice/client/lib/app.dart
index e1b13b6..d5c788b 100644
--- a/runtime/bin/vmservice/client/lib/app.dart
+++ b/runtime/bin/vmservice/client/lib/app.dart
@@ -11,6 +11,7 @@
 
 import 'package:logging/logging.dart';
 import 'package:observatory/service_html.dart';
+import 'package:observatory/elements.dart';
 import 'package:polymer/polymer.dart';
 
 part 'src/app/application.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.dart b/runtime/bin/vmservice/client/lib/elements.dart
index 146b624..47d1dc3 100644
--- a/runtime/bin/vmservice/client/lib/elements.dart
+++ b/runtime/bin/vmservice/client/lib/elements.dart
@@ -4,10 +4,10 @@
 export 'package:observatory/src/elements/action_link.dart';
 export 'package:observatory/src/elements/breakpoint_list.dart';
 export 'package:observatory/src/elements/class_ref.dart';
+export 'package:observatory/src/elements/class_tree.dart';
 export 'package:observatory/src/elements/class_view.dart';
 export 'package:observatory/src/elements/code_ref.dart';
 export 'package:observatory/src/elements/code_view.dart';
-export 'package:observatory/src/elements/collapsible_content.dart';
 export 'package:observatory/src/elements/curly_block.dart';
 export 'package:observatory/src/elements/error_view.dart';
 export 'package:observatory/src/elements/eval_box.dart';
@@ -31,7 +31,7 @@
 export 'package:observatory/src/elements/library_view.dart';
 export 'package:observatory/src/elements/nav_bar.dart';
 export 'package:observatory/src/elements/observatory_application.dart';
-export 'package:observatory/src/elements/response_viewer.dart';
+export 'package:observatory/src/elements/observatory_element.dart';
 export 'package:observatory/src/elements/script_inset.dart';
 export 'package:observatory/src/elements/script_ref.dart';
 export 'package:observatory/src/elements/script_view.dart';
diff --git a/runtime/bin/vmservice/client/lib/elements.html b/runtime/bin/vmservice/client/lib/elements.html
index c104893..b3cb8a7 100644
--- a/runtime/bin/vmservice/client/lib/elements.html
+++ b/runtime/bin/vmservice/client/lib/elements.html
@@ -4,11 +4,11 @@
   <link rel="import" href="src/elements/action_link.html">
   <link rel="import" href="src/elements/breakpoint_list.html">
   <link rel="import" href="src/elements/class_ref.html">
+  <link rel="import" href="src/elements/class_tree.html">
   <link rel="import" href="src/elements/class_view.html">
   <link rel="import" href="src/elements/code_ref.html">
   <link rel="import" href="src/elements/code_view.html">
   <link rel="import" href="src/elements/curly_block.html">
-  <link rel="import" href="src/elements/collapsible_content.html">
   <link rel="import" href="src/elements/error_view.html">
   <link rel="import" href="src/elements/eval_box.html">
   <link rel="import" href="src/elements/eval_link.html">
@@ -30,7 +30,6 @@
   <link rel="import" href="src/elements/nav_bar.html">
   <link rel="import" href="src/elements/observatory_application.html">
   <link rel="import" href="src/elements/observatory_element.html">
-  <link rel="import" href="src/elements/response_viewer.html">
   <link rel="import" href="src/elements/script_inset.html">
   <link rel="import" href="src/elements/script_ref.html">
   <link rel="import" href="src/elements/script_view.html">
diff --git a/runtime/bin/vmservice/client/lib/service_html.dart b/runtime/bin/vmservice/client/lib/service_html.dart
index 1a892aa..d611bfe 100644
--- a/runtime/bin/vmservice/client/lib/service_html.dart
+++ b/runtime/bin/vmservice/client/lib/service_html.dart
@@ -32,19 +32,28 @@
   }
 
   Future<String> getString(String id) {
+    // Ensure we don't request host//id.
+    if (host.endsWith('/') && id.startsWith('/')) {
+      id = id.substring(1);
+    }
     Logger.root.info('Fetching $id from $host');
-    return HttpRequest.getString(host + id).catchError((error) {
+    return HttpRequest.request(host + id,
+                               requestHeaders: {
+                                  'Observatory-Version': '1.0'
+                               }).then((HttpRequest request) {
+        return request.responseText;
+      }).catchError((error) {
       // If we get an error here, the network request has failed.
-      Logger.root.severe('HttpRequest.getString failed.');
+      Logger.root.severe('HttpRequest.request failed.');
       var request = error.target;
       return JSON.encode({
           'type': 'ServiceException',
           'id': '',
-          'response': error.target.responseText,
+          'response': request.responseText,
           'kind': 'NetworkException',
-          'message': 'Could not connect to service. Check that you started the'
-                     ' VM with the following flags:\n --enable-vm-service'
-                    ' --pause-isolates-on-exit'
+          'message': 'Could not connect to service (${request.statusText}). '
+                     'Check that you started the VM with the following flags: '
+                     '--observe'
         });
     });
   }
@@ -153,7 +162,7 @@
     Map message = {};
     message['id'] = idString;
     message['method'] = 'observatoryQuery';
-    message['query'] = '/$path';
+    message['query'] = '$path';
     _requestSerial++;
     var completer = new Completer();
     _pendingRequests[idString] = completer;
diff --git a/runtime/bin/vmservice/client/lib/src/app/application.dart b/runtime/bin/vmservice/client/lib/src/app/application.dart
index e10fa76..183d6b1 100644
--- a/runtime/bin/vmservice/client/lib/src/app/application.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/application.dart
@@ -4,53 +4,204 @@
 
 part of app;
 
-/// A request response interceptor is called for each response.
-typedef void RequestResponseInterceptor();
+/// A [Pane] controls the user interface of Observatory. At any given time
+/// one pane will be the current pane. Panes are registered at startup.
+/// When the user navigates within the application, each pane is asked if it
+/// can handle the current location, the first pane to say yes, wins.
+abstract class Pane extends Observable {
+  final ObservatoryApplication app;
+
+  @observable ObservatoryElement element;
+
+  Pane(this.app);
+
+  /// Called when the pane is installed, this callback must initialize
+  /// [element].
+  void onInstall();
+
+  /// Called when the pane is uninstalled, this callback must clear
+  /// [element].
+  void onUninstall() {
+    element = null;
+  }
+
+  /// Called when the pane should update its state based on [url].
+  /// NOTE: Only called when the pane is installed.
+  void visit(String url);
+
+  /// Called to test whether this pane can visit [url].
+  bool canVisit(String url);
+}
+
+/// A general service object viewer.
+class ServiceObjectPane extends Pane {
+  ServiceObjectPane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      /// Lazily create pane.
+      element = new Element.tag('service-view');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    if (url == '') {
+      // Nothing requested.
+      return;
+    }
+    /// Request url from VM and display it.
+    app.vm.get(url).then((obj) {
+      ServiceObjectViewElement pane = element;
+      pane.object = obj;
+    });
+  }
+
+  /// Catch all.
+  bool canVisit(String url) => true;
+}
+
+/// Class tree pane.
+class ClassTreePane extends Pane {
+  static const _urlPrefix = 'class-tree/';
+
+  ClassTreePane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      element = new Element.tag('class-tree');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    // ClassTree urls are 'class-tree/isolate-id', chop off prefix, leaving
+    // isolate url.
+    url = url.substring(_urlPrefix.length);
+    /// Request the isolate url.
+    app.vm.get(url).then((i) {
+      if (element != null) {
+        /// Update the pane.
+        ClassTreeElement pane = element;
+        pane.isolate = i;
+      }
+    });
+  }
+
+  /// Catch all.
+  bool canVisit(String url) => url.startsWith(_urlPrefix);
+}
+
+class ErrorViewPane extends Pane {
+  ErrorViewPane(app) : super(app);
+
+  void onInstall() {
+    if (element == null) {
+      /// Lazily create pane.
+      element = new Element.tag('service-view');
+    }
+  }
+
+  void visit(String url) {
+    assert(element != null);
+    assert(canVisit(url));
+    (element as ServiceObjectViewElement).object = app.lastErrorOrException;
+  }
+
+  bool canVisit(String url) => url.startsWith('error/');
+}
 
 /// The observatory application. Instances of this are created and owned
 /// by the observatory_application custom element.
 class ObservatoryApplication extends Observable {
+  final _paneRegistry = new List<Pane>();
+  ServiceObjectPane _serviceObjectPane;
+  Pane _currentPane;
   @observable final LocationManager locationManager;
   @observable final VM vm;
   @observable Isolate isolate;
+  @reflectable final ObservatoryApplicationElement rootElement;
 
-  /// The current [ServiceObject] being viewed by the application.
-  @observable ServiceObject response;
-
-  /// Any client-level arguments for viewing the current response.
-  @observable String args;
-  // TODO(turnidge): Make args a Map.
+  @reflectable ServiceObject lastErrorOrException;
 
   void _initOnce() {
-    // Only called once.
-    assert(locationManager._app == null);
-    locationManager._app = this;
-    locationManager.init();
+    _registerPanes();
     vm.errors.stream.listen(_onError);
     vm.exceptions.stream.listen(_onException);
+    location = locationManager;
+    locationManager._init(this);
+  }
+
+  void _registerPanes() {
+    if (_serviceObjectPane != null) {
+      // Already done.
+      return;
+    }
+    // Register ClassTreePane.
+    _paneRegistry.add(new ClassTreePane(this));
+    _paneRegistry.add(new ErrorViewPane(this));
+    // Note that ServiceObjectPane must be the last entry in the list as it is
+    // the catch all.
+    _serviceObjectPane = new ServiceObjectPane(this);
+    _paneRegistry.add(_serviceObjectPane);
   }
 
   void _onError(ServiceError error) {
-    response = error;
-    // No id, clear the hash.
-    locationManager.clearCurrentHash();
+    lastErrorOrException = error;
+    _visit('error/', null);
   }
 
   void _onException(ServiceException exception) {
-    response = exception;
-    // No id, clear the hash.
-    locationManager.clearCurrentHash();
+    lastErrorOrException = exception;
+    _visit('error/', null);
   }
 
-  ObservatoryApplication.devtools() :
-      locationManager = new LocationManager(),
+  void _visit(String url, String args) {
+    // TODO(johnmccutchan): Pass [args] to pane.
+    for (var i = 0; i < _paneRegistry.length; i++) {
+      var pane = _paneRegistry[i];
+      if (pane.canVisit(url)) {
+        _installPane(pane);
+        pane.visit(url);
+        return;
+      }
+    }
+    throw new FallThroughError();
+  }
+
+  /// Set the Observatory application pane.
+  void _installPane(Pane pane) {
+    assert(pane != null);
+    print('Installing $pane');
+    if (_currentPane == pane) {
+      // Already isntalled.
+      return;
+    }
+    if (_currentPane != null) {
+      _currentPane.onUninstall();
+    }
+    pane.onInstall();
+    // Clear children.
+    rootElement.children.clear();
+    // Add new pane.
+    rootElement.children.add(pane.element);
+    // Remember pane.
+    _currentPane = pane;
+  }
+
+  ObservatoryApplication.devtools(this.rootElement) :
+      locationManager = new HashLocationManager(),
       vm = new DartiumVM() {
     _initOnce();
   }
 
-  ObservatoryApplication() :
-      locationManager = new LocationManager(),
-          vm = new WebSocketVM() {
+  ObservatoryApplication(this.rootElement) :
+      locationManager = new HashLocationManager(),
+      vm = new HttpVM() {
     _initOnce();
   }
 }
+
+LocationManager location;
diff --git a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
index b541bf3..7cadb37 100644
--- a/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/location_manager.dart
@@ -4,50 +4,123 @@
 
 part of app;
 
-/// The LocationManager class observes and parses the hash ('#') portion of the
-/// URL in window.location. The text after the '#' is used as the request
-/// string for the VM service.
-class LocationManager extends Observable {
-  static const String defaultHash = '#/vm';
-
+abstract class LocationManager extends Observable {
+  final _initialPath = '/vm';
   ObservatoryApplication _app;
-  @observable String currentHash = '';
 
-  void init() {
-    window.onHashChange.listen((event) {
-      // Request the current anchor.
-      requestCurrentHash();
-    });
+  String _lastUrl;
 
-    if (window.location.hash == '') {
-      // Fresh start, load the vm page.
-      window.location.hash = defaultHash;
-    } else {
-      // The page is being reloaded.
-      requestCurrentHash();
+  void _init(ObservatoryApplication app) {
+    // Called once.
+    assert(_app == null);
+    _app = app;
+    // Register for history events.
+    window.onPopState.listen(_onLocationChange);
+    _onStartup();
+  }
+
+  void _onStartup();
+  void _onLocationChange(PopStateEvent event);
+
+  /// Go to a specific url.
+  void go(String url) {
+    if (_lastUrl != url) {
+      Logger.root.info('Navigated to ${url}');
+      window.history.pushState(url, document.title, url);
+      _lastUrl = url;
     }
+    _go(url);
   }
 
-  /// Clear the current hash.
-  void clearCurrentHash() {
-    window.location.hash = '';
+  void _go(String url) {
+    // Chop off leading '#'.
+    if (url.startsWith('#')) {
+      url = url.substring(1);
+    }
+    // Fall through handles '#/'
+    // Chop off leading '/'.
+    if (url.startsWith('/')) {
+      url = url.substring(1);
+    }
+    var args;
+    // Parse out arguments.
+    if (url.contains('#')) {
+      var chunks = url.split('#');
+      url = chunks[0];
+      if ((chunks.length > 1) && (chunks[1] != '')) {
+        args = chunks[1];
+      }
+    }
+    _app._visit(url, args);
   }
 
-  /// Refresh the service object reference in the location entry.
-  void requestCurrentHash() {
-    currentHash = window.location.hash;
-    if (!currentHash.startsWith('#/')) {
+  /// Go back.
+  void back() {
+    window.history.go(-1);
+  }
+
+  /// Go forward.
+  void forward() {
+    window.history.go(1);
+  }
+
+  /// Handle clicking on an application url link.
+  void onGoto(MouseEvent event, var detail, Element target) {
+    var href = target.attributes['href'];
+    if (event.button > 1 || event.metaKey || event.ctrlKey ||
+        event.shiftKey || event.altKey) {
+      // Not a left-click or a left-click with a modifier key:
+      // Let browser handle.
       return;
     }
-    var parts = currentHash.substring(2).split('#');
-    var location = parts[0];
-    var args = (parts.length > 1 ? parts[1] : '');
-    if (parts.length > 2) {
-      Logger.root.warning('Found more than 2 #-characters in $currentHash');
-    }
-    _app.vm.get(currentHash.substring(2)).then((obj) {
-        _app.response = obj;
-        _app.args = args;
-      });
+    location.go(href);
+    event.preventDefault();
   }
+
+  /// Given an application url, generate a link.
+  String makeLink(String url);
+}
+
+/// Uses location.hash to encode application urls.
+class HashLocationManager extends LocationManager {
+  void _onStartup() {
+    String initialPath = '${window.location.hash}';
+    if ((window.location.hash == '') || (window.location.hash == '#')) {
+      initialPath = '#${_initialPath}';
+    }
+    window.history.pushState(initialPath, document.title, initialPath);
+    _go(window.location.hash);
+  }
+
+  void _onLocationChange(PopStateEvent _) {
+    _go(window.location.hash);
+  }
+
+  /// Given an application url, generate a link for an anchor tag.
+  String makeLink(String url) {
+    return '#$url';
+  }
+}
+
+/// Uses location.pathname to encode application urls. Requires server side
+/// rewriting to support copy and paste linking. pub serve makes this hard.
+/// STATUS: Work in progress.
+class LinkLocationManager extends LocationManager {
+  void _onStartup() {
+    Logger.root.warning('Using untested LinkLocationManager');
+    String initialPath = window.location.pathname;
+    if ((window.location.pathname == '/index.html') ||
+        (window.location.pathname == '/')) {
+      initialPath = '/vm';
+    }
+    window.history.replaceState(initialPath, document.title, initialPath);
+    _go(window.location.pathname);
+  }
+
+  void _onLocationChange(PopStateEvent _) {
+    _go(window.location.pathname);
+  }
+
+  /// Given an application url, generate a link for an anchor tag.
+  String makeLink(String url) => url;
 }
diff --git a/runtime/bin/vmservice/client/lib/src/app/utils.dart b/runtime/bin/vmservice/client/lib/src/app/utils.dart
index 95dc6b5..5b6839b 100644
--- a/runtime/bin/vmservice/client/lib/src/app/utils.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/utils.dart
@@ -73,22 +73,23 @@
   }
 
   static String formatSize(int bytes) {
+    const int digits = 1;
     const int bytesPerKB = 1024;
-      const int bytesPerMB = 1024 * bytesPerKB;
-      const int bytesPerGB = 1024 * bytesPerMB;
-      const int bytesPerTB = 1024 * bytesPerGB;
+    const int bytesPerMB = 1024 * bytesPerKB;
+    const int bytesPerGB = 1024 * bytesPerMB;
+    const int bytesPerTB = 1024 * bytesPerGB;
 
-      if (bytes < bytesPerKB) {
-        return "${bytes}B";
-      } else if (bytes < bytesPerMB) {
-        return "${(bytes / bytesPerKB).round()}KB";
-      } else if (bytes < bytesPerGB) {
-        return "${(bytes / bytesPerMB).round()}MB";
-      } else if (bytes < bytesPerTB) {
-        return "${(bytes / bytesPerGB).round()}GB";
-      } else {
-        return "${(bytes / bytesPerTB).round()}TB";
-      }
+    if (bytes < bytesPerKB) {
+      return "${bytes}B";
+    } else if (bytes < bytesPerMB) {
+      return "${(bytes / bytesPerKB).toStringAsFixed(digits)}KB";
+    } else if (bytes < bytesPerGB) {
+      return "${(bytes / bytesPerMB).toStringAsFixed(digits)}MB";
+    } else if (bytes < bytesPerTB) {
+      return "${(bytes / bytesPerGB).toStringAsFixed(digits)}GB";
+    } else {
+      return "${(bytes / bytesPerTB).toStringAsFixed(digits)}TB";
+    }
   }
 
   static String formatTime(double time) {
diff --git a/runtime/bin/vmservice/client/lib/src/app/view_model.dart b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
index 0b90a99..fcdb425 100644
--- a/runtime/bin/vmservice/client/lib/src/app/view_model.dart
+++ b/runtime/bin/vmservice/client/lib/src/app/view_model.dart
@@ -131,7 +131,7 @@
 class SortedTable extends Observable {
   final List<SortedTableColumn> columns;
   final List<SortedTableRow> rows = new List<SortedTableRow>();
-  final List<int> _sortedRows = [];
+  final List<int> sortedRows = [];
 
   SortedTable(this.columns);
 
@@ -144,42 +144,57 @@
   }
   int get sortColumnIndex => _sortColumnIndex;
   bool _sortDescending = true;
-
-  void sort() {
-    assert(_sortColumnIndex >= 0);
-    assert(_sortColumnIndex < columns.length);
-    _sortedRows.sort((i, j) {
-      var a = rows[i].values[_sortColumnIndex];
-      var b = rows[j].values[_sortColumnIndex];
-      if (_sortDescending) {
-        return b.compareTo(a);
-      } else {
-        return a.compareTo(b);
-      }
-    });
-    notifyPropertyChange(#sortedRows, 0, 1);
+  bool get sortDescending => _sortDescending;
+  set sortDescending(var descending) {
+    _sortDescending = descending;
+    notifyPropertyChange(#getColumnLabel, 0, 1);
   }
 
-  @observable List<int> get sortedRows => _sortedRows;
+
+  dynamic getSortKeyFor(int row, int col) {
+    return rows[row].values[col];
+  }
+
+  int _sortFuncDescending(int i, int j) {
+    var a = getSortKeyFor(i, _sortColumnIndex);
+    var b = getSortKeyFor(j, _sortColumnIndex);
+    return b.compareTo(a);
+  }
+
+  int _sortFuncAscending(int i, int j) {
+    var a = getSortKeyFor(i, _sortColumnIndex);
+    var b = getSortKeyFor(j, _sortColumnIndex);
+    return a.compareTo(b);
+  }
+
+  void sort() {
+    Stopwatch sw = new Stopwatch()..start();
+    assert(_sortColumnIndex >= 0);
+    assert(_sortColumnIndex < columns.length);
+    if (_sortDescending) {
+      sortedRows.sort(_sortFuncDescending);
+    } else {
+      sortedRows.sort(_sortFuncAscending);
+    }
+  }
 
   void clearRows() {
     rows.clear();
-    _sortedRows.clear();
+    sortedRows.clear();
   }
 
   void addRow(SortedTableRow row) {
-    _sortedRows.add(rows.length);
+    sortedRows.add(rows.length);
     rows.add(row);
-    notifyPropertyChange(#sortedRows, 0, 1);
   }
 
-  @reflectable String getFormattedValue(int row, int column) {
+  String getFormattedValue(int row, int column) {
     var value = getValue(row, column);
     var formatter = columns[column].formatter;
     return formatter(value);
   }
 
-  @reflectable String getColumnLabel(int column) {
+  @observable String getColumnLabel(int column) {
     assert(column >= 0);
     assert(column < columns.length);
     // TODO(johnmccutchan): Move expander display decisions into html once
@@ -192,7 +207,7 @@
     return columns[column].label + (_sortDescending ? arrowUp : arrowDown);
   }
 
-  @reflectable dynamic getValue(int row, int column) {
+  dynamic getValue(int row, int column) {
     return rows[row].values[column];
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/action_link.html b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
index 7c1974f..ba58478 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/action_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/action_link.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+
 <polymer-element name="action-link">
   <template>
     <style>
@@ -20,7 +20,7 @@
     <template if="{{ !busy }}">
       <span class="idle"><a on-click="{{ doAction }}">[{{ label }}]</a></span>
     </template>
-
   </template>
-  <script type="application/dart" src="action_link.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="action_link.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
index 564dad4..ec2cd7d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/breakpoint_list.html
@@ -1,15 +1,16 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="breakpoint-list" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ msg.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ msg.isolate.relativeHashLink('debug/breakpoints') }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ gotoLink(msg.isolate.relativeLink('debug/breakpoints')) }}" anchor="breakpoints" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <template if="{{ msg['breakpoints'].isEmpty }}">
       <div>
@@ -26,5 +27,6 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="breakpoint_list.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="breakpoint_list.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
index 0b595f6..8d39d2e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_ref.html
@@ -1,9 +1,8 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
-<polymer-element name="class-ref" extends="service-ref">
 
-<template><link rel="stylesheet" href="css/shared.css"><a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+<polymer-element name="class-ref" extends="service-ref">
+  <template><link rel="stylesheet" href="css/shared.css"><a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a></template>
+</polymer-element>
 
 <script type="application/dart" src="class_ref.dart"></script>
-</polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart b/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
index aeb29fa..c4d1613 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_tree.dart
@@ -50,7 +50,9 @@
 
   ClassTreeElement.created() : super.created();
 
-  void enteredView() {
+  @override
+  void attached() {
+    super.attached();
     tree = new TableTree();
     if (isolate != null) {
       _update(isolate.objectClass);
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_tree.html b/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
index 8ede1e6..96270d2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_tree.html
@@ -1,3 +1,4 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="class_ref.html">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
index b55f8ae..4fac9d6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.dart
@@ -11,20 +11,33 @@
 
 @CustomTag('class-view')
 class ClassViewElement extends ObservatoryElement {
-  @published ServiceMap cls;
+  @published Class cls;
+  @observable ServiceMap instances;
+  @observable int retainedBytes;
   ClassViewElement.created() : super.created();
 
   Future<ServiceObject> eval(String text) {
-    return cls.isolate.get(
-        cls.id + "/eval?expr=${Uri.encodeComponent(text)}");
+    return cls.get("eval?expr=${Uri.encodeComponent(text)}");
+  }
+
+  Future<ServiceObject> reachable(var limit) {
+    return cls.get("instances?limit=$limit")
+        .then((ServiceMap obj) {
+          instances = obj;
+        });
   }
   
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
-  Future<ServiceObject> retainedSize(String dummy) {
-    return cls.isolate.get(cls.id + "/retained");
+  Future<ServiceObject> retainedSize(var dummy) {
+    return cls.get("retained")
+        .then((ServiceMap obj) {
+          retainedBytes = int.parse(obj['valueAsString']);
+        });
   }
 
   void refresh(var done) {
+    instances = null;
+    retainedBytes = null;
     cls.reload().whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/class_view.html b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
index 7548085..28c5e00 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/class_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/class_view.html
@@ -1,32 +1,33 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="eval_link.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="eval_link.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="class-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ cls.isolate }}"></isolate-nav-menu>
-      <library-nav-menu library="{{ cls['library'] }}"></library-nav-menu>
+      <library-nav-menu library="{{ cls.library }}"></library-nav-menu>
       <class-nav-menu cls="{{ cls }}" last="{{ true }}"></class-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
       <h1>
-        <template if="{{ cls['abstract'] }}">
+        <template if="{{ cls.isAbstract }}">
           abstract
         </template>
-        <template if="{{ cls['patch'] }}">
+        <template if="{{ cls.isPatch }}">
           patch
         </template>
         class {{ cls.name }}
@@ -35,32 +36,32 @@
         <div class="memberItem">
           <div class="memberName">library</div>
           <div class="memberValue">
-            <library-ref ref="{{ cls['library'] }}"></library-ref>
+            <library-ref ref="{{ cls.library }}"></library-ref>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberName">script</div>
           <div class="memberValue">
-            <script-ref ref="{{ cls['script'] }}" pos="{{ cls['tokenPos'] }}">
+            <script-ref ref="{{ cls.script }}" pos="{{ cls.tokenPos }}">
             </script-ref>
           </div>
         </div>
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls['super'] != null }}">
+        <template if="{{ cls.superClass != null }}">
           <div class="memberItem">
             <div class="memberName">extends</div>
             <div class="memberValue">
-              <class-ref ref="{{ cls['super'] }}"></class-ref>
+              <class-ref ref="{{ cls.superClass }}"></class-ref>
             </div>
           </div>
         </template>
-        <template if="{{ cls['subclasses'].length > 0 }}">
+        <template if="{{ cls.subClasses.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">extended by</div>
             <div class="memberValue">
-              <template repeat="{{ subclass in cls['subclasses'] }}">
+              <template repeat="{{ subclass in cls.subClasses }}">
                 <class-ref ref="{{ subclass }}"></class-ref>
               </template>
             </div>
@@ -69,11 +70,11 @@
 
         <div class="memberItem">&nbsp;</div>
 
-        <template if="{{ cls['interfaces'].length > 0 }}">
+        <template if="{{ cls.interfaces.length > 0 }}">
           <div class="memberItem">
             <div class="memberName">implements</div>
             <div class="memberValue">
-              <template repeat="{{ interface in cls['interfaces'] }}">
+              <template repeat="{{ interface in cls.interfaces }}">
                 <class-ref ref="{{ interface }}"></class-ref>
               </template>
             </div>
@@ -85,28 +86,22 @@
             <div class="memberValue">{{ cls.vmName }}</div>
           </div>
         </template>
-        <div class="memberItem">
-          <div class="memberName">retained size<br>(all instances)</div>
-          <div class="memberValue">
-            <eval-link callback="{{ retainedSize }}"></eval-link>
-          </div>
-        </div>
       </div>
     </div>
 
-    <template if="{{ cls['error'] != null }}">
+    <template if="{{ cls.error != null }}">
       <!-- TODO(turnidge): Don't use instance-ref for error display here -->
-      <instance-ref ref="{{ cls['error'] }}"></instance-ref>
+      <instance-ref ref="{{ cls.error }}"></instance-ref>
     </template>
 
     <hr>
 
     <div class="content">
-      <template if="{{ cls['fields'].isNotEmpty }}">
+      <template if="{{ cls.fields.isNotEmpty }}">
         fields ({{ cls['fields'].length }})
-        <curly-block expand="{{ cls['fields'].length <= 8 }}">
+        <curly-block expand="{{ cls.fields.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ field in cls['fields'] }}">
+            <template repeat="{{ field in cls.fields }}">
               <div class="memberItem">
                 <div class="memberName">
                   <field-ref ref="{{ field }}"></field-ref>
@@ -122,11 +117,11 @@
         </curly-block><br><br>
       </template>
 
-      <template if="{{ cls['functions'].isNotEmpty }}">
-        functions ({{ cls['functions'].length }})
-        <curly-block expand="{{ cls['functions'].length <= 8 }}">
+      <template if="{{ cls.functions.isNotEmpty }}">
+        functions ({{ cls.functions.length }})
+        <curly-block expand="{{ cls.functions.length <= 8 }}">
           <div class="memberList">
-            <template repeat="{{ function in cls['functions'] }}">
+            <template repeat="{{ function in cls.functions }}">
               <div class="memberItem">
                 <div class="memberValue">
                   <function-ref ref="{{ function }}" qualified="{{ false }}">
@@ -137,6 +132,52 @@
           </div>
         </curly-block><br><br>
       </template>
+      
+      <template if="{{ !cls.hasNoAllocations }}">
+        instances
+          <div class="memberItem">
+            <div class="memberName">currently allocated</div>
+            <div class="memberValue">
+              count {{ cls.newSpace.current.instances + cls.oldSpace.current.instances }}
+              (shallow size {{ cls.newSpace.current.bytes + cls.oldSpace.current.bytes | formatSize }})
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">strongly reachable</div>
+            <div class="memberValue">
+              <template if="{{ instances == null }}">
+                <eval-link callback="{{ reachable }}"
+                           label="[find]"
+                           expr="100">
+                </eval-link>
+              </template>
+              <template if="{{ instances != null }}">
+                sample
+                <instance-ref ref="{{ instances['sample'] }}"></instance-ref>
+                <template if="{{ instances['totalCount'] > instances['sampleCount'] }}">
+                  <eval-link callback="{{ reachable }}"
+                           label="[more]"
+                           expr="{{ instances['sampleCount'] * 2 }}">
+                  </eval-link>
+                </template>
+                of total {{ instances['totalCount'] }}
+              </template>
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">retained size</div>
+            <div class="memberValue">
+              <template if="{{ retainedBytes == null }}">
+                <eval-link callback="{{ retainedSize }}"
+                           label="[calculate]">
+                </eval-link>
+              </template>
+              <template if="{{ retainedBytes != null }}">
+                {{ retainedBytes | formatSize }}
+              </template>
+            </div>
+          </div>
+        </template>
     </div>
 
     <hr>
@@ -147,5 +188,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="class_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="class_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
index e14384c..717ace2 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_ref.html
@@ -1,20 +1,21 @@
-<head>
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="code-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ code.isDartCode }}">
         <template if="{{ code.isOptimized }}">
-          <a href="{{ url }}">*{{ name }}</a>
+          <a on-click="{{ goto }}" href="{{ url }}">*{{ name }}</a>
         </template>
         <template if="{{ !code.isOptimized }}">
-          <a href="{{ url }}">{{ name }}</a>
+          <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
         </template>
     </template>
     <template if="{{ !code.isDartCode }}">
       <span>{{ name }}</span>
     </template>
   </template>
-<script type="application/dart" src="code_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
+
+<script type="application/dart" src="code_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
index dd5c969..f44af1f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.dart
@@ -14,8 +14,9 @@
   @published Code code;
   CodeViewElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (code == null) {
       return;
     }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/code_view.html b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
index f04fd06..07df134 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/code_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/code_view.html
@@ -1,8 +1,10 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="function_ref.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="script_ref.html">
+
 <polymer-element name="code-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -57,6 +59,7 @@
       <isolate-nav-menu isolate="{{ code.isolate }}"></isolate-nav-menu>
       <nav-menu link="." anchor="{{ code.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content">
       <template if="{{ code.isDartCode && code.isOptimized }}">
@@ -162,5 +165,6 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="code_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="code_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
deleted file mode 100644
index babd901..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.dart
+++ /dev/null
@@ -1,50 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library collapsible_content_element;
-
-import 'dart:html';
-import 'package:polymer/polymer.dart';
-import 'observatory_element.dart';
-
-/// An element which conditionally displays its children elements.
-@CustomTag('collapsible-content')
-class CollapsibleContentElement extends ObservatoryElement {
-  static const String _openIconClass = 'glyphicon glyphicon-chevron-down';
-  static const String _closeIconClass = 'glyphicon glyphicon-chevron-up';
-
-  @observable String iconClass = _openIconClass;
-  @observable String displayValue = 'none';
-
-  bool _collapsed = true;
-  bool get collapsed => _collapsed;
-  set collapsed(bool r) {
-    _collapsed = r;
-    _refresh();
-  }
-
-  CollapsibleContentElement.created() : super.created();
-
-  void enteredView() {
-    super.enteredView();
-    _refresh();
-  }
-
-  void toggleDisplay(Event e, var detail, Node target) {
-    collapsed = !collapsed;
-    _refresh();
-  }
-
-
-
-  void _refresh() {
-    if (_collapsed) {
-      iconClass = _openIconClass;
-      displayValue = 'none';
-    } else {
-      iconClass = _closeIconClass;
-      displayValue = 'block';
-    }
-  }
-}
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html b/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
deleted file mode 100644
index 035e312..0000000
--- a/runtime/bin/vmservice/client/lib/src/elements/collapsible_content.html
+++ /dev/null
@@ -1,17 +0,0 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
-<polymer-element name="collapsible-content" extends="observatory-element">
-  <template>
-    <div class="well row">
-      <a on-click="toggleDisplay"
-         class="btn muted unselectable">
-           Raw message... <i class="{{ iconClass }}"></i>
-      </a>
-      <div style="display: {{ displayValue }}" class="well">
-        <content></content>
-      </div>
-    </div>
-  </template>
-  <script type="application/dart" src="collapsible_content.dart"></script>
-</polymer-element>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
index 2806d6d..5618685 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
+++ b/runtime/bin/vmservice/client/lib/src/elements/css/shared.css
@@ -19,6 +19,12 @@
   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;
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
index d105267..1576020 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/curly_block.html
@@ -1,3 +1,5 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="curly-block">
   <template>
     <style>
@@ -36,5 +38,6 @@
       </template>
     </template>
   </template>
-  <script type="application/dart" src="curly_block.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="curly_block.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/error_view.html b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
index ba54e66..1c4ea8d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/error_view.html
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="error-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -14,5 +15,6 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="error_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="error_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
index 7d4d50b..167a0cc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_box.html
@@ -1,7 +1,7 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="eval-box" extends="observatory-element">
   <template>
     <style>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
index 729698e..21b1177 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/eval_link.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="instance_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="instance_ref.html">
+
 <polymer-element name="eval-link">
   <template>
     <style>
@@ -23,7 +23,7 @@
     <template if="{{ result != null }}">
       = <instance-ref ref="{{ result }}"></instance-ref>
     </template>
-
   </template>
-  <script type="application/dart" src="eval_link.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="eval_link.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
index 6de1a19..a02762e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_ref.html
@@ -1,8 +1,8 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="instance_ref.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="field-ref" extends="service-ref">
   <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -17,8 +17,9 @@
       <template if="{{ (ref['declared_type']['name'] != 'dynamic') }}">
         <instance-ref ref="{{ ref['declared_type'] }}"></instance-ref>
       </template>
-      <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+      <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
     </div>
   </template>
-  <script type="application/dart" src="field_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="field_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/field_view.html b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
index 5673bbf..307cb77 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/field_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/field_view.html
@@ -1,11 +1,11 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_ref.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="field-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,8 +19,9 @@
       <template if="{{ field['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ field['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ field.hashLink }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ field.link }}" anchor="{{ field['user_name'] }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -90,5 +91,6 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="field_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="field_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
index cabdd91..e7be436 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/flag_list.html
@@ -1,16 +1,16 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="stack_frame.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="stack_frame.html">
 
 <polymer-element name="flag-list" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
-      <nav-menu link="{{ flagList.isolate.relativeHashLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ flagList.vm.relativeLink('flags') }}" anchor="flags" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content-centered">
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
index 70e5e96..16a281f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_ref.html
@@ -1,7 +1,7 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="class_ref.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="function-ref" extends="service-ref">
   <template><link rel="stylesheet" href="css/shared.css" /><!-- These comments are here to allow newlines.
      --><template if="{{ isDart }}"><!--
@@ -10,7 +10,8 @@
      --><template if="{{ qualified && hasParent }}"><!--
        --><function-ref ref="{{ ref['parent'] }}" qualified="{{ true }}">
           </function-ref>.<!--
-     --></template><a href="{{ url }}">{{ name }}</a><!--
+     --></template><a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a><!--
   --></template><template if="{{ !isDart }}"><span> {{ name }}</span></template></template>
-<script type="application/dart" src="function_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="function_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/function_view.html b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
index eb5bf6b..50ec959 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/function_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/function_view.html
@@ -1,13 +1,13 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="code_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="code_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="function-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -21,8 +21,9 @@
       <template if="{{ function['owner'].serviceType == 'Library' }}">
         <library-nav-menu library="{{ function['owner'] }}"></library-nav-menu>
       </template>
-      <nav-menu link="{{ function.hashLink }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ function.link }}" anchor="{{ function.name }}" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -115,5 +116,6 @@
 
     <br>
   </template>
-  <script type="application/dart" src="function_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="function_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
index 6688e5a..3674762 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.dart
@@ -61,6 +61,9 @@
   static final _freeColor = [255, 255, 255, 255];
   static final _pageSeparationColor = [0, 0, 0, 255];
   static const _PAGE_SEPARATION_HEIGHT = 4;
+  // Many browsers will not display a very tall canvas.
+  // TODO(koda): Improve interface for huge heaps.
+  static const _MAX_CANVAS_HEIGHT = 6000;
 
   @observable String status;
   @published ServiceMap fragmentation;
@@ -68,8 +71,9 @@
   HeapMapElement.created() : super.created() {
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     _fragmentationCanvas = shadowRoot.querySelector("#fragmentation");
     _fragmentationCanvas.onMouseMove.listen(_handleMouseMove);
     _fragmentationCanvas.onMouseDown.listen(_handleClick);
@@ -92,13 +96,13 @@
 
   void _updateClassList(classList, int freeClassId) {
     for (var member in classList['members']) {
-      if (member['type'] != '@Class') {
+      if (member is! Class) {
         Logger.root.info('$member');
         continue;
       }
-      var classId = int.parse(member['id'].split('/').last);
+      var classId = int.parse(member.id.split('/').last);
       var color = _classIdToRGBA(classId);
-      _addClass(classId, member['name'], color);
+      _addClass(classId, member.name, color);
     }
     _addClass(freeClassId, 'Free', _freeColor);
     _addClass(0, '', _pageSeparationColor);
@@ -148,7 +152,7 @@
     var className = _classNameAt(event.offset);
     status = (className == '') ? '-' : '$className $addressString';
   }
-  
+
   void _handleClick(MouseEvent event) {
     var address = _objectAt(event.offset).address.toRadixString(16);
     window.location.hash = "/${fragmentation.isolate.link}/address/$address";
@@ -165,7 +169,7 @@
     _pageHeight = _PAGE_SEPARATION_HEIGHT +
         fragmentation['page_size_bytes'] ~/
         fragmentation['unit_size_bytes'] ~/ width;
-    var height = _pageHeight * pages.length;
+    var height = min(_pageHeight * pages.length, _MAX_CANVAS_HEIGHT);
     _fragmentationData =
         _fragmentationCanvas.context2D.createImageData(width, height);
     _fragmentationCanvas.width = _fragmentationData.width;
@@ -178,10 +182,11 @@
   void _renderPages(int startPage) {
     var pages = fragmentation['pages'];
     status = 'Loaded $startPage of ${pages.length} pages';
-    if (startPage >= pages.length) {
+    var startY = startPage * _pageHeight;
+    var endY = startY + _pageHeight;
+    if (startPage >= pages.length || endY > _fragmentationData.height) {
       return;
     }
-    var startY = startPage * _pageHeight;
     var pixel = new PixelReference(_fragmentationData, new Point(0, startY));
     var objects = pages[startPage]['objects'];
     for (var i = 0; i < objects.length; i += 2) {
@@ -193,7 +198,6 @@
         pixel = pixel.next();
       }
     }
-    var endY = startY + _pageHeight;
     while (pixel.point.y < endY) {
       pixel.color = _pageSeparationColor;
       pixel = pixel.next();
@@ -219,7 +223,7 @@
   }
 
   void fragmentationChanged(oldValue) {
-    // Async, in case enteredView has not yet run (observed in JS version).
+    // Async, in case attached has not yet run (observed in JS version).
     new Future(() {
       _updateFragmentationData();
     });
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
index 9f5b556..a4296ab 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_map.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="heap-map" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -22,8 +22,9 @@
   <nav-bar pad="{{ false }}">
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ fragmentation.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ fragmentation.isolate.relativeHashLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ fragmentation.isolate.relativeLink('heapmap') }}" anchor="heap map" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
   <div class="hover">
     <p style="text-align:center">{{ status }}</p>
@@ -35,5 +36,6 @@
     <canvas id="fragmentation" width="1px" height="1px"></canvas>
   </div>
 </template>
-<script type="application/dart" src="heap_map.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="heap_map.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
index 9626735..132e43b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.dart
@@ -8,21 +8,28 @@
 import 'observatory_element.dart';
 import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
-import 'package:logging/logging.dart';
+import 'package:observatory/elements.dart';
 import 'package:polymer/polymer.dart';
 
+class ClassSortedTable extends SortedTable {
+
+  ClassSortedTable(columns) : super(columns);
+
+  @override
+  dynamic getSortKeyFor(int row, int col) {
+    if (col == 0) {
+      // Use class name as sort key.
+      return rows[row].values[col].name;
+    }
+    return super.getSortKeyFor(row, col);
+  }
+}
+
 /// Displays an Error response.
 @CustomTag('heap-profile')
 class HeapProfileElement extends ObservatoryElement {
-  // Indexes into VM provided map.
-  static const ALLOCATED_BEFORE_GC = 0;
-  static const ALLOCATED_BEFORE_GC_SIZE = 1;
-  static const LIVE_AFTER_GC = 2;
-  static const LIVE_AFTER_GC_SIZE = 3;
-  static const ALLOCATED_SINCE_GC = 4;
-  static const ALLOCATED_SINCE_GC_SIZE = 5;
-  static const ACCUMULATED = 6;
-  static const ACCUMULATED_SIZE = 7;
+  @observable String lastServiceGC = '---';
+  @observable String lastAccumulatorReset = '---';
 
   // Pie chart of new space usage.
   var _newPieDataTable;
@@ -32,92 +39,193 @@
   var _oldPieDataTable;
   var _oldPieChart;
 
-  @observable SortedTable classTable;
+  @observable ClassSortedTable classTable;
+  var _classTableBody;
 
   @published ServiceMap profile;
 
+  @observable Isolate isolate;
+
   HeapProfileElement.created() : super.created() {
+    // Create pie chart models.
     _newPieDataTable = new DataTable();
     _newPieDataTable.addColumn('string', 'Type');
     _newPieDataTable.addColumn('number', 'Size');
     _oldPieDataTable = new DataTable();
     _oldPieDataTable.addColumn('string', 'Type');
     _oldPieDataTable.addColumn('number', 'Size');
+
+    // Create class table model.
     var columns = [
       new SortedTableColumn('Class'),
-      new SortedTableColumn.withFormatter('Accumulator Size (New)',
+      new SortedTableColumn(''),  // Spacer column.
+      new SortedTableColumn.withFormatter('Accumulated Size (New)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator (New)',
+      new SortedTableColumn.withFormatter('Accumulated Instances',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Current Size (New)',
+      new SortedTableColumn.withFormatter('Current Size',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Current (New)',
+      new SortedTableColumn.withFormatter('Current Instances',
                                           Utils.formatCommaSeparated),
+      new SortedTableColumn(''),  // Spacer column.
       new SortedTableColumn.withFormatter('Accumulator Size (Old)',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Accumulator (Old)',
+      new SortedTableColumn.withFormatter('Accumulator Instances',
                                           Utils.formatCommaSeparated),
-      new SortedTableColumn.withFormatter('Current Size (Old)',
+      new SortedTableColumn.withFormatter('Current Size',
                                           Utils.formatSize),
-      new SortedTableColumn.withFormatter('Current (Old)',
+      new SortedTableColumn.withFormatter('Current Instances',
                                           Utils.formatCommaSeparated)
     ];
-    classTable = new SortedTable(columns);
-    classTable.sortColumnIndex = 1;
+    classTable = new ClassSortedTable(columns);
+    // By default, start with accumulated new space bytes.
+    classTable.sortColumnIndex = 2;
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
+    // Grab the pie chart divs.
     _newPieChart = new Chart('PieChart',
         shadowRoot.querySelector('#newPieChart'));
-    _newPieChart.options['title'] = 'New Space';
     _oldPieChart = new Chart('PieChart',
         shadowRoot.querySelector('#oldPieChart'));
-    _oldPieChart.options['title'] = 'Old Space';
-    _draw();
+    _classTableBody = shadowRoot.querySelector('#classTableBody');
   }
 
-  void _updateChartData() {
-    if ((profile == null) || (profile['members'] is! List) ||
-        (profile['members'].length == 0)) {
-      return;
+  void _updatePieCharts() {
+    assert(profile != null);
+    _newPieDataTable.clearRows();
+    var isolate = profile.isolate;
+    _newPieDataTable.addRow(['Used', isolate.newSpace.used]);
+    _newPieDataTable.addRow(['Free',
+        isolate.newSpace.capacity - isolate.newSpace.used]);
+    _newPieDataTable.addRow(['External', isolate.newSpace.external]);
+    _oldPieDataTable.clearRows();
+    _oldPieDataTable.addRow(['Used', isolate.oldSpace.used]);
+    _oldPieDataTable.addRow(['Free',
+        isolate.oldSpace.capacity - isolate.oldSpace.used]);
+    _oldPieDataTable.addRow(['External', isolate.oldSpace.external]);
+  }
+
+  void _updateClasses() {
+    for (ServiceMap clsAllocations in profile['members']) {
+      Class cls = clsAllocations['class'];
+      if (cls == null) {
+        continue;
+      }
+      cls.newSpace.update(clsAllocations['new']);
+      cls.oldSpace.update(clsAllocations['old']);
     }
-    assert(classTable != null);
+  }
+
+  void _updateClassTable() {
     classTable.clearRows();
-    for (ServiceMap cls in profile['members']) {
-      if (_classHasNoAllocations(cls)) {
+    for (ServiceMap clsAllocations in profile['members']) {
+      Class cls = clsAllocations['class'];
+      if (cls == null) {
+        continue;
+      }
+      if (cls.hasNoAllocations) {
         // If a class has no allocations, don't display it.
         continue;
       }
-      var row = [cls['class'],
-                 _combinedTableColumnValue(cls, 1),
-                 _combinedTableColumnValue(cls, 2),
-                 _combinedTableColumnValue(cls, 3),
-                 _combinedTableColumnValue(cls, 4),
-                 _combinedTableColumnValue(cls, 5),
-                 _combinedTableColumnValue(cls, 6),
-                 _combinedTableColumnValue(cls, 7),
-                 _combinedTableColumnValue(cls, 8)];
+      var row = [cls,
+                 '',  // Spacer column.
+                 cls.newSpace.accumulated.bytes,
+                 cls.newSpace.accumulated.instances,
+                 cls.newSpace.current.bytes,
+                 cls.newSpace.current.instances,
+                 '', // Spacer column.
+                 cls.oldSpace.accumulated.bytes,
+                 cls.oldSpace.accumulated.instances,
+                 cls.oldSpace.current.bytes,
+                 cls.oldSpace.current.instances];
       classTable.addRow(new SortedTableRow(row));
     }
     classTable.sort();
-    _newPieDataTable.clearRows();
-    var heap = profile['heaps']['new'];
-    _newPieDataTable.addRow(['Used', heap['used']]);
-    _newPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
-    _newPieDataTable.addRow(['External', heap['external']]);
-    _oldPieDataTable.clearRows();
-    heap = profile['heaps']['old'];
-    _oldPieDataTable.addRow(['Used', heap['used']]);
-    _oldPieDataTable.addRow(['Free', heap['capacity'] - heap['used']]);
-    _oldPieDataTable.addRow(['External', heap['external']]);
-    _draw();
   }
 
-  void _draw() {
-    if (_newPieChart == null) {
-      return;
+  void _addClassTableDomRow() {
+    assert(_classTableBody != null);
+    var tr = new TableRowElement();
+
+    // Add class ref.
+    var cell = tr.insertCell(-1);
+    ClassRefElement classRef = new Element.tag('class-ref');
+    cell.children.add(classRef);
+
+    // Add spacer.
+    cell = tr.insertCell(-1);
+    cell.classes.add('left-border-spacer');
+
+    // Add new space.
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+
+    // Add spacer.
+    cell = tr.insertCell(-1);
+    cell.classes.add('left-border-spacer');
+
+    // Add old space.
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+    cell = tr.insertCell(-1);
+
+    // Add row to table.
+    _classTableBody.children.add(tr);
+  }
+
+  void _fillClassTableDomRow(TableRowElement tr, int rowIndex) {
+    const SPACER_COLUMNS = const [1, 6];
+
+    var row = classTable.rows[rowIndex];
+    // Add class ref.
+    ClassRefElement classRef = tr.children[0].children[0];
+    classRef.ref = row.values[0];
+
+    for (var i = 1; i < row.values.length; i++) {
+      if (SPACER_COLUMNS.contains(i)) {
+        // Skip spacer columns.
+        continue;
+      }
+      var cell = tr.children[i];
+      cell.title = row.values[i].toString();
+      cell.text = classTable.getFormattedValue(rowIndex, i);
     }
+  }
+
+  void _updateClassTableInDom() {
+    assert(_classTableBody != null);
+    // Resize DOM table.
+    if (_classTableBody.children.length > classTable.sortedRows.length) {
+      // Shrink the table.
+      var deadRows =
+          _classTableBody.children.length - classTable.sortedRows.length;
+      for (var i = 0; i < deadRows; i++) {
+        _classTableBody.children.removeLast();
+      }
+    } else if (_classTableBody.children.length < classTable.sortedRows.length) {
+      // Grow table.
+      var newRows =
+          classTable.sortedRows.length - _classTableBody.children.length;
+      for (var i = 0; i < newRows; i++) {
+        _addClassTableDomRow();
+      }
+    }
+    assert(_classTableBody.children.length == classTable.sortedRows.length);
+    // Fill table.
+    for (var i = 0; i < classTable.sortedRows.length; i++) {
+      var rowIndex = classTable.sortedRows[i];
+      var tr = _classTableBody.children[i];
+      _fillClassTableDomRow(tr, rowIndex);
+    }
+  }
+
+  void _drawCharts() {
     _newPieChart.draw(_newPieDataTable);
     _oldPieChart.draw(_oldPieDataTable);
   }
@@ -126,133 +234,92 @@
     if (target is TableCellElement) {
       if (classTable.sortColumnIndex != target.cellIndex) {
         classTable.sortColumnIndex = target.cellIndex;
-        classTable.sort();
+        classTable.sortDescending = true;
+      } else {
+        classTable.sortDescending = !classTable.sortDescending;
       }
+      classTable.sort();
+      _updateClassTableInDom();
     }
   }
 
-  bool _classHasNoAllocations(Map v) {
-    var newSpace = v['new'];
-    var oldSpace = v['old'];
-    for (var allocation in newSpace) {
-      if (allocation != 0) {
-        return false;
-      }
-    }
-    for (var allocation in oldSpace) {
-      if (allocation != 0) {
-        return false;
-      }
-    }
-    return true;
-  }
-
-  dynamic _combinedTableColumnValue(Map v, int index) {
-    assert(index >= 0);
-    assert(index < 9);
-    switch (index) {
-      case 0:
-        return v['class']['user_name'];
-      case 1:
-        return v['new'][ACCUMULATED_SIZE];
-      case 2:
-        return v['new'][ACCUMULATED];
-      case 3:
-        return v['new'][LIVE_AFTER_GC_SIZE] +
-               v['new'][ALLOCATED_SINCE_GC_SIZE];
-      case 4:
-        return v['new'][LIVE_AFTER_GC] +
-               v['new'][ALLOCATED_SINCE_GC];
-      case 5:
-        return v['old'][ACCUMULATED_SIZE];
-      case 6:
-        return v['old'][ACCUMULATED];
-      case 7:
-        return v['old'][LIVE_AFTER_GC_SIZE] +
-               v['old'][ALLOCATED_SINCE_GC_SIZE];
-      case 8:
-        return  v['old'][LIVE_AFTER_GC] +
-               v['old'][ALLOCATED_SINCE_GC];
-    }
-    throw new FallThroughError();
-  }
-
   void refresh(var done) {
     if (profile == null) {
       return;
     }
     var isolate = profile.isolate;
-    isolate.get('/allocationprofile').then((ServiceMap response) {
-      assert(response['type'] == 'AllocationProfile');
-      profile = response;
-    }).catchError((e, st) {
-      Logger.root.info('$e $st');
-    }).whenComplete(done);
+    isolate.get('/allocationprofile').then(_update).whenComplete(done);
   }
 
   void refreshGC(var done) {
-      if (profile == null) {
-        return;
-      }
-      var isolate = profile.isolate;
-      isolate.get('/allocationprofile?gc=full').then((ServiceMap response) {
-        assert(response['type'] == 'AllocationProfile');
-        profile = response;
-      }).catchError((e, st) {
-        Logger.root.info('$e $st');
-      }).whenComplete(done);
+    if (profile == null) {
+      return;
     }
+    var isolate = profile.isolate;
+    isolate.get('/allocationprofile?gc=full').then(_update).whenComplete(done);
+  }
 
   void resetAccumulator(var done) {
     if (profile == null) {
       return;
     }
     var isolate = profile.isolate;
-    isolate.get('/allocationprofile?reset=true').then((ServiceMap response) {
-      assert(response['type'] == 'AllocationProfile');
-      profile = response;
-    }).catchError((e, st) {
-      Logger.root.info('$e $st');
-    }).whenComplete(done);
+    isolate.get('/allocationprofile?reset=true').then(_update).
+                                                 whenComplete(done);
+  }
+
+  void _update(ServiceMap newProfile) {
+    profile = newProfile;
   }
 
   void profileChanged(oldValue) {
-    try {
-      _updateChartData();
-    } catch (e, st) {
-      Logger.root.info('$e $st');
+    if (profile == null) {
+      return;
     }
-    notifyPropertyChange(#formattedAverage, [], formattedAverage);
-    notifyPropertyChange(#formattedTotalCollectionTime, [],
-                         formattedTotalCollectionTime);
-    notifyPropertyChange(#formattedCollections, [], formattedCollections);
+    isolate = profile.isolate;
+    isolate.updateHeapsFromMap(profile['heaps']);
+    var millis = int.parse(profile['dateLastAccumulatorReset']);
+    if (millis != 0) {
+      lastAccumulatorReset =
+              new DateTime.fromMillisecondsSinceEpoch(millis).toString();
+    }
+    millis = int.parse(profile['dateLastServiceGC']);
+    if (millis != 0) {
+      lastServiceGC =
+              new DateTime.fromMillisecondsSinceEpoch(millis).toString();
+    }
+    _updatePieCharts();
+    _updateClasses();
+    _updateClassTable();
+    _updateClassTableInDom();
+    _drawCharts();
+    notifyPropertyChange(#formattedAverage, 0, 1);
+    notifyPropertyChange(#formattedTotalCollectionTime, 0, 1);
+    notifyPropertyChange(#formattedCollections, 0, 1);
   }
 
   @observable String formattedAverage(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    var r = ((heap['time'] * 1000.0) / heap['collections']).toStringAsFixed(2);
-    return '$r ms';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    var avg = ((heap.totalCollectionTimeInSeconds * 1000.0) / heap.collections);
+    return '${avg.toStringAsFixed(2)} ms';
   }
 
   @observable String formattedCollections(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    return '${heap['collections']}';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    return heap.collections.toString();
   }
 
   @observable String formattedTotalCollectionTime(bool newSpace) {
     if (profile == null) {
       return '';
     }
-    String space = newSpace ? 'new' : 'old';
-    Map heap = profile['heaps'][space];
-    return '${Utils.formatSeconds(heap['time'])} secs';
+    var heap = newSpace ? profile.isolate.newSpace : profile.isolate.oldSpace;
+    return '${Utils.formatSeconds(heap.totalCollectionTimeInSeconds)} secs';
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
index aea9cd7..c4d7304 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/heap_profile.html
@@ -1,15 +1,14 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="heap-profile" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
   <style>
     .table {
       border-collapse: collapse!important;
-      width: 100%;
       margin-bottom: 20px
       table-layout: fixed;
     }
@@ -25,6 +24,13 @@
       text-align: left;
       border-bottom:2px solid #ddd;
     }
+    .spacer {
+      width: 16px;
+    }
+    .left-border-spacer {
+      width: 16px;
+      border-left: 1px solid;
+    }
     .clickable {
       color: #0489c3;
       text-decoration: none;
@@ -41,17 +47,47 @@
   <nav-bar>
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-    <nav-menu link="{{ profile.isolate.relativeHashLink('allocationprofile') }}" anchor="heap profile" last="{{ true }}"></nav-menu>
+    <nav-menu link="{{ profile.isolate.relativeLink('allocationprofile') }}" anchor="allocation profile" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ resetAccumulator }}" label="Reset Accumulator"></nav-refresh>
     <nav-refresh callback="{{ refreshGC }}" label="GC"></nav-refresh>
     <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
-
-  <div class="flex-row">
-    <div id="newPieChart" class="flex-item-fixed-4-12" style="height: 400px">
+  <div class="content">
+    <h1>Allocation Profile</h1>
+    <br>
+    <div class="memberList">
+      <div class="memberItem">
+        <div class="memberName">last forced GC at</div>
+        <div class="memberValue">{{ lastServiceGC }}</div>
+      </div>
+      <div class="memberItem">
+        <div class="memberName">last accumulator reset at</div>
+        <div class="memberValue">{{ lastAccumulatorReset }}</div>
+      </div>
     </div>
-    <div id="newStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
+  </div>
+  <hr>
+  <div class="content-centered-big">
+    <div class="flex-row">
+      <div id="newSpace" class="flex-item-50-percent">
+        <h2>New Generation</h2>
+        <br>
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">used</div>
+            <div class="memberValue">
+              {{ isolate.newSpace.used | formatSize }}
+              of
+              {{ isolate.newSpace.capacity | formatSize }}
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">external</div>
+            <div class="memberValue">
+              {{ isolate.newSpace.external | formatSize }}
+            </div>
+          </div>
           <div class="memberItem">
             <div class="memberName">Collections</div>
             <div class="memberValue">{{ formattedCollections(true) }}</div>
@@ -64,12 +100,27 @@
             <div class="memberName">Cumulative Collection Time</div>
             <div class="memberValue">{{ formattedTotalCollectionTime(true) }}</div>
           </div>
+        </div>
+        <div id="newPieChart" style="height: 300px"></div>
       </div>
-    </div>
-    <div id="oldPieChart" class="flex-item-fixed-4-12" style="height: 400px">
-    </div>
-    <div id="oldStatus" class="flex-item-fixed-2-12">
-      <div class="memberList">
+      <div id="oldSpace" class="flex-item-50-percent">
+        <h2>Old Generation</h2>
+        <br>
+        <div class="memberList">
+          <div class="memberItem">
+            <div class="memberName">used</div>
+            <div class="memberValue">
+              {{ isolate.oldSpace.used | formatSize }}
+              of
+              {{ isolate.oldSpace.capacity | formatSize }}
+            </div>
+          </div>
+          <div class="memberItem">
+            <div class="memberName">external</div>
+            <div class="memberValue">
+              {{ isolate.oldSpace.external | formatSize }}
+            </div>
+          </div>
           <div class="memberItem">
             <div class="memberName">Collections</div>
             <div class="memberValue">{{ formattedCollections(false) }}</div>
@@ -82,39 +133,37 @@
             <div class="memberName">Cumulative Collection Time</div>
             <div class="memberValue">{{ formattedTotalCollectionTime(false) }}</div>
           </div>
+        </div>
+        <div id="oldPieChart" style="height: 300px"></div>
       </div>
     </div>
   </div>
-  <div class="flex-row">
-    <table id="classtable" class="flex-item-fixed-12-12 table">
-      <thead>
+  <br>
+  <hr>
+  <div class="content-centered-big">
+    <table id="classtable" class="flex-item-100-percent table">
+      <thead id="classTableHead">
         <tr>
           <th on-click="{{changeSort}}" class="clickable" title="Class">{{ classTable.getColumnLabel(0) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(1) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(2) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(3) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(4) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(5) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(6) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(7) }}</th>
-          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(8) }}</th>
+          <th class="spacer"></th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Size">{{ classTable.getColumnLabel(2) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Accumulated Instances">{{ classTable.getColumnLabel(3) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Size">{{ classTable.getColumnLabel(4) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="New Current Instances">{{ classTable.getColumnLabel(5) }}</th>
+          <th class="spacer"></th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Size">{{ classTable.getColumnLabel(7) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Accumulated Instances">{{ classTable.getColumnLabel(8) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Size">{{ classTable.getColumnLabel(9) }}</th>
+          <th on-click="{{changeSort}}" class="clickable" title="Old Current Instances">{{ classTable.getColumnLabel(10) }}</th>
         </tr>
       </thead>
-      <tbody>
-        <tr template repeat="{{row in classTable.sortedRows }}">
-          <td><class-ref ref="{{ classTable.getValue(row, 0) }}"></class-ref></td>
-          <td title="{{ classTable.getValue(row, 1) }}">{{ classTable.getFormattedValue(row, 1) }}</td>
-          <td title="{{ classTable.getValue(row, 2) }}">{{ classTable.getFormattedValue(row, 2) }}</td>
-          <td title="{{ classTable.getValue(row, 3) }}">{{ classTable.getFormattedValue(row, 3) }}</td>
-          <td title="{{ classTable.getValue(row, 4) }}">{{ classTable.getFormattedValue(row, 4) }}</td>
-          <td title="{{ classTable.getValue(row, 5) }}">{{ classTable.getFormattedValue(row, 5) }}</td>
-          <td title="{{ classTable.getValue(row, 6) }}">{{ classTable.getFormattedValue(row, 6) }}</td>
-          <td title="{{ classTable.getValue(row, 7) }}">{{ classTable.getFormattedValue(row, 7) }}</td>
-          <td title="{{ classTable.getValue(row, 8) }}">{{ classTable.getFormattedValue(row, 8) }}</td>
-        </tr>
+      <tbody id="classTableBody">
       </tbody>
     </table>
+    <br><br><br>
+    <br><br><br>
   </div>
 </template>
-<script type="application/dart" src="heap_profile.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="heap_profile.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
index 943ccda..d6487755 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_ref.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="instance-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -34,16 +34,16 @@
                         isBool(ref.serviceType) ||
                         isInt(ref.serviceType)) ||
                         isDouble(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['valueAsString'] }}</a>
+        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['valueAsString'] }}</a>
       </template>
 
       <template if="{{ (isType(ref.serviceType)) }}">
-        <a href="{{ url }}">{{ ref['user_name'] }}</a>
+        <a on-click="{{ goto }}" href="{{ url }}">{{ ref['user_name'] }}</a>
       </template>
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] != null}}">
-        <a href="{{ url }}">
+        <a on-click="{{ goto }}" href="{{ url }}">
           <!-- TODO(turnidge): Switch this to fully-qualified function -->
           {{ ref['closureFunc']['user_name'] }}
         </a>
@@ -51,7 +51,7 @@
 
       <template if="{{ isInstance(ref.serviceType) &&
                        ref['closureFunc'] == null}}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em></a>
+        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em></a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ field in ref['fields'] }}">
@@ -69,7 +69,7 @@
       </template>
 
       <template if="{{ isList(ref.serviceType) }}">
-        <a href="{{ url }}"><em>{{ ref['class']['user_name'] }}</em> ({{ ref['length']}})</a>
+        <a on-click="{{ goto }}" href="{{ url }}"><em>{{ ref['class'].name }}</em> ({{ ref['length']}})</a>
         <curly-block callback="{{ expander() }}">
           <div class="memberList">
             <template repeat="{{ element in ref['elements'] }}">
@@ -85,5 +85,6 @@
       </template>
     </span>
   </template>
-  <script type="application/dart" src="instance_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="instance_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
index ac67b18..ac9caef 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.dart
@@ -13,6 +13,7 @@
 class InstanceViewElement extends ObservatoryElement {
   @published ServiceMap instance;
   @published ServiceMap path;
+  @observable int retainedBytes = null;
 
   InstanceViewElement.created() : super.created();
 
@@ -23,7 +24,10 @@
 
   // TODO(koda): Add no-arg "calculate-link" instead of reusing "eval-link".
   Future<ServiceObject> retainedSize(var dummy) {
-    return instance.isolate.get(instance.id + "/retained");
+    return instance.isolate.get(instance.id + "/retained")
+        .then((ServiceMap obj) {
+          retainedBytes = int.parse(obj['valueAsString']);
+        });
   }
 
   Future<ServiceObject> retainingPath(var arg) {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
index 215d670..d54eaae 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/instance_view.html
@@ -1,14 +1,14 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="error_view.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="eval_link.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="nav_bar.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="error_view.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="eval_link.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="nav_bar.html">
+
 <polymer-element name="instance-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,6 +19,7 @@
       <class-nav-menu cls="{{ instance['class'] }}"></class-nav-menu>
       <nav-menu link="." anchor="instance" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <template if="{{ instance['error'] != null }}">
@@ -55,9 +56,14 @@
           <div class="memberItem">
             <div class="memberName">retained size</div>
             <div class="memberValue">
-              <eval-link callback="{{ retainedSize }}"
-                         label="[calculate]">
-              </eval-link>
+              <template if="{{ retainedBytes == null }}">
+                <eval-link callback="{{ retainedSize }}"
+                           label="[calculate]">
+                </eval-link>
+              </template>
+              <template if="{{ retainedBytes != null }}">
+                {{ retainedBytes | formatSize }}
+              </template>
             </div>
           </div>
           <div class="memberItem">
@@ -182,5 +188,6 @@
 
     </template>
   </template>
-  <script type="application/dart" src="instance_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="instance_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
index 9e93387..bd44740 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.dart
@@ -62,14 +62,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
       _updateTimer = null;
@@ -77,6 +79,47 @@
   }
 }
 
+@CustomTag('io-http-server-connection-view')
+class IOHttpServerConnectionViewElement extends ObservatoryElement {
+  @published ServiceMap connection;
+  Timer _updateTimer;
+
+  IOHttpServerConnectionViewElement.created() : super.created();
+
+  void refresh(var done) {
+    connection.reload().whenComplete(done);
+  }
+
+  void _updateHttpServer() {
+    refresh(() {
+      if (_updateTimer != null) {
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+      }
+    });
+  }
+
+  @override
+  void attached() {
+    super.attached();
+    // Start a timer to update the isolate summary once a second.
+    _updateTimer = new Timer(new Duration(seconds: 1), _updateHttpServer);
+  }
+
+  @override
+  void detached() {
+    super.detached();
+    if (_updateTimer != null) {
+      _updateTimer.cancel();
+      _updateTimer = null;
+    }
+  }
+}
+
+@CustomTag('io-http-server-connection-ref')
+class IOHttpServerConnectionRefElement extends ServiceRefElement {
+  IOHttpServerConnectionRefElement.created() : super.created();
+}
+
 @CustomTag('io-socket-ref')
 class IOSocketRefElement extends ServiceRefElement {
   IOSocketRefElement.created() : super.created();
@@ -167,14 +210,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
       _updateTimer = null;
@@ -220,14 +265,16 @@
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateFile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
       _updateTimer = null;
diff --git a/runtime/bin/vmservice/client/lib/src/elements/io_view.html b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
index 4343aec..6617315 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/io_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/io_view.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="service_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_ref.html">
+
 <polymer-element name="io-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -10,6 +10,7 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -19,7 +20,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/http/servers')}}">HTTP Servers</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/http/servers'))}}">HTTP Servers</a>
         </li>
       </ul>
 
@@ -27,7 +28,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/sockets')}}">Sockets</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/sockets'))}}">Sockets</a>
         </li>
       </ul>
 
@@ -35,7 +36,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/websockets')}}">WebSockets</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/websockets'))}}">WebSockets</a>
         </li>
       </ul>
 
@@ -43,7 +44,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/file/randomaccessfiles')}}">Random Access Files</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/file/randomaccessfiles'))}}">Random Access Files</a>
         </li>
       </ul>
 
@@ -51,7 +52,7 @@
 
       <ul class="list-group">
         <li class="list-group-item">
-          <a href="{{io.isolate.relativeHashLink('io/processes')}}">Processess</a>
+          <a on-click="{{ goto }}" href="{{gotoLink(io.isolate.relativeLink('io/processes'))}}">Processess</a>
         </li>
       </ul>
 
@@ -67,6 +68,9 @@
     <template if="{{ ref.serviceType == 'Socket' }}">
       <io-socket-ref ref="{{ ref }}"></io-socket-ref>
     </template>
+    <template if="{{ ref.serviceType == 'HttpServerConnection' }}">
+      <io-http-server-connection-ref ref="{{ ref }}"></io-http-server-connection-ref>
+    </template>
     <template if="{{ ref.serviceType == 'HttpServer' }}">
       <io-http-server-ref ref="{{ ref }}"></io-http-server-ref>
     </template>
@@ -109,7 +113,7 @@
 <polymer-element name="io-http-server-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -142,11 +146,64 @@
         </div>
         <div class="memberItem">
           <div class="memberName">Active connections</div>
-          <div class="memberValue">{{ httpServer['active'] }}</div>
+          <ul class="list-group">
+            <template repeat="{{ connection in httpServer['active'] }}">
+              <li class="list-group-item">
+                <io-http-server-connection-ref ref="{{ connection }}"></io-http-server-connection-ref>
+              </li>
+            </template>
+          </ul>
         </div>
         <div class="memberItem">
           <div class="memberName">Idle connections</div>
-          <div class="memberValue">{{ httpServer['idle'] }}</div>
+          <ul class="list-group">
+            <template repeat="{{ connection in httpServer['idle'] }}">
+              <li class="list-group-item">
+                <io-http-server-connection-ref ref="{{ connection }}"></io-http-server-connection-ref>
+              </li>
+            </template>
+          </ul>
+        </div>
+      </div>
+    </div>
+    <br>
+    <hr>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-connection-ref" extends="service-ref">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+    <a href="{{ url }}">{{ name }}</a>
+  </template>
+</polymer-element>
+
+<polymer-element name="io-http-server-connection-view" extends="observatory-element">
+  <template>
+    <link rel="stylesheet" href="css/shared.css">
+
+    <nav-bar>
+      <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    </nav-bar>
+
+    <div class="content">
+      <h1>HttpConnection</h1>
+
+      <br>
+
+      <div class="memberList">
+        <div class="memberItem">
+          <div class="memberName">Socket</div>
+          <div class="memberValue"><io-socket-ref ref="{{ connection['socket'] }}"></io-socket-ref></div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">State</div>
+          <div class="memberValue">{{ connection['state'] }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">Server</div>
+          <div class="memberValue"><io-http-server-ref ref="{{ connection['server'] }}"></io-http-server-ref></div>
         </div>
       </div>
     </div>
@@ -158,7 +215,7 @@
 <polymer-element name="io-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -288,7 +345,7 @@
 <polymer-element name="io-web-socket-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -348,7 +405,7 @@
 <polymer-element name="io-random-access-file-ref" extends="service-ref">
   <template>
     <link rel="stylesheet" href="css/shared.css">
-    <a href="{{ url }}">{{ name }}</a>
+    <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
   </template>
 </polymer-element>
 
@@ -444,10 +501,10 @@
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <template if="{{ small }}">
-      <a href="{{ url }}">{{ name }}</a>
+      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
     </template>
     <template if="{{ !small }}">
-      <a href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
+      <a on-click="{{ goto }}" href="{{ url }}">({{ ref['pid'] }}) {{ name }} {{ ref['arguments'] }}</a>
     </template>
   </template>
 </polymer-element>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
index ea60919..d8d5bd6 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.dart
@@ -127,7 +127,9 @@
   }
 
 
-  void enteredView() {
+  @override
+  void attached() {
+    super.attached();
     tree = new TableTree();
     _update();
   }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
index b15b9fc..f7fb0b1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_profile.html
@@ -1,18 +1,19 @@
-<head>
-  <link rel="import" href="code_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="sliding_checkbox.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="code_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="sliding_checkbox.html">
+
 <polymer-element name="isolate-profile" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ profile.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ profile.isolate.relativeHashLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ profile.isolate.relativeLink('profile') }}" anchor="cpu profile" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <style>
       .table {
@@ -186,5 +187,6 @@
       </table>
     </div>
   </template>
-  <script type="application/dart" src="isolate_profile.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_profile.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
index 84e4e66..5ab877e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_ref.html
@@ -1,9 +1,9 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
 <polymer-element name="isolate-ref" extends="service-ref">
 <template><link rel="stylesheet" href="css/shared.css">
-  <a href="{{ url }}">{{ ref.name }}</a>
+  <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
 </template>
-<script type="application/dart" src="isolate_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
index 9ed1e77..06738ea 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_summary.html
@@ -1,11 +1,10 @@
-<head>
-  <link rel="import" href="action_link.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
 <polymer-element name="isolate-summary" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -128,48 +127,55 @@
           <div class="memberItem">
             <div class="memberName">new heap</div>
             <div class="memberValue">
-              {{ isolate.newHeapUsed | formatSize }}
+              {{ isolate.newSpace.used | formatSize }}
               of
-              {{ isolate.newHeapCapacity | formatSize }}
+              {{ isolate.newSpace.capacity | formatSize }}
             </div>
           </div>
           <div class="memberItem">
             <div class="memberName">old heap</div>
             <div class="memberValue">
-              {{ isolate.oldHeapUsed | formatSize }}
+              {{ isolate.oldSpace.used | formatSize }}
               of
-              {{ isolate.oldHeapCapacity | formatSize }}
+              {{ isolate.oldSpace.capacity | formatSize }}
             </div>
           </div>
         </div>
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('stacktrace') }}">stack trace</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink('/class-tree' + isolate.link) }}">class hierarchy</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('profile') }}">cpu profile</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('stacktrace')) }}">stack trace</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('allocationprofile') }}">allocation profile</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('profile')) }}">cpu profile</a>
           </div>
         </div>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="{{ isolate.relativeHashLink('heapmap') }}">heap map</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('allocationprofile')) }}">allocation profile</a>
           </div>
         </div>
+        <div class="memberItem">
+          <div class="memberValue">
+            See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('heapmap')) }}">heap map</a>
+          </div>
+        </div>
+        <!-- Temporarily disabled until UI for dart:io is acceptable.
         <template if="{{ isolate.ioEnabled }}">
           <div class="memberItem">
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('io') }}">dart:io</a>
+              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('io')) }}">dart:io</a>
             </div>
           </div>
         </template>
+        -->
       </div>
       <div class="flex-item-10-percent">
       </div>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
index 582c9ee..5199f83 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.dart
@@ -92,21 +92,26 @@
     isolate.updateTagProfile().then((tagProfile) {
       tagProfileChart.update(tagProfile);
       _drawTagProfileChart();
-      // Start the timer again.
-      _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
+      if (_updateTimer != null) {
+        // Start the timer again.
+        _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
+      }
     });
   }
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     // Start a timer to update the isolate summary once a second.
     _updateTimer = new Timer(new Duration(seconds: 1), _updateTagProfile);
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void detached() {
+    super.detached();
     if (_updateTimer != null) {
       _updateTimer.cancel();
+      _updateTimer = null;
     }
   }
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
index 794b50a..9a780cd 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/isolate_view.html
@@ -1,15 +1,15 @@
-<head>
-  <link rel="import" href="action_link.html">
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_summary.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="action_link.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_summary.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="isolate-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -28,6 +28,7 @@
       <isolate-nav-menu isolate="{{ isolate }}" last="{{ true }}">
       </isolate-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -99,7 +100,7 @@
         <div class="flex-item-50-percent">
           <div class="memberItem">
             <div class="memberValue">
-              See <a href="{{ isolate.relativeHashLink('debug/breakpoints') }}">breakpoints</a>
+              See <a on-click="{{ goto }}" href="{{ gotoLink(isolate.relativeLink('debug/breakpoints')) }}">breakpoints</a>
             </div>
           </div>
         </div>
@@ -137,5 +138,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="isolate_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="isolate_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/json_view.html b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
index f7e42ff..4ef479b 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/json_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/json_view.html
@@ -1,3 +1,4 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="nav_bar.html">
 <link rel="import" href="observatory_element.html">
 <polymer-element name="json-view" extends="observatory-element">
@@ -7,5 +8,6 @@
     </nav-bar>
       <pre>{{ mapAsString }}</pre>
   </template>
-  <script type="application/dart" src="json_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="json_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
index 5dbfc55..2b8c831 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_ref.html
@@ -1,14 +1,15 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="library-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css">
-  <template if="{{ nameIsEmpty }}">
-    <a href="{{ url }}">unnamed</a>
+  <template><link rel="stylesheet" href="css/shared.css">
+    <template if="{{ nameIsEmpty }}">
+      <a on-click="{{ goto }}" href="{{ url }}">unnamed</a>
+    </template>
+    <template if="{{ !nameIsEmpty }}">
+      <a on-click="{{ goto }}" href="{{ url }}">{{ name }}</a>
+    </template>
   </template>
-  <template if="{{ !nameIsEmpty }}">
-    <a href="{{ url }}">{{ name }}</a>
-  </template>
-</template>
-<script type="application/dart" src="library_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="library_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/library_view.html b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
index 9b4e339..0d12935 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/library_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/library_view.html
@@ -1,15 +1,15 @@
-<head>
-  <link rel="import" href="class_ref.html">
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="field_ref.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="class_ref.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="field_ref.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="library-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -19,6 +19,7 @@
       <isolate-nav-menu isolate="{{ library.isolate }}"></isolate-nav-menu>
       <library-nav-menu library="{{ library }}" last="{{ true }}"></library-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -137,5 +138,6 @@
     <br><br><br><br>
     <br><br><br><br>
   </template>
-  <script type="application/dart" src="library_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="library_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
index c82b427..fb241d4 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.dart
@@ -6,6 +6,7 @@
 
 import 'dart:html';
 import 'observatory_element.dart';
+import 'package:observatory/app.dart';
 import 'package:observatory/service.dart';
 import 'package:polymer/polymer.dart';
 
@@ -57,6 +58,19 @@
   }
 }
 
+@CustomTag('nav-control')
+class NavControlElement extends ObservatoryElement {
+  NavControlElement.created() : super.created();
+
+  void forward(Event e, var detail, Element target) {
+    location.forward();
+  }
+
+  void back(Event e, var detail, Element target) {
+    location.back();
+  }
+}
+
 @CustomTag('top-nav-menu')
 class TopNavMenuElement extends ObservatoryElement {
   @published bool last = false;
@@ -77,7 +91,7 @@
   @reflectable
   String get hashLinkWorkaround {
     if (isolate != null) {
-      return isolate.hashLink;
+      return isolate.link;
     } else {
       return '';
     }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
index fd4f762..213f323 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/nav_bar.html
@@ -1,6 +1,5 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
 
 <polymer-element name="nav-bar" extends="observatory-element">
   <template>
@@ -81,7 +80,7 @@
     </style>
 
     <li class="menu">
-      <a href="{{ link }}">{{ anchor }}</a>
+      <a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
     <template if="{{ !last }}">
@@ -129,7 +128,7 @@
         text-decoration: none;
       }
     </style>
-    <li><a href="{{ link }}">{{ anchor }}</a>
+    <li><a on-click="{{ goto }}" href="{{ gotoLink(link) }}">{{ anchor }}</a>
       <ul><content></content></ul>
     </li>
   </template>
@@ -165,9 +164,33 @@
   </template>
 </polymer-element>
 
+<polymer-element name="nav-control" extends="observatory-element">
+  <template>
+    <style>
+      .black {
+        color: #000;
+      }
+      li {
+        float: right;
+        margin: 0;
+      }
+      button {
+        margin: 3px;
+        padding: 8px;
+      }
+    </style>
+    <!-- Disable until issues with history in Dartium are fixed
+    <li>
+      <button class="black" on-click="{{ back }}">&#9664;</button>
+      <button class="black" on-click="{{ forward }}">&#9654;</button>
+    </li>
+    -->
+  </template>
+</polymer-element>
+
 <polymer-element name="top-nav-menu">
   <template>
-    <nav-menu link="#/vm" anchor="Observatory" last="{{ last }}">
+    <nav-menu link="/vm" anchor="Observatory" last="{{ last }}">
       <content></content>
     </nav-menu>
   </template>
@@ -176,15 +199,15 @@
 <polymer-element name="isolate-nav-menu" extends="observatory-element">
   <template>
     <nav-menu link="{{ hashLinkWorkaround }}" anchor="{{ isolate.name }}" last="{{ last }}">
-      <nav-menu-item link="{{ isolate.relativeHashLink('stacktrace') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('stacktrace') }}"
                      anchor="stack trace"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('profile') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('profile') }}"
                      anchor="cpu profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('allocationprofile') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('allocationprofile') }}"
                      anchor="allocation profile"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('heapmap') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('heapmap') }}"
                      anchor="heap map"></nav-menu-item>
-      <nav-menu-item link="{{ isolate.relativeHashLink('debug/breakpoints') }}"
+      <nav-menu-item link="{{ isolate.relativeLink('debug/breakpoints') }}"
                      anchor="breakpoints"></nav-menu-item>
       <content></content>
     </nav-menu>
@@ -193,7 +216,7 @@
 
 <polymer-element name="library-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ library.hashLink }}"
+    <nav-menu link="{{ library.link }}"
               anchor="{{ library.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
@@ -202,7 +225,7 @@
 
 <polymer-element name="class-nav-menu" extends="observatory-element">
   <template>
-    <nav-menu link="{{ cls.hashLink }}"
+    <nav-menu link="{{ cls.link }}"
               anchor="{{ cls.name }}" last="{{ last }}">
       <content></content>
     </nav-menu>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
index d1a4f8d..a11385f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.dart
@@ -14,16 +14,17 @@
 @CustomTag('observatory-application')
 class ObservatoryApplicationElement extends ObservatoryElement {
   @published bool devtools = false;
-  @published ObservatoryApplication app;
+  @reflectable ObservatoryApplication app;
 
   ObservatoryApplicationElement.created() : super.created();
 
-  enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (devtools) {
-      app = new ObservatoryApplication.devtools();
+      app = new ObservatoryApplication.devtools(this);
     } else {
-      app = new ObservatoryApplication();
+      app = new ObservatoryApplication(this);
     }
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
index 0d34af3..73a2615 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_application.html
@@ -1,10 +1,8 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="response_viewer.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="service_view.html">
 <polymer-element name="observatory-application" extends="observatory-element">
-  <template>
-    <response-viewer app="{{ this.app }}"></response-viewer>
-  </template>
-  <script type="application/dart" src="observatory_application.dart"></script>
+  <!-- This element explicitly manages its child elements -->
 </polymer-element>
+
+<script type="application/dart" src="observatory_application.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
index b889559..5cc8d91 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.dart
@@ -4,6 +4,7 @@
 
 library observatory_element;
 
+import 'dart:html';
 import 'package:observatory/app.dart';
 import 'package:polymer/polymer.dart';
 
@@ -12,22 +13,35 @@
 class ObservatoryElement extends PolymerElement {
   ObservatoryElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
   }
 
-  void leftView() {
-    super.leftView();
+  @override
+  void attributeChanged(String name, var oldValue, var newValue) {
+    super.attributeChanged(name, oldValue, newValue);
+  }
+
+  @override
+  void detached() {
+    super.detached();
   }
 
   void ready() {
     super.ready();
   }
 
-  void attributeChanged(String name, var oldValue, var newValue) {
-    super.attributeChanged(name, oldValue, newValue);
+  void goto(MouseEvent event, var detail, Element target) {
+    location.onGoto(event, detail, target);
   }
 
+  String gotoLink(String url) {
+    return location.makeLink(url);
+  }
+
+
+
   String formatTimePrecise(double time) => Utils.formatTimePrecise(time);
 
   String formatTime(double time) => Utils.formatTime(time);
diff --git a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
index 8a24a8c..dce89dc 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/observatory_element.html
@@ -1,3 +1,6 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="observatory-element">
-  <script type="application/dart" src="observatory_element.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="observatory_element.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
index da79352..cffe42e 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.dart
@@ -14,66 +14,69 @@
   @published Script script;
   @published int pos;
   @published int endPos;
-  @published bool coverage = false;
+  final List<int> lineNumbers = new ObservableList<int>();
+  @observable int startLine;
+  @observable int endLine;
 
   @observable List<ScriptLine> lines = toObservable([]);
 
+  void attached() {
+    super.attached();
+  }
+
   void scriptChanged(oldValue) {
-    _updateProperties();
-    notifyPropertyChange(#hitStyle, 0, 1);
+    _updateLines();
   }
 
   void posChanged(oldValue) {
-    _updateProperties();
+    _updateLines();
   }
 
-  coverageChanged(oldValue) {
-    notifyPropertyChange(#lines, 0, 1);
-    notifyPropertyChange(#hitStyle, 0, 1);
+  void endPosChanged(oldValue) {
+    _updateLines();
   }
 
   static const hitStyleNone = 'min-width:32px;';
-  static const hitStyleExecuted = 'min-width:32px;background-color:green';
-  static const hitStyleNotExecuted = 'min-width:32px;background-color:red';
+  static const hitStyleExecuted = 'min-width:32px; background-color:green';
+  static const hitStyleNotExecuted = 'min-width:32px; background-color:red';
 
-  @observable String hitStyle(ScriptLine line) {
-    if ((script == null) || !coverage) {
+  /// [hits] can be null which indicates that the line is not executable.
+  /// When [hits] is 0, the line is executable but hasn't been executed and
+  /// when [hits] is positive, the line is executable and has been executed.
+  String styleForHits(int hits) {
+    if (hits == null) {
       return hitStyleNone;
-    }
-    var hit = script.hits[line.line];
-    if (hit == null) {
-      return hitStyleNone;
-    }
-    if (hit == 0) {
+    } else if (hits == 0) {
       return hitStyleNotExecuted;
     }
-    assert(hit > 0);
+    assert(hits > 0);
     return hitStyleExecuted;
   }
 
+  var _updateFuture;
 
-  void _updateProperties() {
-    if (!script.loaded) {
-      script.load().then((_) {
-          if (script.loaded) {
-            _updateProperties();
-          }
-        });
+  void _updateLines() {
+    if (_updateFuture != null) {
+      // Already scheduled.
       return;
     }
-    notifyPropertyChange(#lines, 0, 1);
-    lines.clear();
-    var startLineNumber = script.tokenToLine(pos);
-    if (startLineNumber != null) {
-      if (endPos == null) {  
-        lines.add(script.lines[startLineNumber - 1]);
-      } else {
-        var endLineNumber = script.tokenToLine(endPos);
-        assert(endLineNumber != null);
-        for (var i = startLineNumber; i <= endLineNumber; i++) {
-          lines.add(script.lines[i - 1]);
+    if (!script.loaded) {
+      _updateFuture = script.load().then((_) {
+        if (script.loaded) {
+          _updateFuture = null;
+          _updateLines();
         }
-      }
+      });
+      return;
+    }
+    startLine =
+        (pos != null) ? script.tokenToLine(pos) - 1 : 0;
+    endLine =
+        (endPos != null) ? script.tokenToLine(endPos) : script.lines.length;
+    // Add line numbers.
+    lineNumbers.clear();
+    for (var i = startLine; i < endLine; i++) {
+      lineNumbers.add(i);
     }
   }
 
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
index e4023b4..cefb95c 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_inset.html
@@ -1,6 +1,6 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="script-inset" extends="observatory-element">
   <template>
     <style>
@@ -18,31 +18,19 @@
     <div class="sourceInset">
       <content></content>
       <div class="grayBox">
-        <template if="{{ coverage == true }}">
-          <table>
-            <tbody>
-              <tr template repeat="{{ line in lines }}">
-                <td style="{{ hitStyle(line) }}"><span>  </span></td>
-                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-                <td>&nbsp;</td>
-                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-              </tr>
-            </tbody>
-          </table>
-        </template>
-        <template if="{{ coverage == false }}">
-          <table>
-            <tbody>
-              <tr template repeat="{{ line in lines }}">
-                <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{line.line}}</td>
-                <td>&nbsp;</td>
-                <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{line.text}}</td>
-              </tr>
-            </tbody>
-          </table>
-        </template>
+        <table>
+          <tbody>
+            <tr template repeat="{{ lineNumber in lineNumbers }}">
+              <td style="{{ styleForHits(script.lines[lineNumber].hits) }}"><span>  </span></td>
+              <td style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: nowrap;">{{script.lines[lineNumber].line}}</td>
+              <td>&nbsp;</td>
+              <td width="99%" style="font-family: consolas, courier, monospace;font-size: 1em;line-height: 1.2em;white-space: pre;">{{script.lines[lineNumber].text}}</td>
+            </tr>
+          </tbody>
+        </table>
       </div>
     </div>
   </template>
-  <script type="application/dart" src="script_inset.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_inset.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
index 07f27f2..14b4b6d 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_ref.html
@@ -1,11 +1,12 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="observatory_element.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="script-ref" extends="service-ref">
 <template>
   <link rel="stylesheet" href="css/shared.css">
-  <a title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
+  <a on-click="{{ goto }}" title="{{ hoverText }}" href="{{ url }}">{{ name }}</a>
 </template>
-<script type="application/dart" src="script_ref.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
index 5971488..64f8231 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.dart
@@ -13,28 +13,23 @@
 @CustomTag('script-view')
 class ScriptViewElement extends ObservatoryElement {
   @published Script script;
-  @published bool showCoverage = false;
 
   ScriptViewElement.created() : super.created();
 
-  void enteredView() {
-    super.enteredView();
+  @override
+  void attached() {
+    super.attached();
     if (script == null) {
       return;
     }
     script.load();
   }
 
-  showCoverageChanged(oldValue) {
-    ScriptInsetElement sie = shadowRoot.querySelector('#scriptInset');
-    sie.coverage = showCoverage;
-  }
-
   void refresh(var done) {
     script.reload().whenComplete(done);
   }
 
   void refreshCoverage(var done) {
-    script.isolate.refreshCoverage().whenComplete(done);
+    script.isolate.refreshCoverage()..whenComplete(done);
   }
 }
diff --git a/runtime/bin/vmservice/client/lib/src/elements/script_view.html b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
index accb51f..a99bb89 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/script_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/script_view.html
@@ -1,8 +1,8 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_inset.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_inset.html">
+
 <polymer-element name="script-view" extends="observatory-element">
 <template>
   <link rel="stylesheet" href="css/shared.css">
@@ -10,20 +10,16 @@
     <top-nav-menu></top-nav-menu>
     <isolate-nav-menu isolate="{{ script.isolate }}">
     </isolate-nav-menu>
-    <nav-menu link="." anchor="{{ script.name }}" last="{{ true }}">
-      <li>
-        <input type="checkbox" checked="{{ showCoverage }}">
-        <label>Show Coverage Data</label>
-      </li>
-    </nav-menu>
+    <nav-menu link="{{ script.link }}" anchor="{{ script.name }}" last="{{ true }}"></nav-menu>
     <nav-refresh callback="{{ refreshCoverage }}" label="Refresh Coverage"></nav-refresh>
-    <nav-refresh callback="{{ refresh }}">
-    </nav-refresh>
+    <nav-refresh callback="{{ refresh }}"></nav-refresh>
+    <nav-control></nav-control>
   </nav-bar>
 
   <script-inset id="scriptInset" script="{{ script }}" pos="{{ script.firstTokenPos }}" endPos="{{ script.lastTokenPos }}">
   <h1>script {{ script.name }}</h1>
   </script-inset>
 </template>
-<script type="application/dart" src="script_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="script_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
index 95e7972..b074d5a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_error_view.html
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-error-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ error.kind }}</h1>
@@ -14,5 +15,6 @@
       <div class="well">{{ error.message }}</div>
     </div>
   </template>
-  <script type="application/dart" src="service_error_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_error_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
index 855417e..d758e13 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_exception_view.html
@@ -1,12 +1,13 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-exception-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
+      <nav-control></nav-control>
     </nav-bar>
     <div class="content-centered">
       <h1>{{ exception.kind }}</h1>
@@ -17,5 +18,6 @@
       </template>
     </div>
   </template>
-  <script type="application/dart" src="service_exception_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_exception_view.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
index 2286b1a..5b6b1a1 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.dart
@@ -25,7 +25,7 @@
     if (ref == null) {
       return 'NULL REF';
     }
-    return ref.hashLink;
+    return gotoLink(ref.link);
   }
 
   String get serviceId {
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
index 1818675..d8e04c9 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_ref.html
@@ -1,6 +1,7 @@
-<head>
-  <link rel="import" href="observatory_element.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="observatory_element.html">
+
 <polymer-element name="service-ref" extends="observatory-element">
-  <script type="application/dart" src="service_ref.dart"></script>
-</polymer-element>
\ No newline at end of file
+</polymer-element>
+
+<script type="application/dart" src="service_ref.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
index 6ee3100..da395c7 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.dart
@@ -105,6 +105,11 @@
             new Element.tag('io-http-server-view');
         element.httpServer = object;
         return element;
+      case 'HttpServerConnection':
+        IOHttpServerConnectionViewElement element =
+            new Element.tag('io-http-server-connection-view');
+        element.connection = object;
+        return element;
       case 'SocketList':
         IOSocketListViewElement element =
             new Element.tag('io-socket-list-view');
diff --git a/runtime/bin/vmservice/client/lib/src/elements/service_view.html b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
index 22b3b98..b91da34 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/service_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/service_view.html
@@ -1,22 +1,22 @@
-<head>
-  <link rel="import" href="breakpoint_list.html">
-  <link rel="import" href="class_view.html">
-  <link rel="import" href="code_view.html">
-  <link rel="import" href="error_view.html">
-  <link rel="import" href="field_view.html">
-  <link rel="import" href="function_view.html">
-  <link rel="import" href="heap_map.html">
-  <link rel="import" href="heap_profile.html">
-  <link rel="import" href="instance_view.html">
-  <link rel="import" href="isolate_profile.html">
-  <link rel="import" href="library_view.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_view.html">
-  <link rel="import" href="stack_trace.html">
-  <link rel="import" href="vm_view.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="breakpoint_list.html">
+<link rel="import" href="class_view.html">
+<link rel="import" href="code_view.html">
+<link rel="import" href="error_view.html">
+<link rel="import" href="field_view.html">
+<link rel="import" href="function_view.html">
+<link rel="import" href="heap_map.html">
+<link rel="import" href="heap_profile.html">
+<link rel="import" href="instance_view.html">
+<link rel="import" href="isolate_profile.html">
+<link rel="import" href="library_view.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_view.html">
+<link rel="import" href="stack_trace.html">
+<link rel="import" href="vm_view.html">
 <polymer-element name="service-view" extends="observatory-element">
   <!-- This element explicitly manages the child elements to avoid setting
        an observable property on the old element to an invalid type. -->
-  <script type="application/dart" src="service_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="service_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
index 80f39aa..cdb4f78 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/sliding_checkbox.html
@@ -1,3 +1,5 @@
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+
 <polymer-element name="sliding-checkbox">
   <template>
     <style>
@@ -83,5 +85,6 @@
       </label>
     </div>
   </template>
-  <script type="application/dart" src="sliding_checkbox.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="sliding_checkbox.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
index c03e148..8cb6e9a 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_frame.html
@@ -1,10 +1,10 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="instance_ref.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="instance_ref.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="stack-frame" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -37,5 +37,6 @@
       </div>
     </div>
   </template>
-  <script type="application/dart" src="stack_frame.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="stack_frame.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
index bd3e569..f08b032 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/stack_trace.html
@@ -1,16 +1,17 @@
-<head>
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="stack_frame.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="stack_frame.html">
+
 <polymer-element name="stack-trace" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
     <nav-bar>
       <top-nav-menu></top-nav-menu>
       <isolate-nav-menu isolate="{{ trace.isolate }}"></isolate-nav-menu>
-      <nav-menu link="{{ trace.isolate.relativeHashLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
+      <nav-menu link="{{ trace.isolate.relativeLink('stacktrace') }}" anchor="stack trace" last="{{ true }}"></nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
     <template if="{{ trace['members'].isEmpty }}">
       <div class="content">
@@ -27,5 +28,6 @@
       </ul>
     </template>
   </template>
-  <script type="application/dart" src="stack_trace.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="stack_trace.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
index 07155df..2ab2f70 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_ref.html
@@ -1,9 +1,10 @@
-<head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
 <link rel="import" href="service_ref.html">
-</head>
+
 <polymer-element name="vm-ref" extends="service-ref">
-<template><link rel="stylesheet" href="css/shared.css">
-  <a href="{{ url }}">{{ ref.name }}</a>
-</template>
-<script type="application/dart" src="vm_ref.dart"></script>
+  <template><link rel="stylesheet" href="css/shared.css">
+    <a on-click="{{ goto }}" href="{{ url }}">{{ ref.name }}</a>
+  </template>
 </polymer-element>
+
+<script type="application/dart" src="vm_ref.dart"></script>
diff --git a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
index 226d085..d45c24f 100644
--- a/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
+++ b/runtime/bin/vmservice/client/lib/src/elements/vm_view.html
@@ -1,13 +1,13 @@
-<head>
-  <link rel="import" href="curly_block.html">
-  <link rel="import" href="eval_box.html">
-  <link rel="import" href="function_ref.html">
-  <link rel="import" href="isolate_summary.html">
-  <link rel="import" href="library_ref.html">
-  <link rel="import" href="nav_bar.html">
-  <link rel="import" href="observatory_element.html">
-  <link rel="import" href="script_ref.html">
-</head>
+<link rel="import" href="../../../../packages/polymer/polymer.html">
+<link rel="import" href="curly_block.html">
+<link rel="import" href="eval_box.html">
+<link rel="import" href="function_ref.html">
+<link rel="import" href="isolate_summary.html">
+<link rel="import" href="library_ref.html">
+<link rel="import" href="nav_bar.html">
+<link rel="import" href="observatory_element.html">
+<link rel="import" href="script_ref.html">
+
 <polymer-element name="vm-view" extends="observatory-element">
   <template>
     <link rel="stylesheet" href="css/shared.css">
@@ -15,6 +15,7 @@
     <nav-bar>
       <top-nav-menu last="{{ true }}"></top-nav-menu>
       <nav-refresh callback="{{ refresh }}"></nav-refresh>
+      <nav-control></nav-control>
     </nav-bar>
 
     <div class="content">
@@ -36,10 +37,18 @@
           <div class="memberName">asserts enabled</div>
           <div class="memberValue">{{ vm.assertsEnabled }}</div>
         </div>
+        <div class="memberItem">
+          <div class="memberName">pid</div>
+          <div class="memberValue">{{ vm.pid }}</div>
+        </div>
+        <div class="memberItem">
+          <div class="memberName">refreshed at</div>
+          <div class="memberValue">{{ vm.lastUpdate }}</div>
+        </div>
         <br>
         <div class="memberItem">
           <div class="memberValue">
-            See <a href="#/flags">flags</a>
+            See <a on-click="{{ goto }}" href="{{ gotoLink('/flags') }}">flags</a>
           </div>
         </div>
       </div>
@@ -57,5 +66,6 @@
       </template>
     </ul>
   </template>
-  <script type="application/dart" src="vm_view.dart"></script>
 </polymer-element>
+
+<script type="application/dart" src="vm_view.dart"></script>
\ No newline at end of file
diff --git a/runtime/bin/vmservice/client/lib/src/service/object.dart b/runtime/bin/vmservice/client/lib/src/service/object.dart
index 7df9eb6..d63afa3 100644
--- a/runtime/bin/vmservice/client/lib/src/service/object.dart
+++ b/runtime/bin/vmservice/client/lib/src/service/object.dart
@@ -29,11 +29,6 @@
   /// The complete service url of this object.
   @reflectable String get link => _owner.relativeLink(_id);
 
-  /// The complete service url of this object with a '#/' prefix.
-  // TODO(turnidge): Figure out why using a getter here messes up polymer.
-  @reflectable String get hashLink => '#/${link}';
-  @reflectable set hashLink(var o) { /* silence polymer */ }
-
   /// Has this object been fully loaded?
   bool get loaded => _loaded;
   bool _loaded = false;
@@ -67,6 +62,9 @@
     var obj = null;
     assert(type != 'VM');
     switch (type) {
+      case 'Class':
+        obj = new Class._empty(owner);
+        break;
       case 'Code':
         obj = new Code._empty(owner);
         break;
@@ -192,6 +190,8 @@
   @observable double uptime = 0.0;
   @observable bool assertsEnabled = false;
   @observable bool typeChecksEnabled = false;
+  @observable String pid = '';
+  @observable DateTime lastUpdate;
 
   VM() : super._empty(null) {
     name = 'vm';
@@ -252,45 +252,39 @@
   }
 
   Future<ServiceObject> get(String id) {
-    var parts = id.split('#');
-    assert(parts.length >= 1);
-    // We should never see more than two hashes.
-    assert(parts.length <= 2);
-    // The ID does not include anything after the # (or the # itself).
-    id = parts[0];
-    // I'm serious.
-    assert(!id.contains('#'));
+    assert(id.startsWith('/') == false);
     // Isolates are handled specially, since they can cache sub-objects.
     if (id.startsWith(_isolatesPrefix)) {
       String isolateId = _parseIsolateId(id);
       String objectId = _parseObjectId(id);
       return _getIsolate(isolateId).then((isolate) {
-          if (isolate == null) {
-            // The isolate does not exist.  Return the VM object instead.
-            //
-            // TODO(turnidge): Generate a service error?
-            return this;
-          }
-          if (objectId == null) {
-            return isolate.reload();
-          } else {
-            return isolate.get(objectId);
-          }
-        });
+        if (isolate == null) {
+          // The isolate does not exist.  Return the VM object instead.
+          //
+          // TODO(turnidge): Generate a service error?
+          return this;
+        }
+        if (objectId == null) {
+          return isolate.reload();
+        } else {
+          return isolate.get(objectId);
+        }
+      });
     }
 
     var obj = _cache[id];
     if (obj != null) {
       return obj.reload();
     }
+
     // Cache miss.  Get the object from the vm directly.
     return getAsMap(id).then((ObservableMap map) {
-        var obj = new ServiceObject._fromMap(this, map);
-        if (obj.canCache) {
-          _cache.putIfAbsent(id, () => obj);
-        }
-        return obj;
-      });
+      var obj = new ServiceObject._fromMap(this, map);
+      if (obj.canCache) {
+        _cache.putIfAbsent(id, () => obj);
+      }
+      return obj;
+    });
   }
 
   dynamic _reviver(dynamic key, dynamic value) {
@@ -381,7 +375,10 @@
     version = map['version'];
     architecture = map['architecture'];
     uptime = map['uptime'];
+    var dateInMillis = int.parse(map['date']);
+    lastUpdate = new DateTime.fromMillisecondsSinceEpoch(dateInMillis);
     assertsEnabled = map['assertsEnabled'];
+    pid = map['pid'];
     typeChecksEnabled = map['typeChecksEnabled'];
     _updateIsolates(map['isolates']);
   }
@@ -492,14 +489,29 @@
   }
 }
 
+class HeapSpace extends Observable {
+  @observable int used = 0;
+  @observable int capacity = 0;
+  @observable int external = 0;
+  @observable int collections = 0;
+  @observable double totalCollectionTimeInSeconds = 0.0;
+
+  void update(Map heapMap) {
+    used = heapMap['used'];
+    capacity = heapMap['capacity'];
+    external = heapMap['external'];
+    collections = heapMap['collections'];
+    totalCollectionTimeInSeconds = heapMap['time'];
+  }
+}
+
 /// State for a running isolate.
 class Isolate extends ServiceObjectOwner {
   @reflectable VM get vm => owner;
   @reflectable Isolate get isolate => this;
   @observable ObservableMap counters = new ObservableMap();
 
-  String get link => _id;
-  String get hashLink => '#/$_id';
+  String get link => '/${_id}';
 
   @observable ServiceMap pauseEvent = null;
   bool get _isPaused => pauseEvent != null;
@@ -517,9 +529,7 @@
   }
 
   /// Creates a link to [id] relative to [this].
-  @reflectable String relativeLink(String id) => '${this.id}/$id';
-  /// Creates a relative link to [id] with a '#/' prefix.
-  @reflectable String relativeHashLink(String id) => '#/${relativeLink(id)}';
+  @reflectable String relativeLink(String id) => '/${this.id}/$id';
 
   static const TAG_ROOT_ID = 'code/tag-0';
 
@@ -585,6 +595,41 @@
     script._processHits(scriptCoverage['hits']);
   }
 
+  /// Fetches and builds the class hierarchy for this isolate. Returns the
+  /// Object class object.
+  Future<Class> getClassHierarchy() {
+    return get('classes').then(_loadClasses).then(_buildClassHierarchy);
+  }
+
+  /// Given the class list, loads each class.
+  Future<List<Class>> _loadClasses(ServiceMap classList) {
+    assert(classList.serviceType == 'ClassList');
+    var futureClasses = [];
+    for (var cls in classList['members']) {
+      // Skip over non-class classes.
+      if (cls is Class) {
+        futureClasses.add(cls.load());
+      }
+    }
+    return Future.wait(futureClasses);
+  }
+
+  /// Builds the class hierarchy and returns the Object class.
+  Future<Class> _buildClassHierarchy(List<Class> classes) {
+    rootClasses.clear();
+    objectClass = null;
+    for (var cls in classes) {
+      if (cls.superClass == null) {
+        rootClasses.add(cls);
+      }
+      if ((cls.vmName == 'Object') && (cls.isPatch == false)) {
+        objectClass = cls;
+      }
+    }
+    assert(objectClass != null);
+    return new Future.value(objectClass);
+  }
+
   ServiceObject getFromMap(ObservableMap map) {
     if (map == null) {
       return null;
@@ -619,6 +664,9 @@
       });
   }
 
+  @observable Class objectClass;
+  @observable final rootClasses = new ObservableList<Class>();
+
   @observable Library rootLib;
   @observable ObservableList<Library> libraries =
       new ObservableList<Library>();
@@ -632,15 +680,18 @@
   @observable final Map<String, double> timers =
       toObservable(new Map<String, double>());
 
-  @observable int newHeapUsed = 0;
-  @observable int oldHeapUsed = 0;
-  @observable int newHeapCapacity = 0;
-  @observable int oldHeapCapacity = 0;
+  final HeapSpace newSpace = new HeapSpace();
+  final HeapSpace oldSpace = new HeapSpace();
 
   @observable String fileAndLine;
 
   @observable DartError error;
 
+  void updateHeapsFromMap(ObservableMap map) {
+    newSpace.update(map['new']);
+    oldSpace.update(map['old']);
+  }
+
   void _update(ObservableMap map, bool mapIsRef) {
     mainPort = map['mainPort'];
     name = map['name'];
@@ -653,7 +704,7 @@
     _upgradeCollection(map, isolate);
     if (map['rootLib'] == null ||
         map['timers'] == null ||
-        map['heap'] == null) {
+        map['heaps'] == null) {
       Logger.root.severe("Malformed 'Isolate' response: $map");
       return;
     }
@@ -702,10 +753,7 @@
                       timerMap['time_bootstrap']);
     timers['dart'] = timerMap['time_dart_execution'];
 
-    newHeapUsed = map['heap']['usedNew'];
-    oldHeapUsed = map['heap']['usedOld'];
-    newHeapCapacity = map['heap']['capacityNew'];
-    oldHeapCapacity = map['heap']['capacityOld'];
+    updateHeapsFromMap(map['heaps']);
 
     List features = map['features'];
     if (features != null) {
@@ -906,7 +954,7 @@
   @observable String url;
   @reflectable final imports = new ObservableList<Library>();
   @reflectable final scripts = new ObservableList<Script>();
-  @reflectable final classes = new ObservableList<ServiceMap>();
+  @reflectable final classes = new ObservableList<Class>();
   @reflectable final variables = new ObservableList<ServiceMap>();
   @reflectable final functions = new ObservableList<ServiceMap>();
 
@@ -945,15 +993,152 @@
   }
 }
 
-class ScriptLine {
-  @reflectable final int line;
-  @reflectable final String text;
+class AllocationCount extends Observable {
+  @observable int instances = 0;
+  @observable int bytes = 0;
+
+  void reset() {
+    instances = 0;
+    bytes = 0;
+  }
+
+  bool get empty => (instances == 0) && (bytes == 0);
+}
+
+class Allocations {
+  // Indexes into VM provided array. (see vm/class_table.h).
+  static const ALLOCATED_BEFORE_GC = 0;
+  static const ALLOCATED_BEFORE_GC_SIZE = 1;
+  static const LIVE_AFTER_GC = 2;
+  static const LIVE_AFTER_GC_SIZE = 3;
+  static const ALLOCATED_SINCE_GC = 4;
+  static const ALLOCATED_SINCE_GC_SIZE = 5;
+  static const ACCUMULATED = 6;
+  static const ACCUMULATED_SIZE = 7;
+
+  final AllocationCount accumulated = new AllocationCount();
+  final AllocationCount current = new AllocationCount();
+
+  void update(List stats) {
+    accumulated.instances = stats[ACCUMULATED];
+    accumulated.bytes = stats[ACCUMULATED_SIZE];
+    current.instances = stats[LIVE_AFTER_GC] + stats[ALLOCATED_SINCE_GC];
+    current.bytes = stats[LIVE_AFTER_GC_SIZE] + stats[ALLOCATED_SINCE_GC_SIZE];
+  }
+
+  bool get empty => accumulated.empty && current.empty;
+}
+
+class Class extends ServiceObject {
+  @observable Library library;
+  @observable Script script;
+  @observable Class superClass;
+
+  @observable bool isAbstract;
+  @observable bool isConst;
+  @observable bool isFinalized;
+  @observable bool isPatch;
+  @observable bool isImplemented;
+
+  @observable int tokenPos;
+
+  @observable ServiceMap error;
+
+  final Allocations newSpace = new Allocations();
+  final Allocations oldSpace = new Allocations();
+
+  bool get hasNoAllocations => newSpace.empty && oldSpace.empty;
+
+  @reflectable final children = new ObservableList<Class>();
+  @reflectable final subClasses = new ObservableList<Class>();
+  @reflectable final fields = new ObservableList<ServiceMap>();
+  @reflectable final functions = new ObservableList<ServiceMap>();
+  @reflectable final interfaces = new ObservableList<Class>();
+
+  bool get canCache => true;
+  bool get immutable => false;
+
+  Class._empty(ServiceObjectOwner owner) : super._empty(owner);
+
+  String toString() {
+    return 'Service Class: $vmName';
+  }
+
+  void _update(ObservableMap map, bool mapIsRef) {
+    name = map['user_name'];
+    vmName = map['name'];
+
+    if (mapIsRef) {
+      return;
+    }
+
+    // We are fully loaded.
+    _loaded = true;
+
+    // Extract full properties.
+    _upgradeCollection(map, isolate);
+
+    // Some builtin classes aren't associated with a library.
+    if (map['library'] is Library) {
+      library = map['library'];
+    } else {
+      library = null;
+    }
+
+    script = map['script'];
+
+    isAbstract = map['abstract'];
+    isConst = map['const'];
+    isFinalized = map['finalized'];
+    isPatch = map['patch'];
+    isImplemented = map['implemented'];
+
+    tokenPos = map['tokenPos'];
+
+    subClasses.clear();
+    subClasses.addAll(map['subclasses']);
+
+    fields.clear();
+    fields.addAll(map['fields']);
+
+    functions.clear();
+    functions.addAll(map['functions']);
+
+    superClass = map['super'];
+    if (superClass != null) {
+      superClass._addToChildren(this);
+    }
+    error = map['error'];
+
+    var allocationStats = map['allocationStats'];
+    if (allocationStats != null) {
+      newSpace.update(allocationStats['new']);
+      oldSpace.update(allocationStats['old']);
+    }
+  }
+
+  void _addToChildren(Class cls) {
+    if (children.contains(cls)) {
+      return;
+    }
+    children.add(cls);
+  }
+
+  Future<ServiceObject> get(String command) {
+    return isolate.get(id + "/$command");
+  }
+}
+
+class ScriptLine extends Observable {
+  final int line;
+  final String text;
+  @observable int hits;
   ScriptLine(this.line, this.text);
 }
 
 class Script extends ServiceObject {
-  @reflectable final lines = new ObservableList<ScriptLine>();
-  @reflectable final hits = new ObservableMap<int, int>();
+  final lines = new ObservableList<ScriptLine>();
+  final _hits = new Map<int, int>();
   @observable String kind;
   @observable int firstTokenPos;
   @observable int lastTokenPos;
@@ -1026,8 +1211,13 @@
       var line = scriptHits[i];
       var hit = scriptHits[i + 1]; // hit status.
       assert(line >= 1); // Lines start at 1.
-      hits[line] = hit;
+      var oldHits = _hits[line];
+      if (oldHits != null) {
+        hit += oldHits;
+      }
+      _hits[line] = hit;
     }
+    _applyHitsToLines();
   }
 
   void _processSource(String source) {
@@ -1047,6 +1237,17 @@
     for (var i = 0; i < sourceLines.length; i++) {
       lines.add(new ScriptLine(i + 1, sourceLines[i]));
     }
+    _applyHitsToLines();
+  }
+
+  void _applyHitsToLines() {
+    if (lines.length == 0) {
+      return;
+    }
+    for (var line in lines) {
+      var hits = _hits[line.line];
+      line.hits = hits;
+    }
   }
 }
 
diff --git a/runtime/bin/vmservice/client/pubspec.yaml b/runtime/bin/vmservice/client/pubspec.yaml
index e54d95c..752a205 100644
--- a/runtime/bin/vmservice/client/pubspec.yaml
+++ b/runtime/bin/vmservice/client/pubspec.yaml
@@ -1,7 +1,7 @@
 name: observatory
-version: 0.2.1
+version: 1.6.0-dev.1
 dependencies:
-  polymer: '>= 0.10.0-pre.13'
+  polymer: '>= 0.11.0-dev.6'
 transformers:
 - polymer:
     entry_points: 
diff --git a/runtime/bin/vmservice/client/web/index.html b/runtime/bin/vmservice/client/web/index.html
index de3474a..1d77822 100644
--- a/runtime/bin/vmservice/client/web/index.html
+++ b/runtime/bin/vmservice/client/web/index.html
@@ -2,9 +2,10 @@
 <head>
   <meta charset="utf-8">
   <title>Dart VM Observatory</title>
+  <script src="packages/web_components/platform.js"></script>
   <link rel="import" href="packages/polymer/polymer.html">
-  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
   <script src="packages/browser/dart.js"></script>
diff --git a/runtime/bin/vmservice/client/web/index_devtools.html b/runtime/bin/vmservice/client/web/index_devtools.html
index b8b66c7..28a9cd1 100644
--- a/runtime/bin/vmservice/client/web/index_devtools.html
+++ b/runtime/bin/vmservice/client/web/index_devtools.html
@@ -2,8 +2,9 @@
 <head>
   <title>Dart VM Observatory</title>
   <meta charset="utf-8">
-  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
+  <script src="packages/web_components/platform.js"></script>
   <link rel="import" href="packages/polymer/polymer.html">
+  <script type="text/javascript" src="https://www.google.com/jsapi"></script>
   <link rel="stylesheet" href="packages/observatory/src/elements/css/shared.css">
   <link rel="import" href="packages/observatory/elements.html">
   <script type="application/dart" src="main.dart"></script>
diff --git a/runtime/bin/vmservice/server.dart b/runtime/bin/vmservice/server.dart
index da4cb4d..d50727f 100644
--- a/runtime/bin/vmservice/server.dart
+++ b/runtime/bin/vmservice/server.dart
@@ -80,23 +80,62 @@
 
 class Server {
   static const WEBSOCKET_PATH = '/ws';
-  String defaultPath = '/index.html';
-  final String ip;
-  int port;
+  static const ROOT_REDIRECT_PATH = '/index.html';
 
-  final VMService service;
+  final VMService _service;
+  final String _ip;
+  final int _port;
+
   HttpServer _server;
+  bool get running => _server != null;
+  bool _displayMessages = false;
 
-  Server(this.service, this.ip, this.port);
+  Server(this._service, this._ip, this._port) {
+    _displayMessages = (_ip != '127.0.0.1' || _port != 8181);
+  }
+
+  bool _shouldServeObservatory(HttpRequest request) {
+    if (request.headers['Observatory-Version'] != null) {
+      // Request is already coming from Observatory.
+      return false;
+    }
+    // TODO(johnmccutchan): Test with obscure browsers.
+    if (request.headers.value(HttpHeaders.USER_AGENT).contains('Mozilla')) {
+      // Request is coming from a browser but not Observatory application.
+      // Serve Observatory and let the Observatory make the real request.
+      return true;
+    }
+    // All other user agents are assumed to be textual.
+    return false;
+  }
 
   void _requestHandler(HttpRequest request) {
-    // Allow cross origin requests.
+    // Allow cross origin requests with 'observatory' header.
     request.response.headers.add('Access-Control-Allow-Origin', '*');
+    request.response.headers.add('Access-Control-Allow-Headers',
+                                 'Observatory-Version');
+
+    if (request.method != 'GET') {
+      // Not a GET request. Do nothing.
+      request.response.close();
+      return;
+    }
 
     final String path =
-          request.uri.path == '/' ? defaultPath : request.uri.path;
+          request.uri.path == '/' ? ROOT_REDIRECT_PATH : request.uri.path;
+
+    if (path == WEBSOCKET_PATH) {
+      WebSocketTransformer.upgrade(request).then((WebSocket webSocket) {
+        new WebSocketClient(webSocket, _service);
+      });
+      return;
+    }
 
     var resource = Resource.resources[path];
+    if (resource == null && _shouldServeObservatory(request)) {
+      resource = Resource.resources[ROOT_REDIRECT_PATH];
+      assert(resource != null);
+    }
     if (resource != null) {
       // Serving up a static resource (e.g. .css, .html, .png).
       request.response.headers.contentType =
@@ -105,31 +144,57 @@
       request.response.close();
       return;
     }
-
-    if (path == WEBSOCKET_PATH) {
-      WebSocketTransformer.upgrade(request).then((WebSocket webSocket) {
-        new WebSocketClient(webSocket, service);
-      });
-      return;
-    }
-
     var message = new Message.fromUri(request.uri);
-    var client = new HttpRequestClient(request, service);
+    var client = new HttpRequestClient(request, _service);
     client.onMessage(null, message);
   }
 
-  Future startServer() {
-    return HttpServer.bind(ip, port).then((s) {
-      // Only display message when port is automatically selected.
-      var display_message = (ip != '127.0.0.1' || port != 8181);
-      // Retrieve port.
-      port = s.port;
+  Future startup() {
+    if (_server != null) {
+      // Already running.
+      return new Future.value(this);
+    }
+
+    // Startup HTTP server.
+    return HttpServer.bind(_ip, _port).then((s) {
       _server = s;
       _server.listen(_requestHandler);
-      if (display_message) {
+      if (_displayMessages) {
+        var ip = _server.address.address.toString();
+        var port = _server.port.toString();
         print('Observatory listening on http://$ip:$port');
       }
-      return s;
+      // Server is up and running.
+      return this;
+    }).catchError((e, st) {
+      print('Could not start Observatory HTTP server:\n$e\n$st\n');
+      return this;
     });
   }
+
+  Future shutdown(bool forced) {
+    if (_server == null) {
+      // Not started.
+      return new Future.value(this);
+    }
+
+    // Force displaying of status messages if we are forcibly shutdown.
+    _displayMessages = _displayMessages || forced;
+
+    // Shutdown HTTP server and subscription.
+    var ip = _server.address.address.toString();
+    var port = _server.port.toString();
+    return _server.close(force: forced).then((_) {
+      if (_displayMessages) {
+        print('Observatory no longer listening on http://$ip:$port');
+      }
+      _server = null;
+      return this;
+    }).catchError((e, st) {
+      _server = null;
+      print('Could not shutdown Observatory HTTP server:\n$e\n$st\n');
+      return this;
+    });
+  }
+
 }
diff --git a/runtime/bin/vmservice/vmservice_io.dart b/runtime/bin/vmservice/vmservice_io.dart
index d0bccea..399b941 100644
--- a/runtime/bin/vmservice/vmservice_io.dart
+++ b/runtime/bin/vmservice/vmservice_io.dart
@@ -8,6 +8,7 @@
 import 'dart:convert';
 import 'dart:io';
 import 'dart:isolate';
+import 'dart:mirrors';
 import 'dart:vmservice';
 
 part 'resources.dart';
@@ -16,14 +17,62 @@
 // The TCP ip/port that the HTTP server listens on.
 int _port;
 String _ip;
+// Should the HTTP server auto start?
+bool _autoStart;
+
+bool _isWindows = false;
+
+// HTTP servr.
+Server server;
+Future<Server> serverFuture;
 
 // The VM service instance.
 VMService service;
 
+void _onSignal(ProcessSignal signal) {
+  if (serverFuture != null) {
+    // Still waiting.
+    return;
+  }
+  // Toggle HTTP server.
+  if (server.running) {
+    serverFuture = server.shutdown(true).then((_) {
+      serverFuture = null;
+    });
+  } else {
+    serverFuture = server.startup().then((_) {
+      serverFuture = null;
+    });
+  }
+}
+
+void registerSignalHandler() {
+  if (_isWindows) {
+    // Cannot register for signals on Windows.
+    return;
+  }
+  bool useSIGQUIT = true;
+  // Listen for SIGQUIT.
+  if (useSIGQUIT) {
+    var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+    var c = MirrorSystem.getSymbol('_ProcessUtils', io);
+    var m = MirrorSystem.getSymbol('_watchSignalInternal', io);
+    var processUtils = io.declarations[c];
+    processUtils.invoke(m, [ProcessSignal.SIGQUIT]).reflectee.listen(_onSignal);
+  } else {
+    ProcessSignal.SIGUSR1.watch().listen(_onSignal);
+  }
+}
+
+
 main() {
   // Get VMService.
   service = new VMService();
   // Start HTTP server.
-  var server = new Server(service, _ip, _port);
-  server.startServer();
+  server = new Server(service, _ip, _port);
+  if (_autoStart) {
+    server.startup();
+  }
+
+  registerSignalHandler();
 }
diff --git a/runtime/bin/vmservice_impl.cc b/runtime/bin/vmservice_impl.cc
index 5268a89..32edb0c 100644
--- a/runtime/bin/vmservice_impl.cc
+++ b/runtime/bin/vmservice_impl.cc
@@ -130,7 +130,29 @@
   library = Dart_RootLibrary();
   // Set requested TCP port.
   DartUtils::SetStringField(library, "_ip", server_ip);
+  // If we have a port specified, start the server immediately.
+  bool auto_start = server_port >= 0;
+  if (server_port < 0) {
+    // Adjust server_port to port 0 which will result in the first available
+    // port when the HTTP server is started.
+    server_port = 0;
+  }
+  // Set initial state.
   DartUtils::SetIntegerField(library, "_port", server_port);
+  Dart_SetField(library,
+                DartUtils::NewString("_autoStart"),
+                Dart_NewBoolean(auto_start));
+  // We cannot register for signals on windows.
+#if defined(TARGET_OS_WINDOWS)
+  const bool is_windows = true;
+#else
+  const bool is_windows = false;
+#endif
+  Dart_SetField(library,
+                DartUtils::NewString("_isWindows"),
+                Dart_NewBoolean(is_windows));
+
+  // Invoke main.
   result = Dart_Invoke(library, DartUtils::NewString("main"), 0, NULL);
   SHUTDOWN_ON_ERROR(result);
   // Load resources.
diff --git a/runtime/include/dart_api.h b/runtime/include/dart_api.h
index c7fd018..3ad647a 100755
--- a/runtime/include/dart_api.h
+++ b/runtime/include/dart_api.h
@@ -2006,6 +2006,22 @@
 DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type);
 
 /**
+ * Allocate a new object without invoking a constructor, and sets specified
+ *  native fields.
+ *
+ * \param type The type of an object to be allocated.
+ * \param num_native_fields The number of native fields to set.
+ * \param native_fields An array containing the value of native fields.
+ *
+ * \return The new object. If an error occurs during execution, then an
+ *   error handle is returned.
+ */
+DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
+    Dart_Handle type,
+    intptr_t num_native_fields,
+    const intptr_t* native_fields);
+
+/**
  * Invokes a method or function.
  *
  * The 'target' parameter may be an object, type, or library.  If
@@ -2049,7 +2065,7 @@
 
 /**
  * Invokes a Generative Constructor on an object that was previously
- * allocated using Dart_Allocate.
+ * allocated using Dart_Allocate/Dart_AllocateWithNativeFields.
  *
  * The 'target' parameter must be an object.
  *
@@ -2645,6 +2661,18 @@
                                               Dart_Handle patch_source);
 
 
+/**
+ * Indicates that all outstanding load requests have been satisfied,
+ * finalizing classes and completing deferred library futures.
+ *
+ * Requires there to be a current isolate.
+ *
+ * \return Success if all deferred library futures are completed.
+ *   Otherwise, returns an error.
+ */
+DART_EXPORT Dart_Handle Dart_FinalizeLoading();
+
+
 /*
  * =====
  * Peers
diff --git a/runtime/lib/array.dart b/runtime/lib/array.dart
index dd3e03f..60c2b6a 100644
--- a/runtime/lib/array.dart
+++ b/runtime/lib/array.dart
@@ -5,7 +5,6 @@
 
 // TODO(srdjan): Use shared array implementation.
 class _List<E> implements List<E> {
-  static final int _classId = (new _List(0))._cid;
 
   factory _List(length) native "List_allocate";
 
@@ -68,7 +67,7 @@
     int length = end - start;
     if (length == 0) return;
 
-    if (iterable is _List) {
+    if (ClassID.getID(iterable) == ClassID.cidOneByteString) {
       _copyFromObjectArray(iterable, skipCount, start, length);
     } else {
       if (iterable is List) {
@@ -271,7 +270,6 @@
 // implementation (checks when modifying). We should keep watching
 // the inline cache misses.
 class _ImmutableList<E> implements List<E> {
-  static final int _classId = (const [])._cid;
 
   factory _ImmutableList._uninstantiable() {
     throw new UnsupportedError(
diff --git a/runtime/lib/class_id.cc b/runtime/lib/class_id.cc
new file mode 100644
index 0000000..2f99138
--- /dev/null
+++ b/runtime/lib/class_id.cc
@@ -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.
+
+#include "platform/assert.h"
+#include "vm/bootstrap_natives.h"
+
+namespace dart {
+
+DEFINE_NATIVE_ENTRY(ClassID_getID, 1) {
+  const Instance& instance =
+      Instance::CheckedHandle(isolate, arguments->NativeArgAt(0));
+  return Smi::New(instance.GetClassId());
+}
+
+}  // namespace dart
diff --git a/runtime/lib/class_id.dart b/runtime/lib/class_id.dart
new file mode 100644
index 0000000..7ae813d
--- /dev/null
+++ b/runtime/lib/class_id.dart
@@ -0,0 +1,7 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 ClassID {
+  static int getID(Object value) native "ClassID_getID";
+}
\ No newline at end of file
diff --git a/runtime/lib/collection_patch.dart b/runtime/lib/collection_patch.dart
index e0fd182..e0bde4a 100644
--- a/runtime/lib/collection_patch.dart
+++ b/runtime/lib/collection_patch.dart
@@ -776,8 +776,8 @@
   final _HashSet _set;
   final int _modificationCount;
   int _index = 0;
-  _HashSetEntry _next = null;
-  E _current = null;
+  _HashSetEntry _next;
+  E _current;
 
   _HashSetIterator(_HashSet hashSet)
       : _set = hashSet, _modificationCount = hashSet._modificationCount;
@@ -851,7 +851,6 @@
   int _modificationCount;
   _LinkedHashMapIterator(LinkedHashMap map)
       : _map = map,
-        _current = null,
         _next = map._nextEntry,
         _modificationCount = map._modificationCount;
 
diff --git a/runtime/lib/double_patch.dart b/runtime/lib/double_patch.dart
index 9e2abeb..d036725 100644
--- a/runtime/lib/double_patch.dart
+++ b/runtime/lib/double_patch.dart
@@ -14,11 +14,12 @@
 
     if (str.length == 0) return null;
 
-    final ccid = str._cid;
+    final ccid = ClassID.getID(str);
     _OneByteString oneByteString;
-    // TODO(floitsch): Allow _ExternalOneByteStrings. As of May 2013 they don't
-    // have any _classId.
-    if (ccid != _OneByteString._classId) {
+    // TODO(Srdjan): Allow _ExternalOneByteStrings.
+    if (ccid == ClassID.cidOneByteString) {
+      oneByteString = str;
+    } else {
       int length = str.length;
       var s = _OneByteString._allocate(length);
       for (int i = 0; i < length; i++) {
@@ -31,8 +32,6 @@
         }
       }
       oneByteString = s;
-    } else {
-      oneByteString = str;
     }
 
     return _native_parse(oneByteString);
diff --git a/runtime/lib/errors_patch.dart b/runtime/lib/errors_patch.dart
index 520c9a9..3dc0e54 100644
--- a/runtime/lib/errors_patch.dart
+++ b/runtime/lib/errors_patch.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:mirrors' show MirrorSystem;
+
 patch class Error {
   /* patch */ static String _objectToString(Object object) {
     return Object._toString(object);
@@ -216,7 +218,7 @@
     var args_message = args_mismatch ? " with matching arguments" : "";
     var msg;
     var memberName =
-        (_memberName == null) ? "" : internal.Symbol.getName(_memberName);
+        (_memberName == null) ? "" : MirrorSystem.getName(_memberName);
 
     if (type == _InvocationMirror._LOCAL_VAR) {
       return "cannot assign to final variable '$memberName'.\n\n";
@@ -280,7 +282,7 @@
         if (i > 0) {
           actual_buf.write(", ");
         }
-        actual_buf.write(internal.Symbol.getName(key));
+        actual_buf.write(MirrorSystem.getName(key));
         actual_buf.write(": ");
         actual_buf.write(Error.safeToString(value));
         i++;
@@ -297,7 +299,7 @@
       receiver_str = Error.safeToString(_receiver);
     }
     var memberName =
-        (_memberName == null) ? "" : internal.Symbol.getName(_memberName);
+        (_memberName == null) ? "" : MirrorSystem.getName(_memberName);
     var type = _invocation_type & _InvocationMirror._TYPE_MASK;
     if (type == _InvocationMirror._LOCAL_VAR) {
       msg_buf.write(
diff --git a/runtime/lib/growable_array.dart b/runtime/lib/growable_array.dart
index 86791ef..aae3197 100644
--- a/runtime/lib/growable_array.dart
+++ b/runtime/lib/growable_array.dart
@@ -3,10 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 class _GrowableList<T> implements List<T> {
-  static final int _classId = (new _GrowableList(0))._cid;
 
   void insert(int index, T element) {
-    if (index < 0 || index > length) {
+    if ((index < 0) || (index > length)) {
       throw new RangeError.range(index, 0, length);
     }
     if (index == this.length) {
@@ -110,8 +109,10 @@
     return list;
   }
 
+  static const int _kDefaultCapacity = 2;
+
   factory _GrowableList(int length) {
-    var data = new _List((length == 0) ? 4 : length);
+    var data = new _List((length == 0) ? _kDefaultCapacity : length);
     var result = new _GrowableList<T>.withData(data);
     if (length > 0) {
       result._setLength(length);
@@ -120,7 +121,7 @@
   }
 
   factory _GrowableList.withCapacity(int capacity) {
-    var data = new _List((capacity == 0)? 4 : capacity);
+    var data = new _List((capacity == 0)? _kDefaultCapacity : capacity);
     return new _GrowableList<T>.withData(data);
   }
 
diff --git a/runtime/lib/identical.cc b/runtime/lib/identical.cc
index dac63b5..6440726 100644
--- a/runtime/lib/identical.cc
+++ b/runtime/lib/identical.cc
@@ -5,13 +5,50 @@
 #include "vm/bootstrap_natives.h"
 
 #include "vm/object.h"
+#include "vm/report.h"
 
 namespace dart {
 
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
+
 DEFINE_NATIVE_ENTRY(Identical_comparison, 2) {
   GET_NATIVE_ARGUMENT(Instance, a, arguments->NativeArgAt(0));
   GET_NATIVE_ARGUMENT(Instance, b, arguments->NativeArgAt(1));
-  return Bool::Get(a.IsIdenticalTo(b)).raw();
+  const bool is_identical = a.IsIdenticalTo(b);
+  if (FLAG_warn_on_javascript_compatibility) {
+    if (!is_identical) {
+      if (a.IsString()) {
+        if (String::Cast(a).Equals(b)) {
+          Report::JSWarningFromNative(
+              true,  // Identical_comparison is static.
+              "strings that are equal are also identical");
+        }
+      } else if (a.IsInteger()) {
+        if (b.IsDouble()) {
+          const int64_t a_value = Integer::Cast(a).AsInt64Value();
+          const double b_value = Double::Cast(b).value();
+          if (a_value == floor(b_value)) {
+            Report::JSWarningFromNative(
+                true,  // Identical_comparison is static.
+                "integer value and integral double value that are equal "
+                "are also identical");
+          }
+        }
+      } else if (a.IsDouble()) {
+        if (b.IsInteger()) {
+          const double a_value = Double::Cast(a).value();
+          const int64_t b_value = Integer::Cast(b).AsInt64Value();
+          if (floor(a_value) == b_value) {
+            Report::JSWarningFromNative(
+                true,  // Identical_comparison is static.
+                "integral double value and integer value that are equal "
+                "are also identical");
+          }
+        }
+      }
+    }
+  }
+  return Bool::Get(is_identical).raw();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/integers.cc b/runtime/lib/integers.cc
index a0397d5..c1893d2 100644
--- a/runtime/lib/integers.cc
+++ b/runtime/lib/integers.cc
@@ -32,7 +32,7 @@
   }
   if (i.IsMint()) {
     const Mint& mint = Mint::Cast(i);
-    return !Smi::IsValid64(mint.value());
+    return !Smi::IsValid(mint.value());
   }
   return true;
 }
@@ -322,7 +322,7 @@
     // Shift count is too large..
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
   }
   const Smi& smi_shift_count = Smi::Cast(shift_count);
   const Integer& shift_result = Integer::Handle(
@@ -414,7 +414,7 @@
   // into dart code or allocating any code.
   const Instance& exception =
       Instance::Handle(isolate->object_store()->out_of_memory());
-  Exceptions::Throw(exception);
+  Exceptions::Throw(isolate, exception);
   UNREACHABLE();
   return 0;
 }
@@ -442,7 +442,7 @@
   // into dart code or allocating any code.
   const Instance& exception =
       Instance::Handle(isolate->object_store()->out_of_memory());
-  Exceptions::Throw(exception);
+  Exceptions::Throw(isolate, exception);
   UNREACHABLE();
   return 0;
 }
diff --git a/runtime/lib/internal_sources.gypi b/runtime/lib/internal_sources.gypi
index 66fdf9d..08d9bb7 100644
--- a/runtime/lib/internal_sources.gypi
+++ b/runtime/lib/internal_sources.gypi
@@ -8,6 +8,8 @@
   'sources': [
     'internal_patch.dart',
     # The above file needs to be first as it imports required libraries.
+    'class_id.dart',
+    'class_id.cc',
     'print_patch.dart',
     'symbol_patch.dart',
   ],
diff --git a/runtime/lib/lib_prefix.dart b/runtime/lib/lib_prefix.dart
index b1cac38..536cc5c 100644
--- a/runtime/lib/lib_prefix.dart
+++ b/runtime/lib/lib_prefix.dart
@@ -6,19 +6,47 @@
 import "dart:isolate";
 
 // This type corresponds to the VM-internal class LibraryPrefix.
-
 class _LibraryPrefix {
-  _load() native "LibraryPrefix_load";
+
+  bool _load() native "LibraryPrefix_load";
+
+  bool _invalidateDependentCode()
+      native "LibraryPrefix_invalidateDependentCode";
 
   loadLibrary() {
-    var completer = new Completer<bool>();
-    var port = new RawReceivePort();
-    port.handler = (_) {
-      this._load();
-      completer.complete(true);
-      port.close();
-    };
-    port.sendPort.send(1);
+    var completer = _outstandingLoadRequests[this];
+    if (completer != null) {
+      return completer.future;
+    }
+    completer = new Completer<bool>();
+    _outstandingLoadRequests[this] = completer;
+    Timer.run(() {
+      var hasCompleted = this._load();
+      // Loading can complete immediately, for example when the same
+      // library has been loaded eagerly or through another deferred
+      // prefix. If that is the case, we must invalidate the dependent
+      // code and complete the future now since there will be no callback
+      // from the VM.
+      if (hasCompleted) {
+        _invalidateDependentCode();
+        completer.complete(true);
+        _outstandingLoadRequests.remove(this);
+      }
+    });
     return completer.future;
   }
 }
+
+var _outstandingLoadRequests = new Map<_LibraryPrefix, Completer>();
+
+
+// Called from the VM when all outstanding load requests have
+// finished.
+_completeDeferredLoads() {
+  var lenghth = _outstandingLoadRequests;
+  _outstandingLoadRequests.forEach((prefix, completer) {
+    prefix._invalidateDependentCode();
+    completer.complete(true);
+  });
+  _outstandingLoadRequests.clear();
+}
diff --git a/runtime/lib/mirrors.cc b/runtime/lib/mirrors.cc
index 1e66b82..f39effa 100644
--- a/runtime/lib/mirrors.cc
+++ b/runtime/lib/mirrors.cc
@@ -65,6 +65,7 @@
 static void ThrowNoSuchMethod(const Instance& receiver,
                               const String& function_name,
                               const Function& function,
+                              const Array& arguments,
                               const InvocationMirror::Call call,
                               const InvocationMirror::Type type) {
   const Smi& invocation_type = Smi::Handle(Smi::New(
@@ -74,10 +75,8 @@
   args.SetAt(0, receiver);
   args.SetAt(1, function_name);
   args.SetAt(2, invocation_type);
-  // Parameter 3 (actual arguments): We omit this parameter to get the same
-  // error message as one would get by invoking the function non-reflectively.
-  // Parameter 4 (named arguments): We omit this parameters since we cannot
-  // invoke functions with named parameters reflectively (using mirrors).
+  args.SetAt(3, arguments);
+  // TODO(rmacnak): Argument 4 (attempted argument names).
   if (!function.IsNull()) {
     const intptr_t total_num_parameters = function.NumParameters();
     const Array& array = Array::Handle(Array::New(total_num_parameters));
@@ -385,7 +384,7 @@
   str = lib.name();
   args.SetAt(1, str);
   str = lib.url();
-  if (str.Equals("dart:builtin") || str.Equals("dart:_blink")) {
+  if (str.Equals("dart:_builtin") || str.Equals("dart:_blink")) {
     // Censored library (grumble).
     return Instance::null();
   }
@@ -677,6 +676,7 @@
     ThrowNoSuchMethod(Instance::null_instance(),
                       getter_name,
                       getter,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kGetter);
     UNREACHABLE();
@@ -714,6 +714,7 @@
         ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                           getter_name,
                           getter,
+                          Object::null_array(),
                           InvocationMirror::kStatic,
                           InvocationMirror::kGetter);
         UNREACHABLE();
@@ -1443,6 +1444,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       function_name,
                       function,
+                      Object::null_array(),
                       InvocationMirror::kStatic,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1481,26 +1483,27 @@
   // Check for real fields and user-defined setters.
   const Field& field = Field::Handle(klass.LookupStaticField(setter_name));
   Function& setter = Function::Handle();
-  if (field.IsNull()) {
-    const String& internal_setter_name = String::Handle(
+  const String& internal_setter_name = String::Handle(
       Field::SetterName(setter_name));
 
+  if (field.IsNull()) {
     setter = klass.LookupStaticFunction(internal_setter_name);
 
+    const int kNumArgs = 1;
+    const Array& args = Array::Handle(Array::New(kNumArgs));
+    args.SetAt(0, value);
+
     if (setter.IsNull() || !setter.is_visible()) {
       ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
-                        setter_name,
+                        internal_setter_name,
                         setter,
+                        args,
                         InvocationMirror::kStatic,
                         InvocationMirror::kSetter);
       UNREACHABLE();
     }
 
     // Invoke the setter and return the result.
-    const int kNumArgs = 1;
-    const Array& args = Array::Handle(Array::New(kNumArgs));
-    args.SetAt(0, value);
-
     Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
@@ -1512,8 +1515,9 @@
 
   if (field.is_final()) {
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
-                      setter_name,
+                      internal_setter_name,
                       setter,
+                      Object::null_array(),
                       InvocationMirror::kStatic,
                       InvocationMirror::kSetter);
     UNREACHABLE();
@@ -1557,6 +1561,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       internal_constructor_name,
                       lookup_constructor,
+                      Object::null_array(),
                       InvocationMirror::kConstructor,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1634,6 +1639,7 @@
     ThrowNoSuchMethod(AbstractType::Handle(klass.RareType()),
                       internal_constructor_name,
                       redirected_constructor,
+                      Object::null_array(),
                       InvocationMirror::kConstructor,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1696,26 +1702,28 @@
   if (function.IsNull()) {
     // Didn't find a method: try to find a getter and invoke call on its result.
     const Instance& getter_result =
-        Instance::Handle(InvokeLibraryGetter(library, function_name, true));
-    // Make room for the closure (receiver) in arguments.
-    intptr_t numArgs = args.Length();
-    const Array& call_args = Array::Handle(Array::New(numArgs + 1));
-    Object& temp = Object::Handle();
-    for (int i = 0; i < numArgs; i++) {
-      temp = args.At(i);
-      call_args.SetAt(i + 1, temp);
+        Instance::Handle(InvokeLibraryGetter(library, function_name, false));
+    if (getter_result.raw() != Object::sentinel().raw()) {
+      // Make room for the closure (receiver) in arguments.
+      intptr_t numArgs = args.Length();
+      const Array& call_args = Array::Handle(Array::New(numArgs + 1));
+      Object& temp = Object::Handle();
+      for (int i = 0; i < numArgs; i++) {
+        temp = args.At(i);
+        call_args.SetAt(i + 1, temp);
+      }
+      call_args.SetAt(0, getter_result);
+      const Array& call_args_descriptor_array = Array::Handle(
+          ArgumentsDescriptor::New(call_args.Length(), arg_names));
+      // Call closure.
+      const Object& call_result = Object::Handle(
+          DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
+      if (call_result.IsError()) {
+        ThrowInvokeError(Error::Cast(call_result));
+        UNREACHABLE();
+      }
+      return call_result.raw();
     }
-    call_args.SetAt(0, getter_result);
-    const Array& call_args_descriptor_array =
-      Array::Handle(ArgumentsDescriptor::New(call_args.Length(), arg_names));
-    // Call closure.
-    const Object& call_result = Object::Handle(
-        DartEntry::InvokeClosure(call_args, call_args_descriptor_array));
-    if (call_result.IsError()) {
-      ThrowInvokeError(Error::Cast(call_result));
-      UNREACHABLE();
-    }
-    return call_result.raw();
   }
 
   const Array& args_descriptor_array =
@@ -1728,6 +1736,7 @@
     ThrowNoSuchMethod(Instance::null_instance(),
                       function_name,
                       function,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kMethod);
     UNREACHABLE();
@@ -1769,25 +1778,27 @@
   const Field& field = Field::Handle(
       library.LookupLocalField(setter_name));
   Function& setter = Function::Handle();
+  const String& internal_setter_name =
+      String::Handle(Field::SetterName(setter_name));
 
   if (field.IsNull()) {
-    const String& internal_setter_name =
-        String::Handle(Field::SetterName(setter_name));
-
     setter = library.LookupLocalFunction(internal_setter_name);
+
+    const int kNumArgs = 1;
+    const Array& args = Array::Handle(Array::New(kNumArgs));
+    args.SetAt(0, value);
+
     if (setter.IsNull() || !setter.is_visible()) {
       ThrowNoSuchMethod(Instance::null_instance(),
-                        setter_name,
+                        internal_setter_name,
                         setter,
+                        args,
                         InvocationMirror::kTopLevel,
                         InvocationMirror::kSetter);
       UNREACHABLE();
     }
 
     // Invoke the setter and return the result.
-    const int kNumArgs = 1;
-    const Array& args = Array::Handle(Array::New(kNumArgs));
-    args.SetAt(0, value);
     const Object& result = Object::Handle(
         DartEntry::InvokeFunction(setter, args));
     if (result.IsError()) {
@@ -1799,8 +1810,9 @@
 
   if (field.is_final()) {
     ThrowNoSuchMethod(Instance::null_instance(),
-                      setter_name,
+                      internal_setter_name,
                       setter,
+                      Object::null_array(),
                       InvocationMirror::kTopLevel,
                       InvocationMirror::kSetter);
     UNREACHABLE();
diff --git a/runtime/lib/mirrors_impl.dart b/runtime/lib/mirrors_impl.dart
index b1206cd..13bb7a9 100644
--- a/runtime/lib/mirrors_impl.dart
+++ b/runtime/lib/mirrors_impl.dart
@@ -4,7 +4,8 @@
 
 // VM-specific implementation of the dart:mirrors library.
 
-import "dart:collection";
+import "dart:collection" show UnmodifiableListView, UnmodifiableMapView;
+import "dart:_internal" show LRUMap;
 
 final emptyList = new UnmodifiableListView([]);
 final emptyMap = new UnmodifiableMapView({});
@@ -298,21 +299,15 @@
     return identityHashCode(_reflectee) ^ 0x36363636;
   }
 
-  // TODO(18445): Use an LRU cache.
-  static var _getFieldClosures = new HashMap();
-  static var _setFieldClosures = new HashMap();
-  static var _getFieldCallCounts = new HashMap();
-  static var _setFieldCallCounts = new HashMap();
+  static var _getFieldClosures = new LRUMap.withShift(7);
+  static var _setFieldClosures = new LRUMap.withShift(7);
+  static var _getFieldCallCounts = new LRUMap.withShift(8);
+  static var _setFieldCallCounts = new LRUMap.withShift(8);
   static const _closureThreshold = 20;
-  static const _cacheSizeLimit = 255;
 
   _getFieldSlow(unwrapped) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_getFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      // Prevent unbounded cache growth.
-      _getFieldCallCounts = new HashMap();
-    }
     var callCount = _getFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -331,12 +326,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x) => x.$withoutKey', privateKey);
       }
-      if (_getFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _getFieldClosures = new HashMap();
-      }
       _getFieldClosures[unwrapped] = f;
-      _getFieldCallCounts.remove(unwrapped);  // We won't look for this again.
       return reflect(f(_reflectee));
     }
     var result = reflect(_invokeGetter(_reflectee, unwrapped));
@@ -355,9 +345,6 @@
   _setFieldSlow(unwrapped, arg) {
     // Slow path factored out to give the fast path a better chance at being
     // inlined.
-    if (_setFieldCallCounts.length == 2 * _cacheSizeLimit) {
-      _setFieldCallCounts = new HashMap();
-    }
     var callCount = _setFieldCallCounts[unwrapped];
     if (callCount == null) {
       callCount = 0;
@@ -376,12 +363,7 @@
         var privateKey = unwrapped.substring(atPosition);
         f = _eval('(x, v) => x.$withoutKey = v', privateKey);
       }
-      if (_setFieldClosures.length == _cacheSizeLimit) {
-        // Prevent unbounded cache growth.
-        _setFieldClosures = new HashMap();
-      }
       _setFieldClosures[unwrapped] = f;
-      _setFieldCallCounts.remove(unwrapped);
       return reflect(f(_reflectee, arg));
     }
     _invokeSetter(_reflectee, unwrapped, arg);
diff --git a/runtime/lib/mirrors_patch.dart b/runtime/lib/mirrors_patch.dart
index 1534e79..b3eaf9a 100644
--- a/runtime/lib/mirrors_patch.dart
+++ b/runtime/lib/mirrors_patch.dart
@@ -67,7 +67,7 @@
       // Drop 'get:' or 'set:' prefix.
       pos = 4;
       if (string[0] == 's') {
-        add_setter_suffix;
+        add_setter_suffix = true;
       }
     }
     // Skip everything between AT and PERIOD, SPACE, COMMA or END
diff --git a/runtime/lib/object.cc b/runtime/lib/object.cc
index c84c972..c58c394 100644
--- a/runtime/lib/object.cc
+++ b/runtime/lib/object.cc
@@ -10,6 +10,7 @@
 #include "vm/heap.h"
 #include "vm/native_entry.h"
 #include "vm/object.h"
+#include "vm/report.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 
@@ -27,12 +28,6 @@
 }
 
 
-DEFINE_NATIVE_ENTRY(Object_cid, 1) {
-  const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
-  return Smi::New(instance.GetClassId());
-}
-
-
 DEFINE_NATIVE_ENTRY(Object_getHash, 1) {
   const Instance& instance = Instance::CheckedHandle(arguments->NativeArgAt(0));
   Heap* heap = isolate->heap();
@@ -111,26 +106,6 @@
 }
 
 
-static void JSWarning(const char* msg) {
-  DartFrameIterator iterator;
-  iterator.NextFrame();  // Skip native call.
-  StackFrame* caller_frame = iterator.NextFrame();
-  ASSERT(caller_frame != NULL);
-  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
-  ASSERT(!caller_code.IsNull());
-  const uword caller_pc = caller_frame->pc();
-  // Assume an instance call.
-  ICData& ic_data = ICData::Handle();
-  CodePatcher::GetInstanceCallAt(caller_pc, caller_code, &ic_data);
-  ASSERT(!ic_data.IsNull());
-  // Report warning only if not already reported at this location.
-  if (!ic_data.IssuedJSWarning()) {
-    ic_data.SetIssuedJSWarning();
-    Exceptions::JSWarning(caller_frame, "%s", msg);
-  }
-}
-
-
 static void WarnOnJSIntegralNumTypeTest(
     const Instance& instance,
     const TypeArguments& instantiator_type_arguments,
@@ -148,14 +123,18 @@
     if (instantiated_type.IsIntType()) {
       const double value = Double::Cast(instance).value();
       if (floor(value) == value) {
-        JSWarning("integral value of type 'double' is also considered to be "
-                  "of type 'int'");
+        Report::JSWarningFromNative(
+            false,  // Object_instanceOf and Object_as are not static calls.
+            "integral value of type 'double' is also considered to be "
+            "of type 'int'");
       }
     }
   } else {
     ASSERT(instance_is_int);
     if (instantiated_type.IsDoubleType()) {
-      JSWarning("integer value is also considered to be of type 'double'");
+      Report::JSWarningFromNative(
+          false,  // Object_instanceOf and Object_as are not static calls.
+          "integer value is also considered to be of type 'double'");
     }
   }
 }
@@ -296,11 +275,19 @@
 }
 
 
+DEFINE_NATIVE_ENTRY(LibraryPrefix_invalidateDependentCode, 1) {
+  const LibraryPrefix& prefix =
+      LibraryPrefix::CheckedHandle(arguments->NativeArgAt(0));
+  prefix.InvalidateDependentCode();
+  return Bool::Get(true).raw();
+}
+
+
 DEFINE_NATIVE_ENTRY(LibraryPrefix_load, 1) {
   const LibraryPrefix& prefix =
       LibraryPrefix::CheckedHandle(arguments->NativeArgAt(0));
-  prefix.LoadLibrary();
-  return Bool::Get(true).raw();
+  bool hasCompleted = prefix.LoadLibrary();
+  return Bool::Get(hasCompleted).raw();
 }
 
 }  // namespace dart
diff --git a/runtime/lib/object_patch.dart b/runtime/lib/object_patch.dart
index fa8e10e..52d7546 100644
--- a/runtime/lib/object_patch.dart
+++ b/runtime/lib/object_patch.dart
@@ -71,8 +71,6 @@
     return result;
   }
 
-  int get _cid native "Object_cid";
-
   _leftShiftWithMask32(count, mask)  {
     return (this << count) & mask;
   }
diff --git a/runtime/lib/stopwatch_patch.dart b/runtime/lib/stopwatch_patch.dart
index 2bdc2c5..e16005c 100644
--- a/runtime/lib/stopwatch_patch.dart
+++ b/runtime/lib/stopwatch_patch.dart
@@ -5,9 +5,15 @@
 // A VM patch of the stopwatch part of dart:core.
 
 patch class Stopwatch {
+  /* patch */ static void _initTicker() {
+    if (_frequency == null) {
+      _frequency = _computeFrequency();
+    }
+  }
+
   // Returns the current clock tick.
   /* patch */ static int _now() native "Stopwatch_now";
 
   // Returns the frequency of clock ticks in Hz.
-  /* patch */ static int _frequency() native "Stopwatch_frequency";
+  static int _computeFrequency() native "Stopwatch_frequency";
 }
diff --git a/runtime/lib/string_buffer_patch.dart b/runtime/lib/string_buffer_patch.dart
index 5d8b9b4..a952f8a 100644
--- a/runtime/lib/string_buffer_patch.dart
+++ b/runtime/lib/string_buffer_patch.dart
@@ -11,7 +11,7 @@
    * When strings are written to the string buffer, we add them to a
    * list of string parts.
    */
-  List<String> _parts = null;
+  List<String> _parts;
 
   /**
     * Total number of code units in the string parts. Does not include
@@ -34,7 +34,7 @@
    * used when writing short strings or individual char codes to the
    * buffer. The buffer is allocated on demand.
    */
-  Uint16List _buffer = null;
+  Uint16List _buffer;
   int _bufferPosition = 0;
 
   /**
diff --git a/runtime/lib/string_patch.dart b/runtime/lib/string_patch.dart
index a81767d..bc9b4d8 100644
--- a/runtime/lib/string_patch.dart
+++ b/runtime/lib/string_patch.dart
@@ -54,11 +54,11 @@
   static String createFromCharCodes(Iterable<int> charCodes) {
     if (charCodes != null) {
       // TODO(srdjan): Also skip copying of wide typed arrays.
-      final ccid = charCodes._cid;
+      final ccid = ClassID.getID(charCodes);
       bool isOneByteString = false;
-      if ((ccid != _List._classId) &&
-          (ccid != _GrowableList._classId) &&
-          (ccid != _ImmutableList._classId)) {
+      if ((ccid != ClassID.cidArray) &&
+          (ccid != ClassID.cidGrowableObjectArray) &&
+          (ccid != ClassID.cidImmutableArray)) {
         if ((charCodes is Uint8List) || (charCodes is Int8List)) {
           isOneByteString = true;
         } else {
@@ -510,7 +510,7 @@
     int totalLength = 0;
     for (int i = 0; i < numValues; i++) {
       var s = values[i].toString();
-      if (isOneByteString && (s._cid == _OneByteString._classId)) {
+      if (isOneByteString && (ClassID.getID(s) == ClassID.cidOneByteString)) {
         totalLength += s.length;
       } else {
         isOneByteString = false;
@@ -625,7 +625,6 @@
 
 
 class _OneByteString extends _StringBase implements String {
-  static final int _classId = "A"._cid;
 
   factory _OneByteString._uninstantiable() {
     throw new UnsupportedError(
@@ -649,7 +648,8 @@
       native "OneByteString_splitWithCharCode";
 
   List<String> split(Pattern pattern) {
-    if ((pattern._cid == _OneByteString._classId) && (pattern.length == 1)) {
+    if ((ClassID.getID(pattern) == ClassID.cidOneByteString) &&
+        (pattern.length == 1)) {
       return _splitWithCharCode(pattern.codeUnitAt(0));
     }
     return super.split(pattern);
@@ -677,10 +677,10 @@
 
   int indexOf(Pattern pattern, [int start = 0]) {
     // Specialize for single character pattern.
-    final pCid = pattern._cid;
-    if ((pCid == _OneByteString._classId) ||
-        (pCid == _TwoByteString._classId) ||
-        (pCid == _ExternalOneByteString._classId)) {
+    final pCid = ClassID.getID(pattern);
+    if ((pCid == ClassID.cidOneByteString) ||
+        (pCid == ClassID.cidTwoByteString) ||
+        (pCid == ClassID.cidExternalOneByteString)) {
       final len = this.length;
       if ((pattern.length == 1) && (start >= 0) && (start < len)) {
         final patternCu0 = pattern.codeUnitAt(0);
@@ -699,10 +699,10 @@
   }
 
   bool contains(Pattern pattern, [int start = 0]) {
-    final pCid = pattern._cid;
-    if ((pCid == _OneByteString._classId) ||
-        (pCid == _TwoByteString._classId) ||
-        (pCid == _ExternalOneByteString._classId)) {
+    final pCid = ClassID.getID(pattern);
+    if ((pCid == ClassID.cidOneByteString) ||
+        (pCid == ClassID.cidTwoByteString) ||
+        (pCid == ClassID.cidExternalOneByteString)) {
       final len = this.length;
       if ((pattern.length == 1) && (start >= 0) && (start < len)) {
         final patternCu0 = pattern.codeUnitAt(0);
@@ -736,9 +736,9 @@
   }
 
   String padLeft(int width, [String padding = ' ']) {
-    int padCid = padding._cid;
-    if (padCid != _OneByteString._classId &&
-        padCid != _ExternalOneByteString._classId) {
+    int padCid = ClassID.getID(padding);
+    if ((padCid != ClassID.cidOneByteString) &&
+        (padCid != ClassID.cidExternalOneByteString)) {
       return super.padLeft(width, padding);
     }
     int length = this.length;
@@ -767,9 +767,9 @@
   }
 
   String padRight(int width, [String padding = ' ']) {
-    int padCid = padding._cid;
-    if (padCid != _OneByteString._classId &&
-        padCid != _ExternalOneByteString._classId) {
+    int padCid = ClassID.getID(padding);
+    if ((padCid != ClassID.cidOneByteString) &&
+        (padCid != ClassID.cidExternalOneByteString)) {
       return super.padRight(width, padding);
     }
     int length = this.length;
@@ -906,8 +906,6 @@
 
 
 class _TwoByteString extends _StringBase implements String {
-  static final int _classId = "\u{FFFF}"._cid;
-
   factory _TwoByteString._uninstantiable() {
     throw new UnsupportedError(
         "_TwoByteString can only be allocated by the VM");
@@ -924,8 +922,6 @@
 
 
 class _ExternalOneByteString extends _StringBase implements String {
-  static final int _classId = _getCid();
-
   factory _ExternalOneByteString._uninstantiable() {
     throw new UnsupportedError(
         "_ExternalOneByteString can only be allocated by the VM");
diff --git a/runtime/lib/typed_data.dart b/runtime/lib/typed_data.dart
index b184573..1920a76 100644
--- a/runtime/lib/typed_data.dart
+++ b/runtime/lib/typed_data.dart
@@ -299,7 +299,7 @@
 patch class ByteData {
   /* patch */ factory ByteData(int length) {
     var list = new _Uint8Array(length);
-    return new _ByteDataView(list.buffer, 0, length);
+    return new _ByteDataView(list, 0, length);
   }
 
   /* patch */ factory ByteData.view(ByteBuffer buffer,
@@ -307,7 +307,12 @@
     if (length == null) {
       length = buffer.lengthInBytes - offsetInBytes;
     }
-    return new _ByteDataView(buffer, offsetInBytes, length);
+    return new _ByteDataView(buffer._data, offsetInBytes, length);
+  }
+
+  // Called directly from C code.
+  factory ByteData._view(TypedData typedData, int offsetInBytes, int length) {
+    return new _ByteDataView(typedData, offsetInBytes, length);
   }
 }
 
@@ -551,12 +556,12 @@
         if ((count < 10) && (from.buffer != this.buffer)) {
           Lists.copy(from, skipCount, this, start, count);
           return;
-        } else if (this.buffer._setRange(
+        } else if (this.buffer._data._setRange(
               start * elementSizeInBytes + this.offsetInBytes,
               count * elementSizeInBytes,
-              from.buffer,
+              from.buffer._data,
               skipCount * elementSizeInBytes + from.offsetInBytes,
-              this._cid, from._cid)) {
+              ClassID.getID(this), ClassID.getID(from))) {
           return;
         }
       } else if (from.buffer == this.buffer) {
@@ -603,12 +608,23 @@
                  _TypedListBase from, int startFromInBytes,
                  int toCid, int fromCid)
       native "TypedData_setRange";
-
-  int get _cid native "Object_cid";
 }
 
 
-abstract class _TypedList extends _TypedListBase implements ByteBuffer {
+class _ByteBuffer implements ByteBuffer {
+  final _TypedList _data;
+
+  _ByteBuffer(this._data);
+
+  // Forward calls to _data.
+  int get lengthInBytes => _data.lengthInBytes;
+  int get hashCode => _data.hashCode;
+  bool operator==(Object other) =>
+      (other is _ByteBuffer) && identical(_data, other._data);
+}
+
+
+abstract class _TypedList extends _TypedListBase {
   // Default method implementing parts of the TypedData interface.
   int get offsetInBytes {
     return 0;
@@ -618,9 +634,7 @@
     return length * elementSizeInBytes;
   }
 
-  ByteBuffer get buffer {
-    return this;
-  }
+  ByteBuffer get buffer => new _ByteBuffer(this);
 
   // Methods implementing the collection interface.
 
@@ -2514,8 +2528,8 @@
 
 
 class _TypedListView extends _TypedListBase implements TypedData {
-  _TypedListView(ByteBuffer _buffer, int _offset, int _length)
-    : _typedData = _buffer,  // This assignment is type safe.
+  _TypedListView(_ByteBuffer _buffer, int _offset, int _length)
+    : _typedData = _buffer._data,
       offsetInBytes = _offset,
       length = _length {
   }
@@ -3263,11 +3277,11 @@
 
 
 class _ByteDataView implements ByteData {
-  _ByteDataView(ByteBuffer _buffer, int _offsetInBytes, int _lengthInBytes)
-    : _typedData = _buffer,  // _buffer is guaranteed to be a TypedData here.
+  _ByteDataView(TypedData typedData, int _offsetInBytes, int _lengthInBytes)
+    : _typedData = typedData,
       _offset = _offsetInBytes,
       length = _lengthInBytes {
-    _rangeCheck(_buffer.lengthInBytes, _offset, length);
+    _rangeCheck(_typedData.lengthInBytes, _offset, length);
   }
 
 
diff --git a/runtime/platform/assert.cc b/runtime/platform/assert.cc
index cb7d21a..5410046 100644
--- a/runtime/platform/assert.cc
+++ b/runtime/platform/assert.cc
@@ -30,6 +30,7 @@
   // Get the message from the string stream and dump it on stderr.
   std::string message = stream.str();
   fprintf(stderr, "%s", message.c_str());
+  fflush(stderr);
 
   // In case of failed assertions, abort right away. Otherwise, wait
   // until the program is exiting before producing a non-zero exit
diff --git a/runtime/platform/utils.h b/runtime/platform/utils.h
index f202562..52e30aa 100644
--- a/runtime/platform/utils.h
+++ b/runtime/platform/utils.h
@@ -171,6 +171,17 @@
            count <= (length - offset);
   }
 
+  static inline bool WillAddOverflow(int64_t a, int64_t b) {
+    return ((b > 0) && (a > (kMaxInt64 - b))) ||
+           ((b < 0) && (a < (kMinInt64 - b)));
+  }
+
+  static inline bool WillSubOverflow(int64_t a, int64_t b) {
+    return ((b > 0) && (a < (kMinInt64 + b))) ||
+           ((b < 0) && (a > (kMaxInt64 + b)));
+  }
+
+
   // Utility functions for converting values from host endianess to
   // big or little endian values.
   static uint16_t HostToBigEndian16(uint16_t host_value);
diff --git a/runtime/tests/vm/vm.status b/runtime/tests/vm/vm.status
index b88bad2..451e4c0 100644
--- a/runtime/tests/vm/vm.status
+++ b/runtime/tests/vm/vm.status
@@ -19,6 +19,10 @@
 [ $arch == x64 ]
 cc/IsolateInterrupt: Skip
 
+[ $mode == debug ]
+# This is a benchmark that is not informative in debug mode.
+cc/CorelibIsolateStartup: Skip
+
 # The following section refers to the dart vm tests which live under
 # runtime/tests/vm/dart.
 [ $system == windows ]
@@ -45,8 +49,9 @@
 cc/ThreadInterrupterLow: Skip
 cc/Service_Profile: Skip
 
-[ $arch == simmips && $arch == mips ]
-cc/Service_Coverage: Skip # Dart bug 16250
+[ $arch == simmips || $arch == mips ]
+cc/Coverage_MainWithClass: Skip # Dart bug 16250
+cc/Service_ClassesCoverage: Skip # Dart bug 16250
 
 [ $compiler == dart2js ]
 dart/mirrored_compilation_error_test: Skip # VM-specific flag
@@ -73,6 +78,7 @@
 cc/StaticNonNullSumCallCodegen: Crash, Pass # dartbug.com/17440
 
 [ $arch == mips && $mode == debug ]
+cc/JSON_JSONStream_Options: Crash # Issue 19328
 cc/FindCodeObject: Skip # Takes more than 8 minutes. dartbug.com/17440.
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
diff --git a/runtime/vm/allocation.cc b/runtime/vm/allocation.cc
index 624ad43..bbff55e 100644
--- a/runtime/vm/allocation.cc
+++ b/runtime/vm/allocation.cc
@@ -10,11 +10,6 @@
 
 namespace dart {
 
-ZoneAllocated::~ZoneAllocated() {
-  UNREACHABLE();
-}
-
-
 static void* Allocate(uword size, BaseIsolate* isolate) {
   ASSERT(isolate != NULL);
   ASSERT(isolate->current_zone() != NULL);
diff --git a/runtime/vm/allocation.h b/runtime/vm/allocation.h
index d7b26d63..d26ac2b 100644
--- a/runtime/vm/allocation.h
+++ b/runtime/vm/allocation.h
@@ -89,9 +89,6 @@
 class ZoneAllocated {
  public:
   ZoneAllocated() { }
-  // It would be ideal if the destructor method could be made private,
-  // but the g++ compiler complains when this is subclassed.
-  virtual ~ZoneAllocated();
 
   // Implicitly allocate the object in the current zone.
   void* operator new(uword size);
diff --git a/runtime/vm/assembler_arm.cc b/runtime/vm/assembler_arm.cc
index d0338a4..c94b9f5 100644
--- a/runtime/vm/assembler_arm.cc
+++ b/runtime/vm/assembler_arm.cc
@@ -1621,6 +1621,21 @@
 }
 
 
+void Assembler::StoreIntoObjectOffset(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      bool can_value_be_smi) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObject(
+        object, FieldAddress(object, offset), value, can_value_be_smi);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObject(object, Address(IP), value, can_value_be_smi);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
@@ -1635,6 +1650,19 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               Register value) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(IP), value);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
@@ -1646,12 +1674,25 @@
 }
 
 
-void Assembler::LoadClassId(Register result, Register object) {
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               const Object& value) {
+  int32_t ignored = 0;
+  if (Address::CanHoldStoreOffset(kWord, offset - kHeapObjectTag, &ignored)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(IP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(IP), value);
+  }
+}
+
+
+void Assembler::LoadClassId(Register result, Register object, Condition cond) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
   const intptr_t class_id_offset = Object::tags_offset() +
       RawObject::kClassIdTagPos / kBitsPerByte;
-  ldrh(result, FieldAddress(object, class_id_offset));
+  ldrh(result, FieldAddress(object, class_id_offset), cond);
 }
 
 
@@ -1685,6 +1726,14 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  tst(object, Operand(kSmiTagMask));
+  LoadImmediate(result, Smi::RawValue(kSmiCid), EQ);
+  LoadClassId(result, object, NE);
+  SmiTag(result, NE);
+}
+
+
 static bool CanEncodeBranchOffset(int32_t offset) {
   ASSERT(Utils::IsAligned(offset, 4));
   return Utils::IsInt(Utils::CountOneBits(kBranchOffsetMask), offset);
diff --git a/runtime/vm/assembler_arm.h b/runtime/vm/assembler_arm.h
index 127b1f8..5af7c66 100644
--- a/runtime/vm/assembler_arm.h
+++ b/runtime/vm/assembler_arm.h
@@ -628,18 +628,29 @@
                        const Address& dest,  // Where we are storing into.
                        Register value,  // Value we are storing.
                        bool can_value_be_smi = true);
+  void StoreIntoObjectOffset(Register object,
+                             int32_t offset,
+                             Register value,
+                             bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      const Object& value);
 
-  void LoadClassId(Register result, Register object);
+  void LoadClassId(Register result, Register object, Condition cond = AL);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object, Register scratch);
   void CompareClassId(Register object, intptr_t class_id, Register scratch);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void LoadWordFromPoolOffset(Register rd, int32_t offset, Condition cond = AL);
   void LoadFromOffset(OperandSize type,
diff --git a/runtime/vm/assembler_arm64.cc b/runtime/vm/assembler_arm64.cc
index 0b3ddf1..c6d4457 100644
--- a/runtime/vm/assembler_arm64.cc
+++ b/runtime/vm/assembler_arm64.cc
@@ -1073,6 +1073,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  tsti(object, kSmiTagMask);
+  b(&load, NE);
+  LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
+  b(&done);
+  Bind(&load);
+  LoadClassId(result, object, PP);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 // Frame entry and exit.
 void Assembler::ReserveAlignedFrameSpace(intptr_t frame_space) {
   // Reserve space for arguments and align frame before entering
diff --git a/runtime/vm/assembler_arm64.h b/runtime/vm/assembler_arm64.h
index f6f01d0..9ef8746 100644
--- a/runtime/vm/assembler_arm64.h
+++ b/runtime/vm/assembler_arm64.h
@@ -22,8 +22,6 @@
 // Forward declarations.
 class RuntimeEntry;
 
-// TODO(zra): Label, Address, and FieldAddress are copied from ARM,
-// they must be adapted to ARM64.
 class Label : public ValueObject {
  public:
   Label() : position_(0) { }
@@ -245,8 +243,8 @@
 
 class FieldAddress : public Address {
  public:
-  FieldAddress(Register base, int32_t disp)
-      : Address(base, disp - kHeapObjectTag) { }
+  FieldAddress(Register base, int32_t disp, OperandSize sz = kDoubleWord)
+      : Address(base, disp - kHeapObjectTag, Offset, sz) { }
 
   FieldAddress(const FieldAddress& other) : Address(other) { }
 
@@ -684,6 +682,9 @@
   void hlt(uint16_t imm) {
     EmitExceptionGenOp(HLT, imm);
   }
+  void brk(uint16_t imm) {
+    EmitExceptionGenOp(BRK, imm);
+  }
 
   // Double floating point.
   bool fmovdi(VRegister vd, double immd) {
@@ -1068,9 +1069,9 @@
 
   void LoadFromOffset(Register dest, Register base, int32_t offset,
                       Register pp, OperandSize sz = kDoubleWord);
-  void LoadFieldFromOffset(
-      Register dest, Register base, int32_t offset, Register pp) {
-    LoadFromOffset(dest, base, offset - kHeapObjectTag, pp);
+  void LoadFieldFromOffset(Register dest, Register base, int32_t offset,
+                           Register pp, OperandSize sz = kDoubleWord) {
+    LoadFromOffset(dest, base, offset - kHeapObjectTag, pp, sz);
   }
   void LoadDFromOffset(
       VRegister dest, Register base, int32_t offset, Register pp);
@@ -1087,9 +1088,9 @@
 
   void StoreToOffset(Register src, Register base, int32_t offset,
                      Register pp, OperandSize sz = kDoubleWord);
-  void StoreFieldToOffset(
-      Register src, Register base, int32_t offset, Register pp) {
-    StoreToOffset(src, base, offset - kHeapObjectTag, pp);
+  void StoreFieldToOffset(Register src, Register base, int32_t offset,
+                          Register pp, OperandSize sz = kDoubleWord) {
+    StoreToOffset(src, base, offset - kHeapObjectTag, pp, sz);
   }
   void StoreDToOffset(
       VRegister src, Register base, int32_t offset, Register pp);
@@ -1170,6 +1171,7 @@
   void LoadClassById(Register result, Register class_id, Register pp);
   void LoadClass(Register result, Register object, Register pp);
   void CompareClassId(Register object, intptr_t class_id, Register pp);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void EnterFrame(intptr_t frame_size);
   void LeaveFrame();
diff --git a/runtime/vm/assembler_ia32.cc b/runtime/vm/assembler_ia32.cc
index f219e8e..6c36ecf 100644
--- a/runtime/vm/assembler_ia32.cc
+++ b/runtime/vm/assembler_ia32.cc
@@ -2656,6 +2656,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  testl(object, Immediate(kSmiTagMask));
+  Label not_smi, done;
+  j(NOT_ZERO, &not_smi, Assembler::kNearJump);
+  movl(result, Immediate(Smi::RawValue(kSmiCid)));
+  jmp(&done, Assembler::kNearJump);
+  Bind(&not_smi);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
   "eax", "ecx", "edx", "ebx", "esp", "ebp", "esi", "edi"
 };
diff --git a/runtime/vm/assembler_ia32.h b/runtime/vm/assembler_ia32.h
index f502bd5..6688eca 100644
--- a/runtime/vm/assembler_ia32.h
+++ b/runtime/vm/assembler_ia32.h
@@ -686,6 +686,8 @@
 
   void CompareClassId(Register object, intptr_t class_id, Register scratch);
 
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
+
   /*
    * Misc. functionality
    */
diff --git a/runtime/vm/assembler_mips.cc b/runtime/vm/assembler_mips.cc
index f4a4f6e..d3f92fb 100644
--- a/runtime/vm/assembler_mips.cc
+++ b/runtime/vm/assembler_mips.cc
@@ -588,6 +588,20 @@
 }
 
 
+void Assembler::StoreIntoObjectOffset(Register object,
+                                      int32_t offset,
+                                      Register value,
+                                      bool can_value_be_smi) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObject(
+        object, FieldAddress(object, offset), value, can_value_be_smi);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObject(object, Address(TMP), value, can_value_be_smi);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          Register value) {
@@ -603,6 +617,18 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               Register value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
 void Assembler::StoreIntoObjectNoBarrier(Register object,
                                          const Address& dest,
                                          const Object& value) {
@@ -615,6 +641,18 @@
 }
 
 
+void Assembler::StoreIntoObjectNoBarrierOffset(Register object,
+                                               int32_t offset,
+                                               const Object& value) {
+  if (Address::CanHoldOffset(offset - kHeapObjectTag)) {
+    StoreIntoObjectNoBarrier(object, FieldAddress(object, offset), value);
+  } else {
+    AddImmediate(TMP, object, offset - kHeapObjectTag);
+    StoreIntoObjectNoBarrier(object, Address(TMP), value);
+  }
+}
+
+
 void Assembler::LoadClassId(Register result, Register object) {
   ASSERT(RawObject::kClassIdTagPos == 16);
   ASSERT(RawObject::kClassIdTagSize == 16);
@@ -652,6 +690,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  andi(CMPRES1, object, Immediate(kSmiTagMask));
+  bne(CMPRES1, ZR, &load);
+  LoadImmediate(result, Smi::RawValue(kSmiCid));
+  b(&done);
+  Bind(&load);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 void Assembler::EnterFrame() {
   ASSERT(!in_delay_slot_);
   addiu(SP, SP, Immediate(-2 * kWordSize));
diff --git a/runtime/vm/assembler_mips.h b/runtime/vm/assembler_mips.h
index efbb467..1439455 100644
--- a/runtime/vm/assembler_mips.h
+++ b/runtime/vm/assembler_mips.h
@@ -1183,18 +1183,29 @@
   void LoadClassId(Register result, Register object);
   void LoadClassById(Register result, Register class_id);
   void LoadClass(Register result, Register object);
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
 
   void StoreIntoObject(Register object,  // Object we are storing into.
                        const Address& dest,  // Where we are storing into.
                        Register value,  // Value we are storing.
                        bool can_value_be_smi = true);
+  void StoreIntoObjectOffset(Register object,
+                             int32_t offset,
+                             Register value,
+                             bool can_value_be_smi = true);
 
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 Register value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      Register value);
   void StoreIntoObjectNoBarrier(Register object,
                                 const Address& dest,
                                 const Object& value);
+  void StoreIntoObjectNoBarrierOffset(Register object,
+                                      int32_t offset,
+                                      const Object& value);
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
diff --git a/runtime/vm/assembler_x64.cc b/runtime/vm/assembler_x64.cc
index c04809e..f15fab1 100644
--- a/runtime/vm/assembler_x64.cc
+++ b/runtime/vm/assembler_x64.cc
@@ -8,6 +8,7 @@
 #include "vm/assembler.h"
 #include "vm/cpu.h"
 #include "vm/heap.h"
+#include "vm/locations.h"
 #include "vm/memory_region.h"
 #include "vm/runtime_entry.h"
 #include "vm/stack_frame.h"
@@ -239,6 +240,12 @@
 }
 
 
+void Assembler::movl(const Address& dst, const Immediate& imm) {
+  movl(TMP, imm);
+  movl(dst, TMP);
+}
+
+
 void Assembler::movzxb(Register dst, Register src) {
   AssemblerBuffer::EnsureCapacity ensured(&buffer_);
   Operand operand(src);
@@ -2816,37 +2823,69 @@
 }
 
 
-// TODO(srdjan): Add XMM registers once they are used by the compiler.
-// Based on http://x86-64.org/documentation/abi.pdf Fig. 3.4
-static const intptr_t kNumberOfVolatileCpuRegisters = 9;
-static const Register volatile_cpu_registers[kNumberOfVolatileCpuRegisters] = {
-    RAX, RCX, RDX, RSI, RDI, R8, R9, R10, R11
-};
+void Assembler::PushRegisters(intptr_t cpu_register_set,
+                              intptr_t xmm_register_set) {
+  const intptr_t xmm_regs_count = RegisterSet::RegisterCount(xmm_register_set);
+  if (xmm_regs_count > 0) {
+    AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize), PP);
+    // Store XMM registers with the lowest register number at the lowest
+    // address.
+    intptr_t offset = 0;
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
+      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
+      if (RegisterSet::Contains(xmm_register_set, xmm_reg)) {
+        movups(Address(RSP, offset), xmm_reg);
+        offset += kFpuRegisterSize;
+      }
+    }
+    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
+  }
 
-// XMM0 is used only as a scratch register in the optimized code. No need to
-// save it.
-static const intptr_t kNumberOfVolatileXmmRegisters =
-    kNumberOfXmmRegisters - 1;
+  // Store general purpose registers with the highest register number at the
+  // lowest address.
+  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)) {
+      pushq(reg);
+    }
+  }
+}
+
+
+void Assembler::PopRegisters(intptr_t cpu_register_set,
+                             intptr_t xmm_register_set) {
+  // General purpose registers have the highest register number at the
+  // lowest address.
+  for (intptr_t reg_idx = kNumberOfCpuRegisters - 1; reg_idx >= 0; --reg_idx) {
+    Register reg = static_cast<Register>(reg_idx);
+    if (RegisterSet::Contains(cpu_register_set, reg)) {
+      popq(reg);
+    }
+  }
+
+  const intptr_t xmm_regs_count = RegisterSet::RegisterCount(xmm_register_set);
+  if (xmm_regs_count > 0) {
+    // XMM registers have the lowest register number at the lowest address.
+    intptr_t offset = 0;
+    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
+      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
+      if (RegisterSet::Contains(xmm_register_set, xmm_reg)) {
+        movups(xmm_reg, Address(RSP, offset));
+        offset += kFpuRegisterSize;
+      }
+    }
+    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
+    AddImmediate(RSP, Immediate(offset), PP);
+  }
+}
 
 
 void Assembler::EnterCallRuntimeFrame(intptr_t frame_space) {
   EnterFrame(0);
 
-  // Preserve volatile CPU registers.
-  for (intptr_t i = 0; i < kNumberOfVolatileCpuRegisters; i++) {
-    pushq(volatile_cpu_registers[i]);
-  }
-
-  // Preserve all XMM registers except XMM0
-  subq(RSP, Immediate((kNumberOfXmmRegisters - 1) * kFpuRegisterSize));
-  // Store XMM registers with the lowest register number at the lowest
-  // address.
-  intptr_t offset = 0;
-  for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-    XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-    movups(Address(RSP, offset), xmm_reg);
-    offset += kFpuRegisterSize;
-  }
+  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
+  PushRegisters(CallingConventions::kVolatileCpuRegisters,
+                CallingConventions::kVolatileXmmRegisters);
 
   ReserveAlignedFrameSpace(frame_space);
 }
@@ -2856,30 +2895,41 @@
   // RSP might have been modified to reserve space for arguments
   // and ensure proper alignment of the stack frame.
   // We need to restore it before restoring registers.
+  const intptr_t kPushedCpuRegistersCount =
+      RegisterSet::RegisterCount(CallingConventions::kVolatileCpuRegisters);
+  const intptr_t kPushedXmmRegistersCount =
+      RegisterSet::RegisterCount(CallingConventions::kVolatileXmmRegisters);
   const intptr_t kPushedRegistersSize =
-      kNumberOfVolatileCpuRegisters * kWordSize +
-      kNumberOfVolatileXmmRegisters * kFpuRegisterSize;
+      kPushedCpuRegistersCount * kWordSize +
+      kPushedXmmRegistersCount * kFpuRegisterSize;
   leaq(RSP, Address(RBP, -kPushedRegistersSize));
 
-  // Restore all XMM registers except XMM0
-  // XMM registers have the lowest register number at the lowest address.
-  intptr_t offset = 0;
-  for (intptr_t reg_idx = 1; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-    XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-    movups(xmm_reg, Address(RSP, offset));
-    offset += kFpuRegisterSize;
-  }
-  addq(RSP, Immediate(offset));
-
-  // Restore volatile CPU registers.
-  for (intptr_t i = kNumberOfVolatileCpuRegisters - 1; i >= 0; i--) {
-    popq(volatile_cpu_registers[i]);
-  }
+  // TODO(vegorov): avoid saving FpuTMP, it is used only as scratch.
+  PopRegisters(CallingConventions::kVolatileCpuRegisters,
+               CallingConventions::kVolatileXmmRegisters);
 
   leave();
 }
 
 
+void Assembler::CallCFunction(const ExternalLabel* label) {
+  // Reserve shadow space for outgoing arguments.
+  if (CallingConventions::kShadowSpaceBytes != 0) {
+    subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
+  call(label);
+}
+
+
+void Assembler::CallCFunction(Register reg) {
+  // Reserve shadow space for outgoing arguments.
+  if (CallingConventions::kShadowSpaceBytes != 0) {
+    subq(RSP, Immediate(CallingConventions::kShadowSpaceBytes));
+  }
+  call(reg);
+}
+
+
 void Assembler::CallRuntime(const RuntimeEntry& entry,
                             intptr_t argument_count) {
   entry.Call(this, argument_count);
@@ -3278,6 +3328,19 @@
 }
 
 
+void Assembler::LoadTaggedClassIdMayBeSmi(Register result, Register object) {
+  Label load, done;
+  testq(object, Immediate(kSmiTagMask));
+  j(NOT_ZERO, &load, Assembler::kNearJump);
+  LoadImmediate(result, Immediate(Smi::RawValue(kSmiCid)), PP);
+  jmp(&done);
+  Bind(&load);
+  LoadClassId(result, object);
+  SmiTag(result);
+  Bind(&done);
+}
+
+
 static const char* cpu_reg_names[kNumberOfCpuRegisters] = {
   "rax", "rcx", "rdx", "rbx", "rsp", "rbp", "rsi", "rdi",
   "r8", "r9", "r10", "r11", "r12", "r13", "r14", "r15"
diff --git a/runtime/vm/assembler_x64.h b/runtime/vm/assembler_x64.h
index 70f345e..2fdc883 100644
--- a/runtime/vm/assembler_x64.h
+++ b/runtime/vm/assembler_x64.h
@@ -350,6 +350,7 @@
   void movl(Register dst, const Immediate& imm);
   void movl(Register dst, const Address& src);
   void movl(const Address& dst, Register src);
+  void movl(const Address& dst, const Immediate& imm);
 
   void movzxb(Register dst, Register src);
   void movzxb(Register dst, const Address& src);
@@ -714,6 +715,9 @@
     cmpxchgl(address, reg);
   }
 
+  void PushRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
+  void PopRegisters(intptr_t cpu_register_set, intptr_t xmm_register_set);
+
   void EnterFrame(intptr_t frame_space);
   void LeaveFrame();
   void ReserveAlignedFrameSpace(intptr_t frame_space);
@@ -726,6 +730,11 @@
 
   void CallRuntime(const RuntimeEntry& entry, intptr_t argument_count);
 
+  // Call runtime function. Reserves shadow space on the stack before calling
+  // if platform ABI requires that. Does not restore RSP after the call itself.
+  void CallCFunction(const ExternalLabel* label);
+  void CallCFunction(Register reg);
+
   /*
    * Loading and comparing classes of objects.
    */
@@ -737,6 +746,8 @@
 
   void CompareClassId(Register object, intptr_t class_id);
 
+  void LoadTaggedClassIdMayBeSmi(Register result, Register object);
+
   /*
    * Misc. functionality.
    */
diff --git a/runtime/vm/assembler_x64_test.cc b/runtime/vm/assembler_x64_test.cc
index de4275f..341196a 100644
--- a/runtime/vm/assembler_x64_test.cc
+++ b/runtime/vm/assembler_x64_test.cc
@@ -16,7 +16,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(ReadArgument, assembler) {
-  __ pushq(RDI);  // First argument is passed in register rdi.
+  __ pushq(CallingConventions::kArg1Reg);
   __ movq(RAX, Address(RSP, 0));
   __ popq(RDX);
   __ ret();
@@ -1296,7 +1296,7 @@
   __ addq(RSP, Immediate(space));
   space = ComputeStackSpaceReservation(0, 8);
   __ subq(RSP, Immediate(space));
-  __ movl(RDI, RAX);
+  __ movl(CallingConventions::kArg1Reg, RAX);
   __ call(&call2);
   __ addq(RSP, Immediate(space));
   __ ret();
@@ -2724,10 +2724,11 @@
   __ pushq(PP);  // Save caller's pool pointer and load a new one here.
   __ LoadPoolPointer(PP);
   __ pushq(CTX);
-  __ movq(CTX, RDI);
-  __ StoreIntoObject(RDX,
-                     FieldAddress(RDX, GrowableObjectArray::data_offset()),
-                     RSI);
+  __ movq(CTX, CallingConventions::kArg1Reg);
+  __ StoreIntoObject(CallingConventions::kArg3Reg,
+                     FieldAddress(CallingConventions::kArg3Reg,
+                                  GrowableObjectArray::data_offset()),
+                     CallingConventions::kArg2Reg);
   __ popq(CTX);
   __ popq(PP);  // Restore caller's pool pointer.
   __ ret();
@@ -2808,7 +2809,7 @@
 
 
 ASSEMBLER_TEST_GENERATE(IntToDoubleConversion2, assembler) {
-  __ pushq(RDI);
+  __ pushq(CallingConventions::kArg1Reg);
   __ fildl(Address(RSP, 0));
   __ fstpl(Address(RSP, 0));
   __ movsd(XMM0, Address(RSP, 0));
@@ -2896,10 +2897,11 @@
 
 
 ASSEMBLER_TEST_GENERATE(TestRepMovsBytes, assembler) {
-  // Save incoming arguments.
-  __ pushq(RDI);  // Arg0, from.
-  __ pushq(RSI);  // Arg1, to.
-  __ pushq(RDX);  // Arg2, count.
+  __ pushq(RSI);
+  __ pushq(RDI);
+  __ pushq(CallingConventions::kArg1Reg);  // from.
+  __ pushq(CallingConventions::kArg2Reg);  // to.
+  __ pushq(CallingConventions::kArg3Reg);  // count.
   __ movq(RSI, Address(RSP, 2 * kWordSize));  // from.
   __ movq(RDI, Address(RSP, 1 * kWordSize));  // to.
   __ movq(RCX, Address(RSP, 0 * kWordSize));  // count.
@@ -2908,6 +2910,8 @@
   __ popq(RAX);
   __ popq(RAX);
   __ popq(RAX);
+  __ popq(RDI);
+  __ popq(RSI);
   __ ret();
 }
 
@@ -2926,11 +2930,9 @@
 
 
 ASSEMBLER_TEST_GENERATE(ConditionalMovesCompare, assembler) {
-  // RDI: Arg0.
-  // RSI: Arg1.
+  __ cmpq(CallingConventions::kArg1Reg, CallingConventions::kArg2Reg);
   __ movq(RDX, Immediate(1));  // Greater equal.
   __ movq(RCX, Immediate(-1));  // Less
-  __ cmpq(RDI, RSI);
   __ cmovlessq(RAX, RCX);
   __ cmovgeq(RAX, RDX);
   __ ret();
diff --git a/runtime/vm/ast.h b/runtime/vm/ast.h
index bf9490b..aceb0b0 100644
--- a/runtime/vm/ast.h
+++ b/runtime/vm/ast.h
@@ -98,6 +98,7 @@
       : token_pos_(token_pos) {
     ASSERT(token_pos_ >= 0);
   }
+  virtual ~AstNode() { }
 
   intptr_t token_pos() const { return token_pos_; }
 
diff --git a/runtime/vm/benchmark_test.cc b/runtime/vm/benchmark_test.cc
index cd2bd36..cd8dc78 100644
--- a/runtime/vm/benchmark_test.cc
+++ b/runtime/vm/benchmark_test.cc
@@ -57,33 +57,17 @@
 // Measure creation of core isolate from a snapshot.
 //
 BENCHMARK(CorelibIsolateStartup) {
-  const int kNumIterations = 100;
-  char* err = NULL;
-  Dart_Isolate base_isolate = Dart_CurrentIsolate();
-  Dart_Isolate test_isolate = Dart_CreateIsolate(NULL, NULL,
-                                                 bin::snapshot_buffer,
-                                                 NULL, &err);
-  EXPECT(test_isolate != NULL);
-  Dart_EnterScope();
-  uint8_t* buffer = NULL;
-  intptr_t size = 0;
-  Dart_Handle result = Dart_CreateSnapshot(&buffer, &size);
-  EXPECT_VALID(result);
-  Timer timer(true, "Core Isolate startup benchmark");
-  timer.Start();
+  const int kNumIterations = 1000;
+  Timer timer(true, "CorelibIsolateStartup");
+  Isolate* isolate = Isolate::Current();
   for (int i = 0; i < kNumIterations; i++) {
-    Dart_Isolate new_isolate =
-        Dart_CreateIsolate(NULL, NULL, buffer, NULL, &err);
-    EXPECT(new_isolate != NULL);
+    timer.Start();
+    TestCase::CreateTestIsolate();
+    timer.Stop();
     Dart_ShutdownIsolate();
   }
-  timer.Stop();
-  int64_t elapsed_time = timer.TotalElapsedTime();
-  benchmark->set_score(elapsed_time / kNumIterations);
-  Dart_EnterIsolate(test_isolate);
-  Dart_ExitScope();
-  Dart_ShutdownIsolate();
-  Dart_EnterIsolate(base_isolate);
+  benchmark->set_score(timer.TotalElapsedTime() / kNumIterations);
+  Isolate::SetCurrent(isolate);
 }
 
 
@@ -410,7 +394,7 @@
 }
 
 
-BENCHMARK(CoreSnapshotSize) {
+BENCHMARK_SIZE(CoreSnapshotSize) {
   const char* kScriptChars =
       "import 'dart:async';\n"
       "import 'dart:core';\n"
@@ -438,7 +422,7 @@
 }
 
 
-BENCHMARK(StandaloneSnapshotSize) {
+BENCHMARK_SIZE(StandaloneSnapshotSize) {
   const char* kScriptChars =
       "import 'dart:async';\n"
       "import 'dart:core';\n"
@@ -449,7 +433,7 @@
       "import 'dart:isolate';\n"
       "import 'dart:mirrors';\n"
       "import 'dart:typed_data';\n"
-      "import 'dart:builtin';\n"
+      "import 'dart:_builtin';\n"
       "import 'dart:io';\n"
       "\n";
 
diff --git a/runtime/vm/benchmark_test.h b/runtime/vm/benchmark_test.h
index 0ff69ce..2537151 100644
--- a/runtime/vm/benchmark_test.h
+++ b/runtime/vm/benchmark_test.h
@@ -25,11 +25,11 @@
 extern const uint8_t* snapshot_buffer;
 }
 
-// The BENCHMARK macro is used for benchmarking a specific functionality
-// of the VM
-#define BENCHMARK(name)                                                        \
+// The BENCHMARK macros are used for benchmarking a specific functionality
+// of the VM.
+#define BENCHMARK_HELPER(name, kind)                                           \
   void Dart_Benchmark##name(Benchmark* benchmark);                             \
-  static Benchmark kRegister##name(Dart_Benchmark##name, #name);               \
+  static Benchmark kRegister##name(Dart_Benchmark##name, #name, kind);         \
   static void Dart_BenchmarkHelper##name(Benchmark* benchmark);                \
   void Dart_Benchmark##name(Benchmark* benchmark) {                            \
     FLAG_heap_growth_space_ratio = 100;                                        \
@@ -40,6 +40,9 @@
   }                                                                            \
   static void Dart_BenchmarkHelper##name(Benchmark* benchmark)
 
+#define BENCHMARK(name) BENCHMARK_HELPER(name, "RunTime")
+#define BENCHMARK_SIZE(name) BENCHMARK_HELPER(name, "CodeSize")
+
 
 inline Dart_Handle NewString(const char* str) {
   return Dart_NewStringFromCString(str);
@@ -50,9 +53,10 @@
  public:
   typedef void (RunEntry)(Benchmark* benchmark);
 
-  Benchmark(RunEntry* run, const char* name) :
+  Benchmark(RunEntry* run, const char* name, const char* score_kind) :
       run_(run),
       name_(name),
+      score_kind_(score_kind),
       score_(0),
       isolate_(NULL),
       next_(NULL) {
@@ -66,6 +70,7 @@
 
   // Accessors.
   const char* name() const { return name_; }
+  const char* score_kind() const { return score_kind_; }
   void set_score(intptr_t value) { score_ = value; }
   intptr_t score() const { return score_; }
   Isolate* isolate() const { return reinterpret_cast<Isolate*>(isolate_); }
@@ -92,6 +97,7 @@
 
   RunEntry* const run_;
   const char* name_;
+  const char* score_kind_;
   intptr_t score_;
   Dart_Isolate isolate_;
   Benchmark* next_;
diff --git a/runtime/vm/bigint_operations.cc b/runtime/vm/bigint_operations.cc
index 9d8a2a4..e8cafdc 100644
--- a/runtime/vm/bigint_operations.cc
+++ b/runtime/vm/bigint_operations.cc
@@ -358,7 +358,7 @@
     // into dart code or allocating any code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
 
@@ -487,13 +487,57 @@
 }
 
 
+static double Uint64ToDouble(uint64_t x) {
+#if _WIN64
+  // For static_cast<double>(x) MSVC x64 generates
+  //
+  //    cvtsi2sd xmm0, rax
+  //    test  rax, rax
+  //    jns done
+  //    addsd xmm0, static_cast<double>(2^64)
+  //  done:
+  //
+  // while GCC -m64 generates
+  //
+  //    test rax, rax
+  //    js negative
+  //    cvtsi2sd xmm0, rax
+  //    jmp done
+  //  negative:
+  //    mov rdx, rax
+  //    shr rdx, 1
+  //    and eax, 0x1
+  //    or rdx, rax
+  //    cvtsi2sd xmm0, rdx
+  //    addsd xmm0, xmm0
+  //  done:
+  //
+  // which results in a different rounding.
+  //
+  // For consistency between platforms fallback to GCC style converstion
+  // on Win64.
+  //
+  const int64_t y = static_cast<int64_t>(x);
+  if (y > 0) {
+    return static_cast<double>(y);
+  } else {
+    const double half = static_cast<double>(
+        static_cast<int64_t>(x >> 1) | (y & 1));
+    return half + half;
+  }
+#else
+  return static_cast<double>(x);
+#endif
+}
+
+
 RawDouble* BigintOperations::ToDouble(const Bigint& bigint) {
   ASSERT(IsClamped(bigint));
   if (bigint.IsZero()) {
     return Double::New(0.0);
   }
   if (AbsFitsIntoUint64(bigint)) {
-    double absolute_value = static_cast<double>(AbsToUint64(bigint));
+    double absolute_value = Uint64ToDouble(AbsToUint64(bigint));
     double result = bigint.IsNegative() ? -absolute_value : absolute_value;
     return Double::New(result);
   }
diff --git a/runtime/vm/block_scheduler.cc b/runtime/vm/block_scheduler.cc
index 02287f3..2533757 100644
--- a/runtime/vm/block_scheduler.cc
+++ b/runtime/vm/block_scheduler.cc
@@ -37,7 +37,13 @@
                           intptr_t entry_count) {
   TargetEntryInstr* target = successor->AsTargetEntry();
   if (target != NULL) {
-    intptr_t count = ComputeEdgeCount(unoptimized_code, target->deopt_id());
+    // If this block ends in a goto, the edge count of this edge is the same
+    // as the count on the single outgoing edge. This is true as long as the
+    // block does not throw an exception.
+    GotoInstr* jump = target->last_instruction()->AsGoto();
+    const intptr_t deopt_id =
+        (jump != NULL)  ? jump->deopt_id() : target->deopt_id();
+    intptr_t count = ComputeEdgeCount(unoptimized_code, deopt_id);
     if ((count >= 0) && (entry_count != 0)) {
       double weight =
           static_cast<double>(count) / static_cast<double>(entry_count);
diff --git a/runtime/vm/bootstrap.cc b/runtime/vm/bootstrap.cc
index d12752f..937286e 100644
--- a/runtime/vm/bootstrap.cc
+++ b/runtime/vm/bootstrap.cc
@@ -193,7 +193,7 @@
     return Api::NewError("uri is not a string");
   }
   if (tag == Dart_kCanonicalizeUrl) {
-    // In the boot strap loader we do not try and do any canonicalization.
+    // In the bootstrap loader we do not try and do any canonicalization.
     return uri;
   }
   const String& uri_str = Api::UnwrapStringHandle(isolate, uri);
@@ -271,6 +271,7 @@
     lib = Library::LookupLibrary(uri);
     if (lib.IsNull()) {
       lib = Library::NewLibraryHelper(uri, false);
+      lib.SetLoadRequested();
       lib.Register();
     }
     isolate->object_store()->set_bootstrap_library(
diff --git a/runtime/vm/bootstrap_natives.h b/runtime/vm/bootstrap_natives.h
index 811e24e..cd7a9b5 100644
--- a/runtime/vm/bootstrap_natives.h
+++ b/runtime/vm/bootstrap_natives.h
@@ -21,7 +21,6 @@
   V(Object_runtimeType, 1)                                                     \
   V(Object_instanceOf, 5)                                                      \
   V(Object_as, 4)                                                              \
-  V(Object_cid, 1)                                                             \
   V(Function_apply, 2)                                                         \
   V(FunctionImpl_equals, 2)                                                    \
   V(FunctionImpl_hashCode, 1)                                                  \
@@ -352,11 +351,13 @@
   V(WeakProperty_setValue, 2)                                                  \
   V(Uri_isWindowsPlatform, 0)                                                  \
   V(LibraryPrefix_load, 1)                                                     \
+  V(LibraryPrefix_invalidateDependentCode, 1)                                  \
   V(UserTag_new, 2)                                                            \
   V(UserTag_label, 1)                                                          \
   V(UserTag_defaultTag, 0)                                                     \
   V(UserTag_makeCurrent, 1)                                                    \
   V(Profiler_getCurrentTag, 0)                                                 \
+  V(ClassID_getID, 1)                                                          \
 
 
 class BootstrapNatives : public AllStatic {
diff --git a/runtime/vm/class_finalizer.cc b/runtime/vm/class_finalizer.cc
index 5b28264..d70e8c1 100644
--- a/runtime/vm/class_finalizer.cc
+++ b/runtime/vm/class_finalizer.cc
@@ -10,6 +10,7 @@
 #include "vm/isolate.h"
 #include "vm/longjump.h"
 #include "vm/object_store.h"
+#include "vm/report.h"
 #include "vm/symbols.h"
 
 namespace dart {
@@ -278,9 +279,7 @@
   for (intptr_t i = 0; i < visited_factories.Length(); i++) {
     if (visited_factories.At(i) == factory.raw()) {
       // A redirection cycle is reported as a compile-time error.
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, factory.token_pos(),
+      ReportError(cls, factory.token_pos(),
                   "factory '%s' illegally redirects to itself",
                   String::Handle(factory.name()).ToCString());
     }
@@ -372,11 +371,9 @@
 
   // Verify that the target is const if the redirecting factory is const.
   if (factory.is_const() && !target.is_const()) {
-    const Script& script = Script::Handle(target_class.script());
-    ReportError(Error::Handle(),  // No previous error.
-                script, target.token_pos(),
-                "constructor '%s' must be const as required by redirecting "
-                "const factory '%s'",
+    ReportError(target_class, target.token_pos(),
+                "constructor '%s' must be const as required by "
+                "redirecting const factory '%s'",
                 String::Handle(target.name()).ToCString(),
                 String::Handle(factory.name()).ToCString());
   }
@@ -571,12 +568,9 @@
           !pending_arguments.IsSubvectorInstantiated(first_type_param,
                                                      num_type_params)) {
         // Reject the non-contractive recursive type.
-        const Script& script = Script::Handle(isolate, cls.script());
         const String& type_name = String::Handle(isolate, type.Name());
-        ReportError(Error::Handle(isolate),  // No previous error.
-                    script, type.token_pos(),
-                    "illegal recursive type '%s'",
-                    type_name.ToCString());
+        ReportError(cls, type.token_pos(),
+                    "illegal recursive type '%s'", type_name.ToCString());
       }
     }
   }
@@ -968,11 +962,9 @@
   if (!arguments.IsNull() && (arguments.Length() != num_type_parameters)) {
     // Wrong number of type arguments. The type is mapped to the raw type.
     if (FLAG_error_on_bad_type) {
-      const Script& script = Script::Handle(isolate, cls.script());
       const String& type_class_name =
           String::Handle(isolate, type_class.Name());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, parameterized_type.token_pos(),
+      ReportError(cls, parameterized_type.token_pos(),
                   "wrong number of type arguments for class '%s'",
                   type_class_name.ToCString());
     }
@@ -1276,9 +1268,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
                     name.ToCString(),
@@ -1294,9 +1284,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "static field '%s' of class '%s' conflicts with "
                     "instance setter '%s=' of super class '%s'",
                     name.ToCString(),
@@ -1312,9 +1300,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, field.token_pos(),
+        ReportError(cls, field.token_pos(),
                     "field '%s' of class '%s' conflicts with method '%s' "
                     "of super class '%s'",
                     name.ToCString(),
@@ -1346,14 +1332,13 @@
           const String& const_value_type_name = String::Handle(
               const_value_type.UserVisibleName());
           const String& type_name = String::Handle(type.UserVisibleName());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(error, script, field.token_pos(),
-                      "error initializing static %s field '%s': "
-                      "type '%s' is not a subtype of type '%s'",
-                      field.is_const() ? "const" : "final",
-                      name.ToCString(),
-                      const_value_type_name.ToCString(),
-                      type_name.ToCString());
+          ReportErrors(error, cls, field.token_pos(),
+                       "error initializing static %s field '%s': "
+                       "type '%s' is not a subtype of type '%s'",
+                       field.is_const() ? "const" : "final",
+                       name.ToCString(),
+                       const_value_type_name.ToCString(),
+                       type_name.ToCString());
         } else {
           // Do not report an error yet, even in checked mode, since the field
           // may not actually be used.
@@ -1423,13 +1408,12 @@
                                                   &error)) {
           const String& class_name = String::Handle(cls.Name());
           const String& super_class_name = String::Handle(super_class.Name());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(error, script, function.token_pos(),
-                      "class '%s' overrides method '%s' of super class '%s' "
-                      "with incompatible parameters",
-                      class_name.ToCString(),
-                      name.ToCString(),
-                      super_class_name.ToCString());
+          ReportErrors(error, cls, function.token_pos(),
+                       "class '%s' overrides method '%s' of super "
+                       "class '%s' with incompatible parameters",
+                       class_name.ToCString(),
+                       name.ToCString(),
+                       super_class_name.ToCString());
         }
       }
     }
@@ -1439,9 +1423,7 @@
         if (!super_class.IsNull()) {
           const String& class_name = String::Handle(cls.Name());
           const String& super_class_name = String::Handle(super_class.Name());
-          const Script& script = Script::Handle(cls.script());
-          ReportError(Error::Handle(),  // No previous error.
-                      script, function.token_pos(),
+          ReportError(cls, function.token_pos(),
                       "static setter '%s=' of class '%s' conflicts with "
                       "instance setter '%s=' of super class '%s'",
                       name.ToCString(),
@@ -1463,9 +1445,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "static %s '%s' of class '%s' conflicts with "
                     "instance member '%s' of super class '%s'",
                     (function.IsGetterFunction() ||
@@ -1483,9 +1463,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "getter '%s' of class '%s' conflicts with "
                     "method '%s' of super class '%s'",
                     name.ToCString(),
@@ -1501,9 +1479,7 @@
       if (!super_class.IsNull()) {
         const String& class_name = String::Handle(cls.Name());
         const String& super_class_name = String::Handle(super_class.Name());
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, function.token_pos(),
+        ReportError(cls, function.token_pos(),
                     "method '%s' of class '%s' conflicts with "
                     "getter '%s' of super class '%s'",
                     name.ToCString(),
@@ -1967,10 +1943,8 @@
   // that the super class of the mixin class is class Object.
   GrowableArray<intptr_t> visited_mixins;
   if (!IsMixinCycleFree(mixin_class, &visited_mixins)) {
-    const Script& script = Script::Handle(mixin_class.script());
     const String& class_name = String::Handle(mixin_class.Name());
-    ReportError(Error::Handle(),  // No previous error.
-                script, mixin_class.token_pos(),
+    ReportError(mixin_class, mixin_class.token_pos(),
                 "mixin class '%s' illegally refers to itself",
                 class_name.ToCString());
   }
@@ -1986,10 +1960,8 @@
     mixin_super_class = mixin_super_class.SuperClass();
   }
   if (mixin_super_class.IsNull() || !mixin_super_class.IsObjectClass()) {
-    const Script& script = Script::Handle(mixin_app_class.script());
     const String& class_name = String::Handle(mixin_class.Name());
-    ReportError(Error::Handle(),  // No previous error.
-                script, mixin_app_class.token_pos(),
+    ReportError(mixin_app_class, mixin_app_class.token_pos(),
                 "mixin class '%s' must extend class 'Object'",
                 class_name.ToCString());
   }
@@ -2127,9 +2099,7 @@
     if (func.IsConstructor()) {
       // A mixin class must not have explicit constructors.
       if (!func.IsImplicitConstructor()) {
-        const Script& script = Script::Handle(isolate, cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, cls.token_pos(),
+        ReportError(cls, cls.token_pos(),
                     "mixin class '%s' must not have constructors\n",
                     String::Handle(isolate, mixin_cls.Name()).ToCString());
       }
@@ -2178,9 +2148,7 @@
   }
   if (!IsSuperCycleFree(cls)) {
     const String& name = String::Handle(cls.Name());
-    const Script& script = Script::Handle(cls.script());
-    ReportError(Error::Handle(),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' has a cycle in its superclass relationship",
                 name.ToCString());
   }
@@ -2212,9 +2180,7 @@
     GrowableArray<intptr_t> visited_aliases;
     if (!IsAliasCycleFree(cls, &visited_aliases)) {
       const String& name = String::Handle(cls.Name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "typedef '%s' illegally refers to itself",
                   name.ToCString());
     }
@@ -2248,9 +2214,7 @@
     ASSERT(interface_type.IsFinalized());
     ASSERT(super_type.IsNull() || super_type.IsFinalized());
     if (!super_type.IsNull() && interface_type.Equals(super_type)) {
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "super type '%s' may not be listed in "
                   "implements clause of class '%s'",
                   String::Handle(super_type.Name()).ToCString(),
@@ -2259,9 +2223,7 @@
     for (intptr_t j = 0; j < i; j++) {
       seen_interf ^= interface_types.At(j);
       if (interface_type.Equals(seen_interf)) {
-        const Script& script = Script::Handle(cls.script());
-        ReportError(Error::Handle(),  // No previous error.
-                    script, cls.token_pos(),
+        ReportError(cls, cls.token_pos(),
                     "interface '%s' appears twice in "
                     "implements clause of class '%s'",
                     String::Handle(interface_type.Name()).ToCString(),
@@ -2500,10 +2462,8 @@
       return;
     }
     if (FLAG_error_on_bad_type) {
-      const Script& script = Script::Handle(cls.script());
       const String& type_class_name = String::Handle(type_class.Name());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, type.token_pos(),
+      ReportError(cls, type.token_pos(),
                   "wrong number of type arguments for class '%s'",
                   type_class_name.ToCString());
     }
@@ -2672,9 +2632,7 @@
     if ((*visited)[i] == cls_index) {
       // We have already visited class 'cls'. We found a cycle.
       const String& class_name = String::Handle(isolate, cls.Name());
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "cyclic reference found for class '%s'",
                   class_name.ToCString());
     }
@@ -2715,21 +2673,17 @@
     ReportError(Error::Handle(isolate, super_type.error()));
   }
   if (super_type.IsDynamicType()) {
-    const Script& script = Script::Handle(isolate, cls.script());
-    ReportError(Error::Handle(isolate),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' may not extend 'dynamic'",
                 String::Handle(isolate, cls.Name()).ToCString());
   }
   interface_class = super_type.type_class();
   if (interface_class.IsSignatureClass()) {
-    const Script& script = Script::Handle(isolate, cls.script());
-    ReportError(Error::Handle(isolate),  // No previous error.
-                script, cls.token_pos(),
+    ReportError(cls, cls.token_pos(),
                 "class '%s' may not extend function type alias '%s'",
                 String::Handle(isolate, cls.Name()).ToCString(),
                 String::Handle(isolate,
-                               super_type.UserVisibleName()).ToCString());
+                                  super_type.UserVisibleName()).ToCString());
   }
 
   // If cls belongs to core lib or to core lib's implementation, restrictions
@@ -2774,12 +2728,12 @@
       }
     }
     if (is_error) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      const String& interface_name = String::Handle(isolate,
+                                                    interface_class.Name());
+      ReportError(cls, cls.token_pos(),
                   "'%s' is not allowed to extend '%s'",
                   String::Handle(isolate, cls.Name()).ToCString(),
-                  String::Handle(isolate, interface_class.Name()).ToCString());
+                  interface_name.ToCString());
     }
   }
   // Now resolve the super interfaces of the super type.
@@ -2795,18 +2749,16 @@
       ReportError(Error::Handle(isolate, interface.error()));
     }
     if (interface.IsDynamicType()) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      ReportError(cls, cls.token_pos(),
                   "'dynamic' may not be used as interface");
     }
     interface_class = interface.type_class();
     if (interface_class.IsSignatureClass()) {
-      const Script& script = Script::Handle(isolate, cls.script());
-      ReportError(Error::Handle(isolate),  // No previous error.
-                  script, cls.token_pos(),
+      const String& interface_name = String::Handle(isolate,
+                                                    interface_class.Name());
+      ReportError(cls, cls.token_pos(),
                   "function type alias '%s' may not be used as interface",
-                  String::Handle(isolate, interface_class.Name()).ToCString());
+                  interface_name.ToCString());
     }
     // Verify that unless cls belongs to core lib, it cannot extend, implement,
     // or mixin any of Null, bool, num, int, double, String, dynamic.
@@ -2818,17 +2770,14 @@
           interface.IsDoubleType() ||
           interface.IsStringType() ||
           interface.IsDynamicType()) {
-        const Script& script = Script::Handle(isolate, cls.script());
         const String& interface_name = String::Handle(isolate,
                                                       interface_class.Name());
         if (cls.IsMixinApplication()) {
-          ReportError(Error::Handle(isolate),  // No previous error.
-                      script, cls.token_pos(),
+          ReportError(cls, cls.token_pos(),
                       "illegal mixin of '%s'",
                       interface_name.ToCString());
         } else {
-          ReportError(Error::Handle(isolate),  // No previous error.
-                      script, cls.token_pos(),
+          ReportError(cls, cls.token_pos(),
                       "'%s' is not allowed to extend or implement '%s'",
                       String::Handle(isolate, cls.Name()).ToCString(),
                       interface_name.ToCString());
@@ -2857,9 +2806,7 @@
     if (!field.is_static() && !field.is_final()) {
       const String& class_name = String::Handle(cls.Name());
       const String& field_name = String::Handle(field.name());
-      const Script& script = Script::Handle(cls.script());
-      ReportError(Error::Handle(),  // No previous error.
-                  script, field.token_pos(),
+      ReportError(cls, field.token_pos(),
                   "const class '%s' has non-final field '%s'",
                   class_name.ToCString(), field_name.ToCString());
     }
@@ -2914,15 +2861,15 @@
 }
 
 // Either report an error or mark the type as malformed.
-void ClassFinalizer::ReportMalformedType(const Error& prev_error,
-                                         const Script& script,
-                                         const Type& type,
-                                         const char* format,
-                                         va_list args) {
+void ClassFinalizer::MarkTypeMalformed(const Error& prev_error,
+                                       const Script& script,
+                                       const Type& type,
+                                       const char* format,
+                                       va_list args) {
   LanguageError& error = LanguageError::Handle(
       LanguageError::NewFormattedV(
           prev_error, script, type.token_pos(),
-          LanguageError::kMalformedType, Heap::kOld,
+          Report::kMalformedType, Heap::kOld,
           format, args));
   if (FLAG_error_on_bad_type) {
     ReportError(error);
@@ -2955,7 +2902,7 @@
                            type_pos));
   const Type& type = Type::Handle(
       Type::New(unresolved_class, TypeArguments::Handle(), type_pos));
-  ReportMalformedType(prev_error, script, type, format, args);
+  MarkTypeMalformed(prev_error, script, type, format, args);
   va_end(args);
   ASSERT(type.IsMalformed());
   ASSERT(type.IsFinalized());
@@ -2969,7 +2916,7 @@
                                            const char* format, ...) {
   va_list args;
   va_start(args, format);
-  ReportMalformedType(prev_error, script, type, format, args);
+  MarkTypeMalformed(prev_error, script, type, format, args);
   va_end(args);
 }
 
@@ -2983,7 +2930,7 @@
   LanguageError& error = LanguageError::Handle(
       LanguageError::NewFormattedV(
           prev_error, script, type.token_pos(),
-          LanguageError::kMalboundedType, Heap::kOld,
+          Report::kMalboundedType, Heap::kOld,
           format, args));
   va_end(args);
   if (FLAG_error_on_bad_type) {
@@ -2998,24 +2945,33 @@
 
 
 void ClassFinalizer::ReportError(const Error& error) {
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  Report::LongJump(error);
   UNREACHABLE();
 }
 
 
-void ClassFinalizer::ReportError(const Error& prev_error,
-                                 const Script& script,
+void ClassFinalizer::ReportErrors(const Error& prev_error,
+                                  const Class& cls,
+                                  intptr_t token_pos,
+                                  const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  const Script& script = Script::Handle(cls.script());
+  Report::LongJumpV(prev_error, script, token_pos, format, args);
+  va_end(args);
+  UNREACHABLE();
+}
+
+
+void ClassFinalizer::ReportError(const Class& cls,
                                  intptr_t token_pos,
                                  const char* format, ...) {
   va_list args;
   va_start(args, format);
-  Error& error = Error::Handle(
-      LanguageError::NewFormattedV(
-          prev_error, script, token_pos,
-          LanguageError::kError, Heap::kNew,
-          format, args));
+  const Script& script = Script::Handle(cls.script());
+  Report::MessageV(Report::kError, script, token_pos, format, args);
   va_end(args);
-  ReportError(error);
+  UNREACHABLE();
 }
 
 
diff --git a/runtime/vm/class_finalizer.h b/runtime/vm/class_finalizer.h
index 92740ca..5987a48 100644
--- a/runtime/vm/class_finalizer.h
+++ b/runtime/vm/class_finalizer.h
@@ -162,16 +162,19 @@
   static void PrintClassInformation(const Class& cls);
   static void CollectInterfaces(const Class& cls,
                                 const GrowableObjectArray& interfaces);
-  static void ReportMalformedType(const Error& prev_error,
-                                  const Script& script,
-                                  const Type& type,
-                                  const char* format,
-                                  va_list args);
+  static void MarkTypeMalformed(const Error& prev_error,
+                                const Script& script,
+                                const Type& type,
+                                const char* format,
+                                va_list args);
   static void ReportError(const Error& error);
-  static void ReportError(const Error& prev_error,
-                          const Script& script,
-                          intptr_t token_index,
-                          const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void ReportError(const Class& cls,
+                          intptr_t token_pos,
+                          const char* format, ...) PRINTF_ATTRIBUTE(3, 4);
+  static void ReportErrors(const Error& prev_error,
+                           const Class& cls,
+                           intptr_t token_pos,
+                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
 
   // Verify implicit offsets recorded in the VM for direct access to fields of
   // Dart instances (e.g: _TypedListView, _ByteDataView).
diff --git a/runtime/vm/class_table.cc b/runtime/vm/class_table.cc
index e5e3a0b..7c307b7 100644
--- a/runtime/vm/class_table.cc
+++ b/runtime/vm/class_table.cc
@@ -358,6 +358,7 @@
       "dateLastServiceGC",
       "%" Pd64 "",
       isolate->last_allocationprofile_gc_timestamp());
+
   {
     JSONObject heaps(&obj, "heaps");
     {
@@ -373,7 +374,7 @@
     for (intptr_t i = 1; i < top_; i++) {
       const ClassHeapStats* stats = StatsWithUpdatedSize(i);
       if (stats != NULL) {
-       JSONObject obj(&arr);
+        JSONObject obj(&arr);
         cls = At(i);
         stats->PrintToJSONObject(cls, &obj);
       }
diff --git a/runtime/vm/code_generator.cc b/runtime/vm/code_generator.cc
index 417a905..6ee1098 100644
--- a/runtime/vm/code_generator.cc
+++ b/runtime/vm/code_generator.cc
@@ -19,6 +19,7 @@
 #include "vm/message.h"
 #include "vm/message_handler.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/runtime_entry.h"
 #include "vm/stack_frame.h"
@@ -32,10 +33,10 @@
     " native entries.");
 DEFINE_FLAG(int, max_subtype_cache_entries, 100,
     "Maximum number of subtype cache entries (number of checks cached).");
-DEFINE_FLAG(int, optimization_counter_threshold, 15000,
+DEFINE_FLAG(int, optimization_counter_threshold, 30000,
     "Function's usage-counter value before it is optimized, -1 means never");
 DEFINE_FLAG(charp, optimization_filter, NULL, "Optimize only named function");
-DEFINE_FLAG(int, reoptimization_counter_threshold, 2000,
+DEFINE_FLAG(int, reoptimization_counter_threshold, 4000,
     "Counter threshold before a function gets reoptimized.");
 DEFINE_FLAG(bool, stop_on_excessive_deoptimization, false,
     "Debugging: stops program if deoptimizing same function too often");
@@ -574,10 +575,10 @@
   String& dst_type_name = String::Handle();
   LanguageError& error = LanguageError::Handle(dst_type.error());
   ASSERT(!error.IsNull());
-  if (error.kind() == LanguageError::kMalformedType) {
+  if (error.kind() == Report::kMalformedType) {
     dst_type_name = Symbols::Malformed().raw();
   } else {
-    ASSERT(error.kind() == LanguageError::kMalboundedType);
+    ASSERT(error.kind() == Report::kMalboundedType);
     dst_type_name = Symbols::Malbounded().raw();
   }
   const String& error_message = String::ZoneHandle(
@@ -589,15 +590,18 @@
 
 
 DEFINE_RUNTIME_ENTRY(Throw, 1) {
-  const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
-  Exceptions::Throw(exception);
+  const Instance& exception =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(0));
+  Exceptions::Throw(isolate, exception);
 }
 
 
 DEFINE_RUNTIME_ENTRY(ReThrow, 2) {
-  const Instance& exception = Instance::CheckedHandle(arguments.ArgAt(0));
-  const Instance& stacktrace = Instance::CheckedHandle(arguments.ArgAt(1));
-  Exceptions::ReThrow(exception, stacktrace);
+  const Instance& exception =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(0));
+  const Instance& stacktrace =
+      Instance::CheckedHandle(isolate, arguments.ArgAt(1));
+  Exceptions::ReThrow(isolate, exception, stacktrace);
 }
 
 
@@ -803,18 +807,6 @@
 }
 
 
-static void JSWarning(const ICData& ic_data, const char* msg) {
-  DartFrameIterator iterator;
-  StackFrame* caller_frame = iterator.NextFrame();
-  ASSERT(caller_frame != NULL);
-  // Report warning only if not already reported at this location.
-  if (!ic_data.IssuedJSWarning()) {
-    ic_data.SetIssuedJSWarning();
-    Exceptions::JSWarning(caller_frame, "%s", msg);
-  }
-}
-
-
 // Handles inline cache misses by updating the IC data array of the call site.
 //   Arg0: Receiver object.
 //   Arg1: IC data object.
@@ -830,9 +822,10 @@
         String::Handle(ic_data.target_name()).Equals(Symbols::toString())) {
       const double value = Double::Cast(receiver).value();
       if (floor(value) == value) {
-        JSWarning(ic_data,
-                  "string representation of an integral value of type "
-                  "'double' has no decimal mark and no fractional part");
+        Report::JSWarningFromIC(ic_data,
+                                "string representation of an integral value "
+                                "of type 'double' has no decimal mark and "
+                                "no fractional part");
       }
     }
   }
@@ -1064,7 +1057,7 @@
     // into dart code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->stack_overflow());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
 
diff --git a/runtime/vm/compiler.cc b/runtime/vm/compiler.cc
index b8805f8..9c2822a 100644
--- a/runtime/vm/compiler.cc
+++ b/runtime/vm/compiler.cc
@@ -60,8 +60,6 @@
 
 DECLARE_FLAG(bool, trace_failed_optimization_attempts);
 DECLARE_FLAG(bool, trace_patching);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
-DECLARE_FLAG(bool, warning_as_error);
 
 // Compile a function. Should call only if the function has not been compiled.
 //   Arg0: function object.
@@ -241,6 +239,7 @@
 }
 
 
+
 // Return false if bailed out.
 static bool CompileParsedFunctionHelper(ParsedFunction* parsed_function,
                                         bool optimized,
@@ -276,21 +275,20 @@
         TimerScope timer(FLAG_compiler_stats,
                          &CompilerStats::graphbuilder_timer,
                          isolate);
-        Array& ic_data_array = Array::Handle();
+        ZoneGrowableArray<const ICData*>* ic_data_array =
+            new(isolate) ZoneGrowableArray<const ICData*>();
         if (optimized) {
           ASSERT(function.HasCode());
           // Extract type feedback before the graph is built, as the graph
           // builder uses it to attach it to nodes.
           ASSERT(function.deoptimization_counter() <
                  FLAG_deoptimization_counter_threshold);
-          const Code& unoptimized_code =
-              Code::Handle(function.unoptimized_code());
-          ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+          function.RestoreICDataMap(ic_data_array);
         }
 
         // Build the flow graph.
         FlowGraphBuilder builder(parsed_function,
-                                 ic_data_array,
+                                 *ic_data_array,
                                  NULL,  // NULL = not inlining.
                                  osr_id,
                                  optimized);
@@ -453,7 +451,7 @@
           // We have to perform range analysis after LICM because it
           // optimistically moves CheckSmi through phis into loop preheaders
           // making some phis smi.
-          optimizer.InferSmiRanges();
+          optimizer.InferIntRanges();
           DEBUG_ASSERT(flow_graph->VerifyUseLists());
         }
 
@@ -479,6 +477,7 @@
         optimizer.EliminateEnvironments();
 
         DeadCodeElimination::EliminateDeadPhis(flow_graph);
+        DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         // Attempt to sink allocations of temporary non-escaping objects to
         // the deoptimization path.
@@ -489,6 +488,7 @@
           sinking = new AllocationSinking(flow_graph);
           sinking->Optimize();
         }
+        DEBUG_ASSERT(flow_graph->VerifyUseLists());
 
         // Ensure that all phis inserted by optimization passes have consistent
         // representations.
@@ -574,7 +574,10 @@
             const Field* field = (*flow_graph->guarded_fields())[i];
             field->RegisterDependentCode(code);
           }
-        } else {
+        } else {  // not optimized.
+          if (function.ic_data_array() == Array::null()) {
+            function.SaveICDataMap(graph_compiler.deopt_id_to_ic_data());
+          }
           function.set_unoptimized_code(code);
           function.AttachCode(code);
           ASSERT(CodePatcher::CodeIsPatchable(code));
@@ -608,14 +611,12 @@
           OS::Print("%s\n", error.ToErrorCString());
         }
         done = true;
-        ASSERT(optimized ||
-               (FLAG_warn_on_javascript_compatibility &&
-                FLAG_warning_as_error));
+        ASSERT(optimized);
       }
 
       // Clear the error if it was not a real error, but just a bailout.
       if (error.IsLanguageError() &&
-          (LanguageError::Cast(error).kind() == LanguageError::kBailout)) {
+          (LanguageError::Cast(error).kind() == Report::kBailout)) {
         isolate->object_store()->clear_sticky_error();
       }
       is_compiled = false;
@@ -765,7 +766,7 @@
     TIMERSCOPE(isolate, time_compilation);
     Timer per_compile_timer(FLAG_trace_compiler, "Compilation time");
     per_compile_timer.Start();
-    ParsedFunction* parsed_function = new ParsedFunction(
+    ParsedFunction* parsed_function = new(isolate) ParsedFunction(
         isolate, Function::ZoneHandle(isolate, function.raw()));
     if (FLAG_trace_compiler) {
       OS::Print("Compiling %s%sfunction: '%s' @ token %" Pd ", size %" Pd "\n",
@@ -796,14 +797,7 @@
         function.SetIsOptimizable(false);
         return Error::null();
       }
-      // So far, the only possible real error is a JS warning reported as error.
-      ASSERT(FLAG_warn_on_javascript_compatibility && FLAG_warning_as_error);
-      Error& error = Error::Handle();
-      // We got an error during compilation.
-      error = isolate->object_store()->sticky_error();
-      ASSERT(!error.IsNull());
-      isolate->object_store()->clear_sticky_error();
-      return error.raw();
+      UNREACHABLE();
     }
 
     per_compile_timer.Stop();
diff --git a/runtime/vm/constants_x64.h b/runtime/vm/constants_x64.h
index f5e76ef..7874083 100644
--- a/runtime/vm/constants_x64.h
+++ b/runtime/vm/constants_x64.h
@@ -138,6 +138,62 @@
   NOT_CARRY     = ABOVE_EQUAL
 };
 
+#define R(reg) (1 << (reg))
+
+#if defined(_WIN64)
+class CallingConventions {
+ public:
+  static const Register kArg1Reg = RCX;
+  static const Register kArg2Reg = RDX;
+  static const Register kArg3Reg = R8;
+  static const Register kArg4Reg = R9;
+  static const intptr_t kShadowSpaceBytes = 4 * kWordSize;
+
+  static const intptr_t kVolatileCpuRegisters =
+      R(RAX) | R(RCX) | R(RDX) | R(R8) | R(R9) | R(R10) | R(R11);
+
+  static const intptr_t kVolatileXmmRegisters =
+      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) | R(XMM5);
+
+  static const intptr_t kCalleeSaveCpuRegisters =
+      R(RBX) | R(RSI) | R(RDI) | R(R12) | R(R13) | R(R14) | R(R15);
+
+  static const intptr_t kCalleeSaveXmmRegisters =
+      R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) | R(XMM10) | R(XMM11) | R(XMM12) |
+      R(XMM13) | R(XMM14) | R(XMM15);
+
+  // Windows x64 ABI specifies that small objects are passed in registers.
+  // Otherwise they are passed by reference.
+  static const size_t kRegisterTransferLimit = 16;
+};
+#else
+class CallingConventions {
+ public:
+  static const Register kArg1Reg = RDI;
+  static const Register kArg2Reg = RSI;
+  static const Register kArg3Reg = RDX;
+  static const Register kArg4Reg = RCX;
+  static const Register kArg5Reg = R8;
+  static const Register kArg6Reg = R9;
+  static const intptr_t kShadowSpaceBytes = 0;
+
+  static const intptr_t kVolatileCpuRegisters =
+      R(RAX) | R(RCX) | R(RDX) | R(RSI) | R(RDI) |
+      R(R8) | R(R9) | R(R10) | R(R11);
+
+  static const intptr_t kVolatileXmmRegisters =
+      R(XMM0) | R(XMM1) | R(XMM2) | R(XMM3) | R(XMM4) |
+      R(XMM5) | R(XMM6) | R(XMM7) | R(XMM8) | R(XMM9) |
+      R(XMM10) | R(XMM11) | R(XMM12) | R(XMM13) | R(XMM14) | R(XMM15);
+
+  static const intptr_t kCalleeSaveCpuRegisters =
+      R(RBX) | R(R12) | R(R13) | R(R14) | R(R15);
+
+  static const intptr_t kCalleeSaveXmmRegisters = 0;
+};
+#endif
+
+#undef R
 
 class Instr {
  public:
diff --git a/runtime/vm/counters.cc b/runtime/vm/counters.cc
new file mode 100644
index 0000000..7e43d9a
--- /dev/null
+++ b/runtime/vm/counters.cc
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#include "vm/counters.h"
+
+#include <string.h>
+#include <map>  // TODO(koda): Remove STL dependencies.
+
+#include "platform/globals.h"
+#include "vm/os.h"
+
+namespace dart {
+
+struct CStrLess {
+  bool operator()(const char* a, const char* b) const {
+    return strcmp(a, b) < 0;
+  }
+};
+
+
+Counters::~Counters() {
+  if (collision_) {
+    OS::PrintErr("Counters table collision; increase Counters::kSize.");
+    return;
+  }
+  typedef std::map<const char*, int64_t, CStrLess> TotalsMap;
+  TotalsMap totals;
+  for (int i = 0; i < kSize; ++i) {
+    const Counter& counter = counters_[i];
+    if (counter.name != NULL) {
+      totals[counter.name] += counter.value;
+    }
+  }
+  for (TotalsMap::iterator it = totals.begin(); it != totals.end(); ++it) {
+    OS::PrintErr("%s: %" Pd64 "\n", it->first, it->second);
+  }
+}
+
+}  // namespace dart
diff --git a/runtime/vm/counters.h b/runtime/vm/counters.h
new file mode 100644
index 0000000..ee79b69
--- /dev/null
+++ b/runtime/vm/counters.h
@@ -0,0 +1,51 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_COUNTERS_H_
+#define VM_COUNTERS_H_
+
+#include "platform/assert.h"
+
+namespace dart {
+
+struct Counter {
+  Counter() : name(NULL), value(0) {}
+  const char* name;
+  int64_t value;
+};
+
+
+// Light-weight stats counters for temporary experiments/debugging.
+// A single statement is enough to add a counter:
+//   ...
+//   Isolate::Current()->counters()->Increment("allocated", size_in_bytes);
+//   ...
+class Counters {
+ public:
+  Counters() : collision_(false) {}
+
+  // Adds 'delta' to the named counter. 'name' must be a literal string.
+  void Increment(const char* name, int64_t delta) {
+    Counter& counter =
+      counters_[reinterpret_cast<uword>(name) & (kSize - 1)];
+    if (counter.name != name && counter.name != NULL) {
+      collision_ = true;
+    }
+    counter.name = name;
+    counter.value += delta;
+  }
+
+  // Prints all counters to stderr.
+  ~Counters();
+
+ private:
+  enum { kSize = 1024 };
+  COMPILE_ASSERT((0 == (kSize & (kSize - 1))));  // kSize is a power of 2.
+  Counter counters_[kSize];
+  bool collision_;
+};
+
+}  // namespace dart
+
+#endif  // VM_COUNTERS_H_
diff --git a/runtime/vm/coverage.cc b/runtime/vm/coverage.cc
index 0ea8bda..3d546a5 100644
--- a/runtime/vm/coverage.cc
+++ b/runtime/vm/coverage.cc
@@ -18,8 +18,38 @@
             "Enable writing coverage data into specified directory.");
 
 
+// map[token_pos] -> line-number.
+static void ComputeTokenPosToLineNumberMap(const Script& script,
+                                           GrowableArray<intptr_t>* map) {
+  const TokenStream& tkns = TokenStream::Handle(script.tokens());
+  const intptr_t len = ExternalTypedData::Handle(tkns.GetStream()).Length();
+  map->SetLength(len);
+#if defined(DEBUG)
+  for (intptr_t i = 0; i < len; i++) {
+    (*map)[i] = -1;
+  }
+#endif
+  TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
+  intptr_t cur_line = script.line_offset() + 1;
+  while (tkit.CurrentTokenKind() != Token::kEOS) {
+    (*map)[tkit.CurrentPosition()] = cur_line;
+    if (tkit.CurrentTokenKind() == Token::kNEWLINE) {
+      cur_line++;
+    }
+    tkit.Advance();
+  }
+}
+
+
+static inline void PrintJSONPreamble(JSONObject* jsobj) {
+  jsobj->AddProperty("type", "CodeCoverage");
+  jsobj->AddProperty("id", "coverage");
+}
+
+
 void CodeCoverage::CompileAndAdd(const Function& function,
-                                 const JSONArray& hits_arr) {
+                                 const JSONArray& hits_arr,
+                                 const GrowableArray<intptr_t>& pos_to_line) {
   Isolate* isolate = Isolate::Current();
   if (!function.HasCode()) {
     // If the function should not be compiled or if the compilation failed,
@@ -33,26 +63,28 @@
       // TODO(iposva): This can arise if we attempt to compile an inner function
       // before we have compiled its enclosing function or if the enclosing
       // function failed to compile.
-      OS::Print("### Coverage skipped compiling: %s\n", function.ToCString());
       return;
     }
     const Error& err = Error::Handle(
         isolate, Compiler::CompileFunction(isolate, function));
     if (!err.IsNull()) {
-      OS::Print("### Coverage failed compiling:\n%s\n", err.ToErrorCString());
       return;
     }
   }
   ASSERT(function.HasCode());
 
   // Print the hit counts for all IC datas.
-  const Script& script = Script::Handle(function.script());
+  ZoneGrowableArray<const ICData*>* ic_data_array =
+      new(isolate) ZoneGrowableArray<const ICData*>();
+  function.RestoreICDataMap(ic_data_array);
   const Code& code = Code::Handle(function.unoptimized_code());
-  const Array& ic_array = Array::Handle(code.ExtractTypeFeedbackArray());
   const PcDescriptors& descriptors = PcDescriptors::Handle(
       code.pc_descriptors());
-  ICData& ic_data = ICData::Handle();
 
+  const intptr_t begin_pos = function.token_pos();
+  const intptr_t end_pos = function.end_token_pos();
+  intptr_t last_line = -1;
+  intptr_t last_count = 0;
   for (int j = 0; j < descriptors.Length(); j++) {
     HANDLESCOPE(isolate);
     PcDescriptors::Kind kind = descriptors.DescriptorKind(j);
@@ -60,35 +92,71 @@
     if ((kind == PcDescriptors::kIcCall) ||
         (kind == PcDescriptors::kUnoptStaticCall)) {
       intptr_t deopt_id = descriptors.DeoptId(j);
-      ic_data ^= ic_array.At(deopt_id);
-      if (!ic_data.IsNull()) {
+      const ICData* ic_data= (*ic_data_array)[deopt_id];
+      if (!ic_data->IsNull()) {
         intptr_t token_pos = descriptors.TokenPos(j);
-        intptr_t line = -1;
-        script.GetTokenLocation(token_pos, &line, NULL);
-        hits_arr.AddValue(line);
-        hits_arr.AddValue(ic_data.AggregateCount());
+        // Filter out descriptors that do not map to tokens in the source code.
+        if (token_pos < begin_pos ||
+            token_pos > end_pos) {
+          continue;
+        }
+        intptr_t line = pos_to_line[token_pos];
+#if defined(DEBUG)
+        const Script& script = Script::Handle(function.script());
+        intptr_t test_line = -1;
+        script.GetTokenLocation(token_pos, &test_line, NULL);
+        ASSERT(test_line == line);
+#endif
+        // Merge hit data where possible.
+        if (last_line == line) {
+          last_count += ic_data->AggregateCount();
+        } else {
+          if (last_line != -1) {
+            hits_arr.AddValue(last_line);
+            hits_arr.AddValue(last_count);
+          }
+          last_count = ic_data->AggregateCount();
+          last_line = line;
+        }
       }
     }
   }
+  // Write last hit value if needed.
+  if (last_line != -1) {
+    hits_arr.AddValue(last_line);
+    hits_arr.AddValue(last_count);
+  }
 }
 
 
-void CodeCoverage::PrintClass(const Class& cls, const JSONArray& jsarr) {
+void CodeCoverage::PrintClass(const Class& cls,
+                              const JSONArray& jsarr,
+                              const Script& script_filter) {
   Isolate* isolate = Isolate::Current();
+  if (cls.EnsureIsFinalized(isolate) != Error::null()) {
+    // Only classes that have been finalized do have a meaningful list of
+    // functions.
+    return;
+  }
   Array& functions = Array::Handle(cls.functions());
   ASSERT(!functions.IsNull());
   Function& function = Function::Handle();
   Script& script = Script::Handle();
   String& saved_url = String::Handle();
   String& url = String::Handle();
-
+  GrowableArray<intptr_t> pos_to_line;
   int i = 0;
   while (i < functions.Length()) {
     HANDLESCOPE(isolate);
     function ^= functions.At(i);
-    JSONObject jsobj(&jsarr);
     script = function.script();
+    if (!script_filter.IsNull() && script_filter.raw() != script.raw()) {
+      i++;
+      continue;
+    }
     saved_url = script.url();
+    ComputeTokenPosToLineNumberMap(script, &pos_to_line);
+    JSONObject jsobj(&jsarr);
     jsobj.AddProperty("source", saved_url.ToCString());
     jsobj.AddProperty("script", script);
     JSONArray hits_arr(&jsobj, "hits");
@@ -100,12 +168,13 @@
       script = function.script();
       url = script.url();
       if (!url.Equals(saved_url)) {
+        pos_to_line.Clear();
         break;
       }
-      CompileAndAdd(function, hits_arr);
+      CompileAndAdd(function, hits_arr, pos_to_line);
       if (function.HasImplicitClosureFunction()) {
         function = function.ImplicitClosureFunction();
-        CompileAndAdd(function, hits_arr);
+        CompileAndAdd(function, hits_arr, pos_to_line);
       }
       i++;
     }
@@ -115,14 +184,20 @@
       GrowableObjectArray::Handle(cls.closures());
   if (!closures.IsNull()) {
     i = 0;
+    pos_to_line.Clear();
     // We need to keep rechecking the length of the closures array, as handling
     // a closure potentially adds new entries to the end.
     while (i < closures.Length()) {
       HANDLESCOPE(isolate);
       function ^= closures.At(i);
-      JSONObject jsobj(&jsarr);
       script = function.script();
+      if (!script_filter.IsNull() && script_filter.raw() != script.raw()) {
+        i++;
+        continue;
+      }
       saved_url = script.url();
+      ComputeTokenPosToLineNumberMap(script, &pos_to_line);
+      JSONObject jsobj(&jsarr);
       jsobj.AddProperty("source", saved_url.ToCString());
       jsobj.AddProperty("script", script);
       JSONArray hits_arr(&jsobj, "hits");
@@ -134,9 +209,10 @@
         script = function.script();
         url = script.url();
         if (!url.Equals(saved_url)) {
+          pos_to_line.Clear();
           break;
         }
-        CompileAndAdd(function, hits_arr);
+        CompileAndAdd(function, hits_arr, pos_to_line);
         i++;
       }
     }
@@ -144,6 +220,44 @@
 }
 
 
+void CodeCoverage::PrintJSONForClass(const Class& cls,
+                                     JSONStream* stream) {
+  JSONObject coverage(stream);
+  PrintJSONPreamble(&coverage);
+  {
+    JSONArray jsarr(&coverage, "coverage");
+    PrintClass(cls, jsarr, Script::Handle());
+  }
+}
+
+
+void CodeCoverage::PrintJSONForLibrary(const Library& lib,
+                                       const Script& script_filter,
+                                       JSONStream* stream) {
+  Class& cls = Class::Handle();
+  JSONObject coverage(stream);
+  PrintJSONPreamble(&coverage);
+  {
+    JSONArray jsarr(&coverage, "coverage");
+    ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
+    while (it.HasNext()) {
+      cls = it.GetNextClass();
+      ASSERT(!cls.IsNull());
+      PrintClass(cls, jsarr, script_filter);
+    }
+  }
+}
+
+
+void CodeCoverage::PrintJSONForScript(const Script& script,
+                                      JSONStream* stream) {
+  Library& lib = Library::Handle();
+  lib = script.FindLibrary();
+  ASSERT(!lib.IsNull());
+  PrintJSONForLibrary(lib, script, stream);
+}
+
+
 void CodeCoverage::Write(Isolate* isolate) {
   if (FLAG_coverage_dir == NULL) {
     return;
@@ -191,11 +305,8 @@
       ClassDictionaryIterator it(lib, ClassDictionaryIterator::kIteratePrivate);
       while (it.HasNext()) {
         cls = it.GetNextClass();
-        if (cls.EnsureIsFinalized(isolate) == Error::null()) {
-          // Only classes that have been finalized do have a meaningful list of
-          // functions.
-          PrintClass(cls, jsarr);
-        }
+        ASSERT(!cls.IsNull());
+        PrintClass(cls, jsarr, Script::Handle());
       }
     }
   }
diff --git a/runtime/vm/coverage.h b/runtime/vm/coverage.h
index 4e03c35..72c639a 100644
--- a/runtime/vm/coverage.h
+++ b/runtime/vm/coverage.h
@@ -15,19 +15,31 @@
 // Forward declarations.
 class Class;
 class Function;
+template <typename T> class GrowableArray;
 class Isolate;
 class JSONArray;
 class JSONStream;
+class Library;
+class Script;
+class String;
 
 class CodeCoverage : public AllStatic {
  public:
   static void Write(Isolate* isolate);
   static void PrintJSON(Isolate* isolate, JSONStream* stream);
 
+  static void PrintJSONForScript(const Script& script, JSONStream* stream);
+  static void PrintJSONForLibrary(
+      const Library& lib, const Script& script_filter, JSONStream* stream);
+  static void PrintJSONForClass(const Class& lib, JSONStream* stream);
+
  private:
-  static void PrintClass(const Class& cls, const JSONArray& arr);
+  static void PrintClass(const Class& cls,
+                         const JSONArray& arr,
+                         const Script& script_filter);
   static void CompileAndAdd(const Function& function,
-                            const JSONArray& hits_arr);
+                            const JSONArray& hits_arr,
+                            const GrowableArray<intptr_t>& pos_to_line);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/coverage_test.cc b/runtime/vm/coverage_test.cc
new file mode 100644
index 0000000..7d8e447
--- /dev/null
+++ b/runtime/vm/coverage_test.cc
@@ -0,0 +1,80 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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/coverage.h"
+#include "vm/dart_api_impl.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+static void ExecuteScript(const char* script) {
+  Dart_Handle h_lib = TestCase::LoadTestScript(script, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+}
+
+
+TEST_CASE(Coverage_Empty) {
+  const char* kScript =
+      "main() {\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  ExecuteScript(kScript);
+
+  JSONStream js;
+  CodeCoverage::PrintJSON(isolate, &js);
+
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[]}", js.ToCString());
+}
+
+
+TEST_CASE(Coverage_MainWithClass) {
+  const char* kScript =
+      "class Foo {\n"
+      "  var x;\n"
+      "  Foo(this.x);\n"
+      "  bar() {\n"
+      "    x = x * x;\n"
+      "    x = x / 13;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "  foo.bar();\n"
+      "}\n";
+
+  Isolate* isolate = Isolate::Current();
+  ExecuteScript(kScript);
+
+  JSONStream js;
+  CodeCoverage::PrintJSON(isolate, &js);
+
+  // Coverage data is printed per class, i.e., there should be two sections
+  // for test-lib in the JSON data.
+
+  // Data for the actual class Foo.
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[3,1,5,4,6,3]}", js.ToCString());
+
+  // Data for the fake class containing main().
+  EXPECT_SUBSTRING(
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[10,1,11,1]}", js.ToCString());
+}
+
+}  // namespace dart
diff --git a/runtime/vm/dart.cc b/runtime/vm/dart.cc
index 66e9601..89bbd07 100644
--- a/runtime/vm/dart.cc
+++ b/runtime/vm/dart.cc
@@ -30,11 +30,11 @@
 
 namespace dart {
 
-DEFINE_FLAG(int, new_gen_heap_size, 32, "new gen heap size in MB,"
-            "e.g: --new_gen_heap_size=64 allocates a 64MB new gen heap");
+DEFINE_FLAG(int, new_gen_semi_max_size, (kWordSize <= 4) ? 16 : 32,
+            "Max size of new gen semi space in MB");
 DEFINE_FLAG(int, old_gen_heap_size, Heap::kHeapSizeInMB,
-            "old gen heap size in MB,"
-            "e.g: --old_gen_heap_size=1024 allocates a 1024MB old gen heap");
+            "Max size of old gen heap size in MB,"
+            "e.g: --old_gen_heap_size=1024 allows up to 1024MB old gen heap");
 
 DECLARE_FLAG(bool, print_class_table);
 DECLARE_FLAG(bool, trace_isolates);
@@ -107,6 +107,7 @@
   CodeObservers::InitOnce();
   ThreadInterrupter::InitOnce();
   Profiler::InitOnce();
+  SemiSpace::InitOnce();
 
 #if defined(USING_SIMULATOR)
   Simulator::InitOnce();
@@ -212,7 +213,7 @@
   StackZone zone(isolate);
   HandleScope handle_scope(isolate);
   Heap::Init(isolate,
-             FLAG_new_gen_heap_size * MBInWords,
+             FLAG_new_gen_semi_max_size * MBInWords,
              FLAG_old_gen_heap_size * MBInWords);
   ObjectIdRing::Init(isolate);
   ObjectStore::Init(isolate);
diff --git a/runtime/vm/dart_api_impl.cc b/runtime/vm/dart_api_impl.cc
index e849594..c9895b6 100644
--- a/runtime/vm/dart_api_impl.cc
+++ b/runtime/vm/dart_api_impl.cc
@@ -508,7 +508,7 @@
       if (native_fields == TypedData::null()) {
         *value = 0;
       } else {
-        *value = *bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_);
+        *value = *bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data());
       }
       return true;
     }
@@ -593,7 +593,7 @@
         memset(field_values, 0, (num_fields * sizeof(field_values[0])));
       } else if (num_fields == Smi::Value(native_fields->ptr()->length_)) {
         intptr_t* native_values =
-            bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data_);
+            bit_cast<intptr_t*, uint8_t*>(native_fields->ptr()->data());
         memmove(field_values,
                 native_values,
                 (num_fields * sizeof(field_values[0])));
@@ -947,20 +947,16 @@
     void* peer,
     intptr_t external_allocation_size,
     Dart_WeakPersistentHandleFinalizer callback) {
-  ApiState* state = isolate->api_state();
-  ASSERT(state != NULL);
   REUSABLE_OBJECT_HANDLESCOPE(isolate);
   Object& ref = isolate->ObjectHandle();
   ref = Api::UnwrapHandle(object);
-  FinalizablePersistentHandle* finalizable_ref = is_prologue ?
-      state->prologue_weak_persistent_handles().AllocateHandle() :
-      state->weak_persistent_handles().AllocateHandle();
-
-  finalizable_ref->set_raw(ref);
-  finalizable_ref->set_peer(peer);
-  finalizable_ref->set_callback(callback);
-  finalizable_ref->SetExternalSize(external_allocation_size, isolate);
-  finalizable_ref->SetPrologueWeakPersistent(is_prologue);
+  FinalizablePersistentHandle* finalizable_ref =
+      FinalizablePersistentHandle::New(isolate,
+                                       is_prologue,
+                                       ref,
+                                       peer,
+                                       callback,
+                                       external_allocation_size);
   return finalizable_ref->apiHandle();
 }
 
@@ -1978,7 +1974,7 @@
   // Fast path for Smis.
   Isolate* isolate = Isolate::Current();
   CHECK_ISOLATE(isolate);
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     NOHANDLESCOPE(isolate);
     return Api::NewHandle(isolate, Smi::New(static_cast<intptr_t>(value)));
   }
@@ -2702,7 +2698,7 @@
     state->UnwindScopes(isolate->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
   }
-  Exceptions::Throw(*saved_exception);
+  Exceptions::Throw(isolate, *saved_exception);
   const String& message = String::Handle(
           String::New("Exception was not thrown, internal error"));
   return ApiError::New(message);
@@ -3179,7 +3175,7 @@
     return ext_data;
   }
   Object& result = Object::Handle(isolate);
-  result = GetByteDataConstructor(isolate, Symbols::ByteDataDotview(), 3);
+  result = GetByteDataConstructor(isolate, Symbols::ByteDataDot_view(), 3);
   ASSERT(!result.IsNull());
   ASSERT(result.IsFunction());
   const Function& factory = Function::Cast(result);
@@ -3600,23 +3596,7 @@
 }
 
 
-DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
-  Isolate* isolate = Isolate::Current();
-  DARTSCOPE(isolate);
-  CHECK_CALLBACK_STATE(isolate);
-
-  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
-  // Get the class to instantiate.
-  if (type_obj.IsNull()) {
-    RETURN_TYPE_ERROR(isolate, type, Type);
-  }
-  const Class& cls = Class::Handle(isolate, type_obj.type_class());
-  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
-  if (!error.IsNull()) {
-    // An error occurred, return error object.
-    return Api::NewHandle(isolate, error.raw());
-  }
-
+static RawInstance* AllocateObject(Isolate* isolate, const Class& cls) {
   if (!cls.is_fields_marked_nullable()) {
     // Mark all fields as nullable.
     Class& iterate_cls = Class::Handle(isolate, cls.raw());
@@ -3638,7 +3618,61 @@
   }
 
   // Allocate an object for the given class.
-  return Api::NewHandle(isolate, Instance::New(cls));
+  return Instance::New(cls);
+}
+
+
+DART_EXPORT Dart_Handle Dart_Allocate(Dart_Handle type) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
+  // Get the class to instantiate.
+  if (type_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, type, Type);
+  }
+  const Class& cls = Class::Handle(isolate, type_obj.type_class());
+  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+  if (!error.IsNull()) {
+    // An error occurred, return error object.
+    return Api::NewHandle(isolate, error.raw());
+  }
+  return Api::NewHandle(isolate, AllocateObject(isolate, cls));
+}
+
+
+DART_EXPORT Dart_Handle Dart_AllocateWithNativeFields(
+    Dart_Handle type,
+    intptr_t num_native_fields,
+    const intptr_t* native_fields) {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  const Type& type_obj = Api::UnwrapTypeHandle(isolate, type);
+  // Get the class to instantiate.
+  if (type_obj.IsNull()) {
+    RETURN_TYPE_ERROR(isolate, type, Type);
+  }
+  if (native_fields == NULL) {
+    RETURN_NULL_ERROR(native_fields);
+  }
+  const Class& cls = Class::Handle(isolate, type_obj.type_class());
+  const Error& error = Error::Handle(isolate, cls.EnsureIsFinalized(isolate));
+  if (!error.IsNull()) {
+    // An error occurred, return error object.
+    return Api::NewHandle(isolate, error.raw());
+  }
+  if (num_native_fields != cls.num_native_fields()) {
+    return Api::NewError(
+        "%s: invalid number of native fields %" Pd " passed in, expected %d",
+        CURRENT_FUNC, num_native_fields, cls.num_native_fields());
+  }
+  const Instance& instance = Instance::Handle(isolate,
+                                              AllocateObject(isolate, cls));
+  instance.SetNativeFields(num_native_fields, native_fields);
+  return Api::NewHandle(isolate, instance.raw());
 }
 
 
@@ -4216,7 +4250,7 @@
     state->UnwindScopes(isolate->top_exit_frame_info());
     saved_exception = &Instance::Handle(raw_exception);
   }
-  Exceptions::Throw(*saved_exception);
+  Exceptions::Throw(isolate, *saved_exception);
   return Api::NewError("Exception was not thrown, internal error");
 }
 
@@ -4258,7 +4292,7 @@
     saved_exception = &Instance::Handle(raw_exception);
     saved_stacktrace = &Instance::Handle(raw_stacktrace);
   }
-  Exceptions::ReThrow(*saved_exception, *saved_stacktrace);
+  Exceptions::ReThrow(isolate, *saved_exception, *saved_stacktrace);
   return Api::NewError("Exception was not re thrown, internal error");
 }
 
@@ -4665,7 +4699,7 @@
                                             int64_t retval) {
   NativeArguments* arguments = reinterpret_cast<NativeArguments*>(args);
   ASSERT(arguments->isolate() == Isolate::Current());
-  if (Smi::IsValid64(retval)) {
+  if (Smi::IsValid(retval)) {
     Api::SetSmiReturnValue(arguments, retval);
   } else {
     // Slow path for Mints and Bigints.
@@ -4977,7 +5011,9 @@
   if (library.IsNull()) {
     library = Library::New(url_str);
     library.Register();
-  } else if (!library.LoadNotStarted()) {
+  } else if (library.LoadInProgress() ||
+      library.Loaded() ||
+      library.LoadError()) {
     // The source for this library has either been loaded or is in the
     // process of loading.  Return an error.
     return Api::NewError("%s: library '%s' has already been loaded.",
@@ -4992,8 +5028,8 @@
     return result;
   }
 
-  // If this is the dart:builtin library, register it with the VM.
-  if (url_str.Equals("dart:builtin")) {
+  // If this is the dart:_builtin library, register it with the VM.
+  if (url_str.Equals("dart:_builtin")) {
     isolate->object_store()->set_builtin_library(library);
     Dart_Handle state = Api::CheckIsolateState(isolate);
     if (::Dart_IsError(state)) {
@@ -5039,7 +5075,8 @@
     if (!library_prefix.IsNull()) {
       library_prefix.AddImport(import_ns);
     } else {
-      library_prefix = LibraryPrefix::New(prefix_symbol, import_ns, false);
+      library_prefix =
+          LibraryPrefix::New(prefix_symbol, import_ns, false, library_vm);
       library_vm.AddObject(library_prefix, prefix_symbol);
     }
   }
@@ -5107,6 +5144,37 @@
 }
 
 
+// Finalizes classes and invokes Dart core library function that completes
+// futures of loadLibrary calls (deferred library loading).
+DART_EXPORT Dart_Handle Dart_FinalizeLoading() {
+  Isolate* isolate = Isolate::Current();
+  DARTSCOPE(isolate);
+  CHECK_CALLBACK_STATE(isolate);
+
+  // Finalize all classes if needed.
+  Dart_Handle state = Api::CheckIsolateState(isolate);
+  if (::Dart_IsError(state)) {
+    return state;
+  }
+
+  const Library& corelib = Library::Handle(isolate, Library::CoreLibrary());
+  const String& function_name =
+      String::Handle(isolate, String::New("_completeDeferredLoads"));
+  const Function& function =
+      Function::Handle(isolate,
+                       corelib.LookupFunctionAllowPrivate(function_name));
+  ASSERT(!function.IsNull());
+  const Array& args = Array::empty_array();
+
+  const Object& res =
+      Object::Handle(isolate, DartEntry::InvokeFunction(function, args));
+  if (res.IsError() || res.IsUnhandledException()) {
+    return Api::NewHandle(isolate, res.raw());
+  }
+  return Api::Success();
+}
+
+
 DART_EXPORT Dart_Handle Dart_SetNativeResolver(
     Dart_Handle library,
     Dart_NativeEntryResolver resolver,
diff --git a/runtime/vm/dart_api_impl_test.cc b/runtime/vm/dart_api_impl_test.cc
index 40fdf74..648b642 100644
--- a/runtime/vm/dart_api_impl_test.cc
+++ b/runtime/vm/dart_api_impl_test.cc
@@ -534,7 +534,7 @@
   Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
   Dart_Handle abc = NewString("abc");
   Dart_Handle abc_again = NewString("abc");
-  Dart_Handle xyz = NewString("abc");
+  Dart_Handle xyz = NewString("xyz");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
@@ -585,7 +585,7 @@
   Dart_Handle mint_again = Dart_NewInteger(0xFFFFFFFF);
   Dart_Handle abc = NewString("abc");
   // Dart_Handle abc_again = NewString("abc");
-  Dart_Handle xyz = NewString("abc");
+  Dart_Handle xyz = NewString("xyz");
   Dart_Handle dart_core = NewString("dart:core");
   Dart_Handle dart_mirrors = NewString("dart:mirrors");
 
@@ -5316,12 +5316,17 @@
   EXPECT_VALID(type);
 
   // Allocate without a constructor.
-  Dart_Handle obj = Dart_Allocate(type);
+  const int num_native_fields = 2;
+  const intptr_t native_fields[] = {
+    kNativeArgumentNativeField1Value,
+    kNativeArgumentNativeField2Value
+  };
+  // Allocate and Setup native fields.
+  Dart_Handle obj = Dart_AllocateWithNativeFields(type,
+                                                  num_native_fields,
+                                                  native_fields);
   EXPECT_VALID(obj);
 
-  // Setup native fields.
-  Dart_SetNativeInstanceField(obj, 0, kNativeArgumentNativeField1Value);
-  Dart_SetNativeInstanceField(obj, 1, kNativeArgumentNativeField2Value);
   kNativeArgumentNativeField1Value *= 2;
   kNativeArgumentNativeField2Value *= 2;
   Dart_SetReturnValue(args, obj);
@@ -8236,7 +8241,7 @@
   EXPECT_EQ(40, peer8);
   EXPECT_EQ(41, peer16);
   EXPECT_EQ(42, canonical_str_peer);
-  Isolate::Current()->heap()->CollectGarbage(Heap::kNew);
+  Isolate::Current()->heap()->CollectAllGarbage();
   EXPECT_EQ(80, peer8);
   EXPECT_EQ(82, peer16);
   EXPECT_EQ(42, canonical_str_peer);  // "*" Symbol is not removed on GC.
diff --git a/runtime/vm/dart_api_message.cc b/runtime/vm/dart_api_message.cc
index 1c5f869..1760ae7 100644
--- a/runtime/vm/dart_api_message.cc
+++ b/runtime/vm/dart_api_message.cc
@@ -258,7 +258,7 @@
 Dart_CObject* ApiMessageReader::ReadInlinedObject(intptr_t object_id) {
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   USE(tags);
   intptr_t class_id;
 
@@ -372,7 +372,7 @@
   intptr_t len = Smi::Value(str->ptr()->length_);
   object = AllocateDartCObjectString(len);
   char* p = object->value.as_string;
-  memmove(p, str->ptr()->data_, len);
+  memmove(p, str->ptr()->data(), len);
   p[len] = '\0';
   ASSERT(vm_symbol_references_[symbol_id] == NULL);
   vm_symbol_references_[symbol_id] = object;
@@ -426,7 +426,7 @@
     return value;
   }
 
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   USE(tags);
 
   return ReadInternalVMObject(class_id, object_id);
@@ -782,7 +782,7 @@
 
   // Write out the class and tags information.
   WriteIndexedObject(kArrayCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
 
   // Write out the length field.
   Write<RawObject*>(Smi::New(field_count));
@@ -862,7 +862,7 @@
 
 
 void ApiMessageWriter::WriteSmi(int64_t value) {
-  ASSERT(Smi::IsValid64(value));
+  ASSERT(Smi::IsValid(value));
   Write<RawObject*>(Smi::New(static_cast<intptr_t>(value)));
 }
 
@@ -873,12 +873,12 @@
 
 
 void ApiMessageWriter::WriteMint(Dart_CObject* object, int64_t value) {
-  ASSERT(!Smi::IsValid64(value));
+  ASSERT(!Smi::IsValid(value));
   // Write out the serialization header value for mint object.
   WriteInlinedHeader(object);
   // Write out the class and tags information.
   WriteIndexedObject(kMintCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
   // Write the 64-bit value.
   Write<int64_t>(value);
 }
@@ -886,7 +886,7 @@
 
 void ApiMessageWriter::WriteInt32(Dart_CObject* object) {
   int64_t value = object->value.as_int32;
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     WriteSmi(value);
   } else {
     WriteMint(object, value);
@@ -896,7 +896,7 @@
 
 void ApiMessageWriter::WriteInt64(Dart_CObject* object) {
   int64_t value = object->value.as_int64;
-  if (Smi::IsValid64(value)) {
+  if (Smi::IsValid(value)) {
     WriteSmi(value);
   } else {
     WriteMint(object, value);
@@ -933,7 +933,7 @@
     WriteInlinedHeader(object);
     // Write out the class and tags information.
     WriteIndexedObject(kArrayCid);
-    WriteIntptrValue(0);
+    WriteTags(0);
     // Write out the length information.
     WriteSmi(array_length);
     // Write out the type arguments.
@@ -993,7 +993,7 @@
   WriteInlinedObjectHeader(kMaxPredefinedObjectIds + object_id);
   // Write out the class and tags information.
   WriteIndexedObject(kArrayCid);
-  WriteIntptrValue(0);
+  WriteTags(0);
   // Write out the length information.
   WriteSmi(array_length);
   // Write out the type arguments.
@@ -1038,7 +1038,7 @@
       WriteInlinedHeader(object);
       // Write out the class and tags information.
       WriteIndexedObject(kBigintCid);
-      WriteIntptrValue(0);
+      WriteTags(0);
       // Write hex string length and content
       intptr_t len = strlen(hex_string);
       WriteIntptrValue(len);
@@ -1071,7 +1071,7 @@
       // Write out the class and tags information.
       WriteIndexedObject(type == Utf8::kLatin1 ? kOneByteStringCid
                                                : kTwoByteStringCid);
-      WriteIntptrValue(0);
+      WriteTags(0);
       // Write string length, hash and content
       WriteSmi(len);
       WriteSmi(0);  // TODO(sgjesse): Hash - not written.
@@ -1123,7 +1123,7 @@
       }
 
       WriteIndexedObject(class_id);
-      WriteIntptrValue(RawObject::ClassIdTag::update(class_id, 0));
+      WriteTags(RawObject::ClassIdTag::update(class_id, 0));
       WriteSmi(len);
       uint8_t* bytes = object->value.as_typed_data.values;
       for (intptr_t i = 0; i < len; i++) {
@@ -1141,7 +1141,7 @@
       WriteInlinedHeader(object);
       // Write out the class and tag information.
       WriteIndexedObject(kExternalTypedDataUint8ArrayCid);
-      WriteIntptrValue(RawObject::ClassIdTag::update(
+      WriteTags(RawObject::ClassIdTag::update(
           kExternalTypedDataUint8ArrayCid, 0));
       intptr_t length = object->value.as_external_typed_data.length;
       if (length < 0 ||
@@ -1154,9 +1154,9 @@
       Dart_WeakPersistentHandleFinalizer callback =
           object->value.as_external_typed_data.callback;
       WriteSmi(length);
-      WriteIntptrValue(reinterpret_cast<intptr_t>(data));
-      WriteIntptrValue(reinterpret_cast<intptr_t>(peer));
-      WriteIntptrValue(reinterpret_cast<intptr_t>(callback));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(data));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(peer));
+      WriteRawPointerValue(reinterpret_cast<intptr_t>(callback));
       break;
     }
     default:
diff --git a/runtime/vm/dart_api_state.h b/runtime/vm/dart_api_state.h
index ba1b46b..28eefb9 100644
--- a/runtime/vm/dart_api_state.h
+++ b/runtime/vm/dart_api_state.h
@@ -190,21 +190,22 @@
 // dart API.
 class FinalizablePersistentHandle {
  public:
+  static FinalizablePersistentHandle* New(
+      Isolate* isolate,
+      bool is_prologue,
+      const Object& object,
+      void* peer,
+      Dart_WeakPersistentHandleFinalizer callback,
+      intptr_t external_size);
+
   // Accessors.
   RawObject* raw() const { return raw_; }
-  void set_raw(RawObject* raw) { raw_ = raw; }
-  void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
-  void set_raw(const Object& object) { raw_ = object.raw(); }
   RawObject** raw_addr() { return &raw_; }
   static intptr_t raw_offset() {
     return OFFSET_OF(FinalizablePersistentHandle, raw_);
   }
   void* peer() const { return peer_; }
-  void set_peer(void* peer) { peer_ = peer; }
   Dart_WeakPersistentHandleFinalizer callback() const { return callback_; }
-  void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
-    callback_ = callback;
-  }
   Dart_WeakPersistentHandle apiHandle() {
     return reinterpret_cast<Dart_WeakPersistentHandle>(this);
   }
@@ -300,6 +301,16 @@
     callback_ = NULL;
   }
 
+  void set_raw(RawObject* raw) { raw_ = raw; }
+  void set_raw(const LocalHandle& ref) { raw_ = ref.raw(); }
+  void set_raw(const Object& object) { raw_ = object.raw(); }
+
+  void set_peer(void* peer) { peer_ = peer; }
+
+  void set_callback(Dart_WeakPersistentHandleFinalizer callback) {
+    callback_ = callback;
+  }
+
   intptr_t external_size() const {
     return ExternalSizeBits::decode(external_data_);
   }
@@ -942,6 +953,27 @@
 };
 
 
+inline FinalizablePersistentHandle* FinalizablePersistentHandle::New(
+    Isolate* isolate,
+    bool is_prologue,
+    const Object& object,
+    void* peer,
+    Dart_WeakPersistentHandleFinalizer callback,
+    intptr_t external_size) {
+  ApiState* state = isolate->api_state();
+  ASSERT(state != NULL);
+  FinalizablePersistentHandle* ref = is_prologue ?
+      state->prologue_weak_persistent_handles().AllocateHandle() :
+      state->weak_persistent_handles().AllocateHandle();
+  ref->SetPrologueWeakPersistent(is_prologue);
+  ref->set_raw(object);
+  ref->set_peer(peer);
+  ref->set_callback(callback);
+  // This may trigger GC, so it must be called last.
+  ref->SetExternalSize(external_size, isolate);
+  return ref;
+}
+
 }  // namespace dart
 
 #endif  // VM_DART_API_STATE_H_
diff --git a/runtime/vm/datastream.h b/runtime/vm/datastream.h
index 43e7977..8531ff10 100644
--- a/runtime/vm/datastream.h
+++ b/runtime/vm/datastream.h
@@ -17,7 +17,7 @@
 static const int8_t kByteMask = (1 << kDataBitsPerByte) - 1;
 static const int8_t kMaxUnsignedDataPerByte = kByteMask;
 static const int8_t kMinDataPerByte = -(1 << (kDataBitsPerByte - 1));
-static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask);
+static const int8_t kMaxDataPerByte = (~kMinDataPerByte & kByteMask);  // NOLINT
 static const uint8_t kEndByteMarker = (255 - kMaxDataPerByte);
 static const uint8_t kEndUnsignedByteMarker = (255 - kMaxUnsignedDataPerByte);
 
@@ -51,7 +51,7 @@
   class Raw<2, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int16_t>());
+      return bit_cast<T>(st->Read16());
     }
   };
 
@@ -59,7 +59,7 @@
   class Raw<4, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int32_t>());
+      return bit_cast<T>(st->Read32());
     }
   };
 
@@ -67,7 +67,7 @@
   class Raw<8, T> {
    public:
     static T Read(ReadStream* st) {
-      return bit_cast<T>(st->Read<int64_t>());
+      return bit_cast<T>(st->Read64());
     }
   };
 
@@ -104,10 +104,25 @@
     return Read<T>(kEndByteMarker);
   }
 
+  int16_t Read16() {
+    return Read16(kEndByteMarker);
+  }
+
+  int32_t Read32() {
+    return Read32(kEndByteMarker);
+  }
+
+  int64_t Read64() {
+    return Read64(kEndByteMarker);
+  }
+
   template<typename T>
   T Read(uint8_t end_byte_marker) {
-    uint8_t b = ReadByte();
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
     if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
       return static_cast<T>(b) - end_byte_marker;
     }
     T r = 0;
@@ -115,11 +130,162 @@
     do {
       r |= static_cast<T>(b) << s;
       s += kDataBitsPerByte;
-      b = ReadByte();
+      ASSERT(c < end_);
+      b = *c++;
     } while (b <= kMaxUnsignedDataPerByte);
+    current_ = c;
     return r | ((static_cast<T>(b) - end_byte_marker) << s);
   }
 
+  int16_t Read16(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int16_t>(b) - end_byte_marker;
+    }
+    int16_t r = 0;
+    r |= static_cast<int16_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int16_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int16_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int16_t>(b) - end_byte_marker) << 14);
+  }
+
+  int32_t Read32(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int32_t>(b) - end_byte_marker;
+    }
+
+    int32_t r = 0;
+    r |= static_cast<int32_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int32_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 14);
+    }
+
+    r |= static_cast<int32_t>(b) << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int32_t>(b) - end_byte_marker) << 21);
+    }
+
+    r |= static_cast<int32_t>(b) << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int32_t>(b) - end_byte_marker) << 28);
+  }
+
+  int64_t Read64(uint8_t end_byte_marker) {
+    const uint8_t* c = current_;
+    ASSERT(c < end_);
+    uint8_t b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return static_cast<int64_t>(b) - end_byte_marker;
+    }
+    int64_t r = 0;
+
+    r |= static_cast<int64_t>(b);
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 7);
+    }
+
+    r |= static_cast<int64_t>(b) << 7;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 14);
+    }
+
+    r |= static_cast<int64_t>(b) << 14;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 21);
+    }
+
+    r |= static_cast<int64_t>(b) << 21;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 28);
+    }
+
+    r |= static_cast<int64_t>(b) << 28;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 35);
+    }
+
+    r |= static_cast<int64_t>(b) << 35;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 42);
+    }
+
+    r |= static_cast<int64_t>(b) << 42;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 49);
+    }
+
+    r |= static_cast<int64_t>(b) << 49;
+    ASSERT(c < end_);
+    b = *c++;
+    if (b > kMaxUnsignedDataPerByte) {
+      current_ = c;
+      return r | ((static_cast<int64_t>(b) - end_byte_marker) << 56);
+    }
+
+    r |= static_cast<int64_t>(b) << 56;
+    ASSERT(c < end_);
+    b = *c++;
+    ASSERT(b > kMaxUnsignedDataPerByte);
+    current_ = c;
+    return r | ((static_cast<int64_t>(b) - end_byte_marker) << 63);
+  }
+
   uint8_t ReadByte() {
     ASSERT(current_ < end_);
     return *current_++;
diff --git a/runtime/vm/debugger.cc b/runtime/vm/debugger.cc
index 5802280..41b1f17 100644
--- a/runtime/vm/debugger.cc
+++ b/runtime/vm/debugger.cc
@@ -914,7 +914,6 @@
           (kind == PcDescriptors::kOptStaticCall) ||
           (kind == PcDescriptors::kUnoptStaticCall) ||
           (kind == PcDescriptors::kClosureCall) ||
-          (kind == PcDescriptors::kReturn) ||
           (kind == PcDescriptors::kRuntimeCall));
 }
 
diff --git a/runtime/vm/debugger_arm.cc b/runtime/vm/debugger_arm.cc
index cdb13e7..a345836 100644
--- a/runtime/vm/debugger_arm.cc
+++ b/runtime/vm/debugger_arm.cc
@@ -48,8 +48,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -73,8 +72,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_arm64.cc b/runtime/vm/debugger_arm64.cc
index 94b75e1..1288643 100644
--- a/runtime/vm/debugger_arm64.cc
+++ b/runtime/vm/debugger_arm64.cc
@@ -55,8 +55,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset & 0x7) == 0));
         saved_value_ = static_cast<uword>(offset);
@@ -84,8 +83,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/debugger_ia32.cc b/runtime/vm/debugger_ia32.cc
index 372a8c1..594113e 100644
--- a/runtime/vm/debugger_ia32.cc
+++ b/runtime/vm/debugger_ia32.cc
@@ -52,8 +52,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -77,8 +76,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_mips.cc b/runtime/vm/debugger_mips.cc
index 54fd4cd..570d4d0 100644
--- a/runtime/vm/debugger_mips.cc
+++ b/runtime/vm/debugger_mips.cc
@@ -48,8 +48,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         saved_value_ = CodePatcher::GetStaticCallTargetAt(pc_, code);
         CodePatcher::PatchStaticCallAt(pc_, code,
                                        StubCode::BreakpointRuntimeEntryPoint());
@@ -73,8 +72,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::PatchStaticCallAt(pc_, code, saved_value_);
         break;
       }
diff --git a/runtime/vm/debugger_x64.cc b/runtime/vm/debugger_x64.cc
index 33fb63a..171a0b3 100644
--- a/runtime/vm/debugger_x64.cc
+++ b/runtime/vm/debugger_x64.cc
@@ -57,8 +57,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kClosureCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kClosureCall: {
         int32_t offset = CodePatcher::GetPoolOffsetAt(pc_);
         ASSERT((offset > 0) && ((offset % 8) == 7));
         saved_value_ = static_cast<uword>(offset);
@@ -86,8 +85,7 @@
       case PcDescriptors::kIcCall:
       case PcDescriptors::kUnoptStaticCall:
       case PcDescriptors::kClosureCall:
-      case PcDescriptors::kRuntimeCall:
-      case PcDescriptors::kReturn: {
+      case PcDescriptors::kRuntimeCall: {
         CodePatcher::SetPoolOffsetAt(pc_, static_cast<int32_t>(saved_value_));
         break;
       }
diff --git a/runtime/vm/deferred_objects.cc b/runtime/vm/deferred_objects.cc
index 104e7df..d0efc36 100644
--- a/runtime/vm/deferred_objects.cc
+++ b/runtime/vm/deferred_objects.cc
@@ -26,7 +26,7 @@
 
 void DeferredMint::Materialize(DeoptContext* deopt_context) {
   RawMint** mint_slot = reinterpret_cast<RawMint**>(slot());
-  ASSERT(!Smi::IsValid64(value()));
+  ASSERT(!Smi::IsValid(value()));
   Mint& mint = Mint::Handle();
   mint ^= Integer::New(value());
   *mint_slot = mint.raw();
diff --git a/runtime/vm/deopt_instructions.cc b/runtime/vm/deopt_instructions.cc
index f153fb5..2f365fb 100644
--- a/runtime/vm/deopt_instructions.cc
+++ b/runtime/vm/deopt_instructions.cc
@@ -706,7 +706,7 @@
     int32_t hi_value = deopt_context->RegisterValue(hi_reg_);
     int64_t value = Utils::LowHighTo64Bits(lo_value, hi_value);
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
@@ -768,7 +768,7 @@
         deopt_context->GetSourceFrameAddressAt(hi_source_index));
     int64_t value = Utils::LowHighTo64Bits(*lo_source_addr, *hi_source_addr);
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
@@ -847,7 +847,7 @@
       value = Utils::LowHighTo64Bits(slot_value, reg_value);
     }
     *reinterpret_cast<RawSmi**>(dest_addr) = Smi::New(0);
-    if (Smi::IsValid64(value)) {
+    if (Smi::IsValid(value)) {
       *dest_addr = reinterpret_cast<intptr_t>(
           Smi::New(static_cast<intptr_t>(value)));
     } else {
diff --git a/runtime/vm/exceptions.cc b/runtime/vm/exceptions.cc
index 7546f4ef..f927af1 100644
--- a/runtime/vm/exceptions.cc
+++ b/runtime/vm/exceptions.cc
@@ -34,11 +34,6 @@
             "Prints a stack trace everytime a throw occurs.");
 DEFINE_FLAG(bool, verbose_stacktrace, false,
     "Stack traces will include methods marked invisible.");
-DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
-            "Maximal number of stack frames to print after a runtime warning.");
-DECLARE_FLAG(bool, silent_warnings);
-DECLARE_FLAG(bool, warning_as_error);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 
 const char* Exceptions::kCastErrorDstName = "type cast";
@@ -163,7 +158,7 @@
 }
 
 
-static void BuildStackTrace(StacktraceBuilder* builder) {
+static void BuildStackTrace(Isolate* isolate, StacktraceBuilder* builder) {
   StackFrameIterator frames(StackFrameIterator::kDontValidateFrames);
   StackFrame* frame = frames.NextFrame();
   ASSERT(frame != NULL);  // We expect to find a dart invocation frame.
@@ -181,7 +176,8 @@
         bool is_catch_all = false;
         uword handler_pc = kUwordMax;
         if (!handler_pc_set &&
-            frame->FindExceptionHandler(&handler_pc,
+            frame->FindExceptionHandler(isolate,
+                                        &handler_pc,
                                         &needs_stacktrace,
                                         &is_catch_all)) {
           handler_pc_set = true;
@@ -210,7 +206,8 @@
 // exception handler. Once found, set the pc, sp and fp so that execution
 // can continue in that frame. Sets 'needs_stacktrace' if there is no
 // cath-all handler or if a stack-trace is specified in the catch.
-static bool FindExceptionHandler(uword* handler_pc,
+static bool FindExceptionHandler(Isolate* isolate,
+                                 uword* handler_pc,
                                  uword* handler_sp,
                                  uword* handler_fp,
                                  bool* needs_stacktrace) {
@@ -223,7 +220,8 @@
   uword temp_handler_pc = kUwordMax;
   while (!frame->IsEntryFrame()) {
     if (frame->IsDartFrame()) {
-      if (frame->FindExceptionHandler(&temp_handler_pc,
+      if (frame->FindExceptionHandler(isolate,
+                                      &temp_handler_pc,
                                       needs_stacktrace,
                                       &is_catch_all)) {
         if (!handler_pc_set) {
@@ -270,7 +268,8 @@
 }
 
 
-static void JumpToExceptionHandler(uword program_counter,
+static void JumpToExceptionHandler(Isolate* isolate,
+                                   uword program_counter,
                                    uword stack_pointer,
                                    uword frame_pointer,
                                    const Object& exception_object,
@@ -280,7 +279,6 @@
   NoGCScope no_gc;
   RawObject* raw_exception = exception_object.raw();
   RawObject* raw_stacktrace = stacktrace_object.raw();
-  Isolate* isolate = Isolate::Current();
 
 #if defined(USING_SIMULATOR)
   // Unwinding of the C++ frames and destroying of their stack resources is done
@@ -356,7 +354,7 @@
 RawStacktrace* Exceptions::CurrentStacktrace() {
   Isolate* isolate = Isolate::Current();
   RegularStacktraceBuilder frame_builder(true);
-  BuildStackTrace(&frame_builder);
+  BuildStackTrace(isolate, &frame_builder);
 
   // Create arrays for code and pc_offset tuples of each frame.
   const Array& full_code_array = Array::Handle(isolate,
@@ -375,10 +373,11 @@
 }
 
 
-static void ThrowExceptionHelper(const Instance& incoming_exception,
-                                 const Instance& existing_stacktrace) {
+static void ThrowExceptionHelper(Isolate* isolate,
+                                 const Instance& incoming_exception,
+                                 const Instance& existing_stacktrace,
+                                 const bool is_rethrow) {
   bool use_preallocated_stacktrace = false;
-  Isolate* isolate = Isolate::Current();
   Instance& exception = Instance::Handle(isolate, incoming_exception.raw());
   if (exception.IsNull()) {
     exception ^= Exceptions::Create(Exceptions::kNullThrown,
@@ -396,56 +395,64 @@
   if (use_preallocated_stacktrace) {
     stacktrace ^= isolate->object_store()->preallocated_stack_trace();
     PreallocatedStacktraceBuilder frame_builder(stacktrace);
-    handler_exists = FindExceptionHandler(&handler_pc,
+    handler_exists = FindExceptionHandler(isolate,
+                                          &handler_pc,
                                           &handler_sp,
                                           &handler_fp,
                                           &handler_needs_stacktrace);
     if (handler_needs_stacktrace) {
-      BuildStackTrace(&frame_builder);
+      BuildStackTrace(isolate, &frame_builder);
     }
   } else {
     // Get stacktrace field of class Error.
     const Field& stacktrace_field =
         Field::Handle(isolate, LookupStacktraceField(exception));
-    handler_exists = FindExceptionHandler(&handler_pc,
+    handler_exists = FindExceptionHandler(isolate,
+                                          &handler_pc,
                                           &handler_sp,
                                           &handler_fp,
                                           &handler_needs_stacktrace);
-    Array& code_array = Array::Handle(isolate, Object::empty_array().raw());
-    Array& pc_offset_array =
-        Array::Handle(isolate, Object::empty_array().raw());
-    // If we have an error with a stacktrace field then collect the full stack
-    // trace and store it into the field.
-    if (!stacktrace_field.IsNull()) {
-      if (exception.GetField(stacktrace_field) == Object::null()) {
-        // This is an error object and we need to capture the full stack trace
-        // here implicitly, so we set up the stack trace. The stack trace field
-        // is set only once, it is not overriden.
-        const Stacktrace& full_stacktrace =
-            Stacktrace::Handle(isolate, Exceptions::CurrentStacktrace());
-        exception.SetField(stacktrace_field, full_stacktrace);
+    if (!stacktrace_field.IsNull() || handler_needs_stacktrace) {
+      Array& code_array = Array::Handle(isolate, Object::empty_array().raw());
+      Array& pc_offset_array =
+          Array::Handle(isolate, Object::empty_array().raw());
+      // If we have an error with a stacktrace field then collect the full stack
+      // trace and store it into the field.
+      if (!stacktrace_field.IsNull()) {
+        if (exception.GetField(stacktrace_field) == Object::null()) {
+          // This is an error object and we need to capture the full stack trace
+          // here implicitly, so we set up the stack trace. The stack trace
+          // field is set only once, it is not overriden.
+          const Stacktrace& full_stacktrace =
+              Stacktrace::Handle(isolate, Exceptions::CurrentStacktrace());
+          exception.SetField(stacktrace_field, full_stacktrace);
+        }
       }
-    }
-    if (handler_needs_stacktrace) {
-      RegularStacktraceBuilder frame_builder(false);
-      BuildStackTrace(&frame_builder);
+      if (handler_needs_stacktrace) {
+        RegularStacktraceBuilder frame_builder(false);
+        BuildStackTrace(isolate, &frame_builder);
 
-      // Create arrays for code and pc_offset tuples of each frame.
-      code_array = Array::MakeArray(frame_builder.code_list());
-      pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list());
-    }
-    if (existing_stacktrace.IsNull()) {
-      stacktrace = Stacktrace::New(code_array, pc_offset_array);
-    } else {
-      stacktrace ^= existing_stacktrace.raw();
-      if (pc_offset_array.Length() != 0) {
-        stacktrace.Append(code_array, pc_offset_array);
+        // Create arrays for code and pc_offset tuples of each frame.
+        code_array = Array::MakeArray(frame_builder.code_list());
+        pc_offset_array = Array::MakeArray(frame_builder.pc_offset_list());
       }
-      // Since we are re throwing and appending to the existing stack trace
-      // we clear out the catch trace collected in the existing stack trace
-      // as that trace will not be valid anymore.
-      stacktrace.SetCatchStacktrace(Object::empty_array(),
-                                    Object::empty_array());
+      if (existing_stacktrace.IsNull()) {
+        stacktrace = Stacktrace::New(code_array, pc_offset_array);
+      } else {
+        ASSERT(is_rethrow);
+        stacktrace ^= existing_stacktrace.raw();
+        if (pc_offset_array.Length() != 0) {
+          // Skip the first frame during a rethrow. This is the catch clause
+          // with the rethrow statement, which is not part of the original
+          // trace a rethrow is supposed to preserve.
+          stacktrace.Append(code_array, pc_offset_array, 1);
+        }
+        // Since we are re throwing and appending to the existing stack trace
+        // we clear out the catch trace collected in the existing stack trace
+        // as that trace will not be valid anymore.
+        stacktrace.SetCatchStacktrace(Object::empty_array(),
+                                      Object::empty_array());
+      }
     }
   }
   // We expect to find a handler_pc, if the exception is unhandled
@@ -460,7 +467,8 @@
   }
   if (handler_exists) {
     // Found a dart handler for the exception, jump to it.
-    JumpToExceptionHandler(handler_pc,
+    JumpToExceptionHandler(isolate,
+                           handler_pc,
                            handler_sp,
                            handler_fp,
                            exception,
@@ -474,9 +482,10 @@
     // dart invocation sequence above it, print diagnostics and terminate
     // the isolate etc.).
     const UnhandledException& unhandled_exception = UnhandledException::Handle(
-        UnhandledException::New(exception, stacktrace));
+        isolate, UnhandledException::New(exception, stacktrace));
     stacktrace = Stacktrace::null();
-    JumpToExceptionHandler(handler_pc,
+    JumpToExceptionHandler(isolate,
+                           handler_pc,
                            handler_sp,
                            handler_fp,
                            unhandled_exception,
@@ -569,30 +578,31 @@
 }
 
 
-void Exceptions::Throw(const Instance& exception) {
-  Isolate* isolate = Isolate::Current();
+void Exceptions::Throw(Isolate* isolate, const Instance& exception) {
   isolate->debugger()->SignalExceptionThrown(exception);
   // Null object is a valid exception object.
-  ThrowExceptionHelper(exception, Instance::Handle(isolate));
+  ThrowExceptionHelper(isolate, exception, Instance::Handle(isolate), false);
 }
 
 
-void Exceptions::ReThrow(const Instance& exception,
+void Exceptions::ReThrow(Isolate* isolate,
+                         const Instance& exception,
                          const Instance& stacktrace) {
   // Null object is a valid exception object.
-  ThrowExceptionHelper(exception, stacktrace);
+  ThrowExceptionHelper(isolate, exception, stacktrace, true);
 }
 
 
 void Exceptions::PropagateError(const Error& error) {
-  ASSERT(Isolate::Current()->top_exit_frame_info() != 0);
+  Isolate* isolate = Isolate::Current();
+  ASSERT(isolate->top_exit_frame_info() != 0);
   if (error.IsUnhandledException()) {
     // If the error object represents an unhandled exception, then
     // rethrow the exception in the normal fashion.
     const UnhandledException& uhe = UnhandledException::Cast(error);
-    const Instance& exc = Instance::Handle(uhe.exception());
-    const Instance& stk = Instance::Handle(uhe.stacktrace());
-    Exceptions::ReThrow(exc, stk);
+    const Instance& exc = Instance::Handle(isolate, uhe.exception());
+    const Instance& stk = Instance::Handle(isolate, uhe.stacktrace());
+    Exceptions::ReThrow(isolate, exc, stk);
   } else {
     // Return to the invocation stub and return this error object.  The
     // C++ code which invoked this dart sequence can check and do the
@@ -601,22 +611,23 @@
     uword handler_sp = 0;
     uword handler_fp = 0;
     FindErrorHandler(&handler_pc, &handler_sp, &handler_fp);
-    JumpToExceptionHandler(handler_pc, handler_sp, handler_fp, error,
-                           Stacktrace::Handle());  // Null stacktrace.
+    JumpToExceptionHandler(isolate, handler_pc, handler_sp, handler_fp, error,
+                           Stacktrace::Handle(isolate));  // Null stacktrace.
   }
   UNREACHABLE();
 }
 
 
 void Exceptions::ThrowByType(ExceptionType type, const Array& arguments) {
-  const Object& result = Object::Handle(Create(type, arguments));
+  Isolate* isolate = Isolate::Current();
+  const Object& result = Object::Handle(isolate, Create(type, arguments));
   if (result.IsError()) {
     // We got an error while constructing the exception object.
     // Propagate the error instead of throwing the exception.
     PropagateError(Error::Cast(result));
   } else {
     ASSERT(result.IsInstance());
-    Throw(Instance::Cast(result));
+    Throw(isolate, Instance::Cast(result));
   }
 }
 
@@ -625,7 +636,7 @@
   Isolate* isolate = Isolate::Current();
   const Instance& oom = Instance::Handle(
       isolate, isolate->object_store()->out_of_memory());
-  Throw(oom);
+  Throw(isolate, oom);
 }
 
 
@@ -633,7 +644,7 @@
   Isolate* isolate = Isolate::Current();
   const Instance& stack_overflow = Instance::Handle(
       isolate, isolate->object_store()->stack_overflow());
-  Throw(stack_overflow);
+  Throw(isolate, stack_overflow);
 }
 
 
@@ -738,42 +749,11 @@
 
 
 // Throw JavascriptCompatibilityError exception.
-static void ThrowJavascriptCompatibilityError(const char* msg) {
+void Exceptions::ThrowJavascriptCompatibilityError(const char* msg) {
   const Array& exc_args = Array::Handle(Array::New(1));
   const String& msg_str = String::Handle(String::New(msg));
   exc_args.SetAt(0, msg_str);
   Exceptions::ThrowByType(Exceptions::kJavascriptCompatibilityError, exc_args);
 }
 
-
-void Exceptions::JSWarning(StackFrame* caller_frame, const char* format, ...) {
-  ASSERT(caller_frame != NULL);
-  ASSERT(FLAG_warn_on_javascript_compatibility);
-  if (FLAG_silent_warnings) return;
-  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
-  ASSERT(!caller_code.IsNull());
-  const uword caller_pc = caller_frame->pc();
-  const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
-  const Function& caller = Function::Handle(caller_code.function());
-  const Script& script = Script::Handle(caller.script());
-  va_list args;
-  va_start(args, format);
-  const Error& error = Error::Handle(
-      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
-                                   script, token_pos, LanguageError::kWarning,
-                                   Heap::kNew, format, args));
-  va_end(args);
-  if (FLAG_warning_as_error) {
-    ThrowJavascriptCompatibilityError(error.ToErrorCString());
-  } else {
-    OS::Print("javascript compatibility warning: %s", error.ToErrorCString());
-  }
-  const Stacktrace& stacktrace =
-     Stacktrace::Handle(Exceptions::CurrentStacktrace());
-  intptr_t idx = 0;
-  OS::Print("%s",
-            stacktrace.ToCStringInternal(&idx,
-                                         FLAG_stacktrace_depth_on_warning));
-}
-
 }  // namespace dart
diff --git a/runtime/vm/exceptions.h b/runtime/vm/exceptions.h
index 9549b55..4b3330c 100644
--- a/runtime/vm/exceptions.h
+++ b/runtime/vm/exceptions.h
@@ -6,20 +6,21 @@
 #define VM_EXCEPTIONS_H_
 
 #include "vm/allocation.h"
-#include "vm/growable_array.h"
 
 namespace dart {
 
 // Forward declarations.
+class Array;
 class Class;
 class DartFrameIterator;
 class Error;
 class Instance;
 class Object;
 class RawInstance;
+class RawObject;
 class RawScript;
 class RawStacktrace;
-class RawObject;
+class RawString;
 class Script;
 class StackFrame;
 class String;
@@ -28,19 +29,14 @@
  public:
   static const char* kCastErrorDstName;
 
-  static void Throw(const Instance& exception);
-  static void ReThrow(const Instance& exception, const Instance& stacktrace);
+  static void Throw(Isolate* isolate, const Instance& exception);
+  static void ReThrow(Isolate* isolate,
+                      const Instance& exception,
+                      const Instance& stacktrace);
   static void PropagateError(const Error& error);
 
-  // Report a Javascript compatibility warning at the call site given by
-  // caller_frame. Note that a JavascriptCompatibilityError is thrown
-  // if --warning_as_error is specified.
-  static void JSWarning(StackFrame* caller_frame, const char* format, ...)
-      PRINTF_ATTRIBUTE(2, 3);
-
-  static RawStacktrace* CurrentStacktrace();
-
   // Helpers to create and throw errors.
+  static RawStacktrace* CurrentStacktrace();
   static RawScript* GetCallerScript(DartFrameIterator* iterator);
   static RawInstance* NewInstance(const char* class_name);
   static void CreateAndThrowTypeError(intptr_t location,
@@ -76,6 +72,7 @@
   static void ThrowOOM();
   static void ThrowStackOverflow();
   static void ThrowArgumentError(const Instance& arg);
+  static void ThrowJavascriptCompatibilityError(const char* msg);
 
   // Returns a RawInstance if the exception is successfully created,
   // otherwise returns a RawError.
diff --git a/runtime/vm/flow_graph.cc b/runtime/vm/flow_graph.cc
index c0c74a6..346b219 100644
--- a/runtime/vm/flow_graph.cc
+++ b/runtime/vm/flow_graph.cc
@@ -7,15 +7,14 @@
 #include "vm/bit_vector.h"
 #include "vm/flow_graph_builder.h"
 #include "vm/intermediate_language.h"
-#include "vm/longjump.h"
 #include "vm/growable_array.h"
+#include "vm/report.h"
 
 namespace dart {
 
 DECLARE_FLAG(bool, reorder_basic_blocks);
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, verify_compiler);
-DEFINE_FLAG(bool, optimize_try_catch, true, "Optimization of try-catch");
 
 
 FlowGraph::FlowGraph(const FlowGraphBuilder& builder,
@@ -181,9 +180,7 @@
 }
 
 
-#ifdef DEBUG
 // Debugging code to verify the construction of use lists.
-
 static intptr_t MembershipCount(Value* use, Value* list) {
   intptr_t count = 0;
   while (list != NULL) {
@@ -281,7 +278,6 @@
   }
   return true;  // Return true so we can ASSERT validation.
 }
-#endif  // DEBUG
 
 
 LivenessAnalysis::LivenessAnalysis(
@@ -718,9 +714,6 @@
                        VariableLivenessAnalysis* variable_liveness,
                        ZoneGrowableArray<Definition*>* inlining_parameters) {
   GraphEntryInstr* entry = graph_entry();
-  if (!FLAG_optimize_try_catch && (entry->SuccessorCount() > 1)) {
-    Bailout("Catch-entry support in SSA.");
-  }
 
   // Initial renaming environment.
   GrowableArray<Definition*> env(variable_count());
@@ -1000,6 +993,35 @@
 
 
 void FlowGraph::RemoveDeadPhis(GrowableArray<PhiInstr*>* live_phis) {
+  // Augment live_phis with those that have implicit real used at
+  // potentially throwing instructions if there is a try-catch in this graph.
+  if (graph_entry()->SuccessorCount() > 1) {
+    for (BlockIterator it(postorder_iterator()); !it.Done(); it.Advance()) {
+      JoinEntryInstr* join = it.Current()->AsJoinEntry();
+      if (join == NULL) continue;
+      for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
+        PhiInstr* phi = phi_it.Current();
+        if (phi == NULL ||
+            phi->is_alive() ||
+            (phi->input_use_list() != NULL) ||
+            (phi->env_use_list() == NULL)) {
+          continue;
+        }
+        for (Value::Iterator it(phi->env_use_list());
+             !it.Done();
+             it.Advance()) {
+          Value* use = it.Current();
+          if (use->instruction()->MayThrow() &&
+              use->instruction()->GetBlock()->InsideTryBlock()) {
+            live_phis->Add(phi);
+            phi->mark_alive();
+            break;
+          }
+        }
+      }
+    }
+  }
+
   while (!live_phis->is_empty()) {
     PhiInstr* phi = live_phis->RemoveLast();
     for (intptr_t i = 0; i < phi->InputCount(); i++) {
@@ -1014,7 +1036,7 @@
 
   for (BlockIterator it(postorder_iterator()); !it.Done(); it.Advance()) {
     JoinEntryInstr* join = it.Current()->AsJoinEntry();
-    if (join != NULL) join->RemoveDeadPhis(constant_null());
+    if (join != NULL) join->RemoveDeadPhis(constant_dead());
   }
 }
 
@@ -1116,21 +1138,6 @@
 }
 
 
-void FlowGraph::Bailout(const char* reason) const {
-  const Function& function = parsed_function_.function();
-  const Error& error = Error::Handle(
-      LanguageError::NewFormatted(Error::Handle(),  // No previous error.
-                                  Script::Handle(function.script()),
-                                  function.token_pos(),
-                                  LanguageError::kError,
-                                  Heap::kNew,
-                                  "FlowGraph Bailout: %s %s",
-                                  String::Handle(function.name()).ToCString(),
-                                  reason));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
-}
-
-
 intptr_t FlowGraph::InstructionCount() const {
   intptr_t size = 0;
   // Iterate each block, skipping the graph entry.
diff --git a/runtime/vm/flow_graph.h b/runtime/vm/flow_graph.h
index 1868d0a..9ec6871 100644
--- a/runtime/vm/flow_graph.h
+++ b/runtime/vm/flow_graph.h
@@ -154,13 +154,8 @@
   void ComputeSSA(intptr_t next_virtual_register_number,
                   ZoneGrowableArray<Definition*>* inlining_parameters);
 
-  // TODO(zerny): Once the SSA is feature complete this should be removed.
-  void Bailout(const char* reason) const;
-
-#ifdef DEBUG
   // Verification methods for debugging.
   bool VerifyUseLists();
-#endif  // DEBUG
 
   void DiscoverBlocks();
 
diff --git a/runtime/vm/flow_graph_builder.cc b/runtime/vm/flow_graph_builder.cc
index 374ccb4..1c190fa 100644
--- a/runtime/vm/flow_graph_builder.cc
+++ b/runtime/vm/flow_graph_builder.cc
@@ -16,11 +16,11 @@
 #include "vm/il_printer.h"
 #include "vm/intermediate_language.h"
 #include "vm/isolate.h"
-#include "vm/longjump.h"
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/scopes.h"
 #include "vm/stack_frame.h"
@@ -37,14 +37,11 @@
 DEFINE_FLAG(bool, print_scopes, false, "Print scopes of local variables.");
 DEFINE_FLAG(bool, trace_type_check_elimination, false,
             "Trace type check elimination at compile time.");
-DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
-            "Warn on incompatibilities between vm and dart2js.");
 
 DECLARE_FLAG(bool, enable_debugger);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(int, optimization_counter_threshold);
-DECLARE_FLAG(bool, silent_warnings);
-DECLARE_FLAG(bool, warning_as_error);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 // Quick access to the locally defined isolate() method.
 #define I (isolate())
@@ -236,31 +233,32 @@
 }
 
 
-FlowGraphBuilder::FlowGraphBuilder(ParsedFunction* parsed_function,
-                                   const Array& ic_data_array,
-                                   InlineExitCollector* exit_collector,
-                                   intptr_t osr_id,
-                                   bool is_optimizing)
-  : parsed_function_(parsed_function),
-    ic_data_array_(ic_data_array),
-    num_copied_params_(parsed_function->num_copied_params()),
-    // All parameters are copied if any parameter is.
-    num_non_copied_params_((num_copied_params_ == 0)
-        ? parsed_function->function().num_fixed_parameters()
-        : 0),
-    num_stack_locals_(parsed_function->num_stack_locals()),
-    exit_collector_(exit_collector),
-    guarded_fields_(new ZoneGrowableArray<const Field*>()),
-    last_used_block_id_(0),  // 0 is used for the graph entry.
-    try_index_(CatchClauseNode::kInvalidTryIndex),
-    catch_try_index_(CatchClauseNode::kInvalidTryIndex),
-    loop_depth_(0),
-    graph_entry_(NULL),
-    temp_count_(0),
-    args_pushed_(0),
-    nesting_stack_(NULL),
-    osr_id_(osr_id),
-    is_optimizing_(is_optimizing) { }
+FlowGraphBuilder::FlowGraphBuilder(
+    ParsedFunction* parsed_function,
+    const ZoneGrowableArray<const ICData*>& ic_data_array,
+    InlineExitCollector* exit_collector,
+    intptr_t osr_id,
+    bool is_optimizing) :
+        parsed_function_(parsed_function),
+        ic_data_array_(ic_data_array),
+        num_copied_params_(parsed_function->num_copied_params()),
+        // All parameters are copied if any parameter is.
+        num_non_copied_params_((num_copied_params_ == 0)
+            ? parsed_function->function().num_fixed_parameters()
+            : 0),
+        num_stack_locals_(parsed_function->num_stack_locals()),
+        exit_collector_(exit_collector),
+        guarded_fields_(new ZoneGrowableArray<const Field*>()),
+        last_used_block_id_(0),  // 0 is used for the graph entry.
+        try_index_(CatchClauseNode::kInvalidTryIndex),
+        catch_try_index_(CatchClauseNode::kInvalidTryIndex),
+        loop_depth_(0),
+        graph_entry_(NULL),
+        temp_count_(0),
+        args_pushed_(0),
+        nesting_stack_(NULL),
+        osr_id_(osr_id),
+        is_optimizing_(is_optimizing) { }
 
 
 void FlowGraphBuilder::AddCatchEntry(CatchBlockEntryInstr* entry) {
@@ -1012,7 +1010,7 @@
   if ((node->token_pos() != Scanner::kNoSourcePos) &&
       !function.is_native() && FLAG_enable_debugger) {
     AddInstruction(new DebugStepCheckInstr(node->token_pos(),
-                                           PcDescriptors::kReturn));
+                                           PcDescriptors::kRuntimeCall));
   }
 
   if (FLAG_enable_type_checks) {
@@ -1416,16 +1414,10 @@
 }
 
 
-void FlowGraphBuilder::WarnOnJSIntegralNumTypeTest(
+bool FlowGraphBuilder::WarnOnJSIntegralNumTypeTest(
     AstNode* node, const AbstractType& type) const {
-  if (is_optimizing()) {
-    // Warnings for constants are issued when the graph is built for the first
-    // time only, i.e. just before generating unoptimized code.
-    // They should not be repeated when generating optimized code.
-    return;
-  }
   if (!(node->IsLiteralNode() && (type.IsIntType() || type.IsDoubleType()))) {
-    return;
+    return false;
   }
   const Instance& instance = node->AsLiteralNode()->literal();
   if (type.IsIntType()) {
@@ -1433,19 +1425,16 @@
       const Double& double_instance = Double::Cast(instance);
       double value = double_instance.value();
       if (floor(value) == value) {
-        Warning(node->token_pos(),
-                "javascript compatibility warning: integral value of type "
-                "'double' is also considered to be of type 'int'");
+        return true;
       }
     }
   } else {
     ASSERT(type.IsDoubleType());
     if (instance.IsInteger()) {
-      Warning(node->token_pos(),
-              "javascript compatibility warning: integer value is also "
-              "considered to be of type 'double'");
+      return true;
     }
   }
+  return false;
 }
 
 
@@ -1464,12 +1453,6 @@
     ReturnDefinition(new ConstantInstr(Bool::Get(!negate_result)));
     return;
   }
-
-  // Check for javascript compatibility.
-  if (FLAG_warn_on_javascript_compatibility) {
-    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
-  }
-
   ValueGraphVisitor for_left_value(owner());
   node->left()->Visit(&for_left_value);
   Append(for_left_value);
@@ -1514,12 +1497,6 @@
   ASSERT(!node->right()->AsTypeNode()->type().IsNull());
   const AbstractType& type = node->right()->AsTypeNode()->type();
   ASSERT(type.IsFinalized() && !type.IsMalformed() && !type.IsMalbounded());
-
-  // Check for javascript compatibility.
-  if (FLAG_warn_on_javascript_compatibility) {
-    owner()->WarnOnJSIntegralNumTypeTest(node->left(), type);
-  }
-
   ValueGraphVisitor for_value(owner());
   node->left()->Visit(&for_value);
   Append(for_value);
@@ -1529,8 +1506,13 @@
                        for_value.value(),
                        type,
                        dst_name)) {
-    ReturnValue(for_value.value());
-    return;
+    // Check for javascript compatibility.
+    // Do not skip type check if javascript compatibility warning is required.
+    if (!FLAG_warn_on_javascript_compatibility ||
+        !owner()->WarnOnJSIntegralNumTypeTest(node->left(), type)) {
+      ReturnValue(for_value.value());
+      return;
+    }
   }
   PushArgumentInstr* push_left = PushArgument(for_value.value());
   PushArgumentInstr* push_instantiator = NULL;
@@ -3065,10 +3047,11 @@
         load->set_recognized_kind(kind);
         return ReturnDefinition(load);
       }
-      case MethodRecognizer::kObjectCid:
-      case MethodRecognizer::kTypedListBaseCid: {
-        Value* receiver = Bind(BuildLoadThisVar(node->scope()));
-        LoadClassIdInstr* load = new LoadClassIdInstr(receiver);
+      case MethodRecognizer::kClassIDgetID: {
+        LocalVariable* value_var =
+            node->scope()->LookupVariable(Symbols::Value(), true);
+        Value* value = Bind(new LoadLocalInstr(*value_var));
+        LoadClassIdInstr* load = new LoadClassIdInstr(value);
         return ReturnDefinition(load);
       }
       case MethodRecognizer::kGrowableArrayCapacity: {
@@ -3941,12 +3924,9 @@
   ASSERT(!for_effect.is_open());
 
   // When compiling for OSR, use a depth first search to prune instructions
-  // unreachable from the OSR entry.  Catch entries are not (yet) properly
-  // recognized as reachable.
+  // unreachable from the OSR entry. Catch entries are always considered
+  // reachable, even if they become unreachable after OSR.
   if (osr_id_ != Isolate::kNoDeoptId) {
-    if (graph_entry_->SuccessorCount() > 1) {
-      Bailout("try/catch when compiling for OSR");
-    }
     PruneUnreachable();
   }
 
@@ -3964,43 +3944,14 @@
 }
 
 
-void FlowGraphBuilder::Warning(intptr_t token_pos,
-                               const char* format, ...) const {
-  if (FLAG_silent_warnings) return;
-  const Function& function = parsed_function_->function();
-  va_list args;
-  va_start(args, format);
-  const Error& error = Error::Handle(
-      I,
-      LanguageError::NewFormattedV(
-          Error::Handle(I, Error::null()),  // No previous error.
-          Script::Handle(I, function.script()),
-          token_pos, LanguageError::kWarning,
-          Heap::kNew, format, args));
-  va_end(args);
-  if (FLAG_warning_as_error) {
-    I->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
-}
-
-
 void FlowGraphBuilder::Bailout(const char* reason) const {
   const Function& function = parsed_function_->function();
-  const Error& error = Error::Handle(
-      I,
-      LanguageError::NewFormatted(
-          Error::Handle(I, Error::null()),  // No previous error.
-          Script::Handle(I, function.script()),
-          function.token_pos(),
-          LanguageError::kBailout,
-          Heap::kNew,
-          "FlowGraphBuilder Bailout: %s %s",
-          String::Handle(I, function.name()).ToCString(),
-          reason));
-  I->long_jump_base()->Jump(1, error);
+  Report::MessageF(Report::kBailout,
+                   Script::Handle(function.script()),
+                   function.token_pos(),
+                   "FlowGraphBuilder Bailout: %s %s",
+                   String::Handle(function.name()).ToCString(),
+                   reason);
   UNREACHABLE();
 }
 
diff --git a/runtime/vm/flow_graph_builder.h b/runtime/vm/flow_graph_builder.h
index 8467cb5..bbd3c94 100644
--- a/runtime/vm/flow_graph_builder.h
+++ b/runtime/vm/flow_graph_builder.h
@@ -32,21 +32,21 @@
 // (factory-name-symbol, result-cid, fingerprint).
 // TODO(srdjan): Store the values in the snapshot instead.
 #define RECOGNIZED_LIST_FACTORY_LIST(V)                                        \
-  V(_ListFactory, kArrayCid, 176587978)                                        \
-  V(_GrowableListWithData, kGrowableObjectArrayCid, 264792196)                 \
-  V(_GrowableListFactory, kGrowableObjectArrayCid, 1720763678)                 \
-  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 545976988)                      \
-  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 981297074)                    \
-  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 1617830104)     \
-  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 300928419)                    \
-  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 480982704)                  \
-  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 1876611964)                   \
-  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 1811693442)                 \
-  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 958749261)                    \
-  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 767338823)                  \
-  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 1599078532)               \
-  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 1721244151)               \
-  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 879975401)            \
+  V(_ListFactory, kArrayCid, 1595327584)                                       \
+  V(_GrowableListWithData, kGrowableObjectArrayCid, 732923072)                 \
+  V(_GrowableListFactory, kGrowableObjectArrayCid, 1956565810)                 \
+  V(_Int8ArrayFactory, kTypedDataInt8ArrayCid, 1499010120)                     \
+  V(_Uint8ArrayFactory, kTypedDataUint8ArrayCid, 354210806)                    \
+  V(_Uint8ClampedArrayFactory, kTypedDataUint8ClampedArrayCid, 231626935)      \
+  V(_Int16ArrayFactory, kTypedDataInt16ArrayCid, 1044203454)                   \
+  V(_Uint16ArrayFactory, kTypedDataUint16ArrayCid, 616427808)                  \
+  V(_Int32ArrayFactory, kTypedDataInt32ArrayCid, 26656923)                     \
+  V(_Uint32ArrayFactory, kTypedDataUint32ArrayCid, 297463966)                  \
+  V(_Int64ArrayFactory, kTypedDataInt64ArrayCid, 105050331)                    \
+  V(_Uint64ArrayFactory, kTypedDataUint64ArrayCid, 1469861670)                 \
+  V(_Float64ArrayFactory, kTypedDataFloat64ArrayCid, 342242776)                \
+  V(_Float32ArrayFactory, kTypedDataFloat32ArrayCid, 105860920)                \
+  V(_Float32x4ArrayFactory, kTypedDataFloat32x4ArrayCid, 1217848993)           \
 
 
 // Class that recognizes factories and returns corresponding result cid.
@@ -143,7 +143,7 @@
   // The inlining context is NULL if not inlining.  The osr_id is the deopt
   // id of the OSR entry or Isolate::kNoDeoptId if not compiling for OSR.
   FlowGraphBuilder(ParsedFunction* parsed_function,
-                   const Array& ic_data_array,
+                   const ZoneGrowableArray<const ICData*>& ic_data_array,
                    InlineExitCollector* exit_collector,
                    intptr_t osr_id,
                    bool is_optimizing);
@@ -151,14 +151,15 @@
   FlowGraph* BuildGraph();
 
   ParsedFunction* parsed_function() const { return parsed_function_; }
-  const Array& ic_data_array() const { return ic_data_array_; }
+  const ZoneGrowableArray<const ICData*>& ic_data_array() const {
+    return ic_data_array_;
+  }
 
-  void WarnOnJSIntegralNumTypeTest(AstNode* node,
+  // Return true if a Javascript compatibility warning should be emitted at
+  // runtime for this type test.
+  bool WarnOnJSIntegralNumTypeTest(AstNode* node,
                                    const AbstractType& type) const;
 
-  void Warning(intptr_t token_pos, const char* format, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-
   void Bailout(const char* reason) const;
 
   intptr_t AllocateBlockId() { return ++last_used_block_id_; }
@@ -235,7 +236,7 @@
   }
 
   ParsedFunction* parsed_function_;
-  const Array& ic_data_array_;
+  const ZoneGrowableArray<const ICData*>& ic_data_array_;
 
   const intptr_t num_copied_params_;
   const intptr_t num_non_copied_params_;
diff --git a/runtime/vm/flow_graph_compiler.cc b/runtime/vm/flow_graph_compiler.cc
index 45b54ef..66d3c95 100644
--- a/runtime/vm/flow_graph_compiler.cc
+++ b/runtime/vm/flow_graph_compiler.cc
@@ -27,6 +27,7 @@
 DECLARE_FLAG(bool, code_comments);
 DECLARE_FLAG(bool, disassemble);
 DECLARE_FLAG(bool, disassemble_optimized);
+DECLARE_FLAG(bool, emit_edge_counters);
 DECLARE_FLAG(bool, enable_type_checks);
 DECLARE_FLAG(bool, intrinsify);
 DECLARE_FLAG(bool, propagate_ic_data);
@@ -107,6 +108,23 @@
       entry_patch_pc_offset_(Code::kInvalidPc),
       patch_code_pc_offset_(Code::kInvalidPc),
       lazy_deopt_pc_offset_(Code::kInvalidPc) {
+  if (!is_optimizing) {
+    const intptr_t len = isolate()->deopt_id();
+    deopt_id_to_ic_data_ = new(isolate()) ZoneGrowableArray<const ICData*>(len);
+    deopt_id_to_ic_data_->SetLength(len);
+    for (intptr_t i = 0; i < len; i++) {
+      (*deopt_id_to_ic_data_)[i] = NULL;
+    }
+    const Array& old_saved_icdata = Array::Handle(isolate(),
+        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++) {
+      ICData& icd = ICData::ZoneHandle(isolate());
+      icd ^= old_saved_icdata.At(i);
+      (*deopt_id_to_ic_data_)[icd.deopt_id()] = &icd;
+    }
+  }
   ASSERT(assembler != NULL);
   ASSERT(!list_class_.IsNull());
 }
@@ -336,16 +354,12 @@
 
 void FlowGraphCompiler::Bailout(const char* reason) {
   const Function& function = parsed_function_.function();
-  const Error& error = Error::Handle(
-      LanguageError::NewFormatted(Error::Handle(),  // No previous error.
-                                  Script::Handle(function.script()),
-                                  function.token_pos(),
-                                  LanguageError::kBailout,
-                                  Heap::kNew,
-                                  "FlowGraphCompiler Bailout: %s %s",
-                                  String::Handle(function.name()).ToCString(),
-                                  reason));
-  isolate()->long_jump_base()->Jump(1, error);
+  Report::MessageF(Report::kBailout,
+                   Script::Handle(function.script()),
+                   function.token_pos(),
+                   "FlowGraphCompiler Bailout: %s %s",
+                   String::Handle(function.name()).ToCString(),
+                   reason);
   UNREACHABLE();
 }
 
@@ -888,16 +902,31 @@
                                            const Function& function,
                                            intptr_t argument_count,
                                            const Array& argument_names,
-                                           LocationSummary* locs) {
-  const Array& arguments_descriptor =
-      Array::ZoneHandle(ArgumentsDescriptor::New(argument_count,
-                                                 argument_names));
-  if (is_optimizing()) {
-    EmitOptimizedStaticCall(function, arguments_descriptor, argument_count,
-                            deopt_id, token_pos, locs);
+                                           LocationSummary* locs,
+                                           const ICData& ic_data) {
+  const Array& arguments_descriptor = Array::ZoneHandle(
+      ic_data.IsNull() ? ArgumentsDescriptor::New(argument_count,
+                                                  argument_names)
+                       : ic_data.arguments_descriptor());
+  // Proper reporting of Javascript incompatibilities requires icdata and
+  // may therefore prevent the optimization of some static calls.
+  if (is_optimizing() &&
+      !(FLAG_warn_on_javascript_compatibility &&
+        (MethodRecognizer::RecognizeKind(function) ==
+         MethodRecognizer::kObjectIdentical))) {
+    EmitOptimizedStaticCall(function, arguments_descriptor,
+                            argument_count, deopt_id, token_pos, locs);
   } else {
-    EmitUnoptimizedStaticCall(function, arguments_descriptor, argument_count,
-                              deopt_id, token_pos, locs);
+    ICData& call_ic_data = ICData::ZoneHandle(ic_data.raw());
+    if (call_ic_data.IsNull()) {
+      const intptr_t kNumArgsChecked = 0;
+      call_ic_data = GetOrAddStaticCallICData(deopt_id,
+                                              function,
+                                              arguments_descriptor,
+                                              kNumArgsChecked)->raw();
+    }
+    EmitUnoptimizedStaticCall(argument_count, deopt_id, token_pos, locs,
+                              call_ic_data);
   }
 }
 
@@ -956,6 +985,15 @@
 }
 
 
+bool FlowGraphCompiler::NeedsEdgeCounter(TargetEntryInstr* block) {
+  // Only emit an edge counter if there is not goto at the end of the block,
+  // except for the entry block.
+  return (FLAG_emit_edge_counters
+      && (!block->last_instruction()->IsGoto()
+          || (block == flow_graph().graph_entry()->normal_entry())));
+}
+
+
 // Allocate a register that is not explicitly blocked.
 static Register AllocateFreeRegister(bool* blocked_registers) {
   for (intptr_t regno = 0; regno < kNumberOfCpuRegisters; regno++) {
@@ -1211,12 +1249,14 @@
 }
 
 
-intptr_t ParallelMoveResolver::AllocateScratchRegister(Location::Kind kind,
-                                                       intptr_t blocked,
-                                                       intptr_t register_count,
-                                                       bool* spilled) {
+intptr_t ParallelMoveResolver::AllocateScratchRegister(
+    Location::Kind kind,
+    intptr_t blocked,
+    intptr_t first_free_register,
+    intptr_t last_free_register,
+    bool* spilled) {
   intptr_t scratch = -1;
-  for (intptr_t reg = 0; reg < register_count; reg++) {
+  for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
     if ((blocked != reg) &&
         IsScratchLocation(Location::MachineRegisterLocation(kind, reg))) {
       scratch = reg;
@@ -1226,9 +1266,10 @@
 
   if (scratch == -1) {
     *spilled = true;
-    for (intptr_t reg = 0; reg < register_count; reg++) {
+    for (intptr_t reg = first_free_register; reg <= last_free_register; reg++) {
       if (blocked != reg) {
         scratch = reg;
+        break;
       }
     }
   } else {
@@ -1247,7 +1288,8 @@
   reg_ = static_cast<FpuRegister>(
       resolver_->AllocateScratchRegister(Location::kFpuRegister,
                                          blocked,
-                                         kNumberOfFpuRegisters,
+                                         0,
+                                         kNumberOfFpuRegisters - 1,
                                          &spilled_));
 
   if (spilled_) {
@@ -1271,7 +1313,8 @@
   reg_ = static_cast<Register>(
       resolver_->AllocateScratchRegister(Location::kRegister,
                                          blocked,
-                                         kNumberOfCpuRegisters,
+                                         kFirstFreeCpuRegister,
+                                         kLastFreeCpuRegister,
                                          &spilled_));
 
   if (spilled_) {
@@ -1309,4 +1352,47 @@
   sorted->Sort(HighestCountFirst);
 }
 
+
+const ICData* FlowGraphCompiler::GetOrAddInstanceCallICData(
+    intptr_t deopt_id,
+    const String& target_name,
+    const Array& arguments_descriptor,
+    intptr_t num_args_tested) {
+  if ((deopt_id_to_ic_data_ != NULL) &&
+      ((*deopt_id_to_ic_data_)[deopt_id] != NULL)) {
+    const ICData* res = (*deopt_id_to_ic_data_)[deopt_id];
+    ASSERT(res->deopt_id() == deopt_id);
+    ASSERT(res->target_name() == target_name.raw());
+    ASSERT(res->NumArgsTested() == num_args_tested);
+    return res;
+  }
+  const ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+      parsed_function().function(), target_name,
+      arguments_descriptor, deopt_id, num_args_tested));
+  (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
+  return &ic_data;
+}
+
+
+const ICData* FlowGraphCompiler::GetOrAddStaticCallICData(
+    intptr_t deopt_id,
+    const Function& target,
+    const Array& arguments_descriptor,
+    intptr_t num_args_tested) {
+  if ((deopt_id_to_ic_data_ != NULL) &&
+      ((*deopt_id_to_ic_data_)[deopt_id] != NULL)) {
+    const ICData* res = (*deopt_id_to_ic_data_)[deopt_id];
+    ASSERT(res->deopt_id() == deopt_id);
+    ASSERT(res->target_name() == target.name());
+    ASSERT(res->NumArgsTested() == num_args_tested);
+    return res;
+  }
+  const ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+      parsed_function().function(), String::Handle(isolate(), target.name()),
+      arguments_descriptor, deopt_id, num_args_tested));
+  ic_data.AddTarget(target);
+  (*deopt_id_to_ic_data_)[deopt_id] = &ic_data;
+  return &ic_data;
+}
+
 }  // namespace dart
diff --git a/runtime/vm/flow_graph_compiler.h b/runtime/vm/flow_graph_compiler.h
index 6546ff8..a5f2e4f 100644
--- a/runtime/vm/flow_graph_compiler.h
+++ b/runtime/vm/flow_graph_compiler.h
@@ -62,7 +62,8 @@
   bool IsScratchLocation(Location loc);
   intptr_t AllocateScratchRegister(Location::Kind kind,
                                    intptr_t blocked,
-                                   intptr_t register_count,
+                                   intptr_t first_free_register,
+                                   intptr_t last_free_register,
                                    bool* spilled);
 
   void SpillScratch(Register reg);
@@ -118,6 +119,7 @@
         deopt_env_(deopt_env) {
     ASSERT(deopt_env != NULL);
   }
+  virtual ~CompilerDeoptInfo() { }
 
   RawDeoptInfo* CreateDeoptInfo(FlowGraphCompiler* compiler,
                                 DeoptInfoBuilder* builder,
@@ -173,6 +175,7 @@
 class SlowPathCode : public ZoneAllocated {
  public:
   SlowPathCode() : entry_label_(), exit_label_() { }
+  virtual ~SlowPathCode() { }
 
   Label* entry_label() { return &entry_label_; }
   Label* exit_label() { return &exit_label_; }
@@ -331,7 +334,8 @@
                           const Function& function,
                           intptr_t argument_count,
                           const Array& argument_names,
-                          LocationSummary* locs);
+                          LocationSummary* locs,
+                          const ICData& ic_data);
 
   void GenerateNumberTypeCheck(Register kClassIdReg,
                                const AbstractType& type,
@@ -345,6 +349,8 @@
 
   void EmitComment(Instruction* instr);
 
+  bool NeedsEdgeCounter(TargetEntryInstr* block);
+
   void EmitEdgeCounter();
 
   void EmitOptimizedInstanceCall(ExternalLabel* target_label,
@@ -451,6 +457,21 @@
   static void SortICDataByCount(const ICData& ic_data,
                                 GrowableArray<CidTarget>* sorted);
 
+  // Use in unoptimized compilation to preserve/reuse ICData.
+  const ICData* GetOrAddInstanceCallICData(intptr_t deopt_id,
+                                           const String& target_name,
+                                           const Array& arguments_descriptor,
+                                           intptr_t num_args_tested);
+
+  const ICData* GetOrAddStaticCallICData(intptr_t deopt_id,
+                                         const Function& target,
+                                         const Array& arguments_descriptor,
+                                         intptr_t num_args_tested);
+
+  const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data() const {
+    return *deopt_id_to_ic_data_;
+  }
+
  private:
   friend class CheckStackOverflowSlowPath;  // For pending_deoptimization_env_.
 
@@ -475,12 +496,11 @@
                                intptr_t token_pos,
                                LocationSummary* locs);
 
-  void EmitUnoptimizedStaticCall(const Function& function,
-                                 const Array& arguments_descriptor,
-                                 intptr_t argument_count,
+  void EmitUnoptimizedStaticCall(intptr_t argument_count,
                                  intptr_t deopt_id,
                                  intptr_t token_pos,
-                                 LocationSummary* locs);
+                                 LocationSummary* locs,
+                                 const ICData& ic_data);
 
   // Type checking helper methods.
   void CheckClassIds(Register class_id_reg,
@@ -598,6 +618,8 @@
   intptr_t patch_code_pc_offset_;
   intptr_t lazy_deopt_pc_offset_;
 
+  ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data_;
+
   DISALLOW_COPY_AND_ASSIGN(FlowGraphCompiler);
 };
 
diff --git a/runtime/vm/flow_graph_compiler_arm.cc b/runtime/vm/flow_graph_compiler_arm.cc
index e5108c8..7a4b4d9 100644
--- a/runtime/vm/flow_graph_compiler_arm.cc
+++ b/runtime/vm/flow_graph_compiler_arm.cc
@@ -949,7 +949,7 @@
   __ Comment("Inlined Setter");
   __ ldr(R0, Address(SP, 1 * kWordSize));  // Receiver.
   __ ldr(R1, Address(SP, 0 * kWordSize));  // Value.
-  __ StoreIntoObject(R0, FieldAddress(R0, offset), R1);
+  __ StoreIntoObjectOffset(R0, offset, R1);
   __ LoadImmediate(R0, reinterpret_cast<intptr_t>(Object::null()));
   __ Ret();
 }
@@ -1236,19 +1236,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ LoadFromOffset(kWord, R0, SP, (argument_count - 1) * kWordSize);
-  __ tst(R0, Operand(kSmiTagMask));
-  __ b(&not_smi, NE);
-  __ mov(R0, Operand(Smi::RawValue(kSmiCid)));
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(R0, R0);
-  __ SmiTag(R0);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(R1, cache);
   __ ldr(R2, FieldAddress(R1, MegamorphicCache::buckets_offset()));
   __ ldr(R1, FieldAddress(R1, MegamorphicCache::mask_offset()));
@@ -1294,27 +1285,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_arm64.cc b/runtime/vm/flow_graph_compiler_arm64.cc
index 9303e38..4b81587 100644
--- a/runtime/vm/flow_graph_compiler_arm64.cc
+++ b/runtime/vm/flow_graph_compiler_arm64.cc
@@ -158,7 +158,7 @@
   __ Comment("Deopt stub for id %" Pd "", deopt_id());
   __ Bind(entry_label());
   if (FLAG_trap_on_deoptimization) {
-    __ hlt(0);
+    __ brk(0);
   }
 
   ASSERT(deopt_env() != NULL);
@@ -664,7 +664,7 @@
                         3,
                         locs);
     // We should never return here.
-    __ hlt(0);
+    __ brk(0);
 
     __ Bind(&is_assignable);  // For a null object.
     // Restore instantiator (R2) and its type arguments (R1).
@@ -901,7 +901,7 @@
     __ LeaveDartFrame();  // The arguments are still on the stack.
     __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
     // The noSuchMethod call may return to the caller, but not here.
-    __ hlt(0);
+    __ brk(0);
   } else if (check_correct_named_args) {
     __ Stop("Wrong arguments");
   }
@@ -974,7 +974,7 @@
 
     intptr_t threshold = FLAG_optimization_counter_threshold;
     __ LoadFieldFromOffset(
-        R7, function_reg, Function::usage_counter_offset(), new_pp);
+        R7, function_reg, Function::usage_counter_offset(), new_pp, kWord);
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
@@ -982,7 +982,7 @@
     } else {
       __ add(R7, R7, Operand(1));
       __ StoreFieldToOffset(
-          R7, function_reg, Function::usage_counter_offset(), new_pp);
+          R7, function_reg, Function::usage_counter_offset(), new_pp, kWord);
     }
     __ CompareImmediate(R7, threshold, new_pp);
     ASSERT(function_reg == R6);
@@ -1073,7 +1073,7 @@
         __ LeaveDartFrame();  // The arguments are still on the stack.
         __ BranchPatchable(&StubCode::CallNoSuchMethodFunctionLabel());
         // The noSuchMethod call may return to the caller, but not here.
-        __ hlt(0);
+        __ brk(0);
       } else {
         __ Stop("Wrong number of arguments");
       }
@@ -1097,7 +1097,7 @@
 
   VisitBlocks();
 
-  __ hlt(0);
+  __ brk(0);
   GenerateDeferredCode();
 
   // Emit function patching code. This will be swapped with the first 3
@@ -1242,19 +1242,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ LoadFromOffset(R0, SP, (argument_count - 1) * kWordSize, PP);
-  __ tsti(R0, kSmiTagMask);
-  __ b(&not_smi, NE);
-  __ LoadImmediate(R0, Smi::RawValue(kSmiCid), PP);
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(R0, R0, PP);
-  __ SmiTag(R0);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(R1, cache, PP);
   __ LoadFieldFromOffset(R2, R1, MegamorphicCache::buckets_offset(), PP);
   __ LoadFieldFromOffset(R1, R1, MegamorphicCache::mask_offset(), PP);
@@ -1300,27 +1291,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_ia32.cc b/runtime/vm/flow_graph_compiler_ia32.cc
index 4a287b4..25d3fd9 100644
--- a/runtime/vm/flow_graph_compiler_ia32.cc
+++ b/runtime/vm/flow_graph_compiler_ia32.cc
@@ -28,7 +28,6 @@
 DECLARE_FLAG(int, optimization_counter_threshold);
 DECLARE_FLAG(int, reoptimization_counter_threshold);
 DECLARE_FLAG(bool, enable_type_checks);
-DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
 DECLARE_FLAG(bool, enable_simd_inline);
 
 
@@ -1169,27 +1168,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1287,16 +1270,9 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
+  Label load_cache;
   __ movl(EAX, Address(ESP, (argument_count - 1) * kWordSize));
-  __ testl(EAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movl(EAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ jmp(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(EAX, EAX);
-  __ SmiTag(EAX);
+  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
 
   // EAX: class ID of the receiver (smi).
   __ Bind(&load_cache);
diff --git a/runtime/vm/flow_graph_compiler_mips.cc b/runtime/vm/flow_graph_compiler_mips.cc
index c4e47f5..d86d744 100644
--- a/runtime/vm/flow_graph_compiler_mips.cc
+++ b/runtime/vm/flow_graph_compiler_mips.cc
@@ -972,7 +972,7 @@
   __ Comment("Inlined Setter");
   __ lw(T0, Address(SP, 1 * kWordSize));  // Receiver.
   __ lw(T1, Address(SP, 0 * kWordSize));  // Value.
-  __ StoreIntoObject(T0, FieldAddress(T0, offset), T1);
+  __ StoreIntoObjectOffset(T0, offset, T1);
   __ LoadImmediate(V0, reinterpret_cast<int32_t>(Object::null()));
   __ Ret();
 }
@@ -1276,20 +1276,11 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ TraceSimMsg("MegamorphicInstanceCall");
   __ lw(T0, Address(SP, (argument_count - 1) * kWordSize));
-  __ andi(CMPRES1, T0, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &not_smi);
-  __ LoadImmediate(T0, Smi::RawValue(kSmiCid));
-  __ b(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(T0, T0);
-  __ SmiTag(T0);
+  __ LoadTaggedClassIdMayBeSmi(T0, T0);
 
   // T0: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(T1, cache);
   __ lw(T2, FieldAddress(T1, MegamorphicCache::buckets_offset()));
   __ lw(T1, FieldAddress(T1, MegamorphicCache::mask_offset()));
@@ -1336,27 +1327,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
diff --git a/runtime/vm/flow_graph_compiler_x64.cc b/runtime/vm/flow_graph_compiler_x64.cc
index 67f1d12..f183de6 100644
--- a/runtime/vm/flow_graph_compiler_x64.cc
+++ b/runtime/vm/flow_graph_compiler_x64.cc
@@ -1005,16 +1005,14 @@
     if (is_optimizing()) {
       // Reoptimization of an optimized function is triggered by counting in
       // IC stubs, but not at the entry of the function.
-      __ CompareImmediate(
+      __ cmpl(
           FieldAddress(function_reg, Function::usage_counter_offset()),
-          Immediate(FLAG_reoptimization_counter_threshold),
-          new_pp);
+          Immediate(FLAG_reoptimization_counter_threshold));
     } else {
-      __ incq(FieldAddress(function_reg, Function::usage_counter_offset()));
-      __ CompareImmediate(
+      __ incl(FieldAddress(function_reg, Function::usage_counter_offset()));
+      __ cmpl(
           FieldAddress(function_reg, Function::usage_counter_offset()),
-          Immediate(FLAG_optimization_counter_threshold),
-          new_pp);
+          Immediate(FLAG_optimization_counter_threshold));
     }
     ASSERT(function_reg == RDI);
     __ J(GREATER_EQUAL, &StubCode::OptimizeFunctionLabel(), R13);
@@ -1207,27 +1205,11 @@
 
 
 void FlowGraphCompiler::EmitUnoptimizedStaticCall(
-    const Function& target_function,
-    const Array& arguments_descriptor,
     intptr_t argument_count,
     intptr_t deopt_id,
     intptr_t token_pos,
-    LocationSummary* locs) {
-  // TODO(srdjan): Improve performance of function recognition.
-  MethodRecognizer::Kind recognized_kind =
-      MethodRecognizer::RecognizeKind(target_function);
-  int num_args_checked = 0;
-  if ((recognized_kind == MethodRecognizer::kMathMin) ||
-      (recognized_kind == MethodRecognizer::kMathMax)) {
-    num_args_checked = 2;
-  }
-  const ICData& ic_data = ICData::ZoneHandle(
-      ICData::New(parsed_function().function(),  // Caller function.
-                  String::Handle(target_function.name()),
-                  arguments_descriptor,
-                  deopt_id,
-                  num_args_checked));  // No arguments checked.
-  ic_data.AddTarget(target_function);
+    LocationSummary* locs,
+    const ICData& ic_data) {
   uword label_address = 0;
   if (ic_data.NumArgsTested() == 0) {
     label_address = StubCode::ZeroArgsUnoptimizedStaticCallEntryPoint();
@@ -1325,19 +1307,10 @@
   ASSERT(!arguments_descriptor.IsNull() && (arguments_descriptor.Length() > 0));
   const MegamorphicCache& cache =
       MegamorphicCache::ZoneHandle(table->Lookup(name, arguments_descriptor));
-  Label not_smi, load_cache;
   __ movq(RAX, Address(RSP, (argument_count - 1) * kWordSize));
-  __ testq(RAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ LoadImmediate(RAX, Immediate(Smi::RawValue(kSmiCid)), PP);
-  __ jmp(&load_cache);
-
-  __ Bind(&not_smi);
-  __ LoadClassId(RAX, RAX);
-  __ SmiTag(RAX);
+  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
 
   // RAX: class ID of the receiver (smi).
-  __ Bind(&load_cache);
   __ LoadObject(RBX, cache, PP);
   __ movq(RDI, FieldAddress(RBX, MegamorphicCache::buckets_offset()));
   __ movq(RBX, FieldAddress(RBX, MegamorphicCache::mask_offset()));
@@ -1474,58 +1447,15 @@
 // This function must be in sync with FlowGraphCompiler::RecordSafepoint and
 // FlowGraphCompiler::SlowPathEnvironmentFor.
 void FlowGraphCompiler::SaveLiveRegisters(LocationSummary* locs) {
-  // TODO(vegorov): consider saving only caller save (volatile) registers.
-  const intptr_t xmm_regs_count = locs->live_registers()->FpuRegisterCount();
-  if (xmm_regs_count > 0) {
-    __ AddImmediate(RSP, Immediate(-xmm_regs_count * kFpuRegisterSize), PP);
-    // Store XMM registers with the lowest register number at the lowest
-    // address.
-    intptr_t offset = 0;
-    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(Address(RSP, offset), xmm_reg);
-        offset += kFpuRegisterSize;
-      }
-    }
-    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
-  }
-
-  // Store general purpose registers with the highest register number at the
-  // lowest address.
-  for (intptr_t reg_idx = 0; reg_idx < kNumberOfCpuRegisters; ++reg_idx) {
-    Register reg = static_cast<Register>(reg_idx);
-    if (locs->live_registers()->ContainsRegister(reg)) {
-      __ pushq(reg);
-    }
-  }
+  // TODO(vegorov): avoid saving non-volatile registers.
+  __ PushRegisters(locs->live_registers()->cpu_registers(),
+                   locs->live_registers()->fpu_registers());
 }
 
 
 void FlowGraphCompiler::RestoreLiveRegisters(LocationSummary* locs) {
-  // General purpose registers have the highest register number at the
-  // 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)) {
-      __ popq(reg);
-    }
-  }
-
-  const intptr_t xmm_regs_count = locs->live_registers()->FpuRegisterCount();
-  if (xmm_regs_count > 0) {
-    // XMM registers have the lowest register number at the lowest address.
-    intptr_t offset = 0;
-    for (intptr_t reg_idx = 0; reg_idx < kNumberOfXmmRegisters; ++reg_idx) {
-      XmmRegister xmm_reg = static_cast<XmmRegister>(reg_idx);
-      if (locs->live_registers()->ContainsFpuRegister(xmm_reg)) {
-        __ movups(xmm_reg, Address(RSP, offset));
-        offset += kFpuRegisterSize;
-      }
-    }
-    ASSERT(offset == (xmm_regs_count * kFpuRegisterSize));
-    __ AddImmediate(RSP, Immediate(offset), PP);
-  }
+  __ PopRegisters(locs->live_registers()->cpu_registers(),
+                  locs->live_registers()->fpu_registers());
 }
 
 
diff --git a/runtime/vm/flow_graph_inliner.cc b/runtime/vm/flow_graph_inliner.cc
index 11fedc1..e037d49 100644
--- a/runtime/vm/flow_graph_inliner.cc
+++ b/runtime/vm/flow_graph_inliner.cc
@@ -639,18 +639,15 @@
       }
 
       // Load IC data for the callee.
-      Array& ic_data_array = Array::Handle();
-
-      // IsInlineable above checked HasCode. Creating a Handle for the code
-      // should have kept GC from detaching, but let's assert just to make sure.
-      ASSERT(function.HasCode());
-      ic_data_array = unoptimized_code.ExtractTypeFeedbackArray();
+      ZoneGrowableArray<const ICData*>* ic_data_array =
+            new(isolate()) ZoneGrowableArray<const ICData*>();
+      function.RestoreICDataMap(ic_data_array);
 
       // Build the callee graph.
       InlineExitCollector* exit_collector =
           new(isolate()) InlineExitCollector(caller_graph_, call);
       FlowGraphBuilder builder(parsed_function,
-                               ic_data_array,
+                               *ic_data_array,
                                exit_collector,
                                Isolate::kNoDeoptId,
                                true);
diff --git a/runtime/vm/flow_graph_optimizer.cc b/runtime/vm/flow_graph_optimizer.cc
index 1dc4c07..1160b9f 100644
--- a/runtime/vm/flow_graph_optimizer.cc
+++ b/runtime/vm/flow_graph_optimizer.cc
@@ -49,6 +49,8 @@
 DECLARE_FLAG(bool, trace_type_check_elimination);
 DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
 
 static bool ShouldInlineSimd() {
   return FlowGraphCompiler::SupportsUnboxedSimd128();
@@ -157,12 +159,12 @@
     }
   }
 
-  const Array& args_desc_array = Array::Handle(isolate(),
+  const Array& args_desc_array = Array::Handle(I,
       ArgumentsDescriptor::New(call->ArgumentCount(), call->argument_names()));
   ArgumentsDescriptor args_desc(args_desc_array);
-  const Class& receiver_class = Class::Handle(isolate(),
+  const Class& receiver_class = Class::Handle(I,
       isolate()->class_table()->At(class_ids[0]));
-  const Function& function = Function::Handle(isolate(),
+  const Function& function = Function::Handle(I,
       Resolver::ResolveDynamicForReceiverClass(
           receiver_class,
           call->function_name(),
@@ -174,7 +176,7 @@
   // since it is attached to the assembly instruction itself.
   // TODO(srdjan): Prevent modification of ICData object that is
   // referenced in assembly code.
-  ICData& ic_data = ICData::ZoneHandle(isolate(), ICData::New(
+  ICData& ic_data = ICData::ZoneHandle(I, ICData::New(
       flow_graph_->parsed_function().function(),
       call->function_name(),
       args_desc_array,
@@ -201,13 +203,13 @@
   }
 
   const Function& function =
-      Function::Handle(isolate(), ic_data.GetTargetForReceiverClassId(cid));
+      Function::Handle(I, ic_data.GetTargetForReceiverClassId(cid));
   // TODO(fschneider): Try looking up the function on the class if it is
   // not found in the ICData.
   if (!function.IsNull()) {
-    const ICData& new_ic_data = ICData::ZoneHandle(isolate(), ICData::New(
-        Function::Handle(isolate(), ic_data.owner()),
-        String::Handle(isolate(), ic_data.target_name()),
+    const ICData& new_ic_data = ICData::ZoneHandle(I, ICData::New(
+        Function::Handle(I, ic_data.owner()),
+        String::Handle(I, ic_data.target_name()),
         Object::empty_array(),  // Dummy argument descriptor.
         ic_data.deopt_id(),
         ic_data.NumArgsTested()));
@@ -240,9 +242,9 @@
 
   const bool with_checks = false;
   PolymorphicInstanceCallInstr* specialized =
-      new(isolate()) PolymorphicInstanceCallInstr(call->instance_call(),
-                                                  ic_data,
-                                                  with_checks);
+      new(I) PolymorphicInstanceCallInstr(call->instance_call(),
+                                          ic_data,
+                                          with_checks);
   call->ReplaceWith(specialized, current_iterator());
 }
 
@@ -293,10 +295,10 @@
   ASSERT(bit_and_instr->IsBinarySmiOp() || bit_and_instr->IsBinaryMintOp());
   if (bit_and_instr->IsBinaryMintOp()) {
     // Replace Mint op with Smi op.
-    BinarySmiOpInstr* smi_op = new(isolate()) BinarySmiOpInstr(
+    BinarySmiOpInstr* smi_op = new(I) BinarySmiOpInstr(
         Token::kBIT_AND,
-        new(isolate()) Value(left_instr),
-        new(isolate()) Value(right_instr),
+        new(I) Value(left_instr),
+        new(I) Value(right_instr),
         Isolate::kNoDeoptId,  // BIT_AND cannot deoptimize.
         Scanner::kNoSourcePos);
     bit_and_instr->ReplaceWith(smi_op, current_iterator());
@@ -313,10 +315,10 @@
                                                     intptr_t cid) {
   const intptr_t index_scale = Instance::ElementSizeFor(cid);
   ConstantInstr* index_instr =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(ix)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(ix)));
   LoadIndexedInstr* load =
-      new(isolate()) LoadIndexedInstr(new(isolate()) Value(instr),
-                                      new(isolate()) Value(index_instr),
+      new(I) LoadIndexedInstr(new(I) Value(instr),
+                                      new(I) Value(index_instr),
                                       index_scale,
                                       cid,
                                       Isolate::kNoDeoptId,
@@ -331,10 +333,7 @@
                                                          Representation rep,
                                                          intptr_t cid) {
   ExtractNthOutputInstr* extract =
-      new(isolate()) ExtractNthOutputInstr(new(isolate()) Value(instr),
-                                           index,
-                                           rep,
-                                           cid);
+      new(I) ExtractNthOutputInstr(new(I) Value(instr), index, rep, cid);
   instr->ReplaceUsesWith(extract);
   flow_graph()->InsertAfter(instr, extract, NULL, FlowGraph::kValue);
 }
@@ -395,13 +394,12 @@
             MergedMathInstr::OutputIndexOf(other_binop->op_kind()),
             kTagged, kSmiCid);
 
-        ZoneGrowableArray<Value*>* args =
-            new(isolate()) ZoneGrowableArray<Value*>(2);
-        args->Add(new(isolate()) Value(curr_instr->left()->definition()));
-        args->Add(new(isolate()) Value(curr_instr->right()->definition()));
+        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(2);
+        args->Add(new(I) Value(curr_instr->left()->definition()));
+        args->Add(new(I) Value(curr_instr->right()->definition()));
 
         // Replace with TruncDivMod.
-        MergedMathInstr* div_mod = new(isolate()) MergedMathInstr(
+        MergedMathInstr* div_mod = new(I) MergedMathInstr(
             args,
             curr_instr->deopt_id(),
             MergedMathInstr::kTruncDivMod);
@@ -456,14 +454,13 @@
             other_op,
             MergedMathInstr::OutputIndexOf(other_kind),
             kUnboxedDouble, kDoubleCid);
-        ZoneGrowableArray<Value*>* args =
-            new(isolate()) ZoneGrowableArray<Value*>(1);
-        args->Add(new(isolate()) Value(curr_instr->value()->definition()));
+        ZoneGrowableArray<Value*>* args = new(I) ZoneGrowableArray<Value*>(1);
+        args->Add(new(I) Value(curr_instr->value()->definition()));
         // Replace with SinCos.
         MergedMathInstr* sin_cos =
-            new(isolate()) MergedMathInstr(args,
-                                           curr_instr->DeoptimizationTarget(),
-                                           MergedMathInstr::kSinCos);
+            new(I) MergedMathInstr(args,
+                                   curr_instr->DeoptimizationTarget(),
+                                   MergedMathInstr::kSinCos);
         curr_instr->ReplaceWith(sin_cos, current_iterator());
         other_op->ReplaceUsesWith(sin_cos);
         other_op->RemoveFromGraph();
@@ -610,28 +607,27 @@
            (use->Type()->ToCid() == kUnboxedMint));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxIntegerInstr(use->CopyWithType(), deopt_id);
 
   } else if ((from == kUnboxedMint) && (to == kTagged)) {
-    converted = new(isolate()) BoxIntegerInstr(use->CopyWithType());
+    converted = new(I) BoxIntegerInstr(use->CopyWithType());
 
   } else if (from == kUnboxedMint && to == kUnboxedDouble) {
     ASSERT(CanUnboxDouble());
     // Convert by boxing/unboxing.
     // TODO(fschneider): Implement direct unboxed mint-to-double conversion.
     BoxIntegerInstr* boxed =
-        new(isolate()) BoxIntegerInstr(use->CopyWithType());
+        new(I) BoxIntegerInstr(use->CopyWithType());
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
 
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxDoubleInstr(
-        new(isolate()) Value(boxed), deopt_id);
+    converted = new(I) UnboxDoubleInstr(new(I) Value(boxed), deopt_id);
 
   } else if ((from == kUnboxedDouble) && (to == kTagged)) {
     ASSERT(CanUnboxDouble());
-    converted = new(isolate()) BoxDoubleInstr(use->CopyWithType());
+    converted = new(I) BoxDoubleInstr(use->CopyWithType());
 
   } else if ((from == kTagged) && (to == kUnboxedDouble)) {
     ASSERT(CanUnboxDouble());
@@ -643,38 +639,35 @@
     if ((constant != NULL) && constant->value().IsSmi()) {
       const double dbl_val = Smi::Cast(constant->value()).AsDoubleValue();
       const Double& dbl_obj =
-          Double::ZoneHandle(isolate(), Double::New(dbl_val, Heap::kOld));
+          Double::ZoneHandle(I, Double::NewCanonical(dbl_val));
       ConstantInstr* double_const = flow_graph()->GetConstant(dbl_obj);
-      converted = new(isolate()) UnboxDoubleInstr(
-          new(isolate()) Value(double_const), deopt_id);
+      converted = new(I) UnboxDoubleInstr(new(I) Value(double_const), deopt_id);
     } else {
-      converted = new(isolate()) UnboxDoubleInstr(
-          use->CopyWithType(), deopt_id);
+      converted = new(I) UnboxDoubleInstr(use->CopyWithType(), deopt_id);
     }
   } else if ((from == kTagged) && (to == kUnboxedFloat32x4)) {
     ASSERT((deopt_target != NULL) ||
            (use->Type()->ToCid() == kFloat32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxFloat32x4Instr(
+    converted = new(I) UnboxFloat32x4Instr(
         use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat32x4) && (to == kTagged)) {
-    converted = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
+    converted = new(I) BoxFloat32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedInt32x4)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kInt32x4Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxInt32x4Instr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedInt32x4) && (to == kTagged)) {
-    converted = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
+    converted = new(I) BoxInt32x4Instr(use->CopyWithType());
   } else if ((from == kTagged) && (to == kUnboxedFloat64x2)) {
     ASSERT((deopt_target != NULL) || (use->Type()->ToCid() == kFloat64x2Cid));
     const intptr_t deopt_id = (deopt_target != NULL) ?
         deopt_target->DeoptimizationTarget() : Isolate::kNoDeoptId;
-    converted = new(isolate()) UnboxFloat64x2Instr(
-        use->CopyWithType(), deopt_id);
+    converted = new(I) UnboxFloat64x2Instr(use->CopyWithType(), deopt_id);
   } else if ((from == kUnboxedFloat64x2) && (to == kTagged)) {
-    converted = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
+    converted = new(I) BoxFloat64x2Instr(use->CopyWithType());
   } else {
     // We have failed to find a suitable conversion instruction.
     // Insert two "dummy" conversion instructions with the correct
@@ -686,31 +679,31 @@
     ASSERT(to != kTagged);
     Definition* boxed = NULL;
     if (from == kUnboxedDouble) {
-      boxed = new(isolate()) BoxDoubleInstr(use->CopyWithType());
+      boxed = new(I) BoxDoubleInstr(use->CopyWithType());
     } else if (from == kUnboxedInt32x4) {
-      boxed = new(isolate()) BoxInt32x4Instr(use->CopyWithType());
+      boxed = new(I) BoxInt32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedFloat32x4) {
-      boxed = new(isolate()) BoxFloat32x4Instr(use->CopyWithType());
+      boxed = new(I) BoxFloat32x4Instr(use->CopyWithType());
     } else if (from == kUnboxedMint) {
-      boxed = new(isolate()) BoxIntegerInstr(use->CopyWithType());
+      boxed = new(I) BoxIntegerInstr(use->CopyWithType());
     } else if (from == kUnboxedFloat64x2) {
-      boxed = new(isolate()) BoxFloat64x2Instr(use->CopyWithType());
+      boxed = new(I) BoxFloat64x2Instr(use->CopyWithType());
     } else {
       UNIMPLEMENTED();
     }
     use->BindTo(boxed);
     InsertBefore(insert_before, boxed, NULL, FlowGraph::kValue);
-    Value* to_value = new(isolate()) Value(boxed);
+    Value* to_value = new(I) Value(boxed);
     if (to == kUnboxedDouble) {
-      converted = new(isolate()) UnboxDoubleInstr(to_value, deopt_id);
+      converted = new(I) UnboxDoubleInstr(to_value, deopt_id);
     } else if (to == kUnboxedInt32x4) {
-      converted = new(isolate()) UnboxInt32x4Instr(to_value, deopt_id);
+      converted = new(I) UnboxInt32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedFloat32x4) {
-      converted = new(isolate()) UnboxFloat32x4Instr(to_value, deopt_id);
+      converted = new(I) UnboxFloat32x4Instr(to_value, deopt_id);
     } else if (to == kUnboxedMint) {
-      converted = new(isolate()) UnboxIntegerInstr(to_value, deopt_id);
+      converted = new(I) UnboxIntegerInstr(to_value, deopt_id);
     } else if (to == kUnboxedFloat64x2) {
-      converted = new(isolate()) UnboxFloat64x2Instr(to_value, deopt_id);
+      converted = new(I) UnboxFloat64x2Instr(to_value, deopt_id);
     } else {
       UNIMPLEMENTED();
     }
@@ -991,9 +984,9 @@
                                      Instruction* insert_before) {
   if (to_check->Type()->ToCid() != kSmiCid) {
     InsertBefore(insert_before,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
-                                              deopt_id,
-                                              insert_before->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(to_check),
+                                      deopt_id,
+                                      insert_before->token_pos()),
                  deopt_environment,
                  FlowGraph::kEffect);
   }
@@ -1006,12 +999,12 @@
                                                intptr_t token_pos) {
   if ((unary_checks.NumberOfChecks() == 1) &&
       (unary_checks.GetReceiverClassIdAt(0) == kSmiCid)) {
-    return new(isolate()) CheckSmiInstr(new(isolate()) Value(to_check),
-                                        deopt_id,
-                                        token_pos);
+    return new(I) CheckSmiInstr(new(I) Value(to_check),
+                                deopt_id,
+                                token_pos);
   }
-  return new(isolate()) CheckClassInstr(
-      new(isolate()) Value(to_check), deopt_id, unary_checks, token_pos);
+  return new(I) CheckClassInstr(
+      new(I) Value(to_check), deopt_id, unary_checks, token_pos);
 }
 
 
@@ -1029,8 +1022,7 @@
 
 void FlowGraphOptimizer::AddReceiverCheck(InstanceCallInstr* call) {
   AddCheckClass(call->ArgumentAt(0),
-                ICData::ZoneHandle(isolate(),
-                                   call->ic_data()->AsUnaryClassChecks()),
+                ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks()),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -1136,12 +1128,12 @@
 bool FlowGraphOptimizer::TryReplaceWithStoreIndexed(InstanceCallInstr* call) {
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
-  const ICData& ic_data = ICData::Handle(isolate(),
-                                         call->ic_data()->AsUnaryClassChecks());
+  const ICData& ic_data =
+      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1194,31 +1186,29 @@
   Definition* index = call->ArgumentAt(1);
   Definition* stored_value = call->ArgumentAt(2);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
   if (FLAG_enable_type_checks) {
     // Only type check for the value. A type check for the index is not
     // needed here because we insert a deoptimizing smi-check for the case
     // the index is not a smi.
     const AbstractType& value_type =
-        AbstractType::ZoneHandle(isolate(), target.ParameterTypeAt(2));
+        AbstractType::ZoneHandle(I, target.ParameterTypeAt(2));
     Definition* instantiator = NULL;
     Definition* type_args = NULL;
     switch (array_cid) {
       case kArrayCid:
       case kGrowableObjectArrayCid: {
-        const Class& instantiator_class =
-            Class::Handle(isolate(), target.Owner());
+        const Class& instantiator_class =  Class::Handle(I, target.Owner());
         intptr_t type_arguments_field_offset =
             instantiator_class.type_arguments_field_offset();
         LoadFieldInstr* load_type_args =
-            new(isolate()) LoadFieldInstr(
-                new(isolate()) Value(array),
-                type_arguments_field_offset,
-                Type::ZoneHandle(isolate(), Type::null()),  // No type.
-                call->token_pos());
+            new(I) LoadFieldInstr(new(I) Value(array),
+                                  type_arguments_field_offset,
+                                  Type::ZoneHandle(I),  // No type.
+                                  call->token_pos());
         cursor = flow_graph()->AppendTo(cursor,
                                         load_type_args,
                                         NULL,
@@ -1267,12 +1257,12 @@
         UNREACHABLE();
     }
     AssertAssignableInstr* assert_value =
-        new(isolate()) AssertAssignableInstr(token_pos,
-                                             new(isolate()) Value(stored_value),
-                                             new(isolate()) Value(instantiator),
-                                             new(isolate()) Value(type_args),
-                                             value_type,
-                                             Symbols::Value());
+        new(I) AssertAssignableInstr(token_pos,
+                                     new(I) Value(stored_value),
+                                     new(I) Value(instantiator),
+                                     new(I) Value(type_args),
+                                     value_type,
+                                     Symbols::Value());
     // Newly inserted instructions that can deoptimize or throw an exception
     // must have a deoptimization id that is valid for lookup in the unoptimized
     // code.
@@ -1309,8 +1299,8 @@
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
     stored_value =
-        new(isolate()) DoubleToFloatInstr(
-            new(isolate()) Value(stored_value), call->deopt_id());
+        new(I) DoubleToFloatInstr(
+            new(I) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
@@ -1318,14 +1308,14 @@
   }
 
   const intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
-                                           new(isolate()) Value(index),
-                                           new(isolate()) Value(stored_value),
-                                           needs_store_barrier,
-                                           index_scale,
-                                           array_cid,
-                                           call->deopt_id(),
-                                           call->token_pos());
+  *last = new(I) StoreIndexedInstr(new(I) Value(array),
+                                   new(I) Value(index),
+                                   new(I) Value(stored_value),
+                                   needs_store_barrier,
+                                   index_scale,
+                                   array_cid,
+                                   call->deopt_id(),
+                                   call->token_pos());
   flow_graph()->AppendTo(cursor,
                          *last,
                          call->env(),
@@ -1342,7 +1332,7 @@
                                                    const ICData& ic_data,
                                                    TargetEntryInstr** entry,
                                                    Definition** last) {
-  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
+  ICData& value_check = ICData::ZoneHandle(I);
   MethodRecognizer::Kind kind = MethodRecognizer::RecognizeKind(target);
   switch (kind) {
     // Recognized [] operators.
@@ -1580,18 +1570,18 @@
   // Insert index smi check.
   *cursor = flow_graph()->AppendTo(
       *cursor,
-      new(isolate()) CheckSmiInstr(new(isolate()) Value(index),
-                                   call->deopt_id(),
-                                   call->token_pos()),
+      new(I) CheckSmiInstr(new(I) Value(index),
+                           call->deopt_id(),
+                           call->token_pos()),
       call->env(),
       FlowGraph::kEffect);
 
   // Insert array length load and bounds check.
   LoadFieldInstr* length =
-      new(isolate()) LoadFieldInstr(
-          new(isolate()) Value(*array),
+      new(I) LoadFieldInstr(
+          new(I) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(isolate(), Type::SmiType()),
+          Type::ZoneHandle(I, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(
       CheckArrayBoundInstr::IsFixedLengthArrayType(array_cid));
@@ -1604,9 +1594,9 @@
                                    FlowGraph::kValue);
 
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(length),
-                                       new(isolate()) Value(index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(length),
+                                       new(I) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
@@ -1614,10 +1604,10 @@
   if (array_cid == kGrowableObjectArrayCid) {
     // Insert data elements load.
     LoadFieldInstr* elements =
-        new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(*array),
+        new(I) LoadFieldInstr(
+            new(I) Value(*array),
             GrowableObjectArray::data_offset(),
-            Type::ZoneHandle(isolate(), Type::DynamicType()),
+            Type::ZoneHandle(I, Type::DynamicType()),
             call->token_pos());
     elements->set_result_cid(kArrayCid);
     *cursor = flow_graph()->AppendTo(*cursor,
@@ -1629,8 +1619,8 @@
     array_cid = kArrayCid;
   } else if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
-                                         ExternalTypedData::data_offset());
+        new(I) LoadUntaggedInstr(new(I) Value(*array),
+                                 ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -1651,9 +1641,9 @@
 
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineIndexedOp(call,
@@ -1673,12 +1663,12 @@
 
   // Array load and return.
   intptr_t index_scale = Instance::ElementSizeFor(array_cid);
-  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
-                                          new(isolate()) Value(index),
-                                          index_scale,
-                                          array_cid,
-                                          deopt_id,
-                                          call->token_pos());
+  *last = new(I) LoadIndexedInstr(new(I) Value(array),
+                                  new(I) Value(index),
+                                  index_scale,
+                                  array_cid,
+                                  deopt_id,
+                                  call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -1686,8 +1676,7 @@
       FlowGraph::kValue);
 
   if (array_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(isolate()) FloatToDoubleInstr(
-        new(isolate()) Value(*last), deopt_id);
+    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -1701,11 +1690,11 @@
   // Check for monomorphic IC data.
   if (!call->HasICData()) return false;
   const ICData& ic_data =
-      ICData::Handle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::Handle(I, call->ic_data()->AsUnaryClassChecks());
   if (ic_data.NumberOfChecks() != 1) return false;
   ASSERT(ic_data.HasOneTarget());
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   TargetEntryInstr* entry;
   Definition* last;
   if (!TryInlineRecognizedMethod(ic_data.GetReceiverClassIdAt(0),
@@ -1785,12 +1774,12 @@
       const String& str = String::Cast(left_const->value());
       ASSERT(str.Length() == 1);
       ConstantInstr* char_code_left = flow_graph()->GetConstant(
-          Smi::ZoneHandle(isolate(), Smi::New(str.CharAt(0))));
-      left_val = new(isolate()) Value(char_code_left);
+          Smi::ZoneHandle(I, Smi::New(str.CharAt(0))));
+      left_val = new(I) Value(char_code_left);
     } else if (left->IsStringFromCharCode()) {
       // Use input of string-from-charcode as left value.
       StringFromCharCodeInstr* instr = left->AsStringFromCharCode();
-      left_val = new(isolate()) Value(instr->char_code()->definition());
+      left_val = new(I) Value(instr->char_code()->definition());
       to_remove_left = instr;
     } else {
       // IsLengthOneString(left) should have been false.
@@ -1802,12 +1791,11 @@
     if (right->IsStringFromCharCode()) {
       // Skip string-from-char-code, and use its input as right value.
       StringFromCharCodeInstr* right_instr = right->AsStringFromCharCode();
-      right_val = new(isolate()) Value(right_instr->char_code()->definition());
+      right_val = new(I) Value(right_instr->char_code()->definition());
       to_remove_right = right_instr;
     } else {
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1816,20 +1804,19 @@
       // String-to-char-code instructions returns -1 (illegal charcode) if
       // string is not of length one.
       StringToCharCodeInstr* char_code_right =
-          new(isolate()) StringToCharCodeInstr(
-              new(isolate()) Value(right), kOneByteStringCid);
+          new(I) StringToCharCodeInstr(new(I) Value(right), kOneByteStringCid);
       InsertBefore(call, char_code_right, call->env(), FlowGraph::kValue);
-      right_val = new(isolate()) Value(char_code_right);
+      right_val = new(I) Value(char_code_right);
     }
 
     // Comparing char-codes instead of strings.
     EqualityCompareInstr* comp =
-        new(isolate()) EqualityCompareInstr(call->token_pos(),
-                                            op_kind,
-                                            left_val,
-                                            right_val,
-                                            kSmiCid,
-                                            call->deopt_id());
+        new(I) EqualityCompareInstr(call->token_pos(),
+                                    op_kind,
+                                    left_val,
+                                    right_val,
+                                    kSmiCid,
+                                    call->deopt_id());
     ReplaceCall(call, comp);
 
     // Remove dead instructions.
@@ -1869,15 +1856,15 @@
     }
   } else if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(left),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(right),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -1895,9 +1882,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(isolate()) CheckEitherNonSmiInstr(
-                         new(isolate()) Value(left),
-                         new(isolate()) Value(right),
+                     new(I) CheckEitherNonSmiInstr(
+                         new(I) Value(left),
+                         new(I) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -1915,8 +1902,7 @@
                                               smi_or_null,
                                               smi_or_null)) {
       const ICData& unary_checks_0 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecks());
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
       AddCheckClass(left,
                     unary_checks_0,
                     call->deopt_id(),
@@ -1924,8 +1910,7 @@
                     call);
 
       const ICData& unary_checks_1 =
-          ICData::ZoneHandle(isolate(),
-                             call->ic_data()->AsUnaryClassChecksForArgNr(1));
+          ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecksForArgNr(1));
       AddCheckClass(right,
                     unary_checks_1,
                     call->deopt_id(),
@@ -1939,11 +1924,11 @@
       if ((right_const != NULL && right_const->value().IsNull()) ||
           (left_const != NULL && left_const->value().IsNull())) {
         StrictCompareInstr* comp =
-            new(isolate()) StrictCompareInstr(call->token_pos(),
-                                              Token::kEQ_STRICT,
-                                              new(isolate()) Value(left),
-                                              new(isolate()) Value(right),
-                                              false);  // No number check.
+            new(I) StrictCompareInstr(call->token_pos(),
+                                      Token::kEQ_STRICT,
+                                      new(I) Value(left),
+                                      new(I) Value(right),
+                                      false);  // No number check.
         ReplaceCall(call, comp);
         return true;
       }
@@ -1951,13 +1936,12 @@
     }
   }
   ASSERT(cid != kIllegalCid);
-  EqualityCompareInstr* comp = new(isolate()) EqualityCompareInstr(
-      call->token_pos(),
-      op_kind,
-      new(isolate()) Value(left),
-      new(isolate()) Value(right),
-      cid,
-      call->deopt_id());
+  EqualityCompareInstr* comp = new(I) EqualityCompareInstr(call->token_pos(),
+                                                           op_kind,
+                                                           new(I) Value(left),
+                                                           new(I) Value(right),
+                                                           cid,
+                                                           call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -1975,15 +1959,15 @@
   intptr_t cid = kIllegalCid;
   if (HasOnlyTwoOf(ic_data, kSmiCid)) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(left),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(right),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(right),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
     cid = kSmiCid;
@@ -2001,9 +1985,9 @@
         return false;
       } else {
         InsertBefore(call,
-                     new(isolate()) CheckEitherNonSmiInstr(
-                         new(isolate()) Value(left),
-                         new(isolate()) Value(right),
+                     new(I) CheckEitherNonSmiInstr(
+                         new(I) Value(left),
+                         new(I) Value(right),
                          call->deopt_id()),
                      call->env(),
                      FlowGraph::kEffect);
@@ -2014,13 +1998,12 @@
     return false;
   }
   ASSERT(cid != kIllegalCid);
-  RelationalOpInstr* comp = new(isolate()) RelationalOpInstr(
-      call->token_pos(),
-      op_kind,
-      new(isolate()) Value(left),
-      new(isolate()) Value(right),
-      cid,
-      call->deopt_id());
+  RelationalOpInstr* comp = new(I) RelationalOpInstr(call->token_pos(),
+                                                     op_kind,
+                                                     new(I) Value(left),
+                                                     new(I) Value(right),
+                                                     cid,
+                                                     call->deopt_id());
   ReplaceCall(call, comp);
   return true;
 }
@@ -2113,7 +2096,7 @@
             ? kMintCid
             : kSmiCid;
       } else if (HasTwoMintOrSmi(ic_data) &&
-                 HasOnlyOneSmi(ICData::Handle(isolate(),
+                 HasOnlyOneSmi(ICData::Handle(I,
                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
         // Don't generate mint code if the IC data is marked because of an
         // overflow.
@@ -2153,32 +2136,32 @@
     // returns a double for two smis.
     if (op_kind != Token::kDIV) {
       InsertBefore(call,
-                   new(isolate()) CheckEitherNonSmiInstr(
-                       new(isolate()) Value(left),
-                       new(isolate()) Value(right),
+                   new(I) CheckEitherNonSmiInstr(
+                       new(I) Value(left),
+                       new(I) Value(right),
                        call->deopt_id()),
                    call->env(),
                    FlowGraph::kEffect);
     }
 
     BinaryDoubleOpInstr* double_bin_op =
-        new(isolate()) BinaryDoubleOpInstr(op_kind,
-                                           new(isolate()) Value(left),
-                                           new(isolate()) Value(right),
-                                           call->deopt_id(), call->token_pos());
+        new(I) BinaryDoubleOpInstr(op_kind,
+                                   new(I) Value(left),
+                                   new(I) Value(right),
+                                   call->deopt_id(), call->token_pos());
     ReplaceCall(call, double_bin_op);
   } else if (operands_type == kMintCid) {
     if (!FlowGraphCompiler::SupportsUnboxedMints()) return false;
     if ((op_kind == Token::kSHR) || (op_kind == Token::kSHL)) {
       ShiftMintOpInstr* shift_op =
-          new(isolate()) ShiftMintOpInstr(
-              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          new(I) ShiftMintOpInstr(
+              op_kind, new(I) Value(left), new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, shift_op);
     } else {
       BinaryMintOpInstr* bin_op =
-          new(isolate()) BinaryMintOpInstr(
-              op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+          new(I) BinaryMintOpInstr(
+              op_kind, new(I) Value(left), new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, bin_op);
     }
@@ -2196,20 +2179,20 @@
         // Insert smi check and attach a copy of the original environment
         // because the smi operation can still deoptimize.
         InsertBefore(call,
-                     new(isolate()) CheckSmiInstr(new(isolate()) Value(left),
-                                                  call->deopt_id(),
-                                                  call->token_pos()),
+                     new(I) CheckSmiInstr(new(I) Value(left),
+                                          call->deopt_id(),
+                                          call->token_pos()),
                      call->env(),
                      FlowGraph::kEffect);
         ConstantInstr* constant =
-            flow_graph()->GetConstant(Smi::Handle(isolate(),
+            flow_graph()->GetConstant(Smi::Handle(I,
                 Smi::New(Smi::Cast(obj).Value() - 1)));
         BinarySmiOpInstr* bin_op =
-            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
-                                 new(isolate()) Value(left),
-                                 new(isolate()) Value(constant),
-                                 call->deopt_id(),
-                                 call->token_pos());
+            new(I) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(I) Value(left),
+                                    new(I) Value(constant),
+                                    call->deopt_id(),
+                                    call->token_pos());
         ReplaceCall(call, bin_op);
         return true;
       }
@@ -2219,9 +2202,9 @@
     AddCheckSmi(left, call->deopt_id(), call->env(), call);
     AddCheckSmi(right, call->deopt_id(), call->env(), call);
     BinarySmiOpInstr* bin_op =
-        new(isolate()) BinarySmiOpInstr(op_kind,
-                                        new(isolate()) Value(left),
-                                        new(isolate()) Value(right),
+        new(I) BinarySmiOpInstr(op_kind,
+                                        new(I) Value(left),
+                                        new(I) Value(right),
                                         call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   } else {
@@ -2238,8 +2221,8 @@
       right = temp;
     }
     BinarySmiOpInstr* bin_op =
-        new(isolate()) BinarySmiOpInstr(
-            op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+        new(I) BinarySmiOpInstr(
+            op_kind, new(I) Value(left), new(I) Value(right),
             call->deopt_id(), call->token_pos());
     ReplaceCall(call, bin_op);
   }
@@ -2254,24 +2237,24 @@
   Definition* unary_op = NULL;
   if (HasOnlyOneSmi(*call->ic_data())) {
     InsertBefore(call,
-                 new(isolate()) CheckSmiInstr(new(isolate()) Value(input),
-                                              call->deopt_id(),
-                                              call->token_pos()),
+                 new(I) CheckSmiInstr(new(I) Value(input),
+                                      call->deopt_id(),
+                                      call->token_pos()),
                  call->env(),
                  FlowGraph::kEffect);
-    unary_op = new(isolate()) UnarySmiOpInstr(
-        op_kind, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnarySmiOpInstr(
+        op_kind, new(I) Value(input), call->deopt_id());
   } else if ((op_kind == Token::kBIT_NOT) &&
              HasOnlySmiOrMint(*call->ic_data()) &&
              FlowGraphCompiler::SupportsUnboxedMints()) {
-    unary_op = new(isolate()) UnaryMintOpInstr(
-        op_kind, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnaryMintOpInstr(
+        op_kind, new(I) Value(input), call->deopt_id());
   } else if (HasOnlyOneDouble(*call->ic_data()) &&
              (op_kind == Token::kNEGATE) &&
              CanUnboxDouble()) {
     AddReceiverCheck(call);
-    unary_op = new(isolate()) UnaryDoubleOpInstr(
-        Token::kNEGATE, new(isolate()) Value(input), call->deopt_id());
+    unary_op = new(I) UnaryDoubleOpInstr(
+        Token::kNEGATE, new(I) Value(input), call->deopt_id());
   } else {
     return false;
   }
@@ -2283,8 +2266,9 @@
 
 // Using field class
 static RawField* GetField(intptr_t class_id, const String& field_name) {
-  Class& cls = Class::Handle(Isolate::Current()->class_table()->At(class_id));
-  Field& field = Field::Handle();
+  Isolate* isolate = Isolate::Current();
+  Class& cls = Class::Handle(isolate, isolate->class_table()->At(class_id));
+  Field& field = Field::Handle(isolate);
   while (!cls.IsNull()) {
     field = cls.LookupInstanceField(field_name);
     if (!field.IsNull()) {
@@ -2308,7 +2292,7 @@
   if (function.IsDynamicFunction() &&
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
-    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
+    return CHA::HasOverride(Class::Handle(I, function.Owner()),
                             call->function_name());
   }
   return true;
@@ -2325,9 +2309,8 @@
       callee_receiver->IsParameter() &&
       (callee_receiver->AsParameter()->index() == 0)) {
     const String& field_name =
-      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
-    return CHA::HasOverride(Class::Handle(isolate(), function.Owner()),
-                            field_name);
+      String::Handle(I, Field::NameFromGetter(call->function_name()));
+    return CHA::HasOverride(Class::Handle(I, function.Owner()), field_name);
   }
   return true;
 }
@@ -2337,24 +2320,24 @@
   ASSERT(call->HasICData());
   const ICData& ic_data = *call->ic_data();
   ASSERT(ic_data.HasOneTarget());
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   ASSERT(class_ids.length() == 1);
   // Inline implicit instance getter.
   const String& field_name =
-      String::Handle(isolate(), Field::NameFromGetter(call->function_name()));
+      String::Handle(I, Field::NameFromGetter(call->function_name()));
   const Field& field =
-      Field::ZoneHandle(isolate(), GetField(class_ids[0], field_name));
+      Field::ZoneHandle(I, GetField(class_ids[0], field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(call)) {
     AddReceiverCheck(call);
   }
-  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
-      new(isolate()) Value(call->ArgumentAt(0)),
+  LoadFieldInstr* load = new(I) LoadFieldInstr(
+      new(I) Value(call->ArgumentAt(0)),
       &field,
-      AbstractType::ZoneHandle(isolate(), field.type()),
+      AbstractType::ZoneHandle(I, field.type()),
       call->token_pos());
   load->set_is_immutable(field.is_final());
   if (field.guarded_cid() != kIllegalCid) {
@@ -2384,10 +2367,10 @@
   // Treat length loads as mutable (i.e. affected by side effects) to avoid
   // hoisting them since we can't hoist the preceding class-check. This
   // is because of externalization of strings that affects their class-id.
-  LoadFieldInstr* load = new(isolate()) LoadFieldInstr(
-      new(isolate()) Value(str),
+  LoadFieldInstr* load = new(I) LoadFieldInstr(
+      new(I) Value(str),
       String::length_offset(),
-      Type::ZoneHandle(isolate(), Type::SmiType()),
+      Type::ZoneHandle(I, Type::SmiType()),
       str->token_pos());
   load->set_result_cid(kSmiCid);
   load->set_recognized_kind(MethodRecognizer::kStringBaseLength);
@@ -2402,7 +2385,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2436,17 +2419,17 @@
     }
   }
   if (getter == MethodRecognizer::kFloat32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kFloat32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
-        new(isolate()) Value(call->ArgumentAt(1)),
+        new(I) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2457,9 +2440,9 @@
            (getter == MethodRecognizer::kFloat32x4ShuffleY) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleZ) ||
            (getter == MethodRecognizer::kFloat32x4ShuffleW));
-    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2477,15 +2460,15 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   if ((getter == MethodRecognizer::kFloat64x2GetX) ||
       (getter == MethodRecognizer::kFloat64x2GetY)) {
-    Simd64x2ShuffleInstr* instr = new(isolate()) Simd64x2ShuffleInstr(
+    Simd64x2ShuffleInstr* instr = new(I) Simd64x2ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         0,
         call->deopt_id());
     ReplaceCall(call, instr);
@@ -2503,7 +2486,7 @@
   }
   AddCheckClass(call->ArgumentAt(0),
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
@@ -2537,33 +2520,33 @@
     }
   }
   if (getter == MethodRecognizer::kInt32x4GetSignMask) {
-    Simd32x4GetSignMaskInstr* instr = new(isolate()) Simd32x4GetSignMaskInstr(
+    Simd32x4GetSignMaskInstr* instr = new(I) Simd32x4GetSignMaskInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4ShuffleMix) {
-    Simd32x4ShuffleMixInstr* instr = new(isolate()) Simd32x4ShuffleMixInstr(
+    Simd32x4ShuffleMixInstr* instr = new(I) Simd32x4ShuffleMixInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
-        new(isolate()) Value(call->ArgumentAt(1)),
+        new(I) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(1)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else if (getter == MethodRecognizer::kInt32x4Shuffle) {
-    Simd32x4ShuffleInstr* instr = new(isolate()) Simd32x4ShuffleInstr(
+    Simd32x4ShuffleInstr* instr = new(I) Simd32x4ShuffleInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         mask,
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
   } else {
-    Int32x4GetFlagInstr* instr = new(isolate()) Int32x4GetFlagInstr(
+    Int32x4GetFlagInstr* instr = new(I) Int32x4GetFlagInstr(
         getter,
-        new(isolate()) Value(call->ArgumentAt(0)),
+        new(I) Value(call->ArgumentAt(0)),
         call->deopt_id());
     ReplaceCall(call, instr);
     return true;
@@ -2582,21 +2565,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(1)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryFloat32x4OpInstr* float32x4_bin_op =
-      new(isolate()) BinaryFloat32x4OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryFloat32x4OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, float32x4_bin_op);
 
@@ -2615,21 +2598,21 @@
   // Type check left.
   AddCheckClass(left,
                 ICData::ZoneHandle(
-                    isolate(), call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                    I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Type check right.
   AddCheckClass(right,
-                ICData::ZoneHandle(isolate(),
+                ICData::ZoneHandle(I,
                     call->ic_data()->AsUnaryClassChecksForArgNr(1)),
                 call->deopt_id(),
                 call->env(),
                 call);
   // Replace call.
   BinaryInt32x4OpInstr* int32x4_bin_op =
-      new(isolate()) BinaryInt32x4OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryInt32x4OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, int32x4_bin_op);
   return true;
@@ -2660,8 +2643,8 @@
                 call);
   // Replace call.
   BinaryFloat64x2OpInstr* float64x2_bin_op =
-      new(isolate()) BinaryFloat64x2OpInstr(
-          op_kind, new(isolate()) Value(left), new(isolate()) Value(right),
+      new(I) BinaryFloat64x2OpInstr(
+          op_kind, new(I) Value(left), new(I) Value(right),
           call->deopt_id());
   ReplaceCall(call, float64x2_bin_op);
   return true;
@@ -2683,7 +2666,7 @@
     return false;
   }
 
-  const Function& target = Function::Handle(isolate(), ic_data.GetTargetAt(0));
+  const Function& target = Function::Handle(I, ic_data.GetTargetAt(0));
   if (target.kind() != RawFunction::kImplicitGetter) {
     // Non-implicit getters are inlined like normal methods by conventional
     // inlining in FlowGraphInliner.
@@ -2697,7 +2680,7 @@
 bool FlowGraphOptimizer::TryReplaceInstanceCallWithInline(
     InstanceCallInstr* call) {
   ASSERT(call->HasICData());
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   call->ic_data()->GetCheckAt(0, &class_ids, &target);
   const intptr_t receiver_cid = class_ids[0];
@@ -2747,8 +2730,8 @@
     Instruction* cursor) {
 
   cursor = flow_graph()->AppendTo(cursor,
-                                  new(isolate()) CheckSmiInstr(
-                                      new(isolate()) Value(index),
+                                  new(I) CheckSmiInstr(
+                                      new(I) Value(index),
                                       call->deopt_id(),
                                       call->token_pos()),
                                   call->env(),
@@ -2759,16 +2742,16 @@
   cursor = flow_graph()->AppendTo(cursor, length, NULL, FlowGraph::kValue);
   // Bounds check.
   cursor = flow_graph()->AppendTo(cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(length),
-                                       new(isolate()) Value(index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(length),
+                                       new(I) Value(index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
-  LoadIndexedInstr* load_indexed = new(isolate()) LoadIndexedInstr(
-      new(isolate()) Value(str),
-      new(isolate()) Value(index),
+  LoadIndexedInstr* load_indexed = new(I) LoadIndexedInstr(
+      new(I) Value(str),
+      new(I) Value(index),
       Instance::ElementSizeFor(cid),
       cid,
       Isolate::kNoDeoptId,
@@ -2796,9 +2779,9 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
@@ -2818,14 +2801,14 @@
   Definition* str = call->ArgumentAt(0);
   Definition* index = call->ArgumentAt(1);
 
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
 
   *last = PrepareInlineStringIndexOp(call, cid, str, index, *entry);
 
-  StringFromCharCodeInstr* char_at = new(isolate()) StringFromCharCodeInstr(
-      new(isolate()) Value(*last), cid);
+  StringFromCharCodeInstr* char_at = new(I) StringFromCharCodeInstr(
+      new(I) Value(*last), cid);
 
   flow_graph()->AppendTo(*last, char_at, NULL, FlowGraph::kValue);
   *last = char_at;
@@ -2839,15 +2822,15 @@
     MethodRecognizer::Kind recognized_kind) {
   AddReceiverCheck(call);
   ZoneGrowableArray<Value*>* args =
-      new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
+      new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
   for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-    args->Add(new(isolate()) Value(call->ArgumentAt(i)));
+    args->Add(new(I) Value(call->ArgumentAt(i)));
   }
   InvokeMathCFunctionInstr* invoke =
-      new(isolate()) InvokeMathCFunctionInstr(args,
-                                              call->deopt_id(),
-                                              recognized_kind,
-                                              call->token_pos());
+      new(I) InvokeMathCFunctionInstr(args,
+                                      call->deopt_id(),
+                                      recognized_kind,
+                                      call->token_pos());
   ReplaceCall(call, invoke);
 }
 
@@ -2883,7 +2866,7 @@
     return false;
   }
 
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   GrowableArray<intptr_t> class_ids;
   ic_data.GetCheckAt(0, &class_ids, &target);
   MethodRecognizer::Kind recognized_kind =
@@ -2895,10 +2878,10 @@
     // This is an internal method, no need to check argument types.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
         GrowableObjectArray::data_offset(),
-        new(isolate()) Value(array),
-        new(isolate()) Value(value),
+        new(I) Value(array),
+        new(I) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2912,10 +2895,10 @@
     // range.
     Definition* array = call->ArgumentAt(0);
     Definition* value = call->ArgumentAt(1);
-    StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+    StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
         GrowableObjectArray::length_offset(),
-        new(isolate()) Value(array),
-        new(isolate()) Value(value),
+        new(I) Value(array),
+        new(I) Value(value),
         kEmitStoreBarrier,
         call->token_pos());
     ReplaceCall(call, store);
@@ -2937,10 +2920,10 @@
       Definition* str = call->ArgumentAt(0);
       Definition* index = call->ArgumentAt(1);
       Definition* value = call->ArgumentAt(2);
-      StoreIndexedInstr* store_op = new(isolate()) StoreIndexedInstr(
-          new(isolate()) Value(str),
-          new(isolate()) Value(index),
-          new(isolate()) Value(value),
+      StoreIndexedInstr* store_op = new(I) StoreIndexedInstr(
+          new(I) Value(str),
+          new(I) Value(index),
+          new(I) Value(value),
           kNoStoreBarrier,
           1,  // Index scale
           kOneByteStringCid,
@@ -2958,8 +2941,8 @@
       (class_ids[0] == kSmiCid)) {
     AddReceiverCheck(call);
     ReplaceCall(call,
-                new(isolate()) SmiToDoubleInstr(
-                    new(isolate()) Value(call->ArgumentAt(0)),
+                new(I) SmiToDoubleInstr(
+                    new(I) Value(call->ArgumentAt(0)),
                     call->token_pos()));
     return true;
   }
@@ -2977,12 +2960,12 @@
         Definition* d2i_instr = NULL;
         if (ic_data.HasDeoptReason(ICData::kDeoptDoubleToSmi)) {
           // Do not repeatedly deoptimize because result didn't fit into Smi.
-          d2i_instr =  new(isolate()) DoubleToIntegerInstr(
-              new(isolate()) Value(input), call);
+          d2i_instr =  new(I) DoubleToIntegerInstr(
+              new(I) Value(input), call);
         } else {
           // Optimistically assume result fits into Smi.
-          d2i_instr = new(isolate()) DoubleToSmiInstr(
-              new(isolate()) Value(input), call->deopt_id());
+          d2i_instr = new(I) DoubleToSmiInstr(
+              new(I) Value(input), call->deopt_id());
         }
         ReplaceCall(call, d2i_instr);
         return true;
@@ -2999,9 +2982,8 @@
         } else {
           AddReceiverCheck(call);
           DoubleToDoubleInstr* d2d_instr =
-              new(isolate()) DoubleToDoubleInstr(
-                  new(isolate()) Value(call->ArgumentAt(0)),
-                  recognized_kind, call->deopt_id());
+              new(I) DoubleToDoubleInstr(new(I) Value(call->ArgumentAt(0)),
+                                         recognized_kind, call->deopt_id());
           ReplaceCall(call, d2d_instr);
         }
         return true;
@@ -3118,10 +3100,10 @@
         return false;
       }
       BinarySmiOpInstr* left_shift =
-          new(isolate()) BinarySmiOpInstr(Token::kSHL,
-                                          new(isolate()) Value(value),
-                                          new(isolate()) Value(count),
-                                          call->deopt_id(), call->token_pos());
+          new(I) BinarySmiOpInstr(Token::kSHL,
+                                  new(I) Value(value),
+                                  new(I) Value(count),
+                                  call->deopt_id(), call->token_pos());
       left_shift->set_is_truncating(true);
       if ((kBitsPerWord == 32) && (mask_value == 0xffffffffLL)) {
         // No BIT_AND operation needed.
@@ -3129,34 +3111,34 @@
       } else {
         InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
         BinarySmiOpInstr* bit_and =
-            new(isolate()) BinarySmiOpInstr(Token::kBIT_AND,
-                                            new(isolate()) Value(left_shift),
-                                            new(isolate()) Value(int32_mask),
-                                            call->deopt_id(),
-                                            call->token_pos());
+            new(I) BinarySmiOpInstr(Token::kBIT_AND,
+                                    new(I) Value(left_shift),
+                                    new(I) Value(int32_mask),
+                                    call->deopt_id(),
+                                    call->token_pos());
         ReplaceCall(call, bit_and);
       }
       return true;
     }
 
     if (HasTwoMintOrSmi(ic_data) &&
-        HasOnlyOneSmi(ICData::Handle(isolate(),
+        HasOnlyOneSmi(ICData::Handle(I,
                                      ic_data.AsUnaryClassChecksForArgNr(1)))) {
       if (!FlowGraphCompiler::SupportsUnboxedMints() ||
           ic_data.HasDeoptReason(ICData::kDeoptShiftMintOp)) {
         return false;
       }
       ShiftMintOpInstr* left_shift =
-          new(isolate()) ShiftMintOpInstr(Token::kSHL,
-                                          new(isolate()) Value(value),
-                                          new(isolate()) Value(count),
-                                          call->deopt_id());
+          new(I) ShiftMintOpInstr(Token::kSHL,
+                                  new(I) Value(value),
+                                  new(I) Value(count),
+                                  call->deopt_id());
       InsertBefore(call, left_shift, call->env(), FlowGraph::kValue);
       BinaryMintOpInstr* bit_and =
-          new(isolate()) BinaryMintOpInstr(Token::kBIT_AND,
-                                           new(isolate()) Value(left_shift),
-                                           new(isolate()) Value(int32_mask),
-                                           call->deopt_id());
+          new(I) BinaryMintOpInstr(Token::kBIT_AND,
+                                   new(I) Value(left_shift),
+                                   new(I) Value(int32_mask),
+                                   call->deopt_id());
       ReplaceCall(call, bit_and);
       return true;
     }
@@ -3173,35 +3155,35 @@
   }
   if (recognized_kind == MethodRecognizer::kFloat32x4Zero) {
     Float32x4ZeroInstr* zero =
-        new(isolate()) Float32x4ZeroInstr(call->deopt_id());
+        new(I) Float32x4ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Splat) {
     Float32x4SplatInstr* splat =
-        new(isolate()) Float32x4SplatInstr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4SplatInstr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4Constructor) {
     Float32x4ConstructorInstr* con =
-        new(isolate()) Float32x4ConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
-            new(isolate()) Value(call->ArgumentAt(3)),
-            new(isolate()) Value(call->ArgumentAt(4)),
+        new(I) Float32x4ConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
+            new(I) Value(call->ArgumentAt(3)),
+            new(I) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromInt32x4Bits) {
     Int32x4ToFloat32x4Instr* cast =
-        new(isolate()) Int32x4ToFloat32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Int32x4ToFloat32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat32x4FromFloat64x2) {
     Float64x2ToFloat32x4Instr* cast =
-        new(isolate()) Float64x2ToFloat32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float64x2ToFloat32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3217,27 +3199,27 @@
   }
   if (recognized_kind == MethodRecognizer::kFloat64x2Zero) {
     Float64x2ZeroInstr* zero =
-        new(isolate()) Float64x2ZeroInstr(call->deopt_id());
+        new(I) Float64x2ZeroInstr(call->deopt_id());
     ReplaceCall(call, zero);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Splat) {
     Float64x2SplatInstr* splat =
-        new(isolate()) Float64x2SplatInstr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float64x2SplatInstr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, splat);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2Constructor) {
     Float64x2ConstructorInstr* con =
-        new(isolate()) Float64x2ConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
+        new(I) Float64x2ConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kFloat64x2FromFloat32x4) {
     Float32x4ToFloat64x2Instr* cast =
-        new(isolate()) Float32x4ToFloat64x2Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4ToFloat64x2Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3253,18 +3235,18 @@
   }
   if (recognized_kind == MethodRecognizer::kInt32x4BoolConstructor) {
     Int32x4BoolConstructorInstr* con =
-        new(isolate()) Int32x4BoolConstructorInstr(
-            new(isolate()) Value(call->ArgumentAt(1)),
-            new(isolate()) Value(call->ArgumentAt(2)),
-            new(isolate()) Value(call->ArgumentAt(3)),
-            new(isolate()) Value(call->ArgumentAt(4)),
+        new(I) Int32x4BoolConstructorInstr(
+            new(I) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(2)),
+            new(I) Value(call->ArgumentAt(3)),
+            new(I) Value(call->ArgumentAt(4)),
             call->deopt_id());
     ReplaceCall(call, con);
     return true;
   } else if (recognized_kind == MethodRecognizer::kInt32x4FromFloat32x4Bits) {
     Float32x4ToInt32x4Instr* cast =
-        new(isolate()) Float32x4ToInt32x4Instr(
-            new(isolate()) Value(call->ArgumentAt(1)), call->deopt_id());
+        new(I) Float32x4ToInt32x4Instr(
+            new(I) Value(call->ArgumentAt(1)), call->deopt_id());
     ReplaceCall(call, cast);
     return true;
   }
@@ -3300,18 +3282,16 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       // Replace call.
       Float32x4ComparisonInstr* cmp =
-          new(isolate()) Float32x4ComparisonInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
-              call->deopt_id());
+          new(I) Float32x4ComparisonInstr(recognized_kind,
+                                          new(I) Value(left),
+                                          new(I) Value(right),
+                                          call->deopt_id());
       ReplaceCall(call, cmp);
       return true;
     }
@@ -3322,16 +3302,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4MinMaxInstr* minmax =
-          new(isolate()) Float32x4MinMaxInstr(
+          new(I) Float32x4MinMaxInstr(
               recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
+              new(I) Value(left),
+              new(I) Value(right),
               call->deopt_id());
       ReplaceCall(call, minmax);
       return true;
@@ -3342,8 +3321,7 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
@@ -3351,11 +3329,10 @@
       // this is done so that the double value is loaded into the output
       // register and can be destroyed.
       Float32x4ScaleInstr* scale =
-          new(isolate()) Float32x4ScaleInstr(
-              recognized_kind,
-              new(isolate()) Value(right),
-              new(isolate()) Value(left),
-              call->deopt_id());
+          new(I) Float32x4ScaleInstr(recognized_kind,
+                                     new(I) Value(right),
+                                     new(I) Value(left),
+                                     call->deopt_id());
       ReplaceCall(call, scale);
       return true;
     }
@@ -3365,16 +3342,14 @@
       Definition* left = call->ArgumentAt(0);
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4SqrtInstr* sqrt =
-          new(isolate()) Float32x4SqrtInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              call->deopt_id());
+          new(I) Float32x4SqrtInstr(recognized_kind,
+                                    new(I) Value(left),
+                                    call->deopt_id());
       ReplaceCall(call, sqrt);
       return true;
     }
@@ -3387,16 +3362,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4WithInstr* with = new(isolate()) Float32x4WithInstr(
-          recognized_kind,
-          new(isolate()) Value(left),
-          new(isolate()) Value(right),
-          call->deopt_id());
+      Float32x4WithInstr* with = new(I) Float32x4WithInstr(recognized_kind,
+                                                           new(I) Value(left),
+                                                           new(I) Value(right),
+                                                           call->deopt_id());
       ReplaceCall(call, with);
       return true;
     }
@@ -3406,14 +3379,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float32x4ZeroArgInstr* zeroArg =
-          new(isolate()) Float32x4ZeroArgInstr(
-              recognized_kind, new(isolate()) Value(left), call->deopt_id());
+          new(I) Float32x4ZeroArgInstr(
+              recognized_kind, new(I) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3424,15 +3396,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Float32x4ClampInstr* clamp = new(isolate()) Float32x4ClampInstr(
-          new(isolate()) Value(left),
-          new(isolate()) Value(lower),
-          new(isolate()) Value(upper),
+      Float32x4ClampInstr* clamp = new(I) Float32x4ClampInstr(
+          new(I) Value(left),
+          new(I) Value(lower),
+          new(I) Value(upper),
           call->deopt_id());
       ReplaceCall(call, clamp);
       return true;
@@ -3468,14 +3439,13 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2ZeroArgInstr* zeroArg =
-          new(isolate()) Float64x2ZeroArgInstr(
-              recognized_kind, new(isolate()) Value(left), call->deopt_id());
+          new(I) Float64x2ZeroArgInstr(
+              recognized_kind, new(I) Value(left), call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3489,17 +3459,15 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
       Float64x2OneArgInstr* zeroArg =
-          new(isolate()) Float64x2OneArgInstr(
-              recognized_kind,
-              new(isolate()) Value(left),
-              new(isolate()) Value(right),
-              call->deopt_id());
+          new(I) Float64x2OneArgInstr(recognized_kind,
+                                      new(I) Value(left),
+                                      new(I) Value(right),
+                                      call->deopt_id());
       ReplaceCall(call, zeroArg);
       return true;
     }
@@ -3535,15 +3503,14 @@
       // Type check left.
       AddCheckClass(mask,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SelectInstr* select = new(isolate()) Int32x4SelectInstr(
-          new(isolate()) Value(mask),
-          new(isolate()) Value(trueValue),
-          new(isolate()) Value(falseValue),
+      Int32x4SelectInstr* select = new(I) Int32x4SelectInstr(
+          new(I) Value(mask),
+          new(I) Value(trueValue),
+          new(I) Value(falseValue),
           call->deopt_id());
       ReplaceCall(call, select);
       return true;
@@ -3557,15 +3524,14 @@
       // Type check left.
       AddCheckClass(left,
                     ICData::ZoneHandle(
-                        isolate(),
-                        call->ic_data()->AsUnaryClassChecksForArgNr(0)),
+                        I, call->ic_data()->AsUnaryClassChecksForArgNr(0)),
                     call->deopt_id(),
                     call->env(),
                     call);
-      Int32x4SetFlagInstr* setFlag = new(isolate()) Int32x4SetFlagInstr(
+      Int32x4SetFlagInstr* setFlag = new(I) Int32x4SetFlagInstr(
           recognized_kind,
-          new(isolate()) Value(left),
-          new(isolate()) Value(flag),
+          new(I) Value(left),
+          new(I) Value(flag),
           call->deopt_id());
       ReplaceCall(call, setFlag);
       return true;
@@ -3586,9 +3552,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3607,12 +3573,12 @@
         Isolate::kNoDeoptId : call->deopt_id();
   }
 
-  *last = new(isolate()) LoadIndexedInstr(new(isolate()) Value(array),
-                                          new(isolate()) Value(index),
-                                          1,
-                                          view_cid,
-                                          deopt_id,
-                                          call->token_pos());
+  *last = new(I) LoadIndexedInstr(new(I) Value(array),
+                                  new(I) Value(index),
+                                  1,
+                                  view_cid,
+                                  deopt_id,
+                                  call->token_pos());
   cursor = flow_graph()->AppendTo(
       cursor,
       *last,
@@ -3620,8 +3586,7 @@
       FlowGraph::kValue);
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    *last = new(isolate()) FloatToDoubleInstr(
-        new(isolate()) Value(*last), deopt_id);
+    *last = new(I) FloatToDoubleInstr(new(I) Value(*last), deopt_id);
     flow_graph()->AppendTo(cursor,
                            *last,
                            deopt_id != Isolate::kNoDeoptId ? call->env() : NULL,
@@ -3642,9 +3607,9 @@
   ASSERT(array_cid != kIllegalCid);
   Definition* array = receiver;
   Definition* index = call->ArgumentAt(1);
-  *entry = new(isolate()) TargetEntryInstr(flow_graph()->allocate_block_id(),
-                                           call->GetBlock()->try_index());
-  (*entry)->InheritDeoptTarget(isolate(), call);
+  *entry = new(I) TargetEntryInstr(flow_graph()->allocate_block_id(),
+                                   call->GetBlock()->try_index());
+  (*entry)->InheritDeoptTarget(I, call);
   Instruction* cursor = *entry;
 
   array_cid = PrepareInlineByteArrayViewOp(call,
@@ -3664,7 +3629,7 @@
     i_call = call->AsInstanceCall();
   }
   ASSERT(i_call != NULL);
-  ICData& value_check = ICData::ZoneHandle(isolate(), ICData::null());
+  ICData& value_check = ICData::ZoneHandle(I);
   switch (view_cid) {
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
@@ -3739,8 +3704,8 @@
   }
 
   if (view_cid == kTypedDataFloat32ArrayCid) {
-    stored_value = new(isolate()) DoubleToFloatInstr(
-        new(isolate()) Value(stored_value), call->deopt_id());
+    stored_value = new(I) DoubleToFloatInstr(
+        new(I) Value(stored_value), call->deopt_id());
     cursor = flow_graph()->AppendTo(cursor,
                                     stored_value,
                                     NULL,
@@ -3748,14 +3713,14 @@
   }
 
   StoreBarrierType needs_store_barrier = kNoStoreBarrier;
-  *last = new(isolate()) StoreIndexedInstr(new(isolate()) Value(array),
-                                           new(isolate()) Value(index),
-                                           new(isolate()) Value(stored_value),
-                                           needs_store_barrier,
-                                           1,  // Index scale
-                                           view_cid,
-                                           call->deopt_id(),
-                                           call->token_pos());
+  *last = new(I) StoreIndexedInstr(new(I) Value(array),
+                                   new(I) Value(index),
+                                   new(I) Value(stored_value),
+                                   needs_store_barrier,
+                                   1,  // Index scale
+                                   view_cid,
+                                   call->deopt_id(),
+                                   call->token_pos());
 
   flow_graph()->AppendTo(cursor,
                          *last,
@@ -3776,18 +3741,18 @@
     Instruction** cursor) {
   // Insert byte_index smi check.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckSmiInstr(
-                                       new(isolate()) Value(byte_index),
+                                   new(I) CheckSmiInstr(
+                                       new(I) Value(byte_index),
                                        call->deopt_id(),
                                        call->token_pos()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   LoadFieldInstr* length =
-      new(isolate()) LoadFieldInstr(
-          new(isolate()) Value(*array),
+      new(I) LoadFieldInstr(
+          new(I) Value(*array),
           CheckArrayBoundInstr::LengthOffsetFor(array_cid),
-          Type::ZoneHandle(isolate(), Type::SmiType()),
+          Type::ZoneHandle(I, Type::SmiType()),
           call->token_pos());
   length->set_is_immutable(true);
   length->set_result_cid(kSmiCid);
@@ -3800,50 +3765,50 @@
 
   intptr_t element_size = Instance::ElementSizeFor(array_cid);
   ConstantInstr* bytes_per_element =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(element_size)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(element_size)));
   BinarySmiOpInstr* len_in_bytes =
-      new(isolate()) BinarySmiOpInstr(Token::kMUL,
-                                      new(isolate()) Value(length),
-                                      new(isolate()) Value(bytes_per_element),
-                                      call->deopt_id(), call->token_pos());
+      new(I) BinarySmiOpInstr(Token::kMUL,
+                              new(I) Value(length),
+                              new(I) Value(bytes_per_element),
+                              call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, len_in_bytes, call->env(),
                                    FlowGraph::kValue);
 
   ConstantInstr* length_adjustment =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(
           Instance::ElementSizeFor(view_cid) - 1)));
   // adjusted_length = len_in_bytes - (element_size - 1).
   BinarySmiOpInstr* adjusted_length =
-      new(isolate()) BinarySmiOpInstr(Token::kSUB,
-                                      new(isolate()) Value(len_in_bytes),
-                                      new(isolate()) Value(length_adjustment),
-                                      call->deopt_id(), call->token_pos());
+      new(I) BinarySmiOpInstr(Token::kSUB,
+                              new(I) Value(len_in_bytes),
+                              new(I) Value(length_adjustment),
+                              call->deopt_id(), call->token_pos());
   *cursor = flow_graph()->AppendTo(*cursor, adjusted_length, call->env(),
                                    FlowGraph::kValue);
 
   // Check adjusted_length > 0.
   ConstantInstr* zero =
-      flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(0)));
+      flow_graph()->GetConstant(Smi::Handle(I, Smi::New(0)));
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(adjusted_length),
-                                       new(isolate()) Value(zero),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(adjusted_length),
+                                       new(I) Value(zero),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
   // Check 0 <= byte_index < adjusted_length.
   *cursor = flow_graph()->AppendTo(*cursor,
-                                   new(isolate()) CheckArrayBoundInstr(
-                                       new(isolate()) Value(adjusted_length),
-                                       new(isolate()) Value(byte_index),
+                                   new(I) CheckArrayBoundInstr(
+                                       new(I) Value(adjusted_length),
+                                       new(I) Value(byte_index),
                                        call->deopt_id()),
                                    call->env(),
                                    FlowGraph::kEffect);
 
   if (RawObject::IsExternalTypedDataClassId(array_cid)) {
     LoadUntaggedInstr* elements =
-        new(isolate()) LoadUntaggedInstr(new(isolate()) Value(*array),
-                                         ExternalTypedData::data_offset());
+        new(I) LoadUntaggedInstr(new(I) Value(*array),
+                                 ExternalTypedData::data_offset());
     *cursor = flow_graph()->AppendTo(*cursor,
                                      elements,
                                      NULL,
@@ -3901,7 +3866,7 @@
   if (!type.IsInstantiated() || type.IsMalformedOrMalbounded()) {
     return Bool::null();
   }
-  const Class& type_class = Class::Handle(isolate(), type.type_class());
+  const Class& type_class = Class::Handle(I, type.type_class());
   const intptr_t num_type_args = type_class.NumTypeArguments();
   if (num_type_args > 0) {
     // Only raw types can be directly compared, thus disregarding type
@@ -3909,7 +3874,7 @@
     const intptr_t num_type_params = type_class.NumTypeParameters();
     const intptr_t from_index = num_type_args - num_type_params;
     const TypeArguments& type_arguments =
-        TypeArguments::Handle(isolate(), type.arguments());
+        TypeArguments::Handle(I, type.arguments());
     const bool is_raw_type = type_arguments.IsNull() ||
         type_arguments.IsRaw(from_index, num_type_params);
     if (!is_raw_type) {
@@ -3919,8 +3884,8 @@
   }
 
   const ClassTable& class_table = *isolate()->class_table();
-  Bool& prev = Bool::Handle(isolate(), Bool::null());
-  Class& cls = Class::Handle(isolate(), Class::null());
+  Bool& prev = Bool::Handle(I);
+  Class& cls = Class::Handle(I);
 
   bool results_differ = false;
   for (int i = 0; i < ic_data.NumberOfChecks(); i++) {
@@ -3929,9 +3894,9 @@
       return Bool::null();
     }
     const bool is_subtype = cls.IsSubtypeOf(
-        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        TypeArguments::Handle(I),
         type_class,
-        TypeArguments::Handle(isolate(), TypeArguments::null()),
+        TypeArguments::Handle(I),
         NULL);
     results->Add(cls.id());
     results->Add(is_subtype);
@@ -4043,7 +4008,7 @@
   const bool negate = Bool::Cast(
       call->ArgumentAt(4)->OriginalDefinition()->AsConstant()->value()).value();
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4055,18 +4020,16 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(isolate()) ZoneGrowableArray<intptr_t>(
-            unary_checks.NumberOfChecks() * 2);
+        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
     Bool& as_bool =
-        Bool::ZoneHandle(isolate(),
-                         InstanceOfAsBool(unary_checks, type, results));
+        Bool::ZoneHandle(I, InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.IsNull()) {
       if (results->length() == unary_checks.NumberOfChecks() * 2) {
         const bool can_deopt = TryExpandTestCidsResult(results, type);
-        TestCidsInstr* test_cids = new(isolate()) TestCidsInstr(
+        TestCidsInstr* test_cids = new(I) TestCidsInstr(
             call->token_pos(),
             negate ? Token::kISNOT : Token::kIS,
-            new(isolate()) Value(left),
+            new(I) Value(left),
             *results,
             can_deopt ? call->deopt_id() : Isolate::kNoDeoptId);
         // Remove type.
@@ -4094,35 +4057,34 @@
   }
 
   if (TypeCheckAsClassEquality(type)) {
-    LoadClassIdInstr* left_cid =
-        new(isolate()) LoadClassIdInstr(new(isolate()) Value(left));
+    LoadClassIdInstr* left_cid = new(I) LoadClassIdInstr(new(I) Value(left));
     InsertBefore(call,
                  left_cid,
                  NULL,
                  FlowGraph::kValue);
-    const intptr_t type_cid = Class::Handle(isolate(), type.type_class()).id();
+    const intptr_t type_cid = Class::Handle(I, type.type_class()).id();
     ConstantInstr* cid =
-        flow_graph()->GetConstant(Smi::Handle(isolate(), Smi::New(type_cid)));
+        flow_graph()->GetConstant(Smi::Handle(I, Smi::New(type_cid)));
 
     StrictCompareInstr* check_cid =
-        new(isolate()) StrictCompareInstr(
+        new(I) StrictCompareInstr(
             call->token_pos(),
             negate ? Token::kNE_STRICT : Token::kEQ_STRICT,
-            new(isolate()) Value(left_cid),
-            new(isolate()) Value(cid),
+            new(I) Value(left_cid),
+            new(I) Value(cid),
             false);  // No number check.
     ReplaceCall(call, check_cid);
     return;
   }
 
   InstanceOfInstr* instance_of =
-      new(isolate()) InstanceOfInstr(call->token_pos(),
-                                     new(isolate()) Value(left),
-                                     new(isolate()) Value(instantiator),
-                                     new(isolate()) Value(type_args),
-                                     type,
-                                     negate,
-                                     call->deopt_id());
+      new(I) InstanceOfInstr(call->token_pos(),
+                             new(I) Value(left),
+                             new(I) Value(instantiator),
+                             new(I) Value(type_args),
+                             type,
+                             negate,
+                             call->deopt_id());
   ReplaceCall(call, instance_of);
 }
 
@@ -4137,7 +4099,7 @@
       AbstractType::Cast(call->ArgumentAt(3)->AsConstant()->value());
   ASSERT(!type.IsMalformedOrMalbounded());
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), call->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, call->ic_data()->AsUnaryClassChecks());
   if (FLAG_warn_on_javascript_compatibility &&
       !unary_checks.IssuedJSWarning() &&
       (type.IsIntType() || type.IsDoubleType() || !type.IsInstantiated())) {
@@ -4149,9 +4111,8 @@
   }
   if (unary_checks.NumberOfChecks() <= FLAG_max_polymorphic_checks) {
     ZoneGrowableArray<intptr_t>* results =
-        new(isolate()) ZoneGrowableArray<intptr_t>(
-            unary_checks.NumberOfChecks() * 2);
-    const Bool& as_bool = Bool::ZoneHandle(isolate(),
+        new(I) ZoneGrowableArray<intptr_t>(unary_checks.NumberOfChecks() * 2);
+    const Bool& as_bool = Bool::ZoneHandle(I,
         InstanceOfAsBool(unary_checks, type, results));
     if (as_bool.raw() == Bool::True().raw()) {
       AddReceiverCheck(call);
@@ -4168,15 +4129,15 @@
       return;
     }
   }
-  const String& dst_name = String::ZoneHandle(isolate(),
+  const String& dst_name = String::ZoneHandle(I,
       Symbols::New(Exceptions::kCastErrorDstName));
   AssertAssignableInstr* assert_as =
-      new(isolate()) AssertAssignableInstr(call->token_pos(),
-                                           new(isolate()) Value(left),
-                                           new(isolate()) Value(instantiator),
-                                           new(isolate()) Value(type_args),
-                                           type,
-                                           dst_name);
+      new(I) AssertAssignableInstr(call->token_pos(),
+                                   new(I) Value(left),
+                                   new(I) Value(instantiator),
+                                   new(I) Value(type_args),
+                                   type,
+                                   dst_name);
   // Newly inserted instructions that can deoptimize or throw an exception
   // must have a deoptimization id that is valid for lookup in the unoptimized
   // code.
@@ -4205,7 +4166,7 @@
   }
 
   const ICData& unary_checks =
-      ICData::ZoneHandle(isolate(), instr->ic_data()->AsUnaryClassChecks());
+      ICData::ZoneHandle(I, instr->ic_data()->AsUnaryClassChecks());
 
   intptr_t max_checks = (op_kind == Token::kEQ)
       ? FLAG_max_equality_polymorphic_checks
@@ -4258,22 +4219,21 @@
     // Check if the single target is a polymorphic target, if it is,
     // we don't have one target.
     const Function& target =
-        Function::Handle(isolate(), unary_checks.GetTargetAt(0));
+        Function::Handle(I, unary_checks.GetTargetAt(0));
     const bool polymorphic_target = MethodRecognizer::PolymorphicTarget(target);
     has_one_target = !polymorphic_target;
   }
 
   if (has_one_target) {
     const bool is_method_extraction =
-        Function::Handle(isolate(),
-                         unary_checks.GetTargetAt(0)).IsMethodExtractor();
+        Function::Handle(I, unary_checks.GetTargetAt(0)).IsMethodExtractor();
 
     if ((is_method_extraction && !MethodExtractorNeedsClassCheck(instr)) ||
         (!is_method_extraction && !InstanceCallNeedsClassCheck(instr))) {
       const bool call_with_checks = false;
       PolymorphicInstanceCallInstr* call =
-          new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                                      call_with_checks);
+          new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                              call_with_checks);
       instr->ReplaceWith(call, current_iterator());
       return;
     }
@@ -4290,8 +4250,8 @@
       call_with_checks = true;
     }
     PolymorphicInstanceCallInstr* call =
-        new(isolate()) PolymorphicInstanceCallInstr(instr, unary_checks,
-                                                    call_with_checks);
+        new(I) PolymorphicInstanceCallInstr(instr, unary_checks,
+                                            call_with_checks);
     instr->ReplaceWith(call, current_iterator());
   }
 }
@@ -4320,9 +4280,9 @@
   }
   if (unary_kind != MathUnaryInstr::kIllegal) {
     MathUnaryInstr* math_unary =
-        new(isolate()) MathUnaryInstr(unary_kind,
-                                      new(isolate()) Value(call->ArgumentAt(0)),
-                                      call->deopt_id());
+        new(I) MathUnaryInstr(unary_kind,
+                              new(I) Value(call->ArgumentAt(0)),
+                              call->deopt_id());
     ReplaceCall(call, math_unary);
   } else if ((recognized_kind == MethodRecognizer::kFloat32x4Zero) ||
              (recognized_kind == MethodRecognizer::kFloat32x4Splat) ||
@@ -4361,14 +4321,14 @@
         result_cid = kSmiCid;
       }
       if (result_cid != kIllegalCid) {
-        MathMinMaxInstr* min_max = new(isolate()) MathMinMaxInstr(
+        MathMinMaxInstr* min_max = new(I) MathMinMaxInstr(
             recognized_kind,
-            new(isolate()) Value(call->ArgumentAt(0)),
-            new(isolate()) Value(call->ArgumentAt(1)),
+            new(I) Value(call->ArgumentAt(0)),
+            new(I) Value(call->ArgumentAt(1)),
             call->deopt_id(),
             result_cid);
         const ICData& unary_checks =
-            ICData::ZoneHandle(isolate(), ic_data.AsUnaryClassChecks());
+            ICData::ZoneHandle(I, ic_data.AsUnaryClassChecks());
         AddCheckClass(min_max->left()->definition(),
                       unary_checks,
                       call->deopt_id(),
@@ -4387,50 +4347,38 @@
     // InvokeMathCFunctionInstr requires unboxed doubles. UnboxDouble
     // instructions contain type checks and conversions to double.
     ZoneGrowableArray<Value*>* args =
-        new(isolate()) ZoneGrowableArray<Value*>(call->ArgumentCount());
+        new(I) ZoneGrowableArray<Value*>(call->ArgumentCount());
     for (intptr_t i = 0; i < call->ArgumentCount(); i++) {
-      args->Add(new(isolate()) Value(call->ArgumentAt(i)));
+      args->Add(new(I) Value(call->ArgumentAt(i)));
     }
     InvokeMathCFunctionInstr* invoke =
-        new(isolate()) InvokeMathCFunctionInstr(args,
-                                                call->deopt_id(),
-                                                recognized_kind,
-                                                call->token_pos());
+        new(I) InvokeMathCFunctionInstr(args,
+                                        call->deopt_id(),
+                                        recognized_kind,
+                                        call->token_pos());
     ReplaceCall(call, invoke);
   } else if (recognized_kind == MethodRecognizer::kObjectArrayConstructor) {
-    Value* type = new(isolate()) Value(call->ArgumentAt(0));
-    Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
+    Value* type = new(I) Value(call->ArgumentAt(0));
+    Value* num_elements = new(I) Value(call->ArgumentAt(1));
     CreateArrayInstr* create_array =
-        new(isolate()) CreateArrayInstr(call->token_pos(), type, num_elements);
+        new(I) CreateArrayInstr(call->token_pos(), type, num_elements);
     ReplaceCall(call, create_array);
-  } else if (Library::PrivateCoreLibName(Symbols::ClassId()).Equals(
-      String::Handle(isolate(), call->function().name()))) {
-    // Check for core library get:_classId.
-    intptr_t cid = Class::Handle(isolate(), call->function().Owner()).id();
-    // Currently only implemented for a subset of classes.
-    ASSERT((cid == kOneByteStringCid) || (cid == kTwoByteStringCid) ||
-           (cid == kExternalOneByteStringCid) ||
-           (cid == kGrowableObjectArrayCid) ||
-           (cid == kImmutableArrayCid) || (cid == kArrayCid));
-    ConstantInstr* cid_instr =
-        new(isolate()) ConstantInstr(Smi::Handle(isolate(), Smi::New(cid)));
-    ReplaceCall(call, cid_instr);
   } else if (call->function().IsFactory()) {
     const Class& function_class =
-        Class::Handle(isolate(), call->function().Owner());
+        Class::Handle(I, call->function().Owner());
     if ((function_class.library() == Library::CoreLibrary()) ||
         (function_class.library() == Library::TypedDataLibrary())) {
       intptr_t cid = FactoryRecognizer::ResultCid(call->function());
       switch (cid) {
         case kArrayCid: {
-          Value* type = new(isolate()) Value(call->ArgumentAt(0));
-          Value* num_elements = new(isolate()) Value(call->ArgumentAt(1));
+          Value* type = new(I) Value(call->ArgumentAt(0));
+          Value* num_elements = new(I) Value(call->ArgumentAt(1));
           if (num_elements->BindsToConstant() &&
               num_elements->BoundConstant().IsSmi()) {
             intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
             if (length >= 0 && length <= Array::kMaxElements) {
               CreateArrayInstr* create_array =
-                  new(isolate()) CreateArrayInstr(
+                  new(I) CreateArrayInstr(
                       call->token_pos(), type, num_elements);
               ReplaceCall(call, create_array);
             }
@@ -4453,13 +4401,13 @@
     // usage count of at least 1/kGetterSetterRatio of the getter usage count.
     // This is to avoid unboxing fields where the setter is never or rarely
     // executed.
-    const Field& field = Field::ZoneHandle(isolate(), instr->field().raw());
-    const String& field_name = String::Handle(isolate(), field.name());
-    class Class& owner = Class::Handle(isolate(), field.owner());
+    const Field& field = Field::ZoneHandle(I, instr->field().raw());
+    const String& field_name = String::Handle(I, field.name());
+    class Class& owner = Class::Handle(I, field.owner());
     const Function& getter =
-        Function::Handle(isolate(), owner.LookupGetterFunction(field_name));
+        Function::Handle(I, owner.LookupGetterFunction(field_name));
     const Function& setter =
-        Function::Handle(isolate(), owner.LookupSetterFunction(field_name));
+        Function::Handle(I, owner.LookupSetterFunction(field_name));
     bool result = !getter.IsNull()
                && !setter.IsNull()
                && (setter.usage_counter() > 0)
@@ -4498,7 +4446,7 @@
     // inlining.
     return false;
   }
-  Function& target = Function::Handle(isolate(), Function::null());
+  Function& target = Function::Handle(I);
   intptr_t class_id;
   unary_ic_data.GetOneClassCheckAt(0, &class_id, &target);
   if (target.kind() != RawFunction::kImplicitSetter) {
@@ -4507,9 +4455,9 @@
   }
   // Inline implicit instance setter.
   const String& field_name =
-      String::Handle(isolate(), Field::NameFromSetter(instr->function_name()));
+      String::Handle(I, Field::NameFromSetter(instr->function_name()));
   const Field& field =
-      Field::ZoneHandle(isolate(), GetField(class_id, field_name));
+      Field::ZoneHandle(I, GetField(class_id, field_name));
   ASSERT(!field.IsNull());
 
   if (InstanceCallNeedsClassCheck(instr)) {
@@ -4518,8 +4466,8 @@
   StoreBarrierType needs_store_barrier = kEmitStoreBarrier;
   if (ArgIsAlways(kSmiCid, *instr->ic_data(), 1)) {
     InsertBefore(instr,
-                 new(isolate()) CheckSmiInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) CheckSmiInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                      instr->deopt_id(),
                      instr->token_pos()),
                  instr->env(),
@@ -4529,8 +4477,8 @@
 
   if (field.guarded_cid() != kDynamicCid) {
     InsertBefore(instr,
-                 new(isolate()) GuardFieldClassInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) GuardFieldClassInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4539,8 +4487,8 @@
 
   if (field.needs_length_check()) {
     InsertBefore(instr,
-                 new(isolate()) GuardFieldLengthInstr(
-                     new(isolate()) Value(instr->ArgumentAt(1)),
+                 new(I) GuardFieldLengthInstr(
+                     new(I) Value(instr->ArgumentAt(1)),
                       field,
                       instr->deopt_id()),
                  instr->env(),
@@ -4548,10 +4496,10 @@
   }
 
   // Field guard was detached.
-  StoreInstanceFieldInstr* store = new(isolate()) StoreInstanceFieldInstr(
+  StoreInstanceFieldInstr* store = new(I) StoreInstanceFieldInstr(
       field,
-      new(isolate()) Value(instr->ArgumentAt(0)),
-      new(isolate()) Value(instr->ArgumentAt(1)),
+      new(I) Value(instr->ArgumentAt(0)),
+      new(I) Value(instr->ArgumentAt(1)),
       needs_store_barrier,
       instr->token_pos());
 
@@ -4581,7 +4529,7 @@
  private:
   // Collect all values that were proven to be smi in smi_values_ array and all
   // CheckSmi instructions in smi_check_ array.
-  void CollectSmiValues();
+  void CollectValues();
 
   // Iterate over smi values and constrain them at branch successors.
   // Additionally constraint values after CheckSmi instructions.
@@ -4652,15 +4600,17 @@
 
   FlowGraph* flow_graph_;
 
-  GrowableArray<Definition*> smi_values_;  // Value that are known to be smi.
-  GrowableArray<CheckSmiInstr*> smi_checks_;  // All CheckSmi instructions.
+  // Value that are known to be smi or mint.
+  GrowableArray<Definition*> values_;
+  // All CheckSmi instructions.
+  GrowableArray<CheckSmiInstr*> smi_checks_;
 
   // All Constraints inserted during InsertConstraints phase. They are treated
   // as smi values.
   GrowableArray<ConstraintInstr*> constraints_;
 
-  // Bitvector for a quick filtering of known smi values.
-  BitVector* smi_definitions_;
+  // Bitvector for a quick filtering of known smi or mint values.
+  BitVector* definitions_;
 
   // Worklist for induction variables analysis.
   GrowableArray<Definition*> worklist_;
@@ -4671,20 +4621,22 @@
 
 
 void RangeAnalysis::Analyze() {
-  CollectSmiValues();
+  CollectValues();
   InsertConstraints();
   InferRanges();
   RemoveConstraints();
 }
 
 
-void RangeAnalysis::CollectSmiValues() {
+void RangeAnalysis::CollectValues() {
   const GrowableArray<Definition*>& initial =
       *flow_graph_->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < initial.length(); ++i) {
     Definition* current = initial[i];
     if (current->Type()->ToCid() == kSmiCid) {
-      smi_values_.Add(current);
+      values_.Add(current);
+    } else if (current->IsMintDefinition()) {
+      values_.Add(current);
     }
   }
 
@@ -4701,7 +4653,9 @@
       for (intptr_t i = 0; i < initial.length(); ++i) {
         Definition* current = initial[i];
         if (current->Type()->ToCid() == kSmiCid) {
-          smi_values_.Add(current);
+          values_.Add(current);
+        } else if (current->IsMintDefinition()) {
+          values_.Add(current);
         }
       }
     }
@@ -4711,7 +4665,7 @@
       for (PhiIterator phi_it(join); !phi_it.Done(); phi_it.Advance()) {
         PhiInstr* current = phi_it.Current();
         if (current->Type()->ToCid() == kSmiCid) {
-          smi_values_.Add(current);
+          values_.Add(current);
         }
       }
     }
@@ -4724,7 +4678,10 @@
       if (defn != NULL) {
         if ((defn->Type()->ToCid() == kSmiCid) &&
             (defn->ssa_temp_index() != -1)) {
-          smi_values_.Add(defn);
+          values_.Add(defn);
+        } else if ((defn->IsMintDefinition()) &&
+                   (defn->ssa_temp_index() != -1)) {
+          values_.Add(defn);
         }
       } else if (current->IsCheckSmi()) {
         smi_checks_.Add(current->AsCheckSmi());
@@ -4805,22 +4762,22 @@
 Range* RangeAnalysis::ConstraintRange(Token::Kind op, Definition* boundary) {
   switch (op) {
     case Token::kEQ:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
-                                  RangeBoundary::FromDefinition(boundary));
+      return new(I) Range(RangeBoundary::FromDefinition(boundary),
+                          RangeBoundary::FromDefinition(boundary));
     case Token::kNE:
       return Range::Unknown();
     case Token::kLT:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(boundary, -1));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(boundary, -1));
     case Token::kGT:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary, 1),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(boundary, 1),
+                          RangeBoundary::MaxSmi());
     case Token::kLTE:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(boundary));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(boundary));
     case Token::kGTE:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(boundary),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(boundary),
+                          RangeBoundary::MaxSmi());
     default:
       UNREACHABLE();
       return Range::Unknown();
@@ -4834,8 +4791,8 @@
   // No need to constrain constants.
   if (defn->IsConstant()) return NULL;
 
-  ConstraintInstr* constraint = new(isolate()) ConstraintInstr(
-      new(isolate()) Value(defn), constraint_range);
+  ConstraintInstr* constraint = new(I) ConstraintInstr(
+      new(I) Value(defn), constraint_range);
   flow_graph_->InsertAfter(after, constraint, NULL, FlowGraph::kValue);
   RenameDominatedUses(defn, constraint, constraint);
   constraints_.Add(constraint);
@@ -4889,6 +4846,7 @@
   }
 }
 
+
 void RangeAnalysis::InsertConstraintsFor(Definition* defn) {
   for (Value* use = defn->input_use_list();
        use != NULL;
@@ -4910,13 +4868,13 @@
   Range* constraint_range = NULL;
   if (use_index == CheckArrayBoundInstr::kIndexPos) {
     Definition* length = check->length()->definition();
-    constraint_range = new(isolate()) Range(
+    constraint_range = new(I) Range(
         RangeBoundary::FromConstant(0),
         RangeBoundary::FromDefinition(length, -1));
   } else {
     ASSERT(use_index == CheckArrayBoundInstr::kLengthPos);
     Definition* index = check->index()->definition();
-    constraint_range = new(isolate()) Range(
+    constraint_range = new(I) Range(
         RangeBoundary::FromDefinition(index, 1),
         RangeBoundary::MaxSmi());
   }
@@ -4927,11 +4885,22 @@
 void RangeAnalysis::InsertConstraints() {
   for (intptr_t i = 0; i < smi_checks_.length(); i++) {
     CheckSmiInstr* check = smi_checks_[i];
-    InsertConstraintFor(check->value()->definition(), Range::Unknown(), check);
+    ConstraintInstr* constraint =
+        InsertConstraintFor(check->value()->definition(),
+                            Range::UnknownSmi(),
+                            check);
+    if (constraint == NULL) {
+      // No constraint was needed.
+      continue;
+    }
+    // Mark the constraint's value's reaching type as smi.
+    CompileType* smi_compile_type =
+        ZoneCompileType::Wrap(CompileType::FromCid(kSmiCid));
+    constraint->value()->SetReachingType(smi_compile_type);
   }
 
-  for (intptr_t i = 0; i < smi_values_.length(); i++) {
-    InsertConstraintsFor(smi_values_[i]);
+  for (intptr_t i = 0; i < values_.length(); i++) {
+    InsertConstraintsFor(values_[i]);
   }
 
   for (intptr_t i = 0; i < constraints_.length(); i++) {
@@ -4942,8 +4911,7 @@
 
 void RangeAnalysis::ResetWorklist() {
   if (marked_defns_ == NULL) {
-    marked_defns_ = new(isolate()) BitVector(
-        flow_graph_->current_ssa_temp_index());
+    marked_defns_ = new(I) BitVector(flow_graph_->current_ssa_temp_index());
   } else {
     marked_defns_->Clear();
   }
@@ -4970,9 +4938,9 @@
                                                           : kNegative;
   } else if (val->definition()->range() != NULL) {
     Range* range = val->definition()->range();
-    if (Range::ConstantMin(range).value() >= 0) {
+    if (Range::ConstantMin(range).ConstantValue() >= 0) {
       return kPositive;
-    } else if (Range::ConstantMax(range).value() <= 0) {
+    } else if (Range::ConstantMax(range).ConstantValue() <= 0) {
       return kNegative;
     }
   }
@@ -5061,16 +5029,16 @@
   // Compute the range based on initial value and the direction of the growth.
   switch (direction) {
     case kPositive:
-      return new(isolate()) Range(RangeBoundary::FromDefinition(initial_value),
-                                  RangeBoundary::MaxSmi());
+      return new(I) Range(RangeBoundary::FromDefinition(initial_value),
+                          RangeBoundary::MaxSmi());
 
     case kNegative:
-      return new(isolate()) Range(RangeBoundary::MinSmi(),
-                                  RangeBoundary::FromDefinition(initial_value));
+      return new(I) Range(RangeBoundary::MinSmi(),
+                          RangeBoundary::FromDefinition(initial_value));
 
     case kUnknown:
     case kBoth:
-      return Range::Unknown();
+      return Range::UnknownSmi();
   }
 
   UNREACHABLE();
@@ -5084,7 +5052,7 @@
     const bool is_loop_header = (join->loop_info() != NULL);
     for (PhiIterator it(join); !it.Done(); it.Advance()) {
       PhiInstr* phi = it.Current();
-      if (smi_definitions_->Contains(phi->ssa_temp_index())) {
+      if (definitions_->Contains(phi->ssa_temp_index())) {
         if (is_loop_header) {
           // Try recognizing simple induction variables.
           Range* range = InferInductionVariableRange(join, phi);
@@ -5105,7 +5073,7 @@
     Definition* defn = current->AsDefinition();
     if ((defn != NULL) &&
         (defn->ssa_temp_index() != -1) &&
-        smi_definitions_->Contains(defn->ssa_temp_index())) {
+        definitions_->Contains(defn->ssa_temp_index())) {
       defn->InferRange();
     } else if (FLAG_array_bounds_check_elimination &&
                current->IsCheckArrayBound()) {
@@ -5125,14 +5093,19 @@
 
 
 void RangeAnalysis::InferRanges() {
-  // Initialize bitvector for quick filtering of smi values.
-  smi_definitions_ =
-      new(isolate()) BitVector(flow_graph_->current_ssa_temp_index());
-  for (intptr_t i = 0; i < smi_values_.length(); i++) {
-    smi_definitions_->Add(smi_values_[i]->ssa_temp_index());
+  if (FLAG_trace_range_analysis) {
+    OS::Print("---- before range analysis -------\n");
+    FlowGraphPrinter printer(*flow_graph_);
+    printer.PrintBlocks();
+  }
+  // Initialize bitvector for quick filtering of int values.
+  definitions_ =
+      new(I) BitVector(flow_graph_->current_ssa_temp_index());
+  for (intptr_t i = 0; i < values_.length(); i++) {
+    definitions_->Add(values_[i]->ssa_temp_index());
   }
   for (intptr_t i = 0; i < constraints_.length(); i++) {
-    smi_definitions_->Add(constraints_[i]->ssa_temp_index());
+    definitions_->Add(constraints_[i]->ssa_temp_index());
   }
 
   // Infer initial values of ranges.
@@ -5140,7 +5113,7 @@
       *flow_graph_->graph_entry()->initial_definitions();
   for (intptr_t i = 0; i < initial.length(); ++i) {
     Definition* definition = initial[i];
-    if (smi_definitions_->Contains(definition->ssa_temp_index())) {
+    if (definitions_->Contains(definition->ssa_temp_index())) {
       definition->InferRange();
     }
   }
@@ -5168,7 +5141,7 @@
 }
 
 
-void FlowGraphOptimizer::InferSmiRanges() {
+void FlowGraphOptimizer::InferIntRanges() {
   RangeAnalysis range_analysis(flow_graph_);
   range_analysis.Analyze();
 }
@@ -6498,9 +6471,9 @@
     const intptr_t num_blocks = graph_->preorder().length();
     for (intptr_t i = 0; i < num_blocks; i++) {
       out_.Add(NULL);
-      gen_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
-      kill_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
-      in_.Add(new(isolate()) BitVector(aliased_set_->max_place_id()));
+      gen_.Add(new(I) BitVector(aliased_set_->max_place_id()));
+      kill_.Add(new(I) BitVector(aliased_set_->max_place_id()));
+      in_.Add(new(I) BitVector(aliased_set_->max_place_id()));
 
       exposed_values_.Add(NULL);
       out_values_.Add(NULL);
@@ -6699,7 +6672,7 @@
           // the block entry.
           if (exposed_values == NULL) {
             static const intptr_t kMaxExposedValuesInitialSize = 5;
-            exposed_values = new(isolate()) ZoneGrowableArray<Definition*>(
+            exposed_values = new(I) ZoneGrowableArray<Definition*>(
                 Utils::Minimum(kMaxExposedValuesInitialSize,
                                aliased_set_->max_place_id()));
           }
@@ -6747,11 +6720,9 @@
   // Compute OUT sets by propagating them iteratively until fix point
   // is reached.
   void ComputeOutSets() {
-    BitVector* temp = new(isolate()) BitVector(aliased_set_->max_place_id());
-    BitVector* forwarded_loads =
-        new(isolate()) BitVector(aliased_set_->max_place_id());
-    BitVector* temp_out =
-        new(isolate()) BitVector(aliased_set_->max_place_id());
+    BitVector* temp = new(I) BitVector(aliased_set_->max_place_id());
+    BitVector* forwarded_loads = new(I) BitVector(aliased_set_->max_place_id());
+    BitVector* temp_out = new(I) BitVector(aliased_set_->max_place_id());
 
     bool changed = true;
     while (changed) {
@@ -6803,7 +6774,7 @@
           if ((block_out == NULL) || !block_out->Equals(*temp)) {
             if (block_out == NULL) {
               block_out = out_[preorder_number] =
-                  new(isolate()) BitVector(aliased_set_->max_place_id());
+                  new(I) BitVector(aliased_set_->max_place_id());
             }
             block_out->CopyFrom(temp);
             changed = true;
@@ -6856,8 +6827,8 @@
               MergeIncomingValues(block, place_id) : NULL;
           if ((in_value == NULL) &&
               (in_[preorder_number]->Contains(place_id))) {
-            PhiInstr* phi = new(isolate()) PhiInstr(block->AsJoinEntry(),
-                                                    block->PredecessorCount());
+            PhiInstr* phi = new(I) PhiInstr(block->AsJoinEntry(),
+                                            block->PredecessorCount());
             phi->set_place_id(place_id);
             pending_phis.Add(phi);
             in_value = phi;
@@ -6930,7 +6901,7 @@
         graph_->loop_headers();
 
     ZoneGrowableArray<BitVector*>* invariant_loads =
-        new(isolate()) ZoneGrowableArray<BitVector*>(loop_headers.length());
+        new(I) ZoneGrowableArray<BitVector*>(loop_headers.length());
 
     for (intptr_t i = 0; i < loop_headers.length(); i++) {
       BlockEntryInstr* header = loop_headers[i];
@@ -6940,8 +6911,7 @@
         continue;
       }
 
-      BitVector* loop_gen =
-          new(isolate()) BitVector(aliased_set_->max_place_id());
+      BitVector* loop_gen = new(I) BitVector(aliased_set_->max_place_id());
       for (BitVector::Iterator loop_it(header->loop_info());
            !loop_it.Done();
            loop_it.Advance()) {
@@ -6997,7 +6967,7 @@
     }
 
     // Incoming values are different. Phi is required to merge.
-    PhiInstr* phi = new(isolate()) PhiInstr(
+    PhiInstr* phi = new(I) PhiInstr(
         block->AsJoinEntry(), block->PredecessorCount());
     phi->set_place_id(place_id);
     FillPhiInputs(phi);
@@ -7020,7 +6990,7 @@
       // To prevent using them we additionally mark definitions themselves
       // as replaced and store a pointer to the replacement.
       Definition* replacement = (*pred_out_values)[place_id]->Replacement();
-      Value* input = new(isolate()) Value(replacement);
+      Value* input = new(I) Value(replacement);
       phi->SetInputAt(i, input);
       replacement->AddInputUse(input);
     }
@@ -7093,7 +7063,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7166,7 +7136,7 @@
 
     worklist_.Clear();
     if (in_worklist_ == NULL) {
-      in_worklist_ = new(isolate()) BitVector(graph_->current_ssa_temp_index());
+      in_worklist_ = new(I) BitVector(graph_->current_ssa_temp_index());
     } else {
       in_worklist_->Clear();
     }
@@ -7205,9 +7175,9 @@
       if (a->is_alive()) {
         a->mark_dead();
         a->block()->RemovePhi(a);
+        a->UnuseAllInputs();
       }
     }
-
     return true;
   }
 
@@ -7234,9 +7204,7 @@
     for (intptr_t i = 0; i < phis_.length(); i++) {
       PhiInstr* phi = phis_[i];
       if (!phi->HasUses() || EliminateRedundantPhi(phi)) {
-        for (intptr_t j = phi->InputCount() - 1; j >= 0; --j) {
-          phi->InputAt(j)->RemoveFromUseList();
-        }
+        phi->UnuseAllInputs();
         phis_[i] = NULL;
       }
     }
@@ -7246,17 +7214,14 @@
     for (intptr_t i = 0; i < phis_.length(); i++) {
       PhiInstr* phi = phis_[i];
       if ((phi != NULL) && (!phi->HasUses() || !EmitPhi(phi))) {
-        for (intptr_t j = phi->InputCount() - 1; j >= 0; --j) {
-          phi->InputAt(j)->RemoveFromUseList();
-        }
+        phi->UnuseAllInputs();
       }
     }
   }
 
   ZoneGrowableArray<Definition*>* CreateBlockOutValues() {
     ZoneGrowableArray<Definition*>* out =
-        new(isolate()) ZoneGrowableArray<Definition*>(
-            aliased_set_->max_place_id());
+        new(I) ZoneGrowableArray<Definition*>(aliased_set_->max_place_id());
     for (intptr_t i = 0; i < aliased_set_->max_place_id(); i++) {
       out->Add(NULL);
     }
@@ -7913,7 +7878,7 @@
 void ConstantPropagator::VisitPhi(PhiInstr* instr) {
   // Compute the join over all the reachable predecessor values.
   JoinEntryInstr* block = instr->block();
-  Object& value = Object::ZoneHandle(isolate(), Unknown());
+  Object& value = Object::ZoneHandle(I, Unknown());
   for (intptr_t pred_idx = 0; pred_idx < instr->InputCount(); ++pred_idx) {
     if (reachable_->Contains(
             block->PredecessorAt(pred_idx)->preorder_number())) {
@@ -8030,7 +7995,7 @@
     ASSERT(value.IsBool());
     bool result = Bool::Cast(value).value();
     SetValue(instr,
-             Smi::Handle(isolate(), Smi::New(
+             Smi::Handle(I, Smi::New(
                  result ? instr->if_true() : instr->if_false())));
   }
 }
@@ -8106,10 +8071,9 @@
     if (left.IsInteger() && right.IsInteger()) {
       const bool result = CompareIntegers(
           instr->kind(),
-          Integer::Handle(isolate(),
-                          Integer::Cast(left).BitOp(Token::kBIT_AND,
-                                                    Integer::Cast(right))),
-          Smi::Handle(isolate(), Smi::New(0)));
+          Integer::Handle(I, Integer::Cast(left).BitOp(Token::kBIT_AND,
+                                                       Integer::Cast(right))),
+          Smi::Handle(I, Smi::New(0)));
       SetValue(instr, result ? Bool::True() : Bool::False());
     } else {
       SetValue(instr, non_constant_);
@@ -8193,7 +8157,7 @@
     ASSERT(ch_code >= 0);
     if (ch_code < Symbols::kMaxOneCharCodeSymbol) {
       RawString** table = Symbols::PredefinedAddress();
-      SetValue(instr, String::ZoneHandle(isolate(), table[ch_code]));
+      SetValue(instr, String::ZoneHandle(I, table[ch_code]));
     } else {
       SetValue(instr, non_constant_);
     }
@@ -8208,7 +8172,7 @@
   } else if (IsConstant(o)) {
     const String& str = String::Cast(o);
     const intptr_t result = (str.Length() == 1) ? str.CharAt(0) : -1;
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(result)));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(result)));
   }
 }
 
@@ -8238,13 +8202,13 @@
       if (array_obj.IsString()) {
         const String& str = String::Cast(array_obj);
         if (str.Length() > index) {
-          SetValue(instr, Smi::Handle(isolate(), Smi::New(str.CharAt(index))));
+          SetValue(instr, Smi::Handle(I, Smi::New(str.CharAt(index))));
           return;
         }
       } else if (array_obj.IsArray()) {
         const Array& a = Array::Cast(array_obj);
         if ((a.Length() > index) && a.IsImmutable()) {
-          Instance& result = Instance::Handle(isolate(), Instance::null());
+          Instance& result = Instance::Handle(I);
           result ^= a.At(index);
           SetValue(instr, result);
           return;
@@ -8271,7 +8235,7 @@
   const Field& field = instr->StaticField();
   ASSERT(field.is_static());
   if (field.is_final()) {
-    Instance& obj = Instance::Handle(isolate(), field.value());
+    Instance& obj = Instance::Handle(I, field.value());
     ASSERT(obj.raw() != Object::sentinel().raw());
     ASSERT(obj.raw() != Object::transition_sentinel().raw());
     if (obj.IsSmi() || obj.IsOld()) {
@@ -8346,12 +8310,12 @@
 void ConstantPropagator::VisitLoadClassId(LoadClassIdInstr* instr) {
   intptr_t cid = instr->object()->Type()->ToCid();
   if (cid != kDynamicCid) {
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(cid)));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(cid)));
     return;
   }
   const Object& object = instr->object()->definition()->constant_value();
   if (IsConstant(object)) {
-    SetValue(instr, Smi::ZoneHandle(isolate(), Smi::New(object.GetClassId())));
+    SetValue(instr, Smi::ZoneHandle(I, Smi::New(object.GetClassId())));
     return;
   }
   SetValue(instr, non_constant_);
@@ -8366,7 +8330,7 @@
     if (num_elements->BindsToConstant() &&
         num_elements->BoundConstant().IsSmi()) {
       intptr_t length = Smi::Cast(num_elements->BoundConstant()).Value();
-      const Object& result = Smi::ZoneHandle(isolate(), Smi::New(length));
+      const Object& result = Smi::ZoneHandle(I, Smi::New(length));
       SetValue(instr, result);
       return;
     }
@@ -8376,12 +8340,12 @@
     ConstantInstr* constant = instr->instance()->definition()->AsConstant();
     if (constant != NULL) {
       if (constant->value().IsString()) {
-        SetValue(instr, Smi::ZoneHandle(isolate(),
+        SetValue(instr, Smi::ZoneHandle(I,
             Smi::New(String::Cast(constant->value()).Length())));
         return;
       }
       if (constant->value().IsArray()) {
-        SetValue(instr, Smi::ZoneHandle(isolate(),
+        SetValue(instr, Smi::ZoneHandle(I,
             Smi::New(Array::Cast(constant->value()).Length())));
         return;
       }
@@ -8401,7 +8365,7 @@
   if (IsConstant(object)) {
     if (instr->type().IsTypeParameter()) {
       if (object.IsNull()) {
-        SetValue(instr, Type::ZoneHandle(isolate(), Type::DynamicType()));
+        SetValue(instr, Type::ZoneHandle(I, Type::DynamicType()));
         return;
       }
       // We could try to instantiate the type parameter and return it if no
@@ -8473,7 +8437,7 @@
         case Token::kADD:
         case Token::kSUB:
         case Token::kMUL: {
-          Instance& result = Integer::ZoneHandle(isolate(),
+          Instance& result = Integer::ZoneHandle(I,
               left_int.ArithmeticOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8483,7 +8447,7 @@
         case Token::kSHL:
         case Token::kSHR:
           if (left.IsSmi() && right.IsSmi()) {
-            Instance& result = Integer::ZoneHandle(isolate(),
+            Instance& result = Integer::ZoneHandle(I,
                 Smi::Cast(left_int).ShiftOp(op_kind, Smi::Cast(right_int)));
             result = result.CheckAndCanonicalize(NULL);
             ASSERT(!result.IsNull());
@@ -8495,7 +8459,7 @@
         case Token::kBIT_AND:
         case Token::kBIT_OR:
         case Token::kBIT_XOR: {
-          Instance& result = Integer::ZoneHandle(isolate(),
+          Instance& result = Integer::ZoneHandle(I,
               left_int.BitOp(op_kind, right_int));
           result = result.CheckAndCanonicalize(NULL);
           ASSERT(!result.IsNull());
@@ -8574,7 +8538,7 @@
 void ConstantPropagator::VisitSmiToDouble(SmiToDoubleInstr* instr) {
   const Object& value = instr->value()->definition()->constant_value();
   if (IsConstant(value) && value.IsInteger()) {
-    SetValue(instr, Double::Handle(isolate(),
+    SetValue(instr, Double::Handle(I,
         Double::New(Integer::Cast(value).AsDoubleValue(), Heap::kOld)));
   } else if (IsNonConstant(value)) {
     SetValue(instr, non_constant_);
@@ -9037,8 +9001,7 @@
   // Canonicalize branches that have no side-effects and where true- and
   // false-targets are the same.
   bool changed = false;
-  BitVector* empty_blocks =
-      new(graph_->isolate()) BitVector(graph_->preorder().length());
+  BitVector* empty_blocks = new(I) BitVector(graph_->preorder().length());
   for (BlockIterator b = graph_->postorder_iterator();
        !b.Done();
        b.Advance()) {
@@ -9056,9 +9019,8 @@
         // Drop the comparison, which does not have side effects
         JoinEntryInstr* join = if_true->AsJoinEntry();
         if (join->phis() == NULL) {
-          GotoInstr* jump =
-              new(graph_->isolate()) GotoInstr(if_true->AsJoinEntry());
-          jump->InheritDeoptTarget(isolate(), branch);
+          GotoInstr* jump = new(I) GotoInstr(if_true->AsJoinEntry());
+          jump->InheritDeoptTarget(I, branch);
 
           Instruction* previous = branch->previous();
           branch->set_previous(NULL);
@@ -9203,17 +9165,17 @@
         ASSERT(reachable_->Contains(if_false->preorder_number()));
         ASSERT(if_false->parallel_move() == NULL);
         ASSERT(if_false->loop_info() == NULL);
-        join = new(isolate()) JoinEntryInstr(if_false->block_id(),
-                                             if_false->try_index());
-        join->InheritDeoptTarget(isolate(), if_false);
+        join = new(I) JoinEntryInstr(if_false->block_id(),
+                                     if_false->try_index());
+        join->InheritDeoptTarget(I, if_false);
         if_false->UnuseAllInputs();
         next = if_false->next();
       } else if (!reachable_->Contains(if_false->preorder_number())) {
         ASSERT(if_true->parallel_move() == NULL);
         ASSERT(if_true->loop_info() == NULL);
-        join = new(isolate()) JoinEntryInstr(if_true->block_id(),
-                                             if_true->try_index());
-        join->InheritDeoptTarget(isolate(), if_true);
+        join = new(I) JoinEntryInstr(if_true->block_id(),
+                                     if_true->try_index());
+        join->InheritDeoptTarget(I, if_true);
         if_true->UnuseAllInputs();
         next = if_true->next();
       }
@@ -9223,8 +9185,8 @@
         // Drop the comparison, which does not have side effects as long
         // as it is a strict compare (the only one we can determine is
         // constant with the current analysis).
-        GotoInstr* jump = new(isolate()) GotoInstr(join);
-        jump->InheritDeoptTarget(isolate(), branch);
+        GotoInstr* jump = new(I) GotoInstr(join);
+        jump->InheritDeoptTarget(I, branch);
 
         Instruction* previous = branch->previous();
         branch->set_previous(NULL);
@@ -9781,28 +9743,28 @@
     const Class& cls,
     const ZoneGrowableArray<const Object*>& slots) {
   ZoneGrowableArray<Value*>* values =
-      new(isolate()) ZoneGrowableArray<Value*>(slots.length());
+      new(I) ZoneGrowableArray<Value*>(slots.length());
 
   // Insert load instruction for every field.
   for (intptr_t i = 0; i < slots.length(); i++) {
     LoadFieldInstr* load = slots[i]->IsField()
-        ? new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(alloc),
+        ? new(I) LoadFieldInstr(
+            new(I) Value(alloc),
             &Field::Cast(*slots[i]),
-            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            AbstractType::ZoneHandle(I),
             alloc->token_pos())
-        : new(isolate()) LoadFieldInstr(
-            new(isolate()) Value(alloc),
+        : new(I) LoadFieldInstr(
+            new(I) Value(alloc),
             Smi::Cast(*slots[i]).Value(),
-            AbstractType::ZoneHandle(isolate(), AbstractType::null()),
+            AbstractType::ZoneHandle(I),
             alloc->token_pos());
     flow_graph_->InsertBefore(
         exit, load, NULL, FlowGraph::kValue);
-    values->Add(new(isolate()) Value(load));
+    values->Add(new(I) Value(load));
   }
 
   MaterializeObjectInstr* mat =
-      new(isolate()) MaterializeObjectInstr(cls, slots, values);
+      new(I) MaterializeObjectInstr(cls, slots, values);
   flow_graph_->InsertBefore(exit, mat, NULL, FlowGraph::kValue);
 
   // Replace all mentions of this allocation with a newly inserted
@@ -9828,7 +9790,7 @@
 void AllocationSinking::InsertMaterializations(AllocateObjectInstr* alloc) {
   // Collect all fields that are written for this instance.
   ZoneGrowableArray<const Object*>* slots =
-      new(isolate()) ZoneGrowableArray<const Object*>(5);
+      new(I) ZoneGrowableArray<const Object*>(5);
 
   for (Value* use = alloc->input_use_list();
        use != NULL;
@@ -9837,15 +9799,14 @@
     if (!store->field().IsNull()) {
       AddSlot(slots, store->field());
     } else {
-      AddSlot(slots, Smi::ZoneHandle(isolate(),
-                                     Smi::New(store->offset_in_bytes())));
+      AddSlot(slots, Smi::ZoneHandle(I, Smi::New(store->offset_in_bytes())));
     }
   }
 
   if (alloc->ArgumentCount() > 0) {
     ASSERT(alloc->ArgumentCount() == 1);
     intptr_t type_args_offset = alloc->cls().type_arguments_field_offset();
-    AddSlot(slots, Smi::ZoneHandle(isolate(), Smi::New(type_args_offset)));
+    AddSlot(slots, Smi::ZoneHandle(I, Smi::New(type_args_offset)));
   }
 
   // Collect all instructions that mention this object in the environment.
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h
index b1fd7d8..5b05ea7 100644
--- a/runtime/vm/flow_graph_optimizer.h
+++ b/runtime/vm/flow_graph_optimizer.h
@@ -41,7 +41,7 @@
 
   void SelectRepresentations();
 
-  void InferSmiRanges();
+  void InferIntRanges();
 
   void AnalyzeTryCatch();
 
diff --git a/runtime/vm/flow_graph_type_propagator.cc b/runtime/vm/flow_graph_type_propagator.cc
index 179cdee..9a68f26 100644
--- a/runtime/vm/flow_graph_type_propagator.cc
+++ b/runtime/vm/flow_graph_type_propagator.cc
@@ -1043,10 +1043,18 @@
 
 
 CompileType BoxIntegerInstr::ComputeType() const {
+  if (is_smi()) {
+    return CompileType::FromCid(kSmiCid);
+  }
   return CompileType::Int();
 }
 
 
+bool BoxIntegerInstr::RecomputeType() {
+  return UpdateType(ComputeType());
+}
+
+
 CompileType UnboxIntegerInstr::ComputeType() const {
   return CompileType::Int();
 }
diff --git a/runtime/vm/gc_sweeper.cc b/runtime/vm/gc_sweeper.cc
index 043e01d..d5486f9 100644
--- a/runtime/vm/gc_sweeper.cc
+++ b/runtime/vm/gc_sweeper.cc
@@ -57,14 +57,24 @@
 
 
 bool GCSweeper::SweepLargePage(HeapPage* page) {
+  bool in_use = false;
   RawObject* raw_obj = RawObject::FromAddr(page->object_start());
-  if (!raw_obj->IsMarked()) {
-    // The large object was not marked. Used size is zero, which also tells the
-    // calling code that the large object page can be recycled.
-    return false;
+  if (raw_obj->IsMarked()) {
+    raw_obj->ClearMarkBit();
+    in_use = true;
   }
-  raw_obj->ClearMarkBit();
-  return true;
+#ifdef DEBUG
+  // String::MakeExternal and Array::MakeArray create trailing filler objects,
+  // but they are always unreachable. Verify that they are not marked.
+  uword current = RawObject::ToAddr(raw_obj) + raw_obj->Size();
+  uword end = page->object_end();
+  while (current < end) {
+    RawObject* cur_obj = RawObject::FromAddr(current);
+    ASSERT(!cur_obj->IsMarked());
+    current += cur_obj->Size();
+  }
+#endif  // DEBUG
+  return in_use;
 }
 
 }  // namespace dart
diff --git a/runtime/vm/growable_array.h b/runtime/vm/growable_array.h
index a94158e..6f26c74 100644
--- a/runtime/vm/growable_array.h
+++ b/runtime/vm/growable_array.h
@@ -83,6 +83,9 @@
     data_[idx] = value;
   }
 
+  // The content is uninitialized after calling it.
+  void SetLength(intptr_t new_length);
+
   // Sort the array in place.
   inline void Sort(int compare(const T*, const T*));
 
@@ -92,6 +95,7 @@
   T* data_;
   Zone* zone_;  // Zone in which we are allocating the array.
 
+  // Used for growing the array.
   void Resize(intptr_t new_length);
 
   DISALLOW_COPY_AND_ASSIGN(BaseGrowableArray);
@@ -119,6 +123,18 @@
 }
 
 
+template<typename T, typename B>
+void BaseGrowableArray<T, B>::SetLength(intptr_t new_length) {
+  if (new_length > capacity_) {
+    T* new_data = zone_->Alloc<T>(new_length);
+    ASSERT(new_data != NULL);
+    data_ = new_data;
+    capacity_ = new_length;
+  }
+  length_ = new_length;
+}
+
+
 template<typename T>
 class GrowableArray : public BaseGrowableArray<T, ValueObject> {
  public:
diff --git a/runtime/vm/heap.cc b/runtime/vm/heap.cc
index acdca49..0a2c4d1 100644
--- a/runtime/vm/heap.cc
+++ b/runtime/vm/heap.cc
@@ -33,7 +33,7 @@
             "maximum total external size (MB) in new gen before triggering GC");
 
 Heap::Heap(Isolate* isolate,
-           intptr_t max_new_gen_words,
+           intptr_t max_new_gen_semi_words,
            intptr_t max_old_gen_words)
     : isolate_(isolate), read_only_(false), gc_in_progress_(false) {
   for (int sel = 0;
@@ -43,7 +43,7 @@
     old_weak_tables_[sel] = new WeakTable();
   }
   new_space_ = new Scavenger(this,
-                             max_new_gen_words,
+                             max_new_gen_semi_words,
                              kNewObjectAlignmentOffset);
   old_space_ = new PageSpace(this, max_old_gen_words);
   stats_.num_ = 0;
@@ -92,6 +92,7 @@
 }
 
 void Heap::AllocateExternal(intptr_t size, Space space) {
+  ASSERT(isolate()->no_gc_scope_depth() == 0);
   if (space == kNew) {
     new_space_->AllocateExternal(size);
     if (new_space_->ExternalInWords() > (FLAG_new_gen_ext_limit * MBInWords)) {
diff --git a/runtime/vm/heap.h b/runtime/vm/heap.h
index 57ded04..71354e3 100644
--- a/runtime/vm/heap.h
+++ b/runtime/vm/heap.h
@@ -263,12 +263,12 @@
     Heap::GCReason reason_;
 
     class Data : public ValueObject {
-    public:
+     public:
       Data() {}
       int64_t micros_;
       SpaceUsage new_;
       SpaceUsage old_;
-    private:
+     private:
       DISALLOW_COPY_AND_ASSIGN(Data);
     };
 
@@ -288,7 +288,7 @@
   static const intptr_t kNewAllocatableSize = 256 * KB;
 
   Heap(Isolate* isolate,
-       intptr_t max_new_gen_words,
+       intptr_t max_new_gen_semi_words,  // Max capacity of new semi-space.
        intptr_t max_old_gen_words);
 
   uword AllocateNew(intptr_t size);
diff --git a/runtime/vm/il_printer.cc b/runtime/vm/il_printer.cc
index 1ea3469..181b017 100644
--- a/runtime/vm/il_printer.cc
+++ b/runtime/vm/il_printer.cc
@@ -283,7 +283,7 @@
 }
 
 
-const char* Range::ToCString(Range* range) {
+const char* Range::ToCString(const Range* range) {
   if (range == NULL) return "[_|_, _|_]";
 
   char buffer[256];
@@ -296,18 +296,18 @@
 void RangeBoundary::PrintTo(BufferFormatter* f) const {
   switch (kind_) {
     case kSymbol:
-      f->Print("v%" Pd,
+      f->Print("v%" Pd "",
                reinterpret_cast<Definition*>(value_)->ssa_temp_index());
-      if (offset_ != 0) f->Print("%+" Pd, offset_);
+      if (offset_ != 0) f->Print("%+" Pd64 "", offset_);
+      break;
+    case kNegativeInfinity:
+      f->Print("-inf");
+      break;
+    case kPositiveInfinity:
+      f->Print("+inf");
       break;
     case kConstant:
-      if (value_ == kMinusInfinity) {
-        f->Print("-inf");
-      } else if (value_ == kPlusInfinity) {
-        f->Print("+inf");
-      } else {
-        f->Print("%" Pd, value_);
-      }
+      f->Print("%" Pd64 "", value_);
       break;
     case kUnknown:
       f->Print("_|_");
@@ -592,7 +592,7 @@
 void BinarySmiOpInstr::PrintTo(BufferFormatter* f) const {
   Definition::PrintTo(f);
   f->Print(" %co", overflow_ ? '+' : '-');
-  f->Print(" %ct", is_truncating() ? '+' : '-');
+  f->Print(" %ct", IsTruncating() ? '+' : '-');
 }
 
 
diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc
index 67f8142..1891ef2 100644
--- a/runtime/vm/intermediate_language.cc
+++ b/runtime/vm/intermediate_language.cc
@@ -34,7 +34,6 @@
 DECLARE_FLAG(bool, trace_optimization);
 DECLARE_FLAG(bool, trace_constant_propagation);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
-DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 Definition::Definition()
     : range_(NULL),
@@ -60,14 +59,14 @@
 }
 
 
-ICData* Instruction::GetICData(const Array& ic_data_array) const {
-  ICData& ic_data = ICData::ZoneHandle();
+const ICData* Instruction::GetICData(
+    const ZoneGrowableArray<const ICData*>& ic_data_array) const {
   // The deopt_id can be outside the range of the IC data array for
   // computations added in the optimizing compiler.
-  if (!ic_data_array.IsNull() && (deopt_id_ < ic_data_array.Length())) {
-    ic_data ^= ic_data_array.At(deopt_id_);
+  if (deopt_id_ < ic_data_array.length()) {
+    return ic_data_array[deopt_id_];
   }
-  return &ic_data;
+  return NULL;
 }
 
 
@@ -319,7 +318,7 @@
          !BigintOperations::FitsIntoSmi(Bigint::Cast(value)));
   ASSERT(!value.IsBigint() ||
          !BigintOperations::FitsIntoInt64(Bigint::Cast(value)));
-  ASSERT(!value.IsMint() || !Smi::IsValid64(Mint::Cast(value).AsInt64Value()));
+  ASSERT(!value.IsMint() || !Smi::IsValid(Mint::Cast(value).AsInt64Value()));
 }
 
 
@@ -551,7 +550,11 @@
 
 #define SET_IS_RECOGNIZED(class_name, function_name, dest, fp)                 \
   func = Library::GetFunction(libs, #class_name, #function_name);              \
-  ASSERT(!func.IsNull());                                                      \
+  if (func.IsNull()) {                                                         \
+    OS::PrintErr("Missing %s::%s\n", #class_name, #function_name);             \
+    UNREACHABLE();                                                             \
+  }                                                                            \
+  ASSERT(func.CheckSourceFingerprint(fp));                                     \
   func.set_is_recognized(true);                                                \
 
   RECOGNIZED_LIST(SET_IS_RECOGNIZED);
@@ -1234,14 +1237,13 @@
     case Token::kSHR: {
       // Can't deopt if shift-count is known positive.
       Range* right_range = this->right()->definition()->range();
-      return (right_range == NULL)
-          || !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+      return (right_range == NULL) || !right_range->IsPositive();
     }
     case Token::kSHL: {
       Range* right_range = this->right()->definition()->range();
-      if ((right_range != NULL) && is_truncating()) {
+      if ((right_range != NULL) && IsTruncating()) {
         // Can deoptimize if right can be negative.
-        return !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+        return !right_range->IsPositive();
       }
       return true;
     }
@@ -2256,16 +2258,16 @@
 
 
 void InstanceCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
-  ICData& call_ic_data = ICData::ZoneHandle(ic_data()->raw());
+  const ICData* call_ic_data = NULL;
   if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
     const Array& arguments_descriptor =
         Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
                                                argument_names()));
-    call_ic_data = ICData::New(compiler->parsed_function().function(),
-                               function_name(),
-                               arguments_descriptor,
-                               deopt_id(),
-                               checked_argument_count());
+    call_ic_data = compiler->GetOrAddInstanceCallICData(
+        deopt_id(), function_name(), arguments_descriptor,
+        checked_argument_count());
+  } else {
+    call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
   }
   if (compiler->is_optimizing()) {
     ASSERT(HasICData());
@@ -2285,7 +2287,7 @@
                                      ArgumentCount(),
                                      argument_names(),
                                      locs(),
-                                     call_ic_data);
+                                     *call_ic_data);
     }
   } else {
     // Unoptimized code.
@@ -2298,7 +2300,7 @@
                                    ArgumentCount(),
                                    argument_names(),
                                    locs(),
-                                   call_ic_data);
+                                   *call_ic_data);
   }
 }
 
@@ -2330,6 +2332,26 @@
 
 
 void StaticCallInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  const ICData* call_ic_data = NULL;
+  if (!FLAG_propagate_ic_data || !compiler->is_optimizing()) {
+    const Array& arguments_descriptor =
+        Array::Handle(ArgumentsDescriptor::New(ArgumentCount(),
+                                               argument_names()));
+    // TODO(srdjan): Improve performance of function recognition.
+    MethodRecognizer::Kind recognized_kind =
+        MethodRecognizer::RecognizeKind(function());
+    int num_args_checked = 0;
+    if ((recognized_kind == MethodRecognizer::kMathMin) ||
+        (recognized_kind == MethodRecognizer::kMathMax)) {
+      num_args_checked = 2;
+    }
+    call_ic_data = compiler->GetOrAddStaticCallICData(deopt_id(),
+                                                      function(),
+                                                      arguments_descriptor,
+                                                      num_args_checked);
+  } else {
+    call_ic_data = &ICData::ZoneHandle(ic_data()->raw());
+  }
   if (!compiler->is_optimizing()) {
     // Some static calls can be optimized by the optimizing compiler (e.g. sqrt)
     // and therefore need a deoptimization descriptor.
@@ -2342,7 +2364,8 @@
                                function(),
                                ArgumentCount(),
                                argument_names(),
-                               locs());
+                               locs(),
+                               *call_ic_data);
 }
 
 
@@ -2429,7 +2452,7 @@
 }
 
 
-RangeBoundary RangeBoundary::FromDefinition(Definition* defn, intptr_t offs) {
+RangeBoundary RangeBoundary::FromDefinition(Definition* defn, int64_t offs) {
   if (defn->IsConstant() && defn->AsConstant()->value().IsSmi()) {
     return FromConstant(Smi::Cast(defn->AsConstant()->value()).Value() + offs);
   }
@@ -2438,18 +2461,90 @@
 
 
 RangeBoundary RangeBoundary::LowerBound() const {
+  if (IsInfinity()) {
+    return NegativeInfinity();
+  }
   if (IsConstant()) return *this;
   return Add(Range::ConstantMin(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
-             OverflowedMinSmi());
+             NegativeInfinity());
 }
 
 
 RangeBoundary RangeBoundary::UpperBound() const {
+  if (IsInfinity()) {
+    return PositiveInfinity();
+  }
   if (IsConstant()) return *this;
   return Add(Range::ConstantMax(symbol()->range()),
              RangeBoundary::FromConstant(offset_),
-             OverflowedMaxSmi());
+             PositiveInfinity());
+}
+
+
+RangeBoundary RangeBoundary::Add(const RangeBoundary& a,
+                                 const RangeBoundary& b,
+                                 const RangeBoundary& overflow) {
+  ASSERT(a.IsConstant() && b.IsConstant());
+
+  if (Utils::WillAddOverflow(a.ConstantValue(), b.ConstantValue())) {
+    return overflow;
+  }
+
+  int64_t result = a.ConstantValue() + b.ConstantValue();
+
+  return RangeBoundary::FromConstant(result);
+}
+
+
+RangeBoundary RangeBoundary::Sub(const RangeBoundary& a,
+                                 const RangeBoundary& b,
+                                 const RangeBoundary& overflow) {
+  ASSERT(a.IsConstant() && b.IsConstant());
+
+  if (Utils::WillSubOverflow(a.ConstantValue(), b.ConstantValue())) {
+    return overflow;
+  }
+
+  int64_t result = a.ConstantValue() - b.ConstantValue();
+
+  return RangeBoundary::FromConstant(result);
+}
+
+
+bool RangeBoundary::SymbolicAdd(const RangeBoundary& a,
+                                const RangeBoundary& b,
+                                RangeBoundary* result) {
+  if (a.IsSymbol() && b.IsConstant()) {
+    if (Utils::WillAddOverflow(a.offset(), b.ConstantValue())) {
+      return false;
+    }
+
+    const int64_t offset = a.offset() + b.ConstantValue();
+
+    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
+    return true;
+  } else if (b.IsSymbol() && a.IsConstant()) {
+    return SymbolicAdd(b, a, result);
+  }
+  return false;
+}
+
+
+bool RangeBoundary::SymbolicSub(const RangeBoundary& a,
+                                const RangeBoundary& b,
+                                RangeBoundary* result) {
+  if (a.IsSymbol() && b.IsConstant()) {
+    if (Utils::WillSubOverflow(a.offset(), b.ConstantValue())) {
+      return false;
+    }
+
+    const int64_t offset = a.offset() - b.ConstantValue();
+
+    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
+    return true;
+  }
+  return false;
 }
 
 
@@ -2480,39 +2575,47 @@
 }
 
 
-// Returns true if range has a least specific minimum value.
-static bool IsMinSmi(Range* range) {
-  return (range == NULL) ||
-      (range->min().IsConstant() &&
-       (range->min().value() <= Smi::kMinValue));
-}
-
-
-// Returns true if range has a least specific maximium value.
-static bool IsMaxSmi(Range* range) {
-  return (range == NULL) ||
-      (range->max().IsConstant() &&
-       (range->max().value() >= Smi::kMaxValue));
-}
-
-
-// Returns true if two range boundaries can be proven to be equal.
-static bool IsEqual(const RangeBoundary& a, const RangeBoundary& b) {
-  if (a.IsConstant() && b.IsConstant()) {
-    return a.value() == b.value();
-  } else if (a.IsSymbol() && b.IsSymbol()) {
-    return (a.offset() == b.offset()) && DependOnSameSymbol(a, b);
-  } else {
-    return false;
+bool RangeBoundary::Equals(const RangeBoundary& other) const {
+  if (IsConstant() && other.IsConstant()) {
+    return ConstantValue() == other.ConstantValue();
+  } else if (IsInfinity() && other.IsInfinity()) {
+    return kind() == other.kind();
+  } else if (IsSymbol() && other.IsSymbol()) {
+    return (offset() == other.offset()) && DependOnSameSymbol(*this, other);
+  } else if (IsUnknown() && other.IsUnknown()) {
+    return true;
   }
+  return false;
+}
+
+
+RangeBoundary RangeBoundary::Shl(const RangeBoundary& value_boundary,
+                                 int64_t shift_count,
+                                 const RangeBoundary& overflow) {
+  ASSERT(value_boundary.IsConstant());
+  ASSERT(shift_count >= 0);
+  int64_t limit = 64 - shift_count;
+  int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
+
+  if ((value == 0) ||
+      (shift_count == 0) ||
+      ((limit > 0) && (Utils::IsInt(limit, value)))) {
+    // Result stays in 64 bit range.
+    int64_t result = value << shift_count;
+    return Smi::IsValid(result) ? RangeBoundary(result) : overflow;
+  }
+
+  return overflow;
 }
 
 
 static RangeBoundary CanonicalizeBoundary(const RangeBoundary& a,
                                           const RangeBoundary& overflow) {
-  if (a.IsConstant()) return a;
+  if (a.IsConstant() || a.IsInfinity()) {
+    return a;
+  }
 
-  intptr_t offset = a.offset();
+  int64_t offset = a.offset();
   Definition* symbol = a.symbol();
 
   bool changed;
@@ -2528,11 +2631,19 @@
       switch (op->op_kind()) {
         case Token::kADD:
           if (right->IsConstant()) {
-            offset += Smi::Cast(right->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(right->AsConstant()->value()).Value();
+            if (Utils::WillAddOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset += rhs;
             symbol = left;
             changed = true;
           } else if (left->IsConstant()) {
-            offset += Smi::Cast(left->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(left->AsConstant()->value()).Value();
+            if (Utils::WillAddOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset += rhs;
             symbol = right;
             changed = true;
           }
@@ -2540,7 +2651,11 @@
 
         case Token::kSUB:
           if (right->IsConstant()) {
-            offset -= Smi::Cast(right->AsConstant()->value()).Value();
+            int64_t rhs = Smi::Cast(right->AsConstant()->value()).Value();
+            if (Utils::WillSubOverflow(offset, rhs)) {
+              return overflow;
+            }
+            offset -= rhs;
             symbol = left;
             changed = true;
           }
@@ -2550,8 +2665,6 @@
           break;
       }
     }
-
-    if (!Smi::IsValid(offset)) return overflow;
   } while (changed);
 
   return RangeBoundary::FromDefinition(symbol, offset);
@@ -2564,16 +2677,18 @@
   Range* range = a->symbol()->range();
   if ((range == NULL) || !range->max().IsSymbol()) return false;
 
-  const intptr_t offset = range->max().offset() + a->offset();
 
-  if (!Smi::IsValid(offset)) {
-    *a = RangeBoundary::OverflowedMaxSmi();
+  if (Utils::WillAddOverflow(range->max().offset(), a->offset())) {
+    *a = RangeBoundary::PositiveInfinity();
     return true;
   }
 
+  const int64_t offset = range->max().offset() + a->offset();
+
+
   *a = CanonicalizeBoundary(
       RangeBoundary::FromDefinition(range->max().symbol(), offset),
-      RangeBoundary::OverflowedMaxSmi());
+      RangeBoundary::PositiveInfinity());
 
   return true;
 }
@@ -2585,58 +2700,187 @@
   Range* range = a->symbol()->range();
   if ((range == NULL) || !range->min().IsSymbol()) return false;
 
-  const intptr_t offset = range->min().offset() + a->offset();
-  if (!Smi::IsValid(offset)) {
-    *a = RangeBoundary::OverflowedMinSmi();
+  if (Utils::WillAddOverflow(range->min().offset(), a->offset())) {
+    *a = RangeBoundary::NegativeInfinity();
     return true;
   }
 
+  const int64_t offset = range->min().offset() + a->offset();
+
   *a = CanonicalizeBoundary(
       RangeBoundary::FromDefinition(range->min().symbol(), offset),
-      RangeBoundary::OverflowedMinSmi());
+      RangeBoundary::NegativeInfinity());
 
   return true;
 }
 
 
-RangeBoundary RangeBoundary::Min(RangeBoundary a, RangeBoundary b) {
+RangeBoundary RangeBoundary::Min(RangeBoundary a, RangeBoundary b,
+                                 RangeSize size) {
+  ASSERT(!(a.IsNegativeInfinity() || b.IsNegativeInfinity()));
+  ASSERT(!a.IsUnknown() || !b.IsUnknown());
+  if (a.IsUnknown() && !b.IsUnknown()) {
+    return b;
+  }
+  if (!a.IsUnknown() && b.IsUnknown()) {
+    return a;
+  }
+  if (size == kRangeBoundarySmi) {
+    if (a.IsSmiMaximumOrAbove() && !b.IsSmiMaximumOrAbove()) {
+      return b;
+    }
+    if (!a.IsSmiMaximumOrAbove() && b.IsSmiMaximumOrAbove()) {
+      return a;
+    }
+  } else {
+    ASSERT(size == kRangeBoundaryInt64);
+    if (a.IsMaximumOrAbove() && !b.IsMaximumOrAbove()) {
+      return b;
+    }
+    if (!a.IsMaximumOrAbove() && b.IsMaximumOrAbove()) {
+      return a;
+    }
+  }
+
+  if (a.Equals(b)) {
+    return b;
+  }
+
+  {
+    RangeBoundary canonical_a =
+        CanonicalizeBoundary(a, RangeBoundary::PositiveInfinity());
+    RangeBoundary canonical_b =
+        CanonicalizeBoundary(b, RangeBoundary::PositiveInfinity());
+    do {
+      if (DependOnSameSymbol(canonical_a, canonical_b)) {
+        a = canonical_a;
+        b = canonical_b;
+        break;
+      }
+    } while (CanonicalizeMaxBoundary(&canonical_a) ||
+             CanonicalizeMaxBoundary(&canonical_b));
+  }
+
   if (DependOnSameSymbol(a, b)) {
     return (a.offset() <= b.offset()) ? a : b;
   }
 
-  const intptr_t min_a = a.LowerBound().Clamp().value();
-  const intptr_t min_b = b.LowerBound().Clamp().value();
+  const int64_t min_a = a.UpperBound().Clamp(size).ConstantValue();
+  const int64_t min_b = b.UpperBound().Clamp(size).ConstantValue();
 
   return RangeBoundary::FromConstant(Utils::Minimum(min_a, min_b));
 }
 
 
-RangeBoundary RangeBoundary::Max(RangeBoundary a, RangeBoundary b) {
-  if (DependOnSameSymbol(a, b)) {
-    return (a.offset() >= b.offset()) ? a : b;
+RangeBoundary RangeBoundary::Max(RangeBoundary a, RangeBoundary b,
+                                 RangeSize size) {
+  ASSERT(!(a.IsPositiveInfinity() || b.IsPositiveInfinity()));
+  ASSERT(!a.IsUnknown() || !b.IsUnknown());
+  if (a.IsUnknown() && !b.IsUnknown()) {
+    return b;
+  }
+  if (!a.IsUnknown() && b.IsUnknown()) {
+    return a;
+  }
+  if (size == kRangeBoundarySmi) {
+    if (a.IsSmiMinimumOrBelow() && !b.IsSmiMinimumOrBelow()) {
+      return b;
+    }
+    if (!a.IsSmiMinimumOrBelow() && b.IsSmiMinimumOrBelow()) {
+      return a;
+    }
+  } else {
+     ASSERT(size == kRangeBoundaryInt64);
+    if (a.IsMinimumOrBelow() && !b.IsMinimumOrBelow()) {
+      return b;
+    }
+    if (!a.IsMinimumOrBelow() && b.IsMinimumOrBelow()) {
+      return a;
+    }
+  }
+  if (a.Equals(b)) {
+    return b;
   }
 
-  const intptr_t max_a = a.UpperBound().Clamp().value();
-  const intptr_t max_b = b.UpperBound().Clamp().value();
+  {
+    RangeBoundary canonical_a =
+        CanonicalizeBoundary(a, RangeBoundary::NegativeInfinity());
+    RangeBoundary canonical_b =
+        CanonicalizeBoundary(b, RangeBoundary::NegativeInfinity());
+
+    do {
+      if (DependOnSameSymbol(canonical_a, canonical_b)) {
+        a = canonical_a;
+        b = canonical_b;
+        break;
+      }
+    } while (CanonicalizeMinBoundary(&canonical_a) ||
+             CanonicalizeMinBoundary(&canonical_b));
+  }
+
+  if (DependOnSameSymbol(a, b)) {
+    return (a.offset() <= b.offset()) ? b : a;
+  }
+
+  const int64_t max_a = a.LowerBound().Clamp(size).ConstantValue();
+  const int64_t max_b = b.LowerBound().Clamp(size).ConstantValue();
 
   return RangeBoundary::FromConstant(Utils::Maximum(max_a, max_b));
 }
 
 
+int64_t RangeBoundary::ConstantValue() const {
+  ASSERT(IsConstant());
+  return value_;
+}
+
+
 void Definition::InferRange() {
-  ASSERT(Type()->ToCid() == kSmiCid);  // Has meaning only for smis.
-  if (range_ == NULL) {
-    range_ = Range::Unknown();
+  if (Type()->ToCid() == kSmiCid) {
+    if (range_ == NULL) {
+      range_ = Range::UnknownSmi();
+    }
+  } else if (IsMintDefinition()) {
+    if (range_ == NULL) {
+      range_ = Range::Unknown();
+    }
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
   }
 }
 
 
 void ConstantInstr::InferRange() {
-  ASSERT(value_.IsSmi());
+  if (value_.IsSmi()) {
+    if (range_ == NULL) {
+      int64_t value = Smi::Cast(value_).Value();
+      range_ = new Range(RangeBoundary::FromConstant(value),
+                         RangeBoundary::FromConstant(value));
+    }
+  } else if (value_.IsMint()) {
+    if (range_ == NULL) {
+      int64_t value = Mint::Cast(value_).value();
+      range_ = new Range(RangeBoundary::FromConstant(value),
+                         RangeBoundary::FromConstant(value));
+    }
+  } else {
+    // Only Smi and Mint supported.
+    UNREACHABLE();
+  }
+}
+
+
+void UnboxIntegerInstr::InferRange() {
   if (range_ == NULL) {
-    intptr_t value = Smi::Cast(value_).Value();
-    range_ = new Range(RangeBoundary::FromConstant(value),
-                       RangeBoundary::FromConstant(value));
+    Definition* unboxed = value()->definition();
+    ASSERT(unboxed != NULL);
+    Range* range = unboxed->range();
+    if (range == NULL) {
+      range_ = Range::Unknown();
+      return;
+    }
+    range_ = new Range(range->min(), range->max());
   }
 }
 
@@ -2644,72 +2888,32 @@
 void ConstraintInstr::InferRange() {
   Range* value_range = value()->definition()->range();
 
+  // Only constraining smi values.
+  ASSERT(value()->IsSmiValue());
+
   RangeBoundary min;
   RangeBoundary max;
 
-  if (IsMinSmi(value_range) && !IsMinSmi(constraint())) {
-    min = constraint()->min();
-  } else if (IsMinSmi(constraint()) && !IsMinSmi(value_range)) {
-    min = value_range->min();
-  } else if ((value_range != NULL) &&
-             IsEqual(constraint()->min(), value_range->min())) {
-    min = constraint()->min();
-  } else {
-    if (value_range != NULL) {
-      RangeBoundary canonical_a =
-          CanonicalizeBoundary(constraint()->min(),
-                               RangeBoundary::OverflowedMinSmi());
-      RangeBoundary canonical_b =
-          CanonicalizeBoundary(value_range->min(),
-                               RangeBoundary::OverflowedMinSmi());
-
-      do {
-        if (DependOnSameSymbol(canonical_a, canonical_b)) {
-          min = (canonical_a.offset() <= canonical_b.offset()) ? canonical_b
-                                                               : canonical_a;
-        }
-      } while (CanonicalizeMinBoundary(&canonical_a) ||
-               CanonicalizeMinBoundary(&canonical_b));
-    }
-
-    if (min.IsUnknown()) {
-      min = RangeBoundary::Max(Range::ConstantMin(value_range),
-                               Range::ConstantMin(constraint()));
-    }
+  {
+    RangeBoundary value_min = (value_range == NULL) ?
+        RangeBoundary() : value_range->min();
+    RangeBoundary constraint_min = constraint()->min();
+    min = RangeBoundary::Max(value_min, constraint_min,
+                             RangeBoundary::kRangeBoundarySmi);
   }
 
-  if (IsMaxSmi(value_range) && !IsMaxSmi(constraint())) {
-    max = constraint()->max();
-  } else if (IsMaxSmi(constraint()) && !IsMaxSmi(value_range)) {
-    max = value_range->max();
-  } else if ((value_range != NULL) &&
-             IsEqual(constraint()->max(), value_range->max())) {
-    max = constraint()->max();
-  } else {
-    if (value_range != NULL) {
-      RangeBoundary canonical_b =
-          CanonicalizeBoundary(value_range->max(),
-                               RangeBoundary::OverflowedMaxSmi());
-      RangeBoundary canonical_a =
-          CanonicalizeBoundary(constraint()->max(),
-                               RangeBoundary::OverflowedMaxSmi());
+  ASSERT(!min.IsUnknown());
 
-      do {
-        if (DependOnSameSymbol(canonical_a, canonical_b)) {
-          max = (canonical_a.offset() <= canonical_b.offset()) ? canonical_a
-                                                               : canonical_b;
-          break;
-        }
-      } while (CanonicalizeMaxBoundary(&canonical_a) ||
-               CanonicalizeMaxBoundary(&canonical_b));
-    }
-
-    if (max.IsUnknown()) {
-      max = RangeBoundary::Min(Range::ConstantMax(value_range),
-                               Range::ConstantMax(constraint()));
-    }
+  {
+    RangeBoundary value_max = (value_range == NULL) ?
+        RangeBoundary() : value_range->max();
+    RangeBoundary constraint_max = constraint()->max();
+    max = RangeBoundary::Min(value_max, constraint_max,
+                             RangeBoundary::kRangeBoundarySmi);
   }
 
+  ASSERT(!max.IsUnknown());
+
   range_ = new Range(min, max);
 
   // Mark branches that generate unsatisfiable constraints as constant.
@@ -2781,6 +2985,22 @@
       range_ = new Range(RangeBoundary::FromConstant(0),
                          RangeBoundary::FromConstant(65535));
       break;
+    case kTypedDataInt32ArrayCid:
+      if (CanDeoptimize()) {
+        range_ = Range::UnknownSmi();
+      } else {
+        range_ = new Range(RangeBoundary::FromConstant(kMinInt32),
+                           RangeBoundary::FromConstant(kMaxInt32));
+      }
+      break;
+    case kTypedDataUint32ArrayCid:
+      if (CanDeoptimize()) {
+        range_ = Range::UnknownSmi();
+      } else {
+        range_ = new Range(RangeBoundary::FromConstant(0),
+                           RangeBoundary::FromConstant(kMaxUint32));
+      }
+      break;
     case kOneByteStringCid:
       range_ = new Range(RangeBoundary::FromConstant(0),
                          RangeBoundary::FromConstant(0xFF));
@@ -2899,29 +3119,35 @@
   RangeBoundary new_min;
   RangeBoundary new_max;
 
+  ASSERT(Type()->ToCid() == kSmiCid);
+
   for (intptr_t i = 0; i < InputCount(); i++) {
     Range* input_range = InputAt(i)->definition()->range();
     if (input_range == NULL) {
-      range_ = Range::Unknown();
+      range_ = Range::UnknownSmi();
       return;
     }
 
     if (new_min.IsUnknown()) {
       new_min = Range::ConstantMin(input_range);
     } else {
-      new_min = RangeBoundary::Min(new_min, Range::ConstantMin(input_range));
+      new_min = RangeBoundary::Min(new_min,
+                                   Range::ConstantMinSmi(input_range),
+                                   RangeBoundary::kRangeBoundarySmi);
     }
 
     if (new_max.IsUnknown()) {
       new_max = Range::ConstantMax(input_range);
     } else {
-      new_max = RangeBoundary::Max(new_max, Range::ConstantMax(input_range));
+      new_max = RangeBoundary::Max(new_max,
+                                   Range::ConstantMaxSmi(input_range),
+                                   RangeBoundary::kRangeBoundarySmi);
     }
   }
 
   ASSERT(new_min.IsUnknown() == new_max.IsUnknown());
   if (new_min.IsUnknown()) {
-    range_ = Range::Unknown();
+    range_ = Range::UnknownSmi();
     return;
   }
 
@@ -2940,70 +3166,15 @@
 }
 
 
-static bool SymbolicSub(const RangeBoundary& a,
-                        const RangeBoundary& b,
-                        RangeBoundary* result) {
-  if (a.IsSymbol() && b.IsConstant() && !b.Overflowed()) {
-    const intptr_t offset = a.offset() - b.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
-    return true;
-  }
-  return false;
-}
-
-
-static bool SymbolicAdd(const RangeBoundary& a,
-                        const RangeBoundary& b,
-                        RangeBoundary* result) {
-  if (a.IsSymbol() && b.IsConstant() && !b.Overflowed()) {
-    const intptr_t offset = a.offset() + b.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(a.symbol(), offset);
-    return true;
-  } else if (b.IsSymbol() && a.IsConstant() && !a.Overflowed()) {
-    const intptr_t offset = b.offset() + a.value();
-    if (!Smi::IsValid(offset)) return false;
-
-    *result = RangeBoundary::FromDefinition(b.symbol(), offset);
-    return true;
-  }
-  return false;
-}
-
-
 static bool IsArrayLength(Definition* defn) {
+  if (defn == NULL) {
+    return false;
+  }
   LoadFieldInstr* load = defn->AsLoadField();
   return (load != NULL) && load->IsImmutableLengthLoad();
 }
 
 
-static int64_t ConstantAbsMax(const Range* range) {
-  if (range == NULL) return Smi::kMaxValue;
-  const int64_t abs_min = Utils::Abs(Range::ConstantMin(range).value());
-  const int64_t abs_max = Utils::Abs(Range::ConstantMax(range).value());
-  return abs_min > abs_max ? abs_min : abs_max;
-}
-
-
-static bool OnlyPositiveOrZero(const Range* a, const Range* b) {
-  if ((a == NULL) || (b == NULL)) return false;
-  if (Range::ConstantMin(a).value() < 0) return false;
-  if (Range::ConstantMin(b).value() < 0) return false;
-  return true;
-}
-
-
-static bool OnlyNegativeOrZero(const Range* a, const Range* b) {
-  if ((a == NULL) || (b == NULL)) return false;
-  if (Range::ConstantMax(a).value() > 0) return false;
-  if (Range::ConstantMax(b).value() > 0) return false;
-  return true;
-}
-
-
 void BinarySmiOpInstr::InferRange() {
   // TODO(vegorov): canonicalize BinarySmiOp to always have constant on the
   // right and a non-constant on the left.
@@ -3013,10 +3184,306 @@
   Range* right_range = right()->definition()->range();
 
   if ((left_range == NULL) || (right_range == NULL)) {
-    range_ = new Range(RangeBoundary::MinSmi(), RangeBoundary::MaxSmi());
+    range_ = Range::UnknownSmi();
     return;
   }
 
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::UnknownSmi();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+  // Calculate overflowed status before clamping.
+  const bool overflowed = range_->min().LowerBound().OverflowedSmi() ||
+                          range_->max().UpperBound().OverflowedSmi();
+  // Clamp value to be within smi range.
+  range_->Clamp(RangeBoundary::kRangeBoundarySmi);
+
+  set_overflow(overflowed);
+}
+
+
+void BinaryMintOpInstr::InferRange() {
+  // TODO(vegorov): canonicalize BinaryMintOpInstr to always have constant on
+  // the right and a non-constant on the left.
+  Definition* left_defn = left()->definition();
+
+  Range* left_range = left_defn->range();
+  Range* right_range = right()->definition()->range();
+
+  if ((left_range == NULL) || (right_range == NULL)) {
+    range_ = Range::Unknown();
+    return;
+  }
+
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::Unknown();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+
+  // Clamp value to be within mint range.
+  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+}
+
+
+void ShiftMintOpInstr::InferRange() {
+  Definition* left_defn = left()->definition();
+
+  Range* left_range = left_defn->range();
+  Range* right_range = right()->definition()->range();
+
+  if ((left_range == NULL) || (right_range == NULL)) {
+    range_ = Range::Unknown();
+    return;
+  }
+
+  Range* possible_range = Range::BinaryOp(op_kind(),
+                                          left_range,
+                                          right_range,
+                                          left_defn);
+
+  if ((range_ == NULL) && (possible_range == NULL)) {
+    // Initialize.
+    range_ = Range::Unknown();
+    return;
+  }
+
+  if (possible_range == NULL) {
+    // Nothing new.
+    return;
+  }
+
+  range_ = possible_range;
+
+  ASSERT(!range_->min().IsUnknown() && !range_->max().IsUnknown());
+
+  // Clamp value to be within mint range.
+  range_->Clamp(RangeBoundary::kRangeBoundaryInt64);
+}
+
+
+void BoxIntegerInstr::InferRange() {
+  Range* input_range = value()->definition()->range();
+  if (input_range != NULL) {
+    bool is_smi = !input_range->min().LowerBound().OverflowedSmi() &&
+                  !input_range->max().UpperBound().OverflowedSmi();
+    set_is_smi(is_smi);
+    // The output range is the same as the input range.
+    range_ = input_range;
+  }
+}
+
+
+bool Range::IsPositive() const {
+  if (min().IsNegativeInfinity()) {
+    return false;
+  }
+  if (min().LowerBound().ConstantValue() < 0) {
+    return false;
+  }
+  if (max().IsPositiveInfinity()) {
+    return true;
+  }
+  return max().UpperBound().ConstantValue() >= 0;
+}
+
+
+bool Range::OnlyLessThanOrEqualTo(int64_t val) const {
+  if (max().IsPositiveInfinity()) {
+    // Cannot be true.
+    return false;
+  }
+  if (max().UpperBound().ConstantValue() > val) {
+    // Not true.
+    return false;
+  }
+  return true;
+}
+
+
+bool Range::OnlyGreaterThanOrEqualTo(int64_t val) const {
+  if (min().IsNegativeInfinity()) {
+    return false;
+  }
+  if (min().LowerBound().ConstantValue() < val) {
+    return false;
+  }
+  return true;
+}
+
+
+// Inclusive.
+bool Range::IsWithin(int64_t min_int, int64_t max_int) const {
+  RangeBoundary lower_min = min().LowerBound();
+  if (lower_min.IsNegativeInfinity() || (lower_min.ConstantValue() < min_int)) {
+    return false;
+  }
+  RangeBoundary upper_max = max().UpperBound();
+  if (upper_max.IsPositiveInfinity() || (upper_max.ConstantValue() > max_int)) {
+    return false;
+  }
+  return true;
+}
+
+
+bool Range::Overlaps(int64_t min_int, int64_t max_int) const {
+  RangeBoundary lower = min().LowerBound();
+  RangeBoundary upper = max().UpperBound();
+  const int64_t this_min = lower.IsNegativeInfinity() ?
+      RangeBoundary::kMin : lower.ConstantValue();
+  const int64_t this_max = upper.IsPositiveInfinity() ?
+      RangeBoundary::kMax : upper.ConstantValue();
+  if ((this_min <= min_int) && (min_int <= this_max)) return true;
+  if ((this_min <= max_int) && (max_int <= this_max)) return true;
+  if ((min_int < this_min) && (max_int > this_max)) return true;
+  return false;
+}
+
+
+bool Range::IsUnsatisfiable() const {
+  // Infinity case: [+inf, ...] || [..., -inf]
+  if (min().IsPositiveInfinity() || max().IsNegativeInfinity()) {
+    return true;
+  }
+  // Constant case: For example [0, -1].
+  if (Range::ConstantMin(this).ConstantValue() >
+      Range::ConstantMax(this).ConstantValue()) {
+    return true;
+  }
+  // Symbol case: For example [v+1, v].
+  if (DependOnSameSymbol(min(), max()) && min().offset() > max().offset()) {
+    return true;
+  }
+  return false;
+}
+
+
+void Range::Clamp(RangeBoundary::RangeSize size) {
+  min_ = min_.Clamp(size);
+  max_ = max_.Clamp(size);
+}
+
+
+void Range::Shl(const Range* left,
+                const Range* right,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left != NULL);
+  ASSERT(right != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+  RangeBoundary left_max = Range::ConstantMax(left);
+  RangeBoundary left_min = Range::ConstantMin(left);
+  // A negative shift count always deoptimizes (and throws), so the minimum
+  // shift count is zero.
+  int64_t right_max = Utils::Maximum(Range::ConstantMax(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+  int64_t right_min = Utils::Maximum(Range::ConstantMin(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+
+  *result_min = RangeBoundary::Shl(
+      left_min,
+      left_min.ConstantValue() > 0 ? right_min : right_max,
+      left_min.ConstantValue() > 0
+          ? RangeBoundary::PositiveInfinity()
+          : RangeBoundary::NegativeInfinity());
+
+  *result_max = RangeBoundary::Shl(
+      left_max,
+      left_max.ConstantValue() > 0 ? right_max : right_min,
+      left_max.ConstantValue() > 0
+          ? RangeBoundary::PositiveInfinity()
+          : RangeBoundary::NegativeInfinity());
+}
+
+
+void Range::Shr(const Range* left,
+                const Range* right,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  RangeBoundary left_max = Range::ConstantMax(left);
+  RangeBoundary left_min = Range::ConstantMin(left);
+  // A negative shift count always deoptimizes (and throws), so the minimum
+  // shift count is zero.
+  int64_t right_max = Utils::Maximum(Range::ConstantMax(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+  int64_t right_min = Utils::Maximum(Range::ConstantMin(right).ConstantValue(),
+                                     static_cast<int64_t>(0));
+
+  *result_min = RangeBoundary::Shr(
+      left_min,
+      left_min.ConstantValue() > 0 ? right_max : right_min);
+
+  *result_max = RangeBoundary::Shr(
+      left_max,
+      left_max.ConstantValue() > 0 ? right_min : right_max);
+}
+
+
+bool Range::And(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  if (Range::ConstantMin(right_range).ConstantValue() >= 0) {
+    *result_min = RangeBoundary::FromConstant(0);
+    *result_max = Range::ConstantMax(right_range);
+    return true;
+  }
+
+  if (Range::ConstantMin(left_range).ConstantValue() >= 0) {
+    *result_min = RangeBoundary::FromConstant(0);
+    *result_max = Range::ConstantMax(left_range);
+    return true;
+  }
+
+  return false;
+}
+
+
+void Range::Add(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max,
+                Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
   RangeBoundary left_min =
     IsArrayLength(left_defn) ?
         RangeBoundary::FromDefinition(left_defn) : left_range->min();
@@ -3025,124 +3492,151 @@
     IsArrayLength(left_defn) ?
         RangeBoundary::FromDefinition(left_defn) : left_range->max();
 
+  if (!RangeBoundary::SymbolicAdd(left_min, right_range->min(), result_min)) {
+    *result_min = RangeBoundary::Add(left_range->min().LowerBound(),
+                                     right_range->min().LowerBound(),
+                                     RangeBoundary::NegativeInfinity());
+  }
+  if (!RangeBoundary::SymbolicAdd(left_max, right_range->max(), result_max)) {
+    *result_max = RangeBoundary::Add(right_range->max().UpperBound(),
+                                     left_range->max().UpperBound(),
+                                     RangeBoundary::PositiveInfinity());
+  }
+}
+
+
+void Range::Sub(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max,
+                Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  RangeBoundary left_min =
+    IsArrayLength(left_defn) ?
+        RangeBoundary::FromDefinition(left_defn) : left_range->min();
+
+  RangeBoundary left_max =
+    IsArrayLength(left_defn) ?
+        RangeBoundary::FromDefinition(left_defn) : left_range->max();
+
+  if (!RangeBoundary::SymbolicSub(left_min, right_range->max(), result_min)) {
+    *result_min = RangeBoundary::Sub(left_range->min().LowerBound(),
+                              right_range->max().UpperBound(),
+                              RangeBoundary::NegativeInfinity());
+  }
+  if (!RangeBoundary::SymbolicSub(left_max, right_range->min(), result_max)) {
+    *result_max = RangeBoundary::Sub(left_range->max().UpperBound(),
+                                     right_range->min().LowerBound(),
+                                     RangeBoundary::PositiveInfinity());
+  }
+}
+
+
+bool Range::Mul(const Range* left_range,
+                const Range* right_range,
+                RangeBoundary* result_min,
+                RangeBoundary* result_max) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+  ASSERT(result_min != NULL);
+  ASSERT(result_max != NULL);
+
+  const int64_t left_max = ConstantAbsMax(left_range);
+  const int64_t right_max = ConstantAbsMax(right_range);
+  if ((left_max <= -kSmiMin) && (right_max <= -kSmiMin) &&
+      ((left_max == 0) || (right_max <= kMaxInt64 / left_max))) {
+    // Product of left and right max values stays in 64 bit range.
+    const int64_t mul_max = left_max * right_max;
+    if (Smi::IsValid(mul_max) && Smi::IsValid(-mul_max)) {
+      const intptr_t r_min =
+          OnlyPositiveOrZero(*left_range, *right_range) ? 0 : -mul_max;
+      *result_min = RangeBoundary::FromConstant(r_min);
+      const intptr_t r_max =
+          OnlyNegativeOrZero(*left_range, *right_range) ? 0 : mul_max;
+      *result_max = RangeBoundary::FromConstant(r_max);
+      return true;
+    }
+  }
+  return false;
+}
+
+
+// Both the a and b ranges are >= 0.
+bool Range::OnlyPositiveOrZero(const Range& a, const Range& b) {
+  return a.OnlyGreaterThanOrEqualTo(0) && b.OnlyGreaterThanOrEqualTo(0);
+}
+
+
+// Both the a and b ranges are <= 0.
+bool Range::OnlyNegativeOrZero(const Range& a, const Range& b) {
+  return a.OnlyLessThanOrEqualTo(0) && b.OnlyLessThanOrEqualTo(0);
+}
+
+
+// Return the maximum absolute value included in range.
+int64_t Range::ConstantAbsMax(const Range* range) {
+  if (range == NULL) {
+    return RangeBoundary::kMax;
+  }
+  const int64_t abs_min = Utils::Abs(Range::ConstantMin(range).ConstantValue());
+  const int64_t abs_max = Utils::Abs(Range::ConstantMax(range).ConstantValue());
+  return Utils::Maximum(abs_min, abs_max);
+}
+
+
+Range* Range::BinaryOp(const Token::Kind op,
+                       const Range* left_range,
+                       const Range* right_range,
+                       Definition* left_defn) {
+  ASSERT(left_range != NULL);
+  ASSERT(right_range != NULL);
+
+  // Both left and right ranges are finite.
+  ASSERT(left_range->IsFinite());
+  ASSERT(right_range->IsFinite());
+
   RangeBoundary min;
   RangeBoundary max;
-  switch (op_kind()) {
+  ASSERT(min.IsUnknown() && max.IsUnknown());
+
+  switch (op) {
     case Token::kADD:
-      if (!SymbolicAdd(left_min, right_range->min(), &min)) {
-        min =
-          RangeBoundary::Add(Range::ConstantMin(left_range),
-                             Range::ConstantMin(right_range),
-                             RangeBoundary::OverflowedMinSmi());
-      }
-
-      if (!SymbolicAdd(left_max, right_range->max(), &max)) {
-        max =
-          RangeBoundary::Add(Range::ConstantMax(right_range),
-                             Range::ConstantMax(left_range),
-                             RangeBoundary::OverflowedMaxSmi());
-      }
+      Range::Add(left_range, right_range, &min, &max, left_defn);
       break;
-
     case Token::kSUB:
-      if (!SymbolicSub(left_min, right_range->max(), &min)) {
-        min =
-          RangeBoundary::Sub(Range::ConstantMin(left_range),
-                             Range::ConstantMax(right_range),
-                             RangeBoundary::OverflowedMinSmi());
-      }
-
-      if (!SymbolicSub(left_max, right_range->min(), &max)) {
-        max =
-          RangeBoundary::Sub(Range::ConstantMax(left_range),
-                             Range::ConstantMin(right_range),
-                             RangeBoundary::OverflowedMaxSmi());
+      Range::Sub(left_range, right_range, &min, &max, left_defn);
+      break;
+    case Token::kMUL: {
+      if (!Range::Mul(left_range, right_range, &min, &max)) {
+        return NULL;
       }
       break;
-
-    case Token::kMUL: {
-      const int64_t left_max = ConstantAbsMax(left_range);
-      const int64_t right_max = ConstantAbsMax(right_range);
-      if ((left_max < 0x7FFFFFFF) && (right_max < 0x7FFFFFFF)) {
-        // Product of left and right max values stays in 64 bit range.
-        const int64_t result_max = left_max * right_max;
-        if (Smi::IsValid64(result_max) && Smi::IsValid64(-result_max)) {
-          const intptr_t r_min =
-              OnlyPositiveOrZero(left_range, right_range) ? 0 : -result_max;
-          min = RangeBoundary::FromConstant(r_min);
-          const intptr_t r_max =
-              OnlyNegativeOrZero(left_range, right_range) ? 0 : result_max;
-          max = RangeBoundary::FromConstant(r_max);
-          break;
-        }
-      }
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
+    }
+    case Token::kSHL: {
+      Range::Shl(left_range, right_range, &min, &max);
+      break;
+    }
+    case Token::kSHR: {
+      Range::Shr(left_range, right_range, &min, &max);
+      break;
     }
     case Token::kBIT_AND:
-      if (Range::ConstantMin(right_range).value() >= 0) {
-        min = RangeBoundary::FromConstant(0);
-        max = Range::ConstantMax(right_range);
-        break;
+      if (!Range::And(left_range, right_range, &min, &max)) {
+        return NULL;
       }
-      if (Range::ConstantMin(left_range).value() >= 0) {
-        min = RangeBoundary::FromConstant(0);
-        max = Range::ConstantMax(left_range);
-        break;
-      }
-
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
-
+      break;
     default:
-      if (range_ == NULL) {
-        range_ = Range::Unknown();
-      }
-      return;
+      return NULL;
+      break;
   }
 
   ASSERT(!min.IsUnknown() && !max.IsUnknown());
-  set_overflow(min.LowerBound().Overflowed() || max.UpperBound().Overflowed());
 
-  if (min.IsConstant()) min.Clamp();
-  if (max.IsConstant()) max.Clamp();
-
-  range_ = new Range(min, max);
-}
-
-
-// Inclusive.
-bool Range::IsWithin(intptr_t min_int, intptr_t max_int) const {
-  if (min().LowerBound().value() < min_int) return false;
-  if (max().UpperBound().value() > max_int) return false;
-  return true;
-}
-
-
-bool Range::Overlaps(intptr_t min_int, intptr_t max_int) const {
-  const intptr_t this_min = min().LowerBound().value();
-  const intptr_t this_max = max().UpperBound().value();
-  if ((this_min <= min_int) && (min_int <= this_max)) return true;
-  if ((this_min <= max_int) && (max_int <= this_max)) return true;
-  if ((min_int < this_min) && (max_int > this_max)) return true;
-  return false;
-}
-
-
-bool Range::IsUnsatisfiable() const {
-  // Constant case: For example [0, -1].
-  if (Range::ConstantMin(this).value() > Range::ConstantMax(this).value()) {
-    return true;
-  }
-  // Symbol case: For example [v+1, v].
-  if (DependOnSameSymbol(min(), max()) && min().offset() > max().offset()) {
-    return true;
-  }
-  return false;
+  return new Range(min, max);
 }
 
 
@@ -3160,24 +3654,32 @@
   }
 
   // Range of the index is not positive. Check can't be redundant.
-  if (Range::ConstantMin(index_range).value() < 0) {
+  if (Range::ConstantMinSmi(index_range).ConstantValue() < 0) {
     return false;
   }
 
   RangeBoundary max = CanonicalizeBoundary(index_range->max(),
-                                           RangeBoundary::OverflowedMaxSmi());
+                                           RangeBoundary::PositiveInfinity());
 
-  if (max.Overflowed()) {
+  if (max.OverflowedSmi()) {
+    return false;
+  }
+
+
+  RangeBoundary max_upper = max.UpperBound();
+  RangeBoundary length_lower = length.LowerBound();
+
+  if (max_upper.OverflowedSmi() || length_lower.OverflowedSmi()) {
     return false;
   }
 
   // Try to compare constant boundaries.
-  if (max.UpperBound().value() < length.LowerBound().value()) {
+  if (max_upper.ConstantValue() < length_lower.ConstantValue()) {
     return true;
   }
 
-  length = CanonicalizeBoundary(length, RangeBoundary::OverflowedMaxSmi());
-  if (length.Overflowed()) {
+  length = CanonicalizeBoundary(length, RangeBoundary::PositiveInfinity());
+  if (length.OverflowedSmi()) {
     return false;
   }
 
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index d813c15..f6b18f5 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -39,233 +39,233 @@
 // See intrinsifier for fingerprint computation.
 #define RECOGNIZED_LIST(V)                                                     \
   V(::, identical, ObjectIdentical, 496869842)                                 \
+  V(ClassID, getID, ClassIDgetID, 1322490980)                                  \
   V(Object, ==, ObjectEquals, 1068471689)                                      \
-  V(Object, Object., ObjectConstructor, 1058615085)                            \
-  V(Object, get:_cid, ObjectCid, 1498751301)                                   \
-  V(_TypedListBase, get:_cid, TypedListBaseCid, 1938244762)                    \
-  V(_List, get:length, ObjectArrayLength, 215183186)                           \
-  V(_List, _List., ObjectArrayConstructor, 176587978)                          \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
-  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 831354841)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 1832126257)                  \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1762714698)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 48785449)                    \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 1392579206)                \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1793798234)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 67253374)                    \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 10467750)                    \
-  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 1596986894)                \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 868037529)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1776345006)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1807927533)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 399659907)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1612092224)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 74799321)                \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
-  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 817119794)            \
-  V(_GrowableList, _setData, GrowableArraySetData, 970836644)                  \
-  V(_GrowableList, _setLength, GrowableArraySetLength, 823005129)              \
-  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
-  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 1599468763)                   \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 1958436584)                 \
-  V(_StringBase, [], StringBaseCharAt, 585372763)                              \
-  V(_StringBase, _interpolate, StringBaseInterpolate, 2013078843)              \
-  V(_OneByteString, _setAt, OneByteStringSetAt, 658941003)                     \
-  V(_IntegerImplementation, toDouble, IntegerToDouble, 1947355341)             \
+  V(Object, Object., ObjectConstructor, 1066669787)                            \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_List, _List., ObjectArrayConstructor, 1595327584)                         \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetUint8, 149406583)                   \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetUint16, 888580944)                 \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_GrowableList, get:_capacity, GrowableArrayCapacity, 555140075)            \
+  V(_GrowableList, _setData, GrowableArraySetData, 2126927509)                 \
+  V(_GrowableList, _setLength, GrowableArraySetLength, 89389299)               \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(_StringBase, get:isEmpty, StringBaseIsEmpty, 49873871)                     \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_StringBase, _interpolate, StringBaseInterpolate, 1758627989)              \
+  V(_OneByteString, _setAt, OneByteStringSetAt, 468605749)                     \
+  V(_IntegerImplementation, toDouble, IntegerToDouble, 1084977108)             \
   V(_IntegerImplementation, _leftShiftWithMask32, IntegerLeftShiftWithMask32,  \
-      2095943661)                                                              \
-  V(_Double, toInt, DoubleToInteger, 1328149975)                               \
-  V(_Double, truncateToDouble, DoubleTruncate, 615732263)                      \
-  V(_Double, roundToDouble, DoubleRound, 622146406)                            \
-  V(_Double, floorToDouble, DoubleFloor, 1614014643)                           \
-  V(_Double, ceilToDouble, DoubleCeil, 277859570)                              \
-  V(_Double, _modulo, DoubleMod, 1443289156)                                   \
-  V(::, sqrt, MathSqrt, 465520247)                                             \
-  V(::, sin, MathSin, 730107143)                                               \
-  V(::, cos, MathCos, 1282146521)                                              \
+      597111055)                                                               \
+  V(_Double, toInt, DoubleToInteger, 1547535151)                               \
+  V(_Double, truncateToDouble, DoubleTruncate, 2117801967)                     \
+  V(_Double, roundToDouble, DoubleRound, 2124216110)                           \
+  V(_Double, floorToDouble, DoubleFloor, 968600699)                            \
+  V(_Double, ceilToDouble, DoubleCeil, 1779929274)                             \
+  V(_Double, _modulo, DoubleMod, 1473971007)                                   \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, cos, MathCos, 1951197905)                                              \
   V(::, min, MathMin, 1022567780)                                              \
   V(::, max, MathMax, 612058870)                                               \
-  V(::, _doublePow, MathDoublePow, 342259456)                                  \
-  V(Float32x4, Float32x4., Float32x4Constructor, 1314950569)                   \
-  V(Float32x4, Float32x4.zero, Float32x4Zero, 1432281809)                      \
-  V(Float32x4, Float32x4.splat, Float32x4Splat, 1148280442)                    \
+  V(::, _doublePow, MathDoublePow, 823139975)                                  \
+  V(Float32x4, Float32x4., Float32x4Constructor, 1755873079)                   \
+  V(Float32x4, Float32x4.zero, Float32x4Zero, 1494069379)                      \
+  V(Float32x4, Float32x4.splat, Float32x4Splat, 916211464)                     \
   V(Float32x4, Float32x4.fromInt32x4Bits, Float32x4FromInt32x4Bits,            \
-      872145194)                                                               \
-  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1511660322)    \
-  V(_Float32x4, shuffle, Float32x4Shuffle, 1178727105)                         \
-  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 927956119)                    \
-  V(_Float32x4, get:x, Float32x4ShuffleX, 1351747629)                          \
-  V(_Float32x4, get:y, Float32x4ShuffleY, 217416201)                           \
-  V(_Float32x4, get:z, Float32x4ShuffleZ, 2144953512)                          \
-  V(_Float32x4, get:w, Float32x4ShuffleW, 1447728910)                          \
-  V(_Float32x4, get:signMask, Float32x4GetSignMask, 1198879138)                \
-  V(_Float32x4, _cmpequal, Float32x4Equal, 1944929844)                         \
-  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 499965951)                       \
-  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 1003006845)              \
-  V(_Float32x4, _cmplt, Float32x4LessThan, 747070271)                          \
-  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 2008368570)                 \
-  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1038562565)                     \
-  V(_Float32x4, _min, Float32x4Min, 1166664658)                                \
-  V(_Float32x4, _max, Float32x4Max, 343968921)                                 \
-  V(_Float32x4, _scale, Float32x4Scale, 803505531)                             \
-  V(_Float32x4, _sqrt, Float32x4Sqrt, 2092250151)                              \
-  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 965252704)           \
-  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 1262202915)                  \
-  V(_Float32x4, _negate, Float32x4Negate, 1203192635)                          \
-  V(_Float32x4, _abs, Float32x4Absolute, 386324188)                            \
-  V(_Float32x4, _clamp, Float32x4Clamp, 1454612345)                            \
-  V(_Float32x4, withX, Float32x4WithX, 795284225)                              \
-  V(_Float32x4, withY, Float32x4WithY, 1806065938)                             \
-  V(_Float32x4, withZ, Float32x4WithZ, 320659034)                              \
-  V(_Float32x4, withW, Float32x4WithW, 1108437255)                             \
-  V(Float64x2, Float64x2., Float64x2Constructor, 1283521526)                   \
-  V(Float64x2, Float64x2.zero, Float64x2Zero, 1971574037)                      \
-  V(Float64x2, Float64x2.splat, Float64x2Splat, 823230813)                     \
-  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1383666060)    \
-  V(_Float64x2, get:x, Float64x2GetX, 176817227)                               \
-  V(_Float64x2, get:y, Float64x2GetY, 1858031019)                              \
-  V(_Float64x2, _negate, Float64x2Negate, 1345265430)                          \
-  V(_Float64x2, abs, Float64x2Abs, 778551930)                                  \
-  V(_Float64x2, sqrt, Float64x2Sqrt, 591345168)                                \
-  V(_Float64x2, get:signMask, Float64x2GetSignMask, 601579087)                 \
-  V(_Float64x2, scale, Float64x2Scale, 1781090062)                             \
-  V(_Float64x2, withX, Float64x2WithX, 1624377250)                             \
-  V(_Float64x2, withY, Float64x2WithY, 2078610265)                             \
-  V(_Float64x2, min, Float64x2Min, 876488999)                                  \
-  V(_Float64x2, max, Float64x2Max, 389912972)                                  \
-  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 295910141)                  \
+      640076216)                                                               \
+  V(Float32x4, Float32x4.fromFloat64x2, Float32x4FromFloat64x2, 1279591344)    \
+  V(_Float32x4, shuffle, Float32x4Shuffle, 1636488139)                         \
+  V(_Float32x4, shuffleMix, Float32x4ShuffleMix, 597555927)                    \
+  V(_Float32x4, get:x, Float32x4ShuffleX, 384850558)                           \
+  V(_Float32x4, get:y, Float32x4ShuffleY, 1398002778)                          \
+  V(_Float32x4, get:z, Float32x4ShuffleZ, 1178056441)                          \
+  V(_Float32x4, get:w, Float32x4ShuffleW, 480831839)                           \
+  V(_Float32x4, get:signMask, Float32x4GetSignMask, 630761511)                 \
+  V(_Float32x4, _cmpequal, Float32x4Equal, 571062952)                          \
+  V(_Float32x4, _cmpgt, Float32x4GreaterThan, 1613543295)                      \
+  V(_Float32x4, _cmpgte, Float32x4GreaterThanOrEqual, 589402909)               \
+  V(_Float32x4, _cmplt, Float32x4LessThan, 1502332656)                         \
+  V(_Float32x4, _cmplte, Float32x4LessThanOrEqual, 1069848031)                 \
+  V(_Float32x4, _cmpnequal, Float32x4NotEqual, 1334574472)                     \
+  V(_Float32x4, _min, Float32x4Min, 2036349551)                                \
+  V(_Float32x4, _max, Float32x4Max, 571688115)                                 \
+  V(_Float32x4, _scale, Float32x4Scale, 1311297761)                            \
+  V(_Float32x4, _sqrt, Float32x4Sqrt, 1709659395)                              \
+  V(_Float32x4, _reciprocalSqrt, Float32x4ReciprocalSqrt, 2043980962)          \
+  V(_Float32x4, _reciprocal, Float32x4Reciprocal, 739405237)                   \
+  V(_Float32x4, _negate, Float32x4Negate, 445839777)                           \
+  V(_Float32x4, _abs, Float32x4Absolute, 1152777608)                           \
+  V(_Float32x4, _clamp, Float32x4Clamp, 353415442)                             \
+  V(_Float32x4, withX, Float32x4WithX, 1446546696)                             \
+  V(_Float32x4, withY, Float32x4WithY, 309844761)                              \
+  V(_Float32x4, withZ, Float32x4WithZ, 971921505)                              \
+  V(_Float32x4, withW, Float32x4WithW, 1759699726)                             \
+  V(Float64x2, Float64x2., Float64x2Constructor, 1399581872)                   \
+  V(Float64x2, Float64x2.zero, Float64x2Zero, 1836770587)                      \
+  V(Float64x2, Float64x2.splat, Float64x2Splat, 939291159)                     \
+  V(Float64x2, Float64x2.fromFloat32x4, Float64x2FromFloat32x4, 1499726406)    \
+  V(_Float64x2, get:x, Float64x2GetX, 261044094)                               \
+  V(_Float64x2, get:y, Float64x2GetY, 1942257886)                              \
+  V(_Float64x2, _negate, Float64x2Negate, 2133212774)                          \
+  V(_Float64x2, abs, Float64x2Abs, 1224776282)                                 \
+  V(_Float64x2, sqrt, Float64x2Sqrt, 1037569520)                               \
+  V(_Float64x2, get:signMask, Float64x2GetSignMask, 252936800)                 \
+  V(_Float64x2, scale, Float64x2Scale, 1199438744)                             \
+  V(_Float64x2, withX, Float64x2WithX, 1042725932)                             \
+  V(_Float64x2, withY, Float64x2WithY, 1496958947)                             \
+  V(_Float64x2, min, Float64x2Min, 485240583)                                  \
+  V(_Float64x2, max, Float64x2Max, 2146148204)                                 \
+  V(Int32x4, Int32x4.bool, Int32x4BoolConstructor, 87082660)                   \
   V(Int32x4, Int32x4.fromFloat32x4Bits, Int32x4FromFloat32x4Bits,              \
-      893850947)                                                               \
-  V(_Int32x4, get:flagX, Int32x4GetFlagX, 729265594)                           \
-  V(_Int32x4, get:flagY, Int32x4GetFlagY, 430870640)                           \
-  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 1981106287)                          \
-  V(_Int32x4, get:flagW, Int32x4GetFlagW, 629385890)                           \
-  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1598817537)                    \
-  V(_Int32x4, shuffle, Int32x4Shuffle, 599391160)                              \
-  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 1491641197)                       \
-  V(_Int32x4, select, Int32x4Select, 194269493)                                \
-  V(_Int32x4, withFlagX, Int32x4WithFlagX, 63248661)                           \
-  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1498755850)                         \
-  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 457856832)                          \
-  V(_Int32x4, withFlagW, Int32x4WithFlagW, 690638779)                          \
-  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
-  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 2067666479)         \
-  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 745187964)         \
+      372517418)                                                               \
+  V(_Int32x4, get:flagX, Int32x4GetFlagX, 1077555238)                          \
+  V(_Int32x4, get:flagY, Int32x4GetFlagY, 779160284)                           \
+  V(_Int32x4, get:flagZ, Int32x4GetFlagZ, 181912283)                           \
+  V(_Int32x4, get:flagW, Int32x4GetFlagW, 977675534)                           \
+  V(_Int32x4, get:signMask, Int32x4GetSignMask, 1929271914)                    \
+  V(_Int32x4, shuffle, Int32x4Shuffle, 1870018702)                             \
+  V(_Int32x4, shuffleMix, Int32x4ShuffleMix, 967644870)                        \
+  V(_Int32x4, select, Int32x4Select, 1696037681)                               \
+  V(_Int32x4, withFlagX, Int32x4WithFlagX, 467852789)                          \
+  V(_Int32x4, withFlagY, Int32x4WithFlagY, 1903359978)                         \
+  V(_Int32x4, withFlagZ, Int32x4WithFlagZ, 862460960)                          \
+  V(_Int32x4, withFlagW, Int32x4WithFlagW, 1095242907)                         \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_ExternalUint8Array, [], ExternalUint8ArrayGetIndexed, 1678777951)         \
+  V(_ExternalUint8Array, []=, ExternalUint8ArraySetIndexed, 918478513)         \
   V(_ExternalUint8ClampedArray, [], ExternalUint8ClampedArrayGetIndexed,       \
-    2068189358)                                                                \
+    1346536303)                                                                \
   V(_ExternalUint8ClampedArray, []=, ExternalUint8ClampedArraySetIndexed,      \
-    1251233632)                                                                \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
-  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1658205989)                       \
-  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1065461643)                      \
-  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 2137410088)                 \
-  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 1583018506)                \
-  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 1911863146)                     \
-  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 973572811)                     \
-  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 325873961)                  \
-  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 2105580462)                \
+    1794849214)                                                                \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint32Array, [], Uint32ArrayGetIndexed, 1640672852)                       \
+  V(_Uint32Array, []=, Uint32ArraySetIndexed, 1472976717)                      \
+  V(_Float32x4Array, [], Float32x4ArrayGetIndexed, 1466627059)                 \
+  V(_Float32x4Array, []=, Float32x4ArraySetIndexed, 2141660076)                \
+  V(_Int32x4Array, [], Int32x4ArrayGetIndexed, 818792056)                      \
+  V(_Int32x4Array, []=, Int32x4ArraySetIndexed, 1021474038)                    \
+  V(_Float64x2Array, [], Float64x2ArrayGetIndexed, 288114492)                  \
+  V(_Float64x2Array, []=, Float64x2ArraySetIndexed, 941746736)                 \
 
 
 // A list of core function that should always be inlined.
 #define INLINE_WHITE_LIST(V)                                                   \
-  V(_List, get:length, ObjectArrayLength, 215183186)                           \
-  V(_ImmutableList, get:length, ImmutableArrayLength, 578762861)               \
-  V(_TypedList, get:length, TypedDataLength, 26646119)                         \
-  V(_GrowableList, get:length, GrowableArrayLength, 1654255033)                \
-  V(_StringBase, get:length, StringBaseLength, 1483549854)                     \
-  V(ListIterator, moveNext, ListIteratorMoveNext, 2062984847)                  \
-  V(_GrowableList, get:iterator, GrowableArrayIterator, 1155241039)            \
-  V(_GrowableList, forEach, GrowableArrayForEach, 195359970)                   \
-  V(_List, [], ObjectArrayGetIndexed, 675155875)                               \
-  V(_List, []=, ObjectArraySetIndexed, 1228569706)                             \
-  V(_List, get:isEmpty, ObjectArrayIsEmpty, 1082804442)                        \
-  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1768793932)                  \
-  V(_GrowableList, [], GrowableArrayGetIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableArraySetIndexed, 807019110)                    \
-  V(_Float32Array, [], Float32ArrayGetIndexed, 1461569776)                     \
-  V(_Float32Array, []=, Float32ArraySetIndexed, 1318757370)                    \
-  V(_Float64Array, [], Float64ArrayGetIndexed, 1107401598)                     \
-  V(_Float64Array, []=, Float64ArraySetIndexed, 377873481)                     \
-  V(_Int8Array, [], Int8ArrayGetIndexed, 436208801)                            \
-  V(_Int8Array, []=, Int8ArraySetIndexed, 1257450859)                          \
-  V(_Uint8Array, [], Uint8ArrayGetIndexed, 738731818)                          \
-  V(_Uint8Array, []=, Uint8ArraySetIndexed, 1414236073)                        \
-  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 1529176866)           \
-  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 1902969517)          \
-  V(_Uint16Array, [], Uint16ArrayGetIndexed, 1050460407)                       \
-  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1895506641)                      \
-  V(_Int16Array, [], Int16ArrayGetIndexed, 1428082706)                         \
-  V(_Int16Array, []=, Int16ArraySetIndexed, 266849900)                         \
-  V(_Int32Array, [], Int32ArrayGetIndexed, 1023604903)                         \
-  V(_Int32Array, []=, Int32ArraySetIndexed, 599753059)                         \
-  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 250795553)                  \
-  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 533993880)                 \
-  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 530738523)                    \
-  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 1513635170)                  \
-  V(::, asin, MathASin, 1528431637)                                            \
-  V(::, acos, MathACos, 1558635398)                                            \
-  V(::, atan, MathATan, 209476605)                                             \
-  V(::, atan2, MathATan2, 2059468649)                                          \
-  V(::, cos, MathCos, 1282146521)                                              \
-  V(::, exp, MathExp, 1951779581)                                              \
-  V(::, log, MathLog, 255699484)                                               \
+  V(Object, ==, ObjectEquals, 1068471689)                                      \
+  V(_List, get:length, ObjectArrayLength, 1181352729)                          \
+  V(_ImmutableList, get:length, ImmutableArrayLength, 274917727)               \
+  V(_TypedList, get:length, TypedDataLength, 522565357)                        \
+  V(_GrowableList, get:length, GrowableArrayLength, 778505107)                 \
+  V(_StringBase, get:length, StringBaseLength, 784399628)                      \
+  V(ListIterator, moveNext, ListIteratorMoveNext, 210829138)                   \
+  V(_GrowableList, get:iterator, GrowableArrayIterator, 1812933946)            \
+  V(_GrowableList, forEach, GrowableArrayForEach, 2085943947)                  \
+  V(_List, [], ObjectArrayGetIndexed, 795612476)                               \
+  V(_List, []=, ObjectArraySetIndexed, 1288827575)                             \
+  V(_List, get:isEmpty, ObjectArrayIsEmpty, 2130247737)                        \
+  V(_ImmutableList, [], ImmutableArrayGetIndexed, 1990177341)                  \
+  V(_GrowableList, [], GrowableArrayGetIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableArraySetIndexed, 1218649853)                   \
+  V(_Float32Array, [], Float32ArrayGetIndexed, 856653338)                      \
+  V(_Float32Array, []=, Float32ArraySetIndexed, 2086166464)                    \
+  V(_Float64Array, [], Float64ArrayGetIndexed, 1779054297)                     \
+  V(_Float64Array, []=, Float64ArraySetIndexed, 243929230)                     \
+  V(_Int8Array, [], Int8ArrayGetIndexed, 321230586)                            \
+  V(_Int8Array, []=, Int8ArraySetIndexed, 2050598685)                          \
+  V(_Uint8Array, [], Uint8ArrayGetIndexed, 16125140)                           \
+  V(_Uint8Array, []=, Uint8ArraySetIndexed, 2018064553)                        \
+  V(_Uint8ClampedArray, [], Uint8ClampedArrayGetIndexed, 430672063)            \
+  V(_Uint8ClampedArray, []=, Uint8ClampedArraySetIndexed, 821294340)           \
+  V(_Uint16Array, [], Uint16ArrayGetIndexed, 470411953)                        \
+  V(_Uint16Array, []=, Uint16ArraySetIndexed, 1648929040)                      \
+  V(_Int16Array, [], Int16ArrayGetIndexed, 74127855)                           \
+  V(_Int16Array, []=, Int16ArraySetIndexed, 1610252345)                        \
+  V(_Int32Array, [], Int32ArrayGetIndexed, 203101370)                          \
+  V(_Int32Array, []=, Int32ArraySetIndexed, 338968571)                         \
+  V(_Uint8ArrayView, [], Uint8ArrayViewGetIndexed, 1543480955)                 \
+  V(_Uint8ArrayView, []=, Uint8ArrayViewSetIndexed, 936729641)                 \
+  V(_Int8ArrayView, [], Int8ArrayViewGetIndexed, 1898018934)                   \
+  V(_Int8ArrayView, []=, Int8ArrayViewSetIndexed, 111684506)                   \
+  V(::, asin, MathASin, 1651042633)                                            \
+  V(::, acos, MathACos, 1139647090)                                            \
+  V(::, atan, MathATan, 1668754384)                                            \
+  V(::, atan2, MathATan2, 1845649456)                                          \
+  V(::, cos, MathCos, 1951197905)                                              \
+  V(::, exp, MathExp, 1809210829)                                              \
+  V(::, log, MathLog, 1620336448)                                              \
   V(::, max, MathMax, 612058870)                                               \
   V(::, min, MathMin, 1022567780)                                              \
-  V(::, pow, MathPow, 1880071137)                                              \
-  V(::, sin, MathSin, 730107143)                                               \
-  V(::, sqrt, MathSqrt, 465520247)                                             \
-  V(::, tan, MathTan, 2077846426)                                              \
+  V(::, pow, MathPow, 930962530)                                               \
+  V(::, sin, MathSin, 1741396147)                                              \
+  V(::, sqrt, MathSqrt, 101545548)                                             \
+  V(::, tan, MathTan, 982072809)                                               \
 
 
 // A list of core functions that internally dispatch based on received id.
 #define POLYMORPHIC_TARGET_LIST(V)                                             \
-  V(_StringBase, [], StringBaseCharAt, 585372763)                              \
-  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 1958436584)                 \
-  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 272598802)                     \
-  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 831354841)                   \
-  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 1832126257)                  \
-  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1762714698)                \
-  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 48785449)                    \
-  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 1392579206)                \
-  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 185163470)               \
-  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1356392173)              \
-  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1239681356)          \
-  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 163795162)               \
-  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 1793798234)                    \
-  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 67253374)                     \
-  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 10467750)                    \
-  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 1596986894)                 \
-  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 868037529)                   \
-  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1776345006)                \
-  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1807927533)              \
-  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 399659907)               \
-  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 1612092224)          \
-  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 74799321)                \
+  V(_StringBase, [], StringBaseCharAt, 1512210677)                             \
+  V(_StringBase, codeUnitAt, StringBaseCodeUnitAt, 397735324)                  \
+  V(_TypedList, _getInt8, ByteArrayBaseGetInt8, 1541411498)                    \
+  V(_TypedList, _getUint8, ByteArrayBaseGetUint8, 1032404349)                  \
+  V(_TypedList, _getInt16, ByteArrayBaseGetInt16, 381073990)                   \
+  V(_TypedList, _getUint16, ByteArrayBaseGetUint16, 1142676276)                \
+  V(_TypedList, _getInt32, ByteArrayBaseGetInt32, 330269934)                   \
+  V(_TypedList, _getUint32, ByteArrayBaseGetUint32, 59490554)                  \
+  V(_TypedList, _getFloat32, ByteArrayBaseGetFloat32, 393003933)               \
+  V(_TypedList, _getFloat64, ByteArrayBaseGetFloat64, 1792407200)              \
+  V(_TypedList, _getFloat32x4, ByteArrayBaseGetFloat32x4, 1338379857)          \
+  V(_TypedList, _getInt32x4, ByteArrayBaseGetInt32x4, 1469917805)              \
+  V(_TypedList, _setInt8, ByteArrayBaseSetInt8, 433348464)                     \
+  V(_TypedList, _setUint8, ByteArrayBaseSetInt8, 149406583)                    \
+  V(_TypedList, _setInt16, ByteArrayBaseSetInt16, 805477162)                   \
+  V(_TypedList, _setUint16, ByteArrayBaseSetInt16, 888580944)                  \
+  V(_TypedList, _setInt32, ByteArrayBaseSetInt32, 1708248181)                  \
+  V(_TypedList, _setUint32, ByteArrayBaseSetUint32, 1863152792)                \
+  V(_TypedList, _setFloat32, ByteArrayBaseSetFloat32, 1148703855)              \
+  V(_TypedList, _setFloat64, ByteArrayBaseSetFloat64, 972883980)               \
+  V(_TypedList, _setFloat32x4, ByteArrayBaseSetFloat32x4, 950522310)           \
+  V(_TypedList, _setInt32x4, ByteArrayBaseSetInt32x4, 1301138078)              \
 
 // Class that recognizes the name and owner of a function and returns the
 // corresponding enum. See RECOGNIZED_LIST above for list of recognizable
@@ -444,6 +444,8 @@
 // another compile type.
 class ConstrainedCompileType : public ZoneCompileType {
  public:
+  virtual ~ConstrainedCompileType() { }
+
   // Recompute compile type.
   virtual void Update() = 0;
 
@@ -821,6 +823,8 @@
         locs_(NULL),
         place_id_(kNoPlaceId) { }
 
+  virtual ~Instruction() { }
+
   virtual Tag tag() const = 0;
 
   intptr_t deopt_id() const {
@@ -828,7 +832,8 @@
     return deopt_id_;
   }
 
-  ICData* GetICData(const Array& ic_data_array) const;
+  const ICData* GetICData(
+      const ZoneGrowableArray<const ICData*>& ic_data_array) const;
 
   bool IsBlockEntry() { return (AsBlockEntry() != NULL); }
   virtual BlockEntryInstr* AsBlockEntry() { return NULL; }
@@ -1800,6 +1805,16 @@
     return ZoneCompileType::Wrap(ComputeType());
   }
 
+  // Does this define a mint?
+  bool IsMintDefinition() {
+    return (Type()->ToCid() == kMintCid) ||
+            IsBinaryMintOp() ||
+            IsUnaryMintOp() ||
+            IsShiftMintOp() ||
+            IsBoxInteger() ||
+            IsUnboxInteger();
+  }
+
   // Compute compile type for this definition. It is safe to use this
   // approximation even before type propagator was run (e.g. during graph
   // building).
@@ -1833,6 +1848,15 @@
 
   Value* input_use_list() const { return input_use_list_; }
   void set_input_use_list(Value* head) { input_use_list_ = head; }
+  intptr_t InputUseListLength() const {
+    intptr_t length = 0;
+    Value* use = input_use_list_;
+    while (use != NULL) {
+      length++;
+      use = use->next_use();
+    }
+    return length;
+  }
 
   Value* env_use_list() const { return env_use_list_; }
   void set_env_use_list(Value* head) { env_use_list_ = head; }
@@ -2484,7 +2508,18 @@
 
 class RangeBoundary : public ValueObject {
  public:
-  enum Kind { kUnknown, kSymbol, kConstant };
+  enum Kind {
+    kUnknown,
+    kNegativeInfinity,
+    kPositiveInfinity,
+    kSymbol,
+    kConstant,
+  };
+
+  enum RangeSize {
+    kRangeBoundarySmi,
+    kRangeBoundaryInt64,
+  };
 
   RangeBoundary() : kind_(kUnknown), value_(0), offset_(0) { }
 
@@ -2494,6 +2529,9 @@
         value_(other.value_),
         offset_(other.offset_) { }
 
+  explicit RangeBoundary(int64_t val)
+      : kind_(kConstant), value_(val), offset_(0) { }
+
   RangeBoundary& operator=(const RangeBoundary& other) {
     kind_ = other.kind_;
     value_ = other.value_;
@@ -2501,70 +2539,142 @@
     return *this;
   }
 
-  static RangeBoundary FromConstant(intptr_t val) {
-    return RangeBoundary(kConstant, val, 0);
+  static const int64_t kMin = kMinInt64;
+  static const int64_t kMax = kMaxInt64;
+
+  // Construct a RangeBoundary for a constant value.
+  static RangeBoundary FromConstant(int64_t val) {
+    return RangeBoundary(val);
   }
 
-  static RangeBoundary FromDefinition(Definition* defn, intptr_t offs = 0);
+  // Construct a RangeBoundary for -inf.
+  static RangeBoundary NegativeInfinity() {
+    return RangeBoundary(kNegativeInfinity, 0, 0);
+  }
 
+  // Construct a RangeBoundary for +inf.
+  static RangeBoundary PositiveInfinity() {
+    return RangeBoundary(kPositiveInfinity, 0, 0);
+  }
+
+  // Construct a RangeBoundary from a definition and offset.
+  static RangeBoundary FromDefinition(Definition* defn, int64_t offs = 0);
+
+  // Construct a RangeBoundary for the constant MinSmi value.
   static RangeBoundary MinSmi() {
     return FromConstant(Smi::kMinValue);
   }
 
+  // Construct a RangeBoundary for the constant MaxSmi value.
   static RangeBoundary MaxSmi() {
     return FromConstant(Smi::kMaxValue);
   }
 
-  static const intptr_t kMinusInfinity = Smi::kMinValue - 1;
-  static const intptr_t kPlusInfinity = Smi::kMaxValue + 1;
-
-  static RangeBoundary OverflowedMinSmi() {
-    return FromConstant(Smi::kMinValue - 1);
+    // Construct a RangeBoundary for the constant kMin value.
+  static RangeBoundary MinConstant() {
+    return FromConstant(kMin);
   }
 
-  static RangeBoundary OverflowedMaxSmi() {
-    return FromConstant(Smi::kMaxValue + 1);
+  // Construct a RangeBoundary for the constant kMax value.
+  static RangeBoundary MaxConstant() {
+    return FromConstant(kMax);
   }
 
-  static RangeBoundary Min(RangeBoundary a, RangeBoundary b);
+  // Calculate the minimum of a and b within the given range.
+  static RangeBoundary Min(RangeBoundary a, RangeBoundary b, RangeSize size);
+  static RangeBoundary Max(RangeBoundary a, RangeBoundary b, RangeSize size);
 
-  static RangeBoundary Max(RangeBoundary a, RangeBoundary b);
-
-  bool Overflowed() const {
-    return IsConstant() && !Smi::IsValid(value());
+  // Returns true when this is a constant that is outside of Smi range.
+  bool OverflowedSmi() const {
+    return (IsConstant() && !Smi::IsValid(ConstantValue())) || IsInfinity();
   }
 
-  RangeBoundary Clamp() const {
-    if (IsConstant()) {
-      if (value() < Smi::kMinValue) return MinSmi();
-      if (value() > Smi::kMaxValue) return MaxSmi();
+  // Returns true if this outside mint range.
+  bool OverflowedMint() const {
+    return IsInfinity();
+  }
+
+  // -/+ infinity are clamped to MinConstant/MaxConstant of the given type.
+  RangeBoundary Clamp(RangeSize size) const {
+    if (IsNegativeInfinity()) {
+      return (size == kRangeBoundaryInt64) ? MinConstant() : MinSmi();
     }
+    if (IsPositiveInfinity()) {
+      return (size == kRangeBoundaryInt64) ? MaxConstant() : MaxSmi();
+    }
+    if ((size == kRangeBoundarySmi) && IsConstant()) {
+      if (ConstantValue() <= Smi::kMinValue) {
+        return MinSmi();
+      }
+      if (ConstantValue() >= Smi::kMaxValue) {
+        return MaxSmi();
+      }
+    }
+    // If this range is a symbolic range, we do not clamp it.
+    // This could lead to some imprecision later on.
     return *this;
   }
 
-  bool Equals(const RangeBoundary& other) const {
-    return (kind_ == other.kind_) && (value_ == other.value_);
+
+  bool IsSmiMinimumOrBelow() const {
+    return IsNegativeInfinity() ||
+           (IsConstant() && (ConstantValue() <= Smi::kMinValue));
   }
 
+  bool IsSmiMaximumOrAbove() const {
+    return IsPositiveInfinity() ||
+           (IsConstant() && (ConstantValue() >= Smi::kMaxValue));
+  }
+
+  bool IsMinimumOrBelow() const {
+    return IsNegativeInfinity() || (IsConstant() && (ConstantValue() == kMin));
+  }
+
+  bool IsMaximumOrAbove() const {
+    return IsPositiveInfinity() || (IsConstant() && (ConstantValue() == kMax));
+  }
+
+  intptr_t kind() const {
+    return kind_;
+  }
+
+  // Kind tests.
   bool IsUnknown() const { return kind_ == kUnknown; }
   bool IsConstant() const { return kind_ == kConstant; }
   bool IsSymbol() const { return kind_ == kSymbol; }
-
-  intptr_t value() const {
-    ASSERT(IsConstant());
-    return value_;
+  bool IsNegativeInfinity() const { return kind_ == kNegativeInfinity; }
+  bool IsPositiveInfinity() const { return kind_ == kPositiveInfinity; }
+  bool IsInfinity() const {
+    return IsNegativeInfinity() || IsPositiveInfinity();
+  }
+  bool IsConstantOrInfinity() const {
+    return IsConstant() || IsInfinity();
   }
 
+  // Returns the value of a kConstant RangeBoundary.
+  int64_t ConstantValue() const;
+
+  // Returns the Definition associated with a kSymbol RangeBoundary.
   Definition* symbol() const {
     ASSERT(IsSymbol());
     return reinterpret_cast<Definition*>(value_);
   }
 
-  intptr_t offset() const {
+  // Offset from symbol.
+  int64_t offset() const {
     return offset_;
   }
 
+  // Computes the LowerBound of this. Three cases:
+  // IsInfinity() -> NegativeInfinity().
+  // IsConstant() -> value().
+  // IsSymbol() -> lower bound computed from definition + offset.
   RangeBoundary LowerBound() const;
+
+  // Computes the UpperBound of this. Three cases:
+  // IsInfinity() -> PositiveInfinity().
+  // IsConstant() -> value().
+  // IsSymbol() -> upper bound computed from definition + offset.
   RangeBoundary UpperBound() const;
 
   void PrintTo(BufferFormatter* f) const;
@@ -2572,35 +2682,49 @@
 
   static RangeBoundary Add(const RangeBoundary& a,
                            const RangeBoundary& b,
-                           const RangeBoundary& overflow) {
-    ASSERT(a.IsConstant() && b.IsConstant());
-
-    intptr_t result = a.value() + b.value();
-    if (!Smi::IsValid(result)) {
-      return overflow;
-    }
-    return RangeBoundary::FromConstant(result);
-  }
+                           const RangeBoundary& overflow);
 
   static RangeBoundary Sub(const RangeBoundary& a,
                            const RangeBoundary& b,
-                           const RangeBoundary& overflow) {
-    ASSERT(a.IsConstant() && b.IsConstant());
+                           const RangeBoundary& overflow);
 
-    intptr_t result = a.value() - b.value();
-    if (!Smi::IsValid(result)) {
-      return overflow;
-    }
-    return RangeBoundary::FromConstant(result);
+  static RangeBoundary Shl(const RangeBoundary& value_boundary,
+                           int64_t shift_count,
+                           const RangeBoundary& overflow);
+
+  static RangeBoundary Shr(const RangeBoundary& value_boundary,
+                           intptr_t shift_count) {
+    ASSERT(value_boundary.IsConstant());
+    ASSERT(shift_count >= 0);
+    int64_t value = static_cast<int64_t>(value_boundary.ConstantValue());
+    int64_t result = value >> shift_count;
+    return RangeBoundary(result);
   }
 
+  // Attempts to calculate a + b when:
+  // a is a symbol and b is a constant OR
+  // a is a constant and b is a symbol
+  // returns true if it succeeds, output is in result.
+  static bool SymbolicAdd(const RangeBoundary& a,
+                          const RangeBoundary& b,
+                          RangeBoundary* result);
+
+  // Attempts to calculate a - b when:
+  // a is a symbol and b is a constant
+  // returns true if it succeeds, output is in result.
+  static bool SymbolicSub(const RangeBoundary& a,
+                          const RangeBoundary& b,
+                          RangeBoundary* result);
+
+  bool Equals(const RangeBoundary& other) const;
+
  private:
-  RangeBoundary(Kind kind, intptr_t value, intptr_t offset)
+  RangeBoundary(Kind kind, int64_t value, int64_t offset)
       : kind_(kind), value_(value), offset_(offset) { }
 
   Kind kind_;
-  intptr_t value_;
-  intptr_t offset_;
+  int64_t value_;
+  int64_t offset_;
 };
 
 
@@ -2609,37 +2733,119 @@
   Range(RangeBoundary min, RangeBoundary max) : min_(min), max_(max) { }
 
   static Range* Unknown() {
-    return new Range(RangeBoundary::MinSmi(), RangeBoundary::MaxSmi());
+    return new Range(RangeBoundary::MinConstant(),
+                     RangeBoundary::MaxConstant());
+  }
+
+  static Range* UnknownSmi() {
+    return new Range(RangeBoundary::MinSmi(),
+                     RangeBoundary::MaxSmi());
   }
 
   void PrintTo(BufferFormatter* f) const;
-  static const char* ToCString(Range* range);
+  static const char* ToCString(const Range* range);
 
   const RangeBoundary& min() const { return min_; }
   const RangeBoundary& max() const { return max_; }
 
-  bool Equals(Range* other) {
-    return min_.Equals(other->min_) && max_.Equals(other->max_);
+  static RangeBoundary ConstantMinSmi(const Range* range) {
+    if (range == NULL) {
+      return RangeBoundary::MinSmi();
+    }
+    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundarySmi);
+  }
+
+  static RangeBoundary ConstantMaxSmi(const Range* range) {
+    if (range == NULL) {
+      return RangeBoundary::MaxSmi();
+    }
+    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundarySmi);
   }
 
   static RangeBoundary ConstantMin(const Range* range) {
-    if (range == NULL) return RangeBoundary::MinSmi();
-    return range->min().LowerBound().Clamp();
+    if (range == NULL) {
+      return RangeBoundary::MinConstant();
+    }
+    return range->min().LowerBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
   }
 
   static RangeBoundary ConstantMax(const Range* range) {
-    if (range == NULL) return RangeBoundary::MaxSmi();
-    return range->max().UpperBound().Clamp();
+    if (range == NULL) {
+      return RangeBoundary::MaxConstant();
+    }
+    return range->max().UpperBound().Clamp(RangeBoundary::kRangeBoundaryInt64);
   }
 
-  // Inclusive.
-  bool IsWithin(intptr_t min_int, intptr_t max_int) const;
+  // [0, +inf]
+  bool IsPositive() const;
+
+  // [-inf, val].
+  bool OnlyLessThanOrEqualTo(int64_t val) const;
+
+  // [val, +inf].
+  bool OnlyGreaterThanOrEqualTo(int64_t val) const;
 
   // Inclusive.
-  bool Overlaps(intptr_t min_int, intptr_t max_int) const;
+  bool IsWithin(int64_t min_int, int64_t max_int) const;
+
+  // Inclusive.
+  bool Overlaps(int64_t min_int, int64_t max_int) const;
 
   bool IsUnsatisfiable() const;
 
+  bool IsFinite() const {
+    return !min_.IsInfinity() && !max_.IsInfinity();
+  }
+
+  // Clamp this to be within size.
+  void Clamp(RangeBoundary::RangeSize size);
+
+  static void Add(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max,
+                  Definition* left_defn);
+
+  static void Sub(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max,
+                  Definition* left_defn);
+
+  static bool Mul(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+  static void Shr(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+  static void Shl(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+  static bool And(const Range* left_range,
+                  const Range* right_range,
+                  RangeBoundary* min,
+                  RangeBoundary* max);
+
+
+  // Both the a and b ranges are >= 0.
+  static bool OnlyPositiveOrZero(const Range& a, const Range& b);
+
+  // Both the a and b ranges are <= 0.
+  static bool OnlyNegativeOrZero(const Range& a, const Range& b);
+
+  // Return the maximum absolute value included in range.
+  static int64_t ConstantAbsMax(const Range* range);
+
+  static Range* BinaryOp(const Token::Kind op,
+                         const Range* left_range,
+                         const Range* right_range,
+                         Definition* left_defn);
+
  private:
   RangeBoundary min_;
   RangeBoundary max_;
@@ -2919,7 +3125,7 @@
                     ZoneGrowableArray<PushArgumentInstr*>* arguments,
                     const Array& argument_names,
                     intptr_t checked_argument_count,
-                    const Array& ic_data_array)
+                    const ZoneGrowableArray<const ICData*>& ic_data_array)
       : ic_data_(GetICData(ic_data_array)),
         token_pos_(token_pos),
         function_name_(function_name),
@@ -3399,7 +3605,7 @@
                   const Function& function,
                   const Array& argument_names,
                   ZoneGrowableArray<PushArgumentInstr*>* arguments,
-                  const Array& ic_data_array)
+                  const ZoneGrowableArray<const ICData*>& ic_data_array)
       : ic_data_(GetICData(ic_data_array)),
         token_pos_(token_pos),
         function_(function),
@@ -4891,12 +5097,15 @@
 
 class BoxIntegerInstr : public TemplateDefinition<1> {
  public:
-  explicit BoxIntegerInstr(Value* value) {
+  explicit BoxIntegerInstr(Value* value) : is_smi_(false) {
     SetInputAt(0, value);
   }
 
   Value* value() const { return inputs_[0]; }
 
+  bool is_smi() const { return is_smi_; }
+  void set_is_smi(bool is_smi) { is_smi_ = is_smi; }
+
   virtual bool CanDeoptimize() const { return false; }
 
   virtual intptr_t DeoptimizationTarget() const {
@@ -4910,6 +5119,9 @@
 
   DECLARE_INSTRUCTION(BoxInteger)
   virtual CompileType ComputeType() const;
+  virtual bool RecomputeType();
+
+  virtual void InferRange();
 
   virtual bool AllowsCSE() const { return true; }
   virtual EffectSet Effects() const { return EffectSet::None(); }
@@ -4919,6 +5131,8 @@
   virtual bool MayThrow() const { return false; }
 
  private:
+  bool is_smi_;
+
   DISALLOW_COPY_AND_ASSIGN(BoxIntegerInstr);
 };
 
@@ -5079,6 +5293,8 @@
   }
 
 
+  virtual void InferRange();
+
   DECLARE_INSTRUCTION(UnboxInteger)
   virtual CompileType ComputeType() const;
 
@@ -6868,6 +7084,8 @@
     return deopt_id_;
   }
 
+  virtual void InferRange();
+
   virtual Definition* Canonicalize(FlowGraph* flow_graph);
 
   DECLARE_INSTRUCTION(BinaryMintOp)
@@ -6930,6 +7148,8 @@
     return deopt_id_;
   }
 
+  virtual void InferRange();
+
   DECLARE_INSTRUCTION(ShiftMintOp)
 
   virtual bool AllowsCSE() const { return true; }
@@ -7028,7 +7248,7 @@
   void set_overflow(bool overflow) { overflow_ = overflow; }
 
   void set_is_truncating(bool value) { is_truncating_ = value; }
-  bool is_truncating() const { return is_truncating_; }
+  bool IsTruncating() const { return is_truncating_ || !overflow_; }
 
   virtual void PrintOperandsTo(BufferFormatter* f) const;
 
diff --git a/runtime/vm/intermediate_language_arm.cc b/runtime/vm/intermediate_language_arm.cc
index 5bdae56..40b6aa2 100644
--- a/runtime/vm/intermediate_language_arm.cc
+++ b/runtime/vm/intermediate_language_arm.cc
@@ -9,6 +9,7 @@
 
 #include "vm/cpu.h"
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -437,18 +438,16 @@
                          Register value_cid_reg,
                          Register value_reg,
                          Label* value_is_smi = NULL) {
-  Label done;
   if (value_is_smi == NULL) {
     __ mov(value_cid_reg, Operand(kSmiCid));
   }
   __ tst(value_reg, Operand(kSmiTagMask));
   if (value_is_smi == NULL) {
-    __ b(&done, EQ);
+    __ LoadClassId(value_cid_reg, value_reg, NE);
   } else {
     __ b(value_is_smi, EQ);
+    __ LoadClassId(value_cid_reg, value_reg);
   }
-  __ LoadClassId(value_cid_reg, value_reg);
-  __ Bind(&done);
 }
 
 
@@ -926,8 +925,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -946,7 +948,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry);
-  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()));
+  __ LoadImmediate(R1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -1020,7 +1022,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -1055,15 +1058,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label load, done;
-  __ tst(object, Operand(kSmiTagMask));
-  __ b(&load, NE);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid));
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1897,8 +1892,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1961,9 +1956,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
     } else {
       __ ldr(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -2048,9 +2041,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_double);
       __ CopyDoubleField(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2074,9 +2065,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_float32x4);
       __ CopyFloat32x4Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2100,9 +2089,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ MoveRegister(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
       __ Bind(&copy_float64x2);
       __ CopyFloat64x2Field(temp, value_reg, TMP, temp2, fpu_temp);
       __ b(&skip_store);
@@ -2113,20 +2100,21 @@
 
   if (ShouldEmitStoreBarrier()) {
     const Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
-                       CanValueBeSmi());
+    __ StoreIntoObjectOffset(instance_reg,
+                             offset_in_bytes_,
+                             value_reg,
+                             CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
+      __ StoreIntoObjectNoBarrierOffset(
           instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
+          offset_in_bytes_,
           locs()->in(1).constant());
     } else {
       const Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+      __ StoreIntoObjectNoBarrierOffset(instance_reg,
+                                        offset_in_bytes_,
+                                        value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2869,7 +2857,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2940,8 +2928,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ cmp(right, Operand(0));
@@ -2989,7 +2976,7 @@
     }
   } else if (op_kind() == Token::kMOD) {
     num_temps = 2;
-  } else if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  } else if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
              (op_kind() == Token::kSHR)) {
     num_temps = 1;
   } else if ((op_kind() == Token::kMUL) &&
@@ -3022,7 +3009,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -3044,7 +3031,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -3328,7 +3314,7 @@
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ CompareImmediate(IP, kCountLimit);
         __ LoadImmediate(IP, kCountLimit, GT);
       }
@@ -5119,7 +5105,7 @@
   ASSERT(result != value_obj);
   __ LoadDFromOffset(DTMP, value_obj, Double::value_offset() - kHeapObjectTag);
 
-  Label do_call, done;
+  Label done, do_call;
   // First check for NaN. Checking for minint after the conversion doesn't work
   // on ARM because vcvtid gives 0 for NaN.
   __ vcmpd(DTMP, DTMP);
@@ -5132,9 +5118,9 @@
 
   // Check for overflow and that it fits into Smi.
   __ CompareImmediate(result, 0xC0000000);
-  __ b(&do_call, MI);
-  __ SmiTag(result);
-  __ b(&done);
+  __ SmiTag(result, PL);
+  __ b(&done, PL);
+
   __ Bind(&do_call);
   __ Push(value_obj);
   ASSERT(instance_call()->HasICData());
@@ -5148,7 +5134,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5580,7 +5567,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5839,14 +5827,18 @@
 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = is_smi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs,
                           kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+                          is_smi()
+                              ? LocationSummary::kNoCall
+                              : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_temp(0, Location::RequiresRegister());
+  if (!is_smi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5886,6 +5878,15 @@
 
 
 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (is_smi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ mov(out_reg, Operand(value_lo));
+    __ SmiTag(out_reg);
+    return;
+  }
+
   BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   PairLocation* value_pair = locs()->in(0).AsPairLocation();
@@ -6189,7 +6190,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // Add an edge counter.
diff --git a/runtime/vm/intermediate_language_arm64.cc b/runtime/vm/intermediate_language_arm64.cc
index b83da77..c5fb4be 100644
--- a/runtime/vm/intermediate_language_arm64.cc
+++ b/runtime/vm/intermediate_language_arm64.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -92,7 +93,7 @@
   __ sub(R2, SP, Operand(FP));
   __ CompareImmediate(R2, fp_sp_dist, PP);
   __ b(&stack_ok, EQ);
-  __ hlt(0);
+  __ brk(0);
   __ Bind(&stack_ok);
 #endif
   __ LeaveDartFrame();
@@ -348,7 +349,7 @@
                                 1,
                                 locs);
   // We should never return here.
-  __ hlt(0);
+  __ brk(0);
   __ Bind(&done);
 }
 
@@ -769,8 +770,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -789,7 +793,7 @@
 #endif
   }
   __ LoadImmediate(R5, entry, PP);
-  __ LoadImmediate(R1, NativeArguments::ComputeArgcTag(function()), PP);
+  __ LoadImmediate(R1, argc_tag, PP);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -866,7 +870,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == R0);
 }
 
@@ -901,15 +906,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   const Register object = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
-  Label load, done;
-  __ tsti(object, kSmiTagMask);
-  __ b(&load, NE);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid), PP);
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object, PP);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1419,24 +1416,25 @@
   if (emit_full_guard) {
     __ LoadObject(field_reg, Field::ZoneHandle(field().raw()), PP);
 
-    FieldAddress field_cid_operand(field_reg, Field::guarded_cid_offset());
+    FieldAddress field_cid_operand(
+        field_reg, Field::guarded_cid_offset(), kWord);
     FieldAddress field_nullability_operand(
-        field_reg, Field::is_nullable_offset());
+        field_reg, Field::is_nullable_offset(), kWord);
 
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
       Label skip_length_check;
-      __ ldr(TMP, field_cid_operand);
+      __ ldr(TMP, field_cid_operand, kWord);
       __ CompareRegisters(value_cid_reg, TMP);
       __ b(&ok, EQ);
-      __ ldr(TMP, field_nullability_operand);
+      __ ldr(TMP, field_nullability_operand, kWord);
       __ CompareRegisters(value_cid_reg, TMP);
     } else if (value_cid == kNullCid) {
-      __ ldr(value_cid_reg, field_nullability_operand);
+      __ ldr(value_cid_reg, field_nullability_operand, kWord);
       __ CompareImmediate(value_cid_reg, value_cid, PP);
     } else {
       Label skip_length_check;
-      __ ldr(value_cid_reg, field_cid_operand);
+      __ ldr(value_cid_reg, field_cid_operand, kWord);
       __ CompareImmediate(value_cid_reg, value_cid, PP);
     }
     __ b(&ok, EQ);
@@ -1450,17 +1448,17 @@
     if (!field().needs_length_check()) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ ldr(TMP, field_cid_operand);
+      __ ldr(TMP, field_cid_operand, kWord);
       __ CompareImmediate(TMP, kIllegalCid, PP);
       __ b(fail, NE);
 
       if (value_cid == kDynamicCid) {
-        __ str(value_cid_reg, field_cid_operand);
-        __ str(value_cid_reg, field_nullability_operand);
+        __ str(value_cid_reg, field_cid_operand, kWord);
+        __ str(value_cid_reg, field_nullability_operand, kWord);
       } else {
         __ LoadImmediate(TMP, value_cid, PP);
-        __ str(TMP, field_cid_operand);
-        __ str(TMP, field_nullability_operand);
+        __ str(TMP, field_cid_operand, kWord);
+        __ str(TMP, field_nullability_operand, kWord);
       }
 
       if (deopt == NULL) {
@@ -1473,7 +1471,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ LoadFieldFromOffset(TMP, field_reg, Field::guarded_cid_offset(), PP);
+      __ LoadFieldFromOffset(
+          TMP, field_reg, Field::guarded_cid_offset(), PP, kWord);
       __ CompareImmediate(TMP, kDynamicCid, PP);
       __ b(&ok, EQ);
 
@@ -1642,10 +1641,10 @@
           ((IsPotentialUnboxedStore()) ? 2 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-      !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
-              ? LocationSummary::kCallOnSlowPath
-              : LocationSummary::kNoCall);
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
+          ? LocationSummary::kCallOnSlowPath
+          : LocationSummary::kNoCall);
 
   summary->set_in(0, Location::RequiresRegister());
   if (IsUnboxedStore() && opt) {
@@ -1740,7 +1739,7 @@
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::is_nullable_offset(), PP, kWord);
     __ CompareImmediate(temp2, kNullCid, PP);
     __ b(&store_pointer, EQ);
 
@@ -1750,15 +1749,15 @@
     __ tsti(temp2, 1 << Field::kUnboxingCandidateBit);
     __ b(&store_pointer, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kDoubleCid, PP);
     __ b(&store_double, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kFloat32x4Cid, PP);
     __ b(&store_float32x4, EQ);
 
-    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP);
+    __ LoadFieldFromOffset(temp2, temp, Field::guarded_cid_offset(), PP, kWord);
     __ CompareImmediate(temp2, kFloat64x2Cid, PP);
     __ b(&store_float64x2, EQ);
 
@@ -2127,23 +2126,24 @@
 
     __ LoadObject(result_reg, Field::ZoneHandle(field()->raw()), PP);
 
-    FieldAddress field_cid_operand(result_reg, Field::guarded_cid_offset());
-    FieldAddress field_nullability_operand(result_reg,
-                                           Field::is_nullable_offset());
+    FieldAddress field_cid_operand(
+        result_reg, Field::guarded_cid_offset(), kWord);
+    FieldAddress field_nullability_operand(
+        result_reg, Field::is_nullable_offset(), kWord);
 
-    __ ldr(temp, field_nullability_operand);
+    __ ldr(temp, field_nullability_operand, kWord);
     __ CompareImmediate(temp, kNullCid, PP);
     __ b(&load_pointer, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kDoubleCid, PP);
     __ b(&load_double, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kFloat32x4Cid, PP);
     __ b(&load_float32x4, EQ);
 
-    __ ldr(temp, field_cid_operand);
+    __ ldr(temp, field_cid_operand, kWord);
     __ CompareImmediate(temp, kFloat64x2Cid, PP);
     __ b(&load_float64x2, EQ);
 
@@ -2478,7 +2478,8 @@
     __ LoadObject(temp, compiler->parsed_function().function(), PP);
     intptr_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ LoadFieldFromOffset(temp, temp, Function::usage_counter_offset(), PP);
+    __ LoadFieldFromOffset(
+        temp, temp, Function::usage_counter_offset(), PP, kWord);
     __ CompareImmediate(temp, threshold, PP);
     __ b(slow_path->osr_entry_label(), GE);
   }
@@ -2505,7 +2506,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   const Register left = locs.in(0).reg();
   const Register result = locs.out(0).reg();
@@ -2583,8 +2584,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ CompareRegisters(right, ZR);
@@ -2630,7 +2630,7 @@
                                                        bool opt) const {
   const intptr_t kNumInputs = 2;
   const intptr_t kNumTemps =
-      (((op_kind() == Token::kSHL) && !is_truncating()) ||
+      (((op_kind() == Token::kSHL) && !IsTruncating()) ||
        (op_kind() == Token::kSHR)) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2653,7 +2653,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   }
@@ -2670,7 +2670,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   const Register left = locs()->in(0).reg();
   const Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -2917,7 +2916,7 @@
       // sarl operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ LoadImmediate(TMP2, kCountLimit, PP);
         __ CompareRegisters(TMP, TMP2);
         __ csel(TMP, TMP2, TMP, GT);
@@ -4505,7 +4504,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4887,7 +4887,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5123,7 +5124,7 @@
                                 kThrowRuntimeEntry,
                                 1,
                                 locs());
-  __ hlt(0);
+  __ brk(0);
 }
 
 
@@ -5140,7 +5141,7 @@
                                 kReThrowRuntimeEntry,
                                 2,
                                 locs());
-  __ hlt(0);
+  __ brk(0);
 }
 
 
@@ -5154,7 +5155,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // Add an edge counter.
diff --git a/runtime/vm/intermediate_language_ia32.cc b/runtime/vm/intermediate_language_ia32.cc
index 50807147..4afb6ce 100644
--- a/runtime/vm/intermediate_language_ia32.cc
+++ b/runtime/vm/intermediate_language_ia32.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -796,6 +797,9 @@
   ASSERT(locs()->temp(1).reg() == ECX);
   ASSERT(locs()->temp(2).reg() == EDX);
   Register result = locs()->out(0).reg();
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+      (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::ZoneHandle());
@@ -807,10 +811,10 @@
     __ leal(EAX, Address(EBP, kFirstLocalSlotFromFp * kWordSize));
   }
   __ movl(ECX, Immediate(reinterpret_cast<uword>(native_c_function())));
-  __ movl(EDX, Immediate(NativeArguments::ComputeArgcTag(function())));
-  const ExternalLabel* stub_entry =
-      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
-                                &StubCode::CallNativeCFunctionLabel();
+  __ movl(EDX, Immediate(argc_tag));
+  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
+      &StubCode::CallBootstrapCFunctionLabel() :
+      &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -904,7 +908,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == EAX);
 }
 
@@ -939,15 +944,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ testl(object, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &load, Assembler::kNearJump);
-  __ movl(result, Immediate(Smi::RawValue(kSmiCid)));
-  __ jmp(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1742,8 +1739,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1833,6 +1830,7 @@
   }
 
   if (IsPotentialUnboxedStore()) {
+    __ Comment("PotentialUnboxedStore");
     Register value_reg = locs()->in(1).reg();
     Register temp = locs()->temp(0).reg();
     Register temp2 = locs()->temp(1).reg();
@@ -2830,7 +2828,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2849,7 +2847,7 @@
     } else if ((value < 0) || (value >= kCountLimit)) {
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
-      if ((value >=kCountLimit) && is_truncating) {
+      if ((value >= kCountLimit) && is_truncating) {
         __ xorl(result, result);
       } else {
         // Result is Mint or exception.
@@ -2906,8 +2904,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ cmpl(right, Immediate(0));
@@ -2993,12 +2990,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !is_truncating() ? 1 : 0;
+    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), ECX));
-    if (!is_truncating()) {
+    if (!IsTruncating()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -3026,7 +3023,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
@@ -3273,7 +3269,7 @@
         __ jmp(&done, Assembler::kNearJump);
         __ Bind(&subtract);
         __ subl(result, right);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addl(result, right);
       } else {
@@ -3293,7 +3289,7 @@
       // sarl operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ cmpl(right, Immediate(kCountLimit));
         Label count_ok;
         __ j(LESS, &count_ok, Assembler::kNearJump);
@@ -3333,7 +3329,7 @@
   ASSERT((left_cid != kDoubleCid) && (right_cid != kDoubleCid));
   const intptr_t kNumInputs = 2;
   const bool need_temp = (left()->definition() != right()->definition())
-                      &&(left_cid != kSmiCid)
+                      && (left_cid != kSmiCid)
                       && (right_cid != kSmiCid);
   const intptr_t kNumTemps = need_temp ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
@@ -4950,8 +4946,9 @@
                                instance_call()->token_pos(),
                                target,
                                kNumberOfArguments,
-                               Object::null_array(),  // No argument names.,
-                               locs());
+                               Object::null_array(),  // No argument names.
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -5365,7 +5362,7 @@
       __ jmp(&done, Assembler::kNearJump);
       __ Bind(&subtract);
       __ subl(EDX, right);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addl(EDX, right);
     } else {
@@ -5427,7 +5424,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5665,14 +5663,18 @@
 LocationSummary* BoxIntegerInstr::MakeLocationSummary(Isolate* isolate,
                                                       bool opt) const {
   const intptr_t kNumInputs = 1;
-  const intptr_t kNumTemps = 1;
+  const intptr_t kNumTemps = is_smi() ? 0 : 1;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs,
                           kNumTemps,
-                          LocationSummary::kCallOnSlowPath);
+                          is_smi()
+                              ? LocationSummary::kNoCall
+                              : LocationSummary::kCallOnSlowPath);
   summary->set_in(0, Location::Pair(Location::RequiresRegister(),
                                     Location::RequiresRegister()));
-  summary->set_temp(0, Location::RequiresRegister());
+  if (!is_smi()) {
+    summary->set_temp(0, Location::RequiresRegister());
+  }
   summary->set_out(0, Location::RequiresRegister());
   return summary;
 }
@@ -5712,6 +5714,15 @@
 
 
 void BoxIntegerInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
+  if (is_smi()) {
+    PairLocation* value_pair = locs()->in(0).AsPairLocation();
+    Register value_lo = value_pair->At(0).reg();
+    Register out_reg = locs()->out(0).reg();
+    __ movl(out_reg, value_lo);
+    __ SmiTag(out_reg);
+    return;
+  }
+
   BoxIntegerSlowPath* slow_path = new BoxIntegerSlowPath(this);
   compiler->AddSlowPathCode(slow_path);
   PairLocation* value_pair = locs()->in(0).AsPairLocation();
@@ -6003,7 +6014,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // The deoptimization descriptor points after the edge counter code for
diff --git a/runtime/vm/intermediate_language_mips.cc b/runtime/vm/intermediate_language_mips.cc
index 9f99907..9570e61 100644
--- a/runtime/vm/intermediate_language_mips.cc
+++ b/runtime/vm/intermediate_language_mips.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -879,8 +880,11 @@
   // this is a redirection address that forces the simulator to call
   // into the runtime system.
   uword entry = reinterpret_cast<uword>(native_c_function());
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
   const ExternalLabel* stub_entry;
-  if (is_bootstrap_native()) {
+  if (is_bootstrap_native() || is_leaf_call) {
     stub_entry = &StubCode::CallBootstrapCFunctionLabel();
 #if defined(USING_SIMULATOR)
     entry = Simulator::RedirectExternalReference(
@@ -899,7 +903,7 @@
 #endif
   }
   __ LoadImmediate(T5, entry);
-  __ LoadImmediate(A1, NativeArguments::ComputeArgcTag(function()));
+  __ LoadImmediate(A1, argc_tag);
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -984,7 +988,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == V0);
 }
 
@@ -1019,15 +1024,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ andi(CMPRES1, object, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &load);
-  __ LoadImmediate(result, Smi::RawValue(kSmiCid));
-  __ b(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1759,8 +1756,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1817,9 +1814,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
     } else {
       __ lw(temp, FieldAddress(instance_reg, offset_in_bytes_));
     }
@@ -1880,9 +1875,7 @@
                      temp2);
       __ Bind(slow_path->exit_label());
       __ mov(temp2, temp);
-      __ StoreIntoObject(instance_reg,
-                         FieldAddress(instance_reg, offset_in_bytes_),
-                         temp2);
+      __ StoreIntoObjectOffset(instance_reg, offset_in_bytes_, temp2);
 
       __ Bind(&copy_double);
       __ LoadDFromOffset(fpu_temp,
@@ -1898,20 +1891,21 @@
 
   if (ShouldEmitStoreBarrier()) {
     Register value_reg = locs()->in(1).reg();
-    __ StoreIntoObject(instance_reg,
-                       FieldAddress(instance_reg, offset_in_bytes_),
-                       value_reg,
-                       CanValueBeSmi());
+    __ StoreIntoObjectOffset(instance_reg,
+                             offset_in_bytes_,
+                             value_reg,
+                             CanValueBeSmi());
   } else {
     if (locs()->in(1).IsConstant()) {
-      __ StoreIntoObjectNoBarrier(
+      __ StoreIntoObjectNoBarrierOffset(
           instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_),
+          offset_in_bytes_,
           locs()->in(1).constant());
     } else {
       Register value_reg = locs()->in(1).reg();
-      __ StoreIntoObjectNoBarrier(instance_reg,
-          FieldAddress(instance_reg, offset_in_bytes_), value_reg);
+      __ StoreIntoObjectNoBarrierOffset(instance_reg,
+                                        offset_in_bytes_,
+                                        value_reg);
     }
   }
   __ Bind(&skip_store);
@@ -2252,7 +2246,8 @@
 
     __ Bind(&load_pointer);
   }
-  __ lw(result_reg, Address(instance_reg, offset_in_bytes() - kHeapObjectTag));
+  __ LoadFromOffset(
+      result_reg, instance_reg, offset_in_bytes() - kHeapObjectTag);
   __ Bind(&done);
 }
 
@@ -2566,7 +2561,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2641,8 +2636,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ bltz(right, deopt);
@@ -2687,7 +2681,7 @@
       ((op_kind() == Token::kADD) ||
        (op_kind() == Token::kMOD) ||
        (op_kind() == Token::kTRUNCDIV) ||
-       (((op_kind() == Token::kSHL) && !is_truncating()) ||
+       (((op_kind() == Token::kSHL) && !IsTruncating()) ||
          (op_kind() == Token::kSHR))) ? 1 : 0;
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
@@ -2712,7 +2706,7 @@
   }
   summary->set_in(0, Location::RequiresRegister());
   summary->set_in(1, Location::RegisterOrSmiConstant(right()));
-  if (((op_kind() == Token::kSHL) && !is_truncating()) ||
+  if (((op_kind() == Token::kSHL) && !IsTruncating()) ||
       (op_kind() == Token::kSHR)) {
     summary->set_temp(0, Location::RequiresRegister());
   } else if (op_kind() == Token::kADD) {
@@ -2733,7 +2727,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   Label* deopt = NULL;
@@ -2982,7 +2975,7 @@
         __ b(&done);
         __ Bind(&subtract);
         __ subu(result, result, TMP);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addu(result, result, TMP);
       } else {
@@ -3002,7 +2995,7 @@
       // sra operation masks the count to 5 bits.
       const intptr_t kCountLimit = 0x1F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         Label ok;
         __ BranchSignedLessEqual(temp, kCountLimit, &ok);
         __ LoadImmediate(temp, kCountLimit);
@@ -3865,7 +3858,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4201,7 +4195,7 @@
       __ b(&done);
       __ Bind(&subtract);
       __ subu(result_mod, result_mod, TMP);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addu(result_mod, result_mod, TMP);
     } else {
@@ -4241,7 +4235,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -4503,7 +4498,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // On MIPS the deoptimization descriptor points after the edge counter
diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc
index ac57c55..918849b 100644
--- a/runtime/vm/intermediate_language_test.cc
+++ b/runtime/vm/intermediate_language_test.cc
@@ -53,10 +53,609 @@
   Range* range_x = new Range(
       RangeBoundary::FromConstant(-15),
       RangeBoundary::FromConstant(100));
+  EXPECT(positive->IsPositive());
   EXPECT(zero->Overlaps(0, 0));
   EXPECT(positive->Overlaps(0, 0));
   EXPECT(!negative->Overlaps(0, 0));
   EXPECT(range_x->Overlaps(0, 0));
+  EXPECT(range_x->IsWithin(-15, 100));
+  EXPECT(!range_x->IsWithin(-15, 99));
+  EXPECT(!range_x->IsWithin(-14, 100));
+
+#define TEST_RANGE_OP(Op, l_min, l_max, r_min, r_max, result_min, result_max)  \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* shift_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    Op(left_range, shift_range, &min, &max);                                   \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) OS::Print("%s\n", min.ToCString());           \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) OS::Print("%s\n", max.ToCString());           \
+  }
+
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 2,
+                RangeBoundary(-60), RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, 100, -2, 2,
+                RangeBoundary(-60), RangeBoundary(400));
+  TEST_RANGE_OP(Range::Shl, -15, -10, 1, 2,
+                RangeBoundary(-60), RangeBoundary(-20));
+  TEST_RANGE_OP(Range::Shl, 5, 10, -2, 2,
+                RangeBoundary(5), RangeBoundary(40));
+  TEST_RANGE_OP(Range::Shl, -15, 100, 0, 64,
+                RangeBoundary::NegativeInfinity(),
+                RangeBoundary::PositiveInfinity());
+  TEST_RANGE_OP(Range::Shl, -1, 1, 63, 63,
+                RangeBoundary::NegativeInfinity(),
+                RangeBoundary::PositiveInfinity());
+  if (kBitsPerWord == 64) {
+    TEST_RANGE_OP(Range::Shl, -1, 1, 62, 62,
+                  RangeBoundary(kSmiMin),
+                  RangeBoundary::PositiveInfinity());
+    TEST_RANGE_OP(Range::Shl, -1, 1, 30, 30,
+                  RangeBoundary(-1 << 30),
+                  RangeBoundary(1 << 30));
+  } else {
+    TEST_RANGE_OP(Range::Shl, -1, 1, 30, 30,
+                  RangeBoundary(kSmiMin),
+                  RangeBoundary::PositiveInfinity());
+    TEST_RANGE_OP(Range::Shl, -1, 1, 62, 62,
+                  RangeBoundary::NegativeInfinity(),
+                  RangeBoundary::PositiveInfinity());
+  }
+  TEST_RANGE_OP(Range::Shl, 0, 100, 0, 64,
+                RangeBoundary(0), RangeBoundary::PositiveInfinity());
+  TEST_RANGE_OP(Range::Shl, -100, 0, 0, 64,
+                RangeBoundary::NegativeInfinity(), RangeBoundary(0));
+
+  TEST_RANGE_OP(Range::Shr, -8, 8, 1, 2, RangeBoundary(-4), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, 1, 8, 1, 2, RangeBoundary(0), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, -16, -8, 1, 2,
+                RangeBoundary(-8), RangeBoundary(-2));
+  TEST_RANGE_OP(Range::Shr, 2, 4, -1, 1, RangeBoundary(1), RangeBoundary(4));
+  TEST_RANGE_OP(Range::Shr, kMaxInt64, kMaxInt64, 0, 1,
+                RangeBoundary(kMaxInt64 >> 1), RangeBoundary(kMaxInt64));
+  TEST_RANGE_OP(Range::Shr, kMinInt64, kMinInt64, 0, 1,
+                RangeBoundary(kMinInt64), RangeBoundary(kMinInt64 >> 1));
+#undef TEST_RANGE_OP
+}
+
+
+TEST_CASE(RangeTestsInfinity) {
+  // +/- inf overflowed.
+  EXPECT(RangeBoundary::NegativeInfinity().OverflowedSmi());
+  EXPECT(RangeBoundary::PositiveInfinity().OverflowedSmi());
+
+  EXPECT(RangeBoundary::NegativeInfinity().OverflowedMint());
+  EXPECT(RangeBoundary::PositiveInfinity().OverflowedMint());
+
+  Range* all = new Range(RangeBoundary::NegativeInfinity(),
+                         RangeBoundary::PositiveInfinity());
+  EXPECT(all->Overlaps(0, 0));
+  EXPECT(all->Overlaps(-1, 1));
+  EXPECT(!all->IsWithin(0, 100));
+  Range* positive = new Range(RangeBoundary::FromConstant(0),
+                              RangeBoundary::PositiveInfinity());
+  EXPECT(positive->IsPositive());
+  EXPECT(positive->Overlaps(0, 1));
+  EXPECT(positive->Overlaps(1, 100));
+  EXPECT(positive->Overlaps(-1, 0));
+  EXPECT(!positive->Overlaps(-2, -1));
+  Range* negative = new Range(RangeBoundary::NegativeInfinity(),
+                              RangeBoundary::FromConstant(-1));
+  EXPECT(!negative->IsPositive());
+  EXPECT(!negative->Overlaps(0, 1));
+  EXPECT(!negative->Overlaps(1, 100));
+  EXPECT(negative->Overlaps(-1, 0));
+  EXPECT(negative->Overlaps(-2, -1));
+  Range* negpos = new Range(RangeBoundary::NegativeInfinity(),
+                            RangeBoundary::FromConstant(0));
+  EXPECT(!negpos->IsPositive());
+
+  Range* a = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(1));
+
+  Range* b = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(31));
+
+  Range* c = new Range(RangeBoundary::NegativeInfinity(),
+                       RangeBoundary::FromConstant(32));
+
+  EXPECT(a->OnlyLessThanOrEqualTo(31));
+  EXPECT(b->OnlyLessThanOrEqualTo(31));
+  EXPECT(!c->OnlyLessThanOrEqualTo(31));
+
+  Range* unsatisfiable = new Range(RangeBoundary::PositiveInfinity(),
+                                   RangeBoundary::NegativeInfinity());
+  EXPECT(unsatisfiable->IsUnsatisfiable());
+
+  Range* unsatisfiable_right = new Range(RangeBoundary::PositiveInfinity(),
+                                         RangeBoundary::FromConstant(0));
+  EXPECT(unsatisfiable_right->IsUnsatisfiable());
+
+  Range* unsatisfiable_left = new Range(RangeBoundary::FromConstant(0),
+                                        RangeBoundary::NegativeInfinity());
+  EXPECT(unsatisfiable_left->IsUnsatisfiable());
+}
+
+
+TEST_CASE(RangeUtils) {
+  // [-inf, +inf].
+  const Range& range_0 = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::PositiveInfinity()));
+  // [-inf, -1].
+  const Range& range_a = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(-1)));
+  // [-inf, 0].
+  const Range& range_b = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(0)));
+  // [-inf, 1].
+  const Range& range_c = *(new Range(RangeBoundary::NegativeInfinity(),
+                                     RangeBoundary::FromConstant(1)));
+  // [-1, +inf]
+  const Range& range_d = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::PositiveInfinity()));
+  // [0, +inf]
+  const Range& range_e = *(new Range(RangeBoundary::FromConstant(0),
+                                     RangeBoundary::PositiveInfinity()));
+  // [1, +inf].
+  const Range& range_f = *(new Range(RangeBoundary::FromConstant(1),
+                                     RangeBoundary::PositiveInfinity()));
+  // [1, 2].
+  const Range& range_g = *(new Range(RangeBoundary::FromConstant(1),
+                                     RangeBoundary::FromConstant(2)));
+  // [-1, -2].
+  const Range& range_h = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::FromConstant(-2)));
+  // [-1, 1].
+  const Range& range_i = *(new Range(RangeBoundary::FromConstant(-1),
+                                     RangeBoundary::FromConstant(1)));
+
+  // OnlyPositiveOrZero.
+  EXPECT(!Range::OnlyPositiveOrZero(range_a, range_b));
+  EXPECT(!Range::OnlyPositiveOrZero(range_b, range_c));
+  EXPECT(!Range::OnlyPositiveOrZero(range_c, range_d));
+  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_e));
+  EXPECT(Range::OnlyPositiveOrZero(range_e, range_f));
+  EXPECT(!Range::OnlyPositiveOrZero(range_d, range_d));
+  EXPECT(Range::OnlyPositiveOrZero(range_e, range_e));
+  EXPECT(Range::OnlyPositiveOrZero(range_f, range_g));
+  EXPECT(!Range::OnlyPositiveOrZero(range_g, range_h));
+  EXPECT(!Range::OnlyPositiveOrZero(range_i, range_i));
+
+  // OnlyNegativeOrZero.
+  EXPECT(Range::OnlyNegativeOrZero(range_a, range_b));
+  EXPECT(!Range::OnlyNegativeOrZero(range_b, range_c));
+  EXPECT(Range::OnlyNegativeOrZero(range_b, range_b));
+  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_c));
+  EXPECT(!Range::OnlyNegativeOrZero(range_c, range_d));
+  EXPECT(!Range::OnlyNegativeOrZero(range_d, range_e));
+  EXPECT(!Range::OnlyNegativeOrZero(range_e, range_f));
+  EXPECT(!Range::OnlyNegativeOrZero(range_f, range_g));
+  EXPECT(!Range::OnlyNegativeOrZero(range_g, range_h));
+  EXPECT(Range::OnlyNegativeOrZero(range_h, range_h));
+  EXPECT(!Range::OnlyNegativeOrZero(range_i, range_i));
+
+  // [-inf, +inf].
+  EXPECT(!Range::OnlyNegativeOrZero(range_0, range_0));
+  EXPECT(!Range::OnlyPositiveOrZero(range_0, range_0));
+
+  EXPECT(Range::ConstantAbsMax(&range_0) == RangeBoundary::kMax);
+  EXPECT(Range::ConstantAbsMax(&range_h) == 2);
+  EXPECT(Range::ConstantAbsMax(&range_i) == 1);
+
+  // RangeBOundary.Equals.
+  EXPECT(RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::FromConstant(1)));
+  EXPECT(!RangeBoundary::FromConstant(2).Equals(
+      RangeBoundary::FromConstant(1)));
+  EXPECT(RangeBoundary::PositiveInfinity().Equals(
+      RangeBoundary::PositiveInfinity()));
+  EXPECT(!RangeBoundary::PositiveInfinity().Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(RangeBoundary::NegativeInfinity().Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::NegativeInfinity().Equals(
+      RangeBoundary::PositiveInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(1).Equals(
+      RangeBoundary::NegativeInfinity()));
+  EXPECT(!RangeBoundary::FromConstant(2).Equals(
+      RangeBoundary::PositiveInfinity()));
+}
+
+
+TEST_CASE(RangeBinaryOp) {
+  Range* range_a = new Range(RangeBoundary::FromConstant(-1),
+                             RangeBoundary::PositiveInfinity());
+  range_a->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  EXPECT(range_a->min().ConstantValue() == -1);
+  EXPECT(range_a->max().ConstantValue() == RangeBoundary::kMax);
+  Range* range_b = new Range(RangeBoundary::NegativeInfinity(),
+                             RangeBoundary::FromConstant(1));
+  range_b->Clamp(RangeBoundary::kRangeBoundaryInt64);
+  EXPECT(range_b->min().ConstantValue() == RangeBoundary::kMin);
+  EXPECT(range_b->max().ConstantValue() == 1);
+  Range* result = Range::BinaryOp(Token::kADD,
+                                  range_a,
+                                  range_b,
+                                  NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().IsNegativeInfinity());
+  EXPECT(result->max().IsPositiveInfinity());
+
+  // Test that [5, 10] + [0, 5] = [5, 15].
+  Range* range_c = new Range(RangeBoundary::FromConstant(5),
+                             RangeBoundary::FromConstant(10));
+  Range* range_d = new Range(RangeBoundary::FromConstant(0),
+                             RangeBoundary::FromConstant(5));
+  result = Range::BinaryOp(Token::kADD,
+                           range_c,
+                           range_d,
+                           NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().ConstantValue() == 5);
+  EXPECT(result->max().ConstantValue() == 15);
+
+
+  // Test that [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
+  Range* range_e = new Range(RangeBoundary::FromConstant(0xff),
+                             RangeBoundary::FromConstant(0xfff));
+  Range* range_f = new Range(RangeBoundary::FromConstant(0xf),
+                             RangeBoundary::FromConstant(0xf));
+  result = Range::BinaryOp(Token::kBIT_AND,
+                           range_e,
+                           range_f,
+                           NULL);
+  ASSERT(result != NULL);
+  EXPECT(result->min().ConstantValue() == 0x0);
+  EXPECT(result->max().ConstantValue() == 0xf);
+}
+
+
+TEST_CASE(RangeAdd) {
+#define TEST_RANGE_ADD(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::Add(left_range, right_range, &min, &max, NULL);                     \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [kMaxInt32, kMaxInt32 + 15] + [10, 20] = [kMaxInt32 + 10, kMaxInt32 + 35].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
+
+  // [kMaxInt32 - 15, kMaxInt32 + 15] + [15, -15] = [kMaxInt32, kMaxInt32].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32) - 15,
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(15),
+                 static_cast<int64_t>(-15),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32)));
+
+  // [kMaxInt32, kMaxInt32 + 15] + [10, kMaxInt64] = [kMaxInt32 + 10, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 10),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMinInt64, kMaxInt32 + 15] + [10, 20] = [kMinInt64 + 10, kMaxInt32 + 35].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMinInt64) + 10),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 35));
+
+  // [0, 0] + [kMinInt64, kMaxInt64] = [kMinInt64, kMaxInt64].
+  TEST_RANGE_ADD(static_cast<int64_t>(0),
+                 static_cast<int64_t>(0),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary(kMinInt64),
+                 RangeBoundary(kMaxInt64));
+
+  // Overflows.
+
+  // [-1, 1] + [kMinInt64, kMaxInt64] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(-1),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt64, kMaxInt64] + [kMaxInt64, kMaxInt64] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt64, kMaxInt64] + [1, 1] = [-inf, +inf].
+  TEST_RANGE_ADD(static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(kMaxInt64),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+#undef TEST_RANGE_ADD
+}
+
+
+TEST_CASE(RangeSub) {
+#define TEST_RANGE_SUB(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::Sub(left_range, right_range, &min, &max, NULL);                     \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [kMaxInt32, kMaxInt32 + 15] - [10, 20] = [kMaxInt32 - 20, kMaxInt32 + 5].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32),
+                 static_cast<int64_t>(kMaxInt32) + 15,
+                 static_cast<int64_t>(10),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) - 20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 5));
+
+  // [kMintInt64, kMintInt64] - [1, 1] = [-inf, +inf].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [1, 1] - [kMintInt64, kMintInt64] = [-inf, +inf].
+  TEST_RANGE_SUB(static_cast<int64_t>(1),
+                 static_cast<int64_t>(1),
+                 static_cast<int64_t>(kMinInt64),
+                 static_cast<int64_t>(kMinInt64),
+                 RangeBoundary::NegativeInfinity(),
+                 RangeBoundary::PositiveInfinity());
+
+  // [kMaxInt32 + 10, kMaxInt32 + 20] - [-20, -20] =
+  //     [kMaxInt32 + 30, kMaxInt32 + 40].
+  TEST_RANGE_SUB(static_cast<int64_t>(kMaxInt32) + 10,
+                 static_cast<int64_t>(kMaxInt32) + 20,
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(-20),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 30),
+                 RangeBoundary(static_cast<int64_t>(kMaxInt32) + 40));
+
+
+#undef TEST_RANGE_SUB
+}
+
+
+TEST_CASE(RangeAnd) {
+#define TEST_RANGE_AND(l_min, l_max, r_min, r_max, result_min, result_max)     \
+  {                                                                            \
+    RangeBoundary min, max;                                                    \
+    Range* left_range = new Range(                                             \
+      RangeBoundary::FromConstant(l_min),                                      \
+      RangeBoundary::FromConstant(l_max));                                     \
+    Range* right_range = new Range(                                            \
+      RangeBoundary::FromConstant(r_min),                                      \
+      RangeBoundary::FromConstant(r_max));                                     \
+    EXPECT(left_range->min().ConstantValue() == l_min);                        \
+    EXPECT(left_range->max().ConstantValue() == l_max);                        \
+    EXPECT(right_range->min().ConstantValue() == r_min);                       \
+    EXPECT(right_range->max().ConstantValue() == r_max);                       \
+    Range::And(left_range, right_range, &min, &max);                           \
+    EXPECT(min.Equals(result_min));                                            \
+    if (!min.Equals(result_min)) {                                             \
+      OS::Print("%s != %s\n", min.ToCString(), result_min.ToCString());        \
+    }                                                                          \
+    EXPECT(max.Equals(result_max));                                            \
+    if (!max.Equals(result_max)) {                                             \
+      OS::Print("%s != %s\n", max.ToCString(), result_max.ToCString());        \
+    }                                                                          \
+  }
+
+  // [0xff, 0xfff] & [0xf, 0xf] = [0x0, 0xf].
+  TEST_RANGE_AND(static_cast<int64_t>(0xff),
+                 static_cast<int64_t>(0xfff),
+                 static_cast<int64_t>(0xf),
+                 static_cast<int64_t>(0xf),
+                 RangeBoundary(0),
+                 RangeBoundary(0xf));
+
+  // [0xffffffff, 0xffffffff] & [0xfffffffff, 0xfffffffff] = [0x0, 0xfffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xfffffffff),
+                 static_cast<int64_t>(0xfffffffff),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xfffffffff)));
+
+  // [0xffffffff, 0xffffffff] & [-20, 20] = [0x0, 0xffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xffffffff)));
+
+  // [-20, 20] & [0xffffffff, 0xffffffff] = [0x0, 0xffffffff].
+  TEST_RANGE_AND(static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 static_cast<int64_t>(0xffffffff),
+                 static_cast<int64_t>(0xffffffff),
+                 RangeBoundary(0),
+                 RangeBoundary(static_cast<int64_t>(0xffffffff)));
+
+  // Test that [-20, 20] & [-20, 20] = [Unknown, Unknown].
+  TEST_RANGE_AND(static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 static_cast<int64_t>(-20),
+                 static_cast<int64_t>(20),
+                 RangeBoundary(),
+                 RangeBoundary());
+
+#undef TEST_RANGE_AND
+}
+
+
+TEST_CASE(RangeMinMax) {
+  // Constants.
+  // MIN(0, 1) == 0
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+  // MIN(0, -1) == -1
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  // MIN(1, 0) == 0
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+  // MIN(-1, 0) == -1
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  // MAX(0, 1) == 1
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  // MAX(0, -1) == 0
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+
+  // MAX(1, 0) == 1
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+  // MAX(-1, 0) == 0
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::FromConstant(0),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 0);
+
+  RangeBoundary n_infinity = RangeBoundary::NegativeInfinity();
+  RangeBoundary p_infinity = RangeBoundary::PositiveInfinity();
+
+  // Constants vs. infinity.
+  EXPECT(RangeBoundary::Max(
+      n_infinity,
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(-1),
+      n_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary::FromConstant(1),
+      n_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Max(
+      n_infinity,
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Min(
+      p_infinity,
+      RangeBoundary::FromConstant(-1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(-1),
+      p_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == -1);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary::FromConstant(1),
+      p_infinity,
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  EXPECT(RangeBoundary::Min(
+      p_infinity,
+      RangeBoundary::FromConstant(1),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == 1);
+
+  // 64-bit values.
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary(static_cast<int64_t>(kMinInt64)),
+      RangeBoundary(static_cast<int64_t>(kMinInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt64);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary(static_cast<int64_t>(kMinInt64)),
+      RangeBoundary(static_cast<int64_t>(kMinInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMinInt32);
+
+  EXPECT(RangeBoundary::Min(
+      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
+      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt32);
+
+  EXPECT(RangeBoundary::Max(
+      RangeBoundary(static_cast<int64_t>(kMaxInt64)),
+      RangeBoundary(static_cast<int64_t>(kMaxInt32)),
+      RangeBoundary::kRangeBoundaryInt64).ConstantValue() == kMaxInt64);
 }
 
 }  // namespace dart
diff --git a/runtime/vm/intermediate_language_x64.cc b/runtime/vm/intermediate_language_x64.cc
index 9093f7a..563a552 100644
--- a/runtime/vm/intermediate_language_x64.cc
+++ b/runtime/vm/intermediate_language_x64.cc
@@ -8,6 +8,7 @@
 #include "vm/intermediate_language.h"
 
 #include "vm/dart_entry.h"
+#include "vm/flow_graph.h"
 #include "vm/flow_graph_compiler.h"
 #include "vm/locations.h"
 #include "vm/object_store.h"
@@ -723,6 +724,9 @@
   ASSERT(locs()->temp(1).reg() == RBX);
   ASSERT(locs()->temp(2).reg() == R10);
   Register result = locs()->out(0).reg();
+  const intptr_t argc_tag = NativeArguments::ComputeArgcTag(function());
+  const bool is_leaf_call =
+    (argc_tag & NativeArguments::AutoSetupScopeMask()) == 0;
 
   // Push the result place holder initialized to NULL.
   __ PushObject(Object::ZoneHandle(), PP);
@@ -737,10 +741,10 @@
   __ LoadImmediate(
       RBX, Immediate(reinterpret_cast<uword>(native_c_function())), PP);
   __ LoadImmediate(
-      R10, Immediate(NativeArguments::ComputeArgcTag(function())), PP);
-  const ExternalLabel* stub_entry =
-      (is_bootstrap_native()) ? &StubCode::CallBootstrapCFunctionLabel() :
-                                &StubCode::CallNativeCFunctionLabel();
+      R10, Immediate(argc_tag), PP);
+  const ExternalLabel* stub_entry = (is_bootstrap_native() || is_leaf_call) ?
+      &StubCode::CallBootstrapCFunctionLabel() :
+      &StubCode::CallNativeCFunctionLabel();
   compiler->GenerateCall(token_pos(),
                          stub_entry,
                          PcDescriptors::kOther,
@@ -833,7 +837,8 @@
                                CallFunction(),
                                kNumberOfArguments,
                                kNoArgumentNames,
-                               locs());
+                               locs(),
+                               ICData::Handle());
   ASSERT(locs()->out(0).reg() == RAX);
 }
 
@@ -868,15 +873,7 @@
 void LoadClassIdInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   Register object = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
-  Label load, done;
-  __ testq(object, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &load, Assembler::kNearJump);
-  __ LoadImmediate(result, Immediate(Smi::RawValue(kSmiCid)), PP);
-  __ jmp(&done);
-  __ Bind(&load);
-  __ LoadClassId(result, object);
-  __ SmiTag(result);
-  __ Bind(&done);
+  __ LoadTaggedClassIdMayBeSmi(result, object);
 }
 
 
@@ -1379,13 +1376,13 @@
     if (value_cid == kDynamicCid) {
       LoadValueCid(compiler, value_cid_reg, value_reg);
 
-      __ cmpq(value_cid_reg, field_cid_operand);
+      __ cmpl(value_cid_reg, field_cid_operand);
       __ j(EQUAL, &ok);
-      __ cmpq(value_cid_reg, field_nullability_operand);
+      __ cmpl(value_cid_reg, field_nullability_operand);
     } else if (value_cid == kNullCid) {
-      __ CompareImmediate(field_nullability_operand, Immediate(value_cid), PP);
+      __ cmpl(field_nullability_operand, Immediate(value_cid));
     } else {
-      __ CompareImmediate(field_cid_operand, Immediate(value_cid), PP);
+      __ cmpl(field_cid_operand, Immediate(value_cid));
     }
     __ j(EQUAL, &ok);
 
@@ -1396,16 +1393,16 @@
     if (!field().needs_length_check()) {
       // Uninitialized field can be handled inline. Check if the
       // field is still unitialized.
-      __ CompareImmediate(field_cid_operand, Immediate(kIllegalCid), PP);
+      __ cmpl(field_cid_operand, Immediate(kIllegalCid));
       __ j(NOT_EQUAL, fail);
 
       if (value_cid == kDynamicCid) {
-        __ movq(field_cid_operand, value_cid_reg);
-        __ movq(field_nullability_operand, value_cid_reg);
+        __ movl(field_cid_operand, value_cid_reg);
+        __ movl(field_nullability_operand, value_cid_reg);
       } else {
         ASSERT(field_reg != kNoRegister);
-        __ LoadImmediate(field_cid_operand, Immediate(value_cid), PP);
-        __ LoadImmediate(field_nullability_operand, Immediate(value_cid), PP);
+        __ movl(field_cid_operand, Immediate(value_cid));
+        __ movl(field_nullability_operand, Immediate(value_cid));
       }
 
       if (deopt == NULL) {
@@ -1418,8 +1415,8 @@
       ASSERT(!compiler->is_optimizing());
       __ Bind(fail);
 
-      __ CompareImmediate(FieldAddress(field_reg, Field::guarded_cid_offset()),
-                          Immediate(kDynamicCid), PP);
+      __ cmpl(FieldAddress(field_reg, Field::guarded_cid_offset()),
+              Immediate(kDynamicCid));
       __ j(EQUAL, &ok);
 
       __ pushq(field_reg);
@@ -1585,8 +1582,8 @@
           ((IsPotentialUnboxedStore()) ? 3 : 0);
   LocationSummary* summary = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps,
-          !field().IsNull() &&
-          ((field().guarded_cid() == kIllegalCid) || is_initialization_)
+          ((IsUnboxedStore() && opt && is_initialization_) ||
+           IsPotentialUnboxedStore())
           ? LocationSummary::kCallOnSlowPath
           : LocationSummary::kNoCall);
 
@@ -1688,7 +1685,7 @@
 
     __ LoadObject(temp, Field::ZoneHandle(field().raw()), PP);
 
-    __ cmpq(FieldAddress(temp, Field::is_nullable_offset()),
+    __ cmpl(FieldAddress(temp, Field::is_nullable_offset()),
             Immediate(kNullCid));
     __ j(EQUAL, &store_pointer);
 
@@ -1696,11 +1693,11 @@
     __ testq(temp2, Immediate(1 << Field::kUnboxingCandidateBit));
     __ j(ZERO, &store_pointer);
 
-    __ cmpq(FieldAddress(temp, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
             Immediate(kDoubleCid));
     __ j(EQUAL, &store_double);
 
-    __ cmpq(FieldAddress(temp, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(temp, Field::guarded_cid_offset()),
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &store_float32x4);
 
@@ -2190,19 +2187,19 @@
 
     __ LoadObject(result, Field::ZoneHandle(field()->raw()), PP);
 
-    __ cmpq(FieldAddress(result, Field::is_nullable_offset()),
+    __ cmpl(FieldAddress(result, Field::is_nullable_offset()),
             Immediate(kNullCid));
     __ j(EQUAL, &load_pointer);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kDoubleCid));
     __ j(EQUAL, &load_double);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kFloat32x4Cid));
     __ j(EQUAL, &load_float32x4);
 
-    __ cmpq(FieldAddress(result, Field::guarded_cid_offset()),
+    __ cmpl(FieldAddress(result, Field::guarded_cid_offset()),
             Immediate(kFloat64x2Cid));
     __ j(EQUAL, &load_float64x2);
 
@@ -2545,10 +2542,10 @@
     // stack checks.  Use progressively higher thresholds for more deeply
     // nested loops to attempt to hit outer loops with OSR when possible.
     __ LoadObject(temp, compiler->parsed_function().function(), PP);
-    intptr_t threshold =
+    int32_t threshold =
         FLAG_optimization_counter_threshold * (loop_depth() + 1);
-    __ CompareImmediate(FieldAddress(temp, Function::usage_counter_offset()),
-                        Immediate(threshold), PP);
+    __ cmpl(FieldAddress(temp, Function::usage_counter_offset()),
+            Immediate(threshold));
     __ j(GREATER_EQUAL, slow_path->osr_entry_label());
   }
   if (compiler->ForceSlowPathForStackOverflow()) {
@@ -2576,7 +2573,7 @@
 
 static void EmitSmiShiftLeft(FlowGraphCompiler* compiler,
                              BinarySmiOpInstr* shift_left) {
-  const bool is_truncating = shift_left->is_truncating();
+  const bool is_truncating = shift_left->IsTruncating();
   const LocationSummary& locs = *shift_left->locs();
   Register left = locs.in(0).reg();
   Register result = locs.out(0).reg();
@@ -2595,7 +2592,7 @@
     } else if ((value < 0) || (value >= kCountLimit)) {
       // This condition may not be known earlier in some cases because
       // of constant propagation, inlining, etc.
-      if ((value >=kCountLimit) && is_truncating) {
+      if ((value >= kCountLimit) && is_truncating) {
         __ xorq(result, result);
       } else {
         // Result is Mint or exception.
@@ -2658,8 +2655,7 @@
   if (is_truncating) {
     if (right_needs_check) {
       const bool right_may_be_negative =
-          (right_range == NULL) ||
-          !right_range->IsWithin(0, RangeBoundary::kPlusInfinity);
+          (right_range == NULL) || !right_range->IsPositive();
       if (right_may_be_negative) {
         ASSERT(shift_left->CanDeoptimize());
         __ CompareImmediate(right, Immediate(0), PP);
@@ -2770,12 +2766,12 @@
     summary->set_out(0, Location::SameAsFirstInput());
     return summary;
   } else if (op_kind() == Token::kSHL) {
-    const intptr_t kNumTemps = !is_truncating() ? 1 : 0;
+    const intptr_t kNumTemps = !IsTruncating() ? 1 : 0;
     LocationSummary* summary = new(isolate) LocationSummary(
         isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
     summary->set_in(0, Location::RequiresRegister());
     summary->set_in(1, Location::FixedRegisterOrSmiConstant(right(), RCX));
-    if (!is_truncating()) {
+    if (!IsTruncating()) {
       summary->set_temp(0, Location::RequiresRegister());
     }
     summary->set_out(0, Location::SameAsFirstInput());
@@ -2802,7 +2798,6 @@
     return;
   }
 
-  ASSERT(!is_truncating());
   Register left = locs()->in(0).reg();
   Register result = locs()->out(0).reg();
   ASSERT(left == result);
@@ -3111,7 +3106,7 @@
         __ jmp(&all_done, Assembler::kNearJump);
         __ Bind(&subtract);
         __ subq(result, right);
-      } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+      } else if (right_range->IsPositive()) {
         // Right is positive.
         __ addq(result, right);
       } else {
@@ -3131,7 +3126,7 @@
       // sarq operation masks the count to 6 bits.
       const intptr_t kCountLimit = 0x3F;
       if ((right_range == NULL) ||
-          !right_range->IsWithin(RangeBoundary::kMinusInfinity, kCountLimit)) {
+          !right_range->OnlyLessThanOrEqualTo(kCountLimit)) {
         __ CompareImmediate(right, Immediate(kCountLimit), PP);
         Label count_ok;
         __ j(LESS, &count_ok, Assembler::kNearJump);
@@ -4796,7 +4791,8 @@
                                target,
                                kNumberOfArguments,
                                Object::null_array(),  // No argument names.
-                               locs());
+                               locs(),
+                               ICData::Handle());
   __ Bind(&done);
 }
 
@@ -4808,7 +4804,7 @@
   LocationSummary* result = new(isolate) LocationSummary(
       isolate, kNumInputs, kNumTemps, LocationSummary::kNoCall);
   result->set_in(0, Location::RequiresFpuRegister());
-  result->set_out(0, Location:: Location::RequiresRegister());
+  result->set_out(0, Location::RequiresRegister());
   result->set_temp(0, Location::RequiresRegister());
   return result;
 }
@@ -5252,7 +5248,7 @@
       __ jmp(&all_done, Assembler::kNearJump);
       __ Bind(&subtract);
       __ subq(RDX, right);
-    } else if (right_range->IsWithin(0, RangeBoundary::kPlusInfinity)) {
+    } else if (right_range->IsPositive()) {
       // Right is positive.
       __ addq(RDX, right);
     } else {
@@ -5329,7 +5325,8 @@
                                  target,
                                  instance_call()->ArgumentCount(),
                                  instance_call()->argument_names(),
-                                 locs());
+                                 locs(),
+                                 ICData::Handle());
     return;
   }
 
@@ -5595,7 +5592,7 @@
 void TargetEntryInstr::EmitNativeCode(FlowGraphCompiler* compiler) {
   __ Bind(compiler->GetJumpLabel(this));
   if (!compiler->is_optimizing()) {
-    if (FLAG_emit_edge_counters) {
+    if (compiler->NeedsEdgeCounter(this)) {
       compiler->EmitEdgeCounter();
     }
     // The deoptimization descriptor points after the edge counter code for
diff --git a/runtime/vm/intrinsifier.h b/runtime/vm/intrinsifier.h
index d619f5b..183540b 100644
--- a/runtime/vm/intrinsifier.h
+++ b/runtime/vm/intrinsifier.h
@@ -16,129 +16,129 @@
 // When adding a new function for intrinsification add a 0 as fingerprint,
 // build and run to get the correct fingerprint from the mismatch error.
 #define CORE_LIB_INTRINSIC_LIST(V)                                             \
-  V(_Smi, ~, Smi_bitNegate, 721565906)                                         \
-  V(_Smi, get:bitLength, Smi_bitLength, 383447247)                             \
-  V(_Double, >, Double_greaterThan, 196653614)                                 \
-  V(_Double, >=, Double_greaterEqualThan, 1420124977)                          \
-  V(_Double, <, Double_lessThan, 1368169970)                                   \
-  V(_Double, <=, Double_lessEqualThan, 117083409)                              \
-  V(_Double, ==, Double_equal, 617620743)                                      \
-  V(_Double, +, Double_add, 1618778505)                                        \
-  V(_Double, -, Double_sub, 355538766)                                         \
-  V(_Double, *, Double_mul, 1175404333)                                        \
-  V(_Double, /, Double_div, 1079430731)                                        \
-  V(_Double, get:isNaN, Double_getIsNaN, 916596113)                            \
-  V(_Double, get:isNegative, Double_getIsNegative, 1711421660)                 \
-  V(_Double, _mulFromInteger, Double_mulFromInteger, 1392340623)               \
-  V(_Double, .fromInteger, Double_fromInteger, 2033384877)                     \
-  V(_List, get:length, Array_getLength, 215183186)                             \
-  V(_List, [], Array_getIndexed, 675155875)                                    \
-  V(_List, []=, Array_setIndexed, 1228569706)                                  \
-  V(_GrowableList, .withData, GrowableList_Allocate, 264792196)                \
-  V(_GrowableList, get:length, GrowableList_getLength, 1654255033)             \
-  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 817119794)         \
-  V(_GrowableList, [], GrowableList_getIndexed, 1282104248)                    \
-  V(_GrowableList, []=, GrowableList_setIndexed, 807019110)                    \
-  V(_GrowableList, _setLength, GrowableList_setLength, 823005129)              \
-  V(_GrowableList, _setData, GrowableList_setData, 970836644)                  \
-  V(_GrowableList, add, GrowableList_add, 1667349856)                          \
-  V(_ImmutableList, [], ImmutableList_getIndexed, 1768793932)                  \
-  V(_ImmutableList, get:length, ImmutableList_getLength, 578762861)            \
+  V(_Smi, ~, Smi_bitNegate, 105519892)                                         \
+  V(_Smi, get:bitLength, Smi_bitLength, 869956497)                             \
+  V(_Double, >, Double_greaterThan, 381325711)                                 \
+  V(_Double, >=, Double_greaterEqualThan, 1409267140)                          \
+  V(_Double, <, Double_lessThan, 2080387973)                                   \
+  V(_Double, <=, Double_lessEqualThan, 106225572)                              \
+  V(_Double, ==, Double_equal, 2093918133)                                     \
+  V(_Double, +, Double_add, 1646350451)                                        \
+  V(_Double, -, Double_sub, 1477459276)                                        \
+  V(_Double, *, Double_mul, 1334580777)                                        \
+  V(_Double, /, Double_div, 1938037155)                                        \
+  V(_Double, get:isNaN, Double_getIsNaN, 843050033)                            \
+  V(_Double, get:isNegative, Double_getIsNegative, 1637875580)                 \
+  V(_Double, _mulFromInteger, Double_mulFromInteger, 1594796483)               \
+  V(_Double, .fromInteger, Double_fromInteger, 999771940)                      \
+  V(_List, get:length, Array_getLength, 1181352729)                            \
+  V(_List, [], Array_getIndexed, 795612476)                                    \
+  V(_List, []=, Array_setIndexed, 1288827575)                                  \
+  V(_GrowableList, .withData, GrowableList_Allocate, 732923072)                \
+  V(_GrowableList, get:length, GrowableList_getLength, 778505107)              \
+  V(_GrowableList, get:_capacity, GrowableList_getCapacity, 555140075)         \
+  V(_GrowableList, [], GrowableList_getIndexed, 919108233)                     \
+  V(_GrowableList, []=, GrowableList_setIndexed, 1218649853)                   \
+  V(_GrowableList, _setLength, GrowableList_setLength, 89389299)               \
+  V(_GrowableList, _setData, GrowableList_setData, 2126927509)                 \
+  V(_GrowableList, add, GrowableList_add, 1899133961)                          \
+  V(_ImmutableList, [], ImmutableList_getIndexed, 1990177341)                  \
+  V(_ImmutableList, get:length, ImmutableList_getLength, 274917727)            \
   V(Object, ==, Object_equal, 1068471689)                                      \
-  V(_StringBase, get:hashCode, String_getHashCode, 654572819)                  \
-  V(_StringBase, get:isEmpty, String_getIsEmpty, 1599468763)                   \
-  V(_StringBase, get:length, String_getLength, 1483549854)                     \
-  V(_StringBase, codeUnitAt, String_codeUnitAt, 1958436584)                    \
-  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1236493807)       \
+  V(_StringBase, get:hashCode, String_getHashCode, 2102906241)                 \
+  V(_StringBase, get:isEmpty, String_getIsEmpty, 49873871)                     \
+  V(_StringBase, get:length, String_getLength, 784399628)                      \
+  V(_StringBase, codeUnitAt, String_codeUnitAt, 397735324)                     \
+  V(_OneByteString, get:hashCode, OneByteString_getHashCode, 1111837929)       \
   V(_OneByteString, _substringUncheckedNative,                                 \
-      OneByteString_substringUnchecked, 25652388)                              \
-  V(_OneByteString, _setAt, OneByteString_setAt, 658941003)                    \
-  V(_OneByteString, _allocate, OneByteString_allocate, 2084097266)             \
-  V(_OneByteString, ==, OneByteString_equality, 1194175975)                    \
-  V(_TwoByteString, ==, TwoByteString_equality, 1746891238)                    \
+      OneByteString_substringUnchecked, 1527498975)                            \
+  V(_OneByteString, _setAt, OneByteString_setAt, 468605749)                    \
+  V(_OneByteString, _allocate, OneByteString_allocate, 2035417022)             \
+  V(_OneByteString, ==, OneByteString_equality, 1727047023)                    \
+  V(_TwoByteString, ==, TwoByteString_equality, 951149689)                     \
 
 
 #define CORE_INTEGER_LIB_INTRINSIC_LIST(V)                                     \
   V(_IntegerImplementation, _addFromInteger, Integer_addFromInteger,           \
-    740884607)                                                                 \
-  V(_IntegerImplementation, +, Integer_add, 1875695122)                        \
+    438687793)                                                                 \
+  V(_IntegerImplementation, +, Integer_add, 837070328)                         \
   V(_IntegerImplementation, _subFromInteger, Integer_subFromInteger,           \
-    584777821)                                                                 \
-  V(_IntegerImplementation, -, Integer_sub, 893955487)                         \
+    562800077)                                                                 \
+  V(_IntegerImplementation, -, Integer_sub, 1904782019)                        \
   V(_IntegerImplementation, _mulFromInteger, Integer_mulFromInteger,           \
-    1757603756)                                                                \
-  V(_IntegerImplementation, *, Integer_mul, 949111327)                         \
+    67891834)                                                                  \
+  V(_IntegerImplementation, *, Integer_mul, 1012952097)                        \
   V(_IntegerImplementation, _moduloFromInteger, Integer_moduloFromInteger,     \
-    1398988805)                                                                \
-  V(_IntegerImplementation, ~/, Integer_truncDivide, 1011141318)               \
-  V(_IntegerImplementation, unary-, Integer_negate, 145678255)                 \
+    93478264)                                                                  \
+  V(_IntegerImplementation, ~/, Integer_truncDivide, 724644222)                \
+  V(_IntegerImplementation, unary-, Integer_negate, 2095203689)                \
   V(_IntegerImplementation, _bitAndFromInteger,                                \
-    Integer_bitAndFromInteger, 512285096)                                      \
-  V(_IntegerImplementation, &, Integer_bitAnd, 691305985)                      \
+    Integer_bitAndFromInteger, 504496713)                                      \
+  V(_IntegerImplementation, &, Integer_bitAnd, 347192674)                      \
   V(_IntegerImplementation, _bitOrFromInteger,                                 \
-    Integer_bitOrFromInteger, 333543947)                                       \
-  V(_IntegerImplementation, |, Integer_bitOr, 76287380)                        \
+    Integer_bitOrFromInteger, 1763728073)                                      \
+  V(_IntegerImplementation, |, Integer_bitOr, 1293445202)                      \
   V(_IntegerImplementation, _bitXorFromInteger,                                \
-    Integer_bitXorFromInteger, 1746295953)                                     \
-  V(_IntegerImplementation, ^, Integer_bitXor, 1124672916)                     \
+    Integer_bitXorFromInteger, 281425907)                                      \
+  V(_IntegerImplementation, ^, Integer_bitXor, 2139935734)                     \
   V(_IntegerImplementation,                                                    \
     _greaterThanFromInteger,                                                   \
-    Integer_greaterThanFromInt, 1883218996)                                    \
-  V(_IntegerImplementation, >, Integer_greaterThan, 1356697302)                \
-  V(_IntegerImplementation, ==, Integer_equal, 1631095021)                     \
+    Integer_greaterThanFromInt, 787426822)                                     \
+  V(_IntegerImplementation, >, Integer_greaterThan, 123961041)                 \
+  V(_IntegerImplementation, ==, Integer_equal, 1423724294)                     \
   V(_IntegerImplementation, _equalToInteger, Integer_equalToInteger,           \
-    111745915)                                                                 \
-  V(_IntegerImplementation, <, Integer_lessThan, 1523713072)                   \
-  V(_IntegerImplementation, <=, Integer_lessEqualThan, 671929679)              \
-  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 1974971247)          \
-  V(_IntegerImplementation, <<, Integer_shl, 521759411)                        \
-  V(_IntegerImplementation, >>, Integer_sar, 800510700)                        \
-  V(_Double, toInt, Double_toInt, 1328149975)
+    1790821042)                                                                \
+  V(_IntegerImplementation, <, Integer_lessThan, 425560117)                    \
+  V(_IntegerImplementation, <=, Integer_lessEqualThan, 1512735828)             \
+  V(_IntegerImplementation, >=, Integer_greaterEqualThan, 668293748)           \
+  V(_IntegerImplementation, <<, Integer_shl, 34265041)                         \
+  V(_IntegerImplementation, >>, Integer_sar, 1797129864)                       \
+  V(_Double, toInt, Double_toInt, 1547535151)
 
 
 #define MATH_LIB_INTRINSIC_LIST(V)                                             \
-  V(::, sqrt, Math_sqrt, 465520247)                                            \
-  V(_Random, _nextState, Random_nextState, 1174301422)                         \
+  V(::, sqrt, Math_sqrt, 101545548)                                            \
+  V(_Random, _nextState, Random_nextState, 55890711)                           \
 
 
 #define TYPED_DATA_LIB_INTRINSIC_LIST(V)                                       \
-  V(_TypedList, get:length, TypedData_getLength, 26646119)                     \
-  V(_Int8Array, _new, TypedData_Int8Array_new, 18350202)                       \
-  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2118071523)                   \
-  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 908783182)      \
-  V(_Int16Array, _new, TypedData_Int16Array_new, 422885769)                    \
-  V(_Uint16Array, _new, TypedData_Uint16Array_new, 1401544578)                 \
-  V(_Int32Array, _new, TypedData_Int32Array_new, 204107275)                    \
-  V(_Uint32Array, _new, TypedData_Uint32Array_new, 941458944)                  \
-  V(_Int64Array, _new, TypedData_Int64Array_new, 1022695954)                   \
-  V(_Uint64Array, _new, TypedData_Uint64Array_new, 728124050)                  \
-  V(_Float32Array, _new, TypedData_Float32Array_new, 123728871)                \
-  V(_Float64Array, _new, TypedData_Float64Array_new, 311965335)                \
-  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 775330800)            \
-  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 2074077580)               \
-  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1540328543)           \
-  V(_Int8Array, ., TypedData_Int8Array_factory, 545976988)                     \
-  V(_Uint8Array, ., TypedData_Uint8Array_factory, 981297074)                   \
-  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 1617830104)    \
-  V(_Int16Array, ., TypedData_Int16Array_factory, 300928419)                   \
-  V(_Uint16Array, ., TypedData_Uint16Array_factory, 480982704)                 \
-  V(_Int32Array, ., TypedData_Int32Array_factory, 1876611964)                  \
-  V(_Uint32Array, ., TypedData_Uint32Array_factory, 1811693442)                \
-  V(_Int64Array, ., TypedData_Int64Array_factory, 958749261)                   \
-  V(_Uint64Array, ., TypedData_Uint64Array_factory, 767338823)                 \
-  V(_Float32Array, ., TypedData_Float32Array_factory, 1721244151)              \
-  V(_Float64Array, ., TypedData_Float64Array_factory, 1599078532)              \
-  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 879975401)           \
-  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 924582681)               \
-  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 1654170890)          \
-  V(_Uint8Array, [], Uint8Array_getIndexed, 738731818)                         \
-  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 2067666479)        \
+  V(_TypedList, get:length, TypedData_getLength, 522565357)                    \
+  V(_Int8Array, _new, TypedData_Int8Array_new, 1150131819)                     \
+  V(_Uint8Array, _new, TypedData_Uint8Array_new, 2019665760)                   \
+  V(_Uint8ClampedArray, _new, TypedData_Uint8ClampedArray_new, 726412668)      \
+  V(_Int16Array, _new, TypedData_Int16Array_new, 1879541015)                   \
+  V(_Uint16Array, _new, TypedData_Uint16Array_new, 189496401)                  \
+  V(_Int32Array, _new, TypedData_Int32Array_new, 1725327048)                   \
+  V(_Uint32Array, _new, TypedData_Uint32Array_new, 10306485)                   \
+  V(_Int64Array, _new, TypedData_Int64Array_new, 1299501918)                   \
+  V(_Uint64Array, _new, TypedData_Uint64Array_new, 1635318703)                 \
+  V(_Float32Array, _new, TypedData_Float32Array_new, 577737480)                \
+  V(_Float64Array, _new, TypedData_Float64Array_new, 645355686)                \
+  V(_Float32x4Array, _new, TypedData_Float32x4Array_new, 596639418)            \
+  V(_Int32x4Array, _new, TypedData_Int32x4Array_new, 496358233)                \
+  V(_Float64x2Array, _new, TypedData_Float64x2Array_new, 1506975080)           \
+  V(_Int8Array, ., TypedData_Int8Array_factory, 1499010120)                    \
+  V(_Uint8Array, ., TypedData_Uint8Array_factory, 354210806)                   \
+  V(_Uint8ClampedArray, ., TypedData_Uint8ClampedArray_factory, 231626935)     \
+  V(_Int16Array, ., TypedData_Int16Array_factory, 1044203454)                  \
+  V(_Uint16Array, ., TypedData_Uint16Array_factory, 616427808)                 \
+  V(_Int32Array, ., TypedData_Int32Array_factory, 26656923)                    \
+  V(_Uint32Array, ., TypedData_Uint32Array_factory, 297463966)                 \
+  V(_Int64Array, ., TypedData_Int64Array_factory, 105050331)                   \
+  V(_Uint64Array, ., TypedData_Uint64Array_factory, 1469861670)                \
+  V(_Float32Array, ., TypedData_Float32Array_factory, 105860920)               \
+  V(_Float64Array, ., TypedData_Float64Array_factory, 342242776)               \
+  V(_Float32x4Array, ., TypedData_Float32x4Array_factory, 1217848993)          \
+  V(_Int32x4Array, ., TypedData_Int32x4Array_factory, 100825417)               \
+  V(_Float64x2Array, ., TypedData_Float64x2Array_factory, 611308575)           \
+  V(_Uint8Array, [], Uint8Array_getIndexed, 16125140)                          \
+  V(_ExternalUint8Array, [], ExternalUint8Array_getIndexed, 1678777951)        \
 
 
 #define PROFILER_LIB_INTRINSIC_LIST(V)                                         \
-  V(_UserTag, makeCurrent, UserTag_makeCurrent, 2084603703)                    \
-  V(::, _getDefaultTag, UserTag_defaultTag, 624228668)                         \
-  V(::, _getCurrentTag, Profiler_getCurrentTag, 1559793589)                    \
+  V(_UserTag, makeCurrent, UserTag_makeCurrent, 370414636)                     \
+  V(::, _getDefaultTag, UserTag_defaultTag, 1159885970)                        \
+  V(::, _getCurrentTag, Profiler_getCurrentTag, 1182126114)                    \
 
 // TODO(srdjan): Implement _FixedSizeArrayIterator, get:current and
 //   _FixedSizeArrayIterator, moveNext.
diff --git a/runtime/vm/intrinsifier_arm.cc b/runtime/vm/intrinsifier_arm.cc
index b0dd01c..11ac497 100644
--- a/runtime/vm/intrinsifier_arm.cc
+++ b/runtime/vm/intrinsifier_arm.cc
@@ -949,9 +949,8 @@
   __ b(&fall_through, NE);
   // Receiver is Mint, return false if right is Smi.
   __ tst(R0, Operand(kSmiTagMask));
-  __ b(&fall_through, NE);
-  __ LoadObject(R0, Bool::False());
-  __ Ret();
+  __ LoadObject(R0, Bool::False(), EQ);
+  __ bx(LR, EQ);
   // TODO(srdjan): Implement Mint == Mint comparison.
 
   __ Bind(&fall_through);
@@ -1228,9 +1227,8 @@
     // Overflow is signaled with minint.
     // Check for overflow and that it fits into Smi.
     __ CompareImmediate(R0, 0xC0000000);
-    __ b(&fall_through, MI);
-    __ SmiTag(R0);
-    __ Ret();
+    __ SmiTag(R0, PL);
+    __ bx(LR, PL);
     __ Bind(&fall_through);
   }
 }
diff --git a/runtime/vm/isolate.cc b/runtime/vm/isolate.cc
index fd7ca91..e0d6df2 100644
--- a/runtime/vm/isolate.cc
+++ b/runtime/vm/isolate.cc
@@ -355,6 +355,7 @@
       last_allocationprofile_gc_timestamp_(0),
       cha_used_(false),
       object_id_ring_(NULL),
+      trace_buffer_(NULL),
       profiler_data_(NULL),
       thread_state_(NULL),
       tag_table_(GrowableObjectArray::null()),
@@ -768,6 +769,10 @@
   ASSERT(top_resource() == NULL);
   ASSERT((heap_ == NULL) || heap_->Verify());
 
+  // Remove this isolate from the list *before* we start tearing it down, to
+  // avoid exposing it in a state of decay.
+  RemoveIsolateFromList(this);
+
   // Create an area where we do have a zone and a handle scope so that we can
   // call VM functions while tearing this isolate down.
   {
@@ -811,7 +816,6 @@
   // TODO(5411455): For now just make sure there are no current isolates
   // as we are shutting down the isolate.
   SetCurrent(NULL);
-  RemoveIsolateFromList(this);
   Profiler::ShutdownProfilingForIsolate(this);
 }
 
@@ -1018,21 +1022,26 @@
 
 
 intptr_t Isolate::ProfileInterrupt() {
-  if (profiler_data() == NULL) {
+  // Other threads might be modifying these fields. Save them in locals so that
+  // we can at least trust the NULL check.
+  IsolateProfilerData* prof_data = profiler_data();
+  if (prof_data == NULL) {
     // Profiler not setup for isolate.
     return 0;
   }
-  if (profiler_data()->blocked()) {
+  if (prof_data->blocked()) {
     // Profiler blocked for this isolate.
     return 0;
   }
-  if ((debugger() != NULL) && debugger()->IsPaused()) {
+  Debugger* debug = debugger();
+  if ((debug != NULL) && debug->IsPaused()) {
     // Paused at breakpoint. Don't tick.
     return 0;
   }
-  if ((message_handler() != NULL) &&
-      (message_handler()->paused_on_start() ||
-       message_handler()->paused_on_exit())) {
+  MessageHandler* msg_handler = message_handler();
+  if ((msg_handler != NULL) &&
+      (msg_handler->paused_on_start() ||
+       msg_handler->paused_on_exit())) {
     // Paused at start / exit . Don't tick.
     return 0;
   }
diff --git a/runtime/vm/isolate.h b/runtime/vm/isolate.h
index 7dfa9bb..7770f11 100644
--- a/runtime/vm/isolate.h
+++ b/runtime/vm/isolate.h
@@ -10,11 +10,13 @@
 #include "platform/thread.h"
 #include "vm/base_isolate.h"
 #include "vm/class_table.h"
+#include "vm/counters.h"
 #include "vm/handles.h"
 #include "vm/megamorphic_cache_table.h"
 #include "vm/random.h"
 #include "vm/store_buffer.h"
 #include "vm/tags.h"
+#include "vm/trace_buffer.h"
 #include "vm/timer.h"
 
 namespace dart {
@@ -29,6 +31,7 @@
 class Debugger;
 class DeoptContext;
 class Error;
+class ExceptionHandlers;
 class Field;
 class Function;
 class GrowableObjectArray;
@@ -48,6 +51,7 @@
 class ObjectIdRing;
 class ObjectPointerVisitor;
 class ObjectStore;
+class PcDescriptors;
 class RawInstance;
 class RawArray;
 class RawContext;
@@ -87,12 +91,14 @@
   V(Class)                                                                     \
   V(Code)                                                                      \
   V(Error)                                                                     \
+  V(ExceptionHandlers)                                                         \
   V(Field)                                                                     \
   V(Function)                                                                  \
   V(GrowableObjectArray)                                                       \
   V(Instance)                                                                  \
   V(Library)                                                                   \
   V(Object)                                                                    \
+  V(PcDescriptors)                                                             \
   V(String)                                                                    \
   V(TypeArguments)                                                             \
   V(TypeParameter)                                                             \
@@ -446,6 +452,13 @@
     return object_id_ring_;
   }
 
+  void set_trace_buffer(TraceBuffer* buffer) {
+    trace_buffer_ = buffer;
+  }
+  TraceBuffer* trace_buffer() {
+    return trace_buffer_;
+  }
+
   DeoptContext* deopt_context() const { return deopt_context_; }
   void set_deopt_context(DeoptContext* value) {
     ASSERT(value == NULL || deopt_context_ == NULL);
@@ -454,7 +467,7 @@
 
   void UpdateLastAllocationProfileAccumulatorResetTimestamp() {
     last_allocationprofile_accumulator_reset_timestamp_ =
-      OS::GetCurrentTimeMillis();
+        OS::GetCurrentTimeMillis();
   }
 
   int64_t last_allocationprofile_accumulator_reset_timestamp() const {
@@ -551,6 +564,8 @@
 
   static void VisitIsolates(IsolateVisitor* visitor);
 
+  Counters* counters() { return &counters_; }
+
  private:
   Isolate();
 
@@ -618,6 +633,9 @@
   // Ring buffer of objects assigned an id.
   ObjectIdRing* object_id_ring_;
 
+  // Trace buffer support.
+  TraceBuffer* trace_buffer_;
+
   IsolateProfilerData* profiler_data_;
   Mutex profiler_data_mutex_;
   InterruptableThreadState* thread_state_;
@@ -627,6 +645,8 @@
   RawGrowableObjectArray* tag_table_;
   RawUserTag* current_tag_;
 
+  Counters counters_;
+
   // Isolate list next pointer.
   Isolate* next_;
 
diff --git a/runtime/vm/json_stream.cc b/runtime/vm/json_stream.cc
index be4abf7..2726c8a 100644
--- a/runtime/vm/json_stream.cc
+++ b/runtime/vm/json_stream.cc
@@ -216,6 +216,12 @@
 }
 
 
+void JSONStream::PrintValueNoEscape(const char* s) {
+  PrintCommaIfNeeded();
+  buffer_.Printf("%s", s);
+}
+
+
 void JSONStream::PrintfValue(const char* format, ...) {
   PrintCommaIfNeeded();
 
@@ -289,6 +295,12 @@
 }
 
 
+void JSONStream::PrintPropertyNoEscape(const char* name, const char* s) {
+  PrintPropertyName(name);
+  PrintValueNoEscape(s);
+}
+
+
 void JSONStream::PrintProperty(const char* name, const DebuggerEvent* event) {
   PrintPropertyName(name);
   PrintValue(event);
diff --git a/runtime/vm/json_stream.h b/runtime/vm/json_stream.h
index ddebaa7..08371e1 100644
--- a/runtime/vm/json_stream.h
+++ b/runtime/vm/json_stream.h
@@ -83,6 +83,7 @@
   void PrintValue64(int64_t i);
   void PrintValue(double d);
   void PrintValue(const char* s);
+  void PrintValueNoEscape(const char* s);
   void PrintfValue(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
   void PrintValue(const Object& o, bool ref = true);
   void PrintValue(SourceBreakpoint* bpt);
@@ -94,6 +95,7 @@
   void PrintProperty64(const char* name, int64_t i);
   void PrintProperty(const char* name, double d);
   void PrintProperty(const char* name, const char* s);
+  void PrintPropertyNoEscape(const char* name, const char* s);
   void PrintfProperty(const char* name, const char* format, ...)
   PRINTF_ATTRIBUTE(3, 4);
   void PrintProperty(const char* name, const Object& o, bool ref = true);
@@ -153,6 +155,9 @@
   void AddProperty(const char* name, const char* s) const {
     stream_->PrintProperty(name, s);
   }
+  void AddPropertyNoEscape(const char* name, const char* s) const {
+    stream_->PrintPropertyNoEscape(name, s);
+  }
   void AddProperty(const char* name, const Object& obj, bool ref = true) const {
     stream_->PrintProperty(name, obj, ref);
   }
diff --git a/runtime/vm/locations.h b/runtime/vm/locations.h
index 7a617a3..91ed897 100644
--- a/runtime/vm/locations.h
+++ b/runtime/vm/locations.h
@@ -472,17 +472,20 @@
   }
 
   bool ContainsRegister(Register reg) const {
-    return (cpu_registers_ & (1 << reg)) != 0;
+    return Contains(cpu_registers_, reg);
   }
 
   bool ContainsFpuRegister(FpuRegister fpu_reg) const {
-    return (fpu_registers_ & (1 << fpu_reg)) != 0;
+    return Contains(fpu_registers_, fpu_reg);
   }
 
   intptr_t CpuRegisterCount() const { return RegisterCount(cpu_registers_); }
   intptr_t FpuRegisterCount() const { return RegisterCount(fpu_registers_); }
 
   static intptr_t RegisterCount(intptr_t registers);
+  static bool Contains(intptr_t register_set, intptr_t reg) {
+    return (register_set & (1 << reg)) != 0;
+  }
 
   intptr_t cpu_registers() const { return cpu_registers_; }
   intptr_t fpu_registers() const { return fpu_registers_; }
diff --git a/runtime/vm/memory_region.h b/runtime/vm/memory_region.h
index 25ef768..eaa5221 100644
--- a/runtime/vm/memory_region.h
+++ b/runtime/vm/memory_region.h
@@ -6,6 +6,7 @@
 #define VM_MEMORY_REGION_H_
 
 #include "platform/assert.h"
+#include "vm/allocation.h"
 #include "vm/globals.h"
 
 namespace dart {
@@ -13,10 +14,16 @@
 // Memory regions are useful for accessing memory with bounds check in
 // debug mode. They can be safely passed by value and do not assume ownership
 // of the region.
-class MemoryRegion {
+class MemoryRegion : public ValueObject {
  public:
   MemoryRegion() : pointer_(NULL), size_(0) { }
   MemoryRegion(void* pointer, uword size) : pointer_(pointer), size_(size) { }
+  MemoryRegion(const MemoryRegion& other) : ValueObject() { *this = other; }
+  MemoryRegion& operator=(const MemoryRegion& other) {
+    pointer_ = other.pointer_;
+    size_ = other.size_;
+    return *this;
+  }
 
   void* pointer() const { return pointer_; }
   uword size() const { return size_; }
@@ -68,8 +75,6 @@
 
   void* pointer_;
   uword size_;
-
-  DISALLOW_COPY_AND_ASSIGN(MemoryRegion);
 };
 
 }  // namespace dart
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index d42e4b2..4e085ac 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -32,10 +32,10 @@
 #include "vm/heap.h"
 #include "vm/intermediate_language.h"
 #include "vm/intrinsifier.h"
-#include "vm/longjump.h"
 #include "vm/object_id_ring.h"
 #include "vm/object_store.h"
 #include "vm/parser.h"
+#include "vm/report.h"
 #include "vm/reusable_handles.h"
 #include "vm/runtime_entry.h"
 #include "vm/scopes.h"
@@ -225,16 +225,20 @@
   String& segment = String::Handle();
   intptr_t start_pos = 0;
   for (intptr_t i = 0; i < name.Length(); i++) {
-    if (name.CharAt(i) == '@') {
+    if (name.CharAt(i) == '@' &&
+        (i+1) < name.Length() &&
+        (name.CharAt(i+1) >= '0') &&
+        (name.CharAt(i+1) <= '9')) {
       // Append the current segment to the unmangled name.
       segment = String::SubString(name, start_pos, (i - start_pos));
       unmangled_name = String::Concat(unmangled_name, segment);
 
-      // Advance until past the name mangling.
+      // Advance until past the name mangling. The private keys are only
+      // numbers so we skip until the first non-number.
       i++;  // Skip the '@'.
       while ((i < name.Length()) &&
-             (name.CharAt(i) != '&') &&
-             (name.CharAt(i) != '.')) {
+             (name.CharAt(i) >= '0') &&
+             (name.CharAt(i) <= '9')) {
         i++;
       }
       start_pos = i;
@@ -702,11 +706,11 @@
   String& error_str = String::Handle();
   error_str = String::New("SnapshotWriter Error", Heap::kOld);
   *snapshot_writer_error_ = LanguageError::New(error_str,
-                                               LanguageError::kError,
+                                               Report::kError,
                                                Heap::kOld);
   error_str = String::New("Branch offset overflow", Heap::kOld);
   *branch_offset_error_ = LanguageError::New(error_str,
-                                             LanguageError::kBailout,
+                                             Report::kBailout,
                                              Heap::kOld);
 
   ASSERT(!null_object_->IsSmi());
@@ -1025,6 +1029,7 @@
       Library::Handle(isolate, Library::LookupLibrary(Symbols::DartIsolate()));
   if (isolate_lib.IsNull()) {
     isolate_lib = Library::NewLibraryHelper(Symbols::DartIsolate(), true);
+    isolate_lib.SetLoadRequested();
     isolate_lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kIsolate,
                                                    isolate_lib);
@@ -1153,6 +1158,7 @@
   lib = Library::LookupLibrary(Symbols::DartMirrors());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kMirrors,
                                                    lib);
@@ -1168,6 +1174,7 @@
   lib = Library::LookupLibrary(Symbols::DartProfiler());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartProfiler(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kProfiler,
                                                    lib);
@@ -1191,6 +1198,7 @@
   lib = Library::LookupLibrary(Symbols::DartTypedData());
   if (lib.IsNull()) {
     lib = Library::NewLibraryHelper(Symbols::DartTypedData(), true);
+    lib.SetLoadRequested();
     lib.Register();
     isolate->object_store()->set_bootstrap_library(ObjectStore::kTypedData,
                                                    lib);
@@ -1364,6 +1372,30 @@
   // Set up recognized state of all functions (core, math and typed data).
   MethodRecognizer::InitializeState();
 
+  // Adds static const fields (class ids) to the class 'ClassID');
+  lib = Library::LookupLibrary(Symbols::DartInternal());
+  ASSERT(!lib.IsNull());
+  cls = lib.LookupClassAllowPrivate(Symbols::ClassID());
+  ASSERT(!cls.IsNull());
+  Field& field = Field::Handle(isolate);
+  Smi& value = Smi::Handle(isolate);
+  String& field_name = String::Handle(isolate);
+
+#define CLASS_LIST_WITH_NULL(V)                                                \
+  V(Null)                                                                      \
+  CLASS_LIST_NO_OBJECT(V)
+
+#define ADD_SET_FIELD(clazz)                                                   \
+  field_name = Symbols::New("cid"#clazz);                                      \
+  field = Field::New(field_name, true, false, true, cls, 0);                   \
+  value = Smi::New(k##clazz##Cid);                                             \
+  field.set_value(value);                                                      \
+  field.set_type(Type::Handle(Type::IntType()));                               \
+  cls.AddField(field);                                                         \
+
+  CLASS_LIST_WITH_NULL(ADD_SET_FIELD)
+#undef ADD_SET_FIELD
+
   return Error::null();
 }
 
@@ -1564,7 +1596,7 @@
     // into dart code or allocating any code.
     const Instance& exception =
         Instance::Handle(isolate->object_store()->out_of_memory());
-    Exceptions::Throw(exception);
+    Exceptions::Throw(isolate, exception);
     UNREACHABLE();
   }
   if (space == Heap::kNew) {
@@ -1759,17 +1791,12 @@
 
 
 static void ReportTooManyTypeArguments(const Class& cls) {
-  const Error& error = Error::Handle(
-      LanguageError::NewFormatted(
-          Error::Handle(),  // No previous error.
-          Script::Handle(cls.script()),
-          cls.token_pos(),
-          LanguageError::kError,
-          Heap::kNew,
-          "too many type parameters declared in class '%s' or in its "
-          "super classes",
-          String::Handle(cls.Name()).ToCString()));
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+  Report::MessageF(Report::kError,
+                   Script::Handle(cls.script()),
+                   cls.token_pos(),
+                   "too many type parameters declared in class '%s' or in its "
+                   "super classes",
+                   String::Handle(cls.Name()).ToCString());
   UNREACHABLE();
 }
 
@@ -2515,6 +2542,7 @@
         function.SwitchToUnoptimizedCode();
       } else if (function.unoptimized_code() == code.raw()) {
         ReportSwitchingCode(code);
+        function.ClearICData();
         // Remove the code object from the function. The next time the
         // function is invoked, it will be compiled again.
         function.ClearCode();
@@ -2523,12 +2551,13 @@
         if (!CodePatcher::IsEntryPatched(code)) {
           CodePatcher::PatchEntry(code);
         }
-      } else if (!function.HasCode() && (code.GetEntryPatchPc() != 0)) {
-        // The code has already been disconnected, make it invalid. Do not
-        // bother with OSR compiled code that has no valid entry-patch.
-        ReportSwitchingCode(code);
-        if (!CodePatcher::IsEntryPatched(code)) {
-          CodePatcher::PatchEntry(code);
+      } else {
+        // Make non-OSR code non-entrant.
+        if (code.GetEntryPatchPc() != 0) {
+          if (!CodePatcher::IsEntryPatched(code)) {
+            ReportSwitchingCode(code);
+            CodePatcher::PatchEntry(code);
+          }
         }
       }
     }
@@ -2643,7 +2672,7 @@
           *error,  // No previous error.
           Script::Handle(patch.script()),
           func.token_pos(),
-          LanguageError::kError,
+          Report::kError,
           Heap::kNew,
           "signature mismatch: '%s'", member_name.ToCString());
       return false;
@@ -2688,7 +2717,7 @@
           *error,  // No previous error.
           Script::Handle(patch.script()),
           field.token_pos(),
-          LanguageError::kError,
+          Report::kError,
           Heap::kNew,
           "duplicate field: %s", member_name.ToCString());
       return false;
@@ -2790,7 +2819,7 @@
   ASSERT(isolate != NULL);
   const Error& error = Error::Handle(isolate, Compiler::CompileClass(*this));
   if (!error.IsNull() && (isolate->long_jump_base() != NULL)) {
-    isolate->long_jump_base()->Jump(1, error);
+    Report::LongJump(error);
     UNREACHABLE();
   }
   return error.raw();
@@ -4062,7 +4091,7 @@
     ClassTable* class_table = Isolate::Current()->class_table();
     const ClassHeapStats* stats = class_table->StatsWithUpdatedSize(id());
     if (stats != NULL) {
-     JSONObject allocation_stats(&jsobj, "allocationStats");
+      JSONObject allocation_stats(&jsobj, "allocationStats");
       stats->PrintToJSONObject(*this, &allocation_stats);
     }
   }
@@ -4684,7 +4713,7 @@
 RawAbstractType** TypeArguments::TypeAddr(intptr_t index) const {
   // TODO(iposva): Determine if we should throw an exception here.
   ASSERT((index >= 0) && (index < Length()));
-  return &raw_ptr()->types_[index];
+  return &raw_ptr()->types()[index];
 }
 
 
@@ -5754,7 +5783,7 @@
         *bound_error,  // A bound error if non null.
         Script::Handle(other.script()),
         other.token_pos(),
-        LanguageError::kError,
+        Report::kError,
         Heap::kNew,
         "signature type '%s' of function '%s' is not a subtype of signature "
         "type '%s' of function '%s'",
@@ -6016,6 +6045,7 @@
   clone.set_deoptimization_counter(0);
   clone.set_optimized_instruction_count(0);
   clone.set_optimized_call_site_count(0);
+  clone.set_ic_data_array(Array::Handle());
   return clone.raw();
 }
 
@@ -6415,6 +6445,64 @@
 }
 
 
+void Function::SaveICDataMap(
+    const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data) const {
+  // Compute number of ICData objectsto save.
+  intptr_t count = 0;
+  for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) {
+    if (deopt_id_to_ic_data[i] != NULL) {
+      count++;
+    }
+  }
+
+  const Array& a = Array::Handle(Array::New(count, Heap::kOld));
+  count = 0;
+  for (intptr_t i = 0; i < deopt_id_to_ic_data.length(); i++) {
+    if (deopt_id_to_ic_data[i] != NULL) {
+      a.SetAt(count++, *deopt_id_to_ic_data[i]);
+    }
+  }
+  set_ic_data_array(a);
+}
+
+
+void Function::RestoreICDataMap(
+    ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const {
+  Isolate* isolate = Isolate::Current();
+  const Array& saved_icd = Array::Handle(isolate, ic_data_array());
+  if (saved_icd.Length() == 0) {
+    deopt_id_to_ic_data->Clear();
+    return;;
+  }
+  ICData& icd = ICData::Handle();
+  icd ^= saved_icd.At(saved_icd.Length() - 1);
+  const intptr_t len = icd.deopt_id() + 1;
+  deopt_id_to_ic_data->SetLength(len);
+  for (intptr_t i = 0; i < len; i++) {
+    (*deopt_id_to_ic_data)[i] = NULL;
+  }
+  for (intptr_t i = 0; i < saved_icd.Length(); i++) {
+    ICData& icd = ICData::ZoneHandle(isolate);
+    icd ^= saved_icd.At(i);
+    (*deopt_id_to_ic_data)[icd.deopt_id()] = &icd;
+  }
+}
+
+
+void Function::set_ic_data_array(const Array& value) const {
+  StorePointer(&raw_ptr()->ic_data_array_, value.raw());
+}
+
+
+RawArray* Function::ic_data_array() const {
+  return raw_ptr()->ic_data_array_;
+}
+
+void Function::ClearICData() const {
+  set_ic_data_array(Array::Handle());
+}
+
+
 bool Function::CheckSourceFingerprint(int32_t fp) const {
   if (SourceFingerprint() != fp) {
     const bool recalculatingFingerprints = false;
@@ -7822,12 +7910,15 @@
 
 
 RawGrowableObjectArray* Script::GenerateLineNumberArray() const {
+  Isolate* isolate = Isolate::Current();
   const GrowableObjectArray& info =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  const String& source = String::Handle(Source());
+      GrowableObjectArray::Handle(isolate, GrowableObjectArray::New());
+  const String& source = String::Handle(isolate, Source());
   const String& key = Symbols::Empty();
-  const Object& line_separator = Object::Handle();
-  const TokenStream& tkns = TokenStream::Handle(tokens());
+  const Object& line_separator = Object::Handle(isolate);
+  const TokenStream& tkns = TokenStream::Handle(isolate, tokens());
+  Smi& value = Smi::Handle(isolate);
+  String& tokenValue = String::Handle(isolate);
   ASSERT(!tkns.IsNull());
   TokenStream::Iterator tkit(tkns, 0, TokenStream::Iterator::kAllTokens);
   int current_line = -1;
@@ -7865,7 +7956,7 @@
           (s.current_token().kind == Token::kINTERPOL_VAR ||
            s.current_token().kind == Token::kINTERPOL_START) &&
           tkit.CurrentTokenKind() == Token::kSTRING) {
-        const String& tokenValue = String::Handle(tkit.CurrentLiteral());
+        tokenValue = tkit.CurrentLiteral();
         if (tokenValue.Length() == 0) {
           tkit.Advance();
         }
@@ -7877,19 +7968,22 @@
     if (token_line != current_line) {
       // emit line
       info.Add(line_separator);
-      info.Add(Smi::Handle(Smi::New(token_line + line_offset())));
+      value = Smi::New(token_line + line_offset());
+      info.Add(value);
       current_line = token_line;
     }
     // TODO(hausner): Could optimize here by not reporting tokens
     // that will never be a location used by the debugger, e.g.
     // braces, semicolons, most keywords etc.
-    info.Add(Smi::Handle(Smi::New(tkit.CurrentPosition())));
+    value = Smi::New(tkit.CurrentPosition());
+    info.Add(value);
     int column = s.current_token().position.column;
     // On the first line of the script we must add the column offset.
     if (token_line == 1) {
       column += col_offset();
     }
-    info.Add(Smi::Handle(Smi::New(column)));
+    value = Smi::New(column);
+    info.Add(value);
     tkit.Advance();
     s.Scan();
   }
@@ -8213,6 +8307,54 @@
 }
 
 
+RawLibrary* Script::FindLibrary() const {
+  Isolate* isolate = Isolate::Current();
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      isolate, isolate->object_store()->libraries());
+  Library& lib = Library::Handle();
+  Script& script = Script::Handle();
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    ASSERT(!lib.IsNull());
+    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+    ASSERT(!loaded_scripts.IsNull());
+    for (intptr_t j = 0; j < loaded_scripts.Length(); j++) {
+      script ^= loaded_scripts.At(j);
+      ASSERT(!script.IsNull());
+      if (script.raw() == raw()) {
+        return lib.raw();
+      }
+    }
+  }
+  return Library::null();
+}
+
+
+RawScript* Script::FindByUrl(const String& url) {
+  Isolate* isolate = Isolate::Current();
+  const GrowableObjectArray& libs = GrowableObjectArray::Handle(
+      isolate, isolate->object_store()->libraries());
+  Library& lib = Library::Handle();
+  Script& script = Script::Handle();
+  String& script_url = String::Handle();
+  for (intptr_t i = 0; i < libs.Length(); i++) {
+    lib ^= libs.At(i);
+    ASSERT(!lib.IsNull());
+    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
+    ASSERT(!loaded_scripts.IsNull());
+    for (intptr_t j = 0; j < loaded_scripts.Length(); j++) {
+      script ^= loaded_scripts.At(j);
+      ASSERT(!script.IsNull());
+      script_url ^= script.url();
+      if (script_url.Equals(url)) {
+        return script.raw();
+      }
+    }
+  }
+  return Script::null();
+}
+
+
 DictionaryIterator::DictionaryIterator(const Library& library)
     : array_(Array::Handle(library.dictionary())),
       // Last element in array is a Smi indicating the number of entries used.
@@ -8312,22 +8454,29 @@
 
 
 void Library::SetLoadInProgress() const {
-  // Should not be already loaded.
-  ASSERT(raw_ptr()->load_state_ == RawLibrary::kAllocated);
+  // Must not already be in the process of being loaded.
+  ASSERT(raw_ptr()->load_state_ <= RawLibrary::kLoadRequested);
   raw_ptr()->load_state_ = RawLibrary::kLoadInProgress;
 }
 
 
+void Library::SetLoadRequested() const {
+  // Must not be already loaded.
+  ASSERT(raw_ptr()->load_state_ == RawLibrary::kAllocated);
+  raw_ptr()->load_state_ = RawLibrary::kLoadRequested;
+}
+
+
 void Library::SetLoaded() const {
   // Should not be already loaded or just allocated.
-  ASSERT(LoadInProgress());
+  ASSERT(LoadInProgress() || LoadRequested());
   raw_ptr()->load_state_ = RawLibrary::kLoaded;
 }
 
 
 void Library::SetLoadError() const {
   // Should not be already loaded or just allocated.
-  ASSERT(LoadInProgress());
+  ASSERT(LoadInProgress() || LoadRequested());
   raw_ptr()->load_state_ = RawLibrary::kLoadError;
 }
 
@@ -9194,6 +9343,7 @@
   const String& core_lib_url = Symbols::DartCore();
   const Library& core_lib =
       Library::Handle(Library::NewLibraryHelper(core_lib_url, false));
+  core_lib.SetLoadRequested();
   core_lib.Register();
   isolate->object_store()->set_bootstrap_library(ObjectStore::kCore, core_lib);
   isolate->object_store()->set_root_library(Library::Handle());
@@ -9231,7 +9381,9 @@
       Library::NewLibraryHelper(native_flds_lib_url, false));
   const String& native_flds_lib_name = Symbols::DartNativeWrappersLibName();
   native_flds_lib.SetName(native_flds_lib_name);
+  native_flds_lib.SetLoadRequested();
   native_flds_lib.Register();
+  native_flds_lib.SetLoadInProgress();
   isolate->object_store()->set_native_wrappers_library(native_flds_lib);
   static const char* const kNativeWrappersClass = "NativeFieldWrapperClass";
   static const int kNameLength = 25;
@@ -9247,6 +9399,7 @@
     cls_name = Symbols::New(name_buffer);
     Class::NewNativeWrapper(native_flds_lib, cls_name, fld_cnt);
   }
+  native_flds_lib.SetLoaded();
 }
 
 
@@ -9308,13 +9461,14 @@
 
 void Library::AllocatePrivateKey() const {
   const String& url = String::Handle(this->url());
-  intptr_t key_value = url.Hash();
-  while (Library::IsKeyUsed(key_value)) {
-    key_value++;
+  intptr_t key_value = url.Hash() & kIntptrMax;
+  while ((key_value == 0) || Library::IsKeyUsed(key_value)) {
+    key_value = (key_value + 1) & kIntptrMax;
   }
+  ASSERT(key_value > 0);
   char private_key[32];
   OS::SNPrint(private_key, sizeof(private_key),
-              "%c%#" Px "", kPrivateKeySeparator, key_value);
+              "%c%" Pd "", kPrivateKeySeparator, key_value);
   StorePointer(&raw_ptr()->private_key_, String::New(private_key, Heap::kOld));
 }
 
@@ -9614,14 +9768,38 @@
 }
 
 
-void LibraryPrefix::LoadLibrary() const {
+bool LibraryPrefix::LoadLibrary() const {
   // Non-deferred prefixes are loaded.
   ASSERT(is_deferred_load() || is_loaded());
   if (is_loaded()) {
-    return;
+    return true;  // Load request has already completed.
   }
-  InvalidateDependentCode();
-  set_is_loaded();
+  ASSERT(is_deferred_load());
+  ASSERT(num_imports() == 1);
+  // This is a prefix for a deferred library. If the library is not loaded
+  // yet and isn't being loaded, call the library tag handler to schedule
+  // loading. Once all outstanding load requests have completed, the embedder
+  // will call the core library to:
+  // - invalidate dependent code of this prefix;
+  // - mark this prefixes as loaded;
+  // - complete the future associated with this prefix.
+  const Library& deferred_lib = Library::Handle(GetLibrary(0));
+  if (deferred_lib.Loaded()) {
+    this->set_is_loaded();
+    return true;
+  } else if (deferred_lib.LoadNotStarted()) {
+    deferred_lib.SetLoadRequested();
+    Isolate* isolate = Isolate::Current();
+    const String& lib_url = String::Handle(isolate, deferred_lib.url());
+    Dart_LibraryTagHandler handler = isolate->library_tag_handler();
+    handler(Dart_kImportTag,
+            Api::NewHandle(isolate, importer()),
+            Api::NewHandle(isolate, lib_url.raw()));
+  } else {
+    // Another load request is in flight.
+    ASSERT(deferred_lib.LoadRequested());
+  }
+  return false;  // Load request not yet completed.
 }
 
 
@@ -9655,7 +9833,7 @@
 
   virtual void ReportSwitchingCode(const Code& code) {
     if (FLAG_trace_deoptimization || FLAG_trace_deoptimization_verbose) {
-      OS::PrintErr("Prefix '%s': deleting %s code for %s function '%s'\n",
+      OS::PrintErr("Prefix '%s': disabling %s code for %s function '%s'\n",
         String::Handle(prefix_.name()).ToCString(),
         code.is_optimized() ? "optimized" : "unoptimized",
         CodePatcher::IsEntryPatched(code) ? "patched" : "unpatched",
@@ -9680,6 +9858,7 @@
 void LibraryPrefix::InvalidateDependentCode() const {
   PrefixDependentArray a(*this);
   a.DisableCode();
+  set_is_loaded();
 }
 
 
@@ -9695,10 +9874,12 @@
 
 RawLibraryPrefix* LibraryPrefix::New(const String& name,
                                      const Namespace& import,
-                                     bool deferred_load) {
+                                     bool deferred_load,
+                                     const Library& importer) {
   const LibraryPrefix& result = LibraryPrefix::Handle(LibraryPrefix::New());
   result.set_name(name);
   result.set_num_imports(0);
+  result.set_importer(importer);
   result.raw_ptr()->is_deferred_load_ = deferred_load;
   result.raw_ptr()->is_loaded_ = !deferred_load;
   result.set_imports(Array::Handle(Array::New(kInitialSize)));
@@ -9724,6 +9905,11 @@
 }
 
 
+void LibraryPrefix::set_importer(const Library& value) const {
+  StorePointer(&raw_ptr()->importer_, value.raw());
+}
+
+
 const char* LibraryPrefix::ToCString() const {
   const char* kFormat = "LibraryPrefix:'%s'";
   const String& prefix = String::Handle(name());
@@ -10070,56 +10256,6 @@
 }
 
 
-uword PcDescriptors::PC(intptr_t index) const {
-  return static_cast<uword>(*(EntryAddr(index, kPcEntry)));
-}
-
-
-void PcDescriptors::SetPC(intptr_t index, uword value) const {
-  *(EntryAddr(index, kPcEntry)) = static_cast<intptr_t>(value);
-}
-
-
-PcDescriptors::Kind PcDescriptors::DescriptorKind(intptr_t index) const {
-  return static_cast<PcDescriptors::Kind>(*(EntryAddr(index, kKindEntry)));
-}
-
-
-void PcDescriptors::SetKind(intptr_t index, PcDescriptors::Kind value) const {
-  *(EntryAddr(index, kKindEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::DeoptId(intptr_t index) const {
-  return *(EntryAddr(index, kDeoptIdEntry));
-}
-
-
-void PcDescriptors::SetDeoptId(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kDeoptIdEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::TokenPos(intptr_t index) const {
-  return *(EntryAddr(index, kTokenPosEntry));
-}
-
-
-void PcDescriptors::SetTokenPos(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kTokenPosEntry)) = value;
-}
-
-
-intptr_t PcDescriptors::TryIndex(intptr_t index) const {
-  return *(EntryAddr(index, kTryIndexEntry));
-}
-
-
-void PcDescriptors::SetTryIndex(intptr_t index, intptr_t value) const {
-  *(EntryAddr(index, kTryIndexEntry)) = value;
-}
-
-
 RawPcDescriptors* PcDescriptors::New(intptr_t num_descriptors) {
   ASSERT(Object::pc_descriptors_class() != Class::null());
   if (num_descriptors < 0 || num_descriptors > kMaxElements) {
@@ -10148,7 +10284,6 @@
     case PcDescriptors::kOptStaticCall:   return "opt-call     ";
     case PcDescriptors::kUnoptStaticCall: return "unopt-call   ";
     case PcDescriptors::kClosureCall:     return "closure-call ";
-    case PcDescriptors::kReturn:          return "return       ";
     case PcDescriptors::kRuntimeCall:     return "runtime-call ";
     case PcDescriptors::kOsrEntry:        return "osr-entry    ";
     case PcDescriptors::kOther:           return "other        ";
@@ -10289,7 +10424,7 @@
   int byte_index = bit_index >> kBitsPerByteLog2;
   int bit_remainder = bit_index & (kBitsPerByte - 1);
   uint8_t byte_mask = 1U << bit_remainder;
-  uint8_t byte = raw_ptr()->data_[byte_index];
+  uint8_t byte = raw_ptr()->data()[byte_index];
   return (byte & byte_mask);
 }
 
@@ -10299,7 +10434,7 @@
   int byte_index = bit_index >> kBitsPerByteLog2;
   int bit_remainder = bit_index & (kBitsPerByte - 1);
   uint8_t byte_mask = 1U << bit_remainder;
-  uint8_t* byte_addr = &(raw_ptr()->data_[byte_index]);
+  uint8_t* byte_addr = &(raw_ptr()->data()[byte_index]);
   if (value) {
     *byte_addr |= byte_mask;
   } else {
@@ -10395,14 +10530,14 @@
   const Array& names = Array::Handle(raw_ptr()->names_);
   ASSERT(Length() == names.Length());
   names.SetAt(var_index, name);
-  raw_ptr()->data_[var_index] = *info;
+  raw_ptr()->data()[var_index] = *info;
 }
 
 
 void LocalVarDescriptors::GetInfo(intptr_t var_index,
                                   RawLocalVarDescriptors::VarInfo* info) const {
   ASSERT(var_index < Length());
-  *info = raw_ptr()->data_[var_index];
+  *info = raw_ptr()->data()[var_index];
 }
 
 
@@ -10548,7 +10683,7 @@
                                        bool needs_stacktrace,
                                        bool has_catch_all) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data_[try_index];
+  RawExceptionHandlers::HandlerInfo* info = &raw_ptr()->data()[try_index];
   info->outer_try_index = outer_try_index;
   info->handler_pc = handler_pc;
   info->needs_stacktrace = needs_stacktrace;
@@ -10560,31 +10695,31 @@
     RawExceptionHandlers::HandlerInfo* info) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
   ASSERT(info != NULL);
-  *info = raw_ptr()->data_[try_index];
+  *info = raw_ptr()->data()[try_index];
 }
 
 
 intptr_t ExceptionHandlers::HandlerPC(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].handler_pc;
+  return raw_ptr()->data()[try_index].handler_pc;
 }
 
 
 intptr_t ExceptionHandlers::OuterTryIndex(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].outer_try_index;
+  return raw_ptr()->data()[try_index].outer_try_index;
 }
 
 
 bool ExceptionHandlers::NeedsStacktrace(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].needs_stacktrace;
+  return raw_ptr()->data()[try_index].needs_stacktrace;
 }
 
 
 bool ExceptionHandlers::HasCatchAll(intptr_t try_index) const {
   ASSERT((try_index >= 0) && (try_index < Length()));
-  return raw_ptr()->data_[try_index].has_catch_all;
+  return raw_ptr()->data()[try_index].has_catch_all;
 }
 
 
@@ -11942,54 +12077,6 @@
 }
 
 
-intptr_t Code::ExtractIcDataArraysAtCalls(
-    GrowableArray<intptr_t>* node_ids,
-    const GrowableObjectArray& ic_data_objs) const {
-  ASSERT(node_ids != NULL);
-  ASSERT(!ic_data_objs.IsNull());
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(this->pc_descriptors());
-  ICData& ic_data_obj = ICData::Handle();
-  intptr_t max_id = -1;
-  for (intptr_t i = 0; i < descriptors.Length(); i++) {
-    PcDescriptors::Kind kind = descriptors.DescriptorKind(i);
-    if ((kind == PcDescriptors::kIcCall) ||
-        (kind == PcDescriptors::kUnoptStaticCall)) {
-      intptr_t deopt_id = descriptors.DeoptId(i);
-      if (deopt_id > max_id) {
-        max_id = deopt_id;
-      }
-      node_ids->Add(deopt_id);
-      uword ret_addr = descriptors.PC(i);
-      if (kind == PcDescriptors::kIcCall) {
-        CodePatcher::GetInstanceCallAt(ret_addr, *this, &ic_data_obj);
-      } else {
-        CodePatcher::GetUnoptimizedStaticCallAt(ret_addr, *this, &ic_data_obj);
-      }
-      ic_data_objs.Add(ic_data_obj);
-    }
-  }
-  return max_id;
-}
-
-
-RawArray* Code::ExtractTypeFeedbackArray() const {
-  ASSERT(!IsNull() && !is_optimized());
-  GrowableArray<intptr_t> deopt_ids;
-  const GrowableObjectArray& ic_data_objs =
-      GrowableObjectArray::Handle(GrowableObjectArray::New());
-  const intptr_t max_id =
-      ExtractIcDataArraysAtCalls(&deopt_ids, ic_data_objs);
-  const Array& result = Array::Handle(Array::New(max_id + 1));
-  for (intptr_t i = 0; i < deopt_ids.length(); i++) {
-    intptr_t result_index = deopt_ids[i];
-    ASSERT(result.At(result_index) == Object::null());
-    result.SetAt(result_index, Object::Handle(ic_data_objs.At(i)));
-  }
-  return result.raw();
-}
-
-
 RawStackmap* Code::GetStackmap(uword pc, Array* maps, Stackmap* map) const {
   // This code is used during iterating frames during a GC and hence it
   // should not in turn start a GC.
@@ -12484,7 +12571,7 @@
 RawLanguageError* LanguageError::NewFormattedV(const Error& prev_error,
                                                const Script& script,
                                                intptr_t token_pos,
-                                               Kind kind,
+                                               Report::Kind kind,
                                                Heap::Space space,
                                                const char* format,
                                                va_list args) {
@@ -12509,7 +12596,7 @@
 RawLanguageError* LanguageError::NewFormatted(const Error& prev_error,
                                               const Script& script,
                                               intptr_t token_pos,
-                                              Kind kind,
+                                              Report::Kind kind,
                                               Heap::Space space,
                                               const char* format, ...) {
   va_list args;
@@ -12523,7 +12610,7 @@
 
 
 RawLanguageError* LanguageError::New(const String& formatted_message,
-                                     Kind kind,
+                                     Report::Kind kind,
                                      Heap::Space space) {
   ASSERT(Object::language_error_class() != Class::null());
   LanguageError& result = LanguageError::Handle();
@@ -12575,68 +12662,16 @@
   if (formatted_message() != String::null()) {
     return formatted_message();
   }
-  const char* message_header;
-  switch (kind()) {
-    case kWarning: message_header = "warning"; break;
-    case kError: message_header = "error"; break;
-    case kMalformedType: message_header = "malformed type"; break;
-    case kMalboundedType: message_header = "malbounded type"; break;
-    case kBailout: message_header = "bailout"; break;
-    default: message_header = ""; UNREACHABLE();
-  }
-  String& result = String::Handle();
-  String& msg = String::Handle(message());
-  const Script& scr = Script::Handle(script());
-  if (!scr.IsNull()) {
-    const String& script_url = String::Handle(scr.url());
-    if (token_pos() >= 0) {
-      intptr_t line, column;
-      scr.GetTokenLocation(token_pos(), &line, &column);
-      // Only report the line position if we have the original source. We still
-      // need to get a valid column so that we can report the ^ mark below the
-      // snippet.
-      if (scr.HasSource()) {
-        result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line,
-                                      column);
-      } else {
-        result = String::NewFormatted("'%s': %s: line %" Pd ": ",
-                                      script_url.ToCString(),
-                                      message_header,
-                                      line);
-      }
-      // Append the formatted error or warning message.
-      result = String::Concat(result, msg);
-      // Append the source line.
-      const String& script_line = String::Handle(scr.GetLine(line));
-      ASSERT(!script_line.IsNull());
-      result = String::Concat(result, Symbols::NewLine());
-      result = String::Concat(result, script_line);
-      result = String::Concat(result, Symbols::NewLine());
-      // Append the column marker.
-      const String& column_line = String::Handle(
-          String::NewFormatted("%*s\n", static_cast<int>(column), "^"));
-      result = String::Concat(result, column_line);
-    } else {
-      // Token position is unknown.
-      result = String::NewFormatted("'%s': %s: ",
-                                    script_url.ToCString(),
-                                    message_header);
-      result = String::Concat(result, msg);
-    }
-  } else {
-    // Script is unknown.
-    // Append the formatted error or warning message.
-    result = String::NewFormatted("%s: ", message_header);
-    result = String::Concat(result, msg);
-  }
+  String& result = String::Handle(
+      Report::PrependSnippet(kind(),
+                             Script::Handle(script()),
+                             token_pos(),
+                             String::Handle(message())));
   // Prepend previous error message.
   const Error& prev_error = Error::Handle(previous_error());
   if (!prev_error.IsNull()) {
-    msg = String::New(prev_error.ToErrorCString());
-    result = String::Concat(msg, result);
+    result = String::Concat(
+        String::Handle(String::New(prev_error.ToErrorCString())), result);
   }
   set_formatted_message(result);
   return result.raw();
@@ -13056,13 +13091,7 @@
     return Integer::Cast(*this).Equals(other);
   }
   if (IsDouble() && other.IsDouble()) {
-    if (Double::Cast(*this).CanonicalizeEquals(other)) return true;
-    // Check for NaN.
-    const Double& a_double = Double::Cast(*this);
-    const Double& b_double = Double::Cast(other);
-    if (isnan(a_double.value()) && isnan(b_double.value())) {
-      return true;
-    }
+    return Double::Cast(*this).CanonicalizeEquals(other);
   }
   return false;
 }
@@ -13075,7 +13104,7 @@
   if (native_fields == TypedData::null()) {
     return NULL;
   }
-  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data_);
+  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data());
 }
 
 
@@ -13092,6 +13121,23 @@
 }
 
 
+void Instance::SetNativeFields(uint16_t num_native_fields,
+                               const intptr_t* field_values) const {
+  ASSERT(num_native_fields == NumNativeFields());
+  ASSERT(field_values != NULL);
+  Object& native_fields = Object::Handle(*NativeFieldsAddr());
+  if (native_fields.IsNull()) {
+    // Allocate backing storage for the native fields.
+    native_fields = TypedData::New(kIntPtrCid, NumNativeFields());
+    StorePointer(NativeFieldsAddr(), native_fields.raw());
+  }
+  for (uint16_t i = 0; i < num_native_fields; i++) {
+    intptr_t byte_offset = i * sizeof(intptr_t);
+    TypedData::Cast(native_fields).SetIntPtr(byte_offset, field_values[i]);
+  }
+}
+
+
 bool Instance::IsClosure() const {
   const Class& cls = Class::Handle(clazz());
   return cls.IsSignatureClass();
@@ -13897,7 +13943,7 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  return type_error.kind() == LanguageError::kMalformedType;
+  return type_error.kind() == Report::kMalformedType;
 }
 
 
@@ -13909,7 +13955,7 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  return type_error.kind() == LanguageError::kMalboundedType;
+  return type_error.kind() == Report::kMalboundedType;
 }
 
 
@@ -13918,10 +13964,10 @@
     return false;
   }
   const LanguageError& type_error = LanguageError::Handle(error());
-  if (type_error.kind() == LanguageError::kMalformedType) {
+  if (type_error.kind() == Report::kMalformedType) {
     return true;
   }
-  ASSERT(type_error.kind() == LanguageError::kMalboundedType);
+  ASSERT(type_error.kind() == Report::kMalboundedType);
   return FLAG_enable_type_checks;
 }
 
@@ -14660,7 +14706,7 @@
           *bound_error,
           script,
           token_pos(),
-          LanguageError::kMalboundedType,
+          Report::kMalboundedType,
           Heap::kNew,
           "type parameter '%s' of class '%s' must extend bound '%s', "
           "but type argument '%s' is not a subtype of '%s'\n",
@@ -15132,15 +15178,17 @@
 
 
 RawInteger* Integer::New(int64_t value, Heap::Space space, const bool silent) {
-  if ((value <= Smi::kMaxValue) && (value >= Smi::kMinValue)) {
-    return Smi::New(value);
-  }
+  const bool is_smi = (value <= Smi::kMaxValue) && (value >= Smi::kMinValue);
   if (!silent &&
       FLAG_throw_on_javascript_int_overflow &&
       !IsJavascriptInt(value)) {
-    const Integer& i = Integer::Handle(Mint::New(value));
+    const Integer& i = is_smi ? Integer::Handle(Smi::New(value))
+                              : Integer::Handle(Mint::New(value));
     ThrowJavascriptIntegerOverflow(i);
   }
+  if (is_smi) {
+    return Smi::New(value);
+  }
   return Mint::New(value, space);
 }
 
@@ -15215,7 +15263,7 @@
   if (IsMint()) {
     Mint& mint = Mint::Handle();
     mint ^= raw();
-    if (Smi::IsValid64(mint.value())) {
+    if (Smi::IsValid(mint.value())) {
       return Smi::New(mint.value());
     } else {
       return raw();
@@ -15457,7 +15505,7 @@
   }
   if (integer.IsMint()) {
     int64_t mint_value = integer.AsInt64Value();
-    return Smi::IsValid64(mint_value);
+    return Smi::IsValid(mint_value);
   }
   if (integer.IsBigint()) {
     return BigintOperations::FitsIntoSmi(Bigint::Cast(integer));
@@ -15520,7 +15568,7 @@
 
 RawMint* Mint::New(int64_t val, Heap::Space space) {
   // Do not allocate a Mint if Smi would do.
-  ASSERT(!Smi::IsValid64(val));
+  ASSERT(!Smi::IsValid(val));
   ASSERT(Isolate::Current()->object_store()->mint_class() != Class::null());
   Mint& result = Mint::Handle();
   {
@@ -15537,7 +15585,7 @@
 
 RawMint* Mint::NewCanonical(int64_t value) {
   // Do not allocate a Mint if Smi would do.
-  ASSERT(!Smi::IsValid64(value));
+  ASSERT(!Smi::IsValid(value));
   const Class& cls =
       Class::Handle(Isolate::Current()->object_store()->mint_class());
   const Array& constants = Array::Handle(cls.constants());
@@ -16013,6 +16061,23 @@
 }
 
 
+Scanner::CharAtFunc String::CharAtFunc() const {
+  intptr_t class_id = raw()->GetClassId();
+  ASSERT(RawObject::IsStringClassId(class_id));
+  if (class_id == kOneByteStringCid) {
+    return &OneByteString::CharAt;
+  }
+  if (class_id == kTwoByteStringCid) {
+    return &TwoByteString::CharAt;
+  }
+  if (class_id == kExternalOneByteStringCid) {
+    return &ExternalOneByteString::CharAt;
+  }
+  ASSERT(class_id == kExternalTwoByteStringCid);
+  return &ExternalTwoByteString::CharAt;
+}
+
+
 intptr_t String::CharSize() const {
   intptr_t class_id = raw()->GetClassId();
   if (class_id == kOneByteStringCid || class_id == kExternalOneByteStringCid) {
@@ -16595,7 +16660,7 @@
       Isolate* isolate = Isolate::Current();
       const Instance& exception =
           Instance::Handle(isolate->object_store()->out_of_memory());
-      Exceptions::Throw(exception);
+      Exceptions::Throw(isolate, exception);
       UNREACHABLE();
     }
     result_len += str_len;
@@ -16806,14 +16871,15 @@
     Dart_WeakPersistentHandleFinalizer callback) {
   ASSERT((callback != NULL && peer != NULL) ||
          (callback == NULL && peer == NULL));
-  ApiState* state = Isolate::Current()->api_state();
-  ASSERT(state != NULL);
-  FinalizablePersistentHandle* weak_ref =
-      state->weak_persistent_handles().AllocateHandle();
-  weak_ref->set_raw(referent);
-  weak_ref->set_peer(peer);
-  weak_ref->set_callback(callback);
-  return weak_ref;
+  const bool is_prologue = false;
+  // TODO(19482): Make API consistent for external size of strings/typed data.
+  const intptr_t external_size = 0;
+  return FinalizablePersistentHandle::New(Isolate::Current(),
+                                          is_prologue,
+                                          referent,
+                                          peer,
+                                          callback,
+                                          external_size);
 }
 
 
@@ -16821,70 +16887,77 @@
                                 intptr_t length,
                                 void* peer,
                                 Dart_PeerFinalizer cback) const {
-  NoGCScope no_gc;
-  ASSERT(array != NULL);
-  intptr_t str_length = this->Length();
-  ASSERT(length >= (str_length * this->CharSize()));
-  intptr_t class_id = raw()->GetClassId();
-  intptr_t used_size = 0;
-  intptr_t original_size = 0;
-  uword tags = raw_ptr()->tags_;
+  String& result = String::Handle();
+  void* external_data;
+  Dart_WeakPersistentHandleFinalizer finalizer;
+  {
+    NoGCScope no_gc;
+    ASSERT(array != NULL);
+    intptr_t str_length = this->Length();
+    ASSERT(length >= (str_length * this->CharSize()));
+    intptr_t class_id = raw()->GetClassId();
+    intptr_t used_size = 0;
+    intptr_t original_size = 0;
+    uword tags = raw_ptr()->tags_;
 
-  ASSERT(!InVMHeap());
-  if (class_id == kOneByteStringCid) {
-    used_size = ExternalOneByteString::InstanceSize();
-    original_size = OneByteString::InstanceSize(str_length);
-    ASSERT(original_size >= used_size);
+    ASSERT(!InVMHeap());
+    if (class_id == kOneByteStringCid) {
+      used_size = ExternalOneByteString::InstanceSize();
+      original_size = OneByteString::InstanceSize(str_length);
+      ASSERT(original_size >= used_size);
 
-    // Copy the data into the external array.
-    if (str_length > 0) {
-      memmove(array, OneByteString::CharAddr(*this, 0), str_length);
+      // Copy the data into the external array.
+      if (str_length > 0) {
+        memmove(array, OneByteString::CharAddr(*this, 0), str_length);
+      }
+
+      // Update the class information of the object.
+      const intptr_t class_id = kExternalOneByteStringCid;
+      tags = RawObject::SizeTag::update(used_size, tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
+      raw_ptr()->tags_ = tags;
+      result = this->raw();
+      ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
+          reinterpret_cast<const uint8_t*>(array), peer, cback);
+      result.SetLength(str_length);
+      result.SetHash(0);
+      ExternalOneByteString::SetExternalData(result, ext_data);
+      external_data = ext_data;
+      finalizer = ExternalOneByteString::Finalize;
+    } else {
+      ASSERT(class_id == kTwoByteStringCid);
+      used_size = ExternalTwoByteString::InstanceSize();
+      original_size = TwoByteString::InstanceSize(str_length);
+      ASSERT(original_size >= used_size);
+
+      // Copy the data into the external array.
+      if (str_length > 0) {
+        memmove(array,
+                TwoByteString::CharAddr(*this, 0),
+                (str_length * kTwoByteChar));
+      }
+
+      // Update the class information of the object.
+      const intptr_t class_id = kExternalTwoByteStringCid;
+      tags = RawObject::SizeTag::update(used_size, tags);
+      tags = RawObject::ClassIdTag::update(class_id, tags);
+      raw_ptr()->tags_ = tags;
+      const String& result = String::Handle(this->raw());
+      ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
+          reinterpret_cast<const uint16_t*>(array), peer, cback);
+      result.SetLength(str_length);
+      result.SetHash(0);
+      ExternalTwoByteString::SetExternalData(result, ext_data);
+      external_data = ext_data;
+      finalizer = ExternalTwoByteString::Finalize;
     }
 
-    // Update the class information of the object.
-    const intptr_t class_id = kExternalOneByteStringCid;
-    tags = RawObject::SizeTag::update(used_size, tags);
-    tags = RawObject::ClassIdTag::update(class_id, tags);
-    raw_ptr()->tags_ = tags;
-    const String& result = String::Handle(this->raw());
-    ExternalStringData<uint8_t>* ext_data = new ExternalStringData<uint8_t>(
-        reinterpret_cast<const uint8_t*>(array), peer, cback);
-    result.SetLength(str_length);
-    result.SetHash(0);
-    ExternalOneByteString::SetExternalData(result, ext_data);
-    AddFinalizer(result, ext_data, ExternalOneByteString::Finalize);
-  } else {
-    ASSERT(class_id == kTwoByteStringCid);
-    used_size = ExternalTwoByteString::InstanceSize();
-    original_size = TwoByteString::InstanceSize(str_length);
-    ASSERT(original_size >= used_size);
-
-    // Copy the data into the external array.
-    if (str_length > 0) {
-      memmove(array,
-              TwoByteString::CharAddr(*this, 0),
-              (str_length * kTwoByteChar));
-    }
-
-    // Update the class information of the object.
-    const intptr_t class_id = kExternalTwoByteStringCid;
-    tags = RawObject::SizeTag::update(used_size, tags);
-    tags = RawObject::ClassIdTag::update(class_id, tags);
-    raw_ptr()->tags_ = tags;
-    const String& result = String::Handle(this->raw());
-    ExternalStringData<uint16_t>* ext_data = new ExternalStringData<uint16_t>(
-        reinterpret_cast<const uint16_t*>(array), peer, cback);
-    result.SetLength(str_length);
-    result.SetHash(0);
-    ExternalTwoByteString::SetExternalData(result, ext_data);
-    AddFinalizer(result, ext_data, ExternalTwoByteString::Finalize);
-  }
-
-  // If there is any left over space fill it with either an Array object or
-  // just a plain object (depending on the amount of left over space) so
-  // that it can be traversed over successfully during garbage collection.
-  Object::MakeUnusedSpaceTraversable(*this, original_size, used_size);
-
+    // If there is any left over space fill it with either an Array object or
+    // just a plain object (depending on the amount of left over space) so
+    // that it can be traversed over successfully during garbage collection.
+    Object::MakeUnusedSpaceTraversable(*this, original_size, used_size);
+  }  // NoGCScope
+  AddFinalizer(result, external_data, finalizer);
   return this->raw();
 }
 
@@ -17290,8 +17363,8 @@
   RawOneByteString* result = OneByteString::New(length, space);
   NoGCScope no_gc;
   if (length > 0) {
-    uint8_t* dest = &result->ptr()->data_[0];
-    uint8_t* src =  &raw_ptr(str)->data_[begin_index];
+    uint8_t* dest = &result->ptr()->data()[0];
+    uint8_t* src =  &raw_ptr(str)->data()[begin_index];
     memmove(dest, src, length);
   }
   return result;
@@ -17814,7 +17887,7 @@
       Isolate* isolate = Isolate::Current();
       const Instance& exception =
           Instance::Handle(isolate->object_store()->out_of_memory());
-      Exceptions::Throw(exception);
+      Exceptions::Throw(isolate, exception);
       UNREACHABLE();
     }
     Grow(new_capacity, space);
@@ -18523,13 +18596,20 @@
 
 
 void Stacktrace::Append(const Array& code_list,
-                        const Array& pc_offset_list) const {
-  intptr_t old_length = Length();
-  intptr_t new_length = old_length + pc_offset_list.Length();
+                        const Array& pc_offset_list,
+                        const intptr_t start_index) const {
+  ASSERT(start_index <= code_list.Length());
   ASSERT(pc_offset_list.Length() == code_list.Length());
+  intptr_t old_length = Length();
+  intptr_t new_length = old_length + pc_offset_list.Length() - start_index;
+  if (new_length == old_length) {
+    // Nothing to append. Avoid work and an assert that growing arrays always
+    // increases their size.
+    return;
+  }
 
-  // Grow the arrays for function, code and pc_offset triplet to accommodate
-  // the new stack frames.
+  // Grow the arrays for code, pc_offset pairs to accommodate the new stack
+  // frames.
   Array& code_array = Array::Handle(raw_ptr()->code_array_);
   Array& pc_offset_array = Array::Handle(raw_ptr()->pc_offset_array_);
   code_array = Array::Grow(code_array, new_length);
@@ -18537,7 +18617,7 @@
   set_code_array(code_array);
   set_pc_offset_array(pc_offset_array);
   // Now append the new function and code list to the existing arrays.
-  intptr_t j = 0;
+  intptr_t j = start_index;
   Object& obj = Object::Handle();
   for (intptr_t i = old_length; i < new_length; i++, j++) {
     obj = code_list.At(j);
diff --git a/runtime/vm/object.h b/runtime/vm/object.h
index de55423..4d938ce 100644
--- a/runtime/vm/object.h
+++ b/runtime/vm/object.h
@@ -5,6 +5,7 @@
 #ifndef VM_OBJECT_H_
 #define VM_OBJECT_H_
 
+#include <limits>
 #include "include/dart_api.h"
 #include "platform/assert.h"
 #include "platform/utils.h"
@@ -17,6 +18,7 @@
 #include "vm/isolate.h"
 #include "vm/os.h"
 #include "vm/raw_object.h"
+#include "vm/report.h"
 #include "vm/scanner.h"
 #include "vm/tags.h"
 
@@ -1299,7 +1301,8 @@
   intptr_t Length() const;
   RawAbstractType* TypeAt(intptr_t index) const;
   static intptr_t type_at_offset(intptr_t index) {
-    return OFFSET_OF(RawTypeArguments, types_) + index * kWordSize;
+    return OFFSET_OF_RETURNED_VALUE(
+        RawTypeArguments, types) + index * kWordSize;
   }
   void SetTypeAt(intptr_t index, const AbstractType& value) const;
 
@@ -1426,12 +1429,13 @@
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypeArguments) == OFFSET_OF(RawTypeArguments, types_));
+    ASSERT(sizeof(RawTypeArguments) ==
+           OFFSET_OF_RETURNED_VALUE(RawTypeArguments, types));
     return 0;
   }
 
   static intptr_t InstanceSize(intptr_t len) {
-    // Ensure that the types_ is not adding to the object size, which includes
+    // Ensure that the types() is not adding to the object size, which includes
     // 2 fields: instantiations_ and length_.
     ASSERT(sizeof(RawTypeArguments) == (sizeof(RawObject) + (2 * kWordSize)));
     ASSERT(0 <= len && len <= kMaxElements);
@@ -1994,11 +1998,22 @@
   // Return false and report an error if the fingerprint does not match.
   bool CheckSourceFingerprint(int32_t fp) const;
 
+  // Works with map [deopt-id] -> ICData.
+  void SaveICDataMap(
+      const ZoneGrowableArray<const ICData*>& deopt_id_to_ic_data) const;
+  void RestoreICDataMap(
+      ZoneGrowableArray<const ICData*>* deopt_id_to_ic_data) const;
+
+  RawArray* ic_data_array() const;
+  void ClearICData() const;
+
   static const int kCtorPhaseInit = 1 << 0;
   static const int kCtorPhaseBody = 1 << 1;
   static const int kCtorPhaseAll = (kCtorPhaseInit | kCtorPhaseBody);
 
  private:
+  void set_ic_data_array(const Array& value) const;
+
   enum KindTagBits {
     kKindTagPos = 0,
     kKindTagSize = 4,
@@ -2504,6 +2519,8 @@
                         intptr_t* first_token_index,
                         intptr_t* last_token_index) const;
 
+  RawLibrary* FindLibrary() const;
+
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawScript));
   }
@@ -2512,6 +2529,8 @@
                         const String& source,
                         RawScript::Kind kind);
 
+  static RawScript* FindByUrl(const String& url);
+
  private:
   void set_url(const String& value) const;
   void set_source(const String& value) const;
@@ -2593,9 +2612,13 @@
   bool LoadNotStarted() const {
     return raw_ptr()->load_state_ == RawLibrary::kAllocated;
   }
+  bool LoadRequested() const {
+    return raw_ptr()->load_state_ == RawLibrary::kLoadRequested;
+  }
   bool LoadInProgress() const {
     return raw_ptr()->load_state_ == RawLibrary::kLoadInProgress;
   }
+  void SetLoadRequested() const;
   void SetLoadInProgress() const;
   bool Loaded() const { return raw_ptr()->load_state_ == RawLibrary::kLoaded; }
   void SetLoaded() const;
@@ -2873,7 +2896,8 @@
                                          (2 * OS::kMaxPreferredCodeAlignment)));
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawInstructions) == OFFSET_OF(RawInstructions, data_));
+    ASSERT(sizeof(RawInstructions) ==
+           OFFSET_OF_RETURNED_VALUE(RawInstructions, data));
     return 0;
   }
 
@@ -2936,7 +2960,7 @@
 
   static intptr_t InstanceSize() {
     ASSERT(sizeof(RawLocalVarDescriptors) ==
-        OFFSET_OF(RawLocalVarDescriptors, data_));
+        OFFSET_OF_RETURNED_VALUE(RawLocalVarDescriptors, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -2954,19 +2978,6 @@
 
 
 class PcDescriptors : public Object {
- private:
-  // Describes the layout of PC descriptor data.
-  enum {
-    kPcEntry = 0,      // PC value of the descriptor, unique.
-    kKindEntry = 1,
-    kDeoptIdEntry = 2,      // Deopt id.
-    kTokenPosEntry = 3,     // Token position in source.
-    kTryIndexEntry = 4,     // Try block index.
-    // We would potentially be adding other objects here like
-    // pointer maps for optimized functions, local variables information  etc.
-    kNumberOfEntries = 5,
-  };
-
  public:
   enum Kind {
     kDeopt,            // Deoptimization continuation point.
@@ -2975,38 +2986,58 @@
     kUnoptStaticCall,  // Call to a known target via a stub.
     kClosureCall,      // Closure call.
     kRuntimeCall,      // Runtime call.
-    kReturn,           // Return from function.
     kOsrEntry,         // OSR entry point in unoptimized code.
     kOther
   };
 
   intptr_t Length() const;
 
-  uword PC(intptr_t index) const;
-  PcDescriptors::Kind DescriptorKind(intptr_t index) const;
+  uword PC(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].pc;
+  }
+  PcDescriptors::Kind DescriptorKind(intptr_t index) const {
+    ASSERT(index < Length());
+    return static_cast<PcDescriptors::Kind>(raw_ptr()->data()[index].kind);
+  }
+  intptr_t DeoptId(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].deopt_id;
+  }
+  intptr_t TokenPos(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].token_pos;
+  }
+  intptr_t TryIndex(intptr_t index) const {
+    ASSERT(index < Length());
+    return raw_ptr()->data()[index].try_index;
+  }
   const char* KindAsStr(intptr_t index) const;
-  intptr_t DeoptId(intptr_t index) const;
-  intptr_t TokenPos(intptr_t index) const;
-  intptr_t TryIndex(intptr_t index) const;
 
   void AddDescriptor(intptr_t index,
                      uword pc,
                      PcDescriptors::Kind kind,
-                     intptr_t deopt_id,
-                     intptr_t token_pos,  // Or deopt reason.
+                     int64_t deopt_id,
+                     int64_t token_pos,  // Or deopt reason.
                      intptr_t try_index) const {  // Or deopt index.
-    SetPC(index, pc);
-    SetKind(index, kind);
-    SetDeoptId(index, deopt_id);
-    SetTokenPos(index, token_pos);
-    SetTryIndex(index, try_index);
+    RawPcDescriptors::PcDescriptorRec* rec = &raw_ptr()->data()[index];
+    rec->pc = pc;
+    rec->kind = kind;
+    ASSERT(Utils::IsInt(32, deopt_id));
+    rec->deopt_id = deopt_id;
+    ASSERT(Utils::IsInt(32, token_pos));
+    rec->token_pos = token_pos;
+    ASSERT(Utils::IsInt(16, try_index));
+    rec->try_index = try_index;
   }
 
-  static const intptr_t kBytesPerElement = (kNumberOfEntries * kWordSize);
+  static const intptr_t kBytesPerElement =
+      sizeof(RawPcDescriptors::PcDescriptorRec);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawPcDescriptors) == OFFSET_OF(RawPcDescriptors, data_));
+    ASSERT(sizeof(RawPcDescriptors) ==
+           OFFSET_OF_RETURNED_VALUE(RawPcDescriptors, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3031,23 +3062,8 @@
   // pc descriptors table to visit objects if any in the table.
 
  private:
-  void SetPC(intptr_t index, uword value) const;
-  void SetKind(intptr_t index, PcDescriptors::Kind kind) const;
-  void SetDeoptId(intptr_t index, intptr_t value) const;
-  void SetTokenPos(intptr_t index, intptr_t value) const;
-  void SetTryIndex(intptr_t index, intptr_t value) const;
-
   void SetLength(intptr_t value) const;
 
-  intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
-    ASSERT((index >=0) && (index < Length()));
-    intptr_t data_index = (index * kNumberOfEntries) + entry_offset;
-    return &raw_ptr()->data_[data_index];
-  }
-  RawSmi** SmiAddr(intptr_t index, intptr_t entry_offset) const {
-    return reinterpret_cast<RawSmi**>(EntryAddr(index, entry_offset));
-  }
-
   FINAL_HEAP_OBJECT_IMPLEMENTATION(PcDescriptors, Object);
   friend class Class;
   friend class Object;
@@ -3077,7 +3093,7 @@
   static const intptr_t kMaxLengthInBytes = kSmiMax;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawStackmap) == OFFSET_OF(RawStackmap, data_));
+    ASSERT(sizeof(RawStackmap) == OFFSET_OF_RETURNED_VALUE(RawStackmap, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t length) {
@@ -3127,8 +3143,8 @@
   bool HasCatchAll(intptr_t try_index) const;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawExceptionHandlers) == OFFSET_OF(RawExceptionHandlers,
-                                                     data_));
+    ASSERT(sizeof(RawExceptionHandlers) ==
+           OFFSET_OF_RETURNED_VALUE(RawExceptionHandlers, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3197,7 +3213,8 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawDeoptInfo) == OFFSET_OF(RawDeoptInfo, data_));
+    ASSERT(sizeof(RawDeoptInfo) ==
+           OFFSET_OF_RETURNED_VALUE(RawDeoptInfo, data));
     return 0;
   }
 
@@ -3233,7 +3250,7 @@
   intptr_t* EntryAddr(intptr_t index, intptr_t entry_offset) const {
     ASSERT((index >=0) && (index < Length()));
     intptr_t data_index = (index * kNumberOfEntries) + entry_offset;
-    return &raw_ptr()->data_[data_index];
+    return &raw_ptr()->data()[data_index];
   }
 
   void SetLength(intptr_t value) const;
@@ -3624,10 +3641,11 @@
   // embedded objects in the instructions using pointer_offsets.
 
   static const intptr_t kBytesPerElement =
-      sizeof(reinterpret_cast<RawCode*>(0)->data_[0]);
+      sizeof(reinterpret_cast<RawCode*>(0)->data()[0]);
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
+    ASSERT(sizeof(RawCode) == OFFSET_OF_RETURNED_VALUE(RawCode, data));
     return 0;
   }
   static intptr_t InstanceSize(intptr_t len) {
@@ -3667,15 +3685,6 @@
   // (inclusive) and 'end_offset' (exclusive).
   bool ObjectExistsInArea(intptr_t start_offest, intptr_t end_offset) const;
 
-  // Each (*node_ids)[n] has a an extracted ic data array (*arrays)[n].
-  // Returns the maximum id found.
-  intptr_t ExtractIcDataArraysAtCalls(
-      GrowableArray<intptr_t>* node_ids,
-      const GrowableObjectArray& ic_data_objs) const;
-
-  // Returns an array indexed by deopt id, containing the extracted ICData.
-  RawArray* ExtractTypeFeedbackArray() const;
-
   RawString* Name() const;
   RawString* PrettyName() const;
 
@@ -3755,7 +3764,7 @@
     ASSERT(index >= 0);
     ASSERT(index < pointer_offsets_length());
     // TODO(iposva): Unit test is missing for this functionality.
-    return &raw_ptr()->data_[index];
+    return &raw_ptr()->data()[index];
   }
   void SetPointerOffsetAt(int index, int32_t offset_in_instructions) {
     *PointerOffsetAddrAt(index) = offset_in_instructions;
@@ -3807,11 +3816,12 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t variable_offset(intptr_t context_index) {
-    return OFFSET_OF(RawContext, data_[context_index]);
+    return OFFSET_OF_RETURNED_VALUE(RawContext, data) +
+           (kWordSize * context_index);
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContext) == OFFSET_OF(RawContext, data_));
+    ASSERT(sizeof(RawContext) == OFFSET_OF_RETURNED_VALUE(RawContext, data));
     return 0;
   }
 
@@ -3826,7 +3836,7 @@
  private:
   RawInstance** InstanceAddr(intptr_t context_index) const {
     ASSERT((context_index >= 0) && (context_index < num_variables()));
-    return &raw_ptr()->data_[context_index];
+    return &raw_ptr()->data()[context_index];
   }
 
   void set_isolate(Isolate* isolate) const {
@@ -3884,7 +3894,8 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawContextScope) == OFFSET_OF(RawContextScope, data_));
+    ASSERT(sizeof(RawContextScope) ==
+           OFFSET_OF_RETURNED_VALUE(RawContextScope, data));
     return 0;
   }
 
@@ -4046,15 +4057,9 @@
 
 class LanguageError : public Error {
  public:
-  enum Kind {
-    kWarning,
-    kError,
-    kMalformedType,
-    kMalboundedType,
-    kBailout,
-  };
-
-  Kind kind() const { return static_cast<Kind>(raw_ptr()->kind_); }
+  Report::Kind kind() const {
+    return static_cast<Report::Kind>(raw_ptr()->kind_);
+  }
 
   // Build, cache, and return formatted message.
   RawString* FormatMessage() const;
@@ -4067,7 +4072,7 @@
   static RawLanguageError* NewFormatted(const Error& prev_error,
                                         const Script& script,
                                         intptr_t token_pos,
-                                        Kind kind,
+                                        Report::Kind kind,
                                         Heap::Space space,
                                         const char* format, ...)
     PRINTF_ATTRIBUTE(6, 7);
@@ -4075,12 +4080,12 @@
   static RawLanguageError* NewFormattedV(const Error& prev_error,
                                          const Script& script,
                                          intptr_t token_pos,
-                                         Kind kind,
+                                         Report::Kind kind,
                                          Heap::Space space,
                                          const char* format, va_list args);
 
   static RawLanguageError* New(const String& formatted_message,
-                               Kind kind = kError,
+                               Report::Kind kind = Report::kError,
                                Heap::Space space = Heap::kNew);
 
   virtual const char* ToErrorCString() const;
@@ -4216,6 +4221,8 @@
   inline intptr_t GetNativeField(int index) const;
   inline void GetNativeFields(uint16_t num_fields,
                               intptr_t* field_values) const;
+  void SetNativeFields(uint16_t num_fields,
+                       const intptr_t* field_values) const;
 
   uint16_t NumNativeFields() const {
     return clazz()->ptr()->num_native_fields_;
@@ -4293,6 +4300,7 @@
 
   RawArray* imports() const { return raw_ptr()->imports_; }
   intptr_t num_imports() const { return raw_ptr()->num_imports_; }
+  RawLibrary* importer() const { return raw_ptr()->importer_; }
 
   bool ContainsLibrary(const Library& library) const;
   RawLibrary* GetLibrary(int index) const;
@@ -4302,7 +4310,7 @@
 
   bool is_deferred_load() const { return raw_ptr()->is_deferred_load_; }
   bool is_loaded() const { return raw_ptr()->is_loaded_; }
-  void LoadLibrary() const;
+  bool LoadLibrary() const;
 
   // Return the list of code objects that were compiled when this
   // prefix was not yet loaded. These code objects will be invalidated
@@ -4320,7 +4328,8 @@
 
   static RawLibraryPrefix* New(const String& name,
                                const Namespace& import,
-                               bool deferred_load);
+                               bool deferred_load,
+                               const Library& importer);
 
  private:
   static const int kInitialSize = 2;
@@ -4329,6 +4338,7 @@
   void set_name(const String& value) const;
   void set_imports(const Array& value) const;
   void set_num_imports(intptr_t value) const;
+  void set_importer(const Library& value) const;
   void set_is_loaded() const;
 
   static RawLibraryPrefix* New();
@@ -5013,12 +5023,18 @@
     return reinterpret_cast<intptr_t>(New(value));
   }
 
-  static bool IsValid(intptr_t value) {
-    return (value >= kMinValue) && (value <= kMaxValue);
-  }
+  template <typename T>
+  static bool IsValid(T value) {
+    COMPILE_ASSERT(sizeof(kMinValue) == sizeof(kMaxValue));
+    COMPILE_ASSERT(std::numeric_limits<T>::is_integer);
+    if (sizeof(value) < sizeof(kMinValue)) {
+      return true;
+    }
 
-  static bool IsValid64(int64_t value) {
-    return (value >= kMinValue) && (value <= kMaxValue);
+    T min_value = std::numeric_limits<T>::is_signed
+        ? static_cast<T>(kMinValue) : 0;
+    return (value >= min_value)
+        && (value <= static_cast<T>(kMaxValue));
   }
 
   RawInteger* ShiftOp(Token::Kind kind,
@@ -5303,6 +5319,8 @@
 
   int32_t CharAt(intptr_t index) const;
 
+  Scanner::CharAtFunc CharAtFunc() const;
+
   intptr_t CharSize() const;
 
   inline bool Equals(const String& str) const;
@@ -5530,10 +5548,13 @@
   static const intptr_t kBytesPerElement = 1;
   static const intptr_t kMaxElements = String::kMaxElements;
 
-  static intptr_t data_offset() { return OFFSET_OF(RawOneByteString, data_); }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawOneByteString, data);
+  }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawOneByteString) == OFFSET_OF(RawOneByteString, data_));
+    ASSERT(sizeof(RawOneByteString) ==
+           OFFSET_OF_RETURNED_VALUE(RawOneByteString, data));
     return 0;
   }
 
@@ -5626,7 +5647,7 @@
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsOneByteString());
     NoGCScope no_gc;
-    return &raw_ptr(str)->data_[index];
+    return &raw_ptr(str)->data()[index];
   }
 
   static RawOneByteString* ReadFrom(SnapshotReader* reader,
@@ -5657,10 +5678,13 @@
   static const intptr_t kBytesPerElement = 2;
   static const intptr_t kMaxElements = String::kMaxElements;
 
-  static intptr_t data_offset() { return OFFSET_OF(RawTwoByteString, data_); }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data);
+  }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTwoByteString) == OFFSET_OF(RawTwoByteString, data_));
+    ASSERT(sizeof(RawTwoByteString) ==
+           OFFSET_OF_RETURNED_VALUE(RawTwoByteString, data));
     return 0;
   }
 
@@ -5724,7 +5748,7 @@
     ASSERT((index >= 0) && (index < str.Length()));
     ASSERT(str.IsTwoByteString());
     NoGCScope no_gc;
-    return &raw_ptr(str)->data_[index];
+    return &raw_ptr(str)->data()[index];
   }
 
   static RawTwoByteString* ReadFrom(SnapshotReader* reader,
@@ -5930,9 +5954,11 @@
     return Smi::Value(raw_ptr()->length_);
   }
   static intptr_t length_offset() { return OFFSET_OF(RawArray, length_); }
-  static intptr_t data_offset() { return length_offset() + kWordSize; }
+  static intptr_t data_offset() {
+    return OFFSET_OF_RETURNED_VALUE(RawArray, data);
+  }
   static intptr_t element_offset(intptr_t index) {
-    return data_offset() + kWordSize * index;
+    return OFFSET_OF_RETURNED_VALUE(RawArray, data) + kWordSize * index;
   }
 
   RawObject* At(intptr_t index) const {
@@ -6304,7 +6330,7 @@
   void* DataAddr(intptr_t byte_offset) const {
     ASSERT((byte_offset == 0) ||
            ((byte_offset > 0) && (byte_offset < LengthInBytes())));
-    return reinterpret_cast<void*>(raw_ptr()->data_ + byte_offset);
+    return reinterpret_cast<void*>(raw_ptr()->data() + byte_offset);
   }
 
 #define TYPED_GETTER_SETTER(name, type)                                        \
@@ -6335,11 +6361,12 @@
   }
 
   static intptr_t data_offset() {
-    return OFFSET_OF(RawTypedData, data_);
+    return OFFSET_OF_RETURNED_VALUE(RawTypedData, data);
   }
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawTypedData) == OFFSET_OF(RawTypedData, data_));
+    ASSERT(sizeof(RawTypedData) ==
+           OFFSET_OF_RETURNED_VALUE(RawTypedData, data));
     return 0;
   }
 
@@ -6754,7 +6781,9 @@
                           const Array& pc_offset_array) const;
   void set_expand_inlined(bool value) const;
 
-  void Append(const Array& code_list, const Array& pc_offset_list) const;
+  void Append(const Array& code_list,
+              const Array& pc_offset_list,
+              const intptr_t start_index) const;
 
   static intptr_t InstanceSize() {
     return RoundedAllocationSize(sizeof(RawStacktrace));
@@ -6835,7 +6864,7 @@
   static const intptr_t kMaxElements = kSmiMax / kBytesPerElement;
 
   static intptr_t InstanceSize() {
-    ASSERT(sizeof(RawJSRegExp) == OFFSET_OF(RawJSRegExp, data_));
+    ASSERT(sizeof(RawJSRegExp) == OFFSET_OF_RETURNED_VALUE(RawJSRegExp, data));
     return 0;
   }
 
@@ -7037,7 +7066,7 @@
   if (native_fields == TypedData::null()) {
     return 0;
   }
-  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data_)[index];
+  return reinterpret_cast<intptr_t*>(native_fields->ptr()->data())[index];
 }
 
 
@@ -7053,7 +7082,7 @@
       field_values[i] = 0;
     }
   }
-  intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data_);
+  intptr_t* fields = reinterpret_cast<intptr_t*>(native_fields->ptr()->data());
   for (intptr_t i = 0; i < num_fields; i++) {
     field_values[i] = fields[i];
   }
diff --git a/runtime/vm/object_graph_test.cc b/runtime/vm/object_graph_test.cc
index 91d0765..72ab50f 100644
--- a/runtime/vm/object_graph_test.cc
+++ b/runtime/vm/object_graph_test.cc
@@ -8,11 +8,11 @@
 
 namespace dart {
 
-class Counter : public ObjectGraph::Visitor {
+class CounterVisitor : public ObjectGraph::Visitor {
  public:
   // Records the number of objects and total size visited, excluding 'skip'
   // and any objects only reachable through 'skip'.
-  Counter(RawObject* skip, RawObject* expected_parent)
+  CounterVisitor(RawObject* skip, RawObject* expected_parent)
       : count_(0), size_(0), skip_(skip), expected_parent_(expected_parent) { }
 
   virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
@@ -68,9 +68,9 @@
     ObjectGraph graph(isolate);
     {
       // Compare count and size when 'b' is/isn't skipped.
-      Counter with(Object::null(), Object::null());
+      CounterVisitor with(Object::null(), Object::null());
       graph.IterateObjectsFrom(a, &with);
-      Counter without(b_raw, a.raw());
+      CounterVisitor without(b_raw, a.raw());
       graph.IterateObjectsFrom(a, &without);
       // Only 'b' and 'c' were cut off.
       EXPECT_EQ(2, with.count() - without.count());
@@ -80,9 +80,9 @@
     {
       // Like above, but iterate over the entire isolate. The counts and sizes
       // are thus larger, but the difference should still be just 'b' and 'c'.
-      Counter with(Object::null(), Object::null());
+      CounterVisitor with(Object::null(), Object::null());
       graph.IterateObjects(&with);
-      Counter without(b_raw, a.raw());
+      CounterVisitor without(b_raw, a.raw());
       graph.IterateObjects(&without);
       EXPECT_EQ(2, with.count() - without.count());
       EXPECT_EQ(b_size + c_size,
diff --git a/runtime/vm/object_test.cc b/runtime/vm/object_test.cc
index 6058481..e7b69f6 100644
--- a/runtime/vm/object_test.cc
+++ b/runtime/vm/object_test.cc
@@ -285,15 +285,18 @@
 
   EXPECT(Smi::IsValid(0));
   EXPECT(Smi::IsValid(-15));
+  EXPECT(Smi::IsValid(0xFFu));
   // Upper two bits must be either 00 or 11.
 #if defined(ARCH_IS_64_BIT)
   EXPECT(!Smi::IsValid(kMaxInt64));
   EXPECT(Smi::IsValid(0x3FFFFFFFFFFFFFFF));
-  EXPECT(Smi::IsValid(0xFFFFFFFFFFFFFFFF));
+  EXPECT(Smi::IsValid(-1));
+  EXPECT(!Smi::IsValid(0xFFFFFFFFFFFFFFFFu));
 #else
   EXPECT(!Smi::IsValid(kMaxInt32));
   EXPECT(Smi::IsValid(0x3FFFFFFF));
-  EXPECT(Smi::IsValid(0xFFFFFFFF));
+  EXPECT(Smi::IsValid(-1));
+  EXPECT(!Smi::IsValid(0xFFFFFFFFu));
 #endif
 
   EXPECT_EQ(5, smi.AsInt64Value());
@@ -524,10 +527,19 @@
     EXPECT(!dbl1.OperatorEquals(Smi::Handle(Smi::New(3))));
     EXPECT(!dbl1.OperatorEquals(Double::Handle()));
     const Double& nan0 = Double::Handle(Double::New(NAN));
+    EXPECT(isnan(nan0.value()));
     EXPECT(nan0.IsIdenticalTo(nan0));
     EXPECT(nan0.CanonicalizeEquals(nan0));
     EXPECT(!nan0.OperatorEquals(nan0));
-    // TODO(18738): Test bitwise different NaNs after agreement on spec.
+    const Double& nan1 = Double::Handle(
+        Double::New(bit_cast<double>(kMaxUint64 - 0)));
+    const Double& nan2 = Double::Handle(
+        Double::New(bit_cast<double>(kMaxUint64 - 1)));
+    EXPECT(isnan(nan1.value()));
+    EXPECT(isnan(nan2.value()));
+    EXPECT(!nan1.IsIdenticalTo(nan2));
+    EXPECT(!nan1.CanonicalizeEquals(nan2));
+    EXPECT(!nan1.OperatorEquals(nan2));
   }
   {
     const String& dbl_str0 = String::Handle(String::New("bla"));
@@ -2041,6 +2053,18 @@
   EXPECT(obj.IsTypedData());
   left_over_array ^= obj.raw();
   EXPECT_EQ((6 * kWordSize), left_over_array.Length());
+
+  // 4. Verify that GC can handle the filler object for a large array.
+  array = GrowableObjectArray::New((1 * MB) >> kWordSizeLog2);
+  EXPECT_EQ(0, array.Length());
+  for (intptr_t i = 0; i < 1; i++) {
+    value = Smi::New(i);
+    array.Add(value);
+  }
+  new_array = Array::MakeArray(array);
+  EXPECT_EQ(1, new_array.Length());
+  Isolate::Current()->heap()->CollectAllGarbage();
+  EXPECT_EQ(1, new_array.Length());
 }
 
 
@@ -2189,6 +2213,22 @@
   EXPECT_EQ('T', str.CharAt(0));
   EXPECT_EQ('n', str.CharAt(10));
   EXPECT_EQ('.', str.CharAt(21));
+
+  const char* kScript = "main() {}";
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+  Script& script2 = Script::Handle(
+      Script::FindByUrl(String::Handle(String::New("test-lib"))));
+  EXPECT(!script2.IsNull());
+  const Library& lib2 = Library::Handle(script2.FindLibrary());
+  EXPECT_EQ(lib2.raw(), lib.raw());
+  script2 = Script::FindByUrl(String::Handle(String::New("non-there.dart")));
+  EXPECT(script2.IsNull());
 }
 
 
diff --git a/runtime/vm/pages.cc b/runtime/vm/pages.cc
index 564589e..e623cd7 100644
--- a/runtime/vm/pages.cc
+++ b/runtime/vm/pages.cc
@@ -175,7 +175,8 @@
   page->set_next(large_pages_);
   large_pages_ = page;
   usage_.capacity_in_words += page_size_in_words;
-  // Only one object in this page.
+  // Only one object in this page (at least until String::MakeExternal or
+  // Array::MakeArray is called).
   page->set_object_end(page->object_start() + size);
   return page;
 }
diff --git a/runtime/vm/parser.cc b/runtime/vm/parser.cc
index c41e5c1..03b863b 100644
--- a/runtime/vm/parser.cc
+++ b/runtime/vm/parser.cc
@@ -23,6 +23,7 @@
 #include "vm/object.h"
 #include "vm/object_store.h"
 #include "vm/os.h"
+#include "vm/report.h"
 #include "vm/resolver.h"
 #include "vm/scanner.h"
 #include "vm/scopes.h"
@@ -37,11 +38,10 @@
 DEFINE_FLAG(bool, enable_asserts, false, "Enable assert statements.");
 DEFINE_FLAG(bool, enable_type_checks, false, "Enable type checks.");
 DEFINE_FLAG(bool, trace_parser, false, "Trace parser operations.");
-DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors.");
-DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
 DEFINE_FLAG(bool, warn_mixin_typedef, true, "Warning on legacy mixin typedef.");
 DECLARE_FLAG(bool, error_on_bad_type);
 DECLARE_FLAG(bool, throw_on_javascript_int_overflow);
+DECLARE_FLAG(bool, warn_on_javascript_compatibility);
 
 static void CheckedModeHandler(bool value) {
   FLAG_enable_asserts = value;
@@ -321,8 +321,7 @@
 Parser::~Parser() {
   if (unregister_pending_function_) {
     const GrowableObjectArray& pending_functions =
-        GrowableObjectArray::Handle(
-            isolate()->object_store()->pending_functions());
+        GrowableObjectArray::Handle(I->object_store()->pending_functions());
     ASSERT(pending_functions.Length() > 0);
     ASSERT(pending_functions.At(pending_functions.Length()-1) ==
         current_function().raw());
@@ -334,7 +333,7 @@
 void Parser::SetScript(const Script& script, intptr_t token_pos) {
   script_ = script.raw();
   tokens_iterator_.SetStream(
-      TokenStream::Handle(isolate(), script.tokens()), token_pos);
+      TokenStream::Handle(I, script.tokens()), token_pos);
   token_kind_ = Token::kILLEGAL;
 }
 
@@ -391,7 +390,7 @@
   ASSERT(token_kind_ == Token::kILLEGAL);
   token_kind_ = tokens_iterator_.CurrentTokenKind();
   if (token_kind_ == Token::kERROR) {
-    ErrorMsg(TokenPos(), "%s", CurrentLiteral()->ToCString());
+    ReportError(TokenPos(), "%s", CurrentLiteral()->ToCString());
   }
 }
 
@@ -422,33 +421,17 @@
   ASSERT(literal_token_.kind() == Token::kINTEGER);
   RawInteger* ri = Integer::RawCast(literal_token_.value());
   if (FLAG_throw_on_javascript_int_overflow) {
-    const Integer& i = Integer::Handle(isolate(), ri);
+    const Integer& i = Integer::Handle(I, ri);
     if (i.CheckJavascriptIntegerOverflow()) {
-      ErrorMsg(TokenPos(),
-          "Integer literal does not fit in a Javascript integer: %s.",
-          i.ToCString());
+      ReportError(TokenPos(),
+                  "Integer literal does not fit in a Javascript integer: %s.",
+                  i.ToCString());
     }
   }
   return ri;
 }
 
 
-// A QualIdent is an optionally qualified identifier.
-struct QualIdent {
-  QualIdent() {
-    Clear();
-  }
-  void Clear() {
-    lib_prefix = NULL;
-    ident_pos = 0;
-    ident = NULL;
-  }
-  LibraryPrefix* lib_prefix;
-  intptr_t ident_pos;
-  String* ident;
-};
-
-
 struct ParamDesc {
   ParamDesc()
       : type(NULL),
@@ -915,7 +898,7 @@
 RawArray* Parser::EvaluateMetadata() {
   CheckToken(Token::kAT, "Metadata character '@' expected");
   GrowableObjectArray& meta_values =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
   while (CurrentToken() == Token::kAT) {
     ConsumeToken();
     intptr_t expr_pos = TokenPos();
@@ -923,11 +906,11 @@
       ExpectIdentifier("identifier expected");
     }
     // Reject expressions with deferred library prefix eagerly.
-    Object& obj = Object::Handle(isolate(),
+    Object& obj = Object::Handle(I,
                                  library_.LookupLocalObject(*CurrentLiteral()));
     if (!obj.IsNull() && obj.IsLibraryPrefix()) {
       if (LibraryPrefix::Cast(obj).is_deferred_load()) {
-        ErrorMsg("Metadata must be compile-time constant");
+        ReportError("Metadata must be compile-time constant");
       }
     }
     AstNode* expr = NULL;
@@ -941,7 +924,7 @@
     } else {
       // Can be x, C.x, or L.C.x.
       expr = ParsePrimary();  // Consumes x, C or L.C.
-      Class& cls = Class::Handle(isolate());
+      Class& cls = Class::Handle(I);
       if (expr->IsPrimaryNode()) {
         PrimaryNode* primary_node = expr->AsPrimaryNode();
         if (primary_node->primary().IsClass()) {
@@ -949,38 +932,39 @@
           // qualified static field.
           cls ^= primary_node->primary().raw();
         } else {
-          ErrorMsg(expr_pos, "Metadata expressions must refer to a const field "
-                             "or constructor");
+          ReportError(expr_pos,
+                      "Metadata expressions must refer to a const field "
+                      "or constructor");
         }
       }
       if (CurrentToken() == Token::kPERIOD) {
         // C.x or L.C.X.
         if (cls.IsNull()) {
-          ErrorMsg(expr_pos, "Metadata expressions must refer to a const field "
-                             "or constructor");
+          ReportError(expr_pos,
+                      "Metadata expressions must refer to a const field "
+                      "or constructor");
         }
         ConsumeToken();
         const intptr_t ident_pos = TokenPos();
         String* ident = ExpectIdentifier("identifier expected");
-        const Field& field = Field::Handle(isolate(),
-                                           cls.LookupStaticField(*ident));
+        const Field& field = Field::Handle(I, cls.LookupStaticField(*ident));
         if (field.IsNull()) {
-          ErrorMsg(ident_pos,
-                   "Class '%s' has no field '%s'",
-                   cls.ToCString(),
-                   ident->ToCString());
+          ReportError(ident_pos,
+                      "Class '%s' has no field '%s'",
+                      cls.ToCString(),
+                      ident->ToCString());
         }
         if (!field.is_const()) {
-          ErrorMsg(ident_pos,
-                   "Field '%s' of class '%s' is not const",
-                   ident->ToCString(),
-                   cls.ToCString());
+          ReportError(ident_pos,
+                      "Field '%s' of class '%s' is not const",
+                      ident->ToCString(),
+                      cls.ToCString());
         }
         expr = GenerateStaticFieldLookup(field, ident_pos);
       }
     }
     if (expr->EvalConstExpr() == NULL) {
-      ErrorMsg(expr_pos, "expression must be a compile-time constant");
+      ReportError(expr_pos, "expression must be a compile-time constant");
     }
     const Instance& val = EvaluateConstExpr(expr_pos, expr);
     meta_values.Add(val);
@@ -994,7 +978,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1002,7 +986,7 @@
 
   intptr_t ident_pos = TokenPos();
   const String& field_name = *ExpectIdentifier("field name expected");
-  const Class& field_class = Class::Handle(isolate(), func.Owner());
+  const Class& field_class = Class::Handle(I, func.Owner());
   const Field& field =
       Field::ZoneHandle(I, field_class.LookupStaticField(field_name));
 
@@ -1019,7 +1003,7 @@
     AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
     // This getter will only be called once at compile time.
     if (expr->EvalConstExpr() == NULL) {
-      ErrorMsg(expr_pos, "initializer is not a valid compile-time constant");
+      ReportError(expr_pos, "initializer is not a valid compile-time constant");
     }
     ReturnNode* return_node = new ReturnNode(ident_pos, expr);
     current_block_->statements->Add(return_node);
@@ -1074,9 +1058,9 @@
             ident_pos,
             field,
             new LiteralNode(ident_pos, Object::transition_sentinel())));
-    const String& init_name = String::Handle(isolate(), Symbols::New(
-        String::Handle(isolate(), String::Concat(
-            Symbols::InitPrefix(), String::Handle(isolate(), field.name())))));
+    const String& init_name = String::Handle(I, Symbols::New(
+        String::Handle(I, String::Concat(
+            Symbols::InitPrefix(), String::Handle(I, field.name())))));
     const Function& init_function = Function::ZoneHandle(I,
         field_class.LookupStaticFunction(init_name));
     ASSERT(!init_function.IsNull());
@@ -1104,7 +1088,7 @@
   ParamList params;
   ASSERT(func.num_fixed_parameters() == 0);  // static.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1152,8 +1136,8 @@
     expr = new AssignableNode(
         field.token_pos(),
         expr,
-        AbstractType::ZoneHandle(isolate(), field.type()),
-        String::ZoneHandle(isolate(), field.name()));
+        AbstractType::ZoneHandle(I, field.type()),
+        String::ZoneHandle(I, field.name()));
   }
   StoreStaticFieldNode* store = new StoreStaticFieldNode(field.token_pos(),
                                                          field,
@@ -1220,7 +1204,7 @@
   params.AddReceiver(ReceiverType(current_class()), ident_pos);
   ASSERT(func.num_fixed_parameters() == 1);  // receiver.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1231,7 +1215,7 @@
   LoadLocalNode* load_receiver = new LoadLocalNode(ident_pos, receiver);
   ASSERT(IsIdentifier());
   const String& field_name = *CurrentLiteral();
-  const Class& field_class = Class::Handle(isolate(), func.Owner());
+  const Class& field_class = Class::Handle(I, func.Owner());
   const Field& field =
       Field::ZoneHandle(I, field_class.LookupInstanceField(field_name));
 
@@ -1268,7 +1252,7 @@
                            &field_type);
   ASSERT(func.num_fixed_parameters() == 2);  // receiver, value.
   ASSERT(!func.HasOptionalParameters());
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsVoidType());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsVoidType());
 
   // Build local scope for function and populate with the formal parameters.
   OpenFunctionBlock(func);
@@ -1368,7 +1352,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  ArgumentsDescriptor desc(Array::Handle(isolate(), func.saved_args_desc()));
+  ArgumentsDescriptor desc(Array::Handle(I, func.saved_args_desc()));
   ASSERT(desc.Count() > 0);
 
   // Set up scope for this function.
@@ -1385,7 +1369,7 @@
     const Array& arg_names =
         Array::ZoneHandle(I, Array::New(desc.NamedCount()));
     for (intptr_t i = 0; i < arg_names.Length(); ++i) {
-      arg_names.SetAt(i, String::Handle(isolate(), desc.NameAt(i)));
+      arg_names.SetAt(i, String::Handle(I, desc.NameAt(i)));
     }
     func_args->set_names(arg_names);
   }
@@ -1395,7 +1379,7 @@
       token_pos, func_name, *func_args, NULL, false);
   const Function& no_such_method = Function::ZoneHandle(I,
       Resolver::ResolveDynamicAnyArgs(Class::Handle(
-          isolate(), func.Owner()), Symbols::NoSuchMethod()));
+          I, func.Owner()), Symbols::NoSuchMethod()));
   StaticCallNode* call =
       new StaticCallNode(token_pos, no_such_method, arguments);
 
@@ -1414,7 +1398,7 @@
   ASSERT(func.token_pos() == 0);
   ASSERT(current_class().raw() == func.Owner());
 
-  const Array& args_desc = Array::Handle(isolate(), func.saved_args_desc());
+  const Array& args_desc = Array::Handle(I, func.saved_args_desc());
   ArgumentsDescriptor desc(args_desc);
   ASSERT(desc.Count() > 0);
 
@@ -1426,16 +1410,16 @@
   ArgumentListNode* no_args = new ArgumentListNode(token_pos);
   LoadLocalNode* receiver = new LoadLocalNode(token_pos, scope->VariableAt(0));
 
-  const String& name = String::Handle(isolate(), func.name());
+  const String& name = String::Handle(I, func.name());
   const String& getter_name = String::ZoneHandle(I,
-      Symbols::New(String::Handle(isolate(), Field::GetterName(name))));
-  InstanceCallNode* getter_call = new(isolate()) InstanceCallNode(
+      Symbols::New(String::Handle(I, Field::GetterName(name))));
+  InstanceCallNode* getter_call = new(I) InstanceCallNode(
       token_pos, receiver, getter_name, no_args);
 
   // Pass arguments 1..n to the closure call.
-  ArgumentListNode* args = new ArgumentListNode(token_pos);
+  ArgumentListNode* args = new(I) ArgumentListNode(token_pos);
   const Array& names = Array::Handle(
-      isolate(), Array::New(desc.NamedCount(), Heap::kOld));
+      I, Array::New(desc.NamedCount(), Heap::kOld));
   // Positional parameters.
   intptr_t i = 1;
   for (; i < desc.PositionalCount(); ++i) {
@@ -1443,13 +1427,13 @@
   }
   // Named parameters.
   for (; i < desc.Count(); i++) {
-    args->Add(new LoadLocalNode(token_pos, scope->VariableAt(i)));
+    args->Add(new(I) LoadLocalNode(token_pos, scope->VariableAt(i)));
     intptr_t index = i - desc.PositionalCount();
-    names.SetAt(index, String::Handle(isolate(), desc.NameAt(index)));
+    names.SetAt(index, String::Handle(I, desc.NameAt(index)));
   }
   args->set_names(names);
 
-  const Class& owner = Class::Handle(isolate(), func.Owner());
+  const Class& owner = Class::Handle(I, func.Owner());
   ASSERT(!owner.IsNull());
   AstNode* result = NULL;
   if (owner.IsSignatureClass() && name.Equals(Symbols::Call())) {
@@ -1514,9 +1498,9 @@
     }
   } while (!token_stack.is_empty() && is_match && !unexpected_token_found);
   if (!is_match) {
-    ErrorMsg(token_pos, "unbalanced '%s'", Token::Str(token));
+    ReportError(token_pos, "unbalanced '%s'", Token::Str(token));
   } else if (unexpected_token_found) {
-    ErrorMsg(block_start_pos, "unterminated block");
+    ReportError(block_start_pos, "unterminated block");
   }
 }
 
@@ -1563,7 +1547,7 @@
     // At this point, we must see an identifier for the type or the
     // function parameter.
     if (!IsIdentifier()) {
-      ErrorMsg("parameter name or type expected");
+      ReportError("parameter name or type expected");
     }
     // We have not seen a parameter type yet, so we check if the next
     // identifier could represent a type before parsing it.
@@ -1603,7 +1587,7 @@
 
   if (params->has_optional_named_parameters &&
       (parameter.name->CharAt(0) == '_')) {
-    ErrorMsg(parameter.name_pos, "named parameter must not be private");
+    ReportError(parameter.name_pos, "named parameter must not be private");
   }
 
   // Check for duplicate formal parameters.
@@ -1612,8 +1596,8 @@
   for (intptr_t i = 0; i < num_existing_parameters; i++) {
     ParamDesc& existing_parameter = (*params->parameters)[i];
     if (existing_parameter.name->Equals(*parameter.name)) {
-      ErrorMsg(parameter.name_pos, "duplicate formal parameter '%s'",
-               parameter.name->ToCString());
+      ReportError(parameter.name_pos, "duplicate formal parameter '%s'",
+                  parameter.name->ToCString());
     }
   }
 
@@ -1624,7 +1608,7 @@
     if (!var_seen && !parameter.is_final) {
       // The parsed parameter type is actually the function result type.
       const AbstractType& result_type =
-          AbstractType::Handle(isolate(), parameter.type->raw());
+          AbstractType::Handle(I, parameter.type->raw());
 
       // Finish parsing the function type parameter.
       ParamList func_params;
@@ -1639,7 +1623,7 @@
       ParseFormalParameterList(no_explicit_default_values, false, &func_params);
 
       // The field 'is_static' has no meaning for signature functions.
-      const Function& signature_function = Function::Handle(isolate(),
+      const Function& signature_function = Function::Handle(I,
           Function::New(*parameter.name,
                         RawFunction::kSignatureFunction,
                         /* is_static = */ false,
@@ -1651,7 +1635,7 @@
                         parameter.name_pos));
       signature_function.set_result_type(result_type);
       AddFormalParamsToFunction(&func_params, signature_function);
-      const String& signature = String::Handle(isolate(),
+      const String& signature = String::Handle(I,
                                                signature_function.Signature());
       // Lookup the signature class, i.e. the class whose name is the signature.
       // We only lookup in the current library, but not in its imports, and only
@@ -1692,7 +1676,7 @@
     if ((!params->has_optional_positional_parameters &&
          !params->has_optional_named_parameters) ||
         !allow_explicit_default_value) {
-      ErrorMsg("parameter must not specify a default value");
+      ReportError("parameter must not specify a default value");
     }
     if (params->has_optional_positional_parameters) {
       ExpectToken(Token::kASSIGN);
@@ -1720,7 +1704,8 @@
     }
   }
   if (parameter.type->IsVoidType()) {
-    ErrorMsg("parameter '%s' may not be 'void'", parameter.name->ToCString());
+    ReportError("parameter '%s' may not be 'void'",
+                parameter.name->ToCString());
   }
   if (params->implicitly_final) {
     parameter.is_final = true;
@@ -1784,7 +1769,7 @@
     if ((CurrentToken() != Token::kRPAREN) &&
         !params->has_optional_positional_parameters &&
         !params->has_optional_named_parameters) {
-      ErrorMsg("',' or ')' expected");
+      ReportError("',' or ')' expected");
     }
   } else {
     ConsumeToken();
@@ -1813,13 +1798,12 @@
                                       ArgumentListNode* arguments,
                                       bool resolve_getter,
                                       bool* is_no_such_method) {
-  const Class& super_class = Class::Handle(
-      isolate(), current_class().SuperClass());
+  const Class& super_class = Class::Handle(I, current_class().SuperClass());
   if (super_class.IsNull()) {
-    ErrorMsg(token_pos, "class '%s' does not have a superclass",
-             String::Handle(isolate(), current_class().Name()).ToCString());
+    ReportError(token_pos, "class '%s' does not have a superclass",
+                String::Handle(I, current_class().Name()).ToCString());
   }
-  Function& super_func = Function::Handle(isolate(),
+  Function& super_func = Function::Handle(I,
       Resolver::ResolveDynamicAnyArgs(super_class, name));
   if (!super_func.IsNull() &&
       !super_func.AreValidArguments(arguments->length(),
@@ -1988,7 +1972,7 @@
     }
     super_op = new StaticCallNode(super_pos, super_operator, op_arguments);
   } else {
-    ErrorMsg(super_pos, "illegal super operator call");
+    ReportError(super_pos, "illegal super operator call");
   }
   return super_op;
 }
@@ -2063,7 +2047,7 @@
     // parameterized class, make sure that the receiver is captured as
     // instantiator.
     if (current_block_->scope->function_level() > 0) {
-      const Class& signature_class = Class::Handle(isolate(),
+      const Class& signature_class = Class::Handle(I,
           implicit_closure_function.signature_class());
       if (signature_class.NumTypeParameters() > 0) {
         CaptureInstantiator();
@@ -2079,8 +2063,8 @@
   TRACE_PARSER("ParseSuperFieldAccess");
   const Class& super_class = Class::ZoneHandle(I, current_class().SuperClass());
   if (super_class.IsNull()) {
-    ErrorMsg("class '%s' does not have a superclass",
-             String::Handle(isolate(), current_class().Name()).ToCString());
+    ReportError("class '%s' does not have a superclass",
+                String::Handle(I, current_class().Name()).ToCString());
   }
   AstNode* implicit_argument = LoadReceiver(field_pos);
 
@@ -2120,16 +2104,16 @@
                                           intptr_t supercall_pos,
                                           LocalVariable* receiver,
                                           ArgumentListNode* forwarding_args) {
-  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
+  const Class& super_class = Class::Handle(I, cls.SuperClass());
   // Omit the implicit super() if there is no super class (i.e.
   // we're not compiling class Object), or if the super class is an
   // artificially generated "wrapper class" that has no constructor.
   if (super_class.IsNull() ||
       (super_class.num_native_fields() > 0 &&
-       Class::Handle(isolate(), super_class.SuperClass()).IsObjectClass())) {
+       Class::Handle(I, super_class.SuperClass()).IsObjectClass())) {
     return;
   }
-  String& super_ctor_name = String::Handle(isolate(), super_class.Name());
+  String& super_ctor_name = String::Handle(I, super_class.Name());
   super_ctor_name = String::Concat(super_ctor_name, Symbols::Dot());
 
   ArgumentListNode* arguments = new ArgumentListNode(supercall_pos);
@@ -2149,8 +2133,8 @@
     for (int i = 0; i < forwarding_args->length(); i++) {
       arguments->Add(forwarding_args->NodeAt(i));
     }
-    String& ctor_name = String::Handle(isolate(), current_function().name());
-    String& class_name = String::Handle(isolate(), cls.Name());
+    String& ctor_name = String::Handle(I, current_function().name());
+    String& class_name = String::Handle(I, cls.Name());
     if (ctor_name.Length() > class_name.Length() + 1) {
       // Generating a forwarding call to a named constructor 'C.n'.
       // Add the constructor name 'n' to the super constructor.
@@ -2163,22 +2147,22 @@
   const Function& super_ctor = Function::ZoneHandle(I,
       super_class.LookupConstructor(super_ctor_name));
   if (super_ctor.IsNull()) {
-      ErrorMsg(supercall_pos,
-               "unresolved implicit call to super constructor '%s()'",
-               String::Handle(isolate(), super_class.Name()).ToCString());
+      ReportError(supercall_pos,
+                  "unresolved implicit call to super constructor '%s()'",
+                  String::Handle(I, super_class.Name()).ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
-    ErrorMsg(supercall_pos, "implicit call to non-const super constructor");
+    ReportError(supercall_pos, "implicit call to non-const super constructor");
   }
 
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
-    ErrorMsg(supercall_pos,
-             "invalid arguments passed to super constructor '%s()': %s",
-             String::Handle(isolate(), super_class.Name()).ToCString(),
-             error_message.ToCString());
+    ReportError(supercall_pos,
+                "invalid arguments passed to super constructor '%s()': %s",
+                String::Handle(I, super_class.Name()).ToCString(),
+                error_message.ToCString());
   }
   current_block_->statements->Add(
       new StaticCallNode(supercall_pos, super_ctor, arguments));
@@ -2191,9 +2175,9 @@
   ASSERT(CurrentToken() == Token::kSUPER);
   const intptr_t supercall_pos = TokenPos();
   ConsumeToken();
-  const Class& super_class = Class::Handle(isolate(), cls.SuperClass());
+  const Class& super_class = Class::Handle(I, cls.SuperClass());
   ASSERT(!super_class.IsNull());
-  String& ctor_name = String::Handle(isolate(), super_class.Name());
+  String& ctor_name = String::Handle(I, super_class.Name());
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -2223,21 +2207,21 @@
   const Function& super_ctor = Function::ZoneHandle(I,
       super_class.LookupConstructor(ctor_name));
   if (super_ctor.IsNull()) {
-    ErrorMsg(supercall_pos,
-             "super class constructor '%s' not found",
-             ctor_name.ToCString());
+    ReportError(supercall_pos,
+                "super class constructor '%s' not found",
+                ctor_name.ToCString());
   }
   if (current_function().is_const() && !super_ctor.is_const()) {
-    ErrorMsg(supercall_pos, "super constructor must be const");
+    ReportError(supercall_pos, "super constructor must be const");
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!super_ctor.AreValidArguments(arguments->length(),
                                     arguments->names(),
                                     &error_message)) {
-    ErrorMsg(supercall_pos,
-             "invalid arguments passed to super class constructor '%s': %s",
-             ctor_name.ToCString(),
-             error_message.ToCString());
+    ReportError(supercall_pos,
+                "invalid arguments passed to super class constructor '%s': %s",
+                ctor_name.ToCString(),
+                error_message.ToCString());
   }
   return new StaticCallNode(supercall_pos, super_ctor, arguments);
 }
@@ -2265,13 +2249,13 @@
   receiver->set_invisible(false);
   SetAllowFunctionLiterals(saved_mode);
   if (current_function().is_const() && !init_expr->IsPotentiallyConst()) {
-    ErrorMsg(field_pos,
-             "initializer expression must be compile time constant.");
+    ReportError(field_pos,
+                "initializer expression must be compile time constant.");
   }
   Field& field = Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
   if (field.IsNull()) {
-    ErrorMsg(field_pos, "unresolved reference to instance field '%s'",
-             field_name.ToCString());
+    ReportError(field_pos, "unresolved reference to instance field '%s'",
+                field_name.ToCString());
   }
   CheckDuplicateFieldInit(field_pos, initialized_fields, &field);
   AstNode* instance = new LoadLocalNode(field_pos, receiver);
@@ -2281,8 +2265,8 @@
 
 
 void Parser::CheckFieldsInitialized(const Class& cls) {
-  const Array& fields = Array::Handle(isolate(), cls.fields());
-  Field& field = Field::Handle(isolate());
+  const Array& fields = Array::Handle(I, cls.fields());
+  Field& field = Field::Handle(I);
   SequenceNode* initializers = current_block_->statements;
   for (int field_num = 0; field_num < fields.Length(); field_num++) {
     field ^= fields.At(field_num);
@@ -2305,7 +2289,7 @@
 
     if (found) continue;
 
-    field.RecordStore(Object::Handle(isolate()));
+    field.RecordStore(Object::Handle(I));
   }
 }
 
@@ -2315,14 +2299,14 @@
   // from a different class. We need to save and restore current
   // class, library, and token stream (script).
   ASSERT(current_class().raw() != field.origin());
-  const Class& saved_class = Class::Handle(isolate(), current_class().raw());
-  const Library& saved_library = Library::Handle(isolate(), library().raw());
-  const Script& saved_script = Script::Handle(isolate(), script().raw());
+  const Class& saved_class = Class::Handle(I, current_class().raw());
+  const Library& saved_library = Library::Handle(I, library().raw());
+  const Script& saved_script = Script::Handle(I, script().raw());
   const intptr_t saved_token_pos = TokenPos();
 
-  set_current_class(Class::Handle(isolate(), field.origin()));
-  set_library(Library::Handle(isolate(), current_class().library()));
-  SetScript(Script::Handle(isolate(), current_class().script()),
+  set_current_class(Class::Handle(I, field.origin()));
+  set_library(Library::Handle(I, current_class().library()));
+  SetScript(Script::Handle(I, current_class().script()),
             field.token_pos());
 
   ASSERT(IsIdentifier());
@@ -2351,8 +2335,8 @@
                  LocalVariable* receiver,
                  GrowableArray<Field*>* initialized_fields) {
   TRACE_PARSER("ParseInitializedInstanceFields");
-  const Array& fields = Array::Handle(isolate(), cls.fields());
-  Field& f = Field::Handle(isolate());
+  const Array& fields = Array::Handle(I, cls.fields());
+  Field& f = Field::Handle(I);
   const intptr_t saved_pos = TokenPos();
   for (int i = 0; i < fields.Length(); i++) {
     f ^= fields.At(i);
@@ -2406,9 +2390,9 @@
   for (int i = 0; i < initialized_fields->length(); i++) {
     Field* initialized_field = (*initialized_fields)[i];
     if (initialized_field->raw() == field->raw()) {
-      ErrorMsg(init_pos,
-               "duplicate initialization for field %s",
-               String::Handle(isolate(), field->name()).ToCString());
+      ReportError(init_pos,
+                  "duplicate initialization for field %s",
+                  String::Handle(I, field->name()).ToCString());
     }
   }
   initialized_fields->Add(field);
@@ -2426,7 +2410,7 @@
       AstNode* init_statement;
       if (CurrentToken() == Token::kSUPER) {
         if (super_init_seen) {
-          ErrorMsg("duplicate call to super constructor");
+          ReportError("duplicate call to super constructor");
         }
         init_statement = ParseSuperInitializer(cls, receiver);
         super_init_seen = true;
@@ -2452,7 +2436,7 @@
   ASSERT(CurrentToken() == Token::kTHIS);
   const intptr_t call_pos = TokenPos();
   ConsumeToken();
-  String& ctor_name = String::Handle(isolate(), cls.Name());
+  String& ctor_name = String::Handle(I, cls.Name());
 
   ctor_name = String::Concat(ctor_name, Symbols::Dot());
   if (CurrentToken() == Token::kPERIOD) {
@@ -2478,16 +2462,16 @@
   const Function& redirect_ctor = Function::ZoneHandle(I,
       cls.LookupConstructor(ctor_name));
   if (redirect_ctor.IsNull()) {
-    ErrorMsg(call_pos, "constructor '%s' not found", ctor_name.ToCString());
+    ReportError(call_pos, "constructor '%s' not found", ctor_name.ToCString());
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!redirect_ctor.AreValidArguments(arguments->length(),
                                        arguments->names(),
                                        &error_message)) {
-    ErrorMsg(call_pos,
-             "invalid arguments passed to constructor '%s': %s",
-             ctor_name.ToCString(),
-             error_message.ToCString());
+    ReportError(call_pos,
+                "invalid arguments passed to constructor '%s': %s",
+                ctor_name.ToCString(),
+                error_message.ToCString());
   }
   current_block_->statements->Add(
       new StaticCallNode(call_pos, redirect_ctor, arguments));
@@ -2537,8 +2521,15 @@
     // TODO(hausner): Remove this limitation if the language spec indeed
     // allows optional parameters.
     if (func.HasOptionalParameters()) {
-      ErrorMsg(ctor_pos,
-               "forwarding constructors must not have optional parameters");
+      const Class& super_class = Class::Handle(I, current_class().SuperClass());
+      ReportError(ctor_pos,
+                  "cannot generate an implicit mixin application constructor "
+                  "forwarding to a super class constructor with optional "
+                  "parameters; add a constructor without optional parameters "
+                  "to class '%s' that redirects to the constructor with "
+                  "optional parameters and invoke it via super from a "
+                  "constructor of the class extending the mixin application",
+                  String::Handle(I, super_class.Name()).ToCString());
     }
 
     // Prepare user-defined arguments to be forwarded to super call.
@@ -2569,13 +2560,13 @@
 
 void Parser::CheckRecursiveInvocation() {
   const GrowableObjectArray& pending_functions =
-      GrowableObjectArray::Handle(isolate(),
-          isolate()->object_store()->pending_functions());
+      GrowableObjectArray::Handle(I,
+          I->object_store()->pending_functions());
   for (int i = 0; i < pending_functions.Length(); i++) {
     if (pending_functions.At(i) == current_function().raw()) {
       const String& fname =
-          String::Handle(isolate(), current_function().UserVisibleName());
-      ErrorMsg("circular dependency for function %s", fname.ToCString());
+          String::Handle(I, current_function().UserVisibleName());
+      ReportError("circular dependency for function %s", fname.ToCString());
     }
   }
   ASSERT(!unregister_pending_function_);
@@ -2593,7 +2584,7 @@
   ASSERT(!func.IsFactory());
   ASSERT(!func.is_static());
   ASSERT(!func.IsLocalFunction());
-  const Class& cls = Class::Handle(isolate(), func.Owner());
+  const Class& cls = Class::Handle(I, func.Owner());
   ASSERT(!cls.IsNull());
 
   CheckRecursiveInvocation();
@@ -2630,7 +2621,7 @@
   ParseFormalParameterList(allow_explicit_default_values, false, &params);
 
   SetupDefaultsForOptionalParams(&params, default_parameter_values);
-  ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+  ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
   ASSERT(func.NumParameters() == params.parameters->length());
 
   // Now populate function scope with the formal parameters.
@@ -2672,14 +2663,14 @@
         Field& field =
             Field::ZoneHandle(I, cls.LookupInstanceField(field_name));
         if (field.IsNull()) {
-          ErrorMsg(param.name_pos,
-                   "unresolved reference to instance field '%s'",
-                   field_name.ToCString());
+          ReportError(param.name_pos,
+                      "unresolved reference to instance field '%s'",
+                      field_name.ToCString());
         }
         if (is_redirecting_constructor) {
-          ErrorMsg(param.name_pos,
-                   "redirecting constructors may not have "
-                   "initializing formal parameters");
+          ReportError(param.name_pos,
+                      "redirecting constructors may not have "
+                      "initializing formal parameters");
         }
         CheckDuplicateFieldInit(param.name_pos, &initialized_fields, &field);
 
@@ -2837,12 +2828,24 @@
     ParseStatementSequence();
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
-    ErrorMsg("constructors may not return a value");
+    ReportError("constructors may not return a value");
   } else if (IsLiteral("native")) {
-    ErrorMsg("native constructors not supported");
+    ReportError("native constructors not supported");
   } else if (CurrentToken() == Token::kSEMICOLON) {
     // Some constructors have no function body.
     ConsumeToken();
+    if (func.is_external()) {
+      // Body of an external method contains a single throw.
+      const String& function_name = String::ZoneHandle(func.name());
+      current_block_->statements->Add(
+          ThrowNoSuchMethodError(TokenPos(),
+                                 cls,
+                                 function_name,
+                                 NULL,   // No arguments.
+                                 InvocationMirror::kStatic,
+                                 InvocationMirror::kMethod,
+                                 NULL));  // No existing function.
+    }
   } else {
     UnexpectedToken();
   }
@@ -2881,7 +2884,7 @@
                                 Array* default_parameter_values) {
   TRACE_PARSER("ParseFunc");
   Function& saved_innermost_function =
-      Function::Handle(isolate(), innermost_function().raw());
+      Function::Handle(I, innermost_function().raw());
   innermost_function_ = func.raw();
 
   // Save current try index. Try index starts at zero for each function.
@@ -2937,7 +2940,7 @@
       AddFormalParamsToFunction(&params, func);
     }
     SetupDefaultsForOptionalParams(&params, default_parameter_values);
-    ASSERT(AbstractType::Handle(isolate(), func.result_type()).IsResolved());
+    ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
     ASSERT(func.NumParameters() == params.parameters->length());
 
     // Check whether the function has any field initializer formal parameters,
@@ -2946,8 +2949,8 @@
       for (int i = 0; i < params.parameters->length(); i++) {
         ParamDesc& param = (*params.parameters)[i];
         if (param.is_field_initializer) {
-          ErrorMsg(param.name_pos,
-                   "field initializer only allowed in constructors");
+          ReportError(param.name_pos,
+                      "field initializer only allowed in constructors");
         }
       }
     }
@@ -2972,9 +2975,9 @@
   intptr_t end_token_pos = 0;
   if (CurrentToken() == Token::kLBRACE) {
     ConsumeToken();
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2984,9 +2987,9 @@
     ExpectToken(Token::kRBRACE);
   } else if (CurrentToken() == Token::kARROW) {
     ConsumeToken();
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -2997,9 +3000,9 @@
     current_block_->statements->Add(new ReturnNode(expr_pos, expr));
     end_token_pos = TokenPos();
   } else if (IsLiteral("native")) {
-    if (String::Handle(isolate(), func.name()).Equals(
+    if (String::Handle(I, func.name()).Equals(
         Symbols::EqualOperator())) {
-      const Class& owner = Class::Handle(isolate(), func.Owner());
+      const Class& owner = Class::Handle(I, func.Owner());
       if (!owner.IsObjectClass()) {
         AddEqualityNullCheck();
       }
@@ -3012,7 +3015,7 @@
     const String& function_name = String::ZoneHandle(I, func.name());
     current_block_->statements->Add(
         ThrowNoSuchMethodError(TokenPos(),
-                               current_class(),
+                               Class::Handle(func.Owner()),
                                function_name,
                                NULL,  // Ignore arguments.
                                func.is_static() ?
@@ -3111,45 +3114,46 @@
 }
 
 
-void Parser::ParseQualIdent(QualIdent* qual_ident) {
-  TRACE_PARSER("ParseQualIdent");
+// If the current identifier is a library prefix followed by a period,
+// consume the identifier and period, and return the resolved library
+// prefix.
+RawLibraryPrefix* Parser::ParsePrefix() {
   ASSERT(IsIdentifier());
-  ASSERT(!current_class().IsNull());
-  qual_ident->ident_pos = TokenPos();
-  qual_ident->ident = CurrentLiteral();
-  qual_ident->lib_prefix = NULL;
-  ConsumeToken();
-  if (CurrentToken() == Token::kPERIOD) {
-    // An identifier cannot be resolved in a local scope when top level parsing.
-    if (is_top_level_ ||
-        !ResolveIdentInLocalScope(qual_ident->ident_pos,
-                                  *(qual_ident->ident),
-                                  NULL)) {
-      LibraryPrefix& lib_prefix = LibraryPrefix::ZoneHandle(I);
-      if (!current_class().IsMixinApplication()) {
-        lib_prefix = current_class().LookupLibraryPrefix(*(qual_ident->ident));
-      } else {
-        // TODO(hausner): Should we resolve the prefix via the library scope
-        // rather than via the class?
-        Class& cls = Class::Handle(isolate(),
-                                   parsed_function()->function().origin());
-        lib_prefix = cls.LookupLibraryPrefix(*(qual_ident->ident));
-      }
-      if (!lib_prefix.IsNull()) {
-        // We have a library prefix qualified identifier, unless the prefix is
-        // shadowed by a type parameter in scope.
-        if (current_class().IsNull() ||
-            (current_class().LookupTypeParameter(*(qual_ident->ident)) ==
-             TypeParameter::null())) {
-          ConsumeToken();  // Consume the kPERIOD token.
-          qual_ident->lib_prefix = &lib_prefix;
-          qual_ident->ident_pos = TokenPos();
-          qual_ident->ident =
-              ExpectIdentifier("identifier expected after '.'");
-        }
-      }
-    }
+  // A library prefix can never stand by itself. It must be followed by
+  // a period.
+  if (LookaheadToken(1) != Token::kPERIOD) {
+    return LibraryPrefix::null();
   }
+  const String& ident = *CurrentLiteral();
+
+  // It is relatively fast to look up a name in the library dictionary,
+  // compared to searching the nested local scopes. Look up the name
+  // in the library scope and return in the common case where ident is
+  // not a library prefix.
+  LibraryPrefix& prefix =
+      LibraryPrefix::Handle(I, library_.LookupLocalLibraryPrefix(ident));
+  if (prefix.IsNull()) {
+    return LibraryPrefix::null();
+  }
+
+  // A library prefix with the name exists. Now check whether it is
+  // shadowed by a local definition.
+  if (!is_top_level_ &&
+      ResolveIdentInLocalScope(TokenPos(), ident, NULL)) {
+    return LibraryPrefix::null();
+  }
+  // Check whether the identifier is shadowed by a type parameter.
+  ASSERT(!current_class().IsNull());
+  if (current_class().LookupTypeParameter(ident) != TypeParameter::null()) {
+    return LibraryPrefix::null();
+  }
+
+  // We have a name that is not shadowed, followed by a period.
+  // Consume the identifier and the period.
+  ConsumeToken();
+  ASSERT(CurrentToken() == Token::kPERIOD);  // We checked above.
+  ConsumeToken();
+  return prefix.raw();
 }
 
 
@@ -3161,21 +3165,21 @@
   ASSERT(current_member_ == method);
 
   if (method->has_var) {
-    ErrorMsg(method->name_pos, "keyword var not allowed for methods");
+    ReportError(method->name_pos, "keyword var not allowed for methods");
   }
   if (method->has_final) {
-    ErrorMsg(method->name_pos, "'final' not allowed for methods");
+    ReportError(method->name_pos, "'final' not allowed for methods");
   }
   if (method->has_abstract && method->has_static) {
-    ErrorMsg(method->name_pos,
-             "static method '%s' cannot be abstract",
-             method->name->ToCString());
-  }
+    ReportError(method->name_pos,
+                "static method '%s' cannot be abstract",
+                method->name->ToCString());
+     }
   if (method->has_const && !method->IsFactoryOrConstructor()) {
-    ErrorMsg(method->name_pos, "'const' not allowed for methods");
+    ReportError(method->name_pos, "'const' not allowed for methods");
   }
   if (method->has_abstract && method->IsFactoryOrConstructor()) {
-    ErrorMsg(method->name_pos, "constructor cannot be abstract");
+    ReportError(method->name_pos, "constructor cannot be abstract");
   }
   if (method->has_const && method->IsConstructor()) {
     current_class().set_is_const();
@@ -3243,36 +3247,46 @@
     }
     if ((method->params.num_fixed_parameters != expected_num_parameters) ||
         (method->params.num_optional_parameters != 0)) {
-      ErrorMsg(method->name_pos, "illegal %s parameters",
-               method->IsGetter() ? "getter" : "setter");
+      ReportError(method->name_pos, "illegal %s parameters",
+                  method->IsGetter() ? "getter" : "setter");
     }
   }
 
   // Parse redirecting factory constructor.
-  Type& redirection_type = Type::Handle(isolate());
-  String& redirection_identifier = String::Handle(isolate());
+  Type& redirection_type = Type::Handle(I);
+  String& redirection_identifier = String::Handle(I);
   bool is_redirecting = false;
   if (method->IsFactory() && (CurrentToken() == Token::kASSIGN)) {
     // Default parameter values are disallowed in redirecting factories.
     if (method->params.has_explicit_default_values) {
-      ErrorMsg("redirecting factory '%s' may not specify default values "
-               "for optional parameters",
-               method->name->ToCString());
+      ReportError("redirecting factory '%s' may not specify default values "
+                  "for optional parameters",
+                  method->name->ToCString());
+    }
+    if (method->has_external) {
+      ReportError(TokenPos(),
+                  "external factory constructor '%s' may not have redirection",
+                  method->name->ToCString());
     }
     ConsumeToken();
     const intptr_t type_pos = TokenPos();
     is_redirecting = true;
-    const AbstractType& type = AbstractType::Handle(isolate(),
-        ParseType(ClassFinalizer::kResolveTypeParameters));
+    const bool consume_unresolved_prefix =
+        (LookaheadToken(3) == Token::kLT) ||
+        (LookaheadToken(3) == Token::kPERIOD);
+    const AbstractType& type = AbstractType::Handle(I,
+        ParseType(ClassFinalizer::kResolveTypeParameters,
+                  false,  // Deferred types not allowed.
+                  consume_unresolved_prefix));
     if (!type.IsMalformed() && type.IsTypeParameter()) {
       // Replace the type with a malformed type and compile a throw when called.
       redirection_type = ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
           type_pos,
           "factory '%s' may not redirect to type parameter '%s'",
           method->name->ToCString(),
-          String::Handle(isolate(), type.UserVisibleName()).ToCString());
+          String::Handle(I, type.UserVisibleName()).ToCString());
     } else {
       // We handle malformed and malbounded redirection type at run time.
       redirection_type ^= type.raw();
@@ -3285,7 +3299,12 @@
   } else if (CurrentToken() == Token::kCOLON) {
     // Parse initializers.
     if (!method->IsConstructor()) {
-      ErrorMsg("initializers only allowed on constructors");
+      ReportError("initializers only allowed on constructors");
+    }
+    if (method->has_external) {
+      ReportError(TokenPos(),
+                  "external constructor '%s' may not have initializers",
+                  method->name->ToCString());
     }
     if ((LookaheadToken(1) == Token::kTHIS) &&
         ((LookaheadToken(2) == Token::kLPAREN) ||
@@ -3295,8 +3314,8 @@
       if (method->params.has_field_initializer) {
         // Constructors that redirect to another constructor must not
         // initialize any fields using field initializer parameters.
-        ErrorMsg(formal_param_pos, "Redirecting constructor "
-                 "may not use field initializer parameters");
+        ReportError(formal_param_pos, "Redirecting constructor "
+                    "may not use field initializer parameters");
       }
       ConsumeToken();  // Colon.
       ExpectToken(Token::kTHIS);
@@ -3318,29 +3337,38 @@
   // Only constructors can redirect to another method.
   ASSERT((method->redirect_name == NULL) || method->IsConstructor());
 
+  if (method->IsConstructor() &&
+      method->has_external &&
+      method->params.has_field_initializer) {
+    ReportError(method->name_pos,
+                "external constructor '%s' may not have field initializers",
+                method->name->ToCString());
+  }
+
   intptr_t method_end_pos = TokenPos();
   if ((CurrentToken() == Token::kLBRACE) ||
       (CurrentToken() == Token::kARROW)) {
     if (method->has_abstract) {
-      ErrorMsg(method->name_pos,
-               "abstract method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "abstract method '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->has_external) {
-      ErrorMsg(method->name_pos,
-               "external method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "external %s '%s' may not have a function body",
+                  method->IsFactoryOrConstructor() ? "constructor" : "method",
+                  method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const constructor '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "const constructor '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->IsFactory() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const factory '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(TokenPos(),
+                  "const factory '%s' may not have a function body",
+                  method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
-      ErrorMsg(method->name_pos,
-               "Constructor with redirection may not have a function body");
+      ReportError(method->name_pos,
+                  "Constructor with redirection may not have a function body");
     }
     if (CurrentToken() == Token::kLBRACE) {
       SkipBlock();
@@ -3354,17 +3382,17 @@
     }
   } else if (IsLiteral("native")) {
     if (method->has_abstract) {
-      ErrorMsg(method->name_pos,
-               "abstract method '%s' may not have a function body",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "abstract method '%s' may not have a function body",
+                  method->name->ToCString());
     } else if (method->IsConstructor() && method->has_const) {
-      ErrorMsg(method->name_pos,
-               "const constructor '%s' may not be native",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "const constructor '%s' may not be native",
+                  method->name->ToCString());
     }
     if (method->redirect_name != NULL) {
-      ErrorMsg(method->name_pos,
-               "Constructor with redirection may not have a function body");
+      ReportError(method->name_pos,
+                  "Constructor with redirection may not have a function body");
     }
     ParseNativeDeclaration();
     method_end_pos = TokenPos();
@@ -3377,9 +3405,9 @@
         !method->has_external &&
         redirection_type.IsNull();
     if (must_have_body) {
-      ErrorMsg(method->name_pos,
-               "function body expected for method '%s'",
-               method->name->ToCString());
+      ReportError(method->name_pos,
+                  "function body expected for method '%s'",
+                  method->name->ToCString());
     }
 
     if (CurrentToken() == Token::kSEMICOLON) {
@@ -3401,9 +3429,9 @@
       if (must_have_semicolon) {
         ExpectSemicolon();
       } else {
-        ErrorMsg(method->name_pos,
-                 "function body or semicolon expected for method '%s'",
-                 method->name->ToCString());
+        ReportError(method->name_pos,
+                    "function body or semicolon expected for method '%s'",
+                    method->name->ToCString());
       }
     }
   }
@@ -3418,7 +3446,7 @@
   } else {
     function_kind = RawFunction::kRegularFunction;
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(*method->name,
                     function_kind,
                     method->has_static,
@@ -3473,21 +3501,21 @@
   ASSERT(!field->has_const || field->has_final);
 
   if (field->has_abstract) {
-    ErrorMsg("keyword 'abstract' not allowed in field declaration");
+    ReportError("keyword 'abstract' not allowed in field declaration");
   }
   if (field->has_external) {
-    ErrorMsg("keyword 'external' not allowed in field declaration");
+    ReportError("keyword 'external' not allowed in field declaration");
   }
   if (field->has_factory) {
-    ErrorMsg("keyword 'factory' not allowed in field declaration");
+    ReportError("keyword 'factory' not allowed in field declaration");
   }
   if (!field->has_static && field->has_const) {
-    ErrorMsg(field->name_pos, "instance field may not be 'const'");
+    ReportError(field->name_pos, "instance field may not be 'const'");
   }
-  Function& getter = Function::Handle(isolate());
-  Function& setter = Function::Handle(isolate());
+  Function& getter = Function::Handle(I);
+  Function& setter = Function::Handle(I);
   Field& class_field = Field::ZoneHandle(I);
-  Instance& init_value = Instance::Handle(isolate());
+  Instance& init_value = Instance::Handle(I);
   while (true) {
     bool has_initializer = CurrentToken() == Token::kASSIGN;
     bool has_simple_literal = false;
@@ -3506,7 +3534,7 @@
       // value is not assignable (assuming checked mode and disregarding actual
       // mode), the field value is reset and a kImplicitStaticFinalGetter is
       // created at finalization time.
-      if (field->has_static && (LookaheadToken(1) == Token::kSEMICOLON)) {
+      if (LookaheadToken(1) == Token::kSEMICOLON) {
         has_simple_literal = IsSimpleLiteral(*field->type, &init_value);
       }
       SkipExpr();
@@ -3514,10 +3542,10 @@
       // Static const and static final fields must have an initializer.
       // Static const fields are implicitly final.
       if (field->has_static && field->has_final) {
-        ErrorMsg(field->name_pos,
-                 "static %s field '%s' must have an initializer expression",
-                 field->has_const ? "const" : "final",
-                 field->name->ToCString());
+        ReportError(field->name_pos,
+                    "static %s field '%s' must have an initializer expression",
+                    field->has_const ? "const" : "final",
+                    field->name->ToCString());
       }
     }
 
@@ -3536,12 +3564,19 @@
       library_.AddFieldMetadata(class_field, field->metadata_pos);
     }
 
+    // Start tracking types for fields with simple initializers in their
+    // definition. This avoids some of the overhead to track this at runtime
+    // and rules out many fields from being unnecessary unboxing candidates.
+    if (!field->has_static && has_initializer && has_simple_literal) {
+      class_field.RecordStore(init_value);
+    }
+
     // For static final fields (this includes static const fields), set value to
     // "uninitialized" and create a kImplicitStaticFinalGetter getter method.
     if (field->has_static && has_initializer) {
       class_field.set_value(init_value);
       if (!has_simple_literal) {
-        String& getter_name = String::Handle(isolate(),
+        String& getter_name = String::Handle(I,
                                              Field::GetterSymbol(*field->name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -3566,7 +3601,7 @@
 
     // For instance fields, we create implicit getter and setter methods.
     if (!field->has_static) {
-      String& getter_name = String::Handle(isolate(),
+      String& getter_name = String::Handle(I,
                                            Field::GetterSymbol(*field->name));
       getter = Function::New(getter_name, RawFunction::kImplicitGetter,
                              field->has_static,
@@ -3584,7 +3619,7 @@
       members->AddFunction(getter);
       if (!field->has_final) {
         // Build a setter accessor for non-const fields.
-        String& setter_name = String::Handle(isolate(),
+        String& setter_name = String::Handle(I,
                                              Field::SetterSymbol(*field->name));
         setter = Function::New(setter_name, RawFunction::kImplicitSetter,
                                field->has_static,
@@ -3600,7 +3635,7 @@
         params.AddFinalParameter(TokenPos(),
                                  &Symbols::Value(),
                                  field->type);
-        setter.set_result_type(Type::Handle(isolate(), Type::VoidType()));
+        setter.set_result_type(Type::Handle(I, Type::VoidType()));
         AddFormalParamsToFunction(&params, setter);
         members->AddFunction(setter);
       }
@@ -3632,8 +3667,8 @@
       member.params.has_optional_named_parameters ||
       (member.params.num_fixed_parameters != expected_num_parameters)) {
     // Subtract receiver when reporting number of expected arguments.
-    ErrorMsg(member.name_pos, "operator %s expects %" Pd " argument(s)",
-        member.name->ToCString(), (expected_num_parameters - 1));
+    ReportError(member.name_pos, "operator %s expects %" Pd " argument(s)",
+                member.name->ToCString(), (expected_num_parameters - 1));
   }
 }
 
@@ -3642,25 +3677,25 @@
                                      MemberDesc* member) {
   const String& name = *member->DictName();
   if (name.Equals(members->class_name())) {
-    ErrorMsg(member->name_pos,
-             "%s '%s' conflicts with class name",
-             member->ToCString(),
-             name.ToCString());
+    ReportError(member->name_pos,
+                "%s '%s' conflicts with class name",
+                member->ToCString(),
+                name.ToCString());
   }
   if (members->clazz().LookupTypeParameter(name) != TypeParameter::null()) {
-    ErrorMsg(member->name_pos,
-             "%s '%s' conflicts with type parameter",
-             member->ToCString(),
-             name.ToCString());
+    ReportError(member->name_pos,
+                "%s '%s' conflicts with type parameter",
+                member->ToCString(),
+                name.ToCString());
   }
   for (int i = 0; i < members->members().length(); i++) {
     MemberDesc* existing_member = &members->members()[i];
     if (name.Equals(*existing_member->DictName())) {
-      ErrorMsg(member->name_pos,
-               "%s '%s' conflicts with previously declared %s",
-               member->ToCString(),
-               name.ToCString(),
-               existing_member->ToCString());
+      ReportError(member->name_pos,
+                  "%s '%s' conflicts with previously declared %s",
+                  member->ToCString(),
+                  name.ToCString(),
+                  existing_member->ToCString());
     }
   }
 }
@@ -3692,10 +3727,10 @@
   }
   if (CurrentToken() == Token::kVAR) {
     if (member.has_const) {
-      ErrorMsg("identifier expected after 'const'");
+      ReportError("identifier expected after 'const'");
     }
     if (member.has_final) {
-      ErrorMsg("identifier expected after 'final'");
+      ReportError("identifier expected after 'final'");
     }
     ConsumeToken();
     member.has_var = true;
@@ -3704,7 +3739,7 @@
   } else if (CurrentToken() == Token::kFACTORY) {
     ConsumeToken();
     if (member.has_static) {
-      ErrorMsg("factory method cannot be explicitly marked static");
+      ReportError("factory method cannot be explicitly marked static");
     }
     member.has_factory = true;
     member.has_static = true;
@@ -3713,7 +3748,7 @@
   // Optionally parse a type.
   if (CurrentToken() == Token::kVOID) {
     if (member.has_var || member.has_factory) {
-      ErrorMsg("void not expected");
+      ReportError("void not expected");
     }
     ConsumeToken();
     ASSERT(member.type == NULL);
@@ -3753,19 +3788,19 @@
       // The factory name may be qualified, but the first identifier must match
       // the name of the immediately enclosing class.
       if (!member.name->Equals(members->class_name())) {
-        ErrorMsg(member.name_pos, "factory name must be '%s'",
-                 members->class_name().ToCString());
+        ReportError(member.name_pos, "factory name must be '%s'",
+                    members->class_name().ToCString());
       }
     } else if (member.has_static) {
-      ErrorMsg(member.name_pos, "constructor cannot be static");
+      ReportError(member.name_pos, "constructor cannot be static");
     }
     if (member.type != NULL) {
-      ErrorMsg(member.name_pos, "constructor must not specify return type");
+      ReportError(member.name_pos, "constructor must not specify return type");
     }
     // Do not bypass class resolution by using current_class() directly, since
     // it may be a patch class.
-    const Object& result_type_class = Object::Handle(isolate(),
-        UnresolvedClass::New(LibraryPrefix::Handle(isolate()),
+    const Object& result_type_class = Object::Handle(I,
+        UnresolvedClass::New(LibraryPrefix::Handle(I),
                              *member.name,
                              member.name_pos));
     // The type arguments of the result type are the type parameters of the
@@ -3773,7 +3808,7 @@
     // from the class being patched.
     member.type = &Type::ZoneHandle(I, Type::New(
         result_type_class,
-        TypeArguments::Handle(isolate(), current_class().type_parameters()),
+        TypeArguments::Handle(I, current_class().type_parameters()),
         member.name_pos));
 
     // We must be dealing with a constructor or named constructor.
@@ -3821,10 +3856,10 @@
              (LookaheadToken(1) != Token::kSEMICOLON)) {
     ConsumeToken();
     if (!Token::CanBeOverloaded(CurrentToken())) {
-      ErrorMsg("invalid operator overloading");
+      ReportError("invalid operator overloading");
     }
     if (member.has_static) {
-      ErrorMsg("operator overloading functions cannot be static");
+      ReportError("operator overloading functions cannot be static");
     }
     member.operator_token = CurrentToken();
     member.has_operator = true;
@@ -3838,7 +3873,7 @@
     member.name_pos = TokenPos();
     ConsumeToken();
   } else {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
 
   ASSERT(member.name != NULL);
@@ -3861,8 +3896,8 @@
       if (member.has_final) {
         member.type = &Type::ZoneHandle(I, Type::DynamicType());
       } else {
-        ErrorMsg("missing 'var', 'final', 'const' or type"
-                 " in field declaration");
+        ReportError("missing 'var', 'final', 'const' or type"
+                    " in field declaration");
       }
     }
     ParseFieldDefinition(members, &member);
@@ -3896,21 +3931,21 @@
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing class '%s'\n", class_name.ToCString());
   }
-  Class& cls = Class::Handle(isolate());
-  TypeArguments& orig_type_parameters = TypeArguments::Handle(isolate());
-  Object& obj = Object::Handle(isolate(),
+  Class& cls = Class::Handle(I);
+  TypeArguments& orig_type_parameters = TypeArguments::Handle(I);
+  Object& obj = Object::Handle(I,
                                library_.LookupLocalObject(class_name));
   if (obj.IsNull()) {
     if (is_patch) {
-      ErrorMsg(classname_pos, "missing class '%s' cannot be patched",
-               class_name.ToCString());
+      ReportError(classname_pos, "missing class '%s' cannot be patched",
+                  class_name.ToCString());
     }
     cls = Class::New(class_name, script_, classname_pos);
     library_.AddClass(cls);
   } else {
     if (!obj.IsClass()) {
-      ErrorMsg(classname_pos, "'%s' is already defined",
-               class_name.ToCString());
+      ReportError(classname_pos, "'%s' is already defined",
+                  class_name.ToCString());
     }
     cls ^= obj.raw();
     if (is_patch) {
@@ -3928,8 +3963,8 @@
       // pre-registered classes from object.cc or a duplicate definition.
       if (!(cls.is_prefinalized() ||
             RawObject::IsTypedDataViewClassId(cls.id()))) {
-        ErrorMsg(classname_pos, "class '%s' is already defined",
-                 class_name.ToCString());
+        ReportError(classname_pos, "class '%s' is already defined",
+                    class_name.ToCString());
       }
       // Pre-registered classes need their scripts connected at this time.
       cls.set_script(script_);
@@ -3943,45 +3978,45 @@
   if (is_patch) {
     // Check that the new type parameters are identical to the original ones.
     const TypeArguments& new_type_parameters =
-        TypeArguments::Handle(isolate(), cls.type_parameters());
+        TypeArguments::Handle(I, cls.type_parameters());
     const int new_type_params_count =
         new_type_parameters.IsNull() ? 0 : new_type_parameters.Length();
     const int orig_type_params_count =
         orig_type_parameters.IsNull() ? 0 : orig_type_parameters.Length();
     if (new_type_params_count != orig_type_params_count) {
-      ErrorMsg(classname_pos,
-               "class '%s' must be patched with identical type parameters",
-               class_name.ToCString());
+      ReportError(classname_pos,
+                  "class '%s' must be patched with identical type parameters",
+                  class_name.ToCString());
     }
-    TypeParameter& new_type_param = TypeParameter::Handle(isolate());
-    TypeParameter& orig_type_param = TypeParameter::Handle(isolate());
-    String& new_name = String::Handle(isolate());
-    String& orig_name = String::Handle(isolate());
-    AbstractType& new_bound = AbstractType::Handle(isolate());
-    AbstractType& orig_bound = AbstractType::Handle(isolate());
+    TypeParameter& new_type_param = TypeParameter::Handle(I);
+    TypeParameter& orig_type_param = TypeParameter::Handle(I);
+    String& new_name = String::Handle(I);
+    String& orig_name = String::Handle(I);
+    AbstractType& new_bound = AbstractType::Handle(I);
+    AbstractType& orig_bound = AbstractType::Handle(I);
     for (int i = 0; i < new_type_params_count; i++) {
       new_type_param ^= new_type_parameters.TypeAt(i);
       orig_type_param ^= orig_type_parameters.TypeAt(i);
       new_name = new_type_param.name();
       orig_name = orig_type_param.name();
       if (!new_name.Equals(orig_name)) {
-        ErrorMsg(new_type_param.token_pos(),
-                 "type parameter '%s' of patch class '%s' does not match "
-                 "original type parameter '%s'",
-                 new_name.ToCString(),
-                 class_name.ToCString(),
-                 orig_name.ToCString());
+        ReportError(new_type_param.token_pos(),
+                    "type parameter '%s' of patch class '%s' does not match "
+                    "original type parameter '%s'",
+                    new_name.ToCString(),
+                    class_name.ToCString(),
+                    orig_name.ToCString());
       }
       new_bound = new_type_param.bound();
       orig_bound = orig_type_param.bound();
       if (!new_bound.Equals(orig_bound)) {
-        ErrorMsg(new_type_param.token_pos(),
-                 "bound '%s' of type parameter '%s' of patch class '%s' does "
-                 "not match original type parameter bound '%s'",
-                 String::Handle(new_bound.UserVisibleName()).ToCString(),
-                 new_name.ToCString(),
-                 class_name.ToCString(),
-                 String::Handle(orig_bound.UserVisibleName()).ToCString());
+        ReportError(new_type_param.token_pos(),
+                    "bound '%s' of type parameter '%s' of patch class '%s' "
+                    "does not match original type parameter bound '%s'",
+                    String::Handle(new_bound.UserVisibleName()).ToCString(),
+                    new_name.ToCString(),
+                    class_name.ToCString(),
+                    String::Handle(orig_bound.UserVisibleName()).ToCString());
       }
     }
     cls.set_type_parameters(orig_type_parameters);
@@ -3996,36 +4031,36 @@
 
   const bool is_mixin_declaration = (CurrentToken() == Token::kASSIGN);
   if (is_mixin_declaration && is_patch) {
-    ErrorMsg(classname_pos,
-             "mixin application '%s' may not be a patch class",
-             class_name.ToCString());
+    ReportError(classname_pos,
+                "mixin application '%s' may not be a patch class",
+                class_name.ToCString());
   }
 
-  AbstractType& super_type = Type::Handle(isolate());
+  AbstractType& super_type = Type::Handle(I);
   if ((CurrentToken() == Token::kEXTENDS) || is_mixin_declaration) {
     ConsumeToken();  // extends or =
     const intptr_t type_pos = TokenPos();
     super_type = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (super_type.IsMalformedOrMalbounded()) {
-      ErrorMsg(Error::Handle(isolate(), super_type.error()));
+      ReportError(Error::Handle(I, super_type.error()));
     }
     if (super_type.IsDynamicType()) {
       // Unlikely here, since super type is not resolved yet.
-      ErrorMsg(type_pos,
-               "class '%s' may not extend 'dynamic'",
-               class_name.ToCString());
+      ReportError(type_pos,
+                  "class '%s' may not extend 'dynamic'",
+                  class_name.ToCString());
     }
     if (super_type.IsTypeParameter()) {
-      ErrorMsg(type_pos,
-               "class '%s' may not extend type parameter '%s'",
-               class_name.ToCString(),
-               String::Handle(isolate(),
-                              super_type.UserVisibleName()).ToCString());
+      ReportError(type_pos,
+                  "class '%s' may not extend type parameter '%s'",
+                  class_name.ToCString(),
+                  String::Handle(I,
+                                 super_type.UserVisibleName()).ToCString());
     }
     // The class finalizer will check whether the super type is malbounded.
     if (is_mixin_declaration) {
       if (CurrentToken() != Token::kWITH) {
-        ErrorMsg("mixin application clause 'with type' expected");
+        ReportError("mixin application clause 'with type' expected");
       }
       cls.set_is_mixin_app_alias();
       cls.set_is_synthesized_class();
@@ -4072,7 +4107,7 @@
   CompilerStats::num_classes_compiled++;
   set_current_class(cls);
   is_top_level_ = true;
-  String& class_name = String::Handle(isolate(), cls.Name());
+  String& class_name = String::Handle(I, cls.Name());
   const intptr_t class_pos = TokenPos();
   ClassDesc members(cls, class_name, false, class_pos);
   while (CurrentToken() != Token::kLBRACE) {
@@ -4095,7 +4130,7 @@
   cls.AddFields(members.fields());
 
   // Creating a new array for functions marks the class as parsed.
-  const Array& array = Array::Handle(isolate(),
+  const Array& array = Array::Handle(I,
                                      Array::MakeArray(members.functions()));
   cls.SetFunctions(array);
 
@@ -4107,14 +4142,14 @@
 
   if (cls.is_patch()) {
     // Apply the changes to the patched class looked up above.
-    Object& obj = Object::Handle(isolate(),
+    Object& obj = Object::Handle(I,
                                  library_.LookupLocalObject(class_name));
     // The patched class must not be finalized yet.
     const Class& orig_class = Class::Cast(obj);
     ASSERT(!orig_class.is_finalized());
-    Error& error = Error::Handle(isolate());
+    Error& error = Error::Handle(I);
     if (!orig_class.ApplyPatch(cls, &error)) {
-      AppendErrorMsg(error, class_pos, "applying patch failed");
+      Report::LongJumpF(error, script_, class_pos, "applying patch failed");
     }
   }
 }
@@ -4129,7 +4164,7 @@
   // To indicate that this is an implicit constructor, we set the
   // token position and end token position of the function
   // to the token position of the class.
-  Function& ctor = Function::Handle(isolate(),
+  Function& ctor = Function::Handle(I,
       Function::New(ctor_name,
                     RawFunction::kConstructor,
                     /* is_static = */ false,
@@ -4176,8 +4211,8 @@
       // Check whether we have already seen this member.
       for (int i = 0; i < ctors.length(); i++) {
         if (ctors[i] == member) {
-          ErrorMsg(member->name_pos,
-                   "cyclic reference in constructor redirection");
+          ReportError(member->name_pos,
+                      "cyclic reference in constructor redirection");
         }
       }
       // We haven't seen this member. Add it to the list and follow
@@ -4203,14 +4238,14 @@
     OS::Print("toplevel parsing mixin application alias class '%s'\n",
               class_name.ToCString());
   }
-  const Object& obj = Object::Handle(isolate(),
+  const Object& obj = Object::Handle(I,
                                      library_.LookupLocalObject(class_name));
   if (!obj.IsNull()) {
-    ErrorMsg(classname_pos, "'%s' is already defined",
-             class_name.ToCString());
+    ReportError(classname_pos, "'%s' is already defined",
+                class_name.ToCString());
   }
   const Class& mixin_application =
-      Class::Handle(isolate(), Class::New(class_name, script_, classname_pos));
+      Class::Handle(I, Class::New(class_name, script_, classname_pos));
   mixin_application.set_is_mixin_app_alias();
   library_.AddClass(mixin_application);
   set_current_class(mixin_application);
@@ -4225,13 +4260,13 @@
 
   const intptr_t type_pos = TokenPos();
   AbstractType& type =
-      AbstractType::Handle(isolate(),
+      AbstractType::Handle(I,
                            ParseType(ClassFinalizer::kResolveTypeParameters));
   if (type.IsTypeParameter()) {
-    ErrorMsg(type_pos,
-             "class '%s' may not extend type parameter '%s'",
-             class_name.ToCString(),
-             String::Handle(isolate(), type.UserVisibleName()).ToCString());
+    ReportError(type_pos,
+                "class '%s' may not extend type parameter '%s'",
+                class_name.ToCString(),
+                String::Handle(I, type.UserVisibleName()).ToCString());
   }
 
   CheckToken(Token::kWITH, "mixin application 'with Type' expected");
@@ -4302,14 +4337,14 @@
 
   if (IsMixinAppAlias()) {
     if (FLAG_warn_mixin_typedef) {
-      Warning("deprecated mixin application typedef");
+      ReportWarning(TokenPos(), "deprecated mixin application typedef");
     }
     ParseMixinAppAlias(pending_classes, toplevel_class, metadata_pos);
     return;
   }
 
   // Parse the result type of the function type.
-  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
+  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
   if (CurrentToken() == Token::kVOID) {
     ConsumeToken();
     result_type = Type::VoidType();
@@ -4325,20 +4360,20 @@
 
   // Lookup alias name and report an error if it is already defined in
   // the library scope.
-  const Object& obj = Object::Handle(isolate(),
+  const Object& obj = Object::Handle(I,
                                      library_.LookupLocalObject(*alias_name));
   if (!obj.IsNull()) {
-    ErrorMsg(alias_name_pos,
-             "'%s' is already defined", alias_name->ToCString());
+    ReportError(alias_name_pos,
+                "'%s' is already defined", alias_name->ToCString());
   }
 
   // Create the function type alias signature class. It will be linked to its
   // signature function after it has been parsed. The type parameters, in order
   // to be properly finalized, need to be associated to this signature class as
   // they are parsed.
-  const Class& function_type_alias = Class::Handle(isolate(),
+  const Class& function_type_alias = Class::Handle(I,
       Class::NewSignatureClass(*alias_name,
-                               Function::Handle(isolate()),
+                               Function::Handle(I),
                                script_,
                                alias_name_pos));
   library_.AddClass(function_type_alias);
@@ -4366,7 +4401,7 @@
   ParseFormalParameterList(no_explicit_default_values, false, &func_params);
   ExpectSemicolon();
   // The field 'is_static' has no meaning for signature functions.
-  Function& signature_function = Function::Handle(isolate(),
+  Function& signature_function = Function::Handle(I,
       Function::New(*alias_name,
                     RawFunction::kSignatureFunction,
                     /* is_static = */ false,
@@ -4382,7 +4417,7 @@
   // Patch the signature function in the signature class.
   function_type_alias.PatchSignatureFunction(signature_function);
 
-  const String& signature = String::Handle(isolate(),
+  const String& signature = String::Handle(I,
                                            signature_function.Signature());
   if (FLAG_trace_parser) {
     OS::Print("TopLevel parsing function type alias '%s'\n",
@@ -4469,7 +4504,7 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
   }
 }
@@ -4478,7 +4513,7 @@
 void Parser::SkipType(bool allow_void) {
   if (CurrentToken() == Token::kVOID) {
     if (!allow_void) {
-      ErrorMsg("'void' not allowed here");
+      ReportError("'void' not allowed here");
     }
     ConsumeToken();
   } else {
@@ -4496,12 +4531,12 @@
   TRACE_PARSER("ParseTypeParameters");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& type_parameters_array =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     intptr_t index = 0;
-    TypeParameter& type_parameter = TypeParameter::Handle(isolate());
-    TypeParameter& existing_type_parameter = TypeParameter::Handle(isolate());
-    String& existing_type_parameter_name = String::Handle(isolate());
-    AbstractType& type_parameter_bound = Type::Handle(isolate());
+    TypeParameter& type_parameter = TypeParameter::Handle(I);
+    TypeParameter& existing_type_parameter = TypeParameter::Handle(I);
+    String& existing_type_parameter_name = String::Handle(I);
+    AbstractType& type_parameter_bound = Type::Handle(I);
     do {
       ConsumeToken();
       const intptr_t metadata_pos = SkipMetadata();
@@ -4513,8 +4548,8 @@
         existing_type_parameter ^= type_parameters_array.At(i);
         existing_type_parameter_name = existing_type_parameter.name();
         if (existing_type_parameter_name.Equals(type_parameter_name)) {
-          ErrorMsg(type_parameter_pos, "duplicate type parameter '%s'",
-                   type_parameter_name.ToCString());
+          ReportError(type_parameter_pos, "duplicate type parameter '%s'",
+                      type_parameter_name.ToCString());
         }
       }
       if (CurrentToken() == Token::kEXTENDS) {
@@ -4525,7 +4560,7 @@
         // type parameters, as they are not fully parsed yet.
         type_parameter_bound = ParseType(ClassFinalizer::kDoNotResolve);
       } else {
-        type_parameter_bound = isolate()->object_store()->object_type();
+        type_parameter_bound = I->object_store()->object_type();
       }
       type_parameter = TypeParameter::New(cls,
                                           index,
@@ -4542,10 +4577,10 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
     const TypeArguments& type_parameters =
-        TypeArguments::Handle(isolate(),
+        TypeArguments::Handle(I,
                               NewTypeArguments(type_parameters_array));
     cls.set_type_parameters(type_parameters);
     // Try to resolve the upper bounds, which will at least resolve the
@@ -4568,8 +4603,8 @@
   TRACE_PARSER("ParseTypeArguments");
   if (CurrentToken() == Token::kLT) {
     const GrowableObjectArray& types =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-    AbstractType& type = AbstractType::Handle(isolate());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+    AbstractType& type = AbstractType::Handle(I);
     do {
       ConsumeToken();
       type = ParseType(finalization);
@@ -4583,7 +4618,7 @@
     if ((token == Token::kGT) || (token == Token::kSHR)) {
       ConsumeRightAngleBracket();
     } else {
-      ErrorMsg("right angle bracket expected");
+      ReportError("right angle bracket expected");
     }
     if (finalization != ClassFinalizer::kIgnore) {
       return NewTypeArguments(types);
@@ -4598,10 +4633,10 @@
   TRACE_PARSER("ParseInterfaceList");
   ASSERT(CurrentToken() == Token::kIMPLEMENTS);
   const GrowableObjectArray& all_interfaces =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-  AbstractType& interface = AbstractType::Handle(isolate());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+  AbstractType& interface = AbstractType::Handle(I);
   // First get all the interfaces already implemented by class.
-  Array& cls_interfaces = Array::Handle(isolate(), cls.interfaces());
+  Array& cls_interfaces = Array::Handle(I, cls.interfaces());
   for (intptr_t i = 0; i < cls_interfaces.Length(); i++) {
     interface ^= cls_interfaces.At(i);
     all_interfaces.Add(interface);
@@ -4612,10 +4647,9 @@
     intptr_t interface_pos = TokenPos();
     interface = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (interface.IsTypeParameter()) {
-      ErrorMsg(interface_pos,
-               "type parameter '%s' may not be used in interface list",
-               String::Handle(isolate(),
-                              interface.UserVisibleName()).ToCString());
+      ReportError(interface_pos,
+                  "type parameter '%s' may not be used in interface list",
+                  String::Handle(I, interface.UserVisibleName()).ToCString());
     }
     all_interfaces.Add(interface);
   } while (CurrentToken() == Token::kCOMMA);
@@ -4628,26 +4662,25 @@
   TRACE_PARSER("ParseMixins");
   ASSERT(CurrentToken() == Token::kWITH);
   const GrowableObjectArray& mixin_types =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
-  AbstractType& mixin_type = AbstractType::Handle(isolate());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
+  AbstractType& mixin_type = AbstractType::Handle(I);
   do {
     ConsumeToken();
     mixin_type = ParseType(ClassFinalizer::kResolveTypeParameters);
     if (mixin_type.IsDynamicType()) {
       // The string 'dynamic' is not resolved yet at this point, but a malformed
       // type mapped to dynamic can be encountered here.
-      ErrorMsg(mixin_type.token_pos(), "illegal mixin of a malformed type");
+      ReportError(mixin_type.token_pos(), "illegal mixin of a malformed type");
     }
     if (mixin_type.IsTypeParameter()) {
-      ErrorMsg(mixin_type.token_pos(),
-               "mixin type '%s' may not be a type parameter",
-               String::Handle(isolate(),
-                              mixin_type.UserVisibleName()).ToCString());
+      ReportError(mixin_type.token_pos(),
+                  "mixin type '%s' may not be a type parameter",
+                  String::Handle(I, mixin_type.UserVisibleName()).ToCString());
     }
     mixin_types.Add(mixin_type);
   } while (CurrentToken() == Token::kCOMMA);
   return MixinAppType::New(super_type,
-      Array::Handle(isolate(), Array::MakeArray(mixin_types)));
+      Array::Handle(I, Array::MakeArray(mixin_types)));
 }
 
 
@@ -4660,36 +4693,36 @@
   const bool is_static = true;
   const AbstractType& type = AbstractType::ZoneHandle(I,
       ParseConstFinalVarOrType(ClassFinalizer::kResolveTypeParameters));
-  Field& field = Field::Handle(isolate());
-  Function& getter = Function::Handle(isolate());
+  Field& field = Field::Handle(I);
+  Function& getter = Function::Handle(I);
   while (true) {
     const intptr_t name_pos = TokenPos();
     String& var_name = *ExpectIdentifier("variable name expected");
 
     if (library_.LookupLocalObject(var_name) != Object::null()) {
-      ErrorMsg(name_pos, "'%s' is already defined", var_name.ToCString());
+      ReportError(name_pos, "'%s' is already defined", var_name.ToCString());
     }
 
     // Check whether a getter or setter for this name exists. A const
     // or final field implies a setter which throws a NoSuchMethodError,
     // thus we need to check for conflicts with existing setters and
     // getters.
-    String& accessor_name = String::Handle(isolate(),
+    String& accessor_name = String::Handle(I,
                                            Field::GetterName(var_name));
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ErrorMsg(name_pos, "getter for '%s' is already defined",
-               var_name.ToCString());
+      ReportError(name_pos, "getter for '%s' is already defined",
+                  var_name.ToCString());
     }
     accessor_name = Field::SetterName(var_name);
     if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-      ErrorMsg(name_pos, "setter for '%s' is already defined",
-               var_name.ToCString());
+      ReportError(name_pos, "setter for '%s' is already defined",
+                  var_name.ToCString());
     }
 
     field = Field::New(var_name, is_static, is_final, is_const,
                        current_class(), name_pos);
     field.set_type(type);
-    field.set_value(Instance::Handle(isolate(), Instance::null()));
+    field.set_value(Instance::Handle(I, Instance::null()));
     top_level->fields.Add(field);
     library_.AddObject(field, var_name);
     if (metadata_pos >= 0) {
@@ -4697,7 +4730,7 @@
     }
     if (CurrentToken() == Token::kASSIGN) {
       ConsumeToken();
-      Instance& field_value = Instance::Handle(isolate(),
+      Instance& field_value = Instance::Handle(I,
                                                Object::sentinel().raw());
       bool has_simple_literal = false;
       if (LookaheadToken(1) == Token::kSEMICOLON) {
@@ -4707,7 +4740,7 @@
       field.set_value(field_value);
       if (!has_simple_literal) {
         // Create a static final getter.
-        String& getter_name = String::Handle(isolate(),
+        String& getter_name = String::Handle(I,
                                              Field::GetterSymbol(var_name));
         getter = Function::New(getter_name,
                                RawFunction::kImplicitStaticFinalGetter,
@@ -4729,7 +4762,7 @@
         }
       }
     } else if (is_final) {
-      ErrorMsg(name_pos, "missing initializer for final or const variable");
+      ReportError(name_pos, "missing initializer for final or const variable");
     }
 
     if (CurrentToken() == Token::kCOMMA) {
@@ -4748,7 +4781,7 @@
                                    intptr_t metadata_pos) {
   TRACE_PARSER("ParseTopLevelFunction");
   const intptr_t decl_begin_pos = TokenPos();
-  AbstractType& result_type = Type::Handle(isolate(), Type::DynamicType());
+  AbstractType& result_type = Type::Handle(I, Type::DynamicType());
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
@@ -4777,15 +4810,16 @@
 
   bool found = library_.LookupLocalObject(func_name) != Object::null();
   if (found && !is_patch) {
-    ErrorMsg(name_pos, "'%s' is already defined", func_name.ToCString());
+    ReportError(name_pos, "'%s' is already defined", func_name.ToCString());
   } else if (!found && is_patch) {
-    ErrorMsg(name_pos, "missing '%s' cannot be patched", func_name.ToCString());
+    ReportError(name_pos, "missing '%s' cannot be patched",
+                func_name.ToCString());
   }
-  String& accessor_name = String::Handle(isolate(),
+  String& accessor_name = String::Handle(I,
                                          Field::GetterName(func_name));
   if (library_.LookupLocalObject(accessor_name) != Object::null()) {
-    ErrorMsg(name_pos, "'%s' is already defined as getter",
-             func_name.ToCString());
+    ReportError(name_pos, "'%s' is already defined as getter",
+                func_name.ToCString());
   }
   // A setter named x= may co-exist with a function named x, thus we do
   // not need to check setters.
@@ -4816,9 +4850,9 @@
     ExpectSemicolon();
     is_native = true;
   } else {
-    ErrorMsg("function block expected");
+    ReportError("function block expected");
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(func_name,
                     RawFunction::kRegularFunction,
                     is_static,
@@ -4853,7 +4887,7 @@
   const bool is_static = true;
   bool is_external = false;
   bool is_patch = false;
-  AbstractType& result_type = AbstractType::Handle(isolate());
+  AbstractType& result_type = AbstractType::Handle(I);
   if (is_patch_source() &&
       (CurrentToken() == Token::kIDENT) &&
       CurrentLiteral()->Equals("patch")) {
@@ -4903,33 +4937,33 @@
   }
   if ((params.num_fixed_parameters != expected_num_parameters) ||
       (params.num_optional_parameters != 0)) {
-    ErrorMsg(name_pos, "illegal %s parameters",
-             is_getter ? "getter" : "setter");
+    ReportError(name_pos, "illegal %s parameters",
+                is_getter ? "getter" : "setter");
   }
 
   // Check whether this getter conflicts with a function or top-level variable
   // with the same name.
   if (is_getter &&
       (library_.LookupLocalObject(*field_name) != Object::null())) {
-    ErrorMsg(name_pos, "'%s' is already defined in this library",
-             field_name->ToCString());
+    ReportError(name_pos, "'%s' is already defined in this library",
+                field_name->ToCString());
   }
   // Check whether this setter conflicts with the implicit setter
   // of a top-level variable with the same name.
   if (!is_getter &&
       (library_.LookupLocalField(*field_name) != Object::null())) {
-    ErrorMsg(name_pos, "Variable '%s' is already defined in this library",
-             field_name->ToCString());
+    ReportError(name_pos, "Variable '%s' is already defined in this library",
+                field_name->ToCString());
   }
   bool found = library_.LookupLocalObject(accessor_name) != Object::null();
   if (found && !is_patch) {
-    ErrorMsg(name_pos, "%s for '%s' is already defined",
-             is_getter ? "getter" : "setter",
-             field_name->ToCString());
+    ReportError(name_pos, "%s for '%s' is already defined",
+                is_getter ? "getter" : "setter",
+                field_name->ToCString());
   } else if (!found && is_patch) {
-    ErrorMsg(name_pos, "missing %s for '%s' cannot be patched",
-             is_getter ? "getter" : "setter",
-             field_name->ToCString());
+    ReportError(name_pos, "missing %s for '%s' cannot be patched",
+                is_getter ? "getter" : "setter",
+                field_name->ToCString());
   }
 
   intptr_t accessor_end_pos = accessor_pos;
@@ -4952,9 +4986,9 @@
     ExpectSemicolon();
     is_native = true;
   } else {
-    ErrorMsg("function block expected");
+    ReportError("function block expected");
   }
-  Function& func = Function::Handle(isolate(),
+  Function& func = Function::Handle(I,
       Function::New(accessor_name,
                     is_getter ? RawFunction::kGetterFunction :
                                 RawFunction::kSetterFunction,
@@ -4987,7 +5021,7 @@
 RawObject* Parser::CallLibraryTagHandler(Dart_LibraryTag tag,
                                          intptr_t token_pos,
                                          const String& url) {
-  Dart_LibraryTagHandler handler = isolate()->library_tag_handler();
+  Dart_LibraryTagHandler handler = I->library_tag_handler();
   if (handler == NULL) {
     if (url.StartsWith(Symbols::DartScheme())) {
       if (tag == Dart_kCanonicalizeUrl) {
@@ -4995,26 +5029,26 @@
       }
       return Object::null();
     }
-    ErrorMsg(token_pos, "no library handler registered");
+    ReportError(token_pos, "no library handler registered");
   }
   // Block class finalization attempts when calling into the library
   // tag handler.
-  isolate()->BlockClassFinalization();
-  Api::Scope api_scope(isolate());
+  I->BlockClassFinalization();
+  Api::Scope api_scope(I);
   Dart_Handle result = handler(tag,
-                               Api::NewHandle(isolate(), library_.raw()),
-                               Api::NewHandle(isolate(), url.raw()));
-  isolate()->UnblockClassFinalization();
+                               Api::NewHandle(I, library_.raw()),
+                               Api::NewHandle(I, url.raw()));
+  I->UnblockClassFinalization();
   if (Dart_IsError(result)) {
     // In case of an error we append an explanatory error message to the
     // error obtained from the library tag handler.
-    Error& prev_error = Error::Handle(isolate());
+    Error& prev_error = Error::Handle(I);
     prev_error ^= Api::UnwrapHandle(result);
-    AppendErrorMsg(prev_error, token_pos, "library handler failed");
+    Report::LongJumpF(prev_error, script_, token_pos, "library handler failed");
   }
   if (tag == Dart_kCanonicalizeUrl) {
     if (!Dart_IsString(result)) {
-      ErrorMsg(token_pos, "library handler failed URI canonicalization");
+      ReportError(token_pos, "library handler failed URI canonicalization");
     }
   }
   return Api::UnwrapHandle(result);
@@ -5041,7 +5075,7 @@
 
 void Parser::ParseIdentList(GrowableObjectArray* names) {
   if (!IsIdentifier()) {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
   while (IsIdentifier()) {
     names->Add(*CurrentLiteral());
@@ -5066,7 +5100,7 @@
   ASSERT(url_literal->AsLiteralNode()->literal().IsString());
   const String& url = String::Cast(url_literal->AsLiteralNode()->literal());
   if (url.Length() == 0) {
-    ErrorMsg("library url expected");
+    ReportError("library url expected");
   }
   bool is_deferred_import = false;
   if (is_import && (IsLiteral("deferred"))) {
@@ -5074,7 +5108,7 @@
     ConsumeToken();
     CheckToken(Token::kAS, "'as' expected");
   }
-  String& prefix = String::Handle(isolate());
+  String& prefix = String::Handle(I);
   intptr_t prefix_pos = 0;
   if (is_import && (CurrentToken() == Token::kAS)) {
     ConsumeToken();
@@ -5082,13 +5116,13 @@
     prefix = ExpectIdentifier("prefix identifier expected")->raw();
   }
 
-  Array& show_names = Array::Handle(isolate());
-  Array& hide_names = Array::Handle(isolate());
+  Array& show_names = Array::Handle(I);
+  Array& hide_names = Array::Handle(I);
   if (is_deferred_import || IsLiteral("show") || IsLiteral("hide")) {
     GrowableObjectArray& show_list =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     GrowableObjectArray& hide_list =
-        GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+        GrowableObjectArray::Handle(I, GrowableObjectArray::New());
     // Libraries imported through deferred import automatically hide
     // the name 'loadLibrary'.
     if (is_deferred_import) {
@@ -5117,20 +5151,23 @@
   // Canonicalize library URL.
   const String& canon_url = String::CheckedHandle(
       CallLibraryTagHandler(Dart_kCanonicalizeUrl, import_pos, url));
-  // Lookup the library URL.
-  Library& library = Library::Handle(isolate(),
-                                     Library::LookupLibrary(canon_url));
+
+  // Create a new library if it does not exist yet.
+  Library& library = Library::Handle(I, Library::LookupLibrary(canon_url));
   if (library.IsNull()) {
-    // Create an empty library to mark that we have initiated loading of this
-    // library.
     library = Library::New(canon_url);
     library.Register();
-    // Call the library tag handler to load the library.
-    // TODO(hausner): do not load eagerly if import is deferred.
+  }
+
+  // If loading hasn't been requested yet, and if this is not a deferred
+  // library import, call the library tag handler to request loading
+  // the library.
+  if (library.LoadNotStarted() && !is_deferred_import) {
+    library.SetLoadRequested();
     CallLibraryTagHandler(Dart_kImportTag, import_pos, canon_url);
   }
 
-  Namespace& ns = Namespace::Handle(isolate(),
+  Namespace& ns = Namespace::Handle(I,
       Namespace::New(library, show_names, hide_names));
   if (metadata_pos >= 0) {
     ns.AddMetadata(metadata_pos, current_class());
@@ -5139,31 +5176,32 @@
   if (is_import) {
     // Ensure that private dart:_ libraries are only imported into dart:
     // libraries.
-    const String& lib_url = String::Handle(isolate(), library_.url());
+    const String& lib_url = String::Handle(I, library_.url());
     if (canon_url.StartsWith(Symbols::DartSchemePrivate()) &&
         !lib_url.StartsWith(Symbols::DartScheme())) {
-      ErrorMsg(import_pos, "private library is not accessible");
+      ReportError(import_pos, "private library is not accessible");
     }
     if (prefix.IsNull() || (prefix.Length() == 0)) {
       ASSERT(!is_deferred_import);
       library_.AddImport(ns);
     } else {
-      LibraryPrefix& library_prefix = LibraryPrefix::Handle(isolate());
+      LibraryPrefix& library_prefix = LibraryPrefix::Handle(I);
       library_prefix = library_.LookupLocalLibraryPrefix(prefix);
       if (!library_prefix.IsNull()) {
         // Check that prefix names of deferred import clauses are
         // unique.
         if (!is_deferred_import && library_prefix.is_deferred_load()) {
-          ErrorMsg(prefix_pos,
-                   "prefix '%s' already used in a deferred import clause",
-                   prefix.ToCString());
+          ReportError(prefix_pos,
+                      "prefix '%s' already used in a deferred import clause",
+                      prefix.ToCString());
         }
         if (is_deferred_import) {
-          ErrorMsg(prefix_pos, "prefix of deferred import must be uniqe");
+          ReportError(prefix_pos, "prefix of deferred import must be uniqe");
         }
         library_prefix.AddImport(ns);
       } else {
-        library_prefix = LibraryPrefix::New(prefix, ns, is_deferred_import);
+        library_prefix =
+            LibraryPrefix::New(prefix, ns, is_deferred_import, library_);
         library_.AddObject(library_prefix, prefix);
       }
     }
@@ -5208,7 +5246,7 @@
   intptr_t metadata_pos = SkipMetadata();
   if (CurrentToken() == Token::kLIBRARY) {
     if (is_patch_source()) {
-      ErrorMsg("patch cannot override library name");
+      ReportError("patch cannot override library name");
     }
     ParseLibraryName();
     if (metadata_pos >= 0) {
@@ -5226,9 +5264,9 @@
   // Core lib has not been explicitly imported, so we implicitly
   // import it here.
   if (!library_.ImportsCorelib()) {
-    Library& core_lib = Library::Handle(isolate(), Library::CoreLibrary());
+    Library& core_lib = Library::Handle(I, Library::CoreLibrary());
     ASSERT(!core_lib.IsNull());
-    const Namespace& core_ns = Namespace::Handle(isolate(),
+    const Namespace& core_ns = Namespace::Handle(I,
         Namespace::New(core_lib, Object::null_array(), Object::null_array()));
     library_.AddImport(core_ns);
   }
@@ -5246,7 +5284,7 @@
   CheckToken(Token::kPART, "'part of' expected");
   ConsumeToken();
   if (!IsLiteral("of")) {
-    ErrorMsg("'part of' expected");
+    ReportError("'part of' expected");
   }
   ConsumeToken();
   // The VM is not required to check that the library name matches the
@@ -5265,13 +5303,13 @@
   // Collect the classes found at the top level in this growable array.
   // They need to be registered with class finalization after parsing
   // has been completed.
-  ObjectStore* object_store = isolate()->object_store();
+  ObjectStore* object_store = I->object_store();
   const GrowableObjectArray& pending_classes =
-      GrowableObjectArray::Handle(isolate(), object_store->pending_classes());
+      GrowableObjectArray::Handle(I, object_store->pending_classes());
   SetPosition(0);
   is_top_level_ = true;
   TopLevel top_level;
-  Class& toplevel_class = Class::Handle(isolate(),
+  Class& toplevel_class = Class::Handle(I,
       Class::New(Symbols::TopLevel(), script_, TokenPos()));
   toplevel_class.set_library(library_);
 
@@ -5282,7 +5320,7 @@
     ParsePartHeader();
   }
 
-  const Class& cls = Class::Handle(isolate());
+  const Class& cls = Class::Handle(I);
   while (true) {
     set_current_class(cls);  // No current class.
     intptr_t metadata_pos = SkipMetadata();
@@ -5316,7 +5354,7 @@
   if ((top_level.fields.Length() > 0) || (top_level.functions.Length() > 0)) {
     toplevel_class.AddFields(top_level.fields);
 
-    const Array& array = Array::Handle(isolate(),
+    const Array& array = Array::Handle(I,
                                        Array::MakeArray(top_level.functions));
     toplevel_class.SetFunctions(array);
 
@@ -5327,10 +5365,10 @@
 
 
 void Parser::ChainNewBlock(LocalScope* outer_scope) {
-  Block* block = new(isolate()) Block(
+  Block* block = new(I) Block(
       current_block_,
       outer_scope,
-      new(isolate()) SequenceNode(TokenPos(), outer_scope));
+      new(I) SequenceNode(TokenPos(), outer_scope));
   current_block_ = block;
 }
 
@@ -5338,7 +5376,7 @@
 void Parser::OpenBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(isolate()) LocalScope(
+  ChainNewBlock(new(I) LocalScope(
       outer_scope, outer_scope->function_level(), outer_scope->loop_level()));
 }
 
@@ -5346,7 +5384,7 @@
 void Parser::OpenLoopBlock() {
   ASSERT(current_block_ != NULL);
   LocalScope* outer_scope = current_block_->scope;
-  ChainNewBlock(new(isolate()) LocalScope(
+  ChainNewBlock(new(I) LocalScope(
       outer_scope,
       outer_scope->function_level(),
       outer_scope->loop_level() + 1));
@@ -5358,20 +5396,20 @@
   if (current_block_ == NULL) {
     if (!func.IsLocalFunction()) {
       // We are compiling a non-nested function.
-      outer_scope = new(isolate()) LocalScope(NULL, 0, 0);
+      outer_scope = new(I) LocalScope(NULL, 0, 0);
     } else {
       // We are compiling the function of an invoked closure.
       // Restore the outer scope containing all captured variables.
       const ContextScope& context_scope =
-          ContextScope::Handle(isolate(), func.context_scope());
+          ContextScope::Handle(I, func.context_scope());
       ASSERT(!context_scope.IsNull());
-      outer_scope = new(isolate()) LocalScope(
+      outer_scope = new(I) LocalScope(
           LocalScope::RestoreOuterScope(context_scope), 0, 0);
     }
   } else {
     // We are parsing a nested function while compiling the enclosing function.
     outer_scope =
-        new(isolate()) LocalScope(current_block_->scope,
+        new(I) LocalScope(current_block_->scope,
                                   current_block_->scope->function_level() + 1,
                                   0);
   }
@@ -5420,11 +5458,8 @@
   if (!Utils::IsInt(16, params->num_fixed_parameters) ||
       !Utils::IsInt(16, params->num_optional_parameters)) {
     const Script& script = Script::Handle(Class::Handle(func.Owner()).script());
-    const Error& error = Error::Handle(LanguageError::NewFormatted(
-        Error::Handle(), script, func.token_pos(),
-        LanguageError::kError, Heap::kNew,
-        "too many formal parameters"));
-    ErrorMsg(error);
+    Report::MessageF(Report::kError, script, func.token_pos(),
+                     "too many formal parameters");
   }
   func.set_num_fixed_parameters(params->num_fixed_parameters);
   func.SetNumOptionalParameters(params->num_optional_parameters,
@@ -5453,12 +5488,12 @@
     ParamDesc& param_desc = (*params->parameters)[i];
     ASSERT(!is_top_level_ || param_desc.type->IsResolved());
     const String* name = param_desc.name;
-    LocalVariable* parameter = new(isolate()) LocalVariable(
+    LocalVariable* parameter = new(I) LocalVariable(
         param_desc.name_pos, *name, *param_desc.type);
     if (!scope->InsertParameterAt(i, parameter)) {
-      ErrorMsg(param_desc.name_pos,
-               "name '%s' already exists in scope",
-               param_desc.name->ToCString());
+      ReportError(param_desc.name_pos,
+                  "name '%s' already exists in scope",
+                  param_desc.name->ToCString());
     }
     param_desc.var = parameter;
     if (param_desc.is_final) {
@@ -5476,8 +5511,8 @@
                                       const Function& func) {
   ASSERT(func.is_native());
   TRACE_PARSER("ParseNativeFunctionBlock");
-  const Class& cls = Class::Handle(isolate(), func.Owner());
-  const Library& library = Library::Handle(isolate(), cls.library());
+  const Class& cls = Class::Handle(I, func.Owner());
+  const Library& library = Library::Handle(I, cls.library());
   ASSERT(func.NumParameters() == params->parameters->length());
 
   // Parse the function name out.
@@ -5490,17 +5525,17 @@
   NativeFunction native_function = NativeEntry::ResolveNative(
       library, native_name, num_params, &auto_setup_scope);
   if (native_function == NULL) {
-    ErrorMsg(native_pos,
-             "native function '%s' (%" Pd " arguments) cannot be found",
-             native_name.ToCString(), func.NumParameters());
+    ReportError(native_pos,
+                "native function '%s' (%" Pd " arguments) cannot be found",
+                native_name.ToCString(), func.NumParameters());
   }
   func.SetIsNativeAutoSetupScope(auto_setup_scope);
 
   // Now add the NativeBodyNode and return statement.
   Dart_NativeEntryResolver resolver = library.native_entry_resolver();
   bool is_bootstrap_native = Bootstrap::IsBootstapResolver(resolver);
-  current_block_->statements->Add(new(isolate()) ReturnNode(
-      TokenPos(), new(isolate()) NativeBodyNode(
+  current_block_->statements->Add(new(I) ReturnNode(
+      TokenPos(), new(I) NativeBodyNode(
           TokenPos(),
           Function::ZoneHandle(I, func.raw()),
           native_name,
@@ -5550,9 +5585,9 @@
   const bool kTestOnly = false;
   LocalVariable* receiver = LookupReceiver(current_block_->scope, kTestOnly);
   if (receiver == NULL) {
-    ErrorMsg(token_pos, "illegal implicit access to receiver 'this'");
+    ReportError(token_pos, "illegal implicit access to receiver 'this'");
   }
-  return new(isolate()) LoadLocalNode(TokenPos(), receiver);
+  return new(I) LoadLocalNode(TokenPos(), receiver);
 }
 
 
@@ -5564,14 +5599,14 @@
   LocalVariable* param = LookupTypeArgumentsParameter(current_block_->scope,
                                                       kTestOnly);
   ASSERT(param != NULL);
-  return new(isolate()) LoadLocalNode(TokenPos(), param);
+  return new(I) LoadLocalNode(TokenPos(), param);
 }
 
 
 AstNode* Parser::CallGetter(intptr_t token_pos,
                             AstNode* object,
                             const String& name) {
-  return new(isolate()) InstanceGetterNode(token_pos, object, name);
+  return new(I) InstanceGetterNode(token_pos, object, name);
 }
 
 
@@ -5583,7 +5618,7 @@
   ASSERT(IsIdentifier());
   const intptr_t ident_pos = TokenPos();
   const String& ident = *CurrentLiteral();
-  LocalVariable* variable = new(isolate()) LocalVariable(
+  LocalVariable* variable = new(I) LocalVariable(
       ident_pos, ident, type);
   ConsumeToken();  // Variable identifier.
   AstNode* initialization = NULL;
@@ -5592,20 +5627,20 @@
     const intptr_t assign_pos = TokenPos();
     ConsumeToken();
     AstNode* expr = ParseExpr(is_const, kConsumeCascades);
-    initialization = new(isolate()) StoreLocalNode(
+    initialization = new(I) StoreLocalNode(
         assign_pos, variable, expr);
     if (is_const) {
       ASSERT(expr->IsLiteralNode());
       variable->SetConstValue(expr->AsLiteralNode()->literal());
     }
   } else if (is_final || is_const) {
-    ErrorMsg(ident_pos,
-    "missing initialization of 'final' or 'const' variable");
+    ReportError(ident_pos,
+                "missing initialization of 'final' or 'const' variable");
   } else {
     // Initialize variable with null.
-    AstNode* null_expr = new(isolate()) LiteralNode(
+    AstNode* null_expr = new(I) LiteralNode(
         ident_pos, Instance::ZoneHandle(I));
-    initialization = new(isolate()) StoreLocalNode(
+    initialization = new(I) StoreLocalNode(
         ident_pos, variable, null_expr);
   }
 
@@ -5615,17 +5650,17 @@
   if (previous_pos >= 0) {
     ASSERT(!script_.IsNull());
     if (previous_pos > ident_pos) {
-      ErrorMsg(ident_pos,
-               "initializer of '%s' may not refer to itself",
-               ident.ToCString());
+      ReportError(ident_pos,
+                  "initializer of '%s' may not refer to itself",
+                  ident.ToCString());
 
     } else {
       intptr_t line_number;
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ErrorMsg(ident_pos,
-               "identifier '%s' previously used in line %" Pd "",
-               ident.ToCString(),
-               line_number);
+      ReportError(ident_pos,
+                  "identifier '%s' previously used in line %" Pd "",
+                  ident.ToCString(),
+                  line_number);
     }
   }
 
@@ -5636,12 +5671,12 @@
         current_block_->scope->LookupVariable(variable->name(), true);
     ASSERT(existing_var != NULL);
     if (existing_var->owner() == current_block_->scope) {
-      ErrorMsg(ident_pos, "identifier '%s' already defined",
-               variable->name().ToCString());
+      ReportError(ident_pos, "identifier '%s' already defined",
+                  variable->name().ToCString());
     } else {
-      ErrorMsg(ident_pos,
-               "'%s' from outer scope has already been used, cannot redefine",
-               variable->name().ToCString());
+      ReportError(ident_pos, "'%s' from outer scope has already been used, "
+                  "cannot redefine",
+                  variable->name().ToCString());
     }
   }
   if (is_final || is_const) {
@@ -5671,7 +5706,7 @@
     if (type_is_optional) {
       return Type::DynamicType();
     } else {
-      ErrorMsg("type name expected");
+      ReportError("type name expected");
     }
   }
   if (type_is_optional) {
@@ -5701,7 +5736,7 @@
       ParseConstFinalVarOrType(FLAG_enable_type_checks ?
           ClassFinalizer::kCanonicalize : ClassFinalizer::kIgnore));
   if (!IsIdentifier()) {
-    ErrorMsg("identifier expected");
+    ReportError("identifier expected");
   }
 
   AstNode* initializers = ParseVariableDeclaration(type, is_final, is_const);
@@ -5709,7 +5744,7 @@
   while (CurrentToken() == Token::kCOMMA) {
     ConsumeToken();
     if (!IsIdentifier()) {
-      ErrorMsg("identifier expected after comma");
+      ReportError("identifier expected after comma");
     }
     // We have a second initializer. Allocate a sequence node now.
     // The sequence does not own the current scope. Set its own scope to NULL.
@@ -5725,7 +5760,7 @@
 
 AstNode* Parser::ParseFunctionStatement(bool is_literal) {
   TRACE_PARSER("ParseFunctionStatement");
-  AbstractType& result_type = AbstractType::Handle(isolate());
+  AbstractType& result_type = AbstractType::Handle(I);
   const String* variable_name = NULL;
   const String* function_name = NULL;
 
@@ -5756,10 +5791,10 @@
       ASSERT(!script_.IsNull());
       intptr_t line_number;
       script_.GetTokenLocation(previous_pos, &line_number, NULL);
-      ErrorMsg(name_pos,
-               "identifier '%s' previously used in line %" Pd "",
-               function_name->ToCString(),
-               line_number);
+      ReportError(name_pos,
+                  "identifier '%s' previously used in line %" Pd "",
+                  function_name->ToCString(),
+                  line_number);
     }
   }
   CheckToken(Token::kLPAREN);
@@ -5799,15 +5834,15 @@
     // function is parsed. Therefore, we set the function type to a new
     // parameterized type to be patched after the actual type is known.
     // We temporarily use the class of the Function interface.
-    const Class& unknown_signature_class = Class::Handle(isolate(),
-        Type::Handle(isolate(), Type::Function()).type_class());
+    const Class& unknown_signature_class = Class::Handle(I,
+        Type::Handle(I, Type::Function()).type_class());
     function_type = Type::New(unknown_signature_class,
-                              TypeArguments::Handle(isolate()), function_pos);
+                              TypeArguments::Handle(I), function_pos);
     function_type.SetIsFinalized();  // No finalization needed.
 
     // Add the function variable to the scope before parsing the function in
     // order to allow self reference from inside the function.
-    function_variable = new(isolate()) LocalVariable(function_pos,
+    function_variable = new(I) LocalVariable(function_pos,
                                           *variable_name,
                                           function_type);
     function_variable->set_is_final();
@@ -5819,25 +5854,26 @@
                                                 true);
       ASSERT(existing_var != NULL);
       if (existing_var->owner() == current_block_->scope) {
-        ErrorMsg(function_pos, "identifier '%s' already defined",
-                 function_variable->name().ToCString());
+        ReportError(function_pos, "identifier '%s' already defined",
+                    function_variable->name().ToCString());
       } else {
-        ErrorMsg(function_pos,
-                 "'%s' from outer scope has already been used, cannot redefine",
-                 function_variable->name().ToCString());
+        ReportError(function_pos,
+                    "'%s' from outer scope has already been used, "
+                    "cannot redefine",
+                    function_variable->name().ToCString());
       }
     }
   }
 
   // Parse the local function.
-  Array& default_parameter_values = Array::Handle(isolate());
+  Array& default_parameter_values = Array::Handle(I);
   SequenceNode* statements = Parser::ParseFunc(function,
                                                &default_parameter_values);
 
   // Now that the local function has formal parameters, lookup the signature
   // class in the current library (but not in its imports) and only create a new
   // canonical signature class if it does not exist yet.
-  const String& signature = String::Handle(isolate(), function.Signature());
+  const String& signature = String::Handle(I, function.Signature());
   Class& signature_class = Class::ZoneHandle(I);
   if (!is_new_closure) {
     signature_class = function.signature_class();
@@ -5873,9 +5909,9 @@
 
   // Since the signature type is cached by the signature class, it may have
   // been finalized already.
-  Type& signature_type = Type::Handle(isolate(),
+  Type& signature_type = Type::Handle(I,
                                       signature_class.SignatureType());
-  TypeArguments& signature_type_arguments = TypeArguments::Handle(isolate(),
+  TypeArguments& signature_type_arguments = TypeArguments::Handle(I,
       signature_type.arguments());
 
   if (!signature_type.IsFinalized()) {
@@ -5931,14 +5967,14 @@
   // variables are not relevant for the compilation of the enclosing function.
   // This pruning is done by omitting to hook the local scope in its parent
   // scope in the constructor of LocalScope.
-  AstNode* closure = new(isolate()) ClosureNode(
+  AstNode* closure = new(I) ClosureNode(
       function_pos, function, NULL, statements->scope());
 
   if (function_variable == NULL) {
     ASSERT(is_literal);
     return closure;
   } else {
-    AstNode* initialization = new(isolate()) StoreLocalNode(
+    AstNode* initialization = new(I) StoreLocalNode(
         function_pos, function_variable, closure);
     return initialization;
   }
@@ -6025,12 +6061,32 @@
 }
 
 
+// Returns true if the next tokens can be parsed as a an optionally
+// qualified identifier: [ident '.'] ident.
+// Current token position is not restored.
+bool Parser::TryParseQualIdent() {
+  if (CurrentToken() != Token::kIDENT) {
+    return false;
+  }
+  ConsumeToken();
+  if (CurrentToken() == Token::kPERIOD) {
+    ConsumeToken();
+    if (CurrentToken() != Token::kIDENT) {
+      return false;
+    }
+    ConsumeToken();
+  }
+  return true;
+}
+
+
 // Returns true if the next tokens can be parsed as a type with optional
 // type parameters. Current token position is not restored.
 bool Parser::TryParseOptionalType() {
   if (CurrentToken() == Token::kIDENT) {
-    QualIdent type_name;
-    ParseQualIdent(&type_name);
+    if (!TryParseQualIdent()) {
+      return false;
+    }
     if ((CurrentToken() == Token::kLT) && !TryParseTypeParameters()) {
       return false;
     }
@@ -6265,7 +6321,8 @@
     }
     if (statement != NULL) {
       if (!dead_code_allowed && abrupt_completing_seen) {
-        ErrorMsg(statement_pos, "dead code after abrupt completing statement");
+        ReportError(statement_pos,
+                    "dead code after abrupt completing statement");
       }
       current_block_->statements->Add(statement);
       abrupt_completing_seen |= IsAbruptCompleting(statement);
@@ -6324,7 +6381,7 @@
     ConsumeToken();
     false_branch = ParseNestedStatement(parsing_loop_body, NULL);
   }
-  AstNode* if_node = new(isolate()) IfNode(
+  AstNode* if_node = new(I) IfNode(
       if_pos, cond_expr, true_branch, false_branch);
   if (label != NULL) {
     current_block_->statements->Add(if_node);
@@ -6364,21 +6421,21 @@
     const intptr_t val_pos = values[i]->token_pos();
     if (first_value.IsInteger()) {
       if (!val.IsInteger()) {
-        ErrorMsg(val_pos, "expected case expression of type int");
+        ReportError(val_pos, "expected case expression of type int");
       }
       continue;
     }
     if (first_value.IsString()) {
       if (!val.IsString()) {
-        ErrorMsg(val_pos, "expected case expression of type String");
+        ReportError(val_pos, "expected case expression of type String");
       }
       continue;
     }
     if (val.IsDouble()) {
-      ErrorMsg(val_pos, "case expression may not be of type double");
+      ReportError(val_pos, "case expression may not be of type double");
     }
     if (val.clazz() != first_value.clazz()) {
-      ErrorMsg(val_pos, "all case expressions must be of same type");
+      ReportError(val_pos, "all case expressions must be of same type");
     }
     if (i == 0) {
       // The value is of some type other than int, String or double.
@@ -6386,15 +6443,16 @@
       // Check this only in the first loop iteration since all values
       // are of the same type, which we check above.
       if (ImplementsEqualOperator(val)) {
-        ErrorMsg(val_pos,
-            "type class of case expression must not implement operator ==");
+        ReportError(val_pos,
+                    "type class of case expression must not "
+                    "implement operator ==");
       }
     }
   }
   if (first_value.IsInteger()) {
-    return Type::Handle(isolate(), Type::IntType()).type_class();
+    return Type::Handle(I, Type::IntType()).type_class();
   } else if (first_value.IsString()) {
-    return Type::Handle(isolate(), Type::StringType()).type_class();
+    return Type::Handle(I, Type::StringType()).type_class();
   }
   return first_value.clazz();
 }
@@ -6407,11 +6465,11 @@
   bool default_seen = false;
   const intptr_t case_pos = TokenPos();
   // The case expressions node sequence does not own the enclosing scope.
-  SequenceNode* case_expressions = new(isolate()) SequenceNode(case_pos, NULL);
+  SequenceNode* case_expressions = new(I) SequenceNode(case_pos, NULL);
   while (CurrentToken() == Token::kCASE || CurrentToken() == Token::kDEFAULT) {
     if (CurrentToken() == Token::kCASE) {
       if (default_seen) {
-        ErrorMsg("default clause must be last case");
+        ReportError("default clause must be last case");
       }
       ConsumeToken();  // Keyword case.
       const intptr_t expr_pos = TokenPos();
@@ -6419,14 +6477,14 @@
       ASSERT(expr->IsLiteralNode());
       case_expr_values->Add(expr->AsLiteralNode());
 
-      AstNode* switch_expr_load = new(isolate()) LoadLocalNode(
+      AstNode* switch_expr_load = new(I) LoadLocalNode(
           case_pos, switch_expr_value);
-      AstNode* case_comparison = new(isolate()) ComparisonNode(
+      AstNode* case_comparison = new(I) ComparisonNode(
           expr_pos, Token::kEQ, expr, switch_expr_load);
       case_expressions->Add(case_comparison);
     } else {
       if (default_seen) {
-        ErrorMsg("only one default clause is allowed");
+        ReportError("only one default clause is allowed");
       }
       ConsumeToken();  // Keyword default.
       default_seen = true;
@@ -6455,9 +6513,8 @@
       // End of this case clause. If there is a possible fall-through to
       // the next case clause, throw an implicit FallThroughError.
       if (!abrupt_completing_seen) {
-        ArgumentListNode* arguments = new(isolate()) ArgumentListNode(
-            TokenPos());
-        arguments->Add(new(isolate()) LiteralNode(
+        ArgumentListNode* arguments = new(I) ArgumentListNode(TokenPos());
+        arguments->Add(new(I) LiteralNode(
             TokenPos(), Integer::ZoneHandle(I, Integer::New(TokenPos()))));
         current_block_->statements->Add(
             MakeStaticCall(Symbols::FallThroughError(),
@@ -6474,7 +6531,7 @@
     }
   }
   SequenceNode* statements = CloseBlock();
-  return new(isolate()) CaseNode(case_pos, case_label,
+  return new(I) CaseNode(case_pos, case_label,
       case_expressions, default_seen, switch_expr_value, statements);
 }
 
@@ -6500,14 +6557,14 @@
   // a new type representing dynamic and can't reuse the canonical
   // type object for dynamic.
   const Type& temp_var_type = Type::ZoneHandle(I,
-       Type::New(Class::Handle(isolate(), Object::dynamic_class()),
-                 TypeArguments::Handle(isolate()),
+       Type::New(Class::Handle(I, Object::dynamic_class()),
+                 TypeArguments::Handle(I),
                  expr_pos));
   temp_var_type.SetIsFinalized();
-  LocalVariable* temp_variable = new(isolate()) LocalVariable(
+  LocalVariable* temp_variable = new(I) LocalVariable(
       expr_pos,  Symbols::SwitchExpr(), temp_var_type);
   current_block_->scope->AddVariable(temp_variable);
-  AstNode* save_switch_expr = new(isolate()) StoreLocalNode(
+  AstNode* save_switch_expr = new(I) StoreLocalNode(
       expr_pos, temp_variable, switch_expr);
   current_block_->statements->Add(save_switch_expr);
 
@@ -6526,7 +6583,7 @@
       case_label = current_block_->scope->LocalLookupLabel(*label_name);
       if (case_label == NULL) {
         // Label does not exist yet. Add it to scope of switch statement.
-        case_label = new(isolate()) SourceLabel(
+        case_label = new(I) SourceLabel(
             label_pos, *label_name, SourceLabel::kCase);
         current_block_->scope->AddLabel(case_label);
       } else if (case_label->kind() == SourceLabel::kForward) {
@@ -6534,24 +6591,24 @@
         // the forward reference.
         case_label->ResolveForwardReference();
       } else {
-        ErrorMsg(label_pos, "label '%s' already exists in scope",
-                 label_name->ToCString());
+        ReportError(label_pos, "label '%s' already exists in scope",
+                    label_name->ToCString());
       }
       ASSERT(case_label->kind() == SourceLabel::kCase);
     }
     if (CurrentToken() == Token::kCASE ||
         CurrentToken() == Token::kDEFAULT) {
       if (default_seen) {
-        ErrorMsg("no case clauses allowed after default clause");
+        ReportError("no case clauses allowed after default clause");
       }
       CaseNode* case_clause =
           ParseCaseClause(temp_variable, &case_expr_values, case_label);
       default_seen = case_clause->contains_default();
       current_block_->statements->Add(case_clause);
     } else if (CurrentToken() != Token::kRBRACE) {
-      ErrorMsg("'case' or '}' expected");
+      ReportError("'case' or '}' expected");
     } else if (case_label != NULL) {
-      ErrorMsg("expecting at least one case clause after label");
+      ReportError("expecting at least one case clause after label");
     } else {
       break;
     }
@@ -6562,19 +6619,19 @@
   // variable holding the switch expression to match the type of the
   // case clause constants.
   temp_var_type.set_type_class(
-      Class::Handle(isolate(), CheckCaseExpressions(case_expr_values)));
+      Class::Handle(I, CheckCaseExpressions(case_expr_values)));
 
   // Check for unresolved label references.
   SourceLabel* unresolved_label =
       current_block_->scope->CheckUnresolvedLabels();
   if (unresolved_label != NULL) {
-    ErrorMsg("unresolved reference to label '%s'",
-             unresolved_label->name().ToCString());
+    ReportError("unresolved reference to label '%s'",
+                unresolved_label->name().ToCString());
   }
 
   SequenceNode* switch_body = CloseBlock();
   ExpectToken(Token::kRBRACE);
-  return new(isolate()) SwitchNode(switch_pos, label, switch_body);
+  return new(I) SwitchNode(switch_pos, label, switch_body);
 }
 
 
@@ -6589,7 +6646,7 @@
   ExpectToken(Token::kRPAREN);
   const bool parsing_loop_body =  true;
   SequenceNode* while_body = ParseNestedStatement(parsing_loop_body, label);
-  return new(isolate()) WhileNode(while_pos, label, cond_expr, while_body);
+  return new(I) WhileNode(while_pos, label, cond_expr, while_body);
 }
 
 
@@ -6606,7 +6663,7 @@
   AstNode* cond_expr = ParseExpr(kAllowConst, kConsumeCascades);
   ExpectToken(Token::kRPAREN);
   ExpectSemicolon();
-  return new(isolate()) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
+  return new(I) DoWhileNode(do_pos, label, cond_expr, dowhile_body);
 }
 
 
@@ -6615,7 +6672,7 @@
   TRACE_PARSER("ParseForInStatement");
   bool is_final = (CurrentToken() == Token::kFINAL);
   if (CurrentToken() == Token::kCONST) {
-    ErrorMsg("Loop variable cannot be 'const'");
+    ReportError("Loop variable cannot be 'const'");
   }
   const String* loop_var_name = NULL;
   LocalVariable* loop_var = NULL;
@@ -6631,7 +6688,7 @@
                                       ClassFinalizer::kIgnore));
     loop_var_pos = TokenPos();
     loop_var_name = ExpectIdentifier("variable name expected");
-    loop_var = new(isolate()) LocalVariable(loop_var_pos, *loop_var_name, type);
+    loop_var = new(I) LocalVariable(loop_var_pos, *loop_var_name, type);
     if (is_final) {
       loop_var->set_is_final();
     }
@@ -6650,22 +6707,22 @@
   // It is better to leave the iterator untyped and postpone the type error
   // until the loop variable is assigned to.
   const AbstractType& iterator_type = Type::ZoneHandle(I, Type::DynamicType());
-  LocalVariable* iterator_var = new(isolate()) LocalVariable(
+  LocalVariable* iterator_var = new(I) LocalVariable(
       collection_pos, Symbols::ForInIter(), iterator_type);
   current_block_->scope->AddVariable(iterator_var);
 
   // Generate initialization of iterator variable.
-  ArgumentListNode* no_args = new(isolate()) ArgumentListNode(collection_pos);
-  AstNode* get_iterator = new(isolate()) InstanceGetterNode(
+  ArgumentListNode* no_args = new(I) ArgumentListNode(collection_pos);
+  AstNode* get_iterator = new(I) InstanceGetterNode(
       collection_pos, collection_expr, Symbols::GetIterator());
   AstNode* iterator_init =
-      new(isolate()) StoreLocalNode(collection_pos, iterator_var, get_iterator);
+      new(I) StoreLocalNode(collection_pos, iterator_var, get_iterator);
   current_block_->statements->Add(iterator_init);
 
   // Generate while loop condition.
-  AstNode* iterator_moveNext = new(isolate()) InstanceCallNode(
+  AstNode* iterator_moveNext = new(I) InstanceCallNode(
       collection_pos,
-      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
+      new(I) LoadLocalNode(collection_pos, iterator_var),
       Symbols::MoveNext(),
       no_args);
 
@@ -6676,9 +6733,9 @@
   OpenLoopBlock();
   current_block_->scope->AddLabel(label);
 
-  AstNode* iterator_current = new(isolate()) InstanceGetterNode(
+  AstNode* iterator_current = new(I) InstanceGetterNode(
       collection_pos,
-      new(isolate()) LoadLocalNode(collection_pos, iterator_var),
+      new(I) LoadLocalNode(collection_pos, iterator_var),
       Symbols::Current());
 
   // Generate assignment of next iterator value to loop variable.
@@ -6687,7 +6744,7 @@
     // The for loop declares a new variable. Add it to the loop body scope.
     current_block_->scope->AddVariable(loop_var);
     loop_var_assignment =
-        new(isolate()) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
+        new(I) StoreLocalNode(loop_var_pos, loop_var, iterator_current);
   } else {
     AstNode* loop_var_primary =
         ResolveIdent(loop_var_pos, *loop_var_name, false);
@@ -6712,7 +6769,7 @@
 
   SequenceNode* for_loop_statement = CloseBlock();
 
-  AstNode* while_statement = new(isolate()) WhileNode(
+  AstNode* while_statement = new(I) WhileNode(
       forin_pos, label, iterator_moveNext, for_loop_statement);
   current_block_->statements->Add(while_statement);
 
@@ -6764,8 +6821,8 @@
   for (int i = 0; i < init_scope->num_variables(); i++) {
     if (init_scope->VariableAt(i)->is_captured() &&
         (init_scope->VariableAt(i)->owner() == init_scope)) {
-      SequenceNode* incr_sequence = new(isolate()) SequenceNode(incr_pos, NULL);
-      incr_sequence->Add(new(isolate()) CloneContextNode(for_pos));
+      SequenceNode* incr_sequence = new(I) SequenceNode(incr_pos, NULL);
+      incr_sequence->Add(new(I) CloneContextNode(for_pos));
       if (increment != NULL) {
         incr_sequence->Add(increment);
       }
@@ -6773,13 +6830,13 @@
       break;
     }
   }
-  AstNode* for_node =
-      new(isolate()) ForNode(for_pos,
-                  label,
-                  NodeAsSequenceNode(init_pos, initializer, NULL),
-                  condition,
-                  NodeAsSequenceNode(incr_pos, increment, NULL),
-                  body);
+  AstNode* for_node = new(I) ForNode(
+      for_pos,
+      label,
+      NodeAsSequenceNode(init_pos, initializer, NULL),
+      condition,
+      NodeAsSequenceNode(incr_pos, increment, NULL),
+      body);
   current_block_->statements->Add(for_node);
   return CloseBlock();
 }
@@ -6789,8 +6846,7 @@
 AstNode* Parser::MakeStaticCall(const String& cls_name,
                                 const String& func_name,
                                 ArgumentListNode* arguments) {
-  const Class& cls = Class::Handle(isolate(),
-                                   Library::LookupCoreClass(cls_name));
+  const Class& cls = Class::Handle(I, Library::LookupCoreClass(cls_name));
   ASSERT(!cls.IsNull());
   const Function& func = Function::ZoneHandle(I,
       Resolver::ResolveStatic(cls,
@@ -6798,15 +6854,15 @@
                               arguments->length(),
                               arguments->names()));
   ASSERT(!func.IsNull());
-  return new(isolate()) StaticCallNode(arguments->token_pos(), func, arguments);
+  return new(I) StaticCallNode(arguments->token_pos(), func, arguments);
 }
 
 
 AstNode* Parser::MakeAssertCall(intptr_t begin, intptr_t end) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(begin);
-  arguments->Add(new(isolate()) LiteralNode(begin,
+  ArgumentListNode* arguments = new(I) ArgumentListNode(begin);
+  arguments->Add(new(I) LiteralNode(begin,
       Integer::ZoneHandle(I, Integer::New(begin))));
-  arguments->Add(new(isolate()) LiteralNode(end,
+  arguments->Add(new(I) LiteralNode(end,
       Integer::ZoneHandle(I, Integer::New(end))));
   return MakeStaticCall(Symbols::AssertionError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -6822,7 +6878,7 @@
     const intptr_t pos = condition->token_pos();
     condition = BuildClosureCall(pos,
                                  condition,
-                                 new(isolate()) ArgumentListNode(pos));
+                                 new(I) ArgumentListNode(pos));
   } else if (condition->IsConditionalExprNode()) {
     ConditionalExprNode* cond_expr = condition->AsConditionalExprNode();
     cond_expr->set_true_expr(InsertClosureCallNodes(cond_expr->true_expr()));
@@ -6846,9 +6902,9 @@
   const intptr_t condition_end = TokenPos();
   ExpectToken(Token::kRPAREN);
   condition = InsertClosureCallNodes(condition);
-  condition = new(isolate()) UnaryOpNode(condition_pos, Token::kNOT, condition);
+  condition = new(I) UnaryOpNode(condition_pos, Token::kNOT, condition);
   AstNode* assert_throw = MakeAssertCall(condition_pos, condition_end);
-  return new(isolate()) IfNode(
+  return new(I) IfNode(
       condition_pos,
       condition,
       NodeAsSequenceNode(condition_pos, assert_throw, NULL),
@@ -6871,7 +6927,7 @@
                                    CatchParamDesc* stack_trace_param,
                                    LocalScope* scope) {
   if (exception_param->name != NULL) {
-    LocalVariable* var = new(isolate()) LocalVariable(
+    LocalVariable* var = new(I) LocalVariable(
         exception_param->token_pos,
         *exception_param->name,
         *exception_param->type);
@@ -6881,17 +6937,17 @@
     exception_param->var = var;
   }
   if (stack_trace_param->name != NULL) {
-    LocalVariable* var = new(isolate()) LocalVariable(
+    LocalVariable* var = new(I) LocalVariable(
         stack_trace_param->token_pos,
         *stack_trace_param->name,
         *stack_trace_param->type);
     var->set_is_final();
     bool added_to_scope = scope->AddVariable(var);
     if (!added_to_scope) {
-      ErrorMsg(stack_trace_param->token_pos,
-               "name '%s' already exists in scope",
-               stack_trace_param->name->ToCString());
-    }
+      ReportError(stack_trace_param->token_pos,
+                  "name '%s' already exists in scope",
+                  stack_trace_param->name->ToCString());
+       }
     stack_trace_param->var = var;
   }
 }
@@ -6910,7 +6966,7 @@
 
 void Parser::PushTryBlock(Block* try_block) {
   intptr_t try_index = AllocateTryIndex();
-  TryBlocks* block = new(isolate()) TryBlocks(
+  TryBlocks* block = new(I) TryBlocks(
       try_block, try_blocks_list_, try_index);
   try_blocks_list_ = block;
 }
@@ -7026,8 +7082,8 @@
       // Generate code to load the exception object (:exception_var) into
       // the exception variable specified in this block.
       ASSERT(exception_var != NULL);
-      current_block_->statements->Add(new(isolate()) StoreLocalNode(
-          catch_pos, exception_param.var, new(isolate()) LoadLocalNode(
+      current_block_->statements->Add(new(I) StoreLocalNode(
+          catch_pos, exception_param.var, new(I) LoadLocalNode(
               catch_pos, exception_var)));
     }
     if (stack_trace_param.var != NULL) {
@@ -7035,14 +7091,14 @@
       // to load the stack trace object (:stack_trace_var) into the stack
       // trace variable specified in this block.
       *needs_stack_trace = true;
-      ArgumentListNode* no_args = new(isolate()) ArgumentListNode(catch_pos);
+      ArgumentListNode* no_args = new(I) ArgumentListNode(catch_pos);
       ASSERT(stack_trace_var != NULL);
-      current_block_->statements->Add(new(isolate()) StoreLocalNode(
-          catch_pos, stack_trace_param.var, new(isolate()) LoadLocalNode(
+      current_block_->statements->Add(new(I) StoreLocalNode(
+          catch_pos, stack_trace_param.var, new(I) LoadLocalNode(
               catch_pos, stack_trace_var)));
-      current_block_->statements->Add(new(isolate()) InstanceCallNode(
+      current_block_->statements->Add(new(I) InstanceCallNode(
           catch_pos,
-          new(isolate()) LoadLocalNode(catch_pos, stack_trace_param.var),
+          new(I) LoadLocalNode(catch_pos, stack_trace_param.var),
           Library::PrivateCoreLibName(Symbols::_setupFullStackTrace()),
           no_args));
     }
@@ -7061,10 +7117,10 @@
       // In the first case, unconditionally execute the catch body.  In the
       // second case, unconditionally throw.
       generic_catch_seen = true;
-      type_tests.Add(new(isolate()) LiteralNode(catch_pos, Bool::True()));
+      type_tests.Add(new(I) LiteralNode(catch_pos, Bool::True()));
       if (is_bad_type) {
         // Replace the body with one that throws.
-        SequenceNode* block = new(isolate()) SequenceNode(catch_pos, NULL);
+        SequenceNode* block = new(I) SequenceNode(catch_pos, NULL);
         block->Add(ThrowTypeError(catch_pos, *exception_param.type));
         catch_blocks.Last() = block;
       }
@@ -7080,14 +7136,14 @@
         // Make sure that the instantiator is captured.
         CaptureInstantiator();
       }
-      TypeNode* exception_type = new(isolate()) TypeNode(
+      TypeNode* exception_type = new(I) TypeNode(
           catch_pos, *exception_param.type);
-      AstNode* exception_value = new(isolate()) LoadLocalNode(
+      AstNode* exception_value = new(I) LoadLocalNode(
           catch_pos, exception_var);
       if (!exception_type->type().IsInstantiated()) {
         EnsureExpressionTemp();
       }
-      type_tests.Add(new(isolate()) ComparisonNode(
+      type_tests.Add(new(I) ComparisonNode(
           catch_pos, Token::kIS, exception_value, exception_type));
 
       // Do not add uninstantiated types (e.g. type parameter T or generic
@@ -7115,11 +7171,11 @@
     // There isn't a generic catch clause so create a clause body that
     // rethrows the exception.  This includes the case that there were no
     // catch clauses.
-    current = new(isolate()) SequenceNode(handler_pos, NULL);
-    current->Add(new(isolate()) ThrowNode(
+    current = new(I) SequenceNode(handler_pos, NULL);
+    current->Add(new(I) ThrowNode(
         handler_pos,
-        new(isolate()) LoadLocalNode(handler_pos, exception_var),
-        new(isolate()) LoadLocalNode(handler_pos, stack_trace_var)));
+        new(I) LoadLocalNode(handler_pos, exception_var),
+        new(I) LoadLocalNode(handler_pos, stack_trace_var)));
   } else if (type_tests.Last()->IsLiteralNode()) {
     ASSERT(type_tests.Last()->AsLiteralNode()->literal().raw() ==
            Bool::True().raw());
@@ -7137,7 +7193,7 @@
   while (!type_tests.is_empty()) {
     AstNode* type_test = type_tests.RemoveLast();
     SequenceNode* catch_block = catch_blocks.RemoveLast();
-    current_block_->statements->Add(new(isolate()) IfNode(
+    current_block_->statements->Add(new(I) IfNode(
         type_test->token_pos(), type_test, catch_block, current));
     current = CloseBlock();
   }
@@ -7164,7 +7220,7 @@
   LocalVariable* context_var =
       current_block_->scope->LocalLookupVariable(Symbols::SavedTryContextVar());
   if (context_var == NULL) {
-    context_var = new(isolate()) LocalVariable(
+    context_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::SavedTryContextVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7173,7 +7229,7 @@
   LocalVariable* exception_var =
       current_block_->scope->LocalLookupVariable(Symbols::ExceptionVar());
   if (exception_var == NULL) {
-    exception_var = new(isolate()) LocalVariable(
+    exception_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::ExceptionVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7182,7 +7238,7 @@
   LocalVariable* stack_trace_var =
       current_block_->scope->LocalLookupVariable(Symbols::StackTraceVar());
   if (stack_trace_var == NULL) {
-    stack_trace_var = new(isolate()) LocalVariable(
+    stack_trace_var = new(I) LocalVariable(
         TokenPos(),
         Symbols::StackTraceVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7209,14 +7265,14 @@
 
   if ((CurrentToken() != Token::kCATCH) && !IsLiteral("on") &&
       (CurrentToken() != Token::kFINALLY)) {
-    ErrorMsg("catch or finally clause expected");
+    ReportError("catch or finally clause expected");
   }
 
   // Now parse the 'catch' blocks if any.
   try_blocks_list_->enter_catch();
   const intptr_t handler_pos = TokenPos();
   const GrowableObjectArray& handler_types =
-      GrowableObjectArray::Handle(isolate(), GrowableObjectArray::New());
+      GrowableObjectArray::Handle(I, GrowableObjectArray::New());
   bool needs_stack_trace = false;
   SequenceNode* catch_handler_list =
       ParseCatchClauses(handler_pos, exception_var, stack_trace_var,
@@ -7240,7 +7296,7 @@
         inner_try_block->GetNodeToInlineFinally(node_index);
     while (node_to_inline != NULL) {
       finally_block = ParseFinallyBlock();
-      InlinedFinallyNode* node = new(isolate()) InlinedFinallyNode(finally_pos,
+      InlinedFinallyNode* node = new(I) InlinedFinallyNode(finally_pos,
                                                         finally_block,
                                                         context_var,
                                                         outer_try_index);
@@ -7252,7 +7308,7 @@
     finally_block = ParseFinallyBlock();
   }
 
-  CatchClauseNode* catch_clause = new(isolate()) CatchClauseNode(
+  CatchClauseNode* catch_clause = new(I) CatchClauseNode(
       handler_pos,
       catch_handler_list,
       Array::ZoneHandle(I, Array::MakeArray(handler_types)),
@@ -7266,7 +7322,7 @@
   // Now create the try/catch ast node and return it. If there is a label
   // on the try/catch, close the block that's embedding the try statement
   // and attach the label to it.
-  AstNode* try_catch_node = new(isolate()) TryCatchNode(
+  AstNode* try_catch_node = new(I) TryCatchNode(
       try_pos, try_block, context_var, catch_clause, finally_block, try_index);
 
   if (try_label != NULL) {
@@ -7293,8 +7349,8 @@
     // Handle pathological cases first.
     if (label_name != NULL && target_name.Equals(*label_name)) {
       if (jump_kind == Token::kCONTINUE) {
-        ErrorMsg(jump_pos, "'continue' jump to label '%s' is illegal",
-                 target_name.ToCString());
+        ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
+                    target_name.ToCString());
       }
       // L: break L; is a no-op.
       return NULL;
@@ -7308,37 +7364,37 @@
       LocalScope* switch_scope = current_block_->scope->LookupSwitchScope();
       if (switch_scope != NULL) {
         // We found a switch scope. Enter a forward reference to the label.
-        target = new(isolate()) SourceLabel(
+        target = new(I) SourceLabel(
             TokenPos(), target_name, SourceLabel::kForward);
         switch_scope->AddLabel(target);
       }
     }
     if (target == NULL) {
-      ErrorMsg(jump_pos, "label '%s' not found", target_name.ToCString());
+      ReportError(jump_pos, "label '%s' not found", target_name.ToCString());
     }
   } else {
     target = current_block_->scope->LookupInnermostLabel(jump_kind);
     if (target == NULL) {
-      ErrorMsg(jump_pos, "'%s' is illegal here", Token::Str(jump_kind));
+      ReportError(jump_pos, "'%s' is illegal here", Token::Str(jump_kind));
     }
   }
   ASSERT(target != NULL);
   if (jump_kind == Token::kCONTINUE) {
     if (target->kind() == SourceLabel::kSwitch) {
-      ErrorMsg(jump_pos, "'continue' jump to switch statement is illegal");
+      ReportError(jump_pos, "'continue' jump to switch statement is illegal");
     } else if (target->kind() == SourceLabel::kStatement) {
-      ErrorMsg(jump_pos, "'continue' jump to label '%s' is illegal",
-               target->name().ToCString());
+      ReportError(jump_pos, "'continue' jump to label '%s' is illegal",
+                  target->name().ToCString());
     }
   }
   if (jump_kind == Token::kBREAK && target->kind() == SourceLabel::kCase) {
-    ErrorMsg(jump_pos, "'break' to case clause label is illegal");
+    ReportError(jump_pos, "'break' to case clause label is illegal");
   }
   if (target->FunctionLevel() != current_block_->scope->function_level()) {
-    ErrorMsg(jump_pos, "'%s' target must be in same function context",
-             Token::Str(jump_kind));
+    ReportError(jump_pos, "'%s' target must be in same function context",
+                Token::Str(jump_kind));
   }
-  return new(isolate()) JumpNode(jump_pos, jump_kind, target);
+  return new(I) JumpNode(jump_pos, jump_kind, target);
 }
 
 
@@ -7376,12 +7432,13 @@
     if (CurrentToken() != Token::kSEMICOLON) {
       if (current_function().IsConstructor() &&
           (current_block_->scope->function_level() == 0)) {
-        ErrorMsg(return_pos, "return of a value not allowed in constructors");
+        ReportError(return_pos,
+                    "return of a value not allowed in constructors");
       }
       AstNode* expr = ParseExpr(kAllowConst, kConsumeCascades);
-      statement = new(isolate()) ReturnNode(statement_pos, expr);
+      statement = new(I) ReturnNode(statement_pos, expr);
     } else {
-      statement = new(isolate()) ReturnNode(statement_pos);
+      statement = new(I) ReturnNode(statement_pos);
     }
     AddNodeForFinallyInlining(statement);
     ExpectSemicolon();
@@ -7426,7 +7483,7 @@
     ExpectSemicolon();
     // Check if it is ok to do a rethrow.
     if ((try_blocks_list_ == NULL) || !try_blocks_list_->inside_catch()) {
-      ErrorMsg(statement_pos, "rethrow of an exception is not valid here");
+      ReportError(statement_pos, "rethrow of an exception is not valid here");
     }
     // The exception and stack trace variables are bound in the block
     // containing the try.
@@ -7438,10 +7495,10 @@
     LocalVariable* trace_var =
         scope->LocalLookupVariable(Symbols::StackTraceVar());
     ASSERT(trace_var != NULL);
-    statement = new(isolate()) ThrowNode(
+    statement = new(I) ThrowNode(
         statement_pos,
-        new(isolate()) LoadLocalNode(statement_pos, excp_var),
-        new(isolate()) LoadLocalNode(statement_pos, trace_var));
+        new(I) LoadLocalNode(statement_pos, excp_var),
+        new(I) LoadLocalNode(statement_pos, trace_var));
   } else {
     statement = ParseExpr(kAllowConst, kConsumeCascades);
     ExpectSemicolon();
@@ -7450,97 +7507,63 @@
 }
 
 
-void Parser::ErrorMsg(intptr_t token_pos, const char* format, ...) const {
-  va_list args;
-  va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, token_pos,
-      LanguageError::kError, Heap::kNew, format, args));
-  va_end(args);
-  isolate()->long_jump_base()->Jump(1, error);
+void Parser::ReportError(const Error& error) {
+  Report::LongJump(error);
   UNREACHABLE();
 }
 
 
-void Parser::ErrorMsg(const char* format, ...) {
+void Parser::ReportErrors(const Error& prev_error,
+                          const Script& script, intptr_t token_pos,
+                          const char* format, ...) {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, TokenPos(),
-      LanguageError::kError, Heap::kNew, format, args));
+  Report::LongJumpV(prev_error, script, token_pos, format, args);
   va_end(args);
-  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
 
-void Parser::ErrorMsg(const Error& error) {
-  Isolate::Current()->long_jump_base()->Jump(1, error);
+void Parser::ReportError(intptr_t token_pos, const char* format, ...) const {
+  va_list args;
+  va_start(args, format);
+  Report::MessageV(Report::kError, script_, token_pos, format, args);
+  va_end(args);
   UNREACHABLE();
 }
 
 
-void Parser::AppendErrorMsg(
-      const Error& prev_error, intptr_t token_pos, const char* format, ...) {
+void Parser::ReportError(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      prev_error, script_, token_pos,
-      LanguageError::kError, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kError, script_, TokenPos(), format, args);
   va_end(args);
-  isolate()->long_jump_base()->Jump(1, error);
   UNREACHABLE();
 }
 
 
-void Parser::Warning(intptr_t token_pos, const char* format, ...) {
-  if (FLAG_silent_warnings) return;
+void Parser::ReportWarning(intptr_t token_pos, const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, token_pos,
-      LanguageError::kWarning, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kWarning, script_, token_pos, format, args);
   va_end(args);
-  if (FLAG_warning_as_error) {
-    isolate()->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
 }
 
 
-void Parser::Warning(const char* format, ...) {
-  if (FLAG_silent_warnings) return;
+void Parser::ReportWarning(const char* format, ...) const {
   va_list args;
   va_start(args, format);
-  const Error& error = Error::Handle(isolate(), LanguageError::NewFormattedV(
-      Error::Handle(isolate()), script_, TokenPos(),
-      LanguageError::kWarning, Heap::kNew,
-      format, args));
+  Report::MessageV(Report::kWarning, script_, TokenPos(), format, args);
   va_end(args);
-  if (FLAG_warning_as_error) {
-    isolate()->long_jump_base()->Jump(1, error);
-    UNREACHABLE();
-  } else {
-    OS::Print("%s", error.ToErrorCString());
-  }
-}
-
-
-void Parser::Unimplemented(const char* msg) {
-  ErrorMsg(TokenPos(), "%s", msg);
 }
 
 
 void Parser::CheckToken(Token::Kind token_expected, const char* msg) {
   if (CurrentToken() != token_expected) {
     if (msg != NULL) {
-      ErrorMsg("%s", msg);
+      ReportError("%s", msg);
     } else {
-      ErrorMsg("'%s' expected", Token::Str(token_expected));
+      ReportError("'%s' expected", Token::Str(token_expected));
     }
   }
 }
@@ -7548,7 +7571,7 @@
 
 void Parser::ExpectToken(Token::Kind token_expected) {
   if (CurrentToken() != token_expected) {
-    ErrorMsg("'%s' expected", Token::Str(token_expected));
+    ReportError("'%s' expected", Token::Str(token_expected));
   }
   ConsumeToken();
 }
@@ -7556,26 +7579,26 @@
 
 void Parser::ExpectSemicolon() {
   if (CurrentToken() != Token::kSEMICOLON) {
-    ErrorMsg("semicolon expected");
+    ReportError("semicolon expected");
   }
   ConsumeToken();
 }
 
 
 void Parser::UnexpectedToken() {
-  ErrorMsg("unexpected token '%s'",
-           CurrentToken() == Token::kIDENT ?
-               CurrentLiteral()->ToCString() : Token::Str(CurrentToken()));
+  ReportError("unexpected token '%s'",
+              CurrentToken() == Token::kIDENT ?
+                  CurrentLiteral()->ToCString() : Token::Str(CurrentToken()));
 }
 
 
 String* Parser::ExpectUserDefinedTypeIdentifier(const char* msg) {
   if (CurrentToken() != Token::kIDENT) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   String* ident = CurrentLiteral();
   if (ident->Equals("dynamic")) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   ConsumeToken();
   return ident;
@@ -7585,7 +7608,7 @@
 // Check whether current token is an identifier or a built-in identifier.
 String* Parser::ExpectIdentifier(const char* msg) {
   if (!IsIdentifier()) {
-    ErrorMsg("%s", msg);
+    ReportError("%s", msg);
   }
   String* ident = CurrentLiteral();
   ConsumeToken();
@@ -7625,20 +7648,20 @@
 
 
 AstNode* Parser::ThrowTypeError(intptr_t type_pos, const AbstractType& type) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(type_pos);
+  ArgumentListNode* arguments = new(I) ArgumentListNode(type_pos);
   // Location argument.
-  arguments->Add(new(isolate()) LiteralNode(
+  arguments->Add(new(I) LiteralNode(
       type_pos, Integer::ZoneHandle(I, Integer::New(type_pos))));
   // Src value argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Instance::ZoneHandle(I)));
+  arguments->Add(new(I) LiteralNode(type_pos, Instance::ZoneHandle(I)));
   // Dst type name argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Malformed()));
+  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Malformed()));
   // Dst name argument.
-  arguments->Add(new(isolate()) LiteralNode(type_pos, Symbols::Empty()));
+  arguments->Add(new(I) LiteralNode(type_pos, Symbols::Empty()));
   // Malformed type error or malbounded type error.
-  const Error& error = Error::Handle(isolate(), type.error());
+  const Error& error = Error::Handle(I, type.error());
   ASSERT(!error.IsNull());
-  arguments->Add(new(isolate()) LiteralNode(type_pos, String::ZoneHandle(I,
+  arguments->Add(new(I) LiteralNode(type_pos, String::ZoneHandle(I,
       Symbols::New(error.ToErrorCString()))));
   return MakeStaticCall(Symbols::TypeError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7653,7 +7676,7 @@
                                         InvocationMirror::Call im_call,
                                         InvocationMirror::Type im_type,
                                         const Function* func) {
-  ArgumentListNode* arguments = new(isolate()) ArgumentListNode(call_pos);
+  ArgumentListNode* arguments = new(I) ArgumentListNode(call_pos);
   // Object receiver.
   // If the function is external and dynamic, pass the actual receiver,
   // otherwise, pass a class literal of the unresolved method's owner.
@@ -7662,13 +7685,13 @@
     arguments->Add(LoadReceiver(func->token_pos()));
   } else {
     Type& type = Type::ZoneHandle(I,
-        Type::New(cls, TypeArguments::Handle(isolate()), call_pos, Heap::kOld));
+        Type::New(cls, TypeArguments::Handle(I), call_pos, Heap::kOld));
     type ^= ClassFinalizer::FinalizeType(
         current_class(), type, ClassFinalizer::kCanonicalize);
-    arguments->Add(new(isolate()) LiteralNode(call_pos, type));
+    arguments->Add(new(I) LiteralNode(call_pos, type));
   }
   // String memberName.
-  arguments->Add(new(isolate()) LiteralNode(
+  arguments->Add(new(I) LiteralNode(
       call_pos, String::ZoneHandle(I, Symbols::New(function_name))));
   // Smi invocation_type.
   if (cls.IsTopLevel()) {
@@ -7676,13 +7699,13 @@
            im_call == InvocationMirror::kTopLevel);
     im_call = InvocationMirror::kTopLevel;
   }
-  arguments->Add(new(isolate()) LiteralNode(call_pos, Smi::ZoneHandle(I,
+  arguments->Add(new(I) LiteralNode(call_pos, Smi::ZoneHandle(I,
       Smi::New(InvocationMirror::EncodeType(im_call, im_type)))));
   // List arguments.
   if (function_arguments == NULL) {
-    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    ArrayNode* array = new(isolate()) ArrayNode(
+    ArrayNode* array = new(I) ArrayNode(
         call_pos,
         Type::ZoneHandle(I, Type::ArrayType()),
         function_arguments->nodes());
@@ -7690,10 +7713,9 @@
   }
   // List argumentNames.
   if (function_arguments == NULL) {
-    arguments->Add(new(isolate()) LiteralNode(call_pos, Array::ZoneHandle(I)));
+    arguments->Add(new(I) LiteralNode(call_pos, Array::ZoneHandle(I)));
   } else {
-    arguments->Add(new(isolate()) LiteralNode(
-        call_pos, function_arguments->names()));
+    arguments->Add(new(I) LiteralNode(call_pos, function_arguments->names()));
   }
 
   // List existingArgumentNames.
@@ -7701,7 +7723,7 @@
   // has done the lookup already. If there is a function with the same
   // name but incompatible parameters, inform the NoSuchMethodError what the
   // expected parameters are.
-  Function& function = Function::Handle(isolate());
+  Function& function = Function::Handle(I);
   if (func != NULL) {
     function = func->raw();
   } else {
@@ -7723,10 +7745,9 @@
     // between dart2js and VM. Update the constructor to accept a string
     // describing the formal parameters of an incompatible call target.
     array = Array::New(1, Heap::kOld);
-    array.SetAt(0, String::Handle(isolate(),
-        function.UserVisibleFormalParameters()));
+    array.SetAt(0, String::Handle(I, function.UserVisibleFormalParameters()));
   }
-  arguments->Add(new(isolate()) LiteralNode(call_pos, array));
+  arguments->Add(new(I) LiteralNode(call_pos, array));
 
   return MakeStaticCall(Symbols::NoSuchMethodError(),
                         Library::PrivateCoreLibName(Symbols::ThrowNew()),
@@ -7740,7 +7761,7 @@
   AstNode* left_operand = ParseUnaryExpr();
   if (left_operand->IsPrimaryNode() &&
       (left_operand->AsPrimaryNode()->IsSuper())) {
-    ErrorMsg(left_operand->token_pos(), "illegal use of 'super'");
+    ReportError(left_operand->token_pos(), "illegal use of 'super'");
   }
   int current_preced = Token::Precedence(CurrentToken());
   while (current_preced >= min_preced) {
@@ -7765,7 +7786,7 @@
           // Make sure that the instantiator is captured.
           CaptureInstantiator();
         }
-        right_operand = new(isolate()) TypeNode(type_pos, type);
+        right_operand = new(I) TypeNode(type_pos, type);
         // In production mode, the type may be malformed.
         // In checked mode, the type may be malformed or malbounded.
         if (((op_kind == Token::kIS) || (op_kind == Token::kISNOT) ||
@@ -7775,7 +7796,7 @@
           // a type cast even if the tested value is null.
           // We need to evaluate the left operand for potential
           // side effects.
-          LetNode* let = new(isolate()) LetNode(left_operand->token_pos());
+          LetNode* let = new(I) LetNode(left_operand->token_pos());
           let->AddNode(left_operand);
           let->AddNode(ThrowTypeError(type_pos, type));
           left_operand = let;
@@ -7792,7 +7813,7 @@
             EnsureExpressionTemp();
           }
         }
-        left_operand = new(isolate()) ComparisonNode(
+        left_operand = new(I) ComparisonNode(
             op_pos, op_kind, left_operand, right_operand);
         break;  // Equality and relational operators cannot be chained.
       } else {
@@ -7811,7 +7832,7 @@
   AstNode* expressions = ParseExpr(kAllowConst, kConsumeCascades);
   if (CurrentToken() == Token::kCOMMA) {
     // Collect comma-separated expressions in a non scope owning sequence node.
-    SequenceNode* list = new(isolate()) SequenceNode(TokenPos(), NULL);
+    SequenceNode* list = new(I) SequenceNode(TokenPos(), NULL);
     list->Add(expressions);
     while (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
@@ -7833,7 +7854,7 @@
 void Parser::EnsureSavedCurrentContext() {
   // Used later by the flow_graph_builder to save current context.
   if (!parsed_function()->has_saved_current_context_var()) {
-    LocalVariable* temp = new(isolate()) LocalVariable(
+    LocalVariable* temp = new(I) LocalVariable(
         current_function().token_pos(),
         Symbols::SavedCurrentContextVar(),
         Type::ZoneHandle(I, Type::DynamicType()));
@@ -7847,7 +7868,7 @@
                                                const char* s) {
   char name[64];
   OS::SNPrint(name, 64, ":%s%" Pd, s, token_pos);
-  LocalVariable* temp = new(isolate()) LocalVariable(
+  LocalVariable* temp = new(I) LocalVariable(
       token_pos,
       String::ZoneHandle(I, Symbols::New(name)),
       Type::ZoneHandle(I, Type::DynamicType()));
@@ -7872,7 +7893,7 @@
       if (binary_op == Token::kDIV) {
         const Double& dbl_obj = Double::ZoneHandle(I,
             Double::NewCanonical((left_double / right_double)));
-        return new(isolate()) LiteralNode(op_pos, dbl_obj);
+        return new(I) LiteralNode(op_pos, dbl_obj);
       }
     }
   }
@@ -7895,14 +7916,14 @@
             (lhs->AsBinaryOpNode()->kind() == Token::kSHL)) {
           // Merge SHL and BIT_AND into one "SHL with mask" node.
           BinaryOpNode* old = lhs->AsBinaryOpNode();
-          BinaryOpWithMask32Node* binop = new(isolate()) BinaryOpWithMask32Node(
+          BinaryOpWithMask32Node* binop = new(I) BinaryOpWithMask32Node(
               old->token_pos(), old->kind(), old->left(), old->right(), val);
           return binop;
         }
       }
     }
   }
-  return new(isolate()) BinaryOpNode(op_pos, binary_op, lhs, rhs);
+  return new(I) BinaryOpNode(op_pos, binary_op, lhs, rhs);
 }
 
 
@@ -7915,30 +7936,31 @@
     case Token::kASSIGN:
       return rhs;
     case Token::kASSIGN_ADD:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kADD, lhs, rhs);
     case Token::kASSIGN_SUB:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSUB, lhs, rhs);
     case Token::kASSIGN_MUL:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kMUL, lhs, rhs);
     case Token::kASSIGN_TRUNCDIV:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kTRUNCDIV, lhs, rhs);
     case Token::kASSIGN_DIV:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kDIV, lhs, rhs);
     case Token::kASSIGN_MOD:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kMOD, lhs, rhs);
     case Token::kASSIGN_SHR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSHR, lhs, rhs);
     case Token::kASSIGN_SHL:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kSHL, lhs, rhs);
     case Token::kASSIGN_OR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_OR, lhs, rhs);
     case Token::kASSIGN_AND:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_AND, lhs, rhs);
     case Token::kASSIGN_XOR:
-      return new(isolate()) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
+      return new(I) BinaryOpNode(op_pos, Token::kBIT_XOR, lhs, rhs);
     default:
-      ErrorMsg(op_pos, "internal error: ExpandAssignableOp '%s' unimplemented",
-          Token::Name(assignment_op));
+      ReportError(op_pos,
+                  "internal error: ExpandAssignableOp '%s' unimplemented",
+                  Token::Name(assignment_op));
       UNIMPLEMENTED();
       return NULL;
   }
@@ -7952,9 +7974,9 @@
     return expr;
   }
   if (expr->EvalConstExpr() == NULL) {
-    ErrorMsg(expr_pos, "expression is not a valid compile-time constant");
+    ReportError(expr_pos, "expression is not a valid compile-time constant");
   }
-  return new(isolate()) LiteralNode(
+  return new(I) LiteralNode(
       expr_pos, EvaluateConstExpr(expr_pos, expr));
 }
 
@@ -7962,24 +7984,24 @@
 LetNode* Parser::PrepareCompoundAssignmentNodes(AstNode** expr) {
   AstNode* node = *expr;
   intptr_t token_pos = node->token_pos();
-  LetNode* result = new(isolate()) LetNode(token_pos);
+  LetNode* result = new(I) LetNode(token_pos);
   if (node->IsLoadIndexedNode()) {
     LoadIndexedNode* load_indexed = node->AsLoadIndexedNode();
     AstNode* array = load_indexed->array();
     AstNode* index = load_indexed->index_expr();
     if (!IsSimpleLocalOrLiteralNode(load_indexed->array())) {
       LocalVariable* t0 = result->AddInitializer(load_indexed->array());
-      array = new(isolate()) LoadLocalNode(token_pos, t0);
+      array = new(I) LoadLocalNode(token_pos, t0);
     }
     if (!IsSimpleLocalOrLiteralNode(load_indexed->index_expr())) {
       LocalVariable* t1 = result->AddInitializer(
           load_indexed->index_expr());
-      index = new(isolate()) LoadLocalNode(token_pos, t1);
+      index = new(I) LoadLocalNode(token_pos, t1);
     }
-    *expr = new(isolate()) LoadIndexedNode(token_pos,
-                                array,
-                                index,
-                                load_indexed->super_class());
+    *expr = new(I) LoadIndexedNode(token_pos,
+                                   array,
+                                   index,
+                                   load_indexed->super_class());
     return result;
   }
   if (node->IsInstanceGetterNode()) {
@@ -7987,11 +8009,10 @@
     AstNode* receiver = getter->receiver();
     if (!IsSimpleLocalOrLiteralNode(getter->receiver())) {
       LocalVariable* t0 = result->AddInitializer(getter->receiver());
-      receiver = new(isolate()) LoadLocalNode(token_pos, t0);
+      receiver = new(I) LoadLocalNode(token_pos, t0);
     }
-    *expr = new(isolate()) InstanceGetterNode(token_pos,
-                                              receiver,
-                                              getter->field_name());
+    *expr = new(I) InstanceGetterNode(
+        token_pos, receiver, getter->field_name());
     return result;
   }
   return result;
@@ -8032,7 +8053,7 @@
       name = Symbols::New(original->AsTypeNode()->TypeName());
     } else if (original->IsLoadStaticFieldNode()) {
       name = original->AsLoadStaticFieldNode()->field().name();
-      target_cls = &Class::Handle(isolate(),
+      target_cls = &Class::Handle(I,
           original->AsLoadStaticFieldNode()->field().owner());
     } else if ((left_ident != NULL) &&
                (original->IsLiteralNode() ||
@@ -8040,12 +8061,12 @@
       name = left_ident->raw();
     }
     if (name.IsNull()) {
-      ErrorMsg(left_pos, "expression is not assignable");
+      ReportError(left_pos, "expression is not assignable");
     }
     result = ThrowNoSuchMethodError(
         original->token_pos(),
         *target_cls,
-        name,
+        String::Handle(I, Field::SetterName(name)),
         NULL,  // No arguments.
         InvocationMirror::kStatic,
         original->IsLoadLocalNode() ?
@@ -8065,19 +8086,19 @@
 
 AstNode* Parser::ParseCascades(AstNode* expr) {
   intptr_t cascade_pos = TokenPos();
-  LetNode* cascade = new(isolate()) LetNode(cascade_pos);
+  LetNode* cascade = new(I) LetNode(cascade_pos);
   LocalVariable* cascade_receiver_var = cascade->AddInitializer(expr);
   while (CurrentToken() == Token::kCASCADE) {
     cascade_pos = TokenPos();
     LoadLocalNode* load_cascade_receiver =
-        new(isolate()) LoadLocalNode(cascade_pos, cascade_receiver_var);
+        new(I) LoadLocalNode(cascade_pos, cascade_receiver_var);
     if (Token::IsIdentifier(LookaheadToken(1))) {
       // Replace .. with . for ParseSelectors().
       token_kind_ = Token::kPERIOD;
     } else if (LookaheadToken(1) == Token::kLBRACK) {
       ConsumeToken();
     } else {
-      ErrorMsg("identifier or [ expected after ..");
+      ReportError("identifier or [ expected after ..");
     }
     String* expr_ident =
         Token::IsIdentifier(CurrentToken()) ? CurrentLiteral() : NULL;
@@ -8115,8 +8136,7 @@
   }
   // The result is an expression with the (side effects of the) cascade
   // sequence followed by the (value of the) receiver temp variable load.
-  cascade->AddNode(new(isolate()) LoadLocalNode(
-      cascade_pos, cascade_receiver_var));
+  cascade->AddNode(new(I) LoadLocalNode(cascade_pos, cascade_receiver_var));
   return cascade;
 }
 
@@ -8146,10 +8166,10 @@
   if (CurrentToken() == Token::kTHROW) {
     ConsumeToken();
     if (CurrentToken() == Token::kSEMICOLON) {
-      ErrorMsg("expression expected after throw");
+      ReportError("expression expected after throw");
     }
     AstNode* expr = ParseExpr(require_compiletime_const, consume_cascades);
-    return new(isolate()) ThrowNode(expr_pos, expr, NULL);
+    return new(I) ThrowNode(expr_pos, expr, NULL);
   }
   AstNode* expr = ParseConditionalExpr();
   if (!Token::IsAssignmentOperator(CurrentToken())) {
@@ -8165,14 +8185,15 @@
   }
   // Assignment expressions.
   if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-    ErrorMsg(expr_pos, "expression is not assignable");
+    ReportError(expr_pos, "expression is not assignable");
   }
   const Token::Kind assignment_op = CurrentToken();
   const intptr_t assignment_pos = TokenPos();
   ConsumeToken();
   const intptr_t right_expr_pos = TokenPos();
   if (require_compiletime_const && (assignment_op != Token::kASSIGN)) {
-    ErrorMsg(right_expr_pos, "expression is not a valid compile-time constant");
+    ReportError(right_expr_pos,
+                "expression is not a valid compile-time constant");
   }
   AstNode* right_expr = ParseExpr(require_compiletime_const, consume_cascades);
   if (assignment_op != Token::kASSIGN) {
@@ -8200,7 +8221,7 @@
   intptr_t expr_pos = TokenPos();
   AstNode* expr = ParseExpr(kRequireConst, kNoCascades);
   if (!expr->IsLiteralNode()) {
-    ErrorMsg(expr_pos, "expression must be a compile-time constant");
+    ReportError(expr_pos, "expression must be a compile-time constant");
   }
   return expr->AsLiteralNode();
 }
@@ -8216,7 +8237,7 @@
     AstNode* expr1 = ParseExpr(kAllowConst, kNoCascades);
     ExpectToken(Token::kCOLON);
     AstNode* expr2 = ParseExpr(kAllowConst, kNoCascades);
-    expr = new(isolate()) ConditionalExprNode(expr_pos, expr, expr1, expr2);
+    expr = new(I) ConditionalExprNode(expr_pos, expr, expr1, expr2);
   }
   return expr;
 }
@@ -8246,17 +8267,17 @@
     const intptr_t expr_pos = TokenPos();
     expr = ParseUnaryExpr();
     if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ErrorMsg(expr_pos, "expression is not assignable");
+      ReportError(expr_pos, "expression is not assignable");
     }
     // Is prefix.
     LetNode* let_expr = PrepareCompoundAssignmentNodes(&expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(isolate()) BinaryOpNode(
+    BinaryOpNode* add = new(I) BinaryOpNode(
         op_pos,
         binary_op,
         expr,
-        new(isolate()) LiteralNode(op_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(I) LiteralNode(op_pos, Smi::ZoneHandle(I, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     let_expr->AddNode(store);
@@ -8276,15 +8297,15 @@
   const bool saved_mode = SetAllowFunctionLiterals(true);
   ArgumentListNode* arguments;
   if (implicit_arguments == NULL) {
-    arguments = new(isolate()) ArgumentListNode(TokenPos());
+    arguments = new(I) ArgumentListNode(TokenPos());
   } else {
     arguments = implicit_arguments;
   }
-  const GrowableObjectArray& names = GrowableObjectArray::Handle(isolate(),
+  const GrowableObjectArray& names = GrowableObjectArray::Handle(I,
       GrowableObjectArray::New(Heap::kOld));
   bool named_argument_seen = false;
   if (LookaheadToken(1) != Token::kRPAREN) {
-    String& arg_name = String::Handle(isolate());
+    String& arg_name = String::Handle(I);
     do {
       ASSERT((CurrentToken() == Token::kLPAREN) ||
              (CurrentToken() == Token::kCOMMA));
@@ -8298,14 +8319,14 @@
         for (int i = 0; i < names.Length(); i++) {
           arg_name ^= names.At(i);
           if (CurrentLiteral()->Equals(arg_name)) {
-            ErrorMsg("duplicate named argument");
+            ReportError("duplicate named argument");
           }
         }
         names.Add(*CurrentLiteral());
         ConsumeToken();  // ident.
         ConsumeToken();  // colon.
       } else if (named_argument_seen) {
-        ErrorMsg("named argument expected");
+        ReportError("named argument expected");
       }
       arguments->Add(ParseExpr(require_const, kConsumeCascades));
     } while (CurrentToken() == Token::kCOMMA);
@@ -8315,7 +8336,7 @@
   ExpectToken(Token::kRPAREN);
   SetAllowFunctionLiterals(saved_mode);
   if (named_argument_seen) {
-    arguments->set_names(Array::Handle(isolate(), Array::MakeArray(names)));
+    arguments->set_names(Array::Handle(I, Array::MakeArray(names)));
   }
   return arguments;
 }
@@ -8351,7 +8372,7 @@
                                      Object::empty_array());
       if (!func.IsNull()) {
         ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-        closure = new(isolate()) StaticGetterNode(
+        closure = new(I) StaticGetterNode(
             call_pos,
             NULL,
             false,
@@ -8374,15 +8395,19 @@
   } else if (cls.IsTopLevel() &&
       (cls.library() == Library::CoreLibrary()) &&
       (func.name() == Symbols::Identical().raw())) {
-    // This is the predefined toplevel function identical(a,b). Create
-    // a comparison node instead.
-    ASSERT(num_arguments == 2);
-    return new(isolate()) ComparisonNode(ident_pos,
-                                         Token::kEQ_STRICT,
-                                         arguments->NodeAt(0),
-                                         arguments->NodeAt(1));
+    // This is the predefined toplevel function identical(a,b).
+    // Create a comparison node instead of a static call to the function, unless
+    // javascript warnings are desired and identical is not invoked from a patch
+    // source.
+    if (!FLAG_warn_on_javascript_compatibility || is_patch_source()) {
+      ASSERT(num_arguments == 2);
+      return new(I) ComparisonNode(ident_pos,
+                                   Token::kEQ_STRICT,
+                                   arguments->NodeAt(0),
+                                   arguments->NodeAt(1));
+    }
   }
-  return new(isolate()) StaticCallNode(call_pos, func, arguments);
+  return new(I) StaticCallNode(call_pos, func, arguments);
 }
 
 
@@ -8391,8 +8416,7 @@
   const intptr_t call_pos = TokenPos();
   CheckToken(Token::kLPAREN);
   ArgumentListNode* arguments = ParseActualParameters(NULL, kAllowConst);
-  return new(isolate()) InstanceCallNode(
-      call_pos, receiver, func_name, arguments);
+  return new(I) InstanceCallNode(call_pos, receiver, func_name, arguments);
 }
 
 
@@ -8419,21 +8443,20 @@
   ASSERT(field.is_static());
   const Class& field_owner = Class::ZoneHandle(I, field.owner());
   const String& field_name = String::ZoneHandle(I, field.name());
-  const String& getter_name = String::Handle(isolate(),
-      Field::GetterName(field_name));
-  const Function& getter = Function::Handle(isolate(),
+  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(I,
       field_owner.LookupStaticFunction(getter_name));
   // Never load field directly if there is a getter (deterministic AST).
   if (getter.IsNull() || field.is_const()) {
-    return new(isolate()) LoadStaticFieldNode(
+    return new(I) LoadStaticFieldNode(
         ident_pos, Field::ZoneHandle(I, field.raw()));
   } else {
     ASSERT(getter.kind() == RawFunction::kImplicitStaticFinalGetter);
-    return new(isolate()) StaticGetterNode(ident_pos,
-                                           NULL,  // Receiver.
-                                           false,  // is_super_getter.
-                                           field_owner,
-                                           field_name);
+    return new(I) StaticGetterNode(ident_pos,
+                                   NULL,  // Receiver.
+                                   false,  // is_super_getter.
+                                   field_owner,
+                                   field_name);
   }
 }
 
@@ -8475,7 +8498,7 @@
       }
     } else {
       ASSERT(func.kind() != RawFunction::kImplicitStaticFinalGetter);
-      access = new(isolate()) StaticGetterNode(
+      access = new(I) StaticGetterNode(
           ident_pos, NULL, false, Class::ZoneHandle(I, cls.raw()), field_name);
     }
   } else {
@@ -8501,13 +8524,12 @@
     String& name = String::CheckedZoneHandle(primary->primary().raw());
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      StaticGetterNode* getter =
-          new(isolate()) StaticGetterNode(
-              primary->token_pos(),
-              NULL,  // No receiver.
-              false,  // Not a super getter.
-              Class::ZoneHandle(I, current_class().raw()),
-              name);
+      StaticGetterNode* getter = new(I) StaticGetterNode(
+          primary->token_pos(),
+          NULL,  // No receiver.
+          false,  // Not a super getter.
+          Class::ZoneHandle(I, current_class().raw()),
+          name);
       getter->set_is_deferred(primary->is_deferred_reference());
       return getter;
     } else {
@@ -8534,9 +8556,9 @@
     // Instance function access.
     if (current_function().is_static() ||
         current_function().IsInFactoryScope()) {
-      ErrorMsg(primary->token_pos(),
-               "cannot access instance method '%s' from static method",
-               funcname.ToCString());
+      ReportError(primary->token_pos(),
+                  "cannot access instance method '%s' from static method",
+                  funcname.ToCString());
     }
     AstNode* receiver = LoadReceiver(primary->token_pos());
     return CallGetter(primary->token_pos(), receiver, funcname);
@@ -8561,9 +8583,10 @@
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8575,7 +8598,7 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(isolate()) TypeNode(primary->token_pos(), type_parameter);
+          left = new(I) TypeNode(primary->token_pos(), type_parameter);
         } else {
           // Super field access handled in ParseSuperFieldAccess(),
           // super calls handled in ParseSuperCall().
@@ -8597,7 +8620,7 @@
         }
       } else {
         // Field access.
-        Class& cls = Class::Handle(isolate());
+        Class& cls = Class::Handle(I);
         if (left->IsPrimaryNode()) {
           PrimaryNode* primary_node = left->AsPrimaryNode();
           if (primary_node->primary().IsClass()) {
@@ -8635,20 +8658,21 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I,
-              Type::New(type_class, TypeArguments::Handle(isolate()),
+              Type::New(type_class, TypeArguments::Handle(I),
                         primary_pos, Heap::kOld));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          array = new(isolate()) TypeNode(primary_pos, type);
+          array = new(I) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8660,12 +8684,12 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          array = new(isolate()) TypeNode(primary_pos, type_parameter);
+          array = new(I) TypeNode(primary_pos, type_parameter);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
       }
-      selector =  new(isolate()) LoadIndexedNode(
+      selector =  new(I) LoadIndexedNode(
           bracket_pos, array, index, Class::ZoneHandle(I));
     } else if (CurrentToken() == Token::kLPAREN) {
       if (left->IsPrimaryNode()) {
@@ -8676,22 +8700,22 @@
           const String& func_name = String::ZoneHandle(I, func.name());
           if (func.is_static()) {
             // Parse static function call.
-            Class& cls = Class::Handle(isolate(), func.Owner());
+            Class& cls = Class::Handle(I, func.Owner());
             selector = ParseStaticCall(cls, func_name, primary_pos);
           } else {
             // Dynamic function call on implicit "this" parameter.
             if (current_function().is_static()) {
-              ErrorMsg(primary_pos,
-                       "cannot access instance method '%s' "
-                       "from static function",
-                       func_name.ToCString());
+              ReportError(primary_pos,
+                          "cannot access instance method '%s' "
+                          "from static function",
+                          func_name.ToCString());
             }
             selector = ParseInstanceCall(LoadReceiver(primary_pos), func_name);
           }
         } else if (primary_node->primary().IsString()) {
           // Primary is an unresolved name.
           if (primary_node->IsSuper()) {
-            ErrorMsg(primary_pos, "illegal use of super");
+            ReportError(primary_pos, "illegal use of super");
           }
           String& name = String::CheckedZoneHandle(
               primary_node->primary().raw());
@@ -8712,9 +8736,10 @@
               TypeParameter::Cast(primary_node->primary()).name());
           if (current_function().is_static()) {
             // Treat as this.T(), because T is in scope.
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           } else {
             // Treat as call to unresolved (instance) method.
             selector = ParseInstanceCall(LoadReceiver(primary_pos), name);
@@ -8722,12 +8747,12 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(isolate()), primary_pos));
+              type_class, TypeArguments::Handle(I), primary_pos));
           type ^= ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          selector = new(isolate()) TypeNode(primary_pos, type);
+          selector = new(I) TypeNode(primary_pos, type);
         } else {
           UNREACHABLE();  // Internal parser error.
         }
@@ -8748,19 +8773,20 @@
         } else if (primary_node->primary().IsClass()) {
           const Class& type_class = Class::Cast(primary_node->primary());
           AbstractType& type = Type::ZoneHandle(I, Type::New(
-              type_class, TypeArguments::Handle(isolate()), primary_pos));
+              type_class, TypeArguments::Handle(I), primary_pos));
           type = ClassFinalizer::FinalizeType(
               current_class(), type, ClassFinalizer::kCanonicalize);
           // Type may be malbounded, but not malformed.
           ASSERT(!type.IsMalformed());
-          left = new(isolate()) TypeNode(primary_pos, type);
+          left = new(I) TypeNode(primary_pos, type);
         } else if (primary_node->primary().IsTypeParameter()) {
           if (current_function().is_static()) {
             const String& name = String::ZoneHandle(I,
                 TypeParameter::Cast(primary_node->primary()).name());
-            ErrorMsg(primary_pos,
-                     "cannot access type parameter '%s' from static function",
-                     name.ToCString());
+            ReportError(primary_pos,
+                        "cannot access type parameter '%s' "
+                        "from static function",
+                        name.ToCString());
           }
           if (current_block_->scope->function_level() > 0) {
             // Make sure that the instantiator is captured.
@@ -8772,7 +8798,7 @@
               TypeParameter::Cast(primary_node->primary()),
               ClassFinalizer::kCanonicalize);
           ASSERT(!type_parameter.IsMalformed());
-          left = new(isolate()) TypeNode(primary_pos, type_parameter);
+          left = new(I) TypeNode(primary_pos, type_parameter);
         } else if (primary_node->IsSuper()) {
           // Return "super" to handle unary super operator calls,
           // or to report illegal use of "super" otherwise.
@@ -8800,7 +8826,7 @@
   if (IsIncrementOperator(CurrentToken())) {
     TRACE_PARSER("IncrementOperator");
     if (!IsLegalAssignableSyntax(expr, TokenPos())) {
-      ErrorMsg(expr_pos, "expression is not assignable");
+      ReportError(expr_pos, "expression is not assignable");
     }
     Token::Kind incr_op = CurrentToken();
     ConsumeToken();
@@ -8809,17 +8835,17 @@
     LocalVariable* temp = let_expr->AddInitializer(expr);
     Token::Kind binary_op =
         (incr_op == Token::kINCR) ? Token::kADD : Token::kSUB;
-    BinaryOpNode* add = new(isolate()) BinaryOpNode(
+    BinaryOpNode* add = new(I) BinaryOpNode(
         expr_pos,
         binary_op,
-        new(isolate()) LoadLocalNode(expr_pos, temp),
-        new(isolate()) LiteralNode(expr_pos, Smi::ZoneHandle(I, Smi::New(1))));
+        new(I) LoadLocalNode(expr_pos, temp),
+        new(I) LiteralNode(expr_pos, Smi::ZoneHandle(I, Smi::New(1))));
     AstNode* store = CreateAssignmentNode(expr, add, expr_ident, expr_pos);
     ASSERT(store != NULL);
     // The result is a pair of the (side effects of the) store followed by
     // the (value of the) initial value temp variable load.
     let_expr->AddNode(store);
-    let_expr->AddNode(new(isolate()) LoadLocalNode(expr_pos, temp));
+    let_expr->AddNode(new(I) LoadLocalNode(expr_pos, temp));
     return let_expr;
   }
   return expr;
@@ -8844,15 +8870,14 @@
   // Resolve class.
   if (!type->HasResolvedTypeClass()) {
     const UnresolvedClass& unresolved_class =
-        UnresolvedClass::Handle(isolate(), type->unresolved_class());
+        UnresolvedClass::Handle(I, type->unresolved_class());
     const String& unresolved_class_name =
-        String::Handle(isolate(), unresolved_class.ident());
-    Class& resolved_type_class = Class::Handle(isolate());
+        String::Handle(I, unresolved_class.ident());
+    Class& resolved_type_class = Class::Handle(I);
     if (unresolved_class.library_prefix() == LibraryPrefix::null()) {
       if (!scope_class.IsNull()) {
         // First check if the type is a type parameter of the given scope class.
-        const TypeParameter& type_parameter = TypeParameter::Handle(
-            isolate(),
+        const TypeParameter& type_parameter = TypeParameter::Handle(I,
             scope_class.LookupTypeParameter(unresolved_class_name));
         if (!type_parameter.IsNull()) {
           // A type parameter is considered to be a malformed type when
@@ -8860,23 +8885,23 @@
           if (ParsingStaticMember()) {
             ASSERT(scope_class.raw() == current_class().raw());
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(isolate()),  // No previous error.
+                Error::Handle(I),  // No previous error.
                 script_,
                 type->token_pos(),
                 "type parameter '%s' cannot be referenced "
                 "from static member",
-                String::Handle(isolate(), type_parameter.name()).ToCString());
+                String::Handle(I, type_parameter.name()).ToCString());
             return;
           }
           // A type parameter cannot be parameterized, so make the type
           // malformed if type arguments have previously been parsed.
-          if (!TypeArguments::Handle(isolate(), type->arguments()).IsNull()) {
+          if (!TypeArguments::Handle(I, type->arguments()).IsNull()) {
             *type = ClassFinalizer::NewFinalizedMalformedType(
-                Error::Handle(isolate()),  // No previous error.
+                Error::Handle(I),  // No previous error.
                 script_,
                 type_parameter.token_pos(),
                 "type parameter '%s' cannot be parameterized",
-                String::Handle(isolate(), type_parameter.name()).ToCString());
+                String::Handle(I, type_parameter.name()).ToCString());
             return;
           }
           *type = type_parameter.raw();
@@ -8892,7 +8917,7 @@
       }
     } else {
       LibraryPrefix& lib_prefix =
-          LibraryPrefix::Handle(isolate(), unresolved_class.library_prefix());
+          LibraryPrefix::Handle(I, unresolved_class.library_prefix());
       // Resolve class name in the scope of the library prefix.
       resolved_type_class =
           ResolveClassInPrefixScope(lib_prefix, unresolved_class_name);
@@ -8904,23 +8929,21 @@
       parameterized_type.set_type_class(resolved_type_class);
     } else if (finalization >= ClassFinalizer::kCanonicalize) {
       ClassFinalizer::FinalizeMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
           parameterized_type,
           "type '%s' is not loaded",
-          String::Handle(isolate(),
-                         parameterized_type.UserVisibleName()).ToCString());
+          String::Handle(I, parameterized_type.UserVisibleName()).ToCString());
       return;
     }
   }
   // Resolve type arguments, if any.
-  const TypeArguments& arguments = TypeArguments::Handle(isolate(),
-                                                         type->arguments());
-      TypeArguments::Handle(isolate(), type->arguments());
+  const TypeArguments& arguments = TypeArguments::Handle(I, type->arguments());
+      TypeArguments::Handle(I, type->arguments());
   if (!arguments.IsNull()) {
     const intptr_t num_arguments = arguments.Length();
     for (intptr_t i = 0; i < num_arguments; i++) {
-      AbstractType& type_argument = AbstractType::Handle(isolate(),
+      AbstractType& type_argument = AbstractType::Handle(I,
                                                          arguments.TypeAt(i));
       ResolveTypeFromClass(scope_class, finalization, &type_argument);
       arguments.SetTypeAt(i, type_argument);
@@ -8944,9 +8967,9 @@
   // Fields are not accessible from a static function, except from a
   // constructor, which is considered as non-static by the compiler.
   if (current_function().is_static()) {
-    ErrorMsg(field_pos,
-             "cannot access instance field '%s' from a static function",
-             field_name.ToCString());
+    ReportError(field_pos,
+                "cannot access instance field '%s' from a static function",
+                field_name.ToCString());
   }
 }
 
@@ -8996,9 +9019,9 @@
   }
   const char* error_str = NULL;
   Instance& result =
-      Instance::Handle(isolate(), instance.CheckAndCanonicalize(&error_str));
+      Instance::Handle(I, instance.CheckAndCanonicalize(&error_str));
   if (result.IsNull()) {
-    ErrorMsg(token_pos, "Invalid const object %s", error_str);
+    ReportError(token_pos, "Invalid const object %s", error_str);
   }
   return result.raw();
 }
@@ -9012,18 +9035,17 @@
   ASSERT(field.is_static());
   const Class& field_owner = Class::ZoneHandle(I, field.owner());
   const String& field_name = String::ZoneHandle(I, field.name());
-  const String& getter_name = String::Handle(isolate(),
-                                             Field::GetterName(field_name));
-  const Function& getter = Function::Handle(
-      isolate(), field_owner.LookupStaticFunction(getter_name));
-  const Instance& value = Instance::Handle(isolate(), field.value());
+  const String& getter_name = String::Handle(I, Field::GetterName(field_name));
+  const Function& getter = Function::Handle(I,
+      field_owner.LookupStaticFunction(getter_name));
+  const Instance& value = Instance::Handle(I, field.value());
   if (value.raw() == Object::transition_sentinel().raw()) {
     if (field.is_const()) {
-      ErrorMsg("circular dependency while initializing static field '%s'",
-               field_name.ToCString());
+      ReportError("circular dependency while initializing static field '%s'",
+                  field_name.ToCString());
     } else {
       // The implicit static getter will throw the exception if necessary.
-      return new(isolate()) StaticGetterNode(
+      return new(I) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   } else if (value.raw() == Object::sentinel().raw()) {
@@ -9033,16 +9055,16 @@
     if (field.is_const()) {
       field.set_value(Object::transition_sentinel());
       const int kNumArguments = 0;  // no arguments.
-      const Function& func = Function::Handle(isolate(),
+      const Function& func = Function::Handle(I,
           Resolver::ResolveStatic(field_owner,
                                   getter_name,
                                   kNumArguments,
                                   Object::empty_array()));
       ASSERT(!func.IsNull());
       ASSERT(func.kind() == RawFunction::kImplicitStaticFinalGetter);
-      Object& const_value = Object::Handle(isolate());
+      Object& const_value = Object::Handle(I);
       {
-        PAUSETIMERSCOPE(isolate(), time_compilation);
+        PAUSETIMERSCOPE(I, time_compilation);
         const_value = DartEntry::InvokeFunction(func, Object::empty_array());
       }
       if (const_value.IsError()) {
@@ -9055,22 +9077,24 @@
           field.set_value(Object::null_instance());
           // It is a compile-time error if evaluation of a compile-time constant
           // would raise an exception.
-          AppendErrorMsg(error, field_ref_pos,
-                         "error initializing const field '%s'",
-                         String::Handle(isolate(), field.name()).ToCString());
+          const String& field_name = String::Handle(I, field.name());
+          ReportErrors(error,
+                       script_, field_ref_pos,
+                       "error initializing const field '%s'",
+                       field_name.ToCString());
         } else {
-          isolate()->long_jump_base()->Jump(1, error);
-          UNREACHABLE();
+          ReportError(error);
         }
+        UNREACHABLE();
       }
       ASSERT(const_value.IsNull() || const_value.IsInstance());
-      Instance& instance = Instance::Handle(isolate());
+      Instance& instance = Instance::Handle(I);
       instance ^= const_value.raw();
       instance = TryCanonicalize(instance, field_ref_pos);
       field.set_value(instance);
       return NULL;   // Constant
     } else {
-      return new(isolate()) StaticGetterNode(
+      return new(I) StaticGetterNode(
           field_ref_pos, NULL, false, field_owner, field_name);
     }
   }
@@ -9079,7 +9103,7 @@
     return NULL;
   }
   ASSERT(getter.kind() == RawFunction::kImplicitGetter);
-  return new(isolate()) StaticGetterNode(
+  return new(I) StaticGetterNode(
       field_ref_pos, NULL, false, field_owner, field_name);
 }
 
@@ -9093,21 +9117,19 @@
   // Constructors have 2 extra arguments: rcvr and construction phase.
   const int kNumExtraArgs = constructor.IsFactory() ? 1 : 2;
   const int num_arguments = arguments->length() + kNumExtraArgs;
-  const Array& arg_values = Array::Handle(isolate(),
-                                          Array::New(num_arguments));
-  Instance& instance = Instance::Handle(isolate());
+  const Array& arg_values = Array::Handle(I, Array::New(num_arguments));
+  Instance& instance = Instance::Handle(I);
   if (!constructor.IsFactory()) {
     instance = Instance::New(type_class, Heap::kOld);
     if (!type_arguments.IsNull()) {
       if (!type_arguments.IsInstantiated()) {
-        ErrorMsg("type must be constant in const constructor");
+        ReportError("type must be constant in const constructor");
       }
       instance.SetTypeArguments(
-          TypeArguments::Handle(isolate(), type_arguments.Canonicalize()));
+          TypeArguments::Handle(I, type_arguments.Canonicalize()));
     }
     arg_values.SetAt(0, instance);
-    arg_values.SetAt(1, Smi::Handle(isolate(),
-                                    Smi::New(Function::kCtorPhaseAll)));
+    arg_values.SetAt(1, Smi::Handle(I, Smi::New(Function::kCtorPhaseAll)));
   } else {
     // Prepend type_arguments to list of arguments to factory.
     ASSERT(type_arguments.IsZoneHandle());
@@ -9119,11 +9141,11 @@
     ASSERT(arg->IsLiteralNode());
     arg_values.SetAt((i + kNumExtraArgs), arg->AsLiteralNode()->literal());
   }
-  const Array& args_descriptor = Array::Handle(
-      isolate(), ArgumentsDescriptor::New(num_arguments, arguments->names()));
-  Object& result = Object::Handle(isolate());
+  const Array& args_descriptor = Array::Handle(I,
+      ArgumentsDescriptor::New(num_arguments, arguments->names()));
+  Object& result = Object::Handle(I);
   {
-    PAUSETIMERSCOPE(isolate(), time_compilation);
+    PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(
         constructor, arg_values, args_descriptor);
   }
@@ -9135,7 +9157,7 @@
       if (result.IsUnhandledException()) {
         return result.raw();
       } else {
-        isolate()->long_jump_base()->Jump(1, Error::Cast(result));
+        I->long_jump_base()->Jump(1, Error::Cast(result));
         UNREACHABLE();
         return Object::null();
       }
@@ -9163,7 +9185,7 @@
   }
   if (local != NULL) {
     if (node != NULL) {
-      *node = new(isolate()) LoadLocalNode(ident_pos, local);
+      *node = new(I) LoadLocalNode(ident_pos, local);
     }
     return true;
   }
@@ -9171,14 +9193,14 @@
   // Try to find the identifier in the class scope of the current class.
   // If the current class is the result of a mixin application, we must
   // use the class scope of the class from which the function originates.
-  Class& cls = Class::Handle(isolate());
+  Class& cls = Class::Handle(I);
   if (!current_class().IsMixinApplication()) {
     cls = current_class().raw();
   } else {
     cls = parsed_function()->function().origin();
   }
-  Function& func = Function::Handle(isolate(), Function::null());
-  Field& field = Field::Handle(isolate(), Field::null());
+  Function& func = Function::Handle(I, Function::null());
+  Field& field = Field::Handle(I, Field::null());
 
   // First check if a field exists.
   field = cls.LookupField(ident);
@@ -9201,7 +9223,7 @@
       func.IsStaticFunction() ||
       func.is_abstract())) {
     if (node != NULL) {
-      *node = new(isolate()) PrimaryNode(
+      *node = new(I) PrimaryNode(
           ident_pos, Function::ZoneHandle(I, func.raw()));
     }
     return true;
@@ -9214,15 +9236,13 @@
     if (func.IsDynamicFunction() || func.is_abstract()) {
       if (node != NULL) {
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
     } else if (func.IsStaticFunction()) {
       if (node != NULL) {
-        ASSERT(AbstractType::Handle(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         // The static getter may later be changed into a dynamically
         // resolved instance setter if no static setter can
         // be found.
@@ -9232,11 +9252,11 @@
             (LookupReceiver(current_block_->scope, kTestOnly) != NULL)) {
           receiver = LoadReceiver(ident_pos);
         }
-        *node = new(isolate()) StaticGetterNode(ident_pos,
-                                     receiver,
-                                     false,
-                                     Class::ZoneHandle(I, cls.raw()),
-                                     ident);
+        *node = new(I) StaticGetterNode(ident_pos,
+                                        receiver,
+                                        false,
+                                        Class::ZoneHandle(I, cls.raw()),
+                                        ident);
       }
       return true;
     }
@@ -9250,8 +9270,7 @@
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
         CheckInstanceFieldAccess(ident_pos, ident);
-        ASSERT(AbstractType::Handle(isolate(),
-                                    func.result_type()).IsResolved());
+        ASSERT(AbstractType::Handle(I, func.result_type()).IsResolved());
         *node = CallGetter(ident_pos, LoadReceiver(ident_pos), ident);
       }
       return true;
@@ -9261,7 +9280,7 @@
         // it could be followed by an assignment which will convert it to
         // a setter node. If there is no assignment we will get an error
         // when we try to invoke the getter.
-        *node = new(isolate()) StaticGetterNode(
+        *node = new(I) StaticGetterNode(
             ident_pos,
             NULL,
             false,
@@ -9281,8 +9300,8 @@
 
 
 RawClass* Parser::ResolveClassInCurrentLibraryScope(const String& name) {
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), library_.ResolveName(name));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, library_.ResolveName(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9296,12 +9315,11 @@
 AstNode* Parser::ResolveIdentInCurrentLibraryScope(intptr_t ident_pos,
                                                    const String& ident) {
   TRACE_PARSER("ResolveIdentInCurrentLibraryScope");
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), library_.ResolveName(ident));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, library_.ResolveName(ident));
   if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
-    return new(isolate()) PrimaryNode(
-        ident_pos, Class::ZoneHandle(I, cls.raw()));
+    return new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
   } else if (obj.IsField()) {
     const Field& field = Field::Cast(obj);
     ASSERT(field.is_static());
@@ -9310,28 +9328,27 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      return new(isolate()) StaticGetterNode(ident_pos,
-                                             /* receiver */ NULL,
-                                             /* is_super_getter */ false,
-                                             Class::ZoneHandle(I, func.Owner()),
-                                             ident);
+      return new(I) StaticGetterNode(ident_pos,
+                                     /* receiver */ NULL,
+                                     /* is_super_getter */ false,
+                                     Class::ZoneHandle(I, func.Owner()),
+                                     ident);
 
     } else {
-      return new(isolate()) PrimaryNode(ident_pos,
-                                        Function::ZoneHandle(I, func.raw()));
+      return new(I) PrimaryNode(ident_pos, Function::ZoneHandle(I, func.raw()));
     }
   } else {
     ASSERT(obj.IsNull() || obj.IsLibraryPrefix());
   }
   // Lexically unresolved primary identifiers are referenced by their name.
-  return new(isolate()) PrimaryNode(ident_pos, ident);
+  return new(I) PrimaryNode(ident_pos, ident);
 }
 
 
 RawClass* Parser::ResolveClassInPrefixScope(const LibraryPrefix& prefix,
                                             const String& name) {
-  HANDLESCOPE(isolate());
-  const Object& obj = Object::Handle(isolate(), prefix.LookupObject(name));
+  HANDLESCOPE(I);
+  const Object& obj = Object::Handle(I, prefix.LookupObject(name));
   if (obj.IsClass()) {
     return Class::Cast(obj).raw();
   }
@@ -9346,8 +9363,8 @@
                                            const LibraryPrefix& prefix,
                                            const String& ident) {
   TRACE_PARSER("ResolveIdentInPrefixScope");
-  HANDLESCOPE(isolate());
-  Object& obj = Object::Handle(isolate());
+  HANDLESCOPE(I);
+  Object& obj = Object::Handle(I);
   if (prefix.is_loaded()) {
     obj = prefix.LookupObject(ident);
   } else {
@@ -9365,7 +9382,7 @@
   } else if (obj.IsClass()) {
     const Class& cls = Class::Cast(obj);
     PrimaryNode* primary =
-        new(isolate()) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
+        new(I) PrimaryNode(ident_pos, Class::ZoneHandle(I, cls.raw()));
     primary->set_is_deferred(is_deferred);
     return primary;
   } else if (obj.IsField()) {
@@ -9385,16 +9402,16 @@
     const Function& func = Function::Cast(obj);
     ASSERT(func.is_static());
     if (func.IsGetterFunction() || func.IsSetterFunction()) {
-      StaticGetterNode* getter =
-          new(isolate()) StaticGetterNode(ident_pos,
-                               /* receiver */ NULL,
-                               /* is_super_getter */ false,
-                               Class::ZoneHandle(I, func.Owner()),
-                               ident);
+      StaticGetterNode* getter = new(I) StaticGetterNode(
+          ident_pos,
+          /* receiver */ NULL,
+          /* is_super_getter */ false,
+          Class::ZoneHandle(I, func.Owner()),
+          ident);
       getter->set_is_deferred(is_deferred);
       return getter;
     } else {
-      PrimaryNode* primary = new(isolate()) PrimaryNode(
+      PrimaryNode* primary = new(I) PrimaryNode(
            ident_pos, Function::ZoneHandle(I, func.raw()));
       primary->set_is_deferred(is_deferred);
       return primary;
@@ -9432,7 +9449,7 @@
         type_parameter ^= ClassFinalizer::FinalizeType(
             current_class(), type_parameter, ClassFinalizer::kCanonicalize);
         ASSERT(!type_parameter.IsMalformed());
-        return new(isolate()) TypeNode(ident_pos, type_parameter);
+        return new(I) TypeNode(ident_pos, type_parameter);
       }
     }
     // Not found in the local scope, and the name is not a type parameter.
@@ -9465,18 +9482,18 @@
       if (allow_closure_names) {
         resolved = LoadClosure(primary);
       } else {
-        ErrorMsg(ident_pos, "illegal reference to method '%s'",
-                 ident.ToCString());
+        ReportError(ident_pos, "illegal reference to method '%s'",
+                    ident.ToCString());
       }
     } else if (primary->primary().IsClass()) {
       const Class& type_class = Class::Cast(primary->primary());
       AbstractType& type = Type::ZoneHandle(I,
-          Type::New(type_class, TypeArguments::Handle(isolate()), primary_pos));
+          Type::New(type_class, TypeArguments::Handle(I), primary_pos));
       type ^= ClassFinalizer::FinalizeType(
           current_class(), type, ClassFinalizer::kCanonicalize);
       // Type may be malbounded, but not malformed.
       ASSERT(!type.IsMalformed());
-      resolved = new(isolate()) TypeNode(primary_pos, type);
+      resolved = new(I) TypeNode(primary_pos, type);
     }
   }
   return resolved;
@@ -9487,10 +9504,14 @@
 // finalize it according to the given type finalization mode.
 RawAbstractType* Parser::ParseType(
     ClassFinalizer::FinalizationKind finalization,
-    bool allow_deferred_type) {
+    bool allow_deferred_type,
+    bool consume_unresolved_prefix) {
   TRACE_PARSER("ParseType");
   CheckToken(Token::kIDENT, "type name expected");
-  QualIdent type_name;
+  intptr_t ident_pos = TokenPos();
+  LibraryPrefix& prefix = LibraryPrefix::Handle(I);
+  String& type_name = String::Handle(I);;
+
   if (finalization == ClassFinalizer::kIgnore) {
     if (!is_top_level_ && (current_block_ != NULL)) {
       // Add the library prefix or type class name to the list of referenced
@@ -9499,51 +9520,77 @@
     }
     SkipQualIdent();
   } else {
-    ParseQualIdent(&type_name);
-    // An identifier cannot be resolved in a local scope when top level parsing.
-    if (!is_top_level_ &&
-        (type_name.lib_prefix == NULL) &&
-        ResolveIdentInLocalScope(type_name.ident_pos, *type_name.ident, NULL)) {
+    prefix = ParsePrefix();
+    type_name = CurrentLiteral()->raw();
+    ConsumeToken();
+
+    // Check whether we have a malformed qualified type name if the caller
+    // requests to consume unresolved prefix names:
+    // If we didn't see a valid prefix but the identifier is followed by
+    // a period and another identifier, consume the qualified identifier
+    // and create a malformed type.
+    if (consume_unresolved_prefix &&
+        prefix.IsNull() &&
+        (CurrentToken() == Token::kPERIOD) &&
+        (Token::IsIdentifier(LookaheadToken(1)))) {
+      if (!is_top_level_ && (current_block_ != NULL)) {
+        // Add the unresolved prefix name to the list of referenced
+        // names of this scope.
+        current_block_->scope->AddReferencedName(TokenPos(), type_name);
+      }
+      ConsumeToken();  // Period token.
+      ASSERT(IsIdentifier());
+      String& qualified_name = String::Handle(I, type_name.raw());
+      qualified_name = String::Concat(qualified_name, Symbols::Dot());
+      qualified_name = String::Concat(qualified_name, *CurrentLiteral());
+      ConsumeToken();
       // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
-          type_name.ident_pos,
-          "using '%s' in this context is invalid",
-          type_name.ident->ToCString());
+          ident_pos,
+          "qualified name '%s' does not refer to a type",
+          qualified_name.ToCString());
     }
-    if ((type_name.lib_prefix != NULL) &&
-        type_name.lib_prefix->is_deferred_load() &&
-        !allow_deferred_type) {
+
+    // If parsing inside a local scope, check whether the type name
+    // is shadowed by a local declaration.
+    if (!is_top_level_ &&
+        (prefix.IsNull()) &&
+        ResolveIdentInLocalScope(ident_pos, type_name, NULL)) {
+      // The type is malformed. Skip over its type arguments.
       ParseTypeArguments(ClassFinalizer::kIgnore);
       return ClassFinalizer::NewFinalizedMalformedType(
-          Error::Handle(isolate()),  // No previous error.
+          Error::Handle(I),  // No previous error.
           script_,
-          type_name.ident_pos,
+          ident_pos,
+          "using '%s' in this context is invalid",
+          type_name.ToCString());
+    }
+    if (!prefix.IsNull() && prefix.is_deferred_load() && !allow_deferred_type) {
+      ParseTypeArguments(ClassFinalizer::kIgnore);
+      return ClassFinalizer::NewFinalizedMalformedType(
+          Error::Handle(I),  // No previous error.
+          script_,
+          ident_pos,
           "using deferred type '%s.%s' is invalid",
-          String::Handle(isolate(), type_name.lib_prefix->name()).ToCString(),
-          type_name.ident->ToCString());
+          String::Handle(I, prefix.name()).ToCString(),
+          type_name.ToCString());
     }
   }
-  Object& type_class = Object::Handle(isolate());
+  Object& type_class = Object::Handle(I);
   // Leave type_class as null if type finalization mode is kIgnore.
   if (finalization != ClassFinalizer::kIgnore) {
-    LibraryPrefix& lib_prefix = LibraryPrefix::Handle(isolate());
-    if (type_name.lib_prefix != NULL) {
-      lib_prefix = type_name.lib_prefix->raw();
-    }
-    type_class = UnresolvedClass::New(lib_prefix,
-                                      *type_name.ident,
-                                      type_name.ident_pos);
+    type_class = UnresolvedClass::New(prefix, type_name, ident_pos);
   }
   TypeArguments& type_arguments = TypeArguments::Handle(
-      isolate(), ParseTypeArguments(finalization));
+      I, ParseTypeArguments(finalization));
   if (finalization == ClassFinalizer::kIgnore) {
     return Type::DynamicType();
   }
   AbstractType& type = AbstractType::Handle(
-      isolate(), Type::New(type_class, type_arguments, type_name.ident_pos));
+      I, Type::New(type_class, type_arguments, ident_pos));
   if (finalization >= ClassFinalizer::kResolveTypeParameters) {
     ResolveTypeFromClass(current_class(), finalization, &type);
     if (finalization >= ClassFinalizer::kCanonicalize) {
@@ -9558,15 +9605,14 @@
     intptr_t pos, const Function& constructor,
     const TypeArguments& type_arguments) {
   if (!type_arguments.IsNull()) {
-    const Class& constructor_class = Class::Handle(isolate(),
-                                                   constructor.Owner());
+    const Class& constructor_class = Class::Handle(I, constructor.Owner());
     ASSERT(!constructor_class.IsNull());
     ASSERT(constructor_class.is_finalized());
     ASSERT(type_arguments.IsCanonical());
     // Do not report the expected vs. actual number of type arguments, because
     // the type argument vector is flattened and raw types are allowed.
     if (type_arguments.Length() != constructor_class.NumTypeArguments()) {
-      ErrorMsg(pos, "wrong number of type arguments passed to constructor");
+      ReportError(pos, "wrong number of type arguments passed to constructor");
     }
   }
 }
@@ -9601,23 +9647,22 @@
       if (element_type.IsDynamicType()) {
         list_type_arguments = TypeArguments::null();
       } else if (is_const && !element_type.IsInstantiated()) {
-        ErrorMsg(type_pos,
-                 "the type argument of a constant list literal cannot include "
-                 "a type variable");
+        ReportError(type_pos,
+                    "the type argument of a constant list literal cannot "
+                    "include a type variable");
       }
     } else {
       if (FLAG_error_on_bad_type) {
-        ErrorMsg(type_pos,
-                 "a list literal takes one type argument specifying "
-                 "the element type");
+        ReportError(type_pos,
+                    "a list literal takes one type argument specifying "
+                    "the element type");
       }
       // Ignore type arguments.
       list_type_arguments = TypeArguments::null();
     }
   }
   ASSERT(list_type_arguments.IsNull() || (list_type_arguments.Length() == 1));
-  const Class& array_class = Class::Handle(isolate(),
-      isolate()->object_store()->array_class());
+  const Class& array_class = Class::Handle(I, I->object_store()->array_class());
   Type& type = Type::ZoneHandle(I,
       Type::New(array_class, list_type_arguments, type_pos));
   type ^= ClassFinalizer::FinalizeType(
@@ -9633,16 +9678,16 @@
       if (FLAG_enable_type_checks &&
           !is_const &&
           !element_type.IsDynamicType()) {
-        element = new(isolate()) AssignableNode(element_pos,
-                                                element,
-                                                element_type,
-                                                Symbols::ListLiteralElement());
+        element = new(I) AssignableNode(element_pos,
+                                        element,
+                                        element_type,
+                                        Symbols::ListLiteralElement());
       }
       element_list.Add(element);
       if (CurrentToken() == Token::kCOMMA) {
         ConsumeToken();
       } else if (CurrentToken() != Token::kRBRACK) {
-        ErrorMsg("comma or ']' expected");
+        ReportError("comma or ']' expected");
       }
     }
     ExpectToken(Token::kRBRACK);
@@ -9654,8 +9699,8 @@
     Array& const_list =
         Array::ZoneHandle(I, Array::New(element_list.length(), Heap::kOld));
     const_list.SetTypeArguments(
-        TypeArguments::Handle(isolate(), list_type_arguments.Canonicalize()));
-    Error& malformed_error = Error::Handle(isolate());
+        TypeArguments::Handle(I, list_type_arguments.Canonicalize()));
+    Error& malformed_error = Error::Handle(I);
     for (int i = 0; i < element_list.length(); i++) {
       AstNode* elem = element_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -9666,29 +9711,29 @@
           (!elem->AsLiteralNode()->literal().IsNull() &&
            !elem->AsLiteralNode()->literal().IsInstanceOf(
                element_type,
-               TypeArguments::Handle(isolate()),
+               TypeArguments::Handle(I),
                &malformed_error))) {
         // If the failure is due to a malformed type error, display it instead.
         if (!malformed_error.IsNull()) {
-          ErrorMsg(malformed_error);
+          ReportError(malformed_error);
         } else {
-          ErrorMsg(elem->AsLiteralNode()->token_pos(),
-                   "list literal element at index %d must be "
-                   "a constant of type '%s'",
-                   i,
-                   String::Handle(isolate(),
-                       element_type.UserVisibleName()).ToCString());
+          ReportError(elem->AsLiteralNode()->token_pos(),
+                      "list literal element at index %d must be "
+                      "a constant of type '%s'",
+                      i,
+                      String::Handle(I,
+                          element_type.UserVisibleName()).ToCString());
         }
       }
       const_list.SetAt(i, elem->AsLiteralNode()->literal());
     }
     const_list ^= TryCanonicalize(const_list, literal_pos);
     const_list.MakeImmutable();
-    return new(isolate()) LiteralNode(literal_pos, const_list);
+    return new(I) LiteralNode(literal_pos, const_list);
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::List()));
+        Class::Handle(I, Library::LookupCoreClass(Symbols::List()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
@@ -9706,7 +9751,7 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 1)) {
       ASSERT(factory_type_args.Length() == 1);
-      Type& factory_type = Type::Handle(isolate(), Type::New(
+      Type& factory_type = Type::Handle(I, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9714,17 +9759,16 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param = new(isolate()) ArgumentListNode(
+    ArgumentListNode* factory_param = new(I) ArgumentListNode(
         literal_pos);
     if (element_list.length() == 0) {
       // TODO(srdjan): Use Object::empty_array once issue 9871 has been fixed.
       Array& empty_array = Array::ZoneHandle(I, Object::empty_array().raw());
       LiteralNode* empty_array_literal =
-          new(isolate()) LiteralNode(TokenPos(), empty_array);
+          new(I) LiteralNode(TokenPos(), empty_array);
       factory_param->Add(empty_array_literal);
     } else {
-      ArrayNode* list = new(isolate()) ArrayNode(
-          TokenPos(), type, element_list);
+      ArrayNode* list = new(I) ArrayNode(TokenPos(), type, element_list);
       factory_param->Add(list);
     }
     return CreateConstructorCallNode(literal_pos,
@@ -9743,7 +9787,7 @@
   if (!type_arguments.IsNull() && !type_arguments.IsInstantiated()) {
     EnsureExpressionTemp();
   }
-  return new(isolate()) ConstructorCallNode(
+  return new(I) ConstructorCallNode(
       token_pos, type_arguments, constructor, arguments);
 }
 
@@ -9802,15 +9846,15 @@
       if (key_type.IsDynamicType() && value_type.IsDynamicType()) {
         map_type_arguments = TypeArguments::null();
       } else if (is_const && !type_arguments.IsInstantiated()) {
-        ErrorMsg(type_pos,
-                 "the type arguments of a constant map literal cannot include "
-                 "a type variable");
+        ReportError(type_pos,
+                    "the type arguments of a constant map literal cannot "
+                    "include a type variable");
       }
     } else {
       if (FLAG_error_on_bad_type) {
-        ErrorMsg(type_pos,
-                 "a map literal takes two type arguments specifying "
-                 "the key type and the value type");
+        ReportError(type_pos,
+                    "a map literal takes two type arguments specifying "
+                    "the key type and the value type");
       }
       // Ignore type arguments.
       map_type_arguments = TypeArguments::null();
@@ -9829,19 +9873,19 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !key_type.IsDynamicType()) {
-      key = new(isolate()) AssignableNode(
+      key = new(I) AssignableNode(
           key_pos, key, key_type, Symbols::ListLiteralElement());
     }
     if (is_const) {
       ASSERT(key->IsLiteralNode());
       const Instance& key_value = key->AsLiteralNode()->literal();
       if (key_value.IsDouble()) {
-        ErrorMsg(key_pos, "key value must not be of type double");
+        ReportError(key_pos, "key value must not be of type double");
       }
       if (!key_value.IsInteger() &&
           !key_value.IsString() &&
           ImplementsEqualOperator(key_value)) {
-        ErrorMsg(key_pos, "key value must not implement operator ==");
+        ReportError(key_pos, "key value must not implement operator ==");
       }
     }
     ExpectToken(Token::kCOLON);
@@ -9851,7 +9895,7 @@
     if (FLAG_enable_type_checks &&
         !is_const &&
         !value_type.IsDynamicType()) {
-      value = new(isolate()) AssignableNode(
+      value = new(I) AssignableNode(
           value_pos, value, value_type, Symbols::ListLiteralElement());
     }
     AddKeyValuePair(&kv_pairs_list, is_const, key, value);
@@ -9859,7 +9903,7 @@
     if (CurrentToken() == Token::kCOMMA) {
       ConsumeToken();
     } else if (CurrentToken() != Token::kRBRACE) {
-      ErrorMsg("comma or '}' expected");
+      ReportError("comma or '}' expected");
     }
   }
   ASSERT(kv_pairs_list.length() % 2 == 0);
@@ -9873,8 +9917,8 @@
     // First, create the canonicalized key-value pair array.
     Array& key_value_array =
         Array::ZoneHandle(I, Array::New(kv_pairs_list.length(), Heap::kOld));
-    AbstractType& arg_type = Type::Handle(isolate());
-    Error& malformed_error = Error::Handle(isolate());
+    AbstractType& arg_type = Type::Handle(I);
+    Error& malformed_error = Error::Handle(I);
     for (int i = 0; i < kv_pairs_list.length(); i++) {
       AstNode* arg = kv_pairs_list[i];
       // Arguments have been evaluated to a literal value already.
@@ -9896,15 +9940,15 @@
                  &malformed_error))) {
           // If the failure is due to a malformed type error, display it.
           if (!malformed_error.IsNull()) {
-            ErrorMsg(malformed_error);
+            ReportError(malformed_error);
           } else {
-            ErrorMsg(arg->AsLiteralNode()->token_pos(),
-                     "map literal %s at index %d must be "
-                     "a constant of type '%s'",
-                     ((i % 2) == 0) ? "key" : "value",
-                     i >> 1,
-                     String::Handle(isolate(),
-                                    arg_type.UserVisibleName()).ToCString());
+            ReportError(arg->AsLiteralNode()->token_pos(),
+                        "map literal %s at index %d must be "
+                        "a constant of type '%s'",
+                        ((i % 2) == 0) ? "key" : "value",
+                        i >> 1,
+                        String::Handle(I,
+                                       arg_type.UserVisibleName()).ToCString());
           }
         }
       }
@@ -9914,36 +9958,36 @@
     key_value_array.MakeImmutable();
 
     // Construct the map object.
-    const Class& immutable_map_class = Class::Handle(isolate(),
+    const Class& immutable_map_class = Class::Handle(I,
         Library::LookupCoreClass(Symbols::ImmutableMap()));
     ASSERT(!immutable_map_class.IsNull());
     // If the immutable map class extends other parameterized classes, we need
     // to adjust the type argument vector. This is currently not the case.
     ASSERT(immutable_map_class.NumTypeArguments() == 2);
-    ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(TokenPos());
-    constr_args->Add(new(isolate()) LiteralNode(literal_pos, key_value_array));
+    ArgumentListNode* constr_args = new(I) ArgumentListNode(TokenPos());
+    constr_args->Add(new(I) LiteralNode(literal_pos, key_value_array));
     const Function& map_constr =
         Function::ZoneHandle(I, immutable_map_class.LookupConstructor(
             Library::PrivateCoreLibName(Symbols::ImmutableMapConstructor())));
     ASSERT(!map_constr.IsNull());
-    const Object& constructor_result = Object::Handle(isolate(),
+    const Object& constructor_result = Object::Handle(I,
         EvaluateConstConstructorCall(immutable_map_class,
                                      map_type_arguments,
                                      map_constr,
                                      constr_args));
     if (constructor_result.IsUnhandledException()) {
-      AppendErrorMsg(Error::Cast(constructor_result),
-                     literal_pos,
-                     "error executing const Map constructor");
+      ReportErrors(Error::Cast(constructor_result),
+                   script_, literal_pos,
+                   "error executing const Map constructor");
     } else {
       const Instance& const_instance = Instance::Cast(constructor_result);
-      return new(isolate()) LiteralNode(
+      return new(I) LiteralNode(
           literal_pos, Instance::ZoneHandle(I, const_instance.raw()));
     }
   } else {
     // Factory call at runtime.
     const Class& factory_class =
-        Class::Handle(isolate(), Library::LookupCoreClass(Symbols::Map()));
+        Class::Handle(I, Library::LookupCoreClass(Symbols::Map()));
     ASSERT(!factory_class.IsNull());
     const Function& factory_method = Function::ZoneHandle(I,
         factory_class.LookupFactory(
@@ -9961,7 +10005,7 @@
     // type argument vector.
     if (!factory_type_args.IsNull() && (factory_class.NumTypeArguments() > 2)) {
       ASSERT(factory_type_args.Length() == 2);
-      Type& factory_type = Type::Handle(isolate(), Type::New(
+      Type& factory_type = Type::Handle(I, Type::New(
           factory_class, factory_type_args, type_pos, Heap::kNew));
       factory_type ^= ClassFinalizer::FinalizeType(
           current_class(), factory_type, ClassFinalizer::kFinalize);
@@ -9969,11 +10013,10 @@
       ASSERT(factory_type_args.Length() == factory_class.NumTypeArguments());
     }
     factory_type_args = factory_type_args.Canonicalize();
-    ArgumentListNode* factory_param =
-        new(isolate()) ArgumentListNode(literal_pos);
+    ArgumentListNode* factory_param = new(I) ArgumentListNode(literal_pos);
     // The kv_pair array is temporary and of element type dynamic. It is passed
     // to the factory to initialize a properly typed map.
-    ArrayNode* kv_pairs = new(isolate()) ArrayNode(
+    ArrayNode* kv_pairs = new(I) ArrayNode(
         TokenPos(),
         Type::ZoneHandle(I, Type::ArrayType()),
         kv_pairs_list);
@@ -9996,7 +10039,7 @@
     ConsumeToken();
   }
   const intptr_t type_pos = TokenPos();
-  TypeArguments& type_arguments = TypeArguments::Handle(isolate(),
+  TypeArguments& type_arguments = TypeArguments::Handle(I,
       ParseTypeArguments(ClassFinalizer::kCanonicalize));
   // Malformed type arguments are mapped to dynamic, so we will not encounter
   // them here.
@@ -10009,7 +10052,7 @@
   } else if (CurrentToken() == Token::kLBRACE) {
     primary = ParseMapLiteral(type_pos, is_const, type_arguments);
   } else {
-    ErrorMsg("unexpected token %s", Token::Str(CurrentToken()));
+    ReportError("unexpected token %s", Token::Str(CurrentToken()));
   }
   return primary;
 }
@@ -10019,7 +10062,7 @@
   ASSERT(CurrentToken() == Token::kHASH);
   ConsumeToken();
   intptr_t symbol_pos = TokenPos();
-  String& symbol = String::Handle(isolate());
+  String& symbol = String::Handle(I);
   if (IsIdentifier()) {
     symbol = CurrentLiteral()->raw();
     ConsumeToken();
@@ -10033,33 +10076,33 @@
     symbol = String::New(Token::Str(CurrentToken()));
     ConsumeToken();
   } else {
-    ErrorMsg("illegal symbol literal");
+    ReportError("illegal symbol literal");
   }
   // Lookup class Symbol from internal library and call the
   // constructor to create a symbol instance.
-  const Library& lib = Library::Handle(isolate(), Library::InternalLibrary());
-  const Class& symbol_class = Class::Handle(isolate(),
+  const Library& lib = Library::Handle(I, Library::InternalLibrary());
+  const Class& symbol_class = Class::Handle(I,
                                             lib.LookupClass(Symbols::Symbol()));
   ASSERT(!symbol_class.IsNull());
-  ArgumentListNode* constr_args = new(isolate()) ArgumentListNode(symbol_pos);
-  constr_args->Add(new(isolate()) LiteralNode(
+  ArgumentListNode* constr_args = new(I) ArgumentListNode(symbol_pos);
+  constr_args->Add(new(I) LiteralNode(
       symbol_pos, String::ZoneHandle(I, Symbols::New(symbol))));
   const Function& constr = Function::ZoneHandle(I,
       symbol_class.LookupConstructor(Symbols::SymbolCtor()));
   ASSERT(!constr.IsNull());
-  const Object& result = Object::Handle(isolate(),
+  const Object& result = Object::Handle(I,
       EvaluateConstConstructorCall(symbol_class,
-                                   TypeArguments::Handle(isolate()),
+                                   TypeArguments::Handle(I),
                                    constr,
                                    constr_args));
   if (result.IsUnhandledException()) {
-    AppendErrorMsg(Error::Cast(result),
-                   symbol_pos,
-                   "error executing const Symbol constructor");
+    ReportErrors(Error::Cast(result),
+                 script_, symbol_pos,
+                 "error executing const Symbol constructor");
   }
   const Instance& instance = Instance::Cast(result);
-  return new(isolate()) LiteralNode(symbol_pos,
-                                    Instance::ZoneHandle(I, instance.raw()));
+  return new(I) LiteralNode(symbol_pos,
+                            Instance::ZoneHandle(I, instance.raw()));
 }
 
 
@@ -10084,32 +10127,36 @@
   ASSERT((op_kind == Token::kNEW) || (op_kind == Token::kCONST));
   bool is_const = (op_kind == Token::kCONST);
   if (!IsIdentifier()) {
-    ErrorMsg("type name expected");
+    ReportError("type name expected");
   }
   intptr_t type_pos = TokenPos();
   // Can't allocate const objects of a deferred type.
   const bool allow_deferred_type = !is_const;
-  AbstractType& type = AbstractType::Handle(isolate(),
-      ParseType(ClassFinalizer::kCanonicalizeWellFormed, allow_deferred_type));
+  const bool consume_unresolved_prefix = (LookaheadToken(3) == Token::kLT) ||
+                                         (LookaheadToken(3) == Token::kPERIOD);
+  AbstractType& type = AbstractType::Handle(I,
+      ParseType(ClassFinalizer::kCanonicalizeWellFormed,
+                allow_deferred_type,
+                consume_unresolved_prefix));
   // In case the type is malformed, throw a dynamic type error after finishing
   // parsing the instance creation expression.
   if (!type.IsMalformed() && (type.IsTypeParameter() || type.IsDynamicType())) {
     // Replace the type with a malformed type.
     type = ClassFinalizer::NewFinalizedMalformedType(
-        Error::Handle(isolate()),  // No previous error.
+        Error::Handle(I),  // No previous error.
         script_,
         type_pos,
         "%s'%s' cannot be instantiated",
         type.IsTypeParameter() ? "type parameter " : "",
         type.IsTypeParameter() ?
-            String::Handle(isolate(), type.UserVisibleName()).ToCString() :
+            String::Handle(I, type.UserVisibleName()).ToCString() :
             "dynamic");
   }
 
   // The grammar allows for an optional ('.' identifier)? after the type, which
-  // is a named constructor. Note that ParseType() above will not consume it as
-  // part of a misinterpreted qualified identifier, because only a valid library
-  // prefix is accepted as qualifier.
+  // is a named constructor. Note that we tell ParseType() above not to
+  // consume it as part of a misinterpreted qualified identifier. Only a
+  // valid library prefix is accepted as qualifier.
   String* named_constructor = NULL;
   if (CurrentToken() == Token::kPERIOD) {
     ConsumeToken();
@@ -10125,15 +10172,15 @@
   // malbounded type or report a compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      const Error& error = Error::Handle(isolate(), type.error());
-      ErrorMsg(error);
+      const Error& error = Error::Handle(I, type.error());
+      ReportError(error);
     }
     return ThrowTypeError(type_pos, type);
   }
 
   // Resolve the type and optional identifier to a constructor or factory.
-  Class& type_class = Class::Handle(isolate(), type.type_class());
-  String& type_class_name = String::Handle(isolate(), type_class.Name());
+  Class& type_class = Class::Handle(I, type.type_class());
+  String& type_class_name = String::Handle(I, type_class.Name());
   TypeArguments& type_arguments =
       TypeArguments::ZoneHandle(I, type.arguments());
 
@@ -10160,13 +10207,13 @@
       // compile-time error if the constructor is const.
       if (is_const) {
         type = ClassFinalizer::NewFinalizedMalformedType(
-            Error::Handle(isolate()),  // No previous error.
+            Error::Handle(I),  // No previous error.
             script_,
             call_pos,
             "class '%s' has no constructor or factory named '%s'",
-            String::Handle(isolate(), type_class.Name()).ToCString(),
+            String::Handle(I, type_class.Name()).ToCString(),
             external_constructor_name.ToCString());
-        ErrorMsg(Error::Handle(isolate(), type.error()));
+        ReportError(Error::Handle(I, type.error()));
       }
       return ThrowNoSuchMethodError(call_pos,
                                     type_class,
@@ -10177,13 +10224,12 @@
                                     NULL);  // No existing function.
     } else if (constructor.IsRedirectingFactory()) {
       ClassFinalizer::ResolveRedirectingFactory(type_class, constructor);
-      Type& redirect_type = Type::Handle(isolate(),
-                                         constructor.RedirectionType());
+      Type& redirect_type = Type::Handle(I, constructor.RedirectionType());
       if (!redirect_type.IsMalformedOrMalbounded() &&
           !redirect_type.IsInstantiated()) {
         // The type arguments of the redirection type are instantiated from the
         // type arguments of the parsed type of the 'new' or 'const' expression.
-        Error& error = Error::Handle(isolate());
+        Error& error = Error::Handle(I);
         redirect_type ^= redirect_type.InstantiateFrom(type_arguments, &error);
         if (!error.IsNull()) {
           redirect_type = ClassFinalizer::NewFinalizedMalformedType(
@@ -10191,13 +10237,12 @@
               script_,
               call_pos,
               "redirecting factory type '%s' cannot be instantiated",
-              String::Handle(isolate(),
-                             redirect_type.UserVisibleName()).ToCString());
+              String::Handle(I, redirect_type.UserVisibleName()).ToCString());
         }
       }
       if (redirect_type.IsMalformedOrMalbounded()) {
         if (is_const) {
-          ErrorMsg(Error::Handle(isolate(), redirect_type.error()));
+          ReportError(Error::Handle(I, redirect_type.error()));
         }
         return ThrowTypeError(redirect_type.token_pos(), redirect_type);
       }
@@ -10224,15 +10269,14 @@
   ASSERT(!constructor.IsNull());
   if (type_class.is_abstract() && !constructor.IsFactory()) {
     // Evaluate arguments before throwing.
-    LetNode* result = new(isolate()) LetNode(call_pos);
+    LetNode* result = new(I) LetNode(call_pos);
     for (intptr_t i = 0; i < arguments->length(); ++i) {
       result->AddNode(arguments->NodeAt(i));
     }
-    ArgumentListNode* error_arguments =
-        new(isolate()) ArgumentListNode(type_pos);
-    error_arguments->Add(new(isolate()) LiteralNode(
+    ArgumentListNode* error_arguments = new(I) ArgumentListNode(type_pos);
+    error_arguments->Add(new(I) LiteralNode(
         TokenPos(), Integer::ZoneHandle(I, Integer::New(type_pos))));
-    error_arguments->Add(new(isolate()) LiteralNode(
+    error_arguments->Add(new(I) LiteralNode(
         TokenPos(), String::ZoneHandle(I, type_class_name.raw())));
     result->AddNode(
         MakeStaticCall(Symbols::AbstractClassInstantiationError(),
@@ -10240,19 +10284,19 @@
                        error_arguments));
     return result;
   }
-  String& error_message = String::Handle(isolate());
+  String& error_message = String::Handle(I);
   if (!constructor.AreValidArguments(arguments_length,
                                      arguments->names(),
                                      &error_message)) {
     const String& external_constructor_name =
         (named_constructor ? constructor_name : type_class_name);
     if (is_const) {
-      ErrorMsg(call_pos,
-               "invalid arguments passed to constructor '%s' "
-               "for class '%s': %s",
-               external_constructor_name.ToCString(),
-               String::Handle(isolate(), type_class.Name()).ToCString(),
-               error_message.ToCString());
+      ReportError(call_pos,
+                  "invalid arguments passed to constructor '%s' "
+                  "for class '%s': %s",
+                  external_constructor_name.ToCString(),
+                  String::Handle(I, type_class.Name()).ToCString(),
+                  error_message.ToCString());
     }
     return ThrowNoSuchMethodError(call_pos,
                                   type_class,
@@ -10267,7 +10311,7 @@
   // compile-time error if the constructor is const.
   if (type.IsMalformedOrMalbounded()) {
     if (is_const) {
-      ErrorMsg(Error::Handle(isolate(), type.error()));
+      ReportError(Error::Handle(I, type.error()));
     }
     return ThrowTypeError(type_pos, type);
   }
@@ -10278,11 +10322,11 @@
     if (!constructor.is_const()) {
       const String& external_constructor_name =
           (named_constructor ? constructor_name : type_class_name);
-      ErrorMsg("non-const constructor '%s' cannot be used in "
-               "const object creation",
-               external_constructor_name.ToCString());
+      ReportError("non-const constructor '%s' cannot be used in "
+                  "const object creation",
+                  external_constructor_name.ToCString());
     }
-    const Object& constructor_result = Object::Handle(isolate(),
+    const Object& constructor_result = Object::Handle(I,
         EvaluateConstConstructorCall(type_class,
                                      type_arguments,
                                      constructor,
@@ -10290,30 +10334,29 @@
     if (constructor_result.IsUnhandledException()) {
       // It's a compile-time error if invocation of a const constructor
       // call fails.
-      AppendErrorMsg(Error::Cast(constructor_result),
-                     new_pos,
-                     "error while evaluating const constructor");
+      ReportErrors(Error::Cast(constructor_result),
+                   script_, new_pos,
+                   "error while evaluating const constructor");
     } else {
       // Const constructors can return null in the case where a const native
       // factory returns a null value. Thus we cannot use a Instance::Cast here.
-      Instance& const_instance = Instance::Handle(isolate());
+      Instance& const_instance = Instance::Handle(I);
       const_instance ^= constructor_result.raw();
-      new_object = new(isolate()) LiteralNode(
+      new_object = new(I) LiteralNode(
           new_pos, Instance::ZoneHandle(I, const_instance.raw()));
       if (!type_bound.IsNull()) {
         ASSERT(!type_bound.IsMalformed());
-        Error& malformed_error = Error::Handle(isolate());
+        Error& malformed_error = Error::Handle(I);
         ASSERT(!is_top_level_);  // We cannot check unresolved types.
         if (!const_instance.IsInstanceOf(type_bound,
-                                         TypeArguments::Handle(isolate()),
+                                         TypeArguments::Handle(I),
                                          &malformed_error)) {
           type_bound = ClassFinalizer::NewFinalizedMalformedType(
               malformed_error,
               script_,
               new_pos,
               "const factory result is not an instance of '%s'",
-              String::Handle(isolate(),
-                             type_bound.UserVisibleName()).ToCString());
+              String::Handle(I, type_bound.UserVisibleName()).ToCString());
           new_object = ThrowTypeError(new_pos, type_bound);
         }
         type_bound = AbstractType::null();
@@ -10333,7 +10376,7 @@
         new_pos, type_arguments, constructor, arguments);
   }
   if (!type_bound.IsNull()) {
-    new_object = new(isolate()) AssignableNode(
+    new_object = new(I) AssignableNode(
          new_pos, new_object, type_bound, Symbols::FactoryResult());
   }
   return new_object;
@@ -10342,32 +10385,31 @@
 
 String& Parser::Interpolate(const GrowableArray<AstNode*>& values) {
   const Class& cls = Class::Handle(
-      isolate(), Library::LookupCoreClass(Symbols::StringBase()));
+      I, Library::LookupCoreClass(Symbols::StringBase()));
   ASSERT(!cls.IsNull());
-  const Function& func = Function::Handle(isolate(), cls.LookupStaticFunction(
+  const Function& func = Function::Handle(I, cls.LookupStaticFunction(
       Library::PrivateCoreLibName(Symbols::Interpolate())));
   ASSERT(!func.IsNull());
 
   // Build the array of literal values to interpolate.
-  const Array& value_arr = Array::Handle(isolate(),
-                                         Array::New(values.length()));
+  const Array& value_arr = Array::Handle(I, Array::New(values.length()));
   for (int i = 0; i < values.length(); i++) {
     ASSERT(values[i]->IsLiteralNode());
     value_arr.SetAt(i, values[i]->AsLiteralNode()->literal());
   }
 
   // Build argument array to pass to the interpolation function.
-  const Array& interpolate_arg = Array::Handle(isolate(), Array::New(1));
+  const Array& interpolate_arg = Array::Handle(I, Array::New(1));
   interpolate_arg.SetAt(0, value_arr);
 
   // Call interpolation function.
-  Object& result = Object::Handle(isolate());
+  Object& result = Object::Handle(I);
   {
-    PAUSETIMERSCOPE(isolate(), time_compilation);
+    PAUSETIMERSCOPE(I, time_compilation);
     result = DartEntry::InvokeFunction(func, interpolate_arg);
   }
   if (result.IsUnhandledException()) {
-    ErrorMsg("%s", Error::Cast(result).ToErrorCString());
+    ReportError("%s", Error::Cast(result).ToErrorCString());
   }
   String& concatenated = String::ZoneHandle(I);
   concatenated ^= result.raw();
@@ -10392,7 +10434,7 @@
       (l1_token != Token::kINTERPOL_VAR) &&
       (l1_token != Token::kINTERPOL_START)) {
     // Common case: no interpolation.
-    primary = new(isolate()) LiteralNode(literal_start, *CurrentLiteral());
+    primary = new(I) LiteralNode(literal_start, *CurrentLiteral());
     ConsumeToken();
     return primary;
   }
@@ -10404,14 +10446,13 @@
     if (CurrentLiteral()->Length() > 0) {
       // Only add non-empty string sections to the values list
       // that will be concatenated.
-      values_list.Add(new(isolate()) LiteralNode(TokenPos(),
-                                                 *CurrentLiteral()));
+      values_list.Add(new(I) LiteralNode(TokenPos(), *CurrentLiteral()));
     }
     ConsumeToken();
     while ((CurrentToken() == Token::kINTERPOL_VAR) ||
         (CurrentToken() == Token::kINTERPOL_START)) {
       if (!allow_interpolation) {
-        ErrorMsg("string interpolation not allowed in this context");
+        ReportError("string interpolation not allowed in this context");
       }
       has_interpolation = true;
       AstNode* expr = NULL;
@@ -10439,8 +10480,8 @@
             const_expr->IsBool() ||
             const_expr->IsNull())) {
           // Change expr into a literal.
-          expr = new(isolate()) LiteralNode(expr_pos,
-                                            EvaluateConstExpr(expr_pos, expr));
+          expr = new(I) LiteralNode(expr_pos,
+                                    EvaluateConstExpr(expr_pos, expr));
         } else {
           is_compiletime_const = false;
         }
@@ -10450,11 +10491,9 @@
   }
   if (is_compiletime_const) {
     if (has_interpolation) {
-      primary = new(isolate()) LiteralNode(
-          literal_start, Interpolate(values_list));
+      primary = new(I) LiteralNode(literal_start, Interpolate(values_list));
     } else {
-      const Array& strings = Array::Handle(isolate(),
-                                           Array::New(values_list.length()));
+      const Array& strings = Array::Handle(I, Array::New(values_list.length()));
       for (int i = 0; i < values_list.length(); i++) {
         const Instance& part = values_list[i]->AsLiteralNode()->literal();
         ASSERT(part.IsString());
@@ -10463,14 +10502,14 @@
       String& lit = String::ZoneHandle(I,
                                        String::ConcatAll(strings, Heap::kOld));
       lit = Symbols::New(lit);
-      primary = new(isolate()) LiteralNode(literal_start, lit);
+      primary = new(I) LiteralNode(literal_start, lit);
     }
   } else {
-    ArrayNode* values = new(isolate()) ArrayNode(
+    ArrayNode* values = new(I) ArrayNode(
         TokenPos(),
         Type::ZoneHandle(I, Type::ArrayType()),
         values_list);
-    primary = new(isolate()) StringInterpolateNode(TokenPos(), values);
+    primary = new(I) StringInterpolateNode(TokenPos(), values);
   }
   return primary;
 }
@@ -10488,48 +10527,44 @@
     primary = ParseFunctionStatement(true);
     CloseBlock();
   } else if (IsIdentifier()) {
-    QualIdent qual_ident;
     intptr_t qual_ident_pos = TokenPos();
-    ParseQualIdent(&qual_ident);
-    if (qual_ident.lib_prefix == NULL) {
-      if (!ResolveIdentInLocalScope(qual_ident.ident_pos,
-                                    *qual_ident.ident,
-                                    &primary)) {
+    const LibraryPrefix& prefix = LibraryPrefix::ZoneHandle(I, ParsePrefix());
+    String& ident = *CurrentLiteral();
+    ConsumeToken();
+    if (prefix.IsNull()) {
+      if (!ResolveIdentInLocalScope(qual_ident_pos, ident, &primary)) {
         // Check whether the identifier is a type parameter.
         if (!current_class().IsNull()) {
           TypeParameter& type_param = TypeParameter::ZoneHandle(I,
-              current_class().LookupTypeParameter(*(qual_ident.ident)));
+              current_class().LookupTypeParameter(ident));
           if (!type_param.IsNull()) {
-            return new(isolate()) PrimaryNode(qual_ident.ident_pos, type_param);
+            return new(I) PrimaryNode(qual_ident_pos, type_param);
           }
         }
         // This is a non-local unqualified identifier so resolve the
         // identifier locally in the main app library and all libraries
         // imported by it.
-        primary = ResolveIdentInCurrentLibraryScope(qual_ident.ident_pos,
-                                                    *qual_ident.ident);
+        primary = ResolveIdentInCurrentLibraryScope(qual_ident_pos, ident);
       }
     } else {
       // This is a qualified identifier with a library prefix so resolve
       // the identifier locally in that library (we do not include the
       // libraries imported by that library).
-      primary = ResolveIdentInPrefixScope(qual_ident.ident_pos,
-                                          *qual_ident.lib_prefix,
-                                          *qual_ident.ident);
+      primary = ResolveIdentInPrefixScope(qual_ident_pos, prefix, ident);
+
       // If the identifier could not be resolved, throw a NoSuchMethodError.
       // Note: unlike in the case of an unqualified identifier, do not
       // interpret the unresolved identifier as an instance method or
       // instance getter call when compiling an instance method.
       if (primary == NULL) {
-        if (qual_ident.lib_prefix->is_deferred_load() &&
-            qual_ident.ident->Equals(Symbols::LoadLibrary())) {
+        if (prefix.is_deferred_load() &&
+            ident.Equals(Symbols::LoadLibrary())) {
           // Hack Alert: recognize special 'loadLibrary' call on the
           // prefix object. The prefix is the primary. Rewind parser and
           // let ParseSelectors() handle the loadLibrary call.
           SetPosition(qual_ident_pos);
           ConsumeToken();  // Prefix name.
-          primary = new(isolate()) LiteralNode(
-              qual_ident_pos, *qual_ident.lib_prefix);
+          primary = new(I) LiteralNode(qual_ident_pos, prefix);
         } else {
           // TODO(hausner): Ideally we should generate the NoSuchMethodError
           // later, when we know more about how the unresolved name is used.
@@ -10541,10 +10576,9 @@
           // is used. We cheat a little here by looking at the next token
           // to determine whether we have an unresolved method call or
           // field access.
-          String& qualified_name =
-              String::ZoneHandle(I, qual_ident.lib_prefix->name());
+          String& qualified_name = String::ZoneHandle(I, prefix.name());
           qualified_name = String::Concat(qualified_name, Symbols::Dot());
-          qualified_name = String::Concat(qualified_name, *qual_ident.ident);
+          qualified_name = String::Concat(qualified_name, ident);
           qualified_name = Symbols::New(qualified_name);
           InvocationMirror::Type call_type =
               CurrentToken() == Token::kLPAREN ?
@@ -10563,22 +10597,22 @@
   } else if (token == Token::kTHIS) {
     LocalVariable* local = LookupLocalScope(Symbols::This());
     if (local == NULL) {
-      ErrorMsg("receiver 'this' is not in scope");
+      ReportError("receiver 'this' is not in scope");
     }
-    primary = new(isolate()) LoadLocalNode(TokenPos(), local);
+    primary = new(I) LoadLocalNode(TokenPos(), local);
     ConsumeToken();
   } else if (token == Token::kINTEGER) {
     const Integer& literal = Integer::ZoneHandle(I, CurrentIntegerLiteral());
-    primary = new(isolate()) LiteralNode(TokenPos(), literal);
+    primary = new(I) LiteralNode(TokenPos(), literal);
     ConsumeToken();
   } else if (token == Token::kTRUE) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Bool::True());
+    primary = new(I) LiteralNode(TokenPos(), Bool::True());
     ConsumeToken();
   } else if (token == Token::kFALSE) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Bool::False());
+    primary = new(I) LiteralNode(TokenPos(), Bool::False());
     ConsumeToken();
   } else if (token == Token::kNULL) {
-    primary = new(isolate()) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
+    primary = new(I) LiteralNode(TokenPos(), Instance::ZoneHandle(I));
     ConsumeToken();
   } else if (token == Token::kLPAREN) {
     ConsumeToken();
@@ -10589,9 +10623,9 @@
   } else if (token == Token::kDOUBLE) {
     Double& double_value = Double::ZoneHandle(I, CurrentDoubleLiteral());
     if (double_value.IsNull()) {
-      ErrorMsg("invalid double literal");
+      ReportError("invalid double literal");
     }
-    primary = new(isolate()) LiteralNode(TokenPos(), double_value);
+    primary = new(I) LiteralNode(TokenPos(), double_value);
     ConsumeToken();
   } else if (token == Token::kSTRING) {
     primary = ParseStringLiteral(true);
@@ -10617,18 +10651,18 @@
     primary = ParseSymbolLiteral();
   } else if (token == Token::kSUPER) {
     if (current_function().is_static()) {
-      ErrorMsg("cannot access superclass from static method");
+      ReportError("cannot access superclass from static method");
     }
     if (current_class().SuperClass() == Class::null()) {
-      ErrorMsg("class '%s' does not have a superclass",
-               String::Handle(isolate(), current_class().Name()).ToCString());
+      ReportError("class '%s' does not have a superclass",
+                  String::Handle(I, current_class().Name()).ToCString());
     }
     if (current_class().IsMixinApplication()) {
-      const Type& mixin_type = Type::Handle(isolate(), current_class().mixin());
+      const Type& mixin_type = Type::Handle(I, current_class().mixin());
       if (mixin_type.type_class() == current_function().origin()) {
-        ErrorMsg("method of mixin class '%s' may not refer to 'super'",
-                 String::Handle(isolate(), Class::Handle(isolate(),
-                     current_function().origin()).Name()).ToCString());
+        ReportError("method of mixin class '%s' may not refer to 'super'",
+                    String::Handle(I, Class::Handle(I,
+                        current_function().origin()).Name()).ToCString());
       }
     }
     const intptr_t super_pos = TokenPos();
@@ -10647,7 +10681,7 @@
         (CurrentToken() == Token::kNE)) {
       primary = ParseSuperOperator();
     } else {
-      primary = new(isolate()) PrimaryNode(super_pos, Symbols::Super());
+      primary = new(I) PrimaryNode(super_pos, Symbols::Super());
     }
   } else {
     UnexpectedToken();
@@ -10674,19 +10708,19 @@
     return Instance::ZoneHandle(I, field.value());
   } else {
     ASSERT(expr->EvalConstExpr() != NULL);
-    ReturnNode* ret = new(isolate()) ReturnNode(expr->token_pos(), expr);
+    ReturnNode* ret = new(I) ReturnNode(expr->token_pos(), expr);
     // Compile time constant expressions cannot reference anything from a
     // local scope.
-    LocalScope* empty_scope = new(isolate()) LocalScope(NULL, 0, 0);
-    SequenceNode* seq = new(isolate()) SequenceNode(expr->token_pos(),
+    LocalScope* empty_scope = new(I) LocalScope(NULL, 0, 0);
+    SequenceNode* seq = new(I) SequenceNode(expr->token_pos(),
                                                     empty_scope);
     seq->Add(ret);
 
-    Object& result = Object::Handle(isolate(), Compiler::ExecuteOnce(seq));
+    Object& result = Object::Handle(I, Compiler::ExecuteOnce(seq));
     if (result.IsError()) {
-      AppendErrorMsg(Error::Cast(result),
-                     expr_pos,
-                     "error evaluating constant expression");
+      ReportErrors(Error::Cast(result),
+                   script_, expr_pos,
+                   "error evaluating constant expression");
     }
     ASSERT(result.IsInstance());
     Instance& value = Instance::ZoneHandle(I);
diff --git a/runtime/vm/parser.h b/runtime/vm/parser.h
index 15de41f..fc68254 100644
--- a/runtime/vm/parser.h
+++ b/runtime/vm/parser.h
@@ -258,6 +258,8 @@
 
   void ComputeCurrentToken();
 
+  RawLibraryPrefix* ParsePrefix();
+
   Token::Kind LookaheadToken(int num_tokens);
   String* CurrentLiteral() const;
   RawDouble* CurrentDoubleLiteral() const;
@@ -311,31 +313,27 @@
                                          const Function& constructor,
                                          const TypeArguments& type_arguments);
 
-  // A null script means no source and a negative token_pos means no position.
-  static RawString* FormatMessage(const Script& script,
-                                  intptr_t token_pos,
-                                  LanguageError::Kind kind,
-                                  const char* format,
-                                  va_list args);
+  // Report already formatted error.
+  static void ReportError(const Error& error);
 
-  // Reports error/warning msg at location of current token in current script.
-  void ErrorMsg(const char* msg, ...) PRINTF_ATTRIBUTE(2, 3);
-  void Warning(const char* msg, ...)  PRINTF_ATTRIBUTE(2, 3);
-  void Unimplemented(const char* msg);
+  // Concatenate and report an already formatted error and a new error message.
+  static void ReportErrors(const Error& prev_error,
+                           const Script& script, intptr_t token_pos,
+                           const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
 
-  // Reports error message at given location in current script.
-  void ErrorMsg(intptr_t token_pos, const char* msg, ...) const
-      PRINTF_ATTRIBUTE(3, 4);
-  void Warning(intptr_t token_pos, const char* msg, ...)
-      PRINTF_ATTRIBUTE(3, 4);
+  // Report error message at location of current token in current script.
+  void ReportError(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
 
-  // Reports an already formatted error message.
-  static void ErrorMsg(const Error& error);
+  // Report error message at given location in current script.
+  void ReportError(intptr_t token_pos,
+                   const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
 
-  // Concatenates two error messages, the previous and the current one.
-  void AppendErrorMsg(
-      const Error& prev_error, intptr_t token_pos, const char* format, ...)
-      PRINTF_ATTRIBUTE(4, 5);
+  // Report warning message at location of current token in current script.
+  void ReportWarning(const char* msg, ...) const PRINTF_ATTRIBUTE(2, 3);
+
+  // Report warning message at given location in current script.
+  void ReportWarning(intptr_t token_pos,
+                     const char* msg, ...) const PRINTF_ATTRIBUTE(3, 4);
 
   void CheckRecursiveInvocation();
 
@@ -383,11 +381,11 @@
                             ClassFinalizer::FinalizationKind finalization,
                             AbstractType* type);
   RawAbstractType* ParseType(ClassFinalizer::FinalizationKind finalization,
-                             bool allow_deferred_type = false);
+                             bool allow_deferred_type = false,
+                             bool consume_unresolved_prefix = true);
   void ParseTypeParameters(const Class& cls);
   RawTypeArguments* ParseTypeArguments(
       ClassFinalizer::FinalizationKind finalization);
-  void ParseQualIdent(QualIdent* qual_ident);
   void ParseMethodOrConstructor(ClassDesc* members, MemberDesc* method);
   void ParseFieldDefinition(ClassDesc* members, MemberDesc* field);
   void CheckMemberNameConflict(ClassDesc* members, MemberDesc* member);
@@ -548,6 +546,7 @@
   bool IsSimpleLiteral(const AbstractType& type, Instance* value);
   bool IsFunctionTypeAliasName();
   bool IsMixinAppAlias();
+  bool TryParseQualIdent();
   bool TryParseTypeParameters();
   bool TryParseOptionalType();
   bool TryParseReturnType();
diff --git a/runtime/vm/profiler.cc b/runtime/vm/profiler.cc
index 4cb4e10..016332e 100644
--- a/runtime/vm/profiler.cc
+++ b/runtime/vm/profiler.cc
@@ -21,7 +21,8 @@
 namespace dart {
 
 
-#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID)
+#if defined(USING_SIMULATOR) || defined(TARGET_OS_ANDROID) || \
+    defined(HOST_ARCH_ARM64)
   DEFINE_FLAG(bool, profile, false, "Enable Sampling Profiler");
 #else
   DEFINE_FLAG(bool, profile, true, "Enable Sampling Profiler");
@@ -45,6 +46,7 @@
   // Place some sane restrictions on user controlled flags.
   SetSamplePeriod(FLAG_profile_period);
   SetSampleDepth(FLAG_profile_depth);
+  Sample::InitOnce();
   if (!FLAG_profile) {
     return;
   }
@@ -69,7 +71,7 @@
 
 void Profiler::SetSampleDepth(intptr_t depth) {
   const int kMinimumDepth = 1;
-  const int kMaximumDepth = kSampleFramesSize - 1;
+  const int kMaximumDepth = 255;
   if (depth < kMinimumDepth) {
     FLAG_profile_depth = kMinimumDepth;
   } else if (depth > kMaximumDepth) {
@@ -1616,6 +1618,42 @@
 }
 
 
+intptr_t Sample::pcs_length_ = 0;
+intptr_t Sample::instance_size_ = 0;
+
+
+void Sample::InitOnce() {
+  ASSERT(FLAG_profile_depth >= 1);
+  pcs_length_ = FLAG_profile_depth;
+  instance_size_ =
+      sizeof(Sample) + (sizeof(uword) * pcs_length_);  // NOLINT.
+}
+
+
+uword* Sample::GetPCArray() const {
+  return reinterpret_cast<uword*>(
+        reinterpret_cast<uintptr_t>(this) + sizeof(*this));
+}
+
+
+SampleBuffer::SampleBuffer(intptr_t capacity) {
+  ASSERT(Sample::instance_size() > 0);
+  samples_ = reinterpret_cast<Sample*>(
+      calloc(capacity, Sample::instance_size()));
+  capacity_ = capacity;
+  cursor_ = 0;
+}
+
+
+Sample* SampleBuffer::At(intptr_t idx) const {
+  ASSERT(idx >= 0);
+  ASSERT(idx < capacity_);
+  intptr_t offset = idx * Sample::instance_size();
+  uint8_t* samples = reinterpret_cast<uint8_t*>(samples_);
+  return reinterpret_cast<Sample*>(samples + offset);
+}
+
+
 Sample* SampleBuffer::ReserveSample() {
   ASSERT(samples_ != NULL);
   uintptr_t cursor = AtomicOperations::FetchAndIncrement(&cursor_);
diff --git a/runtime/vm/profiler.h b/runtime/vm/profiler.h
index f9742b3..871d9ec 100644
--- a/runtime/vm/profiler.h
+++ b/runtime/vm/profiler.h
@@ -118,9 +118,6 @@
   DISALLOW_IMPLICIT_CONSTRUCTORS(SampleVisitor);
 };
 
-// The maximum number of stack frames a sample can hold.
-#define kSampleFramesSize 256
-
 // Each Sample holds a stack trace from an isolate.
 class Sample {
  public:
@@ -134,8 +131,9 @@
     sp_ = 0;
     fp_ = 0;
     state_ = 0;
-    for (intptr_t i = 0; i < kSampleFramesSize; i++) {
-      pcs_[i] = 0;
+    uword* pcs = GetPCArray();
+    for (intptr_t i = 0; i < pcs_length_; i++) {
+      pcs[i] = 0;
     }
   }
 
@@ -152,15 +150,17 @@
   // Get stack trace entry.
   uword At(intptr_t i) const {
     ASSERT(i >= 0);
-    ASSERT(i < kSampleFramesSize);
-    return pcs_[i];
+    ASSERT(i < pcs_length_);
+    uword* pcs = GetPCArray();
+    return pcs[i];
   }
 
   // Set stack trace entry.
   void SetAt(intptr_t i, uword pc) {
     ASSERT(i >= 0);
-    ASSERT(i < kSampleFramesSize);
-    pcs_[i] = pc;
+    ASSERT(i < pcs_length_);
+    uword* pcs = GetPCArray();
+    pcs[i] = pc;
   }
 
   uword vm_tag() const {
@@ -203,13 +203,18 @@
   }
 
   void InsertCallerForTopFrame(uword pc) {
+    if (pcs_length_ == 1) {
+      // Only sampling top frame.
+      return;
+    }
+    uword* pcs = GetPCArray();
     // The caller for the top frame is store at index 1.
     // Shift all entries down by one.
-    for (intptr_t i = kSampleFramesSize - 1; i >= 2; i--) {
-      pcs_[i] = pcs_[i - 1];
+    for (intptr_t i = pcs_length_ - 1; i >= 2; i--) {
+      pcs[i] = pcs[i - 1];
     }
     // Insert caller for top frame.
-    pcs_[1] = pc;
+    pcs[1] = pc;
   }
 
   bool processed() const {
@@ -228,7 +233,17 @@
     state_ = LeafFrameIsDart::update(leaf_frame_is_dart, state_);
   }
 
+  static void InitOnce();
+
+  static intptr_t instance_size() {
+    return instance_size_;
+  }
+
+  uword* GetPCArray() const;
+
  private:
+  static intptr_t instance_size_;
+  static intptr_t pcs_length_;
   enum StateBits {
     kProcessedBit = 0,
     kLeafFrameIsDartBit = 1,
@@ -245,7 +260,11 @@
   uword sp_;
   uword fp_;
   uword state_;
-  uword pcs_[kSampleFramesSize];
+
+  /* There are a variable number of words that follow, the words hold the
+   * sampled pc values. Access via GetPCArray() */
+
+  DISALLOW_COPY_AND_ASSIGN(Sample);
 };
 
 
@@ -254,11 +273,7 @@
  public:
   static const intptr_t kDefaultBufferCapacity = 120000;  // 2 minutes @ 1000hz.
 
-  explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity) {
-    samples_ = reinterpret_cast<Sample*>(calloc(capacity, sizeof(*samples_)));
-    capacity_ = capacity;
-    cursor_ = 0;
-  }
+  explicit SampleBuffer(intptr_t capacity = kDefaultBufferCapacity);
 
   ~SampleBuffer() {
     if (samples_ != NULL) {
@@ -271,14 +286,9 @@
 
   intptr_t capacity() const { return capacity_; }
 
+  Sample* At(intptr_t idx) const;
   Sample* ReserveSample();
 
-  Sample* At(intptr_t idx) const {
-    ASSERT(idx >= 0);
-    ASSERT(idx < capacity_);
-    return &samples_[idx];
-  }
-
   void VisitSamples(SampleVisitor* visitor) {
     ASSERT(visitor != NULL);
     const intptr_t length = capacity();
diff --git a/runtime/vm/raw_object.cc b/runtime/vm/raw_object.cc
index 675b725..4c06517 100644
--- a/runtime/vm/raw_object.cc
+++ b/runtime/vm/raw_object.cc
@@ -461,7 +461,7 @@
     uword entry_point = reinterpret_cast<uword>(obj->instructions_->ptr()) +
         Instructions::HeaderSize();
     for (intptr_t i = 0; i < length; i++) {
-      int32_t offset = obj->data_[i];
+      int32_t offset = obj->data()[i];
       visitor->VisitPointer(
           reinterpret_cast<RawObject**>(entry_point + offset));
     }
diff --git a/runtime/vm/raw_object.h b/runtime/vm/raw_object.h
index 8d2ca96..6dc181c 100644
--- a/runtime/vm/raw_object.h
+++ b/runtime/vm/raw_object.h
@@ -223,6 +223,12 @@
     SNAPSHOT_WRITER_SUPPORT()                                                  \
     HEAP_PROFILER_SUPPORT()                                                    \
 
+#define OPEN_ARRAY_START(type, align)                                          \
+  do {                                                                         \
+    const uword result = reinterpret_cast<uword>(this) + sizeof(*this);        \
+    ASSERT(Utils::IsAligned(result, sizeof(align)));                           \
+    return reinterpret_cast<type*>(result);                                    \
+  } while (0)
 
 // RawObject is the base class of all raw objects, even though it carries the
 // class_ field not all raw objects are allocated in the heap and thus cannot
@@ -510,11 +516,11 @@
   }
 
   cpp_vtable handle_vtable_;
-  intptr_t id_;  // Class Id, also index in the class table.
-  intptr_t token_pos_;
-  intptr_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
-  intptr_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
-  intptr_t next_field_offset_in_words_;  // Offset of the next instance field.
+  int32_t id_;  // Class Id, also index in the class table.
+  int32_t token_pos_;
+  int32_t instance_size_in_words_;  // Size if fixed len or 0 if variable len.
+  int32_t type_arguments_field_offset_in_words_;  // Offset of type args fld.
+  int32_t next_field_offset_in_words_;  // Offset of the next instance field.
   int16_t num_type_arguments_;  // Number of type arguments in flatten vector.
   int16_t num_own_type_arguments_;  // Number of non-overlapping type arguments.
   uint16_t num_native_fields_;  // Number of native fields in class.
@@ -539,7 +545,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->ident_);
   }
-  intptr_t token_pos_;
+  int32_t token_pos_;
 };
 
 
@@ -558,9 +564,11 @@
   RawSmi* length_;
 
   // Variable length data follows here.
-  RawAbstractType* types_[0];
+  RawAbstractType** types() {
+    OPEN_ARRAY_START(RawAbstractType*, RawAbstractType*);
+  }
   RawObject** to(intptr_t length) {
-    return reinterpret_cast<RawObject**>(&ptr()->types_[length - 1]);
+    return reinterpret_cast<RawObject**>(&ptr()->types()[length - 1]);
   }
 
   friend class SnapshotReader;
@@ -616,18 +624,23 @@
   RawArray* parameter_types_;
   RawArray* parameter_names_;
   RawObject* data_;  // Additional data specific to the function kind.
+  RawObject** to_snapshot() {
+    return reinterpret_cast<RawObject**>(&ptr()->data_);
+  }
+  // Fields below are not part of the snapshot.
+  RawArray* ic_data_array_;  // ICData of unoptimized code.
+  RawObject** to_no_code() {
+    return reinterpret_cast<RawObject**>(&ptr()->ic_data_array_);
+  }
   RawInstructions* instructions_;  // Instructions of currently active code.
   RawCode* unoptimized_code_;  // Unoptimized code, keep it after optimization.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->unoptimized_code_);
   }
-  RawObject** to_no_code() {
-    return reinterpret_cast<RawObject**>(&ptr()->data_);
-  }
 
-  intptr_t token_pos_;
-  intptr_t end_token_pos_;
-  intptr_t usage_counter_;  // Incremented while function is running.
+  int32_t token_pos_;
+  int32_t end_token_pos_;
+  int32_t usage_counter_;  // Incremented while function is running.
   int16_t num_fixed_parameters_;
   int16_t num_optional_parameters_;  // > 0: positional; < 0: named.
   int16_t deoptimization_counter_;
@@ -685,10 +698,10 @@
     return reinterpret_cast<RawObject**>(&ptr()->guarded_list_length_);
   }
 
-  intptr_t token_pos_;
-  intptr_t guarded_cid_;
-  intptr_t is_nullable_;  // kNullCid if field can contain null value and
-                          // any other value otherwise.
+  int32_t token_pos_;
+  int32_t guarded_cid_;
+  int32_t is_nullable_;  // kNullCid if field can contain null value and
+                         // any other value otherwise.
   // Offset to the guarded length field inside an instance of class matching
   // guarded_cid_. Stored corrected by -kHeapObjectTag to simplify code
   // generated on platforms with weak addressing modes (ARM, MIPS).
@@ -750,8 +763,8 @@
   RawTokenStream* tokens_;
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->tokens_); }
 
-  intptr_t line_offset_;
-  intptr_t col_offset_;
+  int32_t line_offset_;
+  int32_t col_offset_;
   int8_t kind_;  // Of type Kind.
 };
 
@@ -759,6 +772,7 @@
 class RawLibrary : public RawObject {
   enum LibraryState {
     kAllocated,       // Initial state.
+    kLoadRequested,   // Compiler or script requested load of library.
     kLoadInProgress,  // Library is in the process of being loaded.
     kLoaded,          // Library is loaded.
     kLoadError,       // Error occurred during load of the Library.
@@ -782,9 +796,9 @@
     return reinterpret_cast<RawObject**>(&ptr()->loaded_scripts_);
   }
 
-  intptr_t index_;               // Library id number.
-  intptr_t num_imports_;         // Number of entries in imports_.
-  intptr_t num_anonymous_;       // Number of entries in anonymous_classes_.
+  int32_t index_;               // Library id number.
+  int32_t num_imports_;         // Number of entries in imports_.
+  int32_t num_anonymous_;       // Number of entries in anonymous_classes_.
   Dart_NativeEntryResolver native_entry_resolver_;  // Resolves natives.
   Dart_NativeEntrySymbol native_entry_symbol_resolver_;
   bool corelib_imported_;
@@ -850,7 +864,7 @@
   intptr_t lazy_deopt_pc_offset_;
 
   // Variable length data follows here.
-  int32_t data_[0];
+  int32_t* data() { OPEN_ARRAY_START(int32_t, int32_t); }
 
   friend class StackFrame;
   friend class MarkingVisitor;
@@ -872,7 +886,7 @@
   intptr_t size_;
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   // Private helper function used while visiting stack frames. The
   // code which iterates over dart frames is also called during GC and
@@ -892,8 +906,16 @@
 
   intptr_t length_;  // Number of descriptors.
 
+  struct PcDescriptorRec {
+    uword pc;
+    int32_t deopt_id;
+    int32_t token_pos;  // Or deopt reason.
+    int16_t try_index;  // Or deopt index.
+    int8_t kind;
+  };
+
   // Variable length data follows here.
-  intptr_t data_[0];
+  PcDescriptorRec* data() { OPEN_ARRAY_START(PcDescriptorRec, intptr_t); }
 
   friend class Object;
 };
@@ -917,7 +939,7 @@
   uword pc_;  // PC corresponding to this stack map representation.
 
   // Variable length data follows here (bitmap of the stack layout).
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 };
 
 
@@ -933,10 +955,10 @@
 
   struct VarInfo {
     intptr_t index;      // Slot index on stack or in context.
-    int8_t   kind;       // Entry kind of type VarInfoKind.
-    int16_t  scope_id;   // Scope to which the variable belongs.
     intptr_t begin_pos;  // Token position of scope start.
     intptr_t end_pos;    // Token position of scope end.
+    int16_t  scope_id;   // Scope to which the variable belongs.
+    int8_t   kind;       // Entry kind of type VarInfoKind.
   };
 
  private:
@@ -944,7 +966,8 @@
   intptr_t length_;  // Number of descriptors.
   RawArray* names_;  // Array of [length_] variable names.
 
-  VarInfo data_[0];   // Variable info with [length_] entries.
+  // Variable info with [length_] entries.
+  VarInfo* data() { OPEN_ARRAY_START(VarInfo, intptr_t); }
 };
 
 
@@ -958,6 +981,7 @@
     int8_t needs_stacktrace;   // True if a stacktrace is needed.
     int8_t has_catch_all;      // Catches all exceptions.
   };
+
  private:
   RAW_HEAP_OBJECT_IMPLEMENTATION(ExceptionHandlers);
 
@@ -969,7 +993,7 @@
   RawArray* handled_types_data_;
 
   // Exception handler info of length [length_].
-  HandlerInfo data_[0];
+  HandlerInfo* data() { OPEN_ARRAY_START(HandlerInfo, intptr_t); }
 };
 
 
@@ -981,7 +1005,7 @@
   RawSmi* length_;  // Number of deoptimization commands
 
   // Variable length data follows here.
-  intptr_t data_[0];
+  intptr_t* data() { OPEN_ARRAY_START(intptr_t, intptr_t); }
 };
 
 
@@ -995,9 +1019,9 @@
   RawContext* parent_;
 
   // Variable length data follows here.
-  RawInstance* data_[0];
+  RawInstance** data() { OPEN_ARRAY_START(RawInstance*, RawInstance*); }
   RawObject** to(intptr_t num_vars) {
-    return reinterpret_cast<RawObject**>(&ptr()->data_[num_vars - 1]);
+    return reinterpret_cast<RawObject**>(&ptr()->data()[num_vars - 1]);
   }
 
   friend class SnapshotReader;
@@ -1024,12 +1048,14 @@
 
   intptr_t num_variables_;
 
+  RawObject** from() {
+    return reinterpret_cast<RawObject**>(&ptr()->data()[0]);
+  }
   // Variable length data follows here.
-  RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->data_[0]); }
-  RawObject* data_[0];
+  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
   RawObject** to(intptr_t num_vars) {
-    intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
-    return reinterpret_cast<RawObject**>(&ptr()->data_[data_length - 1]);
+    const intptr_t data_length = num_vars * (sizeof(VariableDesc)/kWordSize);
+    return reinterpret_cast<RawObject**>(&ptr()->data()[data_length - 1]);
   }
 };
 
@@ -1065,7 +1091,7 @@
     return reinterpret_cast<RawObject**>(&ptr()->mask_);
   }
 
-  intptr_t filled_entry_count_;
+  int32_t filled_entry_count_;
 };
 
 
@@ -1106,7 +1132,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->formatted_message_);
   }
-  intptr_t token_pos_;  // Source position in script_.
+  int32_t token_pos_;  // Source position in script_.
   int8_t kind_;  // Of type LanguageError::Kind.
 };
 
@@ -1149,12 +1175,13 @@
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->name_); }
   RawString* name_;               // Library prefix name.
   RawArray* imports_;             // Libraries imported with this prefix.
+  RawLibrary* importer_;          // Library which declares this prefix.
   RawArray* dependent_code_;      // Code that refers to deferred, unloaded
                                   // library prefix.
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->dependent_code_);
   }
-  intptr_t num_imports_;          // Number of library entries in libraries_.
+  int32_t num_imports_;          // Number of library entries in libraries_.
   bool is_deferred_load_;
   bool is_loaded_;
 };
@@ -1190,7 +1217,7 @@
   RawObject** to() {
     return reinterpret_cast<RawObject**>(&ptr()->error_);
   }
-  intptr_t token_pos_;
+  int32_t token_pos_;
   int8_t type_state_;
 };
 
@@ -1220,8 +1247,8 @@
   RawString* name_;
   RawAbstractType* bound_;  // ObjectType if no explicit bound specified.
   RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->bound_); }
-  intptr_t index_;
-  intptr_t token_pos_;
+  int32_t index_;
+  int32_t token_pos_;
   int8_t type_state_;
 };
 
@@ -1297,7 +1324,7 @@
 
   // A sequence of Chunks (typedef in Bignum) representing bignum digits.
   // Bignum::Chunk chunks_[Utils::Abs(signed_length_)];
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   friend class SnapshotReader;
 };
@@ -1328,7 +1355,7 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(OneByteString);
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 
   friend class ApiMessageReader;
   friend class SnapshotReader;
@@ -1339,7 +1366,7 @@
   RAW_HEAP_OBJECT_IMPLEMENTATION(TwoByteString);
 
   // Variable length data follows here.
-  uint16_t data_[0];
+  uint16_t* data() { OPEN_ARRAY_START(uint16_t, uint16_t); }
 
   friend class SnapshotReader;
 };
@@ -1401,10 +1428,7 @@
   RawTypeArguments* type_arguments_;
   RawSmi* length_;
   // Variable length data follows here.
-  RawObject** data() {
-    uword address_of_length = reinterpret_cast<uword>(&length_);
-    return reinterpret_cast<RawObject**>(address_of_length + kWordSize);
-  }
+  RawObject** data() { OPEN_ARRAY_START(RawObject*, RawObject*); }
   RawObject** to(intptr_t length) {
     return reinterpret_cast<RawObject**>(&ptr()->data()[length - 1]);
   }
@@ -1501,10 +1525,9 @@
  protected:
   RawObject** from() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
   RawSmi* length_;
-  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
-
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
+  RawObject** to() { return reinterpret_cast<RawObject**>(&ptr()->length_); }
 
   friend class Api;
   friend class Object;
@@ -1595,7 +1618,7 @@
   intptr_t flags_;  // Represents global/local, case insensitive, multiline.
 
   // Variable length data follows here.
-  uint8_t data_[0];
+  uint8_t* data() { OPEN_ARRAY_START(uint8_t, uint8_t); }
 };
 
 
diff --git a/runtime/vm/raw_object_snapshot.cc b/runtime/vm/raw_object_snapshot.cc
index e3c8a93..d5811c0 100644
--- a/runtime/vm/raw_object_snapshot.cc
+++ b/runtime/vm/raw_object_snapshot.cc
@@ -39,7 +39,7 @@
   if ((kind == Snapshot::kFull) ||
       (kind == Snapshot::kScript && !RawObject::IsCreatedFromSnapshot(tags))) {
     // Read in the base information.
-    intptr_t class_id = reader->ReadIntptrValue();
+    int32_t class_id = reader->Read<int32_t>();
 
     // Allocate class object of specified kind.
     if (kind == Snapshot::kFull) {
@@ -60,14 +60,14 @@
     // Set all non object fields.
     if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
       // Instance size of a VM defined class is already set up.
-      cls.set_instance_size_in_words(reader->ReadIntptrValue());
-      cls.set_next_field_offset_in_words(reader->ReadIntptrValue());
+      cls.set_instance_size_in_words(reader->Read<int32_t>());
+      cls.set_next_field_offset_in_words(reader->Read<int32_t>());
     }
-    cls.set_type_arguments_field_offset_in_words(reader->ReadIntptrValue());
+    cls.set_type_arguments_field_offset_in_words(reader->Read<int32_t>());
     cls.set_num_type_arguments(reader->Read<int16_t>());
     cls.set_num_own_type_arguments(reader->Read<int16_t>());
     cls.set_num_native_fields(reader->Read<uint16_t>());
-    cls.set_token_pos(reader->ReadIntptrValue());
+    cls.set_token_pos(reader->Read<int32_t>());
     cls.set_state_bits(reader->Read<uint16_t>());
 
     // Set all the object fields.
@@ -97,24 +97,24 @@
        !RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this)))) {
     // Write out the class and tags information.
     writer->WriteVMIsolateObject(kClassCid);
-    writer->WriteIntptrValue(writer->GetObjectTags(this));
+    writer->WriteTags(writer->GetObjectTags(this));
 
     // Write out all the non object pointer fields.
     // NOTE: cpp_vtable_ is not written.
-    intptr_t class_id = ptr()->id_;
-    writer->WriteIntptrValue(class_id);
+    int32_t class_id = ptr()->id_;
+    writer->Write<int32_t>(class_id);
     if (!RawObject::IsInternalVMdefinedClassId(class_id)) {
       // We don't write the instance size of VM defined classes as they
       // are already setup during initialization as part of pre populating
       // the class table.
-      writer->WriteIntptrValue(ptr()->instance_size_in_words_);
-      writer->WriteIntptrValue(ptr()->next_field_offset_in_words_);
+      writer->Write<int32_t>(ptr()->instance_size_in_words_);
+      writer->Write<int32_t>(ptr()->next_field_offset_in_words_);
     }
-    writer->WriteIntptrValue(ptr()->type_arguments_field_offset_in_words_);
+    writer->Write<int32_t>(ptr()->type_arguments_field_offset_in_words_);
     writer->Write<int16_t>(ptr()->num_type_arguments_);
     writer->Write<int16_t>(ptr()->num_own_type_arguments_);
     writer->Write<uint16_t>(ptr()->num_native_fields_);
-    writer->WriteIntptrValue(ptr()->token_pos_);
+    writer->Write<int32_t>(ptr()->token_pos_);
     writer->Write<uint16_t>(ptr()->state_bits_);
 
     // Write out all the object pointer fields.
@@ -141,7 +141,7 @@
   unresolved_class.set_tags(tags);
 
   // Set all non object fields.
-  unresolved_class.set_token_pos(reader->ReadIntptrValue());
+  unresolved_class.set_token_pos(reader->Read<int32_t>());
 
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
@@ -167,10 +167,10 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kUnresolvedClassCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -205,7 +205,7 @@
   reader->AddBackRef(object_id, &type, kIsDeserialized);
 
   // Set all non object fields.
-  type.set_token_pos(reader->ReadIntptrValue());
+  type.set_token_pos(reader->Read<int32_t>());
   type.set_type_state(reader->Read<int8_t>());
 
   // Set all the object fields.
@@ -253,10 +253,10 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<int8_t>(ptr()->type_state_);
 
   // Write out all the object pointer fields. Since we will be canonicalizing
@@ -305,7 +305,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeRefCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -328,8 +328,8 @@
   type_parameter.set_tags(tags);
 
   // Set all non object fields.
-  type_parameter.set_index(reader->ReadIntptrValue());
-  type_parameter.set_token_pos(reader->ReadIntptrValue());
+  type_parameter.set_index(reader->Read<int32_t>());
+  type_parameter.set_token_pos(reader->Read<int32_t>());
   type_parameter.set_type_state(reader->Read<int8_t>());
 
   // Set all the object fields.
@@ -360,11 +360,11 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kTypeParameterCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object pointer fields.
-  writer->WriteIntptrValue(ptr()->index_);
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->index_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<int8_t>(ptr()->type_state_);
 
   // Write out all the object pointer fields.
@@ -412,7 +412,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kBoundedTypeCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -497,7 +497,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kTypeArgumentsCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -510,7 +510,7 @@
   // Write out the individual types.
   intptr_t len = Smi::Value(ptr()->length_);
   for (intptr_t i = 0; i < len; i++) {
-    writer->WriteObjectImpl(ptr()->types_[i]);
+    writer->WriteObjectImpl(ptr()->types()[i]);
   }
 }
 
@@ -557,7 +557,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kPatchClassCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
   visitor.VisitPointers(from(), to());
@@ -606,7 +606,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kClosureDataCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Context scope.
   // We don't write the context scope in the snapshot.
@@ -666,7 +666,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kRedirectionDataCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -692,12 +692,12 @@
   func.set_tags(tags);
 
   // Set all the non object fields.
-  func.set_token_pos(reader->ReadIntptrValue());
-  func.set_end_token_pos(reader->ReadIntptrValue());
-  func.set_usage_counter(reader->ReadIntptrValue());
-  func.set_num_fixed_parameters(reader->ReadIntptrValue());
-  func.set_num_optional_parameters(reader->ReadIntptrValue());
-  func.set_deoptimization_counter(reader->ReadIntptrValue());
+  func.set_token_pos(reader->Read<int32_t>());
+  func.set_end_token_pos(reader->Read<int32_t>());
+  func.set_usage_counter(reader->Read<int32_t>());
+  func.set_num_fixed_parameters(reader->Read<int16_t>());
+  func.set_num_optional_parameters(reader->Read<int16_t>());
+  func.set_deoptimization_counter(reader->Read<int16_t>());
   func.set_kind_tag(reader->Read<uint16_t>());
   func.set_optimized_instruction_count(reader->Read<uint16_t>());
   func.set_optimized_call_site_count(reader->Read<uint16_t>());
@@ -705,14 +705,14 @@
   // Set all the object fields.
   // TODO(5411462): Need to assert No GC can happen here, even though
   // allocations may happen.
-  intptr_t num_flds = (func.raw()->to() - func.raw()->from());
+  intptr_t num_flds = (func.raw()->to_snapshot() - func.raw()->from());
   for (intptr_t i = 0; i <= num_flds; i++) {
     *(func.raw()->from() + i) = reader->ReadObjectRef();
   }
 
-  // Set up code pointer with the lazy-compile-stub.
-  func.SetInstructions(Code::Handle(StubCode::LazyCompile_entry()->code()));
-
+  // Initialize all fields that are not part of the snapshot.
+  func.ClearCode();
+  func.set_ic_data_array(Array::Handle());
   return func.raw();
 }
 
@@ -730,26 +730,22 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kFunctionCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
-  writer->WriteIntptrValue(ptr()->end_token_pos_);
-  writer->WriteIntptrValue(ptr()->usage_counter_);
-  writer->WriteIntptrValue(ptr()->num_fixed_parameters_);
-  writer->WriteIntptrValue(ptr()->num_optional_parameters_);
-  writer->WriteIntptrValue(ptr()->deoptimization_counter_);
+  writer->Write<int32_t>(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->end_token_pos_);
+  writer->Write<int32_t>(ptr()->usage_counter_);
+  writer->Write<int16_t>(ptr()->num_fixed_parameters_);
+  writer->Write<int16_t>(ptr()->num_optional_parameters_);
+  writer->Write<int16_t>(ptr()->deoptimization_counter_);
   writer->Write<uint16_t>(ptr()->kind_tag_);
   writer->Write<uint16_t>(ptr()->optimized_instruction_count_);
   writer->Write<uint16_t>(ptr()->optimized_call_site_count_);
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
-  visitor.VisitPointers(from(), to_no_code());
-
-  // Write null for the instructions and unoptimized code.
-  writer->WriteVMIsolateObject(kNullObject);
-  writer->WriteVMIsolateObject(kNullObject);
+  visitor.VisitPointers(from(), to_snapshot());
 }
 
 
@@ -770,9 +766,9 @@
   field.set_tags(tags);
 
   // Set all non object fields.
-  field.set_token_pos(reader->ReadIntptrValue());
-  field.set_guarded_cid(reader->ReadIntptrValue());
-  field.set_is_nullable(reader->ReadIntptrValue());
+  field.set_token_pos(reader->Read<int32_t>());
+  field.set_guarded_cid(reader->Read<int32_t>());
+  field.set_is_nullable(reader->Read<int32_t>());
   field.set_kind_bits(reader->Read<uint8_t>());
 
   // Set all the object fields.
@@ -802,12 +798,12 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kFieldCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
-  writer->WriteIntptrValue(ptr()->guarded_cid_);
-  writer->WriteIntptrValue(ptr()->is_nullable_);
+  writer->Write<int32_t>(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->guarded_cid_);
+  writer->Write<int32_t>(ptr()->is_nullable_);
   writer->Write<uint8_t>(ptr()->kind_bits_);
 
   // Write out all the object pointer fields.
@@ -854,7 +850,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLiteralTokenCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the kind field.
   writer->Write<intptr_t>(ptr()->kind_);
@@ -917,7 +913,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kTokenStreamCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the length field and the token stream.
   RawExternalTypedData* stream = ptr()->stream_;
@@ -981,7 +977,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kScriptCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   writer->WriteObjectImpl(ptr()->url_);
@@ -1016,9 +1012,9 @@
     library.set_tags(tags);
 
     // Set all non object fields.
-    library.raw_ptr()->index_ = reader->ReadIntptrValue();
-    library.raw_ptr()->num_imports_ = reader->ReadIntptrValue();
-    library.raw_ptr()->num_anonymous_ = reader->ReadIntptrValue();
+    library.raw_ptr()->index_ = reader->Read<int32_t>();
+    library.raw_ptr()->num_imports_ = reader->Read<int32_t>();
+    library.raw_ptr()->num_anonymous_ = reader->Read<int32_t>();
     library.raw_ptr()->corelib_imported_ = reader->Read<bool>();
     library.raw_ptr()->is_dart_scheme_ = reader->Read<bool>();
     library.raw_ptr()->debuggable_ = reader->Read<bool>();
@@ -1062,7 +1058,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLibraryCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   if ((kind == Snapshot::kScript) &&
       RawObject::IsCreatedFromSnapshot(writer->GetObjectTags(this))) {
@@ -1071,9 +1067,9 @@
     writer->WriteObjectImpl(ptr()->url_);
   } else {
     // Write out all non object fields.
-    writer->WriteIntptrValue(ptr()->index_);
-    writer->WriteIntptrValue(ptr()->num_imports_);
-    writer->WriteIntptrValue(ptr()->num_anonymous_);
+    writer->Write<int32_t>(ptr()->index_);
+    writer->Write<int32_t>(ptr()->num_imports_);
+    writer->Write<int32_t>(ptr()->num_anonymous_);
     writer->Write<bool>(ptr()->corelib_imported_);
     writer->Write<bool>(ptr()->is_dart_scheme_);
     writer->Write<bool>(ptr()->debuggable_);
@@ -1113,7 +1109,7 @@
   prefix.set_tags(tags);
 
   // Set all non object fields.
-  prefix.raw_ptr()->num_imports_ = reader->ReadIntptrValue();
+  prefix.raw_ptr()->num_imports_ = reader->Read<int32_t>();
   prefix.raw_ptr()->is_deferred_load_ = reader->Read<bool>();
   prefix.raw_ptr()->is_loaded_ = reader->Read<bool>();
 
@@ -1142,10 +1138,10 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kLibraryPrefixCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all non object fields.
-  writer->WriteIntptrValue(ptr()->num_imports_);
+  writer->Write<int32_t>(ptr()->num_imports_);
   writer->Write<bool>(ptr()->is_deferred_load_);
   writer->Write<bool>(ptr()->is_loaded_);
 
@@ -1197,7 +1193,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kNamespaceCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -1365,7 +1361,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kContextCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out num of variables in the context.
   writer->WriteIntptrValue(ptr()->num_variables_);
@@ -1496,7 +1492,7 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kApiErrorCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the object pointer fields.
   SnapshotWriterVisitor visitor(writer);
@@ -1519,7 +1515,7 @@
   language_error.set_tags(tags);
 
   // Set all non object fields.
-  language_error.set_token_pos(reader->ReadIntptrValue());
+  language_error.set_token_pos(reader->Read<int32_t>());
   language_error.set_kind(reader->Read<uint8_t>());
 
   // Set all the object fields.
@@ -1547,10 +1543,10 @@
 
   // Write out the class and tags information.
   writer->WriteVMIsolateObject(kLanguageErrorCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the non object fields.
-  writer->WriteIntptrValue(ptr()->token_pos_);
+  writer->Write<int32_t>(ptr()->token_pos_);
   writer->Write<uint8_t>(ptr()->kind_);
 
   // Write out all the object pointer fields.
@@ -1636,7 +1632,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kInstanceCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 }
 
 
@@ -1686,7 +1682,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kMintCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the 64 bit value.
   writer->Write<int64_t>(ptr()->value_);
@@ -1744,7 +1740,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kBigintCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the bigint value as a HEXCstring.
   intptr_t length = ptr()->signed_length_;
@@ -1820,7 +1816,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kDoubleCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the double value.
   writer->WriteDouble(ptr()->value_);
@@ -1950,7 +1946,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(class_id);
-  writer->WriteIntptrValue(tags);
+  writer->WriteTags(tags);
 
   // Write out the length field.
   writer->Write<RawObject*>(length);
@@ -1981,7 +1977,7 @@
                 writer->GetObjectTags(this),
                 ptr()->length_,
                 ptr()->hash_,
-                ptr()->data_);
+                ptr()->data());
 }
 
 
@@ -1995,7 +1991,7 @@
                 writer->GetObjectTags(this),
                 ptr()->length_,
                 ptr()->hash_,
-                ptr()->data_);
+                ptr()->data());
 }
 
 
@@ -2166,7 +2162,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kGrowableObjectArrayCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the used length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -2212,7 +2208,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kFloat32x4Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the float values.
   writer->Write<float>(ptr()->value_[0]);
@@ -2258,7 +2254,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kInt32x4Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the mask values.
   writer->Write<uint32_t>(ptr()->value_[0]);
@@ -2302,7 +2298,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kFloat64x2Cid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the float values.
   writer->Write<double>(ptr()->value_[0]);
@@ -2381,13 +2377,13 @@
   ASSERT(kind != Snapshot::kFull);
   intptr_t cid = RawObject::ClassIdTag::decode(tags);
   intptr_t length = reader->ReadSmiValue();
-  uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadIntptrValue());
+  uint8_t* data = reinterpret_cast<uint8_t*>(reader->ReadRawPointerValue());
   const ExternalTypedData& obj = ExternalTypedData::Handle(
       ExternalTypedData::New(cid, data, length));
-  void* peer = reinterpret_cast<void*>(reader->ReadIntptrValue());
+  void* peer = reinterpret_cast<void*>(reader->ReadRawPointerValue());
   Dart_WeakPersistentHandleFinalizer callback =
       reinterpret_cast<Dart_WeakPersistentHandleFinalizer>(
-          reader->ReadIntptrValue());
+          reader->ReadRawPointerValue());
   obj.AddFinalizer(peer, callback);
   return obj.raw();
 }
@@ -2395,7 +2391,7 @@
 
 #define TYPED_DATA_WRITE(type)                                                 \
   {                                                                            \
-    type* data = reinterpret_cast<type*>(ptr()->data_);                        \
+    type* data = reinterpret_cast<type*>(ptr()->data());                       \
     for (intptr_t i = 0; i < len; i++) {                                       \
       writer->Write(data[i]);                                                  \
     }                                                                          \
@@ -2415,7 +2411,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(cid);
-  writer->WriteIntptrValue(tags);
+  writer->WriteTags(tags);
 
   // Write out the length field.
   writer->Write<RawObject*>(ptr()->length_);
@@ -2425,7 +2421,7 @@
     case kTypedDataInt8ArrayCid:
     case kTypedDataUint8ArrayCid:
     case kTypedDataUint8ClampedArrayCid: {
-      uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data_);
+      uint8_t* data = reinterpret_cast<uint8_t*>(ptr()->data());
       writer->WriteBytes(data, len);
       break;
     }
@@ -2459,11 +2455,20 @@
 }
 
 
+#define TYPED_EXT_DATA_WRITE(type)                                             \
+  {                                                                            \
+    type* data = reinterpret_cast<type*>(ptr()->data_);                        \
+    for (intptr_t i = 0; i < len; i++) {                                       \
+      writer->Write(data[i]);                                                  \
+    }                                                                          \
+  }                                                                            \
+
+
 #define EXT_TYPED_DATA_WRITE(cid, type)                                        \
   writer->WriteIndexedObject(cid);                                             \
-  writer->WriteIntptrValue(RawObject::ClassIdTag::update(cid, tags));          \
+  writer->WriteTags(RawObject::ClassIdTag::update(cid, tags));                 \
   writer->Write<RawObject*>(ptr()->length_);                                   \
-  TYPED_DATA_WRITE(type)                                                       \
+  TYPED_EXT_DATA_WRITE(type)                                                   \
 
 
 void RawExternalTypedData::WriteTo(SnapshotWriter* writer,
@@ -2579,7 +2584,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kSendPortCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   writer->Write(ptr()->id_);
 }
@@ -2631,7 +2636,7 @@
 
     // Write out the class and tags information.
     writer->WriteIndexedObject(kStacktraceCid);
-    writer->WriteIntptrValue(writer->GetObjectTags(this));
+    writer->WriteTags(writer->GetObjectTags(this));
 
     // Write out all the object pointer fields.
     SnapshotWriterVisitor visitor(writer);
@@ -2689,7 +2694,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kJSRegExpCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out the data length field.
   writer->Write<RawObject*>(ptr()->data_length_);
@@ -2736,7 +2741,7 @@
 
   // Write out the class and tags information.
   writer->WriteIndexedObject(kWeakPropertyCid);
-  writer->WriteIntptrValue(writer->GetObjectTags(this));
+  writer->WriteTags(writer->GetObjectTags(this));
 
   // Write out all the other fields.
   writer->Write<RawObject*>(ptr()->key_);
diff --git a/runtime/vm/report.cc b/runtime/vm/report.cc
new file mode 100644
index 0000000..9c1b811
--- /dev/null
+++ b/runtime/vm/report.cc
@@ -0,0 +1,243 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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/report.h"
+
+#include "vm/code_patcher.h"
+#include "vm/exceptions.h"
+#include "vm/flags.h"
+#include "vm/longjump.h"
+#include "vm/object.h"
+#include "vm/stack_frame.h"
+#include "vm/symbols.h"
+
+namespace dart {
+
+DEFINE_FLAG(int, stacktrace_depth_on_warning, 5,
+            "Maximal number of stack frames to print after a runtime warning.");
+DEFINE_FLAG(bool, silent_warnings, false, "Silence warnings.");
+DEFINE_FLAG(bool, warn_on_javascript_compatibility, false,
+            "Warn on incompatibilities between vm and dart2js.");
+DEFINE_FLAG(bool, warning_as_error, false, "Treat warnings as errors.");
+
+
+RawString* Report::PrependSnippet(Kind kind,
+                                  const Script& script,
+                                  intptr_t token_pos,
+                                  const String& message) {
+  const char* message_header;
+  switch (kind) {
+    case kWarning: message_header = "warning"; break;
+    case kJSWarning: message_header = "javascript compatibility warning"; break;
+    case kError: message_header = "error"; break;
+    case kMalformedType: message_header = "malformed type"; break;
+    case kMalboundedType: message_header = "malbounded type"; break;
+    case kBailout: message_header = "bailout"; break;
+    default: message_header = ""; UNREACHABLE();
+  }
+  String& result = String::Handle();
+  if (!script.IsNull()) {
+    const String& script_url = String::Handle(script.url());
+    if (token_pos >= 0) {
+      intptr_t line, column;
+      script.GetTokenLocation(token_pos, &line, &column);
+      // Only report the line position if we have the original source. We still
+      // need to get a valid column so that we can report the ^ mark below the
+      // snippet.
+      if (script.HasSource()) {
+        result = String::NewFormatted("'%s': %s: line %" Pd " pos %" Pd ": ",
+                                      script_url.ToCString(),
+                                      message_header,
+                                      line,
+                                      column);
+      } else {
+        result = String::NewFormatted("'%s': %s: line %" Pd ": ",
+                                      script_url.ToCString(),
+                                      message_header,
+                                      line);
+      }
+      // Append the formatted error or warning message.
+      result = String::Concat(result, message);
+      // Append the source line.
+      const String& script_line = String::Handle(script.GetLine(line));
+      ASSERT(!script_line.IsNull());
+      result = String::Concat(result, Symbols::NewLine());
+      result = String::Concat(result, script_line);
+      result = String::Concat(result, Symbols::NewLine());
+      // Append the column marker.
+      const String& column_line = String::Handle(
+          String::NewFormatted("%*s\n", static_cast<int>(column), "^"));
+      result = String::Concat(result, column_line);
+    } else {
+      // Token position is unknown.
+      result = String::NewFormatted("'%s': %s: ",
+                                    script_url.ToCString(),
+                                    message_header);
+      result = String::Concat(result, message);
+    }
+  } else {
+    // Script is unknown.
+    // Append the formatted error or warning message.
+    result = String::NewFormatted("%s: ", message_header);
+    result = String::Concat(result, message);
+  }
+  return result.raw();
+}
+
+
+void Report::LongJump(const Error& error) {
+  Isolate::Current()->long_jump_base()->Jump(1, error);
+  UNREACHABLE();
+}
+
+
+void Report::LongJumpF(const Error& prev_error,
+                       const Script& script, intptr_t token_pos,
+                       const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  LongJumpV(prev_error, script, token_pos, format, args);
+  va_end(args);
+  UNREACHABLE();
+}
+
+
+void Report::LongJumpV(const Error& prev_error,
+                       const Script& script, intptr_t token_pos,
+                       const char* format, va_list args) {
+  const Error& error = Error::Handle(LanguageError::NewFormattedV(
+      prev_error, script, token_pos,
+      kError, Heap::kNew,
+      format, args));
+  LongJump(error);
+  UNREACHABLE();
+}
+
+
+void Report::MessageF(Kind kind, const Script& script, intptr_t token_pos,
+                      const char* format, ...) {
+  va_list args;
+  va_start(args, format);
+  MessageV(kind, script, token_pos, format, args);
+  va_end(args);
+}
+
+
+void Report::MessageV(Kind kind, const Script& script, intptr_t token_pos,
+                      const char* format, va_list args) {
+  if (kind < kError) {
+    // Reporting a warning.
+    if (FLAG_silent_warnings) {
+      return;
+    }
+    if (!FLAG_warning_as_error) {
+      const String& msg = String::Handle(String::NewFormattedV(format, args));
+      const String& snippet_msg = String::Handle(
+          PrependSnippet(kind, script, token_pos, msg));
+      OS::Print("%s", snippet_msg.ToCString());
+      if (kind == kJSWarning) {
+        TraceJSWarning(script, token_pos, msg);
+        // Do not print stacktrace if we have not executed Dart code yet.
+        if (Isolate::Current()->top_exit_frame_info() != 0) {
+          const Stacktrace& stacktrace =
+              Stacktrace::Handle(Exceptions::CurrentStacktrace());
+          intptr_t idx = 0;
+          OS::Print("%s", stacktrace.ToCStringInternal(
+              &idx, FLAG_stacktrace_depth_on_warning));
+        }
+      }
+      return;
+    }
+  }
+  // Reporting an error (or a warning as error).
+  const Error& error = Error::Handle(
+      LanguageError::NewFormattedV(Error::Handle(),  // No previous error.
+                                   script, token_pos,
+                                   kind, Heap::kNew,
+                                   format, args));
+  if (kind == kJSWarning) {
+    Exceptions::ThrowJavascriptCompatibilityError(error.ToErrorCString());
+    UNREACHABLE();
+  }
+  LongJump(error);
+  UNREACHABLE();
+}
+
+
+void Report::JSWarningFromNative(bool is_static_native, const char* msg) {
+  DartFrameIterator iterator;
+  iterator.NextFrame();  // Skip native call.
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  const Code& caller_code = Code::Handle(caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  ICData& ic_data = ICData::Handle();
+  if (is_static_native) {
+    // Assume an unoptimized static call. Optimization was prevented.
+    CodePatcher::GetUnoptimizedStaticCallAt(caller_pc, caller_code, &ic_data);
+  } else {
+    // Assume an instance call.
+    CodePatcher::GetInstanceCallAt(caller_pc, caller_code, &ic_data);
+  }
+  ASSERT(!ic_data.IsNull());
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    Report::JSWarningFromFrame(caller_frame, msg);
+  }
+}
+
+
+void Report::JSWarningFromIC(const ICData& ic_data, const char* msg) {
+  DartFrameIterator iterator;
+  StackFrame* caller_frame = iterator.NextFrame();
+  ASSERT(caller_frame != NULL);
+  // Report warning only if not already reported at this location.
+  if (!ic_data.IssuedJSWarning()) {
+    ic_data.SetIssuedJSWarning();
+    JSWarningFromFrame(caller_frame, msg);
+  }
+}
+
+
+void Report::JSWarningFromFrame(StackFrame* caller_frame, const char* msg) {
+  ASSERT(caller_frame != NULL);
+  ASSERT(FLAG_warn_on_javascript_compatibility);
+  if (FLAG_silent_warnings) return;
+  Isolate* isolate = Isolate::Current();
+  const Code& caller_code = Code::Handle(isolate,
+                                         caller_frame->LookupDartCode());
+  ASSERT(!caller_code.IsNull());
+  const uword caller_pc = caller_frame->pc();
+  const intptr_t token_pos = caller_code.GetTokenIndexOfPC(caller_pc);
+  const Function& caller = Function::Handle(isolate, caller_code.function());
+  const Script& script = Script::Handle(isolate, caller.script());
+  MessageF(kJSWarning, script, token_pos, "%s", msg);
+}
+
+
+void Report::TraceJSWarning(const Script& script,
+                            intptr_t token_pos,
+                            const String& message) {
+  const int64_t micros = OS::GetCurrentTimeMicros();
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
+  if (trace_buffer == NULL) {
+    TraceBuffer::Init(isolate);
+    trace_buffer = isolate->trace_buffer();
+  }
+  JSONStream js;
+  {
+    JSONObject trace_warning(&js);
+    trace_warning.AddProperty("type", "JSCompatibilityWarning");
+    trace_warning.AddProperty("script", script);
+    trace_warning.AddProperty("tokenPos", token_pos);
+    trace_warning.AddProperty("message", message);
+  }
+  trace_buffer->Trace(micros, js.ToCString(), true);  // Already escaped.
+}
+
+}  // namespace dart
+
diff --git a/runtime/vm/report.h b/runtime/vm/report.h
new file mode 100644
index 0000000..8cc50a1
--- /dev/null
+++ b/runtime/vm/report.h
@@ -0,0 +1,84 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+#ifndef VM_REPORT_H_
+#define VM_REPORT_H_
+
+#include "vm/allocation.h"
+
+namespace dart {
+
+// Forward declarations.
+class Error;
+class ICData;
+class RawString;
+class Script;
+class StackFrame;
+class String;
+
+class Report : AllStatic {
+ public:
+  enum Kind {
+    kWarning,
+    kJSWarning,
+    kError,
+    kMalformedType,
+    kMalboundedType,
+    kBailout,
+  };
+
+  // Report an already formatted error via a long jump.
+  static void LongJump(const Error& error);
+
+  // Concatenate and report an already formatted error and a new error message.
+  static void LongJumpF(const Error& prev_error,
+                        const Script& script, intptr_t token_pos,
+                        const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void LongJumpV(const Error& prev_error,
+                        const Script& script, intptr_t token_pos,
+                        const char* format, va_list args);
+
+  // Report a warning/jswarning/error/bailout message.
+  static void MessageF(Kind kind, const Script& script, intptr_t token_pos,
+                       const char* format, ...) PRINTF_ATTRIBUTE(4, 5);
+  static void MessageV(Kind kind, const Script& script, intptr_t token_pos,
+                       const char* format, va_list args);
+
+  // Support to report Javascript compatibility warnings. Note that a
+  // JavascriptCompatibilityError is thrown if --warning_as_error is specified.
+  // If a warning is issued by the various JSWarning calls, the warning is also
+  // emitted in the trace buffer of the current isolate.
+
+  // Report a Javascript compatibility warning at the call site given by
+  // ic_data, unless one has already been emitted at that location.
+  static void JSWarningFromIC(const ICData& ic_data, const char* msg);
+
+  // Report a Javascript compatibility warning at the current native call,
+  // unless one has already been emitted at that location.
+  static void JSWarningFromNative(bool is_static_native, const char* msg);
+
+  // Report a Javascript compatibility warning at the call site given by
+  // caller_frame.
+  static void JSWarningFromFrame(StackFrame* caller_frame, const char* msg);
+
+  // Prepend a source snippet to the message.
+  // A null script means no source and a negative token_pos means no position.
+  static RawString* PrependSnippet(Kind kind,
+                                   const Script& script,
+                                   intptr_t token_pos,
+                                   const String& message);
+
+ private:
+  // Emit a Javascript compatibility warning to the current trace buffer.
+  static void TraceJSWarning(const Script& script,
+                             intptr_t token_pos,
+                             const String& message);
+
+  DISALLOW_COPY_AND_ASSIGN(Report);
+};
+
+}  // namespace dart
+
+#endif  // VM_REPORT_H_
+
diff --git a/runtime/vm/report_test.cc b/runtime/vm/report_test.cc
new file mode 100644
index 0000000..ba66a9a
--- /dev/null
+++ b/runtime/vm/report_test.cc
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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/assert.h"
+#include "vm/report.h"
+#include "vm/unit_test.h"
+
+namespace dart {
+
+TEST_CASE(TraceJSWarning) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
+  const String& url = String::Handle(isolate, String::New("Plug"));
+  const String& source = String::Handle(isolate, String::New("240 100"));
+  const Script& script = Script::Handle(isolate,
+      Script::New(url, source, RawScript::kScriptTag));
+  script.Tokenize(String::Handle(String::New("")));
+  {
+    const intptr_t token_pos = 0;
+    const char* message = "High Voltage";
+    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
+    {
+      JSONStream js;
+      trace_buffer->PrintToJSONStream(&js);
+      EXPECT_SUBSTRING("{\"type\":\"TraceBuffer\",\"members\":["
+                       "{\"type\":\"TraceBufferEntry\",\"time\":",
+                       js.ToCString());
+      // Skip time.
+      EXPECT_SUBSTRING("\"message\":{\"type\":\"JSCompatibilityWarning\","
+                       "\"script\":{\"type\":\"@Script\",\"id\":"
+                       "\"scripts\\/Plug\",\"name\":\"Plug\",\"user_name\":"
+                       "\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                       "\"message\":{\"type\":\"@String\"",
+                       js.ToCString());
+      // Skip private _OneByteString.
+      EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
+                       js.ToCString());
+    }
+  }
+  {
+    const intptr_t token_pos = 1;
+    const char* message = "Low Voltage";
+    Report::MessageF(Report::kJSWarning, script, token_pos, "%s", message);
+  }
+  EXPECT_EQ(2, trace_buffer->Length());
+  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
+                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":0,"
+                   "\"message\":{\"type\":\"@String\"",
+                   trace_buffer->At(0)->message);
+  // Skip private _OneByteString.
+  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"High Voltage\\\"\"}}",
+                   trace_buffer->At(0)->message);
+
+  EXPECT_SUBSTRING("{\"type\":\"JSCompatibilityWarning\",\"script\":{\"type\":"
+                   "\"@Script\",\"id\":\"scripts\\/Plug\",\"name\":\"Plug\","
+                   "\"user_name\":\"Plug\",\"kind\":\"script\"},\"tokenPos\":1,"
+                   "\"message\":{\"type\":\"@String\"",
+                   trace_buffer->At(1)->message);
+  // Skip private _OneByteString.
+  EXPECT_SUBSTRING("\"valueAsString\":\"\\\"Low Voltage\\\"\"}}",
+                   trace_buffer->At(1)->message);
+
+  delete trace_buffer;
+}
+
+}  // namespace dart
+
diff --git a/runtime/vm/reusable_handles.h b/runtime/vm/reusable_handles.h
index 2f82687..c1b5301 100644
--- a/runtime/vm/reusable_handles.h
+++ b/runtime/vm/reusable_handles.h
@@ -91,6 +91,9 @@
   ReusableCodeHandleScope reused_code_handle(isolate);
 #define REUSABLE_ERROR_HANDLESCOPE(isolate)                                    \
   ReusableErrorHandleScope reused_error_handle(isolate);
+#define REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate)                       \
+  ReusableExceptionHandlersHandleScope                                         \
+      reused_exception_handlers_handle(isolate);
 #define REUSABLE_FIELD_HANDLESCOPE(isolate)                                    \
   ReusableFieldHandleScope reused_field_handle(isolate);
 #define REUSABLE_FUNCTION_HANDLESCOPE(isolate)                                 \
@@ -104,6 +107,8 @@
   ReusableLibraryHandleScope reused_library_handle(isolate);
 #define REUSABLE_OBJECT_HANDLESCOPE(isolate)                                   \
   ReusableObjectHandleScope reused_object_handle(isolate);
+#define REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate)                           \
+  ReusablePcDescriptorsHandleScope reused_pc_descriptors_handle(isolate);
 #define REUSABLE_STRING_HANDLESCOPE(isolate)                                   \
   ReusableStringHandleScope reused_string_handle(isolate);
 #define REUSABLE_TYPE_ARGUMENTS_HANDLESCOPE(isolate)                           \
diff --git a/runtime/vm/runtime_entry_arm64.cc b/runtime/vm/runtime_entry_arm64.cc
index 0112cc3..23e00c6 100644
--- a/runtime/vm/runtime_entry_arm64.cc
+++ b/runtime/vm/runtime_entry_arm64.cc
@@ -40,10 +40,18 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(entry);
-    // Cache the stack pointer in a callee-saved register.
+    // Since we are entering C++ code, we must restore the C stack pointer from
+    // the stack limit to an aligned value nearer to the top of the stack.
+    // We cache the Dart stack pointer and the stack limit in callee-saved
+    // registers, then align and call, restoring CSP and SP on return from the
+    // call.
+    __ mov(R25, CSP);
     __ mov(R26, SP);
+    __ ReserveAlignedFrameSpace(0);
+    __ mov(CSP, SP);
     __ BranchLink(&label, kNoPP);
     __ mov(SP, R26);
+    __ mov(CSP, R25);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/runtime_entry_x64.cc b/runtime/vm/runtime_entry_x64.cc
index aa703b06..ccd0d6f 100644
--- a/runtime/vm/runtime_entry_x64.cc
+++ b/runtime/vm/runtime_entry_x64.cc
@@ -24,7 +24,7 @@
   if (is_leaf()) {
     ASSERT(argument_count == this->argument_count());
     ExternalLabel label(GetEntryPoint());
-    __ call(&label);
+    __ CallCFunction(&label);
   } else {
     // Argument count is not checked here, but in the runtime entry for a more
     // informative error message.
diff --git a/runtime/vm/scanner.cc b/runtime/vm/scanner.cc
index c207415..b6ccaee 100644
--- a/runtime/vm/scanner.cc
+++ b/runtime/vm/scanner.cc
@@ -19,6 +19,34 @@
 DEFINE_FLAG(bool, print_tokens, false, "Print scanned tokens.");
 
 
+// Quick access to the locally defined isolate() method.
+#define I (isolate())
+
+
+class ScanContext : public ZoneAllocated {
+ public:
+  explicit ScanContext(Scanner* scanner)
+      :  next_(scanner->saved_context_),
+         string_delimiter_(scanner->string_delimiter_),
+         string_is_multiline_(scanner->string_is_multiline_),
+         brace_level_(scanner->brace_level_) {}
+
+  void CopyTo(Scanner* scanner) {
+    scanner->string_delimiter_ = string_delimiter_;
+    scanner->string_is_multiline_ = string_is_multiline_;
+    scanner->brace_level_ = brace_level_;
+  }
+
+  ScanContext* next() const { return next_; }
+
+ private:
+  ScanContext* next_;
+  const char string_delimiter_;
+  const bool string_is_multiline_;
+  const int brace_level_;
+};
+
+
 Scanner::KeywordTable Scanner::keywords_[Token::kNumKeywords];
 int Scanner::keywords_char_offset_[Scanner::kNumLowercaseChars];
 
@@ -40,11 +68,7 @@
   c0_ = '\0';
   newline_seen_ = false;
   prev_token_line_ = 1;
-  while (saved_context_ != NULL) {
-    ScanContext* ctx = saved_context_;
-    saved_context_ = ctx->next;
-    delete ctx;
-  }
+  saved_context_ = NULL;
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
   brace_level_ = 0;
@@ -58,22 +82,19 @@
     : source_(src),
       source_length_(src.Length()),
       saved_context_(NULL),
-      private_key_(String::ZoneHandle(private_key.raw())) {
+      private_key_(String::ZoneHandle(private_key.raw())),
+      char_at_func_(src.CharAtFunc()),
+      isolate_(Isolate::Current()) {
   Reset();
 }
 
-Scanner::~Scanner() {
-  while (saved_context_ != NULL) {
-    ScanContext* ctx = saved_context_;
-    saved_context_ = ctx->next;
-    delete ctx;
-  }
-}
+
+Scanner::~Scanner() {}
 
 
 void Scanner::ErrorMsg(const char* msg) {
   current_token_.kind = Token::kERROR;
-  current_token_.literal = &String::ZoneHandle(Symbols::New(msg));
+  current_token_.literal = &String::ZoneHandle(I, Symbols::New(msg));
   current_token_.position = c0_pos_;
   token_start_ = lookahead_pos_;
   current_token_.offset = lookahead_pos_;
@@ -81,12 +102,8 @@
 
 
 void Scanner::PushContext() {
-  ScanContext* ctx = new ScanContext;
-  ctx->next = saved_context_;
+  ScanContext* ctx = new(I) ScanContext(this);
   saved_context_ = ctx;
-  ctx->string_delimiter = string_delimiter_;
-  ctx->string_is_multiline = string_is_multiline_;
-  ctx->brace_level = brace_level_;
   string_delimiter_ = '\0';
   string_is_multiline_ = false;
   brace_level_ = 1;  // Account for the opening ${ token.
@@ -98,12 +115,9 @@
   ASSERT(brace_level_ == 0);
   ASSERT(string_delimiter_ == '\0');
   ScanContext* ctx = saved_context_;
-  saved_context_ = ctx->next;
-  string_delimiter_ = ctx->string_delimiter;
+  ctx->CopyTo(this);
+  saved_context_ = ctx->next();
   ASSERT(string_delimiter_ != '\0');
-  string_is_multiline_ = ctx->string_is_multiline;
-  brace_level_ = ctx->brace_level;
-  delete ctx;
 }
 
 
@@ -154,11 +168,11 @@
   if (!str.IsOneByteString()) {
     return false;
   }
-  if (str.Length() == 0 || !IsIdentStartChar(str.CharAt(0))) {
+  if (str.Length() == 0 || !IsIdentStartChar(CallCharAt()(str, 0))) {
     return false;
   }
   for (int i =  1; i < str.Length(); i++) {
-    if (!IsIdentChar(str.CharAt(i))) {
+    if (!IsIdentChar(CallCharAt()(str, i))) {
       return false;
     }
   }
@@ -202,7 +216,7 @@
       newline_seen_ = true;
       c0_pos_.line++;
       c0_pos_.column = 0;
-      if (source_.CharAt(lookahead_pos_) == '\r') {
+      if (CallCharAt()(source_, lookahead_pos_) == '\r') {
         // Replace a sequence of '\r' '\n' with a single '\n'.
         if (LookaheadChar(1) == '\n') {
           lookahead_pos_++;
@@ -227,7 +241,7 @@
   ASSERT(how_many >= 0);
   int32_t lookahead_char = '\0';
   if (lookahead_pos_ + how_many < source_length_) {
-    lookahead_char = source_.CharAt(lookahead_pos_ + how_many);
+    lookahead_char = CallCharAt()(source_, lookahead_pos_ + how_many);
   }
   return lookahead_char;
 }
@@ -282,7 +296,7 @@
   ASSERT(allow_dollar || (c0_ != '$'));
   int ident_length = 0;
   int ident_pos = lookahead_pos_;
-  int32_t ident_char0 = source_.CharAt(ident_pos);
+  int32_t ident_char0 = CallCharAt()(source_, ident_pos);
   while (IsIdentChar(c0_) && (allow_dollar || (c0_ != '$'))) {
     ReadChar();
     ident_length++;
@@ -292,13 +306,14 @@
   // Note, can't use strcmp since token_chars is not null-terminated.
   if (('a' <= ident_char0) && (ident_char0 <= 'z')) {
     int i = keywords_char_offset_[ident_char0 - 'a'];
-    while (i < Token::kNumKeywords &&
-           keywords_[i].keyword_chars[0] <= ident_char0) {
+    while ((i < Token::kNumKeywords) &&
+           (keywords_[i].keyword_chars[0] <= ident_char0)) {
       if (keywords_[i].keyword_len == ident_length) {
         const char* keyword = keywords_[i].keyword_chars;
         int char_pos = 1;
         while ((char_pos < ident_length) &&
-               (keyword[char_pos] == source_.CharAt(ident_pos + char_pos))) {
+               (keyword[char_pos] ==
+                   CallCharAt()(source_, ident_pos + char_pos))) {
           char_pos++;
         }
         if (char_pos == ident_length) {
@@ -314,7 +329,7 @@
   // We did not read a keyword.
   current_token_.kind = Token::kIDENT;
   String& literal =
-      String::ZoneHandle(Symbols::New(source_, ident_pos, ident_length));
+      String::ZoneHandle(I, Symbols::New(source_, ident_pos, ident_length));
   if (ident_char0 == Library::kPrivateIdentifierStart) {
     // Private identifiers are mangled on a per library basis.
     literal = String::Concat(literal, private_key_);
@@ -372,7 +387,7 @@
   }
   if (current_token_.kind != Token::kILLEGAL) {
     intptr_t len = lookahead_pos_ - token_start_;
-    String& str = String::ZoneHandle(
+    String& str = String::ZoneHandle(I,
         String::SubString(source_, token_start_, len, Heap::kOld));
     str = Symbols::New(str);
     current_token_.literal = &str;
@@ -527,7 +542,7 @@
       // Scanned a string piece.
       ASSERT(string_chars.data() != NULL);
       // Strings are canonicalized: Allocate a symbol.
-      current_token_.literal = &String::ZoneHandle(
+      current_token_.literal = &String::ZoneHandle(I,
           Symbols::FromUTF32(string_chars.data(), string_chars.length()));
       // Preserve error tokens.
       if (current_token_.kind != Token::kERROR) {
@@ -550,7 +565,7 @@
           Recognize(Token::kSTRING);
           ASSERT(string_chars.data() != NULL);
           // Strings are canonicalized: Allocate a symbol.
-          current_token_.literal = &String::ZoneHandle(
+          current_token_.literal = &String::ZoneHandle(I,
               Symbols::FromUTF32(string_chars.data(), string_chars.length()));
         }
         EndStringLiteral();
@@ -915,7 +930,7 @@
 
 
 const Scanner::GrowableTokenStream& Scanner::GetStream() {
-  GrowableTokenStream* ts = new GrowableTokenStream(128);
+  GrowableTokenStream* ts = new(I) GrowableTokenStream(128);
   ScanAll(ts);
   if (FLAG_print_tokens) {
     Scanner::PrintTokens(*ts);
diff --git a/runtime/vm/scanner.h b/runtime/vm/scanner.h
index 92c2919..5dde147 100644
--- a/runtime/vm/scanner.h
+++ b/runtime/vm/scanner.h
@@ -18,6 +18,7 @@
 class Array;
 class Library;
 class RawString;
+class ScanContext;
 class String;
 
 // A call to Scan() scans the source one token at at time.
@@ -25,6 +26,8 @@
 // GetStream() scans the entire source text and returns a stream of tokens.
 class Scanner : ValueObject {
  public:
+  typedef int32_t (*CharAtFunc)(const String& str, intptr_t index);
+
   // SourcePosition describes a text location in user friendly
   // terms of line number and column.
   struct SourcePosition {
@@ -75,7 +78,7 @@
   static void InitOnce();
 
   // Return true if str is an identifier.
-  static bool IsIdent(const String& str);
+  bool IsIdent(const String& str);
 
   // Does the token stream contain a valid literal. This is used to implement
   // the Dart methods int.parse and double.parse.
@@ -85,14 +88,9 @@
                              const String** value);
 
  private:
-  static const int kNumLowercaseChars = 26;
+  friend class ScanContext;
 
-  struct ScanContext {
-    ScanContext* next;
-    char string_delimiter;
-    bool string_is_multiline;
-    int  brace_level;
-  };
+  static const int kNumLowercaseChars = 26;
 
   struct KeywordTable {
     Token::Kind kind;
@@ -182,6 +180,10 @@
 
   void ScanScriptTag();
 
+  CharAtFunc CallCharAt() const { return char_at_func_; }
+
+  Isolate* isolate() const { return isolate_; }
+
   static void PrintTokens(const GrowableTokenStream& ts);
 
   TokenDescriptor current_token_;  // Current token.
@@ -207,6 +209,10 @@
 
   SourcePosition c0_pos_;      // Source position of lookahead character c0_.
 
+  const CharAtFunc char_at_func_;
+
+  Isolate* isolate_;
+
   static KeywordTable keywords_[Token::kNumKeywords];
   static int keywords_char_offset_[kNumLowercaseChars];
 };
diff --git a/runtime/vm/scavenger.cc b/runtime/vm/scavenger.cc
index 37f5cbe..e113cd9 100644
--- a/runtime/vm/scavenger.cc
+++ b/runtime/vm/scavenger.cc
@@ -14,6 +14,7 @@
 #include "vm/object.h"
 #include "vm/stack_frame.h"
 #include "vm/store_buffer.h"
+#include "vm/thread.h"
 #include "vm/verifier.h"
 #include "vm/visitor.h"
 #include "vm/weak_table.h"
@@ -21,8 +22,12 @@
 
 namespace dart {
 
-  DEFINE_FLAG(int, early_tenuring_threshold, 66, "Skip TO space when promoting"
-                                                 " above this percentage.");
+DEFINE_FLAG(int, early_tenuring_threshold, 66,
+            "When more than this percentage of promotion candidates survive, "
+            "promote all survivors of next scavenge.");
+DEFINE_FLAG(int, new_gen_garbage_threshold, 90,
+            "Grow new gen when less than this percentage is garbage.");
+DEFINE_FLAG(int, new_gen_growth_factor, 4, "Grow new gen by this factor.");
 
 // Scavenger uses RawObject::kMarkBit to distinguish forwaded and non-forwarded
 // objects. The kMarkBit does not intersect with the target address because of
@@ -285,7 +290,8 @@
 // StoreBuffers.
 class VerifyStoreBufferPointerVisitor : public ObjectPointerVisitor {
  public:
-  VerifyStoreBufferPointerVisitor(Isolate* isolate, MemoryRegion* to)
+  VerifyStoreBufferPointerVisitor(Isolate* isolate,
+                                  const SemiSpace* to)
       : ObjectPointerVisitor(isolate), to_(to) {}
 
   void VisitPointers(RawObject** first, RawObject** last) {
@@ -298,16 +304,94 @@
   }
 
  private:
-  MemoryRegion* to_;
+  const SemiSpace* to_;
 
   DISALLOW_COPY_AND_ASSIGN(VerifyStoreBufferPointerVisitor);
 };
 
 
+SemiSpace::SemiSpace(VirtualMemory* reserved)
+    : reserved_(reserved), region_(NULL, 0) {
+  if (reserved != NULL) {
+    region_ = MemoryRegion(reserved_->address(), reserved_->size());
+  }
+}
+
+
+SemiSpace::~SemiSpace() {
+  if (reserved_ != NULL) {
+#if defined(DEBUG)
+    memset(reserved_->address(), 0xf3, size_in_words() << kWordSizeLog2);
+#endif  // defined(DEBUG)
+    delete reserved_;
+  }
+}
+
+
+Mutex* SemiSpace::mutex_ = NULL;
+SemiSpace* SemiSpace::cache_ = NULL;
+
+
+void SemiSpace::InitOnce() {
+  ASSERT(mutex_ == NULL);
+  mutex_ = new Mutex();
+  ASSERT(mutex_ != NULL);
+}
+
+
+SemiSpace* SemiSpace::New(intptr_t size_in_words) {
+  {
+    MutexLocker locker(mutex_);
+    // TODO(koda): Cache one entry per size.
+    if (cache_ != NULL && cache_->size_in_words() == size_in_words) {
+      SemiSpace* result = cache_;
+      cache_ = NULL;
+      return result;
+    }
+  }
+  if (size_in_words == 0) {
+    return new SemiSpace(NULL);
+  } else {
+    intptr_t size_in_bytes = size_in_words << kWordSizeLog2;
+    VirtualMemory* reserved = VirtualMemory::Reserve(size_in_bytes);
+    if ((reserved == NULL) || !reserved->Commit(VirtualMemory::kReadWrite)) {
+      // TODO(koda): If cache_ is not empty, we could try to delete it.
+      delete reserved;
+      return NULL;
+    }
+#if defined(DEBUG)
+    memset(reserved->address(), 0xf3, size_in_bytes);
+#endif  // defined(DEBUG)
+    return new SemiSpace(reserved);
+  }
+}
+
+
+void SemiSpace::Delete() {
+  SemiSpace* old_cache = NULL;
+  {
+    MutexLocker locker(mutex_);
+    old_cache = cache_;
+    cache_ = this;
+  }
+  delete old_cache;
+}
+
+
+void SemiSpace::WriteProtect(bool read_only) {
+  if (reserved_ != NULL) {
+    bool success = reserved_->Protect(
+        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
+    ASSERT(success);
+  }
+}
+
+
 Scavenger::Scavenger(Heap* heap,
-                     intptr_t max_capacity_in_words,
+                     intptr_t max_semi_capacity_in_words,
                      uword object_alignment)
     : heap_(heap),
+      max_semi_capacity_in_words_(max_semi_capacity_in_words),
       object_alignment_(object_alignment),
       scavenging_(false),
       gc_time_micros_(0),
@@ -317,31 +401,14 @@
   // going to use for forwarding pointers.
   ASSERT(Object::tags_offset() == 0);
 
-  if (max_capacity_in_words == 0) {
-    space_ = NULL;
-    to_ = new MemoryRegion(NULL, 0);
-    from_ = new MemoryRegion(NULL, 0);
-  } else {
-    // Allocate the virtual memory for this scavenge heap.
-    space_ = VirtualMemory::Reserve(max_capacity_in_words << kWordSizeLog2);
-    if (space_ == NULL) {
-      FATAL("Out of memory.\n");
-    }
-
-    // Allocate the entire space at the beginning.
-    space_->Commit(false);
-
-    // Setup the semi spaces.
-    uword semi_space_size = space_->size() / 2;
-    ASSERT((semi_space_size & (VirtualMemory::PageSize() - 1)) == 0);
-    to_ = new MemoryRegion(space_->address(), semi_space_size);
-    uword middle = space_->start() + semi_space_size;
-    from_ = new MemoryRegion(reinterpret_cast<void*>(middle), semi_space_size);
+  // Set initial size resulting in a total of three different levels.
+  const intptr_t initial_semi_capacity_in_words = max_semi_capacity_in_words /
+      (FLAG_new_gen_growth_factor * FLAG_new_gen_growth_factor);
+  to_ = SemiSpace::New(initial_semi_capacity_in_words);
+  if (to_ == NULL) {
+    FATAL("Out of memory.\n");
   }
-
-  // Make sure that the two semi-spaces are aligned properly.
-  ASSERT(Utils::IsAligned(to_->start(), kObjectAlignment));
-  ASSERT(Utils::IsAligned(from_->start(), kObjectAlignment));
+  from_ = NULL;
 
   // Setup local fields.
   top_ = FirstObjectStart();
@@ -349,18 +416,27 @@
   end_ = to_->end();
 
   survivor_end_ = FirstObjectStart();
-
-#if defined(DEBUG)
-  memset(to_->pointer(), 0xf3, to_->size());
-  memset(from_->pointer(), 0xf3, from_->size());
-#endif  // defined(DEBUG)
 }
 
 
 Scavenger::~Scavenger() {
-  delete to_;
-  delete from_;
-  delete space_;
+  ASSERT(!scavenging_);
+  ASSERT(from_ == NULL);
+  to_->Delete();
+}
+
+
+intptr_t Scavenger::NewSizeInWords(intptr_t old_size_in_words) const {
+  if (stats_history_.Size() == 0) {
+    return old_size_in_words;
+  }
+  double garbage = stats_history_.Get(0).GarbageFraction();
+  if (garbage < (FLAG_new_gen_garbage_threshold / 100.0)) {
+    return Utils::Minimum(max_semi_capacity_in_words_,
+                          old_size_in_words * FLAG_new_gen_growth_factor);
+  } else {
+    return old_size_in_words;
+  }
 }
 
 
@@ -370,9 +446,13 @@
   }
   // Flip the two semi-spaces so that to_ is always the space for allocating
   // objects.
-  MemoryRegion* temp = from_;
   from_ = to_;
-  to_ = temp;
+  to_ = SemiSpace::New(NewSizeInWords(from_->size_in_words()));
+  if (to_ == NULL) {
+    // TODO(koda): We could try to recover (collect old space, wait for another
+    // isolate to finish scavenge, etc.).
+    FATAL("Out of memory.\n");
+  }
   top_ = FirstObjectStart();
   resolved_top_ = top_;
   end_ = to_->end();
@@ -384,24 +464,27 @@
                          bool invoke_api_callbacks) {
   // All objects in the to space have been copied from the from space at this
   // moment.
-  int promotion_ratio = static_cast<int>(
-      (static_cast<double>(visitor->bytes_promoted()) /
-       static_cast<double>(to_->size())) * 100.0);
-  if (promotion_ratio < FLAG_early_tenuring_threshold) {
+  double avg_frac = stats_history_.Get(0).PromoCandidatesSuccessFraction();
+  if (stats_history_.Size() >= 2) {
+    // Previous scavenge is only given half as much weight.
+    avg_frac += 0.5 * stats_history_.Get(1).PromoCandidatesSuccessFraction();
+    avg_frac /= 1.0 + 0.5;  // Normalize.
+  }
+  if (avg_frac < (FLAG_early_tenuring_threshold / 100.0)) {
     // Remember the limit to which objects have been copied.
     survivor_end_ = top_;
   } else {
     // Move survivor end to the end of the to_ space, making all surviving
-    // objects candidates for promotion.
+    // objects candidates for promotion next time.
     survivor_end_ = end_;
   }
 
 #if defined(DEBUG)
   VerifyStoreBufferPointerVisitor verify_store_buffer_visitor(isolate, to_);
   heap_->IterateOldPointers(&verify_store_buffer_visitor);
-
-  memset(from_->pointer(), 0xf3, from_->size());
 #endif  // defined(DEBUG)
+  from_->Delete();
+  from_ = NULL;
   if (invoke_api_callbacks && (isolate->gc_epilogue_callback() != NULL)) {
     (isolate->gc_epilogue_callback())();
   }
@@ -708,6 +791,9 @@
 
   // Setup the visitor and run a scavenge.
   ScavengerVisitor visitor(isolate, this);
+  SpaceUsage usage_before = GetCurrentUsage();
+  intptr_t promo_candidate_words =
+      (survivor_end_ - FirstObjectStart()) / kWordSize;
   Prologue(isolate, invoke_api_callbacks);
   const bool prologue_weak_are_strong = !invoke_api_callbacks;
   IterateRoots(isolate, &visitor, prologue_weak_are_strong);
@@ -724,6 +810,10 @@
   int64_t end = OS::GetCurrentTimeMicros();
   heap_->RecordTime(kProcessToSpace, middle - start);
   heap_->RecordTime(kIterateWeaks, end - middle);
+  stats_history_.Add(ScavengeStats(start, end,
+                                   usage_before, GetCurrentUsage(),
+                                   promo_candidate_words,
+                                   visitor.bytes_promoted() >> kWordSizeLog2));
   Epilogue(isolate, &visitor, invoke_api_callbacks);
 
   if (FLAG_verify_after_gc) {
@@ -739,10 +829,9 @@
 
 
 void Scavenger::WriteProtect(bool read_only) {
-  if (space_ != NULL) {
-    space_->Protect(
-        read_only ? VirtualMemory::kReadOnly : VirtualMemory::kReadWrite);
-  }
+  ASSERT(!scavenging_);
+  ASSERT(from_ == NULL);
+  to_->WriteProtect(read_only);
 }
 
 
diff --git a/runtime/vm/scavenger.h b/runtime/vm/scavenger.h
index 4c9fecc..1b74aa7 100644
--- a/runtime/vm/scavenger.h
+++ b/runtime/vm/scavenger.h
@@ -11,6 +11,7 @@
 #include "vm/flags.h"
 #include "vm/globals.h"
 #include "vm/raw_object.h"
+#include "vm/ring_buffer.h"
 #include "vm/spaces.h"
 #include "vm/virtual_memory.h"
 #include "vm/visitor.h"
@@ -25,9 +26,94 @@
 
 DECLARE_FLAG(bool, gc_at_alloc);
 
+
+// Wrapper around VirtualMemory that adds caching and handles the empty case.
+class SemiSpace {
+ public:
+  static void InitOnce();
+
+  // Get a space of the given size. Returns NULL on out of memory. If size is 0,
+  // returns an empty space: pointer(), start() and end() all return NULL.
+  static SemiSpace* New(intptr_t size_in_words);
+
+  // Hand back an unused space.
+  void Delete();
+
+  void* pointer() const { return region_.pointer(); }
+  uword start() const { return region_.start(); }
+  uword end() const { return region_.end(); }
+  intptr_t size_in_words() const {
+    return static_cast<intptr_t>(region_.size()) >> kWordSizeLog2;
+  }
+  bool Contains(uword address) const { return region_.Contains(address); }
+
+  // Set write protection mode for this space. The space must not be protected
+  // when Delete is called.
+  // TODO(koda): Remember protection mode in VirtualMemory and assert this.
+  void WriteProtect(bool read_only);
+
+ private:
+  explicit SemiSpace(VirtualMemory* reserved);
+  ~SemiSpace();
+
+  VirtualMemory* reserved_;  // NULL for an emtpy space.
+  MemoryRegion region_;
+
+  static SemiSpace* cache_;
+  static Mutex* mutex_;
+};
+
+
+// Statistics for a particular scavenge.
+class ScavengeStats {
+ public:
+  ScavengeStats() {}
+  ScavengeStats(int64_t start_micros,
+                int64_t end_micros,
+                SpaceUsage before,
+                SpaceUsage after,
+                intptr_t promo_candidates_in_words,
+                intptr_t promoted_in_words) :
+      start_micros_(start_micros),
+      end_micros_(end_micros),
+      before_(before),
+      after_(after),
+      promo_candidates_in_words_(promo_candidates_in_words),
+      promoted_in_words_(promoted_in_words) {}
+
+  // Of all data before scavenge, what fraction was found to be garbage?
+  double GarbageFraction() const {
+    intptr_t survived = after_.used_in_words + promoted_in_words_;
+    return 1.0 - (survived / static_cast<double>(before_.used_in_words));
+  }
+
+  // Fraction of promotion candidates that survived and was thereby promoted.
+  // Returns zero if there were no promotion candidates.
+  double PromoCandidatesSuccessFraction() const {
+    return promo_candidates_in_words_ > 0 ?
+        promoted_in_words_ / static_cast<double>(promo_candidates_in_words_) :
+        0.0;
+  }
+
+  int64_t DurationMicros() const {
+    return end_micros_ - start_micros_;
+  }
+
+ private:
+  int64_t start_micros_;
+  int64_t end_micros_;
+  SpaceUsage before_;
+  SpaceUsage after_;
+  intptr_t promo_candidates_in_words_;
+  intptr_t promoted_in_words_;
+};
+
+
 class Scavenger {
  public:
-  Scavenger(Heap* heap, intptr_t max_capacity_in_words, uword object_alignment);
+  Scavenger(Heap* heap,
+            intptr_t max_semi_capacity_in_words,
+            uword object_alignment);
   ~Scavenger();
 
   // Check whether this Scavenger contains this address.
@@ -38,7 +124,7 @@
     // No reasonable algorithm should be checking for objects in from space. At
     // least unless it is debugging code. This might need to be relaxed later,
     // but currently it helps prevent dumb bugs.
-    ASSERT(!from_->Contains(addr));
+    ASSERT(from_ == NULL || !from_->Contains(addr));
     return to_->Contains(addr);
   }
 
@@ -79,7 +165,7 @@
     return (top_ - FirstObjectStart()) >> kWordSizeLog2;
   }
   intptr_t CapacityInWords() const {
-    return to_->size() >> kWordSizeLog2;
+    return to_->size_in_words();
   }
   intptr_t ExternalInWords() const {
     return external_size_ >> kWordSizeLog2;
@@ -183,9 +269,10 @@
 
   void ProcessWeakTables();
 
-  VirtualMemory* space_;
-  MemoryRegion* to_;
-  MemoryRegion* from_;
+  intptr_t NewSizeInWords(intptr_t old_size_in_words) const;
+
+  SemiSpace* from_;
+  SemiSpace* to_;
 
   Heap* heap_;
 
@@ -201,6 +288,8 @@
   // Objects below this address have survived a scavenge.
   uword survivor_end_;
 
+  intptr_t max_semi_capacity_in_words_;
+
   // All object are aligned to this value.
   uword object_alignment_;
 
@@ -209,6 +298,8 @@
 
   int64_t gc_time_micros_;
   intptr_t collections_;
+  static const int kStatsHistoryCapacity = 2;
+  RingBuffer<ScavengeStats, kStatsHistoryCapacity> stats_history_;
 
   // The total size of external data associated with objects in this scavenger.
   intptr_t external_size_;
diff --git a/runtime/vm/service.cc b/runtime/vm/service.cc
index cd88fc2..9a26f02 100644
--- a/runtime/vm/service.cc
+++ b/runtime/vm/service.cc
@@ -24,6 +24,7 @@
 #include "vm/object_store.h"
 #include "vm/port.h"
 #include "vm/profiler.h"
+#include "vm/reusable_handles.h"
 #include "vm/stack_frame.h"
 #include "vm/symbols.h"
 #include "vm/version.h"
@@ -1137,6 +1138,80 @@
 }
 
 
+class GetInstancesVisitor : public ObjectGraph::Visitor {
+ public:
+  GetInstancesVisitor(const Class& cls, const Array& storage)
+      : cls_(cls), storage_(storage), count_(0) {}
+
+  virtual Direction VisitObject(ObjectGraph::StackIterator* it) {
+    RawObject* raw_obj = it->Get();
+    if (raw_obj->IsFreeListElement()) {
+      return kProceed;
+    }
+    Isolate* isolate = Isolate::Current();
+    REUSABLE_OBJECT_HANDLESCOPE(isolate);
+    Object& obj = isolate->ObjectHandle();
+    obj = raw_obj;
+    if (obj.GetClassId() == cls_.id()) {
+      if (!storage_.IsNull() && count_ < storage_.Length()) {
+        storage_.SetAt(count_, obj);
+      }
+      ++count_;
+    }
+    return kProceed;
+  }
+
+  intptr_t count() const { return count_; }
+
+ private:
+  const Class& cls_;
+  const Array& storage_;
+  intptr_t count_;
+};
+
+
+static bool HandleClassesInstances(Isolate* isolate, const Class& cls,
+                                   JSONStream* js) {
+  if (js->num_arguments() != 3) {
+    PrintError(js, "Command too long");
+    return true;
+  }
+  intptr_t limit;
+  if (!GetIntegerId(js->LookupOption("limit"), &limit)) {
+    PrintError(js, "instances expects a 'limit' option\n",
+               js->num_arguments());
+    return true;
+  }
+  Array& storage = Array::Handle(Array::New(limit));
+  GetInstancesVisitor visitor(cls, storage);
+  ObjectGraph graph(isolate);
+  graph.IterateObjects(&visitor);
+  intptr_t count = visitor.count();
+  if (count < limit) {
+    // Truncate the list using utility method for GrowableObjectArray.
+    GrowableObjectArray& wrapper = GrowableObjectArray::Handle(
+        GrowableObjectArray::New(storage));
+    wrapper.SetLength(count);
+    storage = Array::MakeArray(wrapper);
+  }
+  JSONObject jsobj(js);
+  jsobj.AddProperty("type", "InstanceSet");
+  jsobj.AddProperty("id", "instance_set");
+  jsobj.AddProperty("totalCount", count);
+  jsobj.AddProperty("sampleCount", storage.Length());
+  jsobj.AddProperty("sample", storage);
+  return true;
+}
+
+
+static bool HandleClassesCoverage(Isolate* isolate,
+                                  const Class& cls,
+                                  JSONStream* stream) {
+  CodeCoverage::PrintJSONForClass(cls, stream);
+  return true;
+}
+
+
 static bool HandleClasses(Isolate* isolate, JSONStream* js) {
   if (js->num_arguments() == 1) {
     ClassTable* table = isolate->class_table();
@@ -1173,10 +1248,14 @@
       return HandleClassesImplicitClosures(isolate, cls, js);
     } else if (strcmp(second, "dispatchers") == 0) {
       return HandleClassesDispatchers(isolate, cls, js);
-    } else if (!strcmp(second, "types")) {
+    } else if (strcmp(second, "types") == 0) {
       return HandleClassesTypes(isolate, cls, js);
-    } else if (!strcmp(second, "retained")) {
+    } else if (strcmp(second, "retained") == 0) {
       return HandleClassesRetained(isolate, cls, js);
+    } else if (strcmp(second, "instances") == 0) {
+      return HandleClassesInstances(isolate, cls, js);
+    } else if (strcmp(second, "coverage") == 0) {
+      return HandleClassesCoverage(isolate, cls, js);
     } else {
       PrintError(js, "Invalid sub collection %s", second);
       return true;
@@ -1208,6 +1287,14 @@
 }
 
 
+static bool HandleLibrariesCoverage(Isolate* isolate,
+                                    const Library& lib,
+                                    JSONStream* js) {
+  CodeCoverage::PrintJSONForLibrary(lib, Script::Handle(), js);
+  return true;
+}
+
+
 static bool HandleLibraries(Isolate* isolate, JSONStream* js) {
   // TODO(johnmccutchan): Support fields and functions on libraries.
   REQUIRE_COLLECTION_ID("libraries");
@@ -1227,6 +1314,8 @@
     const char* second = js->GetArgument(2);
     if (strcmp(second, "eval") == 0) {
       return HandleLibrariesEval(isolate, lib, js);
+    } else if (strcmp(second, "coverage") == 0) {
+      return HandleLibrariesCoverage(isolate, lib, js);
     } else {
       PrintError(js, "Invalid sub collection %s", second);
       return true;
@@ -1255,7 +1344,7 @@
     arg += 4;
     int64_t value = 0;
     if (!OS::StringToInt64(arg, &value) ||
-        !Smi::IsValid64(value)) {
+        !Smi::IsValid(value)) {
       *error = true;
       return Object::null();
     }
@@ -1398,36 +1487,16 @@
 }
 
 
-static bool HandleScriptsFetch(Isolate* isolate, JSONStream* js) {
-  const GrowableObjectArray& libs =
-    GrowableObjectArray::Handle(isolate->object_store()->libraries());
-  int num_libs = libs.Length();
-  Library &lib = Library::Handle();
-  Script& script = Script::Handle();
-  String& url = String::Handle();
-  const String& id = String::Handle(String::New(js->GetArgument(1)));
-  ASSERT(!id.IsNull());
-  // The id is the url of the script % encoded, decode it.
-  String& requested_url = String::Handle(String::DecodeURI(id));
-  for (intptr_t i = 0; i < num_libs; i++) {
-    lib ^= libs.At(i);
-    ASSERT(!lib.IsNull());
-    ASSERT(Smi::IsValid(lib.index()));
-    const Array& loaded_scripts = Array::Handle(lib.LoadedScripts());
-    ASSERT(!loaded_scripts.IsNull());
-    intptr_t num_scripts = loaded_scripts.Length();
-    for (intptr_t i = 0; i < num_scripts; i++) {
-      script ^= loaded_scripts.At(i);
-      ASSERT(!script.IsNull());
-      url ^= script.url();
-      if (url.Equals(requested_url)) {
-        script.PrintJSON(js, false);
-        return true;
-      }
-    }
-  }
-  PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
-                     requested_url.ToCString());
+static bool HandleScriptsFetch(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  script.PrintJSON(js, false);
+  return true;
+}
+
+
+static bool HandleScriptsCoverage(
+    Isolate* isolate, const Script& script, JSONStream* js) {
+  CodeCoverage::PrintJSONForScript(script, js);
   return true;
 }
 
@@ -1436,9 +1505,29 @@
   if (js->num_arguments() == 1) {
     // Enumerate all scripts.
     return HandleScriptsEnumerate(isolate, js);
-  } else if (js->num_arguments() == 2) {
-    // Fetch specific script.
-    return HandleScriptsFetch(isolate, js);
+  }
+  // Subcommands of scripts require a valid script id.
+  const String& id = String::Handle(String::New(js->GetArgument(1)));
+  ASSERT(!id.IsNull());
+  // The id is the url of the script % encoded, decode it.
+  String& requested_url = String::Handle(String::DecodeURI(id));
+  Script& script = Script::Handle();
+  script = Script::FindByUrl(requested_url);
+  if (script.IsNull()) {
+    PrintErrorWithKind(js, "NotFoundError", "Cannot find script %s",
+                       requested_url.ToCString());
+    return true;
+  }
+  if (js->num_arguments() == 2) {
+    // If no subcommand is given, just fetch the script.
+    return HandleScriptsFetch(isolate, script, js);
+  } else if (js->num_arguments() == 3) {
+    const char* arg = js->GetArgument(2);
+    if (strcmp(arg, "coverage") == 0) {
+      return HandleScriptsCoverage(isolate, script, js);
+    }
+    PrintError(js, "Unrecognized subcommand '%s'", arg);
+    return true;
   } else {
     PrintError(js, "Command too long");
     return true;
diff --git a/runtime/vm/service_test.cc b/runtime/vm/service_test.cc
index 030d2e1..51a19aa 100644
--- a/runtime/vm/service_test.cc
+++ b/runtime/vm/service_test.cc
@@ -833,6 +833,31 @@
   ExpectSubstringF(handler.msg(),
                    "\"id\":\"objects\\/int-%" Pd "\"",
                    b0.raw()->Size() + b1.raw()->Size());
+  // ... and list the instances of class B.
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+                      "['limit'], ['3']]", class_b.id());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(), "\"type\":\"InstanceSet\"");
+  ExpectSubstringF(handler.msg(), "\"totalCount\":2");
+  ExpectSubstringF(handler.msg(), "\"sampleCount\":2");
+  // TODO(koda): Actually parse the response.
+  static const intptr_t kInstanceListId = 0;
+  ExpectSubstringF(handler.msg(), "\"id\":\"objects\\/%" Pd "\",\"length\":2",
+                   kInstanceListId);
+  Array& list = Array::Handle();
+  list ^= isolate->object_id_ring()->GetObjectForId(kInstanceListId);
+  EXPECT_EQ(2, list.Length());
+  // The list should contain {b0, b1}.
+  EXPECT((list.At(0) == b0.raw() && list.At(1) == b1.raw()) ||
+         (list.At(0) == b1.raw() && list.At(1) == b0.raw()));
+  // ... and if limit is 1, we one get one of them.
+  service_msg = EvalF(h_lib, "[0, port, ['classes', '%" Pd "', 'instances'],"
+                      "['limit'], ['1']]", class_b.id());
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  ExpectSubstringF(handler.msg(), "\"totalCount\":2");
+  ExpectSubstringF(handler.msg(), "\"sampleCount\":1");
 }
 
 
@@ -1211,6 +1236,161 @@
       "[5,1,6,1]}", handler.msg());
 }
 
+
+TEST_CASE(Service_ScriptsCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // 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(h_lib, NewString("port"), port));
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(
+      h_lib, "[0, port, ['scripts', 'test-lib', 'coverage'], [], []]");
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+}
+
+
+TEST_CASE(Service_LibrariesCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "var x = 7;\n"
+      "main() {\n"
+      "  x = x * x;\n"
+      "  x = x / 13;\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // 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(h_lib, NewString("port"), port));
+
+  // Look up the service id for the library containg the test-lib script.
+  const GrowableObjectArray& libs =
+      GrowableObjectArray::Handle(isolate->object_store()->libraries());
+  intptr_t i;
+  for (i = 0; i < libs.Length(); i++) {
+    if (libs.At(i) == lib.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != libs.Length());
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+              "[0, port, ['libraries', '%" Pd "', 'coverage'], [], []]", i);
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, buf);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,6,1]}]}", handler.msg());
+}
+
+
+TEST_CASE(Service_ClassesCoverage) {
+  const char* kScript =
+      "var port;\n"  // Set to our mock port by C++.
+      "\n"
+      "class Foo {\n"
+      "  var x;\n"
+      "  Foo(this.x);\n"
+      "  bar() {\n"
+      "    x = x * x;\n"
+      "    x = x / 13;\n"
+      "  }\n"
+      "}\n"
+      "main() {\n"
+      "  var foo = new Foo(7);\n"
+      "  foo.bar();\n"
+      "}";
+
+  Isolate* isolate = Isolate::Current();
+  Dart_Handle h_lib = TestCase::LoadTestScript(kScript, NULL);
+  EXPECT_VALID(h_lib);
+  Library& lib = Library::Handle();
+  lib ^= Api::UnwrapHandle(h_lib);
+  EXPECT(!lib.IsNull());
+  Dart_Handle result = Dart_Invoke(h_lib, NewString("main"), 0, NULL);
+  EXPECT_VALID(result);
+
+  // 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(h_lib, NewString("port"), port));
+
+  // Look up the service id of Foo.
+  const Class& cls = Class::Handle(
+      lib.LookupClass(String::Handle(String::New("Foo"))));
+  ASSERT(!cls.IsNull());
+  ClassTable* table = isolate->class_table();
+  intptr_t i;
+  for (i = 1; i < table->NumCids(); i++) {
+    if (table->HasValidClassAt(i) && table->At(i) == cls.raw()) {
+      break;
+    }
+  }
+  ASSERT(i != table->NumCids());
+  char buf[1024];
+  OS::SNPrint(buf, sizeof(buf),
+              "[0, port, ['classes', '%" Pd "', 'coverage'], [], []]", i);
+
+  Instance& service_msg = Instance::Handle();
+  service_msg = Eval(h_lib, buf);
+  Service::HandleIsolateMessage(isolate, service_msg);
+  handler.HandleNextMessage();
+  EXPECT_STREQ(
+      "{\"type\":\"CodeCoverage\",\"id\":\"coverage\",\"coverage\":["
+      "{\"source\":\"test-lib\",\"script\":{"
+      "\"type\":\"@Script\",\"id\":\"scripts\\/test-lib\","
+      "\"name\":\"test-lib\",\"user_name\":\"test-lib\","
+      "\"kind\":\"script\"},\"hits\":[5,1,7,4,8,3]}]}", handler.msg());
+}
+
 #endif
 
 
diff --git a/runtime/vm/snapshot.cc b/runtime/vm/snapshot.cc
index c8deea9..044b47e 100644
--- a/runtime/vm/snapshot.cc
+++ b/runtime/vm/snapshot.cc
@@ -174,9 +174,9 @@
   if (setjmp(*jump.Set()) == 0) {
     Object& obj = Object::Handle(ReadObjectImpl());
     for (intptr_t i = 0; i < backward_references_.length(); i++) {
-      if (!backward_references_[i]->is_deserialized()) {
+      if (!backward_references_[i].is_deserialized()) {
         ReadObjectImpl();
-        backward_references_[i]->set_state(kIsDeserialized);
+        backward_references_[i].set_state(kIsDeserialized);
       }
     }
     return obj.raw();
@@ -302,7 +302,7 @@
   }
 
   // For all other internal VM classes we read the object inline.
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   switch (class_id) {
 #define SNAPSHOT_READ(clazz)                                                   \
     case clazz::kClassId: {                                                    \
@@ -315,6 +315,7 @@
     case kTypedData##clazz##Cid:                                               \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -323,6 +324,7 @@
     case kExternalTypedData##clazz##Cid:                                       \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(class_id, tags);
       obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -341,8 +343,7 @@
                                 DeserializeState state) {
   intptr_t index = (id - kMaxPredefinedObjectIds);
   ASSERT(index == backward_references_.length());
-  BackRefNode* node = new BackRefNode(obj, state);
-  ASSERT(node != NULL);
+  BackRefNode node(obj, state);
   backward_references_.Add(node);
 }
 
@@ -351,7 +352,7 @@
   ASSERT(id >= kMaxPredefinedObjectIds);
   intptr_t index = (id - kMaxPredefinedObjectIds);
   if (index < backward_references_.length()) {
-    return backward_references_[index]->reference();
+    return backward_references_[index].reference();
   }
   return NULL;
 }
@@ -374,9 +375,9 @@
     *(object_store->from() + i) = ReadObjectImpl();
   }
   for (intptr_t i = 0; i < backward_references_.length(); i++) {
-    if (!backward_references_[i]->is_deserialized()) {
+    if (!backward_references_[i].is_deserialized()) {
       ReadObjectImpl();
-      backward_references_[i]->set_state(kIsDeserialized);
+      backward_references_[i].set_state(kIsDeserialized);
     }
   }
 
@@ -813,7 +814,7 @@
 RawObject* SnapshotReader::ReadInlinedObject(intptr_t object_id) {
   // Read the class header information and lookup the class.
   intptr_t class_header = ReadIntptrValue();
-  intptr_t tags = ReadIntptrValue();
+  intptr_t tags = ReadTags();
   if (SerializedHeaderData::decode(class_header) == kInstanceObjectId) {
     // Object is regular dart instance.
     Instance* result = reinterpret_cast<Instance*>(GetBackRef(object_id));
@@ -893,6 +894,7 @@
     case kTypedData##clazz##Cid:                                               \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
       obj_ = TypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -901,6 +903,7 @@
     case kExternalTypedData##clazz##Cid:                                       \
 
     CLASS_LIST_TYPED_DATA(SNAPSHOT_READ) {
+      tags = RawObject::ClassIdTag::update(cls_.id(), tags);
       obj_ = ExternalTypedData::ReadFrom(this, object_id, tags, kind_);
       break;
     }
@@ -1389,7 +1392,7 @@
   // case.
   // Write out the class and tags information.
   WriteVMIsolateObject(kClassCid);
-  WriteIntptrValue(GetObjectTags(cls));
+  WriteTags(GetObjectTags(cls));
 
   // Write out the library url and class name.
   RawLibrary* library = cls->ptr()->library_;
@@ -1412,7 +1415,7 @@
 
   // Write out the class and tags information.
   WriteIndexedObject(array_kind);
-  WriteIntptrValue(tags);
+  WriteTags(tags);
 
   // Write out the length field.
   Write<RawObject*>(length);
@@ -1472,7 +1475,7 @@
   WriteIntptrValue(SerializedHeaderData::encode(kInstanceObjectId));
 
   // Write out the tags.
-  WriteIntptrValue(tags);
+  WriteTags(tags);
 
   // Write out the class information for this object.
   WriteObjectImpl(cls);
diff --git a/runtime/vm/snapshot.h b/runtime/vm/snapshot.h
index 0038bce..d6c00a7 100644
--- a/runtime/vm/snapshot.h
+++ b/runtime/vm/snapshot.h
@@ -181,6 +181,11 @@
     return static_cast<intptr_t>(value);
   }
 
+  intptr_t ReadRawPointerValue() {
+    int64_t value = Read<int64_t>();
+    return static_cast<intptr_t>(value);
+  }
+
   void ReadBytes(uint8_t* addr, intptr_t len) {
     stream_.ReadBytes(addr, len);
   }
@@ -191,6 +196,11 @@
     return result;
   }
 
+  intptr_t ReadTags() {
+    const intptr_t tags = static_cast<intptr_t>(Read<int8_t>()) & 0xff;
+    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
+    return tags;
+  }
 
   const uint8_t* CurrentBufferAddress() const {
     return stream_.AddressOfCurrentPosition();
@@ -293,7 +303,7 @@
   RawStacktrace* NewStacktrace();
 
  private:
-  class BackRefNode : public ZoneAllocated {
+  class BackRefNode : public ValueObject {
    public:
     BackRefNode(Object* reference, DeserializeState state)
         : reference_(reference), state_(state) {}
@@ -301,11 +311,15 @@
     bool is_deserialized() const { return state_ == kIsDeserialized; }
     void set_state(DeserializeState state) { state_ = state; }
 
+    BackRefNode& operator=(const BackRefNode& other) {
+      reference_ = other.reference_;
+      state_ = other.state_;
+      return *this;
+    }
+
    private:
     Object* reference_;
     DeserializeState state_;
-
-    DISALLOW_COPY_AND_ASSIGN(BackRefNode);
   };
 
   // Allocate uninitialized objects, this is used when reading a full snapshot.
@@ -345,7 +359,7 @@
   TokenStream& stream_;  // Temporary token stream handle.
   ExternalTypedData& data_;  // Temporary stream data handle.
   UnhandledException& error_;  // Error handle.
-  GrowableArray<BackRefNode*> backward_references_;
+  GrowableArray<BackRefNode> backward_references_;
 
   friend class ApiError;
   friend class Array;
@@ -395,6 +409,11 @@
 
   // Writes an intptr_t type value out.
   void WriteIntptrValue(intptr_t value) {
+    ASSERT((value >= kMinInt32) && (value <= kMaxInt32));
+    Write<int64_t>(value);
+  }
+
+  void WriteRawPointerValue(intptr_t value) {
     Write<int64_t>(value);
   }
 
@@ -426,6 +445,12 @@
     WriteIntptrValue(value);
   }
 
+  void WriteTags(intptr_t tags) {
+    ASSERT(SerializedHeaderTag::decode(tags) != kObjectId);
+    const intptr_t flags = tags & 0xff;
+    Write<int8_t>(static_cast<int8_t>(flags));
+  }
+
   // Write out a buffer of bytes.
   void WriteBytes(const uint8_t* addr, intptr_t len) {
     stream_.WriteBytes(addr, len);
diff --git a/runtime/vm/snapshot_test.cc b/runtime/vm/snapshot_test.cc
index 7761863d..05b4df2 100644
--- a/runtime/vm/snapshot_test.cc
+++ b/runtime/vm/snapshot_test.cc
@@ -2429,44 +2429,44 @@
       "getTypedDataViewList() {\n"
       "  var list = new List(30);\n"
       "  var index = 0;\n"
-      "  list[index++] = new Int8List.view(new Int8List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint8List(256));\n"
-      "  list[index++] = new Int16List.view(new Int16List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint16List(256));\n"
-      "  list[index++] = new Int32List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint32List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int64List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint64List.view(new Uint64List(256));\n"
-      "  list[index++] = new Float32List.view(new Float32List(256));\n"
-      "  list[index++] = new Float64List.view(new Float64List(256));\n"
+      "  list[index++] = new Int8List.view(new Int8List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint8List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = new Int32List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint32List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int64List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint64List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Float32List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Float64List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int8List.view(new Int16List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint16List(256));\n"
-      "  list[index++] = new Int8List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int8List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint8List.view(new Uint64List(256));\n"
-      "  list[index++] = new Int8List.view(new Float32List(256));\n"
-      "  list[index++] = new Uint8List.view(new Float32List(256));\n"
-      "  list[index++] = new Int8List.view(new Float64List(256));\n"
-      "  list[index++] = new Uint8List.view(new Float64List(256));\n"
+      "  list[index++] = new Int8List.view(new Int16List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint16List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Int8List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = new Uint8List.view(new Float64List(256).buffer);\n"
 
-      "  list[index++] = new Int16List.view(new Int8List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint8List(256));\n"
-      "  list[index++] = new Int16List.view(new Int32List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint32List(256));\n"
-      "  list[index++] = new Int16List.view(new Int64List(256));\n"
-      "  list[index++] = new Uint16List.view(new Uint64List(256));\n"
-      "  list[index++] = new Int16List.view(new Float32List(256));\n"
-      "  list[index++] = new Uint16List.view(new Float32List(256));\n"
-      "  list[index++] = new Int16List.view(new Float64List(256));\n"
-      "  list[index++] = new Uint16List.view(new Float64List(256));\n"
+      "  list[index++] = new Int16List.view(new Int8List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint8List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int32List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint32List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Int64List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Uint64List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Float32List(256).buffer);\n"
+      "  list[index++] = new Int16List.view(new Float64List(256).buffer);\n"
+      "  list[index++] = new Uint16List.view(new Float64List(256).buffer);\n"
       "  return list;\n"
       "}\n"
       "getMultipleTypedDataViewList() {\n"
       "  var list = new List(10);\n"
       "  var index = 0;\n"
-      "  var data = new Uint8List(256);\n"
+      "  var data = new Uint8List(256).buffer;\n"
       "  list[index++] = new Int8List.view(data);\n"
       "  list[index++] = new Uint8List.view(data);\n"
       "  list[index++] = new Int16List.view(data);\n"
diff --git a/runtime/vm/stack_frame.cc b/runtime/vm/stack_frame.cc
index af807f1..4563724 100644
--- a/runtime/vm/stack_frame.cc
+++ b/runtime/vm/stack_frame.cc
@@ -12,6 +12,7 @@
 #include "vm/os.h"
 #include "vm/parser.h"
 #include "vm/raw_object.h"
+#include "vm/reusable_handles.h"
 #include "vm/stub_code.h"
 #include "vm/visitor.h"
 
@@ -196,23 +197,28 @@
 }
 
 
-bool StackFrame::FindExceptionHandler(uword* handler_pc,
+bool StackFrame::FindExceptionHandler(Isolate* isolate,
+                                      uword* handler_pc,
                                       bool* needs_stacktrace,
                                       bool* has_catch_all) const {
-  Isolate* isolate = Isolate::Current();
-  Code& code = Code::Handle(isolate, LookupDartCode());
+  REUSABLE_CODE_HANDLESCOPE(isolate);
+  Code& code = reused_code_handle.Handle();
+  code = LookupDartCode();
   if (code.IsNull()) {
     return false;  // Stub frames do not have exception handlers.
   }
 
-  ExceptionHandlers& handlers =
-      ExceptionHandlers::Handle(isolate, code.exception_handlers());
+  REUSABLE_EXCEPTION_HANDLERS_HANDLESCOPE(isolate);
+  ExceptionHandlers& handlers = reused_exception_handlers_handle.Handle();
+  handlers = code.exception_handlers();
   if (handlers.Length() == 0) {
     return false;
   }
+
   // Find pc descriptor for the current pc.
-  const PcDescriptors& descriptors =
-      PcDescriptors::Handle(isolate, code.pc_descriptors());
+  REUSABLE_PC_DESCRIPTORS_HANDLESCOPE(isolate);
+  PcDescriptors& descriptors = reused_pc_descriptors_handle.Handle();
+  descriptors = code.pc_descriptors();
   const intptr_t len = descriptors.Length();
   for (intptr_t i = 0; i < len; i++) {
     if ((static_cast<uword>(descriptors.PC(i)) == pc()) &&
diff --git a/runtime/vm/stack_frame.h b/runtime/vm/stack_frame.h
index 5b4d6b4..53982639 100644
--- a/runtime/vm/stack_frame.h
+++ b/runtime/vm/stack_frame.h
@@ -72,7 +72,8 @@
 
   RawFunction* LookupDartFunction() const;
   RawCode* LookupDartCode() const;
-  bool FindExceptionHandler(uword* handler_pc,
+  bool FindExceptionHandler(Isolate* isolate,
+                            uword* handler_pc,
                             bool* needs_stacktrace,
                             bool* is_catch_all) const;
   // Returns token_pos of the pc(), or -1 if none exists.
diff --git a/runtime/vm/stack_frame_x64.h b/runtime/vm/stack_frame_x64.h
index d85e8ec..125735d 100644
--- a/runtime/vm/stack_frame_x64.h
+++ b/runtime/vm/stack_frame_x64.h
@@ -45,9 +45,15 @@
 static const int kSavedAboveReturnAddress = 3;  // Saved above return address.
 
 // Entry and exit frame layout.
+#if defined(_WIN64)
+static const int kSavedContextSlotFromEntryFp = -32;
+static const int kExitLinkSlotFromEntryFp = -31;
+static const int kSavedVMTagSlotFromEntryFp = -30;
+#else
 static const int kSavedContextSlotFromEntryFp = -10;
 static const int kExitLinkSlotFromEntryFp = -9;
 static const int kSavedVMTagSlotFromEntryFp = -8;
+#endif  // defined(_WIN64)
 
 }  // namespace dart
 
diff --git a/runtime/vm/stub_code_arm.cc b/runtime/vm/stub_code_arm.cc
index 61eb06c..91b2a3b 100644
--- a/runtime/vm/stub_code_arm.cc
+++ b/runtime/vm/stub_code_arm.cc
@@ -217,12 +217,6 @@
   __ stm(IA, SP,  (1 << R0) | (1 << R1) | (1 << R2) | (1 << R3));
   __ mov(R0, Operand(SP));  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask());
-  __ b(&leaf_call, EQ);
-
   __ mov(R1, Operand(R5));  // Pass the function entrypoint to call.
   // Call native function invocation wrapper or redirection via simulator.
 #if defined(USING_SIMULATOR)
@@ -234,13 +228,6 @@
 #else
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
 #endif
-  __ b(&done);
-
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ blx(R5);
-
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(R2, VMTag::kScriptTagId);
@@ -1284,7 +1271,7 @@
   // Preserve return address, since LR is needed for subroutine call.
   __ mov(R8, Operand(LR));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // R5: IC data object (preserved).
   __ ldr(R6, FieldAddress(R5, ICData::ic_data_offset()));
   // R6: ic_data_array with check entries: classes and target functions.
@@ -1296,7 +1283,7 @@
   __ ldr(R7, FieldAddress(R4, ArgumentsDescriptor::count_offset()));
   __ sub(R7, R7, Operand(Smi::RawValue(1)));
   __ ldr(R0, Address(SP, R7, LSL, 1));  // R7 (argument_count - 1) is smi.
-  __ bl(&get_class_id_as_smi);
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
   // R7: argument_count - 1 (smi).
   // R0: receiver's class ID (smi).
   __ ldr(R1, Address(R6, 0));  // First class id (smi) to check.
@@ -1308,7 +1295,7 @@
       // If not the first, load the next argument's class ID.
       __ AddImmediate(R0, R7, Smi::RawValue(-i));
       __ ldr(R0, Address(SP, R0, LSL, 1));
-      __ bl(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(R0, R0);
       // R0: next argument class ID (smi).
       __ LoadFromOffset(kWord, R1, R6, i * kWordSize);
       // R1: next class ID to check (smi).
@@ -1326,7 +1313,7 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ ldr(R0, Address(SP, R7, LSL, 1));
-    __ bl(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(R0, R0);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1386,17 +1373,6 @@
   __ ldr(R2, FieldAddress(R0, Function::instructions_offset()));
   __ AddImmediate(R2, Instructions::HeaderSize() - kHeapObjectTag);
   __ bx(R2);
-
-  // Instance in R0, return its class-id in R0 as Smi.
-  __ Bind(&get_class_id_as_smi);
-
-  // Test if Smi -> load Smi class for comparison.
-  __ tst(R0, Operand(kSmiTagMask));
-  __ mov(R0, Operand(Smi::RawValue(kSmiCid)), EQ);
-  __ bx(LR, EQ);
-  __ LoadClassId(R0, R0);
-  __ SmiTag(R0);
-  __ bx(LR);
 }
 
 
diff --git a/runtime/vm/stub_code_arm64.cc b/runtime/vm/stub_code_arm64.cc
index 13f5a14..8f7b793 100644
--- a/runtime/vm/stub_code_arm64.cc
+++ b/runtime/vm/stub_code_arm64.cc
@@ -230,12 +230,6 @@
   __ mov(R26, CSP);
   __ mov(CSP, SP);
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ TestImmediate(R1, NativeArguments::AutoSetupScopeMask(), kNoPP);
-  __ b(&leaf_call, EQ);
-
   __ mov(R1, R5);  // Pass the function entrypoint to call.
   // Call native function invocation wrapper or redirection via simulator.
 #if defined(USING_SIMULATOR)
@@ -247,13 +241,7 @@
 #else
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel(), kNoPP);
 #endif
-  __ b(&done);
 
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ blr(R5);
-
-  __ Bind(&done);
   // Restore SP and CSP.
   __ mov(SP, CSP);
   __ mov(CSP, R26);
@@ -1305,9 +1293,11 @@
     __ Pop(R6);  // Restore.
     __ LeaveStubFrame();
   }
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ LoadFieldFromOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
   __ add(R7, R7, Operand(1));
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ StoreFieldToOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
 }
 
 
@@ -1318,9 +1308,11 @@
   Register func_reg = temp_reg;
   ASSERT(temp_reg == R6);
   __ LoadFieldFromOffset(func_reg, ic_reg, ICData::owner_offset(), kNoPP);
-  __ LoadFieldFromOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ LoadFieldFromOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
   __ AddImmediate(R7, R7, 1, kNoPP);
-  __ StoreFieldToOffset(R7, func_reg, Function::usage_counter_offset(), kNoPP);
+  __ StoreFieldToOffset(
+      R7, func_reg, Function::usage_counter_offset(), kNoPP, kWord);
 }
 
 
@@ -1373,7 +1365,7 @@
   // Load arguments descriptor into R4.
   __ LoadFieldFromOffset(R4, R5, ICData::arguments_descriptor_offset(), kNoPP);
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // R5: IC data object (preserved).
   __ LoadFieldFromOffset(R6, R5, ICData::ic_data_offset(), kNoPP);
   // R6: ic_data_array with check entries: classes and target functions.
@@ -1388,23 +1380,7 @@
 
   // R0 <- [SP + (R7 << 3)]
   __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
-
-  {
-    // TODO(zra): Put this code in a subroutine call as with other architectures
-    // when we have a bl(Label& l) instruction.
-    // Instance in R0, return its class-id in R0 as Smi.
-    // Test if Smi -> load Smi class for comparison.
-    Label not_smi, done;
-    __ tsti(R0, kSmiTagMask);
-    __ b(&not_smi, NE);
-    __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-    __ b(&done);
-
-    __ Bind(&not_smi);
-    __ LoadClassId(R0, R0, kNoPP);
-    __ SmiTag(R0);
-    __ Bind(&done);
-  }
+  __ LoadTaggedClassIdMayBeSmi(R0, R0);
 
   // R7: argument_count - 1 (untagged).
   // R0: receiver's class ID (smi).
@@ -1418,20 +1394,7 @@
       __ AddImmediate(R0, R7, -i, kNoPP);
       // R0 <- [SP + (R0 << 3)]
       __ ldr(R0, Address(SP, R0, UXTX, Address::Scaled));
-      {
-        // Instance in R0, return its class-id in R0 as Smi.
-        // Test if Smi -> load Smi class for comparison.
-        Label not_smi, done;
-        __ tsti(R0, kSmiTagMask);
-        __ b(&not_smi, NE);
-        __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-        __ b(&done);
-
-        __ Bind(&not_smi);
-        __ LoadClassId(R0, R0, kNoPP);
-        __ SmiTag(R0);
-        __ Bind(&done);
-      }
+      __ LoadTaggedClassIdMayBeSmi(R0, R0);
       // R0: next argument class ID (smi).
       __ LoadFromOffset(R1, R6, i * kWordSize, kNoPP);
       // R1: next class ID to check (smi).
@@ -1448,20 +1411,7 @@
   // Reload receiver class ID.  It has not been destroyed when num_args == 1.
   if (num_args > 1) {
     __ ldr(R0, Address(SP, R7, UXTX, Address::Scaled));
-    {
-      // Instance in R0, return its class-id in R0 as Smi.
-      // Test if Smi -> load Smi class for comparison.
-      Label not_smi, done;
-      __ tsti(R0, kSmiTagMask);
-      __ b(&not_smi, NE);
-      __ LoadImmediate(R0, Smi::RawValue(kSmiCid), kNoPP);
-      __ b(&done);
-
-      __ Bind(&not_smi);
-      __ LoadClassId(R0, R0, kNoPP);
-      __ SmiTag(R0);
-      __ Bind(&done);
-    }
+    __ LoadTaggedClassIdMayBeSmi(R0, R0);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1583,7 +1533,8 @@
 
 
 void StubCode::GenerateClosureCallInlineCacheStub(Assembler* assembler) {
-  __ Stop("GenerateClosureCallInlineCacheStub");
+  GenerateNArgsCheckInlineCacheStub(
+      assembler, 1, kInlineCacheMissHandlerOneArgRuntimeEntry);
 }
 
 
@@ -1731,8 +1682,8 @@
     // Compute instance type arguments into R4.
     Label has_no_type_arguments;
     __ LoadObject(R4, Object::null_object(), PP);
-    __ LoadFieldFromOffset(
-        R5, R3, Class::type_arguments_field_offset_in_words_offset(), kNoPP);
+    __ LoadFieldFromOffset(R5, R3,
+        Class::type_arguments_field_offset_in_words_offset(), kNoPP, kWord);
     __ CompareImmediate(R5, Class::kNoTypeArguments, kNoPP);
     __ b(&has_no_type_arguments, EQ);
     __ add(R5, R0, Operand(R5, LSL, 3));
@@ -1830,8 +1781,23 @@
 }
 
 
+// Jump to the exception or error handler.
+// LR: return address.
+// R0: program_counter.
+// R1: stack_pointer.
+// R2: frame_pointer.
+// R3: error object.
+// R4: address of stacktrace object.
+// Does not return.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
-  __ Stop("GenerateJumpToExceptionHandlerStub");
+  ASSERT(kExceptionObjectReg == R0);
+  ASSERT(kStackTraceObjectReg == R1);
+  __ mov(LR, R0);  // Program counter.
+  __ mov(SP, R1);  // Stack pointer.
+  __ mov(FP, R2);  // Frame_pointer.
+  __ mov(R0, R3);  // Exception object.
+  __ mov(R1, R4);  // StackTrace object.
+  __ ret();  // Jump to the exception handler code.
 }
 
 
@@ -1852,7 +1818,7 @@
   __ AddImmediate(R0, R0, Instructions::HeaderSize() - kHeapObjectTag, PP);
   __ LeaveStubFrame();
   __ br(R0);
-  __ hlt(0);
+  __ brk(0);
 }
 
 
diff --git a/runtime/vm/stub_code_ia32.cc b/runtime/vm/stub_code_ia32.cc
index cd64f41..e5b1bb9 100644
--- a/runtime/vm/stub_code_ia32.cc
+++ b/runtime/vm/stub_code_ia32.cc
@@ -227,17 +227,8 @@
   __ leal(EAX, Address(ESP, 2 * kWordSize));  // Pointer to the NativeArguments.
   __ movl(Address(ESP, 0), EAX);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ testl(EDX, Immediate(NativeArguments::AutoSetupScopeMask()));
-  __ j(ZERO, &leaf_call, Assembler::kNearJump);
   __ movl(Address(ESP, kWordSize), ECX);  // Function to call.
   __ call(&NativeEntry::NativeCallWrapperLabel());
-  __ jmp(&done);
-  __ Bind(&leaf_call);
-  __ call(ECX);
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ movl(Address(CTX, Isolate::vm_tag_offset()),
@@ -1322,7 +1313,7 @@
   // Load arguments descriptor into EDX.
   __ movl(EDX, FieldAddress(ECX, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // ECX: IC data object (preserved).
   __ movl(EBX, FieldAddress(ECX, ICData::ic_data_offset()));
   // EBX: ic_data_array with check entries: classes and target functions.
@@ -1333,7 +1324,8 @@
   // arguments descriptor array and then access the receiver from the stack).
   __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
   __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));  // EAX (argument_count) is smi.
-  __ call(&get_class_id_as_smi);
+  __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+
   // EAX: receiver's class ID (smi).
   __ movl(EDI, Address(EBX, 0));  // First class id (smi) to check.
   __ jmp(&test);
@@ -1344,7 +1336,8 @@
       // If not the first, load the next argument's class ID.
       __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
       __ movl(EAX, Address(ESP, EAX, TIMES_2, - i * kWordSize));
-      __ call(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
+
       // EAX: next argument class ID (smi).
       __ movl(EDI, Address(EBX, i * kWordSize));
       // EDI: next class ID to check (smi).
@@ -1362,7 +1355,7 @@
   if (num_args > 1) {
     __ movl(EAX, FieldAddress(EDX, ArgumentsDescriptor::count_offset()));
     __ movl(EAX, Address(ESP, EAX, TIMES_2, 0));
-    __ call(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(EAX, EAX);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1419,20 +1412,7 @@
   __ movl(EBX, FieldAddress(EAX, Function::instructions_offset()));
   __ addl(EBX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(EBX);
-
-  // Instance in EAX, return its class-id in EAX as Smi.
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ testl(EAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movl(EAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ ret();
-
-  __ Bind(&not_smi);
-  __ LoadClassId(EAX, EAX);
-  __ SmiTag(EAX);
-  __ ret();
+  __ int3();
 }
 
 
diff --git a/runtime/vm/stub_code_mips.cc b/runtime/vm/stub_code_mips.cc
index 6718260..5c9a554a 100644
--- a/runtime/vm/stub_code_mips.cc
+++ b/runtime/vm/stub_code_mips.cc
@@ -230,11 +230,6 @@
   __ sw(A0, Address(SP, 0 * kWordSize));
   __ mov(A0, SP);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ AndImmediate(CMPRES1, A1, NativeArguments::AutoSetupScopeMask());
-  __ beq(CMPRES1, ZR, &leaf_call);
 
   __ mov(A1, T5);  // Pass the function entrypoint.
   __ ReserveAlignedFrameSpace(2 * kWordSize);  // Just passing A0, A1.
@@ -249,19 +244,6 @@
   __ BranchLink(&NativeEntry::NativeCallWrapperLabel());
 #endif
   __ TraceSimMsg("CallNativeCFunctionStub return");
-  __ b(&done);
-
-  __ Bind(&leaf_call);
-  // Call native function or redirection via simulator.
-  __ ReserveAlignedFrameSpace(kWordSize);  // Just passing A0.
-
-
-  // We defensively always jalr through T9 because it is sometimes required by
-  // the MIPS ABI.
-  __ mov(T9, T5);
-  __ jalr(T9);
-
-  __ Bind(&done);
 
   // Mark that the isolate is executing Dart code.
   __ LoadImmediate(A2, VMTag::kScriptTagId);
@@ -1446,7 +1428,7 @@
   // Preserve return address, since RA is needed for subroutine call.
   __ mov(T2, RA);
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // S5: IC data object (preserved).
   __ lw(T0, FieldAddress(S5, ICData::ic_data_offset()));
   // T0: ic_data_array with check entries: classes and target functions.
@@ -1460,8 +1442,9 @@
   __ subu(T1, T1, TMP);
   __ sll(T3, T1, 1);  // T1 (argument_count - 1) is smi.
   __ addu(T3, T3, SP);
-  __ bal(&get_class_id_as_smi);
-  __ delay_slot()->lw(T3, Address(T3));
+  __ lw(T3, Address(T3));
+  __ LoadTaggedClassIdMayBeSmi(T3, T3);
+
   // T1: argument_count - 1 (smi).
   // T3: receiver's class ID (smi).
   __ b(&test);
@@ -1475,8 +1458,8 @@
       __ addu(T3, T1, T3);
       __ sll(T3, T3, 1);
       __ addu(T3, SP, T3);
-      __ bal(&get_class_id_as_smi);
-      __ delay_slot()->lw(T3, Address(T3));
+      __ lw(T3, Address(T3));
+      __ LoadTaggedClassIdMayBeSmi(T3, T3);
       // T3: next argument class ID (smi).
       __ lw(T4, Address(T0, i * kWordSize));
       // T4: next class ID to check (smi).
@@ -1497,8 +1480,8 @@
   if (num_args > 1) {
     __ sll(T3, T1, 1);
     __ addu(T3, T3, SP);
-    __ bal(&get_class_id_as_smi);
-    __ delay_slot()->lw(T3, Address(T3));
+    __ lw(T3, Address(T3));
+    __ LoadTaggedClassIdMayBeSmi(T3, T3);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1573,20 +1556,6 @@
   __ lw(T4, FieldAddress(T0, Function::instructions_offset()));
   __ AddImmediate(T4, Instructions::HeaderSize() - kHeapObjectTag);
   __ jr(T4);
-
-  // Instance in T3, return its class-id in T3 as Smi.
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ andi(CMPRES1, T3, Immediate(kSmiTagMask));
-  __ bne(CMPRES1, ZR, &not_smi);
-  __ jr(RA);
-  __ delay_slot()->addiu(T3, ZR, Immediate(Smi::RawValue(kSmiCid)));
-
-  __ Bind(&not_smi);
-  __ LoadClassId(T3, T3);
-  __ jr(RA);
-  __ delay_slot()->SmiTag(T3);
 }
 
 
diff --git a/runtime/vm/stub_code_x64.cc b/runtime/vm/stub_code_x64.cc
index 5fd0af6..e13b54f 100644
--- a/runtime/vm/stub_code_x64.cc
+++ b/runtime/vm/stub_code_x64.cc
@@ -89,7 +89,11 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ addq(RAX, Immediate(1 * kWordSize));  // Retval is next to 1st argument.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ call(RBX);
+#if defined(_WIN64)
+  ASSERT(sizeof(NativeArguments) > CallingConventions::kRegisterTransferLimit);
+  __ movq(CallingConventions::kArg1Reg, RSP);
+#endif
+  __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -127,6 +131,9 @@
 void StubCode::GeneratePrintStopMessageStub(Assembler* assembler) {
   __ EnterCallRuntimeFrame(0);
   // Call the runtime leaf function. RDI already contains the parameter.
+#if defined(_WIN64)
+  __ movq(CallingConventions::kArg1Reg, RDI);
+#endif
   __ CallRuntime(kPrintStopMessageRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -193,19 +200,12 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
 
-  // Call native function (setsup scope if not leaf function).
-  Label leaf_call;
-  Label done;
-  __ testq(R10, Immediate(NativeArguments::AutoSetupScopeMask()));
-  __ j(ZERO, &leaf_call);
-  __ movq(RSI, RBX);  // Pass pointer to function entrypoint.
-  __ call(&NativeEntry::NativeCallWrapperLabel());
-  __ jmp(&done);
-  __ Bind(&leaf_call);
-  __ call(RBX);
-  __ Bind(&done);
+  // Pass the pointer to the NativeArguments.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  // Pass pointer to function entrypoint.
+  __ movq(CallingConventions::kArg2Reg, RBX);
+  __ CallCFunction(&NativeEntry::NativeCallWrapperLabel());
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -289,8 +289,10 @@
   __ movq(Address(RSP, argv_offset), RAX);  // Set argv in NativeArguments.
   __ leaq(RAX, Address(RBP, 2 * kWordSize));  // Compute return value addr.
   __ movq(Address(RSP, retval_offset), RAX);  // Set retval in NativeArguments.
-  __ movq(RDI, RSP);  // Pass the pointer to the NativeArguments.
-  __ call(RBX);
+
+  // Pass the pointer to the NativeArguments.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  __ CallCFunction(RBX);
 
   // Mark that the isolate is executing Dart code.
   __ movq(Address(CTX, Isolate::vm_tag_offset()),
@@ -439,8 +441,9 @@
     offset += kFpuRegisterSize;
   }
 
-  __ movq(RDI, RSP);  // Pass address of saved registers block.
-  __ ReserveAlignedFrameSpace(0);
+  // Pass address of saved registers block.
+  __ movq(CallingConventions::kArg1Reg, RSP);
+  __ ReserveAlignedFrameSpace(0);  // Ensure stack is aligned before the call.
   __ CallRuntime(kDeoptimizeCopyFrameRuntimeEntry, 1);
   // Result (RAX) is stack-size (FP - SP) in bytes.
 
@@ -467,7 +470,8 @@
     __ pushq(RBX);  // Preserve result as first local.
   }
   __ ReserveAlignedFrameSpace(0);
-  __ movq(RDI, RBP);  // Pass last FP as parameter in RDI.
+  // Pass last FP as a parameter.
+  __ movq(CallingConventions::kArg1Reg, RBP);
   __ CallRuntime(kDeoptimizeFillFrameRuntimeEntry, 1);
   if (preserve_result) {
     // Restore result into RBX.
@@ -686,6 +690,11 @@
   // Save frame pointer coming in.
   __ EnterFrame(0);
 
+  const Register kEntryPointReg = CallingConventions::kArg1Reg;
+  const Register kArgDescReg    = CallingConventions::kArg2Reg;
+  const Register kArgsReg       = CallingConventions::kArg3Reg;
+  const Register kNewContextReg = CallingConventions::kArg4Reg;
+
   // At this point, the stack looks like:
   // | saved RBP                                      | <-- RBP
   // | saved PC (return to DartEntry::InvokeFunction) |
@@ -693,16 +702,13 @@
   const intptr_t kInitialOffset = 1;
   // Save arguments descriptor array and new context.
   const intptr_t kArgumentsDescOffset = -(kInitialOffset) * kWordSize;
-  __ pushq(RSI);
+  __ pushq(kArgDescReg);
   const intptr_t kNewContextOffset = -(kInitialOffset + 1) * kWordSize;
-  __ pushq(RCX);
+  __ pushq(kNewContextReg);
 
   // Save C++ ABI callee-saved registers.
-  __ pushq(RBX);
-  __ pushq(R12);
-  __ pushq(R13);
-  __ pushq(R14);
-  __ pushq(R15);
+  __ PushRegisters(CallingConventions::kCalleeSaveCpuRegisters,
+                   CallingConventions::kCalleeSaveXmmRegisters);
 
   // We now load the pool pointer(PP) as we are about to invoke dart code and we
   // could potentially invoke some intrinsic functions which need the PP to be
@@ -720,28 +726,50 @@
   // compiled or runtime stub code.
 
   // Cache the new Context pointer into CTX while executing Dart code.
-  __ movq(CTX, Address(RCX, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(CTX, Address(kNewContextReg, VMHandles::kOffsetOfRawPtrInHandle));
+
+  const Register kIsolateReg = RBX;
 
   // Load Isolate pointer from Context structure into R8.
-  __ movq(R8, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
 
   // Save the current VMTag on the stack.
-  ASSERT(kSavedVMTagSlotFromEntryFp == -8);
-  __ movq(RAX, Address(R8, Isolate::vm_tag_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::vm_tag_offset()));
   __ pushq(RAX);
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kSavedVMTagSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kSavedVMTagSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
 
   // Mark that the isolate is executing Dart code.
-  __ movq(Address(R8, Isolate::vm_tag_offset()),
+  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()),
           Immediate(VMTag::kScriptTagId));
 
   // Save the top exit frame info. Use RAX as a temporary register.
   // StackFrameIterator reads the top exit frame info saved in this frame.
   // The constant kExitLinkSlotFromEntryFp must be kept in sync with the
   // code below.
-  ASSERT(kExitLinkSlotFromEntryFp == -9);
-  __ movq(RAX, Address(R8, Isolate::top_exit_frame_info_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::top_exit_frame_info_offset()));
   __ pushq(RAX);
-  __ movq(Address(R8, Isolate::top_exit_frame_info_offset()), Immediate(0));
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kExitLinkSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kExitLinkSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
+
+  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()),
+          Immediate(0));
 
   // Save the old Context pointer. Use RAX as a temporary register.
   // Note that VisitObjectPointers will find this saved Context pointer during
@@ -750,19 +778,31 @@
   // EntryFrame::SavedContext reads the context saved in this frame.
   // The constant kSavedContextSlotFromEntryFp must be kept in sync with
   // the code below.
-  ASSERT(kSavedContextSlotFromEntryFp == -10);
-  __ movq(RAX, Address(R8, Isolate::top_context_offset()));
+  __ movq(RAX, Address(kIsolateReg, Isolate::top_context_offset()));
   __ pushq(RAX);
+#if defined(DEBUG)
+  {
+    Label ok;
+    __ leaq(RAX, Address(RBP, kSavedContextSlotFromEntryFp * kWordSize));
+    __ cmpq(RAX, RSP);
+    __ j(EQUAL, &ok);
+    __ Stop("kSavedContextSlotFromEntryFp mismatch");
+    __ Bind(&ok);
+  }
+#endif
 
   // Load arguments descriptor array into R10, which is passed to Dart code.
-  __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
+
+  // Push arguments. At this point we only need to preserve kEntryPointReg.
+  ASSERT(kEntryPointReg != RDX);
 
   // Load number of arguments into RBX.
   __ movq(RBX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ SmiUntag(RBX);
 
   // Compute address of 'arguments array' data area into RDX.
-  __ movq(RDX, Address(RDX, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(RDX, Address(kArgsReg, VMHandles::kOffsetOfRawPtrInHandle));
   __ leaq(RDX, FieldAddress(RDX, Array::data_offset()));
 
   // Set up arguments for the Dart call.
@@ -772,51 +812,45 @@
   __ j(ZERO, &done_push_arguments, Assembler::kNearJump);
   __ movq(RAX, Immediate(0));
   __ Bind(&push_arguments);
-  __ movq(RCX, Address(RDX, RAX, TIMES_8, 0));  // RDX is start of arguments.
-  __ pushq(RCX);
+  __ pushq(Address(RDX, RAX, TIMES_8, 0));
   __ incq(RAX);
   __ cmpq(RAX, RBX);
   __ j(LESS, &push_arguments, Assembler::kNearJump);
   __ Bind(&done_push_arguments);
 
   // Call the Dart code entrypoint.
-  __ call(RDI);  // R10 is the arguments descriptor array.
+  __ call(kEntryPointReg);  // R10 is the arguments descriptor array.
 
-  // Read the saved new Context pointer.
+  // Restore CTX from the saved context handle.
   __ movq(CTX, Address(RBP, kNewContextOffset));
   __ movq(CTX, Address(CTX, VMHandles::kOffsetOfRawPtrInHandle));
 
   // Read the saved arguments descriptor array to obtain the number of passed
   // arguments.
-  __ movq(RSI, Address(RBP, kArgumentsDescOffset));
-  __ movq(R10, Address(RSI, VMHandles::kOffsetOfRawPtrInHandle));
+  __ movq(kArgDescReg, Address(RBP, kArgumentsDescOffset));
+  __ movq(R10, Address(kArgDescReg, VMHandles::kOffsetOfRawPtrInHandle));
   __ movq(RDX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   // Get rid of arguments pushed on the stack.
   __ leaq(RSP, Address(RSP, RDX, TIMES_4, 0));  // RDX is a Smi.
 
   // Load Isolate pointer from Context structure into CTX. Drop Context.
-  __ movq(CTX, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(kIsolateReg, FieldAddress(CTX, Context::isolate_offset()));
 
   // Restore the saved Context pointer into the Isolate structure.
-  // Uses RCX as a temporary register for this.
-  __ popq(RCX);
-  __ movq(Address(CTX, Isolate::top_context_offset()), RCX);
+  __ popq(RDX);
+  __ movq(Address(kIsolateReg, Isolate::top_context_offset()), RDX);
 
   // Restore the saved top exit frame info back into the Isolate structure.
-  // Uses RDX as a temporary register for this.
   __ popq(RDX);
-  __ movq(Address(CTX, Isolate::top_exit_frame_info_offset()), RDX);
+  __ movq(Address(kIsolateReg, Isolate::top_exit_frame_info_offset()), RDX);
 
   // Restore the current VMTag from the stack.
   __ popq(RDX);
-  __ movq(Address(CTX, Isolate::vm_tag_offset()), RDX);
+  __ movq(Address(kIsolateReg, Isolate::vm_tag_offset()), RDX);
 
   // Restore C++ ABI callee-saved registers.
-  __ popq(R15);
-  __ popq(R14);
-  __ popq(R13);
-  __ popq(R12);
-  __ popq(RBX);
+  __ PopRegisters(CallingConventions::kCalleeSaveCpuRegisters,
+                  CallingConventions::kCalleeSaveXmmRegisters);
 
   // Restore the frame pointer.
   __ LeaveFrame();
@@ -1006,7 +1040,8 @@
   __ Bind(&L);
   // Setup frame, push callee-saved registers.
   __ EnterCallRuntimeFrame(0);
-  __ movq(RDI, FieldAddress(CTX, Context::isolate_offset()));
+  __ movq(CallingConventions::kArg1Reg,
+          FieldAddress(CTX, Context::isolate_offset()));
   __ CallRuntime(kStoreBufferBlockProcessRuntimeEntry, 1);
   __ LeaveCallRuntimeFrame();
   __ ret();
@@ -1187,7 +1222,7 @@
     __ popq(func_reg);     // Restore.
     __ LeaveStubFrame();
   }
-  __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
+  __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
 
@@ -1198,7 +1233,7 @@
   Register func_reg = temp_reg;
   ASSERT(ic_reg != func_reg);
   __ movq(func_reg, FieldAddress(ic_reg, ICData::owner_offset()));
-  __ incq(FieldAddress(func_reg, Function::usage_counter_offset()));
+  __ incl(FieldAddress(func_reg, Function::usage_counter_offset()));
 }
 
 
@@ -1249,7 +1284,7 @@
   // Load arguments descriptor into R10.
   __ movq(R10, FieldAddress(RBX, ICData::arguments_descriptor_offset()));
   // Loop that checks if there is an IC data match.
-  Label loop, update, test, found, get_class_id_as_smi;
+  Label loop, update, test, found;
   // RBX: IC data object (preserved).
   __ movq(R12, FieldAddress(RBX, ICData::ic_data_offset()));
   // R12: ic_data_array with check entries: classes and target functions.
@@ -1260,7 +1295,7 @@
   // arguments descriptor array and then access the receiver from the stack).
   __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
   __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));  // RAX (argument count) is Smi.
-  __ call(&get_class_id_as_smi);
+  __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
   // RAX: receiver's class ID as smi.
   __ movq(R13, Address(R12, 0));  // First class ID (Smi) to check.
   __ jmp(&test);
@@ -1271,7 +1306,7 @@
       // If not the first, load the next argument's class ID.
       __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
       __ movq(RAX, Address(RSP, RAX, TIMES_4, - i * kWordSize));
-      __ call(&get_class_id_as_smi);
+      __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
       // RAX: next argument class ID (smi).
       __ movq(R13, Address(R12, i * kWordSize));
       // R13: next class ID to check (smi).
@@ -1289,7 +1324,7 @@
   if (num_args > 1) {
     __ movq(RAX, FieldAddress(R10, ArgumentsDescriptor::count_offset()));
     __ movq(RAX, Address(RSP, RAX, TIMES_4, 0));
-    __ call(&get_class_id_as_smi);
+    __ LoadTaggedClassIdMayBeSmi(RAX, RAX);
   }
 
   const intptr_t entry_size = ICData::TestEntryLengthFor(num_args) * kWordSize;
@@ -1344,19 +1379,6 @@
   __ movq(RCX, FieldAddress(RAX, Function::instructions_offset()));
   __ addq(RCX, Immediate(Instructions::HeaderSize() - kHeapObjectTag));
   __ jmp(RCX);
-
-  __ Bind(&get_class_id_as_smi);
-  Label not_smi;
-  // Test if Smi -> load Smi class for comparison.
-  __ testq(RAX, Immediate(kSmiTagMask));
-  __ j(NOT_ZERO, &not_smi, Assembler::kNearJump);
-  __ movq(RAX, Immediate(Smi::RawValue(kSmiCid)));
-  __ ret();
-
-  __ Bind(&not_smi);
-  __ LoadClassId(RAX, RAX);
-  __ SmiTag(RAX);
-  __ ret();
 }
 
 
@@ -1579,9 +1601,9 @@
     // Compute instance type arguments into R13.
     Label has_no_type_arguments;
     __ movq(R13, R12);
-    __ movq(RDI, FieldAddress(R10,
+    __ movl(RDI, FieldAddress(R10,
         Class::type_arguments_field_offset_in_words_offset()));
-    __ cmpq(RDI, Immediate(Class::kNoTypeArguments));
+    __ cmpl(RDI, Immediate(Class::kNoTypeArguments));
     __ j(EQUAL, &has_no_type_arguments, Assembler::kNearJump);
     __ movq(R13, FieldAddress(RAX, RDI, TIMES_8, 0));
     __ Bind(&has_no_type_arguments);
@@ -1681,20 +1703,30 @@
 
 // Jump to the exception or error handler.
 // TOS + 0: return address
-// RDI: program counter
-// RSI: stack pointer
-// RDX: frame_pointer
-// RCX: exception object
-// R8: stacktrace object
+// Arg1: program counter
+// Arg2: stack pointer
+// Arg3: frame_pointer
+// Arg4: exception object
+// Arg5: stacktrace object
 // No Result.
 void StubCode::GenerateJumpToExceptionHandlerStub(Assembler* assembler) {
   ASSERT(kExceptionObjectReg == RAX);
   ASSERT(kStackTraceObjectReg == RDX);
-  __ movq(RBP, RDX);  // target frame pointer.
-  __ movq(kStackTraceObjectReg, R8);  // stacktrace object.
-  __ movq(kExceptionObjectReg, RCX);  // exception object.
-  __ movq(RSP, RSI);   // target stack_pointer.
-  __ jmp(RDI);  // Jump to the exception handler code.
+  ASSERT(CallingConventions::kArg4Reg != kStackTraceObjectReg);
+  ASSERT(CallingConventions::kArg1Reg != kStackTraceObjectReg);
+
+#if defined(_WIN64)
+  Register stacktrace_reg = RBX;
+  __ movq(stacktrace_reg, Address(RSP, 5 * kWordSize));
+#else
+  Register stacktrace_reg = CallingConventions::kArg5Reg;
+#endif
+
+  __ movq(RBP, CallingConventions::kArg3Reg);
+  __ movq(RSP, CallingConventions::kArg2Reg);
+  __ movq(kStackTraceObjectReg, stacktrace_reg);
+  __ movq(kExceptionObjectReg, CallingConventions::kArg4Reg);
+  __ jmp(CallingConventions::kArg1Reg);  // Jump to the exception handler code.
 }
 
 
@@ -1770,8 +1802,8 @@
   __ j(NOT_EQUAL, &done, Assembler::kNearJump);
   __ EnterFrame(0);
   __ ReserveAlignedFrameSpace(0);
-  __ movq(RDI, left);
-  __ movq(RSI, right);
+  __ movq(CallingConventions::kArg1Reg, left);
+  __ movq(CallingConventions::kArg2Reg, right);
   __ CallRuntime(kBigintCompareRuntimeEntry, 2);
   // Result in RAX, 0 means equal.
   __ LeaveFrame();
diff --git a/runtime/vm/stub_code_x64_test.cc b/runtime/vm/stub_code_x64_test.cc
index f1c43b1..56b56fc 100644
--- a/runtime/vm/stub_code_x64_test.cc
+++ b/runtime/vm/stub_code_x64_test.cc
@@ -86,8 +86,8 @@
   const Smi& smi2 = Smi::ZoneHandle(Smi::New(value2));
   __ enter(Immediate(0));
   __ ReserveAlignedFrameSpace(0);
-  __ LoadObject(RDI, smi1, PP);  // Set up argument 1 smi1.
-  __ LoadObject(RSI, smi2, PP);  // Set up argument 2 smi2.
+  __ LoadObject(CallingConventions::kArg1Reg, smi1, PP);
+  __ LoadObject(CallingConventions::kArg2Reg, smi2, PP);
   __ CallRuntime(kTestLeafSmiAddRuntimeEntry, 2);  // Call SmiAdd runtime func.
   __ leave();
   __ ret();  // Return value is in RAX.
diff --git a/runtime/vm/symbols.h b/runtime/vm/symbols.h
index ddfc19c..ed1cdd6 100644
--- a/runtime/vm/symbols.h
+++ b/runtime/vm/symbols.h
@@ -231,6 +231,7 @@
   V(_ExternalFloat64x2Array, "_ExternalFloat64x2Array")                        \
   V(ByteData, "ByteData")                                                      \
   V(ByteDataDot, "ByteData.")                                                  \
+  V(ByteDataDot_view, "ByteData._view")                                        \
   V(ByteDataDotview, "ByteData.view")                                          \
   V(_ByteDataView, "_ByteDataView")                                            \
   V(_WeakProperty, "_WeakProperty")                                            \
@@ -315,13 +316,13 @@
   V(_leftShiftWithMask32, "_leftShiftWithMask32")                              \
   V(OptimizedOut, "<optimized out>")                                           \
   V(NotInitialized, "<not initialized>")                                       \
-  V(ClassId, "get:_classId")                                                   \
   V(AllocationStubFor, "Allocation stub for ")                                 \
   V(TempParam, ":temp_param")                                                  \
   V(UserTag, "UserTag")                                                        \
   V(_UserTag, "_UserTag")                                                      \
   V(Default, "Default")                                                        \
   V(StubPrefix, "[Stub] ")                                                     \
+  V(ClassID, "ClassID")                                                        \
 
 
 // Contains a list of frequently used strings in a canonicalized form. This
diff --git a/runtime/vm/thread_interrupter_win.cc b/runtime/vm/thread_interrupter_win.cc
index b39c188..ef9223f 100644
--- a/runtime/vm/thread_interrupter_win.cc
+++ b/runtime/vm/thread_interrupter_win.cc
@@ -26,9 +26,9 @@
       state->fp = static_cast<uintptr_t>(context.Ebp);
       state->sp = static_cast<uintptr_t>(context.Esp);
 #elif defined(TARGET_ARCH_X64)
-      state->pc = reinterpret_cast<uintptr_t>(context.Rip);
-      state->fp = reinterpret_cast<uintptr_t>(context.Rbp);
-      state->sp = reinterpret_cast<uintptr_t>(context.Rsp);
+      state->pc = static_cast<uintptr_t>(context.Rip);
+      state->fp = static_cast<uintptr_t>(context.Rbp);
+      state->sp = static_cast<uintptr_t>(context.Rsp);
 #else
       UNIMPLEMENTED();
 #endif
diff --git a/runtime/vm/trace_buffer.cc b/runtime/vm/trace_buffer.cc
index 831e95d..2022e49 100644
--- a/runtime/vm/trace_buffer.cc
+++ b/runtime/vm/trace_buffer.cc
@@ -2,15 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+#include "vm/isolate.h"
 #include "vm/json_stream.h"
+#include "vm/object.h"
 #include "vm/os.h"
 #include "vm/trace_buffer.h"
 
 namespace dart {
 
-TraceBuffer::TraceBuffer(intptr_t capacity) : ring_capacity_(capacity) {
+TraceBuffer::TraceBuffer(Isolate* isolate, intptr_t capacity)
+    : isolate_(isolate), ring_capacity_(capacity) {
   ring_cursor_ = 0;
-  Init();
+  ring_ = reinterpret_cast<TraceBufferEntry*>(
+      calloc(ring_capacity_, sizeof(TraceBufferEntry)));  // NOLINT
 }
 
 
@@ -18,12 +22,16 @@
   ASSERT(ring_ != NULL);
   Clear();
   free(ring_);
+  if (isolate_ != NULL) {
+    isolate_->set_trace_buffer(NULL);
+    isolate_ = NULL;
+  }
 }
 
 
-void TraceBuffer::Init() {
-  ring_ = reinterpret_cast<TraceBufferEntry*>(
-      calloc(ring_capacity_, sizeof(TraceBufferEntry)));  // NOLINT
+void TraceBuffer::Init(Isolate* isolate, intptr_t capacity) {
+  TraceBuffer* trace_buffer = new TraceBuffer(isolate, capacity);
+  isolate->set_trace_buffer(trace_buffer);
 }
 
 
@@ -33,50 +41,53 @@
     entry.micros = 0;
     free(entry.message);
     entry.message = NULL;
+    entry.message_is_escaped = false;
   }
   ring_cursor_ = 0;
 }
 
 
-void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros, char* msg) {
+void TraceBuffer::Fill(TraceBufferEntry* entry, int64_t micros,
+                       char* msg, bool msg_is_escaped) {
   if (entry->message != NULL) {
     // Recycle TraceBufferEntry.
     free(entry->message);
   }
   entry->message = msg;
+  entry->message_is_escaped = msg_is_escaped;
   entry->micros = micros;
 }
 
 
-void TraceBuffer::AppendTrace(int64_t micros, char* message) {
+void TraceBuffer::AppendTrace(int64_t micros, char* msg, bool msg_is_escaped) {
   const intptr_t index = ring_cursor_;
   TraceBufferEntry* trace_entry = &ring_[index];
-  Fill(trace_entry, micros, message);
+  Fill(trace_entry, micros, msg, msg_is_escaped);
   ring_cursor_ = RingIndex(ring_cursor_ + 1);
 }
 
 
-void TraceBuffer::Trace(int64_t micros, const char* message) {
-  ASSERT(message != NULL);
-  char* message_copy = strdup(message);
-  AppendTrace(micros, message_copy);
+void TraceBuffer::Trace(int64_t micros, const char* msg, bool msg_is_escaped) {
+  ASSERT(msg != NULL);
+  char* message_copy = strdup(msg);
+  AppendTrace(micros, message_copy, msg_is_escaped);
 }
 
 
-void TraceBuffer::Trace(const char* message) {
-  Trace(OS::GetCurrentTimeMicros(), message);
+void TraceBuffer::Trace(const char* msg, bool msg_is_escaped) {
+  Trace(OS::GetCurrentTimeMicros(), msg, msg_is_escaped);
 }
 
 
 void TraceBuffer::TraceF(const char* format, ...) {
-  int64_t micros = OS::GetCurrentTimeMicros();
+  const int64_t micros = OS::GetCurrentTimeMicros();
   va_list args;
   va_start(args, format);
-  intptr_t len = OS::VSNPrint(NULL, 0, format, args);
+  const intptr_t len = OS::VSNPrint(NULL, 0, format, args);
   va_end(args);
   char* p = reinterpret_cast<char*>(malloc(len+1));
   va_start(args, format);
-  intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
+  const intptr_t len2 = OS::VSNPrint(p, len+1, format, args);
   va_end(args);
   ASSERT(len == len2);
   AppendTrace(micros, p);
@@ -114,7 +125,11 @@
     double seconds = static_cast<double>(entry.micros) /
                      static_cast<double>(kMicrosecondsPerSecond);
     trace_entry.AddProperty("time", seconds);
-    trace_entry.AddProperty("message", entry.message);
+    if (entry.message_is_escaped) {
+      trace_entry.AddPropertyNoEscape("message", entry.message);
+    } else {
+      trace_entry.AddProperty("message", entry.message);
+    }
   }
 }
 
diff --git a/runtime/vm/trace_buffer.h b/runtime/vm/trace_buffer.h
index f8b1c78..4c3c74c 100644
--- a/runtime/vm/trace_buffer.h
+++ b/runtime/vm/trace_buffer.h
@@ -12,10 +12,12 @@
 namespace dart {
 
 class JSONStream;
+class Script;
 
 struct TraceBufferEntry {
   int64_t micros;
   char* message;
+  bool message_is_escaped;
   bool empty() const {
     return message == NULL;
   }
@@ -25,25 +27,32 @@
  public:
   static const intptr_t kDefaultCapacity = 1024;
 
-  explicit TraceBuffer(intptr_t capacity = kDefaultCapacity);
+  static void Init(Isolate* isolate, intptr_t capacity = kDefaultCapacity);
+
   ~TraceBuffer();
 
   void Clear();
 
   // Internally message is copied.
-  void Trace(int64_t micros, const char* message);
+  void Trace(int64_t micros, const char* msg, bool msg_is_escaped = false);
   // Internally message is copied.
-  void Trace(const char* message);
+  void Trace(const char* msg, bool msg_is_escaped = false);
   void TraceF(const char* format, ...) PRINTF_ATTRIBUTE(2, 3);
 
   void PrintToJSONStream(JSONStream* stream) const;
 
- private:
-  void Init();
-  void Cleanup();
-  void Fill(TraceBufferEntry* entry, int64_t micros, char* msg);
-  void AppendTrace(int64_t micros, char* message);
+  // Accessors for testing.
+  TraceBufferEntry* At(intptr_t i) const { return &ring_[RingIndex(i)]; }
+  intptr_t Length() const { return ring_cursor_; }
 
+ private:
+  TraceBuffer(Isolate* isolate, intptr_t capacity);
+  void Cleanup();
+  void Fill(TraceBufferEntry* entry, int64_t micros,
+            char* msg, bool msg_is_escaped = false);
+  void AppendTrace(int64_t micros, char* msg, bool msg_is_escaped = false);
+
+  Isolate* isolate_;
   TraceBufferEntry* ring_;
   const intptr_t ring_capacity_;
   intptr_t ring_cursor_;
diff --git a/runtime/vm/trace_buffer_test.cc b/runtime/vm/trace_buffer_test.cc
index 1284876..f85941f 100644
--- a/runtime/vm/trace_buffer_test.cc
+++ b/runtime/vm/trace_buffer_test.cc
@@ -10,9 +10,10 @@
 
 namespace dart {
 
-
-UNIT_TEST_CASE(TraceBufferEmpty) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferEmpty) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   {
     JSONStream js;
     trace_buffer->PrintToJSONStream(&js);
@@ -22,8 +23,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferClear) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferClear) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
   trace_buffer->Clear();
   {
@@ -35,8 +38,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferTrace) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferTrace) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
 
   trace_buffer->Trace(kMicrosecondsPerSecond * 1, "abc");
   {
@@ -85,8 +90,10 @@
 }
 
 
-UNIT_TEST_CASE(TraceBufferTraceF) {
-  TraceBuffer* trace_buffer = new TraceBuffer(3);
+TEST_CASE(TraceBufferTraceF) {
+  Isolate* isolate = Isolate::Current();
+  TraceBuffer::Init(isolate, 3);
+  TraceBuffer* trace_buffer = isolate->trace_buffer();
   trace_buffer->TraceF("foo %d %s", 99, "bar");
   {
     JSONStream js;
@@ -96,5 +103,4 @@
   delete trace_buffer;
 }
 
-
 }  // namespace dart
diff --git a/runtime/vm/vm.gypi b/runtime/vm/vm.gypi
index 3bc5407..fc981ef 100644
--- a/runtime/vm/vm.gypi
+++ b/runtime/vm/vm.gypi
@@ -125,6 +125,7 @@
         '../lib/mirrors_sources.gypi',
         '../lib/typed_data_sources.gypi',
         '../lib/profiler_sources.gypi',
+        '../lib/internal_sources.gypi',
       ],
       'sources': [
         'bootstrap.cc',
@@ -167,6 +168,7 @@
         '../lib/mirrors_sources.gypi',
         '../lib/typed_data_sources.gypi',
         '../lib/profiler_sources.gypi',
+        '../lib/internal_sources.gypi',
       ],
       'sources': [
         'bootstrap_nocorelib.cc',
diff --git a/runtime/vm/vm_sources.gypi b/runtime/vm/vm_sources.gypi
index 18a871b..de8a4ae 100644
--- a/runtime/vm/vm_sources.gypi
+++ b/runtime/vm/vm_sources.gypi
@@ -98,8 +98,11 @@
     'constants_ia32.h',
     'constants_mips.h',
     'constants_x64.h',
+    'counters.cc',
+    'counters.h',
     'coverage.cc',
     'coverage.h',
+    'coverage_test.cc',
     'cpu.h',
     'cpu_arm.cc',
     'cpu_arm64.cc',
@@ -314,6 +317,9 @@
     'raw_object.cc',
     'raw_object.h',
     'raw_object_snapshot.cc',
+    'report.cc',
+    'report.h',
+    'report_test.cc',
     'resolver.cc',
     'resolver.h',
     'resolver_test.cc',
diff --git a/runtime/vm/zone_test.cc b/runtime/vm/zone_test.cc
index cf42722..31ec786 100644
--- a/runtime/vm/zone_test.cc
+++ b/runtime/vm/zone_test.cc
@@ -129,6 +129,7 @@
   class SimpleZoneObject : public ZoneAllocated {
    public:
     SimpleZoneObject() : slot(marker++) { }
+    virtual ~SimpleZoneObject() { }
     virtual int GetSlot() { return slot; }
     int slot;
   };
diff --git a/sdk/lib/_blink/dartium/_blink_dartium.dart b/sdk/lib/_blink/dartium/_blink_dartium.dart
index f32673f..e1255d4 100644
--- a/sdk/lib/_blink/dartium/_blink_dartium.dart
+++ b/sdk/lib/_blink/dartium/_blink_dartium.dart
@@ -40,8224 +40,9473 @@
 
 
 
-Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback_RESOLVER_STRING_4_unsigned long_long_long_long";
+class BlinkANGLEInstancedArrays {
+  static $drawArraysInstancedANGLE_Callback(mthis, mode, first, count, primcount) native "ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback_RESOLVER_STRING_4_unsigned long_long_long_long";
 
-Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback_RESOLVER_STRING_5_unsigned long_long_unsigned long_long long_long";
+  static $drawElementsInstancedANGLE_Callback(mthis, mode, count, type, offset, primcount) native "ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback_RESOLVER_STRING_5_unsigned long_long_unsigned long_long long_long";
 
-Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback_RESOLVER_STRING_2_unsigned long_long";
+  static $vertexAttribDivisorANGLE_Callback(mthis, index, divisor) native "ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback_RESOLVER_STRING_2_unsigned long_long";
+}
 
-Native_Algorithm_name_Getter(mthis) native "KeyAlgorithm_name_Getter";
+class BlinkAbstractWorker {}
 
-Native_EventTarget_addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+class BlinkAlgorithm {
+  static $name_Getter(mthis) native "KeyAlgorithm_name_Getter";
+}
 
-Native_EventTarget_dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback_RESOLVER_STRING_1_Event";
+class BlinkEventTarget {
+  static $addEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_addEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
 
-Native_EventTarget_removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+  static $dispatchEvent_Callback(mthis, event) native "EventTarget_dispatchEvent_Callback_RESOLVER_STRING_1_Event";
 
-Native_AudioNode_channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
+  static $removeEventListener_Callback(mthis, type, listener, useCapture) native "EventTarget_removeEventListener_Callback_RESOLVER_STRING_3_DOMString_EventListener_boolean";
+}
 
-Native_AudioNode_channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
+class BlinkAudioNode {
+  static $channelCount_Getter(mthis) native "AudioNode_channelCount_Getter";
 
-Native_AudioNode_channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
+  static $channelCount_Setter(mthis, value) native "AudioNode_channelCount_Setter";
 
-Native_AudioNode_channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
+  static $channelCountMode_Getter(mthis) native "AudioNode_channelCountMode_Getter";
 
-Native_AudioNode_channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
+  static $channelCountMode_Setter(mthis, value) native "AudioNode_channelCountMode_Setter";
 
-Native_AudioNode_channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
+  static $channelInterpretation_Getter(mthis) native "AudioNode_channelInterpretation_Getter";
 
-Native_AudioNode_context_Getter(mthis) native "AudioNode_context_Getter";
+  static $channelInterpretation_Setter(mthis, value) native "AudioNode_channelInterpretation_Setter";
 
-Native_AudioNode_numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+  static $context_Getter(mthis) native "AudioNode_context_Getter";
 
-Native_AudioNode_numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
+  static $numberOfInputs_Getter(mthis) native "AudioNode_numberOfInputs_Getter";
+
+  static $numberOfOutputs_Getter(mthis) native "AudioNode_numberOfOutputs_Getter";
 
   // Generated overload resolver
-Native_AudioNode__connect(mthis, destination, output, input) {
+  static $_connect(mthis, destination, output, input) {
     if ((input is int || input == null) && (output is int || output == null) && (destination is AudioNode || destination == null)) {
-      Native_AudioNode__connect_1_Callback(mthis, destination, output, input);
+      $_connect_1_Callback(mthis, destination, output, input);
       return;
     }
     if ((output is int || output == null) && (destination is AudioParam || destination == null) && input == null) {
-      Native_AudioNode__connect_2_Callback(mthis, destination, output);
+      $_connect_2_Callback(mthis, destination, output);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_AudioNode__connect_1_Callback(mthis, destination, output, input) native "AudioNode_connect_Callback_RESOLVER_STRING_3_AudioNode_unsigned long_unsigned long";
+  static $_connect_1_Callback(mthis, destination, output, input) native "AudioNode_connect_Callback_RESOLVER_STRING_3_AudioNode_unsigned long_unsigned long";
 
-Native_AudioNode__connect_2_Callback(mthis, destination, output) native "AudioNode_connect_Callback_RESOLVER_STRING_2_AudioParam_unsigned long";
+  static $_connect_2_Callback(mthis, destination, output) native "AudioNode_connect_Callback_RESOLVER_STRING_2_AudioParam_unsigned long";
 
-Native_AudioNode_disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disconnect_Callback(mthis, output) native "AudioNode_disconnect_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_AnalyserNode_fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
+class BlinkAnalyserNode {
+  static $fftSize_Getter(mthis) native "AnalyserNode_fftSize_Getter";
 
-Native_AnalyserNode_fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
+  static $fftSize_Setter(mthis, value) native "AnalyserNode_fftSize_Setter";
 
-Native_AnalyserNode_frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
+  static $frequencyBinCount_Getter(mthis) native "AnalyserNode_frequencyBinCount_Getter";
 
-Native_AnalyserNode_maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
+  static $maxDecibels_Getter(mthis) native "AnalyserNode_maxDecibels_Getter";
 
-Native_AnalyserNode_maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
+  static $maxDecibels_Setter(mthis, value) native "AnalyserNode_maxDecibels_Setter";
 
-Native_AnalyserNode_minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
+  static $minDecibels_Getter(mthis) native "AnalyserNode_minDecibels_Getter";
 
-Native_AnalyserNode_minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
+  static $minDecibels_Setter(mthis, value) native "AnalyserNode_minDecibels_Setter";
 
-Native_AnalyserNode_smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
+  static $smoothingTimeConstant_Getter(mthis) native "AnalyserNode_smoothingTimeConstant_Getter";
 
-Native_AnalyserNode_smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
+  static $smoothingTimeConstant_Setter(mthis, value) native "AnalyserNode_smoothingTimeConstant_Setter";
 
-Native_AnalyserNode_getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $getByteFrequencyData_Callback(mthis, array) native "AnalyserNode_getByteFrequencyData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $getByteTimeDomainData_Callback(mthis, array) native "AnalyserNode_getByteTimeDomainData_Callback_RESOLVER_STRING_1_Uint8Array";
 
-Native_AnalyserNode_getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_RESOLVER_STRING_1_Float32Array";
+  static $getFloatFrequencyData_Callback(mthis, array) native "AnalyserNode_getFloatFrequencyData_Callback_RESOLVER_STRING_1_Float32Array";
+}
 
-Native_TimedItem_activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
+class BlinkTimedItem {
+  static $activeDuration_Getter(mthis) native "TimedItem_activeDuration_Getter";
 
-Native_TimedItem_currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
+  static $currentIteration_Getter(mthis) native "TimedItem_currentIteration_Getter";
 
-Native_TimedItem_duration_Getter(mthis) native "TimedItem_duration_Getter";
+  static $duration_Getter(mthis) native "TimedItem_duration_Getter";
 
-Native_TimedItem_endTime_Getter(mthis) native "TimedItem_endTime_Getter";
+  static $endTime_Getter(mthis) native "TimedItem_endTime_Getter";
 
-Native_TimedItem_localTime_Getter(mthis) native "TimedItem_localTime_Getter";
+  static $localTime_Getter(mthis) native "TimedItem_localTime_Getter";
 
-Native_TimedItem_player_Getter(mthis) native "TimedItem_player_Getter";
+  static $player_Getter(mthis) native "TimedItem_player_Getter";
 
-Native_TimedItem_startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+  static $startTime_Getter(mthis) native "TimedItem_startTime_Getter";
+}
 
+class BlinkAnimation {
   // Generated overload resolver
-Native_Animation_Animation(target, keyframes, timingInput) {
+  static $mkAnimation(target, keyframes, timingInput) {
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Native_Animation__create_1constructorCallback(target, keyframes, timingInput);
+      return $_create_1constructorCallback(target, keyframes, timingInput);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null) && (target is Element || target == null)) {
-      return Native_Animation__create_2constructorCallback(target, keyframes, timingInput);
+      return $_create_2constructorCallback(target, keyframes, timingInput);
     }
     if ((keyframes is List<Map> || keyframes == null) && (target is Element || target == null) && timingInput == null) {
-      return Native_Animation__create_3constructorCallback(target, keyframes);
+      return $_create_3constructorCallback(target, keyframes);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Animation__create_1constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_Dictionary";
+  static $_create_1constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_Dictionary";
 
-Native_Animation__create_2constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_double";
+  static $_create_2constructorCallback(target, keyframes, timingInput) native "Animation_constructorCallback_RESOLVER_STRING_3_Element_sequence<Dictionary>_double";
 
-Native_Animation__create_3constructorCallback(target, keyframes) native "Animation_constructorCallback_RESOLVER_STRING_2_Element_sequence<Dictionary>";
+  static $_create_3constructorCallback(target, keyframes) native "Animation_constructorCallback_RESOLVER_STRING_2_Element_sequence<Dictionary>";
+}
 
-Native_ApplicationCache_status_Getter(mthis) native "ApplicationCache_status_Getter";
+class BlinkApplicationCache {
+  static $status_Getter(mthis) native "ApplicationCache_status_Getter";
 
-Native_ApplicationCache_abort_Callback(mthis) native "ApplicationCache_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "ApplicationCache_abort_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback_RESOLVER_STRING_0_";
+  static $swapCache_Callback(mthis) native "ApplicationCache_swapCache_Callback_RESOLVER_STRING_0_";
 
-Native_ApplicationCache_update_Callback(mthis) native "ApplicationCache_update_Callback_RESOLVER_STRING_0_";
+  static $update_Callback(mthis) native "ApplicationCache_update_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Node_baseURI_Getter(mthis) native "Node_baseURI_Getter";
+class BlinkNode {
+  static $baseURI_Getter(mthis) native "Node_baseURI_Getter";
 
-Native_Node_childNodes_Getter(mthis) native "Node_childNodes_Getter";
+  static $childNodes_Getter(mthis) native "Node_childNodes_Getter";
 
-Native_Node_firstChild_Getter(mthis) native "Node_firstChild_Getter";
+  static $firstChild_Getter(mthis) native "Node_firstChild_Getter";
 
-Native_Node_lastChild_Getter(mthis) native "Node_lastChild_Getter";
+  static $lastChild_Getter(mthis) native "Node_lastChild_Getter";
 
-Native_Node_localName_Getter(mthis) native "Node_localName_Getter";
+  static $localName_Getter(mthis) native "Node_localName_Getter";
 
-Native_Node_namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
+  static $namespaceURI_Getter(mthis) native "Node_namespaceURI_Getter";
 
-Native_Node_nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
+  static $nextSibling_Getter(mthis) native "Node_nextSibling_Getter";
 
-Native_Node_nodeName_Getter(mthis) native "Node_nodeName_Getter";
+  static $nodeName_Getter(mthis) native "Node_nodeName_Getter";
 
-Native_Node_nodeType_Getter(mthis) native "Node_nodeType_Getter";
+  static $nodeType_Getter(mthis) native "Node_nodeType_Getter";
 
-Native_Node_nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
+  static $nodeValue_Getter(mthis) native "Node_nodeValue_Getter";
 
-Native_Node_ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
+  static $ownerDocument_Getter(mthis) native "Node_ownerDocument_Getter";
 
-Native_Node_parentElement_Getter(mthis) native "Node_parentElement_Getter";
+  static $parentElement_Getter(mthis) native "Node_parentElement_Getter";
 
-Native_Node_parentNode_Getter(mthis) native "Node_parentNode_Getter";
+  static $parentNode_Getter(mthis) native "Node_parentNode_Getter";
 
-Native_Node_previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
+  static $previousSibling_Getter(mthis) native "Node_previousSibling_Getter";
 
-Native_Node_textContent_Getter(mthis) native "Node_textContent_Getter";
+  static $textContent_Getter(mthis) native "Node_textContent_Getter";
 
-Native_Node_textContent_Setter(mthis, value) native "Node_textContent_Setter";
+  static $textContent_Setter(mthis, value) native "Node_textContent_Setter";
 
-Native_Node_appendChild_Callback(mthis, newChild) native "Node_appendChild_Callback";
+  static $appendChild_Callback(mthis, newChild) native "Node_appendChild_Callback";
 
-Native_Node_cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
+  static $cloneNode_Callback(mthis, deep) native "Node_cloneNode_Callback";
 
-Native_Node_contains_Callback(mthis, other) native "Node_contains_Callback_RESOLVER_STRING_1_Node";
+  static $contains_Callback(mthis, other) native "Node_contains_Callback_RESOLVER_STRING_1_Node";
 
-Native_Node_hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback_RESOLVER_STRING_0_";
+  static $hasChildNodes_Callback(mthis) native "Node_hasChildNodes_Callback_RESOLVER_STRING_0_";
 
-Native_Node_insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
+  static $insertBefore_Callback(mthis, newChild, refChild) native "Node_insertBefore_Callback";
 
-Native_Node_removeChild_Callback(mthis, oldChild) native "Node_removeChild_Callback";
+  static $removeChild_Callback(mthis, oldChild) native "Node_removeChild_Callback";
 
-Native_Node_replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
+  static $replaceChild_Callback(mthis, newChild, oldChild) native "Node_replaceChild_Callback";
+}
 
-Native_Attr_localName_Getter(mthis) native "Attr_localName_Getter";
+class BlinkAttr {
+  static $localName_Getter(mthis) native "Attr_localName_Getter";
 
-Native_Attr_name_Getter(mthis) native "Attr_name_Getter";
+  static $name_Getter(mthis) native "Attr_name_Getter";
 
-Native_Attr_namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
+  static $namespaceURI_Getter(mthis) native "Attr_namespaceURI_Getter";
 
-Native_Attr_value_Getter(mthis) native "Attr_value_Getter";
+  static $value_Getter(mthis) native "Attr_value_Getter";
 
-Native_Attr_value_Setter(mthis, value) native "Attr_value_Setter";
+  static $value_Setter(mthis, value) native "Attr_value_Setter";
+}
 
-Native_AudioBuffer_duration_Getter(mthis) native "AudioBuffer_duration_Getter";
+class BlinkAudioBuffer {
+  static $duration_Getter(mthis) native "AudioBuffer_duration_Getter";
 
-Native_AudioBuffer_length_Getter(mthis) native "AudioBuffer_length_Getter";
+  static $length_Getter(mthis) native "AudioBuffer_length_Getter";
 
-Native_AudioBuffer_numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
+  static $numberOfChannels_Getter(mthis) native "AudioBuffer_numberOfChannels_Getter";
 
-Native_AudioBuffer_sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
+  static $sampleRate_Getter(mthis) native "AudioBuffer_sampleRate_Getter";
 
-Native_AudioBuffer_getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getChannelData_Callback(mthis, channelIndex) native "AudioBuffer_getChannelData_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_AudioBufferSourceNode_buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
+class BlinkAudioSourceNode {}
 
-Native_AudioBufferSourceNode_buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
+class BlinkAudioBufferSourceNode {
+  static $buffer_Getter(mthis) native "AudioBufferSourceNode_buffer_Getter";
 
-Native_AudioBufferSourceNode_loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
+  static $buffer_Setter(mthis, value) native "AudioBufferSourceNode_buffer_Setter";
 
-Native_AudioBufferSourceNode_loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
+  static $loop_Getter(mthis) native "AudioBufferSourceNode_loop_Getter";
 
-Native_AudioBufferSourceNode_loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
+  static $loop_Setter(mthis, value) native "AudioBufferSourceNode_loop_Setter";
 
-Native_AudioBufferSourceNode_loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
+  static $loopEnd_Getter(mthis) native "AudioBufferSourceNode_loopEnd_Getter";
 
-Native_AudioBufferSourceNode_loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
+  static $loopEnd_Setter(mthis, value) native "AudioBufferSourceNode_loopEnd_Setter";
 
-Native_AudioBufferSourceNode_loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
+  static $loopStart_Getter(mthis) native "AudioBufferSourceNode_loopStart_Getter";
 
-Native_AudioBufferSourceNode_playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
+  static $loopStart_Setter(mthis, value) native "AudioBufferSourceNode_loopStart_Setter";
 
-Native_AudioBufferSourceNode_noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_RESOLVER_STRING_3_double_double_double";
+  static $playbackRate_Getter(mthis) native "AudioBufferSourceNode_playbackRate_Getter";
 
-Native_AudioBufferSourceNode_noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_RESOLVER_STRING_1_double";
+  static $noteGrainOn_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_noteGrainOn_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode_noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_RESOLVER_STRING_1_double";
+  static $noteOff_Callback(mthis, when) native "AudioBufferSourceNode_noteOff_Callback_RESOLVER_STRING_1_double";
+
+  static $noteOn_Callback(mthis, when) native "AudioBufferSourceNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
   // Generated overload resolver
-Native_AudioBufferSourceNode_start(mthis, when, grainOffset, grainDuration) {
+  static $start(mthis, when, grainOffset, grainDuration) {
     if (grainDuration != null) {
-      Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration);
+      $_start_1_Callback(mthis, when, grainOffset, grainDuration);
       return;
     }
     if (grainOffset != null) {
-      Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset);
+      $_start_2_Callback(mthis, when, grainOffset);
       return;
     }
     if (when != null) {
-      Native_AudioBufferSourceNode__start_3_Callback(mthis, when);
+      $_start_3_Callback(mthis, when);
       return;
     }
-    Native_AudioBufferSourceNode__start_4_Callback(mthis);
+    $_start_4_Callback(mthis);
     return;
   }
 
-Native_AudioBufferSourceNode__start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_3_double_double_double";
+  static $_start_1_Callback(mthis, when, grainOffset, grainDuration) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_3_double_double_double";
 
-Native_AudioBufferSourceNode__start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_2_double_double";
+  static $_start_2_Callback(mthis, when, grainOffset) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_2_double_double";
 
-Native_AudioBufferSourceNode__start_3_Callback(mthis, when) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_1_double";
+  static $_start_3_Callback(mthis, when) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__start_4_Callback(mthis) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_0_";
+  static $_start_4_Callback(mthis) native "AudioBufferSourceNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioBufferSourceNode_stop(mthis, when) {
+  static $stop(mthis, when) {
     if (when != null) {
-      Native_AudioBufferSourceNode__stop_1_Callback(mthis, when);
+      $_stop_1_Callback(mthis, when);
       return;
     }
-    Native_AudioBufferSourceNode__stop_2_Callback(mthis);
+    $_stop_2_Callback(mthis);
     return;
   }
 
-Native_AudioBufferSourceNode__stop_1_Callback(mthis, when) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_1_double";
+  static $_stop_1_Callback(mthis, when) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioBufferSourceNode__stop_2_Callback(mthis) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_0_";
+  static $_stop_2_Callback(mthis) native "AudioBufferSourceNode_stop_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkAudioContext {
   // Generated overload resolver
-Native_AudioContext_AudioContext() {
-    return Native_AudioContext__create_1constructorCallback();
+  static $mkAudioContext() {
+    return $_create_1constructorCallback();
   }
 
-Native_AudioContext__create_1constructorCallback() native "AudioContext_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "AudioContext_constructorCallback_RESOLVER_STRING_0_";
 
-Native_AudioContext_currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "AudioContext_currentTime_Getter";
 
-Native_AudioContext_destination_Getter(mthis) native "AudioContext_destination_Getter";
+  static $destination_Getter(mthis) native "AudioContext_destination_Getter";
 
-Native_AudioContext_listener_Getter(mthis) native "AudioContext_listener_Getter";
+  static $listener_Getter(mthis) native "AudioContext_listener_Getter";
 
-Native_AudioContext_sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
+  static $sampleRate_Getter(mthis) native "AudioContext_sampleRate_Getter";
 
-Native_AudioContext_createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback_RESOLVER_STRING_0_";
+  static $createAnalyser_Callback(mthis) native "AudioContext_createAnalyser_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback_RESOLVER_STRING_0_";
+  static $createBiquadFilter_Callback(mthis) native "AudioContext_createBiquadFilter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $createBuffer_Callback(mthis, numberOfChannels, numberOfFrames, sampleRate) native "AudioContext_createBuffer_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_AudioContext_createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback_RESOLVER_STRING_0_";
+  static $createBufferSource_Callback(mthis) native "AudioContext_createBufferSource_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createChannelMerger(mthis, numberOfInputs) {
+  static $createChannelMerger(mthis, numberOfInputs) {
     if (numberOfInputs != null) {
-      return Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs);
+      return $_createChannelMerger_1_Callback(mthis, numberOfInputs);
     }
-    return Native_AudioContext__createChannelMerger_2_Callback(mthis);
+    return $_createChannelMerger_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createChannelMerger_1_Callback(mthis, numberOfInputs) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelMerger_2_Callback(mthis) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_0_";
+  static $_createChannelMerger_2_Callback(mthis) native "AudioContext_createChannelMerger_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createChannelSplitter(mthis, numberOfOutputs) {
+  static $createChannelSplitter(mthis, numberOfOutputs) {
     if (numberOfOutputs != null) {
-      return Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs);
+      return $_createChannelSplitter_1_Callback(mthis, numberOfOutputs);
     }
-    return Native_AudioContext__createChannelSplitter_2_Callback(mthis);
+    return $_createChannelSplitter_2_Callback(mthis);
   }
 
-Native_AudioContext__createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createChannelSplitter_1_Callback(mthis, numberOfOutputs) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createChannelSplitter_2_Callback(mthis) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_0_";
+  static $_createChannelSplitter_2_Callback(mthis) native "AudioContext_createChannelSplitter_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback_RESOLVER_STRING_0_";
+  static $createConvolver_Callback(mthis) native "AudioContext_createConvolver_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_AudioContext_createDelay(mthis, maxDelayTime) {
+  static $createDelay(mthis, maxDelayTime) {
     if (maxDelayTime != null) {
-      return Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime);
+      return $_createDelay_1_Callback(mthis, maxDelayTime);
     }
-    return Native_AudioContext__createDelay_2_Callback(mthis);
+    return $_createDelay_2_Callback(mthis);
   }
 
-Native_AudioContext__createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelay_Callback_RESOLVER_STRING_1_double";
+  static $_createDelay_1_Callback(mthis, maxDelayTime) native "AudioContext_createDelay_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioContext__createDelay_2_Callback(mthis) native "AudioContext_createDelay_Callback_RESOLVER_STRING_0_";
+  static $_createDelay_2_Callback(mthis) native "AudioContext_createDelay_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback_RESOLVER_STRING_0_";
+  static $createDynamicsCompressor_Callback(mthis) native "AudioContext_createDynamicsCompressor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createGain_Callback(mthis) native "AudioContext_createGain_Callback_RESOLVER_STRING_0_";
+  static $createGain_Callback(mthis) native "AudioContext_createGain_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback_RESOLVER_STRING_1_HTMLMediaElement";
+  static $createMediaElementSource_Callback(mthis, mediaElement) native "AudioContext_createMediaElementSource_Callback_RESOLVER_STRING_1_HTMLMediaElement";
 
-Native_AudioContext_createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback_RESOLVER_STRING_0_";
+  static $createMediaStreamDestination_Callback(mthis) native "AudioContext_createMediaStreamDestination_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback_RESOLVER_STRING_1_MediaStream";
+  static $createMediaStreamSource_Callback(mthis, mediaStream) native "AudioContext_createMediaStreamSource_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_AudioContext_createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback_RESOLVER_STRING_0_";
+  static $createOscillator_Callback(mthis) native "AudioContext_createOscillator_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPanner_Callback(mthis) native "AudioContext_createPanner_Callback_RESOLVER_STRING_0_";
+  static $createPanner_Callback(mthis) native "AudioContext_createPanner_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback_RESOLVER_STRING_2_Float32Array_Float32Array";
+  static $createPeriodicWave_Callback(mthis, real, imag) native "AudioContext_createPeriodicWave_Callback_RESOLVER_STRING_2_Float32Array_Float32Array";
 
   // Generated overload resolver
-Native_AudioContext_createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
+  static $createScriptProcessor(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) {
     if (numberOfOutputChannels != null) {
-      return Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+      return $_createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels);
     }
     if (numberOfInputChannels != null) {
-      return Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
+      return $_createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels);
     }
     if (bufferSize != null) {
-      return Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize);
+      return $_createScriptProcessor_3_Callback(mthis, bufferSize);
     }
-    return Native_AudioContext__createScriptProcessor_4_Callback(mthis);
+    return $_createScriptProcessor_4_Callback(mthis);
   }
 
-Native_AudioContext__createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
+  static $_createScriptProcessor_1_Callback(mthis, bufferSize, numberOfInputChannels, numberOfOutputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $_createScriptProcessor_2_Callback(mthis, bufferSize, numberOfInputChannels) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_AudioContext__createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_1_unsigned long";
+  static $_createScriptProcessor_3_Callback(mthis, bufferSize) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_AudioContext__createScriptProcessor_4_Callback(mthis) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_0_";
+  static $_createScriptProcessor_4_Callback(mthis) native "AudioContext_createScriptProcessor_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback_RESOLVER_STRING_0_";
+  static $createWaveShaper_Callback(mthis) native "AudioContext_createWaveShaper_Callback_RESOLVER_STRING_0_";
 
-Native_AudioContext_decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
+  static $decodeAudioData_Callback(mthis, audioData, successCallback, errorCallback) native "AudioContext_decodeAudioData_Callback";
 
-Native_AudioContext_startRendering_Callback(mthis) native "AudioContext_startRendering_Callback_RESOLVER_STRING_0_";
+  static $startRendering_Callback(mthis) native "AudioContext_startRendering_Callback_RESOLVER_STRING_0_";
+}
 
-Native_AudioDestinationNode_maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+class BlinkAudioDestinationNode {
+  static $maxChannelCount_Getter(mthis) native "AudioDestinationNode_maxChannelCount_Getter";
+}
 
-Native_AudioListener_dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
+class BlinkAudioListener {
+  static $dopplerFactor_Getter(mthis) native "AudioListener_dopplerFactor_Getter";
 
-Native_AudioListener_dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
+  static $dopplerFactor_Setter(mthis, value) native "AudioListener_dopplerFactor_Setter";
 
-Native_AudioListener_speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
+  static $speedOfSound_Getter(mthis) native "AudioListener_speedOfSound_Getter";
 
-Native_AudioListener_speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
+  static $speedOfSound_Setter(mthis, value) native "AudioListener_speedOfSound_Setter";
 
-Native_AudioListener_setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $setOrientation_Callback(mthis, x, y, z, xUp, yUp, zUp) native "AudioListener_setOrientation_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_AudioListener_setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setPosition_Callback(mthis, x, y, z) native "AudioListener_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_AudioListener_setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setVelocity_Callback(mthis, x, y, z) native "AudioListener_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+}
 
-Native_AudioParam_defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
+class BlinkAudioParam {
+  static $defaultValue_Getter(mthis) native "AudioParam_defaultValue_Getter";
 
-Native_AudioParam_maxValue_Getter(mthis) native "AudioParam_maxValue_Getter";
+  static $maxValue_Getter(mthis) native "AudioParam_maxValue_Getter";
 
-Native_AudioParam_minValue_Getter(mthis) native "AudioParam_minValue_Getter";
+  static $minValue_Getter(mthis) native "AudioParam_minValue_Getter";
 
-Native_AudioParam_name_Getter(mthis) native "AudioParam_name_Getter";
+  static $name_Getter(mthis) native "AudioParam_name_Getter";
 
-Native_AudioParam_units_Getter(mthis) native "AudioParam_units_Getter";
+  static $units_Getter(mthis) native "AudioParam_units_Getter";
 
-Native_AudioParam_value_Getter(mthis) native "AudioParam_value_Getter";
+  static $value_Getter(mthis) native "AudioParam_value_Getter";
 
-Native_AudioParam_value_Setter(mthis, value) native "AudioParam_value_Setter";
+  static $value_Setter(mthis, value) native "AudioParam_value_Setter";
 
-Native_AudioParam_cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback_RESOLVER_STRING_1_double";
+  static $cancelScheduledValues_Callback(mthis, startTime) native "AudioParam_cancelScheduledValues_Callback_RESOLVER_STRING_1_double";
 
-Native_AudioParam_exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $exponentialRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_exponentialRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $linearRampToValueAtTime_Callback(mthis, value, time) native "AudioParam_linearRampToValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback_RESOLVER_STRING_3_float_double_double";
+  static $setTargetAtTime_Callback(mthis, target, time, timeConstant) native "AudioParam_setTargetAtTime_Callback_RESOLVER_STRING_3_float_double_double";
 
-Native_AudioParam_setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback_RESOLVER_STRING_2_float_double";
+  static $setValueAtTime_Callback(mthis, value, time) native "AudioParam_setValueAtTime_Callback_RESOLVER_STRING_2_float_double";
 
-Native_AudioParam_setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
+  static $setValueCurveAtTime_Callback(mthis, values, time, duration) native "AudioParam_setValueCurveAtTime_Callback";
+}
 
-Native_Event_bubbles_Getter(mthis) native "Event_bubbles_Getter";
+class BlinkEvent {
+  static $bubbles_Getter(mthis) native "Event_bubbles_Getter";
 
-Native_Event_cancelable_Getter(mthis) native "Event_cancelable_Getter";
+  static $cancelable_Getter(mthis) native "Event_cancelable_Getter";
 
-Native_Event_clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
+  static $clipboardData_Getter(mthis) native "Event_clipboardData_Getter";
 
-Native_Event_currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
+  static $currentTarget_Getter(mthis) native "Event_currentTarget_Getter";
 
-Native_Event_defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
+  static $defaultPrevented_Getter(mthis) native "Event_defaultPrevented_Getter";
 
-Native_Event_eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
+  static $eventPhase_Getter(mthis) native "Event_eventPhase_Getter";
 
-Native_Event_path_Getter(mthis) native "Event_path_Getter";
+  static $path_Getter(mthis) native "Event_path_Getter";
 
-Native_Event_target_Getter(mthis) native "Event_target_Getter";
+  static $target_Getter(mthis) native "Event_target_Getter";
 
-Native_Event_timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
+  static $timeStamp_Getter(mthis) native "Event_timeStamp_Getter";
 
-Native_Event_type_Getter(mthis) native "Event_type_Getter";
+  static $type_Getter(mthis) native "Event_type_Getter";
 
-Native_Event_initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_RESOLVER_STRING_3_DOMString_boolean_boolean";
+  static $initEvent_Callback(mthis, eventTypeArg, canBubbleArg, cancelableArg) native "Event_initEvent_Callback_RESOLVER_STRING_3_DOMString_boolean_boolean";
 
-Native_Event_preventDefault_Callback(mthis) native "Event_preventDefault_Callback_RESOLVER_STRING_0_";
+  static $preventDefault_Callback(mthis) native "Event_preventDefault_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback_RESOLVER_STRING_0_";
+  static $stopImmediatePropagation_Callback(mthis) native "Event_stopImmediatePropagation_Callback_RESOLVER_STRING_0_";
 
-Native_Event_stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback_RESOLVER_STRING_0_";
+  static $stopPropagation_Callback(mthis) native "Event_stopPropagation_Callback_RESOLVER_STRING_0_";
+}
 
-Native_AudioProcessingEvent_inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
+class BlinkAudioProcessingEvent {
+  static $inputBuffer_Getter(mthis) native "AudioProcessingEvent_inputBuffer_Getter";
 
-Native_AudioProcessingEvent_outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+  static $outputBuffer_Getter(mthis) native "AudioProcessingEvent_outputBuffer_Getter";
+}
 
-Native_AutocompleteErrorEvent_reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+class BlinkAutocompleteErrorEvent {
+  static $reason_Getter(mthis) native "AutocompleteErrorEvent_reason_Getter";
+}
 
-Native_BarProp_visible_Getter(mthis) native "BarProp_visible_Getter";
+class BlinkBarProp {
+  static $visible_Getter(mthis) native "BarProp_visible_Getter";
+}
 
-Native_BeforeUnloadEvent_returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
+class BlinkBeforeLoadEvent {}
 
-Native_BeforeUnloadEvent_returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+class BlinkBeforeUnloadEvent {
+  static $returnValue_Getter(mthis) native "BeforeUnloadEvent_returnValue_Getter";
 
-Native_BiquadFilterNode_Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
+  static $returnValue_Setter(mthis, value) native "BeforeUnloadEvent_returnValue_Setter";
+}
 
-Native_BiquadFilterNode_detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
+class BlinkBiquadFilterNode {
+  static $Q_Getter(mthis) native "BiquadFilterNode_Q_Getter";
 
-Native_BiquadFilterNode_frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
+  static $detune_Getter(mthis) native "BiquadFilterNode_detune_Getter";
 
-Native_BiquadFilterNode_gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
+  static $frequency_Getter(mthis) native "BiquadFilterNode_frequency_Getter";
 
-Native_BiquadFilterNode_type_Getter(mthis) native "BiquadFilterNode_type_Getter";
+  static $gain_Getter(mthis) native "BiquadFilterNode_gain_Getter";
 
-Native_BiquadFilterNode_type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
+  static $type_Getter(mthis) native "BiquadFilterNode_type_Getter";
 
-Native_BiquadFilterNode_getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback_RESOLVER_STRING_3_Float32Array_Float32Array_Float32Array";
+  static $type_Setter(mthis, value) native "BiquadFilterNode_type_Setter";
 
-Native_Blob_constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
+  static $getFrequencyResponse_Callback(mthis, frequencyHz, magResponse, phaseResponse) native "BiquadFilterNode_getFrequencyResponse_Callback_RESOLVER_STRING_3_Float32Array_Float32Array_Float32Array";
+}
 
-Native_Blob_size_Getter(mthis) native "Blob_size_Getter";
+class BlinkBlob {
+  static $constructorCallback(blobParts, type, endings) native "Blob_constructorCallback";
 
-Native_Blob_type_Getter(mthis) native "Blob_type_Getter";
+  static $size_Getter(mthis) native "Blob_size_Getter";
+
+  static $type_Getter(mthis) native "Blob_type_Getter";
 
   // Generated overload resolver
-Native_Blob_slice(mthis, start, end, contentType) {
+  static $slice(mthis, start, end, contentType) {
     if (contentType != null) {
-      return Native_Blob__slice_1_Callback(mthis, start, end, contentType);
+      return $_slice_1_Callback(mthis, start, end, contentType);
     }
     if (end != null) {
-      return Native_Blob__slice_2_Callback(mthis, start, end);
+      return $_slice_2_Callback(mthis, start, end);
     }
     if (start != null) {
-      return Native_Blob__slice_3_Callback(mthis, start);
+      return $_slice_3_Callback(mthis, start);
     }
-    return Native_Blob__slice_4_Callback(mthis);
+    return $_slice_4_Callback(mthis);
   }
 
-Native_Blob__slice_1_Callback(mthis, start, end, contentType) native "Blob_slice_Callback_RESOLVER_STRING_3_long long_long long_DOMString";
+  static $_slice_1_Callback(mthis, start, end, contentType) native "Blob_slice_Callback_RESOLVER_STRING_3_long long_long long_DOMString";
 
-Native_Blob__slice_2_Callback(mthis, start, end) native "Blob_slice_Callback_RESOLVER_STRING_2_long long_long long";
+  static $_slice_2_Callback(mthis, start, end) native "Blob_slice_Callback_RESOLVER_STRING_2_long long_long long";
 
-Native_Blob__slice_3_Callback(mthis, start) native "Blob_slice_Callback_RESOLVER_STRING_1_long long";
+  static $_slice_3_Callback(mthis, start) native "Blob_slice_Callback_RESOLVER_STRING_1_long long";
 
-Native_Blob__slice_4_Callback(mthis) native "Blob_slice_Callback_RESOLVER_STRING_0_";
+  static $_slice_4_Callback(mthis) native "Blob_slice_Callback_RESOLVER_STRING_0_";
+}
 
-Native_ChildNode_nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
+class BlinkChildNode {
+  static $nextElementSibling_Getter(mthis) native "ChildNode_nextElementSibling_Getter";
 
-Native_ChildNode_previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "ChildNode_previousElementSibling_Getter";
 
-Native_ChildNode_remove_Callback(mthis) native "ChildNode_remove_Callback_RESOLVER_STRING_0_";
+  static $remove_Callback(mthis) native "ChildNode_remove_Callback_RESOLVER_STRING_0_";
+}
 
-Native_CharacterData_data_Getter(mthis) native "CharacterData_data_Getter";
+class BlinkCharacterData {
+  static $data_Getter(mthis) native "CharacterData_data_Getter";
 
-Native_CharacterData_data_Setter(mthis, value) native "CharacterData_data_Setter";
+  static $data_Setter(mthis, value) native "CharacterData_data_Setter";
 
-Native_CharacterData_length_Getter(mthis) native "CharacterData_length_Getter";
+  static $length_Getter(mthis) native "CharacterData_length_Getter";
 
-Native_CharacterData_appendData_Callback(mthis, data) native "CharacterData_appendData_Callback_RESOLVER_STRING_1_DOMString";
+  static $appendData_Callback(mthis, data) native "CharacterData_appendData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CharacterData_deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $deleteData_Callback(mthis, offset, length) native "CharacterData_deleteData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_CharacterData_insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $insertData_Callback(mthis, offset, data) native "CharacterData_insertData_Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_CharacterData_replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_DOMString";
+  static $replaceData_Callback(mthis, offset, length, data) native "CharacterData_replaceData_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_DOMString";
 
-Native_CharacterData_substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $substringData_Callback(mthis, offset, length) native "CharacterData_substringData_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_CharacterData_nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
+  static $nextElementSibling_Getter(mthis) native "CharacterData_nextElementSibling_Getter";
 
-Native_CharacterData_previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "CharacterData_previousElementSibling_Getter";
+}
 
-Native_Text_wholeText_Getter(mthis) native "Text_wholeText_Getter";
+class BlinkText {
+  static $wholeText_Getter(mthis) native "Text_wholeText_Getter";
 
-Native_Text_getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
+  static $getDestinationInsertionPoints_Callback(mthis) native "Text_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Text_splitText_Callback(mthis, offset) native "Text_splitText_Callback_RESOLVER_STRING_1_unsigned long";
+  static $splitText_Callback(mthis, offset) native "Text_splitText_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSS_supports_Callback(mthis, property, value) native "CSS_supports_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+class BlinkCDATASection {}
 
-Native_CSS_supportsCondition_Callback(mthis, conditionText) native "CSS_supports_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkCSS {
+  static $supports_Callback(mthis, property, value) native "CSS_supports_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSSRule_cssText_Getter(mthis) native "CSSRule_cssText_Getter";
+  static $supportsCondition_Callback(mthis, conditionText) native "CSS_supports_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_CSSRule_cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
+class BlinkCSSRule {
+  static $cssText_Getter(mthis) native "CSSRule_cssText_Getter";
 
-Native_CSSRule_parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
+  static $cssText_Setter(mthis, value) native "CSSRule_cssText_Setter";
 
-Native_CSSRule_parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
+  static $parentRule_Getter(mthis) native "CSSRule_parentRule_Getter";
 
-Native_CSSRule_type_Getter(mthis) native "CSSRule_type_Getter";
+  static $parentStyleSheet_Getter(mthis) native "CSSRule_parentStyleSheet_Getter";
 
-Native_CSSCharsetRule_encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
+  static $type_Getter(mthis) native "CSSRule_type_Getter";
+}
 
-Native_CSSCharsetRule_encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
+class BlinkCSSCharsetRule {
+  static $encoding_Getter(mthis) native "CSSCharsetRule_encoding_Getter";
 
-Native_CSSFontFaceLoadEvent_fontfaces_Getter(mthis) native "CSSFontFaceLoadEvent_fontfaces_Getter";
+  static $encoding_Setter(mthis, value) native "CSSCharsetRule_encoding_Setter";
+}
 
-Native_CSSFontFaceRule_style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+class BlinkCSSFontFaceLoadEvent {
+  static $fontfaces_Getter(mthis) native "CSSFontFaceLoadEvent_fontfaces_Getter";
+}
 
-Native_CSSImportRule_href_Getter(mthis) native "CSSImportRule_href_Getter";
+class BlinkCSSFontFaceRule {
+  static $style_Getter(mthis) native "CSSFontFaceRule_style_Getter";
+}
 
-Native_CSSImportRule_media_Getter(mthis) native "CSSImportRule_media_Getter";
+class BlinkCSSImportRule {
+  static $href_Getter(mthis) native "CSSImportRule_href_Getter";
 
-Native_CSSImportRule_styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+  static $media_Getter(mthis) native "CSSImportRule_media_Getter";
 
-Native_CSSKeyframeRule_keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+  static $styleSheet_Getter(mthis) native "CSSImportRule_styleSheet_Getter";
+}
 
-Native_CSSKeyframeRule_keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
+class BlinkCSSKeyframeRule {
+  static $keyText_Getter(mthis) native "CSSKeyframeRule_keyText_Getter";
+
+  static $keyText_Setter(mthis, value) native "CSSKeyframeRule_keyText_Setter";
+
+  static $style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+}
+
+class BlinkCSSKeyframesRule {
+  static $cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
 
-Native_CSSKeyframeRule_style_Getter(mthis) native "CSSKeyframeRule_style_Getter";
+  static $name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
 
-Native_CSSKeyframesRule_cssRules_Getter(mthis) native "CSSKeyframesRule_cssRules_Getter";
+  static $name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
 
-Native_CSSKeyframesRule_name_Getter(mthis) native "CSSKeyframesRule_name_Getter";
+  static $__getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSKeyframesRule_name_Setter(mthis, value) native "CSSKeyframesRule_name_Setter";
+  static $deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule___getter___Callback(mthis, index) native "CSSKeyframesRule___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSKeyframesRule_deleteRule_Callback(mthis, key) native "CSSKeyframesRule_deleteRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_CSSKeyframesRule_findRule_Callback(mthis, key) native "CSSKeyframesRule_findRule_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkCSSMediaRule {
+  static $cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
 
-Native_CSSKeyframesRule_insertRule_Callback(mthis, rule) native "CSSKeyframesRule_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $media_Getter(mthis) native "CSSMediaRule_media_Getter";
 
-Native_CSSMediaRule_cssRules_Getter(mthis) native "CSSMediaRule_cssRules_Getter";
+  static $deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSMediaRule_media_Getter(mthis) native "CSSMediaRule_media_Getter";
+  static $insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_CSSMediaRule_deleteRule_Callback(mthis, index) native "CSSMediaRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkCSSPageRule {
+  static $selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
 
-Native_CSSMediaRule_insertRule_Callback(mthis, rule, index) native "CSSMediaRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
 
-Native_CSSPageRule_selectorText_Getter(mthis) native "CSSPageRule_selectorText_Getter";
+  static $style_Getter(mthis) native "CSSPageRule_style_Getter";
+}
 
-Native_CSSPageRule_selectorText_Setter(mthis, value) native "CSSPageRule_selectorText_Setter";
+class BlinkCSSValue {}
 
-Native_CSSPageRule_style_Getter(mthis) native "CSSPageRule_style_Getter";
+class BlinkCSSPrimitiveValue {}
 
-Native_CSSRuleList_length_Getter(mthis) native "CSSRuleList_length_Getter";
+class BlinkCSSRuleList {
+  static $length_Getter(mthis) native "CSSRuleList_length_Getter";
 
-Native_CSSRuleList_NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSRuleList_item_Callback(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "CSSRuleList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSSStyleDeclaration_cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
+class BlinkCSSStyleDeclaration {
+  static $cssText_Getter(mthis) native "CSSStyleDeclaration_cssText_Getter";
 
-Native_CSSStyleDeclaration_cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
+  static $cssText_Setter(mthis, value) native "CSSStyleDeclaration_cssText_Setter";
 
-Native_CSSStyleDeclaration_length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
+  static $length_Getter(mthis) native "CSSStyleDeclaration_length_Getter";
 
-Native_CSSStyleDeclaration_parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
+  static $parentRule_Getter(mthis) native "CSSStyleDeclaration_parentRule_Getter";
 
-Native_CSSStyleDeclaration___setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
+  static $__setter___Callback(mthis, propertyName, propertyValue) native "CSSStyleDeclaration___setter___Callback";
 
-Native_CSSStyleDeclaration_getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback_RESOLVER_STRING_1_DOMString";
+  static $getPropertyPriority_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyPriority_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback_RESOLVER_STRING_1_DOMString";
+  static $getPropertyValue_Callback(mthis, propertyName) native "CSSStyleDeclaration_getPropertyValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "CSSStyleDeclaration_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSStyleDeclaration_removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeProperty_Callback(mthis, propertyName) native "CSSStyleDeclaration_removeProperty_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleDeclaration_setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setProperty_Callback(mthis, propertyName, value, priority) native "CSSStyleDeclaration_setProperty_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+}
 
-Native_CSSStyleRule_selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
+class BlinkCSSStyleRule {
+  static $selectorText_Getter(mthis) native "CSSStyleRule_selectorText_Getter";
 
-Native_CSSStyleRule_selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
+  static $selectorText_Setter(mthis, value) native "CSSStyleRule_selectorText_Setter";
 
-Native_CSSStyleRule_style_Getter(mthis) native "CSSStyleRule_style_Getter";
+  static $style_Getter(mthis) native "CSSStyleRule_style_Getter";
+}
 
-Native_StyleSheet_disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
+class BlinkStyleSheet {
+  static $disabled_Getter(mthis) native "StyleSheet_disabled_Getter";
 
-Native_StyleSheet_disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "StyleSheet_disabled_Setter";
 
-Native_StyleSheet_href_Getter(mthis) native "StyleSheet_href_Getter";
+  static $href_Getter(mthis) native "StyleSheet_href_Getter";
 
-Native_StyleSheet_media_Getter(mthis) native "StyleSheet_media_Getter";
+  static $media_Getter(mthis) native "StyleSheet_media_Getter";
 
-Native_StyleSheet_ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
+  static $ownerNode_Getter(mthis) native "StyleSheet_ownerNode_Getter";
 
-Native_StyleSheet_parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
+  static $parentStyleSheet_Getter(mthis) native "StyleSheet_parentStyleSheet_Getter";
 
-Native_StyleSheet_title_Getter(mthis) native "StyleSheet_title_Getter";
+  static $title_Getter(mthis) native "StyleSheet_title_Getter";
 
-Native_StyleSheet_type_Getter(mthis) native "StyleSheet_type_Getter";
+  static $type_Getter(mthis) native "StyleSheet_type_Getter";
+}
 
-Native_CSSStyleSheet_cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
+class BlinkCSSStyleSheet {
+  static $cssRules_Getter(mthis) native "CSSStyleSheet_cssRules_Getter";
 
-Native_CSSStyleSheet_ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
+  static $ownerRule_Getter(mthis) native "CSSStyleSheet_ownerRule_Getter";
 
-Native_CSSStyleSheet_rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
+  static $rules_Getter(mthis) native "CSSStyleSheet_rules_Getter";
 
   // Generated overload resolver
-Native_CSSStyleSheet_addRule(mthis, selector, style, index) {
+  static $addRule(mthis, selector, style, index) {
     if (index != null) {
-      return Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index);
+      return $_addRule_1_Callback(mthis, selector, style, index);
     }
-    return Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style);
+    return $_addRule_2_Callback(mthis, selector, style);
   }
 
-Native_CSSStyleSheet__addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_3_DOMString_DOMString_unsigned long";
+  static $_addRule_1_Callback(mthis, selector, style, index) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_3_DOMString_DOMString_unsigned long";
 
-Native_CSSStyleSheet__addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_addRule_2_Callback(mthis, selector, style) native "CSSStyleSheet_addRule_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_CSSStyleSheet_deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $deleteRule_Callback(mthis, index) native "CSSStyleSheet_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_CSSStyleSheet_insertRule(mthis, rule, index) {
+  static $insertRule(mthis, rule, index) {
     if (index != null) {
-      return Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index);
+      return $_insertRule_1_Callback(mthis, rule, index);
     }
-    return Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule);
+    return $_insertRule_2_Callback(mthis, rule);
   }
 
-Native_CSSStyleSheet__insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $_insertRule_1_Callback(mthis, rule, index) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_CSSStyleSheet__insertRule_2_Callback(mthis, rule) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_1_DOMString";
+  static $_insertRule_2_Callback(mthis, rule) native "CSSStyleSheet_insertRule_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CSSStyleSheet_removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $removeRule_Callback(mthis, index) native "CSSStyleSheet_removeRule_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_CSSSupportsRule_conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
+class BlinkCSSSupportsRule {
+  static $conditionText_Getter(mthis) native "CSSSupportsRule_conditionText_Getter";
 
-Native_CSSSupportsRule_cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
+  static $cssRules_Getter(mthis) native "CSSSupportsRule_cssRules_Getter";
 
-Native_CSSSupportsRule_deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
+  static $deleteRule_Callback(mthis, index) native "CSSSupportsRule_deleteRule_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSSupportsRule_insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $insertRule_Callback(mthis, rule, index) native "CSSSupportsRule_insertRule_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_CSSValueList_length_Getter(mthis) native "CSSValueList_length_Getter";
+class BlinkCSSUnknownRule {}
 
-Native_CSSValueList_NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkCSSValueList {
+  static $length_Getter(mthis) native "CSSValueList_length_Getter";
 
-Native_CSSValueList_item_Callback(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_CSSViewportRule_style_Getter(mthis) native "CSSViewportRule_style_Getter";
+  static $item_Callback(mthis, index) native "CSSValueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Canvas2DContextAttributes_alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
+class BlinkCSSViewportRule {
+  static $style_Getter(mthis) native "CSSViewportRule_style_Getter";
+}
 
-Native_Canvas2DContextAttributes_alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+class BlinkCanvas2DContextAttributes {
+  static $alpha_Getter(mthis) native "Canvas2DContextAttributes_alpha_Getter";
 
-Native_CanvasGradient_addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_RESOLVER_STRING_2_float_DOMString";
+  static $alpha_Setter(mthis, value) native "Canvas2DContextAttributes_alpha_Setter";
+}
 
-Native_CanvasRenderingContext_canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+class BlinkCanvasGradient {
+  static $addColorStop_Callback(mthis, offset, color) native "CanvasGradient_addColorStop_Callback_RESOLVER_STRING_2_float_DOMString";
+}
 
-Native_CanvasRenderingContext2D_currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
+class BlinkCanvasPattern {}
 
-Native_CanvasRenderingContext2D_currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
+class BlinkCanvasRenderingContext {
+  static $canvas_Getter(mthis) native "CanvasRenderingContext2D_canvas_Getter";
+}
 
-Native_CanvasRenderingContext2D_fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
+class BlinkCanvasRenderingContext2D {
+  static $currentTransform_Getter(mthis) native "CanvasRenderingContext2D_currentTransform_Getter";
 
-Native_CanvasRenderingContext2D_fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
+  static $currentTransform_Setter(mthis, value) native "CanvasRenderingContext2D_currentTransform_Setter";
 
-Native_CanvasRenderingContext2D_font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
+  static $fillStyle_Getter(mthis) native "CanvasRenderingContext2D_fillStyle_Getter";
 
-Native_CanvasRenderingContext2D_font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
+  static $fillStyle_Setter(mthis, value) native "CanvasRenderingContext2D_fillStyle_Setter";
 
-Native_CanvasRenderingContext2D_globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
+  static $font_Getter(mthis) native "CanvasRenderingContext2D_font_Getter";
 
-Native_CanvasRenderingContext2D_globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
+  static $font_Setter(mthis, value) native "CanvasRenderingContext2D_font_Setter";
 
-Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
+  static $globalAlpha_Getter(mthis) native "CanvasRenderingContext2D_globalAlpha_Getter";
 
-Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
+  static $globalAlpha_Setter(mthis, value) native "CanvasRenderingContext2D_globalAlpha_Setter";
 
-Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
+  static $globalCompositeOperation_Getter(mthis) native "CanvasRenderingContext2D_globalCompositeOperation_Getter";
 
-Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
+  static $globalCompositeOperation_Setter(mthis, value) native "CanvasRenderingContext2D_globalCompositeOperation_Setter";
 
-Native_CanvasRenderingContext2D_lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
+  static $imageSmoothingEnabled_Getter(mthis) native "CanvasRenderingContext2D_imageSmoothingEnabled_Getter";
 
-Native_CanvasRenderingContext2D_lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
+  static $imageSmoothingEnabled_Setter(mthis, value) native "CanvasRenderingContext2D_imageSmoothingEnabled_Setter";
 
-Native_CanvasRenderingContext2D_lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
+  static $lineCap_Getter(mthis) native "CanvasRenderingContext2D_lineCap_Getter";
 
-Native_CanvasRenderingContext2D_lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
+  static $lineCap_Setter(mthis, value) native "CanvasRenderingContext2D_lineCap_Setter";
 
-Native_CanvasRenderingContext2D_lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
+  static $lineDashOffset_Getter(mthis) native "CanvasRenderingContext2D_lineDashOffset_Getter";
 
-Native_CanvasRenderingContext2D_lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
+  static $lineDashOffset_Setter(mthis, value) native "CanvasRenderingContext2D_lineDashOffset_Setter";
 
-Native_CanvasRenderingContext2D_lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
+  static $lineJoin_Getter(mthis) native "CanvasRenderingContext2D_lineJoin_Getter";
 
-Native_CanvasRenderingContext2D_lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
+  static $lineJoin_Setter(mthis, value) native "CanvasRenderingContext2D_lineJoin_Setter";
 
-Native_CanvasRenderingContext2D_miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
+  static $lineWidth_Getter(mthis) native "CanvasRenderingContext2D_lineWidth_Getter";
 
-Native_CanvasRenderingContext2D_miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
+  static $lineWidth_Setter(mthis, value) native "CanvasRenderingContext2D_lineWidth_Setter";
 
-Native_CanvasRenderingContext2D_shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
+  static $miterLimit_Getter(mthis) native "CanvasRenderingContext2D_miterLimit_Getter";
 
-Native_CanvasRenderingContext2D_shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
+  static $miterLimit_Setter(mthis, value) native "CanvasRenderingContext2D_miterLimit_Setter";
 
-Native_CanvasRenderingContext2D_shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
+  static $shadowBlur_Getter(mthis) native "CanvasRenderingContext2D_shadowBlur_Getter";
 
-Native_CanvasRenderingContext2D_shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
+  static $shadowBlur_Setter(mthis, value) native "CanvasRenderingContext2D_shadowBlur_Setter";
 
-Native_CanvasRenderingContext2D_shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
+  static $shadowColor_Getter(mthis) native "CanvasRenderingContext2D_shadowColor_Getter";
 
-Native_CanvasRenderingContext2D_shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
+  static $shadowColor_Setter(mthis, value) native "CanvasRenderingContext2D_shadowColor_Setter";
 
-Native_CanvasRenderingContext2D_shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
+  static $shadowOffsetX_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetX_Getter";
 
-Native_CanvasRenderingContext2D_shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
+  static $shadowOffsetX_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetX_Setter";
 
-Native_CanvasRenderingContext2D_strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
+  static $shadowOffsetY_Getter(mthis) native "CanvasRenderingContext2D_shadowOffsetY_Getter";
 
-Native_CanvasRenderingContext2D_strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
+  static $shadowOffsetY_Setter(mthis, value) native "CanvasRenderingContext2D_shadowOffsetY_Setter";
 
-Native_CanvasRenderingContext2D_textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
+  static $strokeStyle_Getter(mthis) native "CanvasRenderingContext2D_strokeStyle_Getter";
 
-Native_CanvasRenderingContext2D_textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
+  static $strokeStyle_Setter(mthis, value) native "CanvasRenderingContext2D_strokeStyle_Setter";
 
-Native_CanvasRenderingContext2D_textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
+  static $textAlign_Getter(mthis) native "CanvasRenderingContext2D_textAlign_Getter";
 
-Native_CanvasRenderingContext2D_textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
+  static $textAlign_Setter(mthis, value) native "CanvasRenderingContext2D_textAlign_Setter";
 
-Native_CanvasRenderingContext2D_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
+  static $textBaseline_Getter(mthis) native "CanvasRenderingContext2D_textBaseline_Getter";
 
-Native_CanvasRenderingContext2D_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
+  static $textBaseline_Setter(mthis, value) native "CanvasRenderingContext2D_textBaseline_Setter";
 
-Native_CanvasRenderingContext2D_beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback_RESOLVER_STRING_0_";
+  static $arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_CanvasRenderingContext2D_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "CanvasRenderingContext2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $beginPath_Callback(mthis) native "CanvasRenderingContext2D_beginPath_Callback_RESOLVER_STRING_0_";
+
+  static $bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "CanvasRenderingContext2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+
+  static $clearRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_clearRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_clip(mthis, winding) {
+  static $clip(mthis, winding) {
     if (winding != null) {
-      Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding);
+      $_clip_1_Callback(mthis, winding);
       return;
     }
-    Native_CanvasRenderingContext2D__clip_2_Callback(mthis);
+    $_clip_2_Callback(mthis);
     return;
   }
 
-Native_CanvasRenderingContext2D__clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_1_DOMString";
+  static $_clip_1_Callback(mthis, winding) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D__clip_2_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_0_";
+  static $_clip_2_Callback(mthis) native "CanvasRenderingContext2D_clip_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback_RESOLVER_STRING_0_";
+  static $closePath_Callback(mthis) native "CanvasRenderingContext2D_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_2_float_float";
+  static $createImageData_Callback(mthis, sw, sh) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_1_ImageData";
+  static $createImageDataFromImageData_Callback(mthis, imagedata) native "CanvasRenderingContext2D_createImageData_Callback_RESOLVER_STRING_1_ImageData";
 
-Native_CanvasRenderingContext2D_createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createLinearGradient_Callback(mthis, x0, y0, x1, y1) native "CanvasRenderingContext2D_createLinearGradient_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLCanvasElement_DOMString";
+  static $createPattern_Callback(mthis, canvas, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLCanvasElement_DOMString";
 
-Native_CanvasRenderingContext2D_createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLImageElement_DOMString";
+  static $createPatternFromImage_Callback(mthis, image, repetitionType) native "CanvasRenderingContext2D_createPattern_Callback_RESOLVER_STRING_2_HTMLImageElement_DOMString";
 
-Native_CanvasRenderingContext2D_createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createRadialGradient_Callback(mthis, x0, y0, r0, x1, y1, r1) native "CanvasRenderingContext2D_createRadialGradient_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_RESOLVER_STRING_1_Element";
+  static $drawCustomFocusRing_Callback(mthis, element) native "CanvasRenderingContext2D_drawCustomFocusRing_Callback_RESOLVER_STRING_1_Element";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D__drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
+  static $_drawImage(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) {
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is CanvasElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is VideoElement || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     if ((sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && sw_OR_width == null && height_OR_sh == null && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
+      $_drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y);
       return;
     }
     if ((height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null) && dx == null && dy == null && dw == null && dh == null) {
-      Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
+      $_drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh);
       return;
     }
     if ((dh is num || dh == null) && (dw is num || dw == null) && (dy is num || dy == null) && (dx is num || dx == null) && (height_OR_sh is num || height_OR_sh == null) && (sw_OR_width is num || sw_OR_width == null) && (sy_OR_y is num || sy_OR_y == null) && (sx_OR_x is num || sx_OR_x == null) && (canvas_OR_image_OR_imageBitmap_OR_video is ImageBitmap || canvas_OR_image_OR_imageBitmap_OR_video == null)) {
-      Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+      $_drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLImageElement_float_float";
+  static $_drawImage_1_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLImageElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLImageElement_float_float_float_float";
+  static $_drawImage_2_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLImageElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLImageElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_3_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLImageElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLCanvasElement_float_float";
+  static $_drawImage_4_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLCanvasElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLCanvasElement_float_float_float_float";
+  static $_drawImage_5_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLCanvasElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLCanvasElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_6_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLCanvasElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLVideoElement_float_float";
+  static $_drawImage_7_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_HTMLVideoElement_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLVideoElement_float_float_float_float";
+  static $_drawImage_8_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_HTMLVideoElement_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLVideoElement_float_float_float_float_float_float_float_float";
+  static $_drawImage_9_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_HTMLVideoElement_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_ImageBitmap_float_float";
+  static $_drawImage_10_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_3_ImageBitmap_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_ImageBitmap_float_float_float_float";
+  static $_drawImage_11_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_5_ImageBitmap_float_float_float_float";
 
-Native_CanvasRenderingContext2D__drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_ImageBitmap_float_float_float_float_float_float_float_float";
+  static $_drawImage_12_Callback(mthis, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh) native "CanvasRenderingContext2D_drawImage_Callback_RESOLVER_STRING_9_ImageBitmap_float_float_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_RESOLVER_STRING_8_float_float_float_float_float_float_float_boolean";
+  static $ellipse_Callback(mthis, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise) native "CanvasRenderingContext2D_ellipse_Callback_RESOLVER_STRING_8_float_float_float_float_float_float_float_boolean";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_fill(mthis, winding) {
+  static $fill(mthis, winding) {
     if (winding != null) {
-      Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding);
+      $_fill_1_Callback(mthis, winding);
       return;
     }
-    Native_CanvasRenderingContext2D__fill_2_Callback(mthis);
+    $_fill_2_Callback(mthis);
     return;
   }
 
-Native_CanvasRenderingContext2D__fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_1_DOMString";
+  static $_fill_1_Callback(mthis, winding) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D__fill_2_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_0_";
+  static $_fill_2_Callback(mthis) native "CanvasRenderingContext2D_fill_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $fillRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_fillRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_fillText(mthis, text, x, y, maxWidth) {
+  static $fillText(mthis, text, x, y, maxWidth) {
     if (maxWidth != null) {
-      Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth);
+      $_fillText_1_Callback(mthis, text, x, y, maxWidth);
       return;
     }
-    Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y);
+    $_fillText_2_Callback(mthis, text, x, y);
     return;
   }
 
-Native_CanvasRenderingContext2D__fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
+  static $_fillText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_3_DOMString_float_float";
+  static $_fillText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_fillText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback_RESOLVER_STRING_0_";
+  static $getContextAttributes_Callback(mthis) native "CanvasRenderingContext2D_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getImageData_Callback(mthis, sx, sy, sw, sh) native "CanvasRenderingContext2D_getImageData_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback_RESOLVER_STRING_0_";
+  static $getLineDash_Callback(mthis) native "CanvasRenderingContext2D_getLineDash_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_isPointInPath(mthis, x, y, winding) {
+  static $isPointInPath(mthis, x, y, winding) {
     if (winding != null) {
-      return Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding);
+      return $_isPointInPath_1_Callback(mthis, x, y, winding);
     }
-    return Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y);
+    return $_isPointInPath_2_Callback(mthis, x, y);
   }
 
-Native_CanvasRenderingContext2D__isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_3_float_float_DOMString";
+  static $_isPointInPath_1_Callback(mthis, x, y, winding) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_3_float_float_DOMString";
 
-Native_CanvasRenderingContext2D__isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_2_float_float";
+  static $_isPointInPath_2_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInPath_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_RESOLVER_STRING_2_float_float";
+  static $isPointInStroke_Callback(mthis, x, y) native "CanvasRenderingContext2D_isPointInStroke_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
+  static $lineTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_RESOLVER_STRING_1_DOMString";
+  static $measureText_Callback(mthis, text) native "CanvasRenderingContext2D_measureText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_CanvasRenderingContext2D_moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "CanvasRenderingContext2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
+  static $putImageData(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) {
     if ((dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null) && dirtyX == null && dirtyY == null && dirtyWidth == null && dirtyHeight == null) {
-      Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy);
+      $_putImageData_1_Callback(mthis, imagedata, dx, dy);
       return;
     }
     if ((dirtyHeight is num || dirtyHeight == null) && (dirtyWidth is num || dirtyWidth == null) && (dirtyY is num || dirtyY == null) && (dirtyX is num || dirtyX == null) && (dy is num || dy == null) && (dx is num || dx == null) && (imagedata is ImageData || imagedata == null)) {
-      Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+      $_putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_CanvasRenderingContext2D__putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_3_ImageData_float_float";
+  static $_putImageData_1_Callback(mthis, imagedata, dx, dy) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_3_ImageData_float_float";
 
-Native_CanvasRenderingContext2D__putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
+  static $_putImageData_2_Callback(mthis, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight) native "CanvasRenderingContext2D_putImageData_Callback_RESOLVER_STRING_7_ImageData_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "CanvasRenderingContext2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $rect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_CanvasRenderingContext2D_resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback_RESOLVER_STRING_0_";
+  static $resetTransform_Callback(mthis) native "CanvasRenderingContext2D_resetTransform_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback_RESOLVER_STRING_0_";
+  static $restore_Callback(mthis) native "CanvasRenderingContext2D_restore_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback_RESOLVER_STRING_1_float";
+  static $rotate_Callback(mthis, angle) native "CanvasRenderingContext2D_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_CanvasRenderingContext2D_save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback_RESOLVER_STRING_0_";
+  static $save_Callback(mthis) native "CanvasRenderingContext2D_save_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_RESOLVER_STRING_2_float_float";
+  static $scale_Callback(mthis, sx, sy) native "CanvasRenderingContext2D_scale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_CanvasRenderingContext2D_setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_RESOLVER_STRING_1_sequence<unrestricted float>";
+  static $setLineDash_Callback(mthis, dash) native "CanvasRenderingContext2D_setLineDash_Callback_RESOLVER_STRING_1_sequence<unrestricted float>";
 
-Native_CanvasRenderingContext2D_setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $setTransform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_setTransform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback_RESOLVER_STRING_0_";
+  static $stroke_Callback(mthis) native "CanvasRenderingContext2D_stroke_Callback_RESOLVER_STRING_0_";
 
-Native_CanvasRenderingContext2D_strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $strokeRect_Callback(mthis, x, y, width, height) native "CanvasRenderingContext2D_strokeRect_Callback_RESOLVER_STRING_4_float_float_float_float";
 
   // Generated overload resolver
-Native_CanvasRenderingContext2D_strokeText(mthis, text, x, y, maxWidth) {
+  static $strokeText(mthis, text, x, y, maxWidth) {
     if (maxWidth != null) {
-      Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth);
+      $_strokeText_1_Callback(mthis, text, x, y, maxWidth);
       return;
     }
-    Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y);
+    $_strokeText_2_Callback(mthis, text, x, y);
     return;
   }
 
-Native_CanvasRenderingContext2D__strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
+  static $_strokeText_1_Callback(mthis, text, x, y, maxWidth) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_4_DOMString_float_float_float";
 
-Native_CanvasRenderingContext2D__strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_3_DOMString_float_float";
+  static $_strokeText_2_Callback(mthis, text, x, y) native "CanvasRenderingContext2D_strokeText_Callback_RESOLVER_STRING_3_DOMString_float_float";
 
-Native_CanvasRenderingContext2D_transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $transform_Callback(mthis, m11, m12, m21, m22, dx, dy) native "CanvasRenderingContext2D_transform_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_CanvasRenderingContext2D_translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_RESOLVER_STRING_2_float_float";
+  static $translate_Callback(mthis, tx, ty) native "CanvasRenderingContext2D_translate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_ClientRect_bottom_Getter(mthis) native "ClientRect_bottom_Getter";
+class BlinkChannelMergerNode {}
 
-Native_ClientRect_height_Getter(mthis) native "ClientRect_height_Getter";
+class BlinkChannelSplitterNode {}
 
-Native_ClientRect_left_Getter(mthis) native "ClientRect_left_Getter";
+class BlinkClientRect {
+  static $bottom_Getter(mthis) native "ClientRect_bottom_Getter";
 
-Native_ClientRect_right_Getter(mthis) native "ClientRect_right_Getter";
+  static $height_Getter(mthis) native "ClientRect_height_Getter";
 
-Native_ClientRect_top_Getter(mthis) native "ClientRect_top_Getter";
+  static $left_Getter(mthis) native "ClientRect_left_Getter";
 
-Native_ClientRect_width_Getter(mthis) native "ClientRect_width_Getter";
+  static $right_Getter(mthis) native "ClientRect_right_Getter";
 
-Native_ClientRectList_length_Getter(mthis) native "ClientRectList_length_Getter";
+  static $top_Getter(mthis) native "ClientRect_top_Getter";
 
-Native_ClientRectList_NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $width_Getter(mthis) native "ClientRect_width_Getter";
+}
 
-Native_ClientRectList_item_Callback(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkClientRectList {
+  static $length_Getter(mthis) native "ClientRectList_length_Getter";
 
-Native_Clipboard_dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Clipboard_dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
+  static $item_Callback(mthis, index) native "ClientRectList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Clipboard_effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
+class BlinkClipboard {
+  static $dropEffect_Getter(mthis) native "DataTransfer_dropEffect_Getter";
 
-Native_Clipboard_effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
+  static $dropEffect_Setter(mthis, value) native "DataTransfer_dropEffect_Setter";
 
-Native_Clipboard_files_Getter(mthis) native "DataTransfer_files_Getter";
+  static $effectAllowed_Getter(mthis) native "DataTransfer_effectAllowed_Getter";
 
-Native_Clipboard_items_Getter(mthis) native "DataTransfer_items_Getter";
+  static $effectAllowed_Setter(mthis, value) native "DataTransfer_effectAllowed_Setter";
 
-Native_Clipboard_types_Getter(mthis) native "DataTransfer_types_Getter";
+  static $files_Getter(mthis) native "DataTransfer_files_Getter";
+
+  static $items_Getter(mthis) native "DataTransfer_items_Getter";
+
+  static $types_Getter(mthis) native "DataTransfer_types_Getter";
 
   // Generated overload resolver
-Native_Clipboard_clearData(mthis, type) {
+  static $clearData(mthis, type) {
     if (type != null) {
-      Native_Clipboard__clearData_1_Callback(mthis, type);
+      $_clearData_1_Callback(mthis, type);
       return;
     }
-    Native_Clipboard__clearData_2_Callback(mthis);
+    $_clearData_2_Callback(mthis);
     return;
   }
 
-Native_Clipboard__clearData_1_Callback(mthis, type) native "DataTransfer_clearData_Callback_RESOLVER_STRING_1_DOMString";
+  static $_clearData_1_Callback(mthis, type) native "DataTransfer_clearData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard__clearData_2_Callback(mthis) native "DataTransfer_clearData_Callback_RESOLVER_STRING_0_";
+  static $_clearData_2_Callback(mthis) native "DataTransfer_clearData_Callback_RESOLVER_STRING_0_";
 
-Native_Clipboard_getData_Callback(mthis, type) native "DataTransfer_getData_Callback_RESOLVER_STRING_1_DOMString";
+  static $getData_Callback(mthis, type) native "DataTransfer_getData_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Clipboard_setData_Callback(mthis, type, data) native "DataTransfer_setData_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setData_Callback(mthis, type, data) native "DataTransfer_setData_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Clipboard_setDragImage_Callback(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_RESOLVER_STRING_3_Element_long_long";
+  static $setDragImage_Callback(mthis, image, x, y) native "DataTransfer_setDragImage_Callback_RESOLVER_STRING_3_Element_long_long";
+}
 
-Native_CloseEvent_code_Getter(mthis) native "CloseEvent_code_Getter";
+class BlinkCloseEvent {
+  static $code_Getter(mthis) native "CloseEvent_code_Getter";
 
-Native_CloseEvent_reason_Getter(mthis) native "CloseEvent_reason_Getter";
+  static $reason_Getter(mthis) native "CloseEvent_reason_Getter";
 
-Native_CloseEvent_wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+  static $wasClean_Getter(mthis) native "CloseEvent_wasClean_Getter";
+}
 
+class BlinkComment {
   // Generated overload resolver
-Native_Comment_Comment(data) {
-    return Native_Comment__create_1constructorCallback(data);
+  static $mkComment(data) {
+    return $_create_1constructorCallback(data);
   }
 
-Native_Comment__create_1constructorCallback(data) native "Comment_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(data) native "Comment_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_UIEvent_charCode_Getter(mthis) native "UIEvent_charCode_Getter";
+class BlinkUIEvent {
+  static $charCode_Getter(mthis) native "UIEvent_charCode_Getter";
 
-Native_UIEvent_detail_Getter(mthis) native "UIEvent_detail_Getter";
+  static $detail_Getter(mthis) native "UIEvent_detail_Getter";
 
-Native_UIEvent_keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
+  static $keyCode_Getter(mthis) native "UIEvent_keyCode_Getter";
 
-Native_UIEvent_layerX_Getter(mthis) native "UIEvent_layerX_Getter";
+  static $layerX_Getter(mthis) native "UIEvent_layerX_Getter";
 
-Native_UIEvent_layerY_Getter(mthis) native "UIEvent_layerY_Getter";
+  static $layerY_Getter(mthis) native "UIEvent_layerY_Getter";
 
-Native_UIEvent_pageX_Getter(mthis) native "UIEvent_pageX_Getter";
+  static $pageX_Getter(mthis) native "UIEvent_pageX_Getter";
 
-Native_UIEvent_pageY_Getter(mthis) native "UIEvent_pageY_Getter";
+  static $pageY_Getter(mthis) native "UIEvent_pageY_Getter";
 
-Native_UIEvent_view_Getter(mthis) native "UIEvent_view_Getter";
+  static $view_Getter(mthis) native "UIEvent_view_Getter";
 
-Native_UIEvent_which_Getter(mthis) native "UIEvent_which_Getter";
+  static $which_Getter(mthis) native "UIEvent_which_Getter";
 
-Native_UIEvent_initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_long";
+  static $initUIEvent_Callback(mthis, type, canBubble, cancelable, view, detail) native "UIEvent_initUIEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_long";
+}
 
-Native_CompositionEvent_activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
+class BlinkCompositionEvent {
+  static $activeSegmentEnd_Getter(mthis) native "CompositionEvent_activeSegmentEnd_Getter";
 
-Native_CompositionEvent_activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
+  static $activeSegmentStart_Getter(mthis) native "CompositionEvent_activeSegmentStart_Getter";
 
-Native_CompositionEvent_data_Getter(mthis) native "CompositionEvent_data_Getter";
+  static $data_Getter(mthis) native "CompositionEvent_data_Getter";
 
-Native_CompositionEvent_initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+  static $initCompositionEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "CompositionEvent_initCompositionEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+}
 
-Native_ConsoleBase_assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object";
+class BlinkConsoleBase {
+  static $assertCondition_Callback(mthis, condition, arg) native "ConsoleBase_assert_Callback_RESOLVER_STRING_2_boolean_object";
 
-Native_ConsoleBase_clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback_RESOLVER_STRING_1_object";
+  static $clear_Callback(mthis, arg) native "ConsoleBase_clear_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_count_Callback(mthis, arg) native "ConsoleBase_count_Callback_RESOLVER_STRING_1_object";
+  static $count_Callback(mthis, arg) native "ConsoleBase_count_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback_RESOLVER_STRING_1_object";
+  static $debug_Callback(mthis, arg) native "ConsoleBase_debug_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback_RESOLVER_STRING_1_object";
+  static $dir_Callback(mthis, arg) native "ConsoleBase_dir_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback_RESOLVER_STRING_1_object";
+  static $dirxml_Callback(mthis, arg) native "ConsoleBase_dirxml_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_error_Callback(mthis, arg) native "ConsoleBase_error_Callback_RESOLVER_STRING_1_object";
+  static $error_Callback(mthis, arg) native "ConsoleBase_error_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_group_Callback(mthis, arg) native "ConsoleBase_group_Callback_RESOLVER_STRING_1_object";
+  static $group_Callback(mthis, arg) native "ConsoleBase_group_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback_RESOLVER_STRING_1_object";
+  static $groupCollapsed_Callback(mthis, arg) native "ConsoleBase_groupCollapsed_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback_RESOLVER_STRING_0_";
+  static $groupEnd_Callback(mthis) native "ConsoleBase_groupEnd_Callback_RESOLVER_STRING_0_";
 
-Native_ConsoleBase_info_Callback(mthis, arg) native "ConsoleBase_info_Callback_RESOLVER_STRING_1_object";
+  static $info_Callback(mthis, arg) native "ConsoleBase_info_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_log_Callback(mthis, arg) native "ConsoleBase_log_Callback_RESOLVER_STRING_1_object";
+  static $log_Callback(mthis, arg) native "ConsoleBase_log_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback_RESOLVER_STRING_1_DOMString";
+  static $markTimeline_Callback(mthis, title) native "ConsoleBase_markTimeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profile_Callback(mthis, title) native "ConsoleBase_profile_Callback_RESOLVER_STRING_1_DOMString";
+  static $profile_Callback(mthis, title) native "ConsoleBase_profile_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $profileEnd_Callback(mthis, title) native "ConsoleBase_profileEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_table_Callback(mthis, arg) native "ConsoleBase_table_Callback_RESOLVER_STRING_1_object";
+  static $table_Callback(mthis, arg) native "ConsoleBase_table_Callback_RESOLVER_STRING_1_object";
 
-Native_ConsoleBase_time_Callback(mthis, title) native "ConsoleBase_time_Callback_RESOLVER_STRING_1_DOMString";
+  static $time_Callback(mthis, title) native "ConsoleBase_time_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeEnd_Callback(mthis, title) native "ConsoleBase_timeEnd_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeStamp_Callback(mthis, title) native "ConsoleBase_timeStamp_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeline_Callback(mthis, title) native "ConsoleBase_timeline_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ConsoleBase_timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback_RESOLVER_STRING_1_DOMString";
+  static $timelineEnd_Callback(mthis, title) native "ConsoleBase_timelineEnd_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback_RESOLVER_STRING_1_object";
+
+  static $warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback_RESOLVER_STRING_1_object";
+}
 
-Native_ConsoleBase_trace_Callback(mthis, arg) native "ConsoleBase_trace_Callback_RESOLVER_STRING_1_object";
+class BlinkConsole {
+  static $memory_Getter(mthis) native "Console_memory_Getter";
+}
 
-Native_ConsoleBase_warn_Callback(mthis, arg) native "ConsoleBase_warn_Callback_RESOLVER_STRING_1_object";
+class BlinkConvolverNode {
+  static $buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
 
-Native_Console_memory_Getter(mthis) native "Console_memory_Getter";
+  static $buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
 
-Native_ConvolverNode_buffer_Getter(mthis) native "ConvolverNode_buffer_Getter";
+  static $normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
 
-Native_ConvolverNode_buffer_Setter(mthis, value) native "ConvolverNode_buffer_Setter";
+  static $normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+}
 
-Native_ConvolverNode_normalize_Getter(mthis) native "ConvolverNode_normalize_Getter";
+class BlinkCoordinates {
+  static $accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
 
-Native_ConvolverNode_normalize_Setter(mthis, value) native "ConvolverNode_normalize_Setter";
+  static $altitude_Getter(mthis) native "Coordinates_altitude_Getter";
 
-Native_Coordinates_accuracy_Getter(mthis) native "Coordinates_accuracy_Getter";
+  static $altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
 
-Native_Coordinates_altitude_Getter(mthis) native "Coordinates_altitude_Getter";
+  static $heading_Getter(mthis) native "Coordinates_heading_Getter";
 
-Native_Coordinates_altitudeAccuracy_Getter(mthis) native "Coordinates_altitudeAccuracy_Getter";
+  static $latitude_Getter(mthis) native "Coordinates_latitude_Getter";
 
-Native_Coordinates_heading_Getter(mthis) native "Coordinates_heading_Getter";
+  static $longitude_Getter(mthis) native "Coordinates_longitude_Getter";
 
-Native_Coordinates_latitude_Getter(mthis) native "Coordinates_latitude_Getter";
+  static $speed_Getter(mthis) native "Coordinates_speed_Getter";
+}
 
-Native_Coordinates_longitude_Getter(mthis) native "Coordinates_longitude_Getter";
+class BlinkCounter {}
 
-Native_Coordinates_speed_Getter(mthis) native "Coordinates_speed_Getter";
+class BlinkCrypto {
+  static $subtle_Getter(mthis) native "Crypto_subtle_Getter";
 
-Native_Crypto_subtle_Getter(mthis) native "Crypto_subtle_Getter";
+  static $getRandomValues_Callback(mthis, array) native "Crypto_getRandomValues_Callback";
+}
 
-Native_Crypto_getRandomValues_Callback(mthis, array) native "Crypto_getRandomValues_Callback";
+class BlinkCustomEvent {
+  static $detail_Getter(mthis) native "CustomEvent_detail_Getter";
 
-Native_CustomEvent_detail_Getter(mthis) native "CustomEvent_detail_Getter";
+  static $initCustomEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+}
 
-Native_CustomEvent_initCustomEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, detailArg) native "CustomEvent_initCustomEvent_Callback";
+class BlinkDOMError {
+  static $message_Getter(mthis) native "DOMError_message_Getter";
 
-Native_DOMError_message_Getter(mthis) native "DOMError_message_Getter";
+  static $name_Getter(mthis) native "DOMError_name_Getter";
+}
 
-Native_DOMError_name_Getter(mthis) native "DOMError_name_Getter";
+class BlinkDOMException {
+  static $message_Getter(mthis) native "DOMException_message_Getter";
 
-Native_DOMException_message_Getter(mthis) native "DOMException_message_Getter";
+  static $name_Getter(mthis) native "DOMException_name_Getter";
 
-Native_DOMException_name_Getter(mthis) native "DOMException_name_Getter";
+  static $toString_Callback(mthis) native "DOMException_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DOMException_toString_Callback(mthis) native "DOMException_toString_Callback_RESOLVER_STRING_0_";
+class BlinkDOMFileSystem {
+  static $name_Getter(mthis) native "DOMFileSystem_name_Getter";
 
-Native_DOMFileSystem_name_Getter(mthis) native "DOMFileSystem_name_Getter";
+  static $root_Getter(mthis) native "DOMFileSystem_root_Getter";
+}
 
-Native_DOMFileSystem_root_Getter(mthis) native "DOMFileSystem_root_Getter";
+class BlinkDOMFileSystemSync {}
 
-Native_DOMImplementation_createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback_RESOLVER_STRING_3_DOMString_DOMString_DocumentType";
+class BlinkDOMImplementation {
+  static $createDocument_Callback(mthis, namespaceURI, qualifiedName, doctype) native "DOMImplementation_createDocument_Callback_RESOLVER_STRING_3_DOMString_DOMString_DocumentType";
 
-Native_DOMImplementation_createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $createDocumentType_Callback(mthis, qualifiedName, publicId, systemId) native "DOMImplementation_createDocumentType_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_DOMImplementation_createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback_RESOLVER_STRING_1_DOMString";
+  static $createHTMLDocument_Callback(mthis, title) native "DOMImplementation_createHTMLDocument_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMImplementation_hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $hasFeature_Callback(mthis, feature, version) native "DOMImplementation_hasFeature_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
+class BlinkDOMParser {
   // Generated overload resolver
-Native_DOMParser_DomParser() {
-    return Native_DOMParser__create_1constructorCallback();
+  static $mkDomParser() {
+    return $_create_1constructorCallback();
   }
 
-Native_DOMParser__create_1constructorCallback() native "DOMParser_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "DOMParser_constructorCallback_RESOLVER_STRING_0_";
 
-Native_DOMParser_parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $parseFromString_Callback(mthis, str, contentType) native "DOMParser_parseFromString_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_DOMTokenList_length_Getter(mthis) native "DOMTokenList_length_Getter";
+class BlinkDOMTokenList {
+  static $length_Getter(mthis) native "DOMTokenList_length_Getter";
 
-Native_DOMTokenList_contains_Callback(mthis, token) native "DOMTokenList_contains_Callback_RESOLVER_STRING_1_DOMString";
+  static $contains_Callback(mthis, token) native "DOMTokenList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMTokenList_item_Callback(mthis, index) native "DOMTokenList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "DOMTokenList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMTokenList_toString_Callback(mthis) native "DOMTokenList_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "DOMTokenList_toString_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_DOMTokenList_toggle(mthis, token, force) {
+  static $toggle(mthis, token, force) {
     if (force != null) {
-      return Native_DOMTokenList__toggle_1_Callback(mthis, token, force);
+      return $_toggle_1_Callback(mthis, token, force);
     }
-    return Native_DOMTokenList__toggle_2_Callback(mthis, token);
+    return $_toggle_2_Callback(mthis, token);
   }
 
-Native_DOMTokenList__toggle_1_Callback(mthis, token, force) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_2_DOMString_boolean";
+  static $_toggle_1_Callback(mthis, token, force) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_2_DOMString_boolean";
 
-Native_DOMTokenList__toggle_2_Callback(mthis, token) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_1_DOMString";
+  static $_toggle_2_Callback(mthis, token) native "DOMTokenList_toggle_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_DOMSettableTokenList_value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
+class BlinkDOMSettableTokenList {
+  static $value_Getter(mthis) native "DOMSettableTokenList_value_Getter";
 
-Native_DOMSettableTokenList_value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
+  static $value_Setter(mthis, value) native "DOMSettableTokenList_value_Setter";
 
-Native_DOMSettableTokenList___getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, index) native "DOMSettableTokenList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_DOMStringList_length_Getter(mthis) native "DOMStringList_length_Getter";
+class BlinkDOMStringList {
+  static $length_Getter(mthis) native "DOMStringList_length_Getter";
 
-Native_DOMStringList_NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringList_contains_Callback(mthis, string) native "DOMStringList_contains_Callback_RESOLVER_STRING_1_DOMString";
+  static $contains_Callback(mthis, string) native "DOMStringList_contains_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DOMStringList_item_Callback(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "DOMStringList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
+class BlinkDOMStringMap {
   // Generated overload resolver
-Native_DOMStringMap___delete__(mthis, index_OR_name) {
+  static $__delete__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name);
+      return $___delete___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name);
+      return $___delete___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____delete___1_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___delete___1_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____delete___2_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_DOMString";
+  static $___delete___2_Callback(mthis, index_OR_name) native "DOMStringMap___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_DOMStringMap___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____getter___1_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_DOMStringMap____getter___2_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $___getter___2_Callback(mthis, index_OR_name) native "DOMStringMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_DOMStringMap___setter__(mthis, index_OR_name, value) {
+  static $__setter__(mthis, index_OR_name, value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value);
+      $___setter___1_Callback(mthis, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value);
+      $___setter___2_Callback(mthis, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DOMStringMap____setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $___setter___1_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_DOMStringMap____setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $___setter___2_Callback(mthis, index_OR_name, value) native "DOMStringMap___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_DataTransferItem_kind_Getter(mthis) native "DataTransferItem_kind_Getter";
+class BlinkDataTransferItem {
+  static $kind_Getter(mthis) native "DataTransferItem_kind_Getter";
 
-Native_DataTransferItem_type_Getter(mthis) native "DataTransferItem_type_Getter";
+  static $type_Getter(mthis) native "DataTransferItem_type_Getter";
 
-Native_DataTransferItem_getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback_RESOLVER_STRING_0_";
+  static $getAsFile_Callback(mthis) native "DataTransferItem_getAsFile_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItem_getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback_RESOLVER_STRING_1_StringCallback";
+  static $getAsString_Callback(mthis, callback) native "DataTransferItem_getAsString_Callback_RESOLVER_STRING_1_StringCallback";
 
-Native_DataTransferItem_webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback_RESOLVER_STRING_0_";
+  static $webkitGetAsEntry_Callback(mthis) native "DataTransferItem_webkitGetAsEntry_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DataTransferItemList_length_Getter(mthis) native "DataTransferItemList_length_Getter";
+class BlinkDataTransferItemList {
+  static $length_Getter(mthis) native "DataTransferItemList_length_Getter";
 
-Native_DataTransferItemList___getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, index) native "DataTransferItemList___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_DataTransferItemList_add(mthis, data_OR_file, type) {
+  static $add(mthis, data_OR_file, type) {
     if ((data_OR_file is File || data_OR_file == null) && type == null) {
-      return Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file);
+      return $_add_1_Callback(mthis, data_OR_file);
     }
     if ((type is String || type == null) && (data_OR_file is String || data_OR_file == null)) {
-      return Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type);
+      return $_add_2_Callback(mthis, data_OR_file, type);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_DataTransferItemList__add_1_Callback(mthis, data_OR_file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
+  static $_add_1_Callback(mthis, data_OR_file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList__add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_add_2_Callback(mthis, data_OR_file, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addData_Callback(mthis, data, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $addData_Callback(mthis, data, type) native "DataTransferItemList_add_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_DataTransferItemList_addFile_Callback(mthis, file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
+  static $addFile_Callback(mthis, file) native "DataTransferItemList_add_Callback_RESOLVER_STRING_1_File";
 
-Native_DataTransferItemList_clear_Callback(mthis) native "DataTransferItemList_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "DataTransferItemList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_DataTransferItemList_remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback_RESOLVER_STRING_1_unsigned long";
+  static $remove_Callback(mthis, index) native "DataTransferItemList_remove_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Database_version_Getter(mthis) native "Database_version_Getter";
+class BlinkDatabase {
+  static $version_Getter(mthis) native "Database_version_Getter";
 
-Native_Database_changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback_RESOLVER_STRING_5_DOMString_DOMString_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $changeVersion_Callback(mthis, oldVersion, newVersion, callback, errorCallback, successCallback) native "Database_changeVersion_Callback_RESOLVER_STRING_5_DOMString_DOMString_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $readTransaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_readTransaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
 
-Native_Database_transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+  static $transaction_Callback(mthis, callback, errorCallback, successCallback) native "Database_transaction_Callback_RESOLVER_STRING_3_SQLTransactionCallback_SQLTransactionErrorCallback_VoidCallback";
+}
 
-Native_WindowBase64_atob_Callback(mthis, string) native "WindowBase64_atob_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkDatabaseSync {}
 
-Native_WindowBase64_btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkWindowBase64 {
+  static $atob_Callback(mthis, string) native "WindowBase64_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WindowTimers_clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $btoa_Callback(mthis, string) native "WindowBase64_btoa_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_WindowTimers_clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback_RESOLVER_STRING_1_long";
+class BlinkWindowTimers {
+  static $clearInterval_Callback(mthis, handle) native "WindowTimers_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WindowTimers_setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
+  static $clearTimeout_Callback(mthis, handle) native "WindowTimers_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_WindowTimers_setTimeout_Callback(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "WindowTimers_setInterval_Callback";
 
-Native_WorkerGlobalScope_console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
+  static $setTimeout_Callback(mthis, handler, timeout) native "WindowTimers_setTimeout_Callback";
+}
 
-Native_WorkerGlobalScope_crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
+class BlinkWorkerGlobalScope {
+  static $console_Getter(mthis) native "WorkerGlobalScope_console_Getter";
 
-Native_WorkerGlobalScope_indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
+  static $crypto_Getter(mthis) native "WorkerGlobalScope_crypto_Getter";
 
-Native_WorkerGlobalScope_location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
+  static $indexedDB_Getter(mthis) native "WorkerGlobalScope_indexedDB_Getter";
 
-Native_WorkerGlobalScope_navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
+  static $location_Getter(mthis) native "WorkerGlobalScope_location_Getter";
 
-Native_WorkerGlobalScope_performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
+  static $navigator_Getter(mthis) native "WorkerGlobalScope_navigator_Getter";
 
-Native_WorkerGlobalScope_self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
+  static $performance_Getter(mthis) native "WorkerGlobalScope_performance_Getter";
 
-Native_WorkerGlobalScope_close_Callback(mthis) native "WorkerGlobalScope_close_Callback_RESOLVER_STRING_0_";
+  static $self_Getter(mthis) native "WorkerGlobalScope_self_Getter";
 
-Native_WorkerGlobalScope_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $close_Callback(mthis) native "WorkerGlobalScope_close_Callback_RESOLVER_STRING_0_";
 
-Native_WorkerGlobalScope_openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
+  static $openDatabaseSync_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "WorkerGlobalScope_openDatabaseSync_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback_RESOLVER_STRING_2_unsigned short_long long";
+  static $webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "WorkerGlobalScope_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback_RESOLVER_STRING_1_DOMString";
+  static $webkitRequestFileSystemSync_Callback(mthis, type, size) native "WorkerGlobalScope_webkitRequestFileSystemSync_Callback_RESOLVER_STRING_2_unsigned short_long long";
 
-Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
+  static $webkitResolveLocalFileSystemSyncURL_Callback(mthis, url) native "WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback_RESOLVER_STRING_1_DOMString";
+  static $webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_WorkerGlobalScope_btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback_RESOLVER_STRING_1_DOMString";
+  static $atob_Callback(mthis, string) native "WorkerGlobalScope_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $btoa_Callback(mthis, string) native "WorkerGlobalScope_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WorkerGlobalScope_clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback_RESOLVER_STRING_1_long";
+  static $clearInterval_Callback(mthis, handle) native "WorkerGlobalScope_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_WorkerGlobalScope_setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
+  static $clearTimeout_Callback(mthis, handle) native "WorkerGlobalScope_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_WorkerGlobalScope_setTimeout_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setInterval_Callback";
 
-Native_DedicatedWorkerGlobalScope_postMessage_Callback(mthis, message, messagePorts) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+  static $setTimeout_Callback(mthis, handler, timeout) native "WorkerGlobalScope_setTimeout_Callback";
+}
 
-Native_DelayNode_delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+class BlinkDedicatedWorkerGlobalScope {
+  static $postMessage_Callback(mthis, message, messagePorts) native "DedicatedWorkerGlobalScope_postMessage_Callback";
+}
 
-Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback_RESOLVER_STRING_3_unsigned short_StorageUsageCallback_StorageErrorCallback";
+class BlinkDelayNode {
+  static $delayTime_Getter(mthis) native "DelayNode_delayTime_Getter";
+}
 
-Native_DeprecatedStorageInfo_requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback_RESOLVER_STRING_4_unsigned short_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+class BlinkDeprecatedStorageInfo {
+  static $queryUsageAndQuota_Callback(mthis, storageType, usageCallback, errorCallback) native "DeprecatedStorageInfo_queryUsageAndQuota_Callback_RESOLVER_STRING_3_unsigned short_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback_RESOLVER_STRING_2_StorageUsageCallback_StorageErrorCallback";
+  static $requestQuota_Callback(mthis, storageType, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageInfo_requestQuota_Callback_RESOLVER_STRING_4_unsigned short_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+}
 
-Native_DeprecatedStorageQuota_requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback_RESOLVER_STRING_3_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+class BlinkDeprecatedStorageQuota {
+  static $queryUsageAndQuota_Callback(mthis, usageCallback, errorCallback) native "DeprecatedStorageQuota_queryUsageAndQuota_Callback_RESOLVER_STRING_2_StorageUsageCallback_StorageErrorCallback";
 
-Native_DeviceAcceleration_x_Getter(mthis) native "DeviceAcceleration_x_Getter";
+  static $requestQuota_Callback(mthis, newQuotaInBytes, quotaCallback, errorCallback) native "DeprecatedStorageQuota_requestQuota_Callback_RESOLVER_STRING_3_unsigned long long_StorageQuotaCallback_StorageErrorCallback";
+}
 
-Native_DeviceAcceleration_y_Getter(mthis) native "DeviceAcceleration_y_Getter";
+class BlinkDeviceAcceleration {
+  static $x_Getter(mthis) native "DeviceAcceleration_x_Getter";
 
-Native_DeviceAcceleration_z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+  static $y_Getter(mthis) native "DeviceAcceleration_y_Getter";
 
-Native_DeviceMotionEvent_acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
+  static $z_Getter(mthis) native "DeviceAcceleration_z_Getter";
+}
 
-Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
+class BlinkDeviceMotionEvent {
+  static $acceleration_Getter(mthis) native "DeviceMotionEvent_acceleration_Getter";
 
-Native_DeviceMotionEvent_interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
+  static $accelerationIncludingGravity_Getter(mthis) native "DeviceMotionEvent_accelerationIncludingGravity_Getter";
 
-Native_DeviceMotionEvent_rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
+  static $interval_Getter(mthis) native "DeviceMotionEvent_interval_Getter";
 
-Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+  static $rotationRate_Getter(mthis) native "DeviceMotionEvent_rotationRate_Getter";
 
-Native_DeviceOrientationEvent_absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
+  static $initDeviceMotionEvent_Callback(mthis, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval) native "DeviceMotionEvent_initDeviceMotionEvent_Callback";
+}
 
-Native_DeviceOrientationEvent_alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
+class BlinkDeviceOrientationEvent {
+  static $absolute_Getter(mthis) native "DeviceOrientationEvent_absolute_Getter";
 
-Native_DeviceOrientationEvent_beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
+  static $alpha_Getter(mthis) native "DeviceOrientationEvent_alpha_Getter";
 
-Native_DeviceOrientationEvent_gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
+  static $beta_Getter(mthis) native "DeviceOrientationEvent_beta_Getter";
 
-Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+  static $gamma_Getter(mthis) native "DeviceOrientationEvent_gamma_Getter";
 
-Native_DeviceRotationRate_alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
+  static $initDeviceOrientationEvent_Callback(mthis, type, bubbles, cancelable, alpha, beta, gamma, absolute) native "DeviceOrientationEvent_initDeviceOrientationEvent_Callback";
+}
 
-Native_DeviceRotationRate_beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
+class BlinkDeviceRotationRate {
+  static $alpha_Getter(mthis) native "DeviceRotationRate_alpha_Getter";
 
-Native_DeviceRotationRate_gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+  static $beta_Getter(mthis) native "DeviceRotationRate_beta_Getter";
 
-Native_Entry_filesystem_Getter(mthis) native "Entry_filesystem_Getter";
+  static $gamma_Getter(mthis) native "DeviceRotationRate_gamma_Getter";
+}
 
-Native_Entry_fullPath_Getter(mthis) native "Entry_fullPath_Getter";
+class BlinkEntry {
+  static $filesystem_Getter(mthis) native "Entry_filesystem_Getter";
 
-Native_Entry_isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
+  static $fullPath_Getter(mthis) native "Entry_fullPath_Getter";
 
-Native_Entry_isFile_Getter(mthis) native "Entry_isFile_Getter";
+  static $isDirectory_Getter(mthis) native "Entry_isDirectory_Getter";
 
-Native_Entry_name_Getter(mthis) native "Entry_name_Getter";
+  static $isFile_Getter(mthis) native "Entry_isFile_Getter";
+
+  static $name_Getter(mthis) native "Entry_name_Getter";
 
   // Generated overload resolver
-Native_Entry__copyTo(mthis, parent, name, successCallback, errorCallback) {
+  static $_copyTo(mthis, parent, name, successCallback, errorCallback) {
     if (name != null) {
-      Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      $_copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
       return;
     }
-    Native_Entry__copyTo_2_Callback(mthis, parent);
+    $_copyTo_2_Callback(mthis, parent);
     return;
   }
 
-Native_Entry__copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
+  static $_copyTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_copyTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__copyTo_2_Callback(mthis, parent) native "Entry_copyTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
+  static $_copyTo_2_Callback(mthis, parent) native "Entry_copyTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback_RESOLVER_STRING_2_MetadataCallback_ErrorCallback";
+  static $getMetadata_Callback(mthis, successCallback, errorCallback) native "Entry_getMetadata_Callback_RESOLVER_STRING_2_MetadataCallback_ErrorCallback";
 
-Native_Entry_getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback_RESOLVER_STRING_2_EntryCallback_ErrorCallback";
+  static $getParent_Callback(mthis, successCallback, errorCallback) native "Entry_getParent_Callback_RESOLVER_STRING_2_EntryCallback_ErrorCallback";
 
   // Generated overload resolver
-Native_Entry__moveTo(mthis, parent, name, successCallback, errorCallback) {
+  static $_moveTo(mthis, parent, name, successCallback, errorCallback) {
     if (name != null) {
-      Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
+      $_moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback);
       return;
     }
-    Native_Entry__moveTo_2_Callback(mthis, parent);
+    $_moveTo_2_Callback(mthis, parent);
     return;
   }
 
-Native_Entry__moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
+  static $_moveTo_1_Callback(mthis, parent, name, successCallback, errorCallback) native "Entry_moveTo_Callback_RESOLVER_STRING_4_DirectoryEntry_DOMString_EntryCallback_ErrorCallback";
 
-Native_Entry__moveTo_2_Callback(mthis, parent) native "Entry_moveTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
+  static $_moveTo_2_Callback(mthis, parent) native "Entry_moveTo_Callback_RESOLVER_STRING_1_DirectoryEntry";
 
-Native_Entry_remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+  static $remove_Callback(mthis, successCallback, errorCallback) native "Entry_remove_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
 
-Native_Entry_toURL_Callback(mthis) native "Entry_toURL_Callback_RESOLVER_STRING_0_";
+  static $toURL_Callback(mthis) native "Entry_toURL_Callback_RESOLVER_STRING_0_";
+}
 
-Native_DirectoryEntry_createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback_RESOLVER_STRING_0_";
+class BlinkDirectoryEntry {
+  static $createReader_Callback(mthis) native "DirectoryEntry_createReader_Callback_RESOLVER_STRING_0_";
 
-Native_DirectoryEntry_getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
+  static $getDirectory_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getDirectory_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
+  static $getFile_Callback(mthis, path, options, successCallback, errorCallback) native "DirectoryEntry_getFile_Callback_RESOLVER_STRING_4_DOMString_Dictionary_EntryCallback_ErrorCallback";
 
-Native_DirectoryEntry_removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+  static $removeRecursively_Callback(mthis, successCallback, errorCallback) native "DirectoryEntry_removeRecursively_Callback_RESOLVER_STRING_2_VoidCallback_ErrorCallback";
+}
 
-Native_DirectoryReader_readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback_RESOLVER_STRING_2_EntriesCallback_ErrorCallback";
+class BlinkEntrySync {}
 
-Native_ParentNode_childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
+class BlinkDirectoryEntrySync {}
 
-Native_ParentNode_children_Getter(mthis) native "ParentNode_children_Getter";
+class BlinkDirectoryReader {
+  static $readEntries_Callback(mthis, successCallback, errorCallback) native "DirectoryReader_readEntries_Callback_RESOLVER_STRING_2_EntriesCallback_ErrorCallback";
+}
 
-Native_ParentNode_firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
+class BlinkDirectoryReaderSync {}
 
-Native_ParentNode_lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+class BlinkGlobalEventHandlers {}
 
-Native_Document_activeElement_Getter(mthis) native "Document_activeElement_Getter";
+class BlinkParentNode {
+  static $childElementCount_Getter(mthis) native "ParentNode_childElementCount_Getter";
 
-Native_Document_body_Getter(mthis) native "Document_body_Getter";
+  static $children_Getter(mthis) native "ParentNode_children_Getter";
 
-Native_Document_body_Setter(mthis, value) native "Document_body_Setter";
+  static $firstElementChild_Getter(mthis) native "ParentNode_firstElementChild_Getter";
 
-Native_Document_cookie_Getter(mthis) native "Document_cookie_Getter";
+  static $lastElementChild_Getter(mthis) native "ParentNode_lastElementChild_Getter";
+}
 
-Native_Document_cookie_Setter(mthis, value) native "Document_cookie_Setter";
+class BlinkDocument {
+  static $activeElement_Getter(mthis) native "Document_activeElement_Getter";
 
-Native_Document_currentScript_Getter(mthis) native "Document_currentScript_Getter";
+  static $body_Getter(mthis) native "Document_body_Getter";
 
-Native_Document_defaultView_Getter(mthis) native "Document_defaultView_Getter";
+  static $body_Setter(mthis, value) native "Document_body_Setter";
 
-Native_Document_documentElement_Getter(mthis) native "Document_documentElement_Getter";
+  static $cookie_Getter(mthis) native "Document_cookie_Getter";
 
-Native_Document_domain_Getter(mthis) native "Document_domain_Getter";
+  static $cookie_Setter(mthis, value) native "Document_cookie_Setter";
 
-Native_Document_fonts_Getter(mthis) native "Document_fonts_Getter";
+  static $currentScript_Getter(mthis) native "Document_currentScript_Getter";
 
-Native_Document_head_Getter(mthis) native "Document_head_Getter";
+  static $defaultView_Getter(mthis) native "Document_defaultView_Getter";
 
-Native_Document_hidden_Getter(mthis) native "Document_hidden_Getter";
+  static $documentElement_Getter(mthis) native "Document_documentElement_Getter";
 
-Native_Document_implementation_Getter(mthis) native "Document_implementation_Getter";
+  static $domain_Getter(mthis) native "Document_domain_Getter";
 
-Native_Document_lastModified_Getter(mthis) native "Document_lastModified_Getter";
+  static $fonts_Getter(mthis) native "Document_fonts_Getter";
 
-Native_Document_preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
+  static $head_Getter(mthis) native "Document_head_Getter";
 
-Native_Document_readyState_Getter(mthis) native "Document_readyState_Getter";
+  static $hidden_Getter(mthis) native "Document_hidden_Getter";
 
-Native_Document_referrer_Getter(mthis) native "Document_referrer_Getter";
+  static $implementation_Getter(mthis) native "Document_implementation_Getter";
 
-Native_Document_rootElement_Getter(mthis) native "Document_rootElement_Getter";
+  static $lastModified_Getter(mthis) native "Document_lastModified_Getter";
 
-Native_Document_selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
+  static $preferredStylesheetSet_Getter(mthis) native "Document_preferredStylesheetSet_Getter";
 
-Native_Document_selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
+  static $readyState_Getter(mthis) native "Document_readyState_Getter";
 
-Native_Document_styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
+  static $referrer_Getter(mthis) native "Document_referrer_Getter";
 
-Native_Document_timeline_Getter(mthis) native "Document_timeline_Getter";
+  static $rootElement_Getter(mthis) native "Document_rootElement_Getter";
 
-Native_Document_title_Getter(mthis) native "Document_title_Getter";
+  static $selectedStylesheetSet_Getter(mthis) native "Document_selectedStylesheetSet_Getter";
 
-Native_Document_title_Setter(mthis, value) native "Document_title_Setter";
+  static $selectedStylesheetSet_Setter(mthis, value) native "Document_selectedStylesheetSet_Setter";
 
-Native_Document_visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
+  static $styleSheets_Getter(mthis) native "Document_styleSheets_Getter";
 
-Native_Document_webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
+  static $timeline_Getter(mthis) native "Document_timeline_Getter";
 
-Native_Document_webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
+  static $title_Getter(mthis) native "Document_title_Getter";
 
-Native_Document_webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
+  static $title_Setter(mthis, value) native "Document_title_Setter";
 
-Native_Document_webkitPointerLockElement_Getter(mthis) native "Document_webkitPointerLockElement_Getter";
+  static $visibilityState_Getter(mthis) native "Document_visibilityState_Getter";
 
-Native_Document_webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
+  static $webkitFullscreenElement_Getter(mthis) native "Document_webkitFullscreenElement_Getter";
 
-Native_Document_adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback_RESOLVER_STRING_1_Node";
+  static $webkitFullscreenEnabled_Getter(mthis) native "Document_webkitFullscreenEnabled_Getter";
 
-Native_Document_caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $webkitHidden_Getter(mthis) native "Document_webkitHidden_Getter";
 
-Native_Document_createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback_RESOLVER_STRING_0_";
+  static $webkitPointerLockElement_Getter(mthis) native "Document_webkitPointerLockElement_Getter";
 
-Native_Document_createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
+  static $webkitVisibilityState_Getter(mthis) native "Document_webkitVisibilityState_Getter";
 
-Native_Document_createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
+  static $adoptNode_Callback(mthis, node) native "Document_adoptNode_Callback_RESOLVER_STRING_1_Node";
+
+  static $caretRangeFromPoint_Callback(mthis, x, y) native "Document_caretRangeFromPoint_Callback_RESOLVER_STRING_2_long_long";
+
+  static $createDocumentFragment_Callback(mthis) native "Document_createDocumentFragment_Callback_RESOLVER_STRING_0_";
+
+  static $createElement_Callback(mthis, localName_OR_tagName, typeExtension) native "Document_createElement_Callback";
+
+  static $createElementNS_Callback(mthis, namespaceURI, qualifiedName, typeExtension) native "Document_createElementNS_Callback";
 
   // Generated overload resolver
-Native_Document__createEvent(mthis, eventType) {
+  static $_createEvent(mthis, eventType) {
     if (eventType != null) {
-      return Native_Document__createEvent_1_Callback(mthis, eventType);
+      return $_createEvent_1_Callback(mthis, eventType);
     }
-    return Native_Document__createEvent_2_Callback(mthis);
+    return $_createEvent_2_Callback(mthis);
   }
 
-Native_Document__createEvent_1_Callback(mthis, eventType) native "Document_createEvent_Callback_RESOLVER_STRING_1_DOMString";
+  static $_createEvent_1_Callback(mthis, eventType) native "Document_createEvent_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document__createEvent_2_Callback(mthis) native "Document_createEvent_Callback_RESOLVER_STRING_0_";
+  static $_createEvent_2_Callback(mthis) native "Document_createEvent_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_Document__createNodeIterator(mthis, root, whatToShow, filter) {
+  static $_createNodeIterator(mthis, root, whatToShow, filter) {
     if (filter != null) {
-      return Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
+      return $_createNodeIterator_1_Callback(mthis, root, whatToShow, filter);
     }
     if (whatToShow != null) {
-      return Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow);
+      return $_createNodeIterator_2_Callback(mthis, root, whatToShow);
     }
-    return Native_Document__createNodeIterator_3_Callback(mthis, root);
+    return $_createNodeIterator_3_Callback(mthis, root);
   }
 
-Native_Document__createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
+  static $_createNodeIterator_1_Callback(mthis, root, whatToShow, filter) native "Document_createNodeIterator_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_RESOLVER_STRING_2_Node_unsigned long";
+  static $_createNodeIterator_2_Callback(mthis, root, whatToShow) native "Document_createNodeIterator_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createNodeIterator_3_Callback(mthis, root) native "Document_createNodeIterator_Callback_RESOLVER_STRING_1_Node";
+  static $_createNodeIterator_3_Callback(mthis, root) native "Document_createNodeIterator_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_createRange_Callback(mthis) native "Document_createRange_Callback_RESOLVER_STRING_0_";
+  static $createRange_Callback(mthis) native "Document_createRange_Callback_RESOLVER_STRING_0_";
 
-Native_Document_createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback_RESOLVER_STRING_1_DOMString";
+  static $createTextNode_Callback(mthis, data) native "Document_createTextNode_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_RESOLVER_STRING_11_Window_EventTarget_long_long_long_long_long_long_long_float_float";
+  static $createTouch_Callback(mthis, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce) native "Document_createTouch_Callback_RESOLVER_STRING_11_Window_EventTarget_long_long_long_long_long_long_long_float_float";
 
   // Generated overload resolver
-Native_Document__createTreeWalker(mthis, root, whatToShow, filter) {
+  static $_createTreeWalker(mthis, root, whatToShow, filter) {
     if (filter != null) {
-      return Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
+      return $_createTreeWalker_1_Callback(mthis, root, whatToShow, filter);
     }
     if (whatToShow != null) {
-      return Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow);
+      return $_createTreeWalker_2_Callback(mthis, root, whatToShow);
     }
-    return Native_Document__createTreeWalker_3_Callback(mthis, root);
+    return $_createTreeWalker_3_Callback(mthis, root);
   }
 
-Native_Document__createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
+  static $_createTreeWalker_1_Callback(mthis, root, whatToShow, filter) native "Document_createTreeWalker_Callback_RESOLVER_STRING_3_Node_unsigned long_NodeFilter";
 
-Native_Document__createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document_createTreeWalker_Callback_RESOLVER_STRING_2_Node_unsigned long";
+  static $_createTreeWalker_2_Callback(mthis, root, whatToShow) native "Document_createTreeWalker_Callback_RESOLVER_STRING_2_Node_unsigned long";
 
-Native_Document__createTreeWalker_3_Callback(mthis, root) native "Document_createTreeWalker_Callback_RESOLVER_STRING_1_Node";
+  static $_createTreeWalker_3_Callback(mthis, root) native "Document_createTreeWalker_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $elementFromPoint_Callback(mthis, x, y) native "Document_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_Document_execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback_RESOLVER_STRING_3_DOMString_boolean_DOMString";
+  static $execCommand_Callback(mthis, command, userInterface, value) native "Document_execCommand_Callback_RESOLVER_STRING_3_DOMString_boolean_DOMString";
 
-Native_Document_getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_RESOLVER_STRING_4_DOMString_DOMString_long_long";
+  static $getCSSCanvasContext_Callback(mthis, contextId, name, width, height) native "Document_getCSSCanvasContext_Callback_RESOLVER_STRING_4_DOMString_DOMString_long_long";
 
-Native_Document_getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementById_Callback(mthis, elementId) native "Document_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, classNames) native "Document_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByName_Callback(mthis, elementName) native "Document_getElementsByName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, localName) native "Document_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Document_importNode(mthis, node, deep) {
+  static $importNode(mthis, node, deep) {
     if (deep != null) {
-      return Native_Document__importNode_1_Callback(mthis, node, deep);
+      return $_importNode_1_Callback(mthis, node, deep);
     }
-    return Native_Document__importNode_2_Callback(mthis, node);
+    return $_importNode_2_Callback(mthis, node);
   }
 
-Native_Document__importNode_1_Callback(mthis, node, deep) native "Document_importNode_Callback_RESOLVER_STRING_2_Node_boolean";
+  static $_importNode_1_Callback(mthis, node, deep) native "Document_importNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Document__importNode_2_Callback(mthis, node) native "Document_importNode_Callback_RESOLVER_STRING_1_Node";
+  static $_importNode_2_Callback(mthis, node) native "Document_importNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Document_queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandEnabled_Callback(mthis, command) native "Document_queryCommandEnabled_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandIndeterm_Callback(mthis, command) native "Document_queryCommandIndeterm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandState_Callback(mthis, command) native "Document_queryCommandState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandSupported_Callback(mthis, command) native "Document_queryCommandSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback_RESOLVER_STRING_1_DOMString";
+  static $queryCommandValue_Callback(mthis, command) native "Document_queryCommandValue_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelector_Callback(mthis, selectors) native "Document_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "Document_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Document_webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+  static $webkitExitFullscreen_Callback(mthis) native "Document_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Document_webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback_RESOLVER_STRING_0_";
+  static $webkitExitPointerLock_Callback(mthis) native "Document_webkitExitPointerLock_Callback_RESOLVER_STRING_0_";
 
-Native_Document_childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "Document_childElementCount_Getter";
 
-Native_Document_children_Getter(mthis) native "Document_children_Getter";
+  static $children_Getter(mthis) native "Document_children_Getter";
 
-Native_Document_firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "Document_firstElementChild_Getter";
 
-Native_Document_lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "Document_lastElementChild_Getter";
+}
 
-Native_DocumentFragment_querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkDocumentFragment {
+  static $querySelector_Callback(mthis, selectors) native "DocumentFragment_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DocumentFragment_querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "DocumentFragment_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_DocumentFragment_childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "DocumentFragment_childElementCount_Getter";
 
-Native_DocumentFragment_firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "DocumentFragment_firstElementChild_Getter";
 
-Native_DocumentFragment_lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "DocumentFragment_lastElementChild_Getter";
+}
 
-Native_DynamicsCompressorNode_attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
+class BlinkDocumentType {}
 
-Native_DynamicsCompressorNode_knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
+class BlinkDynamicsCompressorNode {
+  static $attack_Getter(mthis) native "DynamicsCompressorNode_attack_Getter";
 
-Native_DynamicsCompressorNode_ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
+  static $knee_Getter(mthis) native "DynamicsCompressorNode_knee_Getter";
 
-Native_DynamicsCompressorNode_reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
+  static $ratio_Getter(mthis) native "DynamicsCompressorNode_ratio_Getter";
 
-Native_DynamicsCompressorNode_release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
+  static $reduction_Getter(mthis) native "DynamicsCompressorNode_reduction_Getter";
 
-Native_DynamicsCompressorNode_threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+  static $release_Getter(mthis) native "DynamicsCompressorNode_release_Getter";
 
-Native_Element_attributes_Getter(mthis) native "Element_attributes_Getter";
+  static $threshold_Getter(mthis) native "DynamicsCompressorNode_threshold_Getter";
+}
 
-Native_Element_className_Getter(mthis) native "Element_className_Getter";
+class BlinkEXTFragDepth {}
 
-Native_Element_className_Setter(mthis, value) native "Element_className_Setter";
+class BlinkEXTTextureFilterAnisotropic {}
 
-Native_Element_clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
+class BlinkElement {
+  static $attributes_Getter(mthis) native "Element_attributes_Getter";
 
-Native_Element_clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
+  static $className_Getter(mthis) native "Element_className_Getter";
 
-Native_Element_clientTop_Getter(mthis) native "Element_clientTop_Getter";
+  static $className_Setter(mthis, value) native "Element_className_Setter";
 
-Native_Element_clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
+  static $clientHeight_Getter(mthis) native "Element_clientHeight_Getter";
 
-Native_Element_id_Getter(mthis) native "Element_id_Getter";
+  static $clientLeft_Getter(mthis) native "Element_clientLeft_Getter";
 
-Native_Element_id_Setter(mthis, value) native "Element_id_Setter";
+  static $clientTop_Getter(mthis) native "Element_clientTop_Getter";
 
-Native_Element_innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
+  static $clientWidth_Getter(mthis) native "Element_clientWidth_Getter";
 
-Native_Element_innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
+  static $id_Getter(mthis) native "Element_id_Getter";
 
-Native_Element_localName_Getter(mthis) native "Element_localName_Getter";
+  static $id_Setter(mthis, value) native "Element_id_Setter";
 
-Native_Element_namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
+  static $innerHTML_Getter(mthis) native "Element_innerHTML_Getter";
 
-Native_Element_offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
+  static $innerHTML_Setter(mthis, value) native "Element_innerHTML_Setter";
 
-Native_Element_offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
+  static $localName_Getter(mthis) native "Element_localName_Getter";
 
-Native_Element_offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
+  static $namespaceURI_Getter(mthis) native "Element_namespaceURI_Getter";
 
-Native_Element_offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
+  static $offsetHeight_Getter(mthis) native "Element_offsetHeight_Getter";
 
-Native_Element_offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
+  static $offsetLeft_Getter(mthis) native "Element_offsetLeft_Getter";
 
-Native_Element_outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
+  static $offsetParent_Getter(mthis) native "Element_offsetParent_Getter";
 
-Native_Element_scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
+  static $offsetTop_Getter(mthis) native "Element_offsetTop_Getter";
 
-Native_Element_scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
+  static $offsetWidth_Getter(mthis) native "Element_offsetWidth_Getter";
 
-Native_Element_scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
+  static $outerHTML_Getter(mthis) native "Element_outerHTML_Getter";
 
-Native_Element_scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
+  static $scrollHeight_Getter(mthis) native "Element_scrollHeight_Getter";
 
-Native_Element_scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
+  static $scrollLeft_Getter(mthis) native "Element_scrollLeft_Getter";
 
-Native_Element_scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+  static $scrollLeft_Setter(mthis, value) native "Element_scrollLeft_Setter";
 
-Native_Element_shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+  static $scrollTop_Getter(mthis) native "Element_scrollTop_Getter";
 
-Native_Element_style_Getter(mthis) native "Element_style_Getter";
+  static $scrollTop_Setter(mthis, value) native "Element_scrollTop_Setter";
 
-Native_Element_tagName_Getter(mthis) native "Element_tagName_Getter";
+  static $scrollWidth_Getter(mthis) native "Element_scrollWidth_Getter";
+
+  static $shadowRoot_Getter(mthis) native "Element_shadowRoot_Getter";
+
+  static $style_Getter(mthis) native "Element_style_Getter";
+
+  static $tagName_Getter(mthis) native "Element_tagName_Getter";
 
   // Generated overload resolver
-Native_Element_animate(mthis, keyframes, timingInput) {
+  static $animate(mthis, keyframes, timingInput) {
     if ((timingInput is Map || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return Native_Element__animate_1_Callback(mthis, keyframes, timingInput);
+      return $_animate_1_Callback(mthis, keyframes, timingInput);
     }
     if ((timingInput is num || timingInput == null) && (keyframes is List<Map> || keyframes == null)) {
-      return Native_Element__animate_2_Callback(mthis, keyframes, timingInput);
+      return $_animate_2_Callback(mthis, keyframes, timingInput);
     }
     if ((keyframes is List<Map> || keyframes == null) && timingInput == null) {
-      return Native_Element__animate_3_Callback(mthis, keyframes);
+      return $_animate_3_Callback(mthis, keyframes);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Element__animate_1_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_Dictionary";
+  static $_animate_1_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_Dictionary";
 
-Native_Element__animate_2_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_double";
+  static $_animate_2_Callback(mthis, keyframes, timingInput) native "Element_animate_Callback_RESOLVER_STRING_2_sequence<Dictionary>_double";
 
-Native_Element__animate_3_Callback(mthis, keyframes) native "Element_animate_Callback_RESOLVER_STRING_1_sequence<Dictionary>";
+  static $_animate_3_Callback(mthis, keyframes) native "Element_animate_Callback_RESOLVER_STRING_1_sequence<Dictionary>";
 
-Native_Element_blur_Callback(mthis) native "Element_blur_Callback_RESOLVER_STRING_0_";
+  static $blur_Callback(mthis) native "Element_blur_Callback_RESOLVER_STRING_0_";
 
-Native_Element_createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback_RESOLVER_STRING_0_";
+  static $createShadowRoot_Callback(mthis) native "Element_createShadowRoot_Callback_RESOLVER_STRING_0_";
 
-Native_Element_focus_Callback(mthis) native "Element_focus_Callback_RESOLVER_STRING_0_";
+  static $focus_Callback(mthis) native "Element_focus_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $getAttribute_Callback(mthis, name) native "Element_getAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $getAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_getAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
+  static $getBoundingClientRect_Callback(mthis) native "Element_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getClientRects_Callback(mthis) native "Element_getClientRects_Callback_RESOLVER_STRING_0_";
+  static $getClientRects_Callback(mthis) native "Element_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
+  static $getDestinationInsertionPoints_Callback(mthis) native "Element_getDestinationInsertionPoints_Callback_RESOLVER_STRING_0_";
 
-Native_Element_getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, classNames) native "Element_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, name) native "Element_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $hasAttribute_Callback(mthis, name) native "Element_hasAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $hasAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_hasAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback_RESOLVER_STRING_2_DOMString_Element";
+  static $insertAdjacentElement_Callback(mthis, where, element) native "Element_insertAdjacentElement_Callback_RESOLVER_STRING_2_DOMString_Element";
 
-Native_Element_insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $insertAdjacentHTML_Callback(mthis, where, html) native "Element_insertAdjacentHTML_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $insertAdjacentText_Callback(mthis, where, text) native "Element_insertAdjacentText_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_matches_Callback(mthis, selectors) native "Element_matches_Callback_RESOLVER_STRING_1_DOMString";
+  static $matches_Callback(mthis, selectors) native "Element_matches_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelector_Callback(mthis, selectors) native "Element_querySelector_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
+  static $querySelectorAll_Callback(mthis, selectors) native "Element_querySelectorAll_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeAttribute_Callback(mthis, name) native "Element_removeAttribute_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Element_removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $removeAttributeNS_Callback(mthis, namespaceURI, localName) native "Element_removeAttributeNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback_RESOLVER_STRING_1_long";
+  static $scrollByLines_Callback(mthis, lines) native "Element_scrollByLines_Callback_RESOLVER_STRING_1_long";
 
-Native_Element_scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback_RESOLVER_STRING_1_long";
+  static $scrollByPages_Callback(mthis, pages) native "Element_scrollByPages_Callback_RESOLVER_STRING_1_long";
 
   // Generated overload resolver
-Native_Element__scrollIntoView(mthis, alignWithTop) {
+  static $_scrollIntoView(mthis, alignWithTop) {
     if (alignWithTop != null) {
-      Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop);
+      $_scrollIntoView_1_Callback(mthis, alignWithTop);
       return;
     }
-    Native_Element__scrollIntoView_2_Callback(mthis);
+    $_scrollIntoView_2_Callback(mthis);
     return;
   }
 
-Native_Element__scrollIntoView_1_Callback(mthis, alignWithTop) native "Element_scrollIntoView_Callback_RESOLVER_STRING_1_boolean";
+  static $_scrollIntoView_1_Callback(mthis, alignWithTop) native "Element_scrollIntoView_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoView_2_Callback(mthis) native "Element_scrollIntoView_Callback_RESOLVER_STRING_0_";
+  static $_scrollIntoView_2_Callback(mthis) native "Element_scrollIntoView_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_Element__scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
+  static $_scrollIntoViewIfNeeded(mthis, centerIfNeeded) {
     if (centerIfNeeded != null) {
-      Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
+      $_scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded);
       return;
     }
-    Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis);
+    $_scrollIntoViewIfNeeded_2_Callback(mthis);
     return;
   }
 
-Native_Element__scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_1_boolean";
+  static $_scrollIntoViewIfNeeded_1_Callback(mthis, centerIfNeeded) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Element__scrollIntoViewIfNeeded_2_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_0_";
+  static $_scrollIntoViewIfNeeded_2_Callback(mthis) native "Element_scrollIntoViewIfNeeded_Callback_RESOLVER_STRING_0_";
 
-Native_Element_setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setAttribute_Callback(mthis, name, value) native "Element_setAttribute_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Element_setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setAttributeNS_Callback(mthis, namespaceURI, qualifiedName, value) native "Element_setAttributeNS_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Element_webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback_RESOLVER_STRING_0_";
+  static $webkitRequestFullscreen_Callback(mthis) native "Element_webkitRequestFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_Element_webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback_RESOLVER_STRING_0_";
+  static $webkitRequestPointerLock_Callback(mthis) native "Element_webkitRequestPointerLock_Callback_RESOLVER_STRING_0_";
 
-Native_Element_nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
+  static $nextElementSibling_Getter(mthis) native "Element_nextElementSibling_Getter";
 
-Native_Element_previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
+  static $previousElementSibling_Getter(mthis) native "Element_previousElementSibling_Getter";
 
-Native_Element_remove_Callback(mthis) native "Element_remove_Callback_RESOLVER_STRING_0_";
+  static $remove_Callback(mthis) native "Element_remove_Callback_RESOLVER_STRING_0_";
 
-Native_Element_childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
+  static $childElementCount_Getter(mthis) native "Element_childElementCount_Getter";
 
-Native_Element_children_Getter(mthis) native "Element_children_Getter";
+  static $children_Getter(mthis) native "Element_children_Getter";
 
-Native_Element_firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
+  static $firstElementChild_Getter(mthis) native "Element_firstElementChild_Getter";
 
-Native_Element_lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+  static $lastElementChild_Getter(mthis) native "Element_lastElementChild_Getter";
+}
 
-Native_ErrorEvent_colno_Getter(mthis) native "ErrorEvent_colno_Getter";
+class BlinkErrorEvent {
+  static $colno_Getter(mthis) native "ErrorEvent_colno_Getter";
 
-Native_ErrorEvent_error_Getter(mthis) native "ErrorEvent_error_Getter";
+  static $error_Getter(mthis) native "ErrorEvent_error_Getter";
 
-Native_ErrorEvent_filename_Getter(mthis) native "ErrorEvent_filename_Getter";
+  static $filename_Getter(mthis) native "ErrorEvent_filename_Getter";
 
-Native_ErrorEvent_lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
+  static $lineno_Getter(mthis) native "ErrorEvent_lineno_Getter";
 
-Native_ErrorEvent_message_Getter(mthis) native "ErrorEvent_message_Getter";
+  static $message_Getter(mthis) native "ErrorEvent_message_Getter";
+}
 
+class BlinkEventSource {
   // Generated overload resolver
-Native_EventSource_EventSource(url, eventSourceInit) {
-    return Native_EventSource__create_1constructorCallback(url, eventSourceInit);
+  static $mkEventSource(url, eventSourceInit) {
+    return $_create_1constructorCallback(url, eventSourceInit);
   }
 
-Native_EventSource__create_1constructorCallback(url, eventSourceInit) native "EventSource_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $_create_1constructorCallback(url, eventSourceInit) native "EventSource_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_EventSource_readyState_Getter(mthis) native "EventSource_readyState_Getter";
+  static $readyState_Getter(mthis) native "EventSource_readyState_Getter";
 
-Native_EventSource_url_Getter(mthis) native "EventSource_url_Getter";
+  static $url_Getter(mthis) native "EventSource_url_Getter";
 
-Native_EventSource_withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
+  static $withCredentials_Getter(mthis) native "EventSource_withCredentials_Getter";
 
-Native_EventSource_close_Callback(mthis) native "EventSource_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "EventSource_close_Callback_RESOLVER_STRING_0_";
+}
 
-Native_File_lastModified_Getter(mthis) native "File_lastModified_Getter";
+class BlinkFile {
+  static $lastModified_Getter(mthis) native "File_lastModified_Getter";
 
-Native_File_lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
+  static $lastModifiedDate_Getter(mthis) native "File_lastModifiedDate_Getter";
 
-Native_File_name_Getter(mthis) native "File_name_Getter";
+  static $name_Getter(mthis) native "File_name_Getter";
 
-Native_File_webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+  static $webkitRelativePath_Getter(mthis) native "File_webkitRelativePath_Getter";
+}
 
-Native_FileEntry_createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback_RESOLVER_STRING_2_FileWriterCallback_ErrorCallback";
+class BlinkFileEntry {
+  static $createWriter_Callback(mthis, successCallback, errorCallback) native "FileEntry_createWriter_Callback_RESOLVER_STRING_2_FileWriterCallback_ErrorCallback";
 
-Native_FileEntry_file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback_RESOLVER_STRING_2_FileCallback_ErrorCallback";
+  static $file_Callback(mthis, successCallback, errorCallback) native "FileEntry_file_Callback_RESOLVER_STRING_2_FileCallback_ErrorCallback";
+}
 
-Native_FileError_code_Getter(mthis) native "FileError_code_Getter";
+class BlinkFileEntrySync {}
 
-Native_FileList_length_Getter(mthis) native "FileList_length_Getter";
+class BlinkFileError {
+  static $code_Getter(mthis) native "FileError_code_Getter";
+}
 
-Native_FileList_NativeIndexed_Getter(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkFileList {
+  static $length_Getter(mthis) native "FileList_length_Getter";
 
-Native_FileList_item_Callback(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
+  static $item_Callback(mthis, index) native "FileList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkFileReader {
   // Generated overload resolver
-Native_FileReader_FileReader() {
-    return Native_FileReader__create_1constructorCallback();
+  static $mkFileReader() {
+    return $_create_1constructorCallback();
   }
 
-Native_FileReader__create_1constructorCallback() native "FileReader_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "FileReader_constructorCallback_RESOLVER_STRING_0_";
 
-Native_FileReader_error_Getter(mthis) native "FileReader_error_Getter";
+  static $error_Getter(mthis) native "FileReader_error_Getter";
 
-Native_FileReader_readyState_Getter(mthis) native "FileReader_readyState_Getter";
+  static $readyState_Getter(mthis) native "FileReader_readyState_Getter";
 
-Native_FileReader_result_Getter(mthis) native "FileReader_result_Getter";
+  static $result_Getter(mthis) native "FileReader_result_Getter";
 
-Native_FileReader_abort_Callback(mthis) native "FileReader_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "FileReader_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileReader_readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback_RESOLVER_STRING_1_Blob";
+  static $readAsArrayBuffer_Callback(mthis, blob) native "FileReader_readAsArrayBuffer_Callback_RESOLVER_STRING_1_Blob";
 
-Native_FileReader_readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback_RESOLVER_STRING_1_Blob";
+  static $readAsDataURL_Callback(mthis, blob) native "FileReader_readAsDataURL_Callback_RESOLVER_STRING_1_Blob";
 
   // Generated overload resolver
-Native_FileReader_readAsText(mthis, blob, encoding) {
+  static $readAsText(mthis, blob, encoding) {
     if (encoding != null) {
-      Native_FileReader__readAsText_1_Callback(mthis, blob, encoding);
+      $_readAsText_1_Callback(mthis, blob, encoding);
       return;
     }
-    Native_FileReader__readAsText_2_Callback(mthis, blob);
+    $_readAsText_2_Callback(mthis, blob);
     return;
   }
 
-Native_FileReader__readAsText_1_Callback(mthis, blob, encoding) native "FileReader_readAsText_Callback_RESOLVER_STRING_2_Blob_DOMString";
+  static $_readAsText_1_Callback(mthis, blob, encoding) native "FileReader_readAsText_Callback_RESOLVER_STRING_2_Blob_DOMString";
 
-Native_FileReader__readAsText_2_Callback(mthis, blob) native "FileReader_readAsText_Callback_RESOLVER_STRING_1_Blob";
+  static $_readAsText_2_Callback(mthis, blob) native "FileReader_readAsText_Callback_RESOLVER_STRING_1_Blob";
+}
 
+class BlinkFileReaderSync {
   // Generated overload resolver
-Native_FileReaderSync__FileReaderSync() {
-    return Native_FileReaderSync__create_1constructorCallback();
+  static $mk_FileReaderSync() {
+    return $_create_1constructorCallback();
   }
 
-Native_FileReaderSync__create_1constructorCallback() native "FileReaderSync_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "FileReaderSync_constructorCallback_RESOLVER_STRING_0_";
+}
 
-Native_FileWriter_error_Getter(mthis) native "FileWriter_error_Getter";
+class BlinkFileWriter {
+  static $error_Getter(mthis) native "FileWriter_error_Getter";
 
-Native_FileWriter_length_Getter(mthis) native "FileWriter_length_Getter";
+  static $length_Getter(mthis) native "FileWriter_length_Getter";
 
-Native_FileWriter_position_Getter(mthis) native "FileWriter_position_Getter";
+  static $position_Getter(mthis) native "FileWriter_position_Getter";
 
-Native_FileWriter_readyState_Getter(mthis) native "FileWriter_readyState_Getter";
+  static $readyState_Getter(mthis) native "FileWriter_readyState_Getter";
 
-Native_FileWriter_abort_Callback(mthis) native "FileWriter_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "FileWriter_abort_Callback_RESOLVER_STRING_0_";
 
-Native_FileWriter_seek_Callback(mthis, position) native "FileWriter_seek_Callback_RESOLVER_STRING_1_long long";
+  static $seek_Callback(mthis, position) native "FileWriter_seek_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_truncate_Callback(mthis, size) native "FileWriter_truncate_Callback_RESOLVER_STRING_1_long long";
+  static $truncate_Callback(mthis, size) native "FileWriter_truncate_Callback_RESOLVER_STRING_1_long long";
 
-Native_FileWriter_write_Callback(mthis, data) native "FileWriter_write_Callback_RESOLVER_STRING_1_Blob";
+  static $write_Callback(mthis, data) native "FileWriter_write_Callback_RESOLVER_STRING_1_Blob";
+}
 
-Native_FocusEvent_relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+class BlinkFileWriterSync {}
 
+class BlinkFocusEvent {
+  static $relatedTarget_Getter(mthis) native "FocusEvent_relatedTarget_Getter";
+}
+
+class BlinkFontFace {
   // Generated overload resolver
-Native_FontFace_FontFace(family, source, descriptors) {
-    return Native_FontFace__create_1constructorCallback(family, source, descriptors);
+  static $mkFontFace(family, source, descriptors) {
+    return $_create_1constructorCallback(family, source, descriptors);
   }
 
-Native_FontFace__create_1constructorCallback(family, source, descriptors) native "FontFace_constructorCallback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
+  static $_create_1constructorCallback(family, source, descriptors) native "FontFace_constructorCallback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
-Native_FontFace_family_Getter(mthis) native "FontFace_family_Getter";
+  static $family_Getter(mthis) native "FontFace_family_Getter";
 
-Native_FontFace_family_Setter(mthis, value) native "FontFace_family_Setter";
+  static $family_Setter(mthis, value) native "FontFace_family_Setter";
 
-Native_FontFace_featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
+  static $featureSettings_Getter(mthis) native "FontFace_featureSettings_Getter";
 
-Native_FontFace_featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
+  static $featureSettings_Setter(mthis, value) native "FontFace_featureSettings_Setter";
 
-Native_FontFace_status_Getter(mthis) native "FontFace_status_Getter";
+  static $status_Getter(mthis) native "FontFace_status_Getter";
 
-Native_FontFace_stretch_Getter(mthis) native "FontFace_stretch_Getter";
+  static $stretch_Getter(mthis) native "FontFace_stretch_Getter";
 
-Native_FontFace_stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
+  static $stretch_Setter(mthis, value) native "FontFace_stretch_Setter";
 
-Native_FontFace_style_Getter(mthis) native "FontFace_style_Getter";
+  static $style_Getter(mthis) native "FontFace_style_Getter";
 
-Native_FontFace_style_Setter(mthis, value) native "FontFace_style_Setter";
+  static $style_Setter(mthis, value) native "FontFace_style_Setter";
 
-Native_FontFace_unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
+  static $unicodeRange_Getter(mthis) native "FontFace_unicodeRange_Getter";
 
-Native_FontFace_unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
+  static $unicodeRange_Setter(mthis, value) native "FontFace_unicodeRange_Setter";
 
-Native_FontFace_variant_Getter(mthis) native "FontFace_variant_Getter";
+  static $variant_Getter(mthis) native "FontFace_variant_Getter";
 
-Native_FontFace_variant_Setter(mthis, value) native "FontFace_variant_Setter";
+  static $variant_Setter(mthis, value) native "FontFace_variant_Setter";
 
-Native_FontFace_weight_Getter(mthis) native "FontFace_weight_Getter";
+  static $weight_Getter(mthis) native "FontFace_weight_Getter";
 
-Native_FontFace_weight_Setter(mthis, value) native "FontFace_weight_Setter";
+  static $weight_Setter(mthis, value) native "FontFace_weight_Setter";
 
-Native_FontFace_load_Callback(mthis) native "FontFace_load_Callback_RESOLVER_STRING_0_";
+  static $load_Callback(mthis) native "FontFace_load_Callback_RESOLVER_STRING_0_";
+}
 
-Native_FontFaceSet_size_Getter(mthis) native "FontFaceSet_size_Getter";
+class BlinkFontFaceSet {
+  static $size_Getter(mthis) native "FontFaceSet_size_Getter";
 
-Native_FontFaceSet_status_Getter(mthis) native "FontFaceSet_status_Getter";
+  static $status_Getter(mthis) native "FontFaceSet_status_Getter";
 
-Native_FontFaceSet_add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback_RESOLVER_STRING_1_FontFace";
+  static $add_Callback(mthis, fontFace) native "FontFaceSet_add_Callback_RESOLVER_STRING_1_FontFace";
 
-Native_FontFaceSet_check_Callback(mthis, font, text) native "FontFaceSet_check_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $check_Callback(mthis, font, text) native "FontFaceSet_check_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_FontFaceSet_clear_Callback(mthis) native "FontFaceSet_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "FontFaceSet_clear_Callback_RESOLVER_STRING_0_";
 
-Native_FontFaceSet_delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback_RESOLVER_STRING_1_FontFace";
+  static $delete_Callback(mthis, fontFace) native "FontFaceSet_delete_Callback_RESOLVER_STRING_1_FontFace";
 
   // Generated overload resolver
-Native_FontFaceSet_forEach(mthis, callback, thisArg) {
+  static $forEach(mthis, callback, thisArg) {
     if (thisArg != null) {
-      Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg);
+      $_forEach_1_Callback(mthis, callback, thisArg);
       return;
     }
-    Native_FontFaceSet__forEach_2_Callback(mthis, callback);
+    $_forEach_2_Callback(mthis, callback);
     return;
   }
 
-Native_FontFaceSet__forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_2_FontFaceSetForEachCallback_ScriptValue";
+  static $_forEach_1_Callback(mthis, callback, thisArg) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_2_FontFaceSetForEachCallback_ScriptValue";
 
-Native_FontFaceSet__forEach_2_Callback(mthis, callback) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_1_FontFaceSetForEachCallback";
+  static $_forEach_2_Callback(mthis, callback) native "FontFaceSet_forEach_Callback_RESOLVER_STRING_1_FontFaceSetForEachCallback";
 
-Native_FontFaceSet_has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback_RESOLVER_STRING_1_FontFace";
+  static $has_Callback(mthis, fontFace) native "FontFaceSet_has_Callback_RESOLVER_STRING_1_FontFace";
+}
 
-Native_FormData_constructorCallback(form) native "FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement";
+class BlinkFormData {
+  static $constructorCallback(form) native "FormData_constructorCallback_RESOLVER_STRING_1_HTMLFormElement";
 
-Native_FormData_append_Callback(mthis, name, value) native "FormData_append_Callback";
+  static $append_Callback(mthis, name, value) native "FormData_append_Callback";
 
-Native_FormData_appendBlob_Callback(mthis, name, value, filename) native "FormData_append_Callback";
+  static $appendBlob_Callback(mthis, name, value, filename) native "FormData_append_Callback";
+}
 
-Native_GainNode_gain_Getter(mthis) native "GainNode_gain_Getter";
+class BlinkGainNode {
+  static $gain_Getter(mthis) native "GainNode_gain_Getter";
+}
 
-Native_Gamepad_axes_Getter(mthis) native "Gamepad_axes_Getter";
+class BlinkGamepad {
+  static $axes_Getter(mthis) native "Gamepad_axes_Getter";
 
-Native_Gamepad_buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
+  static $buttons_Getter(mthis) native "WebKitGamepad_buttons_Getter";
 
-Native_Gamepad_id_Getter(mthis) native "Gamepad_id_Getter";
+  static $id_Getter(mthis) native "Gamepad_id_Getter";
 
-Native_Gamepad_index_Getter(mthis) native "Gamepad_index_Getter";
+  static $index_Getter(mthis) native "Gamepad_index_Getter";
 
-Native_Gamepad_timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "Gamepad_timestamp_Getter";
+}
 
-Native_GamepadList_length_Getter(mthis) native "GamepadList_length_Getter";
+class BlinkGamepadList {
+  static $length_Getter(mthis) native "GamepadList_length_Getter";
 
-Native_GamepadList_NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_GamepadList_item_Callback(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "GamepadList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Geolocation_clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback_RESOLVER_STRING_1_long";
+class BlinkGeolocation {
+  static $clearWatch_Callback(mthis, watchID) native "Geolocation_clearWatch_Callback_RESOLVER_STRING_1_long";
 
-Native_Geolocation_getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
+  static $getCurrentPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_getCurrentPosition_Callback";
 
-Native_Geolocation_watchPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+  static $watchPosition_Callback(mthis, successCallback, errorCallback, options) native "Geolocation_watchPosition_Callback";
+}
 
-Native_Geoposition_coords_Getter(mthis) native "Geoposition_coords_Getter";
+class BlinkGeoposition {
+  static $coords_Getter(mthis) native "Geoposition_coords_Getter";
 
-Native_Geoposition_timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "Geoposition_timestamp_Getter";
+}
 
-Native_HTMLAllCollection_item_Callback(mthis, index) native "HTMLAllCollection_item_Callback";
+class BlinkHTMLAllCollection {
+  static $item_Callback(mthis, index) native "HTMLAllCollection_item_Callback";
+}
 
-Native_HTMLElement_contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
+class BlinkHTMLElement {
+  static $contentEditable_Getter(mthis) native "HTMLElement_contentEditable_Getter";
 
-Native_HTMLElement_contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
+  static $contentEditable_Setter(mthis, value) native "HTMLElement_contentEditable_Setter";
 
-Native_HTMLElement_dir_Getter(mthis) native "HTMLElement_dir_Getter";
+  static $dir_Getter(mthis) native "HTMLElement_dir_Getter";
 
-Native_HTMLElement_dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
+  static $dir_Setter(mthis, value) native "HTMLElement_dir_Setter";
 
-Native_HTMLElement_draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
+  static $draggable_Getter(mthis) native "HTMLElement_draggable_Getter";
 
-Native_HTMLElement_draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
+  static $draggable_Setter(mthis, value) native "HTMLElement_draggable_Setter";
 
-Native_HTMLElement_hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
+  static $hidden_Getter(mthis) native "HTMLElement_hidden_Getter";
 
-Native_HTMLElement_hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
+  static $hidden_Setter(mthis, value) native "HTMLElement_hidden_Setter";
 
-Native_HTMLElement_inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
+  static $inputMethodContext_Getter(mthis) native "HTMLElement_inputMethodContext_Getter";
 
-Native_HTMLElement_isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
+  static $isContentEditable_Getter(mthis) native "HTMLElement_isContentEditable_Getter";
 
-Native_HTMLElement_lang_Getter(mthis) native "HTMLElement_lang_Getter";
+  static $lang_Getter(mthis) native "HTMLElement_lang_Getter";
 
-Native_HTMLElement_lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
+  static $lang_Setter(mthis, value) native "HTMLElement_lang_Setter";
 
-Native_HTMLElement_spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
+  static $spellcheck_Getter(mthis) native "HTMLElement_spellcheck_Getter";
 
-Native_HTMLElement_spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
+  static $spellcheck_Setter(mthis, value) native "HTMLElement_spellcheck_Setter";
 
-Native_HTMLElement_tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
+  static $tabIndex_Getter(mthis) native "HTMLElement_tabIndex_Getter";
 
-Native_HTMLElement_tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
+  static $tabIndex_Setter(mthis, value) native "HTMLElement_tabIndex_Setter";
 
-Native_HTMLElement_title_Getter(mthis) native "HTMLElement_title_Getter";
+  static $title_Getter(mthis) native "HTMLElement_title_Getter";
 
-Native_HTMLElement_title_Setter(mthis, value) native "HTMLElement_title_Setter";
+  static $title_Setter(mthis, value) native "HTMLElement_title_Setter";
 
-Native_HTMLElement_translate_Getter(mthis) native "HTMLElement_translate_Getter";
+  static $translate_Getter(mthis) native "HTMLElement_translate_Getter";
 
-Native_HTMLElement_translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
+  static $translate_Setter(mthis, value) native "HTMLElement_translate_Setter";
 
-Native_HTMLElement_webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
+  static $webkitdropzone_Getter(mthis) native "HTMLElement_webkitdropzone_Getter";
 
-Native_HTMLElement_webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
+  static $webkitdropzone_Setter(mthis, value) native "HTMLElement_webkitdropzone_Setter";
 
-Native_HTMLElement_click_Callback(mthis) native "HTMLElement_click_Callback_RESOLVER_STRING_0_";
+  static $click_Callback(mthis) native "HTMLElement_click_Callback_RESOLVER_STRING_0_";
+}
 
-Native_URLUtils_hash_Getter(mthis) native "URL_hash_Getter";
+class BlinkURLUtils {
+  static $hash_Getter(mthis) native "URL_hash_Getter";
 
-Native_URLUtils_hash_Setter(mthis, value) native "URL_hash_Setter";
+  static $hash_Setter(mthis, value) native "URL_hash_Setter";
 
-Native_URLUtils_host_Getter(mthis) native "URL_host_Getter";
+  static $host_Getter(mthis) native "URL_host_Getter";
 
-Native_URLUtils_host_Setter(mthis, value) native "URL_host_Setter";
+  static $host_Setter(mthis, value) native "URL_host_Setter";
 
-Native_URLUtils_hostname_Getter(mthis) native "URL_hostname_Getter";
+  static $hostname_Getter(mthis) native "URL_hostname_Getter";
 
-Native_URLUtils_hostname_Setter(mthis, value) native "URL_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "URL_hostname_Setter";
 
-Native_URLUtils_href_Getter(mthis) native "URL_href_Getter";
+  static $href_Getter(mthis) native "URL_href_Getter";
 
-Native_URLUtils_href_Setter(mthis, value) native "URL_href_Setter";
+  static $href_Setter(mthis, value) native "URL_href_Setter";
 
-Native_URLUtils_origin_Getter(mthis) native "URL_origin_Getter";
+  static $origin_Getter(mthis) native "URL_origin_Getter";
 
-Native_URLUtils_password_Getter(mthis) native "URL_password_Getter";
+  static $password_Getter(mthis) native "URL_password_Getter";
 
-Native_URLUtils_password_Setter(mthis, value) native "URL_password_Setter";
+  static $password_Setter(mthis, value) native "URL_password_Setter";
 
-Native_URLUtils_pathname_Getter(mthis) native "URL_pathname_Getter";
+  static $pathname_Getter(mthis) native "URL_pathname_Getter";
 
-Native_URLUtils_pathname_Setter(mthis, value) native "URL_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "URL_pathname_Setter";
 
-Native_URLUtils_port_Getter(mthis) native "URL_port_Getter";
+  static $port_Getter(mthis) native "URL_port_Getter";
 
-Native_URLUtils_port_Setter(mthis, value) native "URL_port_Setter";
+  static $port_Setter(mthis, value) native "URL_port_Setter";
 
-Native_URLUtils_protocol_Getter(mthis) native "URL_protocol_Getter";
+  static $protocol_Getter(mthis) native "URL_protocol_Getter";
 
-Native_URLUtils_protocol_Setter(mthis, value) native "URL_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "URL_protocol_Setter";
 
-Native_URLUtils_search_Getter(mthis) native "URL_search_Getter";
+  static $search_Getter(mthis) native "URL_search_Getter";
 
-Native_URLUtils_search_Setter(mthis, value) native "URL_search_Setter";
+  static $search_Setter(mthis, value) native "URL_search_Setter";
 
-Native_URLUtils_username_Getter(mthis) native "URL_username_Getter";
+  static $username_Getter(mthis) native "URL_username_Getter";
 
-Native_URLUtils_username_Setter(mthis, value) native "URL_username_Setter";
+  static $username_Setter(mthis, value) native "URL_username_Setter";
 
-Native_URLUtils_toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLAnchorElement_download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
+class BlinkHTMLAnchorElement {
+  static $download_Getter(mthis) native "HTMLAnchorElement_download_Getter";
 
-Native_HTMLAnchorElement_download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
+  static $download_Setter(mthis, value) native "HTMLAnchorElement_download_Setter";
 
-Native_HTMLAnchorElement_hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
+  static $hreflang_Getter(mthis) native "HTMLAnchorElement_hreflang_Getter";
 
-Native_HTMLAnchorElement_hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
+  static $hreflang_Setter(mthis, value) native "HTMLAnchorElement_hreflang_Setter";
 
-Native_HTMLAnchorElement_rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
+  static $rel_Getter(mthis) native "HTMLAnchorElement_rel_Getter";
 
-Native_HTMLAnchorElement_rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
+  static $rel_Setter(mthis, value) native "HTMLAnchorElement_rel_Setter";
 
-Native_HTMLAnchorElement_target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
+  static $target_Getter(mthis) native "HTMLAnchorElement_target_Getter";
 
-Native_HTMLAnchorElement_target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
+  static $target_Setter(mthis, value) native "HTMLAnchorElement_target_Setter";
 
-Native_HTMLAnchorElement_type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLAnchorElement_type_Getter";
 
-Native_HTMLAnchorElement_type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLAnchorElement_type_Setter";
 
-Native_HTMLAnchorElement_hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
+  static $hash_Getter(mthis) native "HTMLAnchorElement_hash_Getter";
 
-Native_HTMLAnchorElement_hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
+  static $hash_Setter(mthis, value) native "HTMLAnchorElement_hash_Setter";
 
-Native_HTMLAnchorElement_host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
+  static $host_Getter(mthis) native "HTMLAnchorElement_host_Getter";
 
-Native_HTMLAnchorElement_host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
+  static $host_Setter(mthis, value) native "HTMLAnchorElement_host_Setter";
 
-Native_HTMLAnchorElement_hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
+  static $hostname_Getter(mthis) native "HTMLAnchorElement_hostname_Getter";
 
-Native_HTMLAnchorElement_hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "HTMLAnchorElement_hostname_Setter";
+
+  static $href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
 
-Native_HTMLAnchorElement_href_Getter(mthis) native "HTMLAnchorElement_href_Getter";
+  static $href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
 
-Native_HTMLAnchorElement_href_Setter(mthis, value) native "HTMLAnchorElement_href_Setter";
+  static $origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
 
-Native_HTMLAnchorElement_origin_Getter(mthis) native "HTMLAnchorElement_origin_Getter";
+  static $password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
 
-Native_HTMLAnchorElement_password_Getter(mthis) native "HTMLAnchorElement_password_Getter";
+  static $password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
 
-Native_HTMLAnchorElement_password_Setter(mthis, value) native "HTMLAnchorElement_password_Setter";
+  static $pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
 
-Native_HTMLAnchorElement_pathname_Getter(mthis) native "HTMLAnchorElement_pathname_Getter";
+  static $pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
 
-Native_HTMLAnchorElement_pathname_Setter(mthis, value) native "HTMLAnchorElement_pathname_Setter";
+  static $port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
 
-Native_HTMLAnchorElement_port_Getter(mthis) native "HTMLAnchorElement_port_Getter";
+  static $port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
 
-Native_HTMLAnchorElement_port_Setter(mthis, value) native "HTMLAnchorElement_port_Setter";
+  static $protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
 
-Native_HTMLAnchorElement_protocol_Getter(mthis) native "HTMLAnchorElement_protocol_Getter";
+  static $protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
 
-Native_HTMLAnchorElement_protocol_Setter(mthis, value) native "HTMLAnchorElement_protocol_Setter";
+  static $search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
 
-Native_HTMLAnchorElement_search_Getter(mthis) native "HTMLAnchorElement_search_Getter";
+  static $search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
 
-Native_HTMLAnchorElement_search_Setter(mthis, value) native "HTMLAnchorElement_search_Setter";
+  static $username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
 
-Native_HTMLAnchorElement_username_Getter(mthis) native "HTMLAnchorElement_username_Getter";
+  static $username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
 
-Native_HTMLAnchorElement_username_Setter(mthis, value) native "HTMLAnchorElement_username_Setter";
+  static $toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLAnchorElement_toString_Callback(mthis) native "HTMLAnchorElement_toString_Callback_RESOLVER_STRING_0_";
+class BlinkHTMLAppletElement {}
 
-Native_HTMLAreaElement_alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
+class BlinkHTMLAreaElement {
+  static $alt_Getter(mthis) native "HTMLAreaElement_alt_Getter";
 
-Native_HTMLAreaElement_alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLAreaElement_alt_Setter";
 
-Native_HTMLAreaElement_coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
+  static $coords_Getter(mthis) native "HTMLAreaElement_coords_Getter";
 
-Native_HTMLAreaElement_coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
+  static $coords_Setter(mthis, value) native "HTMLAreaElement_coords_Setter";
 
-Native_HTMLAreaElement_shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
+  static $shape_Getter(mthis) native "HTMLAreaElement_shape_Getter";
 
-Native_HTMLAreaElement_shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
+  static $shape_Setter(mthis, value) native "HTMLAreaElement_shape_Setter";
 
-Native_HTMLAreaElement_target_Getter(mthis) native "HTMLAreaElement_target_Getter";
+  static $target_Getter(mthis) native "HTMLAreaElement_target_Getter";
 
-Native_HTMLAreaElement_target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
+  static $target_Setter(mthis, value) native "HTMLAreaElement_target_Setter";
 
-Native_HTMLAreaElement_hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
+  static $hash_Getter(mthis) native "HTMLAreaElement_hash_Getter";
 
-Native_HTMLAreaElement_hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
+  static $hash_Setter(mthis, value) native "HTMLAreaElement_hash_Setter";
 
-Native_HTMLAreaElement_host_Getter(mthis) native "HTMLAreaElement_host_Getter";
+  static $host_Getter(mthis) native "HTMLAreaElement_host_Getter";
 
-Native_HTMLAreaElement_host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
+  static $host_Setter(mthis, value) native "HTMLAreaElement_host_Setter";
 
-Native_HTMLAreaElement_hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
+  static $hostname_Getter(mthis) native "HTMLAreaElement_hostname_Getter";
 
-Native_HTMLAreaElement_hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "HTMLAreaElement_hostname_Setter";
 
-Native_HTMLAreaElement_href_Getter(mthis) native "HTMLAreaElement_href_Getter";
+  static $href_Getter(mthis) native "HTMLAreaElement_href_Getter";
 
-Native_HTMLAreaElement_href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
+  static $href_Setter(mthis, value) native "HTMLAreaElement_href_Setter";
 
-Native_HTMLAreaElement_origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
+  static $origin_Getter(mthis) native "HTMLAreaElement_origin_Getter";
 
-Native_HTMLAreaElement_password_Getter(mthis) native "HTMLAreaElement_password_Getter";
+  static $password_Getter(mthis) native "HTMLAreaElement_password_Getter";
 
-Native_HTMLAreaElement_password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
+  static $password_Setter(mthis, value) native "HTMLAreaElement_password_Setter";
 
-Native_HTMLAreaElement_pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
+  static $pathname_Getter(mthis) native "HTMLAreaElement_pathname_Getter";
 
-Native_HTMLAreaElement_pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "HTMLAreaElement_pathname_Setter";
 
-Native_HTMLAreaElement_port_Getter(mthis) native "HTMLAreaElement_port_Getter";
+  static $port_Getter(mthis) native "HTMLAreaElement_port_Getter";
 
-Native_HTMLAreaElement_port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
+  static $port_Setter(mthis, value) native "HTMLAreaElement_port_Setter";
 
-Native_HTMLAreaElement_protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
+  static $protocol_Getter(mthis) native "HTMLAreaElement_protocol_Getter";
 
-Native_HTMLAreaElement_protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "HTMLAreaElement_protocol_Setter";
 
-Native_HTMLAreaElement_search_Getter(mthis) native "HTMLAreaElement_search_Getter";
+  static $search_Getter(mthis) native "HTMLAreaElement_search_Getter";
 
-Native_HTMLAreaElement_search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
+  static $search_Setter(mthis, value) native "HTMLAreaElement_search_Setter";
 
-Native_HTMLAreaElement_username_Getter(mthis) native "HTMLAreaElement_username_Getter";
+  static $username_Getter(mthis) native "HTMLAreaElement_username_Getter";
 
-Native_HTMLAreaElement_username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
+  static $username_Setter(mthis, value) native "HTMLAreaElement_username_Setter";
 
-Native_HTMLAreaElement_toString_Callback(mthis) native "HTMLAreaElement_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "HTMLAreaElement_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLMediaElement_autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
+class BlinkHTMLMediaElement {
+  static $autoplay_Getter(mthis) native "HTMLMediaElement_autoplay_Getter";
 
-Native_HTMLMediaElement_autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
+  static $autoplay_Setter(mthis, value) native "HTMLMediaElement_autoplay_Setter";
 
-Native_HTMLMediaElement_buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
+  static $buffered_Getter(mthis) native "HTMLMediaElement_buffered_Getter";
 
-Native_HTMLMediaElement_controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
+  static $controller_Getter(mthis) native "HTMLMediaElement_controller_Getter";
 
-Native_HTMLMediaElement_controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
+  static $controller_Setter(mthis, value) native "HTMLMediaElement_controller_Setter";
 
-Native_HTMLMediaElement_controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
+  static $controls_Getter(mthis) native "HTMLMediaElement_controls_Getter";
 
-Native_HTMLMediaElement_controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
+  static $controls_Setter(mthis, value) native "HTMLMediaElement_controls_Setter";
 
-Native_HTMLMediaElement_crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
+  static $crossOrigin_Getter(mthis) native "HTMLMediaElement_crossOrigin_Getter";
 
-Native_HTMLMediaElement_crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLMediaElement_crossOrigin_Setter";
 
-Native_HTMLMediaElement_currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
+  static $currentSrc_Getter(mthis) native "HTMLMediaElement_currentSrc_Getter";
 
-Native_HTMLMediaElement_currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "HTMLMediaElement_currentTime_Getter";
 
-Native_HTMLMediaElement_currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
+  static $currentTime_Setter(mthis, value) native "HTMLMediaElement_currentTime_Setter";
 
-Native_HTMLMediaElement_defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
+  static $defaultMuted_Getter(mthis) native "HTMLMediaElement_defaultMuted_Getter";
 
-Native_HTMLMediaElement_defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
+  static $defaultMuted_Setter(mthis, value) native "HTMLMediaElement_defaultMuted_Setter";
 
-Native_HTMLMediaElement_defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
+  static $defaultPlaybackRate_Getter(mthis) native "HTMLMediaElement_defaultPlaybackRate_Getter";
 
-Native_HTMLMediaElement_defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
+  static $defaultPlaybackRate_Setter(mthis, value) native "HTMLMediaElement_defaultPlaybackRate_Setter";
 
-Native_HTMLMediaElement_duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
+  static $duration_Getter(mthis) native "HTMLMediaElement_duration_Getter";
 
-Native_HTMLMediaElement_ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
+  static $ended_Getter(mthis) native "HTMLMediaElement_ended_Getter";
 
-Native_HTMLMediaElement_error_Getter(mthis) native "HTMLMediaElement_error_Getter";
+  static $error_Getter(mthis) native "HTMLMediaElement_error_Getter";
 
-Native_HTMLMediaElement_loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
+  static $loop_Getter(mthis) native "HTMLMediaElement_loop_Getter";
 
-Native_HTMLMediaElement_loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
+  static $loop_Setter(mthis, value) native "HTMLMediaElement_loop_Setter";
 
-Native_HTMLMediaElement_mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
+  static $mediaGroup_Getter(mthis) native "HTMLMediaElement_mediaGroup_Getter";
 
-Native_HTMLMediaElement_mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
+  static $mediaGroup_Setter(mthis, value) native "HTMLMediaElement_mediaGroup_Setter";
 
-Native_HTMLMediaElement_mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
+  static $mediaKeys_Getter(mthis) native "HTMLMediaElement_mediaKeys_Getter";
 
-Native_HTMLMediaElement_muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
+  static $muted_Getter(mthis) native "HTMLMediaElement_muted_Getter";
 
-Native_HTMLMediaElement_muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
+  static $muted_Setter(mthis, value) native "HTMLMediaElement_muted_Setter";
 
-Native_HTMLMediaElement_networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
+  static $networkState_Getter(mthis) native "HTMLMediaElement_networkState_Getter";
 
-Native_HTMLMediaElement_paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
+  static $paused_Getter(mthis) native "HTMLMediaElement_paused_Getter";
 
-Native_HTMLMediaElement_playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "HTMLMediaElement_playbackRate_Getter";
 
-Native_HTMLMediaElement_playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "HTMLMediaElement_playbackRate_Setter";
 
-Native_HTMLMediaElement_played_Getter(mthis) native "HTMLMediaElement_played_Getter";
+  static $played_Getter(mthis) native "HTMLMediaElement_played_Getter";
 
-Native_HTMLMediaElement_preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
+  static $preload_Getter(mthis) native "HTMLMediaElement_preload_Getter";
 
-Native_HTMLMediaElement_preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
+  static $preload_Setter(mthis, value) native "HTMLMediaElement_preload_Setter";
 
-Native_HTMLMediaElement_readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
+  static $readyState_Getter(mthis) native "HTMLMediaElement_readyState_Getter";
 
-Native_HTMLMediaElement_seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
+  static $seekable_Getter(mthis) native "HTMLMediaElement_seekable_Getter";
 
-Native_HTMLMediaElement_seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
+  static $seeking_Getter(mthis) native "HTMLMediaElement_seeking_Getter";
 
-Native_HTMLMediaElement_src_Getter(mthis) native "HTMLMediaElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLMediaElement_src_Getter";
 
-Native_HTMLMediaElement_src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLMediaElement_src_Setter";
 
-Native_HTMLMediaElement_textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
+  static $textTracks_Getter(mthis) native "HTMLMediaElement_textTracks_Getter";
 
-Native_HTMLMediaElement_volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
+  static $volume_Getter(mthis) native "HTMLMediaElement_volume_Getter";
 
-Native_HTMLMediaElement_volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
+  static $volume_Setter(mthis, value) native "HTMLMediaElement_volume_Setter";
 
-Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
+  static $webkitAudioDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitAudioDecodedByteCount_Getter";
 
-Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
+  static $webkitVideoDecodedByteCount_Getter(mthis) native "HTMLMediaElement_webkitVideoDecodedByteCount_Getter";
 
   // Generated overload resolver
-Native_HTMLMediaElement_addTextTrack(mthis, kind, label, language) {
+  static $addTextTrack(mthis, kind, label, language) {
     if (language != null) {
-      return Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language);
+      return $_addTextTrack_1_Callback(mthis, kind, label, language);
     }
     if (label != null) {
-      return Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label);
+      return $_addTextTrack_2_Callback(mthis, kind, label);
     }
-    return Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind);
+    return $_addTextTrack_3_Callback(mthis, kind);
   }
 
-Native_HTMLMediaElement__addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $_addTextTrack_1_Callback(mthis, kind, label, language) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_addTextTrack_2_Callback(mthis, kind, label) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement__addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addTextTrack_3_Callback(mthis, kind) native "HTMLMediaElement_addTextTrack_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLMediaElement_canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $canPlayType_Callback(mthis, type, keySystem) native "HTMLMediaElement_canPlayType_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_HTMLMediaElement_load_Callback(mthis) native "HTMLMediaElement_load_Callback_RESOLVER_STRING_0_";
+  static $load_Callback(mthis) native "HTMLMediaElement_load_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_pause_Callback(mthis) native "HTMLMediaElement_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "HTMLMediaElement_pause_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_play_Callback(mthis) native "HTMLMediaElement_play_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "HTMLMediaElement_play_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLMediaElement_setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback_RESOLVER_STRING_1_MediaKeys";
+  static $setMediaKeys_Callback(mthis, mediaKeys) native "HTMLMediaElement_setMediaKeys_Callback_RESOLVER_STRING_1_MediaKeys";
 
   // Generated overload resolver
-Native_HTMLMediaElement_addKey(mthis, keySystem, key, initData, sessionId) {
+  static $addKey(mthis, keySystem, key, initData, sessionId) {
     if (initData != null) {
-      Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
+      $_webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId);
       return;
     }
-    Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key);
+    $_webkitAddKey_2_Callback(mthis, keySystem, key);
     return;
   }
 
-Native_HTMLMediaElement__webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_4_DOMString_Uint8Array_Uint8Array_DOMString";
+  static $_webkitAddKey_1_Callback(mthis, keySystem, key, initData, sessionId) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_4_DOMString_Uint8Array_Uint8Array_DOMString";
 
-Native_HTMLMediaElement__webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $_webkitAddKey_2_Callback(mthis, keySystem, key) native "HTMLMediaElement_webkitAddKey_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $webkitCancelKeyRequest_Callback(mthis, keySystem, sessionId) native "HTMLMediaElement_webkitCancelKeyRequest_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
   // Generated overload resolver
-Native_HTMLMediaElement_generateKeyRequest(mthis, keySystem, initData) {
+  static $generateKeyRequest(mthis, keySystem, initData) {
     if (initData != null) {
-      Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
+      $_webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData);
       return;
     }
-    Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
+    $_webkitGenerateKeyRequest_2_Callback(mthis, keySystem);
     return;
   }
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $_webkitGenerateKeyRequest_1_Callback(mthis, keySystem, initData) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
 
-Native_HTMLMediaElement__webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_1_DOMString";
+  static $_webkitGenerateKeyRequest_2_Callback(mthis, keySystem) native "HTMLMediaElement_webkitGenerateKeyRequest_Callback_RESOLVER_STRING_1_DOMString";
+}
 
+class BlinkHTMLAudioElement {
   // Generated overload resolver
-Native_HTMLAudioElement_AudioElement(src) {
-    return Native_HTMLAudioElement__create_1constructorCallback(src);
+  static $mkAudioElement(src) {
+    return $_create_1constructorCallback(src);
   }
 
-Native_HTMLAudioElement__create_1constructorCallback(src) native "HTMLAudioElement_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(src) native "HTMLAudioElement_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLBaseElement_href_Getter(mthis) native "HTMLBaseElement_href_Getter";
+class BlinkHTMLBRElement {}
 
-Native_HTMLBaseElement_href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
+class BlinkHTMLBaseElement {
+  static $href_Getter(mthis) native "HTMLBaseElement_href_Getter";
 
-Native_HTMLBaseElement_target_Getter(mthis) native "HTMLBaseElement_target_Getter";
+  static $href_Setter(mthis, value) native "HTMLBaseElement_href_Setter";
 
-Native_HTMLBaseElement_target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+  static $target_Getter(mthis) native "HTMLBaseElement_target_Getter";
 
-Native_HTMLButtonElement_autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
+  static $target_Setter(mthis, value) native "HTMLBaseElement_target_Setter";
+}
 
-Native_HTMLButtonElement_autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
+class BlinkWindowEventHandlers {}
 
-Native_HTMLButtonElement_disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
+class BlinkHTMLBodyElement {}
 
-Native_HTMLButtonElement_disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
+class BlinkHTMLButtonElement {
+  static $autofocus_Getter(mthis) native "HTMLButtonElement_autofocus_Getter";
 
-Native_HTMLButtonElement_form_Getter(mthis) native "HTMLButtonElement_form_Getter";
+  static $autofocus_Setter(mthis, value) native "HTMLButtonElement_autofocus_Setter";
 
-Native_HTMLButtonElement_formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
+  static $disabled_Getter(mthis) native "HTMLButtonElement_disabled_Getter";
 
-Native_HTMLButtonElement_formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLButtonElement_disabled_Setter";
 
-Native_HTMLButtonElement_formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
+  static $form_Getter(mthis) native "HTMLButtonElement_form_Getter";
 
-Native_HTMLButtonElement_formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
+  static $formAction_Getter(mthis) native "HTMLButtonElement_formAction_Getter";
 
-Native_HTMLButtonElement_formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
+  static $formAction_Setter(mthis, value) native "HTMLButtonElement_formAction_Setter";
 
-Native_HTMLButtonElement_formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
+  static $formEnctype_Getter(mthis) native "HTMLButtonElement_formEnctype_Getter";
 
-Native_HTMLButtonElement_formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
+  static $formEnctype_Setter(mthis, value) native "HTMLButtonElement_formEnctype_Setter";
 
-Native_HTMLButtonElement_formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
+  static $formMethod_Getter(mthis) native "HTMLButtonElement_formMethod_Getter";
 
-Native_HTMLButtonElement_formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
+  static $formMethod_Setter(mthis, value) native "HTMLButtonElement_formMethod_Setter";
 
-Native_HTMLButtonElement_formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
+  static $formNoValidate_Getter(mthis) native "HTMLButtonElement_formNoValidate_Getter";
 
-Native_HTMLButtonElement_labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
+  static $formNoValidate_Setter(mthis, value) native "HTMLButtonElement_formNoValidate_Setter";
 
-Native_HTMLButtonElement_name_Getter(mthis) native "HTMLButtonElement_name_Getter";
+  static $formTarget_Getter(mthis) native "HTMLButtonElement_formTarget_Getter";
 
-Native_HTMLButtonElement_name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
+  static $formTarget_Setter(mthis, value) native "HTMLButtonElement_formTarget_Setter";
 
-Native_HTMLButtonElement_type_Getter(mthis) native "HTMLButtonElement_type_Getter";
+  static $labels_Getter(mthis) native "HTMLButtonElement_labels_Getter";
 
-Native_HTMLButtonElement_type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
+  static $name_Getter(mthis) native "HTMLButtonElement_name_Getter";
 
-Native_HTMLButtonElement_validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
+  static $name_Setter(mthis, value) native "HTMLButtonElement_name_Setter";
 
-Native_HTMLButtonElement_validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
+  static $type_Getter(mthis) native "HTMLButtonElement_type_Getter";
 
-Native_HTMLButtonElement_value_Getter(mthis) native "HTMLButtonElement_value_Getter";
+  static $type_Setter(mthis, value) native "HTMLButtonElement_type_Setter";
 
-Native_HTMLButtonElement_value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
+  static $validationMessage_Getter(mthis) native "HTMLButtonElement_validationMessage_Getter";
 
-Native_HTMLButtonElement_willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
+  static $validity_Getter(mthis) native "HTMLButtonElement_validity_Getter";
 
-Native_HTMLButtonElement_checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $value_Getter(mthis) native "HTMLButtonElement_value_Getter";
 
-Native_HTMLButtonElement_setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $value_Setter(mthis, value) native "HTMLButtonElement_value_Setter";
 
-Native_HTMLCanvasElement_height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
+  static $willValidate_Getter(mthis) native "HTMLButtonElement_willValidate_Getter";
 
-Native_HTMLCanvasElement_height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
+  static $checkValidity_Callback(mthis) native "HTMLButtonElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLCanvasElement_width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLButtonElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLCanvasElement_width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
+class BlinkHTMLCanvasElement {
+  static $height_Getter(mthis) native "HTMLCanvasElement_height_Getter";
 
-Native_HTMLCanvasElement_getContext_Callback(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
+  static $height_Setter(mthis, value) native "HTMLCanvasElement_height_Setter";
 
-Native_HTMLCanvasElement_toDataURL_Callback(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
+  static $width_Getter(mthis) native "HTMLCanvasElement_width_Getter";
 
-Native_HTMLCollection_length_Getter(mthis) native "HTMLCollection_length_Getter";
+  static $width_Setter(mthis, value) native "HTMLCanvasElement_width_Setter";
 
-Native_HTMLCollection_NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getContext_Callback(mthis, contextId, attrs) native "HTMLCanvasElement_getContext_Callback";
 
-Native_HTMLCollection_item_Callback(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $toDataURL_Callback(mthis, type, quality) native "HTMLCanvasElement_toDataURL_Callback";
+}
 
-Native_HTMLCollection_namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkHTMLCollection {
+  static $length_Getter(mthis) native "HTMLCollection_length_Getter";
 
-Native_HTMLContentElement_resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLContentElement_resetStyleInheritance_Setter(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
+  static $item_Callback(mthis, index) native "HTMLCollection_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLContentElement_select_Getter(mthis) native "HTMLContentElement_select_Getter";
+  static $namedItem_Callback(mthis, name) native "HTMLCollection_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLContentElement_select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
+class BlinkHTMLContentElement {
+  static $resetStyleInheritance_Getter(mthis) native "HTMLContentElement_resetStyleInheritance_Getter";
 
-Native_HTMLContentElement_getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+  static $resetStyleInheritance_Setter(mthis, value) native "HTMLContentElement_resetStyleInheritance_Setter";
 
-Native_HTMLDataListElement_options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+  static $select_Getter(mthis) native "HTMLContentElement_select_Getter";
 
-Native_HTMLDetailsElement_open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
+  static $select_Setter(mthis, value) native "HTMLContentElement_select_Setter";
 
-Native_HTMLDetailsElement_open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+  static $getDistributedNodes_Callback(mthis) native "HTMLContentElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLDialogElement_open_Getter(mthis) native "HTMLDialogElement_open_Getter";
+class BlinkHTMLDListElement {}
 
-Native_HTMLDialogElement_open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
+class BlinkHTMLDataListElement {
+  static $options_Getter(mthis) native "HTMLDataListElement_options_Getter";
+}
 
-Native_HTMLDialogElement_returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
+class BlinkHTMLDetailsElement {
+  static $open_Getter(mthis) native "HTMLDetailsElement_open_Getter";
 
-Native_HTMLDialogElement_returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
+  static $open_Setter(mthis, value) native "HTMLDetailsElement_open_Setter";
+}
 
-Native_HTMLDialogElement_close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkHTMLDialogElement {
+  static $open_Getter(mthis) native "HTMLDialogElement_open_Getter";
 
-Native_HTMLDialogElement_show_Callback(mthis) native "HTMLDialogElement_show_Callback_RESOLVER_STRING_0_";
+  static $open_Setter(mthis, value) native "HTMLDialogElement_open_Setter";
 
-Native_HTMLDialogElement_showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback_RESOLVER_STRING_0_";
+  static $returnValue_Getter(mthis) native "HTMLDialogElement_returnValue_Getter";
 
-Native_HTMLEmbedElement_height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
+  static $returnValue_Setter(mthis, value) native "HTMLDialogElement_returnValue_Setter";
 
-Native_HTMLEmbedElement_height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
+  static $close_Callback(mthis, returnValue) native "HTMLDialogElement_close_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLEmbedElement_name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
+  static $show_Callback(mthis) native "HTMLDialogElement_show_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLEmbedElement_name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
+  static $showModal_Callback(mthis) native "HTMLDialogElement_showModal_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLEmbedElement_src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
+class BlinkHTMLDirectoryElement {}
 
-Native_HTMLEmbedElement_src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
+class BlinkHTMLDivElement {}
 
-Native_HTMLEmbedElement_type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
+class BlinkHTMLDocument {}
 
-Native_HTMLEmbedElement_type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
+class BlinkHTMLEmbedElement {
+  static $height_Getter(mthis) native "HTMLEmbedElement_height_Getter";
 
-Native_HTMLEmbedElement_width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
+  static $height_Setter(mthis, value) native "HTMLEmbedElement_height_Setter";
 
-Native_HTMLEmbedElement_width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
+  static $name_Getter(mthis) native "HTMLEmbedElement_name_Getter";
 
-Native_HTMLEmbedElement___getter___Callback(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
+  static $name_Setter(mthis, value) native "HTMLEmbedElement_name_Setter";
 
-Native_HTMLEmbedElement___setter___Callback(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
+  static $src_Getter(mthis) native "HTMLEmbedElement_src_Getter";
 
-Native_HTMLFieldSetElement_disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
+  static $src_Setter(mthis, value) native "HTMLEmbedElement_src_Setter";
 
-Native_HTMLFieldSetElement_disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
+  static $type_Getter(mthis) native "HTMLEmbedElement_type_Getter";
 
-Native_HTMLFieldSetElement_elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
+  static $type_Setter(mthis, value) native "HTMLEmbedElement_type_Setter";
 
-Native_HTMLFieldSetElement_form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
+  static $width_Getter(mthis) native "HTMLEmbedElement_width_Getter";
 
-Native_HTMLFieldSetElement_name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
+  static $width_Setter(mthis, value) native "HTMLEmbedElement_width_Setter";
 
-Native_HTMLFieldSetElement_name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
+  static $__getter___Callback(mthis, index_OR_name) native "HTMLEmbedElement___getter___Callback";
 
-Native_HTMLFieldSetElement_type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
+  static $__setter___Callback(mthis, index_OR_name, value) native "HTMLEmbedElement___setter___Callback";
+}
 
-Native_HTMLFieldSetElement_validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
+class BlinkHTMLFieldSetElement {
+  static $disabled_Getter(mthis) native "HTMLFieldSetElement_disabled_Getter";
 
-Native_HTMLFieldSetElement_validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLFieldSetElement_disabled_Setter";
 
-Native_HTMLFieldSetElement_willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
+  static $elements_Getter(mthis) native "HTMLFieldSetElement_elements_Getter";
 
-Native_HTMLFieldSetElement_checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $form_Getter(mthis) native "HTMLFieldSetElement_form_Getter";
 
-Native_HTMLFieldSetElement_setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $name_Getter(mthis) native "HTMLFieldSetElement_name_Getter";
 
-Native_HTMLFormElement_acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
+  static $name_Setter(mthis, value) native "HTMLFieldSetElement_name_Setter";
 
-Native_HTMLFormElement_acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
+  static $type_Getter(mthis) native "HTMLFieldSetElement_type_Getter";
 
-Native_HTMLFormElement_action_Getter(mthis) native "HTMLFormElement_action_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLFieldSetElement_validationMessage_Getter";
 
-Native_HTMLFormElement_action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
+  static $validity_Getter(mthis) native "HTMLFieldSetElement_validity_Getter";
 
-Native_HTMLFormElement_autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
+  static $willValidate_Getter(mthis) native "HTMLFieldSetElement_willValidate_Getter";
 
-Native_HTMLFormElement_autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
+  static $checkValidity_Callback(mthis) native "HTMLFieldSetElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLFormElement_encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLFieldSetElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLFormElement_encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
+class BlinkHTMLFontElement {}
 
-Native_HTMLFormElement_enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
+class BlinkHTMLFormControlsCollection {}
 
-Native_HTMLFormElement_enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
+class BlinkHTMLFormElement {
+  static $acceptCharset_Getter(mthis) native "HTMLFormElement_acceptCharset_Getter";
 
-Native_HTMLFormElement_length_Getter(mthis) native "HTMLFormElement_length_Getter";
+  static $acceptCharset_Setter(mthis, value) native "HTMLFormElement_acceptCharset_Setter";
 
-Native_HTMLFormElement_method_Getter(mthis) native "HTMLFormElement_method_Getter";
+  static $action_Getter(mthis) native "HTMLFormElement_action_Getter";
 
-Native_HTMLFormElement_method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
+  static $action_Setter(mthis, value) native "HTMLFormElement_action_Setter";
 
-Native_HTMLFormElement_name_Getter(mthis) native "HTMLFormElement_name_Getter";
+  static $autocomplete_Getter(mthis) native "HTMLFormElement_autocomplete_Getter";
 
-Native_HTMLFormElement_name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+  static $autocomplete_Setter(mthis, value) native "HTMLFormElement_autocomplete_Setter";
 
-Native_HTMLFormElement_noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+  static $encoding_Getter(mthis) native "HTMLFormElement_encoding_Getter";
 
-Native_HTMLFormElement_noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+  static $encoding_Setter(mthis, value) native "HTMLFormElement_encoding_Setter";
 
-Native_HTMLFormElement_target_Getter(mthis) native "HTMLFormElement_target_Getter";
+  static $enctype_Getter(mthis) native "HTMLFormElement_enctype_Getter";
 
-Native_HTMLFormElement_target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+  static $enctype_Setter(mthis, value) native "HTMLFormElement_enctype_Setter";
 
-Native_HTMLFormElement___getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $length_Getter(mthis) native "HTMLFormElement_length_Getter";
 
-Native_HTMLFormElement_checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $method_Getter(mthis) native "HTMLFormElement_method_Getter";
 
-Native_HTMLFormElement_requestAutocomplete_Callback(mthis, details) native "HTMLFormElement_requestAutocomplete_Callback_RESOLVER_STRING_1_Dictionary";
+  static $method_Setter(mthis, value) native "HTMLFormElement_method_Setter";
 
-Native_HTMLFormElement_reset_Callback(mthis) native "HTMLFormElement_reset_Callback_RESOLVER_STRING_0_";
+  static $name_Getter(mthis) native "HTMLFormElement_name_Getter";
+
+  static $name_Setter(mthis, value) native "HTMLFormElement_name_Setter";
+
+  static $noValidate_Getter(mthis) native "HTMLFormElement_noValidate_Getter";
+
+  static $noValidate_Setter(mthis, value) native "HTMLFormElement_noValidate_Setter";
+
+  static $target_Getter(mthis) native "HTMLFormElement_target_Getter";
+
+  static $target_Setter(mthis, value) native "HTMLFormElement_target_Setter";
+
+  static $__getter___Callback(mthis, index) native "HTMLFormElement___getter___Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $checkValidity_Callback(mthis) native "HTMLFormElement_checkValidity_Callback_RESOLVER_STRING_0_";
+
+  static $requestAutocomplete_Callback(mthis, details) native "HTMLFormElement_requestAutocomplete_Callback_RESOLVER_STRING_1_Dictionary";
+
+  static $reset_Callback(mthis) native "HTMLFormElement_reset_Callback_RESOLVER_STRING_0_";
+
+  static $submit_Callback(mthis) native "HTMLFormElement_submit_Callback_RESOLVER_STRING_0_";
+}
+
+class BlinkHTMLFrameElement {}
+
+class BlinkHTMLFrameSetElement {}
+
+class BlinkHTMLHRElement {
+  static $color_Getter(mthis) native "HTMLHRElement_color_Getter";
+
+  static $color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+}
 
-Native_HTMLFormElement_submit_Callback(mthis) native "HTMLFormElement_submit_Callback_RESOLVER_STRING_0_";
+class BlinkHTMLHeadElement {}
 
-Native_HTMLHRElement_color_Getter(mthis) native "HTMLHRElement_color_Getter";
+class BlinkHTMLHeadingElement {}
 
-Native_HTMLHRElement_color_Setter(mthis, value) native "HTMLHRElement_color_Setter";
+class BlinkHTMLHtmlElement {}
 
-Native_HTMLIFrameElement_contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
+class BlinkHTMLIFrameElement {
+  static $contentWindow_Getter(mthis) native "HTMLIFrameElement_contentWindow_Getter";
 
-Native_HTMLIFrameElement_height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLIFrameElement_height_Getter";
 
-Native_HTMLIFrameElement_height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLIFrameElement_height_Setter";
 
-Native_HTMLIFrameElement_name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLIFrameElement_name_Getter";
 
-Native_HTMLIFrameElement_name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLIFrameElement_name_Setter";
 
-Native_HTMLIFrameElement_sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
+  static $sandbox_Getter(mthis) native "HTMLIFrameElement_sandbox_Getter";
 
-Native_HTMLIFrameElement_sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
+  static $sandbox_Setter(mthis, value) native "HTMLIFrameElement_sandbox_Setter";
 
-Native_HTMLIFrameElement_src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLIFrameElement_src_Getter";
 
-Native_HTMLIFrameElement_src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLIFrameElement_src_Setter";
 
-Native_HTMLIFrameElement_srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
+  static $srcdoc_Getter(mthis) native "HTMLIFrameElement_srcdoc_Getter";
 
-Native_HTMLIFrameElement_srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
+  static $srcdoc_Setter(mthis, value) native "HTMLIFrameElement_srcdoc_Setter";
 
-Native_HTMLIFrameElement_width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLIFrameElement_width_Getter";
 
-Native_HTMLIFrameElement_width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLIFrameElement_width_Setter";
+}
 
-Native_HTMLImageElement_alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
+class BlinkHTMLImageElement {
+  static $alt_Getter(mthis) native "HTMLImageElement_alt_Getter";
 
-Native_HTMLImageElement_alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLImageElement_alt_Setter";
 
-Native_HTMLImageElement_complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
+  static $complete_Getter(mthis) native "HTMLImageElement_complete_Getter";
 
-Native_HTMLImageElement_crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
+  static $crossOrigin_Getter(mthis) native "HTMLImageElement_crossOrigin_Getter";
 
-Native_HTMLImageElement_crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLImageElement_crossOrigin_Setter";
 
-Native_HTMLImageElement_height_Getter(mthis) native "HTMLImageElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLImageElement_height_Getter";
 
-Native_HTMLImageElement_height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLImageElement_height_Setter";
 
-Native_HTMLImageElement_isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
+  static $isMap_Getter(mthis) native "HTMLImageElement_isMap_Getter";
 
-Native_HTMLImageElement_isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
+  static $isMap_Setter(mthis, value) native "HTMLImageElement_isMap_Setter";
 
-Native_HTMLImageElement_naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
+  static $naturalHeight_Getter(mthis) native "HTMLImageElement_naturalHeight_Getter";
 
-Native_HTMLImageElement_naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
+  static $naturalWidth_Getter(mthis) native "HTMLImageElement_naturalWidth_Getter";
 
-Native_HTMLImageElement_src_Getter(mthis) native "HTMLImageElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLImageElement_src_Getter";
 
-Native_HTMLImageElement_src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLImageElement_src_Setter";
 
-Native_HTMLImageElement_srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
+  static $srcset_Getter(mthis) native "HTMLImageElement_srcset_Getter";
 
-Native_HTMLImageElement_srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
+  static $srcset_Setter(mthis, value) native "HTMLImageElement_srcset_Setter";
 
-Native_HTMLImageElement_useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
+  static $useMap_Getter(mthis) native "HTMLImageElement_useMap_Getter";
 
-Native_HTMLImageElement_useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
+  static $useMap_Setter(mthis, value) native "HTMLImageElement_useMap_Setter";
 
-Native_HTMLImageElement_width_Getter(mthis) native "HTMLImageElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLImageElement_width_Getter";
 
-Native_HTMLImageElement_width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLImageElement_width_Setter";
+}
 
-Native_HTMLInputElement_accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
+class BlinkHTMLInputElement {
+  static $accept_Getter(mthis) native "HTMLInputElement_accept_Getter";
 
-Native_HTMLInputElement_accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
+  static $accept_Setter(mthis, value) native "HTMLInputElement_accept_Setter";
 
-Native_HTMLInputElement_alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
+  static $alt_Getter(mthis) native "HTMLInputElement_alt_Getter";
 
-Native_HTMLInputElement_alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
+  static $alt_Setter(mthis, value) native "HTMLInputElement_alt_Setter";
 
-Native_HTMLInputElement_autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
+  static $autocomplete_Getter(mthis) native "HTMLInputElement_autocomplete_Getter";
 
-Native_HTMLInputElement_autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
+  static $autocomplete_Setter(mthis, value) native "HTMLInputElement_autocomplete_Setter";
 
-Native_HTMLInputElement_autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
+  static $autofocus_Getter(mthis) native "HTMLInputElement_autofocus_Getter";
 
-Native_HTMLInputElement_autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLInputElement_autofocus_Setter";
 
-Native_HTMLInputElement_checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
+  static $checked_Getter(mthis) native "HTMLInputElement_checked_Getter";
 
-Native_HTMLInputElement_checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
+  static $checked_Setter(mthis, value) native "HTMLInputElement_checked_Setter";
 
-Native_HTMLInputElement_defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
+  static $defaultChecked_Getter(mthis) native "HTMLInputElement_defaultChecked_Getter";
 
-Native_HTMLInputElement_defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
+  static $defaultChecked_Setter(mthis, value) native "HTMLInputElement_defaultChecked_Setter";
 
-Native_HTMLInputElement_defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
+  static $defaultValue_Getter(mthis) native "HTMLInputElement_defaultValue_Getter";
 
-Native_HTMLInputElement_defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
+  static $defaultValue_Setter(mthis, value) native "HTMLInputElement_defaultValue_Setter";
 
-Native_HTMLInputElement_dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
+  static $dirName_Getter(mthis) native "HTMLInputElement_dirName_Getter";
 
-Native_HTMLInputElement_dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
+  static $dirName_Setter(mthis, value) native "HTMLInputElement_dirName_Setter";
 
-Native_HTMLInputElement_disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLInputElement_disabled_Getter";
 
-Native_HTMLInputElement_disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLInputElement_disabled_Setter";
 
-Native_HTMLInputElement_files_Getter(mthis) native "HTMLInputElement_files_Getter";
+  static $files_Getter(mthis) native "HTMLInputElement_files_Getter";
 
-Native_HTMLInputElement_files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
+  static $files_Setter(mthis, value) native "HTMLInputElement_files_Setter";
 
-Native_HTMLInputElement_form_Getter(mthis) native "HTMLInputElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLInputElement_form_Getter";
 
-Native_HTMLInputElement_formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
+  static $formAction_Getter(mthis) native "HTMLInputElement_formAction_Getter";
 
-Native_HTMLInputElement_formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
+  static $formAction_Setter(mthis, value) native "HTMLInputElement_formAction_Setter";
 
-Native_HTMLInputElement_formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
+  static $formEnctype_Getter(mthis) native "HTMLInputElement_formEnctype_Getter";
 
-Native_HTMLInputElement_formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
+  static $formEnctype_Setter(mthis, value) native "HTMLInputElement_formEnctype_Setter";
 
-Native_HTMLInputElement_formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
+  static $formMethod_Getter(mthis) native "HTMLInputElement_formMethod_Getter";
 
-Native_HTMLInputElement_formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
+  static $formMethod_Setter(mthis, value) native "HTMLInputElement_formMethod_Setter";
 
-Native_HTMLInputElement_formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
+  static $formNoValidate_Getter(mthis) native "HTMLInputElement_formNoValidate_Getter";
 
-Native_HTMLInputElement_formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
+  static $formNoValidate_Setter(mthis, value) native "HTMLInputElement_formNoValidate_Setter";
 
-Native_HTMLInputElement_formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
+  static $formTarget_Getter(mthis) native "HTMLInputElement_formTarget_Getter";
 
-Native_HTMLInputElement_formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
+  static $formTarget_Setter(mthis, value) native "HTMLInputElement_formTarget_Setter";
 
-Native_HTMLInputElement_height_Getter(mthis) native "HTMLInputElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLInputElement_height_Getter";
 
-Native_HTMLInputElement_height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLInputElement_height_Setter";
 
-Native_HTMLInputElement_incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
+  static $incremental_Getter(mthis) native "HTMLInputElement_incremental_Getter";
 
-Native_HTMLInputElement_incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
+  static $incremental_Setter(mthis, value) native "HTMLInputElement_incremental_Setter";
 
-Native_HTMLInputElement_indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
+  static $indeterminate_Getter(mthis) native "HTMLInputElement_indeterminate_Getter";
 
-Native_HTMLInputElement_indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
+  static $indeterminate_Setter(mthis, value) native "HTMLInputElement_indeterminate_Setter";
 
-Native_HTMLInputElement_inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
+  static $inputMode_Getter(mthis) native "HTMLInputElement_inputMode_Getter";
 
-Native_HTMLInputElement_inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
+  static $inputMode_Setter(mthis, value) native "HTMLInputElement_inputMode_Setter";
 
-Native_HTMLInputElement_labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLInputElement_labels_Getter";
 
-Native_HTMLInputElement_list_Getter(mthis) native "HTMLInputElement_list_Getter";
+  static $list_Getter(mthis) native "HTMLInputElement_list_Getter";
 
-Native_HTMLInputElement_max_Getter(mthis) native "HTMLInputElement_max_Getter";
+  static $max_Getter(mthis) native "HTMLInputElement_max_Getter";
 
-Native_HTMLInputElement_max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
+  static $max_Setter(mthis, value) native "HTMLInputElement_max_Setter";
 
-Native_HTMLInputElement_maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
+  static $maxLength_Getter(mthis) native "HTMLInputElement_maxLength_Getter";
 
-Native_HTMLInputElement_maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
+  static $maxLength_Setter(mthis, value) native "HTMLInputElement_maxLength_Setter";
 
-Native_HTMLInputElement_min_Getter(mthis) native "HTMLInputElement_min_Getter";
+  static $min_Getter(mthis) native "HTMLInputElement_min_Getter";
 
-Native_HTMLInputElement_min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
+  static $min_Setter(mthis, value) native "HTMLInputElement_min_Setter";
 
-Native_HTMLInputElement_multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
+  static $multiple_Getter(mthis) native "HTMLInputElement_multiple_Getter";
 
-Native_HTMLInputElement_multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
+  static $multiple_Setter(mthis, value) native "HTMLInputElement_multiple_Setter";
 
-Native_HTMLInputElement_name_Getter(mthis) native "HTMLInputElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLInputElement_name_Getter";
 
-Native_HTMLInputElement_name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLInputElement_name_Setter";
 
-Native_HTMLInputElement_pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
+  static $pattern_Getter(mthis) native "HTMLInputElement_pattern_Getter";
 
-Native_HTMLInputElement_pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
+  static $pattern_Setter(mthis, value) native "HTMLInputElement_pattern_Setter";
 
-Native_HTMLInputElement_placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
+  static $placeholder_Getter(mthis) native "HTMLInputElement_placeholder_Getter";
 
-Native_HTMLInputElement_placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
+  static $placeholder_Setter(mthis, value) native "HTMLInputElement_placeholder_Setter";
 
-Native_HTMLInputElement_readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
+  static $readOnly_Getter(mthis) native "HTMLInputElement_readOnly_Getter";
 
-Native_HTMLInputElement_readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
+  static $readOnly_Setter(mthis, value) native "HTMLInputElement_readOnly_Setter";
 
-Native_HTMLInputElement_required_Getter(mthis) native "HTMLInputElement_required_Getter";
+  static $required_Getter(mthis) native "HTMLInputElement_required_Getter";
 
-Native_HTMLInputElement_required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
+  static $required_Setter(mthis, value) native "HTMLInputElement_required_Setter";
 
-Native_HTMLInputElement_selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
+  static $selectionDirection_Getter(mthis) native "HTMLInputElement_selectionDirection_Getter";
 
-Native_HTMLInputElement_selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
+  static $selectionDirection_Setter(mthis, value) native "HTMLInputElement_selectionDirection_Setter";
 
-Native_HTMLInputElement_selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
+  static $selectionEnd_Getter(mthis) native "HTMLInputElement_selectionEnd_Getter";
 
-Native_HTMLInputElement_selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
+  static $selectionEnd_Setter(mthis, value) native "HTMLInputElement_selectionEnd_Setter";
 
-Native_HTMLInputElement_selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
+  static $selectionStart_Getter(mthis) native "HTMLInputElement_selectionStart_Getter";
 
-Native_HTMLInputElement_selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
+  static $selectionStart_Setter(mthis, value) native "HTMLInputElement_selectionStart_Setter";
 
-Native_HTMLInputElement_size_Getter(mthis) native "HTMLInputElement_size_Getter";
+  static $size_Getter(mthis) native "HTMLInputElement_size_Getter";
 
-Native_HTMLInputElement_size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
+  static $size_Setter(mthis, value) native "HTMLInputElement_size_Setter";
 
-Native_HTMLInputElement_src_Getter(mthis) native "HTMLInputElement_src_Getter";
+  static $src_Getter(mthis) native "HTMLInputElement_src_Getter";
 
-Native_HTMLInputElement_src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
+  static $src_Setter(mthis, value) native "HTMLInputElement_src_Setter";
 
-Native_HTMLInputElement_step_Getter(mthis) native "HTMLInputElement_step_Getter";
+  static $step_Getter(mthis) native "HTMLInputElement_step_Getter";
 
-Native_HTMLInputElement_step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
+  static $step_Setter(mthis, value) native "HTMLInputElement_step_Setter";
 
-Native_HTMLInputElement_type_Getter(mthis) native "HTMLInputElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLInputElement_type_Getter";
 
-Native_HTMLInputElement_type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLInputElement_type_Setter";
 
-Native_HTMLInputElement_validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLInputElement_validationMessage_Getter";
 
-Native_HTMLInputElement_validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLInputElement_validity_Getter";
 
-Native_HTMLInputElement_value_Getter(mthis) native "HTMLInputElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLInputElement_value_Getter";
 
-Native_HTMLInputElement_value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLInputElement_value_Setter";
 
-Native_HTMLInputElement_valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
+  static $valueAsDate_Getter(mthis) native "HTMLInputElement_valueAsDate_Getter";
 
-Native_HTMLInputElement_valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
+  static $valueAsDate_Setter(mthis, value) native "HTMLInputElement_valueAsDate_Setter";
 
-Native_HTMLInputElement_valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
+  static $valueAsNumber_Getter(mthis) native "HTMLInputElement_valueAsNumber_Getter";
 
-Native_HTMLInputElement_valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
+  static $valueAsNumber_Setter(mthis, value) native "HTMLInputElement_valueAsNumber_Setter";
 
-Native_HTMLInputElement_webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
+  static $webkitEntries_Getter(mthis) native "HTMLInputElement_webkitEntries_Getter";
 
-Native_HTMLInputElement_webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
+  static $webkitdirectory_Getter(mthis) native "HTMLInputElement_webkitdirectory_Getter";
 
-Native_HTMLInputElement_webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
+  static $webkitdirectory_Setter(mthis, value) native "HTMLInputElement_webkitdirectory_Setter";
 
-Native_HTMLInputElement_width_Getter(mthis) native "HTMLInputElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLInputElement_width_Getter";
 
-Native_HTMLInputElement_width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLInputElement_width_Setter";
 
-Native_HTMLInputElement_willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLInputElement_willValidate_Getter";
 
-Native_HTMLInputElement_checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLInputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_select_Callback(mthis) native "HTMLInputElement_select_Callback_RESOLVER_STRING_0_";
+  static $select_Callback(mthis) native "HTMLInputElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLInputElement_setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLInputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_HTMLInputElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+  static $setRangeText(mthis, replacement, start, end, selectionMode) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement);
+      $_setRangeText_1_Callback(mthis, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLInputElement__setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setRangeText_1_Callback(mthis, replacement) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLInputElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
+  static $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLInputElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
-Native_HTMLInputElement_setSelectionRange(mthis, start, end, direction) {
+  static $setSelectionRange(mthis, start, end, direction) {
     if (direction != null) {
-      Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      $_setSelectionRange_1_Callback(mthis, start, end, direction);
       return;
     }
-    Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end);
+    $_setSelectionRange_2_Callback(mthis, start, end);
     return;
   }
 
-Native_HTMLInputElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
+  static $_setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLInputElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+  static $_setSelectionRange_2_Callback(mthis, start, end) native "HTMLInputElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
 
   // Generated overload resolver
-Native_HTMLInputElement_stepDown(mthis, n) {
+  static $stepDown(mthis, n) {
     if (n != null) {
-      Native_HTMLInputElement__stepDown_1_Callback(mthis, n);
+      $_stepDown_1_Callback(mthis, n);
       return;
     }
-    Native_HTMLInputElement__stepDown_2_Callback(mthis);
+    $_stepDown_2_Callback(mthis);
     return;
   }
 
-Native_HTMLInputElement__stepDown_1_Callback(mthis, n) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_1_long";
+  static $_stepDown_1_Callback(mthis, n) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepDown_2_Callback(mthis) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_0_";
+  static $_stepDown_2_Callback(mthis) native "HTMLInputElement_stepDown_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_HTMLInputElement_stepUp(mthis, n) {
+  static $stepUp(mthis, n) {
     if (n != null) {
-      Native_HTMLInputElement__stepUp_1_Callback(mthis, n);
+      $_stepUp_1_Callback(mthis, n);
       return;
     }
-    Native_HTMLInputElement__stepUp_2_Callback(mthis);
+    $_stepUp_2_Callback(mthis);
     return;
   }
 
-Native_HTMLInputElement__stepUp_1_Callback(mthis, n) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_1_long";
+  static $_stepUp_1_Callback(mthis, n) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLInputElement__stepUp_2_Callback(mthis) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_0_";
+  static $_stepUp_2_Callback(mthis) native "HTMLInputElement_stepUp_Callback_RESOLVER_STRING_0_";
+}
 
-Native_HTMLKeygenElement_autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
+class BlinkHTMLKeygenElement {
+  static $autofocus_Getter(mthis) native "HTMLKeygenElement_autofocus_Getter";
 
-Native_HTMLKeygenElement_autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLKeygenElement_autofocus_Setter";
 
-Native_HTMLKeygenElement_challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
+  static $challenge_Getter(mthis) native "HTMLKeygenElement_challenge_Getter";
 
-Native_HTMLKeygenElement_challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
+  static $challenge_Setter(mthis, value) native "HTMLKeygenElement_challenge_Setter";
 
-Native_HTMLKeygenElement_disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLKeygenElement_disabled_Getter";
 
-Native_HTMLKeygenElement_disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLKeygenElement_disabled_Setter";
 
-Native_HTMLKeygenElement_form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLKeygenElement_form_Getter";
 
-Native_HTMLKeygenElement_keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
+  static $keytype_Getter(mthis) native "HTMLKeygenElement_keytype_Getter";
 
-Native_HTMLKeygenElement_keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
+  static $keytype_Setter(mthis, value) native "HTMLKeygenElement_keytype_Setter";
 
-Native_HTMLKeygenElement_labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLKeygenElement_labels_Getter";
 
-Native_HTMLKeygenElement_name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLKeygenElement_name_Getter";
 
-Native_HTMLKeygenElement_name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLKeygenElement_name_Setter";
 
-Native_HTMLKeygenElement_type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLKeygenElement_type_Getter";
 
-Native_HTMLKeygenElement_validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLKeygenElement_validationMessage_Getter";
 
-Native_HTMLKeygenElement_validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLKeygenElement_validity_Getter";
 
-Native_HTMLKeygenElement_willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLKeygenElement_willValidate_Getter";
 
-Native_HTMLKeygenElement_checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLKeygenElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLKeygenElement_setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLKeygenElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLLIElement_value_Getter(mthis) native "HTMLLIElement_value_Getter";
+class BlinkHTMLLIElement {
+  static $value_Getter(mthis) native "HTMLLIElement_value_Getter";
 
-Native_HTMLLIElement_value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLLIElement_value_Setter";
+}
 
-Native_HTMLLabelElement_control_Getter(mthis) native "HTMLLabelElement_control_Getter";
+class BlinkHTMLLabelElement {
+  static $control_Getter(mthis) native "HTMLLabelElement_control_Getter";
 
-Native_HTMLLabelElement_form_Getter(mthis) native "HTMLLabelElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLLabelElement_form_Getter";
 
-Native_HTMLLabelElement_htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
+  static $htmlFor_Getter(mthis) native "HTMLLabelElement_htmlFor_Getter";
 
-Native_HTMLLabelElement_htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+  static $htmlFor_Setter(mthis, value) native "HTMLLabelElement_htmlFor_Setter";
+}
 
-Native_HTMLLegendElement_form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+class BlinkHTMLLegendElement {
+  static $form_Getter(mthis) native "HTMLLegendElement_form_Getter";
+}
 
-Native_HTMLLinkElement_crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
+class BlinkHTMLLinkElement {
+  static $crossOrigin_Getter(mthis) native "HTMLLinkElement_crossOrigin_Getter";
 
-Native_HTMLLinkElement_crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLLinkElement_crossOrigin_Setter";
 
-Native_HTMLLinkElement_disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLLinkElement_disabled_Getter";
 
-Native_HTMLLinkElement_disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLLinkElement_disabled_Setter";
 
-Native_HTMLLinkElement_href_Getter(mthis) native "HTMLLinkElement_href_Getter";
+  static $href_Getter(mthis) native "HTMLLinkElement_href_Getter";
 
-Native_HTMLLinkElement_href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
+  static $href_Setter(mthis, value) native "HTMLLinkElement_href_Setter";
 
-Native_HTMLLinkElement_hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
+  static $hreflang_Getter(mthis) native "HTMLLinkElement_hreflang_Getter";
 
-Native_HTMLLinkElement_hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
+  static $hreflang_Setter(mthis, value) native "HTMLLinkElement_hreflang_Setter";
 
-Native_HTMLLinkElement_import_Getter(mthis) native "HTMLLinkElement_import_Getter";
+  static $import_Getter(mthis) native "HTMLLinkElement_import_Getter";
 
-Native_HTMLLinkElement_media_Getter(mthis) native "HTMLLinkElement_media_Getter";
+  static $media_Getter(mthis) native "HTMLLinkElement_media_Getter";
 
-Native_HTMLLinkElement_media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
+  static $media_Setter(mthis, value) native "HTMLLinkElement_media_Setter";
 
-Native_HTMLLinkElement_rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
+  static $rel_Getter(mthis) native "HTMLLinkElement_rel_Getter";
 
-Native_HTMLLinkElement_rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
+  static $rel_Setter(mthis, value) native "HTMLLinkElement_rel_Setter";
 
-Native_HTMLLinkElement_sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
+  static $sheet_Getter(mthis) native "HTMLLinkElement_sheet_Getter";
 
-Native_HTMLLinkElement_sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
+  static $sizes_Getter(mthis) native "HTMLLinkElement_sizes_Getter";
 
-Native_HTMLLinkElement_type_Getter(mthis) native "HTMLLinkElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLLinkElement_type_Getter";
 
-Native_HTMLLinkElement_type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLLinkElement_type_Setter";
+}
 
-Native_HTMLMapElement_areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
+class BlinkHTMLMapElement {
+  static $areas_Getter(mthis) native "HTMLMapElement_areas_Getter";
 
-Native_HTMLMapElement_name_Getter(mthis) native "HTMLMapElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLMapElement_name_Getter";
 
-Native_HTMLMapElement_name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLMapElement_name_Setter";
+}
 
-Native_HTMLMetaElement_content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+class BlinkHTMLMarqueeElement {}
 
-Native_HTMLMetaElement_content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
+class BlinkHTMLMenuElement {}
+
+class BlinkHTMLMetaElement {
+  static $content_Getter(mthis) native "HTMLMetaElement_content_Getter";
+
+  static $content_Setter(mthis, value) native "HTMLMetaElement_content_Setter";
 
-Native_HTMLMetaElement_httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
+  static $httpEquiv_Getter(mthis) native "HTMLMetaElement_httpEquiv_Getter";
 
-Native_HTMLMetaElement_httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
+  static $httpEquiv_Setter(mthis, value) native "HTMLMetaElement_httpEquiv_Setter";
 
-Native_HTMLMetaElement_name_Getter(mthis) native "HTMLMetaElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLMetaElement_name_Getter";
 
-Native_HTMLMetaElement_name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLMetaElement_name_Setter";
+}
 
-Native_HTMLMeterElement_high_Getter(mthis) native "HTMLMeterElement_high_Getter";
+class BlinkHTMLMeterElement {
+  static $high_Getter(mthis) native "HTMLMeterElement_high_Getter";
 
-Native_HTMLMeterElement_high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
+  static $high_Setter(mthis, value) native "HTMLMeterElement_high_Setter";
 
-Native_HTMLMeterElement_labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLMeterElement_labels_Getter";
 
-Native_HTMLMeterElement_low_Getter(mthis) native "HTMLMeterElement_low_Getter";
+  static $low_Getter(mthis) native "HTMLMeterElement_low_Getter";
 
-Native_HTMLMeterElement_low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
+  static $low_Setter(mthis, value) native "HTMLMeterElement_low_Setter";
 
-Native_HTMLMeterElement_max_Getter(mthis) native "HTMLMeterElement_max_Getter";
+  static $max_Getter(mthis) native "HTMLMeterElement_max_Getter";
 
-Native_HTMLMeterElement_max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
+  static $max_Setter(mthis, value) native "HTMLMeterElement_max_Setter";
 
-Native_HTMLMeterElement_min_Getter(mthis) native "HTMLMeterElement_min_Getter";
+  static $min_Getter(mthis) native "HTMLMeterElement_min_Getter";
 
-Native_HTMLMeterElement_min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
+  static $min_Setter(mthis, value) native "HTMLMeterElement_min_Setter";
 
-Native_HTMLMeterElement_optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
+  static $optimum_Getter(mthis) native "HTMLMeterElement_optimum_Getter";
 
-Native_HTMLMeterElement_optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
+  static $optimum_Setter(mthis, value) native "HTMLMeterElement_optimum_Setter";
 
-Native_HTMLMeterElement_value_Getter(mthis) native "HTMLMeterElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLMeterElement_value_Getter";
 
-Native_HTMLMeterElement_value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLMeterElement_value_Setter";
+}
 
-Native_HTMLModElement_cite_Getter(mthis) native "HTMLModElement_cite_Getter";
+class BlinkHTMLModElement {
+  static $cite_Getter(mthis) native "HTMLModElement_cite_Getter";
 
-Native_HTMLModElement_cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
+  static $cite_Setter(mthis, value) native "HTMLModElement_cite_Setter";
 
-Native_HTMLModElement_dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
+  static $dateTime_Getter(mthis) native "HTMLModElement_dateTime_Getter";
 
-Native_HTMLModElement_dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+  static $dateTime_Setter(mthis, value) native "HTMLModElement_dateTime_Setter";
+}
 
-Native_HTMLOListElement_reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
+class BlinkHTMLOListElement {
+  static $reversed_Getter(mthis) native "HTMLOListElement_reversed_Getter";
 
-Native_HTMLOListElement_reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
+  static $reversed_Setter(mthis, value) native "HTMLOListElement_reversed_Setter";
 
-Native_HTMLOListElement_start_Getter(mthis) native "HTMLOListElement_start_Getter";
+  static $start_Getter(mthis) native "HTMLOListElement_start_Getter";
 
-Native_HTMLOListElement_start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
+  static $start_Setter(mthis, value) native "HTMLOListElement_start_Setter";
 
-Native_HTMLOListElement_type_Getter(mthis) native "HTMLOListElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLOListElement_type_Getter";
 
-Native_HTMLOListElement_type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLOListElement_type_Setter";
+}
 
-Native_HTMLObjectElement_data_Getter(mthis) native "HTMLObjectElement_data_Getter";
+class BlinkHTMLObjectElement {
+  static $data_Getter(mthis) native "HTMLObjectElement_data_Getter";
 
-Native_HTMLObjectElement_data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
+  static $data_Setter(mthis, value) native "HTMLObjectElement_data_Setter";
 
-Native_HTMLObjectElement_form_Getter(mthis) native "HTMLObjectElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLObjectElement_form_Getter";
 
-Native_HTMLObjectElement_height_Getter(mthis) native "HTMLObjectElement_height_Getter";
+  static $height_Getter(mthis) native "HTMLObjectElement_height_Getter";
 
-Native_HTMLObjectElement_height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
+  static $height_Setter(mthis, value) native "HTMLObjectElement_height_Setter";
 
-Native_HTMLObjectElement_name_Getter(mthis) native "HTMLObjectElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLObjectElement_name_Getter";
 
-Native_HTMLObjectElement_name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLObjectElement_name_Setter";
 
-Native_HTMLObjectElement_type_Getter(mthis) native "HTMLObjectElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLObjectElement_type_Getter";
 
-Native_HTMLObjectElement_type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
+  static $type_Setter(mthis, value) native "HTMLObjectElement_type_Setter";
 
-Native_HTMLObjectElement_useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
+  static $useMap_Getter(mthis) native "HTMLObjectElement_useMap_Getter";
 
-Native_HTMLObjectElement_useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
+  static $useMap_Setter(mthis, value) native "HTMLObjectElement_useMap_Setter";
 
-Native_HTMLObjectElement_validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLObjectElement_validationMessage_Getter";
 
-Native_HTMLObjectElement_validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLObjectElement_validity_Getter";
 
-Native_HTMLObjectElement_width_Getter(mthis) native "HTMLObjectElement_width_Getter";
+  static $width_Getter(mthis) native "HTMLObjectElement_width_Getter";
 
-Native_HTMLObjectElement_width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
+  static $width_Setter(mthis, value) native "HTMLObjectElement_width_Setter";
 
-Native_HTMLObjectElement_willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLObjectElement_willValidate_Getter";
 
-Native_HTMLObjectElement___getter___Callback(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
+  static $__getter___Callback(mthis, index_OR_name) native "HTMLObjectElement___getter___Callback";
 
-Native_HTMLObjectElement___setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
+  static $__setter___Callback(mthis, index_OR_name, value) native "HTMLObjectElement___setter___Callback";
 
-Native_HTMLObjectElement_checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLObjectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLObjectElement_setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLObjectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLOptGroupElement_disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
+class BlinkHTMLOptGroupElement {
+  static $disabled_Getter(mthis) native "HTMLOptGroupElement_disabled_Getter";
 
-Native_HTMLOptGroupElement_disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLOptGroupElement_disabled_Setter";
 
-Native_HTMLOptGroupElement_label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
+  static $label_Getter(mthis) native "HTMLOptGroupElement_label_Getter";
 
-Native_HTMLOptGroupElement_label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+  static $label_Setter(mthis, value) native "HTMLOptGroupElement_label_Setter";
+}
 
+class BlinkHTMLOptionElement {
   // Generated overload resolver
-Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected) {
-    return Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected);
+  static $mkOptionElement__(data, value, defaultSelected, selected) {
+    return $_create_1constructorCallback(data, value, defaultSelected, selected);
   }
 
-Native_HTMLOptionElement__create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback_RESOLVER_STRING_4_DOMString_DOMString_boolean_boolean";
+  static $_create_1constructorCallback(data, value, defaultSelected, selected) native "HTMLOptionElement_constructorCallback_RESOLVER_STRING_4_DOMString_DOMString_boolean_boolean";
 
-Native_HTMLOptionElement_defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
+  static $defaultSelected_Getter(mthis) native "HTMLOptionElement_defaultSelected_Getter";
 
-Native_HTMLOptionElement_defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
+  static $defaultSelected_Setter(mthis, value) native "HTMLOptionElement_defaultSelected_Setter";
 
-Native_HTMLOptionElement_disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLOptionElement_disabled_Getter";
 
-Native_HTMLOptionElement_disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLOptionElement_disabled_Setter";
 
-Native_HTMLOptionElement_form_Getter(mthis) native "HTMLOptionElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLOptionElement_form_Getter";
 
-Native_HTMLOptionElement_index_Getter(mthis) native "HTMLOptionElement_index_Getter";
+  static $index_Getter(mthis) native "HTMLOptionElement_index_Getter";
 
-Native_HTMLOptionElement_label_Getter(mthis) native "HTMLOptionElement_label_Getter";
+  static $label_Getter(mthis) native "HTMLOptionElement_label_Getter";
 
-Native_HTMLOptionElement_label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
+  static $label_Setter(mthis, value) native "HTMLOptionElement_label_Setter";
 
-Native_HTMLOptionElement_selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
+  static $selected_Getter(mthis) native "HTMLOptionElement_selected_Getter";
 
-Native_HTMLOptionElement_selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
+  static $selected_Setter(mthis, value) native "HTMLOptionElement_selected_Setter";
 
-Native_HTMLOptionElement_value_Getter(mthis) native "HTMLOptionElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLOptionElement_value_Getter";
 
-Native_HTMLOptionElement_value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLOptionElement_value_Setter";
+}
 
-Native_HTMLOutputElement_defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
+class BlinkHTMLOptionsCollection {}
 
-Native_HTMLOutputElement_defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
+class BlinkHTMLOutputElement {
+  static $defaultValue_Getter(mthis) native "HTMLOutputElement_defaultValue_Getter";
 
-Native_HTMLOutputElement_form_Getter(mthis) native "HTMLOutputElement_form_Getter";
+  static $defaultValue_Setter(mthis, value) native "HTMLOutputElement_defaultValue_Setter";
 
-Native_HTMLOutputElement_htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
+  static $form_Getter(mthis) native "HTMLOutputElement_form_Getter";
 
-Native_HTMLOutputElement_labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
+  static $htmlFor_Getter(mthis) native "HTMLOutputElement_htmlFor_Getter";
 
-Native_HTMLOutputElement_name_Getter(mthis) native "HTMLOutputElement_name_Getter";
+  static $labels_Getter(mthis) native "HTMLOutputElement_labels_Getter";
 
-Native_HTMLOutputElement_name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
+  static $name_Getter(mthis) native "HTMLOutputElement_name_Getter";
 
-Native_HTMLOutputElement_type_Getter(mthis) native "HTMLOutputElement_type_Getter";
+  static $name_Setter(mthis, value) native "HTMLOutputElement_name_Setter";
 
-Native_HTMLOutputElement_validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
+  static $type_Getter(mthis) native "HTMLOutputElement_type_Getter";
 
-Native_HTMLOutputElement_validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLOutputElement_validationMessage_Getter";
 
-Native_HTMLOutputElement_value_Getter(mthis) native "HTMLOutputElement_value_Getter";
+  static $validity_Getter(mthis) native "HTMLOutputElement_validity_Getter";
 
-Native_HTMLOutputElement_value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
+  static $value_Getter(mthis) native "HTMLOutputElement_value_Getter";
 
-Native_HTMLOutputElement_willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
+  static $value_Setter(mthis, value) native "HTMLOutputElement_value_Setter";
 
-Native_HTMLOutputElement_checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $willValidate_Getter(mthis) native "HTMLOutputElement_willValidate_Getter";
 
-Native_HTMLOutputElement_setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $checkValidity_Callback(mthis) native "HTMLOutputElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLParamElement_name_Getter(mthis) native "HTMLParamElement_name_Getter";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLOutputElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLParamElement_name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
+class BlinkHTMLParagraphElement {}
 
-Native_HTMLParamElement_value_Getter(mthis) native "HTMLParamElement_value_Getter";
+class BlinkHTMLParamElement {
+  static $name_Getter(mthis) native "HTMLParamElement_name_Getter";
 
-Native_HTMLParamElement_value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+  static $name_Setter(mthis, value) native "HTMLParamElement_name_Setter";
 
-Native_HTMLProgressElement_labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
+  static $value_Getter(mthis) native "HTMLParamElement_value_Getter";
 
-Native_HTMLProgressElement_max_Getter(mthis) native "HTMLProgressElement_max_Getter";
+  static $value_Setter(mthis, value) native "HTMLParamElement_value_Setter";
+}
 
-Native_HTMLProgressElement_max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
+class BlinkHTMLPreElement {}
 
-Native_HTMLProgressElement_position_Getter(mthis) native "HTMLProgressElement_position_Getter";
+class BlinkHTMLProgressElement {
+  static $labels_Getter(mthis) native "HTMLProgressElement_labels_Getter";
 
-Native_HTMLProgressElement_value_Getter(mthis) native "HTMLProgressElement_value_Getter";
+  static $max_Getter(mthis) native "HTMLProgressElement_max_Getter";
 
-Native_HTMLProgressElement_value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+  static $max_Setter(mthis, value) native "HTMLProgressElement_max_Setter";
 
-Native_HTMLQuoteElement_cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
+  static $position_Getter(mthis) native "HTMLProgressElement_position_Getter";
 
-Native_HTMLQuoteElement_cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+  static $value_Getter(mthis) native "HTMLProgressElement_value_Getter";
 
-Native_HTMLScriptElement_async_Getter(mthis) native "HTMLScriptElement_async_Getter";
+  static $value_Setter(mthis, value) native "HTMLProgressElement_value_Setter";
+}
 
-Native_HTMLScriptElement_async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
+class BlinkHTMLQuoteElement {
+  static $cite_Getter(mthis) native "HTMLQuoteElement_cite_Getter";
 
-Native_HTMLScriptElement_charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
+  static $cite_Setter(mthis, value) native "HTMLQuoteElement_cite_Setter";
+}
 
-Native_HTMLScriptElement_charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
+class BlinkHTMLScriptElement {
+  static $async_Getter(mthis) native "HTMLScriptElement_async_Getter";
 
-Native_HTMLScriptElement_crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
+  static $async_Setter(mthis, value) native "HTMLScriptElement_async_Setter";
 
-Native_HTMLScriptElement_crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
+  static $charset_Getter(mthis) native "HTMLScriptElement_charset_Getter";
 
-Native_HTMLScriptElement_defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
+  static $charset_Setter(mthis, value) native "HTMLScriptElement_charset_Setter";
 
-Native_HTMLScriptElement_defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
+  static $crossOrigin_Getter(mthis) native "HTMLScriptElement_crossOrigin_Getter";
 
-Native_HTMLScriptElement_nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
+  static $crossOrigin_Setter(mthis, value) native "HTMLScriptElement_crossOrigin_Setter";
 
-Native_HTMLScriptElement_nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
+  static $defer_Getter(mthis) native "HTMLScriptElement_defer_Getter";
 
-Native_HTMLScriptElement_src_Getter(mthis) native "HTMLScriptElement_src_Getter";
+  static $defer_Setter(mthis, value) native "HTMLScriptElement_defer_Setter";
 
-Native_HTMLScriptElement_src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
+  static $nonce_Getter(mthis) native "HTMLScriptElement_nonce_Getter";
 
-Native_HTMLScriptElement_type_Getter(mthis) native "HTMLScriptElement_type_Getter";
+  static $nonce_Setter(mthis, value) native "HTMLScriptElement_nonce_Setter";
 
-Native_HTMLScriptElement_type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+  static $src_Getter(mthis) native "HTMLScriptElement_src_Getter";
 
-Native_HTMLSelectElement_autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
+  static $src_Setter(mthis, value) native "HTMLScriptElement_src_Setter";
 
-Native_HTMLSelectElement_autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
+  static $type_Getter(mthis) native "HTMLScriptElement_type_Getter";
 
-Native_HTMLSelectElement_disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
+  static $type_Setter(mthis, value) native "HTMLScriptElement_type_Setter";
+}
 
-Native_HTMLSelectElement_disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
+class BlinkHTMLSelectElement {
+  static $autofocus_Getter(mthis) native "HTMLSelectElement_autofocus_Getter";
 
-Native_HTMLSelectElement_form_Getter(mthis) native "HTMLSelectElement_form_Getter";
+  static $autofocus_Setter(mthis, value) native "HTMLSelectElement_autofocus_Setter";
 
-Native_HTMLSelectElement_labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
+  static $disabled_Getter(mthis) native "HTMLSelectElement_disabled_Getter";
 
-Native_HTMLSelectElement_length_Getter(mthis) native "HTMLSelectElement_length_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLSelectElement_disabled_Setter";
 
-Native_HTMLSelectElement_length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
+  static $form_Getter(mthis) native "HTMLSelectElement_form_Getter";
 
-Native_HTMLSelectElement_multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
+  static $labels_Getter(mthis) native "HTMLSelectElement_labels_Getter";
 
-Native_HTMLSelectElement_multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
+  static $length_Getter(mthis) native "HTMLSelectElement_length_Getter";
 
-Native_HTMLSelectElement_name_Getter(mthis) native "HTMLSelectElement_name_Getter";
+  static $length_Setter(mthis, value) native "HTMLSelectElement_length_Setter";
 
-Native_HTMLSelectElement_name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
+  static $multiple_Getter(mthis) native "HTMLSelectElement_multiple_Getter";
 
-Native_HTMLSelectElement_required_Getter(mthis) native "HTMLSelectElement_required_Getter";
+  static $multiple_Setter(mthis, value) native "HTMLSelectElement_multiple_Setter";
 
-Native_HTMLSelectElement_required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
+  static $name_Getter(mthis) native "HTMLSelectElement_name_Getter";
 
-Native_HTMLSelectElement_selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
+  static $name_Setter(mthis, value) native "HTMLSelectElement_name_Setter";
 
-Native_HTMLSelectElement_selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
+  static $required_Getter(mthis) native "HTMLSelectElement_required_Getter";
 
-Native_HTMLSelectElement_size_Getter(mthis) native "HTMLSelectElement_size_Getter";
+  static $required_Setter(mthis, value) native "HTMLSelectElement_required_Setter";
 
-Native_HTMLSelectElement_size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
+  static $selectedIndex_Getter(mthis) native "HTMLSelectElement_selectedIndex_Getter";
 
-Native_HTMLSelectElement_type_Getter(mthis) native "HTMLSelectElement_type_Getter";
+  static $selectedIndex_Setter(mthis, value) native "HTMLSelectElement_selectedIndex_Setter";
 
-Native_HTMLSelectElement_validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
+  static $size_Getter(mthis) native "HTMLSelectElement_size_Getter";
 
-Native_HTMLSelectElement_validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
+  static $size_Setter(mthis, value) native "HTMLSelectElement_size_Setter";
 
-Native_HTMLSelectElement_value_Getter(mthis) native "HTMLSelectElement_value_Getter";
+  static $type_Getter(mthis) native "HTMLSelectElement_type_Getter";
 
-Native_HTMLSelectElement_value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
+  static $validationMessage_Getter(mthis) native "HTMLSelectElement_validationMessage_Getter";
 
-Native_HTMLSelectElement_willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
+  static $validity_Getter(mthis) native "HTMLSelectElement_validity_Getter";
 
-Native_HTMLSelectElement___setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback_RESOLVER_STRING_2_unsigned long_HTMLOptionElement";
+  static $value_Getter(mthis) native "HTMLSelectElement_value_Getter";
 
-Native_HTMLSelectElement_checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $value_Setter(mthis, value) native "HTMLSelectElement_value_Setter";
 
-Native_HTMLSelectElement_item_Callback(mthis, index) native "HTMLSelectElement_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $willValidate_Getter(mthis) native "HTMLSelectElement_willValidate_Getter";
 
-Native_HTMLSelectElement_namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $__setter___Callback(mthis, index, value) native "HTMLSelectElement___setter___Callback_RESOLVER_STRING_2_unsigned long_HTMLOptionElement";
 
-Native_HTMLSelectElement_setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $checkValidity_Callback(mthis) native "HTMLSelectElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLShadowElement_resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
+  static $item_Callback(mthis, index) native "HTMLSelectElement_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_HTMLShadowElement_resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+  static $namedItem_Callback(mthis, name) native "HTMLSelectElement_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLShadowElement_getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLSelectElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_HTMLSourceElement_media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+class BlinkHTMLShadowElement {
+  static $resetStyleInheritance_Getter(mthis) native "HTMLShadowElement_resetStyleInheritance_Getter";
 
-Native_HTMLSourceElement_media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+  static $resetStyleInheritance_Setter(mthis, value) native "HTMLShadowElement_resetStyleInheritance_Setter";
+
+  static $getDistributedNodes_Callback(mthis) native "HTMLShadowElement_getDistributedNodes_Callback_RESOLVER_STRING_0_";
+}
+
+class BlinkHTMLSourceElement {
+  static $media_Getter(mthis) native "HTMLSourceElement_media_Getter";
+
+  static $media_Setter(mthis, value) native "HTMLSourceElement_media_Setter";
+
+  static $src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+
+  static $src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
 
-Native_HTMLSourceElement_src_Getter(mthis) native "HTMLSourceElement_src_Getter";
+  static $type_Getter(mthis) native "HTMLSourceElement_type_Getter";
 
-Native_HTMLSourceElement_src_Setter(mthis, value) native "HTMLSourceElement_src_Setter";
+  static $type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+}
 
-Native_HTMLSourceElement_type_Getter(mthis) native "HTMLSourceElement_type_Getter";
+class BlinkHTMLSpanElement {}
 
-Native_HTMLSourceElement_type_Setter(mthis, value) native "HTMLSourceElement_type_Setter";
+class BlinkHTMLStyleElement {
+  static $disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
 
-Native_HTMLStyleElement_disabled_Getter(mthis) native "HTMLStyleElement_disabled_Getter";
+  static $disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
 
-Native_HTMLStyleElement_disabled_Setter(mthis, value) native "HTMLStyleElement_disabled_Setter";
+  static $media_Getter(mthis) native "HTMLStyleElement_media_Getter";
 
-Native_HTMLStyleElement_media_Getter(mthis) native "HTMLStyleElement_media_Getter";
+  static $media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
 
-Native_HTMLStyleElement_media_Setter(mthis, value) native "HTMLStyleElement_media_Setter";
+  static $scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
 
-Native_HTMLStyleElement_scoped_Getter(mthis) native "HTMLStyleElement_scoped_Getter";
+  static $scoped_Setter(mthis, value) native "HTMLStyleElement_scoped_Setter";
 
-Native_HTMLStyleElement_scoped_Setter(mthis, value) native "HTMLStyleElement_scoped_Setter";
+  static $sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
 
-Native_HTMLStyleElement_sheet_Getter(mthis) native "HTMLStyleElement_sheet_Getter";
+  static $type_Getter(mthis) native "HTMLStyleElement_type_Getter";
 
-Native_HTMLStyleElement_type_Getter(mthis) native "HTMLStyleElement_type_Getter";
+  static $type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+}
 
-Native_HTMLStyleElement_type_Setter(mthis, value) native "HTMLStyleElement_type_Setter";
+class BlinkHTMLTableCaptionElement {}
 
-Native_HTMLTableCellElement_cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
+class BlinkHTMLTableCellElement {
+  static $cellIndex_Getter(mthis) native "HTMLTableCellElement_cellIndex_Getter";
 
-Native_HTMLTableCellElement_colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
+  static $colSpan_Getter(mthis) native "HTMLTableCellElement_colSpan_Getter";
 
-Native_HTMLTableCellElement_colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
+  static $colSpan_Setter(mthis, value) native "HTMLTableCellElement_colSpan_Setter";
 
-Native_HTMLTableCellElement_headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
+  static $headers_Getter(mthis) native "HTMLTableCellElement_headers_Getter";
 
-Native_HTMLTableCellElement_headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
+  static $headers_Setter(mthis, value) native "HTMLTableCellElement_headers_Setter";
 
-Native_HTMLTableCellElement_rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
+  static $rowSpan_Getter(mthis) native "HTMLTableCellElement_rowSpan_Getter";
 
-Native_HTMLTableCellElement_rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+  static $rowSpan_Setter(mthis, value) native "HTMLTableCellElement_rowSpan_Setter";
+}
 
-Native_HTMLTableColElement_span_Getter(mthis) native "HTMLTableColElement_span_Getter";
+class BlinkHTMLTableColElement {
+  static $span_Getter(mthis) native "HTMLTableColElement_span_Getter";
 
-Native_HTMLTableColElement_span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+  static $span_Setter(mthis, value) native "HTMLTableColElement_span_Setter";
+}
 
-Native_HTMLTableElement_caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
+class BlinkHTMLTableElement {
+  static $caption_Getter(mthis) native "HTMLTableElement_caption_Getter";
 
-Native_HTMLTableElement_caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
+  static $caption_Setter(mthis, value) native "HTMLTableElement_caption_Setter";
 
-Native_HTMLTableElement_rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
+  static $rows_Getter(mthis) native "HTMLTableElement_rows_Getter";
 
-Native_HTMLTableElement_tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
+  static $tBodies_Getter(mthis) native "HTMLTableElement_tBodies_Getter";
 
-Native_HTMLTableElement_tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
+  static $tFoot_Getter(mthis) native "HTMLTableElement_tFoot_Getter";
 
-Native_HTMLTableElement_tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
+  static $tFoot_Setter(mthis, value) native "HTMLTableElement_tFoot_Setter";
 
-Native_HTMLTableElement_tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
+  static $tHead_Getter(mthis) native "HTMLTableElement_tHead_Getter";
 
-Native_HTMLTableElement_tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
+  static $tHead_Setter(mthis, value) native "HTMLTableElement_tHead_Setter";
 
-Native_HTMLTableElement_createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback_RESOLVER_STRING_0_";
+  static $createCaption_Callback(mthis) native "HTMLTableElement_createCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback_RESOLVER_STRING_0_";
+  static $createTBody_Callback(mthis) native "HTMLTableElement_createTBody_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback_RESOLVER_STRING_0_";
+  static $createTFoot_Callback(mthis) native "HTMLTableElement_createTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback_RESOLVER_STRING_0_";
+  static $createTHead_Callback(mthis) native "HTMLTableElement_createTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback_RESOLVER_STRING_0_";
+  static $deleteCaption_Callback(mthis) native "HTMLTableElement_deleteCaption_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback_RESOLVER_STRING_1_long";
+  static $deleteRow_Callback(mthis, index) native "HTMLTableElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableElement_deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback_RESOLVER_STRING_0_";
+  static $deleteTFoot_Callback(mthis) native "HTMLTableElement_deleteTFoot_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback_RESOLVER_STRING_0_";
+  static $deleteTHead_Callback(mthis) native "HTMLTableElement_deleteTHead_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTableElement_insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback_RESOLVER_STRING_1_long";
+  static $insertRow_Callback(mthis, index) native "HTMLTableElement_insertRow_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTableRowElement_cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
+class BlinkHTMLTableRowElement {
+  static $cells_Getter(mthis) native "HTMLTableRowElement_cells_Getter";
 
-Native_HTMLTableRowElement_rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
+  static $rowIndex_Getter(mthis) native "HTMLTableRowElement_rowIndex_Getter";
 
-Native_HTMLTableRowElement_sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
+  static $sectionRowIndex_Getter(mthis) native "HTMLTableRowElement_sectionRowIndex_Getter";
 
-Native_HTMLTableRowElement_deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_RESOLVER_STRING_1_long";
+  static $deleteCell_Callback(mthis, index) native "HTMLTableRowElement_deleteCell_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableRowElement_insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback_RESOLVER_STRING_1_long";
+  static $insertCell_Callback(mthis, index) native "HTMLTableRowElement_insertCell_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTableSectionElement_rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
+class BlinkHTMLTableSectionElement {
+  static $rows_Getter(mthis) native "HTMLTableSectionElement_rows_Getter";
 
-Native_HTMLTableSectionElement_deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_RESOLVER_STRING_1_long";
+  static $deleteRow_Callback(mthis, index) native "HTMLTableSectionElement_deleteRow_Callback_RESOLVER_STRING_1_long";
 
-Native_HTMLTableSectionElement_insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_RESOLVER_STRING_1_long";
+  static $insertRow_Callback(mthis, index) native "HTMLTableSectionElement_insertRow_Callback_RESOLVER_STRING_1_long";
+}
 
-Native_HTMLTemplateElement_content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+class BlinkHTMLTemplateElement {
+  static $content_Getter(mthis) native "HTMLTemplateElement_content_Getter";
+}
 
-Native_HTMLTextAreaElement_autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
+class BlinkHTMLTextAreaElement {
+  static $autofocus_Getter(mthis) native "HTMLTextAreaElement_autofocus_Getter";
 
-Native_HTMLTextAreaElement_autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
+  static $autofocus_Setter(mthis, value) native "HTMLTextAreaElement_autofocus_Setter";
 
-Native_HTMLTextAreaElement_cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
+  static $cols_Getter(mthis) native "HTMLTextAreaElement_cols_Getter";
 
-Native_HTMLTextAreaElement_cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
+  static $cols_Setter(mthis, value) native "HTMLTextAreaElement_cols_Setter";
 
-Native_HTMLTextAreaElement_defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
+  static $defaultValue_Getter(mthis) native "HTMLTextAreaElement_defaultValue_Getter";
 
-Native_HTMLTextAreaElement_defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
+  static $defaultValue_Setter(mthis, value) native "HTMLTextAreaElement_defaultValue_Setter";
 
-Native_HTMLTextAreaElement_dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
+  static $dirName_Getter(mthis) native "HTMLTextAreaElement_dirName_Getter";
 
-Native_HTMLTextAreaElement_dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
+  static $dirName_Setter(mthis, value) native "HTMLTextAreaElement_dirName_Setter";
 
-Native_HTMLTextAreaElement_disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
+  static $disabled_Getter(mthis) native "HTMLTextAreaElement_disabled_Getter";
 
-Native_HTMLTextAreaElement_disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
+  static $disabled_Setter(mthis, value) native "HTMLTextAreaElement_disabled_Setter";
 
-Native_HTMLTextAreaElement_form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
+  static $form_Getter(mthis) native "HTMLTextAreaElement_form_Getter";
 
-Native_HTMLTextAreaElement_inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
+  static $inputMode_Getter(mthis) native "HTMLTextAreaElement_inputMode_Getter";
 
-Native_HTMLTextAreaElement_inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
+  static $inputMode_Setter(mthis, value) native "HTMLTextAreaElement_inputMode_Setter";
 
-Native_HTMLTextAreaElement_labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
+  static $labels_Getter(mthis) native "HTMLTextAreaElement_labels_Getter";
 
-Native_HTMLTextAreaElement_maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
+  static $maxLength_Getter(mthis) native "HTMLTextAreaElement_maxLength_Getter";
 
-Native_HTMLTextAreaElement_maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
+  static $maxLength_Setter(mthis, value) native "HTMLTextAreaElement_maxLength_Setter";
 
-Native_HTMLTextAreaElement_name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
+  static $name_Getter(mthis) native "HTMLTextAreaElement_name_Getter";
 
-Native_HTMLTextAreaElement_name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
+  static $name_Setter(mthis, value) native "HTMLTextAreaElement_name_Setter";
 
-Native_HTMLTextAreaElement_placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
+  static $placeholder_Getter(mthis) native "HTMLTextAreaElement_placeholder_Getter";
 
-Native_HTMLTextAreaElement_placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
+  static $placeholder_Setter(mthis, value) native "HTMLTextAreaElement_placeholder_Setter";
 
-Native_HTMLTextAreaElement_readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
+  static $readOnly_Getter(mthis) native "HTMLTextAreaElement_readOnly_Getter";
 
-Native_HTMLTextAreaElement_readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
+  static $readOnly_Setter(mthis, value) native "HTMLTextAreaElement_readOnly_Setter";
 
-Native_HTMLTextAreaElement_required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
+  static $required_Getter(mthis) native "HTMLTextAreaElement_required_Getter";
 
-Native_HTMLTextAreaElement_required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
+  static $required_Setter(mthis, value) native "HTMLTextAreaElement_required_Setter";
 
-Native_HTMLTextAreaElement_rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
+  static $rows_Getter(mthis) native "HTMLTextAreaElement_rows_Getter";
 
-Native_HTMLTextAreaElement_rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
+  static $rows_Setter(mthis, value) native "HTMLTextAreaElement_rows_Setter";
 
-Native_HTMLTextAreaElement_selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
+  static $selectionDirection_Getter(mthis) native "HTMLTextAreaElement_selectionDirection_Getter";
 
-Native_HTMLTextAreaElement_selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
+  static $selectionDirection_Setter(mthis, value) native "HTMLTextAreaElement_selectionDirection_Setter";
 
-Native_HTMLTextAreaElement_selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
+  static $selectionEnd_Getter(mthis) native "HTMLTextAreaElement_selectionEnd_Getter";
 
-Native_HTMLTextAreaElement_selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
+  static $selectionEnd_Setter(mthis, value) native "HTMLTextAreaElement_selectionEnd_Setter";
 
-Native_HTMLTextAreaElement_selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
+  static $selectionStart_Getter(mthis) native "HTMLTextAreaElement_selectionStart_Getter";
 
-Native_HTMLTextAreaElement_selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
+  static $selectionStart_Setter(mthis, value) native "HTMLTextAreaElement_selectionStart_Setter";
 
-Native_HTMLTextAreaElement_textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
+  static $textLength_Getter(mthis) native "HTMLTextAreaElement_textLength_Getter";
 
-Native_HTMLTextAreaElement_type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
+  static $type_Getter(mthis) native "HTMLTextAreaElement_type_Getter";
 
-Native_HTMLTextAreaElement_validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
+  static $validationMessage_Getter(mthis) native "HTMLTextAreaElement_validationMessage_Getter";
 
-Native_HTMLTextAreaElement_validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
+  static $validity_Getter(mthis) native "HTMLTextAreaElement_validity_Getter";
 
-Native_HTMLTextAreaElement_value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
+  static $value_Getter(mthis) native "HTMLTextAreaElement_value_Getter";
 
-Native_HTMLTextAreaElement_value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
+  static $value_Setter(mthis, value) native "HTMLTextAreaElement_value_Setter";
 
-Native_HTMLTextAreaElement_willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
+  static $willValidate_Getter(mthis) native "HTMLTextAreaElement_willValidate_Getter";
 
-Native_HTMLTextAreaElement_wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
+  static $wrap_Getter(mthis) native "HTMLTextAreaElement_wrap_Getter";
 
-Native_HTMLTextAreaElement_wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
+  static $wrap_Setter(mthis, value) native "HTMLTextAreaElement_wrap_Setter";
 
-Native_HTMLTextAreaElement_checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback_RESOLVER_STRING_0_";
+  static $checkValidity_Callback(mthis) native "HTMLTextAreaElement_checkValidity_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_select_Callback(mthis) native "HTMLTextAreaElement_select_Callback_RESOLVER_STRING_0_";
+  static $select_Callback(mthis) native "HTMLTextAreaElement_select_Callback_RESOLVER_STRING_0_";
 
-Native_HTMLTextAreaElement_setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
+  static $setCustomValidity_Callback(mthis, error) native "HTMLTextAreaElement_setCustomValidity_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_HTMLTextAreaElement_setRangeText(mthis, replacement, start, end, selectionMode) {
+  static $setRangeText(mthis, replacement, start, end, selectionMode) {
     if ((replacement is String || replacement == null) && start == null && end == null && selectionMode == null) {
-      Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement);
+      $_setRangeText_1_Callback(mthis, replacement);
       return;
     }
     if ((selectionMode is String || selectionMode == null) && (end is int || end == null) && (start is int || start == null) && (replacement is String || replacement == null)) {
-      Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
+      $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_HTMLTextAreaElement__setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setRangeText_1_Callback(mthis, replacement) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_HTMLTextAreaElement__setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
+  static $_setRangeText_2_Callback(mthis, replacement, start, end, selectionMode) native "HTMLTextAreaElement_setRangeText_Callback_RESOLVER_STRING_4_DOMString_unsigned long_unsigned long_DOMString";
 
   // Generated overload resolver
-Native_HTMLTextAreaElement_setSelectionRange(mthis, start, end, direction) {
+  static $setSelectionRange(mthis, start, end, direction) {
     if (direction != null) {
-      Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction);
+      $_setSelectionRange_1_Callback(mthis, start, end, direction);
       return;
     }
-    Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end);
+    $_setSelectionRange_2_Callback(mthis, start, end);
     return;
   }
 
-Native_HTMLTextAreaElement__setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
+  static $_setSelectionRange_1_Callback(mthis, start, end, direction) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_3_long_long_DOMString";
 
-Native_HTMLTextAreaElement__setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+  static $_setSelectionRange_2_Callback(mthis, start, end) native "HTMLTextAreaElement_setSelectionRange_Callback_RESOLVER_STRING_2_long_long";
+}
 
-Native_HTMLTrackElement_default_Getter(mthis) native "HTMLTrackElement_default_Getter";
+class BlinkHTMLTitleElement {}
 
-Native_HTMLTrackElement_default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
+class BlinkHTMLTrackElement {
+  static $default_Getter(mthis) native "HTMLTrackElement_default_Getter";
 
-Native_HTMLTrackElement_kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
+  static $default_Setter(mthis, value) native "HTMLTrackElement_default_Setter";
 
-Native_HTMLTrackElement_kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
+  static $kind_Getter(mthis) native "HTMLTrackElement_kind_Getter";
 
-Native_HTMLTrackElement_label_Getter(mthis) native "HTMLTrackElement_label_Getter";
+  static $kind_Setter(mthis, value) native "HTMLTrackElement_kind_Setter";
 
-Native_HTMLTrackElement_label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
+  static $label_Getter(mthis) native "HTMLTrackElement_label_Getter";
 
-Native_HTMLTrackElement_readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
+  static $label_Setter(mthis, value) native "HTMLTrackElement_label_Setter";
 
-Native_HTMLTrackElement_src_Getter(mthis) native "HTMLTrackElement_src_Getter";
+  static $readyState_Getter(mthis) native "HTMLTrackElement_readyState_Getter";
 
-Native_HTMLTrackElement_src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
+  static $src_Getter(mthis) native "HTMLTrackElement_src_Getter";
 
-Native_HTMLTrackElement_srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
+  static $src_Setter(mthis, value) native "HTMLTrackElement_src_Setter";
 
-Native_HTMLTrackElement_srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
+  static $srclang_Getter(mthis) native "HTMLTrackElement_srclang_Getter";
 
-Native_HTMLTrackElement_track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+  static $srclang_Setter(mthis, value) native "HTMLTrackElement_srclang_Setter";
 
-Native_HTMLVideoElement_height_Getter(mthis) native "HTMLVideoElement_height_Getter";
+  static $track_Getter(mthis) native "HTMLTrackElement_track_Getter";
+}
 
-Native_HTMLVideoElement_height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
+class BlinkHTMLUListElement {}
 
-Native_HTMLVideoElement_poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
+class BlinkHTMLUnknownElement {}
 
-Native_HTMLVideoElement_poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
+class BlinkHTMLVideoElement {
+  static $height_Getter(mthis) native "HTMLVideoElement_height_Getter";
 
-Native_HTMLVideoElement_videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
+  static $height_Setter(mthis, value) native "HTMLVideoElement_height_Setter";
 
-Native_HTMLVideoElement_videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
+  static $poster_Getter(mthis) native "HTMLVideoElement_poster_Getter";
 
-Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
+  static $poster_Setter(mthis, value) native "HTMLVideoElement_poster_Setter";
 
-Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
+  static $videoHeight_Getter(mthis) native "HTMLVideoElement_videoHeight_Getter";
 
-Native_HTMLVideoElement_width_Getter(mthis) native "HTMLVideoElement_width_Getter";
+  static $videoWidth_Getter(mthis) native "HTMLVideoElement_videoWidth_Getter";
 
-Native_HTMLVideoElement_width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
+  static $webkitDecodedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDecodedFrameCount_Getter";
 
-Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback_RESOLVER_STRING_0_";
+  static $webkitDroppedFrameCount_Getter(mthis) native "HTMLVideoElement_webkitDroppedFrameCount_Getter";
 
-Native_HTMLVideoElement_webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback_RESOLVER_STRING_0_";
+  static $width_Getter(mthis) native "HTMLVideoElement_width_Getter";
 
-Native_HTMLVideoElement_webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+  static $width_Setter(mthis, value) native "HTMLVideoElement_width_Setter";
 
-Native_HashChangeEvent_newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
+  static $getVideoPlaybackQuality_Callback(mthis) native "HTMLVideoElement_getVideoPlaybackQuality_Callback_RESOLVER_STRING_0_";
 
-Native_HashChangeEvent_oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
+  static $webkitEnterFullscreen_Callback(mthis) native "HTMLVideoElement_webkitEnterFullscreen_Callback_RESOLVER_STRING_0_";
 
-Native_HashChangeEvent_initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_DOMString_DOMString";
+  static $webkitExitFullscreen_Callback(mthis) native "HTMLVideoElement_webkitExitFullscreen_Callback_RESOLVER_STRING_0_";
+}
 
-Native_History_length_Getter(mthis) native "History_length_Getter";
+class BlinkHashChangeEvent {
+  static $newURL_Getter(mthis) native "HashChangeEvent_newURL_Getter";
 
-Native_History_state_Getter(mthis) native "History_state_Getter";
+  static $oldURL_Getter(mthis) native "HashChangeEvent_oldURL_Getter";
 
-Native_History_back_Callback(mthis) native "History_back_Callback_RESOLVER_STRING_0_";
+  static $initHashChangeEvent_Callback(mthis, type, canBubble, cancelable, oldURL, newURL) native "HashChangeEvent_initHashChangeEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_DOMString_DOMString";
+}
 
-Native_History_forward_Callback(mthis) native "History_forward_Callback_RESOLVER_STRING_0_";
+class BlinkHistory {
+  static $length_Getter(mthis) native "History_length_Getter";
 
-Native_History_go_Callback(mthis, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static $state_Getter(mthis) native "History_state_Getter";
 
-Native_History_pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
+  static $back_Callback(mthis) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_History_replaceState_Callback(mthis, data, title, url) native "History_replaceState_Callback";
+  static $forward_Callback(mthis) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_IDBCursor_direction_Getter(mthis) native "IDBCursor_direction_Getter";
+  static $go_Callback(mthis, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
 
-Native_IDBCursor_key_Getter(mthis) native "IDBCursor_key_Getter";
+  static $pushState_Callback(mthis, data, title, url) native "History_pushState_Callback";
 
-Native_IDBCursor_primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
+  static $replaceState_Callback(mthis, data, title, url) native "History_replaceState_Callback";
+}
 
-Native_IDBCursor_source_Getter(mthis) native "IDBCursor_source_Getter";
+class BlinkIDBCursor {
+  static $direction_Getter(mthis) native "IDBCursor_direction_Getter";
 
-Native_IDBCursor_advance_Callback(mthis, count) native "IDBCursor_advance_Callback_RESOLVER_STRING_1_unsigned long";
+  static $key_Getter(mthis) native "IDBCursor_key_Getter";
 
-Native_IDBCursor_continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $primaryKey_Getter(mthis) native "IDBCursor_primaryKey_Getter";
 
-Native_IDBCursor_delete_Callback(mthis) native "IDBCursor_delete_Callback_RESOLVER_STRING_0_";
+  static $source_Getter(mthis) native "IDBCursor_source_Getter";
 
-Native_IDBCursor_next_Callback(mthis, key) native "IDBCursor_continue_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $advance_Callback(mthis, count) native "IDBCursor_advance_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_IDBCursor_update_Callback(mthis, value) native "IDBCursor_update_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $continuePrimaryKey_Callback(mthis, key, primaryKey) native "IDBCursor_continuePrimaryKey_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBCursorWithValue_value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+  static $delete_Callback(mthis) native "IDBCursor_delete_Callback_RESOLVER_STRING_0_";
 
-Native_IDBDatabase_name_Getter(mthis) native "IDBDatabase_name_Getter";
+  static $next_Callback(mthis, key) native "IDBCursor_continue_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBDatabase_objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
+  static $update_Callback(mthis, value) native "IDBCursor_update_Callback_RESOLVER_STRING_1_ScriptValue";
+}
 
-Native_IDBDatabase_version_Getter(mthis) native "IDBDatabase_version_Getter";
+class BlinkIDBCursorWithValue {
+  static $value_Getter(mthis) native "IDBCursorWithValue_value_Getter";
+}
 
-Native_IDBDatabase_close_Callback(mthis) native "IDBDatabase_close_Callback_RESOLVER_STRING_0_";
+class BlinkIDBDatabase {
+  static $name_Getter(mthis) native "IDBDatabase_name_Getter";
 
-Native_IDBDatabase_createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $objectStoreNames_Getter(mthis) native "IDBDatabase_objectStoreNames_Getter";
 
-Native_IDBDatabase_deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_RESOLVER_STRING_1_DOMString";
+  static $version_Getter(mthis) native "IDBDatabase_version_Getter";
+
+  static $close_Callback(mthis) native "IDBDatabase_close_Callback_RESOLVER_STRING_0_";
+
+  static $createObjectStore_Callback(mthis, name, options) native "IDBDatabase_createObjectStore_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+
+  static $deleteObjectStore_Callback(mthis, name) native "IDBDatabase_deleteObjectStore_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_IDBDatabase_transaction(mthis, storeName_OR_storeNames, mode) {
+  static $transaction(mthis, storeName_OR_storeNames, mode) {
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_1_Callback(mthis, storeName_OR_storeNames, mode);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is List<String> || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_2_Callback(mthis, storeName_OR_storeNames, mode);
     }
     if ((mode is String || mode == null) && (storeName_OR_storeNames is String || storeName_OR_storeNames == null)) {
-      return Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
+      return $_transaction_3_Callback(mthis, storeName_OR_storeNames, mode);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBDatabase__transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+  static $_transaction_1_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
 
-Native_IDBDatabase__transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
+  static $_transaction_2_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase__transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_transaction_3_Callback(mthis, storeName_OR_storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
+  static $transactionList_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_sequence<DOMString>_DOMString";
 
-Native_IDBDatabase_transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $transactionStore_Callback(mthis, storeName, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_IDBDatabase_transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+  static $transactionStores_Callback(mthis, storeNames, mode) native "IDBDatabase_transaction_Callback_RESOLVER_STRING_2_DOMStringList_DOMString";
+}
 
-Native_IDBFactory_cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+class BlinkIDBFactory {
+  static $cmp_Callback(mthis, first, second) native "IDBFactory_cmp_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBFactory_deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteDatabase_Callback(mthis, name) native "IDBFactory_deleteDatabase_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_IDBFactory__open(mthis, name, version) {
+  static $_open(mthis, name, version) {
     if (version != null) {
-      return Native_IDBFactory__open_1_Callback(mthis, name, version);
+      return $_open_1_Callback(mthis, name, version);
     }
-    return Native_IDBFactory__open_2_Callback(mthis, name);
+    return $_open_2_Callback(mthis, name);
   }
 
-Native_IDBFactory__open_1_Callback(mthis, name, version) native "IDBFactory_open_Callback_RESOLVER_STRING_2_DOMString_unsigned long long";
+  static $_open_1_Callback(mthis, name, version) native "IDBFactory_open_Callback_RESOLVER_STRING_2_DOMString_unsigned long long";
 
-Native_IDBFactory__open_2_Callback(mthis, name) native "IDBFactory_open_Callback_RESOLVER_STRING_1_DOMString";
+  static $_open_2_Callback(mthis, name) native "IDBFactory_open_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBFactory_webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback_RESOLVER_STRING_0_";
+  static $webkitGetDatabaseNames_Callback(mthis) native "IDBFactory_webkitGetDatabaseNames_Callback_RESOLVER_STRING_0_";
+}
 
-Native_IDBIndex_keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
+class BlinkIDBIndex {
+  static $keyPath_Getter(mthis) native "IDBIndex_keyPath_Getter";
 
-Native_IDBIndex_multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
+  static $multiEntry_Getter(mthis) native "IDBIndex_multiEntry_Getter";
 
-Native_IDBIndex_name_Getter(mthis) native "IDBIndex_name_Getter";
+  static $name_Getter(mthis) native "IDBIndex_name_Getter";
 
-Native_IDBIndex_objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
+  static $objectStore_Getter(mthis) native "IDBIndex_objectStore_Getter";
 
-Native_IDBIndex_unique_Getter(mthis) native "IDBIndex_unique_Getter";
+  static $unique_Getter(mthis) native "IDBIndex_unique_Getter";
 
-Native_IDBIndex_count_Callback(mthis, key) native "IDBIndex_count_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $count_Callback(mthis, key) native "IDBIndex_count_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_get_Callback(mthis, key) native "IDBIndex_get_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $get_Callback(mthis, key) native "IDBIndex_get_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $getKey_Callback(mthis, key) native "IDBIndex_getKey_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBIndex_openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openCursor_Callback(mthis, key, direction) native "IDBIndex_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBIndex_openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openKeyCursor_Callback(mthis, key, direction) native "IDBIndex_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+}
 
-Native_IDBKeyRange_lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
+class BlinkIDBKeyRange {
+  static $lower_Getter(mthis) native "IDBKeyRange_lower_Getter";
 
-Native_IDBKeyRange_lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
+  static $lowerOpen_Getter(mthis) native "IDBKeyRange_lowerOpen_Getter";
 
-Native_IDBKeyRange_upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
+  static $upper_Getter(mthis) native "IDBKeyRange_upper_Getter";
 
-Native_IDBKeyRange_upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
+  static $upperOpen_Getter(mthis) native "IDBKeyRange_upperOpen_Getter";
 
-Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback_RESOLVER_STRING_4_ScriptValue_ScriptValue_boolean_boolean";
+  static $bound__Callback(lower, upper, lowerOpen, upperOpen) native "IDBKeyRange_bound_Callback_RESOLVER_STRING_4_ScriptValue_ScriptValue_boolean_boolean";
 
-Native_IDBKeyRange_lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+  static $lowerBound__Callback(bound, open) native "IDBKeyRange_lowerBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
 
-Native_IDBKeyRange_only__Callback(value) native "IDBKeyRange_only_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $only__Callback(value) native "IDBKeyRange_only_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBKeyRange_upperBound__Callback(bound, open) native "IDBKeyRange_upperBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+  static $upperBound__Callback(bound, open) native "IDBKeyRange_upperBound_Callback_RESOLVER_STRING_2_ScriptValue_boolean";
+}
 
-Native_IDBObjectStore_autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
+class BlinkIDBObjectStore {
+  static $autoIncrement_Getter(mthis) native "IDBObjectStore_autoIncrement_Getter";
 
-Native_IDBObjectStore_indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
+  static $indexNames_Getter(mthis) native "IDBObjectStore_indexNames_Getter";
 
-Native_IDBObjectStore_keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
+  static $keyPath_Getter(mthis) native "IDBObjectStore_keyPath_Getter";
 
-Native_IDBObjectStore_name_Getter(mthis) native "IDBObjectStore_name_Getter";
+  static $name_Getter(mthis) native "IDBObjectStore_name_Getter";
 
-Native_IDBObjectStore_transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
+  static $transaction_Getter(mthis) native "IDBObjectStore_transaction_Getter";
 
-Native_IDBObjectStore_add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $add_Callback(mthis, value, key) native "IDBObjectStore_add_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
 
-Native_IDBObjectStore_clear_Callback(mthis) native "IDBObjectStore_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "IDBObjectStore_clear_Callback_RESOLVER_STRING_0_";
 
-Native_IDBObjectStore_count_Callback(mthis, key) native "IDBObjectStore_count_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $count_Callback(mthis, key) native "IDBObjectStore_count_Callback_RESOLVER_STRING_1_ScriptValue";
 
   // Generated overload resolver
-Native_IDBObjectStore__createIndex(mthis, name, keyPath, options) {
+  static $_createIndex(mthis, name, keyPath, options) {
     if ((options is Map || options == null) && (keyPath is List<String> || keyPath == null) && (name is String || name == null)) {
-      return Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options);
+      return $_createIndex_1_Callback(mthis, name, keyPath, options);
     }
     if ((options is Map || options == null) && (keyPath is String || keyPath == null) && (name is String || name == null)) {
-      return Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options);
+      return $_createIndex_2_Callback(mthis, name, keyPath, options);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_IDBObjectStore__createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_sequence<DOMString>_Dictionary";
+  static $_createIndex_1_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_sequence<DOMString>_Dictionary";
 
-Native_IDBObjectStore__createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
+  static $_createIndex_2_Callback(mthis, name, keyPath, options) native "IDBObjectStore_createIndex_Callback_RESOLVER_STRING_3_DOMString_DOMString_Dictionary";
 
-Native_IDBObjectStore_delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $delete_Callback(mthis, key) native "IDBObjectStore_delete_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBObjectStore_deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteIndex_Callback(mthis, name) native "IDBObjectStore_deleteIndex_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_get_Callback(mthis, key) native "IDBObjectStore_get_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $get_Callback(mthis, key) native "IDBObjectStore_get_Callback_RESOLVER_STRING_1_ScriptValue";
 
-Native_IDBObjectStore_index_Callback(mthis, name) native "IDBObjectStore_index_Callback_RESOLVER_STRING_1_DOMString";
+  static $index_Callback(mthis, name) native "IDBObjectStore_index_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_IDBObjectStore_openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openCursor_Callback(mthis, key, direction) native "IDBObjectStore_openCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBObjectStore_openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
+  static $openKeyCursor_Callback(mthis, range, direction) native "IDBObjectStore_openKeyCursor_Callback_RESOLVER_STRING_2_ScriptValue_DOMString";
 
-Native_IDBObjectStore_put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+  static $put_Callback(mthis, value, key) native "IDBObjectStore_put_Callback_RESOLVER_STRING_2_ScriptValue_ScriptValue";
+}
 
-Native_IDBRequest_error_Getter(mthis) native "IDBRequest_error_Getter";
+class BlinkIDBRequest {
+  static $error_Getter(mthis) native "IDBRequest_error_Getter";
 
-Native_IDBRequest_readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
+  static $readyState_Getter(mthis) native "IDBRequest_readyState_Getter";
 
-Native_IDBRequest_result_Getter(mthis) native "IDBRequest_result_Getter";
+  static $result_Getter(mthis) native "IDBRequest_result_Getter";
 
-Native_IDBRequest_source_Getter(mthis) native "IDBRequest_source_Getter";
+  static $source_Getter(mthis) native "IDBRequest_source_Getter";
 
-Native_IDBRequest_transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+  static $transaction_Getter(mthis) native "IDBRequest_transaction_Getter";
+}
 
-Native_IDBTransaction_db_Getter(mthis) native "IDBTransaction_db_Getter";
+class BlinkIDBOpenDBRequest {}
 
-Native_IDBTransaction_error_Getter(mthis) native "IDBTransaction_error_Getter";
+class BlinkIDBTransaction {
+  static $db_Getter(mthis) native "IDBTransaction_db_Getter";
 
-Native_IDBTransaction_mode_Getter(mthis) native "IDBTransaction_mode_Getter";
+  static $error_Getter(mthis) native "IDBTransaction_error_Getter";
 
-Native_IDBTransaction_abort_Callback(mthis) native "IDBTransaction_abort_Callback_RESOLVER_STRING_0_";
+  static $mode_Getter(mthis) native "IDBTransaction_mode_Getter";
 
-Native_IDBTransaction_objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback_RESOLVER_STRING_1_DOMString";
+  static $abort_Callback(mthis) native "IDBTransaction_abort_Callback_RESOLVER_STRING_0_";
 
-Native_IDBVersionChangeEvent_dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
+  static $objectStore_Callback(mthis, name) native "IDBTransaction_objectStore_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_IDBVersionChangeEvent_dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
+class BlinkIDBVersionChangeEvent {
+  static $dataLoss_Getter(mthis) native "IDBVersionChangeEvent_dataLoss_Getter";
 
-Native_IDBVersionChangeEvent_newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
+  static $dataLossMessage_Getter(mthis) native "IDBVersionChangeEvent_dataLossMessage_Getter";
 
-Native_IDBVersionChangeEvent_oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+  static $newVersion_Getter(mthis) native "IDBVersionChangeEvent_newVersion_Getter";
 
-Native_ImageBitmap_height_Getter(mthis) native "ImageBitmap_height_Getter";
+  static $oldVersion_Getter(mthis) native "IDBVersionChangeEvent_oldVersion_Getter";
+}
 
-Native_ImageBitmap_width_Getter(mthis) native "ImageBitmap_width_Getter";
+class BlinkImageBitmap {
+  static $height_Getter(mthis) native "ImageBitmap_height_Getter";
 
-Native_ImageData_data_Getter(mthis) native "ImageData_data_Getter";
+  static $width_Getter(mthis) native "ImageBitmap_width_Getter";
+}
 
-Native_ImageData_height_Getter(mthis) native "ImageData_height_Getter";
+class BlinkImageData {
+  static $data_Getter(mthis) native "ImageData_data_Getter";
 
-Native_ImageData_width_Getter(mthis) native "ImageData_width_Getter";
+  static $height_Getter(mthis) native "ImageData_height_Getter";
 
-Native_InjectedScriptHost_inspect_Callback(mthis, objectId, hints) native "InjectedScriptHost_inspect_Callback";
+  static $width_Getter(mthis) native "ImageData_width_Getter";
+}
 
-Native_InputMethodContext_compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
+class BlinkInjectedScriptHost {
+  static $inspect_Callback(mthis, objectId, hints) native "InjectedScriptHost_inspect_Callback";
+}
 
-Native_InputMethodContext_compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
+class BlinkInputMethodContext {
+  static $compositionEndOffset_Getter(mthis) native "InputMethodContext_compositionEndOffset_Getter";
 
-Native_InputMethodContext_locale_Getter(mthis) native "InputMethodContext_locale_Getter";
+  static $compositionStartOffset_Getter(mthis) native "InputMethodContext_compositionStartOffset_Getter";
 
-Native_InputMethodContext_target_Getter(mthis) native "InputMethodContext_target_Getter";
+  static $locale_Getter(mthis) native "InputMethodContext_locale_Getter";
 
-Native_InputMethodContext_confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback_RESOLVER_STRING_0_";
+  static $target_Getter(mthis) native "InputMethodContext_target_Getter";
 
-Native_InstallPhaseEvent_waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback_RESOLVER_STRING_1_ScriptValue";
+  static $confirmComposition_Callback(mthis) native "InputMethodContext_confirmComposition_Callback_RESOLVER_STRING_0_";
+}
 
-Native_InstallEvent_replace_Callback(mthis) native "InstallEvent_replace_Callback_RESOLVER_STRING_0_";
+class BlinkInstallPhaseEvent {
+  static $waitUntil_Callback(mthis, value) native "InstallPhaseEvent_waitUntil_Callback_RESOLVER_STRING_1_ScriptValue";
+}
 
-Native_Key_algorithm_Getter(mthis) native "Key_algorithm_Getter";
+class BlinkInstallEvent {
+  static $replace_Callback(mthis) native "InstallEvent_replace_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Key_extractable_Getter(mthis) native "Key_extractable_Getter";
+class BlinkKey {
+  static $algorithm_Getter(mthis) native "Key_algorithm_Getter";
 
-Native_Key_type_Getter(mthis) native "Key_type_Getter";
+  static $extractable_Getter(mthis) native "Key_extractable_Getter";
 
-Native_Key_usages_Getter(mthis) native "Key_usages_Getter";
+  static $type_Getter(mthis) native "Key_type_Getter";
 
-Native_KeyPair_privateKey_Getter(mthis) native "KeyPair_privateKey_Getter";
+  static $usages_Getter(mthis) native "Key_usages_Getter";
+}
+
+class BlinkKeyPair {
+  static $privateKey_Getter(mthis) native "KeyPair_privateKey_Getter";
+
+  static $publicKey_Getter(mthis) native "KeyPair_publicKey_Getter";
+}
 
-Native_KeyPair_publicKey_Getter(mthis) native "KeyPair_publicKey_Getter";
+class BlinkKeyboardEvent {
+  static $altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
 
-Native_KeyboardEvent_altGraphKey_Getter(mthis) native "KeyboardEvent_altGraphKey_Getter";
+  static $altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
 
-Native_KeyboardEvent_altKey_Getter(mthis) native "KeyboardEvent_altKey_Getter";
+  static $ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
 
-Native_KeyboardEvent_ctrlKey_Getter(mthis) native "KeyboardEvent_ctrlKey_Getter";
+  static $keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
 
-Native_KeyboardEvent_keyIdentifier_Getter(mthis) native "KeyboardEvent_keyIdentifier_Getter";
+  static $keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
 
-Native_KeyboardEvent_keyLocation_Getter(mthis) native "KeyboardEvent_keyLocation_Getter";
+  static $location_Getter(mthis) native "KeyboardEvent_location_Getter";
 
-Native_KeyboardEvent_location_Getter(mthis) native "KeyboardEvent_location_Getter";
+  static $metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
 
-Native_KeyboardEvent_metaKey_Getter(mthis) native "KeyboardEvent_metaKey_Getter";
+  static $repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
 
-Native_KeyboardEvent_repeat_Getter(mthis) native "KeyboardEvent_repeat_Getter";
+  static $shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
 
-Native_KeyboardEvent_shiftKey_Getter(mthis) native "KeyboardEvent_shiftKey_Getter";
+  static $getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_KeyboardEvent_getModifierState_Callback(mthis, keyArgument) native "KeyboardEvent_getModifierState_Callback_RESOLVER_STRING_1_DOMString";
+  static $initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback_RESOLVER_STRING_11_DOMString_boolean_boolean_Window_DOMString_unsigned long_boolean_boolean_boolean_boolean_boolean";
+}
 
-Native_KeyboardEvent_initKeyboardEvent_Callback(mthis, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey) native "KeyboardEvent_initKeyboardEvent_Callback_RESOLVER_STRING_11_DOMString_boolean_boolean_Window_DOMString_unsigned long_boolean_boolean_boolean_boolean_boolean";
+class BlinkLocation {
+  static $ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
 
-Native_Location_ancestorOrigins_Getter(mthis) native "Location_ancestorOrigins_Getter";
+  static $hash_Getter(mthis) native "Location_hash_Getter";
 
-Native_Location_hash_Getter(mthis) native "Location_hash_Getter";
+  static $hash_Setter(mthis, value) native "Location_hash_Setter";
 
-Native_Location_hash_Setter(mthis, value) native "Location_hash_Setter";
+  static $host_Getter(mthis) native "Location_host_Getter";
 
-Native_Location_host_Getter(mthis) native "Location_host_Getter";
+  static $host_Setter(mthis, value) native "Location_host_Setter";
 
-Native_Location_host_Setter(mthis, value) native "Location_host_Setter";
+  static $hostname_Getter(mthis) native "Location_hostname_Getter";
 
-Native_Location_hostname_Getter(mthis) native "Location_hostname_Getter";
+  static $hostname_Setter(mthis, value) native "Location_hostname_Setter";
 
-Native_Location_hostname_Setter(mthis, value) native "Location_hostname_Setter";
+  static $href_Getter(mthis) native "Location_href_Getter";
 
-Native_Location_href_Getter(mthis) native "Location_href_Getter";
+  static $href_Setter(mthis, value) native "Location_href_Setter";
 
-Native_Location_href_Setter(mthis, value) native "Location_href_Setter";
+  static $origin_Getter(mthis) native "Location_origin_Getter";
 
-Native_Location_origin_Getter(mthis) native "Location_origin_Getter";
+  static $pathname_Getter(mthis) native "Location_pathname_Getter";
 
-Native_Location_pathname_Getter(mthis) native "Location_pathname_Getter";
+  static $pathname_Setter(mthis, value) native "Location_pathname_Setter";
 
-Native_Location_pathname_Setter(mthis, value) native "Location_pathname_Setter";
+  static $port_Getter(mthis) native "Location_port_Getter";
 
-Native_Location_port_Getter(mthis) native "Location_port_Getter";
+  static $port_Setter(mthis, value) native "Location_port_Setter";
 
-Native_Location_port_Setter(mthis, value) native "Location_port_Setter";
+  static $protocol_Getter(mthis) native "Location_protocol_Getter";
 
-Native_Location_protocol_Getter(mthis) native "Location_protocol_Getter";
+  static $protocol_Setter(mthis, value) native "Location_protocol_Setter";
 
-Native_Location_protocol_Setter(mthis, value) native "Location_protocol_Setter";
+  static $search_Getter(mthis) native "Location_search_Getter";
 
-Native_Location_search_Getter(mthis) native "Location_search_Getter";
+  static $search_Setter(mthis, value) native "Location_search_Setter";
 
-Native_Location_search_Setter(mthis, value) native "Location_search_Setter";
+  static $assign_Callback(mthis, url) native "Location_assign_Callback";
 
-Native_Location_assign_Callback(mthis, url) native "Location_assign_Callback";
+  static $reload_Callback(mthis) native "Location_reload_Callback";
 
-Native_Location_reload_Callback(mthis) native "Location_reload_Callback";
+  static $replace_Callback(mthis, url) native "Location_replace_Callback";
 
-Native_Location_replace_Callback(mthis, url) native "Location_replace_Callback";
+  static $toString_Callback(mthis) native "Location_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Location_toString_Callback(mthis) native "Location_toString_Callback_RESOLVER_STRING_0_";
+class BlinkMIDIAccess {
+  static $inputs_Callback(mthis) native "MIDIAccess_inputs_Callback_RESOLVER_STRING_0_";
 
-Native_MIDIAccess_inputs_Callback(mthis) native "MIDIAccess_inputs_Callback_RESOLVER_STRING_0_";
+  static $outputs_Callback(mthis) native "MIDIAccess_outputs_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MIDIAccess_outputs_Callback(mthis) native "MIDIAccess_outputs_Callback_RESOLVER_STRING_0_";
+class BlinkMIDIAccessPromise {
+  static $then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_RESOLVER_STRING_2_MIDISuccessCallback_MIDIErrorCallback";
+}
 
-Native_MIDIAccessPromise_then_Callback(mthis, successCallback, errorCallback) native "MIDIAccessPromise_then_Callback_RESOLVER_STRING_2_MIDISuccessCallback_MIDIErrorCallback";
+class BlinkMIDIConnectionEvent {
+  static $port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+}
 
-Native_MIDIConnectionEvent_port_Getter(mthis) native "MIDIConnectionEvent_port_Getter";
+class BlinkMIDIPort {
+  static $id_Getter(mthis) native "MIDIPort_id_Getter";
 
-Native_MIDIPort_id_Getter(mthis) native "MIDIPort_id_Getter";
+  static $manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
 
-Native_MIDIPort_manufacturer_Getter(mthis) native "MIDIPort_manufacturer_Getter";
+  static $name_Getter(mthis) native "MIDIPort_name_Getter";
 
-Native_MIDIPort_name_Getter(mthis) native "MIDIPort_name_Getter";
+  static $type_Getter(mthis) native "MIDIPort_type_Getter";
 
-Native_MIDIPort_type_Getter(mthis) native "MIDIPort_type_Getter";
+  static $version_Getter(mthis) native "MIDIPort_version_Getter";
+}
 
-Native_MIDIPort_version_Getter(mthis) native "MIDIPort_version_Getter";
+class BlinkMIDIInput {}
 
-Native_MIDIMessageEvent_data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
+class BlinkMIDIMessageEvent {
+  static $data_Getter(mthis) native "MIDIMessageEvent_data_Getter";
 
-Native_MIDIMessageEvent_receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+  static $receivedTime_Getter(mthis) native "MIDIMessageEvent_receivedTime_Getter";
+}
 
+class BlinkMIDIOutput {
   // Generated overload resolver
-Native_MIDIOutput_send(mthis, data, timestamp) {
+  static $send(mthis, data, timestamp) {
     if (timestamp != null) {
-      Native_MIDIOutput__send_1_Callback(mthis, data, timestamp);
+      $_send_1_Callback(mthis, data, timestamp);
       return;
     }
-    Native_MIDIOutput__send_2_Callback(mthis, data);
+    $_send_2_Callback(mthis, data);
     return;
   }
 
-Native_MIDIOutput__send_1_Callback(mthis, data, timestamp) native "MIDIOutput_send_Callback_RESOLVER_STRING_2_Uint8Array_double";
+  static $_send_1_Callback(mthis, data, timestamp) native "MIDIOutput_send_Callback_RESOLVER_STRING_2_Uint8Array_double";
 
-Native_MIDIOutput__send_2_Callback(mthis, data) native "MIDIOutput_send_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $_send_2_Callback(mthis, data) native "MIDIOutput_send_Callback_RESOLVER_STRING_1_Uint8Array";
+}
 
+class BlinkMediaController {
   // Generated overload resolver
-Native_MediaController_MediaController() {
-    return Native_MediaController__create_1constructorCallback();
+  static $mkMediaController() {
+    return $_create_1constructorCallback();
   }
 
-Native_MediaController__create_1constructorCallback() native "MediaController_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaController_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaController_buffered_Getter(mthis) native "MediaController_buffered_Getter";
+  static $buffered_Getter(mthis) native "MediaController_buffered_Getter";
 
-Native_MediaController_currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
+  static $currentTime_Getter(mthis) native "MediaController_currentTime_Getter";
 
-Native_MediaController_currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
+  static $currentTime_Setter(mthis, value) native "MediaController_currentTime_Setter";
 
-Native_MediaController_defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
+  static $defaultPlaybackRate_Getter(mthis) native "MediaController_defaultPlaybackRate_Getter";
 
-Native_MediaController_defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
+  static $defaultPlaybackRate_Setter(mthis, value) native "MediaController_defaultPlaybackRate_Setter";
 
-Native_MediaController_duration_Getter(mthis) native "MediaController_duration_Getter";
+  static $duration_Getter(mthis) native "MediaController_duration_Getter";
 
-Native_MediaController_muted_Getter(mthis) native "MediaController_muted_Getter";
+  static $muted_Getter(mthis) native "MediaController_muted_Getter";
 
-Native_MediaController_muted_Setter(mthis, value) native "MediaController_muted_Setter";
+  static $muted_Setter(mthis, value) native "MediaController_muted_Setter";
 
-Native_MediaController_paused_Getter(mthis) native "MediaController_paused_Getter";
+  static $paused_Getter(mthis) native "MediaController_paused_Getter";
 
-Native_MediaController_playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "MediaController_playbackRate_Getter";
 
-Native_MediaController_playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "MediaController_playbackRate_Setter";
 
-Native_MediaController_playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
+  static $playbackState_Getter(mthis) native "MediaController_playbackState_Getter";
 
-Native_MediaController_played_Getter(mthis) native "MediaController_played_Getter";
+  static $played_Getter(mthis) native "MediaController_played_Getter";
 
-Native_MediaController_seekable_Getter(mthis) native "MediaController_seekable_Getter";
+  static $seekable_Getter(mthis) native "MediaController_seekable_Getter";
 
-Native_MediaController_volume_Getter(mthis) native "MediaController_volume_Getter";
+  static $volume_Getter(mthis) native "MediaController_volume_Getter";
 
-Native_MediaController_volume_Setter(mthis, value) native "MediaController_volume_Setter";
+  static $volume_Setter(mthis, value) native "MediaController_volume_Setter";
 
-Native_MediaController_pause_Callback(mthis) native "MediaController_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "MediaController_pause_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_play_Callback(mthis) native "MediaController_play_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "MediaController_play_Callback_RESOLVER_STRING_0_";
 
-Native_MediaController_unpause_Callback(mthis) native "MediaController_unpause_Callback_RESOLVER_STRING_0_";
+  static $unpause_Callback(mthis) native "MediaController_unpause_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaElementAudioSourceNode_mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+class BlinkMediaElementAudioSourceNode {
+  static $mediaElement_Getter(mthis) native "MediaElementAudioSourceNode_mediaElement_Getter";
+}
 
-Native_MediaError_code_Getter(mthis) native "MediaError_code_Getter";
+class BlinkMediaError {
+  static $code_Getter(mthis) native "MediaError_code_Getter";
+}
 
-Native_MediaKeyError_code_Getter(mthis) native "MediaKeyError_code_Getter";
+class BlinkMediaKeyError {
+  static $code_Getter(mthis) native "MediaKeyError_code_Getter";
 
-Native_MediaKeyError_systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+  static $systemCode_Getter(mthis) native "MediaKeyError_systemCode_Getter";
+}
 
-Native_MediaKeyEvent_defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
+class BlinkMediaKeyEvent {
+  static $defaultURL_Getter(mthis) native "MediaKeyEvent_defaultURL_Getter";
 
-Native_MediaKeyEvent_errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
+  static $errorCode_Getter(mthis) native "MediaKeyEvent_errorCode_Getter";
 
-Native_MediaKeyEvent_initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
+  static $initData_Getter(mthis) native "MediaKeyEvent_initData_Getter";
 
-Native_MediaKeyEvent_keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeyEvent_keySystem_Getter";
 
-Native_MediaKeyEvent_message_Getter(mthis) native "MediaKeyEvent_message_Getter";
+  static $message_Getter(mthis) native "MediaKeyEvent_message_Getter";
 
-Native_MediaKeyEvent_sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
+  static $sessionId_Getter(mthis) native "MediaKeyEvent_sessionId_Getter";
 
-Native_MediaKeyEvent_systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+  static $systemCode_Getter(mthis) native "MediaKeyEvent_systemCode_Getter";
+}
 
-Native_MediaKeyMessageEvent_destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
+class BlinkMediaKeyMessageEvent {
+  static $destinationURL_Getter(mthis) native "MediaKeyMessageEvent_destinationURL_Getter";
 
-Native_MediaKeyMessageEvent_message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+  static $message_Getter(mthis) native "MediaKeyMessageEvent_message_Getter";
+}
 
-Native_MediaKeyNeededEvent_contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
+class BlinkMediaKeyNeededEvent {
+  static $contentType_Getter(mthis) native "MediaKeyNeededEvent_contentType_Getter";
 
-Native_MediaKeyNeededEvent_initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+  static $initData_Getter(mthis) native "MediaKeyNeededEvent_initData_Getter";
+}
 
-Native_MediaKeySession_error_Getter(mthis) native "MediaKeySession_error_Getter";
+class BlinkMediaKeySession {
+  static $error_Getter(mthis) native "MediaKeySession_error_Getter";
 
-Native_MediaKeySession_keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeySession_keySystem_Getter";
 
-Native_MediaKeySession_sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
+  static $sessionId_Getter(mthis) native "MediaKeySession_sessionId_Getter";
 
-Native_MediaKeySession_release_Callback(mthis) native "MediaKeySession_release_Callback_RESOLVER_STRING_0_";
+  static $release_Callback(mthis) native "MediaKeySession_release_Callback_RESOLVER_STRING_0_";
 
-Native_MediaKeySession_update_Callback(mthis, response) native "MediaKeySession_update_Callback_RESOLVER_STRING_1_Uint8Array";
+  static $update_Callback(mthis, response) native "MediaKeySession_update_Callback_RESOLVER_STRING_1_Uint8Array";
+}
 
+class BlinkMediaKeys {
   // Generated overload resolver
-Native_MediaKeys_MediaKeys(keySystem) {
-    return Native_MediaKeys__create_1constructorCallback(keySystem);
+  static $mkMediaKeys(keySystem) {
+    return $_create_1constructorCallback(keySystem);
   }
 
-Native_MediaKeys__create_1constructorCallback(keySystem) native "MediaKeys_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(keySystem) native "MediaKeys_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaKeys_keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
+  static $keySystem_Getter(mthis) native "MediaKeys_keySystem_Getter";
 
-Native_MediaKeys_createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+  static $createSession_Callback(mthis, type, initData) native "MediaKeys_createSession_Callback_RESOLVER_STRING_2_DOMString_Uint8Array";
+}
 
-Native_MediaList_length_Getter(mthis) native "MediaList_length_Getter";
+class BlinkMediaList {
+  static $length_Getter(mthis) native "MediaList_length_Getter";
 
-Native_MediaList_mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
+  static $mediaText_Getter(mthis) native "MediaList_mediaText_Getter";
 
-Native_MediaList_mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
+  static $mediaText_Setter(mthis, value) native "MediaList_mediaText_Setter";
 
-Native_MediaList_appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $appendMedium_Callback(mthis, newMedium) native "MediaList_appendMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $deleteMedium_Callback(mthis, oldMedium) native "MediaList_deleteMedium_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaList_item_Callback(mthis, index) native "MediaList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "MediaList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_MediaQueryList_matches_Getter(mthis) native "MediaQueryList_matches_Getter";
+class BlinkMediaQueryList {
+  static $matches_Getter(mthis) native "MediaQueryList_matches_Getter";
 
-Native_MediaQueryList_media_Getter(mthis) native "MediaQueryList_media_Getter";
+  static $media_Getter(mthis) native "MediaQueryList_media_Getter";
+}
 
+class BlinkMediaSource {
   // Generated overload resolver
-Native_MediaSource_MediaSource() {
-    return Native_MediaSource__create_1constructorCallback();
+  static $mkMediaSource() {
+    return $_create_1constructorCallback();
   }
 
-Native_MediaSource__create_1constructorCallback() native "MediaSource_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaSource_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaSource_activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
+  static $activeSourceBuffers_Getter(mthis) native "MediaSource_activeSourceBuffers_Getter";
 
-Native_MediaSource_duration_Getter(mthis) native "MediaSource_duration_Getter";
+  static $duration_Getter(mthis) native "MediaSource_duration_Getter";
 
-Native_MediaSource_duration_Setter(mthis, value) native "MediaSource_duration_Setter";
+  static $duration_Setter(mthis, value) native "MediaSource_duration_Setter";
 
-Native_MediaSource_readyState_Getter(mthis) native "MediaSource_readyState_Getter";
+  static $readyState_Getter(mthis) native "MediaSource_readyState_Getter";
 
-Native_MediaSource_sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
+  static $sourceBuffers_Getter(mthis) native "MediaSource_sourceBuffers_Getter";
 
-Native_MediaSource_addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback_RESOLVER_STRING_1_DOMString";
+  static $addSourceBuffer_Callback(mthis, type) native "MediaSource_addSourceBuffer_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_MediaSource_endOfStream(mthis, error) {
+  static $endOfStream(mthis, error) {
     if (error != null) {
-      Native_MediaSource__endOfStream_1_Callback(mthis, error);
+      $_endOfStream_1_Callback(mthis, error);
       return;
     }
-    Native_MediaSource__endOfStream_2_Callback(mthis);
+    $_endOfStream_2_Callback(mthis);
     return;
   }
 
-Native_MediaSource__endOfStream_1_Callback(mthis, error) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_1_DOMString";
+  static $_endOfStream_1_Callback(mthis, error) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaSource__endOfStream_2_Callback(mthis) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_0_";
+  static $_endOfStream_2_Callback(mthis) native "MediaSource_endOfStream_Callback_RESOLVER_STRING_0_";
 
-Native_MediaSource_isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback_RESOLVER_STRING_1_DOMString";
+  static $isTypeSupported_Callback(type) native "MediaSource_isTypeSupported_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaSource_removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback_RESOLVER_STRING_1_SourceBuffer";
+  static $removeSourceBuffer_Callback(mthis, buffer) native "MediaSource_removeSourceBuffer_Callback_RESOLVER_STRING_1_SourceBuffer";
+}
 
+class BlinkMediaStream {
   // Generated overload resolver
-Native_MediaStream_MediaStream(stream_OR_tracks) {
+  static $mkMediaStream(stream_OR_tracks) {
     if (stream_OR_tracks == null) {
-      return Native_MediaStream__create_1constructorCallback();
+      return $_create_1constructorCallback();
     }
     if ((stream_OR_tracks is MediaStream || stream_OR_tracks == null)) {
-      return Native_MediaStream__create_2constructorCallback(stream_OR_tracks);
+      return $_create_2constructorCallback(stream_OR_tracks);
     }
     if ((stream_OR_tracks is List<MediaStreamTrack> || stream_OR_tracks == null)) {
-      return Native_MediaStream__create_3constructorCallback(stream_OR_tracks);
+      return $_create_3constructorCallback(stream_OR_tracks);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_MediaStream__create_1constructorCallback() native "MediaStream_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "MediaStream_constructorCallback_RESOLVER_STRING_0_";
 
-Native_MediaStream__create_2constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStream";
+  static $_create_2constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStream";
 
-Native_MediaStream__create_3constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStreamTrack[]";
+  static $_create_3constructorCallback(stream_OR_tracks) native "MediaStream_constructorCallback_RESOLVER_STRING_1_MediaStreamTrack[]";
 
-Native_MediaStream_ended_Getter(mthis) native "MediaStream_ended_Getter";
+  static $ended_Getter(mthis) native "MediaStream_ended_Getter";
 
-Native_MediaStream_id_Getter(mthis) native "MediaStream_id_Getter";
+  static $id_Getter(mthis) native "MediaStream_id_Getter";
 
-Native_MediaStream_label_Getter(mthis) native "MediaStream_label_Getter";
+  static $label_Getter(mthis) native "MediaStream_label_Getter";
 
-Native_MediaStream_addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $addTrack_Callback(mthis, track) native "MediaStream_addTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback_RESOLVER_STRING_0_";
+  static $getAudioTracks_Callback(mthis) native "MediaStream_getAudioTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getTrackById_Callback(mthis, trackId) native "MediaStream_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MediaStream_getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback_RESOLVER_STRING_0_";
+  static $getVideoTracks_Callback(mthis) native "MediaStream_getVideoTracks_Callback_RESOLVER_STRING_0_";
 
-Native_MediaStream_removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $removeTrack_Callback(mthis, track) native "MediaStream_removeTrack_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_MediaStream_stop_Callback(mthis) native "MediaStream_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "MediaStream_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaStreamAudioDestinationNode_stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+class BlinkMediaStreamAudioDestinationNode {
+  static $stream_Getter(mthis) native "MediaStreamAudioDestinationNode_stream_Getter";
+}
 
-Native_MediaStreamAudioSourceNode_mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+class BlinkMediaStreamAudioSourceNode {
+  static $mediaStream_Getter(mthis) native "MediaStreamAudioSourceNode_mediaStream_Getter";
+}
 
-Native_MediaStreamEvent_stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+class BlinkMediaStreamEvent {
+  static $stream_Getter(mthis) native "MediaStreamEvent_stream_Getter";
+}
 
-Native_MediaStreamTrack_enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
+class BlinkMediaStreamTrack {
+  static $enabled_Getter(mthis) native "MediaStreamTrack_enabled_Getter";
 
-Native_MediaStreamTrack_enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
+  static $enabled_Setter(mthis, value) native "MediaStreamTrack_enabled_Setter";
 
-Native_MediaStreamTrack_id_Getter(mthis) native "MediaStreamTrack_id_Getter";
+  static $id_Getter(mthis) native "MediaStreamTrack_id_Getter";
 
-Native_MediaStreamTrack_kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
+  static $kind_Getter(mthis) native "MediaStreamTrack_kind_Getter";
 
-Native_MediaStreamTrack_label_Getter(mthis) native "MediaStreamTrack_label_Getter";
+  static $label_Getter(mthis) native "MediaStreamTrack_label_Getter";
 
-Native_MediaStreamTrack_readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
+  static $readyState_Getter(mthis) native "MediaStreamTrack_readyState_Getter";
 
-Native_MediaStreamTrack_getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback_RESOLVER_STRING_1_MediaStreamTrackSourcesCallback";
+  static $getSources_Callback(callback) native "MediaStreamTrack_getSources_Callback_RESOLVER_STRING_1_MediaStreamTrackSourcesCallback";
 
-Native_MediaStreamTrack_stop_Callback(mthis) native "MediaStreamTrack_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "MediaStreamTrack_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MediaStreamTrackEvent_track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+class BlinkMediaStreamTrackEvent {
+  static $track_Getter(mthis) native "MediaStreamTrackEvent_track_Getter";
+}
 
-Native_MemoryInfo_jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
+class BlinkMemoryInfo {
+  static $jsHeapSizeLimit_Getter(mthis) native "MemoryInfo_jsHeapSizeLimit_Getter";
 
-Native_MemoryInfo_totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
+  static $totalJSHeapSize_Getter(mthis) native "MemoryInfo_totalJSHeapSize_Getter";
 
-Native_MemoryInfo_usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+  static $usedJSHeapSize_Getter(mthis) native "MemoryInfo_usedJSHeapSize_Getter";
+}
 
-Native_MessageChannel_port1_Getter(mthis) native "MessageChannel_port1_Getter";
+class BlinkMessageChannel {
+  static $port1_Getter(mthis) native "MessageChannel_port1_Getter";
 
-Native_MessageChannel_port2_Getter(mthis) native "MessageChannel_port2_Getter";
+  static $port2_Getter(mthis) native "MessageChannel_port2_Getter";
+}
 
-Native_MessageEvent_data_Getter(mthis) native "MessageEvent_data_Getter";
+class BlinkMessageEvent {
+  static $data_Getter(mthis) native "MessageEvent_data_Getter";
 
-Native_MessageEvent_lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
+  static $lastEventId_Getter(mthis) native "MessageEvent_lastEventId_Getter";
 
-Native_MessageEvent_origin_Getter(mthis) native "MessageEvent_origin_Getter";
+  static $origin_Getter(mthis) native "MessageEvent_origin_Getter";
 
-Native_MessageEvent_source_Getter(mthis) native "MessageEvent_source_Getter";
+  static $source_Getter(mthis) native "MessageEvent_source_Getter";
 
-Native_MessageEvent_initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
+  static $initMessageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts) native "MessageEvent_initMessageEvent_Callback";
+}
 
-Native_MessagePort_close_Callback(mthis) native "MessagePort_close_Callback_RESOLVER_STRING_0_";
+class BlinkMessagePort {
+  static $close_Callback(mthis) native "MessagePort_close_Callback_RESOLVER_STRING_0_";
 
-Native_MessagePort_postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, messagePorts) native "MessagePort_postMessage_Callback";
 
-Native_MessagePort_start_Callback(mthis) native "MessagePort_start_Callback_RESOLVER_STRING_0_";
+  static $start_Callback(mthis) native "MessagePort_start_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Metadata_modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
+class BlinkMetadata {
+  static $modificationTime_Getter(mthis) native "Metadata_modificationTime_Getter";
 
-Native_Metadata_size_Getter(mthis) native "Metadata_size_Getter";
+  static $size_Getter(mthis) native "Metadata_size_Getter";
+}
 
-Native_MimeType_description_Getter(mthis) native "MimeType_description_Getter";
+class BlinkMimeType {
+  static $description_Getter(mthis) native "MimeType_description_Getter";
 
-Native_MimeType_enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
+  static $enabledPlugin_Getter(mthis) native "MimeType_enabledPlugin_Getter";
 
-Native_MimeType_suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
+  static $suffixes_Getter(mthis) native "MimeType_suffixes_Getter";
 
-Native_MimeType_type_Getter(mthis) native "MimeType_type_Getter";
+  static $type_Getter(mthis) native "MimeType_type_Getter";
+}
 
-Native_MimeTypeArray_length_Getter(mthis) native "MimeTypeArray_length_Getter";
+class BlinkMimeTypeArray {
+  static $length_Getter(mthis) native "MimeTypeArray_length_Getter";
 
-Native_MimeTypeArray_NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray___getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $__getter___Callback(mthis, name) native "MimeTypeArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_MimeTypeArray_item_Callback(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "MimeTypeArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_MimeTypeArray_namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $namedItem_Callback(mthis, name) native "MimeTypeArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_MouseEvent_altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
+class BlinkMouseEvent {
+  static $altKey_Getter(mthis) native "MouseEvent_altKey_Getter";
 
-Native_MouseEvent_button_Getter(mthis) native "MouseEvent_button_Getter";
+  static $button_Getter(mthis) native "MouseEvent_button_Getter";
 
-Native_MouseEvent_clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
+  static $clientX_Getter(mthis) native "MouseEvent_clientX_Getter";
 
-Native_MouseEvent_clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
+  static $clientY_Getter(mthis) native "MouseEvent_clientY_Getter";
 
-Native_MouseEvent_ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
+  static $ctrlKey_Getter(mthis) native "MouseEvent_ctrlKey_Getter";
 
-Native_MouseEvent_dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
+  static $dataTransfer_Getter(mthis) native "MouseEvent_dataTransfer_Getter";
 
-Native_MouseEvent_fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
+  static $fromElement_Getter(mthis) native "MouseEvent_fromElement_Getter";
 
-Native_MouseEvent_metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
+  static $metaKey_Getter(mthis) native "MouseEvent_metaKey_Getter";
 
-Native_MouseEvent_offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
+  static $offsetX_Getter(mthis) native "MouseEvent_offsetX_Getter";
 
-Native_MouseEvent_offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
+  static $offsetY_Getter(mthis) native "MouseEvent_offsetY_Getter";
 
-Native_MouseEvent_relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
+  static $relatedTarget_Getter(mthis) native "MouseEvent_relatedTarget_Getter";
 
-Native_MouseEvent_screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
+  static $screenX_Getter(mthis) native "MouseEvent_screenX_Getter";
 
-Native_MouseEvent_screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
+  static $screenY_Getter(mthis) native "MouseEvent_screenY_Getter";
 
-Native_MouseEvent_shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
+  static $shiftKey_Getter(mthis) native "MouseEvent_shiftKey_Getter";
 
-Native_MouseEvent_toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
+  static $toElement_Getter(mthis) native "MouseEvent_toElement_Getter";
 
-Native_MouseEvent_webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
+  static $webkitMovementX_Getter(mthis) native "MouseEvent_webkitMovementX_Getter";
 
-Native_MouseEvent_webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+  static $webkitMovementY_Getter(mthis) native "MouseEvent_webkitMovementY_Getter";
+
+  static $initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback_RESOLVER_STRING_15_DOMString_boolean_boolean_Window_long_long_long_long_long_boolean_boolean_boolean_boolean_unsigned short_EventTarget";
+}
+
+class BlinkMutationEvent {}
+
+class BlinkMutationObserver {
+  static $constructorCallback(callback) native "MutationObserver_constructorCallback";
 
-Native_MouseEvent_initMouseEvent_Callback(mthis, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget) native "MouseEvent_initMouseEvent_Callback_RESOLVER_STRING_15_DOMString_boolean_boolean_Window_long_long_long_long_long_boolean_boolean_boolean_boolean_unsigned short_EventTarget";
+  static $disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback_RESOLVER_STRING_0_";
 
-Native_MutationObserver_constructorCallback(callback) native "MutationObserver_constructorCallback";
+  static $observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback_RESOLVER_STRING_2_Node_Dictionary";
 
-Native_MutationObserver_disconnect_Callback(mthis) native "MutationObserver_disconnect_Callback_RESOLVER_STRING_0_";
+  static $takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback_RESOLVER_STRING_0_";
+}
 
-Native_MutationObserver_observe_Callback(mthis, target, options) native "MutationObserver_observe_Callback_RESOLVER_STRING_2_Node_Dictionary";
+class BlinkMutationRecord {
+  static $addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
 
-Native_MutationObserver_takeRecords_Callback(mthis) native "MutationObserver_takeRecords_Callback_RESOLVER_STRING_0_";
+  static $attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
 
-Native_MutationRecord_addedNodes_Getter(mthis) native "MutationRecord_addedNodes_Getter";
+  static $attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
 
-Native_MutationRecord_attributeName_Getter(mthis) native "MutationRecord_attributeName_Getter";
+  static $nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
 
-Native_MutationRecord_attributeNamespace_Getter(mthis) native "MutationRecord_attributeNamespace_Getter";
+  static $oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
 
-Native_MutationRecord_nextSibling_Getter(mthis) native "MutationRecord_nextSibling_Getter";
+  static $previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
 
-Native_MutationRecord_oldValue_Getter(mthis) native "MutationRecord_oldValue_Getter";
+  static $removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
 
-Native_MutationRecord_previousSibling_Getter(mthis) native "MutationRecord_previousSibling_Getter";
+  static $target_Getter(mthis) native "MutationRecord_target_Getter";
 
-Native_MutationRecord_removedNodes_Getter(mthis) native "MutationRecord_removedNodes_Getter";
+  static $type_Getter(mthis) native "MutationRecord_type_Getter";
+}
 
-Native_MutationRecord_target_Getter(mthis) native "MutationRecord_target_Getter";
+class BlinkNamedNodeMap {
+  static $length_Getter(mthis) native "NamedNodeMap_length_Getter";
 
-Native_MutationRecord_type_Getter(mthis) native "MutationRecord_type_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap_length_Getter(mthis) native "NamedNodeMap_length_Getter";
+  static $__getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_NativeIndexed_Getter(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap___getter___Callback(mthis, name) native "NamedNodeMap___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_getNamedItem_Callback(mthis, name) native "NamedNodeMap_getNamedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NamedNodeMap_getNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_getNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_NamedNodeMap_item_Callback(mthis, index) native "NamedNodeMap_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_NamedNodeMap_removeNamedItem_Callback(mthis, name) native "NamedNodeMap_removeNamedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback_RESOLVER_STRING_1_Node";
 
-Native_NamedNodeMap_removeNamedItemNS_Callback(mthis, namespaceURI, localName) native "NamedNodeMap_removeNamedItemNS_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_RESOLVER_STRING_1_Node";
+}
 
-Native_NamedNodeMap_setNamedItem_Callback(mthis, node) native "NamedNodeMap_setNamedItem_Callback_RESOLVER_STRING_1_Node";
+class BlinkNavigatorID {
+  static $appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
-Native_NamedNodeMap_setNamedItemNS_Callback(mthis, node) native "NamedNodeMap_setNamedItemNS_Callback_RESOLVER_STRING_1_Node";
+  static $appName_Getter(mthis) native "Navigator_appName_Getter";
 
-Native_NavigatorID_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  static $appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
-Native_NavigatorID_appName_Getter(mthis) native "Navigator_appName_Getter";
+  static $platform_Getter(mthis) native "Navigator_platform_Getter";
 
-Native_NavigatorID_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  static $product_Getter(mthis) native "Navigator_product_Getter";
 
-Native_NavigatorID_platform_Getter(mthis) native "Navigator_platform_Getter";
+  static $userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+}
 
-Native_NavigatorID_product_Getter(mthis) native "Navigator_product_Getter";
+class BlinkNavigatorOnLine {
+  static $onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
+}
 
-Native_NavigatorID_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+class BlinkNavigator {
+  static $cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
 
-Native_NavigatorOnLine_onLine_Getter(mthis) native "NavigatorOnLine_onLine_Getter";
+  static $doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
 
-Native_Navigator_cookieEnabled_Getter(mthis) native "Navigator_cookieEnabled_Getter";
+  static $geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
 
-Native_Navigator_doNotTrack_Getter(mthis) native "Navigator_doNotTrack_Getter";
+  static $language_Getter(mthis) native "Navigator_language_Getter";
 
-Native_Navigator_geolocation_Getter(mthis) native "Navigator_geolocation_Getter";
+  static $maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
 
-Native_Navigator_language_Getter(mthis) native "Navigator_language_Getter";
+  static $mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
 
-Native_Navigator_maxTouchPoints_Getter(mthis) native "Navigator_maxTouchPoints_Getter";
+  static $productSub_Getter(mthis) native "Navigator_productSub_Getter";
 
-Native_Navigator_mimeTypes_Getter(mthis) native "Navigator_mimeTypes_Getter";
+  static $serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
 
-Native_Navigator_productSub_Getter(mthis) native "Navigator_productSub_Getter";
+  static $storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
 
-Native_Navigator_serviceWorker_Getter(mthis) native "Navigator_serviceWorker_Getter";
+  static $vendor_Getter(mthis) native "Navigator_vendor_Getter";
 
-Native_Navigator_storageQuota_Getter(mthis) native "Navigator_storageQuota_Getter";
+  static $vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
 
-Native_Navigator_vendor_Getter(mthis) native "Navigator_vendor_Getter";
+  static $webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
 
-Native_Navigator_vendorSub_Getter(mthis) native "Navigator_vendorSub_Getter";
+  static $webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
 
-Native_Navigator_webkitPersistentStorage_Getter(mthis) native "Navigator_webkitPersistentStorage_Getter";
+  static $getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_webkitTemporaryStorage_Getter(mthis) native "Navigator_webkitTemporaryStorage_Getter";
+  static $isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_getStorageUpdates_Callback(mthis) native "Navigator_getStorageUpdates_Callback_RESOLVER_STRING_0_";
+  static $registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Navigator_isProtocolHandlerRegistered_Callback(mthis, scheme, url) native "Navigator_isProtocolHandlerRegistered_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback_RESOLVER_STRING_1_Dictionary";
 
-Native_Navigator_registerProtocolHandler_Callback(mthis, scheme, url, title) native "Navigator_registerProtocolHandler_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Navigator_requestMIDIAccess_Callback(mthis, options) native "Navigator_requestMIDIAccess_Callback_RESOLVER_STRING_1_Dictionary";
+  static $webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback_RESOLVER_STRING_0_";
 
-Native_Navigator_unregisterProtocolHandler_Callback(mthis, scheme, url) native "Navigator_unregisterProtocolHandler_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_RESOLVER_STRING_3_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
 
-Native_Navigator_webkitGetGamepads_Callback(mthis) native "Navigator_webkitGetGamepads_Callback_RESOLVER_STRING_0_";
+  static $appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
 
-Native_Navigator_webkitGetUserMedia_Callback(mthis, options, successCallback, errorCallback) native "Navigator_webkitGetUserMedia_Callback_RESOLVER_STRING_3_Dictionary_NavigatorUserMediaSuccessCallback_NavigatorUserMediaErrorCallback";
+  static $appName_Getter(mthis) native "Navigator_appName_Getter";
 
-Native_Navigator_appCodeName_Getter(mthis) native "Navigator_appCodeName_Getter";
+  static $appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
 
-Native_Navigator_appName_Getter(mthis) native "Navigator_appName_Getter";
+  static $platform_Getter(mthis) native "Navigator_platform_Getter";
 
-Native_Navigator_appVersion_Getter(mthis) native "Navigator_appVersion_Getter";
+  static $product_Getter(mthis) native "Navigator_product_Getter";
 
-Native_Navigator_platform_Getter(mthis) native "Navigator_platform_Getter";
+  static $userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
 
-Native_Navigator_product_Getter(mthis) native "Navigator_product_Getter";
+  static $onLine_Getter(mthis) native "Navigator_onLine_Getter";
+}
 
-Native_Navigator_userAgent_Getter(mthis) native "Navigator_userAgent_Getter";
+class BlinkNavigatorUserMediaError {
+  static $constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
 
-Native_Navigator_onLine_Getter(mthis) native "Navigator_onLine_Getter";
+  static $message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
 
-Native_NavigatorUserMediaError_constraintName_Getter(mthis) native "NavigatorUserMediaError_constraintName_Getter";
+  static $name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+}
 
-Native_NavigatorUserMediaError_message_Getter(mthis) native "NavigatorUserMediaError_message_Getter";
+class BlinkNodeFilter {}
 
-Native_NavigatorUserMediaError_name_Getter(mthis) native "NavigatorUserMediaError_name_Getter";
+class BlinkNodeIterator {
+  static $pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
 
-Native_NodeIterator_pointerBeforeReferenceNode_Getter(mthis) native "NodeIterator_pointerBeforeReferenceNode_Getter";
+  static $referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
 
-Native_NodeIterator_referenceNode_Getter(mthis) native "NodeIterator_referenceNode_Getter";
+  static $root_Getter(mthis) native "NodeIterator_root_Getter";
 
-Native_NodeIterator_root_Getter(mthis) native "NodeIterator_root_Getter";
+  static $whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
 
-Native_NodeIterator_whatToShow_Getter(mthis) native "NodeIterator_whatToShow_Getter";
+  static $detach_Callback(mthis) native "NodeIterator_detach_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_detach_Callback(mthis) native "NodeIterator_detach_Callback_RESOLVER_STRING_0_";
+  static $nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_NodeIterator_nextNode_Callback(mthis) native "NodeIterator_nextNode_Callback_RESOLVER_STRING_0_";
+  static $previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback_RESOLVER_STRING_0_";
+}
 
-Native_NodeIterator_previousNode_Callback(mthis) native "NodeIterator_previousNode_Callback_RESOLVER_STRING_0_";
+class BlinkNodeList {
+  static $length_Getter(mthis) native "NodeList_length_Getter";
 
-Native_NodeList_length_Getter(mthis) native "NodeList_length_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_NodeList_NativeIndexed_Getter(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_NodeList_item_Callback(mthis, index) native "NodeList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkNotation {}
 
+class BlinkNotification {
   // Generated overload resolver
-Native_Notification_Notification(title, options) {
-    return Native_Notification__create_1constructorCallback(title, options);
+  static $mkNotification(title, options) {
+    return $_create_1constructorCallback(title, options);
   }
 
-Native_Notification__create_1constructorCallback(title, options) native "Notification_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $_create_1constructorCallback(title, options) native "Notification_constructorCallback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_Notification_body_Getter(mthis) native "Notification_body_Getter";
+  static $body_Getter(mthis) native "Notification_body_Getter";
 
-Native_Notification_dir_Getter(mthis) native "Notification_dir_Getter";
+  static $dir_Getter(mthis) native "Notification_dir_Getter";
 
-Native_Notification_icon_Getter(mthis) native "Notification_icon_Getter";
+  static $icon_Getter(mthis) native "Notification_icon_Getter";
 
-Native_Notification_lang_Getter(mthis) native "Notification_lang_Getter";
+  static $lang_Getter(mthis) native "Notification_lang_Getter";
 
-Native_Notification_permission_Getter(mthis) native "Notification_permission_Getter";
+  static $permission_Getter(mthis) native "Notification_permission_Getter";
 
-Native_Notification_tag_Getter(mthis) native "Notification_tag_Getter";
+  static $tag_Getter(mthis) native "Notification_tag_Getter";
 
-Native_Notification_title_Getter(mthis) native "Notification_title_Getter";
+  static $title_Getter(mthis) native "Notification_title_Getter";
 
-Native_Notification_close_Callback(mthis) native "Notification_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "Notification_close_Callback_RESOLVER_STRING_0_";
 
-Native_Notification_requestPermission_Callback(callback) native "Notification_requestPermission_Callback_RESOLVER_STRING_1_NotificationPermissionCallback";
+  static $requestPermission_Callback(callback) native "Notification_requestPermission_Callback_RESOLVER_STRING_1_NotificationPermissionCallback";
+}
 
-Native_OESVertexArrayObject_bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkNotificationCenter {}
 
-Native_OESVertexArrayObject_createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback_RESOLVER_STRING_0_";
+class BlinkOESElementIndexUint {}
 
-Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkOESStandardDerivatives {}
 
-Native_OESVertexArrayObject_isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+class BlinkOESTextureFloat {}
 
-Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+class BlinkOESTextureFloatLinear {}
 
+class BlinkOESTextureHalfFloat {}
+
+class BlinkOESTextureHalfFloatLinear {}
+
+class BlinkOESVertexArrayObject {
+  static $bindVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_bindVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+
+  static $createVertexArrayOES_Callback(mthis) native "OESVertexArrayObject_createVertexArrayOES_Callback_RESOLVER_STRING_0_";
+
+  static $deleteVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_deleteVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+
+  static $isVertexArrayOES_Callback(mthis, arrayObject) native "OESVertexArrayObject_isVertexArrayOES_Callback_RESOLVER_STRING_1_WebGLVertexArrayObjectOES";
+}
+
+class BlinkOfflineAudioCompletionEvent {
+  static $renderedBuffer_Getter(mthis) native "OfflineAudioCompletionEvent_renderedBuffer_Getter";
+}
+
+class BlinkOfflineAudioContext {
   // Generated overload resolver
-Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
-    return Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
+  static $mkOfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate) {
+    return $_create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate);
   }
 
-Native_OfflineAudioContext__create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $_create_1constructorCallback(numberOfChannels, numberOfFrames, sampleRate) native "OfflineAudioContext_constructorCallback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+}
 
-Native_OscillatorNode_detune_Getter(mthis) native "OscillatorNode_detune_Getter";
+class BlinkOscillatorNode {
+  static $detune_Getter(mthis) native "OscillatorNode_detune_Getter";
 
-Native_OscillatorNode_frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
+  static $frequency_Getter(mthis) native "OscillatorNode_frequency_Getter";
 
-Native_OscillatorNode_type_Getter(mthis) native "OscillatorNode_type_Getter";
+  static $type_Getter(mthis) native "OscillatorNode_type_Getter";
 
-Native_OscillatorNode_type_Setter(mthis, value) native "OscillatorNode_type_Setter";
+  static $type_Setter(mthis, value) native "OscillatorNode_type_Setter";
 
-Native_OscillatorNode_noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback_RESOLVER_STRING_1_double";
+  static $noteOff_Callback(mthis, when) native "OscillatorNode_noteOff_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback_RESOLVER_STRING_1_double";
+  static $noteOn_Callback(mthis, when) native "OscillatorNode_noteOn_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode_setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback_RESOLVER_STRING_1_PeriodicWave";
+  static $setPeriodicWave_Callback(mthis, periodicWave) native "OscillatorNode_setPeriodicWave_Callback_RESOLVER_STRING_1_PeriodicWave";
 
   // Generated overload resolver
-Native_OscillatorNode_start(mthis, when) {
+  static $start(mthis, when) {
     if (when != null) {
-      Native_OscillatorNode__start_1_Callback(mthis, when);
+      $_start_1_Callback(mthis, when);
       return;
     }
-    Native_OscillatorNode__start_2_Callback(mthis);
+    $_start_2_Callback(mthis);
     return;
   }
 
-Native_OscillatorNode__start_1_Callback(mthis, when) native "OscillatorNode_start_Callback_RESOLVER_STRING_1_double";
+  static $_start_1_Callback(mthis, when) native "OscillatorNode_start_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__start_2_Callback(mthis) native "OscillatorNode_start_Callback_RESOLVER_STRING_0_";
+  static $_start_2_Callback(mthis) native "OscillatorNode_start_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_OscillatorNode_stop(mthis, when) {
+  static $stop(mthis, when) {
     if (when != null) {
-      Native_OscillatorNode__stop_1_Callback(mthis, when);
+      $_stop_1_Callback(mthis, when);
       return;
     }
-    Native_OscillatorNode__stop_2_Callback(mthis);
+    $_stop_2_Callback(mthis);
     return;
   }
 
-Native_OscillatorNode__stop_1_Callback(mthis, when) native "OscillatorNode_stop_Callback_RESOLVER_STRING_1_double";
+  static $_stop_1_Callback(mthis, when) native "OscillatorNode_stop_Callback_RESOLVER_STRING_1_double";
 
-Native_OscillatorNode__stop_2_Callback(mthis) native "OscillatorNode_stop_Callback_RESOLVER_STRING_0_";
+  static $_stop_2_Callback(mthis) native "OscillatorNode_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_OverflowEvent_horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
+class BlinkOverflowEvent {
+  static $horizontalOverflow_Getter(mthis) native "OverflowEvent_horizontalOverflow_Getter";
 
-Native_OverflowEvent_orient_Getter(mthis) native "OverflowEvent_orient_Getter";
+  static $orient_Getter(mthis) native "OverflowEvent_orient_Getter";
 
-Native_OverflowEvent_verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+  static $verticalOverflow_Getter(mthis) native "OverflowEvent_verticalOverflow_Getter";
+}
 
-Native_PageTransitionEvent_persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+class BlinkPagePopupController {}
 
-Native_PannerNode_coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
+class BlinkPageTransitionEvent {
+  static $persisted_Getter(mthis) native "PageTransitionEvent_persisted_Getter";
+}
 
-Native_PannerNode_coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
+class BlinkPannerNode {
+  static $coneInnerAngle_Getter(mthis) native "PannerNode_coneInnerAngle_Getter";
 
-Native_PannerNode_coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
+  static $coneInnerAngle_Setter(mthis, value) native "PannerNode_coneInnerAngle_Setter";
 
-Native_PannerNode_coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
+  static $coneOuterAngle_Getter(mthis) native "PannerNode_coneOuterAngle_Getter";
 
-Native_PannerNode_coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
+  static $coneOuterAngle_Setter(mthis, value) native "PannerNode_coneOuterAngle_Setter";
 
-Native_PannerNode_coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
+  static $coneOuterGain_Getter(mthis) native "PannerNode_coneOuterGain_Getter";
 
-Native_PannerNode_distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
+  static $coneOuterGain_Setter(mthis, value) native "PannerNode_coneOuterGain_Setter";
 
-Native_PannerNode_distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
+  static $distanceModel_Getter(mthis) native "PannerNode_distanceModel_Getter";
 
-Native_PannerNode_maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
+  static $distanceModel_Setter(mthis, value) native "PannerNode_distanceModel_Setter";
 
-Native_PannerNode_maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
+  static $maxDistance_Getter(mthis) native "PannerNode_maxDistance_Getter";
 
-Native_PannerNode_panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
+  static $maxDistance_Setter(mthis, value) native "PannerNode_maxDistance_Setter";
 
-Native_PannerNode_panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
+  static $panningModel_Getter(mthis) native "PannerNode_panningModel_Getter";
 
-Native_PannerNode_refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
+  static $panningModel_Setter(mthis, value) native "PannerNode_panningModel_Setter";
 
-Native_PannerNode_refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
+  static $refDistance_Getter(mthis) native "PannerNode_refDistance_Getter";
 
-Native_PannerNode_rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
+  static $refDistance_Setter(mthis, value) native "PannerNode_refDistance_Setter";
 
-Native_PannerNode_rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
+  static $rolloffFactor_Getter(mthis) native "PannerNode_rolloffFactor_Getter";
 
-Native_PannerNode_setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback_RESOLVER_STRING_3_float_float_float";
+  static $rolloffFactor_Setter(mthis, value) native "PannerNode_rolloffFactor_Setter";
 
-Native_PannerNode_setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setOrientation_Callback(mthis, x, y, z) native "PannerNode_setOrientation_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_PannerNode_setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+  static $setPosition_Callback(mthis, x, y, z) native "PannerNode_setPosition_Callback_RESOLVER_STRING_3_float_float_float";
 
+  static $setVelocity_Callback(mthis, x, y, z) native "PannerNode_setVelocity_Callback_RESOLVER_STRING_3_float_float_float";
+}
+
+class BlinkPath {
   // Generated overload resolver
-Native_Path_Path(path_OR_text) {
+  static $mkPath(path_OR_text) {
     if (path_OR_text == null) {
-      return Native_Path__create_1constructorCallback();
+      return $_create_1constructorCallback();
     }
     if ((path_OR_text is Path || path_OR_text == null)) {
-      return Native_Path__create_2constructorCallback(path_OR_text);
+      return $_create_2constructorCallback(path_OR_text);
     }
     if ((path_OR_text is String || path_OR_text == null)) {
-      return Native_Path__create_3constructorCallback(path_OR_text);
+      return $_create_3constructorCallback(path_OR_text);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Path__create_1constructorCallback() native "Path2D_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "Path2D_constructorCallback_RESOLVER_STRING_0_";
 
-Native_Path__create_2constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_Path2D";
+  static $_create_2constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_Path2D";
 
-Native_Path__create_3constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_3constructorCallback(path_OR_text) native "Path2D_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_Path_arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
+  static $arc_Callback(mthis, x, y, radius, startAngle, endAngle, anticlockwise) native "Path2D_arc_Callback_RESOLVER_STRING_6_float_float_float_float_float_boolean";
 
-Native_Path_arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
+  static $arcTo_Callback(mthis, x1, y1, x2, y2, radius) native "Path2D_arcTo_Callback_RESOLVER_STRING_5_float_float_float_float_float";
 
-Native_Path_bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $bezierCurveTo_Callback(mthis, cp1x, cp1y, cp2x, cp2y, x, y) native "Path2D_bezierCurveTo_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_Path_closePath_Callback(mthis) native "Path2D_closePath_Callback_RESOLVER_STRING_0_";
+  static $closePath_Callback(mthis) native "Path2D_closePath_Callback_RESOLVER_STRING_0_";
 
-Native_Path_lineTo_Callback(mthis, x, y) native "Path2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
+  static $lineTo_Callback(mthis, x, y) native "Path2D_lineTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_moveTo_Callback(mthis, x, y) native "Path2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "Path2D_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Path_quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $quadraticCurveTo_Callback(mthis, cpx, cpy, x, y) native "Path2D_quadraticCurveTo_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_Path_rect_Callback(mthis, x, y, width, height) native "Path2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $rect_Callback(mthis, x, y, width, height) native "Path2D_rect_Callback_RESOLVER_STRING_4_float_float_float_float";
+}
 
-Native_Performance_memory_Getter(mthis) native "Performance_memory_Getter";
+class BlinkPerformance {
+  static $memory_Getter(mthis) native "Performance_memory_Getter";
 
-Native_Performance_navigation_Getter(mthis) native "Performance_navigation_Getter";
+  static $navigation_Getter(mthis) native "Performance_navigation_Getter";
 
-Native_Performance_timing_Getter(mthis) native "Performance_timing_Getter";
+  static $timing_Getter(mthis) native "Performance_timing_Getter";
 
-Native_Performance_clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback_RESOLVER_STRING_1_DOMString";
+  static $clearMarks_Callback(mthis, markName) native "Performance_clearMarks_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback_RESOLVER_STRING_1_DOMString";
+  static $clearMeasures_Callback(mthis, measureName) native "Performance_clearMeasures_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_getEntries_Callback(mthis) native "Performance_getEntries_Callback_RESOLVER_STRING_0_";
+  static $getEntries_Callback(mthis) native "Performance_getEntries_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $getEntriesByName_Callback(mthis, name, entryType) native "Performance_getEntriesByName_Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Performance_getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback_RESOLVER_STRING_1_DOMString";
+  static $getEntriesByType_Callback(mthis, entryType) native "Performance_getEntriesByType_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_mark_Callback(mthis, markName) native "Performance_mark_Callback_RESOLVER_STRING_1_DOMString";
+  static $mark_Callback(mthis, markName) native "Performance_mark_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Performance_measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $measure_Callback(mthis, measureName, startMark, endMark) native "Performance_measure_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Performance_now_Callback(mthis) native "Performance_now_Callback_RESOLVER_STRING_0_";
+  static $now_Callback(mthis) native "Performance_now_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback_RESOLVER_STRING_0_";
+  static $webkitClearResourceTimings_Callback(mthis) native "Performance_webkitClearResourceTimings_Callback_RESOLVER_STRING_0_";
 
-Native_Performance_webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback_RESOLVER_STRING_1_unsigned long";
+  static $webkitSetResourceTimingBufferSize_Callback(mthis, maxSize) native "Performance_webkitSetResourceTimingBufferSize_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_PerformanceEntry_duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
+class BlinkPerformanceEntry {
+  static $duration_Getter(mthis) native "PerformanceEntry_duration_Getter";
 
-Native_PerformanceEntry_entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
+  static $entryType_Getter(mthis) native "PerformanceEntry_entryType_Getter";
 
-Native_PerformanceEntry_name_Getter(mthis) native "PerformanceEntry_name_Getter";
+  static $name_Getter(mthis) native "PerformanceEntry_name_Getter";
 
-Native_PerformanceEntry_startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+  static $startTime_Getter(mthis) native "PerformanceEntry_startTime_Getter";
+}
 
-Native_PerformanceNavigation_redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
+class BlinkPerformanceMark {}
 
-Native_PerformanceNavigation_type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+class BlinkPerformanceMeasure {}
 
-Native_PerformanceResourceTiming_connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
+class BlinkPerformanceNavigation {
+  static $redirectCount_Getter(mthis) native "PerformanceNavigation_redirectCount_Getter";
 
-Native_PerformanceResourceTiming_connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
+  static $type_Getter(mthis) native "PerformanceNavigation_type_Getter";
+}
 
-Native_PerformanceResourceTiming_domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
+class BlinkPerformanceResourceTiming {
+  static $connectEnd_Getter(mthis) native "PerformanceResourceTiming_connectEnd_Getter";
 
-Native_PerformanceResourceTiming_domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
+  static $connectStart_Getter(mthis) native "PerformanceResourceTiming_connectStart_Getter";
 
-Native_PerformanceResourceTiming_fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
+  static $domainLookupEnd_Getter(mthis) native "PerformanceResourceTiming_domainLookupEnd_Getter";
 
-Native_PerformanceResourceTiming_initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
+  static $domainLookupStart_Getter(mthis) native "PerformanceResourceTiming_domainLookupStart_Getter";
 
-Native_PerformanceResourceTiming_redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
+  static $fetchStart_Getter(mthis) native "PerformanceResourceTiming_fetchStart_Getter";
 
-Native_PerformanceResourceTiming_redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
+  static $initiatorType_Getter(mthis) native "PerformanceResourceTiming_initiatorType_Getter";
 
-Native_PerformanceResourceTiming_requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
+  static $redirectEnd_Getter(mthis) native "PerformanceResourceTiming_redirectEnd_Getter";
 
-Native_PerformanceResourceTiming_responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
+  static $redirectStart_Getter(mthis) native "PerformanceResourceTiming_redirectStart_Getter";
 
-Native_PerformanceResourceTiming_responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
+  static $requestStart_Getter(mthis) native "PerformanceResourceTiming_requestStart_Getter";
 
-Native_PerformanceResourceTiming_secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+  static $responseEnd_Getter(mthis) native "PerformanceResourceTiming_responseEnd_Getter";
 
-Native_PerformanceTiming_connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
+  static $responseStart_Getter(mthis) native "PerformanceResourceTiming_responseStart_Getter";
 
-Native_PerformanceTiming_connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
+  static $secureConnectionStart_Getter(mthis) native "PerformanceResourceTiming_secureConnectionStart_Getter";
+}
 
-Native_PerformanceTiming_domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
+class BlinkPerformanceTiming {
+  static $connectEnd_Getter(mthis) native "PerformanceTiming_connectEnd_Getter";
 
-Native_PerformanceTiming_domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
+  static $connectStart_Getter(mthis) native "PerformanceTiming_connectStart_Getter";
 
-Native_PerformanceTiming_domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
+  static $domComplete_Getter(mthis) native "PerformanceTiming_domComplete_Getter";
 
-Native_PerformanceTiming_domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
+  static $domContentLoadedEventEnd_Getter(mthis) native "PerformanceTiming_domContentLoadedEventEnd_Getter";
 
-Native_PerformanceTiming_domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
+  static $domContentLoadedEventStart_Getter(mthis) native "PerformanceTiming_domContentLoadedEventStart_Getter";
 
-Native_PerformanceTiming_domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
+  static $domInteractive_Getter(mthis) native "PerformanceTiming_domInteractive_Getter";
 
-Native_PerformanceTiming_domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+  static $domLoading_Getter(mthis) native "PerformanceTiming_domLoading_Getter";
 
-Native_PerformanceTiming_fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+  static $domainLookupEnd_Getter(mthis) native "PerformanceTiming_domainLookupEnd_Getter";
 
-Native_PerformanceTiming_loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+  static $domainLookupStart_Getter(mthis) native "PerformanceTiming_domainLookupStart_Getter";
+
+  static $fetchStart_Getter(mthis) native "PerformanceTiming_fetchStart_Getter";
+
+  static $loadEventEnd_Getter(mthis) native "PerformanceTiming_loadEventEnd_Getter";
+
+  static $loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+
+  static $navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
 
-Native_PerformanceTiming_loadEventStart_Getter(mthis) native "PerformanceTiming_loadEventStart_Getter";
+  static $redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
 
-Native_PerformanceTiming_navigationStart_Getter(mthis) native "PerformanceTiming_navigationStart_Getter";
+  static $redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
 
-Native_PerformanceTiming_redirectEnd_Getter(mthis) native "PerformanceTiming_redirectEnd_Getter";
+  static $requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
 
-Native_PerformanceTiming_redirectStart_Getter(mthis) native "PerformanceTiming_redirectStart_Getter";
+  static $responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
 
-Native_PerformanceTiming_requestStart_Getter(mthis) native "PerformanceTiming_requestStart_Getter";
+  static $responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
 
-Native_PerformanceTiming_responseEnd_Getter(mthis) native "PerformanceTiming_responseEnd_Getter";
+  static $secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
 
-Native_PerformanceTiming_responseStart_Getter(mthis) native "PerformanceTiming_responseStart_Getter";
+  static $unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
 
-Native_PerformanceTiming_secureConnectionStart_Getter(mthis) native "PerformanceTiming_secureConnectionStart_Getter";
+  static $unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+}
 
-Native_PerformanceTiming_unloadEventEnd_Getter(mthis) native "PerformanceTiming_unloadEventEnd_Getter";
+class BlinkPeriodicWave {}
 
-Native_PerformanceTiming_unloadEventStart_Getter(mthis) native "PerformanceTiming_unloadEventStart_Getter";
+class BlinkPlayer {
+  static $currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
 
-Native_Player_currentTime_Getter(mthis) native "AnimationPlayer_currentTime_Getter";
+  static $currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
 
-Native_Player_currentTime_Setter(mthis, value) native "AnimationPlayer_currentTime_Setter";
+  static $finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
 
-Native_Player_finished_Getter(mthis) native "AnimationPlayer_finished_Getter";
+  static $paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
 
-Native_Player_paused_Getter(mthis) native "AnimationPlayer_paused_Getter";
+  static $playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
 
-Native_Player_playbackRate_Getter(mthis) native "AnimationPlayer_playbackRate_Getter";
+  static $playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
 
-Native_Player_playbackRate_Setter(mthis, value) native "AnimationPlayer_playbackRate_Setter";
+  static $source_Getter(mthis) native "AnimationPlayer_source_Getter";
 
-Native_Player_source_Getter(mthis) native "AnimationPlayer_source_Getter";
+  static $source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
 
-Native_Player_source_Setter(mthis, value) native "AnimationPlayer_source_Setter";
+  static $startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
 
-Native_Player_startTime_Getter(mthis) native "AnimationPlayer_startTime_Getter";
+  static $startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
 
-Native_Player_startTime_Setter(mthis, value) native "AnimationPlayer_startTime_Setter";
+  static $timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
 
-Native_Player_timeLag_Getter(mthis) native "AnimationPlayer_timeLag_Getter";
+  static $cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_Player_cancel_Callback(mthis) native "AnimationPlayer_cancel_Callback_RESOLVER_STRING_0_";
+  static $finish_Callback(mthis) native "AnimationPlayer_finish_Callback_RESOLVER_STRING_0_";
 
-Native_Player_finish_Callback(mthis) native "AnimationPlayer_finish_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "AnimationPlayer_pause_Callback_RESOLVER_STRING_0_";
 
-Native_Player_pause_Callback(mthis) native "AnimationPlayer_pause_Callback_RESOLVER_STRING_0_";
+  static $play_Callback(mthis) native "AnimationPlayer_play_Callback_RESOLVER_STRING_0_";
 
-Native_Player_play_Callback(mthis) native "AnimationPlayer_play_Callback_RESOLVER_STRING_0_";
+  static $reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Player_reverse_Callback(mthis) native "AnimationPlayer_reverse_Callback_RESOLVER_STRING_0_";
+class BlinkPlugin {
+  static $description_Getter(mthis) native "Plugin_description_Getter";
 
-Native_Plugin_description_Getter(mthis) native "Plugin_description_Getter";
+  static $filename_Getter(mthis) native "Plugin_filename_Getter";
 
-Native_Plugin_filename_Getter(mthis) native "Plugin_filename_Getter";
+  static $length_Getter(mthis) native "Plugin_length_Getter";
 
-Native_Plugin_length_Getter(mthis) native "Plugin_length_Getter";
+  static $name_Getter(mthis) native "Plugin_name_Getter";
 
-Native_Plugin_name_Getter(mthis) native "Plugin_name_Getter";
+  static $__getter___Callback(mthis, name) native "Plugin___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Plugin___getter___Callback(mthis, name) native "Plugin___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "Plugin_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Plugin_item_Callback(mthis, index) native "Plugin_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_Plugin_namedItem_Callback(mthis, name) native "Plugin_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkPluginArray {
+  static $length_Getter(mthis) native "PluginArray_length_Getter";
 
-Native_PluginArray_length_Getter(mthis) native "PluginArray_length_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray_NativeIndexed_Getter(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $__getter___Callback(mthis, name) native "PluginArray___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray___getter___Callback(mthis, name) native "PluginArray___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $item_Callback(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_PluginArray_item_Callback(mthis, index) native "PluginArray_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_PluginArray_namedItem_Callback(mthis, name) native "PluginArray_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback_RESOLVER_STRING_1_boolean";
+}
 
-Native_PluginArray_refresh_Callback(mthis, reload) native "PluginArray_refresh_Callback_RESOLVER_STRING_1_boolean";
+class BlinkPopStateEvent {
+  static $state_Getter(mthis) native "PopStateEvent_state_Getter";
+}
 
-Native_PopStateEvent_state_Getter(mthis) native "PopStateEvent_state_Getter";
+class BlinkPositionError {
+  static $code_Getter(mthis) native "PositionError_code_Getter";
 
-Native_PositionError_code_Getter(mthis) native "PositionError_code_Getter";
+  static $message_Getter(mthis) native "PositionError_message_Getter";
+}
 
-Native_PositionError_message_Getter(mthis) native "PositionError_message_Getter";
+class BlinkProcessingInstruction {
+  static $sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
 
-Native_ProcessingInstruction_sheet_Getter(mthis) native "ProcessingInstruction_sheet_Getter";
+  static $target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+}
 
-Native_ProcessingInstruction_target_Getter(mthis) native "ProcessingInstruction_target_Getter";
+class BlinkProgressEvent {
+  static $lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
 
-Native_ProgressEvent_lengthComputable_Getter(mthis) native "ProgressEvent_lengthComputable_Getter";
+  static $loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
 
-Native_ProgressEvent_loaded_Getter(mthis) native "ProgressEvent_loaded_Getter";
+  static $total_Getter(mthis) native "ProgressEvent_total_Getter";
+}
 
-Native_ProgressEvent_total_Getter(mthis) native "ProgressEvent_total_Getter";
+class BlinkRGBColor {}
 
-Native_RTCDTMFSender_canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
+class BlinkRTCDTMFSender {
+  static $canInsertDTMF_Getter(mthis) native "RTCDTMFSender_canInsertDTMF_Getter";
 
-Native_RTCDTMFSender_duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
+  static $duration_Getter(mthis) native "RTCDTMFSender_duration_Getter";
 
-Native_RTCDTMFSender_interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
+  static $interToneGap_Getter(mthis) native "RTCDTMFSender_interToneGap_Getter";
 
-Native_RTCDTMFSender_toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
+  static $toneBuffer_Getter(mthis) native "RTCDTMFSender_toneBuffer_Getter";
 
-Native_RTCDTMFSender_track_Getter(mthis) native "RTCDTMFSender_track_Getter";
+  static $track_Getter(mthis) native "RTCDTMFSender_track_Getter";
 
   // Generated overload resolver
-Native_RTCDTMFSender_insertDtmf(mthis, tones, duration, interToneGap) {
+  static $insertDtmf(mthis, tones, duration, interToneGap) {
     if (interToneGap != null) {
-      Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
+      $_insertDTMF_1_Callback(mthis, tones, duration, interToneGap);
       return;
     }
     if (duration != null) {
-      Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration);
+      $_insertDTMF_2_Callback(mthis, tones, duration);
       return;
     }
-    Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones);
+    $_insertDTMF_3_Callback(mthis, tones);
     return;
   }
 
-Native_RTCDTMFSender__insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_3_DOMString_long_long";
+  static $_insertDTMF_1_Callback(mthis, tones, duration, interToneGap) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_3_DOMString_long_long";
 
-Native_RTCDTMFSender__insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_2_DOMString_long";
+  static $_insertDTMF_2_Callback(mthis, tones, duration) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_2_DOMString_long";
 
-Native_RTCDTMFSender__insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_1_DOMString";
+  static $_insertDTMF_3_Callback(mthis, tones) native "RTCDTMFSender_insertDTMF_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_RTCDTMFToneChangeEvent_tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+class BlinkRTCDTMFToneChangeEvent {
+  static $tone_Getter(mthis) native "RTCDTMFToneChangeEvent_tone_Getter";
+}
 
-Native_RTCDataChannel_binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
+class BlinkRTCDataChannel {
+  static $binaryType_Getter(mthis) native "RTCDataChannel_binaryType_Getter";
 
-Native_RTCDataChannel_binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
+  static $binaryType_Setter(mthis, value) native "RTCDataChannel_binaryType_Setter";
 
-Native_RTCDataChannel_bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
+  static $bufferedAmount_Getter(mthis) native "RTCDataChannel_bufferedAmount_Getter";
 
-Native_RTCDataChannel_id_Getter(mthis) native "RTCDataChannel_id_Getter";
+  static $id_Getter(mthis) native "RTCDataChannel_id_Getter";
 
-Native_RTCDataChannel_label_Getter(mthis) native "RTCDataChannel_label_Getter";
+  static $label_Getter(mthis) native "RTCDataChannel_label_Getter";
 
-Native_RTCDataChannel_maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
+  static $maxRetransmitTime_Getter(mthis) native "RTCDataChannel_maxRetransmitTime_Getter";
 
-Native_RTCDataChannel_maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
+  static $maxRetransmits_Getter(mthis) native "RTCDataChannel_maxRetransmits_Getter";
 
-Native_RTCDataChannel_negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
+  static $negotiated_Getter(mthis) native "RTCDataChannel_negotiated_Getter";
 
-Native_RTCDataChannel_ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
+  static $ordered_Getter(mthis) native "RTCDataChannel_ordered_Getter";
 
-Native_RTCDataChannel_protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
+  static $protocol_Getter(mthis) native "RTCDataChannel_protocol_Getter";
 
-Native_RTCDataChannel_readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
+  static $readyState_Getter(mthis) native "RTCDataChannel_readyState_Getter";
 
-Native_RTCDataChannel_reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
+  static $reliable_Getter(mthis) native "RTCDataChannel_reliable_Getter";
 
-Native_RTCDataChannel_close_Callback(mthis) native "RTCDataChannel_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "RTCDataChannel_close_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_RTCDataChannel_send(mthis, data) {
+  static $send(mthis, data) {
     if ((data is TypedData || data == null)) {
-      Native_RTCDataChannel__send_1_Callback(mthis, data);
+      $_send_1_Callback(mthis, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      Native_RTCDataChannel__send_2_Callback(mthis, data);
+      $_send_2_Callback(mthis, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      Native_RTCDataChannel__send_3_Callback(mthis, data);
+      $_send_3_Callback(mthis, data);
       return;
     }
     if ((data is String || data == null)) {
-      Native_RTCDataChannel__send_4_Callback(mthis, data);
+      $_send_4_Callback(mthis, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_RTCDataChannel__send_1_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $_send_1_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_RTCDataChannel__send_2_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $_send_2_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel__send_3_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
+  static $_send_3_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel__send_4_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $_send_4_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendBlob_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
+  static $sendBlob_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_RTCDataChannel_sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $sendByteBuffer_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_RTCDataChannel_sendString_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $sendString_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCDataChannel_sendTypedData_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $sendTypedData_Callback(mthis, data) native "RTCDataChannel_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+}
 
-Native_RTCDataChannelEvent_channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+class BlinkRTCDataChannelEvent {
+  static $channel_Getter(mthis) native "RTCDataChannelEvent_channel_Getter";
+}
 
+class BlinkRTCIceCandidate {
   // Generated overload resolver
-Native_RTCIceCandidate_RtcIceCandidate(dictionary) {
-    return Native_RTCIceCandidate__create_1constructorCallback(dictionary);
+  static $mkRtcIceCandidate(dictionary) {
+    return $_create_1constructorCallback(dictionary);
   }
 
-Native_RTCIceCandidate__create_1constructorCallback(dictionary) native "RTCIceCandidate_constructorCallback_RESOLVER_STRING_1_Dictionary";
+  static $_create_1constructorCallback(dictionary) native "RTCIceCandidate_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
-Native_RTCIceCandidate_candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
+  static $candidate_Getter(mthis) native "RTCIceCandidate_candidate_Getter";
 
-Native_RTCIceCandidate_sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
+  static $sdpMLineIndex_Getter(mthis) native "RTCIceCandidate_sdpMLineIndex_Getter";
 
-Native_RTCIceCandidate_sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+  static $sdpMid_Getter(mthis) native "RTCIceCandidate_sdpMid_Getter";
+}
 
-Native_RTCIceCandidateEvent_candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+class BlinkRTCIceCandidateEvent {
+  static $candidate_Getter(mthis) native "RTCIceCandidateEvent_candidate_Getter";
+}
 
+class BlinkRTCPeerConnection {
   // Generated overload resolver
-Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints) {
-    return Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints);
+  static $mkRtcPeerConnection(rtcIceServers, mediaConstraints) {
+    return $_create_1constructorCallback(rtcIceServers, mediaConstraints);
   }
 
-Native_RTCPeerConnection__create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection_constructorCallback_RESOLVER_STRING_2_Dictionary_Dictionary";
+  static $_create_1constructorCallback(rtcIceServers, mediaConstraints) native "RTCPeerConnection_constructorCallback_RESOLVER_STRING_2_Dictionary_Dictionary";
 
-Native_RTCPeerConnection_iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
+  static $iceConnectionState_Getter(mthis) native "RTCPeerConnection_iceConnectionState_Getter";
 
-Native_RTCPeerConnection_iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
+  static $iceGatheringState_Getter(mthis) native "RTCPeerConnection_iceGatheringState_Getter";
 
-Native_RTCPeerConnection_localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
+  static $localDescription_Getter(mthis) native "RTCPeerConnection_localDescription_Getter";
 
-Native_RTCPeerConnection_remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
+  static $remoteDescription_Getter(mthis) native "RTCPeerConnection_remoteDescription_Getter";
 
-Native_RTCPeerConnection_signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
+  static $signalingState_Getter(mthis) native "RTCPeerConnection_signalingState_Getter";
 
-Native_RTCPeerConnection_addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback_RESOLVER_STRING_3_RTCIceCandidate_VoidCallback_RTCErrorCallback";
+  static $addIceCandidate_Callback(mthis, candidate, successCallback, failureCallback) native "RTCPeerConnection_addIceCandidate_Callback_RESOLVER_STRING_3_RTCIceCandidate_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback_RESOLVER_STRING_2_MediaStream_Dictionary";
+  static $addStream_Callback(mthis, stream, mediaConstraints) native "RTCPeerConnection_addStream_Callback_RESOLVER_STRING_2_MediaStream_Dictionary";
 
-Native_RTCPeerConnection_close_Callback(mthis) native "RTCPeerConnection_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "RTCPeerConnection_close_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
+  static $createAnswer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createAnswer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback_RESOLVER_STRING_1_MediaStreamTrack";
+  static $createDTMFSender_Callback(mthis, track) native "RTCPeerConnection_createDTMFSender_Callback_RESOLVER_STRING_1_MediaStreamTrack";
 
-Native_RTCPeerConnection_createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
+  static $createDataChannel_Callback(mthis, label, options) native "RTCPeerConnection_createDataChannel_Callback_RESOLVER_STRING_2_DOMString_Dictionary";
 
-Native_RTCPeerConnection_createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
+  static $createOffer_Callback(mthis, successCallback, failureCallback, mediaConstraints) native "RTCPeerConnection_createOffer_Callback_RESOLVER_STRING_3_RTCSessionDescriptionCallback_RTCErrorCallback_Dictionary";
 
-Native_RTCPeerConnection_getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback_RESOLVER_STRING_0_";
+  static $getLocalStreams_Callback(mthis) native "RTCPeerConnection_getLocalStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback_RESOLVER_STRING_0_";
+  static $getRemoteStreams_Callback(mthis) native "RTCPeerConnection_getRemoteStreams_Callback_RESOLVER_STRING_0_";
 
-Native_RTCPeerConnection_getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback_RESOLVER_STRING_2_RTCStatsCallback_MediaStreamTrack";
+  static $getStats_Callback(mthis, successCallback, selector) native "RTCPeerConnection_getStats_Callback_RESOLVER_STRING_2_RTCStatsCallback_MediaStreamTrack";
 
-Native_RTCPeerConnection_getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getStreamById_Callback(mthis, streamId) native "RTCPeerConnection_getStreamById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCPeerConnection_removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback_RESOLVER_STRING_1_MediaStream";
+  static $removeStream_Callback(mthis, stream) native "RTCPeerConnection_removeStream_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_RTCPeerConnection_setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
+  static $setLocalDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setLocalDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
+  static $setRemoteDescription_Callback(mthis, description, successCallback, failureCallback) native "RTCPeerConnection_setRemoteDescription_Callback_RESOLVER_STRING_3_RTCSessionDescription_VoidCallback_RTCErrorCallback";
 
-Native_RTCPeerConnection_updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback_RESOLVER_STRING_2_Dictionary_Dictionary";
+  static $updateIce_Callback(mthis, configuration, mediaConstraints) native "RTCPeerConnection_updateIce_Callback_RESOLVER_STRING_2_Dictionary_Dictionary";
+}
 
+class BlinkRTCSessionDescription {
   // Generated overload resolver
-Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict) {
-    return Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict);
+  static $mkRtcSessionDescription(descriptionInitDict) {
+    return $_create_1constructorCallback(descriptionInitDict);
   }
 
-Native_RTCSessionDescription__create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription_constructorCallback_RESOLVER_STRING_1_Dictionary";
+  static $_create_1constructorCallback(descriptionInitDict) native "RTCSessionDescription_constructorCallback_RESOLVER_STRING_1_Dictionary";
 
-Native_RTCSessionDescription_sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
+  static $sdp_Getter(mthis) native "RTCSessionDescription_sdp_Getter";
 
-Native_RTCSessionDescription_sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
+  static $sdp_Setter(mthis, value) native "RTCSessionDescription_sdp_Setter";
 
-Native_RTCSessionDescription_type_Getter(mthis) native "RTCSessionDescription_type_Getter";
+  static $type_Getter(mthis) native "RTCSessionDescription_type_Getter";
 
-Native_RTCSessionDescription_type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+  static $type_Setter(mthis, value) native "RTCSessionDescription_type_Setter";
+}
 
-Native_RTCStatsReport_id_Getter(mthis) native "RTCStatsReport_id_Getter";
+class BlinkRTCStatsReport {
+  static $id_Getter(mthis) native "RTCStatsReport_id_Getter";
 
-Native_RTCStatsReport_local_Getter(mthis) native "RTCStatsReport_local_Getter";
+  static $local_Getter(mthis) native "RTCStatsReport_local_Getter";
 
-Native_RTCStatsReport_remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
+  static $remote_Getter(mthis) native "RTCStatsReport_remote_Getter";
 
-Native_RTCStatsReport_timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
+  static $timestamp_Getter(mthis) native "RTCStatsReport_timestamp_Getter";
 
-Native_RTCStatsReport_type_Getter(mthis) native "RTCStatsReport_type_Getter";
+  static $type_Getter(mthis) native "RTCStatsReport_type_Getter";
 
-Native_RTCStatsReport_names_Callback(mthis) native "RTCStatsReport_names_Callback_RESOLVER_STRING_0_";
+  static $names_Callback(mthis) native "RTCStatsReport_names_Callback_RESOLVER_STRING_0_";
 
-Native_RTCStatsReport_stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback_RESOLVER_STRING_1_DOMString";
+  static $stat_Callback(mthis, name) native "RTCStatsReport_stat_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_RTCStatsResponse___getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback_RESOLVER_STRING_1_DOMString";
+class BlinkRTCStatsResponse {
+  static $__getter___Callback(mthis, name) native "RTCStatsResponse___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $namedItem_Callback(mthis, name) native "RTCStatsResponse_namedItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_RTCStatsResponse_result_Callback(mthis) native "RTCStatsResponse_result_Callback_RESOLVER_STRING_0_";
+  static $result_Callback(mthis) native "RTCStatsResponse_result_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Range_collapsed_Getter(mthis) native "Range_collapsed_Getter";
+class BlinkRadioNodeList {}
 
-Native_Range_commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
+class BlinkRange {
+  static $collapsed_Getter(mthis) native "Range_collapsed_Getter";
 
-Native_Range_endContainer_Getter(mthis) native "Range_endContainer_Getter";
+  static $commonAncestorContainer_Getter(mthis) native "Range_commonAncestorContainer_Getter";
 
-Native_Range_endOffset_Getter(mthis) native "Range_endOffset_Getter";
+  static $endContainer_Getter(mthis) native "Range_endContainer_Getter";
 
-Native_Range_startContainer_Getter(mthis) native "Range_startContainer_Getter";
+  static $endOffset_Getter(mthis) native "Range_endOffset_Getter";
 
-Native_Range_startOffset_Getter(mthis) native "Range_startOffset_Getter";
+  static $startContainer_Getter(mthis) native "Range_startContainer_Getter";
 
-Native_Range_cloneContents_Callback(mthis) native "Range_cloneContents_Callback_RESOLVER_STRING_0_";
+  static $startOffset_Getter(mthis) native "Range_startOffset_Getter";
 
-Native_Range_cloneRange_Callback(mthis) native "Range_cloneRange_Callback_RESOLVER_STRING_0_";
+  static $cloneContents_Callback(mthis) native "Range_cloneContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_collapse_Callback(mthis, toStart) native "Range_collapse_Callback_RESOLVER_STRING_1_boolean";
+  static $cloneRange_Callback(mthis) native "Range_cloneRange_Callback_RESOLVER_STRING_0_";
 
-Native_Range_comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback_RESOLVER_STRING_2_Node_long";
+  static $collapse_Callback(mthis, toStart) native "Range_collapse_Callback_RESOLVER_STRING_1_boolean";
 
-Native_Range_createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback_RESOLVER_STRING_1_DOMString";
+  static $comparePoint_Callback(mthis, refNode, offset) native "Range_comparePoint_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_deleteContents_Callback(mthis) native "Range_deleteContents_Callback_RESOLVER_STRING_0_";
+  static $createContextualFragment_Callback(mthis, html) native "Range_createContextualFragment_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_detach_Callback(mthis) native "Range_detach_Callback_RESOLVER_STRING_0_";
+  static $deleteContents_Callback(mthis) native "Range_deleteContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_expand_Callback(mthis, unit) native "Range_expand_Callback_RESOLVER_STRING_1_DOMString";
+  static $detach_Callback(mthis) native "Range_detach_Callback_RESOLVER_STRING_0_";
 
-Native_Range_extractContents_Callback(mthis) native "Range_extractContents_Callback_RESOLVER_STRING_0_";
+  static $expand_Callback(mthis, unit) native "Range_expand_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Range_getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
+  static $extractContents_Callback(mthis) native "Range_extractContents_Callback_RESOLVER_STRING_0_";
 
-Native_Range_getClientRects_Callback(mthis) native "Range_getClientRects_Callback_RESOLVER_STRING_0_";
+  static $getBoundingClientRect_Callback(mthis) native "Range_getBoundingClientRect_Callback_RESOLVER_STRING_0_";
 
-Native_Range_insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback_RESOLVER_STRING_1_Node";
+  static $getClientRects_Callback(mthis) native "Range_getClientRects_Callback_RESOLVER_STRING_0_";
 
-Native_Range_isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback_RESOLVER_STRING_2_Node_long";
+  static $insertNode_Callback(mthis, newNode) native "Range_insertNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback_RESOLVER_STRING_1_Node";
+  static $isPointInRange_Callback(mthis, refNode, offset) native "Range_isPointInRange_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback_RESOLVER_STRING_1_Node";
+  static $selectNode_Callback(mthis, refNode) native "Range_selectNode_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback_RESOLVER_STRING_2_Node_long";
+  static $selectNodeContents_Callback(mthis, refNode) native "Range_selectNodeContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback_RESOLVER_STRING_1_Node";
+  static $setEnd_Callback(mthis, refNode, offset) native "Range_setEnd_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback_RESOLVER_STRING_1_Node";
+  static $setEndAfter_Callback(mthis, refNode) native "Range_setEndAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback_RESOLVER_STRING_2_Node_long";
+  static $setEndBefore_Callback(mthis, refNode) native "Range_setEndBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback_RESOLVER_STRING_1_Node";
+  static $setStart_Callback(mthis, refNode, offset) native "Range_setStart_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Range_setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback_RESOLVER_STRING_1_Node";
+  static $setStartAfter_Callback(mthis, refNode) native "Range_setStartAfter_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback_RESOLVER_STRING_1_Node";
+  static $setStartBefore_Callback(mthis, refNode) native "Range_setStartBefore_Callback_RESOLVER_STRING_1_Node";
 
-Native_Range_toString_Callback(mthis) native "Range_toString_Callback_RESOLVER_STRING_0_";
+  static $surroundContents_Callback(mthis, newParent) native "Range_surroundContents_Callback_RESOLVER_STRING_1_Node";
 
-Native_ResourceProgressEvent_url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+  static $toString_Callback(mthis) native "Range_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SQLError_code_Getter(mthis) native "SQLError_code_Getter";
+class BlinkRect {}
 
-Native_SQLError_message_Getter(mthis) native "SQLError_message_Getter";
+class BlinkResourceProgressEvent {
+  static $url_Getter(mthis) native "ResourceProgressEvent_url_Getter";
+}
 
-Native_SQLResultSet_insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
+class BlinkSQLError {
+  static $code_Getter(mthis) native "SQLError_code_Getter";
 
-Native_SQLResultSet_rows_Getter(mthis) native "SQLResultSet_rows_Getter";
+  static $message_Getter(mthis) native "SQLError_message_Getter";
+}
 
-Native_SQLResultSet_rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+class BlinkSQLResultSet {
+  static $insertId_Getter(mthis) native "SQLResultSet_insertId_Getter";
 
-Native_SQLResultSetRowList_length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
+  static $rows_Getter(mthis) native "SQLResultSet_rows_Getter";
 
-Native_SQLResultSetRowList_NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
+  static $rowsAffected_Getter(mthis) native "SQLResultSet_rowsAffected_Getter";
+}
 
-Native_SQLResultSetRowList_item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
+class BlinkSQLResultSetRowList {
+  static $length_Getter(mthis) native "SQLResultSetRowList_length_Getter";
 
-Native_SQLTransaction_executeSql_Callback(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+  static $NativeIndexed_Getter(mthis, index) native "SQLResultSetRowList_item_Callback";
 
-Native_SVGElement_className_Getter(mthis) native "SVGElement_className_Getter";
+  static $item_Callback(mthis, index) native "SQLResultSetRowList_item_Callback";
+}
 
-Native_SVGElement_ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
+class BlinkSQLTransaction {
+  static $executeSql_Callback(mthis, sqlStatement, arguments, callback, errorCallback) native "SQLTransaction_executeSql_Callback";
+}
 
-Native_SVGElement_style_Getter(mthis) native "SVGElement_style_Getter";
+class BlinkSQLTransactionSync {}
 
-Native_SVGElement_viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
+class BlinkSVGElement {
+  static $className_Getter(mthis) native "SVGElement_className_Getter";
 
-Native_SVGElement_xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
+  static $ownerSVGElement_Getter(mthis) native "SVGElement_ownerSVGElement_Getter";
 
-Native_SVGElement_xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
+  static $style_Getter(mthis) native "SVGElement_style_Getter";
 
-Native_SVGElement_xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
+  static $viewportElement_Getter(mthis) native "SVGElement_viewportElement_Getter";
 
-Native_SVGElement_xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
+  static $xmlbase_Getter(mthis) native "SVGElement_xmlbase_Getter";
 
-Native_SVGElement_xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
+  static $xmlbase_Setter(mthis, value) native "SVGElement_xmlbase_Setter";
 
-Native_SVGElement_xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
+  static $xmllang_Getter(mthis) native "SVGElement_xmllang_Getter";
 
-Native_SVGTests_requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
+  static $xmllang_Setter(mthis, value) native "SVGElement_xmllang_Setter";
 
-Native_SVGTests_requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
+  static $xmlspace_Getter(mthis) native "SVGElement_xmlspace_Getter";
 
-Native_SVGTests_systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
+  static $xmlspace_Setter(mthis, value) native "SVGElement_xmlspace_Setter";
+}
 
-Native_SVGTests_hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkSVGTests {
+  static $requiredExtensions_Getter(mthis) native "SVGTests_requiredExtensions_Getter";
 
-Native_SVGGraphicsElement_farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGTests_requiredFeatures_Getter";
 
-Native_SVGGraphicsElement_nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGTests_systemLanguage_Getter";
 
-Native_SVGGraphicsElement_transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGTests_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGGraphicsElement_getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback_RESOLVER_STRING_0_";
+class BlinkSVGGraphicsElement {
+  static $farthestViewportElement_Getter(mthis) native "SVGGraphicsElement_farthestViewportElement_Getter";
 
-Native_SVGGraphicsElement_getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback_RESOLVER_STRING_0_";
+  static $nearestViewportElement_Getter(mthis) native "SVGGraphicsElement_nearestViewportElement_Getter";
 
-Native_SVGGraphicsElement_getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback_RESOLVER_STRING_0_";
+  static $transform_Getter(mthis) native "SVGGraphicsElement_transform_Getter";
 
-Native_SVGGraphicsElement_getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback_RESOLVER_STRING_1_SVGElement";
+  static $getBBox_Callback(mthis) native "SVGGraphicsElement_getBBox_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+  static $getCTM_Callback(mthis) native "SVGGraphicsElement_getCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+  static $getScreenCTM_Callback(mthis) native "SVGGraphicsElement_getScreenCTM_Callback_RESOLVER_STRING_0_";
 
-Native_SVGGraphicsElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+  static $getTransformToElement_Callback(mthis, element) native "SVGGraphicsElement_getTransformToElement_Callback_RESOLVER_STRING_1_SVGElement";
 
-Native_SVGGraphicsElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
 
-Native_SVGURIReference_href_Getter(mthis) native "SVGURIReference_href_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
 
-Native_SVGAElement_target_Getter(mthis) native "SVGAElement_target_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
 
-Native_SVGAElement_href_Getter(mthis) native "SVGAElement_href_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGTextContentElement_lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
+class BlinkSVGURIReference {
+  static $href_Getter(mthis) native "SVGURIReference_href_Getter";
+}
 
-Native_SVGTextContentElement_textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
+class BlinkSVGAElement {
+  static $target_Getter(mthis) native "SVGAElement_target_Getter";
 
-Native_SVGTextContentElement_getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $href_Getter(mthis) native "SVGAElement_href_Getter";
+}
 
-Native_SVGTextContentElement_getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback_RESOLVER_STRING_0_";
+class BlinkSVGAltGlyphDefElement {}
 
-Native_SVGTextContentElement_getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGTextContentElement {
+  static $lengthAdjust_Getter(mthis) native "SVGTextContentElement_lengthAdjust_Getter";
 
-Native_SVGTextContentElement_getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $textLength_Getter(mthis) native "SVGTextContentElement_textLength_Getter";
 
-Native_SVGTextContentElement_getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback_RESOLVER_STRING_0_";
+  static $getCharNumAtPosition_Callback(mthis, point) native "SVGTextContentElement_getCharNumAtPosition_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGTextContentElement_getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getComputedTextLength_Callback(mthis) native "SVGTextContentElement_getComputedTextLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextContentElement_getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getEndPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getEndPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getExtentOfChar_Callback(mthis, offset) native "SVGTextContentElement_getExtentOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextContentElement_selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getNumberOfChars_Callback(mthis) native "SVGTextContentElement_getNumberOfChars_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTextPositioningElement_dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
+  static $getRotationOfChar_Callback(mthis, offset) native "SVGTextContentElement_getRotationOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextPositioningElement_dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
+  static $getStartPositionOfChar_Callback(mthis, offset) native "SVGTextContentElement_getStartPositionOfChar_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTextPositioningElement_rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
+  static $getSubStringLength_Callback(mthis, offset, length) native "SVGTextContentElement_getSubStringLength_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_SVGTextPositioningElement_x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
+  static $selectSubString_Callback(mthis, offset, length) native "SVGTextContentElement_selectSubString_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+}
 
-Native_SVGTextPositioningElement_y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+class BlinkSVGTextPositioningElement {
+  static $dx_Getter(mthis) native "SVGTextPositioningElement_dx_Getter";
 
-Native_SVGAltGlyphElement_format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
+  static $dy_Getter(mthis) native "SVGTextPositioningElement_dy_Getter";
 
-Native_SVGAltGlyphElement_format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
+  static $rotate_Getter(mthis) native "SVGTextPositioningElement_rotate_Getter";
 
-Native_SVGAltGlyphElement_glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
+  static $x_Getter(mthis) native "SVGTextPositioningElement_x_Getter";
 
-Native_SVGAltGlyphElement_glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
+  static $y_Getter(mthis) native "SVGTextPositioningElement_y_Getter";
+}
 
-Native_SVGAltGlyphElement_href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+class BlinkSVGAltGlyphElement {
+  static $format_Getter(mthis) native "SVGAltGlyphElement_format_Getter";
 
-Native_SVGAngle_unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
+  static $format_Setter(mthis, value) native "SVGAltGlyphElement_format_Setter";
 
-Native_SVGAngle_value_Getter(mthis) native "SVGAngle_value_Getter";
+  static $glyphRef_Getter(mthis) native "SVGAltGlyphElement_glyphRef_Getter";
 
-Native_SVGAngle_value_Setter(mthis, value) native "SVGAngle_value_Setter";
+  static $glyphRef_Setter(mthis, value) native "SVGAltGlyphElement_glyphRef_Setter";
 
-Native_SVGAngle_valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
+  static $href_Getter(mthis) native "SVGAltGlyphElement_href_Getter";
+}
 
-Native_SVGAngle_valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
+class BlinkSVGAltGlyphItemElement {}
 
-Native_SVGAngle_valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
+class BlinkSVGAngle {
+  static $unitType_Getter(mthis) native "SVGAngle_unitType_Getter";
 
-Native_SVGAngle_valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
+  static $value_Getter(mthis) native "SVGAngle_value_Getter";
 
-Native_SVGAngle_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+  static $value_Setter(mthis, value) native "SVGAngle_value_Setter";
 
-Native_SVGAngle_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+  static $valueAsString_Getter(mthis) native "SVGAngle_valueAsString_Getter";
 
-Native_SVGAnimationElement_targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
+  static $valueAsString_Setter(mthis, value) native "SVGAngle_valueAsString_Setter";
 
-Native_SVGAnimationElement_beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback_RESOLVER_STRING_0_";
+  static $valueInSpecifiedUnits_Getter(mthis) native "SVGAngle_valueInSpecifiedUnits_Getter";
 
-Native_SVGAnimationElement_beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback_RESOLVER_STRING_1_float";
+  static $valueInSpecifiedUnits_Setter(mthis, value) native "SVGAngle_valueInSpecifiedUnits_Setter";
 
-Native_SVGAnimationElement_endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback_RESOLVER_STRING_0_";
+  static $convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGAngle_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_SVGAnimationElement_endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback_RESOLVER_STRING_1_float";
+  static $newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGAngle_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+}
 
-Native_SVGAnimationElement_getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
+class BlinkSVGAnimationElement {
+  static $targetElement_Getter(mthis) native "SVGAnimationElement_targetElement_Getter";
 
-Native_SVGAnimationElement_getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback_RESOLVER_STRING_0_";
+  static $beginElement_Callback(mthis) native "SVGAnimationElement_beginElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback_RESOLVER_STRING_0_";
+  static $beginElementAt_Callback(mthis, offset) native "SVGAnimationElement_beginElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
+  static $endElement_Callback(mthis) native "SVGAnimationElement_endElement_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
+  static $endElementAt_Callback(mthis, offset) native "SVGAnimationElement_endElementAt_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGAnimationElement_systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
+  static $getCurrentTime_Callback(mthis) native "SVGAnimationElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimationElement_hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $getSimpleDuration_Callback(mthis) native "SVGAnimationElement_getSimpleDuration_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimatedAngle_animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
+  static $getStartTime_Callback(mthis) native "SVGAnimationElement_getStartTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGAnimatedAngle_baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGAnimationElement_requiredExtensions_Getter";
 
-Native_SVGAnimatedBoolean_animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGAnimationElement_requiredFeatures_Getter";
 
-Native_SVGAnimatedBoolean_baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGAnimationElement_systemLanguage_Getter";
 
-Native_SVGAnimatedBoolean_baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+  static $hasExtension_Callback(mthis, extension) native "SVGAnimationElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGAnimatedEnumeration_animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
+class BlinkSVGAnimateElement {}
 
-Native_SVGAnimatedEnumeration_baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
+class BlinkSVGAnimateMotionElement {}
 
-Native_SVGAnimatedEnumeration_baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+class BlinkSVGAnimateTransformElement {}
 
-Native_SVGAnimatedInteger_animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
+class BlinkSVGAnimatedAngle {
+  static $animVal_Getter(mthis) native "SVGAnimatedAngle_animVal_Getter";
 
-Native_SVGAnimatedInteger_baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedAngle_baseVal_Getter";
+}
 
-Native_SVGAnimatedInteger_baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+class BlinkSVGAnimatedBoolean {
+  static $animVal_Getter(mthis) native "SVGAnimatedBoolean_animVal_Getter";
 
-Native_SVGAnimatedLength_animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedBoolean_baseVal_Getter";
 
-Native_SVGAnimatedLength_baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedBoolean_baseVal_Setter";
+}
 
-Native_SVGAnimatedLengthList_animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
+class BlinkSVGAnimatedEnumeration {
+  static $animVal_Getter(mthis) native "SVGAnimatedEnumeration_animVal_Getter";
 
-Native_SVGAnimatedLengthList_baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedEnumeration_baseVal_Getter";
 
-Native_SVGAnimatedNumber_animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedEnumeration_baseVal_Setter";
+}
 
-Native_SVGAnimatedNumber_baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
+class BlinkSVGAnimatedInteger {
+  static $animVal_Getter(mthis) native "SVGAnimatedInteger_animVal_Getter";
 
-Native_SVGAnimatedNumber_baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedInteger_baseVal_Getter";
 
-Native_SVGAnimatedNumberList_animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedInteger_baseVal_Setter";
+}
 
-Native_SVGAnimatedNumberList_baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+class BlinkSVGAnimatedLength {
+  static $animVal_Getter(mthis) native "SVGAnimatedLength_animVal_Getter";
 
-Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedLength_baseVal_Getter";
+}
 
-Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+class BlinkSVGAnimatedLengthList {
+  static $animVal_Getter(mthis) native "SVGAnimatedLengthList_animVal_Getter";
 
-Native_SVGAnimatedRect_animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedLengthList_baseVal_Getter";
+}
 
-Native_SVGAnimatedRect_baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+class BlinkSVGAnimatedNumber {
+  static $animVal_Getter(mthis) native "SVGAnimatedNumber_animVal_Getter";
 
-Native_SVGAnimatedString_animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedNumber_baseVal_Getter";
 
-Native_SVGAnimatedString_baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedNumber_baseVal_Setter";
+}
 
-Native_SVGAnimatedString_baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+class BlinkSVGAnimatedNumberList {
+  static $animVal_Getter(mthis) native "SVGAnimatedNumberList_animVal_Getter";
 
-Native_SVGAnimatedTransformList_animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedNumberList_baseVal_Getter";
+}
 
-Native_SVGAnimatedTransformList_baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+class BlinkSVGAnimatedPreserveAspectRatio {
+  static $animVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_animVal_Getter";
 
-Native_SVGGeometryElement_isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $baseVal_Getter(mthis) native "SVGAnimatedPreserveAspectRatio_baseVal_Getter";
+}
 
-Native_SVGGeometryElement_isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback_RESOLVER_STRING_1_SVGPoint";
+class BlinkSVGAnimatedRect {
+  static $animVal_Getter(mthis) native "SVGAnimatedRect_animVal_Getter";
 
-Native_SVGCircleElement_cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedRect_baseVal_Getter";
+}
 
-Native_SVGCircleElement_cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
+class BlinkSVGAnimatedString {
+  static $animVal_Getter(mthis) native "SVGAnimatedString_animVal_Getter";
 
-Native_SVGCircleElement_r_Getter(mthis) native "SVGCircleElement_r_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedString_baseVal_Getter";
 
-Native_SVGClipPathElement_clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+  static $baseVal_Setter(mthis, value) native "SVGAnimatedString_baseVal_Setter";
+}
 
-Native_SVGElementInstance_correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
+class BlinkSVGAnimatedTransformList {
+  static $animVal_Getter(mthis) native "SVGAnimatedTransformList_animVal_Getter";
 
-Native_SVGElementInstance_correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
+  static $baseVal_Getter(mthis) native "SVGAnimatedTransformList_baseVal_Getter";
+}
 
-Native_SVGElementInstance_firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
+class BlinkSVGGeometryElement {
+  static $isPointInFill_Callback(mthis, point) native "SVGGeometryElement_isPointInFill_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGElementInstance_lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
+  static $isPointInStroke_Callback(mthis, point) native "SVGGeometryElement_isPointInStroke_Callback_RESOLVER_STRING_1_SVGPoint";
+}
 
-Native_SVGElementInstance_nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
+class BlinkSVGCircleElement {
+  static $cx_Getter(mthis) native "SVGCircleElement_cx_Getter";
 
-Native_SVGElementInstance_parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
+  static $cy_Getter(mthis) native "SVGCircleElement_cy_Getter";
 
-Native_SVGElementInstance_previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
+  static $r_Getter(mthis) native "SVGCircleElement_r_Getter";
+}
 
-Native_SVGElementInstanceList_length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
+class BlinkSVGClipPathElement {
+  static $clipPathUnits_Getter(mthis) native "SVGClipPathElement_clipPathUnits_Getter";
+}
 
-Native_SVGElementInstanceList_NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGComponentTransferFunctionElement {}
 
-Native_SVGElementInstanceList_item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGCursorElement {}
 
-Native_SVGEllipseElement_cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
+class BlinkSVGDefsElement {}
 
-Native_SVGEllipseElement_cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
+class BlinkSVGDescElement {}
 
-Native_SVGEllipseElement_rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
+class BlinkSVGDiscardElement {}
 
-Native_SVGEllipseElement_ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+class BlinkSVGElementInstance {
+  static $correspondingElement_Getter(mthis) native "SVGElementInstance_correspondingElement_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
+  static $correspondingUseElement_Getter(mthis) native "SVGElementInstance_correspondingUseElement_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
+  static $firstChild_Getter(mthis) native "SVGElementInstance_firstChild_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
+  static $lastChild_Getter(mthis) native "SVGElementInstance_lastChild_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
+  static $nextSibling_Getter(mthis) native "SVGElementInstance_nextSibling_Getter";
 
-Native_SVGFilterPrimitiveStandardAttributes_y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+  static $parentNode_Getter(mthis) native "SVGElementInstance_parentNode_Getter";
 
-Native_SVGFEBlendElement_in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
+  static $previousSibling_Getter(mthis) native "SVGElementInstance_previousSibling_Getter";
+}
 
-Native_SVGFEBlendElement_in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
+class BlinkSVGElementInstanceList {
+  static $length_Getter(mthis) native "SVGElementInstanceList_length_Getter";
 
-Native_SVGFEBlendElement_mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
+  static $NativeIndexed_Getter(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGFEBlendElement_height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
+  static $item_Callback(mthis, index) native "SVGElementInstanceList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SVGFEBlendElement_result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
+class BlinkSVGEllipseElement {
+  static $cx_Getter(mthis) native "SVGEllipseElement_cx_Getter";
 
-Native_SVGFEBlendElement_width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
+  static $cy_Getter(mthis) native "SVGEllipseElement_cy_Getter";
 
-Native_SVGFEBlendElement_x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
+  static $rx_Getter(mthis) native "SVGEllipseElement_rx_Getter";
 
-Native_SVGFEBlendElement_y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+  static $ry_Getter(mthis) native "SVGEllipseElement_ry_Getter";
+}
 
-Native_SVGFEColorMatrixElement_in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
+class BlinkSVGFilterPrimitiveStandardAttributes {
+  static $height_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_height_Getter";
 
-Native_SVGFEColorMatrixElement_type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
+  static $result_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_result_Getter";
 
-Native_SVGFEColorMatrixElement_values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
+  static $width_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_width_Getter";
 
-Native_SVGFEColorMatrixElement_height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
+  static $x_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_x_Getter";
 
-Native_SVGFEColorMatrixElement_result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
+  static $y_Getter(mthis) native "SVGFilterPrimitiveStandardAttributes_y_Getter";
+}
 
-Native_SVGFEColorMatrixElement_width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
+class BlinkSVGFEBlendElement {
+  static $in1_Getter(mthis) native "SVGFEBlendElement_in1_Getter";
 
-Native_SVGFEColorMatrixElement_x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
+  static $in2_Getter(mthis) native "SVGFEBlendElement_in2_Getter";
 
-Native_SVGFEColorMatrixElement_y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+  static $mode_Getter(mthis) native "SVGFEBlendElement_mode_Getter";
 
-Native_SVGFEComponentTransferElement_in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
+  static $height_Getter(mthis) native "SVGFEBlendElement_height_Getter";
 
-Native_SVGFEComponentTransferElement_height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEBlendElement_result_Getter";
 
-Native_SVGFEComponentTransferElement_result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEBlendElement_width_Getter";
 
-Native_SVGFEComponentTransferElement_width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEBlendElement_x_Getter";
 
-Native_SVGFEComponentTransferElement_x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEBlendElement_y_Getter";
+}
 
-Native_SVGFEComponentTransferElement_y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+class BlinkSVGFEColorMatrixElement {
+  static $in1_Getter(mthis) native "SVGFEColorMatrixElement_in1_Getter";
 
-Native_SVGFECompositeElement_in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
+  static $type_Getter(mthis) native "SVGFEColorMatrixElement_type_Getter";
 
-Native_SVGFECompositeElement_in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
+  static $values_Getter(mthis) native "SVGFEColorMatrixElement_values_Getter";
 
-Native_SVGFECompositeElement_k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
+  static $height_Getter(mthis) native "SVGFEColorMatrixElement_height_Getter";
 
-Native_SVGFECompositeElement_k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
+  static $result_Getter(mthis) native "SVGFEColorMatrixElement_result_Getter";
 
-Native_SVGFECompositeElement_k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
+  static $width_Getter(mthis) native "SVGFEColorMatrixElement_width_Getter";
 
-Native_SVGFECompositeElement_k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
+  static $x_Getter(mthis) native "SVGFEColorMatrixElement_x_Getter";
 
-Native_SVGFECompositeElement_operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
+  static $y_Getter(mthis) native "SVGFEColorMatrixElement_y_Getter";
+}
 
-Native_SVGFECompositeElement_height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
+class BlinkSVGFEComponentTransferElement {
+  static $in1_Getter(mthis) native "SVGFEComponentTransferElement_in1_Getter";
 
-Native_SVGFECompositeElement_result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
+  static $height_Getter(mthis) native "SVGFEComponentTransferElement_height_Getter";
 
-Native_SVGFECompositeElement_width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
+  static $result_Getter(mthis) native "SVGFEComponentTransferElement_result_Getter";
 
-Native_SVGFECompositeElement_x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFEComponentTransferElement_width_Getter";
 
-Native_SVGFECompositeElement_y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFEComponentTransferElement_x_Getter";
 
-Native_SVGFEConvolveMatrixElement_bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
+  static $y_Getter(mthis) native "SVGFEComponentTransferElement_y_Getter";
+}
 
-Native_SVGFEConvolveMatrixElement_divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
+class BlinkSVGFECompositeElement {
+  static $in1_Getter(mthis) native "SVGFECompositeElement_in1_Getter";
 
-Native_SVGFEConvolveMatrixElement_edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
+  static $in2_Getter(mthis) native "SVGFECompositeElement_in2_Getter";
 
-Native_SVGFEConvolveMatrixElement_in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
+  static $k1_Getter(mthis) native "SVGFECompositeElement_k1_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
+  static $k2_Getter(mthis) native "SVGFECompositeElement_k2_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
+  static $k3_Getter(mthis) native "SVGFECompositeElement_k3_Getter";
 
-Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
+  static $k4_Getter(mthis) native "SVGFECompositeElement_k4_Getter";
 
-Native_SVGFEConvolveMatrixElement_orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
+  static $operator_Getter(mthis) native "SVGFECompositeElement_operator_Getter";
 
-Native_SVGFEConvolveMatrixElement_orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
+  static $height_Getter(mthis) native "SVGFECompositeElement_height_Getter";
 
-Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
+  static $result_Getter(mthis) native "SVGFECompositeElement_result_Getter";
 
-Native_SVGFEConvolveMatrixElement_targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
+  static $width_Getter(mthis) native "SVGFECompositeElement_width_Getter";
 
-Native_SVGFEConvolveMatrixElement_targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
+  static $x_Getter(mthis) native "SVGFECompositeElement_x_Getter";
 
-Native_SVGFEConvolveMatrixElement_height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
+  static $y_Getter(mthis) native "SVGFECompositeElement_y_Getter";
+}
 
-Native_SVGFEConvolveMatrixElement_result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
+class BlinkSVGFEConvolveMatrixElement {
+  static $bias_Getter(mthis) native "SVGFEConvolveMatrixElement_bias_Getter";
 
-Native_SVGFEConvolveMatrixElement_width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
+  static $divisor_Getter(mthis) native "SVGFEConvolveMatrixElement_divisor_Getter";
 
-Native_SVGFEConvolveMatrixElement_x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
+  static $edgeMode_Getter(mthis) native "SVGFEConvolveMatrixElement_edgeMode_Getter";
 
-Native_SVGFEConvolveMatrixElement_y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+  static $in1_Getter(mthis) native "SVGFEConvolveMatrixElement_in1_Getter";
 
-Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
+  static $kernelMatrix_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelMatrix_Getter";
 
-Native_SVGFEDiffuseLightingElement_in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
+  static $kernelUnitLengthX_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter";
 
-Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
+  static $kernelUnitLengthY_Getter(mthis) native "SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter";
 
-Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
+  static $orderX_Getter(mthis) native "SVGFEConvolveMatrixElement_orderX_Getter";
 
-Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
+  static $orderY_Getter(mthis) native "SVGFEConvolveMatrixElement_orderY_Getter";
 
-Native_SVGFEDiffuseLightingElement_height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
+  static $preserveAlpha_Getter(mthis) native "SVGFEConvolveMatrixElement_preserveAlpha_Getter";
 
-Native_SVGFEDiffuseLightingElement_result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
+  static $targetX_Getter(mthis) native "SVGFEConvolveMatrixElement_targetX_Getter";
 
-Native_SVGFEDiffuseLightingElement_width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
+  static $targetY_Getter(mthis) native "SVGFEConvolveMatrixElement_targetY_Getter";
 
-Native_SVGFEDiffuseLightingElement_x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
+  static $height_Getter(mthis) native "SVGFEConvolveMatrixElement_height_Getter";
 
-Native_SVGFEDiffuseLightingElement_y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+  static $result_Getter(mthis) native "SVGFEConvolveMatrixElement_result_Getter";
 
-Native_SVGFEDisplacementMapElement_in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
+  static $width_Getter(mthis) native "SVGFEConvolveMatrixElement_width_Getter";
 
-Native_SVGFEDisplacementMapElement_in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
+  static $x_Getter(mthis) native "SVGFEConvolveMatrixElement_x_Getter";
 
-Native_SVGFEDisplacementMapElement_scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
+  static $y_Getter(mthis) native "SVGFEConvolveMatrixElement_y_Getter";
+}
 
-Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
+class BlinkSVGFEDiffuseLightingElement {
+  static $diffuseConstant_Getter(mthis) native "SVGFEDiffuseLightingElement_diffuseConstant_Getter";
 
-Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
+  static $in1_Getter(mthis) native "SVGFEDiffuseLightingElement_in1_Getter";
 
-Native_SVGFEDisplacementMapElement_height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
+  static $kernelUnitLengthX_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter";
 
-Native_SVGFEDisplacementMapElement_result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
+  static $kernelUnitLengthY_Getter(mthis) native "SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter";
 
-Native_SVGFEDisplacementMapElement_width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
+  static $surfaceScale_Getter(mthis) native "SVGFEDiffuseLightingElement_surfaceScale_Getter";
 
-Native_SVGFEDisplacementMapElement_x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
+  static $height_Getter(mthis) native "SVGFEDiffuseLightingElement_height_Getter";
 
-Native_SVGFEDisplacementMapElement_y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+  static $result_Getter(mthis) native "SVGFEDiffuseLightingElement_result_Getter";
 
-Native_SVGFEDistantLightElement_azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
+  static $width_Getter(mthis) native "SVGFEDiffuseLightingElement_width_Getter";
 
-Native_SVGFEDistantLightElement_elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+  static $x_Getter(mthis) native "SVGFEDiffuseLightingElement_x_Getter";
 
-Native_SVGFEFloodElement_height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
+  static $y_Getter(mthis) native "SVGFEDiffuseLightingElement_y_Getter";
+}
 
-Native_SVGFEFloodElement_result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
+class BlinkSVGFEDisplacementMapElement {
+  static $in1_Getter(mthis) native "SVGFEDisplacementMapElement_in1_Getter";
 
-Native_SVGFEFloodElement_width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
+  static $in2_Getter(mthis) native "SVGFEDisplacementMapElement_in2_Getter";
 
-Native_SVGFEFloodElement_x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
+  static $scale_Getter(mthis) native "SVGFEDisplacementMapElement_scale_Getter";
 
-Native_SVGFEFloodElement_y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+  static $xChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_xChannelSelector_Getter";
 
-Native_SVGFEGaussianBlurElement_in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
+  static $yChannelSelector_Getter(mthis) native "SVGFEDisplacementMapElement_yChannelSelector_Getter";
 
-Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
+  static $height_Getter(mthis) native "SVGFEDisplacementMapElement_height_Getter";
 
-Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
+  static $result_Getter(mthis) native "SVGFEDisplacementMapElement_result_Getter";
 
-Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback_RESOLVER_STRING_2_float_float";
+  static $width_Getter(mthis) native "SVGFEDisplacementMapElement_width_Getter";
 
-Native_SVGFEGaussianBlurElement_height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
+  static $x_Getter(mthis) native "SVGFEDisplacementMapElement_x_Getter";
 
-Native_SVGFEGaussianBlurElement_result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
+  static $y_Getter(mthis) native "SVGFEDisplacementMapElement_y_Getter";
+}
 
-Native_SVGFEGaussianBlurElement_width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
+class BlinkSVGFEDistantLightElement {
+  static $azimuth_Getter(mthis) native "SVGFEDistantLightElement_azimuth_Getter";
 
-Native_SVGFEGaussianBlurElement_x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
+  static $elevation_Getter(mthis) native "SVGFEDistantLightElement_elevation_Getter";
+}
 
-Native_SVGFEGaussianBlurElement_y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+class BlinkSVGFEDropShadowElement {}
 
-Native_SVGFEImageElement_preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
+class BlinkSVGFEFloodElement {
+  static $height_Getter(mthis) native "SVGFEFloodElement_height_Getter";
 
-Native_SVGFEImageElement_height_Getter(mthis) native "SVGFEImageElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEFloodElement_result_Getter";
 
-Native_SVGFEImageElement_result_Getter(mthis) native "SVGFEImageElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEFloodElement_width_Getter";
 
-Native_SVGFEImageElement_width_Getter(mthis) native "SVGFEImageElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEFloodElement_x_Getter";
 
-Native_SVGFEImageElement_x_Getter(mthis) native "SVGFEImageElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEFloodElement_y_Getter";
+}
 
-Native_SVGFEImageElement_y_Getter(mthis) native "SVGFEImageElement_y_Getter";
+class BlinkSVGFEFuncAElement {}
 
-Native_SVGFEImageElement_href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+class BlinkSVGFEFuncBElement {}
 
-Native_SVGFEMergeElement_height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
+class BlinkSVGFEFuncGElement {}
 
-Native_SVGFEMergeElement_result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
+class BlinkSVGFEFuncRElement {}
 
-Native_SVGFEMergeElement_width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
+class BlinkSVGFEGaussianBlurElement {
+  static $in1_Getter(mthis) native "SVGFEGaussianBlurElement_in1_Getter";
 
-Native_SVGFEMergeElement_x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
+  static $stdDeviationX_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationX_Getter";
 
-Native_SVGFEMergeElement_y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+  static $stdDeviationY_Getter(mthis) native "SVGFEGaussianBlurElement_stdDeviationY_Getter";
 
-Native_SVGFEMergeNodeElement_in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+  static $setStdDeviation_Callback(mthis, stdDeviationX, stdDeviationY) native "SVGFEGaussianBlurElement_setStdDeviation_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGFEMorphologyElement_in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
+  static $height_Getter(mthis) native "SVGFEGaussianBlurElement_height_Getter";
 
-Native_SVGFEMorphologyElement_operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
+  static $result_Getter(mthis) native "SVGFEGaussianBlurElement_result_Getter";
 
-Native_SVGFEMorphologyElement_radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
+  static $width_Getter(mthis) native "SVGFEGaussianBlurElement_width_Getter";
 
-Native_SVGFEMorphologyElement_radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
+  static $x_Getter(mthis) native "SVGFEGaussianBlurElement_x_Getter";
 
-Native_SVGFEMorphologyElement_setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback_RESOLVER_STRING_2_float_float";
+  static $y_Getter(mthis) native "SVGFEGaussianBlurElement_y_Getter";
+}
 
-Native_SVGFEMorphologyElement_height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
+class BlinkSVGFEImageElement {
+  static $preserveAspectRatio_Getter(mthis) native "SVGFEImageElement_preserveAspectRatio_Getter";
 
-Native_SVGFEMorphologyElement_result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
+  static $height_Getter(mthis) native "SVGFEImageElement_height_Getter";
 
-Native_SVGFEMorphologyElement_width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
+  static $result_Getter(mthis) native "SVGFEImageElement_result_Getter";
 
-Native_SVGFEMorphologyElement_x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFEImageElement_width_Getter";
 
-Native_SVGFEMorphologyElement_y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFEImageElement_x_Getter";
 
-Native_SVGFEOffsetElement_dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
+  static $y_Getter(mthis) native "SVGFEImageElement_y_Getter";
 
-Native_SVGFEOffsetElement_dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
+  static $href_Getter(mthis) native "SVGFEImageElement_href_Getter";
+}
 
-Native_SVGFEOffsetElement_in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
+class BlinkSVGFEMergeElement {
+  static $height_Getter(mthis) native "SVGFEMergeElement_height_Getter";
 
-Native_SVGFEOffsetElement_height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFEMergeElement_result_Getter";
 
-Native_SVGFEOffsetElement_result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
+  static $width_Getter(mthis) native "SVGFEMergeElement_width_Getter";
 
-Native_SVGFEOffsetElement_width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFEMergeElement_x_Getter";
 
-Native_SVGFEOffsetElement_x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEMergeElement_y_Getter";
+}
 
-Native_SVGFEOffsetElement_y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+class BlinkSVGFEMergeNodeElement {
+  static $in1_Getter(mthis) native "SVGFEMergeNodeElement_in1_Getter";
+}
 
-Native_SVGFEPointLightElement_x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
+class BlinkSVGFEMorphologyElement {
+  static $in1_Getter(mthis) native "SVGFEMorphologyElement_in1_Getter";
 
-Native_SVGFEPointLightElement_y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
+  static $operator_Getter(mthis) native "SVGFEMorphologyElement_operator_Getter";
 
-Native_SVGFEPointLightElement_z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+  static $radiusX_Getter(mthis) native "SVGFEMorphologyElement_radiusX_Getter";
 
-Native_SVGFESpecularLightingElement_in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
+  static $radiusY_Getter(mthis) native "SVGFEMorphologyElement_radiusY_Getter";
 
-Native_SVGFESpecularLightingElement_specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
+  static $setRadius_Callback(mthis, radiusX, radiusY) native "SVGFEMorphologyElement_setRadius_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGFESpecularLightingElement_specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
+  static $height_Getter(mthis) native "SVGFEMorphologyElement_height_Getter";
 
-Native_SVGFESpecularLightingElement_surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
+  static $result_Getter(mthis) native "SVGFEMorphologyElement_result_Getter";
 
-Native_SVGFESpecularLightingElement_height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
+  static $width_Getter(mthis) native "SVGFEMorphologyElement_width_Getter";
 
-Native_SVGFESpecularLightingElement_result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
+  static $x_Getter(mthis) native "SVGFEMorphologyElement_x_Getter";
 
-Native_SVGFESpecularLightingElement_width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
+  static $y_Getter(mthis) native "SVGFEMorphologyElement_y_Getter";
+}
 
-Native_SVGFESpecularLightingElement_x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
+class BlinkSVGFEOffsetElement {
+  static $dx_Getter(mthis) native "SVGFEOffsetElement_dx_Getter";
 
-Native_SVGFESpecularLightingElement_y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+  static $dy_Getter(mthis) native "SVGFEOffsetElement_dy_Getter";
 
-Native_SVGFESpotLightElement_limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
+  static $in1_Getter(mthis) native "SVGFEOffsetElement_in1_Getter";
 
-Native_SVGFESpotLightElement_pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
+  static $height_Getter(mthis) native "SVGFEOffsetElement_height_Getter";
 
-Native_SVGFESpotLightElement_pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
+  static $result_Getter(mthis) native "SVGFEOffsetElement_result_Getter";
 
-Native_SVGFESpotLightElement_pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
+  static $width_Getter(mthis) native "SVGFEOffsetElement_width_Getter";
 
-Native_SVGFESpotLightElement_specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
+  static $x_Getter(mthis) native "SVGFEOffsetElement_x_Getter";
 
-Native_SVGFESpotLightElement_x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFEOffsetElement_y_Getter";
+}
 
-Native_SVGFESpotLightElement_y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
+class BlinkSVGFEPointLightElement {
+  static $x_Getter(mthis) native "SVGFEPointLightElement_x_Getter";
 
-Native_SVGFESpotLightElement_z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+  static $y_Getter(mthis) native "SVGFEPointLightElement_y_Getter";
 
-Native_SVGFETileElement_in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
+  static $z_Getter(mthis) native "SVGFEPointLightElement_z_Getter";
+}
 
-Native_SVGFETileElement_height_Getter(mthis) native "SVGFETileElement_height_Getter";
+class BlinkSVGFESpecularLightingElement {
+  static $in1_Getter(mthis) native "SVGFESpecularLightingElement_in1_Getter";
 
-Native_SVGFETileElement_result_Getter(mthis) native "SVGFETileElement_result_Getter";
+  static $specularConstant_Getter(mthis) native "SVGFESpecularLightingElement_specularConstant_Getter";
 
-Native_SVGFETileElement_width_Getter(mthis) native "SVGFETileElement_width_Getter";
+  static $specularExponent_Getter(mthis) native "SVGFESpecularLightingElement_specularExponent_Getter";
 
-Native_SVGFETileElement_x_Getter(mthis) native "SVGFETileElement_x_Getter";
+  static $surfaceScale_Getter(mthis) native "SVGFESpecularLightingElement_surfaceScale_Getter";
 
-Native_SVGFETileElement_y_Getter(mthis) native "SVGFETileElement_y_Getter";
+  static $height_Getter(mthis) native "SVGFESpecularLightingElement_height_Getter";
 
-Native_SVGFETurbulenceElement_baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
+  static $result_Getter(mthis) native "SVGFESpecularLightingElement_result_Getter";
 
-Native_SVGFETurbulenceElement_baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
+  static $width_Getter(mthis) native "SVGFESpecularLightingElement_width_Getter";
 
-Native_SVGFETurbulenceElement_numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
+  static $x_Getter(mthis) native "SVGFESpecularLightingElement_x_Getter";
 
-Native_SVGFETurbulenceElement_seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
+  static $y_Getter(mthis) native "SVGFESpecularLightingElement_y_Getter";
+}
 
-Native_SVGFETurbulenceElement_stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
+class BlinkSVGFESpotLightElement {
+  static $limitingConeAngle_Getter(mthis) native "SVGFESpotLightElement_limitingConeAngle_Getter";
 
-Native_SVGFETurbulenceElement_type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
+  static $pointsAtX_Getter(mthis) native "SVGFESpotLightElement_pointsAtX_Getter";
 
-Native_SVGFETurbulenceElement_height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
+  static $pointsAtY_Getter(mthis) native "SVGFESpotLightElement_pointsAtY_Getter";
 
-Native_SVGFETurbulenceElement_result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
+  static $pointsAtZ_Getter(mthis) native "SVGFESpotLightElement_pointsAtZ_Getter";
 
-Native_SVGFETurbulenceElement_width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
+  static $specularExponent_Getter(mthis) native "SVGFESpotLightElement_specularExponent_Getter";
 
-Native_SVGFETurbulenceElement_x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
+  static $x_Getter(mthis) native "SVGFESpotLightElement_x_Getter";
 
-Native_SVGFETurbulenceElement_y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+  static $y_Getter(mthis) native "SVGFESpotLightElement_y_Getter";
 
-Native_SVGFilterElement_filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
+  static $z_Getter(mthis) native "SVGFESpotLightElement_z_Getter";
+}
 
-Native_SVGFilterElement_filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
+class BlinkSVGFETileElement {
+  static $in1_Getter(mthis) native "SVGFETileElement_in1_Getter";
 
-Native_SVGFilterElement_filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
+  static $height_Getter(mthis) native "SVGFETileElement_height_Getter";
 
-Native_SVGFilterElement_height_Getter(mthis) native "SVGFilterElement_height_Getter";
+  static $result_Getter(mthis) native "SVGFETileElement_result_Getter";
 
-Native_SVGFilterElement_primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
+  static $width_Getter(mthis) native "SVGFETileElement_width_Getter";
 
-Native_SVGFilterElement_width_Getter(mthis) native "SVGFilterElement_width_Getter";
+  static $x_Getter(mthis) native "SVGFETileElement_x_Getter";
 
-Native_SVGFilterElement_x_Getter(mthis) native "SVGFilterElement_x_Getter";
+  static $y_Getter(mthis) native "SVGFETileElement_y_Getter";
+}
 
-Native_SVGFilterElement_y_Getter(mthis) native "SVGFilterElement_y_Getter";
+class BlinkSVGFETurbulenceElement {
+  static $baseFrequencyX_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyX_Getter";
 
-Native_SVGFilterElement_setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $baseFrequencyY_Getter(mthis) native "SVGFETurbulenceElement_baseFrequencyY_Getter";
 
-Native_SVGFilterElement_href_Getter(mthis) native "SVGFilterElement_href_Getter";
+  static $numOctaves_Getter(mthis) native "SVGFETurbulenceElement_numOctaves_Getter";
 
-Native_SVGFitToViewBox_preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
+  static $seed_Getter(mthis) native "SVGFETurbulenceElement_seed_Getter";
 
-Native_SVGFitToViewBox_viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
+  static $stitchTiles_Getter(mthis) native "SVGFETurbulenceElement_stitchTiles_Getter";
 
-Native_SVGForeignObjectElement_height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
+  static $type_Getter(mthis) native "SVGFETurbulenceElement_type_Getter";
 
-Native_SVGForeignObjectElement_width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
+  static $height_Getter(mthis) native "SVGFETurbulenceElement_height_Getter";
 
-Native_SVGForeignObjectElement_x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
+  static $result_Getter(mthis) native "SVGFETurbulenceElement_result_Getter";
 
-Native_SVGForeignObjectElement_y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+  static $width_Getter(mthis) native "SVGFETurbulenceElement_width_Getter";
 
-Native_SVGGradientElement_gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
+  static $x_Getter(mthis) native "SVGFETurbulenceElement_x_Getter";
 
-Native_SVGGradientElement_gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
+  static $y_Getter(mthis) native "SVGFETurbulenceElement_y_Getter";
+}
 
-Native_SVGGradientElement_spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
+class BlinkSVGFilterElement {
+  static $filterResX_Getter(mthis) native "SVGFilterElement_filterResX_Getter";
 
-Native_SVGGradientElement_href_Getter(mthis) native "SVGGradientElement_href_Getter";
+  static $filterResY_Getter(mthis) native "SVGFilterElement_filterResY_Getter";
 
-Native_SVGImageElement_height_Getter(mthis) native "SVGImageElement_height_Getter";
+  static $filterUnits_Getter(mthis) native "SVGFilterElement_filterUnits_Getter";
 
-Native_SVGImageElement_preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
+  static $height_Getter(mthis) native "SVGFilterElement_height_Getter";
 
-Native_SVGImageElement_width_Getter(mthis) native "SVGImageElement_width_Getter";
+  static $primitiveUnits_Getter(mthis) native "SVGFilterElement_primitiveUnits_Getter";
 
-Native_SVGImageElement_x_Getter(mthis) native "SVGImageElement_x_Getter";
+  static $width_Getter(mthis) native "SVGFilterElement_width_Getter";
 
-Native_SVGImageElement_y_Getter(mthis) native "SVGImageElement_y_Getter";
+  static $x_Getter(mthis) native "SVGFilterElement_x_Getter";
 
-Native_SVGImageElement_href_Getter(mthis) native "SVGImageElement_href_Getter";
+  static $y_Getter(mthis) native "SVGFilterElement_y_Getter";
 
-Native_SVGLength_unitType_Getter(mthis) native "SVGLength_unitType_Getter";
+  static $setFilterRes_Callback(mthis, filterResX, filterResY) native "SVGFilterElement_setFilterRes_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_SVGLength_value_Getter(mthis) native "SVGLength_value_Getter";
+  static $href_Getter(mthis) native "SVGFilterElement_href_Getter";
+}
 
-Native_SVGLength_value_Setter(mthis, value) native "SVGLength_value_Setter";
+class BlinkSVGFitToViewBox {
+  static $preserveAspectRatio_Getter(mthis) native "SVGFitToViewBox_preserveAspectRatio_Getter";
 
-Native_SVGLength_valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+  static $viewBox_Getter(mthis) native "SVGFitToViewBox_viewBox_Getter";
+}
 
-Native_SVGLength_valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+class BlinkSVGFontElement {}
 
-Native_SVGLength_valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+class BlinkSVGFontFaceElement {}
 
-Native_SVGLength_valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+class BlinkSVGFontFaceFormatElement {}
 
-Native_SVGLength_convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+class BlinkSVGFontFaceNameElement {}
 
-Native_SVGLength_newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+class BlinkSVGFontFaceSrcElement {}
 
-Native_SVGLengthList_numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+class BlinkSVGFontFaceUriElement {}
 
-Native_SVGLengthList_appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback_RESOLVER_STRING_1_SVGLength";
+class BlinkSVGForeignObjectElement {
+  static $height_Getter(mthis) native "SVGForeignObjectElement_height_Getter";
 
-Native_SVGLengthList_clear_Callback(mthis) native "SVGLengthList_clear_Callback_RESOLVER_STRING_0_";
+  static $width_Getter(mthis) native "SVGForeignObjectElement_width_Getter";
 
-Native_SVGLengthList_getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $x_Getter(mthis) native "SVGForeignObjectElement_x_Getter";
 
-Native_SVGLengthList_initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback_RESOLVER_STRING_1_SVGLength";
+  static $y_Getter(mthis) native "SVGForeignObjectElement_y_Getter";
+}
 
-Native_SVGLengthList_insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+class BlinkSVGGElement {}
 
-Native_SVGLengthList_removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGGlyphElement {}
 
-Native_SVGLengthList_replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+class BlinkSVGGlyphRefElement {}
 
-Native_SVGLineElement_x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+class BlinkSVGGradientElement {
+  static $gradientTransform_Getter(mthis) native "SVGGradientElement_gradientTransform_Getter";
 
-Native_SVGLineElement_x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+  static $gradientUnits_Getter(mthis) native "SVGGradientElement_gradientUnits_Getter";
 
-Native_SVGLineElement_y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+  static $spreadMethod_Getter(mthis) native "SVGGradientElement_spreadMethod_Getter";
 
-Native_SVGLineElement_y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+  static $href_Getter(mthis) native "SVGGradientElement_href_Getter";
+}
 
-Native_SVGLinearGradientElement_x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+class BlinkSVGHKernElement {}
 
-Native_SVGLinearGradientElement_x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+class BlinkSVGImageElement {
+  static $height_Getter(mthis) native "SVGImageElement_height_Getter";
 
-Native_SVGLinearGradientElement_y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGImageElement_preserveAspectRatio_Getter";
 
-Native_SVGLinearGradientElement_y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+  static $width_Getter(mthis) native "SVGImageElement_width_Getter";
 
-Native_SVGMarkerElement_markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+  static $x_Getter(mthis) native "SVGImageElement_x_Getter";
 
-Native_SVGMarkerElement_markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+  static $y_Getter(mthis) native "SVGImageElement_y_Getter";
+
+  static $href_Getter(mthis) native "SVGImageElement_href_Getter";
+}
+
+class BlinkSVGLength {
+  static $unitType_Getter(mthis) native "SVGLength_unitType_Getter";
+
+  static $value_Getter(mthis) native "SVGLength_value_Getter";
+
+  static $value_Setter(mthis, value) native "SVGLength_value_Setter";
+
+  static $valueAsString_Getter(mthis) native "SVGLength_valueAsString_Getter";
+
+  static $valueAsString_Setter(mthis, value) native "SVGLength_valueAsString_Setter";
+
+  static $valueInSpecifiedUnits_Getter(mthis) native "SVGLength_valueInSpecifiedUnits_Getter";
+
+  static $valueInSpecifiedUnits_Setter(mthis, value) native "SVGLength_valueInSpecifiedUnits_Setter";
+
+  static $convertToSpecifiedUnits_Callback(mthis, unitType) native "SVGLength_convertToSpecifiedUnits_Callback_RESOLVER_STRING_1_unsigned short";
+
+  static $newValueSpecifiedUnits_Callback(mthis, unitType, valueInSpecifiedUnits) native "SVGLength_newValueSpecifiedUnits_Callback_RESOLVER_STRING_2_unsigned short_float";
+}
+
+class BlinkSVGLengthList {
+  static $numberOfItems_Getter(mthis) native "SVGLengthList_numberOfItems_Getter";
+
+  static $appendItem_Callback(mthis, item) native "SVGLengthList_appendItem_Callback_RESOLVER_STRING_1_SVGLength";
+
+  static $clear_Callback(mthis) native "SVGLengthList_clear_Callback_RESOLVER_STRING_0_";
+
+  static $getItem_Callback(mthis, index) native "SVGLengthList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $initialize_Callback(mthis, item) native "SVGLengthList_initialize_Callback_RESOLVER_STRING_1_SVGLength";
+
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGLengthList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+
+  static $removeItem_Callback(mthis, index) native "SVGLengthList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $replaceItem_Callback(mthis, item, index) native "SVGLengthList_replaceItem_Callback_RESOLVER_STRING_2_SVGLength_unsigned long";
+}
+
+class BlinkSVGLineElement {
+  static $x1_Getter(mthis) native "SVGLineElement_x1_Getter";
+
+  static $x2_Getter(mthis) native "SVGLineElement_x2_Getter";
+
+  static $y1_Getter(mthis) native "SVGLineElement_y1_Getter";
+
+  static $y2_Getter(mthis) native "SVGLineElement_y2_Getter";
+}
+
+class BlinkSVGLinearGradientElement {
+  static $x1_Getter(mthis) native "SVGLinearGradientElement_x1_Getter";
+
+  static $x2_Getter(mthis) native "SVGLinearGradientElement_x2_Getter";
+
+  static $y1_Getter(mthis) native "SVGLinearGradientElement_y1_Getter";
+
+  static $y2_Getter(mthis) native "SVGLinearGradientElement_y2_Getter";
+}
+
+class BlinkSVGMPathElement {}
+
+class BlinkSVGMarkerElement {
+  static $markerHeight_Getter(mthis) native "SVGMarkerElement_markerHeight_Getter";
+
+  static $markerUnits_Getter(mthis) native "SVGMarkerElement_markerUnits_Getter";
+
+  static $markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+
+  static $orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+
+  static $orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
+
+  static $refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+
+  static $refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+
+  static $setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback_RESOLVER_STRING_1_SVGAngle";
+
+  static $setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback_RESOLVER_STRING_0_";
+
+  static $preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+
+  static $viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+}
+
+class BlinkSVGMaskElement {
+  static $height_Getter(mthis) native "SVGMaskElement_height_Getter";
+
+  static $maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+
+  static $maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
+
+  static $width_Getter(mthis) native "SVGMaskElement_width_Getter";
+
+  static $x_Getter(mthis) native "SVGMaskElement_x_Getter";
 
-Native_SVGMarkerElement_markerWidth_Getter(mthis) native "SVGMarkerElement_markerWidth_Getter";
+  static $y_Getter(mthis) native "SVGMaskElement_y_Getter";
 
-Native_SVGMarkerElement_orientAngle_Getter(mthis) native "SVGMarkerElement_orientAngle_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
 
-Native_SVGMarkerElement_orientType_Getter(mthis) native "SVGMarkerElement_orientType_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
 
-Native_SVGMarkerElement_refX_Getter(mthis) native "SVGMarkerElement_refX_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
 
-Native_SVGMarkerElement_refY_Getter(mthis) native "SVGMarkerElement_refY_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_SVGMarkerElement_setOrientToAngle_Callback(mthis, angle) native "SVGMarkerElement_setOrientToAngle_Callback_RESOLVER_STRING_1_SVGAngle";
+class BlinkSVGMatrix {
+  static $a_Getter(mthis) native "SVGMatrix_a_Getter";
 
-Native_SVGMarkerElement_setOrientToAuto_Callback(mthis) native "SVGMarkerElement_setOrientToAuto_Callback_RESOLVER_STRING_0_";
+  static $a_Setter(mthis, value) native "SVGMatrix_a_Setter";
 
-Native_SVGMarkerElement_preserveAspectRatio_Getter(mthis) native "SVGMarkerElement_preserveAspectRatio_Getter";
+  static $b_Getter(mthis) native "SVGMatrix_b_Getter";
 
-Native_SVGMarkerElement_viewBox_Getter(mthis) native "SVGMarkerElement_viewBox_Getter";
+  static $b_Setter(mthis, value) native "SVGMatrix_b_Setter";
 
-Native_SVGMaskElement_height_Getter(mthis) native "SVGMaskElement_height_Getter";
+  static $c_Getter(mthis) native "SVGMatrix_c_Getter";
 
-Native_SVGMaskElement_maskContentUnits_Getter(mthis) native "SVGMaskElement_maskContentUnits_Getter";
+  static $c_Setter(mthis, value) native "SVGMatrix_c_Setter";
 
-Native_SVGMaskElement_maskUnits_Getter(mthis) native "SVGMaskElement_maskUnits_Getter";
+  static $d_Getter(mthis) native "SVGMatrix_d_Getter";
 
-Native_SVGMaskElement_width_Getter(mthis) native "SVGMaskElement_width_Getter";
+  static $d_Setter(mthis, value) native "SVGMatrix_d_Setter";
 
-Native_SVGMaskElement_x_Getter(mthis) native "SVGMaskElement_x_Getter";
+  static $e_Getter(mthis) native "SVGMatrix_e_Getter";
 
-Native_SVGMaskElement_y_Getter(mthis) native "SVGMaskElement_y_Getter";
+  static $e_Setter(mthis, value) native "SVGMatrix_e_Setter";
 
-Native_SVGMaskElement_requiredExtensions_Getter(mthis) native "SVGMaskElement_requiredExtensions_Getter";
+  static $f_Getter(mthis) native "SVGMatrix_f_Getter";
 
-Native_SVGMaskElement_requiredFeatures_Getter(mthis) native "SVGMaskElement_requiredFeatures_Getter";
+  static $f_Setter(mthis, value) native "SVGMatrix_f_Setter";
 
-Native_SVGMaskElement_systemLanguage_Getter(mthis) native "SVGMaskElement_systemLanguage_Getter";
+  static $flipX_Callback(mthis) native "SVGMatrix_flipX_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMaskElement_hasExtension_Callback(mthis, extension) native "SVGMaskElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $flipY_Callback(mthis) native "SVGMatrix_flipY_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_a_Getter(mthis) native "SVGMatrix_a_Getter";
+  static $inverse_Callback(mthis) native "SVGMatrix_inverse_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_a_Setter(mthis, value) native "SVGMatrix_a_Setter";
+  static $multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGMatrix_b_Getter(mthis) native "SVGMatrix_b_Getter";
+  static $rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_b_Setter(mthis, value) native "SVGMatrix_b_Setter";
+  static $rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_c_Getter(mthis) native "SVGMatrix_c_Getter";
+  static $scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_c_Setter(mthis, value) native "SVGMatrix_c_Setter";
+  static $scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGMatrix_d_Getter(mthis) native "SVGMatrix_d_Getter";
+  static $skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_d_Setter(mthis, value) native "SVGMatrix_d_Setter";
+  static $skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGMatrix_e_Getter(mthis) native "SVGMatrix_e_Getter";
+  static $translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_SVGMatrix_e_Setter(mthis, value) native "SVGMatrix_e_Setter";
+class BlinkSVGMetadataElement {}
 
-Native_SVGMatrix_f_Getter(mthis) native "SVGMatrix_f_Getter";
+class BlinkSVGMissingGlyphElement {}
 
-Native_SVGMatrix_f_Setter(mthis, value) native "SVGMatrix_f_Setter";
+class BlinkSVGNumber {
+  static $value_Getter(mthis) native "SVGNumber_value_Getter";
 
-Native_SVGMatrix_flipX_Callback(mthis) native "SVGMatrix_flipX_Callback_RESOLVER_STRING_0_";
+  static $value_Setter(mthis, value) native "SVGNumber_value_Setter";
+}
 
-Native_SVGMatrix_flipY_Callback(mthis) native "SVGMatrix_flipY_Callback_RESOLVER_STRING_0_";
+class BlinkSVGNumberList {
+  static $numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
 
-Native_SVGMatrix_inverse_Callback(mthis) native "SVGMatrix_inverse_Callback_RESOLVER_STRING_0_";
+  static $appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGMatrix_multiply_Callback(mthis, secondMatrix) native "SVGMatrix_multiply_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $clear_Callback(mthis) native "SVGNumberList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGMatrix_rotate_Callback(mthis, angle) native "SVGMatrix_rotate_Callback_RESOLVER_STRING_1_float";
+  static $getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGMatrix_rotateFromVector_Callback(mthis, x, y) native "SVGMatrix_rotateFromVector_Callback_RESOLVER_STRING_2_float_float";
+  static $initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback_RESOLVER_STRING_1_SVGNumber";
 
-Native_SVGMatrix_scale_Callback(mthis, scaleFactor) native "SVGMatrix_scale_Callback_RESOLVER_STRING_1_float";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
 
-Native_SVGMatrix_scaleNonUniform_Callback(mthis, scaleFactorX, scaleFactorY) native "SVGMatrix_scaleNonUniform_Callback_RESOLVER_STRING_2_float_float";
+  static $removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGMatrix_skewX_Callback(mthis, angle) native "SVGMatrix_skewX_Callback_RESOLVER_STRING_1_float";
+  static $replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+}
 
-Native_SVGMatrix_skewY_Callback(mthis, angle) native "SVGMatrix_skewY_Callback_RESOLVER_STRING_1_float";
+class BlinkSVGPathElement {
+  static $animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
 
-Native_SVGMatrix_translate_Callback(mthis, x, y) native "SVGMatrix_translate_Callback_RESOLVER_STRING_2_float_float";
+  static $animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
 
-Native_SVGNumber_value_Getter(mthis) native "SVGNumber_value_Getter";
+  static $normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
 
-Native_SVGNumber_value_Setter(mthis, value) native "SVGNumber_value_Setter";
+  static $pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
 
-Native_SVGNumberList_numberOfItems_Getter(mthis) native "SVGNumberList_numberOfItems_Getter";
+  static $pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
 
-Native_SVGNumberList_appendItem_Callback(mthis, item) native "SVGNumberList_appendItem_Callback_RESOLVER_STRING_1_SVGNumber";
+  static $createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGNumberList_clear_Callback(mthis) native "SVGNumberList_clear_Callback_RESOLVER_STRING_0_";
+  static $createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
 
-Native_SVGNumberList_getItem_Callback(mthis, index) native "SVGNumberList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback_RESOLVER_STRING_0_";
 
-Native_SVGNumberList_initialize_Callback(mthis, item) native "SVGNumberList_initialize_Callback_RESOLVER_STRING_1_SVGNumber";
+  static $createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGNumberList_insertItemBefore_Callback(mthis, item, index) native "SVGNumberList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+  static $createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
 
-Native_SVGNumberList_removeItem_Callback(mthis, index) native "SVGNumberList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGNumberList_replaceItem_Callback(mthis, item, index) native "SVGNumberList_replaceItem_Callback_RESOLVER_STRING_2_SVGNumber_unsigned long";
+  static $createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_animatedNormalizedPathSegList_Getter(mthis) native "SVGPathElement_animatedNormalizedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_animatedPathSegList_Getter(mthis) native "SVGPathElement_animatedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_SVGPathElement_normalizedPathSegList_Getter(mthis) native "SVGPathElement_normalizedPathSegList_Getter";
+  static $createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_pathLength_Getter(mthis) native "SVGPathElement_pathLength_Getter";
+  static $createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_pathSegList_Getter(mthis) native "SVGPathElement_pathSegList_Getter";
+  static $createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegArcAbs_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcAbs_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
+  static $createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegArcRel_Callback(mthis, x, y, r1, r2, angle, largeArcFlag, sweepFlag) native "SVGPathElement_createSVGPathSegArcRel_Callback_RESOLVER_STRING_7_float_float_float_float_float_boolean_boolean";
+  static $createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegClosePath_Callback(mthis) native "SVGPathElement_createSVGPathSegClosePath_Callback_RESOLVER_STRING_0_";
+  static $createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(mthis, x, y, x1, y1, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback_RESOLVER_STRING_6_float_float_float_float_float_float";
+  static $createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(mthis, x, y, x2, y2) native "SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(mthis, x, y, x1, y1) native "SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback_RESOLVER_STRING_2_float_float";
+class BlinkSVGPathSeg {
+  static $pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+}
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback_RESOLVER_STRING_1_float";
+class BlinkSVGPathSegArcAbs {
+  static $angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(mthis, x) native "SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback_RESOLVER_STRING_1_float";
+  static $angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
 
-Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegLinetoRel_Callback_RESOLVER_STRING_2_float_float";
+  static $largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback_RESOLVER_STRING_1_float";
+  static $largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
 
-Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(mthis, y) native "SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback_RESOLVER_STRING_1_float";
+  static $r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
 
-Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoAbs_Callback_RESOLVER_STRING_2_float_float";
+  static $r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
 
-Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(mthis, x, y) native "SVGPathElement_createSVGPathSegMovetoRel_Callback_RESOLVER_STRING_2_float_float";
+  static $r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
 
-Native_SVGPathElement_getPathSegAtLength_Callback(mthis, distance) native "SVGPathElement_getPathSegAtLength_Callback_RESOLVER_STRING_1_float";
+  static $r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
 
-Native_SVGPathElement_getPointAtLength_Callback(mthis, distance) native "SVGPathElement_getPointAtLength_Callback_RESOLVER_STRING_1_float";
+  static $sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
 
-Native_SVGPathElement_getTotalLength_Callback(mthis) native "SVGPathElement_getTotalLength_Callback_RESOLVER_STRING_0_";
+  static $sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
 
-Native_SVGPathSeg_pathSegType_Getter(mthis) native "SVGPathSeg_pathSegType_Getter";
+  static $x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
 
-Native_SVGPathSeg_pathSegTypeAsLetter_Getter(mthis) native "SVGPathSeg_pathSegTypeAsLetter_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
 
-Native_SVGPathSegArcAbs_angle_Getter(mthis) native "SVGPathSegArcAbs_angle_Getter";
+  static $y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
 
-Native_SVGPathSegArcAbs_angle_Setter(mthis, value) native "SVGPathSegArcAbs_angle_Setter";
+  static $y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+}
 
-Native_SVGPathSegArcAbs_largeArcFlag_Getter(mthis) native "SVGPathSegArcAbs_largeArcFlag_Getter";
+class BlinkSVGPathSegArcRel {
+  static $angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
 
-Native_SVGPathSegArcAbs_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcAbs_largeArcFlag_Setter";
+  static $angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
 
-Native_SVGPathSegArcAbs_r1_Getter(mthis) native "SVGPathSegArcAbs_r1_Getter";
+  static $largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
 
-Native_SVGPathSegArcAbs_r1_Setter(mthis, value) native "SVGPathSegArcAbs_r1_Setter";
+  static $largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
 
-Native_SVGPathSegArcAbs_r2_Getter(mthis) native "SVGPathSegArcAbs_r2_Getter";
+  static $r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
 
-Native_SVGPathSegArcAbs_r2_Setter(mthis, value) native "SVGPathSegArcAbs_r2_Setter";
+  static $r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
 
-Native_SVGPathSegArcAbs_sweepFlag_Getter(mthis) native "SVGPathSegArcAbs_sweepFlag_Getter";
+  static $r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
 
-Native_SVGPathSegArcAbs_sweepFlag_Setter(mthis, value) native "SVGPathSegArcAbs_sweepFlag_Setter";
+  static $r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
 
-Native_SVGPathSegArcAbs_x_Getter(mthis) native "SVGPathSegArcAbs_x_Getter";
+  static $sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
 
-Native_SVGPathSegArcAbs_x_Setter(mthis, value) native "SVGPathSegArcAbs_x_Setter";
+  static $sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
 
-Native_SVGPathSegArcAbs_y_Getter(mthis) native "SVGPathSegArcAbs_y_Getter";
+  static $x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
 
-Native_SVGPathSegArcAbs_y_Setter(mthis, value) native "SVGPathSegArcAbs_y_Setter";
+  static $x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
 
-Native_SVGPathSegArcRel_angle_Getter(mthis) native "SVGPathSegArcRel_angle_Getter";
+  static $y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
 
-Native_SVGPathSegArcRel_angle_Setter(mthis, value) native "SVGPathSegArcRel_angle_Setter";
+  static $y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+}
 
-Native_SVGPathSegArcRel_largeArcFlag_Getter(mthis) native "SVGPathSegArcRel_largeArcFlag_Getter";
+class BlinkSVGPathSegClosePath {}
 
-Native_SVGPathSegArcRel_largeArcFlag_Setter(mthis, value) native "SVGPathSegArcRel_largeArcFlag_Setter";
+class BlinkSVGPathSegCurvetoCubicAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
 
-Native_SVGPathSegArcRel_r1_Getter(mthis) native "SVGPathSegArcRel_r1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
 
-Native_SVGPathSegArcRel_r1_Setter(mthis, value) native "SVGPathSegArcRel_r1_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
 
-Native_SVGPathSegArcRel_r2_Getter(mthis) native "SVGPathSegArcRel_r2_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
 
-Native_SVGPathSegArcRel_r2_Setter(mthis, value) native "SVGPathSegArcRel_r2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
 
-Native_SVGPathSegArcRel_sweepFlag_Getter(mthis) native "SVGPathSegArcRel_sweepFlag_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
 
-Native_SVGPathSegArcRel_sweepFlag_Setter(mthis, value) native "SVGPathSegArcRel_sweepFlag_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
 
-Native_SVGPathSegArcRel_x_Getter(mthis) native "SVGPathSegArcRel_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
 
-Native_SVGPathSegArcRel_x_Setter(mthis, value) native "SVGPathSegArcRel_x_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
 
-Native_SVGPathSegArcRel_y_Getter(mthis) native "SVGPathSegArcRel_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
 
-Native_SVGPathSegArcRel_y_Setter(mthis, value) native "SVGPathSegArcRel_y_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x_Setter";
+class BlinkSVGPathSegCurvetoCubicRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x1_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_x2_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_x2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y1_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y1_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y1_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
 
-Native_SVGPathSegCurvetoCubicAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicAbs_y2_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
 
-Native_SVGPathSegCurvetoCubicAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicAbs_y2_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x1_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_x2_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_x2_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y1_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y1_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y1_Setter";
+class BlinkSVGPathSegCurvetoCubicSmoothRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicRel_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicRel_y2_Setter";
+  static $x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x_Getter";
+  static $x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_x2_Setter";
+  static $y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y_Getter";
+  static $y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothAbs_y2_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_x2_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_x2_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+}
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(mthis) native "SVGPathSegCurvetoCubicSmoothRel_y2_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
 
-Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(mthis, value) native "SVGPathSegCurvetoCubicSmoothRel_y2_Setter";
+  static $x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x_Getter";
+  static $x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_x1_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_x1_Setter";
+  static $y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y_Getter";
+  static $y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y_Setter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothAbs {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticAbs_y1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticAbs_y1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x_Setter";
+class BlinkSVGPathSegCurvetoQuadraticSmoothRel {
+  static $x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_x1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_x1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y_Setter";
+class BlinkSVGPathSegLinetoAbs {
+  static $x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(mthis) native "SVGPathSegCurvetoQuadraticRel_y1_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticRel_y1_Setter";
+  static $y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter";
+class BlinkSVGPathSegLinetoHorizontalAbs {
+  static $x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter";
+class BlinkSVGPathSegLinetoHorizontalRel {
+  static $x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+}
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_x_Setter";
+class BlinkSVGPathSegLinetoRel {
+  static $x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(mthis) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
 
-Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(mthis, value) native "SVGPathSegCurvetoQuadraticSmoothRel_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
 
-Native_SVGPathSegLinetoAbs_x_Getter(mthis) native "SVGPathSegLinetoAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+}
 
-Native_SVGPathSegLinetoAbs_x_Setter(mthis, value) native "SVGPathSegLinetoAbs_x_Setter";
+class BlinkSVGPathSegLinetoVerticalAbs {
+  static $y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
 
-Native_SVGPathSegLinetoAbs_y_Getter(mthis) native "SVGPathSegLinetoAbs_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+}
 
-Native_SVGPathSegLinetoAbs_y_Setter(mthis, value) native "SVGPathSegLinetoAbs_y_Setter";
+class BlinkSVGPathSegLinetoVerticalRel {
+  static $y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
 
-Native_SVGPathSegLinetoHorizontalAbs_x_Getter(mthis) native "SVGPathSegLinetoHorizontalAbs_x_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+}
 
-Native_SVGPathSegLinetoHorizontalAbs_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalAbs_x_Setter";
+class BlinkSVGPathSegList {
+  static $numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
 
-Native_SVGPathSegLinetoHorizontalRel_x_Getter(mthis) native "SVGPathSegLinetoHorizontalRel_x_Getter";
+  static $appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegLinetoHorizontalRel_x_Setter(mthis, value) native "SVGPathSegLinetoHorizontalRel_x_Setter";
+  static $clear_Callback(mthis) native "SVGPathSegList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPathSegLinetoRel_x_Getter(mthis) native "SVGPathSegLinetoRel_x_Getter";
+  static $getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegLinetoRel_x_Setter(mthis, value) native "SVGPathSegLinetoRel_x_Setter";
+  static $initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback_RESOLVER_STRING_1_SVGPathSeg";
 
-Native_SVGPathSegLinetoRel_y_Getter(mthis) native "SVGPathSegLinetoRel_y_Getter";
+  static $insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
 
-Native_SVGPathSegLinetoRel_y_Setter(mthis, value) native "SVGPathSegLinetoRel_y_Setter";
+  static $removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPathSegLinetoVerticalAbs_y_Getter(mthis) native "SVGPathSegLinetoVerticalAbs_y_Getter";
+  static $replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+}
 
-Native_SVGPathSegLinetoVerticalAbs_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalAbs_y_Setter";
+class BlinkSVGPathSegMovetoAbs {
+  static $x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
 
-Native_SVGPathSegLinetoVerticalRel_y_Getter(mthis) native "SVGPathSegLinetoVerticalRel_y_Getter";
+  static $x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
 
-Native_SVGPathSegLinetoVerticalRel_y_Setter(mthis, value) native "SVGPathSegLinetoVerticalRel_y_Setter";
+  static $y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
 
-Native_SVGPathSegList_numberOfItems_Getter(mthis) native "SVGPathSegList_numberOfItems_Getter";
+  static $y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+}
 
-Native_SVGPathSegList_appendItem_Callback(mthis, newItem) native "SVGPathSegList_appendItem_Callback_RESOLVER_STRING_1_SVGPathSeg";
+class BlinkSVGPathSegMovetoRel {
+  static $x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
 
-Native_SVGPathSegList_clear_Callback(mthis) native "SVGPathSegList_clear_Callback_RESOLVER_STRING_0_";
+  static $x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
 
-Native_SVGPathSegList_getItem_Callback(mthis, index) native "SVGPathSegList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
 
-Native_SVGPathSegList_initialize_Callback(mthis, newItem) native "SVGPathSegList_initialize_Callback_RESOLVER_STRING_1_SVGPathSeg";
+  static $y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+}
 
-Native_SVGPathSegList_insertItemBefore_Callback(mthis, newItem, index) native "SVGPathSegList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+class BlinkSVGPatternElement {
+  static $height_Getter(mthis) native "SVGPatternElement_height_Getter";
 
-Native_SVGPathSegList_removeItem_Callback(mthis, index) native "SVGPathSegList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
 
-Native_SVGPathSegList_replaceItem_Callback(mthis, newItem, index) native "SVGPathSegList_replaceItem_Callback_RESOLVER_STRING_2_SVGPathSeg_unsigned long";
+  static $patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
 
-Native_SVGPathSegMovetoAbs_x_Getter(mthis) native "SVGPathSegMovetoAbs_x_Getter";
+  static $patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
 
-Native_SVGPathSegMovetoAbs_x_Setter(mthis, value) native "SVGPathSegMovetoAbs_x_Setter";
+  static $width_Getter(mthis) native "SVGPatternElement_width_Getter";
 
-Native_SVGPathSegMovetoAbs_y_Getter(mthis) native "SVGPathSegMovetoAbs_y_Getter";
+  static $x_Getter(mthis) native "SVGPatternElement_x_Getter";
 
-Native_SVGPathSegMovetoAbs_y_Setter(mthis, value) native "SVGPathSegMovetoAbs_y_Setter";
+  static $y_Getter(mthis) native "SVGPatternElement_y_Getter";
 
-Native_SVGPathSegMovetoRel_x_Getter(mthis) native "SVGPathSegMovetoRel_x_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
 
-Native_SVGPathSegMovetoRel_x_Setter(mthis, value) native "SVGPathSegMovetoRel_x_Setter";
+  static $viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
 
-Native_SVGPathSegMovetoRel_y_Getter(mthis) native "SVGPathSegMovetoRel_y_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
 
-Native_SVGPathSegMovetoRel_y_Setter(mthis, value) native "SVGPathSegMovetoRel_y_Setter";
+  static $requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
 
-Native_SVGPatternElement_height_Getter(mthis) native "SVGPatternElement_height_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
 
-Native_SVGPatternElement_patternContentUnits_Getter(mthis) native "SVGPatternElement_patternContentUnits_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGPatternElement_patternTransform_Getter(mthis) native "SVGPatternElement_patternTransform_Getter";
+  static $href_Getter(mthis) native "SVGPatternElement_href_Getter";
+}
 
-Native_SVGPatternElement_patternUnits_Getter(mthis) native "SVGPatternElement_patternUnits_Getter";
+class BlinkSVGPoint {
+  static $x_Getter(mthis) native "SVGPoint_x_Getter";
 
-Native_SVGPatternElement_width_Getter(mthis) native "SVGPatternElement_width_Getter";
+  static $x_Setter(mthis, value) native "SVGPoint_x_Setter";
 
-Native_SVGPatternElement_x_Getter(mthis) native "SVGPatternElement_x_Getter";
+  static $y_Getter(mthis) native "SVGPoint_y_Getter";
 
-Native_SVGPatternElement_y_Getter(mthis) native "SVGPatternElement_y_Getter";
+  static $y_Setter(mthis, value) native "SVGPoint_y_Setter";
 
-Native_SVGPatternElement_preserveAspectRatio_Getter(mthis) native "SVGPatternElement_preserveAspectRatio_Getter";
+  static $matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback_RESOLVER_STRING_1_SVGMatrix";
+}
 
-Native_SVGPatternElement_viewBox_Getter(mthis) native "SVGPatternElement_viewBox_Getter";
+class BlinkSVGPointList {
+  static $numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
 
-Native_SVGPatternElement_requiredExtensions_Getter(mthis) native "SVGPatternElement_requiredExtensions_Getter";
+  static $appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPatternElement_requiredFeatures_Getter(mthis) native "SVGPatternElement_requiredFeatures_Getter";
+  static $clear_Callback(mthis) native "SVGPointList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGPatternElement_systemLanguage_Getter(mthis) native "SVGPatternElement_systemLanguage_Getter";
+  static $getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPatternElement_hasExtension_Callback(mthis, extension) native "SVGPatternElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback_RESOLVER_STRING_1_SVGPoint";
 
-Native_SVGPatternElement_href_Getter(mthis) native "SVGPatternElement_href_Getter";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
 
-Native_SVGPoint_x_Getter(mthis) native "SVGPoint_x_Getter";
+  static $removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGPoint_x_Setter(mthis, value) native "SVGPoint_x_Setter";
+  static $replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+}
 
-Native_SVGPoint_y_Getter(mthis) native "SVGPoint_y_Getter";
+class BlinkSVGPolygonElement {
+  static $animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
 
-Native_SVGPoint_y_Setter(mthis, value) native "SVGPoint_y_Setter";
+  static $points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+}
 
-Native_SVGPoint_matrixTransform_Callback(mthis, matrix) native "SVGPoint_matrixTransform_Callback_RESOLVER_STRING_1_SVGMatrix";
+class BlinkSVGPolylineElement {
+  static $animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
 
-Native_SVGPointList_numberOfItems_Getter(mthis) native "SVGPointList_numberOfItems_Getter";
+  static $points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+}
 
-Native_SVGPointList_appendItem_Callback(mthis, item) native "SVGPointList_appendItem_Callback_RESOLVER_STRING_1_SVGPoint";
+class BlinkSVGPreserveAspectRatio {
+  static $align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
 
-Native_SVGPointList_clear_Callback(mthis) native "SVGPointList_clear_Callback_RESOLVER_STRING_0_";
+  static $align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
 
-Native_SVGPointList_getItem_Callback(mthis, index) native "SVGPointList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
 
-Native_SVGPointList_initialize_Callback(mthis, item) native "SVGPointList_initialize_Callback_RESOLVER_STRING_1_SVGPoint";
+  static $meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+}
 
-Native_SVGPointList_insertItemBefore_Callback(mthis, item, index) native "SVGPointList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+class BlinkSVGRadialGradientElement {
+  static $cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
 
-Native_SVGPointList_removeItem_Callback(mthis, index) native "SVGPointList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
 
-Native_SVGPointList_replaceItem_Callback(mthis, item, index) native "SVGPointList_replaceItem_Callback_RESOLVER_STRING_2_SVGPoint_unsigned long";
+  static $fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
 
-Native_SVGPolygonElement_animatedPoints_Getter(mthis) native "SVGPolygonElement_animatedPoints_Getter";
+  static $fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
 
-Native_SVGPolygonElement_points_Getter(mthis) native "SVGPolygonElement_points_Getter";
+  static $fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
 
-Native_SVGPolylineElement_animatedPoints_Getter(mthis) native "SVGPolylineElement_animatedPoints_Getter";
+  static $r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+}
 
-Native_SVGPolylineElement_points_Getter(mthis) native "SVGPolylineElement_points_Getter";
+class BlinkSVGRect {
+  static $height_Getter(mthis) native "SVGRect_height_Getter";
 
-Native_SVGPreserveAspectRatio_align_Getter(mthis) native "SVGPreserveAspectRatio_align_Getter";
+  static $height_Setter(mthis, value) native "SVGRect_height_Setter";
 
-Native_SVGPreserveAspectRatio_align_Setter(mthis, value) native "SVGPreserveAspectRatio_align_Setter";
+  static $width_Getter(mthis) native "SVGRect_width_Getter";
 
-Native_SVGPreserveAspectRatio_meetOrSlice_Getter(mthis) native "SVGPreserveAspectRatio_meetOrSlice_Getter";
+  static $width_Setter(mthis, value) native "SVGRect_width_Setter";
 
-Native_SVGPreserveAspectRatio_meetOrSlice_Setter(mthis, value) native "SVGPreserveAspectRatio_meetOrSlice_Setter";
+  static $x_Getter(mthis) native "SVGRect_x_Getter";
 
-Native_SVGRadialGradientElement_cx_Getter(mthis) native "SVGRadialGradientElement_cx_Getter";
+  static $x_Setter(mthis, value) native "SVGRect_x_Setter";
 
-Native_SVGRadialGradientElement_cy_Getter(mthis) native "SVGRadialGradientElement_cy_Getter";
+  static $y_Getter(mthis) native "SVGRect_y_Getter";
 
-Native_SVGRadialGradientElement_fr_Getter(mthis) native "SVGRadialGradientElement_fr_Getter";
+  static $y_Setter(mthis, value) native "SVGRect_y_Setter";
+}
 
-Native_SVGRadialGradientElement_fx_Getter(mthis) native "SVGRadialGradientElement_fx_Getter";
+class BlinkSVGRectElement {
+  static $height_Getter(mthis) native "SVGRectElement_height_Getter";
 
-Native_SVGRadialGradientElement_fy_Getter(mthis) native "SVGRadialGradientElement_fy_Getter";
+  static $rx_Getter(mthis) native "SVGRectElement_rx_Getter";
 
-Native_SVGRadialGradientElement_r_Getter(mthis) native "SVGRadialGradientElement_r_Getter";
+  static $ry_Getter(mthis) native "SVGRectElement_ry_Getter";
 
-Native_SVGRect_height_Getter(mthis) native "SVGRect_height_Getter";
+  static $width_Getter(mthis) native "SVGRectElement_width_Getter";
 
-Native_SVGRect_height_Setter(mthis, value) native "SVGRect_height_Setter";
+  static $x_Getter(mthis) native "SVGRectElement_x_Getter";
 
-Native_SVGRect_width_Getter(mthis) native "SVGRect_width_Getter";
+  static $y_Getter(mthis) native "SVGRectElement_y_Getter";
+}
 
-Native_SVGRect_width_Setter(mthis, value) native "SVGRect_width_Setter";
+class BlinkSVGRenderingIntent {}
 
-Native_SVGRect_x_Getter(mthis) native "SVGRect_x_Getter";
+class BlinkSVGZoomAndPan {
+  static $zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
 
-Native_SVGRect_x_Setter(mthis, value) native "SVGRect_x_Setter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
+}
 
-Native_SVGRect_y_Getter(mthis) native "SVGRect_y_Getter";
+class BlinkSVGSVGElement {
+  static $currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
 
-Native_SVGRect_y_Setter(mthis, value) native "SVGRect_y_Setter";
+  static $currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
 
-Native_SVGRectElement_height_Getter(mthis) native "SVGRectElement_height_Getter";
+  static $currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
 
-Native_SVGRectElement_rx_Getter(mthis) native "SVGRectElement_rx_Getter";
+  static $currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
 
-Native_SVGRectElement_ry_Getter(mthis) native "SVGRectElement_ry_Getter";
+  static $height_Getter(mthis) native "SVGSVGElement_height_Getter";
 
-Native_SVGRectElement_width_Getter(mthis) native "SVGRectElement_width_Getter";
+  static $pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
 
-Native_SVGRectElement_x_Getter(mthis) native "SVGRectElement_x_Getter";
+  static $pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
 
-Native_SVGRectElement_y_Getter(mthis) native "SVGRectElement_y_Getter";
+  static $screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
 
-Native_SVGZoomAndPan_zoomAndPan_Getter(mthis) native "SVGZoomAndPan_zoomAndPan_Getter";
+  static $screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
 
-Native_SVGZoomAndPan_zoomAndPan_Setter(mthis, value) native "SVGZoomAndPan_zoomAndPan_Setter";
+  static $useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
 
-Native_SVGSVGElement_currentScale_Getter(mthis) native "SVGSVGElement_currentScale_Getter";
+  static $viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
 
-Native_SVGSVGElement_currentScale_Setter(mthis, value) native "SVGSVGElement_currentScale_Setter";
+  static $width_Getter(mthis) native "SVGSVGElement_width_Getter";
 
-Native_SVGSVGElement_currentTranslate_Getter(mthis) native "SVGSVGElement_currentTranslate_Getter";
+  static $x_Getter(mthis) native "SVGSVGElement_x_Getter";
 
-Native_SVGSVGElement_currentView_Getter(mthis) native "SVGSVGElement_currentView_Getter";
+  static $y_Getter(mthis) native "SVGSVGElement_y_Getter";
 
-Native_SVGSVGElement_height_Getter(mthis) native "SVGSVGElement_height_Getter";
+  static $animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterX_Getter";
+  static $checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(mthis) native "SVGSVGElement_pixelUnitToMillimeterY_Getter";
+  static $checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
 
-Native_SVGSVGElement_screenPixelToMillimeterX_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterX_Getter";
+  static $createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_screenPixelToMillimeterY_Getter(mthis) native "SVGSVGElement_screenPixelToMillimeterY_Getter";
+  static $createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_useCurrentView_Getter(mthis) native "SVGSVGElement_useCurrentView_Getter";
+  static $createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_viewport_Getter(mthis) native "SVGSVGElement_viewport_Getter";
+  static $createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_width_Getter(mthis) native "SVGSVGElement_width_Getter";
+  static $createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_x_Getter(mthis) native "SVGSVGElement_x_Getter";
+  static $createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_y_Getter(mthis) native "SVGSVGElement_y_Getter";
+  static $createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_animationsPaused_Callback(mthis) native "SVGSVGElement_animationsPaused_Callback_RESOLVER_STRING_0_";
+  static $createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGSVGElement_checkEnclosure_Callback(mthis, element, rect) native "SVGSVGElement_checkEnclosure_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
+  static $deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_checkIntersection_Callback(mthis, element, rect) native "SVGSVGElement_checkIntersection_Callback_RESOLVER_STRING_2_SVGElement_SVGRect";
+  static $forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGAngle_Callback(mthis) native "SVGSVGElement_createSVGAngle_Callback_RESOLVER_STRING_0_";
+  static $getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGLength_Callback(mthis) native "SVGSVGElement_createSVGLength_Callback_RESOLVER_STRING_0_";
+  static $getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGSVGElement_createSVGMatrix_Callback(mthis) native "SVGSVGElement_createSVGMatrix_Callback_RESOLVER_STRING_0_";
+  static $getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_createSVGNumber_Callback(mthis) native "SVGSVGElement_createSVGNumber_Callback_RESOLVER_STRING_0_";
+  static $getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
 
-Native_SVGSVGElement_createSVGPoint_Callback(mthis) native "SVGSVGElement_createSVGPoint_Callback_RESOLVER_STRING_0_";
+  static $pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_createSVGRect_Callback(mthis) native "SVGSVGElement_createSVGRect_Callback_RESOLVER_STRING_0_";
+  static $setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGSVGElement_createSVGTransform_Callback(mthis) native "SVGSVGElement_createSVGTransform_Callback_RESOLVER_STRING_0_";
+  static $suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGSVGElement_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_deselectAll_Callback(mthis) native "SVGSVGElement_deselectAll_Callback_RESOLVER_STRING_0_";
+  static $unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_forceRedraw_Callback(mthis) native "SVGSVGElement_forceRedraw_Callback_RESOLVER_STRING_0_";
+  static $unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_getCurrentTime_Callback(mthis) native "SVGSVGElement_getCurrentTime_Callback_RESOLVER_STRING_0_";
+  static $preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
 
-Native_SVGSVGElement_getElementById_Callback(mthis, elementId) native "SVGSVGElement_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
 
-Native_SVGSVGElement_getEnclosureList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getEnclosureList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
+  static $zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
 
-Native_SVGSVGElement_getIntersectionList_Callback(mthis, rect, referenceElement) native "SVGSVGElement_getIntersectionList_Callback_RESOLVER_STRING_2_SVGRect_SVGElement";
+  static $zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+}
 
-Native_SVGSVGElement_pauseAnimations_Callback(mthis) native "SVGSVGElement_pauseAnimations_Callback_RESOLVER_STRING_0_";
+class BlinkSVGScriptElement {
+  static $type_Getter(mthis) native "SVGScriptElement_type_Getter";
 
-Native_SVGSVGElement_setCurrentTime_Callback(mthis, seconds) native "SVGSVGElement_setCurrentTime_Callback_RESOLVER_STRING_1_float";
+  static $type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
 
-Native_SVGSVGElement_suspendRedraw_Callback(mthis, maxWaitMilliseconds) native "SVGSVGElement_suspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
+  static $href_Getter(mthis) native "SVGScriptElement_href_Getter";
+}
 
-Native_SVGSVGElement_unpauseAnimations_Callback(mthis) native "SVGSVGElement_unpauseAnimations_Callback_RESOLVER_STRING_0_";
+class BlinkSVGSetElement {}
 
-Native_SVGSVGElement_unsuspendRedraw_Callback(mthis, suspendHandleId) native "SVGSVGElement_unsuspendRedraw_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGStopElement {
+  static $offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+}
 
-Native_SVGSVGElement_unsuspendRedrawAll_Callback(mthis) native "SVGSVGElement_unsuspendRedrawAll_Callback_RESOLVER_STRING_0_";
+class BlinkSVGStringList {
+  static $numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
 
-Native_SVGSVGElement_preserveAspectRatio_Getter(mthis) native "SVGSVGElement_preserveAspectRatio_Getter";
+  static $appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGSVGElement_viewBox_Getter(mthis) native "SVGSVGElement_viewBox_Getter";
+  static $clear_Callback(mthis) native "SVGStringList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGSVGElement_zoomAndPan_Getter(mthis) native "SVGSVGElement_zoomAndPan_Getter";
+  static $getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGSVGElement_zoomAndPan_Setter(mthis, value) native "SVGSVGElement_zoomAndPan_Setter";
+  static $initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGScriptElement_type_Getter(mthis) native "SVGScriptElement_type_Getter";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
 
-Native_SVGScriptElement_type_Setter(mthis, value) native "SVGScriptElement_type_Setter";
+  static $removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGScriptElement_href_Getter(mthis) native "SVGScriptElement_href_Getter";
+  static $replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+}
 
-Native_SVGStopElement_offset_Getter(mthis) native "SVGStopElement_offset_Getter";
+class BlinkSVGStyleElement {
+  static $disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
 
-Native_SVGStringList_numberOfItems_Getter(mthis) native "SVGStringList_numberOfItems_Getter";
+  static $disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
 
-Native_SVGStringList_appendItem_Callback(mthis, item) native "SVGStringList_appendItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $media_Getter(mthis) native "SVGStyleElement_media_Getter";
 
-Native_SVGStringList_clear_Callback(mthis) native "SVGStringList_clear_Callback_RESOLVER_STRING_0_";
+  static $media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
 
-Native_SVGStringList_getItem_Callback(mthis, index) native "SVGStringList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $title_Getter(mthis) native "SVGStyleElement_title_Getter";
 
-Native_SVGStringList_initialize_Callback(mthis, item) native "SVGStringList_initialize_Callback_RESOLVER_STRING_1_DOMString";
+  static $title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
 
-Native_SVGStringList_insertItemBefore_Callback(mthis, item, index) native "SVGStringList_insertItemBefore_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+  static $type_Getter(mthis) native "SVGStyleElement_type_Getter";
 
-Native_SVGStringList_removeItem_Callback(mthis, index) native "SVGStringList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+}
 
-Native_SVGStringList_replaceItem_Callback(mthis, item, index) native "SVGStringList_replaceItem_Callback_RESOLVER_STRING_2_DOMString_unsigned long";
+class BlinkSVGSwitchElement {}
 
-Native_SVGStyleElement_disabled_Getter(mthis) native "SVGStyleElement_disabled_Getter";
+class BlinkSVGSymbolElement {
+  static $preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
 
-Native_SVGStyleElement_disabled_Setter(mthis, value) native "SVGStyleElement_disabled_Setter";
+  static $viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+}
 
-Native_SVGStyleElement_media_Getter(mthis) native "SVGStyleElement_media_Getter";
+class BlinkSVGTSpanElement {}
 
-Native_SVGStyleElement_media_Setter(mthis, value) native "SVGStyleElement_media_Setter";
+class BlinkSVGTextElement {}
 
-Native_SVGStyleElement_title_Getter(mthis) native "SVGStyleElement_title_Getter";
+class BlinkSVGTextPathElement {
+  static $method_Getter(mthis) native "SVGTextPathElement_method_Getter";
 
-Native_SVGStyleElement_title_Setter(mthis, value) native "SVGStyleElement_title_Setter";
+  static $spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
 
-Native_SVGStyleElement_type_Getter(mthis) native "SVGStyleElement_type_Getter";
+  static $startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
 
-Native_SVGStyleElement_type_Setter(mthis, value) native "SVGStyleElement_type_Setter";
+  static $href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+}
 
-Native_SVGSymbolElement_preserveAspectRatio_Getter(mthis) native "SVGSymbolElement_preserveAspectRatio_Getter";
+class BlinkSVGTitleElement {}
 
-Native_SVGSymbolElement_viewBox_Getter(mthis) native "SVGSymbolElement_viewBox_Getter";
+class BlinkSVGTransform {
+  static $angle_Getter(mthis) native "SVGTransform_angle_Getter";
 
-Native_SVGTextPathElement_method_Getter(mthis) native "SVGTextPathElement_method_Getter";
+  static $matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
 
-Native_SVGTextPathElement_spacing_Getter(mthis) native "SVGTextPathElement_spacing_Getter";
+  static $type_Getter(mthis) native "SVGTransform_type_Getter";
 
-Native_SVGTextPathElement_startOffset_Getter(mthis) native "SVGTextPathElement_startOffset_Getter";
+  static $setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTextPathElement_href_Getter(mthis) native "SVGTextPathElement_href_Getter";
+  static $setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback_RESOLVER_STRING_3_float_float_float";
 
-Native_SVGTransform_angle_Getter(mthis) native "SVGTransform_angle_Getter";
+  static $setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback_RESOLVER_STRING_2_float_float";
 
-Native_SVGTransform_matrix_Getter(mthis) native "SVGTransform_matrix_Getter";
+  static $setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_type_Getter(mthis) native "SVGTransform_type_Getter";
+  static $setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback_RESOLVER_STRING_1_float";
 
-Native_SVGTransform_setMatrix_Callback(mthis, matrix) native "SVGTransform_setMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback_RESOLVER_STRING_2_float_float";
+}
 
-Native_SVGTransform_setRotate_Callback(mthis, angle, cx, cy) native "SVGTransform_setRotate_Callback_RESOLVER_STRING_3_float_float_float";
+class BlinkSVGTransformList {
+  static $numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
 
-Native_SVGTransform_setScale_Callback(mthis, sx, sy) native "SVGTransform_setScale_Callback_RESOLVER_STRING_2_float_float";
+  static $appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransform_setSkewX_Callback(mthis, angle) native "SVGTransform_setSkewX_Callback_RESOLVER_STRING_1_float";
+  static $clear_Callback(mthis) native "SVGTransformList_clear_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransform_setSkewY_Callback(mthis, angle) native "SVGTransform_setSkewY_Callback_RESOLVER_STRING_1_float";
+  static $consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback_RESOLVER_STRING_0_";
 
-Native_SVGTransform_setTranslate_Callback(mthis, tx, ty) native "SVGTransform_setTranslate_Callback_RESOLVER_STRING_2_float_float";
+  static $createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
 
-Native_SVGTransformList_numberOfItems_Getter(mthis) native "SVGTransformList_numberOfItems_Getter";
+  static $getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_appendItem_Callback(mthis, item) native "SVGTransformList_appendItem_Callback_RESOLVER_STRING_1_SVGTransform";
+  static $initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback_RESOLVER_STRING_1_SVGTransform";
 
-Native_SVGTransformList_clear_Callback(mthis) native "SVGTransformList_clear_Callback_RESOLVER_STRING_0_";
+  static $insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
 
-Native_SVGTransformList_consolidate_Callback(mthis) native "SVGTransformList_consolidate_Callback_RESOLVER_STRING_0_";
+  static $removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SVGTransformList_createSVGTransformFromMatrix_Callback(mthis, matrix) native "SVGTransformList_createSVGTransformFromMatrix_Callback_RESOLVER_STRING_1_SVGMatrix";
+  static $replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+}
 
-Native_SVGTransformList_getItem_Callback(mthis, index) native "SVGTransformList_getItem_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSVGUnitTypes {}
 
-Native_SVGTransformList_initialize_Callback(mthis, item) native "SVGTransformList_initialize_Callback_RESOLVER_STRING_1_SVGTransform";
+class BlinkSVGUseElement {
+  static $animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
 
-Native_SVGTransformList_insertItemBefore_Callback(mthis, item, index) native "SVGTransformList_insertItemBefore_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+  static $height_Getter(mthis) native "SVGUseElement_height_Getter";
 
-Native_SVGTransformList_removeItem_Callback(mthis, index) native "SVGTransformList_removeItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
 
-Native_SVGTransformList_replaceItem_Callback(mthis, item, index) native "SVGTransformList_replaceItem_Callback_RESOLVER_STRING_2_SVGTransform_unsigned long";
+  static $width_Getter(mthis) native "SVGUseElement_width_Getter";
 
-Native_SVGUseElement_animatedInstanceRoot_Getter(mthis) native "SVGUseElement_animatedInstanceRoot_Getter";
+  static $x_Getter(mthis) native "SVGUseElement_x_Getter";
 
-Native_SVGUseElement_height_Getter(mthis) native "SVGUseElement_height_Getter";
+  static $y_Getter(mthis) native "SVGUseElement_y_Getter";
 
-Native_SVGUseElement_instanceRoot_Getter(mthis) native "SVGUseElement_instanceRoot_Getter";
+  static $requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
 
-Native_SVGUseElement_width_Getter(mthis) native "SVGUseElement_width_Getter";
+  static $requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
 
-Native_SVGUseElement_x_Getter(mthis) native "SVGUseElement_x_Getter";
+  static $systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
 
-Native_SVGUseElement_y_Getter(mthis) native "SVGUseElement_y_Getter";
+  static $hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SVGUseElement_requiredExtensions_Getter(mthis) native "SVGGraphicsElement_requiredExtensions_Getter";
+  static $href_Getter(mthis) native "SVGUseElement_href_Getter";
+}
 
-Native_SVGUseElement_requiredFeatures_Getter(mthis) native "SVGGraphicsElement_requiredFeatures_Getter";
+class BlinkSVGVKernElement {}
 
-Native_SVGUseElement_systemLanguage_Getter(mthis) native "SVGGraphicsElement_systemLanguage_Getter";
+class BlinkSVGViewElement {
+  static $viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
 
-Native_SVGUseElement_hasExtension_Callback(mthis, extension) native "SVGGraphicsElement_hasExtension_Callback_RESOLVER_STRING_1_DOMString";
+  static $preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
 
-Native_SVGUseElement_href_Getter(mthis) native "SVGUseElement_href_Getter";
+  static $viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
 
-Native_SVGViewElement_viewTarget_Getter(mthis) native "SVGViewElement_viewTarget_Getter";
+  static $zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
 
-Native_SVGViewElement_preserveAspectRatio_Getter(mthis) native "SVGViewElement_preserveAspectRatio_Getter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+}
 
-Native_SVGViewElement_viewBox_Getter(mthis) native "SVGViewElement_viewBox_Getter";
+class BlinkSVGViewSpec {
+  static $preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
 
-Native_SVGViewElement_zoomAndPan_Getter(mthis) native "SVGViewElement_zoomAndPan_Getter";
+  static $transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
 
-Native_SVGViewElement_zoomAndPan_Setter(mthis, value) native "SVGViewElement_zoomAndPan_Setter";
+  static $transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
 
-Native_SVGViewSpec_preserveAspectRatioString_Getter(mthis) native "SVGViewSpec_preserveAspectRatioString_Getter";
+  static $viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
 
-Native_SVGViewSpec_transform_Getter(mthis) native "SVGViewSpec_transform_Getter";
+  static $viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
 
-Native_SVGViewSpec_transformString_Getter(mthis) native "SVGViewSpec_transformString_Getter";
+  static $viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
 
-Native_SVGViewSpec_viewBoxString_Getter(mthis) native "SVGViewSpec_viewBoxString_Getter";
+  static $preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
 
-Native_SVGViewSpec_viewTarget_Getter(mthis) native "SVGViewSpec_viewTarget_Getter";
+  static $viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
 
-Native_SVGViewSpec_viewTargetString_Getter(mthis) native "SVGViewSpec_viewTargetString_Getter";
+  static $zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
 
-Native_SVGViewSpec_preserveAspectRatio_Getter(mthis) native "SVGViewSpec_preserveAspectRatio_Getter";
+  static $zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+}
 
-Native_SVGViewSpec_viewBox_Getter(mthis) native "SVGViewSpec_viewBox_Getter";
+class BlinkSVGZoomEvent {
+  static $newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
 
-Native_SVGViewSpec_zoomAndPan_Getter(mthis) native "SVGViewSpec_zoomAndPan_Getter";
+  static $newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
 
-Native_SVGViewSpec_zoomAndPan_Setter(mthis, value) native "SVGViewSpec_zoomAndPan_Setter";
+  static $previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
 
-Native_SVGZoomEvent_newScale_Getter(mthis) native "SVGZoomEvent_newScale_Getter";
+  static $previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
 
-Native_SVGZoomEvent_newTranslate_Getter(mthis) native "SVGZoomEvent_newTranslate_Getter";
+  static $zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+}
 
-Native_SVGZoomEvent_previousScale_Getter(mthis) native "SVGZoomEvent_previousScale_Getter";
+class BlinkScreen {
+  static $availHeight_Getter(mthis) native "Screen_availHeight_Getter";
 
-Native_SVGZoomEvent_previousTranslate_Getter(mthis) native "SVGZoomEvent_previousTranslate_Getter";
+  static $availLeft_Getter(mthis) native "Screen_availLeft_Getter";
 
-Native_SVGZoomEvent_zoomRectScreen_Getter(mthis) native "SVGZoomEvent_zoomRectScreen_Getter";
+  static $availTop_Getter(mthis) native "Screen_availTop_Getter";
 
-Native_Screen_availHeight_Getter(mthis) native "Screen_availHeight_Getter";
+  static $availWidth_Getter(mthis) native "Screen_availWidth_Getter";
 
-Native_Screen_availLeft_Getter(mthis) native "Screen_availLeft_Getter";
+  static $colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
 
-Native_Screen_availTop_Getter(mthis) native "Screen_availTop_Getter";
+  static $height_Getter(mthis) native "Screen_height_Getter";
 
-Native_Screen_availWidth_Getter(mthis) native "Screen_availWidth_Getter";
+  static $orientation_Getter(mthis) native "Screen_orientation_Getter";
 
-Native_Screen_colorDepth_Getter(mthis) native "Screen_colorDepth_Getter";
+  static $pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
 
-Native_Screen_height_Getter(mthis) native "Screen_height_Getter";
+  static $width_Getter(mthis) native "Screen_width_Getter";
 
-Native_Screen_orientation_Getter(mthis) native "Screen_orientation_Getter";
+  static $lockOrientation_Callback(mthis, orientation) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Screen_pixelDepth_Getter(mthis) native "Screen_pixelDepth_Getter";
+  static $unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Screen_width_Getter(mthis) native "Screen_width_Getter";
+class BlinkScriptProcessorNode {
+  static $bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
 
-Native_Screen_lockOrientation_Callback(mthis, orientation) native "Screen_lockOrientation_Callback_RESOLVER_STRING_1_DOMString";
+  static $_setEventListener_Callback(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+}
 
-Native_Screen_unlockOrientation_Callback(mthis) native "Screen_unlockOrientation_Callback_RESOLVER_STRING_0_";
+class BlinkSecurityPolicyViolationEvent {
+  static $blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
 
-Native_ScriptProcessorNode_bufferSize_Getter(mthis) native "ScriptProcessorNode_bufferSize_Getter";
+  static $columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
 
-Native_ScriptProcessorNode__setEventListener_Callback(mthis, eventListener) native "ScriptProcessorNode_setEventListener_Callback";
+  static $documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
 
-Native_SecurityPolicyViolationEvent_blockedURI_Getter(mthis) native "SecurityPolicyViolationEvent_blockedURI_Getter";
+  static $effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
 
-Native_SecurityPolicyViolationEvent_columnNumber_Getter(mthis) native "SecurityPolicyViolationEvent_columnNumber_Getter";
+  static $lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
 
-Native_SecurityPolicyViolationEvent_documentURI_Getter(mthis) native "SecurityPolicyViolationEvent_documentURI_Getter";
+  static $originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
 
-Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(mthis) native "SecurityPolicyViolationEvent_effectiveDirective_Getter";
+  static $referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
 
-Native_SecurityPolicyViolationEvent_lineNumber_Getter(mthis) native "SecurityPolicyViolationEvent_lineNumber_Getter";
+  static $sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
 
-Native_SecurityPolicyViolationEvent_originalPolicy_Getter(mthis) native "SecurityPolicyViolationEvent_originalPolicy_Getter";
+  static $statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
 
-Native_SecurityPolicyViolationEvent_referrer_Getter(mthis) native "SecurityPolicyViolationEvent_referrer_Getter";
+  static $violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+}
 
-Native_SecurityPolicyViolationEvent_sourceFile_Getter(mthis) native "SecurityPolicyViolationEvent_sourceFile_Getter";
+class BlinkSelection {
+  static $anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
 
-Native_SecurityPolicyViolationEvent_statusCode_Getter(mthis) native "SecurityPolicyViolationEvent_statusCode_Getter";
+  static $anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
 
-Native_SecurityPolicyViolationEvent_violatedDirective_Getter(mthis) native "SecurityPolicyViolationEvent_violatedDirective_Getter";
+  static $baseNode_Getter(mthis) native "Selection_baseNode_Getter";
 
-Native_Selection_anchorNode_Getter(mthis) native "Selection_anchorNode_Getter";
+  static $baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
 
-Native_Selection_anchorOffset_Getter(mthis) native "Selection_anchorOffset_Getter";
+  static $extentNode_Getter(mthis) native "Selection_extentNode_Getter";
 
-Native_Selection_baseNode_Getter(mthis) native "Selection_baseNode_Getter";
+  static $extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
 
-Native_Selection_baseOffset_Getter(mthis) native "Selection_baseOffset_Getter";
+  static $focusNode_Getter(mthis) native "Selection_focusNode_Getter";
 
-Native_Selection_extentNode_Getter(mthis) native "Selection_extentNode_Getter";
+  static $focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
 
-Native_Selection_extentOffset_Getter(mthis) native "Selection_extentOffset_Getter";
+  static $isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
 
-Native_Selection_focusNode_Getter(mthis) native "Selection_focusNode_Getter";
+  static $rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
 
-Native_Selection_focusOffset_Getter(mthis) native "Selection_focusOffset_Getter";
+  static $type_Getter(mthis) native "Selection_type_Getter";
 
-Native_Selection_isCollapsed_Getter(mthis) native "Selection_isCollapsed_Getter";
+  static $addRange_Callback(mthis, range) native "Selection_addRange_Callback_RESOLVER_STRING_1_Range";
 
-Native_Selection_rangeCount_Getter(mthis) native "Selection_rangeCount_Getter";
+  static $collapse_Callback(mthis, node, index) native "Selection_collapse_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_type_Getter(mthis) native "Selection_type_Getter";
+  static $collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_addRange_Callback(mthis, range) native "Selection_addRange_Callback_RESOLVER_STRING_1_Range";
+  static $collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_collapse_Callback(mthis, node, index) native "Selection_collapse_Callback_RESOLVER_STRING_2_Node_long";
+  static $containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback_RESOLVER_STRING_2_Node_boolean";
 
-Native_Selection_collapseToEnd_Callback(mthis) native "Selection_collapseToEnd_Callback_RESOLVER_STRING_0_";
+  static $deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_collapseToStart_Callback(mthis) native "Selection_collapseToStart_Callback_RESOLVER_STRING_0_";
+  static $empty_Callback(mthis) native "Selection_empty_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_containsNode_Callback(mthis, node, allowPartial) native "Selection_containsNode_Callback_RESOLVER_STRING_2_Node_boolean";
+  static $extend_Callback(mthis, node, offset) native "Selection_extend_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_deleteFromDocument_Callback(mthis) native "Selection_deleteFromDocument_Callback_RESOLVER_STRING_0_";
+  static $getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback_RESOLVER_STRING_1_long";
 
-Native_Selection_empty_Callback(mthis) native "Selection_empty_Callback_RESOLVER_STRING_0_";
+  static $modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
 
-Native_Selection_extend_Callback(mthis, node, offset) native "Selection_extend_Callback_RESOLVER_STRING_2_Node_long";
+  static $removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback_RESOLVER_STRING_0_";
 
-Native_Selection_getRangeAt_Callback(mthis, index) native "Selection_getRangeAt_Callback_RESOLVER_STRING_1_long";
+  static $selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback_RESOLVER_STRING_1_Node";
 
-Native_Selection_modify_Callback(mthis, alter, direction, granularity) native "Selection_modify_Callback_RESOLVER_STRING_3_DOMString_DOMString_DOMString";
+  static $setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback_RESOLVER_STRING_4_Node_long_Node_long";
 
-Native_Selection_removeAllRanges_Callback(mthis) native "Selection_removeAllRanges_Callback_RESOLVER_STRING_0_";
+  static $setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback_RESOLVER_STRING_2_Node_long";
 
-Native_Selection_selectAllChildren_Callback(mthis, node) native "Selection_selectAllChildren_Callback_RESOLVER_STRING_1_Node";
+  static $toString_Callback(mthis) native "Selection_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_Selection_setBaseAndExtent_Callback(mthis, baseNode, baseOffset, extentNode, extentOffset) native "Selection_setBaseAndExtent_Callback_RESOLVER_STRING_4_Node_long_Node_long";
+class BlinkServiceWorker {}
 
-Native_Selection_setPosition_Callback(mthis, node, offset) native "Selection_setPosition_Callback_RESOLVER_STRING_2_Node_long";
+class BlinkServiceWorkerContainer {}
 
-Native_Selection_toString_Callback(mthis) native "Selection_toString_Callback_RESOLVER_STRING_0_";
+class BlinkServiceWorkerGlobalScope {}
 
-Native_ShadowRoot_activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
+class BlinkShadowRoot {
+  static $activeElement_Getter(mthis) native "ShadowRoot_activeElement_Getter";
 
-Native_ShadowRoot_host_Getter(mthis) native "ShadowRoot_host_Getter";
+  static $host_Getter(mthis) native "ShadowRoot_host_Getter";
 
-Native_ShadowRoot_innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
+  static $innerHTML_Getter(mthis) native "ShadowRoot_innerHTML_Getter";
 
-Native_ShadowRoot_innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
+  static $innerHTML_Setter(mthis, value) native "ShadowRoot_innerHTML_Setter";
 
-Native_ShadowRoot_olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
+  static $olderShadowRoot_Getter(mthis) native "ShadowRoot_olderShadowRoot_Getter";
 
-Native_ShadowRoot_resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
+  static $resetStyleInheritance_Getter(mthis) native "ShadowRoot_resetStyleInheritance_Getter";
 
-Native_ShadowRoot_resetStyleInheritance_Setter(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
+  static $resetStyleInheritance_Setter(mthis, value) native "ShadowRoot_resetStyleInheritance_Setter";
 
-Native_ShadowRoot_styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
+  static $styleSheets_Getter(mthis) native "ShadowRoot_styleSheets_Getter";
 
-Native_ShadowRoot_cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback_RESOLVER_STRING_1_boolean";
+  static $cloneNode_Callback(mthis, deep) native "ShadowRoot_cloneNode_Callback_RESOLVER_STRING_1_boolean";
 
-Native_ShadowRoot_elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
+  static $elementFromPoint_Callback(mthis, x, y) native "ShadowRoot_elementFromPoint_Callback_RESOLVER_STRING_2_long_long";
 
-Native_ShadowRoot_getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementById_Callback(mthis, elementId) native "ShadowRoot_getElementById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByClassName_Callback(mthis, className) native "ShadowRoot_getElementsByClassName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
+  static $getElementsByTagName_Callback(mthis, tagName) native "ShadowRoot_getElementsByTagName_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_ShadowRoot_getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback_RESOLVER_STRING_0_";
+  static $getSelection_Callback(mthis) native "ShadowRoot_getSelection_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkSharedWorker {
   // Generated overload resolver
-Native_SharedWorker_SharedWorker(scriptURL, name) {
-    return Native_SharedWorker__create_1constructorCallback(scriptURL, name);
+  static $mkSharedWorker(scriptURL, name) {
+    return $_create_1constructorCallback(scriptURL, name);
   }
 
-Native_SharedWorker__create_1constructorCallback(scriptURL, name) native "SharedWorker_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_create_1constructorCallback(scriptURL, name) native "SharedWorker_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_SharedWorker_port_Getter(mthis) native "SharedWorker_port_Getter";
+  static $port_Getter(mthis) native "SharedWorker_port_Getter";
 
-Native_SharedWorker_workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+  static $workerStart_Getter(mthis) native "SharedWorker_workerStart_Getter";
+}
 
-Native_SharedWorkerGlobalScope_name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+class BlinkSharedWorkerGlobalScope {
+  static $name_Getter(mthis) native "SharedWorkerGlobalScope_name_Getter";
+}
 
-Native_SourceBuffer_appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
+class BlinkSourceBuffer {
+  static $appendWindowEnd_Getter(mthis) native "SourceBuffer_appendWindowEnd_Getter";
 
-Native_SourceBuffer_appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
+  static $appendWindowEnd_Setter(mthis, value) native "SourceBuffer_appendWindowEnd_Setter";
 
-Native_SourceBuffer_appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
+  static $appendWindowStart_Getter(mthis) native "SourceBuffer_appendWindowStart_Getter";
 
-Native_SourceBuffer_appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
+  static $appendWindowStart_Setter(mthis, value) native "SourceBuffer_appendWindowStart_Setter";
 
-Native_SourceBuffer_buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
+  static $buffered_Getter(mthis) native "SourceBuffer_buffered_Getter";
 
-Native_SourceBuffer_mode_Getter(mthis) native "SourceBuffer_mode_Getter";
+  static $mode_Getter(mthis) native "SourceBuffer_mode_Getter";
 
-Native_SourceBuffer_mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
+  static $mode_Setter(mthis, value) native "SourceBuffer_mode_Setter";
 
-Native_SourceBuffer_timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
+  static $timestampOffset_Getter(mthis) native "SourceBuffer_timestampOffset_Getter";
 
-Native_SourceBuffer_timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
+  static $timestampOffset_Setter(mthis, value) native "SourceBuffer_timestampOffset_Setter";
 
-Native_SourceBuffer_updating_Getter(mthis) native "SourceBuffer_updating_Getter";
+  static $updating_Getter(mthis) native "SourceBuffer_updating_Getter";
 
-Native_SourceBuffer_abort_Callback(mthis) native "SourceBuffer_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "SourceBuffer_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SourceBuffer_appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $appendBuffer_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
   // Generated overload resolver
-Native_SourceBuffer_appendStream(mthis, stream, maxSize) {
+  static $appendStream(mthis, stream, maxSize) {
     if (maxSize != null) {
-      Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize);
+      $_appendStream_1_Callback(mthis, stream, maxSize);
       return;
     }
-    Native_SourceBuffer__appendStream_2_Callback(mthis, stream);
+    $_appendStream_2_Callback(mthis, stream);
     return;
   }
 
-Native_SourceBuffer__appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_2_Stream_unsigned long long";
+  static $_appendStream_1_Callback(mthis, stream, maxSize) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_2_Stream_unsigned long long";
 
-Native_SourceBuffer__appendStream_2_Callback(mthis, stream) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_1_Stream";
+  static $_appendStream_2_Callback(mthis, stream) native "SourceBuffer_appendStream_Callback_RESOLVER_STRING_1_Stream";
 
-Native_SourceBuffer_appendTypedData_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $appendTypedData_Callback(mthis, data) native "SourceBuffer_appendBuffer_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_SourceBuffer_remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback_RESOLVER_STRING_2_double_double";
+  static $remove_Callback(mthis, start, end) native "SourceBuffer_remove_Callback_RESOLVER_STRING_2_double_double";
+}
 
-Native_SourceBufferList_length_Getter(mthis) native "SourceBufferList_length_Getter";
+class BlinkSourceBufferList {
+  static $length_Getter(mthis) native "SourceBufferList_length_Getter";
 
-Native_SourceBufferList_NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SourceBufferList_item_Callback(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SourceInfo_facing_Getter(mthis) native "SourceInfo_facing_Getter";
+class BlinkSourceInfo {
+  static $facing_Getter(mthis) native "SourceInfo_facing_Getter";
 
-Native_SourceInfo_id_Getter(mthis) native "SourceInfo_id_Getter";
+  static $id_Getter(mthis) native "SourceInfo_id_Getter";
 
-Native_SourceInfo_kind_Getter(mthis) native "SourceInfo_kind_Getter";
+  static $kind_Getter(mthis) native "SourceInfo_kind_Getter";
 
-Native_SourceInfo_label_Getter(mthis) native "SourceInfo_label_Getter";
+  static $label_Getter(mthis) native "SourceInfo_label_Getter";
+}
 
+class BlinkSpeechGrammar {
   // Generated overload resolver
-Native_SpeechGrammar_SpeechGrammar() {
-    return Native_SpeechGrammar__create_1constructorCallback();
+  static $mkSpeechGrammar() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechGrammar__create_1constructorCallback() native "SpeechGrammar_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechGrammar_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechGrammar_src_Getter(mthis) native "SpeechGrammar_src_Getter";
+  static $src_Getter(mthis) native "SpeechGrammar_src_Getter";
 
-Native_SpeechGrammar_src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
+  static $src_Setter(mthis, value) native "SpeechGrammar_src_Setter";
 
-Native_SpeechGrammar_weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
+  static $weight_Getter(mthis) native "SpeechGrammar_weight_Getter";
 
-Native_SpeechGrammar_weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+  static $weight_Setter(mthis, value) native "SpeechGrammar_weight_Setter";
+}
 
+class BlinkSpeechGrammarList {
   // Generated overload resolver
-Native_SpeechGrammarList_SpeechGrammarList() {
-    return Native_SpeechGrammarList__create_1constructorCallback();
+  static $mkSpeechGrammarList() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechGrammarList__create_1constructorCallback() native "SpeechGrammarList_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechGrammarList_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechGrammarList_length_Getter(mthis) native "SpeechGrammarList_length_Getter";
+  static $length_Getter(mthis) native "SpeechGrammarList_length_Getter";
 
-Native_SpeechGrammarList_NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
   // Generated overload resolver
-Native_SpeechGrammarList_addFromString(mthis, string, weight) {
+  static $addFromString(mthis, string, weight) {
     if (weight != null) {
-      Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight);
+      $_addFromString_1_Callback(mthis, string, weight);
       return;
     }
-    Native_SpeechGrammarList__addFromString_2_Callback(mthis, string);
+    $_addFromString_2_Callback(mthis, string);
     return;
   }
 
-Native_SpeechGrammarList__addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_2_DOMString_float";
+  static $_addFromString_1_Callback(mthis, string, weight) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromString_2_Callback(mthis, string) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addFromString_2_Callback(mthis, string) native "SpeechGrammarList_addFromString_Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_SpeechGrammarList_addFromUri(mthis, src, weight) {
+  static $addFromUri(mthis, src, weight) {
     if (weight != null) {
-      Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight);
+      $_addFromUri_1_Callback(mthis, src, weight);
       return;
     }
-    Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src);
+    $_addFromUri_2_Callback(mthis, src);
     return;
   }
 
-Native_SpeechGrammarList__addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_2_DOMString_float";
+  static $_addFromUri_1_Callback(mthis, src, weight) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_2_DOMString_float";
 
-Native_SpeechGrammarList__addFromUri_2_Callback(mthis, src) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_1_DOMString";
+  static $_addFromUri_2_Callback(mthis, src) native "SpeechGrammarList_addFromUri_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_SpeechGrammarList_item_Callback(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechGrammarList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechInputResultList_length_Getter(mthis) native "SpeechInputResultList_length_Getter";
+class BlinkSpeechInputEvent {}
 
-Native_SpeechInputResultList_NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSpeechInputResult {}
 
-Native_SpeechInputResultList_item_Callback(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkSpeechInputResultList {
+  static $length_Getter(mthis) native "SpeechInputResultList_length_Getter";
 
+  static $NativeIndexed_Getter(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+
+  static $item_Callback(mthis, index) native "SpeechInputResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkSpeechRecognition {
   // Generated overload resolver
-Native_SpeechRecognition_SpeechRecognition() {
-    return Native_SpeechRecognition__create_1constructorCallback();
+  static $mkSpeechRecognition() {
+    return $_create_1constructorCallback();
   }
 
-Native_SpeechRecognition__create_1constructorCallback() native "SpeechRecognition_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "SpeechRecognition_constructorCallback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
+  static $continuous_Getter(mthis) native "SpeechRecognition_continuous_Getter";
 
-Native_SpeechRecognition_continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
+  static $continuous_Setter(mthis, value) native "SpeechRecognition_continuous_Setter";
 
-Native_SpeechRecognition_grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
+  static $grammars_Getter(mthis) native "SpeechRecognition_grammars_Getter";
 
-Native_SpeechRecognition_grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
+  static $grammars_Setter(mthis, value) native "SpeechRecognition_grammars_Setter";
 
-Native_SpeechRecognition_interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
+  static $interimResults_Getter(mthis) native "SpeechRecognition_interimResults_Getter";
 
-Native_SpeechRecognition_interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
+  static $interimResults_Setter(mthis, value) native "SpeechRecognition_interimResults_Setter";
 
-Native_SpeechRecognition_lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechRecognition_lang_Getter";
 
-Native_SpeechRecognition_lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
+  static $lang_Setter(mthis, value) native "SpeechRecognition_lang_Setter";
 
-Native_SpeechRecognition_maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
+  static $maxAlternatives_Getter(mthis) native "SpeechRecognition_maxAlternatives_Getter";
 
-Native_SpeechRecognition_maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
+  static $maxAlternatives_Setter(mthis, value) native "SpeechRecognition_maxAlternatives_Setter";
 
-Native_SpeechRecognition_abort_Callback(mthis) native "SpeechRecognition_abort_Callback_RESOLVER_STRING_0_";
+  static $abort_Callback(mthis) native "SpeechRecognition_abort_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_start_Callback(mthis) native "SpeechRecognition_start_Callback_RESOLVER_STRING_0_";
+  static $start_Callback(mthis) native "SpeechRecognition_start_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechRecognition_stop_Callback(mthis) native "SpeechRecognition_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "SpeechRecognition_stop_Callback_RESOLVER_STRING_0_";
+}
 
-Native_SpeechRecognitionAlternative_confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
+class BlinkSpeechRecognitionAlternative {
+  static $confidence_Getter(mthis) native "SpeechRecognitionAlternative_confidence_Getter";
 
-Native_SpeechRecognitionAlternative_transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+  static $transcript_Getter(mthis) native "SpeechRecognitionAlternative_transcript_Getter";
+}
 
-Native_SpeechRecognitionError_error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
+class BlinkSpeechRecognitionError {
+  static $error_Getter(mthis) native "SpeechRecognitionError_error_Getter";
 
-Native_SpeechRecognitionError_message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+  static $message_Getter(mthis) native "SpeechRecognitionError_message_Getter";
+}
 
-Native_SpeechRecognitionEvent_emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
+class BlinkSpeechRecognitionEvent {
+  static $emma_Getter(mthis) native "SpeechRecognitionEvent_emma_Getter";
 
-Native_SpeechRecognitionEvent_interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
+  static $interpretation_Getter(mthis) native "SpeechRecognitionEvent_interpretation_Getter";
 
-Native_SpeechRecognitionEvent_resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
+  static $resultIndex_Getter(mthis) native "SpeechRecognitionEvent_resultIndex_Getter";
 
-Native_SpeechRecognitionEvent_results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+  static $results_Getter(mthis) native "SpeechRecognitionEvent_results_Getter";
+}
 
-Native_SpeechRecognitionResult_isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
+class BlinkSpeechRecognitionResult {
+  static $isFinal_Getter(mthis) native "SpeechRecognitionResult_isFinal_Getter";
 
-Native_SpeechRecognitionResult_length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
+  static $length_Getter(mthis) native "SpeechRecognitionResult_length_Getter";
 
-Native_SpeechRecognitionResult_item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechRecognitionResult_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechRecognitionResultList_length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
+class BlinkSpeechRecognitionResultList {
+  static $length_Getter(mthis) native "SpeechRecognitionResultList_length_Getter";
 
-Native_SpeechRecognitionResultList_NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_SpeechRecognitionResultList_item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "SpeechRecognitionResultList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_SpeechSynthesis_paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
+class BlinkSpeechSynthesis {
+  static $paused_Getter(mthis) native "SpeechSynthesis_paused_Getter";
 
-Native_SpeechSynthesis_pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
+  static $pending_Getter(mthis) native "SpeechSynthesis_pending_Getter";
 
-Native_SpeechSynthesis_speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
+  static $speaking_Getter(mthis) native "SpeechSynthesis_speaking_Getter";
 
-Native_SpeechSynthesis_cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback_RESOLVER_STRING_0_";
+  static $cancel_Callback(mthis) native "SpeechSynthesis_cancel_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback_RESOLVER_STRING_0_";
+  static $getVoices_Callback(mthis) native "SpeechSynthesis_getVoices_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_pause_Callback(mthis) native "SpeechSynthesis_pause_Callback_RESOLVER_STRING_0_";
+  static $pause_Callback(mthis) native "SpeechSynthesis_pause_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_resume_Callback(mthis) native "SpeechSynthesis_resume_Callback_RESOLVER_STRING_0_";
+  static $resume_Callback(mthis) native "SpeechSynthesis_resume_Callback_RESOLVER_STRING_0_";
 
-Native_SpeechSynthesis_speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback_RESOLVER_STRING_1_SpeechSynthesisUtterance";
+  static $speak_Callback(mthis, utterance) native "SpeechSynthesis_speak_Callback_RESOLVER_STRING_1_SpeechSynthesisUtterance";
+}
 
-Native_SpeechSynthesisEvent_charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
+class BlinkSpeechSynthesisEvent {
+  static $charIndex_Getter(mthis) native "SpeechSynthesisEvent_charIndex_Getter";
 
-Native_SpeechSynthesisEvent_elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
+  static $elapsedTime_Getter(mthis) native "SpeechSynthesisEvent_elapsedTime_Getter";
 
-Native_SpeechSynthesisEvent_name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+  static $name_Getter(mthis) native "SpeechSynthesisEvent_name_Getter";
+}
 
+class BlinkSpeechSynthesisUtterance {
   // Generated overload resolver
-Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text) {
-    return Native_SpeechSynthesisUtterance__create_1constructorCallback(text);
+  static $mkSpeechSynthesisUtterance(text) {
+    return $_create_1constructorCallback(text);
   }
 
-Native_SpeechSynthesisUtterance__create_1constructorCallback(text) native "SpeechSynthesisUtterance_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(text) native "SpeechSynthesisUtterance_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_SpeechSynthesisUtterance_lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechSynthesisUtterance_lang_Getter";
 
-Native_SpeechSynthesisUtterance_lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
+  static $lang_Setter(mthis, value) native "SpeechSynthesisUtterance_lang_Setter";
 
-Native_SpeechSynthesisUtterance_pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
+  static $pitch_Getter(mthis) native "SpeechSynthesisUtterance_pitch_Getter";
 
-Native_SpeechSynthesisUtterance_pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
+  static $pitch_Setter(mthis, value) native "SpeechSynthesisUtterance_pitch_Setter";
 
-Native_SpeechSynthesisUtterance_rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
+  static $rate_Getter(mthis) native "SpeechSynthesisUtterance_rate_Getter";
 
-Native_SpeechSynthesisUtterance_rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
+  static $rate_Setter(mthis, value) native "SpeechSynthesisUtterance_rate_Setter";
 
-Native_SpeechSynthesisUtterance_text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
+  static $text_Getter(mthis) native "SpeechSynthesisUtterance_text_Getter";
 
-Native_SpeechSynthesisUtterance_text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
+  static $text_Setter(mthis, value) native "SpeechSynthesisUtterance_text_Setter";
 
-Native_SpeechSynthesisUtterance_voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
+  static $voice_Getter(mthis) native "SpeechSynthesisUtterance_voice_Getter";
 
-Native_SpeechSynthesisUtterance_voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
+  static $voice_Setter(mthis, value) native "SpeechSynthesisUtterance_voice_Setter";
 
-Native_SpeechSynthesisUtterance_volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
+  static $volume_Getter(mthis) native "SpeechSynthesisUtterance_volume_Getter";
 
-Native_SpeechSynthesisUtterance_volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+  static $volume_Setter(mthis, value) native "SpeechSynthesisUtterance_volume_Setter";
+}
 
-Native_SpeechSynthesisVoice_default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
+class BlinkSpeechSynthesisVoice {
+  static $default_Getter(mthis) native "SpeechSynthesisVoice_default_Getter";
 
-Native_SpeechSynthesisVoice_lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
+  static $lang_Getter(mthis) native "SpeechSynthesisVoice_lang_Getter";
 
-Native_SpeechSynthesisVoice_localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
+  static $localService_Getter(mthis) native "SpeechSynthesisVoice_localService_Getter";
 
-Native_SpeechSynthesisVoice_name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
+  static $name_Getter(mthis) native "SpeechSynthesisVoice_name_Getter";
 
-Native_SpeechSynthesisVoice_voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+  static $voiceURI_Getter(mthis) native "SpeechSynthesisVoice_voiceURI_Getter";
+}
 
-Native_Storage_length_Getter(mthis) native "Storage_length_Getter";
+class BlinkStorage {
+  static $length_Getter(mthis) native "Storage_length_Getter";
 
   // Generated overload resolver
-Native_Storage___delete__(mthis, index_OR_name) {
+  static $__delete__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Storage____delete___1_Callback(mthis, index_OR_name);
+      return $___delete___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Storage____delete___2_Callback(mthis, index_OR_name);
+      return $___delete___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____delete___1_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___delete___1_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____delete___2_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_DOMString";
+  static $___delete___2_Callback(mthis, index_OR_name) native "Storage___delete___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Storage___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Storage____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Storage____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____getter___1_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage____getter___2_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $___getter___2_Callback(mthis, index_OR_name) native "Storage___getter___Callback_RESOLVER_STRING_1_DOMString";
 
   // Generated overload resolver
-Native_Storage___setter__(mthis, index_OR_name, value) {
+  static $__setter__(mthis, index_OR_name, value) {
     if ((value is String || value == null) && (index_OR_name is int || index_OR_name == null)) {
-      Native_Storage____setter___1_Callback(mthis, index_OR_name, value);
+      $___setter___1_Callback(mthis, index_OR_name, value);
       return;
     }
     if ((value is String || value == null) && (index_OR_name is String || index_OR_name == null)) {
-      Native_Storage____setter___2_Callback(mthis, index_OR_name, value);
+      $___setter___2_Callback(mthis, index_OR_name, value);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Storage____setter___1_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
+  static $___setter___1_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_unsigned long_DOMString";
 
-Native_Storage____setter___2_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $___setter___2_Callback(mthis, index_OR_name, value) native "Storage___setter___Callback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_Storage_clear_Callback(mthis) native "Storage_clear_Callback_RESOLVER_STRING_0_";
+  static $clear_Callback(mthis) native "Storage_clear_Callback_RESOLVER_STRING_0_";
 
-Native_Storage_getItem_Callback(mthis, key) native "Storage_getItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $getItem_Callback(mthis, key) native "Storage_getItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_key_Callback(mthis, index) native "Storage_key_Callback_RESOLVER_STRING_1_unsigned long";
+  static $key_Callback(mthis, index) native "Storage_key_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Storage_removeItem_Callback(mthis, key) native "Storage_removeItem_Callback_RESOLVER_STRING_1_DOMString";
+  static $removeItem_Callback(mthis, key) native "Storage_removeItem_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Storage_setItem_Callback(mthis, key, data) native "Storage_setItem_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $setItem_Callback(mthis, key, data) native "Storage_setItem_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
 
-Native_StorageEvent_key_Getter(mthis) native "StorageEvent_key_Getter";
+class BlinkStorageEvent {
+  static $key_Getter(mthis) native "StorageEvent_key_Getter";
 
-Native_StorageEvent_newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
+  static $newValue_Getter(mthis) native "StorageEvent_newValue_Getter";
 
-Native_StorageEvent_oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
+  static $oldValue_Getter(mthis) native "StorageEvent_oldValue_Getter";
 
-Native_StorageEvent_storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
+  static $storageArea_Getter(mthis) native "StorageEvent_storageArea_Getter";
 
-Native_StorageEvent_url_Getter(mthis) native "StorageEvent_url_Getter";
+  static $url_Getter(mthis) native "StorageEvent_url_Getter";
 
-Native_StorageEvent_initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback_RESOLVER_STRING_8_DOMString_boolean_boolean_DOMString_DOMString_DOMString_DOMString_Storage";
+  static $initStorageEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg) native "StorageEvent_initStorageEvent_Callback_RESOLVER_STRING_8_DOMString_boolean_boolean_DOMString_DOMString_DOMString_DOMString_Storage";
+}
 
-Native_StorageInfo_quota_Getter(mthis) native "StorageInfo_quota_Getter";
+class BlinkStorageInfo {
+  static $quota_Getter(mthis) native "StorageInfo_quota_Getter";
 
-Native_StorageInfo_usage_Getter(mthis) native "StorageInfo_usage_Getter";
+  static $usage_Getter(mthis) native "StorageInfo_usage_Getter";
+}
 
-Native_StorageQuota_supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+class BlinkStorageQuota {
+  static $supportedTypes_Getter(mthis) native "StorageQuota_supportedTypes_Getter";
+}
 
-Native_Stream_type_Getter(mthis) native "Stream_type_Getter";
+class BlinkStream {
+  static $type_Getter(mthis) native "Stream_type_Getter";
+}
 
-Native_StyleMedia_type_Getter(mthis) native "StyleMedia_type_Getter";
+class BlinkStyleMedia {
+  static $type_Getter(mthis) native "StyleMedia_type_Getter";
 
-Native_StyleMedia_matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback_RESOLVER_STRING_1_DOMString";
+  static $matchMedium_Callback(mthis, mediaquery) native "StyleMedia_matchMedium_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_StyleSheetList_length_Getter(mthis) native "StyleSheetList_length_Getter";
+class BlinkStyleSheetList {
+  static $length_Getter(mthis) native "StyleSheetList_length_Getter";
 
-Native_StyleSheetList_NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_StyleSheetList___getter___Callback(mthis, name) native "StyleSheetList___getter___Callback_RESOLVER_STRING_1_DOMString";
+  static $__getter___Callback(mthis, name) native "StyleSheetList___getter___Callback_RESOLVER_STRING_1_DOMString";
 
-Native_StyleSheetList_item_Callback(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "StyleSheetList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TextEvent_data_Getter(mthis) native "TextEvent_data_Getter";
+class BlinkSubtleCrypto {}
 
-Native_TextEvent_initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+class BlinkTextEvent {
+  static $data_Getter(mthis) native "TextEvent_data_Getter";
 
-Native_TextMetrics_width_Getter(mthis) native "TextMetrics_width_Getter";
+  static $initTextEvent_Callback(mthis, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg) native "TextEvent_initTextEvent_Callback_RESOLVER_STRING_5_DOMString_boolean_boolean_Window_DOMString";
+}
 
-Native_TextTrack_activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
+class BlinkTextMetrics {
+  static $width_Getter(mthis) native "TextMetrics_width_Getter";
+}
 
-Native_TextTrack_cues_Getter(mthis) native "TextTrack_cues_Getter";
+class BlinkTextTrack {
+  static $activeCues_Getter(mthis) native "TextTrack_activeCues_Getter";
 
-Native_TextTrack_id_Getter(mthis) native "TextTrack_id_Getter";
+  static $cues_Getter(mthis) native "TextTrack_cues_Getter";
 
-Native_TextTrack_kind_Getter(mthis) native "TextTrack_kind_Getter";
+  static $id_Getter(mthis) native "TextTrack_id_Getter";
 
-Native_TextTrack_label_Getter(mthis) native "TextTrack_label_Getter";
+  static $kind_Getter(mthis) native "TextTrack_kind_Getter";
 
-Native_TextTrack_language_Getter(mthis) native "TextTrack_language_Getter";
+  static $label_Getter(mthis) native "TextTrack_label_Getter";
 
-Native_TextTrack_mode_Getter(mthis) native "TextTrack_mode_Getter";
+  static $language_Getter(mthis) native "TextTrack_language_Getter";
 
-Native_TextTrack_mode_Setter(mthis, value) native "TextTrack_mode_Setter";
+  static $mode_Getter(mthis) native "TextTrack_mode_Getter";
 
-Native_TextTrack_regions_Getter(mthis) native "TextTrack_regions_Getter";
+  static $mode_Setter(mthis, value) native "TextTrack_mode_Setter";
 
-Native_TextTrack_addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback_RESOLVER_STRING_1_TextTrackCue";
+  static $regions_Getter(mthis) native "TextTrack_regions_Getter";
 
-Native_TextTrack_addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+  static $addCue_Callback(mthis, cue) native "TextTrack_addCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrack_removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback_RESOLVER_STRING_1_TextTrackCue";
+  static $addRegion_Callback(mthis, region) native "TextTrack_addRegion_Callback_RESOLVER_STRING_1_VTTRegion";
 
-Native_TextTrack_removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+  static $removeCue_Callback(mthis, cue) native "TextTrack_removeCue_Callback_RESOLVER_STRING_1_TextTrackCue";
 
-Native_TextTrackCue_endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
+  static $removeRegion_Callback(mthis, region) native "TextTrack_removeRegion_Callback_RESOLVER_STRING_1_VTTRegion";
+}
 
-Native_TextTrackCue_endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
+class BlinkTextTrackCue {
+  static $endTime_Getter(mthis) native "TextTrackCue_endTime_Getter";
 
-Native_TextTrackCue_id_Getter(mthis) native "TextTrackCue_id_Getter";
+  static $endTime_Setter(mthis, value) native "TextTrackCue_endTime_Setter";
 
-Native_TextTrackCue_id_Setter(mthis, value) native "TextTrackCue_id_Setter";
+  static $id_Getter(mthis) native "TextTrackCue_id_Getter";
 
-Native_TextTrackCue_pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
+  static $id_Setter(mthis, value) native "TextTrackCue_id_Setter";
 
-Native_TextTrackCue_pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
+  static $pauseOnExit_Getter(mthis) native "TextTrackCue_pauseOnExit_Getter";
 
-Native_TextTrackCue_startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
+  static $pauseOnExit_Setter(mthis, value) native "TextTrackCue_pauseOnExit_Setter";
 
-Native_TextTrackCue_startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
+  static $startTime_Getter(mthis) native "TextTrackCue_startTime_Getter";
 
-Native_TextTrackCue_track_Getter(mthis) native "TextTrackCue_track_Getter";
+  static $startTime_Setter(mthis, value) native "TextTrackCue_startTime_Setter";
 
-Native_TextTrackCueList_length_Getter(mthis) native "TextTrackCueList_length_Getter";
+  static $track_Getter(mthis) native "TextTrackCue_track_Getter";
+}
 
-Native_TextTrackCueList_NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkTextTrackCueList {
+  static $length_Getter(mthis) native "TextTrackCueList_length_Getter";
 
-Native_TextTrackCueList_getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback_RESOLVER_STRING_1_DOMString";
+  static $NativeIndexed_Getter(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackCueList_item_Callback(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getCueById_Callback(mthis, id) native "TextTrackCueList_getCueById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TextTrackList_length_Getter(mthis) native "TextTrackList_length_Getter";
+  static $item_Callback(mthis, index) native "TextTrackCueList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TextTrackList_NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+class BlinkTextTrackList {
+  static $length_Getter(mthis) native "TextTrackList_length_Getter";
 
-Native_TextTrackList_getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
+  static $NativeIndexed_Getter(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TextTrackList_item_Callback(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $getTrackById_Callback(mthis, id) native "TextTrackList_getTrackById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_TimeRanges_length_Getter(mthis) native "TimeRanges_length_Getter";
+  static $item_Callback(mthis, index) native "TextTrackList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkTimeRanges {
+  static $length_Getter(mthis) native "TimeRanges_length_Getter";
 
-Native_TimeRanges_end_Callback(mthis, index) native "TimeRanges_end_Callback_RESOLVER_STRING_1_unsigned long";
+  static $end_Callback(mthis, index) native "TimeRanges_end_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TimeRanges_start_Callback(mthis, index) native "TimeRanges_start_Callback_RESOLVER_STRING_1_unsigned long";
+  static $start_Callback(mthis, index) native "TimeRanges_start_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_Timeline_play_Callback(mthis, source) native "Timeline_play_Callback_RESOLVER_STRING_1_TimedItem";
+class BlinkTimeline {
+  static $play_Callback(mthis, source) native "Timeline_play_Callback_RESOLVER_STRING_1_TimedItem";
+}
 
-Native_Timing_delay_Getter(mthis) native "Timing_delay_Getter";
+class BlinkTiming {
+  static $delay_Getter(mthis) native "Timing_delay_Getter";
 
-Native_Timing_delay_Setter(mthis, value) native "Timing_delay_Setter";
+  static $delay_Setter(mthis, value) native "Timing_delay_Setter";
 
-Native_Timing_direction_Getter(mthis) native "Timing_direction_Getter";
+  static $direction_Getter(mthis) native "Timing_direction_Getter";
 
-Native_Timing_direction_Setter(mthis, value) native "Timing_direction_Setter";
+  static $direction_Setter(mthis, value) native "Timing_direction_Setter";
 
-Native_Timing_easing_Getter(mthis) native "Timing_easing_Getter";
+  static $easing_Getter(mthis) native "Timing_easing_Getter";
 
-Native_Timing_easing_Setter(mthis, value) native "Timing_easing_Setter";
+  static $easing_Setter(mthis, value) native "Timing_easing_Setter";
 
-Native_Timing_endDelay_Getter(mthis) native "Timing_endDelay_Getter";
+  static $endDelay_Getter(mthis) native "Timing_endDelay_Getter";
 
-Native_Timing_endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
+  static $endDelay_Setter(mthis, value) native "Timing_endDelay_Setter";
 
-Native_Timing_fill_Getter(mthis) native "Timing_fill_Getter";
+  static $fill_Getter(mthis) native "Timing_fill_Getter";
 
-Native_Timing_fill_Setter(mthis, value) native "Timing_fill_Setter";
+  static $fill_Setter(mthis, value) native "Timing_fill_Setter";
 
-Native_Timing_iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
+  static $iterationStart_Getter(mthis) native "Timing_iterationStart_Getter";
 
-Native_Timing_iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
+  static $iterationStart_Setter(mthis, value) native "Timing_iterationStart_Setter";
 
-Native_Timing_iterations_Getter(mthis) native "Timing_iterations_Getter";
+  static $iterations_Getter(mthis) native "Timing_iterations_Getter";
 
-Native_Timing_iterations_Setter(mthis, value) native "Timing_iterations_Setter";
+  static $iterations_Setter(mthis, value) native "Timing_iterations_Setter";
 
-Native_Timing_playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
+  static $playbackRate_Getter(mthis) native "Timing_playbackRate_Getter";
 
-Native_Timing_playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
+  static $playbackRate_Setter(mthis, value) native "Timing_playbackRate_Setter";
 
-Native_Timing___setter___Callback(mthis, name, duration) native "Timing___setter___Callback_RESOLVER_STRING_2_DOMString_double";
+  static $__setter___Callback(mthis, name, duration) native "Timing___setter___Callback_RESOLVER_STRING_2_DOMString_double";
+}
 
-Native_Touch_clientX_Getter(mthis) native "Touch_clientX_Getter";
+class BlinkTouch {
+  static $clientX_Getter(mthis) native "Touch_clientX_Getter";
 
-Native_Touch_clientY_Getter(mthis) native "Touch_clientY_Getter";
+  static $clientY_Getter(mthis) native "Touch_clientY_Getter";
 
-Native_Touch_identifier_Getter(mthis) native "Touch_identifier_Getter";
+  static $identifier_Getter(mthis) native "Touch_identifier_Getter";
 
-Native_Touch_pageX_Getter(mthis) native "Touch_pageX_Getter";
+  static $pageX_Getter(mthis) native "Touch_pageX_Getter";
 
-Native_Touch_pageY_Getter(mthis) native "Touch_pageY_Getter";
+  static $pageY_Getter(mthis) native "Touch_pageY_Getter";
 
-Native_Touch_screenX_Getter(mthis) native "Touch_screenX_Getter";
+  static $screenX_Getter(mthis) native "Touch_screenX_Getter";
 
-Native_Touch_screenY_Getter(mthis) native "Touch_screenY_Getter";
+  static $screenY_Getter(mthis) native "Touch_screenY_Getter";
 
-Native_Touch_target_Getter(mthis) native "Touch_target_Getter";
+  static $target_Getter(mthis) native "Touch_target_Getter";
 
-Native_Touch_webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
+  static $webkitForce_Getter(mthis) native "Touch_webkitForce_Getter";
 
-Native_Touch_webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
+  static $webkitRadiusX_Getter(mthis) native "Touch_webkitRadiusX_Getter";
 
-Native_Touch_webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
+  static $webkitRadiusY_Getter(mthis) native "Touch_webkitRadiusY_Getter";
 
-Native_Touch_webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+  static $webkitRotationAngle_Getter(mthis) native "Touch_webkitRotationAngle_Getter";
+}
 
-Native_TouchEvent_altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
+class BlinkTouchEvent {
+  static $altKey_Getter(mthis) native "TouchEvent_altKey_Getter";
 
-Native_TouchEvent_changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
+  static $changedTouches_Getter(mthis) native "TouchEvent_changedTouches_Getter";
 
-Native_TouchEvent_ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
+  static $ctrlKey_Getter(mthis) native "TouchEvent_ctrlKey_Getter";
 
-Native_TouchEvent_metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
+  static $metaKey_Getter(mthis) native "TouchEvent_metaKey_Getter";
 
-Native_TouchEvent_shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
+  static $shiftKey_Getter(mthis) native "TouchEvent_shiftKey_Getter";
 
-Native_TouchEvent_targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
+  static $targetTouches_Getter(mthis) native "TouchEvent_targetTouches_Getter";
 
-Native_TouchEvent_touches_Getter(mthis) native "TouchEvent_touches_Getter";
+  static $touches_Getter(mthis) native "TouchEvent_touches_Getter";
 
-Native_TouchEvent_initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_RESOLVER_STRING_13_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+  static $initTouchEvent_Callback(mthis, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "TouchEvent_initTouchEvent_Callback_RESOLVER_STRING_13_TouchList_TouchList_TouchList_DOMString_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+}
 
-Native_TouchList_length_Getter(mthis) native "TouchList_length_Getter";
+class BlinkTouchList {
+  static $length_Getter(mthis) native "TouchList_length_Getter";
 
-Native_TouchList_NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $NativeIndexed_Getter(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_TouchList_item_Callback(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "TouchList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_TrackEvent_track_Getter(mthis) native "TrackEvent_track_Getter";
+class BlinkTrackEvent {
+  static $track_Getter(mthis) native "TrackEvent_track_Getter";
+}
 
-Native_TransitionEvent_elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
+class BlinkTransitionEvent {
+  static $elapsedTime_Getter(mthis) native "TransitionEvent_elapsedTime_Getter";
 
-Native_TransitionEvent_propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
+  static $propertyName_Getter(mthis) native "TransitionEvent_propertyName_Getter";
 
-Native_TransitionEvent_pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+  static $pseudoElement_Getter(mthis) native "TransitionEvent_pseudoElement_Getter";
+}
 
-Native_TreeWalker_currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
+class BlinkTreeWalker {
+  static $currentNode_Getter(mthis) native "TreeWalker_currentNode_Getter";
 
-Native_TreeWalker_currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
+  static $currentNode_Setter(mthis, value) native "TreeWalker_currentNode_Setter";
 
-Native_TreeWalker_filter_Getter(mthis) native "TreeWalker_filter_Getter";
+  static $filter_Getter(mthis) native "TreeWalker_filter_Getter";
 
-Native_TreeWalker_root_Getter(mthis) native "TreeWalker_root_Getter";
+  static $root_Getter(mthis) native "TreeWalker_root_Getter";
 
-Native_TreeWalker_whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
+  static $whatToShow_Getter(mthis) native "TreeWalker_whatToShow_Getter";
 
-Native_TreeWalker_firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback_RESOLVER_STRING_0_";
+  static $firstChild_Callback(mthis) native "TreeWalker_firstChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback_RESOLVER_STRING_0_";
+  static $lastChild_Callback(mthis) native "TreeWalker_lastChild_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback_RESOLVER_STRING_0_";
+  static $nextNode_Callback(mthis) native "TreeWalker_nextNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback_RESOLVER_STRING_0_";
+  static $nextSibling_Callback(mthis) native "TreeWalker_nextSibling_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback_RESOLVER_STRING_0_";
+  static $parentNode_Callback(mthis) native "TreeWalker_parentNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback_RESOLVER_STRING_0_";
+  static $previousNode_Callback(mthis) native "TreeWalker_previousNode_Callback_RESOLVER_STRING_0_";
 
-Native_TreeWalker_previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback_RESOLVER_STRING_0_";
+  static $previousSibling_Callback(mthis) native "TreeWalker_previousSibling_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkURL {
   // Generated overload resolver
-Native_URL_createObjectUrl(blob_OR_source_OR_stream) {
+  static $createObjectUrl(blob_OR_source_OR_stream) {
     if ((blob_OR_source_OR_stream is Blob || blob_OR_source_OR_stream == null)) {
-      return Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream);
+      return $_createObjectURL_1_Callback(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaStream || blob_OR_source_OR_stream == null)) {
-      return Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream);
+      return $_createObjectURL_2_Callback(blob_OR_source_OR_stream);
     }
     if ((blob_OR_source_OR_stream is MediaSource || blob_OR_source_OR_stream == null)) {
-      return Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream);
+      return $_createObjectURL_3_Callback(blob_OR_source_OR_stream);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_URL__createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
+  static $_createObjectURL_1_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL__createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+  static $_createObjectURL_2_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL__createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $_createObjectURL_3_Callback(blob_OR_source_OR_stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
+  static $createObjectUrlFromBlob_Callback(blob) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_Blob";
 
-Native_URL_createObjectUrlFromSource_Callback(source) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
+  static $createObjectUrlFromSource_Callback(source) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaSource";
 
-Native_URL_createObjectUrlFromStream_Callback(stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
+  static $createObjectUrlFromStream_Callback(stream) native "URL_createObjectURL_Callback_RESOLVER_STRING_1_MediaStream";
 
-Native_URL_revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback_RESOLVER_STRING_1_DOMString";
+  static $revokeObjectURL_Callback(url) native "URL_revokeObjectURL_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_URL_hash_Getter(mthis) native "URL_hash_Getter";
+  static $hash_Getter(mthis) native "URL_hash_Getter";
 
-Native_URL_hash_Setter(mthis, value) native "URL_hash_Setter";
+  static $hash_Setter(mthis, value) native "URL_hash_Setter";
 
-Native_URL_host_Getter(mthis) native "URL_host_Getter";
+  static $host_Getter(mthis) native "URL_host_Getter";
 
-Native_URL_host_Setter(mthis, value) native "URL_host_Setter";
+  static $host_Setter(mthis, value) native "URL_host_Setter";
 
-Native_URL_hostname_Getter(mthis) native "URL_hostname_Getter";
+  static $hostname_Getter(mthis) native "URL_hostname_Getter";
 
-Native_URL_hostname_Setter(mthis, value) native "URL_hostname_Setter";
+  static $hostname_Setter(mthis, value) native "URL_hostname_Setter";
 
-Native_URL_href_Getter(mthis) native "URL_href_Getter";
+  static $href_Getter(mthis) native "URL_href_Getter";
 
-Native_URL_href_Setter(mthis, value) native "URL_href_Setter";
+  static $href_Setter(mthis, value) native "URL_href_Setter";
 
-Native_URL_origin_Getter(mthis) native "URL_origin_Getter";
+  static $origin_Getter(mthis) native "URL_origin_Getter";
 
-Native_URL_password_Getter(mthis) native "URL_password_Getter";
+  static $password_Getter(mthis) native "URL_password_Getter";
 
-Native_URL_password_Setter(mthis, value) native "URL_password_Setter";
+  static $password_Setter(mthis, value) native "URL_password_Setter";
 
-Native_URL_pathname_Getter(mthis) native "URL_pathname_Getter";
+  static $pathname_Getter(mthis) native "URL_pathname_Getter";
 
-Native_URL_pathname_Setter(mthis, value) native "URL_pathname_Setter";
+  static $pathname_Setter(mthis, value) native "URL_pathname_Setter";
 
-Native_URL_port_Getter(mthis) native "URL_port_Getter";
+  static $port_Getter(mthis) native "URL_port_Getter";
 
-Native_URL_port_Setter(mthis, value) native "URL_port_Setter";
+  static $port_Setter(mthis, value) native "URL_port_Setter";
 
-Native_URL_protocol_Getter(mthis) native "URL_protocol_Getter";
+  static $protocol_Getter(mthis) native "URL_protocol_Getter";
 
-Native_URL_protocol_Setter(mthis, value) native "URL_protocol_Setter";
+  static $protocol_Setter(mthis, value) native "URL_protocol_Setter";
 
-Native_URL_search_Getter(mthis) native "URL_search_Getter";
+  static $search_Getter(mthis) native "URL_search_Getter";
 
-Native_URL_search_Setter(mthis, value) native "URL_search_Setter";
+  static $search_Setter(mthis, value) native "URL_search_Setter";
 
-Native_URL_username_Getter(mthis) native "URL_username_Getter";
+  static $username_Getter(mthis) native "URL_username_Getter";
 
-Native_URL_username_Setter(mthis, value) native "URL_username_Setter";
+  static $username_Setter(mthis, value) native "URL_username_Setter";
 
-Native_URL_toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "URL_toString_Callback_RESOLVER_STRING_0_";
+}
 
-Native_URLUtilsReadOnly_hash_Getter(mthis) native "WorkerLocation_hash_Getter";
+class BlinkURLUtilsReadOnly {
+  static $hash_Getter(mthis) native "WorkerLocation_hash_Getter";
 
-Native_URLUtilsReadOnly_host_Getter(mthis) native "WorkerLocation_host_Getter";
+  static $host_Getter(mthis) native "WorkerLocation_host_Getter";
 
-Native_URLUtilsReadOnly_hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
+  static $hostname_Getter(mthis) native "WorkerLocation_hostname_Getter";
 
-Native_URLUtilsReadOnly_href_Getter(mthis) native "WorkerLocation_href_Getter";
+  static $href_Getter(mthis) native "WorkerLocation_href_Getter";
 
-Native_URLUtilsReadOnly_pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
+  static $pathname_Getter(mthis) native "WorkerLocation_pathname_Getter";
 
-Native_URLUtilsReadOnly_port_Getter(mthis) native "WorkerLocation_port_Getter";
+  static $port_Getter(mthis) native "WorkerLocation_port_Getter";
 
-Native_URLUtilsReadOnly_protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
+  static $protocol_Getter(mthis) native "WorkerLocation_protocol_Getter";
 
-Native_URLUtilsReadOnly_search_Getter(mthis) native "WorkerLocation_search_Getter";
+  static $search_Getter(mthis) native "WorkerLocation_search_Getter";
 
-Native_URLUtilsReadOnly_toString_Callback(mthis) native "WorkerLocation_toString_Callback_RESOLVER_STRING_0_";
+  static $toString_Callback(mthis) native "WorkerLocation_toString_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkVTTCue {
   // Generated overload resolver
-Native_VTTCue_VttCue(startTime, endTime, text) {
-    return Native_VTTCue__create_1constructorCallback(startTime, endTime, text);
+  static $mkVttCue(startTime, endTime, text) {
+    return $_create_1constructorCallback(startTime, endTime, text);
   }
 
-Native_VTTCue__create_1constructorCallback(startTime, endTime, text) native "VTTCue_constructorCallback_RESOLVER_STRING_3_double_double_DOMString";
+  static $_create_1constructorCallback(startTime, endTime, text) native "VTTCue_constructorCallback_RESOLVER_STRING_3_double_double_DOMString";
 
-Native_VTTCue_align_Getter(mthis) native "VTTCue_align_Getter";
+  static $align_Getter(mthis) native "VTTCue_align_Getter";
 
-Native_VTTCue_align_Setter(mthis, value) native "VTTCue_align_Setter";
+  static $align_Setter(mthis, value) native "VTTCue_align_Setter";
 
-Native_VTTCue_line_Getter(mthis) native "VTTCue_line_Getter";
+  static $line_Getter(mthis) native "VTTCue_line_Getter";
 
-Native_VTTCue_line_Setter(mthis, value) native "VTTCue_line_Setter";
+  static $line_Setter(mthis, value) native "VTTCue_line_Setter";
 
-Native_VTTCue_position_Getter(mthis) native "VTTCue_position_Getter";
+  static $position_Getter(mthis) native "VTTCue_position_Getter";
 
-Native_VTTCue_position_Setter(mthis, value) native "VTTCue_position_Setter";
+  static $position_Setter(mthis, value) native "VTTCue_position_Setter";
 
-Native_VTTCue_regionId_Getter(mthis) native "VTTCue_regionId_Getter";
+  static $regionId_Getter(mthis) native "VTTCue_regionId_Getter";
 
-Native_VTTCue_regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
+  static $regionId_Setter(mthis, value) native "VTTCue_regionId_Setter";
 
-Native_VTTCue_size_Getter(mthis) native "VTTCue_size_Getter";
+  static $size_Getter(mthis) native "VTTCue_size_Getter";
 
-Native_VTTCue_size_Setter(mthis, value) native "VTTCue_size_Setter";
+  static $size_Setter(mthis, value) native "VTTCue_size_Setter";
 
-Native_VTTCue_snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
+  static $snapToLines_Getter(mthis) native "VTTCue_snapToLines_Getter";
 
-Native_VTTCue_snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
+  static $snapToLines_Setter(mthis, value) native "VTTCue_snapToLines_Setter";
 
-Native_VTTCue_text_Getter(mthis) native "VTTCue_text_Getter";
+  static $text_Getter(mthis) native "VTTCue_text_Getter";
 
-Native_VTTCue_text_Setter(mthis, value) native "VTTCue_text_Setter";
+  static $text_Setter(mthis, value) native "VTTCue_text_Setter";
 
-Native_VTTCue_vertical_Getter(mthis) native "VTTCue_vertical_Getter";
+  static $vertical_Getter(mthis) native "VTTCue_vertical_Getter";
 
-Native_VTTCue_vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
+  static $vertical_Setter(mthis, value) native "VTTCue_vertical_Setter";
 
-Native_VTTCue_getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback_RESOLVER_STRING_0_";
+  static $getCueAsHTML_Callback(mthis) native "VTTCue_getCueAsHTML_Callback_RESOLVER_STRING_0_";
+}
 
+class BlinkVTTRegion {
   // Generated overload resolver
-Native_VTTRegion_VttRegion() {
-    return Native_VTTRegion__create_1constructorCallback();
+  static $mkVttRegion() {
+    return $_create_1constructorCallback();
   }
 
-Native_VTTRegion__create_1constructorCallback() native "VTTRegion_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "VTTRegion_constructorCallback_RESOLVER_STRING_0_";
 
-Native_VTTRegion_height_Getter(mthis) native "VTTRegion_height_Getter";
+  static $height_Getter(mthis) native "VTTRegion_height_Getter";
 
-Native_VTTRegion_height_Setter(mthis, value) native "VTTRegion_height_Setter";
+  static $height_Setter(mthis, value) native "VTTRegion_height_Setter";
 
-Native_VTTRegion_id_Getter(mthis) native "VTTRegion_id_Getter";
+  static $id_Getter(mthis) native "VTTRegion_id_Getter";
 
-Native_VTTRegion_id_Setter(mthis, value) native "VTTRegion_id_Setter";
+  static $id_Setter(mthis, value) native "VTTRegion_id_Setter";
 
-Native_VTTRegion_regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
+  static $regionAnchorX_Getter(mthis) native "VTTRegion_regionAnchorX_Getter";
 
-Native_VTTRegion_regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
+  static $regionAnchorX_Setter(mthis, value) native "VTTRegion_regionAnchorX_Setter";
 
-Native_VTTRegion_regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
+  static $regionAnchorY_Getter(mthis) native "VTTRegion_regionAnchorY_Getter";
 
-Native_VTTRegion_regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
+  static $regionAnchorY_Setter(mthis, value) native "VTTRegion_regionAnchorY_Setter";
 
-Native_VTTRegion_scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
+  static $scroll_Getter(mthis) native "VTTRegion_scroll_Getter";
 
-Native_VTTRegion_scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
+  static $scroll_Setter(mthis, value) native "VTTRegion_scroll_Setter";
 
-Native_VTTRegion_track_Getter(mthis) native "VTTRegion_track_Getter";
+  static $track_Getter(mthis) native "VTTRegion_track_Getter";
 
-Native_VTTRegion_viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
+  static $viewportAnchorX_Getter(mthis) native "VTTRegion_viewportAnchorX_Getter";
 
-Native_VTTRegion_viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
+  static $viewportAnchorX_Setter(mthis, value) native "VTTRegion_viewportAnchorX_Setter";
 
-Native_VTTRegion_viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
+  static $viewportAnchorY_Getter(mthis) native "VTTRegion_viewportAnchorY_Getter";
 
-Native_VTTRegion_viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
+  static $viewportAnchorY_Setter(mthis, value) native "VTTRegion_viewportAnchorY_Setter";
 
-Native_VTTRegion_width_Getter(mthis) native "VTTRegion_width_Getter";
+  static $width_Getter(mthis) native "VTTRegion_width_Getter";
 
-Native_VTTRegion_width_Setter(mthis, value) native "VTTRegion_width_Setter";
+  static $width_Setter(mthis, value) native "VTTRegion_width_Setter";
+}
 
-Native_VTTRegionList_length_Getter(mthis) native "VTTRegionList_length_Getter";
+class BlinkVTTRegionList {
+  static $length_Getter(mthis) native "VTTRegionList_length_Getter";
 
-Native_VTTRegionList_getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback_RESOLVER_STRING_1_DOMString";
+  static $getRegionById_Callback(mthis, id) native "VTTRegionList_getRegionById_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_VTTRegionList_item_Callback(mthis, index) native "VTTRegionList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $item_Callback(mthis, index) native "VTTRegionList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
-Native_ValidityState_badInput_Getter(mthis) native "ValidityState_badInput_Getter";
+class BlinkValidityState {
+  static $badInput_Getter(mthis) native "ValidityState_badInput_Getter";
 
-Native_ValidityState_customError_Getter(mthis) native "ValidityState_customError_Getter";
+  static $customError_Getter(mthis) native "ValidityState_customError_Getter";
 
-Native_ValidityState_patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
+  static $patternMismatch_Getter(mthis) native "ValidityState_patternMismatch_Getter";
 
-Native_ValidityState_rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
+  static $rangeOverflow_Getter(mthis) native "ValidityState_rangeOverflow_Getter";
 
-Native_ValidityState_rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
+  static $rangeUnderflow_Getter(mthis) native "ValidityState_rangeUnderflow_Getter";
 
-Native_ValidityState_stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
+  static $stepMismatch_Getter(mthis) native "ValidityState_stepMismatch_Getter";
 
-Native_ValidityState_tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
+  static $tooLong_Getter(mthis) native "ValidityState_tooLong_Getter";
 
-Native_ValidityState_typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
+  static $typeMismatch_Getter(mthis) native "ValidityState_typeMismatch_Getter";
 
-Native_ValidityState_valid_Getter(mthis) native "ValidityState_valid_Getter";
+  static $valid_Getter(mthis) native "ValidityState_valid_Getter";
 
-Native_ValidityState_valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+  static $valueMissing_Getter(mthis) native "ValidityState_valueMissing_Getter";
+}
 
-Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
+class BlinkVideoPlaybackQuality {
+  static $corruptedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_corruptedVideoFrames_Getter";
 
-Native_VideoPlaybackQuality_creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
+  static $creationTime_Getter(mthis) native "VideoPlaybackQuality_creationTime_Getter";
 
-Native_VideoPlaybackQuality_droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+  static $droppedVideoFrames_Getter(mthis) native "VideoPlaybackQuality_droppedVideoFrames_Getter";
+
+  static $totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+}
+
+class BlinkWaveShaperNode {
+  static $curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+
+  static $curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+
+  static $oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+
+  static $oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+}
+
+class BlinkWebGLActiveInfo {
+  static $name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+
+  static $size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+
+  static $type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+}
+
+class BlinkWebGLBuffer {}
 
-Native_VideoPlaybackQuality_totalVideoFrames_Getter(mthis) native "VideoPlaybackQuality_totalVideoFrames_Getter";
+class BlinkWebGLCompressedTextureATC {}
 
-Native_WaveShaperNode_curve_Getter(mthis) native "WaveShaperNode_curve_Getter";
+class BlinkWebGLCompressedTexturePVRTC {}
 
-Native_WaveShaperNode_curve_Setter(mthis, value) native "WaveShaperNode_curve_Setter";
+class BlinkWebGLCompressedTextureS3TC {}
 
-Native_WaveShaperNode_oversample_Getter(mthis) native "WaveShaperNode_oversample_Getter";
+class BlinkWebGLContextAttributes {
+  static $alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
 
-Native_WaveShaperNode_oversample_Setter(mthis, value) native "WaveShaperNode_oversample_Setter";
+  static $alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
 
-Native_WebGLActiveInfo_name_Getter(mthis) native "WebGLActiveInfo_name_Getter";
+  static $antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
 
-Native_WebGLActiveInfo_size_Getter(mthis) native "WebGLActiveInfo_size_Getter";
+  static $antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
 
-Native_WebGLActiveInfo_type_Getter(mthis) native "WebGLActiveInfo_type_Getter";
+  static $depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
 
-Native_WebGLContextAttributes_alpha_Getter(mthis) native "WebGLContextAttributes_alpha_Getter";
+  static $depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
 
-Native_WebGLContextAttributes_alpha_Setter(mthis, value) native "WebGLContextAttributes_alpha_Setter";
+  static $failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
 
-Native_WebGLContextAttributes_antialias_Getter(mthis) native "WebGLContextAttributes_antialias_Getter";
+  static $failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
 
-Native_WebGLContextAttributes_antialias_Setter(mthis, value) native "WebGLContextAttributes_antialias_Setter";
+  static $premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
 
-Native_WebGLContextAttributes_depth_Getter(mthis) native "WebGLContextAttributes_depth_Getter";
+  static $premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
 
-Native_WebGLContextAttributes_depth_Setter(mthis, value) native "WebGLContextAttributes_depth_Setter";
+  static $preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
 
-Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(mthis) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter";
+  static $preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
 
-Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(mthis, value) native "WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter";
+  static $stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
 
-Native_WebGLContextAttributes_premultipliedAlpha_Getter(mthis) native "WebGLContextAttributes_premultipliedAlpha_Getter";
+  static $stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+}
 
-Native_WebGLContextAttributes_premultipliedAlpha_Setter(mthis, value) native "WebGLContextAttributes_premultipliedAlpha_Setter";
+class BlinkWebGLContextEvent {
+  static $statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+}
 
-Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(mthis) native "WebGLContextAttributes_preserveDrawingBuffer_Getter";
+class BlinkWebGLDebugRendererInfo {}
 
-Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(mthis, value) native "WebGLContextAttributes_preserveDrawingBuffer_Setter";
+class BlinkWebGLDebugShaders {
+  static $getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+}
 
-Native_WebGLContextAttributes_stencil_Getter(mthis) native "WebGLContextAttributes_stencil_Getter";
+class BlinkWebGLDepthTexture {}
 
-Native_WebGLContextAttributes_stencil_Setter(mthis, value) native "WebGLContextAttributes_stencil_Setter";
+class BlinkWebGLDrawBuffers {
+  static $drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_RESOLVER_STRING_1_sequence<unsigned long>";
+}
 
-Native_WebGLContextEvent_statusMessage_Getter(mthis) native "WebGLContextEvent_statusMessage_Getter";
+class BlinkWebGLFramebuffer {}
 
-Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(mthis, shader) native "WebGLDebugShaders_getTranslatedShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+class BlinkWebGLLoseContext {
+  static $loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(mthis, buffers) native "WebGLDrawBuffers_drawBuffersWEBGL_Callback_RESOLVER_STRING_1_sequence<unsigned long>";
+  static $restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback_RESOLVER_STRING_0_";
+}
 
-Native_WebGLLoseContext_loseContext_Callback(mthis) native "WebGLLoseContext_loseContext_Callback_RESOLVER_STRING_0_";
+class BlinkWebGLProgram {}
 
-Native_WebGLLoseContext_restoreContext_Callback(mthis) native "WebGLLoseContext_restoreContext_Callback_RESOLVER_STRING_0_";
+class BlinkWebGLRenderbuffer {}
 
-Native_WebGLRenderingContext_drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
+class BlinkWebGLRenderingContext {
+  static $drawingBufferHeight_Getter(mthis) native "WebGLRenderingContext_drawingBufferHeight_Getter";
 
-Native_WebGLRenderingContext_drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
+  static $drawingBufferWidth_Getter(mthis) native "WebGLRenderingContext_drawingBufferWidth_Getter";
 
-Native_WebGLRenderingContext_activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback_RESOLVER_STRING_1_unsigned long";
+  static $activeTexture_Callback(mthis, texture) native "WebGLRenderingContext_activeTexture_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
+  static $attachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_attachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback_RESOLVER_STRING_3_WebGLProgram_unsigned long_DOMString";
+  static $bindAttribLocation_Callback(mthis, program, index, name) native "WebGLRenderingContext_bindAttribLocation_Callback_RESOLVER_STRING_3_WebGLProgram_unsigned long_DOMString";
 
-Native_WebGLRenderingContext_bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLBuffer";
+  static $bindBuffer_Callback(mthis, target, buffer) native "WebGLRenderingContext_bindBuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLBuffer";
 
-Native_WebGLRenderingContext_bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLFramebuffer";
+  static $bindFramebuffer_Callback(mthis, target, framebuffer) native "WebGLRenderingContext_bindFramebuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLRenderbuffer";
+  static $bindRenderbuffer_Callback(mthis, target, renderbuffer) native "WebGLRenderingContext_bindRenderbuffer_Callback_RESOLVER_STRING_2_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback_RESOLVER_STRING_2_unsigned long_WebGLTexture";
+  static $bindTexture_Callback(mthis, target, texture) native "WebGLRenderingContext_bindTexture_Callback_RESOLVER_STRING_2_unsigned long_WebGLTexture";
 
-Native_WebGLRenderingContext_blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $blendColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_blendColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback_RESOLVER_STRING_1_unsigned long";
+  static $blendEquation_Callback(mthis, mode) native "WebGLRenderingContext_blendEquation_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $blendEquationSeparate_Callback(mthis, modeRGB, modeAlpha) native "WebGLRenderingContext_blendEquationSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $blendFunc_Callback(mthis, sfactor, dfactor) native "WebGLRenderingContext_blendFunc_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
+  static $blendFuncSeparate_Callback(mthis, srcRGB, dstRGB, srcAlpha, dstAlpha) native "WebGLRenderingContext_blendFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
+  static $bufferByteData_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_bufferData(mthis, target, data_OR_size, usage) {
+  static $bufferData(mthis, target, data_OR_size, usage) {
     if ((usage is int || usage == null) && (data_OR_size is TypedData || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_1_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     if ((usage is int || usage == null) && (data_OR_size is ByteBuffer || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_2_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     if ((usage is int || usage == null) && (data_OR_size is int || data_OR_size == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage);
+      $_bufferData_3_Callback(mthis, target, data_OR_size, usage);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
+  static $_bufferData_1_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
+  static $_bufferData_2_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBuffer_unsigned long";
 
-Native_WebGLRenderingContext__bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_long long_unsigned long";
+  static $_bufferData_3_Callback(mthis, target, data_OR_size, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_long long_unsigned long";
 
-Native_WebGLRenderingContext_bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
+  static $bufferDataTyped_Callback(mthis, target, data, usage) native "WebGLRenderingContext_bufferData_Callback_RESOLVER_STRING_3_unsigned long_ArrayBufferView_unsigned long";
 
-Native_WebGLRenderingContext_bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
+  static $bufferSubByteData_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_bufferSubData(mthis, target, offset, data) {
+  static $bufferSubData(mthis, target, offset, data) {
     if ((data is TypedData || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data);
+      $_bufferSubData_1_Callback(mthis, target, offset, data);
       return;
     }
     if ((data is ByteBuffer || data == null) && (offset is int || offset == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data);
+      $_bufferSubData_2_Callback(mthis, target, offset, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
+  static $_bufferSubData_1_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext__bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
+  static $_bufferSubData_2_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBuffer";
 
-Native_WebGLRenderingContext_bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
+  static $bufferSubDataTyped_Callback(mthis, target, offset, data) native "WebGLRenderingContext_bufferSubData_Callback_RESOLVER_STRING_3_unsigned long_long long_ArrayBufferView";
 
-Native_WebGLRenderingContext_checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback_RESOLVER_STRING_1_unsigned long";
+  static $checkFramebufferStatus_Callback(mthis, target) native "WebGLRenderingContext_checkFramebufferStatus_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback_RESOLVER_STRING_1_unsigned long";
+  static $clear_Callback(mthis, mask) native "WebGLRenderingContext_clear_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback_RESOLVER_STRING_4_float_float_float_float";
+  static $clearColor_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_clearColor_Callback_RESOLVER_STRING_4_float_float_float_float";
 
-Native_WebGLRenderingContext_clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback_RESOLVER_STRING_1_float";
+  static $clearDepth_Callback(mthis, depth) native "WebGLRenderingContext_clearDepth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback_RESOLVER_STRING_1_long";
+  static $clearStencil_Callback(mthis, s) native "WebGLRenderingContext_clearStencil_Callback_RESOLVER_STRING_1_long";
 
-Native_WebGLRenderingContext_colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback_RESOLVER_STRING_4_boolean_boolean_boolean_boolean";
+  static $colorMask_Callback(mthis, red, green, blue, alpha) native "WebGLRenderingContext_colorMask_Callback_RESOLVER_STRING_4_boolean_boolean_boolean_boolean";
 
-Native_WebGLRenderingContext_compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $compileShader_Callback(mthis, shader) native "WebGLRenderingContext_compileShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
+  static $compressedTexImage2D_Callback(mthis, target, level, internalformat, width, height, border, data) native "WebGLRenderingContext_compressedTexImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_unsigned long_long_long_long_ArrayBufferView";
 
-Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
+  static $compressedTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, width, height, format, data) native "WebGLRenderingContext_compressedTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_unsigned long_long_long_long_long_long";
+  static $copyTexImage2D_Callback(mthis, target, level, internalformat, x, y, width, height, border) native "WebGLRenderingContext_copyTexImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_unsigned long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_long_long";
+  static $copyTexSubImage2D_Callback(mthis, target, level, xoffset, yoffset, x, y, width, height) native "WebGLRenderingContext_copyTexSubImage2D_Callback_RESOLVER_STRING_8_unsigned long_long_long_long_long_long_long_long";
 
-Native_WebGLRenderingContext_createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback_RESOLVER_STRING_0_";
+  static $createBuffer_Callback(mthis) native "WebGLRenderingContext_createBuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback_RESOLVER_STRING_0_";
+  static $createFramebuffer_Callback(mthis) native "WebGLRenderingContext_createFramebuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback_RESOLVER_STRING_0_";
+  static $createProgram_Callback(mthis) native "WebGLRenderingContext_createProgram_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback_RESOLVER_STRING_0_";
+  static $createRenderbuffer_Callback(mthis) native "WebGLRenderingContext_createRenderbuffer_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback_RESOLVER_STRING_1_unsigned long";
+  static $createShader_Callback(mthis, type) native "WebGLRenderingContext_createShader_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback_RESOLVER_STRING_0_";
+  static $createTexture_Callback(mthis) native "WebGLRenderingContext_createTexture_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback_RESOLVER_STRING_1_unsigned long";
+  static $cullFace_Callback(mthis, mode) native "WebGLRenderingContext_cullFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
+  static $deleteBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_deleteBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
+  static $deleteFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_deleteFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $deleteProgram_Callback(mthis, program) native "WebGLRenderingContext_deleteProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
+  static $deleteRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_deleteRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $deleteShader_Callback(mthis, shader) native "WebGLRenderingContext_deleteShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
+  static $deleteTexture_Callback(mthis, texture) native "WebGLRenderingContext_deleteTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback_RESOLVER_STRING_1_unsigned long";
+  static $depthFunc_Callback(mthis, func) native "WebGLRenderingContext_depthFunc_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback_RESOLVER_STRING_1_boolean";
+  static $depthMask_Callback(mthis, flag) native "WebGLRenderingContext_depthMask_Callback_RESOLVER_STRING_1_boolean";
 
-Native_WebGLRenderingContext_depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback_RESOLVER_STRING_2_float_float";
+  static $depthRange_Callback(mthis, zNear, zFar) native "WebGLRenderingContext_depthRange_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
+  static $detachShader_Callback(mthis, program, shader) native "WebGLRenderingContext_detachShader_Callback_RESOLVER_STRING_2_WebGLProgram_WebGLShader";
 
-Native_WebGLRenderingContext_disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disable_Callback(mthis, cap) native "WebGLRenderingContext_disable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
+  static $disableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_disableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback_RESOLVER_STRING_3_unsigned long_long_long";
+  static $drawArrays_Callback(mthis, mode, first, count) native "WebGLRenderingContext_drawArrays_Callback_RESOLVER_STRING_3_unsigned long_long_long";
 
-Native_WebGLRenderingContext_drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback_RESOLVER_STRING_4_unsigned long_long_unsigned long_long long";
+  static $drawElements_Callback(mthis, mode, count, type, offset) native "WebGLRenderingContext_drawElements_Callback_RESOLVER_STRING_4_unsigned long_long_unsigned long_long long";
 
-Native_WebGLRenderingContext_enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback_RESOLVER_STRING_1_unsigned long";
+  static $enable_Callback(mthis, cap) native "WebGLRenderingContext_enable_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
+  static $enableVertexAttribArray_Callback(mthis, index) native "WebGLRenderingContext_enableVertexAttribArray_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback_RESOLVER_STRING_0_";
+  static $finish_Callback(mthis) native "WebGLRenderingContext_finish_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback_RESOLVER_STRING_0_";
+  static $flush_Callback(mthis) native "WebGLRenderingContext_flush_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
+  static $framebufferRenderbuffer_Callback(mthis, target, attachment, renderbuffertarget, renderbuffer) native "WebGLRenderingContext_framebufferRenderbuffer_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback_RESOLVER_STRING_5_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
+  static $framebufferTexture2D_Callback(mthis, target, attachment, textarget, texture, level) native "WebGLRenderingContext_framebufferTexture2D_Callback_RESOLVER_STRING_5_unsigned long_unsigned long_unsigned long_WebGLTexture_long";
 
-Native_WebGLRenderingContext_frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback_RESOLVER_STRING_1_unsigned long";
+  static $frontFace_Callback(mthis, mode) native "WebGLRenderingContext_frontFace_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback_RESOLVER_STRING_1_unsigned long";
+  static $generateMipmap_Callback(mthis, target) native "WebGLRenderingContext_generateMipmap_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
+  static $getActiveAttrib_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveAttrib_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
-Native_WebGLRenderingContext_getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
+  static $getActiveUniform_Callback(mthis, program, index) native "WebGLRenderingContext_getActiveUniform_Callback_RESOLVER_STRING_2_WebGLProgram_unsigned long";
 
-Native_WebGLRenderingContext_getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
+  static $getAttachedShaders_Callback(mthis, program) native "WebGLRenderingContext_getAttachedShaders_Callback";
 
-Native_WebGLRenderingContext_getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
+  static $getAttribLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getAttribLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
-Native_WebGLRenderingContext_getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
+  static $getBufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getBufferParameter_Callback";
 
-Native_WebGLRenderingContext_getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback_RESOLVER_STRING_0_";
+  static $getContextAttributes_Callback(mthis) native "WebGLRenderingContext_getContextAttributes_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback_RESOLVER_STRING_0_";
+  static $getError_Callback(mthis) native "WebGLRenderingContext_getError_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
+  static $getExtension_Callback(mthis, name) native "WebGLRenderingContext_getExtension_Callback";
 
-Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
+  static $getFramebufferAttachmentParameter_Callback(mthis, target, attachment, pname) native "WebGLRenderingContext_getFramebufferAttachmentParameter_Callback";
 
-Native_WebGLRenderingContext_getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
+  static $getParameter_Callback(mthis, pname) native "WebGLRenderingContext_getParameter_Callback";
 
-Native_WebGLRenderingContext_getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $getProgramInfoLog_Callback(mthis, program) native "WebGLRenderingContext_getProgramInfoLog_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
+  static $getProgramParameter_Callback(mthis, program, pname) native "WebGLRenderingContext_getProgramParameter_Callback";
 
-Native_WebGLRenderingContext_getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
+  static $getRenderbufferParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getRenderbufferParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $getShaderInfoLog_Callback(mthis, shader) native "WebGLRenderingContext_getShaderInfoLog_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
+  static $getShaderParameter_Callback(mthis, shader, pname) native "WebGLRenderingContext_getShaderParameter_Callback";
 
-Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getShaderPrecisionFormat_Callback(mthis, shadertype, precisiontype) native "WebGLRenderingContext_getShaderPrecisionFormat_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $getShaderSource_Callback(mthis, shader) native "WebGLRenderingContext_getShaderSource_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
+  static $getSupportedExtensions_Callback(mthis) native "WebGLRenderingContext_getSupportedExtensions_Callback";
 
-Native_WebGLRenderingContext_getTexParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
+  static $getTexParameter_Callback(mthis, target, pname) native "WebGLRenderingContext_getTexParameter_Callback";
 
-Native_WebGLRenderingContext_getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
+  static $getUniform_Callback(mthis, program, location) native "WebGLRenderingContext_getUniform_Callback";
 
-Native_WebGLRenderingContext_getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
+  static $getUniformLocation_Callback(mthis, program, name) native "WebGLRenderingContext_getUniformLocation_Callback_RESOLVER_STRING_2_WebGLProgram_DOMString";
 
-Native_WebGLRenderingContext_getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
+  static $getVertexAttrib_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttrib_Callback";
 
-Native_WebGLRenderingContext_getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $getVertexAttribOffset_Callback(mthis, index, pname) native "WebGLRenderingContext_getVertexAttribOffset_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $hint_Callback(mthis, target, mode) native "WebGLRenderingContext_hint_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
+  static $isBuffer_Callback(mthis, buffer) native "WebGLRenderingContext_isBuffer_Callback_RESOLVER_STRING_1_WebGLBuffer";
 
-Native_WebGLRenderingContext_isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback_RESOLVER_STRING_0_";
+  static $isContextLost_Callback(mthis) native "WebGLRenderingContext_isContextLost_Callback_RESOLVER_STRING_0_";
 
-Native_WebGLRenderingContext_isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback_RESOLVER_STRING_1_unsigned long";
+  static $isEnabled_Callback(mthis, cap) native "WebGLRenderingContext_isEnabled_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
+  static $isFramebuffer_Callback(mthis, framebuffer) native "WebGLRenderingContext_isFramebuffer_Callback_RESOLVER_STRING_1_WebGLFramebuffer";
 
-Native_WebGLRenderingContext_isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $isProgram_Callback(mthis, program) native "WebGLRenderingContext_isProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
+  static $isRenderbuffer_Callback(mthis, renderbuffer) native "WebGLRenderingContext_isRenderbuffer_Callback_RESOLVER_STRING_1_WebGLRenderbuffer";
 
-Native_WebGLRenderingContext_isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback_RESOLVER_STRING_1_WebGLShader";
+  static $isShader_Callback(mthis, shader) native "WebGLRenderingContext_isShader_Callback_RESOLVER_STRING_1_WebGLShader";
 
-Native_WebGLRenderingContext_isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
+  static $isTexture_Callback(mthis, texture) native "WebGLRenderingContext_isTexture_Callback_RESOLVER_STRING_1_WebGLTexture";
 
-Native_WebGLRenderingContext_lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback_RESOLVER_STRING_1_float";
+  static $lineWidth_Callback(mthis, width) native "WebGLRenderingContext_lineWidth_Callback_RESOLVER_STRING_1_float";
 
-Native_WebGLRenderingContext_linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $linkProgram_Callback(mthis, program) native "WebGLRenderingContext_linkProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback_RESOLVER_STRING_2_unsigned long_long";
+  static $pixelStorei_Callback(mthis, pname, param) native "WebGLRenderingContext_pixelStorei_Callback_RESOLVER_STRING_2_unsigned long_long";
 
-Native_WebGLRenderingContext_polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback_RESOLVER_STRING_2_float_float";
+  static $polygonOffset_Callback(mthis, factor, units) native "WebGLRenderingContext_polygonOffset_Callback_RESOLVER_STRING_2_float_float";
 
-Native_WebGLRenderingContext_readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback_RESOLVER_STRING_7_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $readPixels_Callback(mthis, x, y, width, height, format, type, pixels) native "WebGLRenderingContext_readPixels_Callback_RESOLVER_STRING_7_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext_renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_long";
+  static $renderbufferStorage_Callback(mthis, target, internalformat, width, height) native "WebGLRenderingContext_renderbufferStorage_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_long";
 
-Native_WebGLRenderingContext_sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback_RESOLVER_STRING_2_float_boolean";
+  static $sampleCoverage_Callback(mthis, value, invert) native "WebGLRenderingContext_sampleCoverage_Callback_RESOLVER_STRING_2_float_boolean";
 
-Native_WebGLRenderingContext_scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback_RESOLVER_STRING_4_long_long_long_long";
+  static $scissor_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_scissor_Callback_RESOLVER_STRING_4_long_long_long_long";
 
-Native_WebGLRenderingContext_shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback_RESOLVER_STRING_2_WebGLShader_DOMString";
+  static $shaderSource_Callback(mthis, shader, string) native "WebGLRenderingContext_shaderSource_Callback_RESOLVER_STRING_2_WebGLShader_DOMString";
 
-Native_WebGLRenderingContext_stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback_RESOLVER_STRING_3_unsigned long_long_unsigned long";
+  static $stencilFunc_Callback(mthis, func, ref, mask) native "WebGLRenderingContext_stencilFunc_Callback_RESOLVER_STRING_3_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_unsigned long";
+  static $stencilFuncSeparate_Callback(mthis, face, func, ref, mask) native "WebGLRenderingContext_stencilFuncSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_long_unsigned long";
 
-Native_WebGLRenderingContext_stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback_RESOLVER_STRING_1_unsigned long";
+  static $stencilMask_Callback(mthis, mask) native "WebGLRenderingContext_stencilMask_Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_WebGLRenderingContext_stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
+  static $stencilMaskSeparate_Callback(mthis, face, mask) native "WebGLRenderingContext_stencilMaskSeparate_Callback_RESOLVER_STRING_2_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
+  static $stencilOp_Callback(mthis, fail, zfail, zpass) native "WebGLRenderingContext_stencilOp_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_unsigned long";
 
-Native_WebGLRenderingContext_stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
+  static $stencilOpSeparate_Callback(mthis, face, fail, zfail, zpass) native "WebGLRenderingContext_stencilOpSeparate_Callback_RESOLVER_STRING_4_unsigned long_unsigned long_unsigned long_unsigned long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
+  static $texImage2D(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (format is int || format == null) && (border_OR_canvas_OR_image_OR_pixels_OR_video is int || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+      $_texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageData || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is ImageElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is CanvasElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((border_OR_canvas_OR_image_OR_pixels_OR_video is VideoElement || border_OR_canvas_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (internalformat is int || internalformat == null) && (level is int || level == null) && (target is int || target == null) && format == null && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
+      $_texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $_texImage2D_1_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_unsigned long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
+  static $_texImage2D_2_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
+  static $_texImage2D_3_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $_texImage2D_4_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
+  static $_texImage2D_5_Callback(mthis, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $texImage2DCanvas_Callback(mthis, target, level, internalformat, format, type, canvas) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
+  static $texImage2DImage_Callback(mthis, target, level, internalformat, format, type, image) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
+  static $texImage2DImageData_Callback(mthis, target, level, internalformat, format, type, pixels) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
+  static $texImage2DVideo_Callback(mthis, target, level, internalformat, format, type, video) native "WebGLRenderingContext_texImage2D_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
+  static $texParameterf_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameterf_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_float";
 
-Native_WebGLRenderingContext_texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_long";
+  static $texParameteri_Callback(mthis, target, pname, param) native "WebGLRenderingContext_texParameteri_Callback_RESOLVER_STRING_3_unsigned long_unsigned long_long";
 
   // Generated overload resolver
-Native_WebGLRenderingContext_texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
+  static $texSubImage2D(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) {
     if ((pixels is TypedData || pixels == null) && (type is int || type == null) && (canvas_OR_format_OR_image_OR_pixels_OR_video is int || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null)) {
-      Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+      $_texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageData || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is ImageElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is CanvasElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     if ((canvas_OR_format_OR_image_OR_pixels_OR_video is VideoElement || canvas_OR_format_OR_image_OR_pixels_OR_video == null) && (height_OR_type is int || height_OR_type == null) && (format_OR_width is int || format_OR_width == null) && (yoffset is int || yoffset == null) && (xoffset is int || xoffset == null) && (level is int || level == null) && (target is int || target == null) && type == null && pixels == null) {
-      Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
+      $_texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebGLRenderingContext__texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
+  static $_texSubImage2D_1_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_9_unsigned long_long_long_long_long_long_unsigned long_unsigned long_ArrayBufferView";
 
-Native_WebGLRenderingContext__texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
+  static $_texSubImage2D_2_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext__texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
+  static $_texSubImage2D_3_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext__texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $_texSubImage2D_4_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext__texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
+  static $_texSubImage2D_5_Callback(mthis, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
+  static $texSubImage2DCanvas_Callback(mthis, target, level, xoffset, yoffset, format, type, canvas) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLCanvasElement";
 
-Native_WebGLRenderingContext_texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
+  static $texSubImage2DImage_Callback(mthis, target, level, xoffset, yoffset, format, type, image) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLImageElement";
 
-Native_WebGLRenderingContext_texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
+  static $texSubImage2DImageData_Callback(mthis, target, level, xoffset, yoffset, format, type, pixels) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_ImageData";
 
-Native_WebGLRenderingContext_texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
+  static $texSubImage2DVideo_Callback(mthis, target, level, xoffset, yoffset, format, type, video) native "WebGLRenderingContext_texSubImage2D_Callback_RESOLVER_STRING_7_unsigned long_long_long_long_unsigned long_unsigned long_HTMLVideoElement";
 
-Native_WebGLRenderingContext_uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback_RESOLVER_STRING_2_WebGLUniformLocation_float";
+  static $uniform1f_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1f_Callback_RESOLVER_STRING_2_WebGLUniformLocation_float";
 
-Native_WebGLRenderingContext_uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
+  static $uniform1fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1fv_Callback";
 
-Native_WebGLRenderingContext_uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback_RESOLVER_STRING_2_WebGLUniformLocation_long";
+  static $uniform1i_Callback(mthis, location, x) native "WebGLRenderingContext_uniform1i_Callback_RESOLVER_STRING_2_WebGLUniformLocation_long";
 
-Native_WebGLRenderingContext_uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
+  static $uniform1iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform1iv_Callback";
 
-Native_WebGLRenderingContext_uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback_RESOLVER_STRING_3_WebGLUniformLocation_float_float";
+  static $uniform2f_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2f_Callback_RESOLVER_STRING_3_WebGLUniformLocation_float_float";
 
-Native_WebGLRenderingContext_uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
+  static $uniform2fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2fv_Callback";
 
-Native_WebGLRenderingContext_uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback_RESOLVER_STRING_3_WebGLUniformLocation_long_long";
+  static $uniform2i_Callback(mthis, location, x, y) native "WebGLRenderingContext_uniform2i_Callback_RESOLVER_STRING_3_WebGLUniformLocation_long_long";
 
-Native_WebGLRenderingContext_uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
+  static $uniform2iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform2iv_Callback";
 
-Native_WebGLRenderingContext_uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback_RESOLVER_STRING_4_WebGLUniformLocation_float_float_float";
+  static $uniform3f_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3f_Callback_RESOLVER_STRING_4_WebGLUniformLocation_float_float_float";
 
-Native_WebGLRenderingContext_uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
+  static $uniform3fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3fv_Callback";
 
-Native_WebGLRenderingContext_uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback_RESOLVER_STRING_4_WebGLUniformLocation_long_long_long";
+  static $uniform3i_Callback(mthis, location, x, y, z) native "WebGLRenderingContext_uniform3i_Callback_RESOLVER_STRING_4_WebGLUniformLocation_long_long_long";
 
-Native_WebGLRenderingContext_uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
+  static $uniform3iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform3iv_Callback";
 
-Native_WebGLRenderingContext_uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback_RESOLVER_STRING_5_WebGLUniformLocation_float_float_float_float";
+  static $uniform4f_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4f_Callback_RESOLVER_STRING_5_WebGLUniformLocation_float_float_float_float";
 
-Native_WebGLRenderingContext_uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
+  static $uniform4fv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4fv_Callback";
 
-Native_WebGLRenderingContext_uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback_RESOLVER_STRING_5_WebGLUniformLocation_long_long_long_long";
+  static $uniform4i_Callback(mthis, location, x, y, z, w) native "WebGLRenderingContext_uniform4i_Callback_RESOLVER_STRING_5_WebGLUniformLocation_long_long_long_long";
 
-Native_WebGLRenderingContext_uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
+  static $uniform4iv_Callback(mthis, location, v) native "WebGLRenderingContext_uniform4iv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix2fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
+  static $uniformMatrix2fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix2fv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix3fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
+  static $uniformMatrix3fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix3fv_Callback";
 
-Native_WebGLRenderingContext_uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
+  static $uniformMatrix4fv_Callback(mthis, location, transpose, array) native "WebGLRenderingContext_uniformMatrix4fv_Callback";
 
-Native_WebGLRenderingContext_useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $useProgram_Callback(mthis, program) native "WebGLRenderingContext_useProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
+  static $validateProgram_Callback(mthis, program) native "WebGLRenderingContext_validateProgram_Callback_RESOLVER_STRING_1_WebGLProgram";
 
-Native_WebGLRenderingContext_vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback_RESOLVER_STRING_2_unsigned long_float";
+  static $vertexAttrib1f_Callback(mthis, indx, x) native "WebGLRenderingContext_vertexAttrib1f_Callback_RESOLVER_STRING_2_unsigned long_float";
 
-Native_WebGLRenderingContext_vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
+  static $vertexAttrib1fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib1fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback_RESOLVER_STRING_3_unsigned long_float_float";
+  static $vertexAttrib2f_Callback(mthis, indx, x, y) native "WebGLRenderingContext_vertexAttrib2f_Callback_RESOLVER_STRING_3_unsigned long_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
+  static $vertexAttrib2fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib2fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback_RESOLVER_STRING_4_unsigned long_float_float_float";
+  static $vertexAttrib3f_Callback(mthis, indx, x, y, z) native "WebGLRenderingContext_vertexAttrib3f_Callback_RESOLVER_STRING_4_unsigned long_float_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
+  static $vertexAttrib3fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib3fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback_RESOLVER_STRING_5_unsigned long_float_float_float_float";
+  static $vertexAttrib4f_Callback(mthis, indx, x, y, z, w) native "WebGLRenderingContext_vertexAttrib4f_Callback_RESOLVER_STRING_5_unsigned long_float_float_float_float";
 
-Native_WebGLRenderingContext_vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
+  static $vertexAttrib4fv_Callback(mthis, indx, values) native "WebGLRenderingContext_vertexAttrib4fv_Callback";
 
-Native_WebGLRenderingContext_vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_boolean_long_long long";
+  static $vertexAttribPointer_Callback(mthis, indx, size, type, normalized, stride, offset) native "WebGLRenderingContext_vertexAttribPointer_Callback_RESOLVER_STRING_6_unsigned long_long_unsigned long_boolean_long_long long";
 
-Native_WebGLRenderingContext_viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback_RESOLVER_STRING_4_long_long_long_long";
+  static $viewport_Callback(mthis, x, y, width, height) native "WebGLRenderingContext_viewport_Callback_RESOLVER_STRING_4_long_long_long_long";
+}
 
-Native_WebGLShaderPrecisionFormat_precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
+class BlinkWebGLShader {}
 
-Native_WebGLShaderPrecisionFormat_rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
+class BlinkWebGLShaderPrecisionFormat {
+  static $precision_Getter(mthis) native "WebGLShaderPrecisionFormat_precision_Getter";
 
-Native_WebGLShaderPrecisionFormat_rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+  static $rangeMax_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMax_Getter";
 
-Native_WebKitAnimationEvent_animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+  static $rangeMin_Getter(mthis) native "WebGLShaderPrecisionFormat_rangeMin_Getter";
+}
 
-Native_WebKitAnimationEvent_elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+class BlinkWebGLTexture {}
 
-Native_WebKitCSSFilterRule_style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+class BlinkWebGLUniformLocation {}
 
+class BlinkWebGLVertexArrayObjectOES {}
+
+class BlinkWebKitAnimationEvent {
+  static $animationName_Getter(mthis) native "WebKitAnimationEvent_animationName_Getter";
+
+  static $elapsedTime_Getter(mthis) native "WebKitAnimationEvent_elapsedTime_Getter";
+}
+
+class BlinkWebKitCSSFilterRule {
+  static $style_Getter(mthis) native "WebKitCSSFilterRule_style_Getter";
+}
+
+class BlinkWebKitCSSFilterValue {}
+
+class BlinkWebKitCSSMatrix {
   // Generated overload resolver
-Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue) {
-    return Native_WebKitCSSMatrix__create_1constructorCallback(cssValue);
+  static $mk_WebKitCSSMatrix(cssValue) {
+    return $_create_1constructorCallback(cssValue);
   }
 
-Native_WebKitCSSMatrix__create_1constructorCallback(cssValue) native "WebKitCSSMatrix_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(cssValue) native "WebKitCSSMatrix_constructorCallback_RESOLVER_STRING_1_DOMString";
+}
 
+class BlinkWebKitCSSTransformValue {}
+
+class BlinkWebKitMediaSource {
   // Generated overload resolver
-Native_WebKitMediaSource__WebKitMediaSource() {
-    return Native_WebKitMediaSource__create_1constructorCallback();
+  static $mk_WebKitMediaSource() {
+    return $_create_1constructorCallback();
   }
 
-Native_WebKitMediaSource__create_1constructorCallback() native "WebKitMediaSource_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "WebKitMediaSource_constructorCallback_RESOLVER_STRING_0_";
+}
 
-Native_WebKitPoint_constructorCallback(x, y) native "WebKitPoint_constructorCallback";
+class BlinkWebKitNotification {}
 
-Native_WebKitPoint_x_Getter(mthis) native "WebKitPoint_x_Getter";
+class BlinkWebKitPoint {
+  static $constructorCallback(x, y) native "WebKitPoint_constructorCallback";
 
-Native_WebKitPoint_x_Setter(mthis, value) native "WebKitPoint_x_Setter";
+  static $x_Getter(mthis) native "WebKitPoint_x_Getter";
 
-Native_WebKitPoint_y_Getter(mthis) native "WebKitPoint_y_Getter";
+  static $x_Setter(mthis, value) native "WebKitPoint_x_Setter";
 
-Native_WebKitPoint_y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+  static $y_Getter(mthis) native "WebKitPoint_y_Getter";
 
-Native_WebKitSourceBufferList_item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+  static $y_Setter(mthis, value) native "WebKitPoint_y_Setter";
+}
 
+class BlinkWebKitSourceBuffer {}
+
+class BlinkWebKitSourceBufferList {
+  static $item_Callback(mthis, index) native "WebKitSourceBufferList_item_Callback_RESOLVER_STRING_1_unsigned long";
+}
+
+class BlinkWebSocket {
   // Generated overload resolver
-Native_WebSocket_WebSocket(url, protocol_OR_protocols) {
+  static $mkWebSocket(url, protocol_OR_protocols) {
     if ((url is String || url == null) && protocol_OR_protocols == null) {
-      return Native_WebSocket__create_1constructorCallback(url);
+      return $_create_1constructorCallback(url);
     }
     if ((protocol_OR_protocols is List<String> || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols);
+      return $_create_2constructorCallback(url, protocol_OR_protocols);
     }
     if ((protocol_OR_protocols is String || protocol_OR_protocols == null) && (url is String || url == null)) {
-      return Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols);
+      return $_create_3constructorCallback(url, protocol_OR_protocols);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebSocket__create_1constructorCallback(url) native "WebSocket_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(url) native "WebSocket_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket__create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_sequence<DOMString>";
+  static $_create_2constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_sequence<DOMString>";
 
-Native_WebSocket__create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $_create_3constructorCallback(url, protocol_OR_protocols) native "WebSocket_constructorCallback_RESOLVER_STRING_2_DOMString_DOMString";
 
-Native_WebSocket_binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
+  static $binaryType_Getter(mthis) native "WebSocket_binaryType_Getter";
 
-Native_WebSocket_binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
+  static $binaryType_Setter(mthis, value) native "WebSocket_binaryType_Setter";
 
-Native_WebSocket_bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
+  static $bufferedAmount_Getter(mthis) native "WebSocket_bufferedAmount_Getter";
 
-Native_WebSocket_extensions_Getter(mthis) native "WebSocket_extensions_Getter";
+  static $extensions_Getter(mthis) native "WebSocket_extensions_Getter";
 
-Native_WebSocket_protocol_Getter(mthis) native "WebSocket_protocol_Getter";
+  static $protocol_Getter(mthis) native "WebSocket_protocol_Getter";
 
-Native_WebSocket_readyState_Getter(mthis) native "WebSocket_readyState_Getter";
+  static $readyState_Getter(mthis) native "WebSocket_readyState_Getter";
 
-Native_WebSocket_url_Getter(mthis) native "WebSocket_url_Getter";
+  static $url_Getter(mthis) native "WebSocket_url_Getter";
 
   // Generated overload resolver
-Native_WebSocket_close(mthis, code, reason) {
+  static $close(mthis, code, reason) {
     if (reason != null) {
-      Native_WebSocket__close_1_Callback(mthis, code, reason);
+      $_close_1_Callback(mthis, code, reason);
       return;
     }
     if (code != null) {
-      Native_WebSocket__close_2_Callback(mthis, code);
+      $_close_2_Callback(mthis, code);
       return;
     }
-    Native_WebSocket__close_3_Callback(mthis);
+    $_close_3_Callback(mthis);
     return;
   }
 
-Native_WebSocket__close_1_Callback(mthis, code, reason) native "WebSocket_close_Callback_RESOLVER_STRING_2_unsigned short_DOMString";
+  static $_close_1_Callback(mthis, code, reason) native "WebSocket_close_Callback_RESOLVER_STRING_2_unsigned short_DOMString";
 
-Native_WebSocket__close_2_Callback(mthis, code) native "WebSocket_close_Callback_RESOLVER_STRING_1_unsigned short";
+  static $_close_2_Callback(mthis, code) native "WebSocket_close_Callback_RESOLVER_STRING_1_unsigned short";
 
-Native_WebSocket__close_3_Callback(mthis) native "WebSocket_close_Callback_RESOLVER_STRING_0_";
+  static $_close_3_Callback(mthis) native "WebSocket_close_Callback_RESOLVER_STRING_0_";
 
   // Generated overload resolver
-Native_WebSocket_send(mthis, data) {
+  static $send(mthis, data) {
     if ((data is TypedData || data == null)) {
-      Native_WebSocket__send_1_Callback(mthis, data);
+      $_send_1_Callback(mthis, data);
       return;
     }
     if ((data is ByteBuffer || data == null)) {
-      Native_WebSocket__send_2_Callback(mthis, data);
+      $_send_2_Callback(mthis, data);
       return;
     }
     if ((data is Blob || data == null)) {
-      Native_WebSocket__send_3_Callback(mthis, data);
+      $_send_3_Callback(mthis, data);
       return;
     }
     if ((data is String || data == null)) {
-      Native_WebSocket__send_4_Callback(mthis, data);
+      $_send_4_Callback(mthis, data);
       return;
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_WebSocket__send_1_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $_send_1_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
 
-Native_WebSocket__send_2_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $_send_2_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket__send_3_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
+  static $_send_3_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket__send_4_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $_send_4_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket_sendBlob_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
+  static $sendBlob_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_Blob";
 
-Native_WebSocket_sendByteBuffer_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
+  static $sendByteBuffer_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBuffer";
 
-Native_WebSocket_sendString_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
+  static $sendString_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_WebSocket_sendTypedData_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+  static $sendTypedData_Callback(mthis, data) native "WebSocket_send_Callback_RESOLVER_STRING_1_ArrayBufferView";
+}
 
-Native_WheelEvent_deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
+class BlinkWheelEvent {
+  static $deltaMode_Getter(mthis) native "WheelEvent_deltaMode_Getter";
 
-Native_WheelEvent_deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
+  static $deltaX_Getter(mthis) native "WheelEvent_deltaX_Getter";
 
-Native_WheelEvent_deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
+  static $deltaY_Getter(mthis) native "WheelEvent_deltaY_Getter";
 
-Native_WheelEvent_deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
+  static $deltaZ_Getter(mthis) native "WheelEvent_deltaZ_Getter";
 
-Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(mthis) native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
+  static $webkitDirectionInvertedFromDevice_Getter(mthis) native "WheelEvent_webkitDirectionInvertedFromDevice_Getter";
 
-Native_WheelEvent_wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
+  static $wheelDeltaX_Getter(mthis) native "WheelEvent_wheelDeltaX_Getter";
 
-Native_WheelEvent_wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
+  static $wheelDeltaY_Getter(mthis) native "WheelEvent_wheelDeltaY_Getter";
 
-Native_WheelEvent_initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback_RESOLVER_STRING_11_long_long_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+  static $initWebKitWheelEvent_Callback(mthis, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey) native "WheelEvent_initWebKitWheelEvent_Callback_RESOLVER_STRING_11_long_long_Window_long_long_long_long_boolean_boolean_boolean_boolean";
+}
 
-Native_Window_CSS_Getter(mthis) native "Window_CSS_Getter";
+class BlinkWindow {
+  static $CSS_Getter(mthis) native "Window_CSS_Getter";
 
-Native_Window_applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
+  static $applicationCache_Getter(mthis) native "Window_applicationCache_Getter";
 
-Native_Window_closed_Getter(mthis) native "Window_closed_Getter";
+  static $closed_Getter(mthis) native "Window_closed_Getter";
 
-Native_Window_console_Getter(mthis) native "Window_console_Getter";
+  static $console_Getter(mthis) native "Window_console_Getter";
 
-Native_Window_crypto_Getter(mthis) native "Window_crypto_Getter";
+  static $crypto_Getter(mthis) native "Window_crypto_Getter";
 
-Native_Window_defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
+  static $defaultStatus_Getter(mthis) native "Window_defaultStatus_Getter";
 
-Native_Window_defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
+  static $defaultStatus_Setter(mthis, value) native "Window_defaultStatus_Setter";
 
-Native_Window_defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
+  static $defaultstatus_Getter(mthis) native "Window_defaultstatus_Getter";
 
-Native_Window_defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
+  static $defaultstatus_Setter(mthis, value) native "Window_defaultstatus_Setter";
 
-Native_Window_devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
+  static $devicePixelRatio_Getter(mthis) native "Window_devicePixelRatio_Getter";
 
-Native_Window_document_Getter(mthis) native "Window_document_Getter";
+  static $document_Getter(mthis) native "Window_document_Getter";
 
-Native_Window_history_Getter(mthis) native "Window_history_Getter";
+  static $history_Getter(mthis) native "Window_history_Getter";
 
-Native_Window_indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
+  static $indexedDB_Getter(mthis) native "Window_indexedDB_Getter";
 
-Native_Window_innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
+  static $innerHeight_Getter(mthis) native "Window_innerHeight_Getter";
 
-Native_Window_innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
+  static $innerWidth_Getter(mthis) native "Window_innerWidth_Getter";
 
-Native_Window_localStorage_Getter(mthis) native "Window_localStorage_Getter";
+  static $localStorage_Getter(mthis) native "Window_localStorage_Getter";
 
-Native_Window_location_Getter(mthis) native "Window_location_Getter";
+  static $location_Getter(mthis) native "Window_location_Getter";
 
-Native_Window_locationbar_Getter(mthis) native "Window_locationbar_Getter";
+  static $locationbar_Getter(mthis) native "Window_locationbar_Getter";
 
-Native_Window_menubar_Getter(mthis) native "Window_menubar_Getter";
+  static $menubar_Getter(mthis) native "Window_menubar_Getter";
 
-Native_Window_name_Getter(mthis) native "Window_name_Getter";
+  static $name_Getter(mthis) native "Window_name_Getter";
 
-Native_Window_name_Setter(mthis, value) native "Window_name_Setter";
+  static $name_Setter(mthis, value) native "Window_name_Setter";
 
-Native_Window_navigator_Getter(mthis) native "Window_navigator_Getter";
+  static $navigator_Getter(mthis) native "Window_navigator_Getter";
 
-Native_Window_offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
+  static $offscreenBuffering_Getter(mthis) native "Window_offscreenBuffering_Getter";
 
-Native_Window_opener_Getter(mthis) native "Window_opener_Getter";
+  static $opener_Getter(mthis) native "Window_opener_Getter";
 
-Native_Window_opener_Setter(mthis, value) native "Window_opener_Setter";
+  static $opener_Setter(mthis, value) native "Window_opener_Setter";
 
-Native_Window_orientation_Getter(mthis) native "Window_orientation_Getter";
+  static $orientation_Getter(mthis) native "Window_orientation_Getter";
 
-Native_Window_outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
+  static $outerHeight_Getter(mthis) native "Window_outerHeight_Getter";
 
-Native_Window_outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
+  static $outerWidth_Getter(mthis) native "Window_outerWidth_Getter";
 
-Native_Window_pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
+  static $pageXOffset_Getter(mthis) native "Window_pageXOffset_Getter";
 
-Native_Window_pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
+  static $pageYOffset_Getter(mthis) native "Window_pageYOffset_Getter";
 
-Native_Window_parent_Getter(mthis) native "Window_parent_Getter";
+  static $parent_Getter(mthis) native "Window_parent_Getter";
 
-Native_Window_performance_Getter(mthis) native "Window_performance_Getter";
+  static $performance_Getter(mthis) native "Window_performance_Getter";
 
-Native_Window_screen_Getter(mthis) native "Window_screen_Getter";
+  static $screen_Getter(mthis) native "Window_screen_Getter";
 
-Native_Window_screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
+  static $screenLeft_Getter(mthis) native "Window_screenLeft_Getter";
 
-Native_Window_screenTop_Getter(mthis) native "Window_screenTop_Getter";
+  static $screenTop_Getter(mthis) native "Window_screenTop_Getter";
 
-Native_Window_screenX_Getter(mthis) native "Window_screenX_Getter";
+  static $screenX_Getter(mthis) native "Window_screenX_Getter";
 
-Native_Window_screenY_Getter(mthis) native "Window_screenY_Getter";
+  static $screenY_Getter(mthis) native "Window_screenY_Getter";
 
-Native_Window_scrollX_Getter(mthis) native "Window_scrollX_Getter";
+  static $scrollX_Getter(mthis) native "Window_scrollX_Getter";
 
-Native_Window_scrollY_Getter(mthis) native "Window_scrollY_Getter";
+  static $scrollY_Getter(mthis) native "Window_scrollY_Getter";
 
-Native_Window_scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
+  static $scrollbars_Getter(mthis) native "Window_scrollbars_Getter";
 
-Native_Window_self_Getter(mthis) native "Window_self_Getter";
+  static $self_Getter(mthis) native "Window_self_Getter";
 
-Native_Window_sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
+  static $sessionStorage_Getter(mthis) native "Window_sessionStorage_Getter";
 
-Native_Window_speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
+  static $speechSynthesis_Getter(mthis) native "Window_speechSynthesis_Getter";
 
-Native_Window_status_Getter(mthis) native "Window_status_Getter";
+  static $status_Getter(mthis) native "Window_status_Getter";
 
-Native_Window_status_Setter(mthis, value) native "Window_status_Setter";
+  static $status_Setter(mthis, value) native "Window_status_Setter";
 
-Native_Window_statusbar_Getter(mthis) native "Window_statusbar_Getter";
+  static $statusbar_Getter(mthis) native "Window_statusbar_Getter";
 
-Native_Window_styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
+  static $styleMedia_Getter(mthis) native "Window_styleMedia_Getter";
 
-Native_Window_toolbar_Getter(mthis) native "Window_toolbar_Getter";
+  static $toolbar_Getter(mthis) native "Window_toolbar_Getter";
 
-Native_Window_top_Getter(mthis) native "Window_top_Getter";
+  static $top_Getter(mthis) native "Window_top_Getter";
 
-Native_Window_window_Getter(mthis) native "Window_window_Getter";
+  static $window_Getter(mthis) native "Window_window_Getter";
 
   // Generated overload resolver
-Native_Window___getter__(mthis, index_OR_name) {
+  static $__getter__(mthis, index_OR_name) {
     if ((index_OR_name is int || index_OR_name == null)) {
-      return Native_Window____getter___1_Callback(mthis, index_OR_name);
+      return $___getter___1_Callback(mthis, index_OR_name);
     }
     if ((index_OR_name is String || index_OR_name == null)) {
-      return Native_Window____getter___2_Callback(mthis, index_OR_name);
+      return $___getter___2_Callback(mthis, index_OR_name);
     }
     throw new ArgumentError("Incorrect number or type of arguments");
   }
 
-Native_Window____getter___1_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_unsigned long";
+  static $___getter___1_Callback(mthis, index_OR_name) native "Window___getter___Callback_RESOLVER_STRING_1_unsigned long";
 
-Native_Window____getter___2_Callback(mthis, index_OR_name) native "Window___getter___Callback";
+  static $___getter___2_Callback(mthis, index_OR_name) native "Window___getter___Callback";
 
-Native_Window_alert_Callback(mthis, message) native "Window_alert_Callback_RESOLVER_STRING_1_DOMString";
+  static $alert_Callback(mthis, message) native "Window_alert_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback_RESOLVER_STRING_1_long";
+  static $cancelAnimationFrame_Callback(mthis, id) native "Window_cancelAnimationFrame_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_close_Callback(mthis) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static $close_Callback(mthis) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_Window_confirm_Callback(mthis, message) native "Window_confirm_Callback_RESOLVER_STRING_1_DOMString";
+  static $confirm_Callback(mthis, message) native "Window_confirm_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback_RESOLVER_STRING_7_DOMString_boolean_boolean_boolean_boolean_boolean_boolean";
+  static $find_Callback(mthis, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog) native "Window_find_Callback_RESOLVER_STRING_7_DOMString_boolean_boolean_boolean_boolean_boolean_boolean";
 
-Native_Window_getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback_RESOLVER_STRING_2_Element_DOMString";
+  static $getComputedStyle_Callback(mthis, element, pseudoElement) native "Window_getComputedStyle_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback_RESOLVER_STRING_2_Element_DOMString";
+  static $getMatchedCSSRules_Callback(mthis, element, pseudoElement) native "Window_getMatchedCSSRules_Callback_RESOLVER_STRING_2_Element_DOMString";
 
-Native_Window_getSelection_Callback(mthis) native "Window_getSelection_Callback_RESOLVER_STRING_0_";
+  static $getSelection_Callback(mthis) native "Window_getSelection_Callback_RESOLVER_STRING_0_";
 
-Native_Window_matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback_RESOLVER_STRING_1_DOMString";
+  static $matchMedia_Callback(mthis, query) native "Window_matchMedia_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback_RESOLVER_STRING_2_float_float";
+  static $moveBy_Callback(mthis, x, y) native "Window_moveBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback_RESOLVER_STRING_2_float_float";
+  static $moveTo_Callback(mthis, x, y) native "Window_moveTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_open_Callback(mthis, url, name, options) native "Window_open_Callback";
+  static $open_Callback(mthis, url, name, options) native "Window_open_Callback";
 
-Native_Window_openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
+  static $openDatabase_Callback(mthis, name, version, displayName, estimatedSize, creationCallback) native "Window_openDatabase_Callback_RESOLVER_STRING_5_DOMString_DOMString_DOMString_unsigned long_DatabaseCallback";
 
-Native_Window_postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, targetOrigin, messagePorts) native "Window_postMessage_Callback";
 
-Native_Window_print_Callback(mthis) native "Window_print_Callback_RESOLVER_STRING_0_";
+  static $print_Callback(mthis) native "Window_print_Callback_RESOLVER_STRING_0_";
 
-Native_Window_requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback_RESOLVER_STRING_1_RequestAnimationFrameCallback";
+  static $requestAnimationFrame_Callback(mthis, callback) native "Window_requestAnimationFrame_Callback_RESOLVER_STRING_1_RequestAnimationFrameCallback";
 
-Native_Window_resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback_RESOLVER_STRING_2_float_float";
+  static $resizeBy_Callback(mthis, x, y) native "Window_resizeBy_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback_RESOLVER_STRING_2_float_float";
+  static $resizeTo_Callback(mthis, width, height) native "Window_resizeTo_Callback_RESOLVER_STRING_2_float_float";
 
-Native_Window_scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scroll_Callback(mthis, x, y, scrollOptions) native "Window_scroll_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scrollBy_Callback(mthis, x, y, scrollOptions) native "Window_scrollBy_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback_RESOLVER_STRING_3_long_long_Dictionary";
+  static $scrollTo_Callback(mthis, x, y, scrollOptions) native "Window_scrollTo_Callback_RESOLVER_STRING_3_long_long_Dictionary";
 
-Native_Window_showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
+  static $showModalDialog_Callback(mthis, url, dialogArgs, featureArgs) native "Window_showModalDialog_Callback";
 
-Native_Window_stop_Callback(mthis) native "Window_stop_Callback_RESOLVER_STRING_0_";
+  static $stop_Callback(mthis) native "Window_stop_Callback_RESOLVER_STRING_0_";
 
-Native_Window_toString_Callback(mthis) native "Window_toString_Callback";
+  static $toString_Callback(mthis) native "Window_toString_Callback";
 
-Native_Window_webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
+  static $webkitConvertPointFromNodeToPage_Callback(mthis, node, p) native "Window_webkitConvertPointFromNodeToPage_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
+  static $webkitConvertPointFromPageToNode_Callback(mthis, node, p) native "Window_webkitConvertPointFromPageToNode_Callback_RESOLVER_STRING_2_Node_WebKitPoint";
 
-Native_Window_webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
+  static $webkitRequestFileSystem_Callback(mthis, type, size, successCallback, errorCallback) native "Window_webkitRequestFileSystem_Callback_RESOLVER_STRING_4_unsigned short_long long_FileSystemCallback_ErrorCallback";
 
-Native_Window_webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
+  static $webkitResolveLocalFileSystemURL_Callback(mthis, url, successCallback, errorCallback) native "Window_webkitResolveLocalFileSystemURL_Callback_RESOLVER_STRING_3_DOMString_EntryCallback_ErrorCallback";
 
-Native_Window_atob_Callback(mthis, string) native "Window_atob_Callback_RESOLVER_STRING_1_DOMString";
+  static $atob_Callback(mthis, string) native "Window_atob_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_btoa_Callback(mthis, string) native "Window_btoa_Callback_RESOLVER_STRING_1_DOMString";
+  static $btoa_Callback(mthis, string) native "Window_btoa_Callback_RESOLVER_STRING_1_DOMString";
 
-Native_Window_clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback_RESOLVER_STRING_1_long";
+  static $clearInterval_Callback(mthis, handle) native "Window_clearInterval_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback_RESOLVER_STRING_1_long";
+  static $clearTimeout_Callback(mthis, handle) native "Window_clearTimeout_Callback_RESOLVER_STRING_1_long";
 
-Native_Window_setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
+  static $setInterval_Callback(mthis, handler, timeout) native "Window_setInterval_Callback";
 
-Native_Window_setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+  static $setTimeout_Callback(mthis, handler, timeout) native "Window_setTimeout_Callback";
+}
 
+class BlinkWorker {
   // Generated overload resolver
-Native_Worker_Worker(scriptUrl) {
-    return Native_Worker__create_1constructorCallback(scriptUrl);
+  static $mkWorker(scriptUrl) {
+    return $_create_1constructorCallback(scriptUrl);
   }
 
-Native_Worker__create_1constructorCallback(scriptUrl) native "Worker_constructorCallback_RESOLVER_STRING_1_DOMString";
+  static $_create_1constructorCallback(scriptUrl) native "Worker_constructorCallback_RESOLVER_STRING_1_DOMString";
 
-Native_Worker_postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
+  static $postMessage_Callback(mthis, message, messagePorts) native "Worker_postMessage_Callback";
 
-Native_Worker_terminate_Callback(mthis) native "Worker_terminate_Callback_RESOLVER_STRING_0_";
+  static $terminate_Callback(mthis) native "Worker_terminate_Callback_RESOLVER_STRING_0_";
+}
 
-Native_WorkerPerformance_now_Callback(mthis) native "WorkerPerformance_now_Callback_RESOLVER_STRING_0_";
+class BlinkWorkerConsole {}
 
-Native_XMLHttpRequest_constructorCallback() native "XMLHttpRequest_constructorCallback";
+class BlinkWorkerCrypto {}
 
-Native_XMLHttpRequest_readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
+class BlinkWorkerLocation {}
 
-Native_XMLHttpRequest_response_Getter(mthis) native "XMLHttpRequest_response_Getter";
+class BlinkWorkerNavigator {}
 
-Native_XMLHttpRequest_responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
+class BlinkWorkerPerformance {
+  static $now_Callback(mthis) native "WorkerPerformance_now_Callback_RESOLVER_STRING_0_";
+}
 
-Native_XMLHttpRequest_responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
+class BlinkXMLDocument {}
 
-Native_XMLHttpRequest_responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
+class BlinkXMLHttpRequestEventTarget {}
 
-Native_XMLHttpRequest_responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
+class BlinkXMLHttpRequest {
+  static $constructorCallback() native "XMLHttpRequest_constructorCallback";
 
-Native_XMLHttpRequest_status_Getter(mthis) native "XMLHttpRequest_status_Getter";
+  static $readyState_Getter(mthis) native "XMLHttpRequest_readyState_Getter";
 
-Native_XMLHttpRequest_statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
+  static $response_Getter(mthis) native "XMLHttpRequest_response_Getter";
 
-Native_XMLHttpRequest_timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
+  static $responseText_Getter(mthis) native "XMLHttpRequest_responseText_Getter";
 
-Native_XMLHttpRequest_timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
+  static $responseType_Getter(mthis) native "XMLHttpRequest_responseType_Getter";
 
-Native_XMLHttpRequest_upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
+  static $responseType_Setter(mthis, value) native "XMLHttpRequest_responseType_Setter";
 
-Native_XMLHttpRequest_withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
+  static $responseXML_Getter(mthis) native "XMLHttpRequest_responseXML_Getter";
 
-Native_XMLHttpRequest_withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
+  static $status_Getter(mthis) native "XMLHttpRequest_status_Getter";
 
-Native_XMLHttpRequest_abort_Callback(mthis) native "XMLHttpRequest_abort_Callback_RESOLVER_STRING_0_";
+  static $statusText_Getter(mthis) native "XMLHttpRequest_statusText_Getter";
 
-Native_XMLHttpRequest_getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback_RESOLVER_STRING_0_";
+  static $timeout_Getter(mthis) native "XMLHttpRequest_timeout_Getter";
 
-Native_XMLHttpRequest_getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback_RESOLVER_STRING_1_DOMString";
+  static $timeout_Setter(mthis, value) native "XMLHttpRequest_timeout_Setter";
 
-Native_XMLHttpRequest_open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
+  static $upload_Getter(mthis) native "XMLHttpRequest_upload_Getter";
 
-Native_XMLHttpRequest_overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback_RESOLVER_STRING_1_DOMString";
+  static $withCredentials_Getter(mthis) native "XMLHttpRequest_withCredentials_Getter";
 
-Native_XMLHttpRequest_send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
+  static $withCredentials_Setter(mthis, value) native "XMLHttpRequest_withCredentials_Setter";
 
-Native_XMLHttpRequest_setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+  static $abort_Callback(mthis) native "XMLHttpRequest_abort_Callback_RESOLVER_STRING_0_";
 
+  static $getAllResponseHeaders_Callback(mthis) native "XMLHttpRequest_getAllResponseHeaders_Callback_RESOLVER_STRING_0_";
+
+  static $getResponseHeader_Callback(mthis, header) native "XMLHttpRequest_getResponseHeader_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $open_Callback(mthis, method, url, async, user, password) native "XMLHttpRequest_open_Callback";
+
+  static $overrideMimeType_Callback(mthis, override) native "XMLHttpRequest_overrideMimeType_Callback_RESOLVER_STRING_1_DOMString";
+
+  static $send_Callback(mthis, data) native "XMLHttpRequest_send_Callback";
+
+  static $setRequestHeader_Callback(mthis, header, value) native "XMLHttpRequest_setRequestHeader_Callback_RESOLVER_STRING_2_DOMString_DOMString";
+}
+
+class BlinkXMLHttpRequestProgressEvent {}
+
+class BlinkXMLHttpRequestUpload {}
+
+class BlinkXMLSerializer {
   // Generated overload resolver
-Native_XMLSerializer_XmlSerializer() {
-    return Native_XMLSerializer__create_1constructorCallback();
+  static $mkXmlSerializer() {
+    return $_create_1constructorCallback();
   }
 
-Native_XMLSerializer__create_1constructorCallback() native "XMLSerializer_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XMLSerializer_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XMLSerializer_serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback_RESOLVER_STRING_1_Node";
+  static $serializeToString_Callback(mthis, node) native "XMLSerializer_serializeToString_Callback_RESOLVER_STRING_1_Node";
+}
 
+class BlinkXPathEvaluator {
   // Generated overload resolver
-Native_XPathEvaluator_XPathEvaluator() {
-    return Native_XPathEvaluator__create_1constructorCallback();
+  static $mkXPathEvaluator() {
+    return $_create_1constructorCallback();
   }
 
-Native_XPathEvaluator__create_1constructorCallback() native "XPathEvaluator_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XPathEvaluator_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XPathEvaluator_createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback_RESOLVER_STRING_2_DOMString_XPathNSResolver";
+  static $createExpression_Callback(mthis, expression, resolver) native "XPathEvaluator_createExpression_Callback_RESOLVER_STRING_2_DOMString_XPathNSResolver";
 
-Native_XPathEvaluator_createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback_RESOLVER_STRING_1_Node";
+  static $createNSResolver_Callback(mthis, nodeResolver) native "XPathEvaluator_createNSResolver_Callback_RESOLVER_STRING_1_Node";
 
-Native_XPathEvaluator_evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback_RESOLVER_STRING_5_DOMString_Node_XPathNSResolver_unsigned short_XPathResult";
+  static $evaluate_Callback(mthis, expression, contextNode, resolver, type, inResult) native "XPathEvaluator_evaluate_Callback_RESOLVER_STRING_5_DOMString_Node_XPathNSResolver_unsigned short_XPathResult";
+}
 
-Native_XPathExpression_evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback_RESOLVER_STRING_3_Node_unsigned short_XPathResult";
+class BlinkXPathExpression {
+  static $evaluate_Callback(mthis, contextNode, type, inResult) native "XPathExpression_evaluate_Callback_RESOLVER_STRING_3_Node_unsigned short_XPathResult";
+}
 
-Native_XPathNSResolver_lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback_RESOLVER_STRING_1_DOMString";
+class BlinkXPathNSResolver {
+  static $lookupNamespaceURI_Callback(mthis, prefix) native "XPathNSResolver_lookupNamespaceURI_Callback_RESOLVER_STRING_1_DOMString";
+}
 
-Native_XPathResult_booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
+class BlinkXPathResult {
+  static $booleanValue_Getter(mthis) native "XPathResult_booleanValue_Getter";
 
-Native_XPathResult_invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
+  static $invalidIteratorState_Getter(mthis) native "XPathResult_invalidIteratorState_Getter";
 
-Native_XPathResult_numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
+  static $numberValue_Getter(mthis) native "XPathResult_numberValue_Getter";
 
-Native_XPathResult_resultType_Getter(mthis) native "XPathResult_resultType_Getter";
+  static $resultType_Getter(mthis) native "XPathResult_resultType_Getter";
 
-Native_XPathResult_singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
+  static $singleNodeValue_Getter(mthis) native "XPathResult_singleNodeValue_Getter";
 
-Native_XPathResult_snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
+  static $snapshotLength_Getter(mthis) native "XPathResult_snapshotLength_Getter";
 
-Native_XPathResult_stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
+  static $stringValue_Getter(mthis) native "XPathResult_stringValue_Getter";
 
-Native_XPathResult_iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback_RESOLVER_STRING_0_";
+  static $iterateNext_Callback(mthis) native "XPathResult_iterateNext_Callback_RESOLVER_STRING_0_";
 
-Native_XPathResult_snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback_RESOLVER_STRING_1_unsigned long";
+  static $snapshotItem_Callback(mthis, index) native "XPathResult_snapshotItem_Callback_RESOLVER_STRING_1_unsigned long";
+}
 
+class BlinkXSLTProcessor {
   // Generated overload resolver
-Native_XSLTProcessor_XsltProcessor() {
-    return Native_XSLTProcessor__create_1constructorCallback();
+  static $mkXsltProcessor() {
+    return $_create_1constructorCallback();
   }
 
-Native_XSLTProcessor__create_1constructorCallback() native "XSLTProcessor_constructorCallback_RESOLVER_STRING_0_";
+  static $_create_1constructorCallback() native "XSLTProcessor_constructorCallback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback_RESOLVER_STRING_0_";
+  static $clearParameters_Callback(mthis) native "XSLTProcessor_clearParameters_Callback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
+  static $getParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_getParameter_Callback";
 
-Native_XSLTProcessor_importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback_RESOLVER_STRING_1_Node";
+  static $importStylesheet_Callback(mthis, stylesheet) native "XSLTProcessor_importStylesheet_Callback_RESOLVER_STRING_1_Node";
 
-Native_XSLTProcessor_removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
+  static $removeParameter_Callback(mthis, namespaceURI, localName) native "XSLTProcessor_removeParameter_Callback";
 
-Native_XSLTProcessor_reset_Callback(mthis) native "XSLTProcessor_reset_Callback_RESOLVER_STRING_0_";
+  static $reset_Callback(mthis) native "XSLTProcessor_reset_Callback_RESOLVER_STRING_0_";
 
-Native_XSLTProcessor_setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
+  static $setParameter_Callback(mthis, namespaceURI, localName, value) native "XSLTProcessor_setParameter_Callback";
 
-Native_XSLTProcessor_transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback_RESOLVER_STRING_1_Node";
+  static $transformToDocument_Callback(mthis, source) native "XSLTProcessor_transformToDocument_Callback_RESOLVER_STRING_1_Node";
 
-Native_XSLTProcessor_transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback_RESOLVER_STRING_2_Node_Document";
+  static $transformToFragment_Callback(mthis, source, docVal) native "XSLTProcessor_transformToFragment_Callback_RESOLVER_STRING_2_Node_Document";
+}
 
 
 // TODO(vsm): This should be moved out of this library.  Into dart:html?
 Type _getType(String key) {
+  var result;
+
   // TODO(vsm): Add Cross Frame and JS types here as well.
-  if (htmlBlinkMap.containsKey(key))
-    return htmlBlinkMap[key];
-  if (indexed_dbBlinkMap.containsKey(key))
-    return indexed_dbBlinkMap[key];
-  if (web_audioBlinkMap.containsKey(key))
-    return web_audioBlinkMap[key];
-  if (web_glBlinkMap.containsKey(key))
-    return web_glBlinkMap[key];
-  if (web_sqlBlinkMap.containsKey(key))
-    return web_sqlBlinkMap[key];
-  if (svgBlinkMap.containsKey(key))
-    return svgBlinkMap[key];
+
+  // Check the html library.
+  result = _getHtmlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web gl library.
+  result = _getWebGlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the indexed db library.
+  result = _getIndexDbType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web audio library.
+  result = _getWebAudioType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web sql library.
+  result = _getWebSqlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the svg library.
+  result = _getSvgType(key);
+  if (result != null) {
+    return result;
+  }
+
   return null;
-}// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+}
+
+Type _getHtmlType(String key) {
+  if (htmlBlinkMap.containsKey(key)) {
+    return htmlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebGlType(String key) {
+  if (web_glBlinkMap.containsKey(key)) {
+    return web_glBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getIndexDbType(String key) {
+  if (indexed_dbBlinkMap.containsKey(key)) {
+    return indexed_dbBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebAudioType(String key) {
+  if (web_audioBlinkMap.containsKey(key)) {
+    return web_audioBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebSqlType(String key) {
+  if (web_sqlBlinkMap.containsKey(key)) {
+    return web_sqlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getSvgType(String key) {
+  if (svgBlinkMap.containsKey(key)) {
+    return svgBlinkMap[key]();
+  }
+  return null;
+}
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
 
 // _Utils native entry points
-Native_Utils_window() native "Utils_window";
+class Blink_Utils {
+  static window() native "Utils_window";
 
-Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+  static forwardingPrint(message) native "Utils_forwardingPrint";
 
-Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+  static spawnDomUri(uri) native "Utils_spawnDomUri";
 
-Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+  static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-Native_Utils_createElement(document, tagName) native "Utils_createElement";
+  static createElement(document, tagName) native "Utils_createElement";
 
-Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+  static initializeCustomElement(element) native "Utils_initializeCustomElement";
 
-Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+}
 
-// FIXME: Return to using explicit cross frame entry points after roll to M35
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
+class Blink_DOMWindowCrossFrame {
+  // FIXME: Return to using explicit cross frame entry points after roll to M35
+  static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
+  static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
+  static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
+  static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
+  static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
+  static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+  static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+}
 
-// _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
+class Blink_HistoryCrossFrame {
+  // _HistoryCrossFrame native entry points
+  static back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
+  static forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+}
 
-// _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+class Blink_LocationCrossFrame {
+  // _LocationCrossFrame native entry points
+  static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+}
 
-// _DOMStringMap native entry  points
-Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+class Blink_DOMStringMap {
+  // _DOMStringMap native entry  points
+  static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
 
-Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+  static item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
 
-Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+  static setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
 
-Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+  static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
 
-Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+  static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/apiimpl.dart b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
index 9c6ba20..a9786cb 100644
--- a/sdk/lib/_internal/compiler/implementation/apiimpl.dart
+++ b/sdk/lib/_internal/compiler/implementation/apiimpl.dart
@@ -43,8 +43,10 @@
             enableNativeLiveTypeAnalysis:
                 !hasOption(options, '--disable-native-live-type-analysis'),
             emitJavaScript: !hasOption(options, '--output-type=dart'),
+            generateSourceMap: !hasOption(options, '--no-source-maps'),
             analyzeAllFlag: hasOption(options, '--analyze-all'),
             analyzeOnly: hasOption(options, '--analyze-only'),
+            analyzeMain: hasOption(options, '--analyze-main'),
             analyzeSignaturesOnly:
                 hasOption(options, '--analyze-signatures-only'),
             strips: extractCsvOption(options, '--force-strip='),
@@ -64,6 +66,7 @@
             showPackageWarnings:
                 hasOption(options, '--show-package-warnings'),
             useContentSecurityPolicy: hasOption(options, '--csp'),
+            hasIncrementalSupport: hasOption(options, '--incremental-support'),
             suppressWarnings: hasOption(options, '--suppress-warnings')) {
     if (!libraryRoot.path.endsWith("/")) {
       throw new ArgumentError("libraryRoot must end with a /");
@@ -136,12 +139,6 @@
     return "lib/$path";
   }
 
-  Future<elements.LibraryElement> scanBuiltinLibrary(String path) {
-    Uri uri = libraryRoot.resolve(lookupLibraryPath(path));
-    Uri canonicalUri = new Uri(scheme: "dart", path: path);
-    return libraryLoader.loadLibrary(uri, null, canonicalUri);
-  }
-
   void log(message) {
     handler(null, null, null, message, api.Diagnostic.VERBOSE_INFO);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/cache_strategy.dart b/sdk/lib/_internal/compiler/implementation/cache_strategy.dart
new file mode 100644
index 0000000..2a0a8f0
--- /dev/null
+++ b/sdk/lib/_internal/compiler/implementation/cache_strategy.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'dart:collection' show
+    HashMap,
+    HashSet;
+
+/**
+ * Helper class for allocating sets and maps appropriate for caching objects
+ * that can be assumed to be canonicalized.
+ *
+ * When compiling dart2js to JavaScript, profiling reveals that identity maps
+ * and sets have superior performance.  However, we know that [Object.hashCode]
+ * is slow on the Dart VM.  This class is meant to encapsulate the decision
+ * about which data structure is best, and we anticipate specific subclasses
+ * for JavaScript and Dart VM in the future.
+ */
+class CacheStrategy {
+  final bool hasIncrementalSupport;
+
+  CacheStrategy(this.hasIncrementalSupport);
+
+  Map newMap() => hasIncrementalSupport ? new HashMap.identity() : null;
+
+  Set newSet() => hasIncrementalSupport ? new HashSet.identity() : null;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/closure.dart b/sdk/lib/_internal/compiler/implementation/closure.dart
index b85551b..cace5f8 100644
--- a/sdk/lib/_internal/compiler/implementation/closure.dart
+++ b/sdk/lib/_internal/compiler/implementation/closure.dart
@@ -10,7 +10,10 @@
 import "scanner/scannerlib.dart" show Token;
 import "tree/tree.dart";
 import "util/util.dart";
-import "elements/modelx.dart" show ElementX, FunctionElementX, ClassElementX;
+import "elements/modelx.dart"
+    show ElementX,
+         BaseFunctionElementX,
+         ClassElementX;
 import "elements/visitor.dart" show ElementVisitor;
 
 class ClosureNamer {
@@ -80,16 +83,24 @@
   final TypedElement variableElement;
 
   ClosureFieldElement(String name,
-                      this.variableElement,
-                      ClassElement enclosing)
+                     this.variableElement,
+                     ClosureClassElement enclosing)
       : super(name, ElementKind.FIELD, enclosing);
 
+  ClosureClassElement get closureClass => enclosingElement;
+
   Node get node {
     throw new SpannableAssertionFailure(
         variableElement,
         'Should not access node of ClosureFieldElement.');
   }
 
+  bool get hasResolvedAst => hasTreeElements;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(this, null, treeElements);
+  }
+
   Expression get initializer {
     throw new SpannableAssertionFailure(
         variableElement,
@@ -108,6 +119,8 @@
   String toString() => "ClosureFieldElement($name)";
 
   accept(ElementVisitor visitor) => visitor.visitClosureFieldElement(this);
+
+  Element get analyzableElement => closureClass.methodElement.analyzableElement;
 }
 
 // TODO(ahe): These classes continuously cause problems.  We need to
@@ -218,20 +231,28 @@
 }
 
 /// Call method of a closure class.
-class SynthesizedCallMethodElementX extends FunctionElementX {
+class SynthesizedCallMethodElementX extends BaseFunctionElementX {
   final FunctionElement expression;
 
   SynthesizedCallMethodElementX(String name,
-                                FunctionElementX other,
-                                Element enclosing)
+                                BaseFunctionElementX other,
+                                ClosureClassElement enclosing)
       : expression = other,
         super(name, other.kind, other.modifiers, enclosing, false) {
     functionSignatureCache = other.functionSignature;
   }
 
+  ClosureClassElement get closureClass => enclosingElement;
+
   FunctionExpression get node => expression.node;
 
   FunctionExpression parseNode(DiagnosticListener listener) => node;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(this, node, treeElements);
+  }
+
+  Element get analyzableElement => closureClass.methodElement.analyzableElement;
 }
 
 // The box-element for a scope, and the captured variables that need to be
@@ -255,7 +276,7 @@
   final Element closureElement;
   // The closureClassElement will be null for methods that are not local
   // closures.
-  final ClassElement closureClassElement;
+  final ClosureClassElement closureClassElement;
   // The callElement will be null for methods that are not local closures.
   final FunctionElement callElement;
   // The [thisElement] makes handling 'this' easier by treating it like any
@@ -452,9 +473,11 @@
              closureData.freeVariableMapping[element] == element);
       closureData.freeVariableMapping[element] = element;
     } else if (inTryStatement) {
-      // Don't mark the this-element. This would complicate things in the
-      // builder.
-      if (element != closureData.thisElement) {
+      // Don't mark the this-element or a self-reference. This would complicate
+      // things in the builder.
+      // Note that nested (named) functions are immutable.
+      if (element != closureData.thisElement &&
+          element != closureData.closureElement) {
         // TODO(ngeoffray): only do this if the variable is mutated.
         closureData.usedVariablesInTry.add(element);
       }
@@ -734,7 +757,7 @@
   ClosureClassMap globalizeClosure(FunctionExpression node,
                                    TypedElement element) {
     String closureName = computeClosureName(element);
-    ClassElement globalizedElement = new ClosureClassElement(
+    ClosureClassElement globalizedElement = new ClosureClassElement(
         node, closureName, compiler, element, element.compilationUnit);
     FunctionElement callElement =
         new SynthesizedCallMethodElementX(Compiler.CALL_OPERATOR_NAME,
diff --git a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
index b1939b7..8a21068 100644
--- a/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/compile_time_constants.dart
@@ -105,17 +105,11 @@
       Constant result = initialVariableValues[element.declaration];
       return result;
     }
-    Element currentElement = element;
-    if (element.isParameter ||
-        element.isFieldParameter ||
-        element.isVariable) {
-      currentElement = element.enclosingElement;
-    }
+    AstElement currentElement = element.analyzableElement;
     return compiler.withCurrentElement(currentElement, () {
-      TreeElements definitions =
-          compiler.analyzeElement(currentElement.declaration);
+      compiler.analyzeElement(currentElement.declaration);
       Constant constant = compileVariableWithDefinitions(
-          element, definitions, isConst: isConst);
+          element, currentElement.resolvedAst.elements, isConst: isConst);
       return constant;
     });
   }
@@ -311,48 +305,9 @@
       }
       map[key] = evaluateConstant(entry.value);
     }
-
-    bool onlyStringKeys = true;
-    Constant protoValue = null;
-    for (var key in keys) {
-      if (key.isString) {
-        if (key.value == MapConstant.PROTO_PROPERTY) {
-          protoValue = map[key];
-        }
-      } else {
-        onlyStringKeys = false;
-        // Don't handle __proto__ values specially in the general map case.
-        protoValue = null;
-        break;
-      }
-    }
-
-    bool hasProtoKey = (protoValue != null);
     List<Constant> values = map.values.toList();
     InterfaceType sourceType = elements.getType(node);
-    DartType keysType;
-    if (sourceType.treatAsRaw) {
-      keysType = compiler.listClass.rawType;
-    } else {
-      Link<DartType> arguments =
-          new Link<DartType>.fromList([sourceType.typeArguments.head]);
-      keysType = new InterfaceType(compiler.listClass, arguments);
-    }
-    ListConstant keysList = new ListConstant(keysType, keys);
-    String className = onlyStringKeys
-        ? (hasProtoKey ? MapConstant.DART_PROTO_CLASS
-                       : MapConstant.DART_STRING_CLASS)
-        : MapConstant.DART_GENERAL_CLASS;
-    ClassElement classElement = compiler.jsHelperLibrary.find(className);
-    classElement.ensureResolved(compiler);
-    Link<DartType> typeArgument = sourceType.typeArguments;
-    InterfaceType type;
-    if (sourceType.treatAsRaw) {
-      type = classElement.rawType;
-    } else {
-      type = new InterfaceType(classElement, typeArgument);
-    }
-    return new MapConstant(type, keysList, values, protoValue, onlyStringKeys);
+    return constantSystem.createMap(compiler, sourceType, keys, values);
   }
 
   Constant visitLiteralNull(LiteralNull node) {
@@ -404,7 +359,8 @@
         new DartString.literal(node.slowNameString))];
     }
     return makeConstructedConstant(
-        node, type, compiler.symbolConstructor, createArguments);
+        node, type, compiler.symbolConstructor, createArguments,
+        isLiteralSymbol: true);
   }
 
   Constant makeTypeConstant(DartType elementType) {
@@ -628,9 +584,12 @@
                                                  compileConstant,
                                                  compiler);
     if (!succeeded) {
+      String name = Elements.constructorNameForDiagnostics(
+          target.enclosingClass.name, target.name);
       compiler.reportFatalError(
           node,
-          MessageKind.INVALID_ARGUMENTS, {'methodName': target.name});
+          MessageKind.INVALID_CONSTRUCTOR_ARGUMENTS,
+          {'constructorName': name});
     }
     return compiledArguments;
   }
@@ -739,7 +698,8 @@
 
   Constant makeConstructedConstant(
       Spannable node, InterfaceType type, ConstructorElement constructor,
-      List<Constant> getArguments(ConstructorElement constructor)) {
+      List<Constant> getArguments(ConstructorElement constructor),
+      {bool isLiteralSymbol: false}) {
     // The redirection chain of this element may not have been resolved through
     // a post-process action, so we have to make sure it is done here.
     compiler.resolver.resolveRedirectionChain(constructor, node);
@@ -758,7 +718,8 @@
     evaluator.evaluateConstructorFieldValues(arguments);
     List<Constant> jsNewArguments = evaluator.buildJsNewArguments(classElement);
 
-    return new ConstructedConstant(constructedType, jsNewArguments);
+    return new ConstructedConstant(constructedType, jsNewArguments,
+        isLiteralSymbol: isLiteralSymbol);
   }
 
   Constant visitParenthesizedExpression(ParenthesizedExpression node) {
diff --git a/sdk/lib/_internal/compiler/implementation/compiler.dart b/sdk/lib/_internal/compiler/implementation/compiler.dart
index 1fbc00d..d221a0b 100644
--- a/sdk/lib/_internal/compiler/implementation/compiler.dart
+++ b/sdk/lib/_internal/compiler/implementation/compiler.dart
@@ -24,7 +24,7 @@
    *
    * Invariant: [element] must be a declaration element.
    */
-  final Element element;
+  final AstElement element;
   TreeElements resolutionTree;
 
   WorkItem(this.element, this.compilationContext) {
@@ -36,12 +36,13 @@
 
 /// [WorkItem] used exclusively by the [ResolutionEnqueuer].
 class ResolutionWorkItem extends WorkItem {
-  ResolutionWorkItem(Element element,
+  ResolutionWorkItem(AstElement element,
                      ItemCompilationContext compilationContext)
       : super(element, compilationContext);
 
   void run(Compiler compiler, ResolutionEnqueuer world) {
-    resolutionTree = compiler.analyze(this, world);
+    compiler.analyze(this, world);
+    resolutionTree = element.resolvedAst.elements;
   }
 
   bool isAnalyzed() => resolutionTree != null;
@@ -55,6 +56,8 @@
 
   CodegenRegistry(this.compiler, this.treeElements);
 
+  bool get isForResolution => false;
+
   // TODO(johnniwinther): Remove this getter when [Registry] creates a
   // dependency node.
   Setlet<Element> get otherDependencies => treeElements.otherDependencies;
@@ -104,6 +107,7 @@
 
   void registerIsCheck(DartType type) {
     world.registerIsCheck(type, this);
+    backend.registerIsCheckForCodegen(type, world, this);
   }
 
   void registerCompileTimeConstant(Constant constant) {
@@ -133,7 +137,7 @@
   }
 
   void registerConstSymbol(String name) {
-    world.registerConstSymbol(name, this);
+    backend.registerConstSymbol(name, this);
   }
 
   void registerSpecializedGetInterceptor(Set<ClassElement> classes) {
@@ -147,20 +151,25 @@
   void registerTypeConstant(ClassElement element) {
     backend.customElementsAnalysis.registerTypeConstant(element, world);
   }
+
+  void registerStaticInvocation(Element element) =>
+      throw new UnsupportedError('registerStaticInvocation not supported');
+
+  void registerInstantiation(ClassElement element) =>
+      throw new UnsupportedError('registerStaticInvocation not supported');
 }
 
 /// [WorkItem] used exclusively by the [CodegenEnqueuer].
 class CodegenWorkItem extends WorkItem {
   Registry registry;
 
-  CodegenWorkItem(Element element,
+  CodegenWorkItem(AstElement element,
                   ItemCompilationContext compilationContext)
       : super(element, compilationContext);
 
   void run(Compiler compiler, CodegenEnqueuer world) {
     if (world.isProcessed(element)) return;
-    resolutionTree =
-        compiler.enqueuer.resolution.getCachedElements(element);
+    resolutionTree = element.resolvedAst.elements;
     assert(invariant(element, resolutionTree != null,
         message: 'Resolution tree is null for $element in codegen work item'));
     registry = new CodegenRegistry(compiler, resolutionTree);
@@ -184,6 +193,12 @@
   Iterable<Element> get otherDependencies;
 
   void registerDependency(Element element);
+
+  bool get isForResolution;
+
+  void registerStaticInvocation(Element element);
+
+  void registerInstantiation(ClassElement element);
 }
 
 abstract class Backend {
@@ -248,44 +263,42 @@
 
   /// Called during resolution to notify to the backend that the
   /// program uses string interpolation.
-  void registerStringInterpolation(Registry registry) {}
+  void onStringInterpolation(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement.
-  void registerCatchStatement(Enqueuer enqueuer,
-                              Registry registry) {}
+  void onCatchStatement(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program explicitly throws an exception.
-  void registerThrowExpression(Registry registry) {}
+  void onThrowExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a global variable with a lazy initializer.
-  void registerLazyField(Registry registry) {}
+  void onLazyField(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type variable as an expression.
-  void registerTypeVariableExpression(Registry registry) {}
+  void onTypeVariableExpression(Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program uses a type literal.
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {}
+  void onTypeLiteral(DartType type, Registry registry) {}
 
   /// Called during resolution to notify to the backend that the
   /// program has a catch statement with a stack trace.
-  void registerStackTraceInCatch(Registry registry) {}
+  void onStackTraceInCatch(Registry registry) {}
 
   /// Register an is check to the backend.
-  void registerIsCheck(DartType type,
-                       Enqueuer enqueuer,
-                       Registry registry) {}
+  void registerIsCheckForCodegen(DartType type,
+                                 Enqueuer enqueuer,
+                                 Registry registry) {}
+
+  /// Register an is check to the backend.
+  void onIsCheck(DartType type, Registry registry) {}
 
   /// Register an as check to the backend.
-  void registerAsCheck(DartType type,
-                       Enqueuer enqueuer,
-                       Registry registry) {}
+  void onAsCheck(DartType type, Registry registry) {}
 
   /// Register a runtime type variable bound tests between [typeArgument] and
   /// [bound].
@@ -293,27 +306,27 @@
                                               DartType bound) {}
 
   /// Registers that a type variable bounds check might occur at runtime.
-  void registerTypeVariableBoundCheck(Registry registry) {}
+  void onTypeVariableBoundCheck(Registry registry) {}
 
   /// Register that the application may throw a [NoSuchMethodError].
-  void registerThrowNoSuchMethod(Registry registry) {}
+  void onThrowNoSuchMethod(Registry registry) {}
 
   /// Register that the application may throw a [RuntimeError].
-  void registerThrowRuntimeError(Registry registry) {}
+  void onThrowRuntimeError(Registry registry) {}
 
   /// Register that the application may throw an
   /// [AbstractClassInstantiationError].
-  void registerAbstractClassInstantiation(Registry registry) {}
+  void onAbstractClassInstantiation(Registry registry) {}
 
   /// Register that the application may throw a [FallThroughError].
-  void registerFallThroughError(Registry registry) {}
+  void onFallThroughError(Registry registry) {}
 
   /// Register that a super call will end up calling
   /// [: super.noSuchMethod :].
-  void registerSuperNoSuchMethod(Registry registry) {}
+  void onSuperNoSuchMethod(Registry registry) {}
 
   /// Register that the application creates a constant map.
-  void registerConstantMap(Registry registry) {}
+  void onConstantMap(Registry registry) {}
 
   /**
    * Call this to register that an instantiated generic class has a call
@@ -347,8 +360,9 @@
 
   void registerConstSymbol(String name, Registry registry) {}
   void registerNewSymbol(Registry registry) {}
+
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(Registry registry) {}
+  void onSymbolConstructor(Registry registry) {}
 
   bool isNullImplementation(ClassElement cls) {
     return cls == compiler.nullClass;
@@ -383,7 +397,29 @@
 
   void registerStaticUse(Element element, Enqueuer enqueuer) {}
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
+  /// This method is called immediately after the [LibraryElement] [library] has
+  /// been created.
+  void onLibraryCreated(LibraryElement library) {}
+
+  /// This method is called immediately after the [library] and its parts have
+  /// been scanned.
+  Future onLibraryScanned(LibraryElement library,
+                          LibraryLoader loader) {
+    // TODO(johnniwinther): Move this to the JavaScript backend.
+    if (library.isPlatformLibrary && !library.isPatched) {
+      // Apply patch, if any.
+      Uri patchUri = compiler.resolvePatchUri(library.canonicalUri.path);
+      if (patchUri != null) {
+        return compiler.patchParser.patchLibrary(loader, patchUri, library);
+      }
+    }
+    return new Future.value();
+  }
+
+  /// This method is called when all new libraries loaded through
+  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
+  /// have been computed.
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
     return new Future.value();
   }
 
@@ -413,6 +449,9 @@
   // TODO(johnniwinther): Change [TreeElements] to [Registry] or a dependency
   // node. [elements] is currently unused by the implementation.
   void onElementResolved(Element element, TreeElements elements) {}
+
+  // Does this element belong in the output
+  bool shouldOutput(Element element) => true;
 }
 
 /**
@@ -455,6 +494,22 @@
 }
 
 abstract class Compiler implements DiagnosticListener {
+  static final Uri DART_CORE = new Uri(scheme: 'dart', path: 'core');
+  static final Uri DART_JS_HELPER = new Uri(scheme: 'dart', path: '_js_helper');
+  static final Uri DART_INTERCEPTORS =
+      new Uri(scheme: 'dart', path: '_interceptors');
+  static final Uri DART_FOREIGN_HELPER =
+      new Uri(scheme: 'dart', path: '_foreign_helper');
+  static final Uri DART_ISOLATE_HELPER =
+      new Uri(scheme: 'dart', path: '_isolate_helper');
+  static final Uri DART_MIRRORS = new Uri(scheme: 'dart', path: 'mirrors');
+  static final Uri DART_NATIVE_TYPED_DATA =
+      new Uri(scheme: 'dart', path: '_native_typed_data');
+  static final Uri DART_INTERNAL = new Uri(scheme: 'dart', path: '_internal');
+  static final Uri DART_ASYNC = new Uri(scheme: 'dart', path: 'async');
+
+  // TODO(johnniwinther): Move this to [LibraryLoaderTask] and hange to map from
+  // [Uri] to [LibraryElement].
   final Map<String, LibraryElement> libraries =
     new Map<String, LibraryElement>();
   final Stopwatch totalCompileTime = new Stopwatch();
@@ -463,6 +518,8 @@
   String assembledCode;
   Types types;
 
+  final CacheStrategy cacheStrategy;
+
   /**
    * Map from token to the first preceeding comment token.
    */
@@ -505,6 +562,10 @@
   final int maxConcreteTypeSize;
   final bool analyzeAllFlag;
   final bool analyzeOnly;
+
+  /// If true, disable tree-shaking for the main script.
+  final bool analyzeMain;
+
   /**
    * If true, skip analysis of method bodies and field initializers. Implies
    * [analyzeOnly].
@@ -553,6 +614,10 @@
 
   final bool suppressWarnings;
 
+  /// If `true`, some values are cached for reuse in incremental compilation.
+  /// Incremental compilation is basically calling [run] more than once.
+  final bool hasIncrementalSupport;
+
   api.CompilerOutputProvider outputProvider;
 
   bool disableInlining = false;
@@ -570,6 +635,8 @@
   LibraryElement coreLibrary;
   LibraryElement isolateLibrary;
   LibraryElement isolateHelperLibrary;
+  // TODO(johnniwinther): Move JavaScript specific libraries to the JavaScript
+  // backend.
   LibraryElement jsHelperLibrary;
   LibraryElement interceptorsLibrary;
   LibraryElement foreignLibrary;
@@ -603,6 +670,9 @@
   /// The constant for the [proxy] variable defined in dart:core.
   Constant proxyConstant;
 
+  /// The constant for the [patch] variable defined in dart:_js_helper.
+  Constant patchConstant;
+
   // Initialized after symbolClass has been resolved.
   FunctionElement symbolConstructor;
 
@@ -692,7 +762,7 @@
   DietParserTask dietParser;
   ParserTask parser;
   PatchParserTask patchParser;
-  LibraryLoader libraryLoader;
+  LibraryLoaderTask libraryLoader;
   TreeValidatorTask validator;
   ResolverTask resolver;
   closureMapping.ClosureTask closureToClassMapper;
@@ -767,7 +837,7 @@
             this.enableUserAssertions: false,
             this.trustTypeAnnotations: false,
             this.enableConcreteTypeInference: false,
-            this.disableTypeInferenceFlag: false,
+            bool disableTypeInferenceFlag: false,
             this.maxConcreteTypeSize: 5,
             this.enableMinification: false,
             this.enableNativeLiveTypeAnalysis: false,
@@ -775,6 +845,7 @@
             bool generateSourceMap: true,
             bool analyzeAllFlag: false,
             bool analyzeOnly: false,
+            this.analyzeMain: false,
             bool analyzeSignaturesOnly: false,
             this.preserveComments: false,
             this.verbose: false,
@@ -786,16 +857,22 @@
             this.showPackageWarnings: false,
             this.useContentSecurityPolicy: false,
             this.suppressWarnings: false,
+            bool hasIncrementalSupport: false,
             outputProvider,
             List<String> strips: const []})
-      : this.analyzeOnly =
+      : this.disableTypeInferenceFlag =
+          disableTypeInferenceFlag || !emitJavaScript,
+        this.analyzeOnly =
             analyzeOnly || analyzeSignaturesOnly || analyzeAllFlag,
         this.analyzeSignaturesOnly = analyzeSignaturesOnly,
         this.analyzeAllFlag = analyzeAllFlag,
+        this.hasIncrementalSupport = hasIncrementalSupport,
+        cacheStrategy = new CacheStrategy(hasIncrementalSupport),
         this.outputProvider = (outputProvider == null)
             ? NullSink.outputProvider
             : outputProvider {
     world = new World(this);
+    types = new Types(this);
     tracer = new Tracer(this.outputProvider);
 
     closureMapping.ClosureNamer closureNamer;
@@ -954,35 +1031,95 @@
 
   bool hasIsolateSupport() => isolateLibrary != null;
 
-  /**
-   * This method is called before [library] import and export scopes have been
-   * set up.
-   */
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (uri == new Uri(scheme: 'dart', path: 'mirrors')) {
-      mirrorsLibrary = library;
-      mirrorSystemClass =
-          findRequiredElement(library, 'MirrorSystem');
-      mirrorsUsedClass =
-          findRequiredElement(library, 'MirrorsUsed');
-    } else if (uri == new Uri(scheme: 'dart', path: '_native_typed_data')) {
-      typedDataLibrary = library;
-      typedDataClass =
-          findRequiredElement(library, 'NativeTypedData');
-    } else if (uri == new Uri(scheme: 'dart', path: '_internal')) {
-      symbolImplementationClass =
-          findRequiredElement(library, 'Symbol');
-    } else if (uri == new Uri(scheme: 'dart', path: 'async')) {
-      deferredLibraryClass =
-          findRequiredElement(library, 'DeferredLibrary');
-    } else if (isolateHelperLibrary == null
-	       && (uri == new Uri(scheme: 'dart', path: '_isolate_helper'))) {
-      isolateHelperLibrary = library;
-    } else if (foreignLibrary == null
-	       && (uri == new Uri(scheme: 'dart', path: '_foreign_helper'))) {
+  /// This method is called immediately after the [LibraryElement] [library] has
+  /// been created.
+  ///
+  /// Use this callback method to store references to specific libraries.
+  /// Note that [library] has not been scanned yet, nor has its imports/exports
+  /// been resolved.
+  void onLibraryCreated(LibraryElement library) {
+    Uri uri = library.canonicalUri;
+    if (uri == DART_CORE) {
+      coreLibrary = library;
+    } else if (uri == DART_JS_HELPER) {
+      jsHelperLibrary = library;
+    } else if (uri == DART_INTERCEPTORS) {
+      interceptorsLibrary = library;
+    } else if (uri == DART_FOREIGN_HELPER) {
       foreignLibrary = library;
+    } else if (uri == DART_ISOLATE_HELPER) {
+      isolateHelperLibrary = library;
+    } else if (uri == DART_NATIVE_TYPED_DATA) {
+      typedDataLibrary = library;
+    } else if (uri == DART_MIRRORS) {
+      mirrorsLibrary = library;
     }
-    return backend.onLibraryLoaded(library, uri);
+    backend.onLibraryCreated(library);
+  }
+
+  /// This method is called immediately after the [library] and its parts have
+  /// been scanned.
+  ///
+  /// Use this callback method to store references to specific member declared
+  /// in certain libraries. Note that [library] has not been patched yet, nor
+  /// has its imports/exports been resolved.
+  ///
+  /// Use [loader] to register the creation and scanning of a patch library
+  /// for [library].
+  Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
+    Uri uri = library.canonicalUri;
+    if (uri == DART_CORE) {
+      initializeCoreClasses();
+      identicalFunction = coreLibrary.find('identical');
+    } else if (uri == DART_JS_HELPER) {
+      initializeHelperClasses();
+      assertMethod = jsHelperLibrary.find('assertHelper');
+    } else if (uri == DART_INTERNAL) {
+      symbolImplementationClass = findRequiredElement(library, 'Symbol');
+    } else if (uri == DART_MIRRORS) {
+      mirrorSystemClass = findRequiredElement(library, 'MirrorSystem');
+      mirrorsUsedClass = findRequiredElement(library, 'MirrorsUsed');
+    } else if (uri == DART_ASYNC) {
+      deferredLibraryClass = findRequiredElement(library, 'DeferredLibrary');
+    } else if (uri == DART_NATIVE_TYPED_DATA) {
+      typedDataClass = findRequiredElement(library, 'NativeTypedData');
+    }
+    return backend.onLibraryScanned(library, loader);
+  }
+
+  /// This method is called when all new libraries loaded through
+  /// [LibraryLoader.loadLibrary] has been loaded and their imports/exports
+  /// have been computed.
+  ///
+  /// [loadedLibraries] contains the newly loaded libraries.
+  ///
+  /// The method returns a [Future] allowing for the loading of additional
+  /// libraries.
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    return new Future.sync(() {
+      if (!loadedLibraries.containsKey(DART_CORE)) return new Future.value();
+
+      functionClass.ensureResolved(this);
+      functionApplyMethod = functionClass.lookupLocalMember('apply');
+
+      proxyConstant =
+          resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
+
+      patchConstant = resolver.constantCompiler.compileConstant(
+          jsHelperLibrary.find('patch'));
+
+      if (jsInvocationMirrorClass != null) {
+        jsInvocationMirrorClass.ensureResolved(this);
+        invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
+      }
+
+      if (preserveComments) {
+        return libraryLoader.loadLibrary(DART_MIRRORS)
+            .then((LibraryElement libraryElement) {
+          documentClass = libraryElement.find('Comment');
+        });
+      }
+    }).then((_) => backend.onLibrariesLoaded(loadedLibraries));
   }
 
   Element findRequiredElement(LibraryElement library, String name) {
@@ -1016,9 +1153,7 @@
     }
   }
 
-  Future<LibraryElement> scanBuiltinLibrary(String filename);
-
-  void initializeSpecialClasses() {
+  void initializeCoreClasses() {
     final List missingCoreClasses = [];
     ClassElement lookupCoreClass(String name) {
       ClassElement result = coreLibrary.find(name);
@@ -1049,7 +1184,9 @@
     // TODO(ahe): It is possible that we have to require the presence
     // of Symbol as we change how we implement noSuchMethod.
     symbolClass = lookupCoreClass('Symbol');
+  }
 
+  void initializeHelperClasses() {
     final List missingHelperClasses = [];
     ClassElement lookupHelperClass(String name) {
       ClassElement result = jsHelperLibrary.find(name);
@@ -1066,14 +1203,6 @@
           'dart:_js_helper library does not contain required classes: '
           '$missingHelperClasses');
     }
-
-    if (types == null) {
-      types = new Types(this);
-    }
-    backend.initializeHelperClasses();
-
-    proxyConstant =
-        resolver.constantCompiler.compileConstant(coreLibrary.find('proxy'));
   }
 
   Element _unnamedListConstructor;
@@ -1094,40 +1223,6 @@
         listClass.lookupConstructor(callConstructor);
   }
 
-  Future scanBuiltinLibraries() {
-    return scanBuiltinLibrary('_js_helper').then((LibraryElement library) {
-      jsHelperLibrary = library;
-      return scanBuiltinLibrary('_interceptors');
-    }).then((LibraryElement library) {
-      interceptorsLibrary = library;
-
-      assertMethod = jsHelperLibrary.find('assertHelper');
-      identicalFunction = coreLibrary.find('identical');
-
-      initializeSpecialClasses();
-
-      functionClass.ensureResolved(this);
-      functionApplyMethod =
-          functionClass.lookupLocalMember('apply');
-      jsInvocationMirrorClass.ensureResolved(this);
-      invokeOnMethod = jsInvocationMirrorClass.lookupLocalMember(INVOKE_ON);
-
-      if (preserveComments) {
-        var uri = new Uri(scheme: 'dart', path: 'mirrors');
-        return libraryLoader.loadLibrary(uri, null, uri).then(
-            (LibraryElement libraryElement) {
-          documentClass = libraryElement.find('Comment');
-        });
-      }
-    });
-  }
-
-  void importHelperLibrary(LibraryElement library) {
-    if (jsHelperLibrary != null) {
-      libraryLoader.importLibrary(library, jsHelperLibrary, null);
-    }
-  }
-
   /**
    * Get an [Uri] pointing to a patch for the dart: library with
    * the given path. Returns null if there is no patch.
@@ -1144,11 +1239,11 @@
     TypedSelector.canonicalizedValues.clear();
 
     assert(uri != null || analyzeOnly);
-    return scanBuiltinLibraries().then((_) {
+    return new Future.sync(() {
       if (librariesToAnalyzeWhenRun != null) {
         return Future.forEach(librariesToAnalyzeWhenRun, (libraryUri) {
           log('Analyzing $libraryUri ($buildId)');
-          return libraryLoader.loadLibrary(libraryUri, null, libraryUri);
+          return libraryLoader.loadLibrary(libraryUri);
         });
       }
     }).then((_) {
@@ -1158,13 +1253,16 @@
         } else {
           log('Compiling $uri ($buildId)');
         }
-        return libraryLoader.loadLibrary(uri, null, uri)
-            .then((LibraryElement library) {
+        return libraryLoader.loadLibrary(uri).then((LibraryElement library) {
           mainApp = library;
         });
       }
     }).then((_) {
-      compileLoadedLibraries();
+      if (!compilationFailed) {
+        // TODO(johnniwinther): Reenable analysis of programs with load failures
+        // when these are handled as erroneous libraries/compilation units.
+        compileLoadedLibraries();
+      }
     });
   }
 
@@ -1188,7 +1286,7 @@
                        "library."});
         }
       } else {
-        if (main.isErroneous) {
+        if (main.isErroneous && main.isSynthesized) {
           reportFatalError(main, MessageKind.GENERIC,
               {'text': "Cannot determine which '$MAIN' to use."});
         } else if (!main.isFunction) {
@@ -1222,6 +1320,8 @@
         log('Enqueuing $uri');
         fullyEnqueueLibrary(lib, enqueuer.resolution);
       });
+    } else if (analyzeMain && mainApp != null) {
+      fullyEnqueueLibrary(mainApp, enqueuer.resolution);
     }
     // Elements required by enqueueHelpers are global dependencies
     // that are not pulled in by a particular element.
@@ -1376,7 +1476,7 @@
       });
     }
     if (!REPORT_EXCESS_RESOLUTION) return;
-    var resolved = new Set.from(enqueuer.resolution.resolvedElements.keys);
+    var resolved = new Set.from(enqueuer.resolution.resolvedElements);
     for (Element e in enqueuer.codegen.generatedCode.keys) {
       resolved.remove(e);
     }
@@ -1408,7 +1508,7 @@
     }
   }
 
-  TreeElements analyzeElement(Element element) {
+  void analyzeElement(Element element) {
     assert(invariant(element,
            element.impliesType ||
            element.isField ||
@@ -1421,23 +1521,23 @@
         message: 'Element $element is not analyzable.'));
     assert(invariant(element, element.isDeclaration));
     ResolutionEnqueuer world = enqueuer.resolution;
-    TreeElements elements = world.getCachedElements(element);
-    if (elements != null) return elements;
+    if (world.hasBeenResolved(element)) return;
     assert(parser != null);
     Node tree = parser.parse(element);
     assert(invariant(element, !element.isSynthesized || tree == null));
     if (tree != null) validator.validate(tree);
-    elements = resolver.resolve(element);
-    if (tree != null && elements != null && !analyzeSignaturesOnly &&
-        !suppressWarnings) {
-      // Only analyze nodes with a corresponding [TreeElements].
-      checker.check(elements);
+    TreeElements elements = resolver.resolve(element);
+    if (elements != null) {
+      if (tree != null && !analyzeSignaturesOnly &&
+          !suppressWarnings) {
+        // Only analyze nodes with a corresponding [TreeElements].
+        checker.check(elements);
+      }
+      world.registerResolvedElement(element);
     }
-    world.resolvedElements[element] = elements;
-    return elements;
   }
 
-  TreeElements analyze(ResolutionWorkItem work, ResolutionEnqueuer world) {
+  void analyze(ResolutionWorkItem work, ResolutionEnqueuer world) {
     assert(invariant(work.element, identical(world, enqueuer.resolution)));
     assert(invariant(work.element, !work.isAnalyzed(),
         message: 'Element ${work.element} has already been analyzed'));
@@ -1450,12 +1550,10 @@
         progress.reset();
       }
     }
-    Element element = work.element;
-    TreeElements result = world.getCachedElements(element);
-    if (result != null) return result;
-    result = analyzeElement(element);
-    backend.onElementResolved(element, result);
-    return result;
+    AstElement element = work.element;
+    if (world.hasBeenResolved(element)) return;
+    analyzeElement(element);
+    backend.onElementResolved(element, element.resolvedAst.elements);
   }
 
   void codegen(CodegenWorkItem work, CodegenEnqueuer world) {
@@ -1574,10 +1672,11 @@
   }
 
   SourceSpan spanFromElement(Element element) {
-    if (Elements.isErroneousElement(element)) {
+    while (element != null && element.isSynthesized) {
       element = element.enclosingElement;
     }
-    if (element.position == null &&
+    if (element != null &&
+        element.position == null &&
         !element.isLibrary &&
         !element.isCompilationUnit) {
       // Sometimes, the backend fakes up elements that have no
@@ -1794,6 +1893,7 @@
 class CompilerTask {
   final Compiler compiler;
   final Stopwatch watch;
+  UserTag profilerTag;
 
   CompilerTask(Compiler compiler)
       : this.compiler = compiler,
@@ -1802,17 +1902,25 @@
   String get name => 'Unknown task';
   int get timing => (watch != null) ? watch.elapsedMilliseconds : 0;
 
+  UserTag getProfilerTag() {
+    if (profilerTag == null) profilerTag = new UserTag(name);
+    return profilerTag;
+  }
+
   measure(action()) {
+    // In verbose mode when watch != null.
     if (watch == null) return action();
     CompilerTask previous = compiler.measuredTask;
     if (identical(this, previous)) return action();
     compiler.measuredTask = this;
     if (previous != null) previous.watch.stop();
     watch.start();
+    UserTag oldTag = getProfilerTag().makeCurrent();
     try {
       return action();
     } finally {
       watch.stop();
+      oldTag.makeCurrent();
       if (previous != null) previous.watch.start();
       compiler.measuredTask = previous;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system.dart b/sdk/lib/_internal/compiler/implementation/constant_system.dart
index 4a10d40..dd92ffe 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system.dart
@@ -53,6 +53,8 @@
   Constant createString(DartString string);
   Constant createBool(bool value);
   Constant createNull();
+  Constant createMap(Compiler compiler, InterfaceType type,
+                     List<Constant> keys, List<Constant> values);
 
   // We need to special case the subtype check for JavaScript constant
   // system because an int is a double at runtime.
diff --git a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
index df33125..19e084e 100644
--- a/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
+++ b/sdk/lib/_internal/compiler/implementation/constant_system_dart.dart
@@ -352,6 +352,10 @@
   StringConstant createString(DartString string) => new StringConstant(string);
   BoolConstant createBool(bool value) => new BoolConstant(value);
   NullConstant createNull() => new NullConstant();
+  MapConstant createMap(Compiler compiler, InterfaceType type,
+                        List<Constant> keys, List<Constant> values) {
+    return new MapConstant(type, keys, values);
+  }
 
   bool isInt(Constant constant) => constant.isInt;
   bool isDouble(Constant constant) => constant.isDouble;
diff --git a/sdk/lib/_internal/compiler/implementation/constants.dart b/sdk/lib/_internal/compiler/implementation/constants.dart
index d0b9d14..37da003 100644
--- a/sdk/lib/_internal/compiler/implementation/constants.dart
+++ b/sdk/lib/_internal/compiler/implementation/constants.dart
@@ -342,7 +342,7 @@
   accept(ConstantVisitor visitor) => visitor.visitString(this);
 
   String toString() {
-    return 'StringConstant(${Error.safeToString(value.slowToString())})';
+    return 'StringConstant("${value.slowToString()}")';
   }
 }
 
@@ -378,7 +378,7 @@
 
   accept(ConstantVisitor visitor) => visitor.visitType(this);
 
-  String toString() => 'TypeConstant(${Error.safeToString(representedType)})';
+  String toString() => 'TypeConstant(${representedType})';
 }
 
 class ListConstant extends ObjectConstant {
@@ -428,7 +428,7 @@
     sb.write('ListConstant([');
     for (int i = 0 ; i < entries.length ; i++) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(entries[i]));
+      sb.write(entries[i]);
     }
     sb.write('])');
     return sb.toString();
@@ -436,40 +436,28 @@
 }
 
 class MapConstant extends ObjectConstant {
-  /**
-   * The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
-   * object. It would change the prototype chain.
-   */
-  static const LiteralDartString PROTO_PROPERTY =
-      const LiteralDartString("__proto__");
-
-  /** The dart class implementing constant map literals. */
-  static const String DART_CLASS = "ConstantMap";
-  static const String DART_STRING_CLASS = "ConstantStringMap";
-  static const String DART_PROTO_CLASS = "ConstantProtoMap";
-  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
-  static const String LENGTH_NAME = "length";
-  static const String JS_OBJECT_NAME = "_jsObject";
-  static const String KEYS_NAME = "_keys";
-  static const String PROTO_VALUE = "_protoValue";
-  static const String JS_DATA_NAME = "_jsData";
-
-  final ListConstant keys;
+  final List<Constant> keys;
   final List<Constant> values;
-  final Constant protoValue;
   final int hashCode;
-  final bool onlyStringKeys;
 
-  MapConstant(DartType type, this.keys, List<Constant> values, this.protoValue,
-              this.onlyStringKeys)
-      : this.values = values,
-        this.hashCode = computeHash(type, values),
-        super(type);
+  MapConstant(DartType type, List<Constant> keys, List<Constant> values)
+      : this.keys = keys,
+        this.values = values,
+        this.hashCode = computeHash(type, keys, values),
+        super(type) {
+    assert(keys.length == values.length);
+  }
+
   bool get isMap => true;
 
-  static int computeHash(DartType type, List<Constant> values) {
+  static int computeHash(DartType type,
+                         List<Constant> keys,
+                         List<Constant> values) {
     // TODO(floitsch): create a better hash.
     int hash = 0;
+    for (Constant key in keys) {
+      hash ^= key.hashCode;
+    }
     for (Constant value in values) {
       hash ^= value.hashCode;
     }
@@ -486,8 +474,9 @@
     MapConstant otherMap = other;
     if (hashCode != otherMap.hashCode) return false;
     if (type != other.type) return false;
-    if (keys != otherMap.keys) return false;
-    for (int i = 0; i < values.length; i++) {
+    if (length != other.length) return false;
+    for (int i = 0; i < length; i++) {
+      if (keys[i] != otherMap.keys[i]) return false;
       if (values[i] != otherMap.values[i]) return false;
     }
     return true;
@@ -495,13 +484,7 @@
 
   List<Constant> getDependencies() {
     List<Constant> result = <Constant>[];
-    if (onlyStringKeys) {
-      result.add(keys);
-    } else {
-      // Add the keys individually to avoid generating a unused list constant
-      // for the keys.
-      result.addAll(keys.entries);
-    }
+    result.addAll(keys);
     result.addAll(values);
     return result;
   }
@@ -513,11 +496,11 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     sb.write('MapConstant({');
-    for (int i = 0 ; i < keys.entries.length ; i++) {
+    for (int i = 0; i < length; i++) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(keys.entries[i]));
+      sb.write(keys[i]);
       sb.write(':');
-      sb.write(Error.safeToString(values[i]));
+      sb.write(values[i]);
     }
     sb.write('})');
     return sb.toString();
@@ -586,7 +569,8 @@
   final List<Constant> fields;
   final int hashCode;
 
-  ConstructedConstant(DartType type, List<Constant> fields)
+  ConstructedConstant(DartType type, List<Constant> fields,
+      {this.isLiteralSymbol: false})
     : this.fields = fields,
       hashCode = computeHash(type, fields),
       super(type) {
@@ -594,6 +578,9 @@
   }
   bool get isConstructedObject => true;
 
+  /// True if this constant is constructed as a literal symbol.
+  final bool isLiteralSymbol;
+
   static int computeHash(DartType type, List<Constant> fields) {
     // TODO(floitsch): create a better hash.
     int hash = 0;
@@ -646,9 +633,9 @@
     int i = 0;
     fieldElements.forEach((Element field, Constant value) {
       if (i > 0) sb.write(',');
-      sb.write(Error.safeToString(field.name));
+      sb.write(field.name);
       sb.write('=');
-      sb.write(Error.safeToString(value));
+      sb.write(value);
       i++;
     });
     sb.write('))');
diff --git a/sdk/lib/_internal/compiler/implementation/dart2js.dart b/sdk/lib/_internal/compiler/implementation/dart2js.dart
index 1632c48..7fe9a7a 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2js.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2js.dart
@@ -54,11 +54,14 @@
  * For example, in ['--out=fisk.js'] and ['-ohest.js'], the parameters
  * are ['fisk.js'] and ['hest.js'], respectively.
  */
-String extractParameter(String argument) {
+String extractParameter(String argument, {bool isOptionalArgument: false}) {
   // m[0] is the entire match (which will be equal to argument). m[1]
   // is something like "-o" or "--out=", and m[2] is the parameter.
   Match m = new RegExp('^(-[a-z]|--.+=)(.*)').firstMatch(argument);
-  if (m == null) helpAndFail('Unknown option "$argument".');
+  if (m == null) {
+    if (isOptionalArgument) return null;
+    helpAndFail('Unknown option "$argument".');
+  }
   return m[2];
 }
 
@@ -73,7 +76,7 @@
   for (OptionHandler handler in handlers) {
     patterns.add(handler.pattern);
   }
-  var pattern = new RegExp('^(${patterns.join(")\$|(")})\$');
+  var pattern = new RegExp('^(${patterns.join(")\$|^(")})\$');
 
   Iterator<String> arguments = argv.iterator;
   OUTER: while (arguments.moveNext()) {
@@ -224,6 +227,14 @@
     passThrough('--categories=${categories.join(",")}');
   }
 
+  void handleThrowOnError(String argument) {
+    diagnosticHandler.throwOnError = true;
+    String parameter = extractParameter(argument, isOptionalArgument: true);
+    if (parameter != null) {
+      diagnosticHandler.throwOnErrorCount = int.parse(parameter);
+    }
+  }
+
   handleShortOptions(String argument) {
     var shortOptions = argument.substring(1).split("");
     for (var shortOption in shortOptions) {
@@ -261,8 +272,7 @@
   List<String> arguments = <String>[];
   List<OptionHandler> handlers = <OptionHandler>[
     new OptionHandler('-[chvm?]+', handleShortOptions),
-    new OptionHandler('--throw-on-error',
-                      (_) => diagnosticHandler.throwOnError = true),
+    new OptionHandler('--throw-on-error(?:=[0-9]+)?', handleThrowOnError),
     new OptionHandler('--suppress-warnings', (_) {
       diagnosticHandler.showWarnings = false;
       passThrough('--suppress-warnings');
@@ -407,9 +417,9 @@
             " \"Content-Security-Policy: script-src 'self'\"");
       } else if (extension == 'js.map' || extension == 'dart.map') {
         uri = sourceMapOut;
-      } else if (extension == 'info.html') {
+      } else if (extension == 'info.html' || extension == "info.json") {
         String outName = out.path.substring(out.path.lastIndexOf('/') + 1);
-        uri = out.resolve('${outName}.$extension');
+        uri = out.resolve('$outName.$extension');
       } else {
         fail('Unknown extension: $extension');
       }
diff --git a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
index 1a6f5f4..4191cd7 100644
--- a/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart2jslib.dart
@@ -7,6 +7,9 @@
 import 'dart:async';
 import 'dart:collection' show Queue;
 
+import 'dart:profiler' show
+    UserTag;
+
 import 'closure.dart' as closureMapping;
 import 'dart_backend/dart_backend.dart' as dart_backend;
 import 'dart_types.dart';
@@ -22,6 +25,9 @@
          DeferredLoaderGetterElementX;
 import 'helpers/helpers.dart';
 import 'js_backend/js_backend.dart' as js_backend;
+import 'library_loader.dart'
+    show LibraryLoader,
+         LibraryLoaderTask;
 import 'native_handler.dart' as native;
 import 'scanner/scannerlib.dart';
 import 'ssa/ssa.dart';
@@ -41,6 +47,7 @@
 import 'mirrors_used.dart' show MirrorUsageAnalyzerTask;
 import 'dump_info.dart';
 import 'tracer.dart' show Tracer;
+import 'cache_strategy.dart';
 
 export 'resolution/resolution.dart' show TreeElements, TreeElementMapping;
 export 'scanner/scannerlib.dart' show isUserDefinableOperator,
@@ -63,7 +70,6 @@
 part 'constant_system_dart.dart';
 part 'diagnostic_listener.dart';
 part 'enqueue.dart';
-part 'library_loader.dart';
 part 'resolved_visitor.dart';
 part 'script.dart';
 part 'tree_validator.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
index cd15e94..ae356cb 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/backend.dart
@@ -11,7 +11,10 @@
   final Node ast;
   final TreeElements treeElements;
 
-  ElementAst(this.ast, this.treeElements);
+  ElementAst(AstElement element)
+      : this.internal(element.resolvedAst.node, element.resolvedAst.elements);
+
+  ElementAst.internal(this.ast, this.treeElements);
 }
 
 class DartBackend extends Backend {
@@ -42,7 +45,7 @@
   /// field is set.
   Element mirrorHelperSymbolsMap;
 
-  Map<Element, TreeElements> get resolvedElements =>
+  Iterable<Element> get resolvedElements =>
       compiler.enqueuer.resolution.resolvedElements;
 
   ConstantSystem get constantSystem {
@@ -87,11 +90,11 @@
       if (type is InterfaceType) {
         InterfaceType interfaceType = type;
         // Check all type arguments.
-        workQueue.addAll(interfaceType.typeArguments.toList());
+        interfaceType.typeArguments.forEach(workQueue.add);
         ClassElement element = type.element;
         // Check all supertypes.
         if (element.allSupertypes != null) {
-          workQueue.addAll(element.allSupertypes.toList());
+          element.allSupertypes.forEach(workQueue.add);
         }
       }
     }
@@ -137,12 +140,17 @@
 
   void codegen(CodegenWorkItem work) { }
 
-  bool isUserLibrary(LibraryElement lib) {
-    final INTERNAL_HELPERS = [
-      compiler.jsHelperLibrary,
-      compiler.interceptorsLibrary,
-    ];
-    return INTERNAL_HELPERS.indexOf(lib) == -1 && !lib.isPlatformLibrary;
+  bool isUserLibrary(LibraryElement lib) => !lib.isPlatformLibrary;
+
+  /**
+   * Tells whether we should output given element. Corelib classes like
+   * Object should not be in the resulting code.
+   */
+  bool shouldOutput(Element element) {
+    return (isUserLibrary(element.library) &&
+            !element.isSynthesized &&
+            element is !AbstractFieldElement)
+        || element.library == mirrorHelperLibrary;
   }
 
   void assembleProgram() {
@@ -186,10 +194,10 @@
     }
     // As of now names of named optionals are not renamed. Therefore add all
     // field names used as named optionals into [fixedMemberNames].
-    for (final element in resolvedElements.keys) {
+    for (final element in resolvedElements) {
       if (!element.isConstructor) continue;
       Link<Element> optionalParameters =
-          element.computeSignature(compiler).optionalParameters;
+          element.functionSignature.optionalParameters;
       for (final optional in optionalParameters) {
         if (optional.kind != ElementKind.FIELD_PARAMETER) continue;
         fixedMemberNames.add(optional.name);
@@ -210,20 +218,9 @@
       useMirrorHelperLibrary = false;
     }
 
-    /**
-     * Tells whether we should output given element. Corelib classes like
-     * Object should not be in the resulting code.
-     */
-    bool shouldOutput(Element element) {
-      return (isUserLibrary(element.library)
-          && !element.isSynthesized
-          && element is !AbstractFieldElement)
-          || element.library == mirrorHelperLibrary;
-    }
-
     final elementAsts = new Map<Element, ElementAst>();
 
-    ElementAst parse(AstElement element, TreeElements treeElements) {
+    ElementAst parse(AstElement element) {
       Node node;
       if (!compiler.irBuilder.hasIr(element)) {
         node = element.node;
@@ -234,14 +231,16 @@
         assert(definition != null);
         compiler.tracer.traceCompilation(element.name, null, compiler);
         compiler.tracer.traceGraph('Tree builder', definition);
-        treeElements = new TreeElementMapping(element);
+        TreeElementMapping treeElements = new TreeElementMapping(element);
         new tree.StatementRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Statement rewriter', definition);
+        new tree.LoopRewriter().rewrite(definition);
+        compiler.tracer.traceGraph('Loop rewriter', definition);
         new tree.LogicalRewriter().rewrite(definition);
         compiler.tracer.traceGraph('Logical rewriter', definition);
         node = dart_codegen.emit(element, treeElements, definition);
       }
-      return new ElementAst(node, treeElements);
+      return new ElementAst(element);
     }
 
     Set<Element> topLevelElements = new Set<Element>();
@@ -269,16 +268,13 @@
     }
 
     addClass(ClassElement classElement) {
-      addTopLevel(classElement,
-                  new ElementAst(classElement.node,
-                                 classElement.treeElements));
+      addTopLevel(classElement, new ElementAst(classElement));
       classMembers.putIfAbsent(classElement, () => new Set());
     }
 
     newTypedefElementCallback = (TypedefElement element) {
       if (!shouldOutput(element)) return;
-      addTopLevel(element, new ElementAst(element.node,
-                                          element.treeElements));
+      addTopLevel(element, new ElementAst(element));
     };
     newClassElementCallback = (ClassElement classElement) {
       if (!shouldOutput(classElement)) return;
@@ -289,9 +285,12 @@
         (ClassElement classElement) {
       if (shouldOutput(classElement)) addClass(classElement);
     });
-    resolvedElements.forEach((element, treeElements) {
-      if (!shouldOutput(element) || treeElements == null) return;
-      ElementAst elementAst = parse(element, treeElements);
+    resolvedElements.forEach((element) {
+      if (!shouldOutput(element) ||
+          !compiler.enqueuer.resolution.hasBeenResolved(element)) {
+        return;
+      }
+      ElementAst elementAst = parse(element);
 
       if (element.isMember) {
         ClassElement enclosingClass = element.enclosingClass;
@@ -354,7 +353,7 @@
           null, Modifiers.EMPTY, null, null);
 
       elementAsts[constructor] =
-          new ElementAst(node, new TreeElementMapping(null));
+          new ElementAst.internal(node, new TreeElementMapping(null));
     }
 
     // Create all necessary placeholders.
@@ -459,10 +458,13 @@
 
   log(String message) => compiler.log('[DartBackend] $message');
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (useMirrorHelperLibrary && library == compiler.mirrorsLibrary) {
-      return compiler.scanBuiltinLibrary(
-          MirrorRenamer.MIRROR_HELPER_LIBRARY_NAME).
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    if (useMirrorHelperLibrary &&
+        loadedLibraries.containsKey(Compiler.DART_MIRRORS)) {
+      return compiler.libraryLoader.loadLibrary(
+          compiler.translateResolvedUri(
+              loadedLibraries[Compiler.DART_MIRRORS],
+              MirrorRenamer.DART_MIRROR_HELPER, null)).
           then((LibraryElement element) {
         mirrorHelperLibrary = element;
         mirrorHelperGetNameFunction = mirrorHelperLibrary.find(
@@ -474,9 +476,7 @@
     return new Future.value();
   }
 
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {
+  void onTypeLiteral(DartType type, Registry registry) {
     if (type.isInterfaceType) {
       usedTypeLiterals.add(type.element);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
index 8738ec6..45c11e1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_codegen.dart
@@ -28,8 +28,12 @@
   /// Variables to be hoisted at the top of the current function.
   List<VariableDeclaration> variables;
 
-  /// Set of variables that have had their declaration inserted in [variables].
-  Set<tree.Variable> seenVariables;
+  /// Maps variables to their name.
+  /// These variables have had their declaration inserted in [variables].
+  Map<tree.Variable, String> variableNames;
+
+  /// Variable names that have already been used. Used to avoid name clashes.
+  Set<String> usedVariableNames;
 
   /// Statements emitted by the most recent call to [visitStatement].
   List<Statement> statementBuffer;
@@ -53,8 +57,8 @@
     functionElement = element;
     variables = <VariableDeclaration>[];
     statementBuffer = <Statement>[];
-    seenVariables = new Set<tree.Variable>();
-    tree.Variable.counter = 0;
+    variableNames = <tree.Variable, String>{};
+    usedVariableNames = new Set<String>();
     variableList = new modelx.VariableList(tree.Modifiers.EMPTY);
     fallthrough = null;
     usedLabels = new Set<tree.Label>();
@@ -74,7 +78,8 @@
     statementBuffer = null;
     functionElement = null;
     variableList = null;
-    seenVariables = null;
+    variableNames = null;
+    usedVariableNames = null;
     usedLabels = null;
 
     return new FunctionExpression(
@@ -96,12 +101,28 @@
     }
   }
 
+  Parameter emitParameterFromElement(ParameterElement element, [String name]) {
+    if (name == null) {
+      name = element.name;
+    }
+    if (element.functionSignature != null) {
+      FunctionSignature signature = element.functionSignature;
+      TypeAnnotation returnType = emitOptionalType(signature.type.returnType);
+      Parameters innerParameters = new Parameters(
+          signature.requiredParameters.mapToList(emitParameterFromElement),
+          signature.optionalParameters.mapToList(emitParameterFromElement),
+          signature.optionalParametersAreNamed);
+      return new Parameter.function(name, returnType, innerParameters)
+                 ..element = element;
+    } else {
+      TypeAnnotation type = emitOptionalType(element.type);
+      return new Parameter(name, type:type)
+                 ..element = element;
+    }
+  }
+
   Parameter emitParameter(tree.Variable param) {
-    seenVariables.add(param);
-    ParameterElement element = param.element;
-    TypeAnnotation type = emitOptionalType(element.type);
-    return new Parameter(element.name, type:type)
-               ..element = element;
+    return emitParameterFromElement(param.element, getVariableName(param));
   }
 
   Parameters emitParameters(List<tree.Variable> params) {
@@ -174,20 +195,40 @@
     visitStatement(stmt.next);
   }
 
-  void visitAssign(tree.Assign stmt) {
-    // Synthesize an element for the variable, if necessary.
-    if (stmt.variable.element == null) {
-      stmt.variable.element = new modelx.VariableElementX(
-          stmt.variable.name,
+  /// Generates a name for the given variable and synthesizes an element for it,
+  /// if necessary.
+  String getVariableName(tree.Variable variable) {
+    String name = variableNames[variable];
+    if (name != null) {
+      return name;
+    }
+    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) {
+      variable.element = new modelx.VariableElementX(
+          name,
           ElementKind.VARIABLE,
           functionElement,
           variableList,
           null);
     }
-    if (seenVariables.add(stmt.variable)) {
-      variables.add(new VariableDeclaration(stmt.variable.name)
-                            ..element = stmt.variable.element);
+    if (variable.element is! ParameterElement) {
+      variables.add(new VariableDeclaration(name)
+                        ..element = variable.element);
     }
+    return name;
+  }
+
+  void visitAssign(tree.Assign stmt) {
+    String name = getVariableName(stmt.variable);
     statementBuffer.add(new ExpressionStatement(makeAssignment(
         visitVariable(stmt.variable),
         visitExpression(stmt.definition))));
@@ -212,7 +253,15 @@
   }
 
   void visitContinue(tree.Continue stmt) {
-    statementBuffer.add(new Continue(stmt.target.name));
+    tree.Statement fall = 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));
+    }
   }
 
   void visitIf(tree.If stmt) {
@@ -227,28 +276,72 @@
     statementBuffer = savedBuffer;
   }
 
-  void visitWhile(tree.While stmt) {
-    Expression condition = new Literal(new dart2js.BoolConstant(true));
+  void visitWhileTrue(tree.WhileTrue stmt) {
+    List<Expression> updates = stmt.updates.reversed
+                                           .map(visitExpression)
+                                           .toList(growable:false);
+
     List<Statement> savedBuffer = statementBuffer;
-    statementBuffer = <Statement>[];
     tree.Statement savedFallthrough = fallthrough;
-    fallthrough = stmt.body;
+    statementBuffer = <Statement>[];
+    fallthrough = stmt;
+
     visitStatement(stmt.body);
-    savedBuffer.add(
-        new LabeledStatement(
-            stmt.label.name,
-            new While(condition, new Block(statementBuffer))));
+    Statement body = new Block(statementBuffer);
+    Statement statement = new For(null, null, updates, body);
+    if (usedLabels.remove(stmt.label.name)) {
+      statement = new LabeledStatement(stmt.label.name, statement);
+    }
+    savedBuffer.add(statement);
+
     statementBuffer = savedBuffer;
     fallthrough = savedFallthrough;
   }
 
+  void visitWhileCondition(tree.WhileCondition stmt) {
+    Expression condition = visitExpression(stmt.condition);
+    List<Expression> updates = stmt.updates.reversed
+                                           .map(visitExpression)
+                                           .toList(growable:false);
+
+    List<Statement> savedBuffer = statementBuffer;
+    tree.Statement savedFallthrough = fallthrough;
+    statementBuffer = <Statement>[];
+    fallthrough = stmt;
+
+    visitStatement(stmt.body);
+    Statement body = new Block(statementBuffer);
+    Statement statement;
+    if (updates.isEmpty) {
+      // while(E) is the same as for(;E;), but the former is nicer
+      statement = new While(condition, body);
+    } else {
+      statement = new For(null, condition, updates, body);
+    }
+    if (usedLabels.remove(stmt.label.name)) {
+      statement = new LabeledStatement(stmt.label.name, statement);
+    }
+    savedBuffer.add(statement);
+
+    statementBuffer = savedBuffer;
+    fallthrough = savedFallthrough;
+
+    visitStatement(stmt.next);
+  }
+
   Expression visitConstant(tree.Constant exp) {
     return emitConstant(exp.value);
   }
 
+  Expression visitThis(tree.This exp) {
+    return new This();
+  }
+
   Expression visitLiteralList(tree.LiteralList exp) {
     return new LiteralList(
-        exp.values.map(visitExpression).toList(growable: false));
+        exp.values.map(visitExpression).toList(growable: false),
+        isConst: exp.constant != null,
+        typeArgument: emitOptionalType(exp.type.typeArguments.single));
   }
 
   Expression visitLiteralMap(tree.LiteralMap exp) {
@@ -256,7 +349,18 @@
         exp.values.length,
         (i) => new LiteralMapEntry(visitExpression(exp.keys[i]),
                                    visitExpression(exp.values[i])));
-    return new LiteralMap(entries);
+    List<TypeAnnotation> typeArguments = exp.type.treatAsRaw
+        ? null
+        : exp.type.typeArguments.mapToList(emitType);
+    return new LiteralMap(entries,
+                          isConst: exp.constant != null,
+                          typeArguments: typeArguments);
+  }
+
+  Expression visitTypeOperator(tree.TypeOperator exp) {
+    return new TypeOperator(visitExpression(exp.receiver),
+                            exp.operator,
+                            emitType(exp.type));
   }
 
   List<Argument> emitArguments(tree.Invoke exp) {
@@ -272,9 +376,23 @@
   }
 
   Expression visitInvokeStatic(tree.InvokeStatic exp) {
-    List<Argument> args = emitArguments(exp);
-    return new CallStatic(null, exp.target.name, args)
-               ..element = exp.target;
+    switch (exp.selector.kind) {
+      case SelectorKind.GETTER:
+        return new Identifier(exp.target.name)..element = exp.target;
+
+      case SelectorKind.SETTER:
+        return new Assignment(
+            new Identifier(exp.target.name)..element = exp.target,
+            '=',
+            visitExpression(exp.arguments[0]));
+
+      case SelectorKind.CALL:
+        return new CallStatic(null, exp.target.name, emitArguments(exp))
+                   ..element = exp.target;
+
+      default:
+        throw "Unexpected selector kind: ${exp.selector.kind}";
+    }
   }
 
   Expression visitInvokeMethod(tree.InvokeMethod exp) {
@@ -321,7 +439,10 @@
     List args = emitArguments(exp);
     FunctionElement constructor = exp.target;
     String name = constructor.name.isEmpty ? null : constructor.name;
-    return new CallNew(emitType(exp.type), args, constructorName: name)
+    return new CallNew(emitType(exp.type),
+                       args,
+                       constructorName: name,
+                       isConst: exp.constant != null)
                ..constructor = constructor
                ..dartType = exp.type;
   }
@@ -349,7 +470,7 @@
   }
 
   Expression visitVariable(tree.Variable exp) {
-    return new Identifier(exp.name)
+    return new Identifier(getVariableName(exp))
                ..element = exp.element;
   }
 
@@ -357,8 +478,7 @@
     if (type is GenericType) { // TODO(asgerf): faster Link.map
       return new TypeAnnotation(
           type.element.name,
-          type.typeArguments.toList(growable:false)
-              .map(emitType).toList(growable:false))
+          type.typeArguments.mapToList(emitType, growable:false))
           ..dartType = type;
     } else if (type is VoidType) {
       return new TypeAnnotation('void')
@@ -366,6 +486,13 @@
     } else if (type is TypeVariableType) {
       return new TypeAnnotation(type.name)
           ..dartType = type;
+    } else if (type is DynamicType) {
+      return new TypeAnnotation("dynamic")
+          ..dartType = type;
+    } else if (type is MalformedType) {
+      // treat malformed types as dynamic
+      return new TypeAnnotation("dynamic")
+          ..dartType = const DynamicType();
     } else {
       throw "Unsupported type annotation: $type";
     }
@@ -373,7 +500,7 @@
 
   /// Like [emitType] except the dynamic type is converted to null.
   TypeAnnotation emitOptionalType(DartType type) {
-    if (type.isDynamic) {
+    if (type.treatAsDynamic) {
       return null;
     } else {
       return emitType(type);
@@ -383,18 +510,18 @@
   Expression emitConstant(dart2js.Constant constant) {
     if (constant is dart2js.PrimitiveConstant) {
       return new Literal(constant);
-    } else if (constant is dart2js.ListConstant) {
-      return new LiteralList(
-          constant.entries.map(emitConstant).toList(growable: false),
-          isConst: true);
-    } else if (constant is dart2js.MapConstant) {
-      List<LiteralMapEntry> entries = <LiteralMapEntry>[];
-      for (var i = 0; i < constant.keys.length; i++) {
-        entries.add(new LiteralMapEntry(
-            emitConstant(constant.keys.entries[i]),
-            emitConstant(constant.values[i])));
-      }
-      return new LiteralMap(entries, isConst: true);
+    } else if (constant is dart2js.ConstructedConstant &&
+               constant.isLiteralSymbol) {
+      dart2js.StringConstant nameConstant = constant.fields[0];
+      String nameString = nameConstant.value.slowToString();
+      return new LiteralSymbol(nameString);
+    } else if (constant is dart2js.FunctionConstant) {
+      return new Identifier(constant.element.name)
+                 ..element = constant.element;
+    } else if (constant is dart2js.TypeConstant) {
+      GenericType type = constant.representedType;
+      return new LiteralType(type.name)
+                 ..element = type.element;
     } else {
       throw "Unsupported constant: $constant";
     }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
index c69bbd4d..57f6096 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart
@@ -330,6 +330,10 @@
 /// The unparser does not concern itself with scoping rules, and it is the
 /// responsibility of the AST creator to ensure that the identifier resolves
 /// to the proper definition.
+/// For the time being, this class is also used to reference static fields and
+/// top-level variables that are qualified with a class and/or library name,
+/// assuming the [element] is set. This is likely to change when the old backend
+/// is replaced.
 class Identifier extends Expression {
   final String name;
 
@@ -380,6 +384,17 @@
   LiteralSymbol(this.id);
 }
 
+/// A type literal. This is distinct from [Identifier] since the unparser
+/// needs to this distinguish a static invocation from a method invocation
+/// on a type literal.
+class LiteralType extends Expression {
+  final String name;
+
+  elements.TypeDeclarationElement element;
+
+  LiteralType(this.name);
+}
+
 /// StringConcat is used in place of string interpolation and juxtaposition.
 /// Semantically, each subexpression is evaluated and converted to a string
 /// by `toString()`. These string are then concatenated and returned.
@@ -455,7 +470,7 @@
   final String methodName;
   final List<Argument> arguments;
 
-  elements.FunctionElement element;
+  elements.Element element;
 
   CallStatic(this.className, this.methodName, this.arguments);
 }
@@ -579,6 +594,7 @@
 const int MULTIPLICATIVE = 13;
 const int UNARY = 14;
 const int POSTFIX_INCREMENT = 15;
+const int TYPE_LITERAL = 19;
 const int PRIMARY = 20;
 
 /// Precedence level required for the callee in a [FunctionCall].
@@ -846,6 +862,10 @@
     } else if (e is LiteralSymbol) {
       write('#');
       write(e.id); // TODO(asgerf): Do we need to escape something here?
+    } else if (e is LiteralType) {
+      withPrecedence(TYPE_LITERAL, () {
+        write(e.name);
+      });
     } else if (e is StringConcat) {
       writeStringLiteral(e);
     } else if (e is UnaryOperator) {
@@ -1235,6 +1255,17 @@
     }
   }
 
+  /// A list of string quotings that the printer may use to quote strings.
+  // Ignore multiline quotings for now. Would need to make sure that no
+  // newline (potentially prefixed by whitespace) follows the quoting.
+  // TODO(asgerf): Include multiline quotation schemes.
+  static const _QUOTINGS = const <tree.StringQuoting>[
+      const tree.StringQuoting(characters.$DQ, raw: false, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$DQ, raw: true, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$SQ, raw: false, leftQuoteLength: 1),
+      const tree.StringQuoting(characters.$SQ, raw: true, leftQuoteLength: 1),
+  ];
+
   static StringLiteralOutput analyzeStringLiteral(Expression node) {
     // TODO(asgerf): This might be a bit too expensive. Benchmark.
     // Flatten the StringConcat tree.
@@ -1277,11 +1308,7 @@
     List<int> nonRaws = <int>[];
     List<int> sqs = <int>[];
     List<int> dqs = <int>[];
-    for (tree.StringQuoting q in tree.StringQuoting.mapping) {
-      // Ignore multiline quotings for now. Encoding of line breaks is unclear.
-      // TODO(asgerf): Include multiline quotation schemes.
-      if (q.leftQuoteCharCount >= 3)
-        continue;
+    for (tree.StringQuoting q in _QUOTINGS) {
       OpenStringChunk chunk = new OpenStringChunk(null, q, getQuoteCost(q));
       int index = best.length;
       best.add(chunk);
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
index 6f71f08..6896135 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree.dart
@@ -38,7 +38,7 @@
  * The base class of [Expression]s.
  */
 abstract class Expression extends Node {
-  accept(Visitor v);
+  accept(ExpressionVisitor v);
 
   /// Temporary variable used by [StatementRewriter].
   /// If set to true, this expression has already had enclosing assignments
@@ -51,7 +51,7 @@
 abstract class Statement extends Node {
   Statement get next;
   void set next(Statement s);
-  accept(Visitor v);
+  accept(StatementVisitor v);
 }
 
 /**
@@ -70,35 +70,28 @@
     return cachedName;
   }
 
-  /// Number of [Break] statements that target this label.
+  /// Number of [Break] or [Continue] statements that target this label.
   /// The [Break] constructor will increment this automatically, but the
   /// counter must be decremented by hand when a [Break] becomes orphaned.
-  int breakCount = 0;
+  int useCount = 0;
 
-  /// The [LabeledStatement] binding this label.
-  LabeledStatement binding;
+  /// The [LabeledStatement] or [WhileTrue] binding this label.
+  JumpTarget binding;
 }
 
 /**
  * Variables are [Expression]s.
  */
 class Variable extends Expression {
-  // A counter used to generate names.  The counter is reset to 0 for each
-  // function emitted.
-  static int counter = 0;
-  static String _newName() => 'v${counter++}';
-
+  /// Element used for synthesizing a name for the variable.
+  /// Different variables may have the same element. May be null.
   Element element;
-  String cachedName;
 
-  String get name {
-    if (cachedName != null) return cachedName;
-    return cachedName = ((element == null) ? _newName() : element.name);
-  }
+  int readCount = 0;
 
   Variable(this.element);
 
-  accept(Visitor visitor) => visitor.visitVariable(this);
+  accept(ExpressionVisitor visitor) => visitor.visitVariable(this);
 }
 
 /**
@@ -110,18 +103,18 @@
 }
 
 /**
- * A call to a static target.
+ * A call to a static function or getter/setter to a static field.
  *
  * In contrast to the CPS-based IR, the arguments can be arbitrary expressions.
  */
 class InvokeStatic extends Expression implements Invoke {
-  final FunctionElement target;
+  final Element target;
   final List<Expression> arguments;
   final Selector selector;
 
   InvokeStatic(this.target, this.selector, this.arguments);
 
-  accept(Visitor visitor) => visitor.visitInvokeStatic(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeStatic(this);
 }
 
 /**
@@ -139,32 +132,35 @@
     assert(receiver != null);
   }
 
-  accept(Visitor visitor) => visitor.visitInvokeMethod(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeMethod(this);
 }
 
 /**
- * Non-const call to a factory or generative constructor.
+ * Call to a factory or generative constructor.
  */
 class InvokeConstructor extends Expression implements Invoke {
   final GenericType type;
   final FunctionElement target;
   final List<Expression> arguments;
   final Selector selector;
+  final dart2js.Constant constant;
 
-  InvokeConstructor(this.type, this.target, this.selector, this.arguments);
+  InvokeConstructor(this.type, this.target, this.selector, this.arguments,
+      [this.constant]);
 
   ClassElement get targetClass => target.enclosingElement;
 
-  accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
+  accept(ExpressionVisitor visitor) => visitor.visitInvokeConstructor(this);
 }
 
 /// Calls [toString] on each argument and concatenates the results.
 class ConcatenateStrings extends Expression {
   final List<Expression> arguments;
+  final dart2js.Constant constant;
 
-  ConcatenateStrings(this.arguments);
+  ConcatenateStrings(this.arguments, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitConcatenateStrings(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConcatenateStrings(this);
 }
 
 /**
@@ -175,24 +171,42 @@
 
   Constant(this.value);
 
-  accept(Visitor visitor) => visitor.visitConstant(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConstant(this);
+}
+
+class This extends Expression {
+  accept(Visitor visitor) => visitor.visitThis(this);
 }
 
 class LiteralList extends Expression {
+  final GenericType type;
   final List<Expression> values;
+  final dart2js.Constant constant;
 
-  LiteralList(this.values) ;
+  LiteralList(this.type, this.values, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitLiteralList(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralList(this);
 }
 
 class LiteralMap extends Expression {
+  final GenericType type;
   final List<Expression> keys;
   final List<Expression> values;
+  final dart2js.Constant constant;
 
-  LiteralMap(this.keys, this.values) ;
+  LiteralMap(this.type, this.keys, this.values, [this.constant]);
 
-  accept(Visitor visitor) => visitor.visitLiteralMap(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLiteralMap(this);
+}
+
+class TypeOperator extends Expression {
+  Expression receiver;
+  final DartType type;
+  final String operator;
+
+  TypeOperator(this.receiver, this.type, this.operator) ;
+
+  accept(ExpressionVisitor visitor) => visitor.visitTypeOperator(this);
 }
 
 /// A conditional expression.
@@ -203,7 +217,7 @@
 
   Conditional(this.condition, this.thenExpression, this.elseExpression);
 
-  accept(Visitor visitor) => visitor.visitConditional(this);
+  accept(ExpressionVisitor visitor) => visitor.visitConditional(this);
 }
 
 /// An && or || expression. The operator is internally represented as a boolean
@@ -219,7 +233,7 @@
 
   String get operator => isAnd ? '&&' : '||';
 
-  accept(Visitor visitor) => visitor.visitLogicalOperator(this);
+  accept(ExpressionVisitor visitor) => visitor.visitLogicalOperator(this);
 }
 
 /// Logical negation.
@@ -228,14 +242,20 @@
 
   Not(this.operand);
 
-  accept(Visitor visitor) => visitor.visitNot(this);
+  accept(ExpressionVisitor visitor) => visitor.visitNot(this);
+}
+
+/// A [LabeledStatement] or [WhileTrue] or [WhileCondition].
+abstract class JumpTarget extends Statement {
+  Label get label;
+  Statement get body;
 }
 
 /**
  * A labeled statement.  Breaks to the label within the labeled statement
  * target the successor statement.
  */
-class LabeledStatement extends Statement {
+class LabeledStatement extends JumpTarget {
   Statement next;
   final Label label;
   Statement body;
@@ -245,7 +265,98 @@
     label.binding = this;
   }
 
-  accept(Visitor visitor) => visitor.visitLabeledStatement(this);
+  accept(StatementVisitor visitor) => visitor.visitLabeledStatement(this);
+}
+
+/// A [WhileTrue] or [WhileCondition] loop.
+abstract class Loop extends JumpTarget {
+  /// When a [Continue] to a loop is executed, all update expressions are
+  /// evaluated right-to-left before control resumes at the head of the loop.
+  List<Expression> get updates;
+}
+
+/**
+ * A labeled while(true) loop.
+ */
+class WhileTrue extends Loop {
+  final Label label;
+  Statement body;
+  final List<Expression> updates = <Expression>[];
+
+  WhileTrue(this.label, this.body) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  accept(StatementVisitor visitor) => visitor.visitWhileTrue(this);
+}
+
+/**
+ * A while loop with a condition. If the condition is false, control resumes
+ * at the [next] statement.
+ *
+ * It is NOT valid to target this statement with a [Break].
+ * The only way to reach [next] is for the condition to evaluate to false.
+ *
+ * [WhileCondition] statements are introduced in the [LoopRewriter] and is
+ * assumed not to occur before then.
+ */
+class WhileCondition extends Loop {
+  final Label label;
+  Expression condition;
+  Statement body;
+  Statement next;
+  final List<Expression> updates;
+
+  WhileCondition(this.label, this.condition, this.body,
+                 this.next, this.updates) {
+    assert(label.binding == null);
+    label.binding = this;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitWhileCondition(this);
+}
+
+/// A [Break] or [Continue] statement.
+abstract class Jump extends Statement {
+  Label get target;
+}
+
+/**
+ * A break from an enclosing [LabeledStatement].  The break targets the
+ * labeled statement's successor statement.
+ */
+class Break extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Break(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitBreak(this);
+}
+
+/**
+ * A continue to an enclosing [WhileTrue] or [WhileCondition] loop.
+ * The continue targets the loop's body.
+ */
+class Continue extends Jump {
+  final Label target;
+
+  Statement get next => null;
+  void set next(Statement s) => throw 'UNREACHABLE';
+
+  Continue(this.target) {
+    ++target.useCount;
+  }
+
+  accept(StatementVisitor visitor) => visitor.visitContinue(this);
 }
 
 /**
@@ -258,11 +369,12 @@
   Statement next;
   final Variable variable;
   Expression definition;
-  final bool hasExactlyOneUse;
 
-  Assign(this.variable, this.definition, this.next, this.hasExactlyOneUse);
+  Assign(this.variable, this.definition, this.next);
 
-  accept(Visitor visitor) => visitor.visitAssign(this);
+  bool get hasExactlyOneUse => variable.readCount == 1;
+
+  accept(StatementVisitor visitor) => visitor.visitAssign(this);
 }
 
 /**
@@ -280,46 +392,7 @@
 
   Return(this.value);
 
-  accept(Visitor visitor) => visitor.visitReturn(this);
-}
-
-/**
- * A break from an enclosing [LabeledStatement].  The break targets the
- * labeled statement's successor statement.
- */
-class Break extends Statement {
-  Label _target;
-
-  Label get target => _target;
-  void set target(Label newTarget) {
-    ++newTarget.breakCount;
-    --_target.breakCount;
-    _target = newTarget;
-  }
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Break(this._target) {
-    ++target.breakCount;
-  }
-
-  accept(Visitor visitor) => visitor.visitBreak(this);
-}
-
-/**
- * A continue to an enclosing [While] loop.  The continue targets the
- * loop's body.
- */
-class Continue extends Statement {
-  Label target;
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  Continue(this.target);
-
-  accept(Visitor visitor) => visitor.visitContinue(this);
+  accept(StatementVisitor visitor) => visitor.visitReturn(this);
 }
 
 /**
@@ -335,32 +408,16 @@
 
   If(this.condition, this.thenStatement, this.elseStatement);
 
-  accept(Visitor visitor) => visitor.visitIf(this);
+  accept(StatementVisitor visitor) => visitor.visitIf(this);
 }
 
-/**
- * A labeled while(true) loop.
- */
-class While extends Statement {
-  final Label label;
-  Statement body;
-
-  While(this.label, this.body);
-
-  Statement get next => null;
-  void set next(Statement s) => throw 'UNREACHABLE';
-
-  accept(Visitor visitor) => visitor.visitWhile(this);
-}
-
-
 class ExpressionStatement extends Statement {
   Statement next;
   Expression expression;
 
   ExpressionStatement(this.expression, this.next);
 
-  accept(Visitor visitor) => visitor.visitExpressionStatement(this);
+  accept(StatementVisitor visitor) => visitor.visitExpressionStatement(this);
 }
 
 class FunctionDefinition extends Node {
@@ -370,7 +427,7 @@
   FunctionDefinition(this.parameters, this.body);
 }
 
-abstract class Visitor<S, E> {
+abstract class ExpressionVisitor<E> {
   E visitExpression(Expression e) => e.accept(this);
   E visitVariable(Variable node);
   E visitInvokeStatic(InvokeStatic node);
@@ -378,12 +435,16 @@
   E visitInvokeConstructor(InvokeConstructor node);
   E visitConcatenateStrings(ConcatenateStrings node);
   E visitConstant(Constant node);
+  E visitThis(This node);
   E visitConditional(Conditional node);
   E visitLogicalOperator(LogicalOperator node);
   E visitNot(Not node);
   E visitLiteralList(LiteralList node);
   E visitLiteralMap(LiteralMap node);
+  E visitTypeOperator(TypeOperator node);
+}
 
+abstract class StatementVisitor<S> {
   S visitStatement(Statement s) => s.accept(this);
   S visitLabeledStatement(LabeledStatement node);
   S visitAssign(Assign node);
@@ -391,10 +452,17 @@
   S visitBreak(Break node);
   S visitContinue(Continue node);
   S visitIf(If node);
-  S visitWhile(While node);
+  S visitWhileTrue(WhileTrue node);
+  S visitWhileCondition(WhileCondition node);
   S visitExpressionStatement(ExpressionStatement node);
 }
 
+abstract class Visitor<S,E> implements ExpressionVisitor<E>,
+                                       StatementVisitor<S> {
+   E visitExpression(Expression e) => e.accept(this);
+   S visitStatement(Statement s) => s.accept(this);
+}
+
 /**
  * Builder translates from CPS-based IR to direct-style Tree.
  *
@@ -430,9 +498,9 @@
 class Builder extends ir.Visitor<Node> {
   final dart2js.Compiler compiler;
 
-  // Uses of IR primitives are replaced with Tree variables.  This is the
-  // mapping from primitives to variables.
-  final Map<ir.Primitive, Variable> variables = <ir.Primitive, Variable>{};
+  /// Maps variable/parameter elements to the Tree variables that represent it.
+  final Map<Element, List<Variable>> element2variables =
+      <Element,List<Variable>>{};
 
   // Continuations with more than one use are replaced with Tree labels.  This
   // is the mapping from continuations to labels.
@@ -441,38 +509,148 @@
   FunctionDefinition function;
   ir.Continuation returnContinuation;
 
+  /// Variable used in [buildPhiAssignments] as a temporary when swapping
+  /// variables.
+  final Variable tempVar = new Variable(null);
+
   Builder(this.compiler);
 
+  /// Obtains the variable representing the given primitive. Returns null for
+  /// primitives that have no reference and do not need a variable.
+  Variable getVariable(ir.Primitive primitive) {
+    if (primitive.registerIndex == null) {
+      return null; // variable is unused
+    }
+    List<Variable> variables = element2variables[primitive.element];
+    if (variables == null) {
+      variables = <Variable>[];
+      element2variables[primitive.element] = variables;
+    }
+    while (variables.length <= primitive.registerIndex) {
+      variables.add(new Variable(primitive.element));
+    }
+    return variables[primitive.registerIndex];
+  }
+
+  /// Obtains a reference to the tree Variable corresponding to the IR primitive
+  /// referred to by [reference].
+  /// This increments the reference count for the given variable, so the
+  /// returned expression must be used in the tree.
+  Expression getVariableReference(ir.Reference reference) {
+    Variable variable = getVariable(reference.definition);
+    if (variable == null) {
+      compiler.internalError(
+          compiler.currentElement,
+          "Reference to ${reference.definition} has no register");
+    }
+    ++variable.readCount;
+    return variable;
+  }
+
   FunctionDefinition build(ir.FunctionDefinition node) {
+    new ir.RegisterAllocator().visit(node);
     visit(node);
     return function;
   }
 
   List<Expression> translateArguments(List<ir.Reference> args) {
     return new List<Expression>.generate(args.length,
-         (int index) => variables[args[index].definition]);
+         (int index) => getVariableReference(args[index]));
   }
 
-  Statement buildParameterAssignments(
+  List<Variable> translatePhiArguments(List<ir.Reference> args) {
+    return new List<Variable>.generate(args.length,
+         (int index) => getVariableReference(args[index]));
+  }
+
+  Statement buildContinuationAssignment(
+      ir.Parameter parameter,
+      Expression argument,
+      Statement buildRest()) {
+    Variable variable = getVariable(parameter);
+    Statement assignment;
+    if (variable == null) {
+      assignment = new ExpressionStatement(argument, null);
+    } else {
+      assignment = new Assign(variable, argument, null);
+    }
+    assignment.next = buildRest();
+    return assignment;
+  }
+
+  /// Simultaneously assigns each argument to the corresponding parameter,
+  /// then continues at the statement created by [buildRest].
+  Statement buildPhiAssignments(
       List<ir.Parameter> parameters,
-      List<Expression> arguments,
+      List<Variable> arguments,
       Statement buildRest()) {
     assert(parameters.length == arguments.length);
-    Statement first, current;
-    for (int i = 0; i < parameters.length; ++i) {
-      ir.Parameter parameter = parameters[i];
-      Statement assignment;
-      if (parameter.hasAtLeastOneUse) {
-        assignment = new Assign(variables[parameter], arguments[i], null,
-            parameter.hasExactlyOneUse);
-      } else {
-        assignment = new ExpressionStatement(arguments[i], null);
-      }
+    // We want a parallel assignment to all parameters simultaneously.
+    // Since we do not have parallel assignments in dart_tree, we must linearize
+    // the assignments without attempting to read a previously-overwritten
+    // value. For example {x,y = y,x} cannot be linearized to {x = y; y = x},
+    // for this we must introduce a temporary variable: {t = x; x = y; y = t}.
 
+    // [rightHand] is the inverse of [arguments], that is, it maps variables
+    // to the assignments on which is occurs as the right-hand side.
+    Map<Variable, List<int>> rightHand = <Variable, List<int>>{};
+    for (int i = 0; i < parameters.length; i++) {
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        continue; // No assignment necessary.
+      }
+      List<int> list = rightHand[arg];
+      if (list == null) {
+        rightHand[arg] = list = <int>[];
+      }
+      list.add(i);
+    }
+
+    Statement first, current;
+    void addAssignment(Variable dst, Variable src) {
       if (first == null) {
-        current = first = assignment;
+        first = current = new Assign(dst, src, null);
       } else {
-        current = current.next = assignment;
+        current = current.next = new Assign(dst, src, null);
+      }
+    }
+
+    List<Variable> assignmentSrc = new List<Variable>(parameters.length);
+    List<bool> done = new List<bool>(parameters.length);
+    void visitAssignment(int i) {
+      if (done[i] == true) {
+        return;
+      }
+      Variable param = getVariable(parameters[i]);
+      Variable arg = arguments[i];
+      if (param == null || param == arg) {
+        return; // No assignment necessary.
+      }
+      if (assignmentSrc[i] != null) {
+        // Cycle found; store argument in a temporary variable.
+        // The temporary will then be used as right-hand side when the
+        // assignment gets added.
+        if (assignmentSrc[i] != tempVar) { // Only move to temporary once.
+          assignmentSrc[i] = tempVar;
+          addAssignment(tempVar, arg);
+        }
+        return;
+      }
+      assignmentSrc[i] = arg;
+      List<int> paramUses = rightHand[param];
+      if (paramUses != null) {
+        for (int useIndex in paramUses) {
+          visitAssignment(useIndex);
+        }
+      }
+      addAssignment(param, assignmentSrc[i]);
+      done[i] = true;
+    }
+
+    for (int i = 0; i < parameters.length; i++) {
+      if (done[i] == null) {
+        visitAssignment(i);
       }
     }
 
@@ -488,29 +666,19 @@
     returnContinuation = node.returnContinuation;
     List<Variable> parameters = <Variable>[];
     for (ir.Parameter p in node.parameters) {
-      Variable parameter = new Variable(p.element);
+      Variable parameter = getVariable(p);
+      assert(parameter != null);
       parameters.add(parameter);
-      variables[p] = parameter;
     }
     function = new FunctionDefinition(parameters, visit(node.body));
     return null;
   }
 
   Statement visitLetPrim(ir.LetPrim node) {
-    // LetPrim is translated to LetVal.
-    Expression definition = visit(node.primitive);
-    if (node.primitive.hasAtLeastOneUse) {
-      Variable variable = new Variable(null);
-      variables[node.primitive] = variable;
-      return new Assign(variable, definition, visit(node.body),
-          node.primitive.hasExactlyOneUse);
-    } else if (node.primitive is ir.Constant) {
-      // TODO(kmillikin): Implement more systematic treatment of pure CPS
-      // values (e.g., as part of a shrinking reductions pass).
-      return visit(node.body);
-    } else {
-      return new ExpressionStatement(definition, visit(node.body));
-    }
+    Variable variable = getVariable(node.primitive);
+    return variable == null
+        ? visit(node.body)
+        : new Assign(variable, visit(node.primitive), visit(node.body));
   }
 
   Statement visitLetCont(ir.LetCont node) {
@@ -519,9 +687,6 @@
       label = new Label();
       labels[node.continuation] = label;
     }
-    node.continuation.parameters.forEach((p) {
-        if (p.hasAtLeastOneUse) variables[p] = new Variable(null);
-    });
     Statement body = visit(node.body);
     // The continuation's body is not always translated directly here because
     // it may have been already translated:
@@ -545,13 +710,13 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
 
   Statement visitInvokeMethod(ir.InvokeMethod node) {
-    Variable receiver = variables[node.receiver.definition];
+    Expression receiver = getVariableReference(node.receiver);
     List<Expression> arguments = translateArguments(node.arguments);
     Expression invoke = new InvokeMethod(receiver, node.selector, arguments);
     ir.Continuation cont = node.continuation.definition;
@@ -560,7 +725,7 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
@@ -574,7 +739,21 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [concat],
+      return buildContinuationAssignment(cont.parameters.single, concat,
+          () => visit(cont.body));
+    }
+  }
+
+  Statement visitAsCast(ir.AsCast node) {
+    Expression receiver = getVariableReference(node.receiver);
+    Expression concat = new TypeOperator(receiver, node.type, "as");
+    ir.Continuation cont = node.continuation.definition;
+    if (cont == returnContinuation) {
+      return new Return(concat);
+    } else {
+      assert(cont.hasExactlyOneUse);
+      assert(cont.parameters.length == 1);
+      return buildContinuationAssignment(cont.parameters.single, concat,
           () => visit(cont.body));
     }
   }
@@ -589,7 +768,7 @@
     } else {
       assert(cont.hasExactlyOneUse);
       assert(cont.parameters.length == 1);
-      return buildParameterAssignments(cont.parameters, [invoke],
+      return buildContinuationAssignment(cont.parameters.single, invoke,
           () => visit(cont.body));
     }
   }
@@ -603,10 +782,10 @@
     ir.Continuation cont = node.continuation.definition;
     if (cont == returnContinuation) {
       assert(node.arguments.length == 1);
-      return new Return(variables[node.arguments[0].definition]);
+      return new Return(getVariableReference(node.arguments.single));
     } else {
-      List<Expression> arguments = translateArguments(node.arguments);
-      return buildParameterAssignments(cont.parameters, arguments,
+      List<Expression> arguments = translatePhiArguments(node.arguments);
+      return buildPhiAssignments(cont.parameters, arguments,
           () {
             // Translate invocations of recursive and non-recursive
             // continuations differently.
@@ -622,7 +801,7 @@
             if (cont.isRecursive) {
               return node.isRecursive
                   ? new Continue(labels[cont])
-                  : new While(labels[cont], visit(cont.body));
+                  : new WhileTrue(labels[cont], visit(cont.body));
             } else {
               return cont.hasExactlyOneUse
                   ? visit(cont.body)
@@ -646,18 +825,42 @@
     return new If(condition, thenStatement, elseStatement);
   }
 
+  Expression visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
+    return new InvokeConstructor(
+        node.type,
+        node.constructor,
+        node.selector,
+        translateArguments(node.arguments),
+        node.constant);
+  }
+
   Expression visitConstant(ir.Constant node) {
     return new Constant(node.value);
   }
 
+  Expression visitThis(ir.This node) {
+    return new This();
+  }
+
   Expression visitLiteralList(ir.LiteralList node) {
-    return new LiteralList(translateArguments(node.values));
+    return new LiteralList(
+            node.type,
+            translateArguments(node.values),
+            node.constant);
   }
 
   Expression visitLiteralMap(ir.LiteralMap node) {
     return new LiteralMap(
+        node.type,
         translateArguments(node.keys),
-        translateArguments(node.values));
+        translateArguments(node.values),
+        node.constant);
+  }
+
+  Expression visitIsCheck(ir.IsCheck node) {
+    return new TypeOperator(getVariableReference(node.receiver),
+                            node.type,
+                            "is");
   }
 
   Expression visitParameter(ir.Parameter node) {
@@ -675,7 +878,7 @@
   }
 
   Expression visitIsTrue(ir.IsTrue node) {
-    return variables[node.value.definition];
+    return getVariableReference(node.value);
   }
 }
 
@@ -757,11 +960,11 @@
  * REDIRECT BREAKS:
  * Labeled statements whose next is a break become flattened and all breaks
  * to their label are redirected.
- * For example:
+ * For example, where 'jump' is either break or continue:
  *
- *   L0: {... break L0 ...}; break L1
+ *   L0: {... break L0 ...}; jump L1
  *     ==>
- *   {... break L1 ...}
+ *   {... jump L1 ...}
  *
  * This may trigger a flattening of nested ifs in case the eliminated label
  * separated two ifs.
@@ -773,13 +976,13 @@
 
   /// Substitution map for labels. Any break to a label L should be substituted
   /// for a break to L' if L maps to L'.
-  Map<Label, Label> labelRedirects = <Label, Label>{};
+  Map<Label, Jump> labelRedirects = <Label, Jump>{};
 
   /// Returns the redirect target of [label] or [label] itself if it should not
   /// be redirected.
-  Label redirect(Label label) {
-    Label newTarget = labelRedirects[label];
-    return newTarget != null ? newTarget : label;
+  Jump redirect(Break jump) {
+    Jump newJump = labelRedirects[jump.target];
+    return newJump != null ? newJump : jump;
   }
 
   void rewrite(FunctionDefinition definition) {
@@ -892,10 +1095,11 @@
 
   Statement visitBreak(Break node) {
     // Redirect through chain of breaks.
-    // Note that breakCount was accounted for at visitLabeledStatement.
-    node.target = redirect(node.target);
-    if (node.target.breakCount == 1) {
-      --node.target.breakCount;
+    // Note that useCount was accounted for at visitLabeledStatement.
+    // Note redirect may return either a Break or Continue statement.
+    node = redirect(node);
+    if (node is Break && node.target.useCount == 1) {
+      --node.target.useCount;
       return visitStatement(node.target.binding.next);
     }
     return node;
@@ -906,16 +1110,16 @@
   }
 
   Statement visitLabeledStatement(LabeledStatement node) {
-    if (node.next is Break) {
-      // Eliminate label if next is just a break statement
+    if (node.next is Jump) {
+      // Eliminate label if next is a break or continue statement
       // Breaks to this label are redirected to the outer label.
       // Note that breakCount for the two labels is updated proactively here
       // so breaks can reliably tell if they should inline their target.
-      Break next = node.next;
-      Label newTarget = redirect(next.target);
-      labelRedirects[node.label] = newTarget;
-      newTarget.breakCount += node.label.breakCount;
-      node.label.breakCount = 0;
+      Jump next = node.next;
+      Jump newJump = redirect(next);
+      labelRedirects[node.label] = newJump;
+      newJump.target.useCount += node.label.useCount - 1;
+      node.label.useCount = 0;
       Statement result = visitStatement(node.body);
       labelRedirects.remove(node.label); // Save some space.
       return result;
@@ -923,12 +1127,18 @@
 
     node.body = visitStatement(node.body);
 
-    if (node.label.breakCount == 0) {
+    if (node.label.useCount == 0) {
       // Eliminate the label if next was inlined at a break
       return node.body;
     }
 
+    // Do not propagate assignments into the successor statements, since they
+    // may be overwritten by assignments in the body.
+    List<Assign> savedEnvironment = environment;
+    environment = <Assign>[];
     node.next = visitStatement(node.next);
+    environment = savedEnvironment;
+
     return node;
   }
 
@@ -965,7 +1175,7 @@
     return node;
   }
 
-  Statement visitWhile(While node) {
+  Statement visitWhileTrue(WhileTrue node) {
     // Do not propagate assignments into loops.  Doing so is not safe for
     // variables modified in the loop (the initial value will be propagated).
     List<Assign> savedEnvironment = environment;
@@ -976,10 +1186,19 @@
     return node;
   }
 
+  Statement visitWhileCondition(WhileCondition node) {
+    // Not introduced yet
+    throw "Unexpected WhileCondition in StatementRewriter";
+  }
+
   Expression visitConstant(Constant node) {
     return node;
   }
 
+  Expression visitThis(This node) {
+    return node;
+  }
+
   Expression visitLiteralList(LiteralList node) {
     // Process values right-to-left, the opposite of evaluation order.
     for (int i = node.values.length - 1; i >= 0; --i) {
@@ -997,6 +1216,11 @@
     return node;
   }
 
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     node.expression = visitExpression(node.expression);
     // Do not allow propagation of assignments past an expression evaluated
@@ -1041,8 +1265,7 @@
       if (next != null) {
         return new Assign(s.variable,
                           combine(s.definition, t.definition),
-                          next,
-                          s.hasExactlyOneUse);
+                          next);
       }
     }
     if (s is ExpressionStatement && t is ExpressionStatement) {
@@ -1062,27 +1285,34 @@
   /// If two breaks are combined, the label's break counter will be decremented.
   static Statement combineStatements(Statement s, Statement t) {
     if (s is Break && t is Break && s.target == t.target) {
-      --t.target.breakCount; // Two breaks become one.
+      --t.target.useCount; // Two breaks become one.
       return s;
     }
-    if (s is Return && t is Return && equivalentExpressions(s.value, t.value)) {
+    if (s is Continue && t is Continue && s.target == t.target) {
+      --t.target.useCount; // Two continues become one.
       return s;
     }
+    if (s is Return && t is Return) {
+      Expression e = combineExpressions(s.value, t.value);
+      if (e != null) {
+        return new Return(e);
+      }
+    }
     return null;
   }
 
-  /// True if the two expressions both syntactically and semantically
-  /// equivalent.
-  static bool equivalentExpressions(Expression e1, Expression e2) {
-    if (e1 == e2) { // Detect same variable reference
-      // TODO(asgerf): This might turn the variable into a single-use,
-      // but we currently don't discover this.
-      return true;
+  /// Returns an expression equivalent to both [e1] and [e2].
+  /// If non-null is returned, the caller must discard [e1] and [e2] and use
+  /// the resulting expression in the tree.
+  static Expression combineExpressions(Expression e1, Expression e2) {
+    if (e1 is Variable && e1 == e2) {
+      --e1.readCount; // Two references become one.
+      return e1;
     }
-    if (e1 is Constant && e2 is Constant) {
-      return e1.value == e2.value;
+    if (e1 is Constant && e2 is Constant && e1.value == e2.value) {
+      return e1;
     }
-    return false;
+    return null;
   }
 
   /// Try to collapse nested ifs using && and || expressions.
@@ -1149,7 +1379,7 @@
             makeCondition(outerIf.condition, branch1),
             makeCondition(innerIf.condition, branch2));
         outerIf.thenStatement = innerThen;
-        --innerElse.target.breakCount;
+        --innerElse.target.useCount;
 
         // Try to inline the remaining break.  Do not propagate assignments.
         List<Assign> savedEnvironment = environment;
@@ -1173,6 +1403,124 @@
   }
 }
 
+/// Rewrites [WhileTrue] statements with an [If] body into a [WhileCondition],
+/// in situations where only one of the branches contains a [Continue] to the
+/// loop. Schematically:
+///
+///   L:
+///   while (true) {
+///     if (E) {
+///       S1  (has references to L)
+///     } else {
+///       S2  (has no references to L)
+///     }
+///   }
+///     ==>
+///   L:
+///   while (E) {
+///     S1
+///   };
+///   S2
+///
+/// A similar transformation is used when S2 occurs in the 'then' position.
+///
+/// Note that the above pattern needs no iteration since nested ifs
+/// have been collapsed previously in the [StatementRewriter] phase.
+class LoopRewriter extends StatementVisitor<Statement> {
+
+  Set<Label> usedContinueLabels = new Set<Label>();
+
+  void rewrite(FunctionDefinition function) {
+    function.body = visitStatement(function.body);
+  }
+
+  Statement visitLabeledStatement(LabeledStatement node) {
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitAssign(Assign node) {
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitReturn(Return node) {
+    return node;
+  }
+
+  Statement visitBreak(Break node) {
+    return node;
+  }
+
+  Statement visitContinue(Continue node) {
+    usedContinueLabels.add(node.target);
+    return node;
+  }
+
+  Statement visitIf(If node) {
+    node.thenStatement = visitStatement(node.thenStatement);
+    node.elseStatement = visitStatement(node.elseStatement);
+    return node;
+  }
+
+  Statement visitWhileTrue(WhileTrue node) {
+    assert(!usedContinueLabels.contains(node.label));
+    if (node.body is If) {
+      If body = node.body;
+      body.thenStatement = visitStatement(body.thenStatement);
+      bool thenHasContinue = usedContinueLabels.remove(node.label);
+      body.elseStatement = visitStatement(body.elseStatement);
+      bool elseHasContinue = usedContinueLabels.remove(node.label);
+      if (thenHasContinue && !elseHasContinue) {
+        node.label.binding = null; // Prepare to rebind the label.
+        return new WhileCondition(
+            node.label,
+            body.condition,
+            body.thenStatement,
+            body.elseStatement,
+            node.updates);
+      } else if (!thenHasContinue && elseHasContinue) {
+        node.label.binding = null;
+        return new WhileCondition(
+            node.label,
+            new Not(body.condition),
+            body.elseStatement,
+            body.thenStatement,
+            node.updates);
+      }
+    } else {
+      node.body = visitStatement(node.body);
+      usedContinueLabels.remove(node.label);
+    }
+    return node;
+  }
+
+  Statement visitWhileCondition(WhileCondition node) {
+    // Note: not reachable but the implementation is trivial
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
+  Statement visitExpressionStatement(ExpressionStatement node) {
+    node.next = visitStatement(node.next);
+    // for (;;) { ... E; continue* L ... }
+    //   ==>
+    // for(;;E) { ... continue* L ... }
+    if (node.next is Continue) {
+      Continue jump = node.next;
+      if (jump.target.useCount == 1) {
+        Loop target = jump.target.binding;
+        target.updates.add(node.expression);
+        return jump; // Return the continue statement.
+        // NOTE: The pattern may reclick in an enclosing expression statement.
+      }
+    }
+    return node;
+  }
+
+}
 
 
 /// Rewrites logical expressions to be more compact.
@@ -1308,11 +1656,18 @@
     return node;
   }
 
-  Statement visitWhile(While node) {
+  Statement visitWhileTrue(WhileTrue node) {
     node.body = visitStatement(node.body);
     return node;
   }
 
+  Statement visitWhileCondition(WhileCondition node) {
+    node.condition = makeCondition(node.condition, true, liftNots: false);
+    node.body = visitStatement(node.body);
+    node.next = visitStatement(node.next);
+    return node;
+  }
+
   Statement visitExpressionStatement(ExpressionStatement node) {
     // TODO(asgerf): in non-checked mode we can remove Not from the expression.
     node.expression = visitExpression(node.expression);
@@ -1357,10 +1712,19 @@
     return node;
   }
 
+  Expression visitTypeOperator(TypeOperator node) {
+    node.receiver = visitExpression(node.receiver);
+    return node;
+  }
+
   Expression visitConstant(Constant node) {
     return node;
   }
 
+  Expression visitThis(This node) {
+    return node;
+  }
+
   Expression visitNot(Not node) {
     return toBoolean(makeCondition(node.operand, false, liftNots: false));
   }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
index 1ae6777..660ff6c 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart
@@ -12,6 +12,11 @@
 import '../elements/elements.dart' as elements;
 import '../dart_types.dart' as types;
 
+/// If true, the unparser will insert a coment in front of every function
+/// it emits. This helps indicate which functions were translated by the new
+/// backend.
+const bool INSERT_NEW_BACKEND_COMMENT = true;
+
 /// Converts backend ASTs to frontend ASTs.
 class TreePrinter {
   dart2js.TreeElementMapping treeElements;
@@ -95,6 +100,11 @@
         new StringToken.fromString(IDENTIFIER_INFO, name, -1));
   }
 
+  static tree.Operator makeOperator(String name) {
+    return new tree.Operator(
+        new StringToken.fromString(IDENTIFIER_INFO, name, -1));
+  }
+
   // Utilities for creating NodeLists
   Link<tree.Node> makeLink(Iterable<tree.Node> nodes) {
     LinkBuilder builder = new LinkBuilder();
@@ -218,6 +228,19 @@
     }
   }
 
+  tree.Node makeStaticReceiver(elements.Element element) {
+    if (treeElements == null) return null;
+    if (element.enclosingElement is elements.ClassElement) {
+      tree.Send send = new tree.Send(
+          null,
+          makeIdentifier(element.enclosingElement.name));
+      treeElements[send] = element.enclosingElement;
+      return send;
+    } else {
+      return null;
+    }
+  }
+
   tree.Node makeArgument(Argument arg) {
     if (arg is Expression) {
       return makeExpression(arg);
@@ -252,7 +275,7 @@
       tree.NodeList arguments;
       elements.Element element;
       if (left is Identifier) {
-        receiver = null;
+        receiver = makeStaticReceiver(left.element);
         selector = makeIdentifier(left.name);
         arguments = singleton(makeExpression(exp.right));
         element = left.element;
@@ -286,14 +309,16 @@
       tree.Node selector;
       Expression callee = exp.callee;
       elements.Element element;
+      tree.Node receiver;
       if (callee is Identifier) {
+        receiver = makeStaticReceiver(callee.element);
         selector = makeIdentifier(callee.name);
         element = callee.element;
       } else {
         selector = makeExp(callee, CALLEE, beginStmt: beginStmt);
       }
       result = new tree.Send(
-          null,
+          receiver,
           selector,
           argList(exp.arguments.map(makeArgument)));
       if (callee is Identifier) {
@@ -331,7 +356,7 @@
     } else if (exp is CallStatic) {
       precedence = CALLEE;
       result = new tree.Send(
-          makeName(exp.className),
+          makeStaticReceiver(exp.element),
           makeIdentifier(exp.methodName),
           argList(exp.arguments.map(makeArgument)));
       setElement(result, exp.element, exp);
@@ -353,18 +378,27 @@
       if (beginStmt && exp.name != null) {
         needParen = true; // Do not mistake for function declaration.
       }
+      // exp.element can only be null in tests.
+      tree.Node body = exp.element != null &&
+          exp.element.node.body is tree.EmptyStatement
+        ? exp.element.node.body
+        : makeFunctionBody(exp.body);
       result = new tree.FunctionExpression(
-          exp.name != null ? makeIdentifier(exp.name) : null,
+          functionName(exp),
           makeParameters(exp.parameters),
-          makeBlock(exp.body),
-          exp.returnType != null ? makeType(exp.returnType) : null,
-          makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
+          body,
+          exp.returnType == null || exp.element.isConstructor
+            ? null
+            : makeType(exp.returnType),
+          makeFunctionModifiers(exp),
           null,  // initializers
           null); // get/set
       setElement(result, exp.element, exp);
     } else if (exp is Identifier) {
       precedence = CALLEE;
-      result = new tree.Send(null, makeIdentifier(exp.name));
+      result = new tree.Send(
+          makeStaticReceiver(exp.element),
+          makeIdentifier(exp.name));
       setElement(result, exp.element, exp);
     } else if (exp is Increment) {
       Expression lvalue = exp.expression;
@@ -373,6 +407,7 @@
       tree.Node argument;
       bool innerBeginStmt = beginStmt && !exp.isPrefix;
       if (lvalue is Identifier) {
+        receiver = makeStaticReceiver(lvalue.element);
         selector = makeIdentifier(lvalue.name);
       } else if (lvalue is FieldExpression) {
         receiver = makeExp(lvalue.object, PRIMARY, beginStmt: innerBeginStmt);
@@ -457,6 +492,12 @@
       result = new tree.LiteralSymbol(
           hash,
           makeList('.', exp.id.split('.').map(makeIdentifier)));
+    } else if (exp is LiteralType) {
+      precedence = TYPE_LITERAL;
+      result = new tree.Send(
+          makeStaticReceiver(exp.element),
+          makeIdentifier(exp.name));
+      setElement(result, exp.element, exp);
     } else if (exp is StringConcat) {
       precedence = PRIMARY;
       result = unparseStringLiteral(exp);
@@ -518,6 +559,20 @@
         makeExpression(en.value));
   }
 
+  /// A comment token to be inserted when [INSERT_NEW_BACKEND_COMMENT] is true.
+  final SymbolToken newBackendComment = new SymbolToken(
+      const PrecedenceInfo('/* new backend */ ', 0, OPEN_CURLY_BRACKET_TOKEN),
+      -1);
+
+  tree.Node makeFunctionBody(Statement stmt) {
+    if (INSERT_NEW_BACKEND_COMMENT) {
+      return new tree.Block(makeList('', [makeBlock(stmt)],
+                                     open: newBackendComment));
+    } else {
+      return makeBlock(stmt);
+    }
+  }
+
   /// Produces a statement in a context where only blocks are allowed.
   tree.Node makeBlock(Statement stmt) {
     if (stmt is Block)
@@ -617,7 +672,7 @@
       return new tree.FunctionDeclaration(new tree.FunctionExpression(
           stmt.name != null ? makeIdentifier(stmt.name) : null,
           makeParameters(stmt.parameters),
-          makeBlock(stmt.body),
+          makeFunctionBody(stmt.body),
           stmt.returnType != null ? makeType(stmt.returnType) : null,
           makeEmptyModifiers(), // TODO(asgerf): Function modifiers?
           null,  // initializers
@@ -777,7 +832,8 @@
       Token assign = params.hasNamedParameters ? colon : eq;
       Token open = params.hasNamedParameters ? openBrace : openBracket;
       Token close = params.hasNamedParameters ? closeBrace : closeBracket;
-      List opt = params.optionalParameters.map((p) => makeParameter(p,assign));
+      Iterable<tree.Node> opt =
+          params.optionalParameters.map((p) => makeParameter(p,assign));
       nodes.add(new tree.NodeList(open, makeLink(opt), close, ','));
     }
     return argList(nodes);
@@ -794,6 +850,7 @@
           makeEmptyModifiers(), // TODO: Function parameter modifiers?
           null, // initializers
           null); // get/set
+      setElement(definition, param.element, param);
       if (param.defaultValue != null) {
         return new tree.SendSet(
             null,
@@ -801,7 +858,10 @@
             new tree.Operator(assignOperator),
             singleton(makeExpression(param.defaultValue)));
       } else {
-        return definition;
+        return new tree.VariableDefinitions(
+            null,
+            makeEmptyModifiers(),
+            singleton(definition));
       }
     } else {
       tree.Node definition;
@@ -842,6 +902,30 @@
     return new tree.Modifiers(makeList('', nodes));
   }
 
+  tree.Modifiers makeFunctionModifiers(FunctionExpression exp) {
+    if (exp.element == null) return makeEmptyModifiers();
+    List<tree.Node> modifiers = new List<tree.Node>();
+    if (exp.element is elements.ConstructorElement &&
+        exp.element.isFactoryConstructor) {
+      modifiers.add(makeIdentifier("factory"));
+    }
+    if (exp.element.isStatic) {
+      modifiers.add(makeIdentifier("static"));
+    }
+    return new tree.Modifiers(makeList('', modifiers));
+  }
+
+  tree.Node functionName(FunctionExpression exp) {
+    String name = exp.name;
+    if (name == null) return null;
+    if (isUserDefinableOperator(name)) {
+      return makeOperator("operator$name");
+    } else if (name == "unary-") {
+      return makeOperator("operator-");
+    }
+    return makeIdentifier(name);
+  }
+
   tree.Node parenthesize(tree.Node node) {
     return new tree.ParenthesizedExpression(node, openParen);
   }
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
index 45c7f3d..6d7d01b 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/placeholder_collector.dart
@@ -255,7 +255,7 @@
 
   void tryMakeLocalPlaceholder(Element element, Identifier node) {
     bool isNamedOptionalParameter() {
-      FunctionElement function = element.enclosingElement;
+      FunctionTypedElement function = element.enclosingElement;
       FunctionSignature signature = function.functionSignature;
       if (!signature.optionalParametersAreNamed) return false;
       for (Element parameter in signature.optionalParameters) {
diff --git a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
index 79b3a84..b3160f1 100644
--- a/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/dart_backend/tree_tracer.dart
@@ -9,13 +9,18 @@
 import 'dart_tree.dart';
 
 class Block {
+  Label label;
   int index;
-  final List<Statement> statements = <Statement>[];
+  /// Mixed list of [Statement] and [Block].
+  /// A [Block] represents a synthetic goto statement.
+  final List statements = [];
   final List<Block> predecessors = <Block>[];
   final List<Block> successors = <Block>[];
 
   String get name => 'B$index';
 
+  Block([this.label]);
+
   void addEdgeTo(Block successor) {
     successors.add(successor);
     successor.predecessors.add(this);
@@ -36,6 +41,9 @@
   void _addStatement(Statement statement) {
     blocks.last.statements.add(statement);
   }
+  void _addGotoStatement(Block target) {
+    blocks.last.statements.add(target);
+  }
 
   void _addBlock(Block block) {
     block.index = blocks.length;
@@ -54,12 +62,14 @@
   visitLiteralList(LiteralList node) {}
   visitLiteralMap(LiteralMap node) {}
   visitConstant(Constant node) {}
+  visitThis(This node) {}
   visitConditional(Conditional node) {}
   visitLogicalOperator(LogicalOperator node) {}
   visitNot(Not node) {}
+  visitTypeOperator(TypeOperator node) {}
 
   visitLabeledStatement(LabeledStatement node) {
-    Block target = new Block();
+    Block target = new Block(node.label);
     breakTargets[node.label] = target;
     visitStatement(node.body);
     _addBlock(target);
@@ -99,8 +109,10 @@
     visitStatement(node.elseStatement);
   }
 
-  visitWhile(While node) {
+  visitWhileTrue(WhileTrue node) {
     Block continueTarget = new Block();
+    _addGotoStatement(continueTarget);
+
     continueTargets[node.label] = continueTarget;
     blocks.last.addEdgeTo(continueTarget);
     _addBlock(continueTarget);
@@ -108,13 +120,38 @@
     visitStatement(node.body);
   }
 
+  visitWhileCondition(WhileCondition node) {
+    Block whileBlock = new Block();
+    _addGotoStatement(whileBlock);
+
+    _addBlock(whileBlock);
+    _addStatement(node);
+    whileBlock.statements.add(node);
+    blocks.last.addEdgeTo(whileBlock);
+
+    Block bodyBlock = new Block();
+    Block nextBlock = new Block();
+    whileBlock.addEdgeTo(bodyBlock);
+    whileBlock.addEdgeTo(nextBlock);
+
+    continueTargets[node.label] = bodyBlock;
+    _addBlock(bodyBlock);
+    visitStatement(node.body);
+
+    _addBlock(nextBlock);
+    visitStatement(node.next);
+
+    ifTargets[node.body] = bodyBlock;
+    ifTargets[node.next] = nextBlock;
+  }
+
   visitExpressionStatement(ExpressionStatement node) {
     _addStatement(node);
     visitStatement(node.next);
   }
 }
 
-class TreeTracer extends TracerUtil with Visitor {
+class TreeTracer extends TracerUtil with StatementVisitor {
   final EventSink<String> output;
 
   TreeTracer(this.output);
@@ -152,11 +189,24 @@
         });
       });
       tag("HIR", () {
-        block.statements.forEach(visitStatement);
+        if (block.label != null) {
+          printStatement(null,
+              "Label ${block.name}, useCount=${block.label.useCount}");
+        }
+        block.statements.forEach(visitBlockMember);
       });
     });
   }
 
+  void visitBlockMember(member) {
+    if (member is Block) {
+      printStatement(null, "goto block B${member.name}");
+    } else {
+      assert(member is Statement);
+      visitStatement(member);
+    }
+  }
+
   void printStatement(String name, String contents) {
     int bci = 0;
     int uses = 0;
@@ -167,18 +217,6 @@
     add("$bci $uses $name $contents <|@\n");
   }
 
-  visitVariable(Variable node) {
-    printStatement(null, "dead-use ${names.varName(node)}");
-  }
-
-  visitInvokeStatic(InvokeStatic node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConstant(Constant node) {
-    printStatement(null, "dead-use ${node.value}");
-  }
-
   visitLabeledStatement(LabeledStatement node) {
     // These do not get added to a block's list of statements.
   }
@@ -186,39 +224,8 @@
   visitAssign(Assign node) {
     String name = names.varName(node.variable);
     String rhs = expr(node.definition);
-    printStatement(name, "let $name = $rhs");
-  }
-
-  visitInvokeMethod(InvokeMethod node) {
-    printStatement(null, expr(node));
-  }
-
-  visitInvokeConstructor(InvokeConstructor node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConcatenateStrings(ConcatenateStrings node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLiteralList(LiteralList node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLiteralMap(LiteralMap node) {
-    printStatement(null, expr(node));
-  }
-
-  visitConditional(Conditional node) {
-    printStatement(null, expr(node));
-  }
-
-  visitLogicalOperator(LogicalOperator node) {
-    printStatement(null, expr(node));
-  }
-
-  visitNot(Not node) {
-    printStatement(null, expr(node));
+    String extra = node.hasExactlyOneUse ? "[single-use]" : "";
+    printStatement(null, "assign $name = $rhs $extra");
   }
 
   visitReturn(Return node) {
@@ -231,7 +238,7 @@
 
   visitContinue(Continue node) {
     printStatement(null,
-        "continue ${collector.breakTargets[node.target].name}");
+        "continue ${collector.continueTargets[node.target].name}");
   }
 
   visitIf(If node) {
@@ -241,12 +248,20 @@
     printStatement(null, "if $condition then $thenTarget else $elseTarget");
   }
 
-  visitWhile(While node) {
+  visitWhileTrue(WhileTrue node) {
     printStatement(null, "while true do");
   }
 
+  visitWhileCondition(WhileCondition node) {
+    String bodyTarget = collector.ifTargets[node.body].name;
+    String nextTarget = collector.ifTargets[node.next].name;
+    printStatement(null, "while ${expr(node.condition)}");
+    printStatement(null, "do $bodyTarget");
+    printStatement(null, "then $nextTarget" );
+  }
+
   visitExpressionStatement(ExpressionStatement node) {
-    visitExpression(node.expression);
+    printStatement(null, expr(node.expression));
   }
 
   String expr(Expression e) {
@@ -254,7 +269,7 @@
   }
 }
 
-class SubexpressionVisitor extends Visitor<String, String> {
+class SubexpressionVisitor extends ExpressionVisitor<String> {
   Names names;
 
   SubexpressionVisitor(this.names);
@@ -298,7 +313,8 @@
       callName = '${node.type}.${node.target.name}';
     }
     String args = formatArguments(node);
-    return "new $callName($args)";
+    String keyword = node.constant != null ? 'const' : 'new';
+    return "$keyword $callName($args)";
   }
 
   String visitConcatenateStrings(ConcatenateStrings node) {
@@ -325,6 +341,10 @@
     return "${node.value}";
   }
 
+  String visitThis(This node) {
+    return "this";
+  }
+
   bool usesInfixNotation(Expression node) {
     return node is Conditional || node is LogicalOperator;
   }
@@ -348,6 +368,12 @@
     return "$left ${node.operator} $right";
   }
 
+  String visitTypeOperator(TypeOperator node) {
+    String receiver = visitExpression(node.receiver);
+    String type = "${node.type}";
+    return "TypeOperator $receiver ${node.operator} $type";
+  }
+
   String visitNot(Not node) {
     String operand = visitExpression(node.operand);
     if (usesInfixNotation(node.operand)) {
@@ -356,21 +382,6 @@
     return '!$operand';
   }
 
-  // Note: There should not be statements in the context of expressions.
-  String visitStatement(Statement node) {
-    return "$node statement in expression context";
-  }
-
-  String visitLabeledStatement(LabeledStatement node) => visitStatement(node);
-  String visitAssign(Assign node) => visitStatement(node);
-  String visitReturn(Return node) => visitStatement(node);
-  String visitBreak(Break node) => visitStatement(node);
-  String visitContinue(Continue node) => visitStatement(node);
-  String visitIf(If node) => visitStatement(node);
-  String visitWhile(While node) => visitStatement(node);
-  String visitExpressionStatement(ExpressionStatement node) {
-    return visitStatement(node);
-  }
 }
 
 /**
@@ -388,12 +399,9 @@
   String varName(Variable v) {
     String name = _names[v];
     if (name == null) {
-      name = v.name;
-      if (v.cachedName != null) {
-        name = v.cachedName;
-      }
+      String prefix = v.element == null ? 'v' : '${v.element.name}_';
       while (name == null || _usedNames.contains(name)) {
-        name = "v${_counter++}";
+        name = "$prefix${_counter++}";
       }
       _names[v] = name;
       _usedNames.add(name);
diff --git a/sdk/lib/_internal/compiler/implementation/deferred_load.dart b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
index 84b61f4..5a0335d 100644
--- a/sdk/lib/_internal/compiler/implementation/deferred_load.dart
+++ b/sdk/lib/_internal/compiler/implementation/deferred_load.dart
@@ -33,7 +33,8 @@
     PrefixElement,
     ClosureContainer,
     VoidElement,
-    TypedefElement;
+    TypedefElement,
+    AstElement;
 
 import 'util/util.dart' show
     Link;
@@ -294,7 +295,8 @@
   void _collectAllElementsAndConstantsResolvedFrom(
       Element element,
       Set<Element> elements,
-      Set<Constant> constants) {
+      Set<Constant> constants,
+      isMirrorUsage) {
 
     /// Recursively add the constant and its dependencies to [constants].
     void addConstants(Constant constant) {
@@ -311,13 +313,21 @@
     /// The collected dependent elements and constants are are added to
     /// [elements] and [constants] respectively.
     void collectDependencies(Element element) {
-      TreeElements treeElements = element is TypedefElement
-          ? element.treeElements
-          : compiler.enqueuer.resolution.getCachedElements(element);
+      // TODO(johnniwinther): Remove this when [AbstractFieldElement] has been
+      // removed.
+      if (element is! AstElement) return;
+      AstElement astElement = element;
 
       // TODO(sigurdm): We want to be more specific about this - need a better
       // way to query "liveness".
-      if (treeElements == null) return;
+      if (astElement is! TypedefElement &&
+          !compiler.enqueuer.resolution.hasBeenResolved(astElement)) {
+        return;
+      }
+
+      TreeElements treeElements = astElement.resolvedAst.elements;
+
+      assert(treeElements != null);
 
       for (Element dependency in treeElements.allElements) {
         if (Elements.isLocal(dependency) && !dependency.isFunction) continue;
@@ -344,10 +354,11 @@
     }
     if (element.isClass) {
       // If we see a class, add everything its live instance members refer
-      // to.  Static members are not relevant.
+      // to.  Static members are not relevant, unless we are processing
+      // extra dependencies due to mirrors.
       void addLiveInstanceMember(Element element) {
         if (!compiler.enqueuer.resolution.isLive(element)) return;
-        if (!element.isInstanceMember) return;
+        if (!isMirrorUsage && !element.isInstanceMember) return;
         collectDependencies(element.implementation);
       }
       ClassElement cls = element.declaration;
@@ -371,7 +382,7 @@
       ClassElement implementation =
           element.enclosingClass.implementation;
       _collectAllElementsAndConstantsResolvedFrom(
-          implementation, elements, constants);
+          implementation, elements, constants, isMirrorUsage);
     }
 
     // Other elements, in particular instance members, are ignored as
@@ -414,13 +425,16 @@
   /// Recursively traverses the graph of dependencies from [element], mapping
   /// deferred imports to each dependency it needs in the sets
   /// [_importedDeferredBy] and [_constantsDeferredBy].
-  void _mapDependencies(Element element, Import import) {
+  void _mapDependencies(Element element, Import import,
+                        {isMirrorUsage: false}) {
     Set<Element> elements = _importedDeferredBy.putIfAbsent(import,
         () => new Set<Element>());
     Set<Constant> constants = _constantsDeferredBy.putIfAbsent(import,
         () => new Set<Constant>());
 
-    if (elements.contains(element)) return;
+    // Only process elements once, unless we are doing dependencies due to
+    // mirrors, which are added in additional traversals.
+    if (!isMirrorUsage && elements.contains(element)) return;
     // Anything used directly by main will be loaded from the start
     // We do not need to traverse it again.
     if (import != _fakeMainImport && _mainElements.contains(element)) return;
@@ -432,7 +446,7 @@
 
     // This call can modify [_importedDeferredBy] and [_constantsDeferredBy].
     _collectAllElementsAndConstantsResolvedFrom(
-        element, dependentElements, constants);
+        element, dependentElements, constants, isMirrorUsage);
 
     LibraryElement library = element.library;
     for (Element dependency in dependentElements) {
@@ -458,7 +472,7 @@
       // So we have to filter them out here.
       if (element is AnalyzableElementX && !element.hasTreeElements) return;
       if (compiler.backend.isNeededForReflection(element)) {
-        _mapDependencies(element, deferredImport);
+        _mapDependencies(element, deferredImport, isMirrorUsage: true);
       }
     }
 
diff --git a/sdk/lib/_internal/compiler/implementation/dump_info.dart b/sdk/lib/_internal/compiler/implementation/dump_info.dart
index f5c8f26..2d05e8f 100644
--- a/sdk/lib/_internal/compiler/implementation/dump_info.dart
+++ b/sdk/lib/_internal/compiler/implementation/dump_info.dart
@@ -4,7 +4,11 @@
 
 library dump_info;
 
-import 'dart:convert' show HtmlEscape;
+import 'dart:convert' show
+    HtmlEscape,
+    JsonEncoder,
+    StringConversionSink,
+    ChunkedConversionSink;
 
 import 'elements/elements.dart';
 import 'elements/visitor.dart';
@@ -79,6 +83,14 @@
       ' bytes (${size * 100 ~/ programInfo.size}%)', cls: 'size');
 }
 
+String sizePercent(int size, ProgramInfo programInfo) {
+  if (size == null) {
+    return "0.000%";
+  } else {
+    return (100 * size / programInfo.size).toStringAsFixed(3) + "%";
+  }
+}
+
 /// An [InfoNode] holds information about a part the program.
 abstract class InfoNode {
   String get name;
@@ -87,6 +99,8 @@
 
   void emitHtml(ProgramInfo programInfo, StringSink buffer,
       [String indentation = '']);
+
+  Map<String, dynamic> toJson(ProgramInfo programInfo);
 }
 
 /// An [ElementNode] holds information about an [Element]
@@ -130,6 +144,25 @@
       this.extra: "",
       this.outputUnitId});
 
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    Map<String, dynamic> json = <String, dynamic>{
+      'kind': this.kind,
+      'modifiers': this.modifiers,
+      'name': this.name,
+      'type': this.type,
+      'size': this.size,
+      'sizePercent': sizePercent(this.size, programInfo),
+      'extra': this.extra
+    };
+
+    if (this.contents != null) {
+      json['children'] =
+        this.contents.map((c) => c.toJson(programInfo)).toList();
+    }
+
+    return json;
+  }
+
   void emitHtml(ProgramInfo programInfo, StringSink buffer,
       [String indentation = '']) {
     String kindString = span(esc(kind), cls: 'kind');
@@ -197,6 +230,16 @@
         code(esc(generatedCode)));
     buffer.write('\n');
   }
+
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    return <String, dynamic>{
+      'kind': 'code',
+      'description': description,
+      'code': generatedCode,
+      'size': generatedCode.length,
+      'sizePercent': sizePercent(generatedCode.length, programInfo)
+    };
+  }
 }
 
 /// Instances represent information inferred about the program such as
@@ -216,6 +259,15 @@
 
   InferredInfoNode({this.name: "", this.description, this.type});
 
+  Map<String, dynamic> toJson(ProgramInfo programInfo) {
+    return <String, dynamic>{
+      'kind': 'inferred',
+      'name': name,
+      'type': type,
+      'desc': description
+    };
+  }
+
   void emitHtml(ProgramInfo programInfo, StringBuffer buffer,
       [String indentation = '']) {
     buffer.write(indentation);
@@ -253,6 +305,15 @@
                this.compilationDuration,
                this.dart2jsVersion,
                this.outputUnitNumbering: null});
+
+  Map<String, dynamic> toJson() {
+    return <String, dynamic>{
+      'program_size': size,
+      'compile_time': compilationMoment.toString(),
+      'compile_duration': compilationDuration.toString(),
+      'dart2js_version': dart2jsVersion
+    };
+  }
 }
 
 class InfoDumpVisitor extends ElementVisitor<InfoNode> {
@@ -532,14 +593,34 @@
   void dumpInfo() {
     measure(() {
       ProgramInfo info = infoDumpVisitor.collectDumpInfo();
-      StringBuffer buffer = new StringBuffer();
-      dumpInfoHtml(info, buffer);
+
+      StringBuffer htmlBuffer = new StringBuffer();
+      dumpInfoHtml(info, htmlBuffer);
       compiler.outputProvider('', 'info.html')
-        ..add(buffer.toString())
+        ..add(htmlBuffer.toString())
+        ..close();
+
+      StringBuffer jsonBuffer = new StringBuffer();
+      dumpInfoJson(info, jsonBuffer);
+      compiler.outputProvider('', 'info.json')
+        ..add(jsonBuffer.toString())
         ..close();
     });
   }
 
+  void dumpInfoJson(ProgramInfo info, StringSink buffer) {
+    Map<String, dynamic> entire = <String, dynamic>{
+      'program': info.toJson(),
+      'libs': info.libraries.map((lib) => lib.toJson(info)).toList()
+    };
+
+    JsonEncoder encoder = const JsonEncoder();
+    ChunkedConversionSink<Object> sink =
+      encoder.startChunkedConversion(
+          new StringConversionSink.fromStringSink(buffer));
+    sink.add(entire);
+  }
+
   void dumpInfoHtml(ProgramInfo info, StringSink buffer) {
     int totalSize = info.size;
 
diff --git a/sdk/lib/_internal/compiler/implementation/elements/elements.dart b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
index e5bf871..91e5476 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/elements.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/elements.dart
@@ -293,6 +293,10 @@
   bool get isNative;
   bool get isDeferredLoaderGetter;
 
+  /// True if the element is declared in a patch library but has no
+  /// corresponding declaration in the origin library.
+  bool get isInjected;
+
   /// `true` if this element is a constructor, top level or local variable,
   /// or static field that is declared `const`.
   bool get isConst;
@@ -527,6 +531,15 @@
     }
   }
 
+  static String constructorNameForDiagnostics(String className,
+                                              String constructorName) {
+    String classNameString = className;
+    String constructorNameString = constructorName;
+    return (constructorName == '')
+        ? classNameString
+        : "$classNameString.$constructorNameString";
+  }
+
   /// Returns `true` if [name] is the name of an operator method.
   static bool isOperatorName(String name) {
     return name == 'unary-' || isUserDefinableOperator(name);
@@ -1240,6 +1253,10 @@
 
 /// An [Element] that holds a [TreeElements] mapping.
 abstract class AnalyzableElement extends Element {
+  /// Return `true` if [treeElements] have been (partially) computed for this
+  /// element.
+  bool get hasTreeElements;
+
   /// Returns the [TreeElements] that hold the resolution information for the
   /// AST nodes of this element.
   TreeElements get treeElements;
@@ -1249,7 +1266,22 @@
 ///
 /// Synthesized elements may return `null` from [node].
 abstract class AstElement extends AnalyzableElement {
+  /// The AST node of this element.
   Node get node;
+
+  bool get hasResolvedAst;
+
+  /// The defining AST node of this element with is corresponding
+  /// [TreeElements]. This is not available if [hasResolvedAst] is `false`.
+  ResolvedAst get resolvedAst;
+}
+
+class ResolvedAst {
+  final Element element;
+  final Node node;
+  final TreeElements elements;
+
+  ResolvedAst(this.element, this.node, this.elements);
 }
 
 /// A [MemberSignature] is a member of an interface.
diff --git a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
index 880746a..7d6149a 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/modelx.dart
@@ -28,7 +28,10 @@
 
 import '../dart_types.dart';
 
-import '../scanner/scannerlib.dart' show Token, EOF_TOKEN;
+import '../scanner/scannerlib.dart' show
+    EOF_TOKEN,
+    ErrorToken,
+    Token;
 
 import '../ordered_typeset.dart' show OrderedTypeSet;
 
@@ -104,6 +107,8 @@
 
   bool get isDeclaration => true;
 
+  bool get isInjected => !isPatch && implementationLibrary.isPatch;
+
   Element get implementation => this;
 
   Element get declaration => this;
@@ -152,7 +157,7 @@
     // The unary '-' operator has a special element name (specified).
     if (needle == 'unary-') needle = '-';
     for (Token t = token; EOF_TOKEN != t.kind; t = t.next) {
-      if (needle == t.value) return t;
+      if (t is !ErrorToken && needle == t.value) return t;
     }
     return token;
   }
@@ -265,9 +270,15 @@
 
   void diagnose(Element context, DiagnosticListener listener) {}
 
+  bool get hasTreeElements => analyzableElement.hasTreeElements;
+
   TreeElements get treeElements => analyzableElement.treeElements;
 
-  AnalyzableElement get analyzableElement => outermostEnclosingMemberOrTopLevel;
+  AnalyzableElement get analyzableElement {
+    Element element = outermostEnclosingMemberOrTopLevel;
+    if (element.isAbstractField || element.isPrefix) return element.library;
+    return element;
+  }
 }
 
 /**
@@ -297,6 +308,8 @@
 
   bool get isErroneous => true;
 
+  bool get isSynthesized => true;
+
   AbstractFieldElement abstractField;
 
   unsupported() {
@@ -305,6 +318,8 @@
 
   Link<MetadataAnnotation> get metadata => unsupported();
   get node => unsupported();
+  get hasResolvedAst => false;
+  get resolvedAst => unsupported();
   get type => unsupported();
   get cachedNode => unsupported();
   get functionSignature => unsupported();
@@ -965,11 +980,11 @@
 
   String toString() {
     if (origin != null) {
-      return 'patch library(${getLibraryOrScriptName()})';
+      return 'patch library(${canonicalUri})';
     } else if (patch != null) {
-      return 'origin library(${getLibraryOrScriptName()})';
+      return 'origin library(${canonicalUri})';
     } else {
-      return 'library(${getLibraryOrScriptName()})';
+      return 'library(${canonicalUri})';
     }
   }
 
@@ -1017,7 +1032,9 @@
 }
 
 class TypedefElementX extends ElementX
-    with AnalyzableElementX, TypeDeclarationElementX<TypedefType>
+    with AstElementMixin,
+         AnalyzableElementX,
+         TypeDeclarationElementX<TypedefType>
     implements TypedefElement {
   Typedef cachedNode;
 
@@ -1080,6 +1097,9 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitTypedefElement(this);
+
+  // A typedef cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
 }
 
 // This class holds common information for a list of variable or field
@@ -1106,7 +1126,7 @@
   DartType computeType(Element element, Compiler compiler) => type;
 }
 
-class VariableElementX extends ElementX with AnalyzableElementX
+class VariableElementX extends ElementX with AstElementMixin
     implements VariableElement {
   final Token token;
   final VariableList variables;
@@ -1138,6 +1158,9 @@
     variables.metadata = variables.metadata.prepend(annotation);
   }
 
+  // A variable cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
+
   VariableDefinitions get node {
     assert(invariant(this, definitionsCache != null,
         message: "Node has not been computed for $this."));
@@ -1194,12 +1217,13 @@
   }
 
   DartType computeType(Compiler compiler) {
+    if (variables.type != null) return variables.type;
     // Call [parseNode] to ensure that [definitionsCache] and [initializerCache]
     // are set as a consequence of calling [computeType].
-    compiler.withCurrentElement(this, () {
+    return compiler.withCurrentElement(this, () {
       parseNode(compiler);
+      return variables.computeType(this, compiler);
     });
-    return variables.computeType(this, compiler);
   }
 
   DartType get type {
@@ -1227,7 +1251,8 @@
   }
 }
 
-class FieldElementX extends VariableElementX implements FieldElement {
+class FieldElementX extends VariableElementX
+    with AnalyzableElementX implements FieldElement {
   List<FunctionElement> nestedClosures = new List<FunctionElement>();
 
   FieldElementX(Identifier name,
@@ -1264,7 +1289,8 @@
 /// patched with the corresponding parameter of the patch method. This is done
 /// to ensure that default values on parameters are computed once (on the
 /// origin parameter) but can be found through both the origin and the patch.
-class ParameterElementX extends ElementX with PatchMixin<ParameterElement>
+class ParameterElementX extends ElementX
+    with PatchMixin<ParameterElement>, AstElementMixin
     implements ParameterElement {
   final VariableDefinitions definitions;
   final Identifier identifier;
@@ -1315,6 +1341,9 @@
   FunctionType get functionType => type;
 
   accept(ElementVisitor visitor) => visitor.visitVariableElement(this);
+
+  // A parameter is defined by the declaration element.
+  AstElement get definingElement => declaration;
 }
 
 class AbstractFieldElementX extends ElementX implements AbstractFieldElement {
@@ -1440,8 +1469,8 @@
       if (requiredParameterCount != signature.requiredParameterCount) {
         return false;
       }
-      Set<String> names = optionalParameters.toList().map(
-          (Element element) => element.name).toSet();
+      Set<String> names = optionalParameters.mapToSet(
+          (Element element) => element.name);
       for (Element namedParameter in signature.optionalParameters) {
         if (!names.contains(namedParameter.name)) {
           return false;
@@ -1461,8 +1490,8 @@
   }
 }
 
-abstract class FunctionElementX
-    extends ElementX with AnalyzableElementX, PatchMixin<FunctionElement>
+abstract class BaseFunctionElementX
+    extends ElementX with PatchMixin<FunctionElement>, AstElementMixin
     implements FunctionElement {
   DartType typeCache;
   final Modifiers modifiers;
@@ -1475,20 +1504,11 @@
 
   AbstractFieldElement abstractField;
 
-  FunctionElementX(String name,
-                   ElementKind kind,
-                   Modifiers modifiers,
-                   Element enclosing,
-                   bool hasNoBody)
-      : this.tooMuchOverloading(name, kind, modifiers, enclosing, null,
-                                hasNoBody);
-
-  FunctionElementX.tooMuchOverloading(String name,
-                                      ElementKind kind,
-                                      this.modifiers,
-                                      Element enclosing,
-                                      this.functionSignatureCache,
-                                      bool hasNoBody)
+  BaseFunctionElementX(String name,
+                       ElementKind kind,
+                       Modifiers this.modifiers,
+                       Element enclosing,
+                       bool hasNoBody)
       : super(name, kind, enclosing),
         _hasNoBody = hasNoBody {
     assert(modifiers != null);
@@ -1545,9 +1565,22 @@
   }
 
   accept(ElementVisitor visitor) => visitor.visitFunctionElement(this);
+
+  // A function is defined by the implementation element.
+  AstElement get definingElement => implementation;
 }
 
-class LocalFunctionElementX extends FunctionElementX {
+abstract class FunctionElementX extends BaseFunctionElementX
+    with AnalyzableElementX {
+  FunctionElementX(String name,
+                   ElementKind kind,
+                   Modifiers modifiers,
+                   Element enclosing,
+                   bool hasNoBody)
+      : super(name, kind, modifiers, enclosing, hasNoBody);
+}
+
+class LocalFunctionElementX extends BaseFunctionElementX {
   final FunctionExpression node;
 
   LocalFunctionElementX(String name,
@@ -1651,7 +1684,7 @@
   FunctionExpression get node => null;
 }
 
-class ConstructorBodyElementX extends FunctionElementX
+class ConstructorBodyElementX extends BaseFunctionElementX
     implements ConstructorBodyElement {
   FunctionElement constructor;
 
@@ -1677,6 +1710,8 @@
 
   Element get outermostEnclosingMemberOrTopLevel => constructor;
 
+  Element get analyzableElement => constructor.analyzableElement;
+
   accept(ElementVisitor visitor) => visitor.visitConstructorBodyElement(this);
 }
 
@@ -1829,7 +1864,8 @@
 }
 
 abstract class BaseClassElementX extends ElementX
-    with AnalyzableElementX,
+    with AstElementMixin,
+         AnalyzableElementX,
          TypeDeclarationElementX<InterfaceType>,
          PatchMixin<ClassElement>,
          ClassMemberMixin
@@ -2222,12 +2258,24 @@
   // TODO(johnniwinther): Remove these when issue 18630 is fixed.
   ClassElement get patch => super.patch;
   ClassElement get origin => super.origin;
+
+  // A class declaration is defined by the declaration element.
+  AstElement get definingElement => declaration;
 }
 
 abstract class ClassElementX extends BaseClassElementX {
-  Link<Element> localMembers = const Link<Element>();
+  Link<Element> localMembersReversed = const Link<Element>();
   final ScopeX localScope = new ScopeX();
 
+  Link<Element> localMembersCache;
+
+  Link<Element> get localMembers {
+    if (localMembersCache == null) {
+      localMembersCache = localMembersReversed.reverse();
+    }
+    return localMembersCache;
+  }
+
   ClassElementX(String name, Element enclosing, int id, int initialState)
       : super(name, enclosing, id, initialState);
 
@@ -2237,7 +2285,8 @@
   bool get hasLocalScopeMembers => !localScope.isEmpty;
 
   void addMember(Element element, DiagnosticListener listener) {
-    localMembers = localMembers.prepend(element);
+    localMembersCache = null;
+    localMembersReversed = localMembersReversed.prepend(element);
     addToScope(element, listener);
   }
 
@@ -2257,7 +2306,7 @@
   }
 
   void forEachLocalMember(void f(Element member)) {
-    localMembers.reverse().forEach(f);
+    localMembers.forEach(f);
   }
 
   bool get hasConstructor {
@@ -2269,9 +2318,8 @@
   }
 
   void setDefaultConstructor(FunctionElement constructor, Compiler compiler) {
-    addToScope(constructor, compiler);
     // The default constructor, although synthetic, is part of a class' API.
-    localMembers = localMembers.prepend(constructor);
+    addMember(constructor, compiler);
   }
 
   Link<DartType> computeTypeParameters(Compiler compiler) {
@@ -2442,7 +2490,8 @@
   accept(ElementVisitor visitor) => visitor.visitTargetElement(this);
 }
 
-class TypeVariableElementX extends ElementX implements TypeVariableElement {
+class TypeVariableElementX extends ElementX with AstElementMixin
+    implements TypeVariableElement {
   final Node node;
   TypeVariableType typeCache;
   DartType boundCache;
@@ -2471,6 +2520,9 @@
   Token get position => node.getBeginToken();
 
   accept(ElementVisitor visitor) => visitor.visitTypeVariableElement(this);
+
+  // A type variable cannot be patched therefore defines itself.
+  AstElement get definingElement => this;
 }
 
 /**
@@ -2569,3 +2621,24 @@
     patch.origin = this;
   }
 }
+
+/// Abstract implementation of the [AstElement] interface.
+abstract class AstElementMixin implements AstElement {
+  /// The element whose node defines this element.
+  ///
+  /// For patched functions the defining element is the patch element found
+  /// through [implementation] since its node define the implementation of the
+  /// function. For patched classes the defining element is the origin element
+  /// found through [declaration] since its node define the inheritance relation
+  /// for the class. For unpatched elements the defining element is the element
+  /// itself.
+  AstElement get definingElement;
+
+  bool get hasResolvedAst => definingElement.hasTreeElements;
+
+  ResolvedAst get resolvedAst {
+    return new ResolvedAst(declaration,
+        definingElement.node, definingElement.treeElements);
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/elements/names.dart b/sdk/lib/_internal/compiler/implementation/elements/names.dart
index 7dfdf3a..56f3bf1 100644
--- a/sdk/lib/_internal/compiler/implementation/elements/names.dart
+++ b/sdk/lib/_internal/compiler/implementation/elements/names.dart
@@ -45,6 +45,7 @@
   /// Returns `true` if this name is the same as [other] not taking the library
   /// privacy into account.
   bool isSimilarTo(Name other);
+  int get similarHashCode;
 }
 
 class PublicName implements Name {
@@ -61,7 +62,7 @@
 
   bool get isPrivate => false;
 
-  int get hashCode => text.hashCode + 11 * isSetter.hashCode;
+  int get hashCode => similarHashCode;
 
   bool operator ==(other) {
     if (other is! PublicName) return false;
@@ -70,6 +71,7 @@
 
   bool isSimilarTo(Name other) =>
       text == other.text && isSetter == other.isSetter;
+  int get similarHashCode => text.hashCode + 11 * isSetter.hashCode;
 
   String toString() => isSetter ? '$text=' : text;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/enqueue.dart b/sdk/lib/_internal/compiler/implementation/enqueue.dart
index a33db7f..4ce3d5c 100644
--- a/sdk/lib/_internal/compiler/implementation/enqueue.dart
+++ b/sdk/lib/_internal/compiler/implementation/enqueue.dart
@@ -85,6 +85,7 @@
   Enqueuer(this.name, this.compiler, this.itemCompilationContextCreator);
 
   Queue<WorkItem> get queue;
+  bool get queueIsEmpty => queue.isEmpty;
 
   /// Returns [:true:] if this enqueuer is the resolution enqueuer.
   bool get isResolutionQueue => false;
@@ -130,11 +131,6 @@
     registerInstantiatedType(cls.rawType, registry);
   }
 
-  void registerTypeLiteral(DartType type, Registry registry) {
-    registerInstantiatedClass(compiler.typeClass, registry);
-    compiler.backend.registerTypeLiteral(type, this, registry);
-  }
-
   bool checkNoEnqueuedInvokedInstanceMethods() {
     task.measure(() {
       // Run through the classes and see if we need to compile methods.
@@ -312,11 +308,6 @@
     });
   }
 
-  /// Called when [:const Symbol(name):] is seen.
-  void registerConstSymbol(String name, Registry registry) {
-    compiler.backend.registerConstSymbol(name, registry);
-  }
-
   void pretendElementWasUsed(Element element, Registry registry) {
     if (!compiler.backend.isNeededForReflection(element)) return;
     if (Elements.isUnresolved(element)) {
@@ -348,11 +339,6 @@
     }
   }
 
-  /// Called when [:new Symbol(...):] is seen.
-  void registerNewSymbol(Registry registry) {
-    compiler.backend.registerNewSymbol(registry);
-  }
-
   void enqueueEverything() {
     if (hasEnqueuedEverything) return;
     compiler.log('Enqueuing everything');
@@ -455,8 +441,11 @@
 
   void registerGetOfStaticFunction(FunctionElement element) {
     registerStaticUse(element);
-    registerInstantiatedClass(compiler.closureClass,
-                              compiler.globalDependencies);
+    if (compiler.closureClass != null) {
+      // TODO(johnniwinther): Move this to the JavaScript backend.
+      registerInstantiatedClass(compiler.closureClass,
+                                compiler.globalDependencies);
+    }
     universe.staticFunctionsNeedingGetter.add(element);
   }
 
@@ -502,7 +491,6 @@
     // against the type variable of a typedef.
     assert(type.kind != TypeKind.TYPE_VARIABLE ||
            !type.element.enclosingElement.isTypedef);
-    compiler.backend.registerIsCheck(type, this, registry);
   }
 
   /**
@@ -514,11 +502,6 @@
     universe.usingFactoryWithTypeArguments = true;
   }
 
-  void registerAsCheck(DartType type, Registry registry) {
-    registerIsCheck(type, registry);
-    compiler.backend.registerAsCheck(type, this, registry);
-  }
-
   void registerGenericCallMethod(Element element, Registry registry) {
     compiler.backend.registerGenericCallMethod(element, this, registry);
     universe.genericCallMethods.add(element);
@@ -582,7 +565,7 @@
    *
    * Invariant: Key elements are declaration elements.
    */
-  final Map<Element, TreeElements> resolvedElements;
+  final Set<AstElement> resolvedElements;
 
   final Queue<ResolutionWorkItem> queue;
 
@@ -595,41 +578,35 @@
   ResolutionEnqueuer(Compiler compiler,
                      ItemCompilationContext itemCompilationContextCreator())
       : super('resolution enqueuer', compiler, itemCompilationContextCreator),
-        resolvedElements = new Map<Element, TreeElements>(),
+        resolvedElements = new Set<AstElement>(),
         queue = new Queue<ResolutionWorkItem>(),
         deferredTaskQueue = new Queue<DeferredTask>();
 
   bool get isResolutionQueue => true;
 
-  bool isProcessed(Element member) => resolvedElements.containsKey(member);
+  bool isProcessed(Element member) => resolvedElements.contains(member);
+
+  /// Returns `true` if [element] has been processed by the resolution enqueuer.
+  bool hasBeenResolved(Element element) {
+    return resolvedElements.contains(element.analyzableElement.declaration);
+  }
+
+  /// Registers [element] as resolved for the resolution enqueuer.
+  void registerResolvedElement(AstElement element) {
+    resolvedElements.add(element);
+  }
 
   /// Returns [:true:] if [element] has actually been used.
   bool isLive(Element element) {
     if (seenClasses.contains(element)) return true;
-    if (getCachedElements(element) != null) return true;
+    if (hasBeenResolved(element)) return true;
     return false;
   }
 
-  TreeElements getCachedElements(Element element) {
-    // TODO(ngeoffray): Get rid of this check.
-    if (element.enclosingElement.isClosure) {
-      closureMapping.ClosureClassElement cls = element.enclosingElement;
-      element = cls.methodElement;
-    } else if (element.isGenerativeConstructorBody) {
-      ConstructorBodyElement body = element;
-      element = body.constructor;
-    }
-    Element owner = element.outermostEnclosingMemberOrTopLevel;
-    if (owner == null) {
-      owner = element;
-    }
-    return resolvedElements[owner.declaration];
-  }
-
   void internalAddToWorkList(Element element) {
     assert(invariant(element, element is AnalyzableElement,
         message: 'Element $element is not analyzable.'));
-    if (getCachedElements(element) != null) return;
+    if (hasBeenResolved(element)) return;
     if (queueIsClosed) {
       throw new SpannableAssertionFailure(element,
           "Resolution work list is closed. Trying to add $element.");
@@ -739,15 +716,21 @@
   final Map<Element, js.Expression> generatedCode =
       new Map<Element, js.Expression>();
 
+  final Set<Element> newlyEnqueuedElements;
+
   CodegenEnqueuer(Compiler compiler,
                   ItemCompilationContext itemCompilationContextCreator())
-      : super('codegen enqueuer', compiler, itemCompilationContextCreator),
-        queue = new Queue<CodegenWorkItem>();
+      : queue = new Queue<CodegenWorkItem>(),
+        newlyEnqueuedElements = compiler.cacheStrategy.newSet(),
+        super('codegen enqueuer', compiler, itemCompilationContextCreator);
 
   bool isProcessed(Element member) =>
       member.isAbstract || generatedCode.containsKey(member);
 
   void internalAddToWorkList(Element element) {
+    if (compiler.hasIncrementalSupport) {
+      newlyEnqueuedElements.add(element);
+    }
     // Don't generate code for foreign elements.
     if (element.isForeign(compiler)) return;
 
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
index 361d2f2..ab4bb45 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart
@@ -509,7 +509,8 @@
 
   @override
   Selector newTypedSelector(ConcreteType receiver, Selector selector) {
-    return new TypedSelector(concreteTypeToTypeMask(receiver), selector);
+    return new TypedSelector(concreteTypeToTypeMask(receiver), selector,
+        compiler);
   }
 
   @override
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
index 4b3d0b5..90e1379 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/inferrer_visitor.dart
@@ -630,7 +630,7 @@
                   [LocalsHandler<T> handler])
     : this.analyzedElement = analyzedElement,
       this.locals = handler,
-      super(compiler.enqueuer.resolution.getCachedElements(analyzedElement),
+      super(analyzedElement.resolvedAst.elements,
             compiler) {
     if (handler != null) return;
     Node node = analyzedElement.node;
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
index e74d9ab..1e9b36c 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/simple_types_inferrer.dart
@@ -118,7 +118,7 @@
   }
 
   Selector newTypedSelector(TypeMask receiver, Selector selector) {
-    return new TypedSelector(receiver, selector);
+    return new TypedSelector(receiver, selector, compiler);
   }
 
   TypeMask addPhiInput(Element element, TypeMask phiType, TypeMask newType) {
@@ -352,13 +352,13 @@
   }
 
   void updateSelectorInTree(
-      Element owner, Spannable node, Selector selector) {
+      AstElement owner, Spannable node, Selector selector) {
     if (node is ir.Node) {
       // TODO(lry): update selector for IrInvokeDynamic.
       throw "updateSelector for IR node $node";
     }
     ast.Node astNode = node;
-    var elements = compiler.enqueuer.resolution.getCachedElements(owner);
+    TreeElements elements = owner.resolvedAst.elements;
     if (astNode.asSendSet() != null) {
       if (selector.isSetter || selector.isIndexSet) {
         elements.setSelector(node, selector);
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
index f8d4594..2b92fb5 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart
@@ -364,7 +364,7 @@
     // kinds of [TypeInformation] have the empty type at this point of
     // analysis.
     return info.isConcrete
-        ? new TypedSelector(info.type, selector)
+        ? new TypedSelector(info.type, selector, compiler)
         : selector;
   }
 
@@ -1014,8 +1014,11 @@
   Iterable<Element> sortResolvedElements() {
     int max = 0;
     Map<int, Setlet<Element>> methodSizes = new Map<int, Setlet<Element>>();
-    compiler.enqueuer.resolution.resolvedElements.forEach(
-      (Element element, TreeElementMapping mapping) {
+    compiler.enqueuer.resolution.resolvedElements.forEach((AstElement element) {
+        // TODO(ngeoffray): Not sure why the resolver would put a null
+        // mapping.
+        if (!compiler.enqueuer.resolution.hasBeenResolved(element)) return;
+        TreeElementMapping mapping = element.resolvedAst.elements;
         element = element.implementation;
         if (element.impliesType) return;
         assert(invariant(element,
@@ -1025,9 +1028,6 @@
             element.isGetter ||
             element.isSetter,
             message: 'Unexpected element kind: ${element.kind}'));
-        // TODO(ngeoffray): Not sure why the resolver would put a null
-        // mapping.
-        if (mapping == null) return;
         if (element.isAbstract) return;
         // Put the other operators in buckets by length, later to be added in
         // length order.
diff --git a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
index 20c4dc3..e6727ae 100644
--- a/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/inferrer/type_graph_nodes.dart
@@ -556,7 +556,7 @@
     if (selector.mask != receiverType) {
       return receiverType == inferrer.compiler.typesTask.dynamicType
           ? selector.asUntyped
-          : new TypedSelector(receiverType, selector);
+          : new TypedSelector(receiverType, selector, inferrer.compiler);
     } else {
       return selector;
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
index 984df98..209bd20 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_builder.dart
@@ -14,6 +14,7 @@
 import '../dart_backend/dart_backend.dart' show DartBackend;
 import '../universe/universe.dart' show SelectorKind;
 import '../util/util.dart' show Link;
+import '../helpers/helpers.dart';
 
 /**
  * This task iterates through all resolved elements and builds [ir.Node]s. The
@@ -47,10 +48,10 @@
   void buildNodes() {
     if (!irEnabled()) return;
     measure(() {
-      Map<Element, TreeElements> resolved =
-          compiler.enqueuer.resolution.resolvedElements;
-      resolved.forEach((Element element, TreeElements elementsMapping) {
+      Set<Element> resolved = compiler.enqueuer.resolution.resolvedElements;
+      resolved.forEach((AstElement element) {
         if (canBuild(element)) {
+          TreeElements elementsMapping = element.resolvedAst.elements;
           element = element.implementation;
 
           SourceFile sourceFile = elementSourceFile(element);
@@ -96,28 +97,25 @@
     FunctionElement function = element.asFunctionElement();
     if (function == null) return false;
 
+    if (!compiler.backend.shouldOutput(function)) return false;
+
     // TODO(kmillikin): support functions with optional parameters.
     FunctionSignature signature = function.functionSignature;
     if (signature.optionalParameterCount > 0) return false;
 
-    SupportedTypeVerifier typeVerifier = new SupportedTypeVerifier();
-    if (!typeVerifier.visit(signature.type.returnType, null)) return false;
-    bool parameters_ok = true;
-    signature.forEachParameter((parameter) {
-      parameters_ok =
-          parameters_ok && typeVerifier.visit(parameter.type, null);
-    });
-    if (!parameters_ok) return false;
-
     // TODO(kmillikin): support getters and setters and static class members.
     // With the current Dart Tree emitter they just require recognizing them
     // and generating the correct syntax.
     if (element.isGetter || element.isSetter) return false;
-    if (element.enclosingElement.isClass) return false;
 
     // TODO(lry): support native functions (also in [visitReturn]).
     if (function.isNative) return false;
 
+    // TODO(asgerf): support syntax for redirecting factory constructors
+    if (function is ConstructorElement && function.isRedirectingFactory) {
+      return false;
+    }
+
     return true;
   }
 
@@ -191,6 +189,7 @@
   // used to determine if a join-point continuation needs to be passed
   // arguments, and what the arguments are.
   final Map<Element, int> variableIndex;
+  final List<Element> index2variable;
   final List<ir.Parameter> freeVars;
   final List<ir.Primitive> assignedVars;
 
@@ -201,6 +200,7 @@
         variableIndex = <Element, int>{},
         freeVars = null,
         assignedVars = <ir.Primitive>[],
+        index2variable = <Element>[],
         super(elements, compiler);
 
   /// Construct a delimited visitor.
@@ -214,6 +214,7 @@
             growable: false),
         assignedVars = new List<ir.Primitive>.generate(
             parent.assignedVars.length, (_) => null),
+        index2variable = new List<Element>.from(parent.index2variable),
         super(parent.elements, parent.compiler);
 
   /**
@@ -240,6 +241,7 @@
       parameters.add(parameter);
       variableIndex[parameterElement] = assignedVars.length;
       assignedVars.add(parameter);
+      index2variable.add(parameterElement);
     });
 
     visit(function.body);
@@ -345,7 +347,7 @@
         // left and right subterms we will still have a join continuation with
         // possibly arguments passed to it.  Such singly-used continuations
         // are eliminated by the shrinking conversions.
-        parameters.add(new ir.Parameter(null));
+        parameters.add(new ir.Parameter(index2variable[i]));
         ir.Primitive reachingDefinition =
             assignedVars[i] == null ? freeVars[i] : assignedVars[i];
         leftArguments.add(
@@ -395,7 +397,7 @@
       // If not, no value needs to be passed to the join point.
       if (reachingAssignment == null) continue;
 
-      parameters.add(new ir.Parameter(null));
+      parameters.add(new ir.Parameter(index2variable[i]));
       ir.Definition entryAssignment = assignedVars[i];
       entryArguments.add(
           entryAssignment == null ? freeVars[i] : entryAssignment);
@@ -620,6 +622,9 @@
 
   ir.Primitive visitVariableDefinitions(ast.VariableDefinitions node) {
     assert(isOpen);
+    if (node.modifiers.isConst) {
+      return giveup(node, 'Local const'); // TODO(asgerf): const vars
+    }
     for (ast.Node definition in node.definitions.nodes) {
       Element element = elements[definition];
       // Definitions are either SendSets if there is an initializer, or
@@ -628,16 +633,22 @@
         assert(!definition.arguments.isEmpty);
         assert(definition.arguments.tail.isEmpty);
         ir.Primitive initialValue = visit(definition.arguments.head);
+        // In case a primitive was introduced for the initializer expression,
+        // use this variable element to help derive a good name for it.
+        initialValue.useElementAsHint(element);
         variableIndex[element] = assignedVars.length;
         assignedVars.add(initialValue);
+        index2variable.add(element);
       } else {
         assert(definition is ast.Identifier);
         // The initial value is null.
         // TODO(kmillikin): Consider pooling constants.
         ir.Constant constant = new ir.Constant(constantSystem.createNull());
+        constant.useElementAsHint(element);
         add(new ir.LetPrim(constant));
         variableIndex[element] = assignedVars.length;
         assignedVars.add(constant);
+        index2variable.add(element);
       }
     }
     return null;
@@ -650,7 +661,7 @@
   ir.Primitive visitReturn(ast.Return node) {
     assert(isOpen);
     // TODO(lry): support native returns.
-    if (node.beginToken.value == 'native') return giveup();
+    if (node.beginToken.value == 'native') return giveup(node, 'Native return');
     ir.Primitive value;
     if (node.expression == null) {
       value = new ir.Constant(constantSystem.createNull());
@@ -767,52 +778,43 @@
     return constant;
   }
 
-  bool isSupportedConst(Constant constant) {
-    return const SupportedConstantVisitor().visit(constant);
-  }
-
   ir.Primitive visitLiteralList(ast.LiteralList node) {
     assert(isOpen);
-    ir.Primitive result;
-    if (node.isConst) {
-      // TODO(sigurdm): Remove when all constants are supported.
-      Constant constant = getConstantForNode(node);
-      if (!isSupportedConst(constant)) return giveup();
-      result = new ir.Constant(constant);
-    } else {
-      List<ir.Primitive> values = new List<ir.Primitive>();
-      node.elements.nodes.forEach((ast.Node node) {
-        values.add(visit(node));
-      });
-      result = new ir.LiteralList(values);
-    }
+    List<ir.Primitive> values = node.elements.nodes.mapToList(visit);
+    Constant constant = node.isConst ? getConstantForNode(node) : null;
+    GenericType type = elements.getType(node);
+    ir.Primitive result = new ir.LiteralList(type, values, constant);
     add(new ir.LetPrim(result));
     return result;
   }
 
   ir.Primitive visitLiteralMap(ast.LiteralMap node) {
     assert(isOpen);
-    ir.Primitive result;
-    if (node.isConst) {
-      // TODO(sigurdm): Remove when all constants are supported.
-      Constant constant = getConstantForNode(node);
-      if (!isSupportedConst(constant)) return giveup();
-      result = new ir.Constant(constant);
-    } else {
-      List<ir.Primitive> keys = new List<ir.Primitive>();
-      List<ir.Primitive> values = new List<ir.Primitive>();
-      node.entries.nodes.forEach((ast.LiteralMapEntry node) {
-        keys.add(visit(node.key));
-        values.add(visit(node.value));
-      });
-      result = new ir.LiteralMap(keys, values);
-    }
+    List<ir.Primitive> keys = new List<ir.Primitive>();
+    List<ir.Primitive> values = new List<ir.Primitive>();
+    node.entries.nodes.forEach((ast.LiteralMapEntry node) {
+      keys.add(visit(node.key));
+      values.add(visit(node.value));
+    });
+    GenericType type = elements.getType(node);
+    Constant constant = node.isConst ? getConstantForNode(node) : null;
+    ir.Primitive result = new ir.LiteralMap(type, keys, values, constant);
     add(new ir.LetPrim(result));
     return result;
   }
 
-  // TODO(kmillikin): other literals.
-  //   LiteralSymbol
+  ir.Primitive visitLiteralSymbol(ast.LiteralSymbol node) {
+    assert(isOpen);
+    ir.Constant constant = new ir.Constant(getConstantForNode(node));
+    add(new ir.LetPrim(constant));
+    return constant;
+  }
+
+  ir.Primitive visitIdentifier(ast.Identifier node) {
+    assert(isOpen);
+    assert(node.isThis());
+    return lookupThis();
+  }
 
   ir.Primitive visitParenthesizedExpression(
       ast.ParenthesizedExpression node) {
@@ -840,6 +842,12 @@
     return receiver;
   }
 
+  ir.Primitive lookupThis() {
+    ir.Primitive result = new ir.This();
+    add(new ir.LetPrim(result));
+    return result;
+  }
+
   ir.Primitive lookupLocal(Element element) {
     int index = variableIndex[element];
     ir.Primitive value = assignedVars[index];
@@ -849,7 +857,7 @@
   // ==== Sends ====
   ir.Primitive visitAssert(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    return giveup(node, 'Assert');
   }
 
   ir.Primitive visitNamedArgument(ast.NamedArgument node) {
@@ -889,7 +897,7 @@
   ir.Primitive visitDynamicSend(ast.Send node) {
     assert(isOpen);
     if (node.receiver == null || node.receiver.isSuper()) {
-      return giveup();
+      return giveup(node, 'DynamicSend without receiver, or super receiver');
     }
     Selector selector = elements.getSelector(node);
     ir.Primitive receiver = visit(node.receiver);
@@ -911,7 +919,9 @@
     if (Elements.isLocal(element)) {
       return lookupLocal(element);
     } else if (element == null || Elements.isInstanceField(element)) {
-      ir.Primitive receiver = visit(node.receiver);
+      ir.Primitive receiver = node.receiver == null
+          ? lookupThis()
+          : visit(node.receiver);
       ir.Parameter v = new ir.Parameter(null);
       ir.Continuation k = new ir.Continuation([v]);
       Selector selector = elements.getSelector(node);
@@ -919,13 +929,52 @@
       ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, []);
       add(new ir.LetCont(k, invoke));
       return v;
+    } else if (element.isField) {
+      ir.Parameter v = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([v]);
+      Selector selector = elements.getSelector(node);
+      assert(selector.kind == SelectorKind.GETTER);
+      ir.InvokeStatic invoke = new ir.InvokeStatic(element, selector, k, []);
+      add(new ir.LetCont(k, invoke));
+      return v;
+    } else if (Elements.isStaticOrTopLevelFunction(element)) {
+      ir.Primitive prim = new ir.Constant(new FunctionConstant(element));
+      add(new ir.LetPrim(prim));
+      return prim;
     } else {
-      // TODO(asgerf): static and top-level
-      // NOTE: Index-getters are OperatorSends, not GetterSends
-      return giveup();
+      return giveup(node); // TODO(asgerf): figure out what's missing here
     }
   }
 
+  ir.Primitive buildNegation(ir.Primitive condition) {
+    // ! e is translated as e ? false : true
+
+    // Add a continuation parameter for the result of the expression.
+    ir.Parameter resultParameter = new ir.Parameter(null);
+
+    ir.Continuation joinContinuation = new ir.Continuation([resultParameter]);
+    ir.Continuation thenContinuation = new ir.Continuation([]);
+    ir.Continuation elseContinuation = new ir.Continuation([]);
+
+    ir.Constant trueConstant =
+        new ir.Constant(constantSystem.createBool(true));
+    ir.Constant falseConstant =
+        new ir.Constant(constantSystem.createBool(false));
+
+    thenContinuation.body = new ir.LetPrim(falseConstant)
+        ..plug(new ir.InvokeContinuation(joinContinuation, [falseConstant]));
+    elseContinuation.body = new ir.LetPrim(trueConstant)
+        ..plug(new ir.InvokeContinuation(joinContinuation, [trueConstant]));
+
+    add(new ir.LetCont(joinContinuation,
+          new ir.LetCont(thenContinuation,
+            new ir.LetCont(elseContinuation,
+              new ir.Branch(new ir.IsTrue(condition),
+                            thenContinuation,
+                            elseContinuation)))));
+    return resultParameter;
+  }
+
   ir.Primitive translateLogicalOperator(ast.Operator op,
                                         ast.Expression left,
                                         ast.Expression right) {
@@ -1027,7 +1076,36 @@
       assert(node.arguments.tail.isEmpty);
       return translateLogicalOperator(op, node.receiver, node.arguments.head);
     }
-    return giveup();
+    if (op.source == "!") {
+      assert(node.receiver != null);
+      assert(node.arguments.isEmpty);
+      return buildNegation(visit(node.receiver));
+    }
+    if (op.source == "!=") {
+      assert(node.receiver != null);
+      assert(!node.arguments.isEmpty);
+      assert(node.arguments.tail.isEmpty);
+      return buildNegation(visitDynamicSend(node));
+    }
+    if (op.source == "is") {
+      DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+      if (type.isMalformed) return giveup(node, "Malformed type for is");
+      ir.Primitive receiver = visit(node.receiver);
+      ir.IsCheck isCheck = new ir.IsCheck(receiver, type);
+      add(new ir.LetPrim(isCheck));
+      return node.isIsNotCheck ? buildNegation(isCheck) : isCheck;
+    }
+    if (op.source == "as") {
+      DartType type = elements.getType(node.typeAnnotationFromIsCheckOrCast);
+      if (type.isMalformed) return giveup(node, "Malformed type for as");
+      ir.Primitive receiver = visit(node.receiver);
+      ir.Parameter v = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([v]);
+      ir.AsCast asCast = new ir.AsCast(receiver, type, k);
+      add(new ir.LetCont(k, asCast));
+      return v;
+    }
+    return giveup(node);
   }
 
   // Build(StaticSend(f, arguments), C) = C[C'[InvokeStatic(f, xs)]]
@@ -1035,28 +1113,23 @@
   ir.Primitive visitStaticSend(ast.Send node) {
     assert(isOpen);
     Element element = elements[node];
-    // TODO(lry): support static fields. (separate IR instruction?)
-    if (element.isField || element.isGetter) return giveup();
-    // TODO(kmillikin): support static setters.
-    if (element.isSetter) return giveup();
     // TODO(lry): support constructors / factory calls.
-    if (element.isConstructor) return giveup();
+    if (element.isConstructor) return giveup(node, 'StaticSend: constructor');
     // TODO(lry): support foreign functions.
-    if (element.isForeign(compiler)) return giveup();
+    if (element.isForeign(compiler)) return giveup(node, 'StaticSend: foreign');
     // TODO(lry): for elements that could not be resolved emit code to throw a
     // [NoSuchMethodError].
-    if (element.isErroneous) return giveup();
+    if (element.isErroneous) return giveup(node, 'StaticSend: erroneous');
     // TODO(lry): generate IR for object identicality.
-    if (element == compiler.identicalFunction) giveup();
+    if (element == compiler.identicalFunction) {
+      return giveup(node, 'StaticSend: identical');
+    }
 
     Selector selector = elements.getSelector(node);
 
-    // TODO(kmillikin): support a receiver: A.m().
-    if (node.receiver != null) return giveup();
-
     // TODO(lry): support default arguments, need support for locals.
-    List<ir.Definition> arguments = node.arguments.toList(growable:false)
-                                       .map(visit).toList(growable:false);
+    List<ir.Definition> arguments = node.arguments.mapToList(visit,
+                                                             growable:false);
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
     ir.Expression invoke =
@@ -1067,72 +1140,152 @@
 
   ir.Primitive visitSuperSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    return giveup(node, 'SuperSend');
   }
 
   ir.Primitive visitTypeReferenceSend(ast.Send node) {
     assert(isOpen);
-    return giveup();
+    if (node.argumentsNode != null) {
+      // May happen in strange, invalid code.
+      // TODO(asgerf): Generate code that throws a runtime error.
+      return giveup(node, 'TypeReferenceSend: has argument');
+    }
+    Element element = elements[node];
+    if (element is TypeDeclarationElement) {
+      DartType typeType = compiler.backend.typeImplementation.rawType;
+      ir.Primitive prim =
+          new ir.Constant(new TypeConstant(element.rawType, typeType));
+      add(new ir.LetPrim(prim));
+      return prim;
+    } else if (element.isTypeVariable) {
+      // TODO(asgerf): Introduce IR to reify type variables
+      return giveup(node, 'TypeReferenceSend: type variable');
+    } else {
+      // TODO(asgerf): Any other cases?
+      return giveup(node);
+    }
   }
 
   ir.Primitive visitSendSet(ast.SendSet node) {
     assert(isOpen);
     Element element = elements[node];
-    if (node.assignmentOperator.source != '=') return giveup();
-    if (Elements.isLocal(element)) {
-      // Exactly one argument expected for a simple assignment.
-      assert(!node.arguments.isEmpty);
-      assert(node.arguments.tail.isEmpty);
-      ir.Primitive result = visit(node.arguments.head);
-      assignedVars[variableIndex[element]] = result;
-      return result;
-    } else if (Elements.isStaticOrTopLevel(element)) {
-      // TODO(asgerf): static and top-level
-      return giveup();
-    } else if (node.receiver == null) {
-      // Nodes that fall in this case:
-      // - Unresolved top-level
-      // - Assignment to final variable (will not be resolved)
-      return giveup();
-    } else {
-      // Setter or index-setter invocation
-      assert(node.receiver != null);
-      if (node.receiver.isSuper()) return giveup();
+    ast.Operator op = node.assignmentOperator;
+    ir.Primitive result;
+    ir.Primitive getter;
+    if (op.source == '=') {
+      if (Elements.isLocal(element)) {
+        // Exactly one argument expected for a simple assignment.
+        assert(!node.arguments.isEmpty);
+        assert(node.arguments.tail.isEmpty);
+        result = visit(node.arguments.head);
+        result.useElementAsHint(element);
+        assignedVars[variableIndex[element]] = result;
+        return result;
+      } else if (Elements.isStaticOrTopLevel(element)) {
+        assert(element.isField || element.isSetter);
+        assert(!node.arguments.isEmpty && node.arguments.tail.isEmpty);
+        ir.Parameter v = new ir.Parameter(null);
+        ir.Continuation k = new ir.Continuation([v]);
+        Selector selector = elements.getSelector(node);
+        ir.Definition arg = visit(node.arguments.head);
+        ir.InvokeStatic invoke =
+            new ir.InvokeStatic(element, selector, k, [arg]);
+        add(new ir.LetCont(k, invoke));
+        return arg;
+      } else if (node.receiver == null) {
+        // Nodes that fall in this case:
+        // - Unresolved top-level
+        // - Assignment to final variable (will not be resolved)
+        return giveup(node, 'SendSet: non-local, non-static, but no receiver');
+      } else {
+        if (element != null && Elements.isUnresolved(element)) {
+          return giveup(node);
+        }
 
-      ir.Primitive receiver = visit(node.receiver);
-      ir.Parameter v = new ir.Parameter(null);
-      ir.Continuation k = new ir.Continuation([v]);
-      Selector selector = elements.getSelector(node);
-      assert(selector.kind == SelectorKind.SETTER ||
-             selector.kind == SelectorKind.INDEX);
-      List<ir.Definition> args = node.arguments.toList(growable:false)
-                                     .map(visit).toList(growable:false);
-      ir.InvokeMethod invoke = new ir.InvokeMethod(receiver, selector, k, args);
+        // Setter or index-setter invocation
+        assert(node.receiver != null);
+
+        if (node.receiver.isSuper()) return giveup(node, 'Super SendSet');
+
+        ir.Primitive receiver = node.receiver == null
+            ? lookupThis()
+            : visit(node.receiver);
+        ir.Parameter v = new ir.Parameter(null);
+        ir.Continuation k = new ir.Continuation([v]);
+        Selector selector = elements.getSelector(node);
+        assert(selector.kind == SelectorKind.SETTER ||
+            selector.kind == SelectorKind.INDEX);
+        List<ir.Definition> args = node.arguments.mapToList(visit,
+                                                            growable:false);
+        ir.InvokeMethod invoke =
+            new ir.InvokeMethod(receiver, selector, k, args);
+        add(new ir.LetCont(k, invoke));
+        return args.last;
+      }
+    } else if (ast.Operator.COMPLEX_OPERATORS.contains(op.source)) {
+      Element selectorElement = elements[node.selector];
+      if (selectorElement != null && !selectorElement.isAssignable) {
+        return giveup(node, 'Unresolved or non-assignable compound assignment');
+      }
+      if (!Elements.isLocal(selectorElement)) {
+        return giveup(node, 'Non-local compound assignment');
+      }
+
+      Selector selector = elements.getOperatorSelectorInComplexSendSet(node);
+      getter = lookupLocal(selectorElement);
+
+      ir.Primitive arg;
+      if (ast.Operator.INCREMENT_OPERATORS.contains(op.source)) {
+        assert(node.arguments.isEmpty);
+        arg = new ir.Constant(constantSystem.createInt(1));
+        add(new ir.LetPrim(arg));
+      } else {
+        assert(!node.arguments.isEmpty);
+        assert(node.arguments.tail.isEmpty);
+        arg = visit(node.arguments.head);
+      }
+      arg.useElementAsHint(element);
+      result = new ir.Parameter(null);
+      ir.Continuation k = new ir.Continuation([result]);
+      ir.Expression invoke = new ir.InvokeMethod(getter, selector, k, [arg]);
       add(new ir.LetCont(k, invoke));
-      return args.last;
+
+      assignedVars[variableIndex[element]] = result;
+
+      if (ast.Operator.INCREMENT_OPERATORS.contains(op.source) &&
+          !node.isPrefix) {
+        assert(getter != null);
+        return getter;
+      } else {
+        return result;
+      }
+    } else {
+      compiler.internalError(node, "Unknown assignment operator ${op.source}");
+      return null;
     }
   }
 
   ir.Primitive visitNewExpression(ast.NewExpression node) {
-    if (node.isConst) {
-      return giveup(); // TODO(asgerf): Const constructor call.
-    }
+    assert(isOpen);
     FunctionElement element = elements[node.send];
     if (Elements.isUnresolved(element)) {
-      return giveup();
+      return giveup(node, 'NewExpression: unresolved constructor');
     }
-    ast.Node selector = node.send.selector;
+    Selector selector = elements.getSelector(node.send);
+    ast.Node selectorNode = node.send.selector;
     GenericType type = elements.getType(node);
+    List<ir.Primitive> args =
+        node.send.arguments.mapToList(visit, growable:false);
+    if (node.isConst) {
+      ir.Primitive result = new ir.InvokeConstConstructor(type, element,
+          selector, args, getConstantForNode(node));
+      add(new ir.LetPrim(result));
+      return result;
+    }
     ir.Parameter v = new ir.Parameter(null);
     ir.Continuation k = new ir.Continuation([v]);
-    List<ir.Definition> args = node.send.arguments.toList(growable:false)
-                                        .map(visit).toList(growable:false);
-    ir.InvokeConstructor invoke = new ir.InvokeConstructor(
-        type,
-        element,
-        elements.getSelector(node.send),
-        k,
-        args);
+    ir.InvokeConstructor invoke =
+        new ir.InvokeConstructor(type, element,selector, k, args);
     add(new ir.LetCont(k, invoke));
     return v;
   }
@@ -1166,7 +1319,9 @@
 
   static final String ABORT_IRNODE_BUILDER = "IrNode builder aborted";
 
-  ir.Primitive giveup() => throw ABORT_IRNODE_BUILDER;
+  ir.Primitive giveup(ast.Node node, [String reason]) {
+    throw ABORT_IRNODE_BUILDER;
+  }
 
   ir.FunctionDefinition nullIfGiveup(ir.FunctionDefinition action()) {
     try {
@@ -1178,45 +1333,7 @@
   }
 
   void internalError(String reason, {ast.Node node}) {
-    giveup();
+    giveup(node);
   }
 }
 
-// While we don't support all constants we need to filter out the unsupported
-// ones:
-class SupportedConstantVisitor extends ConstantVisitor<bool> {
-  const SupportedConstantVisitor();
-
-  bool visit(Constant constant) => constant.accept(this);
-  bool visitFunction(FunctionConstant constant) => false;
-  bool visitNull(NullConstant constant) => true;
-  bool visitInt(IntConstant constant) => true;
-  bool visitDouble(DoubleConstant constant) => true;
-  bool visitTrue(TrueConstant constant) => true;
-  bool visitFalse(FalseConstant constant) => true;
-  bool visitString(StringConstant constant) => true;
-  bool visitList(ListConstant constant) {
-    return constant.entries.every(visit);
-  }
-  bool visitMap(MapConstant constant) {
-    return visit(constant.keys) && constant.values.every(visit);
-  }
-  bool visitConstructed(ConstructedConstant constant) => false;
-  bool visitType(TypeConstant constant) => false;
-  bool visitInterceptor(InterceptorConstant constant) => false;
-  bool visitDummy(DummyConstant constant) => false;
-  bool visitDeferred(DeferredConstant constant) => false;
-}
-
-// Verify that types are ones that can be reconstructed by the type emitter.
-class SupportedTypeVerifier extends DartTypeVisitor<bool, Null> {
-  bool visit(DartType type, Null _) => type.accept(this, null);
-
-  bool visitType(DartType type, Null _) => false;
-
-  bool visitVoidType(VoidType type, Null _) => true;
-
-  // Currently, InterfaceType and TypedefType are supported so long as they
-  // do not have type parameters.  They are subclasses of GenericType.
-  bool visitGenericType(GenericType type, Null _) => !type.isGeneric;
-}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
index 6db0e8f..3ab898c 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_nodes.dart
@@ -6,11 +6,13 @@
 // dependencies on other parts of the system.
 library dart2js.ir_nodes;
 
-import '../dart2jslib.dart' as dart2js show Constant;
+import '../dart2jslib.dart' as dart2js show Constant, ConstructedConstant;
 import '../elements/elements.dart'
-    show FunctionElement, LibraryElement, ParameterElement, ClassElement;
+    show FunctionElement, LibraryElement, ParameterElement, ClassElement,
+    Element, VariableElement;
 import '../universe/universe.dart' show Selector, SelectorKind;
 import '../dart_types.dart' show DartType, GenericType;
+import '../helpers/helpers.dart';
 
 abstract class Node {
   static int hashCount = 0;
@@ -47,7 +49,29 @@
   }
 }
 
+/// A pure expression that cannot throw or diverge.
+/// All primitives are named using the identity of the [Primitive] object.
 abstract class Primitive extends Definition {
+  /// The [VariableElement] or [ParameterElement] from which the primitive
+  /// binding originated.
+  Element element;
+
+  /// Register in which the variable binding this primitive can be allocated.
+  /// Separate register spaces are used for primitives with different [element].
+  /// Assigned by [RegisterAllocator], is null before that phase.
+  int registerIndex;
+
+  /// If non-null, this primitive is a reference to the given constant.
+  dart2js.Constant get constant;
+
+  /// Use the given element as a hint for naming this primitive.
+  ///
+  /// Has no effect if this primitive already has a non-null [element].
+  void useElementAsHint(Element hint) {
+    if (element == null) {
+      element = hint;
+    }
+  }
 }
 
 /// Operands to invocations and primitives are always variables.  They point to
@@ -105,9 +129,10 @@
   List<Reference> get arguments;
 }
 
-/// Invoke a static function in tail position.
+/// Invoke a static function or static field getter/setter.
 class InvokeStatic extends Expression implements Invoke {
-  final FunctionElement target;
+  /// [FunctionElement] or [FieldElement].
+  final Element target;
 
   /**
    * The selector encodes how the function is invoked: number of positional
@@ -123,7 +148,6 @@
                List<Definition> args)
       : continuation = new Reference(cont),
         arguments = _referenceList(args) {
-    assert(selector.kind == SelectorKind.CALL);
     assert(selector.name == target.name);
   }
 
@@ -187,6 +211,47 @@
   accept(Visitor visitor) => visitor.visitInvokeConstructor(this);
 }
 
+class AsCast extends Expression {
+  final Reference receiver;
+  final DartType type;
+  final Reference continuation;
+
+  AsCast(Primitive receiver, this.type, Continuation cont)
+      : this.receiver = new Reference(receiver),
+        this.continuation = new Reference(cont);
+
+  accept(Visitor visitor) => visitor.visitAsCast(this);
+}
+
+class InvokeConstConstructor extends Primitive {
+  final GenericType type;
+  final FunctionElement constructor;
+  final List<Reference> arguments;
+  final Selector selector;
+
+  final dart2js.ConstructedConstant constant;
+
+  /// The class being instantiated. This is the same as `target.enclosingClass`
+  /// and `type.element`.
+  ClassElement get targetClass => constructor.enclosingElement;
+
+  /// True if this is an invocation of a factory constructor.
+  bool get isFactory => constructor.isFactoryConstructor;
+
+  InvokeConstConstructor(this.type,
+                    this.constructor,
+                    this.selector,
+                    List<Definition> args,
+                    this.constant)
+      : arguments = _referenceList(args) {
+    assert(constructor.isConstructor);
+    assert(type.element == constructor.enclosingElement);
+    assert(constant.type == type);
+  }
+
+  accept(Visitor visitor) => visitor.visitInvokeConstConstructor(this);
+}
+
 /// Invoke [toString] on each argument and concatenate the results.
 class ConcatenateStrings extends Expression {
   final Reference continuation;
@@ -249,33 +314,67 @@
 
   Constant(this.value);
 
+  dart2js.Constant get constant => value;
+
   accept(Visitor visitor) => visitor.visitConstant(this);
 }
 
-class LiteralList extends Primitive {
-  List<Reference> values;
+class This extends Primitive {
+  This();
 
-  LiteralList(List<Primitive> values)
+  dart2js.Constant get constant => null;
+
+  accept(Visitor visitor) => visitor.visitThis(this);
+}
+
+class LiteralList extends Primitive {
+  /// The List type being created; this is not the type argument.
+  final GenericType type;
+  final List<Reference> values;
+
+  /// Set to null if this is not a const literal list.
+  final dart2js.Constant constant;
+
+  LiteralList(this.type, List<Primitive> values, [this.constant])
       : this.values = _referenceList(values);
 
   accept(Visitor visitor) => visitor.visitLiteralList(this);
 }
 
 class LiteralMap extends Primitive {
-  List<Reference> keys;
-  List<Reference> values;
+  final GenericType type;
+  final List<Reference> keys;
+  final List<Reference> values;
 
-  LiteralMap(List<Primitive> keys, List<Primitive> values)
+  /// Set to null if this is not a const literal map.
+  final dart2js.Constant constant;
+
+  LiteralMap(this.type, List<Primitive> keys, List<Primitive> values,
+             [this.constant])
       : this.keys = _referenceList(keys),
         this.values = _referenceList(values);
 
   accept(Visitor visitor) => visitor.visitLiteralMap(this);
 }
 
-class Parameter extends Primitive {
-  final ParameterElement element;
+class IsCheck extends Primitive {
+  final Reference receiver;
+  final DartType type;
 
-  Parameter(this.element);
+  dart2js.Constant get constant => null;
+
+  IsCheck(Primitive receiver, this.type)
+      : this.receiver = new Reference(receiver);
+
+  accept(Visitor visitor) => visitor.visitIsCheck(this);
+}
+
+class Parameter extends Primitive {
+  Parameter(Element element) {
+    super.element = element;
+  }
+
+  dart2js.Constant get constant => null;
 
   accept(Visitor visitor) => visitor.visitParameter(this);
 }
@@ -334,11 +433,15 @@
   T visitInvokeConstructor(InvokeConstructor node) => visitExpression(node);
   T visitConcatenateStrings(ConcatenateStrings node) => visitExpression(node);
   T visitBranch(Branch node) => visitExpression(node);
+  T visitAsCast(AsCast node) => visitExpression(node);
 
   // Definitions.
   T visitLiteralList(LiteralList node) => visitPrimitive(node);
   T visitLiteralMap(LiteralMap node) => visitPrimitive(node);
+  T visitIsCheck(IsCheck node) => visitPrimitive(node);
   T visitConstant(Constant node) => visitPrimitive(node);
+  T visitThis(This node) => visitPrimitive(node);
+  T visitInvokeConstConstructor(InvokeConstConstructor node) => visitPrimitive(node);
   T visitParameter(Parameter node) => visitPrimitive(node);
   T visitContinuation(Continuation node) => visitDefinition(node);
 
@@ -475,3 +578,149 @@
     return '(IsTrue $value)';
   }
 }
+
+/// Keeps track of currently unused register indices.
+class RegisterArray {
+  int nextIndex = 0;
+  final List<int> freeStack = <int>[];
+
+  int makeIndex() {
+    if (freeStack.isEmpty) {
+      return nextIndex++;
+    } else {
+      return freeStack.removeLast();
+    }
+  }
+
+  void releaseIndex(int index) {
+    freeStack.add(index);
+  }
+}
+
+/// Assigns indices to each primitive in the IR such that primitives that are
+/// live simultaneously never get assigned the same index.
+/// This information is used by the dart tree builder to generate fewer
+/// redundant variables.
+/// Currently, the liveness analysis is very simple and is often inadequate
+/// for removing all of the redundant variables.
+class RegisterAllocator extends Visitor {
+  /// Separate register spaces for each source-level variable/parameter.
+  /// Note that null is used as key for primitives without elements.
+  final Map<Element, RegisterArray> elementRegisters =
+      <Element, RegisterArray>{};
+
+  RegisterArray getRegisterArray(Element element) {
+    RegisterArray registers = elementRegisters[element];
+    if (registers == null) {
+      registers = new RegisterArray();
+      elementRegisters[element] = registers;
+    }
+    return registers;
+  }
+
+  void allocate(Primitive primitive) {
+    if (primitive.registerIndex == null) {
+      primitive.registerIndex = getRegisterArray(primitive.element).makeIndex();
+    }
+  }
+
+  void release(Primitive primitive) {
+    // Do not share indices for temporaries as this may obstruct inlining.
+    if (primitive.element == null) return;
+    if (primitive.registerIndex != null) {
+      getRegisterArray(primitive.element).releaseIndex(primitive.registerIndex);
+    }
+  }
+
+  void visitReference(Reference reference) {
+    allocate(reference.definition);
+  }
+
+  void visitFunctionDefinition(FunctionDefinition node) {
+    visit(node.body);
+    node.parameters.forEach(allocate); // Assign indices to unused parameters.
+    elementRegisters.clear();
+  }
+
+  void visitLetPrim(LetPrim node) {
+    visit(node.body);
+    release(node.primitive);
+    visit(node.primitive);
+  }
+
+  void visitLetCont(LetCont node) {
+    visit(node.continuation);
+    visit(node.body);
+  }
+
+  void visitInvokeStatic(InvokeStatic node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitAsCast(AsCast node) {
+    visitReference(node.receiver);
+  }
+
+  void visitInvokeContinuation(InvokeContinuation node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitInvokeMethod(InvokeMethod node) {
+    visitReference(node.receiver);
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitInvokeConstructor(InvokeConstructor node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitConcatenateStrings(ConcatenateStrings node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitBranch(Branch node) {
+    visit(node.condition);
+  }
+
+  void visitInvokeConstConstructor(InvokeConstConstructor node) {
+    node.arguments.forEach(visitReference);
+  }
+
+  void visitLiteralList(LiteralList node) {
+    node.values.forEach(visitReference);
+  }
+
+  void visitLiteralMap(LiteralMap node) {
+    for (int i = 0; i < node.keys.length; ++i) {
+      visitReference(node.keys[i]);
+      visitReference(node.values[i]);
+    }
+  }
+
+  void visitIsCheck(IsCheck node) {
+    visitReference(node.receiver);
+  }
+
+  void visitConstant(Constant node) {
+  }
+
+  void visitParameter(Parameter node) {
+    throw "Parameters should not be visited by RegisterAllocator";
+  }
+
+  void visitContinuation(Continuation node) {
+    visit(node.body);
+
+    // Arguments get allocated left-to-right, so we release parameters
+    // right-to-left. This increases the likelihood that arguments can be
+    // transferred without intermediate assignments.
+    for (int i = node.parameters.length - 1; i >= 0; --i) {
+      release(node.parameters[i]);
+    }
+  }
+
+  void visitIsTrue(IsTrue node) {
+    visitReference(node.value);
+  }
+
+}
diff --git a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
index 38a4ae9..875b2b0 100644
--- a/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/ir/ir_tracer.dart
@@ -44,6 +44,16 @@
     names = null;
   }
 
+  int countUses(ir.Definition definition) {
+    int count = 0;
+    ir.Reference ref = definition.firstRef;
+    while (ref != null) {
+      ++count;
+      ref = ref.nextRef;
+    }
+    return count;
+  }
+
   printNode(Block block) {
     tag("block", () {
       printProperty("name", block.name);
@@ -57,11 +67,13 @@
         tag("locals", () {
           printProperty("size", 0);
           printProperty("method", "None");
-          // We could print parameters here,
-          // but does the hydra tool actually use this info??
         });
       });
       tag("HIR", () {
+        for (ir.Parameter param in block.parameters) {
+          String name = names.name(param);
+          printStmt(name, "Parameter $name [useCount=${countUses(param)}]");
+        }
         visit(block.body);
       });
     });
@@ -144,6 +156,31 @@
     printStmt(dummy, "LiteralMap (${entries.join(', ')})");
   }
 
+  visitIsCheck(ir.IsCheck node) {
+    String dummy = names.name(node);
+    List<String> entries = new List<String>();
+    String receiver = formatReference(node.receiver);
+    printStmt(dummy, "IsCheck ($receiver ${node.type})");
+  }
+
+  visitAsCast(ir.AsCast node) {
+    String dummy = names.name(node);
+    List<String> entries = new List<String>();
+    String receiver = formatReference(node.receiver);
+    printStmt(dummy, "AsCast ($receiver ${node.type})");
+  }
+
+  visitInvokeConstConstructor(ir.InvokeConstConstructor node) {
+    String dummy = names.name(node);
+    String values = node.arguments.map(formatReference).join(', ');
+    printStmt(dummy, "ConstConstruction ($values)");
+  }
+
+  visitThis(ir.This node) {
+    String dummy = names.name(node);
+    printStmt(dummy, "This");
+  }
+
   visitInvokeContinuation(ir.InvokeContinuation node) {
     String dummy = names.name(node);
     String kont = formatReference(node.continuation);
@@ -183,7 +220,7 @@
   }
 
   visitIsTrue(ir.IsTrue node) {
-    return "IsTrue(${names.name(node)})";
+    return "IsTrue(${names.name(node.value.definition)})";
   }
 
   visitCondition(ir.Condition c) {}
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
index db13631..6722f46 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/backend.dart
@@ -53,6 +53,11 @@
 }
 
 class JavaScriptBackend extends Backend {
+  static final Uri DART_JS_MIRRORS =
+      new Uri(scheme: 'dart', path: '_js_mirrors');
+  static final Uri DART_JS_NAMES =
+      new Uri(scheme: 'dart', path: '_js_names');
+
   SsaBuilderTask builder;
   SsaOptimizerTask optimizer;
   SsaCodeGeneratorTask generator;
@@ -112,6 +117,12 @@
   Element getInterceptorMethod;
   Element interceptedNames;
 
+  /// If [true], the compiler will emit code that writes the name of the current
+  /// method together with its class and library to the console the first time
+  /// the method is called.
+  static const bool TRACE_CALLS = false;
+  Element traceHelper;
+
   /**
    * This element is a top-level variable (in generated output) that the
    * compiler initializes to a datastructure used to map from a Type to the
@@ -469,113 +480,6 @@
         operatorEqfunction.enclosingClass);
   }
 
-  void initializeHelperClasses() {
-    getInterceptorMethod = compiler.findInterceptor('getInterceptor');
-    interceptedNames = compiler.findInterceptor('interceptedNames');
-    mapTypeToInterceptor = compiler.findInterceptor('mapTypeToInterceptor');
-    getNativeInterceptorMethod =
-        compiler.findInterceptor('getNativeInterceptor');
-
-    // These methods are overwritten with generated versions.
-    inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true);
-
-    List<ClassElement> classes = [
-      jsInterceptorClass =
-          compiler.findInterceptor('Interceptor'),
-      jsStringClass = compiler.findInterceptor('JSString'),
-      jsArrayClass = compiler.findInterceptor('JSArray'),
-      // The int class must be before the double class, because the
-      // emitter relies on this list for the order of type checks.
-      jsIntClass = compiler.findInterceptor('JSInt'),
-      jsPositiveIntClass = compiler.findInterceptor('JSPositiveInt'),
-      jsUInt32Class = compiler.findInterceptor('JSUInt32'),
-      jsUInt31Class = compiler.findInterceptor('JSUInt31'),
-      jsDoubleClass = compiler.findInterceptor('JSDouble'),
-      jsNumberClass = compiler.findInterceptor('JSNumber'),
-      jsNullClass = compiler.findInterceptor('JSNull'),
-      jsBoolClass = compiler.findInterceptor('JSBool'),
-      jsMutableArrayClass = compiler.findInterceptor('JSMutableArray'),
-      jsFixedArrayClass = compiler.findInterceptor('JSFixedArray'),
-      jsExtendableArrayClass = compiler.findInterceptor('JSExtendableArray'),
-      jsPlainJavaScriptObjectClass =
-          compiler.findInterceptor('PlainJavaScriptObject'),
-      jsUnknownJavaScriptObjectClass =
-          compiler.findInterceptor('UnknownJavaScriptObject'),
-    ];
-
-    implementationClasses = <ClassElement, ClassElement>{};
-    implementationClasses[compiler.intClass] = jsIntClass;
-    implementationClasses[compiler.boolClass] = jsBoolClass;
-    implementationClasses[compiler.numClass] = jsNumberClass;
-    implementationClasses[compiler.doubleClass] = jsDoubleClass;
-    implementationClasses[compiler.stringClass] = jsStringClass;
-    implementationClasses[compiler.listClass] = jsArrayClass;
-    implementationClasses[compiler.nullClass] = jsNullClass;
-
-    jsIndexableClass = compiler.findInterceptor('JSIndexable');
-    jsMutableIndexableClass = compiler.findInterceptor('JSMutableIndexable');
-
-    // TODO(kasperl): Some tests do not define the special JSArray
-    // subclasses, so we check to see if they are defined before
-    // trying to resolve them.
-    if (jsFixedArrayClass != null) {
-      jsFixedArrayClass.ensureResolved(compiler);
-    }
-    if (jsExtendableArrayClass != null) {
-      jsExtendableArrayClass.ensureResolved(compiler);
-    }
-
-    jsIndexableClass.ensureResolved(compiler);
-    jsIndexableLength = compiler.lookupElementIn(
-        jsIndexableClass, 'length');
-    if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
-      AbstractFieldElement element = jsIndexableLength;
-      jsIndexableLength = element.getter;
-    }
-
-    jsArrayClass.ensureResolved(compiler);
-    jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed');
-    jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast');
-    jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add');
-
-    jsStringClass.ensureResolved(compiler);
-    jsStringSplit = compiler.lookupElementIn(jsStringClass, 'split');
-    jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+');
-    jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString');
-
-    typeLiteralClass = compiler.findHelper('TypeImpl');
-    mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap');
-    constMapLiteralClass = compiler.findHelper('ConstantMap');
-
-    objectEquals = compiler.lookupElementIn(compiler.objectClass, '==');
-
-    jsIndexingBehaviorInterface =
-        compiler.findHelper('JavaScriptIndexingBehavior');
-
-    specialOperatorEqClasses
-        ..add(compiler.objectClass)
-        ..add(jsInterceptorClass)
-        ..add(jsNullClass);
-
-    validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
-    // The null-interceptor must also implement *all* methods.
-    validateInterceptorImplementsAllObjectMethods(jsNullClass);
-
-    typeVariableClass = compiler.findHelper('TypeVariable');
-
-    indexablePrimitiveType = new TypeMask.nonNullSubtype(jsIndexableClass);
-    readableArrayType = new TypeMask.nonNullSubclass(jsArrayClass);
-    mutableArrayType = new TypeMask.nonNullSubclass(jsMutableArrayClass);
-    fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
-    extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
-    nonNullType = compiler.typesTask.dynamicType.nonNullable();
-
-    noSideEffectsClass = compiler.findHelper('NoSideEffects');
-    noThrowsClass = compiler.findHelper('NoThrows');
-    noInlineClass = compiler.findHelper('NoInline');
-    irRepresentationClass = compiler.findHelper('IrRepresentation');
-  }
-
   void validateInterceptorImplementsAllObjectMethods(
       ClassElement interceptorClass) {
     if (interceptorClass == null) return;
@@ -674,9 +578,9 @@
       InterceptorConstant interceptor = constant;
       registerInstantiatedConstantType(interceptor.dispatchedType, registry);
     } else if (constant.isType) {
-      TypeConstant typeConstant = constant;
-      registerTypeLiteral(typeConstant.representedType,
-          compiler.enqueuer.codegen, registry);
+      enqueueInResolution(getCreateRuntimeType(), registry);
+      compiler.enqueuer.codegen.registerInstantiatedClass(
+          typeImplementation, registry);
     }
   }
 
@@ -848,6 +752,7 @@
   }
 
   void enqueueHelpers(ResolutionEnqueuer world, Registry registry) {
+    assert(compiler.interceptorsLibrary != null);
     // TODO(ngeoffray): Not enqueuing those two classes currently make
     // the compiler potentially crash. However, any reasonable program
     // will instantiate those two classes.
@@ -861,54 +766,58 @@
           compiler.findHelper('boolConversionCheck');
       if (e != null) enqueue(world, e, registry);
     }
+    if (TRACE_CALLS) {
+      traceHelper = compiler.findHelper('traceHelper');
+      assert(traceHelper != null);
+      enqueueInResolution(traceHelper, registry);
+    }
     registerCheckedModeHelpers(registry);
   }
 
   onResolutionComplete() => rti.computeClassesNeedingRti();
 
-  void registerStringInterpolation(Registry registry) {
-    enqueueInResolution(getStringInterpolationHelper(), registry);
+  void onStringInterpolation(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getStringInterpolationHelper(), registry);
   }
 
-  void registerCatchStatement(Enqueuer enqueuer, Registry registry) {
-    void ensure(ClassElement classElement) {
-      if (classElement != null) {
-        enqueueClass(enqueuer, classElement, registry);
-      }
-    }
-    enqueueInResolution(getExceptionUnwrapper(), registry);
-    ensure(jsPlainJavaScriptObjectClass);
-    ensure(jsUnknownJavaScriptObjectClass);
+  void onCatchStatement(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getExceptionUnwrapper(), registry);
+    registerBackendInstantiation(jsPlainJavaScriptObjectClass, registry);
+    registerBackendInstantiation(jsUnknownJavaScriptObjectClass, registry);
   }
 
-  void registerThrowExpression(Registry registry) {
+  void onThrowExpression(Registry registry) {
+    assert(registry.isForResolution);
     // We don't know ahead of time whether we will need the throw in a
     // statement context or an expression context, so we register both
     // here, even though we may not need the throwExpression helper.
-    enqueueInResolution(getWrapExceptionHelper(), registry);
-    enqueueInResolution(getThrowExpressionHelper(), registry);
+    registerBackendStaticInvocation(getWrapExceptionHelper(), registry);
+    registerBackendStaticInvocation(getThrowExpressionHelper(), registry);
   }
 
-  void registerLazyField(Registry registry) {
-    enqueueInResolution(getCyclicThrowHelper(), registry);
+  void onLazyField(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getCyclicThrowHelper(), registry);
   }
 
-  void registerTypeLiteral(DartType type,
-                           Enqueuer enqueuer,
-                           Registry registry) {
-    enqueuer.registerInstantiatedClass(typeImplementation, registry);
-    enqueueInResolution(getCreateRuntimeType(), registry);
+  void onTypeLiteral(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendInstantiation(typeImplementation, registry);
+    registerBackendStaticInvocation(getCreateRuntimeType(), registry);
     // TODO(ahe): Might want to register [element] as an instantiated class
     // when reflection is used.  However, as long as we disable tree-shaking
     // eagerly it doesn't matter.
     if (type.isTypedef) {
       typedefTypeLiterals.add(type.element);
     }
-    customElementsAnalysis.registerTypeLiteral(type, enqueuer);
+    customElementsAnalysis.registerTypeLiteral(type, registry);
   }
 
-  void registerStackTraceInCatch(Registry registry) {
-    enqueueInResolution(getTraceFromException(), registry);
+  void onStackTraceInCatch(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getTraceFromException(), registry);
   }
 
   void registerGetRuntimeTypeArgument(Registry registry) {
@@ -950,63 +859,88 @@
     enqueueClass(enqueuer, compiler.listClass, registry);
   }
 
-  void registerTypeVariableExpression(Registry registry) {
-    enqueueInResolution(getSetRuntimeTypeInfo(), registry);
-    enqueueInResolution(getGetRuntimeTypeInfo(), registry);
+  void onTypeVariableExpression(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getSetRuntimeTypeInfo(), registry);
+    registerBackendStaticInvocation(getGetRuntimeTypeInfo(), registry);
     registerGetRuntimeTypeArgument(registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
-    enqueueInResolution(getRuntimeTypeToString(), registry);
-    enqueueInResolution(getCreateRuntimeType(), registry);
+    registerBackendInstantiation(compiler.listClass, registry);
+    registerBackendStaticInvocation(getRuntimeTypeToString(), registry);
+    registerBackendStaticInvocation(getCreateRuntimeType(), registry);
   }
 
-  void registerIsCheck(DartType type, Enqueuer world, Registry registry) {
-    enqueueInResolution(getThrowRuntimeError(), registry);
+  // TODO(johnniwinther): Maybe split this into [onAssertType] and [onTestType].
+  void onIsCheck(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    type = type.unalias(compiler);
+    registerBackendInstantiation(compiler.boolClass, registry);
+    bool inCheckedMode = compiler.enableTypeAssertions;
+    if (inCheckedMode) {
+      registerBackendStaticInvocation(getThrowRuntimeError(), registry);
+    }
+    if (type.isMalformed) {
+      registerBackendStaticInvocation(getThrowTypeError(), registry);
+    }
+    if (!type.treatAsRaw || type.containsTypeVariables) {
+      // TODO(johnniwinther): Investigate why this is needed.
+      registerBackendStaticInvocation(getSetRuntimeTypeInfo(), registry);
+      registerBackendStaticInvocation(getGetRuntimeTypeInfo(), registry);
+      registerGetRuntimeTypeArgument(registry);
+      if (inCheckedMode) {
+        registerBackendStaticInvocation(getAssertSubtype(), registry);
+      }
+      registerBackendStaticInvocation(getCheckSubtype(), registry);
+      if (type.isTypeVariable) {
+        registerBackendStaticInvocation(
+            getCheckSubtypeOfRuntimeType(), registry);
+        if (inCheckedMode) {
+          registerBackendStaticInvocation(
+              getAssertSubtypeOfRuntimeType(), registry);
+        }
+      }
+      registerBackendInstantiation(compiler.listClass, registry);
+    }
+    if (type is FunctionType) {
+      registerBackendStaticInvocation(
+          compiler.findHelper('functionTypeTestMetaHelper'), registry);
+    }
+    if (type.element != null && type.element.isNative) {
+      // We will neeed to add the "$is" and "$as" properties on the
+      // JavaScript object prototype, so we make sure
+      // [:defineProperty:] is compiled.
+      registerBackendStaticInvocation(
+              compiler.findHelper('defineProperty'),
+              registry);
+    }
+  }
+
+  void registerIsCheckForCodegen(DartType type,
+                                 Enqueuer world,
+                                 Registry registry) {
+    assert(!registry.isForResolution);
     type = type.unalias(compiler);
     enqueueClass(world, compiler.boolClass, registry);
     bool inCheckedMode = compiler.enableTypeAssertions;
     // [registerIsCheck] is also called for checked mode checks, so we
     // need to register checked mode helpers.
     if (inCheckedMode) {
-      if (!world.isResolutionQueue) {
-        // All helpers are added to resolution queue in enqueueHelpers. These
-        // calls to enqueueInResolution serve as assertions that the helper was
-        // in fact added.
-        // TODO(13155): Find a way to enqueue helpers lazily.
-        CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
-        if (helper != null) {
-          enqueue(world, helper.getElement(compiler), registry);
-        }
-        // We also need the native variant of the check (for DOM types).
-        helper = getNativeCheckedModeHelper(type, typeCast: false);
-        if (helper != null) {
-          enqueue(world, helper.getElement(compiler), registry);
-        }
+      // All helpers are added to resolution queue in enqueueHelpers. These
+      // calls to enqueueInResolution serve as assertions that the helper was
+      // in fact added.
+      // TODO(13155): Find a way to enqueue helpers lazily.
+      CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: false);
+      if (helper != null) {
+        enqueue(world, helper.getElement(compiler), registry);
       }
-    }
-    bool isTypeVariable = type.isTypeVariable;
-    if (type.isMalformed) {
-      enqueueInResolution(getThrowTypeError(), registry);
+      // We also need the native variant of the check (for DOM types).
+      helper = getNativeCheckedModeHelper(type, typeCast: false);
+      if (helper != null) {
+        enqueue(world, helper.getElement(compiler), registry);
+      }
     }
     if (!type.treatAsRaw || type.containsTypeVariables) {
-      enqueueInResolution(getSetRuntimeTypeInfo(), registry);
-      enqueueInResolution(getGetRuntimeTypeInfo(), registry);
-      registerGetRuntimeTypeArgument(registry);
-      if (inCheckedMode) {
-        enqueueInResolution(getAssertSubtype(), registry);
-      }
-      enqueueInResolution(getCheckSubtype(), registry);
-      if (isTypeVariable) {
-        enqueueInResolution(getCheckSubtypeOfRuntimeType(), registry);
-        if (inCheckedMode) {
-          enqueueInResolution(getAssertSubtypeOfRuntimeType(), registry);
-        }
-      }
       enqueueClass(world, compiler.listClass, registry);
     }
-    if (type is FunctionType) {
-      enqueueInResolution(
-          compiler.findHelper('functionTypeTestMetaHelper'), registry);
-    }
     if (type.element != null && type.element.isNative) {
       // We will neeed to add the "$is" and "$as" properties on the
       // JavaScript object prototype, so we make sure
@@ -1017,35 +951,24 @@
     }
   }
 
-  void registerAsCheck(DartType type, Enqueuer world, Registry registry) {
-    enqueueInResolution(getThrowRuntimeError(), registry);
-    type = type.unalias(compiler);
-    if (!world.isResolutionQueue) {
-      // All helpers are added to resolution queue in enqueueHelpers. These
-      // calls to enqueueInResolution serve as assertions that the helper was in
-      // fact added.
-      // TODO(13155): Find a way to enqueue helpers lazily.
-      CheckedModeHelper helper = getCheckedModeHelper(type, typeCast: true);
-      enqueueInResolution(helper.getElement(compiler), registry);
-      // We also need the native variant of the check (for DOM types).
-      helper = getNativeCheckedModeHelper(type, typeCast: true);
-      if (helper != null) {
-        enqueueInResolution(helper.getElement(compiler), registry);
-      }
-    }
+  void onAsCheck(DartType type, Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowRuntimeError(), registry);
   }
 
-  void registerThrowNoSuchMethod(Registry registry) {
-    enqueueInResolution(getThrowNoSuchMethod(), registry);
+  void onThrowNoSuchMethod(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowNoSuchMethod(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.listClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
-  void registerThrowRuntimeError(Registry registry) {
-    enqueueInResolution(getThrowRuntimeError(), registry);
+  void onThrowRuntimeError(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowRuntimeError(), registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
   void registerTypeVariableBoundsSubtypeCheck(DartType typeArgument,
@@ -1053,19 +976,23 @@
     rti.registerTypeVariableBoundsSubtypeCheck(typeArgument, bound);
   }
 
-  void registerTypeVariableBoundCheck(Registry registry) {
-    enqueueInResolution(getThrowTypeError(), registry);
-    enqueueInResolution(getAssertIsSubtype(), registry);
+  void onTypeVariableBoundCheck(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowTypeError(), registry);
+    registerBackendStaticInvocation(getAssertIsSubtype(), registry);
   }
 
-  void registerAbstractClassInstantiation(Registry registry) {
-    enqueueInResolution(getThrowAbstractClassInstantiationError(), registry);
+  void onAbstractClassInstantiation(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getThrowAbstractClassInstantiationError(),
+                                    registry);
     // Also register the types of the arguments passed to this method.
-    enqueueClass(compiler.enqueuer.resolution, compiler.stringClass, registry);
+    registerBackendInstantiation(compiler.stringClass, registry);
   }
 
-  void registerFallThroughError(Registry registry) {
-    enqueueInResolution(getFallThroughError(), registry);
+  void onFallThroughError(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getFallThroughError(), registry);
   }
 
   void registerCheckDeferredIsLoaded(Registry registry) {
@@ -1079,12 +1006,13 @@
     world.registerInvocation(compiler.noSuchMethodSelector);
   }
 
-  void registerSuperNoSuchMethod(Registry registry) {
-    enqueueInResolution(getCreateInvocationMirror(), registry);
-    enqueueInResolution(
+  void onSuperNoSuchMethod(Registry registry) {
+    assert(registry.isForResolution);
+    registerBackendStaticInvocation(getCreateInvocationMirror(), registry);
+    registerBackendStaticInvocation(
         compiler.objectClass.lookupLocalMember(Compiler.NO_SUCH_METHOD),
         registry);
-    enqueueClass(compiler.enqueuer.resolution, compiler.listClass, registry);
+    registerBackendInstantiation(compiler.listClass, registry);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -1130,49 +1058,74 @@
            compiler.enabledRuntimeType;
   }
 
-  // Enqueue [e] in [enqueuer].
-  //
-  // The backend must *always* call this method when enqueuing an
-  // element. Calls done by the backend are not seen by global
-  // optimizations, so they would make these optimizations unsound.
-  // Therefore we need to collect the list of helpers the backend may
-  // use.
+  /// The backend must *always* call this method when enqueuing an
+  /// element. Calls done by the backend are not seen by global
+  /// optimizations, so they would make these optimizations unsound.
+  /// Therefore we need to collect the list of helpers the backend may
+  /// use.
+  Element registerBackendUse(Element element) {
+    if (element != null) {
+      helpersUsed.add(element.declaration);
+      if (element.isClass && element.isPatched) {
+        // Both declaration and implementation may declare fields, so we
+        // add both to the list of helpers.
+        helpersUsed.add(element.implementation);
+      }
+    }
+    return element;
+  }
+
+  void registerBackendStaticInvocation(Element element, Registry registry) {
+    registry.registerStaticInvocation(registerBackendUse(element));
+  }
+
+  void registerBackendInstantiation(ClassElement element, Registry registry) {
+    registry.registerInstantiation(registerBackendUse(element));
+  }
+
+  /// Enqueue [e] in [enqueuer].
+  ///
+  /// This method calls [registerBackendUse].
   void enqueue(Enqueuer enqueuer, Element e, Registry registry) {
     if (e == null) return;
-    helpersUsed.add(e.declaration);
+    registerBackendUse(e);
     enqueuer.addToWorkList(e);
     registry.registerDependency(e);
   }
 
+  /// Enqueue [e] in the resolution enqueuer.
+  ///
+  /// This method calls [registerBackendUse].
   void enqueueInResolution(Element e, Registry registry) {
     if (e == null) return;
     ResolutionEnqueuer enqueuer = compiler.enqueuer.resolution;
     enqueue(enqueuer, e, registry);
   }
 
+  /// Register instantiation of [cls] in [enqueuer].
+  ///
+  /// This method calls [registerBackendUse].
   void enqueueClass(Enqueuer enqueuer, Element cls, Registry registry) {
     if (cls == null) return;
+    registerBackendUse(cls);
     helpersUsed.add(cls.declaration);
-    // Both declaration and implementation may declare fields, so we
-    // add both to the list of helpers.
     if (cls.declaration != cls.implementation) {
       helpersUsed.add(cls.implementation);
     }
     enqueuer.registerInstantiatedClass(cls, registry);
   }
 
-  void registerConstantMap(Registry registry) {
+  void onConstantMap(Registry registry) {
+    assert(registry.isForResolution);
     void enqueue(String name) {
       Element e = compiler.findHelper(name);
-      if (e != null) {
-        enqueueClass(compiler.enqueuer.resolution, e, registry);
-      }
+      registerBackendInstantiation(e, registry);
     }
 
-    enqueue(MapConstant.DART_CLASS);
-    enqueue(MapConstant.DART_PROTO_CLASS);
-    enqueue(MapConstant.DART_STRING_CLASS);
-    enqueue(MapConstant.DART_GENERAL_CLASS);
+    enqueue(JavaScriptMapConstant.DART_CLASS);
+    enqueue(JavaScriptMapConstant.DART_PROTO_CLASS);
+    enqueue(JavaScriptMapConstant.DART_STRING_CLASS);
+    enqueue(JavaScriptMapConstant.DART_GENERAL_CLASS);
   }
 
   void codegen(CodegenWorkItem work) {
@@ -1612,10 +1565,12 @@
   }
 
   /// Called when resolving the `Symbol` constructor.
-  void registerSymbolConstructor(Registry registry) {
+  void onSymbolConstructor(Registry registry) {
+    assert(registry.isForResolution);
     // Make sure that _internals.Symbol.validated is registered.
     assert(compiler.symbolValidatedConstructor != null);
-    enqueueInResolution(compiler.symbolValidatedConstructor, registry);
+    registerBackendStaticInvocation(compiler.symbolValidatedConstructor,
+                                    registry);
   }
 
   /// Should [element] (a getter) be retained for reflection?
@@ -1646,19 +1601,143 @@
     return false;
   }
 
-  Future onLibraryLoaded(LibraryElement library, Uri uri) {
-    if (uri == Uri.parse('dart:_js_mirrors')) {
-      disableTreeShakingMarker =
-          library.find('disableTreeShaking');
-      preserveMetadataMarker =
-          library.find('preserveMetadata');
-    } else if (uri == Uri.parse('dart:_js_names')) {
-      preserveNamesMarker =
-          library.find('preserveNames');
-    } else if (uri == Uri.parse('dart:_js_helper')) {
-      getIsolateAffinityTagMarker =
-          library.find('getIsolateAffinityTag');
+  Future onLibraryScanned(LibraryElement library, LibraryLoader loader) {
+    return super.onLibraryScanned(library, loader).then((_) {
+      Uri uri = library.canonicalUri;
+
+      // TODO(johnniwinther): Assert that the elements are found.
+      VariableElement findVariable(String name) {
+        return library.find(name);
+      }
+
+      FunctionElement findMethod(String name) {
+        return library.find(name);
+      }
+
+      ClassElement findClass(String name) {
+        return library.find(name);
+      }
+
+      if (uri == Compiler.DART_INTERCEPTORS) {
+        getInterceptorMethod = findMethod('getInterceptor');
+        interceptedNames = findVariable('interceptedNames');
+        mapTypeToInterceptor = findVariable('mapTypeToInterceptor');
+        getNativeInterceptorMethod = findMethod('getNativeInterceptor');
+
+        List<ClassElement> classes = [
+          jsInterceptorClass = findClass('Interceptor'),
+          jsStringClass = findClass('JSString'),
+          jsArrayClass = findClass('JSArray'),
+          // The int class must be before the double class, because the
+          // emitter relies on this list for the order of type checks.
+          jsIntClass = findClass('JSInt'),
+          jsPositiveIntClass = findClass('JSPositiveInt'),
+          jsUInt32Class = findClass('JSUInt32'),
+          jsUInt31Class = findClass('JSUInt31'),
+          jsDoubleClass = findClass('JSDouble'),
+          jsNumberClass = findClass('JSNumber'),
+          jsNullClass = findClass('JSNull'),
+          jsBoolClass = findClass('JSBool'),
+          jsMutableArrayClass = findClass('JSMutableArray'),
+          jsFixedArrayClass = findClass('JSFixedArray'),
+          jsExtendableArrayClass = findClass('JSExtendableArray'),
+          jsPlainJavaScriptObjectClass = findClass('PlainJavaScriptObject'),
+          jsUnknownJavaScriptObjectClass = findClass('UnknownJavaScriptObject'),
+        ];
+
+        jsIndexableClass = findClass('JSIndexable');
+        jsMutableIndexableClass = findClass('JSMutableIndexable');
+      } else if (uri == Compiler.DART_JS_HELPER) {
+        typeLiteralClass = findClass('TypeImpl');
+        constMapLiteralClass = findClass('ConstantMap');
+        typeVariableClass = findClass('TypeVariable');
+
+        jsIndexingBehaviorInterface = findClass('JavaScriptIndexingBehavior');
+
+        noSideEffectsClass = findClass('NoSideEffects');
+        noThrowsClass = findClass('NoThrows');
+        noInlineClass = findClass('NoInline');
+        irRepresentationClass = findClass('IrRepresentation');
+      } else if (uri == DART_JS_MIRRORS) {
+        disableTreeShakingMarker = library.find('disableTreeShaking');
+        preserveMetadataMarker = library.find('preserveMetadata');
+      } else if (uri == DART_JS_NAMES) {
+        preserveNamesMarker = library.find('preserveNames');
+      } else if (uri == Compiler.DART_JS_HELPER) {
+        getIsolateAffinityTagMarker = library.find('getIsolateAffinityTag');
+      }
+    });
+  }
+
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    if (!loadedLibraries.containsKey(Compiler.DART_CORE)) {
+      return new Future.value();
     }
+    assert(loadedLibraries.containsKey(Compiler.DART_CORE));
+    assert(loadedLibraries.containsKey(Compiler.DART_INTERCEPTORS));
+    assert(loadedLibraries.containsKey(Compiler.DART_JS_HELPER));
+
+    // [LinkedHashMap] is reexported from dart:collection and can therefore not
+    // be loaded from dart:core in [onLibraryScanned].
+    mapLiteralClass = compiler.coreLibrary.find('LinkedHashMap');
+
+    implementationClasses = <ClassElement, ClassElement>{};
+    implementationClasses[compiler.intClass] = jsIntClass;
+    implementationClasses[compiler.boolClass] = jsBoolClass;
+    implementationClasses[compiler.numClass] = jsNumberClass;
+    implementationClasses[compiler.doubleClass] = jsDoubleClass;
+    implementationClasses[compiler.stringClass] = jsStringClass;
+    implementationClasses[compiler.listClass] = jsArrayClass;
+    implementationClasses[compiler.nullClass] = jsNullClass;
+
+    // These methods are overwritten with generated versions.
+    inlineCache.markAsNonInlinable(getInterceptorMethod, insideLoop: true);
+
+    // TODO(kasperl): Some tests do not define the special JSArray
+    // subclasses, so we check to see if they are defined before
+    // trying to resolve them.
+    if (jsFixedArrayClass != null) {
+      jsFixedArrayClass.ensureResolved(compiler);
+    }
+    if (jsExtendableArrayClass != null) {
+      jsExtendableArrayClass.ensureResolved(compiler);
+    }
+
+    jsIndexableClass.ensureResolved(compiler);
+    jsIndexableLength = compiler.lookupElementIn(
+        jsIndexableClass, 'length');
+    if (jsIndexableLength != null && jsIndexableLength.isAbstractField) {
+      AbstractFieldElement element = jsIndexableLength;
+      jsIndexableLength = element.getter;
+    }
+
+    jsArrayClass.ensureResolved(compiler);
+    jsArrayTypedConstructor = compiler.lookupElementIn(jsArrayClass, 'typed');
+    jsArrayRemoveLast = compiler.lookupElementIn(jsArrayClass, 'removeLast');
+    jsArrayAdd = compiler.lookupElementIn(jsArrayClass, 'add');
+
+    jsStringClass.ensureResolved(compiler);
+    jsStringSplit = compiler.lookupElementIn(jsStringClass, 'split');
+    jsStringOperatorAdd = compiler.lookupElementIn(jsStringClass, '+');
+    jsStringToString = compiler.lookupElementIn(jsStringClass, 'toString');
+
+    objectEquals = compiler.lookupElementIn(compiler.objectClass, '==');
+
+    specialOperatorEqClasses
+        ..add(compiler.objectClass)
+        ..add(jsInterceptorClass)
+        ..add(jsNullClass);
+
+    indexablePrimitiveType = new TypeMask.nonNullSubtype(jsIndexableClass);
+    readableArrayType = new TypeMask.nonNullSubclass(jsArrayClass);
+    mutableArrayType = new TypeMask.nonNullSubclass(jsMutableArrayClass);
+    fixedArrayType = new TypeMask.nonNullExact(jsFixedArrayClass);
+    extendableArrayType = new TypeMask.nonNullExact(jsExtendableArrayClass);
+    nonNullType = compiler.typesTask.dynamicType.nonNullable();
+
+    validateInterceptorImplementsAllObjectMethods(jsInterceptorClass);
+    // The null-interceptor must also implement *all* methods.
+    validateInterceptorImplementsAllObjectMethods(jsNullClass);
     return new Future.value();
   }
 
@@ -1708,6 +1787,7 @@
    * need to access it.
    */
   bool isNeededForReflection(Element element) {
+    if (!isTreeShakingDisabled) return false;
     element = getDartClass(element);
     if (hasInsufficientMirrorsUsed) return isTreeShakingDisabled;
     /// Record the name of [element] in [symbolsUsed]. Return true for
@@ -1821,6 +1901,11 @@
 
   /// Called when [enqueuer] is empty, but before it is closed.
   void onQueueEmpty(Enqueuer enqueuer) {
+    // Add elements referenced only via custom elements.  Return early if any
+    // elements are added to avoid counting the elements as due to mirrors.
+    customElementsAnalysis.onQueueEmpty(enqueuer);
+    if (!enqueuer.queueIsEmpty) return;
+
     if (!enqueuer.isResolutionQueue && preMirrorsMethodCount == 0) {
       preMirrorsMethodCount = generatedCode.length;
     }
@@ -1846,8 +1931,6 @@
       }
       metadataConstants.clear();
     }
-
-    customElementsAnalysis.onQueueEmpty(enqueuer);
   }
 
   void onElementResolved(Element element, TreeElements elements) {
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
index aef2abb..d19369a 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_emitter.dart
@@ -237,12 +237,12 @@
     return namer.elementAccess(element);
   }
 
-  jsAst.Expression visitMap(MapConstant constant) {
+  jsAst.Expression visitMap(JavaScriptMapConstant constant) {
     jsAst.Expression jsMap() {
       List<jsAst.Property> properties = <jsAst.Property>[];
-      for (int i = 0; i < constant.keys.entries.length; i++) {
-        StringConstant key = constant.keys.entries[i];
-        if (key.value == MapConstant.PROTO_PROPERTY) continue;
+      for (int i = 0; i < constant.length; i++) {
+        StringConstant key = constant.keys[i];
+        if (key.value == JavaScriptMapConstant.PROTO_PROPERTY) continue;
 
         // Keys in literal maps must be emitted in place.
         jsAst.Literal keyExpression = _visit(key);
@@ -255,9 +255,9 @@
 
     jsAst.Expression jsGeneralMap() {
       List<jsAst.Expression> data = <jsAst.Expression>[];
-      for (int i = 0; i < constant.keys.entries.length; i++) {
+      for (int i = 0; i < constant.keys.length; i++) {
         jsAst.Expression keyExpression =
-            constantEmitter.reference(constant.keys.entries[i]);
+            constantEmitter.reference(constant.keys[i]);
         jsAst.Expression valueExpression =
             constantEmitter.reference(constant.values[i]);
         data.add(keyExpression);
@@ -276,17 +276,17 @@
     int emittedArgumentCount = 0;
     classElement.implementation.forEachInstanceField(
         (ClassElement enclosing, Element field) {
-          if (field.name == MapConstant.LENGTH_NAME) {
+          if (field.name == JavaScriptMapConstant.LENGTH_NAME) {
             arguments.add(
-                new jsAst.LiteralNumber('${constant.keys.entries.length}'));
-          } else if (field.name == MapConstant.JS_OBJECT_NAME) {
+                new jsAst.LiteralNumber('${constant.keyList.entries.length}'));
+          } else if (field.name == JavaScriptMapConstant.JS_OBJECT_NAME) {
             arguments.add(jsMap());
-          } else if (field.name == MapConstant.KEYS_NAME) {
-            arguments.add(constantEmitter.reference(constant.keys));
-          } else if (field.name == MapConstant.PROTO_VALUE) {
+          } else if (field.name == JavaScriptMapConstant.KEYS_NAME) {
+            arguments.add(constantEmitter.reference(constant.keyList));
+          } else if (field.name == JavaScriptMapConstant.PROTO_VALUE) {
             assert(constant.protoValue != null);
             arguments.add(constantEmitter.reference(constant.protoValue));
-          } else if (field.name == MapConstant.JS_DATA_NAME) {
+          } else if (field.name == JavaScriptMapConstant.JS_DATA_NAME) {
             arguments.add(jsGeneralMap());
           } else {
             compiler.internalError(field,
@@ -296,11 +296,11 @@
           emittedArgumentCount++;
         },
         includeSuperAndInjectedMembers: true);
-    if ((className == MapConstant.DART_STRING_CLASS &&
+    if ((className == JavaScriptMapConstant.DART_STRING_CLASS &&
          emittedArgumentCount != 3) ||
-        (className == MapConstant.DART_PROTO_CLASS &&
+        (className == JavaScriptMapConstant.DART_PROTO_CLASS &&
          emittedArgumentCount != 4) ||
-        (className == MapConstant.DART_GENERAL_CLASS &&
+        (className == JavaScriptMapConstant.DART_GENERAL_CLASS &&
          emittedArgumentCount != 1)) {
       compiler.internalError(classElement,
           "Compiler and ${className} disagree on number of fields.");
@@ -369,7 +369,6 @@
       InterfaceType interface = type;
       RuntimeTypes rti = backend.rti;
       Iterable<String> arguments = interface.typeArguments
-          .toList(growable: false)
           .map((DartType type) =>
               rti.getTypeRepresentationWithHashes(type, (_){}));
       jsAst.Expression argumentList =
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
index 382a000..3274359 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/constant_system_javascript.dart
@@ -239,4 +239,102 @@
     }
     return compiler.types.isSubtype(s, t);
   }
+
+  MapConstant createMap(Compiler compiler,
+                        InterfaceType sourceType,
+                        List<Constant> keys,
+                        List<Constant> values) {
+    bool onlyStringKeys = true;
+    Constant protoValue = null;
+    for (int i = 0; i < keys.length ; i++) {
+      var key = keys[i];
+      if (key.isString) {
+        if (key.value == JavaScriptMapConstant.PROTO_PROPERTY) {
+          protoValue = values[i];
+        }
+      } else {
+        onlyStringKeys = false;
+        // Don't handle __proto__ values specially in the general map case.
+        protoValue = null;
+        break;
+      }
+    }
+
+    bool hasProtoKey = (protoValue != null);
+    DartType keysType;
+    if (sourceType.treatAsRaw) {
+      keysType = compiler.listClass.rawType;
+    } else {
+      Link<DartType> arguments =
+          new Link<DartType>.fromList([sourceType.typeArguments.head]);
+      keysType = new InterfaceType(compiler.listClass, arguments);
+    }
+    ListConstant keysList = new ListConstant(keysType, keys);
+    String className = onlyStringKeys
+        ? (hasProtoKey ? JavaScriptMapConstant.DART_PROTO_CLASS
+                       : JavaScriptMapConstant.DART_STRING_CLASS)
+        : JavaScriptMapConstant.DART_GENERAL_CLASS;
+    ClassElement classElement = compiler.jsHelperLibrary.find(className);
+    classElement.ensureResolved(compiler);
+    Link<DartType> typeArgument = sourceType.typeArguments;
+    InterfaceType type;
+    if (sourceType.treatAsRaw) {
+      type = classElement.rawType;
+    } else {
+      type = new InterfaceType(classElement, typeArgument);
+    }
+    return new JavaScriptMapConstant(
+        type, keysList, values, protoValue, onlyStringKeys);
+
+  }
 }
+
+class JavaScriptMapConstant extends MapConstant {
+  /**
+   * The [PROTO_PROPERTY] must not be used as normal property in any JavaScript
+   * object. It would change the prototype chain.
+   */
+  static const LiteralDartString PROTO_PROPERTY =
+      const LiteralDartString("__proto__");
+
+  /** The dart class implementing constant map literals. */
+  static const String DART_CLASS = "ConstantMap";
+  static const String DART_STRING_CLASS = "ConstantStringMap";
+  static const String DART_PROTO_CLASS = "ConstantProtoMap";
+  static const String DART_GENERAL_CLASS = "GeneralConstantMap";
+  static const String LENGTH_NAME = "length";
+  static const String JS_OBJECT_NAME = "_jsObject";
+  static const String KEYS_NAME = "_keys";
+  static const String PROTO_VALUE = "_protoValue";
+  static const String JS_DATA_NAME = "_jsData";
+
+  final ListConstant keyList;
+  final Constant protoValue;
+  final bool onlyStringKeys;
+
+  JavaScriptMapConstant(DartType type,
+                        ListConstant keyList,
+                        List<Constant> values,
+                        this.protoValue,
+                        this.onlyStringKeys)
+      : this.keyList = keyList,
+        super(type, keyList.entries, values);
+  bool get isMap => true;
+
+  TypeMask computeMask(Compiler compiler) {
+    return compiler.typesTask.constMapType;
+  }
+
+  List<Constant> getDependencies() {
+    List<Constant> result = <Constant>[];
+    if (onlyStringKeys) {
+      result.add(keyList);
+    } else {
+      // Add the keys individually to avoid generating an unused list constant
+      // for the keys.
+      result.addAll(keys);
+    }
+    result.addAll(values);
+    return result;
+  }
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
index 60f1608..79b581fe 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/custom_elements_analysis.dart
@@ -73,9 +73,10 @@
     joinFor(enqueuer).instantiatedClasses.add(classElement);
   }
 
-  void registerTypeLiteral(DartType type, Enqueuer enqueuer) {
+  void registerTypeLiteral(DartType type, Registry registry) {
+    assert(registry.isForResolution);
     // In codegen we see the TypeConstants instead.
-    if (!enqueuer.isResolutionQueue) return;
+    if (!registry.isForResolution) return;
 
     if (type.isInterfaceType) {
       // TODO(sra): If we had a flow query from the type literal expression to
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
index 255f388..9bd4a5d 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart
@@ -16,6 +16,7 @@
 import '../dart_types.dart';
 import '../js/js.dart' as jsAst;
 import '../js/js.dart' show js;
+import '../library_loader.dart' show LibraryLoader;
 import '../native_handler.dart' as native;
 import '../ssa/ssa.dart';
 import '../tree/tree.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
index 6c1efd0..f63d7f3 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/namer.dart
@@ -1127,7 +1127,7 @@
     }
   }
 
-  visitMap(MapConstant constant) {
+  visitMap(JavaScriptMapConstant constant) {
     // TODO(9476): Incorporate type parameters into name.
     addRoot('Map');
     if (constant.length == 0) {
@@ -1135,7 +1135,7 @@
     } else {
       // Using some bits from the keys hash tag groups the names Maps with the
       // same structure.
-      add(getHashTag(constant.keys, 2) + getHashTag(constant, 3));
+      add(getHashTag(constant.keyList, 2) + getHashTag(constant, 3));
     }
   }
 
@@ -1220,7 +1220,7 @@
   }
 
   int visitMap(MapConstant constant) {
-    int hash = _visit(constant.keys);
+    int hash = _hashList(constant.length, constant.keys);
     return _hashList(hash, constant.values);
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
index 900823d..1e77f3f 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/native_emitter.dart
@@ -6,7 +6,9 @@
 
 class NativeEmitter {
 
-  CodeEmitterTask emitter;
+  final Map<Element, ClassBuilder> cachedBuilders;
+
+  final CodeEmitterTask emitter;
   CodeBuffer nativeBuffer;
 
   // Native classes found in the application.
@@ -26,11 +28,13 @@
   // it finds any native class that needs noSuchMethod handling.
   bool handleNoSuchMethod = false;
 
-  NativeEmitter(this.emitter)
-      : subtypes = new Map<ClassElement, List<ClassElement>>(),
+  NativeEmitter(CodeEmitterTask emitter)
+      : this.emitter = emitter,
+        subtypes = new Map<ClassElement, List<ClassElement>>(),
         directSubtypes = new Map<ClassElement, List<ClassElement>>(),
         nativeMethods = new Set<FunctionElement>(),
-        nativeBuffer = new CodeBuffer();
+        nativeBuffer = new CodeBuffer(),
+        cachedBuilders = emitter.compiler.cacheStrategy.newMap();
 
   Compiler get compiler => emitter.compiler;
   JavaScriptBackend get backend => compiler.backend;
@@ -279,6 +283,16 @@
   }
 
   ClassBuilder generateNativeClass(ClassElement classElement) {
+    ClassBuilder builder;
+    if (compiler.hasIncrementalSupport) {
+      builder = cachedBuilders[classElement];
+      if (builder != null) return builder;
+      builder = new ClassBuilder(backend.namer);
+      cachedBuilders[classElement] = builder;
+    } else {
+      builder = new ClassBuilder(backend.namer);
+    }
+
     // TODO(sra): Issue #13731- this is commented out as part of custom element
     // constructor work.
     //assert(!classElement.hasBackendMembers);
@@ -294,7 +308,6 @@
 
     String superName = backend.namer.getNameOfClass(superclass);
 
-    ClassBuilder builder = new ClassBuilder(backend.namer);
     emitter.classEmitter.emitClassConstructor(classElement, builder);
     bool hasFields = emitter.classEmitter.emitFields(
         classElement, builder, superName, classIsNative: true);
diff --git a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
index 135e489..ae5aae6 100644
--- a/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_backend/runtime_types.dart
@@ -524,9 +524,9 @@
     } else {
       List<String> parameters = const <String>[];
       if (contextClass != null) {
-        parameters = contextClass.typeVariables.toList().map((type) {
+        parameters = contextClass.typeVariables.mapToList((type) {
             return type.toString();
-        }).toList();
+        });
       }
       return js('function(#) { return # }', [parameters, encoding]);
     }
@@ -859,7 +859,7 @@
     jsAst.Expression value =
         rti.getSubstitutionRepresentation(arguments, use);
     if (isFunction) {
-      Iterable<jsAst.Expression> formals = parameters.toList().map(declaration);
+      Iterable<jsAst.Expression> formals = parameters.map(declaration);
       return js('function(#) { return # }', [formals, value]);
     } else if (ensureIsFunction) {
       return js('function() { return # }', value);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
index a6386a3..3e269a2 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/code_emitter_task.dart
@@ -18,6 +18,11 @@
   final InterceptorEmitter interceptorEmitter = new InterceptorEmitter();
   final MetadataEmitter metadataEmitter = new MetadataEmitter();
 
+  final Set<Constant> cachedEmittedConstants;
+  final CodeBuffer cachedEmittedConstantsBuffer = new CodeBuffer();
+  final Map<Element, ClassBuilder> cachedClassBuilders;
+  final Set<Element> cachedElements;
+
   bool needsDefineClass = false;
   bool needsMixinSupport = false;
   bool needsLazyInitializer = false;
@@ -98,6 +103,9 @@
   CodeEmitterTask(Compiler compiler, Namer namer, this.generateSourceMap)
       : this.namer = namer,
         constantEmitter = new ConstantEmitter(compiler, namer),
+        cachedEmittedConstants = compiler.cacheStrategy.newSet(),
+        cachedClassBuilders = compiler.cacheStrategy.newMap(),
+        cachedElements = compiler.cacheStrategy.newSet(),
         super(compiler) {
     nativeEmitter = new NativeEmitter(this);
     containerBuilder.task = this;
@@ -766,8 +774,23 @@
 
   void generateClass(ClassElement classElement, ClassBuilder properties) {
     compiler.withCurrentElement(classElement, () {
-      classEmitter.generateClass(
-          classElement, properties, additionalProperties[classElement]);
+      if (compiler.hasIncrementalSupport) {
+        ClassBuilder builder =
+            cachedClassBuilders.putIfAbsent(classElement, () {
+              ClassBuilder builder = new ClassBuilder(namer);
+              classEmitter.generateClass(
+                  classElement, builder, additionalProperties[classElement]);
+              return builder;
+            });
+        invariant(classElement, builder.fields.isEmpty);
+        invariant(classElement, builder.superName == null);
+        invariant(classElement, builder.functionType == null);
+        invariant(classElement, builder.fieldMetadata == null);
+        properties.properties.addAll(builder.properties);
+      } else {
+        classEmitter.generateClass(
+            classElement, properties, additionalProperties[classElement]);
+      }
     });
   }
 
@@ -901,7 +924,15 @@
   void emitCompileTimeConstants(CodeBuffer buffer, OutputUnit outputUnit) {
     List<Constant> constants = outputConstantLists[outputUnit];
     if (constants == null) return;
+    bool isMainBuffer = buffer == mainBuffer;
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      buffer = cachedEmittedConstantsBuffer;
+    }
     for (Constant constant in constants) {
+      if (compiler.hasIncrementalSupport && isMainBuffer) {
+        if (cachedEmittedConstants.contains(constant)) continue;
+        cachedEmittedConstants.add(constant);
+      }
       String name = namer.constantName(constant);
       if (constant.isList) emitMakeConstantListIfNotEmitted(buffer);
       jsAst.Expression init = js('#.# = #',
@@ -910,6 +941,9 @@
       buffer.write(jsAst.prettyPrint(init, compiler));
       buffer.write('$N');
     }
+    if (compiler.hasIncrementalSupport && isMainBuffer) {
+      mainBuffer.add(cachedEmittedConstantsBuffer);
+    }
   }
 
   bool isConstantInlinedOrAlreadyEmitted(Constant constant) {
@@ -1094,7 +1128,7 @@
   void computeNeededConstants() {
     JavaScriptConstantCompiler handler = backend.constants;
     List<Constant> constants = handler.getConstantsForEmission(
-        compareConstants);
+        compiler.hasIncrementalSupport ? null : compareConstants);
     for (Constant constant in constants) {
       if (isConstantInlinedOrAlreadyEmitted(constant)) continue;
       OutputUnit constantUnit =
@@ -1302,6 +1336,8 @@
 
   String assembleProgram() {
     measure(() {
+      invalidateCaches();
+
       // Compute the required type checks to know which classes need a
       // 'is$' method.
       typeTestEmitter.computeRequiredTypeChecks();
@@ -1445,22 +1481,24 @@
         List<Element> sortedElements =
             Elements.sortedByPosition(elementDescriptors.keys);
 
-        Iterable<Element> pendingStatics = sortedElements.where((element) {
-            return !element.isLibrary &&
-                elementDescriptors[element].values.any((descriptor) =>
-                    descriptor != null);
-        });
+        Iterable<Element> pendingStatics;
+        if (!compiler.hasIncrementalSupport) {
+          pendingStatics = sortedElements.where((element) {
+              return !element.isLibrary &&
+                  elementDescriptors[element].values.any((descriptor) =>
+                      descriptor != null);
+          });
 
-        pendingStatics.forEach((element) =>
-            compiler.reportInfo(
-                element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
-
+          pendingStatics.forEach((element) =>
+              compiler.reportInfo(
+                  element, MessageKind.GENERIC, {'text': 'Pending statics.'}));
+        }
         for (LibraryElement library in sortedElements.where((element) =>
             element.isLibrary)) {
           writeLibraryDescriptors(library);
           elementDescriptors[library] = const {};
         }
-        if (!pendingStatics.isEmpty) {
+        if (pendingStatics != null && !pendingStatics.isEmpty) {
           compiler.internalError(pendingStatics.first,
               'Pending statics (see above).');
         }
@@ -1755,4 +1793,17 @@
   void registerReadTypeVariable(TypeVariableElement element) {
     readTypeVariables.add(element);
   }
+
+  void invalidateCaches() {
+    if (!compiler.hasIncrementalSupport) return;
+    if (cachedElements.isEmpty) return;
+    for (Element element in compiler.enqueuer.codegen.newlyEnqueuedElements) {
+      if (element.isInstanceMember) {
+        cachedClassBuilders.remove(element.enclosingClass);
+
+        nativeEmitter.cachedBuilders.remove(element.enclosingClass);
+
+      }
+    }
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
index 6b5b48f..abfe508 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/container_builder.dart
@@ -79,9 +79,6 @@
     // Includes extra receiver argument when using interceptor convention
     int indexOfLastOptionalArgumentInParameters = optionalParameterStart - 1;
 
-    TreeElements elements =
-        compiler.enqueuer.resolution.getCachedElements(member);
-
     int parameterIndex = 0;
     parameters.orderedForEachParameter((Element element) {
       String jsName = backend.namer.safeName(element.name);
@@ -514,9 +511,8 @@
         expressions.add(
             js.number(task.metadataEmitter.reifyName(parameter.name)));
         if (backend.mustRetainMetadata) {
-          List<MetadataAnnotation> annotations = parameter.metadata.toList();
           Iterable<int> metadataIndices =
-              annotations.map((MetadataAnnotation annotation) {
+              parameter.metadata.map((MetadataAnnotation annotation) {
             Constant constant =
                 backend.constants.getConstantForMetadata(annotation);
             backend.constants.addCompileTimeConstantForEmission(constant);
diff --git a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
index 63215e1..c270d90 100644
--- a/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
+++ b/sdk/lib/_internal/compiler/implementation/js_emitter/type_test_emitter.dart
@@ -281,6 +281,7 @@
     // TODO(sigurdm): We should avoid running through this list for each
     // output unit.
 
+    jsAst.Statement variables = js.statement('var TRUE = !0, _;');
     List<jsAst.Statement> statements = <jsAst.Statement>[];
 
     for (ClassElement cls in typeChecks) {
@@ -289,26 +290,40 @@
       if (destination != outputUnit) continue;
       // TODO(9556).  The properties added to 'holder' should be generated
       // directly as properties of the class object, not added later.
-      jsAst.Expression holder = namer.elementAccess(cls);
+
+      // Each element is a pair: [propertyName, valueExpression]
+      List<List> properties = <List>[];
 
       for (TypeCheck check in typeChecks[cls]) {
-        ClassElement cls = check.cls;
-        buffer.write(
-            jsAst.prettyPrint(
-                js('#.# = true', [holder, namer.operatorIs(cls)]),
-                compiler));
-        buffer.write('$N');
+        ClassElement checkedClass = check.cls;
+        properties.add([namer.operatorIs(checkedClass), js('TRUE')]);
         Substitution substitution = check.substitution;
         if (substitution != null) {
           jsAst.Expression body = substitution.getCode(rti, false);
-          buffer.write(
-              jsAst.prettyPrint(
-                  js('#.# = #',
-                      [holder, namer.substitutionName(cls), body]),
-                  compiler));
-          buffer.write('$N');
+          properties.add([namer.substitutionName(checkedClass), body]);
         }
       }
+
+      jsAst.Expression holder = namer.elementAccess(cls);
+      if (properties.length > 1) {
+        // Use temporary shortened reference.
+        statements.add(js.statement('_ = #;', holder));
+        holder = js('#', '_');
+      }
+      for (List nameAndValue in properties) {
+        statements.add(
+            js.statement('#.# = #',
+                [holder, nameAndValue[0], nameAndValue[1]]));
+      }
+    }
+
+    if (statements.isNotEmpty) {
+      buffer.write(';');
+      buffer.write(
+          jsAst.prettyPrint(
+              js.statement('(function() { #; #; })()', [variables, statements]),
+              compiler));
+      buffer.write('$N');
     }
   }
 
diff --git a/sdk/lib/_internal/compiler/implementation/library_loader.dart b/sdk/lib/_internal/compiler/implementation/library_loader.dart
index 7ebe1f31..dfb3258e 100644
--- a/sdk/lib/_internal/compiler/implementation/library_loader.dart
+++ b/sdk/lib/_internal/compiler/implementation/library_loader.dart
@@ -2,7 +2,30 @@
 // for 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 dart2js;
+library dart2js.library_loader;
+
+import 'dart:async';
+import 'dart2jslib.dart'
+    show Compiler,
+         CompilerTask,
+         MessageKind,
+         Script,
+         invariant;
+import 'elements/elements.dart'
+    show CompilationUnitElement,
+         Element,
+         LibraryElement,
+         PrefixElement;
+import 'elements/modelx.dart'
+    show CompilationUnitElementX,
+         DeferredLoaderGetterElementX,
+         ErroneousElementX,
+         LibraryElementX,
+         PrefixElementX;
+import 'helpers/helpers.dart';
+import 'native_handler.dart' as native;
+import 'tree/tree.dart';
+import 'util/util.dart' show Link, LinkBuilder;
 
 /**
  * [CompilerTask] for loading libraries and setting up the import/export scopes.
@@ -97,8 +120,8 @@
  * point to the 'packages' folder.
  *
  */
-abstract class LibraryLoader extends CompilerTask {
-  LibraryLoader(Compiler compiler) : super(compiler);
+abstract class LibraryLoaderTask implements CompilerTask {
+  factory LibraryLoaderTask(Compiler compiler) = _LibraryLoaderTask;
 
   /**
    * Loads the library specified by the [resolvedUri] and returns its
@@ -108,28 +131,29 @@
    * [LibraryElement] for the library and computes the import/export scope,
    * loading and computing the import/export scopes of all required libraries in
    * the process. The method handles cyclic dependency between libraries.
-   *
-   * This is the main entry point for [LibraryLoader].
    */
-  // TODO(johnniwinther): Remove [canonicalUri] together with
-  // [Compiler.scanBuiltinLibrary].
-  Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node,
-                                     Uri canonicalUri);
+  Future<LibraryElement> loadLibrary(Uri resolvedUri);
 
-  // TODO(johnniwinther): Remove this when patches don't need special parsing.
-  Future registerLibraryFromTag(LibraryDependencyHandler handler,
-                                LibraryElement library,
-                                LibraryDependency tag);
+  /// Reset the library loader task to prepare for compilation. This is used
+  /// for incremental compilation.
+  void reset();
 
-  /**
-   * Adds the elements in the export scope of [importedLibrary] to the import
-   * scope of [importingLibrary].
-   */
-  // TODO(johnniwinther): Move handling of 'js_helper' to the library loader
-  // to remove this method from the [LibraryLoader] interface.
-  void importLibrary(LibraryElement importingLibrary,
-                     LibraryElement importedLibrary,
-                     Import tag);
+  /// Reuse [library] from a previous compilation. This is used for incremental
+  /// compilation.
+  void reuseLibrary(LibraryElement library);
+}
+
+/// Handle for creating synthesized/patch libraries during library loading.
+abstract class LibraryLoader {
+  /// This method must be called when a new synthesized/patch library has been
+  /// created to ensure that [library] will part of library dependency graph
+  /// used for computing import/export scopes.
+  void registerNewLibrary(LibraryElement library);
+
+  /// This method must be called when a new synthesized/patch library has been
+  /// scanned in order to process the library tags in [library] and thus handle
+  /// imports/exports/parts in the synthesized/patch library.
+  Future processLibraryTags(LibraryElement library);
 }
 
 /**
@@ -218,10 +242,9 @@
  * [LibraryLoader] and [LibraryLoaderTask] is made to hide internal members from
  * the [LibraryLoader] interface.
  */
-class LibraryLoaderTask extends LibraryLoader {
-  LibraryLoaderTask(Compiler compiler) : super(compiler);
+class _LibraryLoaderTask extends CompilerTask implements LibraryLoaderTask {
+  _LibraryLoaderTask(Compiler compiler) : super(compiler);
   String get name => 'LibraryLoader';
-  List onLibraryLoadedCallbacks = [];
 
   final Map<Uri, LibraryElement> libraryResourceUriMap =
       new Map<Uri, LibraryElement>();
@@ -230,22 +253,38 @@
 
   LibraryDependencyHandler currentHandler;
 
-  Future<LibraryElement> loadLibrary(Uri resolvedUri, Node node,
-      Uri canonicalUri) {
+  void reset() {
+    assert(currentHandler == null);
+    libraryResourceUriMap.clear();
+    libraryNames.clear();
+  }
+
+  void reuseLibrary(LibraryElement library) {
+    String name = library.getLibraryOrScriptName();
+    Uri resourceUri = library.entryCompilationUnit.script.resourceUri;
+    libraryResourceUriMap[resourceUri] = library;
+    libraryNames[name] = library;
+  }
+
+  Future<LibraryElement> loadLibrary(Uri resolvedUri) {
     return measure(() {
       assert(currentHandler == null);
       // TODO(johnniwinther): Ensure that currentHandler correctly encloses the
       // loading of a library cluster.
-      currentHandler = new LibraryDependencyHandler(compiler);
-      return createLibrary(currentHandler, null, resolvedUri, node,
-          canonicalUri).then((LibraryElement library) {
+      currentHandler = new LibraryDependencyHandler(this);
+      return createLibrary(currentHandler, null, resolvedUri)
+          .then((LibraryElement library) {
         return compiler.withCurrentElement(library, () {
           return measure(() {
             currentHandler.computeExports();
+            Map<Uri, LibraryElement> loadedLibraries = <Uri, LibraryElement>{};
+            currentHandler.loadedLibraries.forEach(
+                (LibraryElement loadedLibrary) {
+              loadedLibraries[loadedLibrary.canonicalUri] = loadedLibrary;
+            });
             currentHandler = null;
-            var workList = onLibraryLoadedCallbacks;
-            onLibraryLoadedCallbacks = [];
-            return Future.forEach(workList, (f) => f()).then((_) => library);
+            return compiler.onLibrariesLoaded(loadedLibraries)
+                .then((_) => library);
           });
         });
       });
@@ -281,7 +320,7 @@
     var libraryDependencies = new LinkBuilder<LibraryDependency>();
     Uri base = library.entryCompilationUnit.script.readableUri;
 
-    // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
+    // TODO(johnniwinther): Reverse the tag list on access and cache the result.
     return Future.forEach(library.tags.reverse().toList(), (LibraryTag tag) {
       return compiler.withCurrentElement(library, () {
         if (tag.isImport) {
@@ -312,15 +351,11 @@
         }
       });
     }).then((_) {
-      return compiler.withCurrentElement(library, () {
-        checkDuplicatedLibraryName(library);
-        // Apply patch, if any.
-        if (library.isPlatformLibrary) {
-          return patchDartLibrary(handler, library, library.canonicalUri.path);
-        }
-      });
+      return compiler.onLibraryScanned(library, handler);
     }).then((_) {
       return compiler.withCurrentElement(library, () {
+        checkDuplicatedLibraryName(library);
+
         // Import dart:core if not already imported.
         if (!importsDartCore && !isDartCore(library.canonicalUri)) {
           return loadCoreLibrary(handler).then((LibraryElement coreLibrary) {
@@ -329,7 +364,6 @@
         }
       });
     }).then((_) {
-      // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
       return Future.forEach(libraryDependencies.toLink().toList(), (tag) {
         return compiler.withCurrentElement(library, () {
           return registerLibraryFromTag(handler, library, tag);
@@ -389,22 +423,12 @@
     }
 
     Uri coreUri = new Uri(scheme: 'dart', path: 'core');
-    return createLibrary(handler, null, coreUri, null, coreUri)
-        .then((LibraryElement library) {
+    return createLibrary(handler, null, coreUri).then((LibraryElement library) {
       compiler.coreLibrary = library;
       return library;
     });
   }
 
-  Future patchDartLibrary(LibraryDependencyHandler handler,
-                        LibraryElement library, String dartLibraryPath) {
-    if (library.isPatched) return new Future.value();
-    Uri patchUri = compiler.resolvePatchUri(dartLibraryPath);
-    if (patchUri == null) return new Future.value();
-
-    return compiler.patchParser.patchLibrary(handler, patchUri, library);
-  }
-
   /**
    * Handle a part tag in the scope of [library]. The [resolvedUri] given is
    * used as is, any URI resolution should be done beforehand.
@@ -440,7 +464,7 @@
                                 LibraryDependency tag) {
     Uri base = library.entryCompilationUnit.script.readableUri;
     Uri resolvedUri = base.resolve(tag.uri.dartString.slowToString());
-    return createLibrary(handler, library, resolvedUri, tag.uri, resolvedUri)
+    return createLibrary(handler, library, resolvedUri, tag.uri)
         .then((LibraryElement loadedLibrary) {
           if (loadedLibrary == null) return;
           compiler.withCurrentElement(library, () {
@@ -455,22 +479,16 @@
    *
    * If a new library is created, the [handler] is notified.
    */
-  // TODO(johnniwinther): Remove [canonicalUri] and make [resolvedUri] the
-  // canonical uri when [Compiler.scanBuiltinLibrary] is removed.
   Future<LibraryElement> createLibrary(LibraryDependencyHandler handler,
                                        LibraryElement importingLibrary,
                                        Uri resolvedUri,
-                                       Node node,
-                                       Uri canonicalUri) {
+                                       [Node node]) {
     // TODO(johnniwinther): Create erroneous library elements for missing
     // libraries.
     Uri readableUri =
         compiler.translateResolvedUri(importingLibrary, resolvedUri, node);
     if (readableUri == null) return new Future.value();
-    LibraryElement library;
-    if (canonicalUri != null) {
-      library = compiler.libraries[canonicalUri.toString()];
-    }
+    LibraryElement library = compiler.libraries[resolvedUri.toString()];
     if (library != null) {
       return new Future.value(library);
     }
@@ -478,35 +496,22 @@
       return compiler.readScript(node, readableUri)
           .then((Script script) {
             if (script == null) return null;
-            LibraryElement element = new LibraryElementX(script, canonicalUri);
+            LibraryElement element = new LibraryElementX(script, resolvedUri);
             compiler.withCurrentElement(element, () {
               handler.registerNewLibrary(element);
               native.maybeEnableNative(compiler, element);
-              if (canonicalUri != null) {
-                compiler.libraries[canonicalUri.toString()] = element;
-              }
+              compiler.libraries[resolvedUri.toString()] = element;
               compiler.scanner.scanLibrary(element);
             });
             return processLibraryTags(handler, element).then((_) {
               compiler.withCurrentElement(element, () {
                 handler.registerLibraryExports(element);
-                onLibraryLoadedCallbacks.add(
-                    () => compiler.onLibraryLoaded(element, resolvedUri));
               });
               return element;
             });
           });
     });
   }
-
-  // TODO(johnniwinther): Remove this method when 'js_helper' is handled by
-  // [LibraryLoaderTask].
-  void importLibrary(LibraryElement importingLibrary,
-                     LibraryElement importedLibrary,
-                     Import tag) {
-    new ImportLink(tag, importedLibrary).importLibrary(compiler,
-                                                       importingLibrary);
-  }
 }
 
 
@@ -834,8 +839,8 @@
  * libraries and to compute their import/export scopes through a fixed-point
  * algorithm.
  */
-class LibraryDependencyHandler {
-  final Compiler compiler;
+class LibraryDependencyHandler implements LibraryLoader {
+  final _LibraryLoaderTask task;
 
   /**
    * Newly loaded libraries and their corresponding node in the library
@@ -843,10 +848,15 @@
    * part of the dependency graph of this handler since their export scopes have
    * already been computed.
    */
-  Map<LibraryElement,LibraryDependencyNode> nodeMap =
-      new Map<LibraryElement,LibraryDependencyNode>();
+  Map<LibraryElement, LibraryDependencyNode> nodeMap =
+      new Map<LibraryElement, LibraryDependencyNode>();
 
-  LibraryDependencyHandler(Compiler this.compiler);
+  LibraryDependencyHandler(this.task);
+
+  Compiler get compiler => task.compiler;
+
+  /// The libraries loaded with this handler.
+  Iterable<LibraryElement> get loadedLibraries => nodeMap.keys;
 
   /**
    * Performs a fixed-point computation on the export scopes of all registered
@@ -932,6 +942,7 @@
    */
   void registerNewLibrary(LibraryElement library) {
     nodeMap[library] = new LibraryDependencyNode(library);
+    compiler.onLibraryCreated(library);
   }
 
   /**
@@ -941,4 +952,8 @@
   void registerLibraryExports(LibraryElement library) {
     nodeMap[library].registerInitialExports();
   }
+
+  Future processLibraryTags(LibraryElement library) {
+    return task.processLibraryTags(this, library);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
index 156a970..3b32fec 100644
--- a/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirror_renamer/renamer.dart
@@ -6,7 +6,8 @@
 
 class MirrorRenamer {
   static const String MIRROR_HELPER_GET_NAME_FUNCTION = 'helperGetName';
-  static const String MIRROR_HELPER_LIBRARY_NAME = '_mirror_helper';
+  static final Uri DART_MIRROR_HELPER =
+      new Uri(scheme: 'dart', path: '_mirror_helper');
   static const String MIRROR_HELPER_SYMBOLS_MAP_NAME = '_SYMBOLS';
 
   /// Maps mangled name to original name.
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
index 982aa11c..6210bae 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_instance_mirrors.dart
@@ -172,9 +172,9 @@
 
   List<String> get _list {
     if (_listCache == null) {
-      _listCache = new List<String>(_constant.keys.entries.length);
+      _listCache = new List<String>(_constant.length);
       int index = 0;
-      for (StringConstant keyConstant in _constant.keys.entries) {
+      for (StringConstant keyConstant in _constant.keys) {
         _listCache[index] = keyConstant.value.slowToString();
         index++;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
index a81c258..51cf6b3 100644
--- a/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
+++ b/sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart
@@ -468,13 +468,13 @@
 class BackDoor {
   /// Return the compilation units comprising [library].
   static List<Mirror> compilationUnitsOf(Dart2JsLibraryMirror library) {
-    return library._element.compilationUnits.toList().map(
-        (cu) => new Dart2JsCompilationUnitMirror(cu, library)).toList();
+    return library._element.compilationUnits.mapToList(
+        (cu) => new Dart2JsCompilationUnitMirror(cu, library));
   }
 
   static Iterable metadataSyntaxOf(Dart2JsElementMirror declaration) {
     Compiler compiler = declaration.mirrorSystem.compiler;
-    return declaration._element.metadata.toList().map((metadata) {
+    return declaration._element.metadata.map((metadata) {
       var node = metadata.parseNode(compiler);
       var treeElements = metadata.annotatedElement.treeElements;
       return new ResolvedNode(
diff --git a/sdk/lib/_internal/compiler/implementation/native_handler.dart b/sdk/lib/_internal/compiler/implementation/native_handler.dart
index f53d348..ae67556 100644
--- a/sdk/lib/_internal/compiler/implementation/native_handler.dart
+++ b/sdk/lib/_internal/compiler/implementation/native_handler.dart
@@ -90,6 +90,8 @@
   final Set<ClassElement> pendingClasses = new Set<ClassElement>();
   final Set<ClassElement> unusedClasses = new Set<ClassElement>();
 
+  final Set<LibraryElement> processedLibraries;
+
   bool hasInstantiatedNativeClasses() => !registeredClasses.isEmpty;
 
   final Set<ClassElement> nativeClassesAndSubclasses = new Set<ClassElement>();
@@ -121,9 +123,17 @@
   ClassElement _annotationJsNameClass;
 
   /// Subclasses of [NativeEnqueuerBase] are constructed by the backend.
-  NativeEnqueuerBase(this.world, this.compiler, this.enableLiveTypeAnalysis);
+  NativeEnqueuerBase(this.world, Compiler compiler, this.enableLiveTypeAnalysis)
+      : this.compiler = compiler,
+        processedLibraries = compiler.cacheStrategy.newSet();
 
   void processNativeClasses(Iterable<LibraryElement> libraries) {
+    if (compiler.hasIncrementalSupport) {
+      // Since [Set.add] returns bool if an element was added, this restricts
+      // [libraries] to ones that haven't already been processed. This saves
+      // time during incremental compiles.
+      libraries = libraries.where(processedLibraries.add);
+    }
     libraries.forEach(processNativeClassesInLibrary);
     if (compiler.isolateHelperLibrary != null) {
       processNativeClassesInLibrary(compiler.isolateHelperLibrary);
diff --git a/sdk/lib/_internal/compiler/implementation/patch_parser.dart b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
index acd97c4..1bc0888 100644
--- a/sdk/lib/_internal/compiler/implementation/patch_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/patch_parser.dart
@@ -61,9 +61,9 @@
  *     class _InjectedClass { // An injected class.
  *       void _injectedMethod() {} // An injected method.
  *     }
- *     patch class PatchedClass { // A patch class.
+ *     @patch class PatchedClass { // A patch class.
  *       int _injectedField; { // An injected field.
- *       patch void patchedMethod() {} // A patch method.
+ *       @patch void patchedMethod() {} // A patch method.
  *     }
  *
  *
@@ -118,6 +118,7 @@
 
 import "tree/tree.dart" as tree;
 import "dart2jslib.dart" as leg;  // CompilerTask, Compiler.
+import "helpers/helpers.dart";
 import "scanner/scannerlib.dart";  // Scanner, Parsers, Listeners
 import "elements/elements.dart";
 import "elements/modelx.dart"
@@ -125,6 +126,7 @@
          MetadataAnnotationX,
          ClassElementX,
          FunctionElementX;
+import "library_loader.dart" show LibraryLoader;
 import 'util/util.dart';
 
 class PatchParserTask extends leg.CompilerTask {
@@ -136,45 +138,34 @@
    * injections to the library, and returns a list of class
    * patches.
    */
-  Future patchLibrary(leg.LibraryDependencyHandler handler,
+  Future patchLibrary(LibraryLoader loader,
                       Uri patchUri, LibraryElement originLibrary) {
     return compiler.readScript(originLibrary, patchUri)
         .then((leg.Script script) {
       var patchLibrary = new LibraryElementX(script, null, originLibrary);
       return compiler.withCurrentElement(patchLibrary, () {
-        handler.registerNewLibrary(patchLibrary);
-        var imports = new LinkBuilder<tree.LibraryTag>();
+        loader.registerNewLibrary(patchLibrary);
         compiler.withCurrentElement(patchLibrary.entryCompilationUnit, () {
           // This patches the elements of the patch library into [library].
           // Injected elements are added directly under the compilation unit.
           // Patch elements are stored on the patched functions or classes.
-          scanLibraryElements(patchLibrary.entryCompilationUnit, imports);
+          scanLibraryElements(patchLibrary.entryCompilationUnit);
         });
-        // TODO(rnystrom): Remove .toList() here if #11523 is fixed.
-        return Future.forEach(imports.toLink().toList(), (tag) {
-          return compiler.withCurrentElement(patchLibrary, () {
-            return compiler.libraryLoader.registerLibraryFromTag(
-                handler, patchLibrary, tag);
-          });
-        });
+        return loader.processLibraryTags(patchLibrary);
       });
     });
   }
 
-  void scanLibraryElements(
-        CompilationUnitElement compilationUnit,
-        LinkBuilder<tree.LibraryTag> imports) {
+  void scanLibraryElements(CompilationUnitElement compilationUnit) {
     measure(() {
-      // TODO(lrn): Possibly recursively handle 'part' directives in patch.
+      // TODO(johnniwinther): Test that parts and exports are handled correctly.
       leg.Script script = compilationUnit.script;
       Token tokens = new Scanner(script.file).tokenize();
       Function idGenerator = compiler.getNextFreeClassId;
-      PatchListener patchListener =
-          new PatchElementListener(compiler,
-                                   compilationUnit,
-                                   idGenerator,
-                                   imports);
-      new PatchParser(patchListener).parseUnit(tokens);
+      Listener patchListener = new PatchElementListener(compiler,
+                                                        compilationUnit,
+                                                        idGenerator);
+      new PartialParser(patchListener).parseUnit(tokens);
     });
   }
 
@@ -184,7 +175,7 @@
     if (element.cachedNode != null) return;
 
     measure(() => compiler.withCurrentElement(element, () {
-      PatchMemberListener listener = new PatchMemberListener(compiler, element);
+      MemberListener listener = new MemberListener(compiler, element);
       Parser parser = new PatchClassElementParser(listener);
       Token token = parser.parseTopLevelDeclaration(element.beginToken);
       assert(identical(token, element.endToken.next));
@@ -199,7 +190,7 @@
   void applyContainerPatch(ClassElement originClass,
                            Link<Element> patches) {
     for (Element patch in patches) {
-      if (!isPatchElement(patch)) continue;
+      if (!isPatchElement(compiler, patch)) continue;
 
       Element origin = originClass.localLookup(patch.name);
       patchElement(compiler, origin, patch);
@@ -208,76 +199,11 @@
 }
 
 /**
- * Extension of the [Listener] interface to handle the extra "patch" pseudo-
- * keyword in patch files.
- * Patch files shouldn't have a type named "patch".
- */
-abstract class PatchListener extends Listener {
-  void beginPatch(Token patch);
-  void endPatch(Token patch);
-}
-
-/**
- * Partial parser that extends the top-level and class grammars to allow the
- * word "patch" in front of some declarations.
- */
-class PatchParser extends PartialParser {
-  PatchParser(PatchListener listener) : super(listener);
-
-  PatchListener get patchListener => listener;
-
-  bool isPatch(Token token) => token.value == 'patch';
-
-  /**
-   * Parse top-level declarations, and allow "patch" in front of functions
-   * and classes.
-   */
-  Token parseTopLevelDeclaration(Token token) {
-    if (!isPatch(token)) {
-      return super.parseTopLevelDeclaration(token);
-    }
-    Token patch = token;
-    token = token.next;
-    String value = token.stringValue;
-    if (identical(value, 'interface')
-        || identical(value, 'typedef')
-        || identical(value, '#')
-        || identical(value, 'abstract')) {
-      // At the top level, you can only patch functions and classes.
-      // Patch classes and functions can't be marked abstract.
-      return listener.unexpected(patch);
-    }
-    patchListener.beginPatch(patch);
-    token = super.parseTopLevelDeclaration(token);
-    patchListener.endPatch(patch);
-    return token;
-  }
-
-  /**
-   * Parse a class member.
-   * If the member starts with "patch", it's a member override.
-   * Only methods can be overridden, including constructors, getters and
-   * setters, but not fields. If "patch" occurs in front of a field, the error
-   * is caught elsewhere.
-   */
-  Token parseMember(Token token) {
-    if (!isPatch(token)) {
-      return super.parseMember(token);
-    }
-    Token patch = token;
-    patchListener.beginPatch(patch);
-    token = super.parseMember(token.next);
-    patchListener.endPatch(patch);
-    return token;
-  }
-}
-
-/**
  * Partial parser for patch files that also handles the members of class
  * declarations.
  */
-class PatchClassElementParser extends PatchParser {
-  PatchClassElementParser(PatchListener listener) : super(listener);
+class PatchClassElementParser extends PartialParser {
+  PatchClassElementParser(Listener listener) : super(listener);
 
   Token parseClassBody(Token token) => fullParseClassBody(token);
 }
@@ -285,120 +211,29 @@
 /**
  * Extension of [ElementListener] for parsing patch files.
  */
-class PatchElementListener extends ElementListener implements PatchListener {
-  final LinkBuilder<tree.LibraryTag> imports;
-  bool isMemberPatch = false;
-  bool isClassPatch = false;
+class PatchElementListener extends ElementListener implements Listener {
+  final leg.Compiler compiler;
 
-  PatchElementListener(leg.DiagnosticListener listener,
+  PatchElementListener(leg.Compiler compiler,
                        CompilationUnitElement patchElement,
-                       int idGenerator(),
-                       this.imports)
-    : super(listener, patchElement, idGenerator);
-
-  MetadataAnnotation popMetadataHack() {
-    // TODO(ahe): Remove this method.
-    popNode(); // Discard null.
-    return new PatchMetadataAnnotation();
-  }
-
-  void beginPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = true;
-    } else {
-      isMemberPatch = true;
-    }
-    handleIdentifier(token);
-  }
-
-  void endPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = false;
-    } else {
-      isMemberPatch = false;
-    }
-  }
-
-  /**
-    * Allow script tags (import only, the parser rejects the rest for now) in
-    * patch files. The import tags will be added to the library.
-    */
-  bool allowLibraryTags() => true;
-
-  void addLibraryTag(tree.LibraryTag tag) {
-    super.addLibraryTag(tag);
-    imports.addLast(tag);
-  }
+                       int idGenerator())
+    : this.compiler = compiler,
+      super(compiler, patchElement, idGenerator);
 
   void pushElement(Element patch) {
-    if (isMemberPatch || (isClassPatch && patch is ClassElement)) {
-      // Apply patch.
-      patch.addMetadata(popMetadataHack());
+    super.pushElement(patch);
+    if (isPatchElement(compiler, patch)) {
       LibraryElement originLibrary = compilationUnitElement.library;
       assert(originLibrary.isPatched);
       Element origin = originLibrary.localLookup(patch.name);
       patchElement(listener, origin, patch);
     }
-    super.pushElement(patch);
   }
 }
 
-/**
- * Extension of [MemberListener] for parsing patch class bodies.
- */
-class PatchMemberListener extends MemberListener implements PatchListener {
-  bool isMemberPatch = false;
-  bool isClassPatch = false;
-  PatchMemberListener(leg.DiagnosticListener listener,
-                      Element enclosingElement)
-    : super(listener, enclosingElement);
-
-  MetadataAnnotation popMetadataHack() {
-    // TODO(ahe): Remove this method.
-    popNode(); // Discard null.
-    return new PatchMetadataAnnotation();
-  }
-
-  void beginPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = true;
-    } else {
-      isMemberPatch = true;
-    }
-    handleIdentifier(token);
-  }
-
-  void endPatch(Token token) {
-    if (identical(token.next.stringValue, "class")) {
-      isClassPatch = false;
-    } else {
-      isMemberPatch = false;
-    }
-  }
-
-  void addMember(Element element) {
-    if (isMemberPatch || (isClassPatch && element is ClassElement)) {
-      element.addMetadata(popMetadataHack());
-    }
-    super.addMember(element);
-  }
-}
-
-// TODO(ahe): Get rid of this class.
-class PatchMetadataAnnotation extends MetadataAnnotationX {
-  final leg.Constant value = null;
-
-  PatchMetadataAnnotation() : super(STATE_DONE);
-
-  tree.Node parseNode(leg.DiagnosticListener listener) => null;
-
-  Token get beginToken => null;
-  Token get endToken => null;
-}
-
 void patchElement(leg.DiagnosticListener listener,
-                   Element origin,
-                   Element patch) {
+                  Element origin,
+                  Element patch) {
   if (origin == null) {
     listener.reportError(
         patch, leg.MessageKind.PATCH_NON_EXISTING, {'name': patch.name});
@@ -546,11 +381,25 @@
 }
 
 // TODO(johnniwinther): Add unittest when patch is (real) metadata.
-bool isPatchElement(Element element) {
+bool isPatchElement(leg.Compiler compiler, Element element) {
   // TODO(lrn): More checks needed if we introduce metadata for real.
   // In that case, it must have the identifier "native" as metadata.
-  for (Link link = element.metadata; !link.isEmpty; link = link.tail) {
-    if (link.head is PatchMetadataAnnotation) return true;
+  for (Link<MetadataAnnotation> link = element.metadata;
+       !link.isEmpty;
+       link = link.tail) {
+    MetadataAnnotation annotation = link.head;
+    if (annotation.beginToken != null &&
+        annotation.beginToken.next.value == 'patch') {
+      // TODO(johnniwinther): Perform this check in
+      // [Compiler.onLibrariesLoaded].
+      compiler.enqueuer.resolution.addDeferredAction(element, () {
+        annotation.ensureResolved(compiler);
+        if (annotation.value != compiler.patchConstant) {
+          compiler.internalError(annotation, 'Invalid patch annotation.');
+        }
+      });
+      return true;
+    }
   }
   return false;
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
index bb6efd9..b11aaee 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/class_members.dart
@@ -785,7 +785,8 @@
       if (interfaceMembersAreClassMembers) {
         ClassMemberMixin superclass = this.superclass;
         if ((superclass != null &&
-             !superclass.interfaceMembersAreClassMembers) ||
+             (!superclass.interfaceMembersAreClassMembers ||
+              superclass.isMixinApplication)) ||
              !interfaces.isEmpty) {
           interfaceMembersAreClassMembers = false;
         }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/members.dart b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
index b03c3ac..c19d89c 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/members.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/members.dart
@@ -298,15 +298,6 @@
     });
   }
 
-  String constructorNameForDiagnostics(String className,
-                                       String constructorName) {
-    String classNameString = className;
-    String constructorNameString = constructorName;
-    return (constructorName == '')
-        ? classNameString
-        : "$classNameString.$constructorNameString";
-   }
-
   void resolveRedirectingConstructor(InitializerResolver resolver,
                                      Node node,
                                      FunctionElement constructor,
@@ -451,15 +442,13 @@
     return compiler.withCurrentElement(element, () {
       bool isConstructor =
           identical(element.kind, ElementKind.GENERATIVE_CONSTRUCTOR);
-      TreeElements elements =
-          compiler.enqueuer.resolution.getCachedElements(element);
-      if (elements != null) {
+      if (compiler.enqueuer.resolution.hasBeenResolved(element)) {
         // TODO(karlklose): Remove the check for [isConstructor]. [elememts]
         // should never be non-null, not even for constructors.
         assert(invariant(element, element.isConstructor,
             message: 'Non-constructor element $element '
                      'has already been analyzed.'));
-        return elements;
+        return element.resolvedAst.elements;
       }
       if (element.isSynthesized) {
         if (isConstructor) {
@@ -917,7 +906,7 @@
 
     // Check that the mixed in class doesn't have any constructors and
     // make sure we aren't mixing in methods that use 'super'.
-    mixin.forEachLocalMember((Element member) {
+    mixin.forEachLocalMember((AstElement member) {
       if (member.isGenerativeConstructor && !member.isSynthesized) {
         compiler.reportError(member, MessageKind.ILLEGAL_MIXIN_CONSTRUCTOR);
       } else {
@@ -927,10 +916,12 @@
         // mixin application has been performed.
         // TODO(johnniwinther): Obtain the [TreeElements] for [member]
         // differently.
-        checkMixinSuperUses(
-            compiler.enqueuer.resolution.resolvedElements[member],
-            mixinApplication,
-            mixin);
+        if (compiler.enqueuer.resolution.hasBeenResolved(member)) {
+          checkMixinSuperUses(
+              member.resolvedAst.elements,
+              mixinApplication,
+              mixin);
+        }
       }
     });
   }
@@ -1425,8 +1416,7 @@
       Selector constructorSelector) {
     if (lookedupConstructor == null
         || !lookedupConstructor.isGenerativeConstructor) {
-      var fullConstructorName =
-          visitor.compiler.resolver.constructorNameForDiagnostics(
+      String fullConstructorName = Elements.constructorNameForDiagnostics(
               className,
               constructorSelector.name);
       MessageKind kind = isImplicitSuperCall
@@ -2318,7 +2308,7 @@
     } else {
       name = node.name.asIdentifier().source;
     }
-    FunctionElementX function = new LocalFunctionElementX(
+    LocalFunctionElementX function = new LocalFunctionElementX(
         name, node, ElementKind.FUNCTION, Modifiers.EMPTY,
         enclosingElement);
     function.functionSignatureCache =
@@ -2695,7 +2685,7 @@
         // class or typedef literal. We do not need to register this call as a
         // dynamic invocation, because we statically know what the target is.
       } else if (!selector.applies(target, compiler)) {
-        warnArgumentMismatch(node, target);
+        registry.registerThrowNoSuchMethod();
         if (node.isSuperCall) {
           // Similar to what we do when we can't find super via selector
           // in [resolveSend] above, we still need to register the invocation,
@@ -2729,14 +2719,6 @@
     return node.isPropertyAccess ? target : null;
   }
 
-  void warnArgumentMismatch(Send node, Element target) {
-    registry.registerThrowNoSuchMethod();
-    // TODO(karlklose): we can be more precise about the reason of the
-    // mismatch.
-    warning(node.argumentsNode, MessageKind.INVALID_ARGUMENTS,
-            {'methodName': target.name});
-  }
-
   /// Callback for native enqueuer to parse a type.  Returns [:null:] on error.
   DartType resolveTypeFromString(Node node, String typeName) {
     Element element = lookupInScope(compiler, node,
@@ -3077,7 +3059,6 @@
     registry.useElement(node.send, constructor);
     if (Elements.isUnresolved(constructor)) return constructor;
     if (!callSelector.applies(constructor, compiler)) {
-      warnArgumentMismatch(node.send, constructor);
       registry.registerThrowNoSuchMethod();
     }
 
@@ -3136,7 +3117,7 @@
 
   void checkConstMapKeysDontOverrideEquals(Spannable spannable,
                                            MapConstant map) {
-    for (Constant key in map.keys.entries) {
+    for (Constant key in map.keys) {
       if (!key.isObject) continue;
       ObjectConstant objectConstant = key;
       DartType keyType = objectConstant.type;
@@ -4064,7 +4045,8 @@
     } else if (mixinType.isTypeVariable) {
       compiler.reportError(mixinNode, MessageKind.CLASS_NAME_EXPECTED);
     } else if (mixinType.isMalformed) {
-      compiler.reportError(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED);
+      compiler.reportError(mixinNode, MessageKind.CANNOT_MIXIN_MALFORMED,
+          {'className': element.name, 'malformedType': mixinType});
     }
     return mixinType;
   }
@@ -4243,7 +4225,8 @@
     DartType supertype = resolveType(superclass);
     if (supertype != null) {
       if (identical(supertype.kind, TypeKind.MALFORMED_TYPE)) {
-        compiler.reportError(superclass, MessageKind.CANNOT_EXTEND_MALFORMED);
+        compiler.reportError(superclass, MessageKind.CANNOT_EXTEND_MALFORMED,
+            {'className': element.name, 'malformedType': supertype});
         return objectType;
       } else if (!identical(supertype.kind, TypeKind.INTERFACE)) {
         compiler.reportError(superclass.typeName,
@@ -4266,7 +4249,8 @@
       if (interfaceType != null) {
         if (identical(interfaceType.kind, TypeKind.MALFORMED_TYPE)) {
           compiler.reportError(superclass,
-              MessageKind.CANNOT_IMPLEMENT_MALFORMED);
+              MessageKind.CANNOT_IMPLEMENT_MALFORMED,
+              {'className': element.name, 'malformedType': interfaceType});
         } else if (!identical(interfaceType.kind, TypeKind.INTERFACE)) {
           // TODO(johnniwinther): Handle dynamic.
           TypeAnnotation typeAnnotation = link.head;
@@ -4561,8 +4545,7 @@
     Selector selector = createConstructorSelector(constructorName);
     Element result = cls.lookupConstructor(selector);
     if (result == null) {
-      String fullConstructorName =
-          resolver.compiler.resolver.constructorNameForDiagnostics(
+      String fullConstructorName = Elements.constructorNameForDiagnostics(
               cls.name,
               constructorName);
       return failOrReturnErroneousElement(
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
index 6c47af4..5d0afd3 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/registry.dart
@@ -17,6 +17,8 @@
 
   ResolutionRegistry.internal(this.compiler, this.mapping);
 
+  bool get isForResolution => true;
+
   Element get currentElement => mapping.currentElement;
 
   ResolutionEnqueuer get world => compiler.enqueuer.resolution;
@@ -196,7 +198,7 @@
   }
 
   void registerLazyField() {
-    backend.registerLazyField(this);
+    backend.onLazyField(this);
   }
 
   void registerMetadataConstant(Constant constant) {
@@ -204,23 +206,25 @@
   }
 
   void registerThrowRuntimeError() {
-    backend.registerThrowRuntimeError(this);
+    backend.onThrowRuntimeError(this);
   }
 
   void registerTypeVariableBoundCheck() {
-    backend.registerTypeVariableBoundCheck(this);
+    backend.onTypeVariableBoundCheck(this);
   }
 
   void registerThrowNoSuchMethod() {
-    backend.registerThrowNoSuchMethod(this);
+    backend.onThrowNoSuchMethod(this);
   }
 
   void registerIsCheck(DartType type) {
     world.registerIsCheck(type, this);
+    backend.onIsCheck(type, this);
   }
 
   void registerAsCheck(DartType type) {
-    world.registerAsCheck(type, this);
+    registerIsCheck(type);
+    backend.onAsCheck(type, this);
   }
 
   void registerClosure(Element element) {
@@ -236,7 +240,7 @@
   }
 
   void registerSuperNoSuchMethod() {
-    backend.registerSuperNoSuchMethod(this);
+    backend.onSuperNoSuchMethod(this);
   }
 
   void registerClassUsingVariableExpression(ClassElement element) {
@@ -244,12 +248,13 @@
   }
 
   void registerTypeVariableExpression() {
-    backend.registerTypeVariableExpression(this);
+    backend.onTypeVariableExpression(this);
   }
 
   void registerTypeLiteral(Send node, DartType type) {
     mapping.setType(node, type);
-    world.registerTypeLiteral(type, this);
+    backend.onTypeLiteral(type, this);
+    world.registerInstantiatedClass(compiler.typeClass, this);
   }
 
   // TODO(johnniwinther): Remove the [ResolverVisitor] dependency. Its only
@@ -271,11 +276,11 @@
   }
 
   void registerConstSymbol(String name) {
-    world.registerConstSymbol(name, this);
+    backend.registerConstSymbol(name, this);
   }
 
   void registerSymbolConstructor() {
-    backend.registerSymbolConstructor(this);
+    backend.onSymbolConstructor(this);
   }
 
   void registerInstantiatedType(InterfaceType type) {
@@ -287,11 +292,11 @@
   }
 
   void registerAbstractClassInstantiation() {
-    backend.registerAbstractClassInstantiation(this);
+    backend.onAbstractClassInstantiation(this);
   }
 
   void registerNewSymbol() {
-    world.registerNewSymbol(this);
+    backend.registerNewSymbol(this);
   }
 
   void registerRequiredType(DartType type, Element enclosingElement) {
@@ -299,23 +304,23 @@
   }
 
   void registerStringInterpolation() {
-    backend.registerStringInterpolation(this);
+    backend.onStringInterpolation(this);
   }
 
   void registerConstantMap() {
-    backend.registerConstantMap(this);
+    backend.onConstantMap(this);
   }
 
   void registerFallThroughError() {
-    backend.registerFallThroughError(this);
+    backend.onFallThroughError(this);
   }
 
   void registerCatchStatement() {
-    backend.registerCatchStatement(world, this);
+    backend.onCatchStatement(this);
   }
 
   void registerStackTraceInCatch() {
-    backend.registerStackTraceInCatch(this);
+    backend.onStackTraceInCatch(this);
   }
 
   ClassElement defaultSuperclass(ClassElement element) {
@@ -328,7 +333,7 @@
   }
 
   void registerThrowExpression() {
-    backend.registerThrowExpression(this);
+    backend.onThrowExpression(this);
   }
 
   void registerDependency(Element element) {
@@ -336,4 +341,15 @@
   }
 
   Setlet<Element> get otherDependencies => mapping.otherDependencies;
+
+  void registerStaticInvocation(Element element) {
+    if (element == null) return;
+    world.addToWorkList(element);
+    registerDependency(element);
+  }
+
+  void registerInstantiation(ClassElement element) {
+    if (element == null) return;
+    world.registerInstantiatedClass(element, this);
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
index 97326a3..2dd44a9 100644
--- a/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
+++ b/sdk/lib/_internal/compiler/implementation/resolution/signatures.dart
@@ -252,7 +252,15 @@
     int requiredParameterCount = 0;
     if (formalParameters == null) {
       if (!element.isGetter) {
-        compiler.reportError(element, MessageKind.MISSING_FORMALS);
+        if (element.isErroneous) {
+          // If the element is erroneous, an error should already have been
+          // reported. In the case of parse errors, it is possible that there
+          // are formal parameters, but something else in the method failed to
+          // parse. So we suppress the message about missing formals.
+          assert(invariant(element, compiler.compilationFailed));
+        } else {
+          compiler.reportError(element, MessageKind.MISSING_FORMALS);
+        }
       }
     } else {
       if (element.isGetter) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
index 4eeed62..3d35ffe 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/class_element_parser.dart
@@ -174,6 +174,7 @@
   }
 
   void endFields(int count, Token beginToken, Token endToken) {
+    bool hasParseError = memberErrors.head;
     super.endFields(count, beginToken, endToken);
     VariableDefinitions variableDefinitions = popNode();
     Modifiers modifiers = variableDefinitions.modifiers;
@@ -185,7 +186,8 @@
     }
     buildFieldElements(modifiers, variableDefinitions.definitions,
                        enclosingElement,
-                       buildFieldElement, beginToken, endToken);
+                       buildFieldElement, beginToken, endToken,
+                       hasParseError);
   }
 
   void endInitializer(Token assignmentOperator) {
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
index 5ee68c2..7a19ce7 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/listener.dart
@@ -11,6 +11,9 @@
  * on parser errors.
  */
 class Listener {
+  set suppressParseErrors(bool value) {
+  }
+
   void beginArguments(Token token) {
   }
 
@@ -768,6 +771,17 @@
 
   Link<MetadataAnnotation> metadata = const Link<MetadataAnnotation>();
 
+  /// Records a stack of booleans for each member parsed (a stack is used to
+  /// support nested members which isn't currently possible, but it also serves
+  /// as a simple way to tell we're currently parsing a member). In this case,
+  /// member refers to members of a library or a class (but currently, classes
+  /// themselves are not considered members).  If the top of the stack
+  /// (memberErrors.head) is true, the current member has already reported at
+  /// least one parse error.
+  Link<bool> memberErrors = const Link<bool>();
+
+  bool suppressParseErrors = false;
+
   ElementListener(DiagnosticListener listener,
                   this.compilationUnitElement,
                   this.idGenerator)
@@ -775,6 +789,10 @@
         stringValidator = new StringValidator(listener),
         interpolationScope = const Link<StringQuoting>();
 
+  bool get currentMemberHasParseError {
+    return !memberErrors.isEmpty && memberErrors.head;
+  }
+
   void pushQuoting(StringQuoting quoting) {
     interpolationScope = interpolationScope.prepend(quoting);
   }
@@ -799,9 +817,9 @@
   bool allowLibraryTags() {
     // Library tags are only allowed in the library file itself, not
     // in sourced files.
-    LibraryElement library = compilationUnitElement.library;
-    return !compilationUnitElement.hasMembers
-      && library.entryCompilationUnit == compilationUnitElement;
+    LibraryElement library = compilationUnitElement.implementationLibrary;
+    return !compilationUnitElement.hasMembers &&
+           library.entryCompilationUnit == compilationUnitElement;
   }
 
   void endLibraryName(Token libraryKeyword, Token semicolon) {
@@ -954,6 +972,8 @@
   }
 
   void endTopLevelMethod(Token beginToken, Token getOrSet, Token endToken) {
+    bool hasParseError = currentMemberHasParseError;
+    memberErrors = memberErrors.tail;
     Identifier name = popNode();
     TypeAnnotation type = popNode();
     Modifiers modifiers = popNode();
@@ -965,12 +985,16 @@
     } else if (identical(getOrSet.stringValue, 'set')) {
       kind = ElementKind.SETTER;
     }
-    pushElement(new PartialFunctionElement(name.source, beginToken, getOrSet,
-                                           endToken, kind, modifiers,
-                                           compilationUnitElement, false));
+    PartialFunctionElement element = new PartialFunctionElement(
+        name.source, beginToken, getOrSet, endToken, kind, modifiers,
+        compilationUnitElement, false);
+    element.hasParseError = hasParseError;
+    pushElement(element);
   }
 
   void endTopLevelFields(int count, Token beginToken, Token endToken) {
+    bool hasParseError = currentMemberHasParseError;
+    memberErrors = memberErrors.tail;
     void buildFieldElement(Identifier name, VariableList fields) {
       pushElement(
           new FieldElementX(name, compilationUnitElement, fields));
@@ -980,7 +1004,7 @@
     Modifiers modifiers = popNode();
     buildFieldElements(modifiers, variables, compilationUnitElement,
                        buildFieldElement,
-                       beginToken, endToken);
+                       beginToken, endToken, hasParseError);
   }
 
   void buildFieldElements(Modifiers modifiers,
@@ -988,9 +1012,10 @@
                           Element enclosingElement,
                           void buildFieldElement(Identifier name,
                                                  VariableList fields),
-                          Token beginToken, Token endToken) {
+                          Token beginToken, Token endToken,
+                          bool hasParseError) {
     VariableList fields =
-        new PartialFieldList(beginToken, endToken, modifiers);
+        new PartialFieldList(beginToken, endToken, modifiers, hasParseError);
     for (Link<Node> variableNodes = variables.nodes;
          !variableNodes.isEmpty;
          variableNodes = variableNodes.tail) {
@@ -1067,13 +1092,43 @@
   Token expected(String string, Token token) {
     if (token is ErrorToken) {
       reportErrorToken(token);
+    } else if (identical(';', string)) {
+      // When a semicolon is missing, it often leads to an error on the
+      // following line. So we try to find the token preceding the semicolon
+      // and report that something is missing *after* it.
+      Token preceding = findPrecedingToken(token);
+      if (preceding == token) {
+        reportError(
+            token, MessageKind.MISSING_TOKEN_BEFORE_THIS, {'token': string});
+      } else {
+        reportError(
+            preceding, MessageKind.MISSING_TOKEN_AFTER_THIS, {'token': string});
+      }
+      return token;
     } else {
       reportFatalError(
-          token, "Expected '$string', but got '${token.value}'.");
+          token,
+          MessageKind.MISSING_TOKEN_BEFORE_THIS.message(
+              {'token': string}, true).toString());
     }
     return skipToEof(token);
   }
 
+  /// Finds the preceding token via the begin token of the last AST node pushed
+  /// on the [nodes] stack.
+  Token findPrecedingToken(Token token) {
+    if (!nodes.isEmpty && nodes.head != null) {
+      Token current = nodes.head.getBeginToken();
+      while (current.kind != EOF_TOKEN && current.next != token) {
+        current = current.next;
+      }
+      if (current.kind != EOF_TOKEN) {
+        return current;
+      }
+    }
+    return token;
+  }
+
   Token expectedIdentifier(Token token) {
     if (token is KeywordToken) {
       reportError(
@@ -1313,6 +1368,30 @@
     pushNode(accumulator);
   }
 
+  void beginMember(Token token) {
+    memberErrors = memberErrors.prepend(false);
+  }
+
+  void beginTopLevelMember(Token token) {
+    beginMember(token);
+  }
+
+  void endFields(fieldCount, start, token) {
+    memberErrors = memberErrors.tail;
+  }
+
+  void endMethod(getOrSet, start, token) {
+    memberErrors = memberErrors.tail;
+  }
+
+  void beginFactoryMethod(Token token) {
+    memberErrors = memberErrors.prepend(false);
+  }
+
+  void endFactoryMethod(Token beginToken, Token endToken) {
+    memberErrors = memberErrors.tail;
+  }
+
   void reportFatalError(Spannable spannable,
                         String message) {
     listener.reportFatalError(
@@ -1322,14 +1401,36 @@
   void reportError(Spannable spannable,
                    MessageKind errorCode,
                    [Map arguments = const {}]) {
+    if (currentMemberHasParseError) return; // Error already reported.
+    if (suppressParseErrors) return;
+    if (!memberErrors.isEmpty) {
+      memberErrors = memberErrors.tail.prepend(true);
+    }
     listener.reportError(spannable, errorCode, arguments);
   }
 }
 
 class NodeListener extends ElementListener {
-  NodeListener(DiagnosticListener listener, CompilationUnitElement element)
+  final bool throwOnFatalError;
+
+  NodeListener(
+      DiagnosticListener listener,
+      CompilationUnitElement element,
+      {bool this.throwOnFatalError: false})
     : super(listener, element, null);
 
+  void reportFatalError(Spannable spannable,
+                        String message) {
+    if (throwOnFatalError) {
+      if (!currentMemberHasParseError && !suppressParseErrors) {
+        reportError(spannable, MessageKind.GENERIC, {'text': message});
+      }
+      throw new ParserError(message);
+    } else {
+      super.reportFatalError(spannable, message);
+    }
+  }
+
   void addLibraryTag(LibraryTag tag) {
     pushNode(tag);
   }
@@ -1497,12 +1598,13 @@
     if (identical(token.stringValue, 'native')) {
       return native.handleNativeFunctionBody(this, token);
     } else if (token is ErrorToken) {
+      pushNode(null);
       reportErrorToken(token);
     } else {
       reportFatalError(token,
                        "Expected a function body, but got '${token.value}'.");
-      return skipToEof(token);
     }
+    return skipToEof(token);
   }
 
   Token expectedClassBody(Token token) {
@@ -1667,7 +1769,8 @@
 
   void endInitializer(Token assignmentOperator) {
     Expression initializer = popNode();
-    NodeList arguments = new NodeList.singleton(initializer);
+    NodeList arguments =
+        initializer == null ? null : new NodeList.singleton(initializer);
     Expression name = popNode();
     Operator op = new Operator(assignmentOperator);
     pushNode(new SendSet(null, name, op, arguments));
@@ -1938,6 +2041,7 @@
   }
 
   void endFactoryMethod(Token beginToken, Token endToken) {
+    super.endFactoryMethod(beginToken, endToken);
     Statement body = popNode();
     NodeList formals = popNode();
     Node name = popNode();
@@ -2072,6 +2176,12 @@
   }
 }
 
+abstract class PartialElement implements Element {
+  bool hasParseError = false;
+
+  bool get isErroneous => hasParseError;
+}
+
 abstract class PartialFunctionMixin implements FunctionElement {
   FunctionExpression cachedNode;
   Modifiers get modifiers;
@@ -2111,7 +2221,7 @@
         p.parseFunction(beginToken, getOrSet);
       }
     }
-    cachedNode = parse(listener, compilationUnit, parseFunction);
+    cachedNode = parse(listener, this, parseFunction);
     return cachedNode;
   }
 
@@ -2119,7 +2229,7 @@
 }
 
 class PartialFunctionElement extends FunctionElementX
-    with PartialFunctionMixin {
+    with PartialElement, PartialFunctionMixin {
   PartialFunctionElement(String name,
                          Token beginToken,
                          Token getOrSet,
@@ -2134,7 +2244,7 @@
 }
 
 class PartialConstructorElement extends ConstructorElementX
-    with PartialFunctionMixin {
+    with PartialElement, PartialFunctionMixin {
   PartialConstructorElement(String name,
                             Token beginToken,
                             Token endToken,
@@ -2149,23 +2259,32 @@
 class PartialFieldList extends VariableList {
   final Token beginToken;
   final Token endToken;
+  final bool hasParseError;
 
-  PartialFieldList(Token this.beginToken,
-                   Token this.endToken,
-                   Modifiers modifiers)
+  PartialFieldList(this.beginToken,
+                   this.endToken,
+                   Modifiers modifiers,
+                   this.hasParseError)
       : super(modifiers);
 
   VariableDefinitions parseNode(Element element, DiagnosticListener listener) {
     if (definitions != null) return definitions;
     listener.withCurrentElement(element, () {
-      definitions = parse(listener,
-                          element.compilationUnit,
-                          (p) => p.parseVariablesDeclaration(beginToken));
+      definitions = parse(
+          listener, element,
+          (Parser parser) {
+            if (hasParseError) {
+              parser.listener.suppressParseErrors = true;
+            }
+            return parser.parseMember(beginToken);
+          });
 
-      if (!definitions.modifiers.isVar &&
+      if (!hasParseError &&
+          !definitions.modifiers.isVar &&
           !definitions.modifiers.isFinal &&
           !definitions.modifiers.isConst &&
-          definitions.type == null) {
+          definitions.type == null &&
+          !definitions.isErroneous) {
         listener.reportError(
             definitions,
             MessageKind.GENERIC,
@@ -2201,7 +2320,7 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     cachedNode = parse(listener,
-                       compilationUnit,
+                       this,
                        (p) => p.parseTopLevelDeclaration(token));
     return cachedNode;
   }
@@ -2230,7 +2349,7 @@
   Node parseNode(DiagnosticListener listener) {
     if (cachedNode != null) return cachedNode;
     Metadata metadata = parse(listener,
-                              annotatedElement.compilationUnit,
+                              annotatedElement,
                               (p) => p.parseMetadata(beginToken));
     cachedNode = metadata.expression;
     return cachedNode;
@@ -2238,10 +2357,20 @@
 }
 
 Node parse(DiagnosticListener diagnosticListener,
-           CompilationUnitElement element,
+           Element element,
            doParse(Parser parser)) {
-  NodeListener listener = new NodeListener(diagnosticListener, element);
-  doParse(new Parser(listener));
+  CompilationUnitElement unit = element.compilationUnit;
+  NodeListener listener =
+      new NodeListener(diagnosticListener, unit, throwOnFatalError: true);
+  listener.memberErrors = listener.memberErrors.prepend(false);
+  try {
+    doParse(new Parser(listener));
+  } on ParserError catch (e) {
+    if (element is PartialElement) {
+      element.hasParseError = true;
+    }
+    return new ErrorNode(element.position, e.reason);
+  }
   Node node = listener.popNode();
   assert(listener.nodes.isEmpty);
   return node;
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
index 34d0d65..e6163a9 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/parser.dart
@@ -825,13 +825,14 @@
       token = parseVariableInitializerOpt(token);
       ++fieldCount;
     }
-    expectSemicolon(token);
+    Token semicolon = token;
+    token = expectSemicolon(token);
     if (isTopLevel) {
-      listener.endTopLevelFields(fieldCount, start, token);
+      listener.endTopLevelFields(fieldCount, start, semicolon);
     } else {
-      listener.endFields(fieldCount, start, token);
+      listener.endFields(fieldCount, start, semicolon);
     }
-    return token.next;
+    return token;
   }
 
   Token parseTopLevelMethod(Token start,
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
index 845fc79..98fc1ab 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/partial_parser.dart
@@ -32,6 +32,8 @@
       if ((identical(kind, EOF_TOKEN)) ||
           (identical(value, ';')) ||
           (identical(value, ',')) ||
+          (identical(value, '}')) ||
+          (identical(value, ')')) ||
           (identical(value, ']'))) {
         break;
       }
diff --git a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
index f74e339..34cac3a 100644
--- a/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
+++ b/sdk/lib/_internal/compiler/implementation/scanner/scanner.dart
@@ -436,8 +436,8 @@
     next = advance();
     if (identical(next, $CLOSE_SQUARE_BRACKET)) {
       Token token = previousToken();
-      if (token is KeywordToken &&
-          identical(token.keyword.syntax, 'operator')) {
+      if (token is KeywordToken && token.keyword.syntax == 'operator' ||
+          token is SymbolToken && token.info == HASH_INFO) {
         return select($EQ, INDEX_EQ_INFO, INDEX_INFO);
       }
     }
diff --git a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
index 76e7ad3..6441ed0 100644
--- a/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
+++ b/sdk/lib/_internal/compiler/implementation/source_file_provider.dart
@@ -69,7 +69,9 @@
   bool isAborting = false;
   bool enableColors = false;
   bool throwOnError = false;
+  int throwOnErrorCount = 0;
   api.Diagnostic lastKind = null;
+  int fatalCount = 0;
 
   final int FATAL = api.Diagnostic.CRASH.ordinal | api.Diagnostic.ERROR.ordinal;
   final int INFO =
@@ -161,7 +163,7 @@
         throw '$uri: file is null';
       }
     }
-    if (fatal && throwOnError) {
+    if (fatal && ++fatalCount >= throwOnErrorCount && throwOnError) {
       isAborting = true;
       throw new AbortLeg(message);
     }
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
index 6f004fe..08bd51a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/builder.dart
@@ -68,7 +68,7 @@
             registry.registerCompileTimeConstant(constant);
           });
         }
-        if (compiler.tracer.enabled) {
+        if (compiler.tracer.isEnabled) {
           String name;
           if (element.isMember) {
             String className = element.enclosingClass.name;
@@ -1576,10 +1576,12 @@
     }
     assert(argumentIndex == compiledArguments.length);
 
-    elements = compiler.enqueuer.resolution.getCachedElements(function);
+    elements = function.resolvedAst.elements;
     assert(elements != null);
     returnType = signature.type.returnType;
     stack = <HInstruction>[];
+
+    insertTraceCall(function);
   }
 
   void restoreState(AstInliningState state) {
@@ -1712,9 +1714,10 @@
 
       // Build the initializers in the context of the new constructor.
       TreeElements oldElements = elements;
-      elements = compiler.enqueuer.resolution.getCachedElements(callee);
+      ResolvedAst resolvedAst = callee.resolvedAst;
+      elements = resolvedAst.elements;
       ClosureClassMap oldClosureData = localsHandler.closureData;
-      ast.Node node = callee.node;
+      ast.Node node = resolvedAst.node;
       ClosureClassMap newClosureData =
           compiler.closureToClassMapper.computeClosureToClassMapping(
               callee, node, elements);
@@ -2055,9 +2058,9 @@
         bodyCallInputs.add(interceptor);
       }
       bodyCallInputs.add(newObject);
-      TreeElements elements =
-          compiler.enqueuer.resolution.getCachedElements(constructor);
-      ast.Node node = constructor.node;
+      ResolvedAst resolvedAst = constructor.resolvedAst;
+      TreeElements elements = resolvedAst.elements;
+      ast.Node node = resolvedAst.node;
       ClosureClassMap parameterClosureData =
           compiler.closureToClassMapper.getMappingForNestedFunction(node);
 
@@ -2168,6 +2171,21 @@
       // Otherwise it is a lazy initializer which does not have parameters.
       assert(element is VariableElement);
     }
+
+    insertTraceCall(element);
+  }
+
+  insertTraceCall(Element element) {
+    if (JavaScriptBackend.TRACE_CALLS) {
+      if (element == backend.traceHelper) return;
+      n(e) => e == null ? '' : e.name;
+      String name = "${n(element.library)}:${n(element.enclosingClass)}."
+        "${n(element)}";
+      HConstant nameConstant = addConstantString(name);
+      add(new HInvokeStatic(backend.traceHelper,
+                            <HInstruction>[nameConstant],
+                            backend.dynamicType));
+    }
   }
 
   /// Check that [type] is valid in the context of `localsHandler.contextClass`.
@@ -2380,34 +2398,36 @@
 
   /**
    * Ends the loop:
-   * - creates a new block and adds it as successor to the [branchBlock] and
+   * - creates a new block and adds it as successor to the [branchExitBlock] and
    *   any blocks that end in break.
    * - opens the new block (setting as [current]).
    * - notifies the locals handler that we're exiting a loop.
    * [savedLocals] are the locals from the end of the loop condition.
-   * [branchBlock] is the exit (branching) block of the condition.  For the
-   * while and for loops this is at the top of the loop.  For do-while it is
-   * the end of the body.  It is null for degenerate do-while loops that have
+   * [branchExitBlock] is the exit (branching) block of the condition. Generally
+   * this is not the top of the loop, since this would lead to critical edges.
+   * It is null for degenerate do-while loops that have
    * no back edge because they abort (throw/return/break in the body and have
    * no continues).
    */
   void endLoop(HBasicBlock loopEntry,
-               HBasicBlock branchBlock,
+               HBasicBlock branchExitBlock,
                JumpHandler jumpHandler,
                LocalsHandler savedLocals) {
     HBasicBlock loopExitBlock = addNewBlock();
+
     List<LocalsHandler> breakHandlers = <LocalsHandler>[];
     // Collect data for the successors and the phis at each break.
     jumpHandler.forEachBreak((HBreak breakInstruction, LocalsHandler locals) {
       breakInstruction.block.addSuccessor(loopExitBlock);
       breakHandlers.add(locals);
     });
+
     // The exit block is a successor of the loop condition if it is reached.
     // We don't add the successor in the case of a while/for loop that aborts
     // because the caller of endLoop will be wiring up a special empty else
     // block instead.
-    if (branchBlock != null) {
-      branchBlock.addSuccessor(loopExitBlock);
+    if (branchExitBlock != null) {
+      branchExitBlock.addSuccessor(loopExitBlock);
     }
     // Update the phis at the loop entry with the current values of locals.
     localsHandler.endLoop(loopEntry);
@@ -2417,7 +2437,7 @@
 
     // Create a new localsHandler for the loopExitBlock with the correct phis.
     if (!breakHandlers.isEmpty) {
-      if (branchBlock != null) {
+      if (branchExitBlock != null) {
         // Add the values of the locals at the end of the condition block to
         // the phis.  These are the values that flow to the exit if the
         // condition fails.
@@ -2477,10 +2497,10 @@
     if (startBlock == null) startBlock = conditionBlock;
 
     HInstruction conditionInstruction = condition();
-    HBasicBlock conditionExitBlock =
+    HBasicBlock conditionEndBlock =
         close(new HLoopBranch(conditionInstruction));
     SubExpression conditionExpression =
-        new SubExpression(conditionBlock, conditionExitBlock);
+        new SubExpression(conditionBlock, conditionEndBlock);
 
     // Save the values of the local variables at the end of the condition
     // block.  These are the values that will flow to the loop exit if the
@@ -2489,7 +2509,7 @@
 
     // The body.
     HBasicBlock beginBodyBlock = addNewBlock();
-    conditionExitBlock.addSuccessor(beginBodyBlock);
+    conditionEndBlock.addSuccessor(beginBodyBlock);
     open(beginBodyBlock);
 
     localsHandler.enterLoopBody(loop);
@@ -2554,6 +2574,12 @@
       updateEndBlock.addSuccessor(conditionBlock);
       updateGraph = new SubExpression(updateBlock, updateEndBlock);
 
+      // Avoid a critical edge from the condition to the loop-exit body.
+      HBasicBlock conditionExitBlock = addNewBlock();
+      open(conditionExitBlock);
+      close(new HGoto());
+      conditionEndBlock.addSuccessor(conditionExitBlock);
+
       endLoop(conditionBlock, conditionExitBlock, jumpHandler, savedLocals);
 
       conditionBlock.postProcessLoopHeader();
@@ -2595,19 +2621,19 @@
 
       // Remove the [HLoopBranch] instruction and replace it with
       // [HIf].
-      HInstruction condition = conditionExitBlock.last.inputs[0];
-      conditionExitBlock.addAtExit(new HIf(condition));
-      conditionExitBlock.addSuccessor(elseBlock);
-      conditionExitBlock.remove(conditionExitBlock.last);
+      HInstruction condition = conditionEndBlock.last.inputs[0];
+      conditionEndBlock.addAtExit(new HIf(condition));
+      conditionEndBlock.addSuccessor(elseBlock);
+      conditionEndBlock.remove(conditionEndBlock.last);
       HIfBlockInformation info =
           new HIfBlockInformation(
               wrapExpressionGraph(conditionExpression),
               wrapStatementGraph(bodyGraph),
               wrapStatementGraph(elseGraph));
 
-      conditionExitBlock.setBlockFlow(info, current);
-      HIf ifBlock = conditionExitBlock.last;
-      ifBlock.blockInformation = conditionExitBlock.blockFlow;
+      conditionEndBlock.setBlockFlow(info, current);
+      HIf ifBlock = conditionEndBlock.last;
+      ifBlock.blockInformation = conditionEndBlock.blockFlow;
 
       // If the body has any break, attach a synthesized label to the
       // if block.
@@ -2767,7 +2793,13 @@
       conditionExpression =
           new SubExpression(conditionBlock, conditionEndBlock);
 
-      endLoop(loopEntryBlock, conditionEndBlock, jumpHandler, localsHandler);
+      // Avoid a critical edge from the condition to the loop-exit body.
+      HBasicBlock conditionExitBlock = addNewBlock();
+      open(conditionExitBlock);
+      close(new HGoto());
+      conditionEndBlock.addSuccessor(conditionExitBlock);
+
+      endLoop(loopEntryBlock, conditionExitBlock, jumpHandler, localsHandler);
 
       loopEntryBlock.postProcessLoopHeader();
       SubGraph bodyGraph = new SubGraph(loopEntryBlock, bodyExitBlock);
@@ -5845,7 +5877,7 @@
     // directly.
     Selector selector =
         new TypedSelector(expression.instructionType,
-            new Selector.call('toString', null, 0));
+            new Selector.call('toString', null, 0), compiler);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(selector, compiler);
     if (type.containsOnlyString(compiler)) {
       builder.pushInvokeDynamic(node, selector, <HInstruction>[expression]);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
index 30a0d9a9..e4848fa 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/codegen.dart
@@ -772,7 +772,18 @@
             initialization = null;
           }
         }
+
+        // We inserted a basic block to avoid critical edges. This block is
+        // part of the LoopBlockInformation and must therefore be handled here.
+        js.Block oldContainer = currentContainer;
+        js.Block avoidContainer = new js.Block.empty();
+        currentContainer = avoidContainer;
+        assignPhisOfSuccessors(condition.end.successors.last);
+        bool hasPhiUpdates = !avoidContainer.statements.isEmpty;
+        currentContainer = oldContainer;
+
         if (isConditionExpression &&
+            !hasPhiUpdates &&
             info.updates != null && isJSExpression(info.updates)) {
           // If we have an updates graph, and it's expressible as an
           // expression, generate a for-loop.
@@ -828,7 +839,7 @@
           // subgraph.
           // TODO(lrn): Remove this extra labeling when handling all loops
           // using subgraphs.
-          js.Block oldContainer = currentContainer;
+          oldContainer = currentContainer;
           js.Statement body = new js.Block.empty();
           currentContainer = body;
           visitBodyIgnoreLabels(info);
@@ -844,7 +855,7 @@
           js.Expression jsCondition;
           js.Block oldContainer = currentContainer;
           js.Statement body = new js.Block.empty();
-          if (isConditionExpression) {
+          if (isConditionExpression && !hasPhiUpdates) {
             jsCondition = generateExpression(condition);
             currentContainer = body;
           } else {
@@ -853,8 +864,15 @@
             generateStatements(condition);
             use(condition.conditionExpression);
             js.Expression ifTest = new js.Prefix("!", pop());
-            js.Break jsBreak = new js.Break(null);
-            pushStatement(new js.If.noElse(ifTest, jsBreak));
+            js.Statement jsBreak = new js.Break(null);
+            js.Statement exitLoop;
+            if (avoidContainer.statements.isEmpty) {
+              exitLoop = jsBreak;
+            } else {
+              avoidContainer.statements.add(jsBreak);
+              exitLoop = avoidContainer;
+            }
+            pushStatement(new js.If.noElse(ifTest, exitLoop));
           }
           if (info.updates != null) {
             wrapLoopBodyForContinue(info);
@@ -871,7 +889,17 @@
         if (info.initializer != null) {
           generateStatements(info.initializer);
         }
+        // We inserted a basic block to avoid critical edges. This block is
+        // part of the LoopBlockInformation and must therefore be handled here.
         js.Block oldContainer = currentContainer;
+        js.Block exitAvoidContainer = new js.Block.empty();
+        currentContainer = exitAvoidContainer;
+        assignPhisOfSuccessors(condition.end.successors.last);
+        bool hasExitPhiUpdates = !exitAvoidContainer.statements.isEmpty;
+        currentContainer = oldContainer;
+
+
+        oldContainer = currentContainer;
         js.Block body = new js.Block.empty();
         // If there are phi copies in the block that jumps to the
         // loop entry, we must emit the condition like this:
@@ -907,10 +935,18 @@
           // at the end of the loop anyway.
           loop = new js.While(newLiteralBool(true), unwrapStatement(body));
         } else {
-          if (hasPhiUpdates) {
+          if (hasPhiUpdates || hasExitPhiUpdates) {
             updateBody.statements.add(new js.Continue(null));
+            js.Statement jsBreak = new js.Break(null);
+            js.Statement exitLoop;
+            if (exitAvoidContainer.statements.isEmpty) {
+              exitLoop = jsBreak;
+            } else {
+              exitAvoidContainer.statements.add(jsBreak);
+              exitLoop = exitAvoidContainer;
+            }
             body.statements.add(
-                new js.If(jsCondition, updateBody, new js.Break(null)));
+                new js.If(jsCondition, updateBody, exitLoop));
             jsCondition = newLiteralBool(true);
           }
           loop = new js.Do(unwrapStatement(body), jsCondition);
@@ -1542,7 +1578,7 @@
       // invoke dynamic knows more than the receiver.
       ClassElement enclosing = node.element.enclosingClass;
       TypeMask receiverType = new TypeMask.nonNullExact(enclosing.declaration);
-      return new TypedSelector(receiverType, selector);
+      return new TypedSelector(receiverType, selector, compiler);
     }
     // If [JSInvocationMirror._invokeOn] is enabled, and this call
     // might hit a `noSuchMethod`, we register an untyped selector.
@@ -1640,7 +1676,7 @@
         // [world]. The emitter needs to know if it needs to emit a
         // bound closure for a method.
         TypeMask receiverType = new TypeMask.nonNullExact(superClass);
-        selector = new TypedSelector(receiverType, selector);
+        selector = new TypedSelector(receiverType, selector, compiler);
         // TODO(floitsch): we know the target. We shouldn't register a
         // dynamic getter.
         registry.registerDynamicGetter(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
index 9fb3e19..45e542f 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/invoke_dynamic_specializers.dart
@@ -107,7 +107,8 @@
     }
     TypeMask receiverType =
         instruction.getDartReceiver(compiler).instructionType;
-    Selector refined = new TypedSelector(receiverType, instruction.selector);
+    Selector refined = new TypedSelector(receiverType, instruction.selector,
+        compiler);
     TypeMask type = TypeMaskFactory.inferredTypeForSelector(refined, compiler);
     return new HIndex(
         instruction.inputs[1], instruction.inputs[2],
@@ -227,12 +228,12 @@
                                      Selector selector,
                                      Compiler compiler) {
     if (selector.name == name) return selector;
-    return new TypedSelector(
-        selector.mask,
-        new Selector(SelectorKind.CALL,
-                     name,
-                     compiler.interceptorsLibrary,
-                     selector.argumentCount));
+    Selector newSelector = new Selector(
+        SelectorKind.CALL, name, compiler.interceptorsLibrary,
+        selector.argumentCount);
+    return selector.mask == null
+        ? newSelector
+        : new TypedSelector(selector.mask, newSelector, compiler);
   }
 }
 
@@ -635,7 +636,7 @@
       return newBuiltinVariant(instruction, compiler);
     }
     Selector selector =
-        new TypedSelector(instructionType, instruction.selector);
+        new TypedSelector(instructionType, instruction.selector, compiler);
     World world = compiler.world;
     JavaScriptBackend backend = compiler.backend;
     Iterable<Element> matches = world.allFunctions.filter(selector);
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
index e92034c..2201a4a 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/optimize.dart
@@ -329,7 +329,8 @@
     }
 
     TypeMask receiverType = node.getDartReceiver(compiler).instructionType;
-    Selector selector = new TypedSelector(receiverType, node.selector);
+    Selector selector = new TypedSelector(receiverType, node.selector,
+        compiler);
     Element element = compiler.world.locateSingleElement(selector);
     // TODO(ngeoffray): Also fold if it's a getter or variable.
     if (element != null
@@ -677,7 +678,7 @@
                                                     Selector selector) {
     TypeMask receiverType = receiver.instructionType;
     return compiler.world.locateSingleField(
-        new TypedSelector(receiverType, selector));
+        new TypedSelector(receiverType, selector, compiler));
   }
 
   HInstruction visitFieldGet(HFieldGet node) {
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
index 01a82b7..618f223 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/types_propagation.dart
@@ -321,7 +321,8 @@
 
     HInstruction receiver = instruction.getDartReceiver(compiler);
     TypeMask receiverType = receiver.instructionType;
-    Selector selector = new TypedSelector(receiverType, instruction.selector);
+    Selector selector = new TypedSelector(receiverType, instruction.selector,
+        compiler);
     instruction.selector = selector;
 
     // Try to specialize the receiver after this call.
diff --git a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
index e751b4d..2858204 100644
--- a/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
+++ b/sdk/lib/_internal/compiler/implementation/ssa/validate.dart
@@ -36,7 +36,16 @@
       markInvalid("If node without two successors");
     }
     if (block.last is HConditionalBranch && block.successors.length != 2) {
-      markInvalid("Conditional node without two successors");
+        markInvalid("Conditional node without two successors");
+      }
+    if (block.last is HLoopBranch) {
+      // Assert that the block we inserted to avoid critical edges satisfies
+      // our assumptions. That is, it must not contain any instructions
+      // (although it may contain phi-updates).
+      HBasicBlock avoidCriticalEdgeBlock = block.successors.last;
+      if (avoidCriticalEdgeBlock.first is! HGoto) {
+        markInvalid("Critical edge block contains instructions");
+      }
     }
     if (block.last is HGoto && block.successors.length != 1) {
       markInvalid("Goto node with not exactly one successor");
@@ -67,6 +76,17 @@
         markInvalid("successor with lower id, but not a loop-header");
       }
     }
+    // Make sure we don't have a critical edge.
+    if (isValid && block.successors.length > 1 &&
+        block.last is! HTry && block.last is! HExitTry &&
+        block.last is! HSwitch) {
+      for (HBasicBlock successor in block.successors) {
+        if (!isValid) break;
+        if (successor.predecessors.length >= 2) {
+          markInvalid("SSA graph contains critical edge.");
+        }
+      }
+    }
 
     // Check that the entries in the dominated-list are sorted.
     int lastId = 0;
diff --git a/sdk/lib/_internal/compiler/implementation/string_validator.dart b/sdk/lib/_internal/compiler/implementation/string_validator.dart
index 140134b..d967e44 100644
--- a/sdk/lib/_internal/compiler/implementation/string_validator.dart
+++ b/sdk/lib/_internal/compiler/implementation/string_validator.dart
@@ -36,7 +36,7 @@
   static StringQuoting quotingFromString(String sourceString) {
     Iterator<int> source = sourceString.codeUnits.iterator;
     bool raw = false;
-    int quoteLength = 1;
+    int leftQuoteLength = 1;
     source.moveNext();
     int quoteChar = source.current;
     if (quoteChar == $r) {
@@ -46,27 +46,47 @@
     }
     assert(quoteChar == $SQ || quoteChar == $DQ);
     // String has at least one quote. Check it if has three.
-    // If it only have two, the string must be an empty string literal,
+    // If it only has two, the string must be an empty string literal,
     // and end after the second quote.
     bool multiline = false;
     if (source.moveNext() && source.current == quoteChar && source.moveNext()) {
       int code = source.current;
       assert(code == quoteChar);  // If not, there is a bug in the parser.
-      quoteLength = 3;
-      // Check if a multiline string starts with a newline (CR, LF or CR+LF).
-      if (source.moveNext()) {
+      leftQuoteLength = 3;
+
+      // Check if a multiline string starts with optional whitespace followed by
+      // a newline (CR, LF or CR+LF).
+      // We also accept if the these characters are escaped by a backslash.
+      int newLineLength = 1;
+      while (true) {
+        // Due to string-interpolations we are not guaranteed to see the
+        // trailing quoting characters. The invocations to `moveNext()` may
+        // therefore return false and the `current`-getter return `null`. The
+        // code does not need to handle this specially (as it will not find the
+        // newline characters).
+        source.moveNext();
         code = source.current;
-        if (code == $CR) {
-          quoteLength += 1;
-          if (source.moveNext() && source.current == $LF) {
-            quoteLength += 1;
-          }
-        } else if (code == $LF) {
-          quoteLength += 1;
+        if (code == $BACKSLASH) {
+          newLineLength++;
+          source.moveNext();
+          code = source.current;
         }
+        if (code == $TAB || code == $SPACE) {
+          newLineLength++;
+          continue;
+        }
+        if (code == $CR) {
+          if (source.moveNext() && source.current == $LF) {
+            newLineLength++;
+          }
+          leftQuoteLength += newLineLength;
+        } else if (code == $LF) {
+          leftQuoteLength += newLineLength;
+        }
+        break;
       }
     }
-    return StringQuoting.getQuoting(quoteChar, raw, quoteLength);
+    return StringQuoting.getQuoting(quoteChar, raw, leftQuoteLength);
   }
 
   /**
diff --git a/sdk/lib/_internal/compiler/implementation/tracer.dart b/sdk/lib/_internal/compiler/implementation/tracer.dart
index eef98f1..46efc0f 100644
--- a/sdk/lib/_internal/compiler/implementation/tracer.dart
+++ b/sdk/lib/_internal/compiler/implementation/tracer.dart
@@ -15,14 +15,13 @@
 import 'dart2jslib.dart';
 
 /**
- * Set to true to enable tracing.
+ * If non-null, we only trace methods whose name match the regexp defined by the
+ * given pattern.
  */
-const bool GENERATE_TRACE = false;
+const String TRACE_FILTER_PATTERN = const String.fromEnvironment("DUMP_IR");
 
-/**
- * If non-null, we only trace methods whose name contains the given substring.
- */
-const String TRACE_FILTER = null;
+final RegExp TRACE_FILTER =
+    TRACE_FILTER_PATTERN == null ? null : new RegExp(TRACE_FILTER_PATTERN);
 
 /**
  * Dumps the intermediate representation after each phase in a format
@@ -33,20 +32,19 @@
   ItemCompilationContext context;
   bool traceActive = false;
   final EventSink<String> output;
-  final bool enabled = GENERATE_TRACE;
+  final bool isEnabled = TRACE_FILTER != null;
 
   Tracer(api.CompilerOutputProvider outputProvider) :
-    output = GENERATE_TRACE ? outputProvider('dart', 'cfg') : null;
+    output = TRACE_FILTER != null ? outputProvider('dart', 'cfg') : null;
 
   void traceCompilation(String methodName,
                         ItemCompilationContext compilationContext,
                         Compiler compiler) {
-    if (!enabled) return;
+    if (!isEnabled) return;
+    traceActive = TRACE_FILTER.hasMatch(methodName);
+    if (!traceActive) return;
     this.context = compilationContext;
     this.compiler = compiler;
-    traceActive =
-        TRACE_FILTER == null || methodName.contains(TRACE_FILTER);
-    if (!traceActive) return;
     tag("compilation", () {
       printProperty("name", methodName);
       printProperty("method", methodName);
diff --git a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
index 845447f..94897b3 100644
--- a/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
+++ b/sdk/lib/_internal/compiler/implementation/tree/nodes.dart
@@ -208,6 +208,8 @@
   bool isValidContinueTarget() => false;
   bool isThis() => false;
   bool isSuper() => false;
+
+  bool get isErroneous => false;
 }
 
 class ClassNode extends Node {
@@ -319,12 +321,14 @@
   bool isValidBreakTarget() => true;
 }
 
-/// Errorneous expression that behaves as a literal null.
+/// Erroneous expression that behaves as a literal null.
 class ErrorExpression extends LiteralNull {
   ErrorExpression(token)
       : super(token);
 
   ErrorExpression asErrorExpression() => this;
+
+  bool get isErroneous => true;
 }
 
 /**
@@ -415,10 +419,11 @@
       return null;
     }
     if (!isPostfix && argumentsNode != null) {
-      return argumentsNode.getEndToken();
+      Token token = argumentsNode.getEndToken();
+      if (token != null) return token;
     }
     if (selector != null) return selector.getEndToken();
-    return receiver.getBeginToken();
+    return getBeginToken();
   }
 
   Send copyWithReceiver(Node newReceiver) {
@@ -558,8 +563,11 @@
       Link<Node> link = nodes;
       if (link.isEmpty) return beginToken;
       while (!link.tail.isEmpty) link = link.tail;
-      if (link.head.getEndToken() != null) return link.head.getEndToken();
-      if (link.head.getBeginToken() != null) return link.head.getBeginToken();
+      Node lastNode = link.head;
+      if (lastNode != null) {
+        if (lastNode.getEndToken() != null) return lastNode.getEndToken();
+        if (lastNode.getBeginToken() != null) return lastNode.getBeginToken();
+      }
     }
     return beginToken;
   }
@@ -826,71 +834,54 @@
 
 
 class StringQuoting {
-  static const StringQuoting SINGLELINE_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 1);
-  static const StringQuoting RAW_SINGLELINE_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 1);
-  static const StringQuoting MULTILINE_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 3);
-  static const StringQuoting RAW_MULTILINE_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 3);
-  static const StringQuoting MULTILINE_NL_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 4);
-  static const StringQuoting RAW_MULTILINE_NL_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 4);
-  static const StringQuoting MULTILINE_NL2_DQ =
-      const StringQuoting($DQ, raw: false, leftQuoteLength: 5);
-  static const StringQuoting RAW_MULTILINE_NL2_DQ =
-      const StringQuoting($DQ, raw: true, leftQuoteLength: 5);
-  static const StringQuoting SINGLELINE_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 1);
-  static const StringQuoting RAW_SINGLELINE_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 1);
-  static const StringQuoting MULTILINE_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 3);
-  static const StringQuoting RAW_MULTILINE_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 3);
-  static const StringQuoting MULTILINE_NL_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 4);
-  static const StringQuoting RAW_MULTILINE_NL_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 4);
-  static const StringQuoting MULTILINE_NL2_SQ =
-      const StringQuoting($SQ, raw: false, leftQuoteLength: 5);
-  static const StringQuoting RAW_MULTILINE_NL2_SQ =
-      const StringQuoting($SQ, raw: true, leftQuoteLength: 5);
 
-
-  static const List<StringQuoting> mapping = const <StringQuoting>[
-    SINGLELINE_DQ,
-    RAW_SINGLELINE_DQ,
-    MULTILINE_DQ,
-    RAW_MULTILINE_DQ,
-    MULTILINE_NL_DQ,
-    RAW_MULTILINE_NL_DQ,
-    MULTILINE_NL2_DQ,
-    RAW_MULTILINE_NL2_DQ,
-    SINGLELINE_SQ,
-    RAW_SINGLELINE_SQ,
-    MULTILINE_SQ,
-    RAW_MULTILINE_SQ,
-    MULTILINE_NL_SQ,
-    RAW_MULTILINE_NL_SQ,
-    MULTILINE_NL2_SQ,
-    RAW_MULTILINE_NL2_SQ
+  /// Cache of common quotings.
+  static const List<StringQuoting> _mapping = const <StringQuoting>[
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 1),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 1),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 1),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 1),
+    // No string quotes with 2 characters.
+    null,
+    null,
+    null,
+    null,
+    // Multiline quotings.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 3),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 3),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 3),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 3),
+    // Leading single whitespace or espaped newline.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 4),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 4),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 4),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 4),
+    // Other combinations of leading whitespace and/or escaped newline.
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 5),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 5),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 5),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 5),
+    const StringQuoting($SQ, raw: false, leftQuoteLength: 6),
+    const StringQuoting($SQ, raw: true, leftQuoteLength: 6),
+    const StringQuoting($DQ, raw: false, leftQuoteLength: 6),
+    const StringQuoting($DQ, raw: true, leftQuoteLength: 6)
   ];
+
   final bool raw;
   final int leftQuoteCharCount;
   final int quote;
-  const StringQuoting(this.quote, {bool raw, int leftQuoteLength})
-      : this.raw = raw, this.leftQuoteCharCount = leftQuoteLength;
+  const StringQuoting(this.quote, { this.raw, int leftQuoteLength })
+      : this.leftQuoteCharCount = leftQuoteLength;
   String get quoteChar => identical(quote, $DQ) ? '"' : "'";
 
   int get leftQuoteLength => (raw ? 1 : 0) + leftQuoteCharCount;
   int get rightQuoteLength => (leftQuoteCharCount > 2) ? 3 : 1;
-  static StringQuoting getQuoting(int quote, bool raw, int quoteLength) {
-    int index = quoteLength - 1;
-    if (quoteLength > 2) index -= 1;
-    return mapping[(raw ? 1 : 0) + index * 2 + (identical(quote, $SQ) ? 8 : 0)];
+  static StringQuoting getQuoting(int quote, bool raw, int leftQuoteLength) {
+    int quoteKindOffset = (quote == $DQ) ? 2 : 0;
+    int rawOffset = raw ? 1 : 0;
+    int index = (leftQuoteLength - 1) * 4 + rawOffset + quoteKindOffset;
+    if (index < _mapping.length) return _mapping[index];
+    return new StringQuoting(quote, raw: raw, leftQuoteLength: leftQuoteLength);
   }
 }
 
@@ -1003,6 +994,12 @@
 }
 
 class Operator extends Identifier {
+  static const COMPLEX_OPERATORS =
+      const ["--", "++", '+=', "-=", "*=", "/=", "%=", "&=", "|=", "~/=", "^=",
+             ">>=", "<<="];
+
+  static const INCREMENT_OPERATORS = const <String>["++", "--"];
+
   Operator(Token token) : super(token);
 
   Operator asOperator() => this;
@@ -2108,3 +2105,56 @@
       => node.isInterpolation;
 }
 
+/// Erroneous node used to recover from parser errors.  Implements various
+/// interfaces and provides bare minimum of implementation to avoid unnecessary
+/// messages.
+class ErrorNode
+    extends Node
+    implements FunctionExpression, VariableDefinitions, Typedef {
+  final Token token;
+  final String reason;
+  final Identifier name;
+  final NodeList definitions;
+
+  ErrorNode.internal(this.token, this.reason, this.name, this.definitions);
+
+  factory ErrorNode(Token token, String reason) {
+    Identifier name = new Identifier(token);
+    NodeList definitions = new NodeList(
+        null, const Link<Node>().prepend(name), null, null);
+    return new ErrorNode.internal(token, reason, name, definitions);
+  }
+
+  Token get beginToken => token;
+  Token get endToken => token;
+
+  Token getBeginToken() => token;
+
+  Token getEndToken() => token;
+
+  accept(Visitor visitor) {}
+
+  visitChildren(Visitor visitor) {}
+
+  bool get isErroneous => true;
+
+  // FunctionExpression.
+  get parameters => null;
+  get body => null;
+  get returnType => null;
+  get modifiers => Modifiers.EMPTY;
+  get initializers => null;
+  get getOrSet => null;
+  get isRedirectingFactory => false;
+  bool hasBody() => false;
+  bool hasEmptyBody() => false;
+
+  // VariableDefinitions.
+  get metadata => null;
+  get type => null;
+
+  // Typedef.
+  get typeParameters => null;
+  get formals => null;
+  get typedefKeyword => null;
+}
diff --git a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
index 1a8d651..bf6ac53 100644
--- a/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
+++ b/sdk/lib/_internal/compiler/implementation/types/flat_type_mask.dart
@@ -451,11 +451,13 @@
     } else if (isExact) {
       return hasElementIn(self, selector, element, compiler);
     } else if (isSubclass) {
+      assert(compiler.phase > Compiler.PHASE_RESOLVING);
       return hasElementIn(self, selector, element, compiler)
           || other.isSubclassOf(self)
           || compiler.world.hasAnySubclassThatMixes(self, other);
     } else {
       assert(isSubtype);
+      assert(compiler.phase > Compiler.PHASE_RESOLVING);
       bool result = hasElementIn(self, selector, element, compiler)
           || other.implementsInterface(self)
           || compiler.world.hasAnySubclassThatImplements(other, base)
diff --git a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
index 2b0c89c..3b2659cd 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/function_set.dart
@@ -68,7 +68,8 @@
     if (noSuchMethods == null) return const FunctionSetQuery(const <Element>[]);
     selector = (selector.mask == null)
         ? compiler.noSuchMethodSelector
-        : new TypedSelector(selector.mask, compiler.noSuchMethodSelector);
+        : new TypedSelector(selector.mask, compiler.noSuchMethodSelector,
+            compiler);
 
     return noSuchMethods.query(selector, compiler, null);
   }
@@ -175,7 +176,7 @@
     if (noSuchMethods != null
         && mask.needsNoSuchMethodHandling(selector, compiler)) {
       FunctionSetQuery noSuchMethodQuery = noSuchMethods.query(
-          new TypedSelector(mask, compiler.noSuchMethodSelector),
+          new TypedSelector(mask, compiler.noSuchMethodSelector, compiler),
           compiler,
           null);
       if (!noSuchMethodQuery.functions.isEmpty) {
diff --git a/sdk/lib/_internal/compiler/implementation/universe/universe.dart b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
index 89e6d09..d31006f 100644
--- a/sdk/lib/_internal/compiler/implementation/universe/universe.dart
+++ b/sdk/lib/_internal/compiler/implementation/universe/universe.dart
@@ -503,7 +503,7 @@
     List<String> namedParameters;
     if (signature.optionalParametersAreNamed) {
       namedParameters =
-          signature.optionalParameters.toList().map((e) => e.name).toList();
+          signature.optionalParameters.mapToList((e) => e.name);
     }
     Selector selector = new Selector.call(callee.name,
                                           caller.library,
@@ -608,7 +608,7 @@
   }
 
   Selector extendIfReachesAll(Compiler compiler) {
-    return new TypedSelector(compiler.typesTask.dynamicType, this);
+    return new TypedSelector(compiler.typesTask.dynamicType, this, compiler);
   }
 
   Selector toCallSelector() => new Selector.callClosureFrom(this);
@@ -634,7 +634,9 @@
   static Map<Selector, Map<TypeMask, TypedSelector>> canonicalizedValues =
       new Map<Selector, Map<TypeMask, TypedSelector>>();
 
-  factory TypedSelector(TypeMask mask, Selector selector) {
+  factory TypedSelector(TypeMask mask, Selector selector, Compiler compiler) {
+    // TODO(johnniwinther): Allow more TypeSelector kinds during resoluton.
+    assert(compiler.phase > Compiler.PHASE_RESOLVING || mask.isExact);
     if (selector.mask == mask) return selector;
     Selector untyped = selector.asUntyped;
     Map<TypeMask, TypedSelector> map = canonicalizedValues.putIfAbsent(untyped,
@@ -647,19 +649,21 @@
     return result;
   }
 
-  factory TypedSelector.exact(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.exact(base), selector);
+  factory TypedSelector.exact(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.exact(base), selector, compiler);
 
-  factory TypedSelector.subclass(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.subclass(base), selector);
+  factory TypedSelector.subclass(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.subclass(base), selector, compiler);
 
-  factory TypedSelector.subtype(ClassElement base, Selector selector)
-      => new TypedSelector(new TypeMask.subtype(base), selector);
+  factory TypedSelector.subtype(ClassElement base, Selector selector,
+      Compiler compiler)
+      => new TypedSelector(new TypeMask.subtype(base), selector, compiler);
 
   bool appliesUnnamed(Element element, Compiler compiler) {
     assert(sameNameHack(element, compiler));
     // [TypedSelector] are only used after resolution.
-    assert(compiler.phase > Compiler.PHASE_RESOLVING);
     if (!element.isMember) return false;
 
     // A closure can be called through any typed selector:
@@ -679,7 +683,7 @@
     bool canReachAll = compiler.enabledInvokeOn
         && mask.needsNoSuchMethodHandling(this, compiler);
     return canReachAll
-        ? new TypedSelector(compiler.typesTask.dynamicType, this)
+        ? new TypedSelector(compiler.typesTask.dynamicType, this, compiler)
         : this;
   }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
index 16faf1b..071126b 100644
--- a/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
+++ b/sdk/lib/_internal/compiler/implementation/use_unused_api.dart
@@ -67,6 +67,7 @@
   usedByTests();
   useElements(null, null);
   useIr(null, null);
+  useCompiler(null);
 }
 
 useApi() {
@@ -197,13 +198,12 @@
   type_graph_inferrer.TypeGraphInferrer typeGraphInferrer = null;
   source_file_provider.SourceFileProvider sourceFileProvider = null;
   world.hasAnyUserDefinedGetter(null);
-  compiler.importHelperLibrary(null);
   typeGraphInferrer.getCallersOf(null);
   dart_types.Types.sorted(null);
   new dart_types.Types(compiler).copy(compiler);
-  new universe.TypedSelector.subclass(null, null);
-  new universe.TypedSelector.subtype(null, null);
-  new universe.TypedSelector.exact(null, null);
+  new universe.TypedSelector.subclass(null, null, compiler);
+  new universe.TypedSelector.subtype(null, null, compiler);
+  new universe.TypedSelector.exact(null, null, compiler);
   sourceFileProvider.readStringFromUri(null);
 }
 
@@ -232,3 +232,8 @@
     ..hasIr(null)
     ..getIr(null);
 }
+
+useCompiler(dart2jslib.Compiler compiler) {
+  compiler.libraryLoader.reset();
+  compiler.libraryLoader.reuseLibrary(null);
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/compiler/implementation/util/link.dart b/sdk/lib/_internal/compiler/implementation/util/link.dart
index 44b7f29..8cbd27d 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link.dart
@@ -53,6 +53,38 @@
     return result;
   }
 
+  /// Lazily maps over this linked list, returning an [Iterable].
+  Iterable map(dynamic fn(T item)) {
+    return new MappedLinkIterable<T,dynamic>(this, fn);
+  }
+
+  /// Invokes `fn` for every item in the linked list and returns the results
+  /// in a [List].
+  List mapToList(dynamic fn(T item), { bool growable: true }) {
+    List result;
+    if (!growable) {
+      result = new List(slowLength());
+    } else {
+      result = new List();
+      result.length = slowLength();
+    }
+    int i = 0;
+    for (Link<T> link = this; !link.isEmpty; link = link.tail) {
+      result[i++] = fn(link.head);
+    }
+    return result;
+  }
+
+  /// Invokes `fn` for every item in the linked list and returns the results
+  /// in a [Set].
+  Set mapToSet(dynamic fn(T item)) {
+    Set result = new Set();
+    for (Link<T> link = this; !link.isEmpty; link = link.tail) {
+      result.add(fn(link.head));
+    }
+    return result;
+  }
+
   bool get isEmpty => true;
 
   Link<T> reverse() => this;
diff --git a/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
index 1f85236..da676b8 100644
--- a/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/link_implementation.dart
@@ -23,6 +23,39 @@
   }
 }
 
+typedef T Transformation<S, T>(S input);
+
+class MappedLinkIterator<S, T> extends Iterator<T> {
+  Transformation<S, T> _transformation;
+  Link<S> _link;
+  T _current;
+
+  MappedLinkIterator(this._link, this._transformation);
+
+  T get current => _current;
+
+  bool moveNext() {
+    if (_link.isEmpty) {
+      _current = null;
+      return false;
+    }
+    _current = _transformation(_link.head);
+    _link = _link.tail;
+    return true;
+  }
+}
+
+class MappedLinkIterable<S, T> extends IterableBase<T> {
+  Transformation<S, T> _transformation;
+  Link<S> _link;
+
+  MappedLinkIterable(this._link, this._transformation);
+
+  Iterator<T> get iterator {
+    return new MappedLinkIterator<S,T>(_link, _transformation);
+  }
+}
+
 class LinkEntry<T> extends Link<T> {
   final T head;
   Link<T> tail;
diff --git a/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart b/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
index bbb852a..c28b63f 100644
--- a/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
+++ b/sdk/lib/_internal/compiler/implementation/util/util_implementation.dart
@@ -5,5 +5,6 @@
 library util_implementation;
 
 import 'util.dart';
+import 'dart:collection';
 
 part 'link_implementation.dart';
diff --git a/sdk/lib/_internal/compiler/implementation/warnings.dart b/sdk/lib/_internal/compiler/implementation/warnings.dart
index e1ec24d..37c3e23 100644
--- a/sdk/lib/_internal/compiler/implementation/warnings.dart
+++ b/sdk/lib/_internal/compiler/implementation/warnings.dart
@@ -400,8 +400,9 @@
   static const MessageKind DUPLICATE_SUPER_INITIALIZER = const MessageKind(
       "Cannot have more than one super initializer.");
 
-  static const MessageKind INVALID_ARGUMENTS = const MessageKind(
-      "Arguments do not match the expected parameters of '#{methodName}'.");
+  static const MessageKind INVALID_CONSTRUCTOR_ARGUMENTS = const MessageKind(
+      "Arguments do not match the expected parameters of constructor "
+      "'#{constructorName}'.");
 
   static const MessageKind NO_MATCHING_CONSTRUCTOR = const MessageKind(
       "'super' call arguments and constructor parameters do not match.");
@@ -758,8 +759,10 @@
   static const MessageKind CANNOT_IMPLEMENT = const MessageKind(
       "'#{type}' cannot be implemented.");
 
+  // TODO(johnnwinther): Split messages into reasons for malformedness.
   static const MessageKind CANNOT_EXTEND_MALFORMED = const MessageKind(
-      "A class can't extend a malformed type.",
+      "Class '#{className}' can't extend the type '#{malformedType}' because "
+      "it is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "'extends' clause.",
       examples: const ["""
@@ -767,7 +770,8 @@
 main() => new A();"""]);
 
   static const MessageKind CANNOT_IMPLEMENT_MALFORMED = const MessageKind(
-      "A class can't implement a malformed type.",
+      "Class '#{className}' can't implement the type '#{malformedType}' "
+      "because it is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "type from the 'implements' clause.",
       examples: const ["""
@@ -775,7 +779,8 @@
 main() => new A();"""]);
 
   static const MessageKind CANNOT_MIXIN_MALFORMED = const MessageKind(
-      "A class can't mixin a malformed type.",
+      "Class '#{className}' can't mixin the type '#{malformedType}' because it "
+      "is malformed.",
       howToFix: "Try correcting the malformed type annotation or removing the "
         "type from the 'with' clause.",
       examples: const ["""
@@ -1832,6 +1837,24 @@
 }
 /*"""]);
 
+  static const MessageKind MISSING_TOKEN_BEFORE_THIS = const MessageKind(
+      "Expected '#{token}' before this.",
+      // Consider the second example below: the parser expects a ')' before
+      // 'y', but a ',' would also have worked. We don't have enough
+      // information to give a good suggestion.
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const [
+          "main() => true ? 1;",
+          "main() => foo(x: 1 y: 2);",
+        ]);
+
+  static const MessageKind MISSING_TOKEN_AFTER_THIS = const MessageKind(
+      "Expected '#{token}' after this.",
+      // See [MISSING_TOKEN_BEFORE_THIS], we don't have enough information to
+      // give a good suggestion.
+      howToFix: DONT_KNOW_HOW_TO_FIX,
+      examples: const ["main(x) {x}"]);
+
   static const MessageKind COMPILER_CRASHED = const MessageKind(
       "The compiler crashed when compiling this element.");
 
@@ -2026,7 +2049,7 @@
     if (message == null) {
       message = kind.template;
       arguments.forEach((key, value) {
-        message = message.replaceAll('#{${key}}', value.toString());
+        message = message.replaceAll('#{${key}}', convertToString(value));
       });
       assert(invariant(
           CURRENT_ELEMENT_SPANNABLE,
@@ -2036,7 +2059,7 @@
       if (!terse && kind.hasHowToFix) {
         String howToFix = kind.howToFix;
         arguments.forEach((key, value) {
-          howToFix = howToFix.replaceAll('#{${key}}', value.toString());
+          howToFix = howToFix.replaceAll('#{${key}}', convertToString(value));
         });
         message = '$message\n$howToFix';
       }
@@ -2054,4 +2077,14 @@
   }
 
   int get hashCode => throw new UnsupportedError('Message.hashCode');
+
+  static String convertToString(value) {
+    if (value is ErrorToken) {
+      // Shouldn't happen.
+      return value.assertionMessage;
+    } else if (value is Token) {
+      value = value.value;
+    }
+    return '$value';
+  }
 }
diff --git a/sdk/lib/_internal/compiler/implementation/world.dart b/sdk/lib/_internal/compiler/implementation/world.dart
index ae56485..b2e9c9c 100644
--- a/sdk/lib/_internal/compiler/implementation/world.dart
+++ b/sdk/lib/_internal/compiler/implementation/world.dart
@@ -32,6 +32,8 @@
   final Set<Element> functionsThatMightBePassedToApply =
       new Set<FunctionElement>();
 
+  final Set<Element> alreadyPopulated;
+
   Set<ClassElement> subclassesOf(ClassElement cls) {
     return _subclasses[cls.declaration];
   }
@@ -55,10 +57,14 @@
 
   World(Compiler compiler)
       : allFunctions = new FunctionSet(compiler),
-        this.compiler = compiler;
+        this.compiler = compiler,
+        alreadyPopulated = compiler.cacheStrategy.newSet();
 
   void populate() {
     void addSubtypes(ClassElement cls) {
+      if (compiler.hasIncrementalSupport && !alreadyPopulated.add(cls)) {
+        return;
+      }
       assert(cls.isDeclaration);
       if (cls.resolutionState != STATE_DONE) {
         compiler.internalError(cls, 'Class "${cls.name}" is not resolved.');
diff --git a/sdk/lib/_internal/lib/async_patch.dart b/sdk/lib/_internal/lib/async_patch.dart
index c67b3ff..cd5890d 100644
--- a/sdk/lib/_internal/lib/async_patch.dart
+++ b/sdk/lib/_internal/lib/async_patch.dart
@@ -5,6 +5,7 @@
 // Patch file for the dart:async library.
 
 import 'dart:_js_helper' show
+    patch,
     Primitives,
     convertDartClosureToJS,
     loadDeferredLibrary;
@@ -13,26 +14,29 @@
     TimerImpl,
     leaveJsAsync,
     enterJsAsync,
-    isWorker,
-    globalThis;
+    isWorker;
 
 import 'dart:_foreign_helper' show JS;
 
-patch Timer _createTimer(Duration duration, void callback()) {
+@patch
+Timer _createTimer(Duration duration, void callback()) {
   int milliseconds = duration.inMilliseconds;
   if (milliseconds < 0) milliseconds = 0;
   return new TimerImpl(milliseconds, callback);
 }
 
-patch Timer _createPeriodicTimer(Duration duration,
-                                 void callback(Timer timer)) {
+@patch
+Timer _createPeriodicTimer(Duration duration,
+                           void callback(Timer timer)) {
   int milliseconds = duration.inMilliseconds;
   if (milliseconds < 0) milliseconds = 0;
   return new TimerImpl.periodic(milliseconds, callback);
 }
 
-patch class _AsyncRun {
-  patch static void _scheduleImmediate(void callback()) {
+@patch
+class _AsyncRun {
+  @patch
+  static void _scheduleImmediate(void callback()) {
     scheduleImmediateClosure(callback);
   }
 
@@ -41,7 +45,7 @@
       _initializeScheduleImmediate();
 
   static Function _initializeScheduleImmediate() {
-    if (JS('', '#.scheduleImmediate', globalThis) != null) {
+    if (JS('', 'self.scheduleImmediate') != null) {
       return _scheduleImmediateJsOverride;
     }
     // TODO(9002): don't use the Timer to enqueue the immediate callback.
@@ -55,8 +59,7 @@
       callback();
     };
     enterJsAsync();
-    JS('void', '#.scheduleImmediate(#)',
-       globalThis,
+    JS('void', 'self.scheduleImmediate(#)',
        convertDartClosureToJS(internalCallback, 0));
   }
 
@@ -65,8 +68,10 @@
   }
 }
 
-patch class DeferredLibrary {
-  patch Future<Null> load() {
+@patch
+class DeferredLibrary {
+  @patch
+  Future<Null> load() {
     return loadDeferredLibrary(libraryName, uri);
   }
 }
diff --git a/sdk/lib/_internal/lib/collection_patch.dart b/sdk/lib/_internal/lib/collection_patch.dart
index 0c19fdb..78147f8 100644
--- a/sdk/lib/_internal/lib/collection_patch.dart
+++ b/sdk/lib/_internal/lib/collection_patch.dart
@@ -4,12 +4,14 @@
 
 // Patch file for dart:collection classes.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show fillLiteralMap, NoInline;
+import 'dart:_js_helper' show fillLiteralMap, NoInline, patch;
 
-patch class HashMap<K, V> {
-  patch factory HashMap({ bool equals(K key1, K key2),
-                          int hashCode(K key),
-                          bool isValidKey(potentialKey) }) {
+@patch
+class HashMap<K, V> {
+  @patch
+  factory HashMap({ bool equals(K key1, K key2),
+                    int hashCode(K key),
+                    bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -36,7 +38,8 @@
     return new _CustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
 
-  patch factory HashMap.identity() = _IdentityHashMap<K, V>;
+  @patch
+  factory HashMap.identity() = _IdentityHashMap<K, V>;
 }
 
 class _HashMap<K, V> implements HashMap<K, V> {
@@ -478,10 +481,12 @@
   }
 }
 
-patch class LinkedHashMap<K, V> {
-  patch factory LinkedHashMap({ bool equals(K key1, K key2),
-                                int hashCode(K key),
-                                bool isValidKey(potentialKey) }) {
+@patch
+class LinkedHashMap<K, V> {
+  @patch
+  factory LinkedHashMap({ bool equals(K key1, K key2),
+                          int hashCode(K key),
+                          bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -508,7 +513,8 @@
     return new _LinkedCustomHashMap<K, V>(equals, hashCode, isValidKey);
   }
 
-  patch factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
+  @patch
+  factory LinkedHashMap.identity() = _LinkedIdentityHashMap<K, V>;
 
   // Private factory constructor called by generated code for map literals.
   @NoInline()
@@ -959,10 +965,12 @@
   }
 }
 
-patch class HashSet<E> {
-  patch factory HashSet({ bool equals(E e1, E e2),
-                          int hashCode(E e),
-                          bool isValidKey(potentialKey) }) {
+@patch
+class HashSet<E> {
+  @patch
+  factory HashSet({ bool equals(E e1, E e2),
+                    int hashCode(E e),
+                    bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -989,7 +997,8 @@
     return new _CustomHashSet<E>(equals, hashCode, isValidKey);
   }
 
-  patch factory HashSet.identity() = _IdentityHashSet<E>;
+  @patch
+  factory HashSet.identity() = _IdentityHashSet<E>;
 }
 
 class _HashSet<E> extends _HashSetBase<E> implements HashSet<E> {
@@ -1361,10 +1370,12 @@
   }
 }
 
-patch class LinkedHashSet<E> {
-  patch factory LinkedHashSet({ bool equals(E e1, E e2),
-                                int hashCode(E e),
-                                bool isValidKey(potentialKey) }) {
+@patch
+class LinkedHashSet<E> {
+  @patch
+  factory LinkedHashSet({ bool equals(E e1, E e2),
+                          int hashCode(E e),
+                          bool isValidKey(potentialKey) }) {
     if (isValidKey == null) {
       if (hashCode == null) {
         if (equals == null) {
@@ -1391,7 +1402,8 @@
     return new _LinkedCustomHashSet<E>(equals, hashCode, isValidKey);
   }
 
-  patch factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
+  @patch
+  factory LinkedHashSet.identity() = _LinkedIdentityHashSet<E>;
 }
 
 class _LinkedHashSet<E> extends _HashSetBase<E> implements LinkedHashSet<E> {
diff --git a/sdk/lib/_internal/lib/convert_patch.dart b/sdk/lib/_internal/lib/convert_patch.dart
index 997db63..3fe44df 100644
--- a/sdk/lib/_internal/lib/convert_patch.dart
+++ b/sdk/lib/_internal/lib/convert_patch.dart
@@ -4,6 +4,7 @@
 
 // Patch file for dart:convert library.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_foreign_helper' show JS;
 import 'dart:_interceptors' show JSExtendableArray;
 
@@ -23,7 +24,8 @@
  *
  * Throws [FormatException] if the input is not valid JSON text.
  */
-patch _parseJson(String source, reviver(key, value)) {
+@patch
+_parseJson(String source, reviver(key, value)) {
   if (source is! String) throw new ArgumentError(source);
 
   var parsed;
@@ -93,7 +95,9 @@
   return revive(null, walk(json));
 }
 
-patch class _Utf8Encoder {
+@patch
+class _Utf8Encoder {
   // Use Uint8List when supported on all platforms.
-  patch static List<int> _createBuffer(int size) => new List<int>(size);
+  @patch
+  static List<int> _createBuffer(int size) => new List<int>(size);
 }
diff --git a/sdk/lib/_internal/lib/core_patch.dart b/sdk/lib/_internal/lib/core_patch.dart
index 926b779..b6f538f 100644
--- a/sdk/lib/_internal/lib/core_patch.dart
+++ b/sdk/lib/_internal/lib/core_patch.dart
@@ -5,7 +5,8 @@
 // Patch file for dart:core classes.
 import "dart:_internal" as _symbol_dev;
 import 'dart:_interceptors';
-import 'dart:_js_helper' show checkNull,
+import 'dart:_js_helper' show patch,
+                              checkNull,
                               getRuntimeType,
                               JSSyntaxRegExp,
                               Primitives,
@@ -23,16 +24,21 @@
   return result;
 }
 
-patch int identityHashCode(Object object) => objectHashCode(object);
+@patch
+int identityHashCode(Object object) => objectHashCode(object);
 
 // Patch for Object implementation.
-patch class Object {
-  patch int get hashCode => Primitives.objectHashCode(this);
+@patch
+class Object {
+  @patch
+  int get hashCode => Primitives.objectHashCode(this);
 
 
-  patch String toString() => Primitives.objectToString(this);
+  @patch
+  String toString() => Primitives.objectToString(this);
 
-  patch dynamic noSuchMethod(Invocation invocation) {
+  @patch
+  dynamic noSuchMethod(Invocation invocation) {
     throw new NoSuchMethodError(
         this,
         invocation.memberName,
@@ -40,14 +46,17 @@
         invocation.namedArguments);
   }
 
-  patch Type get runtimeType => getRuntimeType(this);
+  @patch
+  Type get runtimeType => getRuntimeType(this);
 }
 
 // Patch for Function implementation.
-patch class Function {
-  patch static apply(Function function,
-                     List positionalArguments,
-                     [Map<Symbol, dynamic> namedArguments]) {
+@patch
+class Function {
+  @patch
+  static apply(Function function,
+               List positionalArguments,
+               [Map<Symbol, dynamic> namedArguments]) {
     return Primitives.applyFunction(
         function, positionalArguments, _toMangledNames(namedArguments));
   }
@@ -64,15 +73,19 @@
 }
 
 // Patch for Expando implementation.
-patch class Expando<T> {
-  patch Expando([String name]) : this.name = name;
+@patch
+class Expando<T> {
+  @patch
+  Expando([String name]) : this.name = name;
 
-  patch T operator[](Object object) {
+  @patch
+  T operator[](Object object) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     return (values == null) ? null : Primitives.getProperty(values, _getKey());
   }
 
-  patch void operator[]=(Object object, T value) {
+  @patch
+  void operator[]=(Object object, T value) {
     var values = Primitives.getProperty(object, _EXPANDO_PROPERTY_NAME);
     if (values == null) {
       values = new Object();
@@ -95,95 +108,124 @@
   static int _keyCount = 0;
 }
 
-patch class int {
-  patch static int parse(String source,
+@patch
+class int {
+  @patch
+  static int parse(String source,
                          { int radix,
                            int onError(String source) }) {
     return Primitives.parseInt(source, radix, onError);
   }
 
-  patch factory int.fromEnvironment(String name, {int defaultValue}) {
+  @patch
+  factory int.fromEnvironment(String name, {int defaultValue}) {
     throw new UnsupportedError(
         'int.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class double {
-  patch static double parse(String source,
+@patch
+class double {
+  @patch
+  static double parse(String source,
                             [double onError(String source)]) {
     return Primitives.parseDouble(source, onError);
   }
 }
 
-patch class Error {
-  patch static String _objectToString(Object object) {
+@patch
+class Error {
+  @patch
+  static String _objectToString(Object object) {
     return Primitives.objectToString(object);
   }
 
-  patch StackTrace get stackTrace => Primitives.extractStackTrace(this);
+  @patch
+  StackTrace get stackTrace => Primitives.extractStackTrace(this);
 }
 
 // Patch for DateTime implementation.
-patch class DateTime {
-  patch DateTime._internal(int year,
-                           int month,
-                           int day,
-                           int hour,
-                           int minute,
-                           int second,
-                           int millisecond,
-                           bool isUtc)
+@patch
+class DateTime {
+  @patch
+  DateTime._internal(int year,
+                     int month,
+                     int day,
+                     int hour,
+                     int minute,
+                     int second,
+                     int millisecond,
+                     bool isUtc)
       : this.isUtc = checkNull(isUtc),
         millisecondsSinceEpoch = Primitives.valueFromDecomposedDate(
             year, month, day, hour, minute, second, millisecond, isUtc) {
     Primitives.lazyAsJsDate(this);
   }
 
-  patch DateTime._now()
+  @patch
+  DateTime._now()
       : isUtc = false,
         millisecondsSinceEpoch = Primitives.dateNow() {
     Primitives.lazyAsJsDate(this);
   }
 
-  patch static int _brokenDownDateToMillisecondsSinceEpoch(
+  @patch
+  static int _brokenDownDateToMillisecondsSinceEpoch(
       int year, int month, int day, int hour, int minute, int second,
       int millisecond, bool isUtc) {
     return Primitives.valueFromDecomposedDate(
         year, month, day, hour, minute, second, millisecond, isUtc);
   }
 
-  patch String get timeZoneName {
+  @patch
+  String get timeZoneName {
     if (isUtc) return "UTC";
     return Primitives.getTimeZoneName(this);
   }
 
-  patch Duration get timeZoneOffset {
+  @patch
+  Duration get timeZoneOffset {
     if (isUtc) return new Duration();
     return new Duration(minutes: Primitives.getTimeZoneOffsetInMinutes(this));
   }
 
-  patch int get year => Primitives.getYear(this);
+  @patch
+  int get year => Primitives.getYear(this);
 
-  patch int get month => Primitives.getMonth(this);
+  @patch
+  int get month => Primitives.getMonth(this);
 
-  patch int get day => Primitives.getDay(this);
+  @patch
+  int get day => Primitives.getDay(this);
 
-  patch int get hour => Primitives.getHours(this);
+  @patch
+  int get hour => Primitives.getHours(this);
 
-  patch int get minute => Primitives.getMinutes(this);
+  @patch
+  int get minute => Primitives.getMinutes(this);
 
-  patch int get second => Primitives.getSeconds(this);
+  @patch
+  int get second => Primitives.getSeconds(this);
 
-  patch int get millisecond => Primitives.getMilliseconds(this);
+  @patch
+  int get millisecond => Primitives.getMilliseconds(this);
 
-  patch int get weekday => Primitives.getWeekday(this);
+  @patch
+  int get weekday => Primitives.getWeekday(this);
 }
 
 
 // Patch for Stopwatch implementation.
-patch class Stopwatch {
-  patch static int _frequency() => 1000000;
-  patch static int _now() => Primitives.numMicroseconds();
+@patch
+class Stopwatch {
+  @patch
+  static void _initTicker() {
+    Primitives.initTicker();
+    _frequency = Primitives.timerFrequency;
+  }
+
+  @patch
+  static int _now() => Primitives.timerTicks();
 }
 
 class _ListConstructorSentinel extends JSInt {
@@ -191,15 +233,18 @@
 }
 
 // Patch for List implementation.
-patch class List<E> {
-  patch factory List([int length = const _ListConstructorSentinel()]) {
+@patch
+class List<E> {
+  @patch
+  factory List([int length = const _ListConstructorSentinel()]) {
     if (length == const _ListConstructorSentinel()) {
       return new JSArray<E>.emptyGrowable();
     }
     return new JSArray<E>.fixed(length);
   }
 
-  patch factory List.filled(int length, E fill) {
+  @patch
+  factory List.filled(int length, E fill) {
     List result = new JSArray<E>.fixed(length);
     if (length != 0 && fill != null) {
       for (int i = 0; i < result.length; i++) {
@@ -211,33 +256,41 @@
 }
 
 
-patch class String {
-  patch factory String.fromCharCodes(Iterable<int> charCodes) {
+@patch
+class String {
+  @patch
+  factory String.fromCharCodes(Iterable<int> charCodes) {
     if (charCodes is! JSArray) {
       charCodes = new List.from(charCodes);
     }
     return Primitives.stringFromCharCodes(charCodes);
   }
 
-  patch factory String.fromCharCode(int charCode) {
+  @patch
+  factory String.fromCharCode(int charCode) {
     return Primitives.stringFromCharCode(charCode);
   }
 
-  patch factory String.fromEnvironment(String name, {String defaultValue}) {
+  @patch
+  factory String.fromEnvironment(String name, {String defaultValue}) {
     throw new UnsupportedError(
         'String.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class bool {
-  patch factory bool.fromEnvironment(String name, {bool defaultValue: false}) {
+@patch
+class bool {
+  @patch
+  factory bool.fromEnvironment(String name, {bool defaultValue: false}) {
     throw new UnsupportedError(
         'bool.fromEnvironment can only be used as a const constructor');
   }
 }
 
-patch class RegExp {
-  patch factory RegExp(String source,
+@patch
+class RegExp {
+  @patch
+  factory RegExp(String source,
                        {bool multiLine: false,
                         bool caseSensitive: true})
     => new JSSyntaxRegExp(source,
@@ -246,14 +299,17 @@
 }
 
 // Patch for 'identical' function.
-patch bool identical(Object a, Object b) {
+@patch
+bool identical(Object a, Object b) {
   return Primitives.identicalImplementation(a, b);
 }
 
-patch class StringBuffer {
+@patch
+class StringBuffer {
   String _contents = "";
 
-  patch StringBuffer([Object content = ""]) {
+  @patch
+  StringBuffer([Object content = ""]) {
     if (content is String) {
       _contents = content;
     } else {
@@ -261,26 +317,33 @@
     }
   }
 
-  patch int get length => _contents.length;
+  @patch
+  int get length => _contents.length;
 
-  patch void write(Object obj) {
+  @patch
+  void write(Object obj) {
     String str = obj is String ? obj : "$obj";
     _contents = Primitives.stringConcatUnchecked(_contents, str);
   }
 
-  patch void writeCharCode(int charCode) {
+  @patch
+  void writeCharCode(int charCode) {
     write(new String.fromCharCode(charCode));
   }
 
-  patch void clear() {
+  @patch
+  void clear() {
     _contents = "";
   }
 
-  patch String toString() => _contents;
+  @patch
+  String toString() => _contents;
 }
 
-patch class NoSuchMethodError {
-  patch String toString() {
+@patch
+class NoSuchMethodError {
+  @patch
+  String toString() {
     StringBuffer sb = new StringBuffer();
     int i = 0;
     if (_arguments != null) {
@@ -325,10 +388,13 @@
   }
 }
 
-patch class Uri {
-  patch static bool get _isWindows => false;
+@patch
+class Uri {
+  @patch
+  static bool get _isWindows => false;
 
-  patch static Uri get base {
+  @patch
+  static Uri get base {
     String uri = Primitives.currentUri();
     if (uri != null) return Uri.parse(uri);
     throw new UnsupportedError("'Uri.base' is not supported");
diff --git a/sdk/lib/_internal/lib/internal_patch.dart b/sdk/lib/_internal/lib/internal_patch.dart
index 485c895..16afd5f 100644
--- a/sdk/lib/_internal/lib/internal_patch.dart
+++ b/sdk/lib/_internal/lib/internal_patch.dart
@@ -3,19 +3,23 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:_js_primitives' show printString;
-import 'dart:_js_helper' show JS;
+import 'dart:_js_helper' show JS, patch;
 import 'dart:_interceptors' show JSArray;
 
-patch class Symbol implements core.Symbol {
-  patch const Symbol(String name)
+@patch
+class Symbol implements core.Symbol {
+  @patch
+  const Symbol(String name)
       : this._name = name;
 }
 
-patch void printToConsole(String line) {
+@patch
+void printToConsole(String line) {
   printString('$line');
 }
 
-patch List makeListFixedLength(List growableList) {
+@patch
+List makeListFixedLength(List growableList) {
   JSArray.markFixedList(growableList);
   return growableList;
 }
diff --git a/sdk/lib/_internal/lib/io_patch.dart b/sdk/lib/_internal/lib/io_patch.dart
index 289fcc1..06d642f 100644
--- a/sdk/lib/_internal/lib/io_patch.dart
+++ b/sdk/lib/_internal/lib/io_patch.dart
@@ -2,202 +2,270 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-patch class _Directory {
-  patch static _current() {
+import 'dart:_js_helper' show patch;
+
+@patch
+class _Directory {
+  @patch
+  static _current() {
     throw new UnsupportedError("Directory._current");
   }
-  patch static _setCurrent(path) {
+  @patch
+  static _setCurrent(path) {
     throw new UnsupportedError("Directory_SetCurrent");
   }
-  patch static _createTemp(String path) {
+  @patch
+  static _createTemp(String path) {
     throw new UnsupportedError("Directory._createTemp");
   }
-  patch static String _systemTemp() {
+  @patch
+  static String _systemTemp() {
     throw new UnsupportedError("Directory._systemTemp");
   }
-  patch static _exists(String path) {
+  @patch
+  static _exists(String path) {
     throw new UnsupportedError("Directory._exists");
   }
-  patch static _create(String path) {
+  @patch
+  static _create(String path) {
     throw new UnsupportedError("Directory._create");
   }
-  patch static _deleteNative(String path, bool recursive) {
+  @patch
+  static _deleteNative(String path, bool recursive) {
     throw new UnsupportedError("Directory._deleteNative");
   }
-  patch static _rename(String path, String newPath) {
+  @patch
+  static _rename(String path, String newPath) {
     throw new UnsupportedError("Directory._rename");
   }
-  patch static List _list(String path, bool recursive, bool followLinks) {
+  @patch
+  static List _list(String path, bool recursive, bool followLinks) {
     throw new UnsupportedError("Directory._list");
   }
 }
 
-patch class _EventHandler {
-  patch static void _sendData(Object sender,
+@patch
+class _EventHandler {
+  @patch
+  static void _sendData(Object sender,
                               RawReceivePort receivePort,
                               int data) {
     throw new UnsupportedError("EventHandler._sendData");
   }
 }
 
-patch class FileStat {
-  patch static _statSync(String path) {
+@patch
+class FileStat {
+  @patch
+  static _statSync(String path) {
     throw new UnsupportedError("FileStat.stat");
   }
 }
 
-patch class FileSystemEntity {
-  patch static _getType(String path, bool followLinks) {
+@patch
+class FileSystemEntity {
+  @patch
+  static _getType(String path, bool followLinks) {
     throw new UnsupportedError("FileSystemEntity._getType");
   }
-  patch static _identical(String path1, String path2) {
+  @patch
+  static _identical(String path1, String path2) {
     throw new UnsupportedError("FileSystemEntity._identical");
   }
-  patch static _resolveSymbolicLinks(String path) {
+  @patch
+  static _resolveSymbolicLinks(String path) {
     throw new UnsupportedError("FileSystemEntity._resolveSymbolicLinks");
   }
 }
 
-patch class _File {
-  patch static _exists(String path) {
+@patch
+class _File {
+  @patch
+  static _exists(String path) {
     throw new UnsupportedError("File._exists");
   }
-  patch static _create(String path) {
+  @patch
+  static _create(String path) {
     throw new UnsupportedError("File._create");
   }
-  patch static _createLink(String path, String target) {
+  @patch
+  static _createLink(String path, String target) {
     throw new UnsupportedError("File._createLink");
   }
-  patch static _linkTarget(String path) {
+  @patch
+  static _linkTarget(String path) {
     throw new UnsupportedError("File._linkTarget");
   }
-  patch static _deleteNative(String path) {
+  @patch
+  static _deleteNative(String path) {
     throw new UnsupportedError("File._deleteNative");
   }
-  patch static _deleteLinkNative(String path) {
+  @patch
+  static _deleteLinkNative(String path) {
     throw new UnsupportedError("File._deleteLinkNative");
   }
-  patch static _rename(String oldPath, String newPath) {
+  @patch
+  static _rename(String oldPath, String newPath) {
     throw new UnsupportedError("File._rename");
   }
-  patch static _renameLink(String oldPath, String newPath) {
+  @patch
+  static _renameLink(String oldPath, String newPath) {
     throw new UnsupportedError("File._renameLink");
   }
-  patch static _copy(String oldPath, String newPath) {
+  @patch
+  static _copy(String oldPath, String newPath) {
     throw new UnsupportedError("File._copy");
   }
-  patch static _lengthFromPath(String path) {
+  @patch
+  static _lengthFromPath(String path) {
     throw new UnsupportedError("File._lengthFromPath");
   }
-  patch static _lastModified(String path) {
+  @patch
+  static _lastModified(String path) {
     throw new UnsupportedError("File._lastModified");
   }
-  patch static _open(String path, int mode) {
+  @patch
+  static _open(String path, int mode) {
     throw new UnsupportedError("File._open");
   }
-  patch static int _openStdio(int fd) {
+  @patch
+  static int _openStdio(int fd) {
     throw new UnsupportedError("File._openStdio");
   }
 }
 
-patch class _RandomAccessFile {
-  patch static int _close(int id) {
+@patch
+class _RandomAccessFile {
+  @patch
+  static int _close(int id) {
     throw new UnsupportedError("RandomAccessFile._close");
   }
-  patch static int _getFD(int id) {
+  @patch
+  static int _getFD(int id) {
     throw new UnsupportedError("RandomAccessFile._getFD");
   }
-  patch static _readByte(int id) {
+  @patch
+  static _readByte(int id) {
     throw new UnsupportedError("RandomAccessFile._readByte");
   }
-  patch static _read(int id, int bytes) {
+  @patch
+  static _read(int id, int bytes) {
     throw new UnsupportedError("RandomAccessFile._read");
   }
-  patch static _readInto(int id, List<int> buffer, int start, int end) {
+  @patch
+  static _readInto(int id, List<int> buffer, int start, int end) {
     throw new UnsupportedError("RandomAccessFile._readInto");
   }
-  patch static _writeByte(int id, int value) {
+  @patch
+  static _writeByte(int id, int value) {
     throw new UnsupportedError("RandomAccessFile._writeByte");
   }
-  patch static _writeFrom(int id, List<int> buffer, int start, int end) {
+  @patch
+  static _writeFrom(int id, List<int> buffer, int start, int end) {
     throw new UnsupportedError("RandomAccessFile._writeFrom");
   }
-  patch static _position(int id) {
+  @patch
+  static _position(int id) {
     throw new UnsupportedError("RandomAccessFile._position");
   }
-  patch static _setPosition(int id, int position) {
+  @patch
+  static _setPosition(int id, int position) {
     throw new UnsupportedError("RandomAccessFile._setPosition");
   }
-  patch static _truncate(int id, int length) {
+  @patch
+  static _truncate(int id, int length) {
     throw new UnsupportedError("RandomAccessFile._truncate");
   }
-  patch static _length(int id) {
+  @patch
+  static _length(int id) {
     throw new UnsupportedError("RandomAccessFile._length");
   }
-  patch static _flush(int id) {
+  @patch
+  static _flush(int id) {
     throw new UnsupportedError("RandomAccessFile._flush");
   }
 }
 
-patch class _IOCrypto {
-  patch static Uint8List getRandomBytes(int count) {
+@patch
+class _IOCrypto {
+  @patch
+  static Uint8List getRandomBytes(int count) {
     throw new UnsupportedError("_IOCrypto.getRandomBytes");
   }
 }
 
-patch class _Platform {
-  patch static int _numberOfProcessors() {
+@patch
+class _Platform {
+  @patch
+  static int _numberOfProcessors() {
     throw new UnsupportedError("Platform._numberOfProcessors");
   }
-  patch static String _pathSeparator() {
+  @patch
+  static String _pathSeparator() {
     throw new UnsupportedError("Platform._pathSeparator");
   }
-  patch static String _operatingSystem() {
+  @patch
+  static String _operatingSystem() {
     throw new UnsupportedError("Platform._operatingSystem");
   }
-  patch static _localHostname() {
+  @patch
+  static _localHostname() {
     throw new UnsupportedError("Platform._localHostname");
   }
-  patch static _executable() {
+  @patch
+  static _executable() {
     throw new UnsupportedError("Platform._executable");
   }
-  patch static List<String> _executableArguments() {
+  @patch
+  static List<String> _executableArguments() {
     throw new UnsupportedError("Platform._executableArguments");
   }
-  patch static String _packageRoot() {
+  @patch
+  static String _packageRoot() {
     throw new UnsupportedError("Platform._packageRoot");
   }
-  patch static _environment() {
+  @patch
+  static _environment() {
     throw new UnsupportedError("Platform._environment");
   }
-  patch static String _version() {
+  @patch
+  static String _version() {
     throw new UnsupportedError("Platform._version");
   }
 }
 
-patch class _ProcessUtils {
-  patch static void _exit(int status) {
+@patch
+class _ProcessUtils {
+  @patch
+  static void _exit(int status) {
     throw new UnsupportedError("ProcessUtils._exit");
   }
-  patch static void _setExitCode(int status) {
+  @patch
+  static void _setExitCode(int status) {
     throw new UnsupportedError("ProcessUtils._setExitCode");
   }
-  patch static int _getExitCode() {
+  @patch
+  static int _getExitCode() {
     throw new UnsupportedError("ProcessUtils._getExitCode");
   }
-  patch static void _sleep(int millis) {
+  @patch
+  static void _sleep(int millis) {
     throw new UnsupportedError("ProcessUtils._sleep");
   }
-  patch static int _pid(Process process) {
+  @patch
+  static int _pid(Process process) {
     throw new UnsupportedError("ProcessUtils._pid");
   }
-  patch static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
+  @patch
+  static Stream<ProcessSignal> _watchSignal(ProcessSignal signal) {
     throw new UnsupportedError("ProcessUtils._watchSignal");
   }
 }
 
-patch class Process {
-  patch static Future<Process> start(
+@patch
+class Process {
+  @patch
+  static Future<Process> start(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -207,7 +275,8 @@
     throw new UnsupportedError("Process.start");
   }
 
-  patch static Future<ProcessResult> run(
+  @patch
+  static Future<ProcessResult> run(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -219,7 +288,8 @@
     throw new UnsupportedError("Process.run");
   }
 
-  patch static ProcessResult runSync(
+  @patch
+  static ProcessResult runSync(
       String executable,
       List<String> arguments,
       {String workingDirectory,
@@ -232,30 +302,39 @@
   }
 }
 
-patch class InternetAddress {
-  patch static InternetAddress get LOOPBACK_IP_V4 {
+@patch
+class InternetAddress {
+  @patch
+  static InternetAddress get LOOPBACK_IP_V4 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V4");
   }
-  patch static InternetAddress get LOOPBACK_IP_V6 {
+  @patch
+  static InternetAddress get LOOPBACK_IP_V6 {
     throw new UnsupportedError("InternetAddress.LOOPBACK_IP_V6");
   }
-  patch static InternetAddress get ANY_IP_V4 {
+  @patch
+  static InternetAddress get ANY_IP_V4 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V4");
   }
-  patch static InternetAddress get ANY_IP_V6 {
+  @patch
+  static InternetAddress get ANY_IP_V6 {
     throw new UnsupportedError("InternetAddress.ANY_IP_V6");
   }
-  patch factory InternetAddress(String address) {
+  @patch
+  factory InternetAddress(String address) {
     throw new UnsupportedError("InternetAddress");
   }
-  patch static Future<List<InternetAddress>> lookup(
+  @patch
+  static Future<List<InternetAddress>> lookup(
       String host, {InternetAddressType type: InternetAddressType.ANY}) {
     throw new UnsupportedError("InternetAddress.lookup");
   }
 }
 
-patch class NetworkInterface {
-  patch static Future<List<NetworkInterface>> list({
+@patch
+class NetworkInterface {
+  @patch
+  static Future<List<NetworkInterface>> list({
       bool includeLoopback: false,
       bool includeLinkLocal: false,
       InternetAddressType type: InternetAddressType.ANY}) {
@@ -263,143 +342,185 @@
   }
 }
 
-patch class RawServerSocket {
-  patch static Future<RawServerSocket> bind(address,
-                                            int port,
-                                            {int backlog: 0,
-                                             bool v6Only: false}) {
+@patch
+class RawServerSocket {
+  @patch
+  static Future<RawServerSocket> bind(address,
+                                      int port,
+                                      {int backlog: 0,
+                                       bool v6Only: false}) {
     throw new UnsupportedError("RawServerSocket.bind");
   }
 }
 
-patch class ServerSocket {
-  patch static Future<ServerSocket> bind(address,
-                                         int port,
-                                         {int backlog: 0,
-                                          bool v6Only: false}) {
+@patch
+class ServerSocket {
+  @patch
+  static Future<ServerSocket> bind(address,
+                                   int port,
+                                   {int backlog: 0,
+                                    bool v6Only: false}) {
     throw new UnsupportedError("ServerSocket.bind");
   }
 }
 
-patch class RawSocket {
-  patch static Future<RawSocket> connect(host, int port) {
+@patch
+class RawSocket {
+  @patch
+  static Future<RawSocket> connect(host, int port) {
     throw new UnsupportedError("RawSocket constructor");
   }
 }
 
-patch class Socket {
-  patch static Future<Socket> connect(host, int port) {
+@patch
+class Socket {
+  @patch
+  static Future<Socket> connect(host, int port) {
     throw new UnsupportedError("Socket constructor");
   }
 }
 
-patch class SecureSocket {
-  patch factory SecureSocket._(RawSecureSocket rawSocket) {
+@patch
+class SecureSocket {
+  @patch
+  factory SecureSocket._(RawSecureSocket rawSocket) {
     throw new UnsupportedError("SecureSocket constructor");
   }
 
-  patch static void initialize({String database,
-                                String password,
-                                bool useBuiltinRoots: true}) {
+  @patch
+  static void initialize({String database,
+                          String password,
+                          bool useBuiltinRoots: true}) {
     throw new UnsupportedError("SecureSocket.initialize");
   }
 }
 
-patch class RawDatagramSocket {
-  patch static Future<RawDatagramSocket> bind(
+@patch
+class RawDatagramSocket {
+  @patch
+  static Future<RawDatagramSocket> bind(
       host, int port, {bool reuseAddress: true}) {
     throw new UnsupportedError("RawDatagramSocket.bind");
   }
 }
 
-patch class _SecureFilter {
-  patch factory _SecureFilter() {
+@patch
+class _SecureFilter {
+  @patch
+  factory _SecureFilter() {
     throw new UnsupportedError("_SecureFilter._SecureFilter");
   }
 }
 
-patch class _StdIOUtils {
-  patch static Stdin _getStdioInputStream() {
+@patch
+class _StdIOUtils {
+  @patch
+  static Stdin _getStdioInputStream() {
     throw new UnsupportedError("StdIOUtils._getStdioInputStream");
   }
-  patch static _getStdioOutputStream(int fd) {
+  @patch
+  static _getStdioOutputStream(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioOutputStream");
   }
-  patch static int _socketType(nativeSocket) {
+  @patch
+  static int _socketType(nativeSocket) {
     throw new UnsupportedError("StdIOUtils._socketType");
   }
-  patch static _getStdioHandleType(int fd) {
+  @patch
+  static _getStdioHandleType(int fd) {
     throw new UnsupportedError("StdIOUtils._getStdioHandleType");
   }
 }
 
-patch class _WindowsCodePageDecoder {
-  patch static String _decodeBytes(List<int> bytes) {
+@patch
+class _WindowsCodePageDecoder {
+  @patch
+  static String _decodeBytes(List<int> bytes) {
     throw new UnsupportedError("_WindowsCodePageDecoder._decodeBytes");
   }
 }
 
-patch class _WindowsCodePageEncoder {
-  patch static List<int> _encodeString(String string) {
+@patch
+class _WindowsCodePageEncoder {
+  @patch
+  static List<int> _encodeString(String string) {
     throw new UnsupportedError("_WindowsCodePageEncoder._encodeString");
   }
 }
 
-patch class _Filter {
-  patch static _Filter newZLibDeflateFilter(bool gzip, int level,
-                                            int windowBits, int memLevel,
-                                            int strategy,
-                                            List<int> dictionary, bool raw) {
+@patch
+class _Filter {
+  @patch
+  static _Filter newZLibDeflateFilter(bool gzip, int level,
+                                      int windowBits, int memLevel,
+                                      int strategy,
+                                      List<int> dictionary, bool raw) {
     throw new UnsupportedError("newZLibDeflateFilter");
   }
-  patch static _Filter newZLibInflateFilter(int windowBits,
-                                            List<int> dictionary, bool raw) {
+  @patch
+  static _Filter newZLibInflateFilter(int windowBits,
+                                      List<int> dictionary, bool raw) {
     throw new UnsupportedError("newZLibInflateFilter");
   }
 }
 
-patch class Stdin {
-  patch int readByteSync() {
+@patch
+class Stdin {
+  @patch
+  int readByteSync() {
     throw new UnsupportedError("Stdin.readByteSync");
   }
-  patch bool get echoMode {
+  @patch
+  bool get echoMode {
     throw new UnsupportedError("Stdin.echoMode");
   }
-  patch void set echoMode(bool enabled) {
+  @patch
+  void set echoMode(bool enabled) {
     throw new UnsupportedError("Stdin.echoMode");
   }
-  patch bool get lineMode {
+  @patch
+  bool get lineMode {
     throw new UnsupportedError("Stdin.lineMode");
   }
-  patch void set lineMode(bool enabled) {
+  @patch
+  void set lineMode(bool enabled) {
     throw new UnsupportedError("Stdin.lineMode");
   }
 }
 
-patch class Stdout {
-  patch bool get hasTerminal {
+@patch
+class Stdout {
+  @patch
+  bool get hasTerminal {
     throw new UnsupportedError("Stdout.hasTerminal");
   }
-  patch int get terminalColumns {
+  @patch
+  int get terminalColumns {
     throw new UnsupportedError("Stdout.terminalColumns");
   }
-  patch int get terminalLines {
+  @patch
+  int get terminalLines {
     throw new UnsupportedError("Stdout.terminalLines");
   }
 }
 
-patch class _FileSystemWatcher {
-  patch static Stream<FileSystemEvent> watch(
+@patch
+class _FileSystemWatcher {
+  @patch
+  static Stream<FileSystemEvent> watch(
       String path, int events, bool recursive) {
     throw new UnsupportedError("_FileSystemWatcher.watch");
   }
-  patch static bool get isSupported {
+  @patch
+  static bool get isSupported {
     throw new UnsupportedError("_FileSystemWatcher.isSupported");
   }
 }
 
-patch class _IOService {
-  patch static Future dispatch(int request, List data) {
+@patch
+class _IOService {
+  @patch
+  static Future dispatch(int request, List data) {
     throw new UnsupportedError("_IOService.dispatch");
   }
 }
diff --git a/sdk/lib/_internal/lib/isolate_helper.dart b/sdk/lib/_internal/lib/isolate_helper.dart
index 06176b2..a81aadf 100644
--- a/sdk/lib/_internal/lib/isolate_helper.dart
+++ b/sdk/lib/_internal/lib/isolate_helper.dart
@@ -228,14 +228,23 @@
         "(function (f, a) { return function (e) { f(a, e); }})(#, #)",
         DART_CLOSURE_TO_JS(IsolateNatives._processWorkerMessage),
         mainManager);
-    JS("void", r"#.onmessage = #", globalThis, function);
-    // We define dartPrint so that the implementation of the Dart
+    JS("void", r"self.onmessage = #", function);
+    // We ensure dartPrint is defined so that the implementation of the Dart
     // print method knows what to call.
-    // TODO(ngeoffray): Should we forward to the main isolate? What if
-    // it exited?
-    JS('void', r'#.dartPrint = function (object) {}', globalThis);
+    JS('', '''self.dartPrint = self.dartPrint || (function(serialize) {
+  return function (object) {
+    if (self.console && self.console.log) {
+      self.console.log(object)
+    } else {
+      self.postMessage(serialize(object));
+    }
+  }
+})(#)''', DART_CLOSURE_TO_JS(_serializePrintMessage));
   }
 
+  static _serializePrintMessage(object) {
+    return _serializeMessage({"command": "print", "msg": object});
+  }
 
   /**
    * Close the worker running this code if all isolates are done and
@@ -403,10 +412,8 @@
         // don't print it.
         return;
       }
-      if (JS('bool', '#.console != null && '
-                     'typeof #.console.error == "function"',
-                     globalThis, globalThis)) {
-        JS('void', '#.console.error(#, #)', globalThis, error, stackTrace);
+      if (JS('bool', 'self.console && self.console.error')) {
+        JS('void', 'self.console.error(#, #)', error, stackTrace);
       } else {
         print(error);
         if (stackTrace != null) print(stackTrace);
@@ -685,11 +692,9 @@
 const String _SPAWNED_SIGNAL = "spawned";
 const String _SPAWN_FAILED_SIGNAL = "spawn failed";
 
-var globalThis = Primitives.computeGlobalThis();
-var globalWindow = JS('', "#.window", globalThis);
-var globalWorker = JS('', "#.Worker", globalThis);
-bool globalPostMessageDefined =
-    JS('', "#.postMessage !== (void 0)", globalThis);
+get globalWindow => JS('', "self.window");
+get globalWorker => JS('', "self.Worker");
+bool get globalPostMessageDefined => JS('bool', "!!self.postMessage");
 
 typedef _MainFunction();
 typedef _MainFunctionArgs(args);
@@ -699,6 +704,15 @@
 /// when 'dart:isolate' has been imported.
 class IsolateNatives {
 
+  // We set [enableSpawnWorker] to true (not null) when calling isolate
+  // primitives that require support for spawning workers. The field starts out
+  // by being null, and dart2js' type inference will track if it can have a
+  // non-null value. So by testing if this value is not null, we generate code
+  // that dart2js knows is dead when worker support isn't needed.
+  // TODO(herhut): Initialize this to false when able to track compile-time
+  // constants.
+  static var enableSpawnWorker;
+
   static String thisScript = computeThisScript();
 
   /// Associates an ID with a native worker object.
@@ -803,14 +817,7 @@
         _globalState.topEventLoop.run();
         break;
       case 'spawn-worker':
-        var replyPort = msg['replyPort'];
-        spawn(msg['functionName'], msg['uri'],
-              msg['args'], msg['msg'],
-              false, msg['isSpawnUri'], msg['startPaused']).then((msg) {
-          replyPort.send(msg);
-        }, onError: (String errorMessage) {
-          replyPort.send([_SPAWN_FAILED_SIGNAL, errorMessage]);
-        });
+        if (enableSpawnWorker != null) handleSpawnWorkerRequest(msg);
         break;
       case 'message':
         SendPort port = msg['port'];
@@ -841,6 +848,17 @@
     }
   }
 
+  static handleSpawnWorkerRequest(msg) {
+    var replyPort = msg['replyPort'];
+    spawn(msg['functionName'], msg['uri'],
+          msg['args'], msg['msg'],
+          false, msg['isSpawnUri'], msg['startPaused']).then((msg) {
+      replyPort.send(msg);
+    }, onError: (String errorMessage) {
+      replyPort.send([_SPAWN_FAILED_SIGNAL, errorMessage]);
+    });
+  }
+
   /** Log a message, forwarding to the main [_Manager] if appropriate. */
   static _log(msg) {
     if (_globalState.isWorker) {
@@ -856,7 +874,7 @@
   }
 
   static void _consoleLog(msg) {
-    JS("void", r"#.console.log(#)", globalThis, msg);
+    JS("void", r"self.console.log(#)", msg);
   }
 
   static _getJSFunctionFromName(String functionName) {
@@ -880,6 +898,7 @@
   static Future<List> spawnFunction(void topLevelFunction(message),
                                     var message,
                                     bool startPaused) {
+    IsolateNatives.enableSpawnWorker = true;
     final name = _getJSFunctionName(topLevelFunction);
     if (name == null) {
       throw new UnsupportedError(
@@ -892,6 +911,7 @@
 
   static Future<List> spawnUri(Uri uri, List<String> args, var message,
                                bool startPaused) {
+    IsolateNatives.enableSpawnWorker = true;
     bool isLight = false;
     bool isSpawnUri = true;
     return spawn(null, uri.toString(), args, message,
@@ -1697,8 +1717,7 @@
 
       enterJsAsync();
 
-      _handle = JS('int', '#.setTimeout(#, #)',
-                   globalThis,
+      _handle = JS('int', 'self.setTimeout(#, #)',
                    convertDartClosureToJS(internalCallback, 0),
                    milliseconds);
     } else {
@@ -1711,8 +1730,7 @@
       : _once = false {
     if (hasTimer()) {
       enterJsAsync();
-      _handle = JS('int', '#.setInterval(#, #)',
-                   globalThis,
+      _handle = JS('int', 'self.setInterval(#, #)',
                    convertDartClosureToJS(() { callback(this); }, 0),
                    milliseconds);
     } else {
@@ -1728,9 +1746,9 @@
       if (_handle == null) return;
       leaveJsAsync();
       if (_once) {
-        JS('void', '#.clearTimeout(#)', globalThis, _handle);
+        JS('void', 'self.clearTimeout(#)', _handle);
       } else {
-        JS('void', '#.clearInterval(#)', globalThis, _handle);
+        JS('void', 'self.clearInterval(#)', _handle);
       }
       _handle = null;
     } else {
@@ -1741,7 +1759,7 @@
   bool get isActive => _handle != null;
 }
 
-bool hasTimer() => JS('', '#.setTimeout', globalThis) != null;
+bool hasTimer() => JS('', 'self.setTimeout') != null;
 
 
 /**
diff --git a/sdk/lib/_internal/lib/isolate_patch.dart b/sdk/lib/_internal/lib/isolate_patch.dart
index 78a8ca9..dc41e53 100644
--- a/sdk/lib/_internal/lib/isolate_patch.dart
+++ b/sdk/lib/_internal/lib/isolate_patch.dart
@@ -4,6 +4,7 @@
 
 // Patch file for the dart:isolate library.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_isolate_helper' show CapabilityImpl,
                                    CloseToken,
                                    IsolateNatives,
@@ -11,8 +12,10 @@
                                    ReceivePortImpl,
                                    RawReceivePortImpl;
 
-patch class Isolate {
-  patch static Future<Isolate> spawn(void entryPoint(message), var message,
+@patch
+class Isolate {
+  @patch
+  static Future<Isolate> spawn(void entryPoint(message), var message,
                                      { bool paused: false }) {
     try {
       return IsolateNatives.spawnFunction(entryPoint, message, paused)
@@ -24,7 +27,8 @@
     }
   }
 
-  patch static Future<Isolate> spawnUri(
+  @patch
+  static Future<Isolate> spawnUri(
       Uri uri, List<String> args, var message, { bool paused: false }) {
     try {
       if (args is List<String>) {
@@ -45,7 +49,8 @@
     }
   }
 
-  patch void _pause(Capability resumeCapability) {
+  @patch
+  void _pause(Capability resumeCapability) {
     var message = new List(3)
         ..[0] = "pause"
         ..[1] = pauseCapability
@@ -53,14 +58,16 @@
     controlPort.send(message);
   }
 
-  patch void resume(Capability resumeCapability) {
+  @patch
+  void resume(Capability resumeCapability) {
     var message = new List(2)
         ..[0] = "resume"
         ..[1] = resumeCapability;
     controlPort.send(message);
   }
 
-  patch void addOnExitListener(SendPort responsePort) {
+  @patch
+  void addOnExitListener(SendPort responsePort) {
     // TODO(lrn): Can we have an internal method that checks if the receiving
     // isolate of a SendPort is still alive?
     var message = new List(2)
@@ -69,14 +76,16 @@
     controlPort.send(message);
   }
 
-  patch void removeOnExitListener(SendPort responsePort) {
+  @patch
+  void removeOnExitListener(SendPort responsePort) {
     var message = new List(2)
         ..[0] = "remove-ondone"
         ..[1] = responsePort;
     controlPort.send(message);
   }
 
-  patch void setErrorsFatal(bool errorsAreFatal) {
+  @patch
+  void setErrorsFatal(bool errorsAreFatal) {
     var message = new List(3)
         ..[0] = "set-errors-fatal"
         ..[1] = terminateCapability
@@ -84,11 +93,13 @@
     controlPort.send(message);
   }
 
-  patch void kill([int priority = BEFORE_NEXT_EVENT]) {
+  @patch
+  void kill([int priority = BEFORE_NEXT_EVENT]) {
     controlPort.send(["kill", terminateCapability, priority]);
   }
 
-  patch void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
+  @patch
+  void ping(SendPort responsePort, [int pingType = IMMEDIATE]) {
     var message = new List(3)
         ..[0] = "ping"
         ..[1] = responsePort
@@ -96,14 +107,16 @@
     controlPort.send(message);
   }
 
-  patch void addErrorListener(SendPort port) {
+  @patch
+  void addErrorListener(SendPort port) {
     var message = new List(2)
         ..[0] = "getErrors"
         ..[1] = port;
     controlPort.send(message);
   }
 
-  patch void removeErrorListener(SendPort port) {
+  @patch
+  void removeErrorListener(SendPort port) {
     var message = new List(2)
         ..[0] = "stopErrors"
         ..[1] = port;
@@ -112,20 +125,27 @@
 }
 
 /** Default factory for receive ports. */
-patch class ReceivePort {
-  patch factory ReceivePort() = ReceivePortImpl;
+@patch
+class ReceivePort {
+  @patch
+  factory ReceivePort() = ReceivePortImpl;
 
-  patch factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
+  @patch
+  factory ReceivePort.fromRawReceivePort(RawReceivePort rawPort) {
     return new ReceivePortImpl.fromRawReceivePort(rawPort);
   }
 }
 
-patch class RawReceivePort {
-  patch factory RawReceivePort([void handler(event)]) {
+@patch
+class RawReceivePort {
+  @patch
+  factory RawReceivePort([void handler(event)]) {
     return new RawReceivePortImpl(handler);
   }
 }
 
-patch class Capability {
-  patch factory Capability() = CapabilityImpl;
+@patch
+class Capability {
+  @patch
+  factory Capability() = CapabilityImpl;
 }
diff --git a/sdk/lib/_internal/lib/js_helper.dart b/sdk/lib/_internal/lib/js_helper.dart
index d820c22..931f2d0 100644
--- a/sdk/lib/_internal/lib/js_helper.dart
+++ b/sdk/lib/_internal/lib/js_helper.dart
@@ -58,6 +58,12 @@
 part 'string_helper.dart';
 part 'js_rti.dart';
 
+class _Patch {
+  const _Patch();
+}
+
+const _Patch patch = const _Patch();
+
 bool isJsIndexable(var object, var record) {
   if (record != null) {
     var result = dispatchRecordIndexability(record);
@@ -108,6 +114,19 @@
       "because it is not included in a @MirrorsUsed annotation.");
 }
 
+/// Helper to print the given method information to the console the first
+/// time it is called with it.
+@NoInline()
+void traceHelper(String method) {
+  if (JS('bool', '!this.cache')) {
+    JS('', 'this.cache = Object.create(null)');
+  }
+  if (JS('bool', '!this.cache[#]', method)) {
+    JS('', 'console.log(#)', method);
+    JS('', 'this.cache[#] = true', method);
+  }
+}
+
 class JSInvocationMirror implements Invocation {
   static const METHOD = 0;
   static const GETTER = 1;
@@ -533,8 +552,6 @@
     return JS('int', '#', hash);
   }
 
-  static computeGlobalThis() => JS('', 'function() { return this; }()');
-
   static _throwFormatException(String string) {
     throw new FormatException(string);
   }
@@ -678,17 +695,24 @@
 
   static num dateNow() => JS('num', r'Date.now()');
 
-  static num numMicroseconds() {
-    if (JS('bool', 'typeof window != "undefined" && window !== null')) {
-      var performance = JS('var', 'window.performance');
-      if (performance != null &&
-          JS('bool', 'typeof #.webkitNow == "function"', performance)) {
-        return (1000 * JS('num', '#.webkitNow()', performance)).floor();
-      }
-    }
-    return 1000 * dateNow();
+  static void initTicker() {
+    if (timerFrequency != null) return;
+    // Start with low-resolution. We overwrite the fields if we find better.
+    timerFrequency = 1000;
+    timerTicks = dateNow;
+    if (JS('bool', 'typeof window == "undefined"')) return;
+    var window = JS('var', 'window');
+    if (window == null) return;
+    var performance = JS('var', '#.performance', window);
+    if (performance == null) return;
+    if (JS('bool', 'typeof #.now != "function"', performance)) return;
+    timerFrequency = 1000000;
+    timerTicks = () => (1000 * JS('num', '#.now()', performance)).floor();
   }
 
+  static int timerFrequency;
+  static Function timerTicks;
+
   static bool get isD8 {
     return JS('bool',
               'typeof version == "function"'
@@ -702,30 +726,11 @@
 
   static String currentUri() {
     // In a browser return self.location.href.
-    if (JS('bool', 'typeof self != "undefined"')) {
+    if (JS('bool', '!!self.location')) {
       return JS('String', 'self.location.href');
     }
 
-    // In JavaScript shells try to determine the current working
-    // directory.
-    var workingDirectory;
-    if (isD8) {
-      // TODO(sgjesse): This does not work on Windows.
-      workingDirectory = JS('String', 'os.system("pwd")');
-      var length = workingDirectory.length;
-      if (workingDirectory[length - 1] == '\n') {
-        workingDirectory = workingDirectory.substring(0, length - 1);
-      }
-    }
-
-    if (isJsshell) {
-      // TODO(sgjesse): This does not work on Windows.
-      workingDirectory = JS('String', 'environment["PWD"]');
-    }
-
-    return workingDirectory != null
-        ? "file://" + workingDirectory + "/"
-        : null;
+    return null;
   }
 
   // This is to avoid stack overflows due to very large argument arrays in
@@ -2789,7 +2794,7 @@
   String toString() => "RuntimeError: $message";
 }
 
-class DeferredNotLoadedError extends Error {
+class DeferredNotLoadedError extends Error implements NoSuchMethodError {
   String libraryName;
 
   DeferredNotLoadedError(this.libraryName);
diff --git a/sdk/lib/_internal/lib/math_patch.dart b/sdk/lib/_internal/lib/math_patch.dart
index 2ba47aa..0a43708 100644
--- a/sdk/lib/_internal/lib/math_patch.dart
+++ b/sdk/lib/_internal/lib/math_patch.dart
@@ -4,39 +4,50 @@
 
 // Patch file for dart:math library.
 import 'dart:_foreign_helper' show JS;
-import 'dart:_js_helper' show checkNum;
+import 'dart:_js_helper' show patch, checkNum;
 
-patch double sqrt(num x)
+@patch
+double sqrt(num x)
   => JS('double', r'Math.sqrt(#)', checkNum(x));
 
-patch double sin(num x)
+@patch
+double sin(num x)
   => JS('double', r'Math.sin(#)', checkNum(x));
 
-patch double cos(num x)
+@patch
+double cos(num x)
   => JS('double', r'Math.cos(#)', checkNum(x));
 
-patch double tan(num x)
+@patch
+double tan(num x)
   => JS('double', r'Math.tan(#)', checkNum(x));
 
-patch double acos(num x)
+@patch
+double acos(num x)
   => JS('double', r'Math.acos(#)', checkNum(x));
 
-patch double asin(num x)
+@patch
+double asin(num x)
   => JS('double', r'Math.asin(#)', checkNum(x));
 
-patch double atan(num x)
+@patch
+double atan(num x)
   => JS('double', r'Math.atan(#)', checkNum(x));
 
-patch double atan2(num a, num b)
+@patch
+double atan2(num a, num b)
   => JS('double', r'Math.atan2(#, #)', checkNum(a), checkNum(b));
 
-patch double exp(num x)
+@patch
+double exp(num x)
   => JS('double', r'Math.exp(#)', checkNum(x));
 
-patch double log(num x)
+@patch
+double log(num x)
   => JS('double', r'Math.log(#)', checkNum(x));
 
-patch num pow(num x, num exponent) {
+@patch
+num pow(num x, num exponent) {
   checkNum(x);
   checkNum(exponent);
   return JS('num', r'Math.pow(#, #)', x, exponent);
@@ -44,8 +55,10 @@
 
 const int _POW2_32 = 0x100000000;
 
-patch class Random {
-  patch factory Random([int seed]) =>
+@patch
+class Random {
+  @patch
+  factory Random([int seed]) =>
       (seed == null) ? const _JSRandom() : new _Random(seed);
 }
 
diff --git a/sdk/lib/_internal/lib/mirrors_patch.dart b/sdk/lib/_internal/lib/mirrors_patch.dart
index 5d4a5fa..758b164 100644
--- a/sdk/lib/_internal/lib/mirrors_patch.dart
+++ b/sdk/lib/_internal/lib/mirrors_patch.dart
@@ -4,21 +4,28 @@
 
 // Patch library for dart:mirrors.
 
+import 'dart:_js_helper' show patch;
 import 'dart:_js_mirrors' as js;
 
-patch class MirrorSystem {
-  patch static String getName(Symbol symbol) => js.getName(symbol);
+@patch
+class MirrorSystem {
+  @patch
+  static String getName(Symbol symbol) => js.getName(symbol);
 
-  patch static Symbol getSymbol(String name, [LibraryMirror library]) {
+  @patch
+  static Symbol getSymbol(String name, [LibraryMirror library]) {
     return js.getSymbol(name, library);
   }
 }
 
-patch MirrorSystem currentMirrorSystem() => js.currentJsMirrorSystem;
+@patch
+MirrorSystem currentMirrorSystem() => js.currentJsMirrorSystem;
 
-patch InstanceMirror reflect(Object reflectee) => js.reflect(reflectee);
+@patch
+InstanceMirror reflect(Object reflectee) => js.reflect(reflectee);
 
-patch ClassMirror reflectClass(Type key) {
+@patch
+ClassMirror reflectClass(Type key) {
   if (key is! Type || key == dynamic) {
     throw new ArgumentError('$key does not denote a class');
   }
@@ -29,7 +36,8 @@
   return (tm as ClassMirror).originalDeclaration;
 }
 
-patch TypeMirror reflectType(Type key) {
+@patch
+TypeMirror reflectType(Type key) {
   if (key == dynamic) {
     return currentMirrorSystem().dynamicType;
   }
diff --git a/sdk/lib/_internal/lib/native_helper.dart b/sdk/lib/_internal/lib/native_helper.dart
index 8f96d07..e865d99 100644
--- a/sdk/lib/_internal/lib/native_helper.dart
+++ b/sdk/lib/_internal/lib/native_helper.dart
@@ -463,7 +463,7 @@
     }
   }
   function getUnknownTagGenericBrowser(object, tag) {
-    if (object instanceof HTMLElement) return "HTMLElement";
+    if (self.HTMLElement && object instanceof HTMLElement) return "HTMLElement";
     return getUnknownTag(object, tag);
   }
   function prototypeForTag(tag) {
diff --git a/sdk/lib/_internal/lib/preambles/d8.js b/sdk/lib/_internal/lib/preambles/d8.js
index e965083..aed0161 100644
--- a/sdk/lib/_internal/lib/preambles/d8.js
+++ b/sdk/lib/_internal/lib/preambles/d8.js
@@ -4,14 +4,34 @@
 
 // Javascript preamble, that lets the output of dart2js run on V8's d8 shell.
 
-var setTimeout;
-var clearTimeout;
-var setInterval;
-var clearInterval;
-var dartMainRunner;
-var scheduleImmediate;
+// Node wraps files and provides them with a different `this`. The global
+// `this` can be accessed through `global`.
 
-(function() {
+var self = this;
+if (typeof global != "undefined") self = global;  // Node.js.
+
+(function(self) {
+  // Using strict mode to avoid accidentally defining global variables.
+  "use strict"; // Should be first statement of this function.
+
+  // Location (Uri.base)
+
+  var workingDirectory;
+  // TODO(sgjesse): This does not work on Windows.
+  if (typeof os == "object" && "system" in os) {
+    // V8.
+    workingDirectory = os.system("pwd");
+    var length = workingDirectory.length;
+    if (workingDirectory[length - 1] == '\n') {
+      workingDirectory = workingDirectory.substring(0, length - 1);
+    }
+  } else if (typeof process != "undefined" &&
+             typeof process.cwd == "function") {
+    // Node.js.
+    workingDirectory = process.cwd();
+  }
+  self.location = { href: "file://" + workingDirectory + "/" };
+
   // Event loop.
 
   // Task queue as cyclic list queue.
@@ -247,14 +267,17 @@
     }
   }
 
-  dartMainRunner = function(main, args) {
+  // Global properties. "self" refers to the global object, so adding a
+  // property to "self" defines a global variable.
+  self.dartMainRunner = function(main, args) {
     // Initialize.
     var action = function() { main(args); }
     eventLoop(action);
   };
-  setTimeout = addTimer;
-  clearTimeout = cancelTimer;
-  setInterval = addInterval;
-  clearInterval = cancelTimer;
-  scheduleImmediate = addTask;
-})();
+  self.setTimeout = addTimer;
+  self.clearTimeout = cancelTimer;
+  self.setInterval = addInterval;
+  self.clearInterval = cancelTimer;
+  self.scheduleImmediate = addTask;
+  self.self = self;
+})(self);
diff --git a/sdk/lib/_internal/lib/preambles/jsshell.js b/sdk/lib/_internal/lib/preambles/jsshell.js
index f24555f..8f13bcc 100644
--- a/sdk/lib/_internal/lib/preambles/jsshell.js
+++ b/sdk/lib/_internal/lib/preambles/jsshell.js
@@ -3,3 +3,17 @@
 // BSD-style license that can be found in the LICENSE file.
 
 // Javascript preamble, that lets the output of dart2js run on JSShell.
+
+(function(self) {
+  // Using strict mode to avoid accidentally defining global variables.
+  "use strict"; // Should be first statement of this function.
+
+  // Location (Uri.base)
+
+  var workingDirectory = environment["PWD"];
+  self.location = { href: "file://" + workingDirectory + "/" };
+
+  // Global properties. "self" refers to the global object, so adding a
+  // property to "self" defines a global variable.
+  self.self = self;
+})(this)
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize.dart b/sdk/lib/_internal/pub/asset/dart/serialize.dart
index 43328e1..5e32378 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize.dart
@@ -11,7 +11,9 @@
 import 'package:source_maps/span.dart';
 
 import 'serialize/exception.dart';
+import 'utils.dart';
 
+export 'serialize/aggregate_transform.dart';
 export 'serialize/exception.dart';
 export 'serialize/transform.dart';
 export 'serialize/transformer.dart';
@@ -61,6 +63,60 @@
       location['line'], location['column']);
 }
 
+/// Converts [stream] into a serializable map.
+///
+/// [serializeEvent] is used to serialize each event from the stream.
+Map serializeStream(Stream stream, serializeEvent(event)) {
+  var receivePort = new ReceivePort();
+  var map = {'replyTo': receivePort.sendPort};
+
+  receivePort.first.then((message) {
+    var sendPort = message['replyTo'];
+    stream.listen((event) {
+      sendPort.send({
+        'type': 'event',
+        'value': serializeEvent(event)
+      });
+    }, onError: (error, stackTrace) {
+      sendPort.send({
+        'type': 'error',
+        'error': serializeException(error, stackTrace)
+      });
+    }, onDone: () => sendPort.send({'type': 'done'}));
+  });
+
+  return map;
+}
+
+/// Converts a serializable map into a [Stream].
+///
+/// [deserializeEvent] is used to deserialize each event from the stream.
+Stream deserializeStream(Map stream, deserializeEvent(event)) {
+  return callbackStream(() {
+    var receivePort = new ReceivePort();
+    stream['replyTo'].send({'replyTo': receivePort.sendPort});
+
+    var controller = new StreamController(sync: true);
+    receivePort.listen((event) {
+      switch (event['type']) {
+        case 'event':
+          controller.add(deserializeEvent(event['value']));
+          break;
+        case 'error':
+          var exception = deserializeException(event['error']);
+          controller.addError(exception, exception.stackTrace);
+          break;
+        case 'done':
+          controller.close();
+          receivePort.close();
+          break;
+      }
+    });
+
+    return controller.stream;
+  });
+}
+
 /// Wraps [message] and sends it across [port], then waits for a response which
 /// should be sent using [respond].
 ///
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart
new file mode 100644
index 0000000..5b7acc8
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/aggregate_transform.dart
@@ -0,0 +1,173 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.asset.serialize.aggregate_transform;
+
+import 'dart:async';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+// TODO(nweiz): don't import from "src" once issue 14966 is fixed.
+import 'package:barback/src/internal_asset.dart';
+
+import '../serialize.dart';
+import 'get_input_transform.dart';
+
+/// Serialize the methods shared between [AggregateTransform] and
+/// [DeclaringAggregateTransform].
+///
+/// [additionalFields] contains additional serialized fields to add to the
+/// serialized transform. [methodHandlers] is a set of additional methods. Each
+/// value should take a JSON message and return the response (which may be a
+/// Future).
+Map _serializeBaseAggregateTransform(transform, Map additionalFields,
+    Map<String, Function> methodHandlers) {
+  var receivePort = new ReceivePort();
+  receivePort.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      var handler = methodHandlers[message['type']];
+      if (handler != null) return handler(message);
+
+      if (message['type'] == 'consumePrimary') {
+        transform.consumePrimary(deserializeId(message['assetId']));
+        return null;
+      }
+
+      assert(message['type'] == 'log');
+      var method = {
+        'Info': transform.logger.info,
+        'Fine': transform.logger.fine,
+        'Warning': transform.logger.warning,
+        'Error': transform.logger.error
+      }[message['level']];
+      assert(method != null);
+
+      var assetId = message['assetId'] == null ? null :
+        deserializeId(message['assetId']);
+      var span = message['span'] == null ? null :
+        deserializeSpan(message['span']);
+      method(message['message'], asset: assetId, span: span);
+    });
+  });
+
+  return {
+    'port': receivePort.sendPort,
+    'key': transform.key,
+    'package': transform.package
+  }..addAll(additionalFields);
+}
+
+/// Converts [transform] into a serializable map.
+Map serializeAggregateTransform(AggregateTransform transform) {
+  return _serializeBaseAggregateTransform(transform, {
+    'primaryInputs': serializeStream(transform.primaryInputs, serializeAsset)
+  }, {
+    'getInput': (message) => transform.getInput(deserializeId(message['id']))
+        .then((asset) => serializeAsset(asset)),
+    'addOutput': (message) =>
+        transform.addOutput(deserializeAsset(message['output']))
+  });
+}
+
+/// Converts [transform] into a serializable map.
+Map serializeDeclaringAggregateTransform(
+    DeclaringAggregateTransform transform) {
+  return _serializeBaseAggregateTransform(transform, {
+    'primaryIds': serializeStream(transform.primaryIds, serializeId)
+  }, {
+    'declareOutput': (message) =>
+        transform.declareOutput(deserializeId(message['output']))
+  });
+}
+
+/// The base class for wrappers for [AggregateTransform]s that are in the host
+/// isolate.
+class _ForeignBaseAggregateTransform {
+  /// The port with which we communicate with the host isolate.
+  ///
+  /// This port and all messages sent across it are specific to this transform.
+  final SendPort _port;
+
+  final String key;
+
+  final String package;
+
+  TransformLogger get logger => _logger;
+  TransformLogger _logger;
+
+  _ForeignBaseAggregateTransform(Map transform)
+      : _port = transform['port'],
+        key = transform['key'],
+        package = transform['package'] {
+    _logger = new TransformLogger((assetId, level, message, span) {
+      call(_port, {
+        'type': 'log',
+        'level': level.name,
+        'message': message,
+        'assetId': assetId == null ? null : serializeId(assetId),
+        'span': span == null ? null : serializeSpan(span)
+      });
+    });
+  }
+
+  void consumePrimary(AssetId id) {
+    call(_port, {'type': 'consumePrimary', 'assetId': serializeId(id)});
+  }
+}
+
+// We can get away with only removing the class declarations in incompatible
+// barback versions because merely referencing undefined types in type
+// annotations isn't a static error. Only implementing an undefined interface is
+// a static error.
+//# if barback >=0.14.1
+
+/// A wrapper for an [AggregateTransform] that's in the host isolate.
+///
+/// This retrieves inputs from and sends outputs and logs to the host isolate.
+class ForeignAggregateTransform extends _ForeignBaseAggregateTransform
+    with GetInputTransform implements AggregateTransform {
+  final Stream<Asset> primaryInputs;
+
+  /// Creates a transform from a serialized map sent from the host isolate.
+  ForeignAggregateTransform(Map transform)
+      : primaryInputs = deserializeStream(
+            transform['primaryInputs'], deserializeAsset),
+        super(transform);
+
+  Future<Asset> getInput(AssetId id) {
+    return call(_port, {
+      'type': 'getInput',
+      'id': serializeId(id)
+    }).then(deserializeAsset);
+  }
+
+  void addOutput(Asset output) {
+    call(_port, {
+      'type': 'addOutput',
+      'output': serializeAsset(output)
+    });
+  }
+}
+
+/// A wrapper for a [DeclaringAggregateTransform] that's in the host isolate.
+class ForeignDeclaringAggregateTransform
+    extends _ForeignBaseAggregateTransform
+    implements DeclaringAggregateTransform {
+  final Stream<AssetId> primaryIds;
+
+  /// Creates a transform from a serializable map sent from the host isolate.
+  ForeignDeclaringAggregateTransform(Map transform)
+      : primaryIds = deserializeStream(
+            transform['primaryIds'], deserializeId),
+        super(transform);
+
+  void declareOutput(AssetId id) {
+    call(_port, {
+      'type': 'declareOutput',
+      'output': serializeId(id)
+    });
+  }
+}
+
+//# end
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart
new file mode 100644
index 0000000..9ab6540
--- /dev/null
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/get_input_transform.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.asset.serialize.get_input_transform;
+
+import 'dart:async';
+import 'dart:convert';
+
+import 'package:barback/barback.dart';
+
+import '../utils.dart';
+
+/// A mixin for transforms that support [getInput] and the associated suite of
+/// methods.
+abstract class GetInputTransform {
+  Future<Asset> getInput(AssetId id);
+
+  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
+    if (encoding == null) encoding = UTF8;
+    return getInput(id).then((input) =>
+        input.readAsString(encoding: encoding));
+  }
+
+  Stream<List<int>> readInput(AssetId id) =>
+      futureStream(getInput(id).then((input) => input.read()));
+
+  Future<bool> hasInput(AssetId id) {
+    return getInput(id).then((_) => true).catchError((error) {
+      if (error is AssetNotFoundException && error.id == id) return false;
+      throw error;
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
index 38e2ff1..911f6f6 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transform.dart
@@ -6,14 +6,13 @@
 
 import 'dart:async';
 import 'dart:isolate';
-import 'dart:convert';
 
 import 'package:barback/barback.dart';
 // TODO(nweiz): don't import from "src" once issue 14966 is fixed.
 import 'package:barback/src/internal_asset.dart';
 
 import '../serialize.dart';
-import '../utils.dart';
+import 'get_input_transform.dart';
 
 /// Serialize the methods shared between [Transform] and [DeclaringTransform].
 ///
@@ -107,7 +106,8 @@
 /// A wrapper for a [Transform] that's in the host isolate.
 ///
 /// This retrieves inputs from and sends outputs and logs to the host isolate.
-class ForeignTransform extends _ForeignBaseTransform implements Transform {
+class ForeignTransform extends _ForeignBaseTransform
+    with GetInputTransform implements Transform {
   final Asset primaryInput;
 
   /// Creates a transform from a serialized map sent from the host isolate.
@@ -122,21 +122,6 @@
     }).then(deserializeAsset);
   }
 
-  Future<String> readInputAsString(AssetId id, {Encoding encoding}) {
-    if (encoding == null) encoding = UTF8;
-    return getInput(id).then((input) => input.readAsString(encoding: encoding));
-  }
-
-  Stream<List<int>> readInput(AssetId id) =>
-      futureStream(getInput(id).then((input) => input.read()));
-
-  Future<bool> hasInput(AssetId id) {
-    return getInput(id).then((_) => true).catchError((error) {
-      if (error is AssetNotFoundException && error.id == id) return false;
-      throw error;
-    });
-  }
-
   void addOutput(Asset output) {
     call(_port, {
       'type': 'addOutput',
diff --git a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
index 901a079..0e4d0c4 100644
--- a/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
+++ b/sdk/lib/_internal/pub/asset/dart/serialize/transformer.dart
@@ -52,23 +52,71 @@
   };
 }
 
+/// Converts [transformer] into a serializable map.
+Map _serializeAggregateTransformer(AggregateTransformer transformer) {
+  var port = new ReceivePort();
+  port.listen((wrappedMessage) {
+    respond(wrappedMessage, (message) {
+      if (message['type'] == 'classifyPrimary') {
+        return transformer.classifyPrimary(deserializeId(message['id']));
+      } else if (message['type'] == 'declareOutputs') {
+        return new Future.sync(() {
+          return (transformer as DeclaringAggregateTransformer).declareOutputs(
+              new ForeignDeclaringAggregateTransform(message['transform']));
+        }).then((_) => null);
+      } else {
+        assert(message['type'] == 'apply');
+
+        // Make sure we return null so that if the transformer's [apply] returns
+        // a non-serializable value it doesn't cause problems.
+        return new Future.sync(() {
+          return transformer.apply(
+              new ForeignAggregateTransform(message['transform']));
+        }).then((_) => null);
+      }
+    });
+  });
+
+  var type;
+  if (transformer is LazyAggregateTransformer) {
+    type = 'LazyAggregateTransformer';
+  } else if (transformer is DeclaringAggregateTransformer) {
+    type = 'DeclaringAggregateTransformer';
+  } else {
+    type = 'AggregateTransformer';
+  }
+
+  return {
+    'type': type,
+    'toString': transformer.toString(),
+    'port': port.sendPort
+  };
+}
+
 // Converts [group] into a serializable map.
 Map _serializeTransformerGroup(TransformerGroup group) {
   return {
     'type': 'TransformerGroup',
     'toString': group.toString(),
     'phases': group.phases.map((phase) {
-      return phase.map(serializeTransformerOrGroup).toList();
+      return phase.map(serializeTransformerLike).toList();
     }).toList()
   };
 }
 
-/// Converts [transformerOrGroup] into a serializable map.
-Map serializeTransformerOrGroup(transformerOrGroup) {
-  if (transformerOrGroup is Transformer) {
-    return _serializeTransformer(transformerOrGroup);
+/// Converts [transformerLike] into a serializable map.
+///
+/// [transformerLike] can be a [Transformer], an [AggregateTransformer], or a
+/// [TransformerGroup].
+Map serializeTransformerLike(transformerLike) {
+  if (transformerLike is Transformer) {
+    return _serializeTransformer(transformerLike);
+  } else if (transformerLike is TransformerGroup) {
+    return _serializeTransformerGroup(transformerLike);
   } else {
-    assert(transformerOrGroup is TransformerGroup);
-    return _serializeTransformerGroup(transformerOrGroup);
+    // This has to be last, since "transformerLike is AggregateTransformer" will
+    // throw on older versions of barback.
+    assert(transformerLike is AggregateTransformer);
+    return _serializeAggregateTransformer(transformerLike);
   }
 }
diff --git a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
index 3b66841..a3d6a71 100644
--- a/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
+++ b/sdk/lib/_internal/pub/asset/dart/transformer_isolate.dart
@@ -16,13 +16,15 @@
 void loadTransformers(SendPort replyTo) {
   var port = new ReceivePort();
   replyTo.send(port.sendPort);
-  port.first.then((wrappedMessage) {
+  port.listen((wrappedMessage) {
+    // TODO(nweiz): When issue 19228 is fixed, spin up a separate isolate for
+    // libraries loaded beyond the first so they can run in parallel.
     respond(wrappedMessage, (message) {
       var library = Uri.parse(message['library']);
       var configuration = JSON.decode(message['configuration']);
       var mode = new BarbackMode(message['mode']);
       return _initialize(library, configuration, mode).
-          map(serializeTransformerOrGroup).toList();
+          map(serializeTransformerLike).toList();
     });
   });
 }
@@ -34,6 +36,7 @@
 List _initialize(Uri uri, Map configuration, BarbackMode mode) {
   var mirrors = currentMirrorSystem();
   var transformerClass = reflectClass(Transformer);
+  var aggregateClass = _aggregateTransformerClass;
   var groupClass = reflectClass(TransformerGroup);
 
   var seen = new Set();
@@ -57,7 +60,9 @@
       if (classMirror.isPrivate) return null;
       if (classMirror.isAbstract) return null;
       if (!classMirror.isSubtypeOf(transformerClass) &&
-          !classMirror.isSubtypeOf(groupClass)) {
+          !classMirror.isSubtypeOf(groupClass) &&
+          (aggregateClass == null ||
+              !classMirror.isSubtypeOf(aggregateClass))) {
         return null;
       }
 
@@ -86,3 +91,13 @@
   if (candidate is MethodMirror && candidate.isConstructor) return candidate;
   return null;
 }
+
+// Older barbacks don't support [AggregateTransformer], and calling
+// [reflectClass] on an undefined class will throw an error, so we just define a
+// null getter for them.
+//# if barback >=0.14.1
+ClassMirror get _aggregateTransformerClass =>
+    reflectClass(AggregateTransformer);
+//# else
+//>   ClassMirror get _aggregateTransformerClass => null;
+//# end
diff --git a/sdk/lib/_internal/pub/bin/pub.dart b/sdk/lib/_internal/pub/bin/pub.dart
index 496a35b..7c59427 100644
--- a/sdk/lib/_internal/pub/bin/pub.dart
+++ b/sdk/lib/_internal/pub/bin/pub.dart
@@ -8,9 +8,11 @@
 import 'package:args/args.dart';
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
+import 'package:source_maps/source_maps.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import '../lib/src/command.dart';
+import '../lib/src/exceptions.dart';
 import '../lib/src/exit_codes.dart' as exit_codes;
 import '../lib/src/http.dart';
 import '../lib/src/io.dart';
@@ -45,16 +47,14 @@
   }
 
   switch (options['verbosity']) {
-    case 'normal': log.showNormal(); break;
-    case 'io':     log.showIO(); break;
-    case 'solver': log.showSolver(); break;
-    case 'all':    log.showAll(); break;
+    case 'normal': log.verbosity = log.Verbosity.NORMAL; break;
+    case 'io':     log.verbosity = log.Verbosity.IO; break;
+    case 'solver': log.verbosity = log.Verbosity.SOLVER; break;
+    case 'all':    log.verbosity = log.Verbosity.ALL; break;
     default:
       // No specific verbosity given, so check for the shortcut.
       if (options['verbose']) {
-        log.showAll();
-      } else {
-        log.showNormal();
+        log.verbosity = log.Verbosity.ALL;
       }
       break;
   }
@@ -88,8 +88,11 @@
       captureStackChains: captureStackChains).catchError((error, Chain chain) {
     // This is basically the top-level exception handler so that we don't
     // spew a stack trace on our users.
-    var message = getErrorMessage(error);
-    log.error(message);
+    if (error is SpanException) {
+      log.error(error.toString(useColors: canUseSpecialChars));
+    } else {
+      log.error(getErrorMessage(error));
+    }
     log.fine("Exception type: ${error.runtimeType}");
 
     if (log.json.enabled) {
@@ -107,9 +110,9 @@
       log.fine(chain.terse);
     }
 
-    if (error is ApplicationException && error.innerError != null) {
+    if (error is WrappedException && error.innerError != null) {
       var message = "Wrapped exception: ${error.innerError}";
-      if (error.innerTrace != null) message = "$message\n${error.innerTrace}";
+      if (error.innerChain != null) message = "$message\n${error.innerChain}";
       log.fine(message);
     }
 
@@ -201,8 +204,10 @@
   });
 }
 
-/// Checks that pub is running on a supported platform. If it isn't, it prints
-/// an error message and exits. Completes when the validation is done.
+/// Checks that pub is running on a supported platform.
+///
+/// If it isn't, it prints an error message and exits. Completes when the
+/// validation is done.
 Future validatePlatform() {
   return syncFuture(() {
     if (Platform.operatingSystem != 'windows') return null;
diff --git a/sdk/lib/_internal/pub/lib/src/barback.dart b/sdk/lib/_internal/pub/lib/src/barback.dart
index d0f11f7..7ad499f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback.dart
@@ -4,12 +4,9 @@
 
 library pub.barback;
 
-import 'dart:async';
-
 import 'package:barback/barback.dart';
-import 'package:path/path.dart' as path;
+import 'package:path/path.dart' as p;
 
-import 'utils.dart';
 import 'version.dart';
 
 /// The currently supported versions of the Barback package that this version of
@@ -34,166 +31,7 @@
 /// constraint and barback's version.
 ///
 /// [compat]: https://gist.github.com/nex3/10942218
-final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.1");
-
-/// A list of the names of all built-in transformers that pub exposes.
-const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
-
-/// An identifier for a transformer and the configuration that will be passed to
-/// it.
-///
-/// It's possible that the library identified by [this] defines multiple
-/// transformers. If so, [configuration] will be passed to all of them.
-class TransformerId {
-  /// The package containing the library where the transformer is defined.
-  final String package;
-
-  /// The `/`-separated path to the library that contains this transformer.
-  ///
-  /// This is relative to the `lib/` directory in [package], and doesn't end in
-  /// `.dart`.
-  ///
-  /// This can be null; if so, it indicates that the transformer(s) should be
-  /// loaded from `lib/transformer.dart` if that exists, and `lib/$package.dart`
-  /// otherwise.
-  final String path;
-
-  /// The configuration to pass to the transformer.
-  ///
-  /// Any pub-specific configuration (i.e. keys starting with "$") will have
-  /// been stripped out of this and handled separately. This will be an empty
-  /// map if no configuration was provided.
-  final Map configuration;
-
-  /// The primary input inclusions.
-  ///
-  /// Each inclusion is an asset path. If this set is non-empty, than *only*
-  /// matching assets are allowed as a primary input by this transformer. If
-  /// `null`, all assets are included.
-  ///
-  /// This is processed before [excludes]. If a transformer has both includes
-  /// and excludes, then the set of included assets is determined and assets
-  /// are excluded from that resulting set.
-  final Set<String> includes;
-
-  /// The primary input exclusions.
-  ///
-  /// Any asset whose pach is in this is not allowed as a primary input by
-  /// this transformer.
-  ///
-  /// This is processed after [includes]. If a transformer has both includes
-  /// and excludes, then the set of included assets is determined and assets
-  /// are excluded from that resulting set.
-  final Set<String> excludes;
-
-  /// Whether this ID points to a built-in transformer exposed by pub.
-  bool get isBuiltInTransformer => package.startsWith('\$');
-
-  /// Parses a transformer identifier.
-  ///
-  /// A transformer identifier is a string of the form "package_name" or
-  /// "package_name/path/to/library". It does not have a trailing extension. If
-  /// it just has a package name, it expands to lib/transformer.dart if that
-  /// exists, or lib/${package}.dart otherwise. Otherwise, it expands to
-  /// lib/${path}.dart. In either case it's located in the given package.
-  factory TransformerId.parse(String identifier, Map configuration) {
-    if (identifier.isEmpty) {
-      throw new FormatException('Invalid library identifier: "".');
-    }
-
-    var parts = split1(identifier, "/");
-    if (parts.length == 1) {
-      return new TransformerId(parts.single, null, configuration);
-    }
-
-    return new TransformerId(parts.first, parts.last, configuration);
-  }
-
-  factory TransformerId(String package, String path, Map configuration) {
-    parseField(key) {
-      if (!configuration.containsKey(key)) return null;
-      var field = configuration.remove(key);
-
-      if (field is String) return new Set<String>.from([field]);
-
-      if (field is List) {
-        var nonstrings = field
-            .where((element) => element is! String)
-            .map((element) => '"$element"');
-
-        if (nonstrings.isNotEmpty) {
-          throw new FormatException(
-              '"$key" list field may only contain strings, but contained '
-              '${toSentence(nonstrings)}.');
-        }
-
-        return new Set<String>.from(field);
-      } else {
-        throw new FormatException(
-            '"$key" field must be a string or list, but was "$field".');
-      }
-    }
-
-    var includes = null;
-    var excludes = null;
-
-    if (configuration == null) {
-      configuration = {};
-    } else {
-      // Don't write to the immutable YAML map.
-      configuration = new Map.from(configuration);
-
-      // Pull out the exclusions/inclusions.
-      includes = parseField("\$include");
-      excludes = parseField("\$exclude");
-
-      // All other keys starting with "$" are unexpected.
-      var reservedKeys = configuration.keys
-          .where((key) => key is String && key.startsWith(r'$'))
-          .map((key) => '"$key"');
-
-      if (reservedKeys.isNotEmpty) {
-        throw new FormatException(
-            'Unknown reserved ${pluralize('field', reservedKeys.length)} '
-            '${toSentence(reservedKeys)}.');
-      }
-    }
-
-    return new TransformerId._(package, path, configuration,
-        includes, excludes);
-  }
-
-  TransformerId._(this.package, this.path, this.configuration,
-      this.includes, this.excludes) {
-    if (!package.startsWith('\$')) return;
-    if (_BUILT_IN_TRANSFORMERS.contains(package)) return;
-    throw new FormatException('Unsupported built-in transformer $package.');
-  }
-
-  // TODO(nweiz): support deep equality on [configuration] as well.
-  bool operator==(other) => other is TransformerId &&
-      other.package == package &&
-      other.path == path &&
-      other.configuration == configuration;
-
-  int get hashCode => package.hashCode ^ path.hashCode ^ configuration.hashCode;
-
-  String toString() => path == null ? package : '$package/$path';
-
-  /// Returns the asset id for the library identified by this transformer id.
-  ///
-  /// If `path` is null, this will determine which library to load.
-  Future<AssetId> getAssetId(Barback barback) {
-    if (path != null) {
-      return new Future.value(new AssetId(package, 'lib/$path.dart'));
-    }
-
-    var transformerAsset = new AssetId(package, 'lib/transformer.dart');
-    return barback.getAssetById(transformerAsset).then((_) => transformerAsset)
-        .catchError((e) => new AssetId(package, 'lib/$package.dart'),
-            test: (e) => e is AssetNotFoundException);
-  }
-}
+final supportedVersions = new VersionConstraint.parse(">=0.13.0 <0.14.2");
 
 /// Converts [id] to a "package:" URI.
 ///
@@ -204,7 +42,8 @@
     throw new ArgumentError("Asset id $id doesn't identify a library.");
   }
 
-  return new Uri(scheme: 'package', path: id.path.replaceFirst('lib/', ''));
+  return new Uri(scheme: 'package',
+      path: p.url.join(id.package, id.path.replaceFirst('lib/', '')));
 }
 
 /// Converts [uri] into an [AssetId] if its path is within "packages".
@@ -214,7 +53,7 @@
 ///
 /// If the URI doesn't contain one of those special directories, returns null.
 AssetId packagesUrlToId(Uri url) {
-  var parts = path.url.split(url.path);
+  var parts = p.url.split(url.path);
 
   // Strip the leading "/" from the URL.
   if (parts.isNotEmpty && parts.first == "/") parts = parts.skip(1).toList();
@@ -236,6 +75,6 @@
   }
 
   var package = parts[index + 1];
-  var assetPath = path.url.join("lib", path.url.joinAll(parts.skip(index + 2)));
+  var assetPath = p.url.join("lib", p.url.joinAll(parts.skip(index + 2)));
   return new AssetId(package, assetPath);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
index 80603b1..c6fd86f 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/admin_server.dart
@@ -12,6 +12,7 @@
 import 'package:shelf_web_socket/shelf_web_socket.dart';
 import 'package:stack_trace/stack_trace.dart';
 
+import '../io.dart';
 import '../log.dart' as log;
 import 'asset_environment.dart';
 import 'base_server.dart';
@@ -29,7 +30,7 @@
   /// Creates a new server and binds it to [port] of [host].
   static Future<AdminServer> bind(AssetEnvironment environment,
       String host, int port) {
-    return Chain.track(HttpServer.bind(host, port)).then((server) {
+    return Chain.track(bindServer(host, port)).then((server) {
       log.fine('Bound admin server to $host:$port.');
       return new AdminServer._(environment, server);
     });
diff --git a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
index 04acfa4..7bc57e6 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/asset_environment.dart
@@ -9,7 +9,6 @@
 
 import 'package:barback/barback.dart';
 import 'package:path/path.dart' as path;
-import 'package:stack_trace/stack_trace.dart';
 import 'package:watcher/watcher.dart';
 
 import '../entrypoint.dart';
@@ -39,17 +38,15 @@
   /// Creates a new build environment for working with the assets used by
   /// [entrypoint] and its dependencies.
   ///
-  /// Spawns an HTTP server for each directory in [rootDirectories]. These
-  /// servers will be on [hostname] and have ports based on [basePort].
-  /// [basePort] itself is reserved for "web/" and `basePort + 1` is reserved
-  /// for "test/"; further ports will be allocated for other root directories as
-  /// necessary. If [basePort] is zero, each server will have an ephemeral port.
+  /// HTTP servers that serve directories from this environment will be bound
+  /// to [hostname] and have ports based on [basePort]. If omitted, they
+  /// default to "localhost" and "0" (use ephemeral ports), respectively.
   ///
   /// Loads all used transformers using [mode] (including dart2js if
   /// [useDart2JS] is true).
   ///
-  /// Includes [rootDirectories] in the root package, as well as "lib" and
-  /// "asset".
+  /// This will only add the root package's "lib" directory to the environment.
+  /// Other directories can be added to the environment using [serveDirectory].
   ///
   /// If [watcherType] is not [WatcherType.NONE], watches source assets for
   /// modification.
@@ -57,8 +54,11 @@
   /// Returns a [Future] that completes to the environment once the inputs,
   /// transformers, and server are loaded and ready.
   static Future<AssetEnvironment> create(Entrypoint entrypoint,
-      String hostname, int basePort, BarbackMode mode, WatcherType watcherType,
-      {bool useDart2JS: true}) {
+      BarbackMode mode, WatcherType watcherType,
+      {String hostname, int basePort, bool useDart2JS: true}) {
+    if (hostname == null) hostname = "localhost";
+    if (basePort == null) basePort = 0;
+
     return entrypoint.loadPackageGraph().then((graph) {
       log.fine("Loaded package graph.");
       var barback = new Barback(new PubPackageProvider(graph));
@@ -204,6 +204,20 @@
     });
   }
 
+  /// Binds a new port to serve assets from within the "bin" directory of
+  /// [package].
+  ///
+  /// Adds the sources within that directory and then binds a server to it.
+  /// Unlike [serveDirectory], this works with packages that are not the
+  /// entrypoint.
+  ///
+  /// Returns a [Future] that completes to the bound server.
+  Future<BarbackServer> servePackageBinDirectory(String package) {
+    return _provideDirectorySources(graph.packages[package], "bin").then(
+        (_) => BarbackServer.bind(this, _hostname, 0, package: package,
+            rootDirectory: "bin"));
+  }
+
   /// Stops the server bound to [rootDirectory].
   ///
   /// Also removes any source files within that directory from barback. Returns
@@ -216,9 +230,10 @@
 
     return directory.server.then((server) {
       var url = server.url;
-      return directory.close()
-          .then((_) => _removeDirectorySources(rootDirectory))
-          .then((_) => url);
+      return directory.close().then((_) {
+        _removeDirectorySources(rootDirectory);
+        return url;
+      });
     });
   }
 
@@ -302,10 +317,11 @@
   Future<AssetId> getAssetIdForUrl(Uri url) {
     return Future.wait(_directories.values.map((dir) => dir.server))
         .then((servers) {
-      var server = servers.firstWhere(
-          (server) => server.address.host == url.host &&
-              server.port == url.port,
-          orElse: () => null);
+      var server = servers.firstWhere((server) {
+        if (server.port != url.port) return false;
+        return isLoopback(server.address.host) == isLoopback(url.host) ||
+            server.address.host == url.host;
+      }, orElse: () => null);
       if (server == null) return null;
       return server.urlToId(url);
     });
@@ -350,94 +366,96 @@
   /// Returns a [Future] that completes once all inputs and transformers are
   /// loaded.
   Future _load({bool useDart2JS}) {
-    // If the entrypoint package manually configures the dart2js
-    // transformer, don't include it in the built-in transformer list.
-    //
-    // TODO(nweiz): if/when we support more built-in transformers, make
-    // this more general.
-    var containsDart2JS = graph.entrypoint.root.pubspec.transformers
-        .any((transformers) => transformers
-        .any((id) => id.package == '\$dart2js'));
+    return log.progress("Initializing barback", () {
+      // If the entrypoint package manually configures the dart2js
+      // transformer, don't include it in the built-in transformer list.
+      //
+      // TODO(nweiz): if/when we support more built-in transformers, make
+      // this more general.
+      var containsDart2JS = graph.entrypoint.root.pubspec.transformers
+          .any((transformers) =>
+              transformers.any((config) => config.id.package == '\$dart2js'));
 
-    if (!containsDart2JS && useDart2JS) {
-      _builtInTransformers.addAll([
-        new Dart2JSTransformer(this, mode),
-        new DartForwardingTransformer(mode)
-      ]);
-    }
+      if (!containsDart2JS && useDart2JS) {
+        _builtInTransformers.addAll([
+          new Dart2JSTransformer(this, mode),
+          new DartForwardingTransformer(mode)
+        ]);
+      }
 
-    // "$pub" is a psuedo-package that allows pub's transformer-loading
-    // infrastructure to share code with pub proper. We provide it only during
-    // the initial transformer loading process.
-    var dartPath = assetPath('dart');
-    var pubSources = listDir(dartPath, recursive: true)
-        // Don't include directories.
-        .where((file) => path.extension(file) == ".dart")
-        .map((library) {
-      var idPath = path.join('lib', path.relative(library, from: dartPath));
-      return new AssetId('\$pub', path.toUri(idPath).toString());
-    });
-
-    // "$sdk" is a pseudo-package that allows the dart2js transformer to find
-    // the Dart core libraries without hitting the file system directly. This
-    // ensures they work with source maps.
-    var libPath = path.join(sdk.rootDirectory, "lib");
-    var sdkSources = listDir(libPath, recursive: true)
-        .where((file) => path.extension(file) == ".dart")
-        .map((file) {
-      var idPath = path.join("lib",
-          path.relative(file, from: sdk.rootDirectory));
-      return new AssetId('\$sdk', path.toUri(idPath).toString());
-    });
-
-    // Bind a server that we can use to load the transformers.
-    var transformerServer;
-    return BarbackServer.bind(this, _hostname, 0, null).then((server) {
-      transformerServer = server;
-
-      var errorStream = barback.errors.map((error) {
-        // Even most normally non-fatal barback errors should take down pub if
-        // they happen during the initial load process.
-        if (error is! AssetLoadException) throw error;
-
-        log.error(log.red(error.message));
-        log.fine(error.stackTrace.terse);
+      // "$pub" is a psuedo-package that allows pub's transformer-loading
+      // infrastructure to share code with pub proper. We provide it only during
+      // the initial transformer loading process.
+      var dartPath = assetPath('dart');
+      var pubSources = listDir(dartPath, recursive: true)
+          // Don't include directories.
+          .where((file) => path.extension(file) == ".dart")
+          .map((library) {
+        var idPath = path.join('lib', path.relative(library, from: dartPath));
+        return new AssetId('\$pub', path.toUri(idPath).toString());
       });
 
-      return _withStreamErrors(() {
-        return log.progress("Loading source assets", () {
-          barback.updateSources(pubSources);
-          barback.updateSources(sdkSources);
-          return _provideSources();
-        });
-      }, [errorStream, barback.results]);
-    }).then((_) {
-      log.fine("Provided sources.");
-      var completer = new Completer();
-
-      var errorStream = barback.errors.map((error) {
-        // Now that we're loading transformers, errors they log shouldn't be
-        // fatal, since we're starting to run them on real user assets which may
-        // have e.g. syntax errors. If an error would cause a transformer to
-        // fail to load, the load failure will cause us to exit.
-        if (error is! TransformerException) throw error;
-
-        var message = error.error.toString();
-        if (error.stackTrace != null) {
-          message += "\n" + error.stackTrace.terse.toString();
-        }
-
-        _log(new LogEntry(error.transform, error.transform.primaryId,
-                LogLevel.ERROR, message, null));
+      // "$sdk" is a pseudo-package that allows the dart2js transformer to find
+      // the Dart core libraries without hitting the file system directly. This
+      // ensures they work with source maps.
+      var libPath = path.join(sdk.rootDirectory, "lib");
+      var sdkSources = listDir(libPath, recursive: true)
+          .where((file) => path.extension(file) == ".dart")
+          .map((file) {
+        var idPath = path.join("lib",
+            path.relative(file, from: sdk.rootDirectory));
+        return new AssetId('\$sdk', path.toUri(idPath).toString());
       });
 
-      return _withStreamErrors(() {
-        return loadAllTransformers(this, transformerServer).then((_) {
-          log.fine("Loaded transformers.");
-          return transformerServer.close();
+      // Bind a server that we can use to load the transformers.
+      var transformerServer;
+      return BarbackServer.bind(this, _hostname, 0).then((server) {
+        transformerServer = server;
+
+        var errorStream = barback.errors.map((error) {
+          // Even most normally non-fatal barback errors should take down pub if
+          // they happen during the initial load process.
+          if (error is! AssetLoadException) throw error;
+
+          log.error(log.red(error.message));
+          log.fine(error.stackTrace.terse);
         });
-      }, [errorStream, barback.results, transformerServer.results]);
-    }).then((_) => barback.removeSources(pubSources));
+
+        return _withStreamErrors(() {
+          return log.progress("Loading source assets", () {
+            barback.updateSources(pubSources);
+            barback.updateSources(sdkSources);
+            return _provideSources();
+          });
+        }, [errorStream, barback.results]);
+      }).then((_) {
+        log.fine("Provided sources.");
+        var completer = new Completer();
+
+        var errorStream = barback.errors.map((error) {
+          // Now that we're loading transformers, errors they log shouldn't be
+          // fatal, since we're starting to run them on real user assets which
+          // may have e.g. syntax errors. If an error would cause a transformer
+          // to fail to load, the load failure will cause us to exit.
+          if (error is! TransformerException) throw error;
+
+          var message = error.error.toString();
+          if (error.stackTrace != null) {
+            message += "\n" + error.stackTrace.terse.toString();
+          }
+
+          _log(new LogEntry(error.transform, error.transform.primaryId,
+                  LogLevel.ERROR, message, null));
+        });
+
+        return _withStreamErrors(() {
+          return log.progress("Loading transformers", () {
+            return loadAllTransformers(this, transformerServer)
+                .then((_) => transformerServer.close());
+          }, fine: true);
+        }, [errorStream, barback.results, transformerServer.results]);
+      }).then((_) => barback.removeSources(pubSources));
+    }, fine: true);
   }
 
   /// Provides the public source assets in the environment to barback.
@@ -466,36 +484,35 @@
     // Then the sources of the subdirectory will be updated and watched twice.
     // See: #17454
     if (_watcherType == WatcherType.NONE) {
-      return _updateDirectorySources(package, dir);
+      _updateDirectorySources(package, dir);
+      return new Future.value();
     }
 
     // Watch the directory before listing is so we don't miss files that
     // are added between the initial list and registering the watcher.
     return _watchDirectorySources(package, dir).then((_) {
-      return _updateDirectorySources(package, dir);
+      _updateDirectorySources(package, dir);
     });
   }
 
   /// Updates barback with all of the files in [dir] inside [package].
-  Future _updateDirectorySources(Package package, String dir) {
-    return _listDirectorySources(package, dir).then((ids) {
-      if (_modifiedSources == null) {
-        barback.updateSources(ids);
-      } else {
-        _modifiedSources.addAll(ids);
-      }
-    });
+  void _updateDirectorySources(Package package, String dir) {
+    var ids = _listDirectorySources(package, dir);
+    if (_modifiedSources == null) {
+      barback.updateSources(ids);
+    } else {
+      _modifiedSources.addAll(ids);
+    }
   }
 
   /// Removes all of the files in [dir] in the root package from barback.
-  Future _removeDirectorySources(String dir) {
-    return _listDirectorySources(rootPackage, dir).then((ids) {
-      if (_modifiedSources == null) {
-        barback.removeSources(ids);
-      } else {
-        _modifiedSources.removeAll(ids);
-      }
-    });
+  void _removeDirectorySources(String dir) {
+    var ids = _listDirectorySources(rootPackage, dir);
+    if (_modifiedSources == null) {
+      barback.removeSources(ids);
+    } else {
+      _modifiedSources.removeAll(ids);
+    }
   }
 
   /// Lists all of the source assets in [dir] inside [package].
@@ -503,24 +520,17 @@
   /// For large packages, listing the contents is a performance bottleneck, so
   /// this is optimized for our needs in here instead of using the more general
   /// but slower [listDir].
-  Future<List<AssetId>> _listDirectorySources(Package package, String dir) {
+  List<AssetId> _listDirectorySources(Package package, String dir) {
     var subdirectory = path.join(package.dir, dir);
-    if (!dirExists(subdirectory)) return new Future.value([]);
+    if (!dirExists(subdirectory)) return [];
 
-    return new Directory(subdirectory).list(recursive: true, followLinks: true)
-        .expand((entry) {
-      // Skip directories and (broken) symlinks.
-      if (entry is Directory) return [];
-      if (entry is Link) return [];
-
-      var relative = path.normalize(
-          path.relative(entry.path, from: package.dir));
-
-      // Ignore hidden files or files in "packages" and hidden directories.
-      if (path.split(relative).any((part) =>
-          part.startsWith(".") || part == "packages")) {
-        return [];
-      }
+    // This is used in some performance-sensitive paths and can list many, many
+    // files. As such, it leans more havily towards optimization as opposed to
+    // readability than most code in pub. In particular, it avoids using the
+    // path package, since re-parsing a path is very expensive relative to
+    // string operations.
+    return package.listFiles(beneath: subdirectory).expand((file) {
+      var relative = file.substring(package.dir.length + 1);
 
       // Skip files that were (most likely) compiled from nearby ".dart"
       // files. These are created by the Editor's "Run as JavaScript"
@@ -535,7 +545,12 @@
       if (relative.endsWith(".dart.js.map")) return [];
       if (relative.endsWith(".dart.precompiled.js")) return [];
 
-      return [new AssetId(package.name, path.toUri(relative).toString())];
+      if (Platform.operatingSystem == 'windows') {
+        relative = relative.replaceAll("\\", "/");
+      }
+
+      var uri = new Uri(pathSegments: relative.split("/"));
+      return [new AssetId(package.name, uri.toString())];
     }).toList();
   }
 
diff --git a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
index d53d3ea..7d9125a 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/barback_server.dart
@@ -14,6 +14,7 @@
 import 'package:stack_trace/stack_trace.dart';
 
 import '../barback.dart';
+import '../io.dart';
 import '../log.dart' as log;
 import '../utils.dart';
 import 'base_server.dart';
@@ -24,6 +25,9 @@
 
 /// A server that serves assets transformed by barback.
 class BarbackServer extends BaseServer<BarbackServerResult> {
+  /// The package whose assets are being served.
+  final String package;
+
   /// The directory in the root which will serve as the root of this server as
   /// a native platform path.
   ///
@@ -42,18 +46,26 @@
 
   /// Creates a new server and binds it to [port] of [host].
   ///
-  /// This server will serve assets from [barback], and use [rootDirectory] as
-  /// the root directory.
+  /// This server serves assets from [barback], and uses [rootDirectory]
+  /// (which is relative to the root directory of [package]) as the root
+  /// directory. If [rootDirectory] is omitted, the bound server can only be
+  /// used to serve assets from packages' lib directories (i.e. "packages/..."
+  /// URLs). If [package] is omitted, it defaults to the entrypoint package.
   static Future<BarbackServer> bind(AssetEnvironment environment,
-      String host, int port, String rootDirectory) {
-    return Chain.track(HttpServer.bind(host, port)).then((server) {
-      log.fine('Bound "$rootDirectory" to $host:$port.');
-      return new BarbackServer._(environment, server, rootDirectory);
+      String host, int port, {String package, String rootDirectory}) {
+    if (package == null) package = environment.rootPackage.name;
+    return Chain.track(bindServer(host, port)).then((server) {
+      if (rootDirectory == null) {
+        log.fine('Serving packages on $host:$port.');
+      } else {
+        log.fine('Bound "$rootDirectory" to $host:$port.');
+      }
+      return new BarbackServer._(environment, server, package, rootDirectory);
     });
   }
 
   BarbackServer._(AssetEnvironment environment, HttpServer server,
-      this.rootDirectory)
+      this.package, this.rootDirectory)
       : super(environment, server);
 
   /// Converts a [url] served by this server into an [AssetId] that can be
@@ -75,7 +87,7 @@
     if (parts.isNotEmpty && parts.first == "/") parts = parts.skip(1);
 
     var relativePath = path.url.join(rootDirectory, path.url.joinAll(parts));
-    return new AssetId(environment.rootPackage.name, relativePath);
+    return new AssetId(package, relativePath);
   }
 
   /// Handles an HTTP request.
@@ -101,9 +113,7 @@
           asset: id);
     }
 
-    logRequest(request, "Loading $id");
     return environment.barback.getAssetById(id).then((result) {
-      logRequest(request, "getAssetById($id) returned");
       return result;
     }).then((asset) => _serveAsset(request, asset)).catchError((error, trace) {
       if (error is! AssetNotFoundException) throw error;
diff --git a/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart b/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart
new file mode 100644
index 0000000..8fdd047
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/cycle_exception.dart
@@ -0,0 +1,60 @@
+// 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.barback.cycle_exception;
+
+import '../exceptions.dart';
+
+/// An exception thrown when a transformer dependency cycle is detected.
+///
+/// A cycle exception is usually produced within a deeply-nested series of
+/// calls. The API is designed to make it easy for each of these calls to add to
+/// the message so that the full reasoning for the cycle is made visible to the
+/// user.
+///
+/// Each call's individual message is called a "step". A [CycleException] is
+/// represented internally as a linked list of steps.
+class CycleException implements ApplicationException {
+  /// The step for this exception.
+  final String _step;
+
+  /// The next exception in the linked list.
+  ///
+  /// [_next]'s steps come after [_step].
+  final CycleException _next;
+
+  /// A list of all steps in the cycle.
+  List<String> get steps {
+    if (_step == null) return [];
+
+    var exception = this;
+    var steps = [];
+    while (exception != null) {
+      steps.add(exception._step);
+      exception = exception._next;
+    }
+    return steps;
+  }
+
+  String get message {
+    var steps = this.steps;
+    if (steps.isEmpty) return "Transformer cycle detected.";
+    return "Transformer cycle detected:\n" +
+        steps.map((step) => "  $step").join("\n");
+  }
+
+  /// Creates a new [CycleException] with zero or one steps.
+  CycleException([this._step])
+      : _next = null;
+
+  CycleException._(this._step, this._next);
+
+  /// Returns a copy of [this] with [step] added to the beginning of [steps].
+  CycleException prependStep(String step) {
+    if (_step == null) return new CycleException(step);
+    return new CycleException._(step, this);
+  }
+
+  String toString() => message;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart
new file mode 100644
index 0000000..beed5ce
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_aggregate_transformer.dart
@@ -0,0 +1,69 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.excluding_aggregate_transformer;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+import 'transformer_config.dart';
+
+/// Decorates an inner [AggregateTransformer] and handles including and
+/// excluding primary inputs.
+class ExcludingAggregateTransformer extends AggregateTransformer {
+  /// If [config] defines includes or excludes, wraps [inner] in an
+  /// [ExcludingAggregateTransformer] that handles those.
+  ///
+  /// Otherwise, just returns [inner] unmodified.
+  static AggregateTransformer wrap(AggregateTransformer inner,
+      TransformerConfig config) {
+    if (!config.hasExclusions) return inner;
+
+    if (inner is LazyAggregateTransformer) {
+      return new _LazyExcludingAggregateTransformer(
+          inner as LazyAggregateTransformer, config);
+    } else if (inner is DeclaringAggregateTransformer) {
+      return new _DeclaringExcludingAggregateTransformer(
+          inner as DeclaringAggregateTransformer, config);
+    } else {
+      return new ExcludingAggregateTransformer._(inner, config);
+    }
+  }
+
+  final AggregateTransformer _inner;
+
+  /// The config containing rules for which assets to include or exclude.
+  final TransformerConfig _config;
+
+  ExcludingAggregateTransformer._(this._inner, this._config);
+
+  classifyPrimary(AssetId id) {
+    if (!_config.canTransform(id.path)) return null;
+    return _inner.classifyPrimary(id);
+  }
+
+  Future apply(AggregateTransform transform) => _inner.apply(transform);
+
+  String toString() => _inner.toString();
+}
+
+class _DeclaringExcludingAggregateTransformer
+    extends ExcludingAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  _DeclaringExcludingAggregateTransformer(DeclaringAggregateTransformer inner,
+        TransformerConfig config)
+      : super._(inner as AggregateTransformer, config);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) =>
+      (_inner as DeclaringAggregateTransformer).declareOutputs(transform);
+}
+
+class _LazyExcludingAggregateTransformer
+    extends _DeclaringExcludingAggregateTransformer
+    implements LazyAggregateTransformer {
+  _LazyExcludingAggregateTransformer(DeclaringAggregateTransformer inner,
+        TransformerConfig config)
+      : super(inner, config);
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
index 1892f97..90b4e51 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/excluding_transformer.dart
@@ -8,56 +8,38 @@
 
 import 'package:barback/barback.dart';
 
+import 'transformer_config.dart';
+
 /// Decorates an inner [Transformer] and handles including and excluding
 /// primary inputs.
 class ExcludingTransformer extends Transformer {
-  /// If [includes] or [excludes] is non-null, wraps [inner] in an
+  /// If [config] defines includes or excludes, wraps [inner] in an
   /// [ExcludingTransformer] that handles those.
   ///
   /// Otherwise, just returns [inner] unmodified.
-  static Transformer wrap(Transformer inner, Set<String> includes,
-      Set<String> excludes) {
-    if (includes == null && excludes == null) return inner;
+  static Transformer wrap(Transformer inner, TransformerConfig config) {
+    if (!config.hasExclusions) return inner;
 
     if (inner is LazyTransformer) {
       // TODO(nweiz): Remove these unnecessary "as"es when issue 19046 is fixed.
-      return new _LazyExcludingTransformer(
-          inner as LazyTransformer, includes, excludes);
+      return new _LazyExcludingTransformer(inner as LazyTransformer, config);
     } else if (inner is DeclaringTransformer) {
       return new _DeclaringExcludingTransformer(
-          inner as DeclaringTransformer, includes, excludes);
+          inner as DeclaringTransformer, config);
     } else {
-      return new ExcludingTransformer._(inner, includes, excludes);
+      return new ExcludingTransformer._(inner, config);
     }
   }
 
   final Transformer _inner;
 
-  /// The set of asset paths which should be included.
-  ///
-  /// If `null`, all non-excluded assets are allowed. Otherwise, only included
-  /// assets are allowed.
-  final Set<String> _includes;
+  /// The config containing rules for which assets to include or exclude.
+  final TransformerConfig _config;
 
-  /// The set of assets which should be excluded.
-  ///
-  /// Exclusions are applied after inclusions.
-  final Set<String> _excludes;
-
-  ExcludingTransformer._(this._inner, this._includes, this._excludes);
+  ExcludingTransformer._(this._inner, this._config);
 
   isPrimary(AssetId id) {
-    // TODO(rnystrom): Support globs in addition to paths. See #17093.
-    if (_includes != null) {
-      // If there are any includes, it must match one of them.
-      if (!_includes.contains(id.path)) return false;
-    }
-
-    // It must not be excluded.
-    if (_excludes != null && _excludes.contains(id.path)) {
-      return false;
-    }
-
+    if (!_config.canTransform(id.path)) return false;
     return _inner.isPrimary(id);
   }
 
@@ -69,8 +51,8 @@
 class _DeclaringExcludingTransformer extends ExcludingTransformer
     implements DeclaringTransformer {
   _DeclaringExcludingTransformer(DeclaringTransformer inner,
-        Set<String> includes, Set<String> excludes)
-      : super._(inner as Transformer, includes, excludes);
+          TransformerConfig config)
+      : super._(inner as Transformer, config);
 
   Future declareOutputs(DeclaringTransform transform) =>
       (_inner as DeclaringTransformer).declareOutputs(transform);
@@ -79,6 +61,6 @@
 class _LazyExcludingTransformer extends _DeclaringExcludingTransformer
     implements LazyTransformer {
   _LazyExcludingTransformer(DeclaringTransformer inner,
-        Set<String> includes, Set<String> excludes)
-      : super(inner, includes, excludes);
+          TransformerConfig config)
+      : super(inner, config);
 }
diff --git a/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
index 2fc1a0f..7816a98 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/foreign_transformer.dart
@@ -10,8 +10,9 @@
 import 'package:barback/barback.dart';
 
 import '../../../asset/dart/serialize.dart';
-import '../barback.dart';
 import 'excluding_transformer.dart';
+import 'excluding_aggregate_transformer.dart';
+import 'transformer_config.dart';
 
 /// A wrapper for a transformer that's in a different isolate.
 class _ForeignTransformer extends Transformer {
@@ -64,6 +65,58 @@
       : super(map);
 }
 
+/// A wrapper for an aggregate transformer that's in a different isolate.
+class _ForeignAggregateTransformer extends AggregateTransformer {
+  /// The port with which we communicate with the child isolate.
+  ///
+  /// This port and all messages sent across it are specific to this
+  /// transformer.
+  final SendPort _port;
+
+  /// The result of calling [toString] on the transformer in the isolate.
+  final String _toString;
+
+  _ForeignAggregateTransformer(Map map)
+      : _port = map['port'],
+        _toString = map['toString'];
+
+  Future<String> classifyPrimary(AssetId id) {
+    return call(_port, {
+      'type': 'classifyPrimary',
+      'id': serializeId(id)
+    });
+  }
+
+  Future apply(AggregateTransform transform) {
+    return call(_port, {
+      'type': 'apply',
+      'transform': serializeAggregateTransform(transform)
+    });
+  }
+
+  String toString() => _toString;
+}
+
+class _ForeignDeclaringAggregateTransformer extends _ForeignAggregateTransformer
+    implements DeclaringAggregateTransformer {
+  _ForeignDeclaringAggregateTransformer(Map map)
+      : super(map);
+
+  Future declareOutputs(DeclaringAggregateTransform transform) {
+    return call(_port, {
+      'type': 'declareOutputs',
+      'transform': serializeDeclaringAggregateTransform(transform)
+    });
+  }
+}
+
+class _ForeignLazyAggregateTransformer
+    extends _ForeignDeclaringAggregateTransformer
+    implements LazyAggregateTransformer {
+  _ForeignLazyAggregateTransformer(Map map)
+      : super(map);
+}
+
 /// A wrapper for a transformer group that's in a different isolate.
 class _ForeignGroup implements TransformerGroup {
   final Iterable<Iterable> phases;
@@ -71,21 +124,22 @@
   /// The result of calling [toString] on the transformer group in the isolate.
   final String _toString;
 
-  _ForeignGroup(TransformerId id, Map map)
+  _ForeignGroup(TransformerConfig config, Map map)
       : phases = map['phases'].map((phase) {
-          return phase.map((transformer) => deserializeTransformerOrGroup(
-              transformer, id)).toList();
+          return phase.map((transformer) => deserializeTransformerLike(
+              transformer, config)).toList();
         }).toList(),
         _toString = map['toString'];
 
   String toString() => _toString;
 }
 
-/// Converts a serializable map into a [Transformer] or a [TransformerGroup].
-deserializeTransformerOrGroup(Map map, TransformerId id) {
+/// Converts a serializable map into a [Transformer], an [AggregateTransformer],
+/// or a [TransformerGroup].
+deserializeTransformerLike(Map map, TransformerConfig config) {
   var transformer;
   switch(map['type']) {
-    case 'TransformerGroup': return new _ForeignGroup(id, map);
+    case 'TransformerGroup': return new _ForeignGroup(config, map);
     case 'Transformer':
       transformer = new _ForeignTransformer(map);
       break;
@@ -95,8 +149,22 @@
     case 'LazyTransformer':
       transformer = new _ForeignLazyTransformer(map);
       break;
+    case 'AggregateTransformer':
+      transformer = new _ForeignAggregateTransformer(map);
+      break;
+    case 'DeclaringAggregateTransformer':
+      transformer = new _ForeignDeclaringAggregateTransformer(map);
+      break;
+    case 'LazyAggregateTransformer':
+      transformer = new _ForeignLazyAggregateTransformer(map);
+      break;
     default: assert(false);
   }
 
-  return ExcludingTransformer.wrap(transformer, id.includes, id.excludes);
+  if (transformer is Transformer) {
+    return ExcludingTransformer.wrap(transformer, config);
+  } else {
+    assert(transformer is AggregateTransformer);
+    return ExcludingAggregateTransformer.wrap(transformer, config);
+  }
 }
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 0f9016d..0c85fea 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
@@ -8,16 +8,18 @@
 
 import 'package:barback/barback.dart';
 
-import '../barback.dart';
 import '../log.dart' as log;
 import '../package_graph.dart';
 import '../utils.dart';
 import 'asset_environment.dart';
+import 'barback_server.dart';
 import 'dart2js_transformer.dart';
 import 'excluding_transformer.dart';
-import 'load_transformers.dart';
 import 'rewrite_import_transformer.dart';
-import 'barback_server.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+import 'transformer_isolate.dart';
+import 'transformers_needed_by_transformers.dart';
 
 /// Loads all transformers depended on by packages in [environment].
 ///
@@ -29,33 +31,26 @@
 /// automatically be added to the end of the root package's cascade.
 Future loadAllTransformers(AssetEnvironment environment,
     BarbackServer transformerServer) {
-  // In order to determine in what order we should load transformers, we need to
-  // know which transformers depend on which others. This is different than
-  // normal package dependencies. Let's begin with some terminology:
-  //
-  // * If package A is transformed by package B, we say A has a "transformer
-  //   dependency" on B.
-  // * If A imports B we say A has a "package dependency" on B.
-  // * If A needs B's transformers to be loaded in order to load A's
-  //   transformers, we say A has an "ordering dependency" on B.
-  //
-  // In particular, an ordering dependency is defined as follows:
-  //
-  // * If A has a transformer dependency on B, A also has an ordering dependency
-  //   on B.
-  // * If A has a transitive package dependency on B and B has a transformer
-  //   dependency on C, A has an ordering dependency on C.
-  //
-  // The order that transformers are loaded is determined by each package's
-  // ordering dependencies. We treat the packages as a directed acyclic[1] graph
-  // where each package is a node and the ordering dependencies are the edges
-  // (that is, the packages form a partially ordered set). We then load[2]
-  // packages in a topological sort order of this graph.
-  //
-  // [1] TODO(nweiz): support cycles in some cases.
-  //
-  // [2] We use "loading a package" as a shorthand for loading that package's
-  //     transformers.
+  var transformersNeededByTransformers =
+      computeTransformersNeededByTransformers(environment.graph);
+
+  var buffer = new StringBuffer();
+  buffer.writeln("Transformer dependencies:");
+  transformersNeededByTransformers.forEach((id, dependencies) {
+    if (dependencies.isEmpty) {
+      buffer.writeln("$id: -");
+    } else {
+      buffer.writeln("$id: ${toSentence(dependencies)}");
+    }
+  });
+  log.fine(buffer);
+
+  var phasedTransformers = _phaseTransformers(transformersNeededByTransformers);
+
+  var packagesThatUseTransformers =
+      _packagesThatUseTransformers(environment.graph);
+
+  var loader = new _TransformerLoader(environment, transformerServer);
 
   // Add a rewrite transformer for each package, so that we can resolve
   // "package:" imports while loading transformers.
@@ -65,167 +60,91 @@
   }
   environment.barback.updateTransformers(r'$pub', [[rewrite]]);
 
-  var orderingDeps = _computeOrderingDeps(environment.graph);
-  var reverseOrderingDeps = reverseGraph(orderingDeps);
-  var packageTransformers = _computePackageTransformers(environment.graph);
+  return Future.forEach(phasedTransformers, (phase) {
+    /// Load all the transformers in [phase], then add them to the appropriate
+    /// locations in the transformer graphs of the packages that use them.
+    return loader.load(phase).then((_) {
+      // Only update packages that use transformers in [phase].
+      var packagesToUpdate = unionAll(phase.map((id) =>
+          packagesThatUseTransformers[id]));
+      return Future.wait(packagesToUpdate.map((packageName) {
+        var package = environment.graph.packages[packageName];
+        return loader.transformersForPhases(package.pubspec.transformers)
+            .then((phases) {
 
-  var loader = new _TransformerLoader(environment, transformerServer);
-
-  // The packages on which no packages have ordering dependencies -- that is,
-  // the packages that don't need to be loaded before any other packages. These
-  // packages will be loaded last, since all of their ordering dependencies need
-  // to be loaded before they're loaded. However, they'll be traversed by
-  // [loadPackage] first.
-  var rootPackages = environment.graph.packages.keys.toSet()
-      .difference(unionAll(orderingDeps.values));
-
-  // The Futures for packages that have been loaded or are being actively loaded
-  // by [loadPackage]. Once one of these Futures is complete, the transformers
-  // for that package will all be available from [loader].
-  var loadingPackages = new Map<String, Future>();
-
-  // A helper function that loads all the transformers that [package] uses, then
-  // all the transformers that [package] defines.
-  Future loadPackage(String package) {
-    if (loadingPackages.containsKey(package)) return loadingPackages[package];
-
-    // First, load each package upon which [package] has an ordering dependency.
-    var future = Future.wait(orderingDeps[package].map(loadPackage)).then((_) {
-      // Go through the transformers used by [package] phase-by-phase. If any
-      // phase uses a transformer defined in [package] itself, that transformer
-      // should be loaded after running all previous phases.
-      var transformers = [[rewrite]];
-
-      var phases = environment.graph.packages[package].pubspec.transformers;
-      return Future.forEach(phases, (phase) {
-        return Future.wait(phase.where((id) => id.package == package)
-            .map(loader.load)).then((_) {
-          // If we've already loaded all the transformers in this package and no
-          // other package imports it, there's no need to keep applying
-          // transformers, so we can short-circuit.
-          var loadedAllTransformers = packageTransformers[package]
-              .difference(loader.loadedTransformers).isEmpty;
-          if (loadedAllTransformers &&
-              !reverseOrderingDeps.containsKey(package)) {
-            return null;
-          }
-
-          transformers.add(unionAll(phase.map(
-              (id) => loader.transformersFor(id))));
-          environment.barback.updateTransformers(package, transformers);
+          // Make sure [rewrite] is still the first phase so that future
+          // transformers' "package:" imports will work.
+          phases.insert(0, new Set.from([rewrite]));
+          environment.barback.updateTransformers(packageName, phases);
         });
-      }).then((_) {
-        // Now that we've applied all the transformers used by [package] via
-        // [Barback.updateTransformers], we load any transformers defined in
-        // [package] but used elsewhere.
-        return Future.wait(packageTransformers[package].map(loader.load));
-      });
+      }));
     });
-    loadingPackages[package] = future;
-    return future;
-  }
-
-  return Future.wait(rootPackages.map(loadPackage)).then((_) {
+  }).then((_) {
     /// Reset the transformers for each package to get rid of [rewrite], which
     /// is no longer needed.
-    for (var package in environment.graph.packages.values) {
-      var phases = package.pubspec.transformers.map((phase) {
-        return unionAll(phase.map((id) => loader.transformersFor(id)));
-      }).toList();
+    return Future.wait(environment.graph.packages.values.map((package) {
+      return loader.transformersForPhases(package.pubspec.transformers)
+          .then((phases) {
+        var transformers = environment.getBuiltInTransformers(package);
+        if (transformers != null) phases.add(transformers);
 
-      var transformers = environment.getBuiltInTransformers(package);
-      if (transformers != null) phases.add(transformers);
-
-      // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed. If
-      // no transformer in [phases] applies to a source input,
-      // [updateTransformers] may cause a [BuildResult] to be scheduled for
-      // immediate emission. Issue 17305 means that the caller will be unable to
-      // receive this result unless we delay the update to after this function
-      // returns.
-      newFuture(() =>
-          environment.barback.updateTransformers(package.name, phases));
-    }
+        // TODO(nweiz): remove the [newFuture] here when issue 17305 is fixed.
+        // If no transformer in [phases] applies to a source input,
+        // [updateTransformers] may cause a [BuildResult] to be scheduled for
+        // immediate emission. Issue 17305 means that the caller will be unable
+        // to receive this result unless we delay the update to after this
+        // function returns.
+        newFuture(() =>
+            environment.barback.updateTransformers(package.name, phases));
+      });
+    }));
   });
 }
 
-/// Computes and returns the graph of ordering dependencies for [graph].
+/// Given [transformerDependencies], a directed acyclic graph, returns a list of
+/// "phases" (sets of transformers).
 ///
-/// This graph is in the form of a map whose keys are packages and whose values
-/// are those packages' ordering dependencies.
-Map<String, Set<String>> _computeOrderingDeps(PackageGraph graph) {
-  var orderingDeps = new Map<String, Set<String>>();
-  // Iterate through the packages in a deterministic order so that if there are
-  // multiple cycles we choose which to print consistently.
-  var packages = ordered(graph.packages.values.map((package) => package.name));
-  for (var package in packages) {
-    // This package's transformer dependencies are also ordering dependencies.
-    var deps = _transformerDeps(graph, package);
-    deps.remove(package);
-    // The transformer dependencies of this package's transitive package
-    // dependencies are also ordering dependencies for this package.
-    var transitivePackageDeps = graph.transitiveDependencies(package)
-        .map((package) => package.name);
-    for (var packageDep in ordered(transitivePackageDeps)) {
-      var transformerDeps = _transformerDeps(graph, packageDep);
-      if (transformerDeps.contains(package)) {
-        throw _cycleError(graph, package, packageDep);
-      }
-      deps.addAll(transformerDeps);
-    }
-    orderingDeps[package] = deps;
+/// Each phase must be fully loaded and passed to barback before the next phase
+/// can be safely loaded. However, transformers within a phase can be safely
+/// loaded in parallel.
+List<Set<TransformerId>> _phaseTransformers(
+    Map<TransformerId, Set<TransformerId>> transformerDependencies) {
+  // A map from transformer ids to the indices of the phases that those
+  // transformer ids should end up in. Populated by [phaseNumberFor].
+  var phaseNumbers = {};
+  var phases = [];
+
+  phaseNumberFor(id) {
+    if (phaseNumbers.containsKey(id)) return phaseNumbers[id];
+    var dependencies = transformerDependencies[id];
+    phaseNumbers[id] = dependencies.isEmpty ? 0 :
+        maxAll(dependencies.map(phaseNumberFor)) + 1;
+    return phaseNumbers[id];
   }
 
-  return orderingDeps;
+  for (var id in transformerDependencies.keys) {
+    var phaseNumber = phaseNumberFor(id);
+    if (phases.length <= phaseNumber) phases.length = phaseNumber + 1;
+    if (phases[phaseNumber] == null) phases[phaseNumber] = new Set();
+    phases[phaseNumber].add(id);
+  }
+
+  return phases;
 }
 
-/// Returns the set of transformer dependencies for [package].
-Set<String> _transformerDeps(PackageGraph graph, String package) =>
-  unionAll(graph.packages[package].pubspec.transformers)
-      .where((id) => !id.isBuiltInTransformer)
-      .map((id) => id.package).toSet();
-
-/// Returns an [ApplicationException] describing an ordering dependency cycle
-/// detected in [graph].
-///
-/// [dependee] and [depender] should be the names of two packages known to be in
-/// the cycle. In addition, [depender] should have a transformer dependency on
-/// [dependee].
-ApplicationException _cycleError(PackageGraph graph, String dependee,
-    String depender) {
-  assert(_transformerDeps(graph, depender).contains(dependee));
-
-  var simpleGraph = mapMapValues(graph.packages,
-      (_, package) => package.dependencies.map((dep) => dep.name).toList());
-  var path = shortestPath(simpleGraph, dependee, depender);
-  path.add(dependee);
-  return new ApplicationException("Transformer cycle detected:\n" +
-      pairs(path).map((pair) {
-    var transformers = unionAll(graph.packages[pair.first].pubspec.transformers)
-        .where((id) => id.package == pair.last)
-        .map((id) => id.toString()).toList();
-    if (transformers.isEmpty) {
-      return "  ${pair.first} depends on ${pair.last}";
-    } else {
-      return "  ${pair.first} is transformed by ${toSentence(transformers)}";
-    }
-  }).join("\n"));
-}
-
-/// Returns a map from each package name in [graph] to the transformer ids of
-/// all transformers exposed by that package and used by other packages.
-Map<String, Set<TransformerId>> _computePackageTransformers(
+/// Returns a map from transformer ids to all packages in [graph] that use each
+/// transformer.
+Map<TransformerId, Set<String>> _packagesThatUseTransformers(
     PackageGraph graph) {
-  var packageTransformers = listToMap(graph.packages.values,
-      (package) => package.name, (_) => new Set<TransformerId>());
+  var results = {};
   for (var package in graph.packages.values) {
     for (var phase in package.pubspec.transformers) {
-      for (var id in phase) {
-        if (id.isBuiltInTransformer) continue;
-        packageTransformers[id.package].add(id);
+      for (var config in phase) {
+        results.putIfAbsent(config.id, () => new Set()).add(package.name);
       }
     }
   }
-  return packageTransformers;
+  return results;
 }
 
 /// A class that loads transformers defined in specific files.
@@ -234,88 +153,102 @@
 
   final BarbackServer _transformerServer;
 
-  /// The loaded transformers defined in the library identified by each
-  /// transformer id.
-  final _transformers = new Map<TransformerId, Set<Transformer>>();
+  final _isolates = new Map<TransformerId, TransformerIsolate>();
 
-  /// The packages that use each transformer asset id.
+  final _transformers = new Map<TransformerConfig, Set<Transformer>>();
+
+  /// The packages that use each transformer id.
   ///
   /// Used for error reporting.
-  final _transformerUsers = new Map<Pair<String, String>, Set<String>>();
-
-  // TODO(nweiz): Make this a view when issue 17637 is fixed.
-  /// The set of all transformers that have been loaded so far.
-  Set<TransformerId> get loadedTransformers => _transformers.keys.toSet();
+  final _transformerUsers = new Map<TransformerId, Set<String>>();
 
   _TransformerLoader(this._environment, this._transformerServer) {
     for (var package in _environment.graph.packages.values) {
-      for (var id in unionAll(package.pubspec.transformers)) {
-        _transformerUsers.putIfAbsent(
-            new Pair(id.package, id.path), () => new Set<String>())
+      for (var config in unionAll(package.pubspec.transformers)) {
+        _transformerUsers.putIfAbsent(config.id, () => new Set<String>())
             .add(package.name);
       }
     }
   }
 
-  /// Loads the transformer(s) defined in [id].
+  /// Loads a transformer plugin isolate that imports the transformer libraries
+  /// indicated by [ids].
   ///
-  /// Once the returned future completes, these transformers can be retrieved
-  /// using [transformersFor]. If [id] doesn't define any transformers, this
-  /// will complete to an error.
-  Future load(TransformerId id) {
-    if (_transformers.containsKey(id)) return new Future.value();
+  /// Once the returned future completes, transformer instances from this
+  /// isolate can be created using [transformersFor] or [transformersForPhase].
+  ///
+  /// This will skip any ids that have already been loaded.
+  Future load(Iterable<TransformerId> ids) {
+    ids = ids.where((id) => !_isolates.containsKey(id)).toList();
+    if (ids.isEmpty) return new Future.value();
 
-    // TODO(nweiz): load multiple instances of the same transformer from the
-    // same isolate rather than spinning up a separate isolate for each one.
-    return log.progress("Loading $id transformers",
-        () => loadTransformers(_environment, _transformerServer, id))
-        .then((transformers) {
-      if (!transformers.isEmpty) {
-        _transformers[id] = transformers;
-        return;
+    return log.progress("Loading ${toSentence(ids)} transformers", () {
+      return TransformerIsolate.spawn(_environment, _transformerServer, ids);
+    }).then((isolate) {
+      for (var id in ids) {
+        _isolates[id] = isolate;
       }
-
-      var message = "No transformers";
-      if (id.configuration.isNotEmpty) {
-        message += " that accept configuration";
-      }
-
-      var location;
-      if (id.path == null) {
-        location = 'package:${id.package}/transformer.dart or '
-          'package:${id.package}/${id.package}.dart';
-      } else {
-        location = 'package:$id.dart';
-      }
-      var pair = new Pair(id.package, id.path);
-
-      throw new ApplicationException(
-          "$message were defined in $location,\n"
-          "required by ${ordered(_transformerUsers[pair]).join(', ')}.");
     });
   }
 
-  /// Returns the set of transformers for [id].
+  /// Instantiates and returns all transformers in the library indicated by
+  /// [config] with the given configuration.
   ///
-  /// It's an error to call this before [load] is called with [id] and the
-  /// future it returns has completed.
-  Set<Transformer> transformersFor(TransformerId id) {
-    if (_transformers.containsKey(id)) return _transformers[id];
+  /// If this is called before the library has been loaded into an isolate via
+  /// [load], it will return an empty set.
+  Future<Set<Transformer>> transformersFor(TransformerConfig config) {
+    if (_transformers.containsKey(config)) {
+      return new Future.value(_transformers[config]);
+    } else if (_isolates.containsKey(config.id)) {
+      return _isolates[config.id].create(config).then((transformers) {
+        if (transformers.isNotEmpty) {
+          _transformers[config] = transformers;
+          return transformers;
+        }
 
-    assert(id.package == '\$dart2js');
+        var message = "No transformers";
+        if (config.configuration.isNotEmpty) {
+          message += " that accept configuration";
+        }
+
+        var location;
+        if (config.id.path == null) {
+          location = 'package:${config.id.package}/transformer.dart or '
+            'package:${config.id.package}/${config.id.package}.dart';
+        } else {
+          location = 'package:$config.dart';
+        }
+
+        var users = toSentence(ordered(_transformerUsers[config.id]));
+        fail("$message were defined in $location,\n"
+            "required by $users.");
+      });
+    } else if (config.id.package != '\$dart2js') {
+      return new Future.value(new Set());
+    }
+
     var transformer;
     try {
       transformer = new Dart2JSTransformer.withSettings(_environment,
-          new BarbackSettings(id.configuration, _environment.mode));
-
-      // Handle any exclusions.
-      transformer = ExcludingTransformer.wrap(transformer,
-          id.includes, id.excludes);
+          new BarbackSettings(config.configuration, _environment.mode));
     } on FormatException catch (error, stackTrace) {
       fail(error.message, error, stackTrace);
     }
 
-    _transformers[id] = new Set.from([transformer]);
-    return _transformers[id];
+    // Handle any exclusions.
+    _transformers[config] = new Set.from(
+        [ExcludingTransformer.wrap(transformer, config)]);
+    return new Future.value(_transformers[config]);
   }
-}
\ No newline at end of file
+
+  /// Loads all transformers defined in each phase of [phases].
+  ///
+  /// If any library hasn't yet been loaded via [load], it will be ignored.
+  Future<List<Set<Transformer>>> transformersForPhases(
+      Iterable<Set<TransformerConfig>> phases) {
+    return Future.wait(phases.map((phase) =>
+            Future.wait(phase.map(transformersFor)).then(unionAll)))
+        // Return a growable list so that callers can add phases.
+        .then((phases) => phases.toList());
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
deleted file mode 100644
index 1a6c2cb..0000000
--- a/sdk/lib/_internal/pub/lib/src/barback/load_transformers.dart
+++ /dev/null
@@ -1,73 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library pub.load_transformers;
-
-import 'dart:async';
-import 'dart:convert';
-import 'dart:isolate';
-
-import '../../../asset/dart/serialize.dart';
-import '../barback.dart';
-import '../dart.dart' as dart;
-import '../log.dart' as log;
-import '../utils.dart';
-import 'asset_environment.dart';
-import 'foreign_transformer.dart';
-import 'barback_server.dart';
-
-/// Load and return all transformers and groups from the library identified by
-/// [id].
-Future<Set> loadTransformers(AssetEnvironment environment,
-    BarbackServer transformerServer, TransformerId id) {
-  return id.getAssetId(environment.barback).then((assetId) {
-    var path = assetId.path.replaceFirst('lib/', '');
-    // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
-
-    var baseUrl = transformerServer.url;
-    var uri = baseUrl.resolve('packages/${id.package}/$path');
-    var code = """
-        import 'dart:isolate';
-
-        import '$uri';
-
-        import r'$baseUrl/packages/\$pub/transformer_isolate.dart';
-
-        void main(_, SendPort replyTo) => loadTransformers(replyTo);
-        """;
-    log.fine("Loading transformers from $assetId");
-
-    var port = new ReceivePort();
-    return dart.runInIsolate(code, port.sendPort)
-        .then((_) => port.first)
-        .then((sendPort) {
-      return call(sendPort, {
-        'library': uri.toString(),
-        'mode': environment.mode.name,
-        // TODO(nweiz): support non-JSON-encodable configuration maps.
-        'configuration': JSON.encode(id.configuration)
-      }).then((transformers) {
-        transformers = transformers.map(
-            (transformer) => deserializeTransformerOrGroup(transformer, id))
-            .toSet();
-        log.fine("Transformers from $assetId: $transformers");
-        return transformers;
-      });
-    }).catchError((error, stackTrace) {
-      if (error is! CrossIsolateException) throw error;
-      if (error.type != 'IsolateSpawnException') throw error;
-      // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
-      // are fixed.
-      if (!error.message.split('\n')[1].startsWith("Failure getting $uri:")) {
-        throw error;
-      }
-
-      // If there was an IsolateSpawnException and the import that actually
-      // failed was the one we were loading transformers from, throw an
-      // application exception with a more user-friendly message.
-      fail('Transformer library "package:${id.package}/$path" not found.',
-          error, stackTrace);
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart b/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
index 8392289..7482d62 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/rewrite_import_transformer.dart
@@ -7,7 +7,8 @@
 import 'dart:async';
 
 import 'package:barback/barback.dart';
-import 'package:analyzer/analyzer.dart';
+
+import '../dart.dart';
 
 /// A transformer used internally to rewrite "package:" imports so they point to
 /// the barback server rather than to pub's package root.
@@ -16,13 +17,12 @@
 
   Future apply(Transform transform) {
     return transform.primaryInput.readAsString().then((contents) {
-      var collector = new _DirectiveCollector();
-      parseDirectives(contents, name: transform.primaryInput.id.toString())
-          .accept(collector);
+      var directives = parseImportsAndExports(contents,
+          name: transform.primaryInput.id.toString());
 
       var buffer = new StringBuffer();
       var index = 0;
-      for (var directive in collector.directives) {
+      for (var directive in directives) {
         var uri = Uri.parse(directive.uri.stringValue);
         if (uri.scheme != 'package') continue;
 
@@ -38,10 +38,3 @@
     });
   }
 }
-
-/// A simple visitor that collects import and export nodes.
-class _DirectiveCollector extends GeneralizingAstVisitor {
-  final directives = <UriBasedDirective>[];
-
-  visitUriBasedDirective(UriBasedDirective node) => directives.add(node);
-}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart b/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
index 725c4fc..fbb7468 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/source_directory.dart
@@ -42,8 +42,8 @@
 
   /// Binds a server running on [hostname]:[port] to this directory.
   Future<BarbackServer> serve() {
-    return BarbackServer.bind(_environment, hostname, port, directory)
-        .then((server) {
+    return BarbackServer.bind(_environment, hostname, port,
+        rootDirectory: directory).then((server) {
       _serverCompleter.complete(server);
       return server;
     });
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
new file mode 100644
index 0000000..676bd8c
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_config.dart
@@ -0,0 +1,136 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.transformer_config;
+
+import 'package:source_maps/source_maps.dart';
+import 'package:yaml/yaml.dart';
+
+import 'transformer_id.dart';
+
+/// The configuration for a transformer.
+///
+/// This corresponds to the transformers listed in a pubspec, which have both an
+/// [id] indicating the location of the transformer and configuration specific
+/// to that use of the transformer.
+class TransformerConfig {
+  /// The [id] of the transformer [this] is configuring.
+  final TransformerId id;
+
+  /// The configuration to pass to the transformer.
+  ///
+  /// Any pub-specific configuration (i.e. keys starting with "$") will have
+  /// been stripped out of this and handled separately. This will be an empty
+  /// map if no configuration was provided.
+  final Map configuration;
+
+  /// The source span from which this configuration was parsed.
+  final Span span;
+
+  /// The primary input inclusions.
+  ///
+  /// Each inclusion is an asset path. If this set is non-empty, then *only*
+  /// matching assets are allowed as a primary input by this transformer. If
+  /// `null`, all assets are included.
+  ///
+  /// This is processed before [excludes]. If a transformer has both includes
+  /// and excludes, then the set of included assets is determined and assets
+  /// are excluded from that resulting set.
+  final Set<String> includes;
+
+  /// The primary input exclusions.
+  ///
+  /// Any asset whose pach is in this is not allowed as a primary input by
+  /// this transformer.
+  ///
+  /// This is processed after [includes]. If a transformer has both includes
+  /// and excludes, then the set of included assets is determined and assets
+  /// are excluded from that resulting set.
+  final Set<String> excludes;
+
+  /// Returns whether this config excludes certain asset ids from being
+  /// processed.
+  bool get hasExclusions => includes != null || excludes != null;
+
+  /// Parses [identifier] as a [TransformerId] with [configuration].
+  ///
+  /// [identifierSpan] is the source span for [identifier].
+  factory TransformerConfig.parse(String identifier, Span identifierSpan,
+        YamlMap configuration) =>
+      new TransformerConfig(new TransformerId.parse(identifier, identifierSpan),
+          configuration);
+
+  factory TransformerConfig(TransformerId id, YamlMap configurationNode) {
+    parseField(key) {
+      if (!configurationNode.containsKey(key)) return null;
+      var fieldNode = configurationNode.nodes[key];
+      var field = fieldNode.value;
+
+      if (field is String) return new Set.from([field]);
+
+      if (field is List) {
+        for (var node in field.nodes) {
+          if (node.value is String) continue;
+          throw new SpanFormatException(
+              '"$key" field may contain only strings.', node.span);
+        }
+
+        return new Set.from(field);
+      } else {
+        throw new SpanFormatException(
+            '"$key" field must be a string or list.', fieldNode.span);
+      }
+    }
+
+    var includes = null;
+    var excludes = null;
+
+    var configuration;
+    var span;
+    if (configurationNode == null) {
+      configuration = {};
+      span = id.span;
+    } else {
+      // Don't write to the immutable YAML map.
+      configuration = new Map.from(configurationNode);
+      span = configurationNode.span;
+
+      // Pull out the exclusions/inclusions.
+      includes = parseField("\$include");
+      configuration.remove("\$include");
+      excludes = parseField("\$exclude");
+      configuration.remove("\$exclude");
+
+      // All other keys starting with "$" are unexpected.
+      for (var key in configuration.keys) {
+        if (key is! String || !key.startsWith(r'$')) continue;
+        throw new SpanFormatException(
+            'Unknown reserved field.', configurationNode.nodes[key].span);
+      }
+    }
+
+    return new TransformerConfig._(id, configuration, span, includes, excludes);
+  }
+
+  TransformerConfig._(
+      this.id, this.configuration, this.span, this.includes, this.excludes);
+
+  String toString() => id.toString();
+
+  /// Returns whether the include/exclude rules allow the transformer to run on
+  /// [pathWithinPackage].
+  ///
+  /// [pathWithinPackage] must be a URL-style path relative to the containing
+  /// package's root directory.
+  bool canTransform(String pathWithinPackage) {
+    // TODO(rnystrom): Support globs in addition to paths. See #17093.
+    if (excludes != null) {
+      // If there are any excludes, it must not match any of them.
+      if (excludes.contains(pathWithinPackage)) return false;
+    }
+
+    // If there are any includes, it must match one of them.
+    return includes == null || includes.contains(pathWithinPackage);
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
new file mode 100644
index 0000000..e793ef3
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_id.dart
@@ -0,0 +1,105 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.transformer_id;
+
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+import 'package:source_maps/source_maps.dart';
+
+import '../io.dart';
+import '../utils.dart';
+
+/// A list of the names of all built-in transformers that pub exposes.
+const _BUILT_IN_TRANSFORMERS = const ['\$dart2js'];
+
+/// An identifier that indicates the library that contains a transformer.
+///
+/// It's possible that the library identified by [this] defines multiple
+/// transformers. If so, they're all always loaded in the same phase.
+class TransformerId {
+  /// The package containing the library where the transformer is defined.
+  final String package;
+
+  /// The `/`-separated path to the library that contains this transformer.
+  ///
+  /// This is relative to the `lib/` directory in [package], and doesn't end in
+  /// `.dart`.
+  ///
+  /// This can be null; if so, it indicates that the transformer(s) should be
+  /// loaded from `lib/transformer.dart` if that exists, and `lib/$package.dart`
+  /// otherwise.
+  final String path;
+
+  /// The source span from which this id was parsed.
+  final Span span;
+
+  /// Whether this ID points to a built-in transformer exposed by pub.
+  bool get isBuiltInTransformer => package.startsWith('\$');
+
+  /// Parses a transformer identifier.
+  ///
+  /// A transformer identifier is a string of the form "package_name" or
+  /// "package_name/path/to/library". It does not have a trailing extension. If
+  /// it just has a package name, it expands to lib/transformer.dart if that
+  /// exists, or lib/${package}.dart otherwise. Otherwise, it expands to
+  /// lib/${path}.dart. In either case it's located in the given package.
+  factory TransformerId.parse(String identifier, Span span) {
+    if (identifier.isEmpty) {
+      throw new FormatException('Invalid library identifier: "".');
+    }
+
+    var parts = split1(identifier, "/");
+    if (parts.length == 1) {
+      return new TransformerId(parts.single, null, span);
+    }
+
+    return new TransformerId(parts.first, parts.last, span);
+  }
+
+  TransformerId(this.package, this.path, this.span) {
+    if (!package.startsWith('\$')) return;
+    if (_BUILT_IN_TRANSFORMERS.contains(package)) return;
+    throw new SpanFormatException('Unsupported built-in transformer $package.',
+        span);
+  }
+
+  bool operator==(other) =>
+      other is TransformerId && other.package == package && other.path == path;
+
+  int get hashCode => package.hashCode ^ path.hashCode;
+
+  String toString() => path == null ? package : '$package/$path';
+
+  /// Returns the asset id for the library identified by this transformer id.
+  ///
+  /// If `path` is null, this will determine which library to load. Unlike
+  /// [getAssetId], this doesn't take generated assets into account; it's used
+  /// to determine transformers' dependencies, which requires looking at files
+  /// on disk.
+  Future<AssetId> getAssetId(Barback barback) {
+    if (path != null) {
+      return new Future.value(new AssetId(package, 'lib/$path.dart'));
+    }
+
+    var transformerAsset = new AssetId(package, 'lib/transformer.dart');
+    return barback.getAssetById(transformerAsset).then((_) => transformerAsset)
+        .catchError((e) => new AssetId(package, 'lib/$package.dart'),
+            test: (e) => e is AssetNotFoundException);
+  }
+
+  /// Returns the path to the library identified by this transformer within
+  /// [packageDir], which should be the directory of [package].
+  ///
+  /// If `path` is null, this will determine which library to load.
+  String getFullPath(String packageDir) {
+    if (path != null) return p.join(packageDir, 'lib', p.fromUri('$path.dart'));
+
+    var transformerPath = p.join(packageDir, 'lib', 'transformer.dart');
+    if (fileExists(transformerPath)) return transformerPath;
+    return p.join(packageDir, 'lib', '$package.dart');
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
new file mode 100644
index 0000000..2cb9e6d
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformer_isolate.dart
@@ -0,0 +1,117 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.transformer_isolate;
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:isolate';
+
+import 'package:barback/barback.dart';
+
+import '../../../asset/dart/serialize.dart';
+import '../barback.dart';
+import '../dart.dart' as dart;
+import '../log.dart' as log;
+import '../utils.dart';
+import 'asset_environment.dart';
+import 'barback_server.dart';
+import 'foreign_transformer.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+
+/// A wrapper for an isolate from which transformer plugins can be instantiated.
+class TransformerIsolate {
+  /// The port used to communicate with the wrapped isolate.
+  final SendPort _port;
+
+  /// A map indicating the barback server URLs for each [TransformerId] that's
+  /// loaded in the wrapped isolate.
+  ///
+  /// A barback server URL is the URL for the library that the given id
+  /// identifies. For example, the URL for "polymer/src/mirrors_remover" might
+  /// be "http://localhost:56234/packages/polymer/src/mirrors_remover.dart".
+  final Map<TransformerId, Uri> _idsToUrls;
+
+  /// The barback mode for this run of pub.
+  final BarbackMode _mode;
+
+  /// Spawns an isolate that loads all transformer libraries defined by [ids].
+  ///
+  /// This doesn't actually instantiate any transformers, since a
+  /// [TransformerId] doesn't define the transformers' configuration. The
+  /// transformers can be constructed using [create].
+  static Future<TransformerIsolate> spawn(AssetEnvironment environment,
+      BarbackServer transformerServer, List<TransformerId> ids) {
+    return mapFromIterableAsync(ids, value: (id) {
+      return id.getAssetId(environment.barback);
+    }).then((idsToAssetIds) {
+      var baseUrl = transformerServer.url;
+      var idsToUrls = mapMap(idsToAssetIds, value: (id, assetId) {
+        var path = assetId.path.replaceFirst('lib/', '');
+        // TODO(nweiz): load from a "package:" URI when issue 12474 is fixed.
+        return baseUrl.resolve('packages/${id.package}/$path');
+      });
+
+      var code = new StringBuffer();
+      code.writeln("import 'dart:isolate';");
+
+      for (var url in idsToUrls.values) {
+        code.writeln("import '$url';");
+      }
+
+      code.writeln("import "
+          "r'$baseUrl/packages/\$pub/transformer_isolate.dart';");
+      code.writeln(
+          "void main(_, SendPort replyTo) => loadTransformers(replyTo);");
+
+      log.fine("Loading transformers from $ids");
+
+      var port = new ReceivePort();
+      return dart.runInIsolate(code.toString(), port.sendPort)
+          .then((_) => port.first)
+          .then((sendPort) {
+        return new TransformerIsolate._(sendPort, environment.mode, idsToUrls);
+      }).catchError((error, stackTrace) {
+        if (error is! CrossIsolateException) throw error;
+        if (error.type != 'IsolateSpawnException') throw error;
+
+        // TODO(nweiz): don't parse this as a string once issues 12617 and 12689
+        // are fixed.
+        var firstErrorLine = error.message.split('\n')[1];
+        var missingTransformer = idsToUrls.keys.firstWhere((id) =>
+                firstErrorLine.startsWith("Failure getting ${idsToUrls[id]}:"),
+            orElse: () => throw error);
+        var packageUri = idToPackageUri(idsToAssetIds[missingTransformer]);
+
+        // If there was an IsolateSpawnException and the import that actually
+        // failed was the one we were loading transformers from, throw an
+        // application exception with a more user-friendly message.
+        fail('Transformer library "$packageUri" not found.',
+            error, stackTrace);
+      });
+    });
+  }
+
+  TransformerIsolate._(this._port, this._mode, this._idsToUrls);
+
+  /// Instantiate the transformers in the [config.id] with
+  /// [config.configuration].
+  ///
+  /// If there are no transformers defined in the given library, this will
+  /// return an empty set.
+  Future<Set<Transformer>> create(TransformerConfig config) {
+    return call(_port, {
+      'library': _idsToUrls[config.id].toString(),
+      'mode': _mode.name,
+      'configuration': JSON.encode(config.configuration)
+    }).then((transformers) {
+      transformers = transformers.map(
+          (transformer) => deserializeTransformerLike(transformer, config))
+          .toSet();
+      log.fine("Transformers from $config: $transformers");
+      return transformers;
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart b/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
new file mode 100644
index 0000000..e61e1c4
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/barback/transformers_needed_by_transformers.dart
@@ -0,0 +1,395 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.barback.transformers_needed_by_transformers;
+
+import 'package:path/path.dart' as p;
+
+import '../dart.dart';
+import '../io.dart';
+import '../package.dart';
+import '../package_graph.dart';
+import '../utils.dart';
+import 'cycle_exception.dart';
+import 'transformer_config.dart';
+import 'transformer_id.dart';
+
+/// Returns a dependency graph for transformers in [graph].
+///
+/// This graph is represented by a map whose keys are the vertices and whose
+/// values are sets representing edges from the given vertex. Each vertex is a
+/// [TransformerId]. If there's an edge from `T1` to `T2`, then `T2` must be
+/// loaded before `T1` can be loaded.
+///
+/// The returned graph is transitively closed. That is, if there's an edge from
+/// `T1` to `T2` and an edge from `T2` to `T3`, there's also an edge from `T1`
+/// to `T2`.
+Map<TransformerId, Set<TransformerId>> computeTransformersNeededByTransformers(
+    PackageGraph graph) {
+  var result = {};
+  var computer = new _DependencyComputer(graph);
+  for (var packageName in ordered(graph.packages.keys)) {
+    var package = graph.packages[packageName];
+    for (var phase in package.pubspec.transformers) {
+      for (var config in phase) {
+        var id = config.id;
+        if (id.isBuiltInTransformer) continue;
+        result[id] = computer.transformersNeededByTransformer(id);
+      }
+    }
+  }
+  return result;
+}
+
+/// A helper class for [computeTransformersNeededByTransformers] that keeps
+/// package-graph-wide state and caches over the course of the computation.
+class _DependencyComputer {
+  /// The package graph being analyzed.
+  final PackageGraph _graph;
+
+  /// The names of packages for which [_PackageDependencyComputer]s are
+  /// currently loading.
+  ///
+  /// This is used to detect transformer cycles. If a package's libraries or
+  /// transformers are referenced while the transformers that apply to it are
+  /// being processed, that indicates an unresolvable cycle.
+  final _loadingPackageComputers = new Set<String>();
+
+  /// [_PackageDependencyComputer]s that have been loaded.
+  final _packageComputers = new Map<String, _PackageDependencyComputer>();
+
+  /// A cache of the results of [transformersNeededByPackage].
+  final _transformersNeededByPackages = new Map<String, Set<TransformerId>>();
+
+  _DependencyComputer(this._graph) {
+    ordered(_graph.packages.keys).forEach(_loadPackageComputer);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before [id] is
+  /// loaded.
+  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+    if (id.isBuiltInTransformer) return new Set();
+    _loadPackageComputer(id.package);
+    return _packageComputers[id.package].transformersNeededByTransformer(id);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// [packageUri] (a "package:" URI) can be safely imported from an external
+  /// package.
+  Set<TransformerId> transformersNeededByPackageUri(Uri packageUri) {
+    // TODO(nweiz): We can do some pre-processing on the package graph (akin to
+    // the old ordering dependency computation) to figure out which packages are
+    // guaranteed not to require any transformers. That'll let us avoid extra
+    // work here and in [transformersNeededByPackage].
+
+    var components = p.split(p.fromUri(packageUri.path));
+    var packageName = components.first;
+    var package = _graph.packages[packageName];
+    if (package == null) {
+      // TODO(nweiz): include source range information here.
+      fail('A transformer imported unknown package "$packageName" (in '
+          '"$packageUri").');
+    }
+
+    var library = p.join(package.dir, 'lib', p.joinAll(components.skip(1)));
+
+    _loadPackageComputer(packageName);
+    return _packageComputers[packageName].transformersNeededByLibrary(library);
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// everything in [rootPackage] can be used.
+  ///
+  /// This is conservative in that it returns all transformers that could
+  /// theoretically affect [rootPackage]. It only looks at which transformers
+  /// packages use and which packages they depend on; it ignores imports
+  /// entirely.
+  ///
+  /// We fall back on this conservative analysis when a transformer
+  /// (transitively) imports a transformed library. The result of the
+  /// transformation may import any dependency or hit any transformer, so we
+  /// have to assume that it will.
+  Set<TransformerId> transformersNeededByPackage(String rootPackage) {
+    if (_transformersNeededByPackages.containsKey(rootPackage)) {
+      return _transformersNeededByPackages[rootPackage];
+    }
+
+    var results = new Set();
+    var seen = new Set();
+
+    traversePackage(packageName) {
+      if (seen.contains(packageName)) return;
+      seen.add(packageName);
+
+      var package = _graph.packages[packageName];
+      for (var phase in package.pubspec.transformers) {
+        for (var config in phase) {
+          var id = config.id;
+          if (id.isBuiltInTransformer) continue;
+          if (_loadingPackageComputers.contains(id.package)) {
+            throw new CycleException("$packageName is transformed by $id");
+          }
+          results.add(id);
+        }
+      }
+
+      var dependencies = packageName == _graph.entrypoint.root.name ?
+          package.immediateDependencies : package.dependencies;
+      for (var dep in dependencies) {
+        try {
+          traversePackage(dep.name);
+        } on CycleException catch (error) {
+          throw error.prependStep("$packageName depends on ${dep.name}");
+        }
+      }
+    }
+
+    traversePackage(rootPackage);
+    _transformersNeededByPackages[rootPackage] = results;
+    return results;
+  }
+
+
+  /// Ensure that a [_PackageDependencyComputer] for [packageName] is loaded.
+  ///
+  /// If the computer has already been loaded, this does nothing. If the
+  /// computer is in the process of being loaded, this throws a
+  /// [CycleException].
+  void _loadPackageComputer(String packageName) {
+    if (_loadingPackageComputers.contains(packageName)) {
+      throw new CycleException();
+    }
+    if (_packageComputers.containsKey(packageName)) return;
+    _loadingPackageComputers.add(packageName);
+    _packageComputers[packageName] =
+        new _PackageDependencyComputer(this, packageName);
+    _loadingPackageComputers.remove(packageName);
+  }
+}
+
+/// A helper class for [computeTransformersNeededByTransformers] that keeps
+/// package-specific state and caches over the course of the computation.
+class _PackageDependencyComputer {
+  /// The parent [_DependencyComputer].
+  final _DependencyComputer _dependencyComputer;
+
+  /// The package whose dependencies [this] is computing.
+  final Package _package;
+
+  /// The set of transformers that currently apply to [this].
+  ///
+  /// This is added to phase-by-phase while [this] is being initialized. This is
+  /// necessary to model the dependencies of a transformer that's applied to its
+  /// own package.
+  final _applicableTransformers = new Set<TransformerConfig>();
+
+  /// A cache of imports and exports parsed from libraries in this package.
+  final _directives = new Map<Uri, Set<Uri>>();
+
+  /// The set of libraries for which there are currently active
+  /// [transformersNeededByLibrary] calls.
+  ///
+  /// This is used to guard against infinite loops caused by libraries in
+  /// different packages importing one another circularly.
+  /// [transformersNeededByLibrary] will return an empty set for any active
+  /// libraries.
+  final _activeLibraries = new Set<String>();
+
+  /// A cache of the results of [transformersNeededByTransformer].
+  final _transformersNeededByTransformers =
+      new Map<TransformerId, Set<TransformerId>>();
+
+  /// A cache of the results of [_getTransitiveExternalDirectives].
+  ///
+  /// This is invalidated whenever [_applicableTransformers] changes.
+  final _transitiveExternalDirectives = new Map<String, Set<Uri>>();
+
+  _PackageDependencyComputer(_DependencyComputer dependencyComputer,
+          String packageName)
+      : _dependencyComputer = dependencyComputer,
+        _package = dependencyComputer._graph.packages[packageName] {
+    // If [_package] uses its own transformers, there will be fewer transformers
+    // running on [_package] while its own transformers are loading than there
+    // will be once all its transformers are finished loading. To handle this,
+    // we run [transformersNeededByTransformer] to pre-populate
+    // [_transformersNeededByLibraries] while [_applicableTransformers] is
+    // smaller.
+    for (var phase in _package.pubspec.transformers) {
+      for (var config in phase) {
+        var id = config.id;
+        try {
+          if (id.package != _package.name) {
+            // Probe [id]'s transformer dependencies to ensure that it doesn't
+            // depend on this package. If it does, a CycleError will be thrown.
+            _dependencyComputer.transformersNeededByTransformer(id);
+          } else {
+            // Store the transformers needed specifically with the current set
+            // of [_applicableTransformers]. When reporting this transformer's
+            // dependencies, [computeTransformersNeededByTransformers] will use
+            // this stored set of dependencies rather than the potentially wider
+            // set that would be recomputed if [transformersNeededByLibrary]
+            // were called anew.
+            _transformersNeededByTransformers[id] =
+                transformersNeededByLibrary(id.getFullPath(_package.dir));
+          }
+        } on CycleException catch (error) {
+          throw error.prependStep("$packageName is transformed by $id");
+        }
+      }
+
+      // Clear the cached imports and exports because the new transformers may
+      // start transforming a library whose directives were previously
+      // statically analyzable.
+      _transitiveExternalDirectives.clear();
+      _applicableTransformers.addAll(phase);
+    }
+  }
+
+  /// Returns the set of all transformers that need to be loaded before [id] is
+  /// loaded.
+  ///
+  /// [id] must refer to a transformer in [_package].
+  Set<TransformerId> transformersNeededByTransformer(TransformerId id) {
+    assert(id.package == _package.name);
+    if (_transformersNeededByTransformers.containsKey(id)) {
+      return _transformersNeededByTransformers[id];
+    }
+
+    _transformersNeededByTransformers[id] =
+        transformersNeededByLibrary(id.getFullPath(_package.dir));
+    return _transformersNeededByTransformers[id];
+  }
+
+  /// Returns the set of all transformers that need to be loaded before
+  /// [library] is imported.
+  ///
+  /// If [library] or anything it imports/exports within this package is
+  /// transformed by [_applicableTransformers], this will return a conservative
+  /// set of transformers (see also
+  /// [_DependencyComputer.transformersNeededByPackage]).
+  Set<TransformerId> transformersNeededByLibrary(String library) {
+    library = p.normalize(library);
+    if (_activeLibraries.contains(library)) return new Set();
+    _activeLibraries.add(library);
+
+    try {
+      var externalDirectives = _getTransitiveExternalDirectives(library);
+      if (externalDirectives == null) {
+        var rootName = _dependencyComputer._graph.entrypoint.root.name;
+        var dependencies = _package.name == rootName ?
+            _package.immediateDependencies : _package.dependencies;
+
+        // If anything transitively imported/exported by [library] within this
+        // package is modified by a transformer, we don't know what it will
+        // load, so we take the conservative approach and say it depends on
+        // everything.
+        return _applicableTransformers.map((config) => config.id).toSet().union(
+            unionAll(dependencies.map((dep) {
+          try {
+            return _dependencyComputer.transformersNeededByPackage(dep.name);
+          } on CycleException catch (error) {
+            throw error.prependStep("${_package.name} depends on ${dep.name}");
+          }
+        })));
+      } else {
+        // If nothing's transformed, then we only depend on the transformers
+        // used by the external packages' libraries that we import or export.
+        return unionAll(externalDirectives.map((uri) {
+          try {
+            return _dependencyComputer.transformersNeededByPackageUri(uri);
+          } on CycleException catch (error) {
+            var packageName = p.url.split(uri.path).first;
+            throw error.prependStep("${_package.name} depends on $packageName");
+          }
+        }));
+      }
+    } finally {
+      _activeLibraries.remove(library);
+    }
+  }
+
+  /// Returns the set of all external package libraries transitively imported or
+  /// exported by [rootLibrary].
+  ///
+  /// All of the returned URIs will have the "package:" scheme. None of them
+  /// will be URIs for this package.
+  ///
+  /// If [rootLibrary] transitively imports or exports a library that's modified
+  /// by a transformer, this will return `null`.
+  Set<Uri> _getTransitiveExternalDirectives(String rootLibrary) {
+    rootLibrary = p.normalize(rootLibrary);
+    if (_transitiveExternalDirectives.containsKey(rootLibrary)) {
+      return _transitiveExternalDirectives[rootLibrary];
+    }
+
+    var results = new Set();
+    var seen = new Set();
+
+    traverseLibrary(library) {
+      library = p.normalize(library);
+      if (seen.contains(library)) return true;
+      seen.add(library);
+
+      var directives = _getDirectives(library);
+      if (directives == null) return false;
+
+      for (var uri in directives) {
+        var path;
+        if (uri.scheme == 'package') {
+          var components = p.split(p.fromUri(uri.path));
+          if (components.first != _package.name) {
+            results.add(uri);
+            continue;
+          }
+
+          path = p.join(_package.dir, 'lib', p.joinAll(components.skip(1)));
+        } else if (uri.scheme == '' || uri.scheme == 'file') {
+          path = p.join(p.dirname(library), p.fromUri(uri));
+        } else {
+          // Ignore "dart:" URIs and theoretically-possible "http:" URIs.
+          continue;
+        }
+
+        if (!traverseLibrary(path)) return false;
+      }
+
+      return true;
+    }
+
+    _transitiveExternalDirectives[rootLibrary] =
+        traverseLibrary(rootLibrary) ? results : null;
+    return _transitiveExternalDirectives[rootLibrary];
+  }
+
+  /// Returns the set of all imports or exports in [library].
+  ///
+  /// If [library] is modified by a transformer, this will return `null`.
+  Set<Uri> _getDirectives(String library) {
+    var libraryUri = p.toUri(p.normalize(library));
+    var relative = p.toUri(p.relative(library, from: _package.dir)).path;
+    if (_applicableTransformers.any((config) =>
+            config.canTransform(relative))) {
+      _directives[libraryUri] = null;
+      return null;
+    }
+
+    // Check the cache *after* checking [_applicableTransformers] because
+    // [_applicableTransformers] changes over time so the directives may be
+    // invalidated.
+    if (_directives.containsKey(libraryUri)) return _directives[libraryUri];
+
+    // If a nonexistent library is imported, it will probably be generated by a
+    // transformer.
+    if (!fileExists(library)) {
+      _directives[libraryUri] = null;
+      return null;
+    }
+
+    _directives[libraryUri] =
+        parseImportsAndExports(readTextFile(library), name: library)
+        .map((directive) => Uri.parse(directive.uri.stringValue))
+        .toSet();
+    return _directives[libraryUri];
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
index 7722b94..a580a2c 100644
--- a/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
+++ b/sdk/lib/_internal/pub/lib/src/barback/web_socket_api.dart
@@ -23,14 +23,14 @@
 /// This is a [JSON-RPC 2.0](http://www.jsonrpc.org/specification) server. Its
 /// methods are described in the method-level documentation below.
 class WebSocketApi {
-  final CompatibleWebSocket _socket;
   final AssetEnvironment _environment;
-  final _server = new json_rpc.Server();
+  final json_rpc.Server _server;
 
   /// Whether the application should exit when this connection closes.
   bool _exitOnClose = false;
 
-  WebSocketApi(this._socket, this._environment) {
+  WebSocketApi(CompatibleWebSocket socket, this._environment)
+      : _server = new json_rpc.Server(socket) {
     _server.registerMethod("urlToAssetId", _urlToAssetId);
     _server.registerMethod("pathToUrls", _pathToUrls);
     _server.registerMethod("serveDirectory", _serveDirectory);
@@ -51,11 +51,7 @@
   /// complete with an error if the socket had an error, otherwise it will
   /// complete to `null`.
   Future listen() {
-    return _socket.listen((request) {
-      _server.parseRequest(request).then((response) {
-        if (response != null) _socket.add(response);
-      });
-    }, cancelOnError: true).asFuture().then((_) {
+    return _server.listen().then((_) {
       if (!_exitOnClose) return;
       log.message("WebSocket connection closed, terminating.");
       flushThenExit(exit_codes.SUCCESS);
@@ -303,7 +299,6 @@
   }
 }
 
-
 /// The pub-specific JSON RPC error codes.
 class _Error {
   /// The specified directory is not being served.
diff --git a/sdk/lib/_internal/pub/lib/src/command.dart b/sdk/lib/_internal/pub/lib/src/command.dart
index 3cfb07a..1765c10 100644
--- a/sdk/lib/_internal/pub/lib/src/command.dart
+++ b/sdk/lib/_internal/pub/lib/src/command.dart
@@ -17,11 +17,13 @@
 import 'command/help.dart';
 import 'command/lish.dart';
 import 'command/list_package_dirs.dart';
+import 'command/run.dart';
 import 'command/serve.dart';
 import 'command/upgrade.dart';
 import 'command/uploader.dart';
 import 'command/version.dart';
 import 'entrypoint.dart';
+import 'exceptions.dart';
 import 'exit_codes.dart' as exit_codes;
 import 'log.dart' as log;
 import 'system_cache.dart';
@@ -133,8 +135,10 @@
   /// parsed after a non-option argument is parsed.
   bool get allowTrailingOptions => true;
 
-  /// Alternate names for this command. These names won't be used in the
-  /// documentation, but they will work when invoked on the command line.
+  /// Alternate names for this command.
+  ///
+  /// These names won't be used in the documentation, but they will work when
+  /// invoked on the command line.
   final aliases = const <String>[];
 
   /// The [ArgParser] for this command.
@@ -253,6 +257,7 @@
     'deps': new DepsCommand(),
     'list-package-dirs': new ListPackageDirsCommand(),
     'publish': new LishCommand(),
+    'run': new RunCommand(),
     'serve': new ServeCommand(),
     'upgrade': new UpgradeCommand(),
     'uploader': new UploaderCommand(),
diff --git a/sdk/lib/_internal/pub/lib/src/command/barback.dart b/sdk/lib/_internal/pub/lib/src/command/barback.dart
index b7df78b..bfae53b 100644
--- a/sdk/lib/_internal/pub/lib/src/command/barback.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/barback.dart
@@ -33,8 +33,8 @@
   /// build environment.
   final sourceDirectories = new Set<String>();
 
-  /// Override this to specify the default build mode.
-  BarbackMode get defaultMode;
+  /// The default build mode.
+  BarbackMode get defaultMode => BarbackMode.RELEASE;
 
   /// Override this to specify the default source directories if none are
   /// provided on the command line.
diff --git a/sdk/lib/_internal/pub/lib/src/command/build.dart b/sdk/lib/_internal/pub/lib/src/command/build.dart
index 353921d..b741f40 100644
--- a/sdk/lib/_internal/pub/lib/src/command/build.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/build.dart
@@ -27,8 +27,6 @@
   /// The path to the application's build output directory.
   String get outputDirectory => commandOptions["output"];
 
-  BarbackMode get defaultMode => BarbackMode.RELEASE;
-
   List<String> get defaultSourceDirectories => ["web"];
 
   /// The number of files that have been built and written to disc so far.
@@ -53,9 +51,8 @@
     // Since this server will only be hit by the transformer loader and isn't
     // user-facing, just use an IPv4 address to avoid a weird bug on the
     // OS X buildbots.
-    return AssetEnvironment.create(entrypoint, "127.0.0.1", 0, mode,
-        WatcherType.NONE, useDart2JS: true)
-          .then((environment) {
+    return AssetEnvironment.create(entrypoint, mode, WatcherType.NONE,
+        useDart2JS: true).then((environment) {
       // Show in-progress errors, but not results. Those get handled
       // implicitly by getAllAssets().
       environment.barback.errors.listen((error) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
index d858a46..4a731a2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/cache_add.dart
@@ -63,8 +63,7 @@
 
       if (versions.isEmpty) {
         // TODO(rnystrom): Show most recent unmatching version?
-        throw new ApplicationException(
-            "Package $package has no versions that match $constraint.");
+        fail("Package $package has no versions that match $constraint.");
       }
 
       downloadVersion(Version version) {
diff --git a/sdk/lib/_internal/pub/lib/src/command/get.dart b/sdk/lib/_internal/pub/lib/src/command/get.dart
index fbe86ae..97dd50e 100644
--- a/sdk/lib/_internal/pub/lib/src/command/get.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/get.dart
@@ -7,7 +7,6 @@
 import 'dart:async';
 
 import '../command.dart';
-import '../log.dart' as log;
 
 /// Handles the `get` pub command.
 class GetCommand extends PubCommand {
@@ -19,10 +18,12 @@
   GetCommand() {
     commandParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
+
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: "Report what dependencies would change but don't change any.");
   }
 
   Future onRun() {
-    return entrypoint.acquireDependencies()
-        .then((_) => log.message("Got dependencies!"));
+    return entrypoint.acquireDependencies(dryRun: commandOptions['dry-run']);
   }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/command/lish.dart b/sdk/lib/_internal/pub/lib/src/command/lish.dart
index 7706f40..8e0c5c2 100644
--- a/sdk/lib/_internal/pub/lib/src/command/lish.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/lish.dart
@@ -83,7 +83,7 @@
         // TODO(nweiz): the response may have XML-formatted information about
         // the error. Try to parse that out once we have an easily-accessible
         // XML parser.
-        throw new ApplicationException('Failed to upload the package.');
+        fail('Failed to upload the package.');
       } else if (urisEqual(Uri.parse(url.origin), Uri.parse(server.origin))) {
         handleJsonError(error.response);
       } else {
@@ -97,17 +97,17 @@
       usageError('Cannot use both --force and --dry-run.');
     }
 
-    var packageBytesFuture = entrypoint.packageFiles().then((files) {
-      log.fine('Archiving and publishing ${entrypoint.root}.');
+    var files = entrypoint.root.listFiles();
+    log.fine('Archiving and publishing ${entrypoint.root}.');
 
-      // Show the package contents so the user can verify they look OK.
-      var package = entrypoint.root;
-      log.message(
-          'Publishing ${package.name} ${package.version} to $server:\n'
-          '${tree.fromFiles(files, baseDir: entrypoint.root.dir)}');
+    // Show the package contents so the user can verify they look OK.
+    var package = entrypoint.root;
+    log.message(
+        'Publishing ${package.name} ${package.version} to $server:\n'
+        '${tree.fromFiles(files, baseDir: entrypoint.root.dir)}');
 
-      return createTarGz(files, baseDir: entrypoint.root.dir);
-    }).then((stream) => stream.toBytes());
+    var packageBytesFuture = createTarGz(files, baseDir: entrypoint.root.dir)
+        .toBytes();
 
     // Validate the package.
     return _validate(packageBytesFuture.then((bytes) => bytes.length))
diff --git a/sdk/lib/_internal/pub/lib/src/command/run.dart b/sdk/lib/_internal/pub/lib/src/command/run.dart
new file mode 100644
index 0000000..5973ca7
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/command/run.dart
@@ -0,0 +1,140 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub.command.run;
+
+import 'dart:async';
+import 'dart:io';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as path;
+import 'package:stack_trace/stack_trace.dart';
+
+import '../barback/asset_environment.dart';
+import '../command.dart';
+import '../exit_codes.dart' as exit_codes;
+import '../io.dart';
+import '../log.dart' as log;
+import '../utils.dart';
+
+final _arrow = getSpecial('\u2192', '=>');
+
+/// Handles the `run` pub command.
+class RunCommand extends PubCommand {
+  bool get takesArguments => true;
+  bool get allowTrailingOptions => false;
+  String get description => "Run an executable from a package.";
+  String get usage => "pub run <executable> [args...]";
+
+  Future onRun() {
+    if (commandOptions.rest.isEmpty) {
+      usageError("Must specify an executable to run.");
+    }
+
+    // Unless the user overrides the verbosity, we want to filter out the
+    // normal pub output shown while loading the environment.
+    if (log.verbosity == log.Verbosity.NORMAL) {
+      log.verbosity = log.Verbosity.WARNING;
+    }
+
+    var environment;
+    var package = entrypoint.root.name;
+    var rootDir;
+    var scriptPath;
+    var args;
+    return AssetEnvironment.create(entrypoint, BarbackMode.RELEASE,
+        WatcherType.NONE, useDart2JS: false)
+          .then((_environment) {
+      environment = _environment;
+
+      // Show in-progress errors, but not results. Those get handled
+      // implicitly by getAllAssets().
+      environment.barback.errors.listen((error) {
+        log.error(log.red("Build error:\n$error"));
+      });
+
+      var script = commandOptions.rest[0];
+      args = commandOptions.rest.skip(1).toList();
+
+      // A command like "foo:bar" runs the "bar" script from the "foo" package.
+      // If there is no colon prefix, default to the root package.
+      if (script.contains(":")) {
+        var components = split1(script, ":");
+        package = components[0];
+        script = components[1];
+
+        var dep = entrypoint.root.immediateDependencies.firstWhere(
+            (dep) => dep.name == package, orElse: () => null);
+        if (dep == null) {
+          if (environment.graph.packages.containsKey(package)) {
+            dataError('Package "$package" is not an immediate dependency.\n'
+                'Cannot run executables in transitive dependencies.');
+          } else {
+            dataError('Could not find package "$package". Did you forget to '
+                'add a dependency?');
+          }
+        }
+      }
+
+      // If the command has a path separator, then it's a path relative to the
+      // root of the package. Otherwise, it's implicitly understood to be in
+      // "bin".
+      var parts = path.split(script);
+      if (parts.length > 1) {
+        if (package != entrypoint.root.name) {
+          usageError("Can not run an executable in a subdirectory of a "
+              "dependency.");
+        }
+
+        scriptPath = "${path.url.joinAll(parts.skip(1))}.dart";
+        rootDir = parts.first;
+      } else {
+        scriptPath = "$script.dart";
+        rootDir = "bin";
+      }
+
+      if (package == entrypoint.root.name) {
+        // Serve the entire root-most directory containing the entrypoint. That
+        // ensures that, for example, things like `import '../../utils.dart';`
+        // will work from within some deeply nested script.
+        return environment.serveDirectory(rootDir);
+      } else {
+        // For other packages, always use the "bin" directory.
+        return environment.servePackageBinDirectory(package);
+      }
+    }).then((server) {
+      // Try to make sure the entrypoint script exists (or is generated) before
+      // we spawn the process to run it.
+      return environment.barback.getAssetById(
+          new AssetId(package, path.url.join(rootDir, scriptPath))).then((_) {
+
+        // Run in checked mode.
+        // TODO(rnystrom): Make this configurable.
+        var mode = "--checked";
+        args = [mode, server.url.resolve(scriptPath).toString()]..addAll(args);
+
+        return Process.start(Platform.executable, args).then((process) {
+          // Note: we're not using process.std___.pipe(std___) here because
+          // that prevents pub from also writing to the output streams.
+          process.stderr.listen(stderr.add);
+          process.stdout.listen(stdout.add);
+          stdin.listen(process.stdin.add);
+
+          return process.exitCode;
+        }).then(flushThenExit);
+      }).catchError((error, stackTrace) {
+        if (error is! AssetNotFoundException) throw error;
+
+        var message = "Could not find ${path.join(rootDir, scriptPath)}";
+        if (package != entrypoint.root.name) {
+          message += " in package $package";
+        }
+
+        log.error("$message.");
+        log.fine(new Chain.forTrace(stackTrace));
+        return flushThenExit(exit_codes.NO_INPUT);
+      });
+    });
+  }
+}
diff --git a/sdk/lib/_internal/pub/lib/src/command/serve.dart b/sdk/lib/_internal/pub/lib/src/command/serve.dart
index 55895d6..0c56f2a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/serve.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/serve.dart
@@ -86,8 +86,9 @@
     var watcherType = commandOptions['force-poll'] ?
         WatcherType.POLLING : WatcherType.AUTO;
 
-    return AssetEnvironment.create(entrypoint, hostname, port, mode,
-        watcherType, useDart2JS: useDart2JS).then((environment) {
+    return AssetEnvironment.create(entrypoint, mode, watcherType,
+        hostname: hostname, basePort: port, useDart2JS: useDart2JS)
+        .then((environment) {
 
       var directoryLength = sourceDirectories.map((dir) => dir.length)
           .reduce(math.max);
diff --git a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
index 64a5b15..a899d0a 100644
--- a/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
+++ b/sdk/lib/_internal/pub/lib/src/command/upgrade.dart
@@ -22,22 +22,15 @@
   UpgradeCommand() {
     commandParser.addFlag('offline',
         help: 'Use cached packages instead of accessing the network.');
+
+    commandParser.addFlag('dry-run', abbr: 'n', negatable: false,
+        help: "Report what dependencies would change but don't change any.");
   }
 
   Future onRun() {
-    var upgradeAll = commandOptions.rest.isEmpty;
+    var dryRun = commandOptions['dry-run'];
     return entrypoint.acquireDependencies(useLatest: commandOptions.rest,
-        upgradeAll: upgradeAll).then((numChanged) {
-      // TODO(rnystrom): Show a more detailed message about what was added,
-      // removed, modified, and/or upgraded?
-      if (numChanged == 0) {
-        log.message("No dependencies changed.");
-      } else if (numChanged == 1) {
-        log.message("Changed $numChanged dependency!");
-      } else {
-        log.message("Changed $numChanged dependencies!");
-      }
-
+        isUpgrade: true, dryRun: dryRun).then((_) {
       if (isOffline) {
         log.warning("Warning: Upgrading when offline may not update you to the "
                     "latest versions of your dependencies.");
diff --git a/sdk/lib/_internal/pub/lib/src/dart.dart b/sdk/lib/_internal/pub/lib/src/dart.dart
index 64374db..9a26e1c 100644
--- a/sdk/lib/_internal/pub/lib/src/dart.dart
+++ b/sdk/lib/_internal/pub/lib/src/dart.dart
@@ -18,8 +18,8 @@
 
 import '../../asset/dart/serialize.dart';
 import 'io.dart';
-import 'utils.dart';
 
+import 'utils.dart';
 /// Interface to communicate with dart2js.
 ///
 /// This is basically an amalgamation of dart2js's
@@ -122,6 +122,22 @@
   });
 }
 
+/// Efficiently parses the import and export directives in [contents].
+///
+/// If [name] is passed, it's used as the filename for error reporting.
+List<UriBasedDirective> parseImportsAndExports(String contents, {String name}) {
+  var collector = new _DirectiveCollector();
+  parseDirectives(contents, name: name).accept(collector);
+  return collector.directives;
+}
+
+/// A simple visitor that collects import and export nodes.
+class _DirectiveCollector extends GeneralizingAstVisitor {
+  final directives = <UriBasedDirective>[];
+
+  visitUriBasedDirective(UriBasedDirective node) => directives.add(node);
+}
+
 /// Runs [code] in an isolate.
 ///
 /// [code] should be the contents of a Dart entrypoint. It may contain imports;
diff --git a/sdk/lib/_internal/pub/lib/src/entrypoint.dart b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
index d5f3287..3eeeebd 100644
--- a/sdk/lib/_internal/pub/lib/src/entrypoint.dart
+++ b/sdk/lib/_internal/pub/lib/src/entrypoint.dart
@@ -8,7 +8,6 @@
 
 import 'package:path/path.dart' as path;
 
-import 'git.dart' as git;
 import 'io.dart';
 import 'lock_file.dart';
 import 'log.dart' as log;
@@ -19,6 +18,8 @@
 import 'system_cache.dart';
 import 'utils.dart';
 
+/// The context surrounding the root package pub is operating on.
+///
 /// Pub operates over a directed graph of dependencies that starts at a root
 /// "entrypoint" package. This is typically the package where the current
 /// working directory is located. An entrypoint knows the [root] package it is
@@ -64,31 +65,58 @@
   /// The path to the entrypoint package's lockfile.
   String get lockFilePath => path.join(root.dir, 'pubspec.lock');
 
-  /// Gets package [id] and makes it available for use by this entrypoint.
+  /// Gets all dependencies of the [root] package.
   ///
-  /// If this completes successfully, the package is guaranteed to be importable
-  /// using the `package:` scheme. Returns the resolved [PackageId].
+  /// [useLatest], if provided, defines a list of packages that will be
+  /// unlocked and forced to their latest versions. If [upgradeAll] is
+  /// true, the previous lockfile is ignored and all packages are re-resolved
+  /// from scratch. Otherwise, it will attempt to preserve the versions of all
+  /// previously locked packages.
+  ///
+  /// Shows a report of the changes made relative to the previous lockfile. If
+  /// [isUpgrade] is `true`, all transitive dependencies are shown in the
+  /// report. Otherwise, only dependencies that were changed are shown. If
+  /// [dryRun] is `true`, no physical changes are made.
+  Future acquireDependencies({List<String> useLatest, bool isUpgrade: false,
+      bool dryRun: false}) {
+    return syncFuture(() {
+      return resolveVersions(cache.sources, root, lockFile: loadLockFile(),
+          useLatest: useLatest, upgradeAll: isUpgrade && useLatest.isEmpty);
+    }).then((result) {
+      if (!result.succeeded) throw result.error;
+
+      result.showReport(isUpgrade: isUpgrade);
+
+      if (dryRun) {
+        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+        return null;
+      }
+
+      // Install the packages.
+      cleanDir(packagesDir);
+      return Future.wait(result.packages.map(_get).toList()).then((ids) {
+        _saveLockFile(ids);
+        _linkSelf();
+        _linkSecondaryPackageDirs();
+        result.summarizeChanges(isUpgrade: isUpgrade, dryRun: dryRun);
+      });
+    });
+  }
+
+  /// Makes sure the package at [id] is locally available.
   ///
   /// This automatically downloads the package to the system-wide cache as well
   /// if it requires network access to retrieve (specifically, if the package's
   /// source is a [CachedSource]).
-  ///
-  /// See also [getDependencies].
-  Future<PackageId> get(PackageId id) {
+  Future<PackageId> _get(PackageId id) {
+    if (id.isRoot) return new Future.value(id);
+
     var pending = _pendingGets[id];
     if (pending != null) return pending;
 
-    var packageDir = path.join(packagesDir, id.name);
-
     var future = syncFuture(() {
-      ensureDir(path.dirname(packageDir));
-
-      if (entryExists(packageDir)) {
-        // TODO(nweiz): figure out when to actually delete the directory, and
-        // when we can just re-use the existing symlink.
-        log.fine("Deleting package directory for ${id.name} before get.");
-        deleteEntry(packageDir);
-      }
+      var packageDir = path.join(packagesDir, id.name);
+      if (entryExists(packageDir)) deleteEntry(packageDir);
 
       var source = cache.sources[id.source];
       return source.get(id, packageDir).then((_) => source.resolveId(id));
@@ -99,52 +127,10 @@
     return future;
   }
 
-  /// Gets all dependencies of the [root] package.
-  ///
-  /// [useLatest], if provided, defines a list of packages that will be
-  /// unlocked and forced to their latest versions. If [upgradeAll] is
-  /// true, the previous lockfile is ignored and all packages are re-resolved
-  /// from scratch. Otherwise, it will attempt to preserve the versions of all
-  /// previously locked packages.
-  ///
-  /// If [useLatest] is non-empty or [upgradeAll] is true, displays a detailed
-  /// report of the changes made relative to the previous lockfile.
-  ///
-  /// Returns a [Future] that completes to the number of changed dependencies.
-  /// It completes when an up-to-date lockfile has been generated and all
-  /// dependencies are available.
-  Future<int> acquireDependencies({List<String> useLatest,
-      bool upgradeAll: false}) {
-    var numChanged = 0;
-
-    return syncFuture(() {
-      return resolveVersions(cache.sources, root, lockFile: loadLockFile(),
-          useLatest: useLatest, upgradeAll: upgradeAll);
-    }).then((result) {
-      if (!result.succeeded) throw result.error;
-
-      // TODO(rnystrom): Should also show the report if there were changes.
-      // That way pub get/build/serve will show the report when relevant.
-      // https://code.google.com/p/dart/issues/detail?id=15587
-      numChanged = result.showReport(showAll: useLatest != null || upgradeAll);
-
-      // Install the packages.
-      cleanDir(packagesDir);
-      return Future.wait(result.packages.map((id) {
-        if (id.isRoot) return new Future.value(id);
-        return get(id);
-      }).toList());
-    }).then((ids) {
-      _saveLockFile(ids);
-      _linkSelf();
-      _linkSecondaryPackageDirs();
-
-      return numChanged;
-    });
-  }
-
   /// Loads the list of concrete package versions from the `pubspec.lock`, if it
-  /// exists. If it doesn't, this completes to an empty [LockFile].
+  /// exists.
+  ///
+  /// If it doesn't, this completes to an empty [LockFile].
   LockFile loadLockFile() {
     if (!lockFileExists) return new LockFile.empty();
     return new LockFile.load(lockFilePath, cache.sources);
@@ -233,15 +219,15 @@
       });
     }).then((upToDate) {
       if (upToDate) return null;
-      return acquireDependencies().then((_) {
-        log.message("Got dependencies!");
-      });
+      return acquireDependencies();
     });
   }
 
   /// Loads the package graph for the application and all of its transitive
-  /// dependencies. Before loading makes sure the lockfile and dependencies are
-  /// installed and up to date.
+  /// dependencies.
+  ///
+  /// Before loading, makes sure the lockfile and dependencies are installed
+  /// and up to date.
   Future<PackageGraph> loadPackageGraph() {
     return _ensureLockFileIsUpToDate().then((_) {
       var lockFile = loadLockFile();
@@ -323,53 +309,4 @@
     if (entryExists(symlink)) deleteEntry(symlink);
     createSymlink(packagesDir, symlink, relative: true);
   }
-
-  /// The basenames of files that are automatically excluded from archives.
-  final _BLACKLISTED_FILES = const ['pubspec.lock'];
-
-  /// The basenames of directories that are automatically excluded from
-  /// archives.
-  final _BLACKLISTED_DIRS = const ['packages'];
-
-  // TODO(nweiz): unit test this function.
-  /// Returns a list of files that are considered to be part of this package.
-  ///
-  /// If this is a Git repository, this will respect .gitignore; otherwise, it
-  /// will return all non-hidden, non-blacklisted files.
-  ///
-  /// If [beneath] is passed, this will only return files beneath that path.
-  Future<List<String>> packageFiles({String beneath}) {
-    if (beneath == null) beneath = root.dir;
-
-    return git.isInstalled.then((gitInstalled) {
-      if (dirExists(path.join(root.dir, '.git')) && gitInstalled) {
-        // Later versions of git do not allow a path for ls-files that appears
-        // to be outside of the repo, so make sure we give it a relative path.
-        var relativeBeneath = path.relative(beneath, from: root.dir);
-
-        // List all files that aren't gitignored, including those not checked
-        // in to Git.
-        return git.run(
-            ["ls-files", "--cached", "--others", "--exclude-standard",
-             relativeBeneath],
-            workingDir: root.dir).then((files) {
-          // Git always prints files relative to the project root, but we want
-          // them relative to the working directory. It also prints forward
-          // slashes on Windows which we normalize away for easier testing.
-          return files.map((file) => path.normalize(path.join(root.dir, file)));
-        });
-      }
-
-      return listDir(beneath, recursive: true);
-    }).then((files) {
-      return files.where((file) {
-        // Skip directories and broken symlinks.
-        if (!fileExists(file)) return false;
-
-        var relative = path.relative(file, from: beneath);
-        if (_BLACKLISTED_FILES.contains(path.basename(relative))) return false;
-        return !path.split(relative).any(_BLACKLISTED_DIRS.contains);
-      }).toList();
-    });
-  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/error_group.dart b/sdk/lib/_internal/pub/lib/src/error_group.dart
index 52a284c..c479a24 100644
--- a/sdk/lib/_internal/pub/lib/src/error_group.dart
+++ b/sdk/lib/_internal/pub/lib/src/error_group.dart
@@ -7,9 +7,11 @@
 import 'dart:async';
 
 /// An [ErrorGroup] entangles the errors of multiple [Future]s and [Stream]s
-/// with one another. This allows APIs to expose multiple [Future]s and
-/// [Stream]s that have identical error conditions without forcing API consumers
-/// to attach error handling to objects they don't care about.
+/// with one another.
+///
+/// This allows APIs to expose multiple [Future]s and [Stream]s that have
+/// identical error conditions without forcing API consumers to attach error
+/// handling to objects they don't care about.
 ///
 /// To use an [ErrorGroup], register [Future]s and [Stream]s with it using
 /// [registerFuture] and [registerStream]. These methods return wrapped versions
@@ -40,9 +42,10 @@
   /// The [Completer] for [done].
   final _doneCompleter = new Completer();
 
-  /// The underlying [Future] for [done]. We need to be able to access it
-  /// internally as an [_ErrorGroupFuture] so we can check if it has listeners
-  /// and signal errors on it.
+  /// The underlying [Future] for [done].
+  ///
+  /// We need to be able to access it internally as an [_ErrorGroupFuture] so
+  /// we can check if it has listeners and signal errors on it.
   _ErrorGroupFuture _done;
 
   /// Returns a [Future] that completes successully when all members of [this]
@@ -58,8 +61,9 @@
     this._done = new _ErrorGroupFuture(this, _doneCompleter.future);
   }
 
-  /// Registers a [Future] as a member of [this]. Returns a wrapped version of
-  /// [future] that should be used in its place.
+  /// Registers a [Future] as a member of [this].
+  ///
+  /// Returns a wrapped version of [future] that should be used in its place.
   ///
   /// If all members of [this] have already completed successfully or with an
   /// error, it's a [StateError] to try to register a new [Future].
@@ -74,9 +78,11 @@
     return wrapped;
   }
 
-  /// Registers a [Stream] as a member of [this]. Returns a wrapped version of
-  /// [stream] that should be used in its place. The returned [Stream] will be
-  /// multi-subscription if and only if [stream] is.
+  /// Registers a [Stream] as a member of [this].
+  ///
+  /// Returns a wrapped version of [stream] that should be used in its place.
+  /// The returned [Stream] will be multi-subscription if and only if [stream]
+  /// is.
   ///
   /// Since all errors in a group are passed to all members, the returned
   /// [Stream] will automatically unsubscribe all its listeners when it
@@ -95,9 +101,10 @@
     return wrapped;
   }
 
-  /// Sends [error] to all members of [this]. Like errors that come from
-  /// members, this will only be passed to the top-level error handler if no
-  /// members have listeners.
+  /// Sends [error] to all members of [this].
+  ///
+  /// Like errors that come from members, this will only be passed to the
+  /// top-level error handler if no members have listeners.
   ///
   /// If all members of [this] have already completed successfully or with an
   /// error, it's a [StateError] to try to signal an error.
@@ -109,8 +116,10 @@
     _signalError(error, stackTrace);
   }
 
-  /// Signal an error internally. This is just like [signalError], but instead
-  /// of throwing an error if [this] is complete, it just does nothing.
+  /// Signal an error internally.
+  ///
+  /// This is just like [signalError], but instead of throwing an error if
+  /// [this] is complete, it just does nothing.
   void _signalError(var error, [StackTrace stackTrace]) {
     if (_isDone) return;
 
@@ -150,8 +159,10 @@
 }
 
 /// A [Future] wrapper that keeps track of whether it's been completed and
-/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
-/// it completes successfully or receives an error.
+/// whether it has any listeners.
+///
+/// It also notifies its parent [ErrorGroup] when it completes successfully or
+/// receives an error.
 class _ErrorGroupFuture implements Future {
   /// The parent [ErrorGroup].
   final ErrorGroup _group;
@@ -216,8 +227,10 @@
 // When this is fixed, this class will need to prevent such errors from being
 // top-leveled.
 /// A [Stream] wrapper that keeps track of whether it's been completed and
-/// whether it has any listeners. It also notifies its parent [ErrorGroup] when
-/// it completes successfully or receives an error.
+/// whether it has any listeners.
+///
+/// It also notifies its parent [ErrorGroup] when it completes successfully or
+/// receives an error.
 class _ErrorGroupStream extends Stream {
   /// The parent [ErrorGroup].
   final ErrorGroup _group;
@@ -228,8 +241,10 @@
   /// The underlying [StreamController] for [this].
   final StreamController _controller;
 
-  /// The controller's [Stream]. May be different than `_controller.stream` if
-  /// the wrapped stream is a broadcasting stream.
+  /// The controller's [Stream].
+  ///
+  /// May be different than `_controller.stream` if the wrapped stream is a
+  /// broadcasting stream.
   Stream _stream;
 
   /// The [StreamSubscription] that connects the wrapped [Stream] to
diff --git a/sdk/lib/_internal/pub/lib/src/exceptions.dart b/sdk/lib/_internal/pub/lib/src/exceptions.dart
new file mode 100644
index 0000000..e67ef64d
--- /dev/null
+++ b/sdk/lib/_internal/pub/lib/src/exceptions.dart
@@ -0,0 +1,106 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. 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.exceptions;
+
+import 'dart:io';
+import 'dart:isolate';
+
+import "package:analyzer/analyzer.dart";
+import "package:http/http.dart" as http;
+import "package:stack_trace/stack_trace.dart";
+import "package:yaml/yaml.dart";
+
+import '../../asset/dart/serialize.dart';
+
+/// An exception class for exceptions that are intended to be seen by the user.
+///
+/// These exceptions won't have any debugging information printed when they're
+/// thrown.
+class ApplicationException implements Exception {
+  final String message;
+
+  ApplicationException(this.message);
+
+  String toString() => message;
+}
+
+/// A class for exceptions that wrap other exceptions.
+class WrappedException extends ApplicationException {
+  /// The underlying exception that [this] is wrapping, if any.
+  final innerError;
+
+  /// The stack chain for [innerError] if it exists.
+  final Chain innerChain;
+
+  WrappedException(String message, this.innerError, [StackTrace innerTrace])
+      : innerChain = innerTrace == null ? null : new Chain.forTrace(innerTrace),
+        super(message);
+}
+
+/// A class for command usage exceptions.
+class UsageException extends ApplicationException {
+  /// The command usage information.
+  final String usage;
+
+  UsageException(String message, this.usage)
+      : super(message);
+
+  String toString() => "$message\n\n$usage";
+}
+
+/// A class for errors in a command's input data.
+///
+/// This corresponds to the [exit_codes.DATA] exit code.
+class DataException extends ApplicationException {
+  DataException(String message)
+      : super(message);
+}
+
+/// An class for exceptions where a package could not be found in a [Source].
+///
+/// The source is responsible for wrapping its internal exceptions in this so
+/// that other code in pub can use this to show a more detailed explanation of
+/// why the package was being requested.
+class PackageNotFoundException extends WrappedException {
+  PackageNotFoundException(String message, [innerError, StackTrace innerTrace])
+      : super(message, innerError, innerTrace);
+}
+
+/// All the names of user-facing exceptions.
+final _userFacingExceptions = new Set<String>.from([
+  'ApplicationException',
+  // This refers to http.ClientException.
+  'ClientException',
+  // Errors coming from the Dart analyzer are probably caused by syntax errors
+  // in user code, so they're user-facing.
+  'AnalyzerError', 'AnalyzerErrorGroup',
+  // An error spawning an isolate probably indicates a transformer with an
+  // invalid import.
+  'IsolateSpawnException',
+  // IOException and subclasses.
+  'CertificateException', 'FileSystemException', 'HandshakeException',
+  'HttpException', 'IOException', 'ProcessException', 'RedirectException',
+  'SignalException', 'SocketException', 'StdoutException', 'TlsException',
+  'WebSocketException'
+]);
+
+/// Returns whether [error] is a user-facing error object.
+///
+/// This includes both [ApplicationException] and any dart:io errors.
+bool isUserFacingException(error) {
+  if (error is CrossIsolateException) {
+    return _userFacingExceptions.contains(error.type);
+  }
+
+  // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is
+  // fixed.
+  return error is ApplicationException ||
+    error is AnalyzerError ||
+    error is AnalyzerErrorGroup ||
+    error is IsolateSpawnException ||
+    error is IOException ||
+    error is http.ClientException ||
+    error is YamlException;
+}
diff --git a/sdk/lib/_internal/pub/lib/src/exit_codes.dart b/sdk/lib/_internal/pub/lib/src/exit_codes.dart
index a1683cd..ebe8e8d 100644
--- a/sdk/lib/_internal/pub/lib/src/exit_codes.dart
+++ b/sdk/lib/_internal/pub/lib/src/exit_codes.dart
@@ -2,9 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Exit code constants. From [the BSD sysexits manpage][manpage]. Not every
-/// constant here is used, even though some of the unused ones may be
-/// appropriate for errors encountered by pub.
+/// Exit code constants.
+///
+/// From [the BSD sysexits manpage][manpage]. Not every constant here is used,
+/// even though some of the unused ones may be appropriate for errors
+/// encountered by pub.
 ///
 /// [manpage]: http://www.freebsd.org/cgi/man.cgi?query=sysexits
 library pub.exit_codes;
diff --git a/sdk/lib/_internal/pub/lib/src/git.dart b/sdk/lib/_internal/pub/lib/src/git.dart
index d79a914..598627a 100644
--- a/sdk/lib/_internal/pub/lib/src/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/git.dart
@@ -8,6 +8,8 @@
 import 'dart:async';
 import 'dart:io';
 
+import 'package:stack_trace/stack_trace.dart';
+
 import 'io.dart';
 import 'log.dart' as log;
 import 'utils.dart';
@@ -29,73 +31,76 @@
 }
 
 /// Tests whether or not the git command-line app is available for use.
-Future<bool> get isInstalled {
-  if (_isGitInstalledCache != null) {
-    return new Future.value(_isGitInstalledCache);
-  }
-
-  return _gitCommand.then((git) => git != null);
+bool get isInstalled {
+  if (_isInstalledCache != null) return _isInstalledCache;
+  _isInstalledCache = _gitCommand != null;
+  return _isInstalledCache;
 }
+bool _isInstalledCache;
 
-/// Run a git process with [args] from [workingDir]. Returns the stdout as a
-/// list of strings if it succeeded. Completes to an exception if it failed.
+/// Run a git process with [args] from [workingDir].
+///
+/// Returns the stdout as a list of strings if it succeeded. Completes to an
+/// exception if it failed.
 Future<List<String>> run(List<String> args,
     {String workingDir, Map<String, String> environment}) {
-  return _gitCommand.then((git) {
-    if (git == null) {
-      throw new ApplicationException(
-          "Cannot find a Git executable.\n"
-          "Please ensure Git is correctly installed.");
-    }
+  if (!isInstalled) {
+    fail("Cannot find a Git executable.\n"
+        "Please ensure Git is correctly installed.");
+  }
 
-    return runProcess(git, args, workingDir: workingDir,
-        environment: environment);
-  }).then((result) {
+  return runProcess(_gitCommand, args, workingDir: workingDir,
+      environment: environment).then((result) {
     if (!result.success) throw new GitException(args, result.stderr.join("\n"));
     return result.stdout;
   });
 }
 
-bool _isGitInstalledCache;
+/// Like [run], but synchronous.
+List<String> runSync(List<String> args, {String workingDir,
+    Map<String, String> environment}) {
+  if (!isInstalled) {
+    fail("Cannot find a Git executable.\n"
+        "Please ensure Git is correctly installed.");
+  }
 
-/// The cached Git command.
-String _gitCommandCache;
+  var result = runProcessSync(_gitCommand, args,
+      workingDir: workingDir,
+      environment: environment);
+  if (!result.success) throw new GitException(args, result.stderr.join("\n"));
+  return result.stdout;
+}
 
 /// Returns the name of the git command-line app, or null if Git could not be
 /// found on the user's PATH.
-Future<String> get _gitCommand {
-  if (_gitCommandCache != null) {
-    return new Future.value(_gitCommandCache);
+String get _gitCommand {
+  if (_commandCache != null) return _commandCache;
+
+  var command;
+  if (_tryGitCommand("git")) {
+    _commandCache = "git";
+  } else if (_tryGitCommand("git.cmd")){
+    _commandCache = "git.cmd";
+  } else {
+    return null;
   }
 
-  return _tryGitCommand("git").then((success) {
-    if (success) return "git";
-
-    // Git is sometimes installed on Windows as `git.cmd`
-    return _tryGitCommand("git.cmd").then((success) {
-      if (success) return "git.cmd";
-      return null;
-    });
-  }).then((command) {
-    log.fine('Determined git command $command.');
-    _gitCommandCache = command;
-    return command;
-  });
+  log.fine('Determined git command $command.');
+  return _commandCache;
 }
+String _commandCache;
 
 /// Checks whether [command] is the Git command for this computer.
-Future<bool> _tryGitCommand(String command) {
+bool _tryGitCommand(String command) {
   // If "git --version" prints something familiar, git is working.
-  return runProcess(command, ["--version"]).then((results) {
+  try {
+    var result = runProcessSync(command, ["--version"]);
     var regexp = new RegExp("^git version");
-    return results.stdout.length == 1 && regexp.hasMatch(results.stdout[0]);
-  }).catchError((err, stackTrace) {
+    return result.stdout.length == 1 && regexp.hasMatch(result.stdout.single);
+  } on ProcessException catch (error, stackTrace) {
+    var chain = new Chain.forTrace(stackTrace);
     // If the process failed, they probably don't have it.
-    if (err is ProcessException) {
-      log.io('Git command is not "$command": $err\n$stackTrace');
-      return false;
-    }
-
-    throw err;
-  });
+    log.message('Git command is not "$command": $error\n$chain');
+    return false;
+  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/http.dart b/sdk/lib/_internal/pub/lib/src/http.dart
index 08c30fd..24dbacb 100644
--- a/sdk/lib/_internal/pub/lib/src/http.dart
+++ b/sdk/lib/_internal/pub/lib/src/http.dart
@@ -87,6 +87,21 @@
              "Upgrade pub to the latest version and try again.");
       }
 
+      if (status == 500 &&
+          (request.url.host == "pub.dartlang.org" ||
+          request.url.host == "storage.googleapis.com")) {
+        var message = "HTTP error 500: Internal Server Error at "
+            "${request.url}.";
+
+        if (request.url.host == "pub.dartlang.org" ||
+            request.url.host == "storage.googleapis.com") {
+          message += "\nThis is likely a transient error. Please try again "
+              "later.";
+        }
+
+        fail(message);
+      }
+
       return http.Response.fromStream(streamedResponse).then((response) {
         throw new PubHttpException(response);
       });
@@ -110,7 +125,8 @@
     });
 
     if (timeoutLength == null) return future;
-    return timeout(future, timeoutLength, 'fetching URL "${request.url}"');
+    return timeout(future, timeoutLength, request.url,
+        'fetching URL "${request.url}"');
   }
 
   /// Logs the fact that [request] was sent, and information about it.
@@ -208,8 +224,10 @@
   fail(errorMap['error']['message']);
 }
 
-/// Parses a response body, assuming it's JSON-formatted. Throws a user-friendly
-/// error if the response body is invalid JSON, or if it's not a map.
+/// Parses a response body, assuming it's JSON-formatted.
+///
+/// Throws a user-friendly error if the response body is invalid JSON, or if
+/// it's not a map.
 Map parseJsonResponse(http.Response response) {
   var value;
   try {
diff --git a/sdk/lib/_internal/pub/lib/src/io.dart b/sdk/lib/_internal/pub/lib/src/io.dart
index d023350..4d4ddd5 100644
--- a/sdk/lib/_internal/pub/lib/src/io.dart
+++ b/sdk/lib/_internal/pub/lib/src/io.dart
@@ -12,6 +12,7 @@
 
 import 'package:path/path.dart' as path;
 import 'package:http/http.dart' show ByteStream;
+import 'package:http_multi_server/http_multi_server.dart';
 import 'package:stack_trace/stack_trace.dart';
 
 import 'exit_codes.dart' as exit_codes;
@@ -35,17 +36,22 @@
 bool entryExists(String path) =>
   dirExists(path) || fileExists(path) || linkExists(path);
 
-/// Returns whether [link] exists on the file system. This will return `true`
-/// for any symlink, regardless of what it points at or whether it's broken.
+/// Returns whether [link] exists on the file system.
+///
+/// This returns `true` for any symlink, regardless of what it points at or
+/// whether it's broken.
 bool linkExists(String link) => new Link(link).existsSync();
 
-/// Returns whether [file] exists on the file system. This will return `true`
-/// for a symlink only if that symlink is unbroken and points to a file.
+/// Returns whether [file] exists on the file system.
+///
+/// This returns `true` for a symlink only if that symlink is unbroken and
+/// points to a file.
 bool fileExists(String file) => new File(file).existsSync();
 
-/// Returns the canonical path for [pathString]. This is the normalized,
-/// absolute path, with symlinks resolved. As in [transitiveTarget], broken or
-/// recursive symlinks will not be fully resolved.
+/// Returns the canonical path for [pathString].
+///
+/// This is the normalized, absolute path, with symlinks resolved. As in
+/// [transitiveTarget], broken or recursive symlinks will not be fully resolved.
 ///
 /// This doesn't require [pathString] to point to a path that exists on the
 /// filesystem; nonexistent or unreadable path entries are treated as normal
@@ -124,8 +130,10 @@
 }
 
 /// Returns the transitive target of [link] (if A links to B which links to C,
-/// this will return C). If [link] is part of a symlink loop (e.g. A links to B
-/// which links back to A), this returns the path to the first repeated link (so
+/// this will return C).
+///
+/// If [link] is part of a symlink loop (e.g. A links to B which links back to
+/// A), this returns the path to the first repeated link (so
 /// `transitiveTarget("A")` would return `"A"` and `transitiveTarget("A")` would
 /// return `"B"`).
 ///
@@ -177,8 +185,10 @@
   return file;
 }
 
-/// Writes [stream] to a new file at path [file]. Will replace any file already
-/// at that path. Completes when the file is done being written.
+/// Writes [stream] to a new file at path [file].
+///
+/// Replaces any file already at that path. Completes when the file is done
+/// being written.
 Future<String> createFileFromStream(Stream<List<int>> stream, String file) {
   // TODO(nweiz): remove extra logging when we figure out the windows bot issue.
   log.io("Creating $file from stream.");
@@ -191,9 +201,11 @@
   });
 }
 
-/// Copy all files in [files] to the directory [destination]. Their locations in
-/// [destination] will be determined by their relative location to [baseDir].
-/// Any existing files at those paths will be overwritten.
+/// Copies all files in [files] to the directory [destination].
+///
+/// Their locations in [destination] will be determined by their relative
+/// location to [baseDir]. Any existing files at those paths will be
+/// overwritten.
 void copyFiles(Iterable<String> files, String baseDir, String destination) {
   for (var file in files) {
     var newPath = path.join(destination, path.relative(file, from: baseDir));
@@ -202,7 +214,7 @@
   }
 }
 
-/// Copy a file from [source] to [destination].
+/// Copies a file from [source] to [destination].
 void copyFile(String source, String destination) {
   writeBinaryFile(destination, readBinaryFile(source));
 }
@@ -213,8 +225,9 @@
   return dir;
 }
 
-/// Ensures that [dir] and all its parent directories exist. If they don't
-/// exist, creates them.
+/// Ensures that [dir] and all its parent directories exist.
+///
+/// If they don't exist, creates them.
 String ensureDir(String dir) {
   new Directory(dir).createSync(recursive: true);
   return dir;
@@ -222,6 +235,7 @@
 
 /// Creates a temp directory in [dir], whose name will be [prefix] with
 /// characters appended to it to make a unique name.
+///
 /// Returns the path of the created directory.
 String createTempDir(String base, String prefix) {
   var tempDir = new Directory(base).createTempSync(prefix);
@@ -231,6 +245,7 @@
 
 /// Creates a temp directory in the system temp directory, whose name will be
 /// 'pub_' with characters appended to it to make a unique name.
+///
 /// Returns the path of the created directory.
 String createSystemTempDir() {
   var tempDir = Directory.systemTemp.createTempSync('pub_');
@@ -238,9 +253,15 @@
   return tempDir.path;
 }
 
-/// Lists the contents of [dir]. If [recursive] is `true`, lists subdirectory
-/// contents (defaults to `false`). If [includeHidden] is `true`, includes files
-/// and directories beginning with `.` (defaults to `false`).
+/// Lists the contents of [dir].
+///
+/// If [recursive] is `true`, lists subdirectory contents (defaults to `false`).
+/// If [includeHidden] is `true`, includes files and directories beginning with
+/// `.` (defaults to `false`). If [includeDirs] is `true`, includes directories
+/// as well as files (defaults to `true`).
+///
+/// [whiteList] is a list of hidden filenames to include even when
+/// [includeHidden] is `false`.
 ///
 /// Note that dart:io handles recursive symlinks in an unfortunate way. You
 /// end up with two copies of every entity that is within the recursive loop.
@@ -248,31 +269,105 @@
 /// had a noticeable performance impact. In the interest of speed, we'll just
 /// live with that annoying behavior.
 ///
-/// The returned paths are guaranteed to begin with [dir].
+/// The returned paths are guaranteed to begin with [dir]. Broken symlinks won't
+/// be returned.
 List<String> listDir(String dir, {bool recursive: false,
-    bool includeHidden: false}) {
-  var entities = new Directory(dir).listSync(recursive: recursive);
+    bool includeHidden: false, bool includeDirs: true,
+    Iterable<String> whitelist}) {
+  if (whitelist == null) whitelist = [];
+  var whitelistFilter = createFileFilter(whitelist);
 
-  isHidden(part) => part.startsWith(".") && part != "." && part != "..";
+  // This is used in some performance-sensitive paths and can list many, many
+  // files. As such, it leans more havily towards optimization as opposed to
+  // readability than most code in pub. In particular, it avoids using the path
+  // package, since re-parsing a path is very expensive relative to string
+  // operations.
+  return new Directory(dir).listSync(
+      recursive: recursive, followLinks: true).where((entity) {
+    if (!includeDirs && entity is Directory) return false;
+    if (entity is Link) return false;
+    if (includeHidden) return true;
 
-  if (!includeHidden) {
-    entities = entities.where((entity) {
-      assert(entity.path.startsWith(dir));
-      return !path.split(entity.path.substring(dir.length + 1)).any(isHidden);
-    });
-  }
+    assert(entity.path.startsWith(dir));
+    var pathInDir = entity.path.substring(dir.length);
 
-  return entities.map((entity) => entity.path).toList();
+    // If the basename is whitelisted, don't count its "/." as making the file
+    // hidden.
+    var whitelistedBasename = whitelistFilter.firstWhere(pathInDir.contains,
+        orElse: () => null);
+    if (whitelistedBasename != null) {
+      pathInDir = pathInDir.substring(
+          0, pathInDir.length - whitelistedBasename.length);
+    }
+
+    if (pathInDir.contains("/.")) return false;
+    if (Platform.operatingSystem != "windows") return true;
+    return !pathInDir.contains("\\.");
+  }).map((entity) => entity.path).toList();
 }
 
-/// Returns whether [dir] exists on the file system. This will return `true` for
-/// a symlink only if that symlink is unbroken and points to a directory.
+/// Returns whether [dir] exists on the file system.
+///
+/// This returns `true` for a symlink only if that symlink is unbroken and
+/// points to a directory.
 bool dirExists(String dir) => new Directory(dir).existsSync();
 
-/// Deletes whatever's at [path], whether it's a file, directory, or symlink. If
-/// it's a directory, it will be deleted recursively.
+/// Tries to resiliently perform [operation].
+///
+/// Some file system operations can intermittently fail on Windows because
+/// other processes are locking a file. We've seen this with virus scanners
+/// when we try to delete or move something while it's being scanned. To
+/// mitigate that, on Windows, this will retry the operation a few times if it
+/// fails.
+void _attempt(String description, void operation()) {
+  if (Platform.operatingSystem != 'windows') {
+    operation();
+    return;
+  }
+
+  getErrorReason(error) {
+    if (error.osError.errorCode == 5) {
+      return "access was denied";
+    }
+
+    if (error.osError.errorCode == 32) {
+      return "it was in use by another process";
+    }
+
+    return null;
+  }
+
+  for (var i = 0; i < 2; i++) {
+    try {
+      operation();
+      return;
+    } on FileSystemException catch (error) {
+      var reason = getErrorReason(error);
+      if (reason == null) rethrow;
+
+      log.io("Failed to $description because $reason. "
+          "Retrying in 50ms.");
+      sleep(new Duration(milliseconds: 50));
+    }
+  }
+
+  try {
+    operation();
+  } on FileSystemException catch (error) {
+    var reason = getErrorReason(error);
+    if (reason == null) rethrow;
+
+    fail("Failed to $description because $reason.\n"
+        "This may be caused by a virus scanner or having a file\n"
+        "in the directory open in another application.");
+  }
+}
+
+/// Deletes whatever's at [path], whether it's a file, directory, or symlink.
+///
+/// If it's a directory, it will be deleted recursively.
 void deleteEntry(String path) {
-  tryDeleteEntry() {
+  _attempt("delete entry", () {
     if (linkExists(path)) {
       log.io("Deleting link $path.");
       new Link(path).deleteSync();
@@ -283,39 +378,13 @@
       log.io("Deleting file $path.");
       new File(path).deleteSync();
     }
-  }
-
-  if (Platform.operatingSystem != 'windows') {
-    tryDeleteEntry();
-    return;
-  }
-
-  // On Windows, we can fail to delete an entry if it's in use by another
-  // process. The only case where we know this to cause a problem is when
-  // testing "pub serve", since it can poll a file at the same time we try to
-  // delete it in the test process (issue 16129).
-  //
-  // TODO(nweiz): Once issue 14428 is fixed for Windows, remove this special
-  // handling.
-  for (var i = 0; i < 2; i++) {
-    try {
-      tryDeleteEntry();
-    } on FileSystemException catch (error) {
-      // Errno 32 indicates that the deletion failed because the file was in
-      // use.
-      if (error.osError.errorCode != 32) rethrow;
-
-      log.io("Failed to delete entry because it was in use by another process. "
-          "Retrying in 50ms.");
-      sleep(new Duration(milliseconds: 50));
-    }
-  }
-
-  tryDeleteEntry();
+  });
 }
 
-/// "Cleans" [dir]. If that directory already exists, it will be deleted. Then a
-/// new empty directory will be created.
+/// "Cleans" [dir].
+///
+/// If that directory already exists, it is deleted. Then a new empty directory
+/// is created.
 void cleanDir(String dir) {
   if (entryExists(dir)) deleteEntry(dir);
   ensureDir(dir);
@@ -323,18 +392,21 @@
 
 /// Renames (i.e. moves) the directory [from] to [to].
 void renameDir(String from, String to) {
-  log.io("Renaming directory $from to $to.");
-  try {
-    new Directory(from).renameSync(to);
-  } on IOException catch (error) {
-    // Ensure that [to] isn't left in an inconsistent state. See issue 12436.
-    if (entryExists(to)) deleteEntry(to);
-    rethrow;
-  }
+  _attempt("rename directory", () {
+    log.io("Renaming directory $from to $to.");
+    try {
+      new Directory(from).renameSync(to);
+    } on IOException catch (error) {
+      // Ensure that [to] isn't left in an inconsistent state. See issue 12436.
+      if (entryExists(to)) deleteEntry(to);
+      rethrow;
+    }
+  });
 }
 
-/// Creates a new symlink at path [symlink] that points to [target]. Returns a
-/// [Future] which completes to the path to the symlink file.
+/// Creates a new symlink at path [symlink] that points to [target].
+///
+/// Returns a [Future] which completes to the path to the symlink file.
 ///
 /// If [relative] is true, creates a symlink with a relative path from the
 /// symlink to the target. Otherwise, uses the [target] path unmodified.
@@ -350,8 +422,11 @@
     if (Platform.operatingSystem == 'windows') {
       target = path.normalize(path.absolute(target));
     } else {
-      target = path.normalize(
-          path.relative(target, from: path.dirname(symlink)));
+      // If the directory where we're creating the symlink was itself reached
+      // by traversing a symlink, we want the relative path to be relative to
+      // it's actual location, not the one we went through to get to it.
+      var symlinkDir = canonicalize(path.dirname(symlink));
+      target = path.normalize(path.relative(target, from: symlinkDir));
     }
   }
 
@@ -360,8 +435,10 @@
 }
 
 /// Creates a new symlink that creates an alias at [symlink] that points to the
-/// `lib` directory of package [target]. If [target] does not have a `lib`
-/// directory, this shows a warning if appropriate and then does nothing.
+/// `lib` directory of package [target].
+///
+/// If [target] does not have a `lib` directory, this shows a warning if
+/// appropriate and then does nothing.
 ///
 /// If [relative] is true, creates a symlink with a relative path from the
 /// symlink to the target. Otherwise, uses the [target] path unmodified.
@@ -391,8 +468,9 @@
   }
 }
 
-/// Returns the path to the root of the Dart repository. This will throw a
-/// [StateError] if it's called when running pub from the SDK.
+/// Returns the path to the root of the Dart repository.
+///
+/// This throws a [StateError] if it's called when running pub from the SDK.
 String get repoRoot {
   if (runningFromSdk) {
     throw new StateError("Can't get the repo root from the SDK.");
@@ -405,9 +483,10 @@
 final Stream<String> stdinLines = streamToLines(
     new ByteStream(Chain.track(stdin)).toStringStream());
 
-/// Displays a message and reads a yes/no confirmation from the user. Returns
-/// a [Future] that completes to `true` if the user confirms or `false` if they
-/// do not.
+/// Displays a message and reads a yes/no confirmation from the user.
+///
+/// Returns a [Future] that completes to `true` if the user confirms or `false`
+/// if they do not.
 ///
 /// This will automatically append " (y/n)?" to the message, so [message]
 /// should just be a fragment like, "Are you sure you want to proceed".
@@ -422,8 +501,9 @@
       .then((line) => new RegExp(r"^[yY]").hasMatch(line));
 }
 
-/// Reads and discards all output from [stream]. Returns a [Future] that
-/// completes when the stream is closed.
+/// Reads and discards all output from [stream].
+///
+/// Returns a [Future] that completes when the stream is closed.
 Future drainStream(Stream stream) {
   return stream.fold(null, (x, y) {});
 }
@@ -451,9 +531,10 @@
 }
 
 // TODO(nweiz): remove this when issue 7786 is fixed.
-/// Pipes all data and errors from [stream] into [sink]. When [stream] is done,
-/// the returned [Future] is completed and [sink] is closed if [closeSink] is
-/// true.
+/// Pipes all data and errors from [stream] into [sink].
+///
+/// When [stream] is done, the returned [Future] is completed and [sink] is
+/// closed if [closeSink] is true.
 ///
 /// When an error occurs on [stream], that error is passed to [sink]. If
 /// [cancelOnError] is true, [Future] will be completed successfully and no
@@ -477,6 +558,7 @@
 }
 
 /// Spawns and runs the process located at [executable], passing in [args].
+///
 /// Returns a [Future] that will complete with the results of the process after
 /// it has ended.
 ///
@@ -488,25 +570,18 @@
   return _descriptorPool.withResource(() {
     return _doProcess(Process.run, executable, args, workingDir, environment)
         .then((result) {
-      // TODO(rnystrom): Remove this and change to returning one string.
-      List<String> toLines(String output) {
-        var lines = splitLines(output);
-        if (!lines.isEmpty && lines.last == "") lines.removeLast();
-        return lines;
-      }
-
-      var pubResult = new PubProcessResult(toLines(result.stdout),
-                                  toLines(result.stderr),
-                                  result.exitCode);
-
+      var pubResult = new PubProcessResult(
+          result.stdout, result.stderr, result.exitCode);
       log.processResult(executable, pubResult);
       return pubResult;
     });
   });
 }
 
-/// Spawns the process located at [executable], passing in [args]. Returns a
-/// [Future] that will complete with the [Process] once it's been started.
+/// Spawns the process located at [executable], passing in [args].
+///
+/// Returns a [Future] that will complete with the [Process] once it's been
+/// started.
 ///
 /// The spawned process will inherit its parent's environment variables. If
 /// [environment] is provided, that will be used to augment (not replace) the
@@ -523,6 +598,17 @@
   });
 }
 
+/// Like [runProcess], but synchronous.
+PubProcessResult runProcessSync(String executable, List<String> args,
+        {String workingDir, Map<String, String> environment}) {
+  var result = _doProcess(
+      Process.runSync, executable, args, workingDir, environment);
+  var pubResult = new PubProcessResult(
+      result.stdout, result.stderr, result.exitCode);
+  log.processResult(executable, pubResult);
+  return pubResult;
+}
+
 /// A wrapper around [Process] that exposes `dart:async`-style APIs.
 class PubProcess {
   /// The underlying `dart:io` [Process].
@@ -544,6 +630,7 @@
   Future<int> _exitCode;
 
   /// The sink used for passing data to the process's standard input stream.
+  ///
   /// Errors on this stream are surfaced through [stdinClosed], [stdout],
   /// [stderr], and [exitCode], which are all members of an [ErrorGroup].
   EventSink<List<int>> get stdin => _stdin;
@@ -607,10 +694,11 @@
     _process.kill(signal);
 }
 
-/// Calls [fn] with appropriately modified arguments. [fn] should have the same
-/// signature as [Process.start], except that the returned [Future] may have a
-/// type other than [Process].
-Future _doProcess(Function fn, String executable, List<String> args,
+/// Calls [fn] with appropriately modified arguments.
+///
+/// [fn] should have the same signature as [Process.start], except that the
+/// returned value may have any return type.
+_doProcess(Function fn, String executable, List<String> args,
     String workingDir, Map<String, String> environment) {
   // TODO(rnystrom): Should dart:io just handle this?
   // Spawning a process on Windows will not look for the executable in the
@@ -624,28 +712,39 @@
 
   log.process(executable, args, workingDir == null ? '.' : workingDir);
 
-  return Chain.track(fn(executable,
-      args,
+  return fn(executable, args,
       workingDirectory: workingDir,
-      environment: environment));
+      environment: environment);
 }
 
-/// Wraps [input] to provide a timeout. If [input] completes before
-/// [milliseconds] have passed, then the return value completes in the same way.
-/// However, if [milliseconds] pass before [input] has completed, it completes
-/// with a [TimeoutException] with [description] (which should be a fragment
-/// describing the action that timed out).
+/// Wraps [input], an asynchronous network operation to provide a timeout.
+///
+/// If [input] completes before [milliseconds] have passed, then the return
+/// value completes in the same way. However, if [milliseconds] pass before
+/// [input] has completed, it completes with a [TimeoutException] with
+/// [description] (which should be a fragment describing the action that timed
+/// out).
+///
+/// [url] is the URL being accessed asynchronously.
 ///
 /// Note that timing out will not cancel the asynchronous operation behind
 /// [input].
-Future timeout(Future input, int milliseconds, String description) {
+Future timeout(Future input, int milliseconds, Uri url, String description) {
   // TODO(nwiez): Replace this with [Future.timeout].
   var completer = new Completer();
   var duration = new Duration(milliseconds: milliseconds);
   var timer = new Timer(duration, () {
-    completer.completeError(new TimeoutException(
-        'Timed out while $description.', duration),
-        new Chain.current());
+    // Include the duration ourselves in the message instead of passing it to
+    // TimeoutException since we show nicer output.
+    var message = 'Timed out after ${niceDuration(duration)} while '
+                  '$description.';
+
+    if (url.host == "pub.dartlang.org" ||
+        url.host == "storage.googleapis.com") {
+      message += "\nThis is likely a transient error. Please try again later.";
+    }
+
+    completer.completeError(new TimeoutException(message), new Chain.current());
   });
   input.then((value) {
     if (completer.isCompleted) return;
@@ -659,10 +758,11 @@
   return completer.future;
 }
 
-/// Creates a temporary directory and passes its path to [fn]. Once the [Future]
-/// returned by [fn] completes, the temporary directory and all its contents
-/// will be deleted. [fn] can also return `null`, in which case the temporary
-/// directory is deleted immediately afterwards.
+/// Creates a temporary directory and passes its path to [fn].
+///
+/// Once the [Future] returned by [fn] completes, the temporary directory and
+/// all its contents are deleted. [fn] can also return `null`, in which case
+/// the temporary directory is deleted immediately afterwards.
 ///
 /// Returns a future that completes to the value that the future returned from
 /// [fn] completes to.
@@ -674,8 +774,18 @@
   });
 }
 
-/// Extracts a `.tar.gz` file from [stream] to [destination]. Returns whether
-/// or not the extraction was successful.
+/// Binds an [HttpServer] to [host] and [port].
+///
+/// If [host] is "localhost", this will automatically listen on both the IPv4
+/// and IPv6 loopback addresses.
+Future<HttpServer> bindServer(String host, int port) {
+  if (host == 'localhost') return HttpMultiServer.loopback(port);
+  return HttpServer.bind(host, port);
+}
+
+/// Extracts a `.tar.gz` file from [stream] to [destination].
+///
+/// Returns whether or not the extraction was successful.
 Future<bool> extractTarGz(Stream<List<int>> stream, String destination) {
   log.fine("Extracting .tar.gz stream to $destination.");
 
@@ -756,10 +866,13 @@
   });
 }
 
-/// Create a .tar.gz archive from a list of entries. Each entry can be a
-/// [String], [Directory], or [File] object. The root of the archive is
-/// considered to be [baseDir], which defaults to the current working directory.
-/// Returns a [ByteStream] that will emit the contents of the archive.
+/// Create a .tar.gz archive from a list of entries.
+///
+/// Each entry can be a [String], [Directory], or [File] object. The root of
+/// the archive is considered to be [baseDir], which defaults to the current
+/// working directory.
+///
+/// Returns a [ByteStream] that emits the contents of the archive.
 ByteStream createTarGz(List contents, {baseDir}) {
   return new ByteStream(futureStream(syncFuture(() {
     var buffer = new StringBuffer();
@@ -822,7 +935,16 @@
   final List<String> stderr;
   final int exitCode;
 
-  const PubProcessResult(this.stdout, this.stderr, this.exitCode);
+  PubProcessResult(String stdout, String stderr, this.exitCode)
+      : this.stdout = _toLines(stdout),
+        this.stderr = _toLines(stderr);
+
+  // TODO(rnystrom): Remove this and change to returning one string.
+  static List<String> _toLines(String output) {
+    var lines = splitLines(output);
+    if (!lines.isEmpty && lines.last == "") lines.removeLast();
+    return lines;
+  }
 
   bool get success => exitCode == exit_codes.SUCCESS;
 }
diff --git a/sdk/lib/_internal/pub/lib/src/log.dart b/sdk/lib/_internal/pub/lib/src/log.dart
index 0b93b3f..d364f8c 100644
--- a/sdk/lib/_internal/pub/lib/src/log.dart
+++ b/sdk/lib/_internal/pub/lib/src/log.dart
@@ -22,8 +22,8 @@
 ///     log.json.error(...);
 final json = new _JsonLogger();
 
-typedef LogFn(Entry entry);
-final Map<Level, LogFn> _loggers = new Map<Level, LogFn>();
+/// The current logging verbosity.
+Verbosity verbosity = Verbosity.NORMAL;
 
 /// In cases where there's a ton of log spew, make sure we don't eat infinite
 /// memory.
@@ -37,8 +37,13 @@
 /// [recordTranscript()] is called.
 Transcript<Entry> _transcript;
 
-/// The currently-running progress indicator or `null` if there is none.
-Progress _progress;
+/// All currently-running progress indicators.
+final _progresses = new Set<Progress>();
+
+/// The currently-animated progress indicator, if any.
+///
+/// This will also be in [_progresses].
+Progress _animatedProgress;
 
 final _cyan = getSpecial('\u001b[36m');
 final _green = getSpecial('\u001b[32m');
@@ -49,12 +54,15 @@
 final _none = getSpecial('\u001b[0m');
 final _bold = getSpecial('\u001b[1m');
 
-/// An enum type for defining the different logging levels. By default, [ERROR]
-/// and [WARNING] messages are printed to sterr. [MESSAGE] messages are printed
-/// to stdout, and others are ignored.
+/// An enum type for defining the different logging levels a given message can
+/// be associated with.
+///
+/// By default, [ERROR] and [WARNING] messages are printed to sterr. [MESSAGE]
+/// messages are printed to stdout, and others are ignored.
 class Level {
-  /// An error occurred and an operation could not be completed. Usually shown
-  /// to the user on stderr.
+  /// An error occurred and an operation could not be completed.
+  ///
+  /// Usually shown to the user on stderr.
   static const ERROR = const Level._("ERR ");
 
   /// Something unexpected happened, but the program was able to continue,
@@ -71,16 +79,92 @@
   /// Incremental output during pub's version constraint solver.
   static const SOLVER = const Level._("SLVR");
 
-  /// Fine-grained and verbose additional information. Can be used to provide
-  /// program state context for other logs (such as what pub was doing when an
-  /// IO operation occurred) or just more detail for an operation.
+  /// Fine-grained and verbose additional information.
+  ///
+  /// Used to provide program state context for other logs (such as what pub
+  /// was doing when an IO operation occurred) or just more detail for an
+  /// operation.
   static const FINE = const Level._("FINE");
 
   const Level._(this.name);
   final String name;
 
   String toString() => name;
-  int get hashCode => name.hashCode;
+}
+
+typedef _LogFn(Entry entry);
+
+/// An enum type to control which log levels are displayed and how they are
+/// displayed.
+class Verbosity {
+  /// Silence all logging.
+  static const NONE = const Verbosity._("none", const {
+    Level.ERROR:   null,
+    Level.WARNING: null,
+    Level.MESSAGE: null,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows only errors and warnings.
+  static const WARNING = const Verbosity._("warning", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: null,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// The default verbosity which shows errors, warnings, and messages.
+  static const NORMAL = const Verbosity._("normal", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: _logToStdout,
+    Level.IO:      null,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows errors, warnings, messages, and IO event logs.
+  static const IO = const Verbosity._("io", const {
+    Level.ERROR:   _logToStderrWithLabel,
+    Level.WARNING: _logToStderrWithLabel,
+    Level.MESSAGE: _logToStdoutWithLabel,
+    Level.IO:      _logToStderrWithLabel,
+    Level.SOLVER:  null,
+    Level.FINE:    null
+  });
+
+  /// Shows errors, warnings, messages, and version solver logs.
+  static const SOLVER = const Verbosity._("solver", const {
+    Level.ERROR:   _logToStderr,
+    Level.WARNING: _logToStderr,
+    Level.MESSAGE: _logToStdout,
+    Level.IO:      null,
+    Level.SOLVER:  _logToStdout,
+    Level.FINE:    null
+  });
+
+  /// Shows all logs.
+  static const ALL = const Verbosity._("all", const {
+    Level.ERROR:   _logToStderrWithLabel,
+    Level.WARNING: _logToStderrWithLabel,
+    Level.MESSAGE: _logToStdoutWithLabel,
+    Level.IO:      _logToStderrWithLabel,
+    Level.SOLVER:  _logToStderrWithLabel,
+    Level.FINE:    _logToStderrWithLabel
+  });
+
+  const Verbosity._(this.name, this._loggers);
+  final String name;
+  final Map<Level, _LogFn> _loggers;
+
+  /// Returns whether or not logs at [level] will be printed.
+  bool isLevelVisible(Level level) => _loggers[level] != null;
+
+  String toString() => name;
 }
 
 /// A single log entry.
@@ -121,8 +205,6 @@
 
 /// Logs [message] at [level].
 void write(Level level, message) {
-  if (_loggers.isEmpty) showNormal();
-
   var lines = splitLines(message.toString());
 
   // Discard a trailing newline. This is useful since StringBuffers often end
@@ -133,16 +215,17 @@
 
   var entry = new Entry(level, lines);
 
-  var logFn = _loggers[level];
+  var logFn = verbosity._loggers[level];
   if (logFn != null) logFn(entry);
 
   if (_transcript != null) _transcript.add(entry);
 }
 
-/// Logs an asynchronous IO operation. Logs [startMessage] before the operation
-/// starts, then when [operation] completes, invokes [endMessage] with the
-/// completion value and logs the result of that. Returns a future that
-/// completes after the logging is done.
+/// Logs an asynchronous IO operation.
+///
+/// Logs [startMessage] before the operation starts, then when [operation]
+/// completes, invokes [endMessage] with the completion value and logs the
+/// result of that. Returns a future that completes after the logging is done.
 ///
 /// If [endMessage] is omitted, then logs "Begin [startMessage]" before the
 /// operation and "End [startMessage]" after it.
@@ -222,29 +305,27 @@
 }
 
 /// Prints [message] then displays an updated elapsed time until the future
-/// returned by [callback] completes. If anything else is logged during this
-/// (include another call to [progress]) that cancels the progress.
-Future progress(String message, Future callback()) {
+/// returned by [callback] completes.
+///
+/// If anything else is logged during this (including another call to
+/// [progress]) that cancels the progress animation, although the total time
+/// will still be printed once it finishes. If [fine] is passed, the progress
+/// information will only be visible at [Level.FINE].
+Future progress(String message, Future callback(), {bool fine: false}) {
   _stopProgress();
-  _progress = new Progress(message);
+  var progress = new Progress(message, fine: fine);
+  _animatedProgress = progress;
+  _progresses.add(progress);
   return callback().whenComplete(() {
-    var message = _stopProgress();
-
-    // Add the progress message to the transcript.
-    if (_transcript != null && message != null) {
-      _transcript.add(new Entry(Level.MESSAGE, [message]));
-    }
+    progress.stop();
+    _progresses.remove(progress);
   });
 }
 
-/// Stops the running progress indicator, if currently running.
-///
-/// Returns the final progress message, if any, otherwise `null`.
-String _stopProgress() {
-  if (_progress == null) return null;
-  var message = _progress.stop();
-  _progress = null;
-  return message;
+/// Stops animating the running progress indicator, if currently running.
+void _stopProgress() {
+  if (_animatedProgress != null) _animatedProgress.stopAnimating();
+  _animatedProgress = null;
 }
 
 /// Wraps [text] in the ANSI escape codes to make it bold when on a platform
@@ -291,48 +372,6 @@
 /// do not prevent the user's goal from being reached.
 String yellow(text) => "$_yellow$text$_none";
 
-/// Sets the verbosity to "normal", which shows errors, warnings, and messages.
-void showNormal() {
-  _loggers[Level.ERROR]   = _logToStderr;
-  _loggers[Level.WARNING] = _logToStderr;
-  _loggers[Level.MESSAGE] = _logToStdout;
-  _loggers[Level.IO]      = null;
-  _loggers[Level.SOLVER]  = null;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "io", which shows errors, warnings, messages, and IO
-/// event logs.
-void showIO() {
-  _loggers[Level.ERROR]   = _logToStderrWithLabel;
-  _loggers[Level.WARNING] = _logToStderrWithLabel;
-  _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
-  _loggers[Level.IO]      = _logToStderrWithLabel;
-  _loggers[Level.SOLVER]  = null;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "solver", which shows errors, warnings, messages, and
-/// solver logs.
-void showSolver() {
-  _loggers[Level.ERROR]   = _logToStderr;
-  _loggers[Level.WARNING] = _logToStderr;
-  _loggers[Level.MESSAGE] = _logToStdout;
-  _loggers[Level.IO]      = null;
-  _loggers[Level.SOLVER]  = _logToStdout;
-  _loggers[Level.FINE]    = null;
-}
-
-/// Sets the verbosity to "all", which logs ALL the things.
-void showAll() {
-  _loggers[Level.ERROR]   = _logToStderrWithLabel;
-  _loggers[Level.WARNING] = _logToStderrWithLabel;
-  _loggers[Level.MESSAGE] = _logToStdoutWithLabel;
-  _loggers[Level.IO]      = _logToStderrWithLabel;
-  _loggers[Level.SOLVER]  = _logToStderrWithLabel;
-  _loggers[Level.FINE]    = _logToStderrWithLabel;
-}
-
 /// Log function that prints the message to stdout.
 void _logToStdout(Entry entry) {
   _logToStream(stdout, entry, showLabel: false);
diff --git a/sdk/lib/_internal/pub/lib/src/oauth2.dart b/sdk/lib/_internal/pub/lib/src/oauth2.dart
index b1edba0..8de110c 100644
--- a/sdk/lib/_internal/pub/lib/src/oauth2.dart
+++ b/sdk/lib/_internal/pub/lib/src/oauth2.dart
@@ -24,8 +24,9 @@
 final _identifier = '818368855108-8grd2eg9tj9f38os6f1urbcvsq399u8n.apps.'
     'googleusercontent.com';
 
-/// The pub client's OAuth2 secret. This isn't actually meant to be kept a
-/// secret.
+/// The pub client's OAuth2 secret.
+///
+/// This isn't actually meant to be kept a secret.
 final _secret = 'SWeqj8seoJW0w7_CpEPFLX0K';
 
 /// The URL to which the user will be directed to authorize the pub client to
@@ -40,8 +41,10 @@
     '&approval_prompt=force');
 
 /// The URL from which the pub client will request an access token once it's
-/// been authorized by the user. This can be controlled externally by setting
-/// the _PUB_TEST_TOKEN_ENDPOINT environment variable.
+/// been authorized by the user.
+///
+/// This can be controlled externally by setting the `_PUB_TEST_TOKEN_ENDPOINT`
+/// environment variable.
 Uri get tokenEndpoint {
   var tokenEndpoint = Platform.environment['_PUB_TEST_TOKEN_ENDPOINT'];
   if (tokenEndpoint != null) {
@@ -53,12 +56,16 @@
 
 final _tokenEndpoint = Uri.parse('https://accounts.google.com/o/oauth2/token');
 
-/// The OAuth2 scopes that the pub client needs. Currently the client only needs
-/// the user's email so that the server can verify their identity.
+/// The OAuth2 scopes that the pub client needs.
+///
+/// Currently the client only needs the user's email so that the server can
+/// verify their identity.
 final _scopes = ['https://www.googleapis.com/auth/userinfo.email'];
 
-/// An in-memory cache of the user's OAuth2 credentials. This should always be
-/// the same as the credentials file stored in the system cache.
+/// An in-memory cache of the user's OAuth2 credentials.
+///
+/// This should always be the same as the credentials file stored in the system
+/// cache.
 Credentials _credentials;
 
 /// Delete the cached credentials, if they exist.
@@ -101,8 +108,10 @@
   });
 }
 
-/// Gets a new OAuth2 client. If saved credentials are available, those are
-/// used; otherwise, the user is prompted to authorize the pub client.
+/// Gets a new OAuth2 client.
+///
+/// If saved credentials are available, those are used; otherwise, the user is
+/// prompted to authorize the pub client.
 Future<Client> _getClient(SystemCache cache) {
   return new Future.sync(() {
     var credentials = _loadCredentials(cache);
@@ -116,8 +125,10 @@
 }
 
 /// Loads the user's OAuth2 credentials from the in-memory cache or the
-/// filesystem if possible. If the credentials can't be loaded for any reason,
-/// the returned [Future] will complete to null.
+/// filesystem if possible.
+///
+/// If the credentials can't be loaded for any reason, the returned [Future]
+/// completes to `null`.
 Credentials _loadCredentials(SystemCache cache) {
   log.fine('Loading OAuth2 credentials.');
 
@@ -157,7 +168,8 @@
     path.join(cache.rootDir, 'credentials.json');
 
 /// Gets the user to authorize pub as a client of pub.dartlang.org via oauth2.
-/// Returns a Future that will complete to a fully-authorized [Client].
+///
+/// Returns a Future that completes to a fully-authorized [Client].
 Future<Client> _authorize() {
   var grant = new AuthorizationCodeGrant(
       _identifier,
@@ -169,29 +181,28 @@
   // Spin up a one-shot HTTP server to receive the authorization code from the
   // Google OAuth2 server via redirect. This server will close itself as soon as
   // the code is received.
-  var server;
   var completer = new Completer();
-  shelf_io.serve((request) {
-    if (request.url.path != "/") {
-      return new shelf.Response.notFound('Invalid URI.');
-    }
+  bindServer('localhost', 0).then((server) {
+    shelf_io.serveRequests(server, (request) {
+      if (request.url.path != "/") {
+        return new shelf.Response.notFound('Invalid URI.');
+      }
 
-    log.message('Authorization received, processing...');
-    var queryString = request.url.query;
-    if (queryString == null) queryString = '';
+      log.message('Authorization received, processing...');
+      var queryString = request.url.query;
+      if (queryString == null) queryString = '';
 
-    // Closing the server here is safe, since it will wait until the response is
-    // sent to actually shut down.
-    server.close();
-    chainToCompleter(grant.handleAuthorizationResponse(queryToMap(queryString)),
-        completer);
+      // Closing the server here is safe, since it will wait until the response
+      // is sent to actually shut down.
+      server.close();
+      chainToCompleter(grant.handleAuthorizationResponse(queryToMap(queryString)),
+          completer);
 
-    return new shelf.Response.found('http://pub.dartlang.org/authorized');
-  }, '127.0.0.1', 0).then((server_) {
-    server = server_;
+      return new shelf.Response.found('http://pub.dartlang.org/authorized');
+    });
 
     var authUrl = grant.getAuthorizationUrl(
-        Uri.parse('http://127.0.0.1:${server.port}'), scopes: _scopes);
+        Uri.parse('http://localhost:${server.port}'), scopes: _scopes);
 
     log.message(
         'Pub needs your authorization to upload packages on your behalf.\n'
diff --git a/sdk/lib/_internal/pub/lib/src/package.dart b/sdk/lib/_internal/pub/lib/src/package.dart
index 8f6f617..4333648 100644
--- a/sdk/lib/_internal/pub/lib/src/package.dart
+++ b/sdk/lib/_internal/pub/lib/src/package.dart
@@ -4,11 +4,15 @@
 
 library pub.package;
 
+import 'dart:io';
+
 import 'package:path/path.dart' as path;
 
 import 'io.dart';
+import 'git.dart' as git;
 import 'pubspec.dart';
 import 'source_registry.dart';
+import 'utils.dart';
 import 'version.dart';
 
 final _README_REGEXP = new RegExp(r"^README($|\.)", caseSensitive: false);
@@ -72,10 +76,11 @@
   }
 
   /// Returns the path to the README file at the root of the entrypoint, or null
-  /// if no README file is found. If multiple READMEs are found, this uses the
-  /// same conventions as pub.dartlang.org for choosing the primary one: the
-  /// README with the fewest extensions that is lexically ordered first is
-  /// chosen.
+  /// if no README file is found.
+  ///
+  /// If multiple READMEs are found, this uses the same conventions as
+  /// pub.dartlang.org for choosing the primary one: the README with the fewest
+  /// extensions that is lexically ordered first is chosen.
   String get readmePath {
     var readmes = listDir(dir).map(path.basename).
         where((entry) => entry.contains(_README_REGEXP));
@@ -90,26 +95,88 @@
     }));
   }
 
-  /// Loads the package whose root directory is [packageDir]. [name] is the
-  /// expected name of that package (e.g. the name given in the dependency), or
-  /// `null` if the package being loaded is the entrypoint package.
+  /// Loads the package whose root directory is [packageDir].
+  ///
+  /// [name] is the expected name of that package (e.g. the name given in the
+  /// dependency), or `null` if the package being loaded is the entrypoint
+  /// package.
   Package.load(String name, String packageDir, SourceRegistry sources)
       : dir = packageDir,
         pubspec = new Pubspec.load(packageDir, sources, expectedName: name);
 
-  /// Constructs a package with the given pubspec. The package will have no
-  /// directory associated with it.
+  /// Constructs a package with the given pubspec.
+  ///
+  /// The package will have no directory associated with it.
   Package.inMemory(this.pubspec)
     : dir = null;
 
+  /// The basenames of files that are included in [list] despite being hidden.
+  static final _WHITELISTED_FILES = const ['.htaccess'];
+
+  /// A set of patterns that match paths to blacklisted files.
+  static final _blacklistedFiles = createFileFilter(['pubspec.lock']);
+
+  /// A set of patterns that match paths to blacklisted directories.
+  static final _blacklistedDirs = createDirectoryFilter(['packages']);
+
+  /// Returns a list of files that are considered to be part of this package.
+  ///
+  /// If this is a Git repository, this will respect .gitignore; otherwise, it
+  /// will return all non-hidden, non-blacklisted files.
+  ///
+  /// If [beneath] is passed, this will only return files beneath that path.
+  List<String> listFiles({String beneath}) {
+    if (beneath == null) beneath = dir;
+
+    // This is used in some performance-sensitive paths and can list many, many
+    // files. As such, it leans more havily towards optimization as opposed to
+    // readability than most code in pub. In particular, it avoids using the
+    // path package, since re-parsing a path is very expensive relative to
+    // string operations.
+    var files;
+    if (git.isInstalled && dirExists(path.join(dir, '.git'))) {
+      // Later versions of git do not allow a path for ls-files that appears to
+      // be outside of the repo, so make sure we give it a relative path.
+      var relativeBeneath = path.relative(beneath, from: dir);
+
+      // List all files that aren't gitignored, including those not checked in
+      // to Git.
+      files = git.runSync(
+          ["ls-files", "--cached", "--others", "--exclude-standard",
+           relativeBeneath],
+          workingDir: dir);
+      // Git always prints files relative to the repository root, but we want
+      // them relative to the working directory. It also prints forward slashes
+      // on Windows which we normalize away for easier testing.
+      files = files.map((file) {
+        if (Platform.operatingSystem != 'windows') return "$dir/$file";
+        return "$dir\\${file.replaceAll("/", "\\")}";
+      }).where((file) {
+        // Filter out broken symlinks, since git doesn't do so automatically.
+        return fileExists(file);
+      });
+    } else {
+      files = listDir(beneath, recursive: true, includeDirs: false,
+          whitelist: _WHITELISTED_FILES);
+    }
+
+    return files.where((file) {
+      file = file.substring(beneath.length);
+      return !_blacklistedFiles.any(file.endsWith) &&
+          !_blacklistedDirs.any(file.contains);
+    }).toList();
+  }
+
   /// Returns a debug string for the package.
   String toString() => '$name $version ($dir)';
 }
 
 /// This is the private base class of [PackageRef], [PackageID], and
-/// [PackageDep]. It contains functionality and state that those classes share
-/// but is private so that from outside of this library, there is no type
-/// relationship between those three types.
+/// [PackageDep].
+///
+/// It contains functionality and state that those classes share but is private
+/// so that from outside of this library, there is no type relationship between
+/// those three types.
 class _PackageName {
   _PackageName(this.name, this.source, this.description);
 
@@ -117,11 +184,14 @@
   final String name;
 
   /// The name of the [Source] used to look up this package given its
-  /// [description]. If this is a root package, this will be `null`.
+  /// [description].
+  ///
+  /// If this is a root package, this will be `null`.
   final String source;
 
-  /// The metadata used by the package's [source] to identify and locate it. It
-  /// contains whatever [Source]-specific data it needs to be able to get
+  /// The metadata used by the package's [source] to identify and locate it.
+  ///
+  /// It contains whatever [Source]-specific data it needs to be able to get
   /// the package. For example, the description of a git sourced package might
   /// by the URL "git://github.com/dart/uilib.git".
   final description;
@@ -163,8 +233,9 @@
   }
 }
 
-/// A reference to a specific version of a package. A package ID contains
-/// enough information to correctly get the package.
+/// A reference to a specific version of a package.
+///
+/// A package ID contains enough information to correctly get the package.
 ///
 /// Note that it's possible for multiple distinct package IDs to point to
 /// different packages that have identical contents. For example, the same
diff --git a/sdk/lib/_internal/pub/lib/src/package_graph.dart b/sdk/lib/_internal/pub/lib/src/package_graph.dart
index 47e1349..1491378 100644
--- a/sdk/lib/_internal/pub/lib/src/package_graph.dart
+++ b/sdk/lib/_internal/pub/lib/src/package_graph.dart
@@ -25,22 +25,4 @@
   final Map<String, Package> packages;
 
   PackageGraph(this.entrypoint, this.lockFile, this.packages);
-
-  /// Returns the set of transitive dependencies of the package named
-  /// [packageName].
-  Set<Package> transitiveDependencies(String packageName) {
-    var seen = new Set<Package>();
-    traverse(Package package) {
-      if (seen.contains(package)) return;
-      seen.add(package);
-      for (var dep in package.dependencies) {
-        traverse(packages[dep.name]);
-      }
-    }
-
-    var package = packages[packageName];
-    traverse(package);
-    seen.remove(package);
-    return seen;
-  }
 }
diff --git a/sdk/lib/_internal/pub/lib/src/progress.dart b/sdk/lib/_internal/pub/lib/src/progress.dart
index 059d480..ad1ceb2 100644
--- a/sdk/lib/_internal/pub/lib/src/progress.dart
+++ b/sdk/lib/_internal/pub/lib/src/progress.dart
@@ -8,6 +8,7 @@
 import 'dart:io';
 
 import 'log.dart' as log;
+import 'utils.dart';
 
 /// A live-updating progress indicator for long-running log entries.
 class Progress {
@@ -17,61 +18,72 @@
   /// The [Stopwatch] used to track how long a progress log has been running.
   final _stopwatch = new Stopwatch();
 
-  /// The progress message as it's being incrementally appended. When the
-  /// progress is done, a single entry will be added to the log for it.
+  /// The progress message as it's being incrementally appended.
+  ///
+  /// When the progress is done, a single entry will be added to the log for it.
   final String _message;
 
-  Progress(this._message) {
+  /// Gets the current progress time as a parenthesized, formatted string.
+  String get _time => "(${niceDuration(_stopwatch.elapsed)})";
+
+  /// Creates a new progress indicator.
+  ///
+  /// If [fine] is passed, this will log progress messages on [log.Level.FINE]
+  /// as opposed to [log.Level.MESSAGE].
+  Progress(this._message, {bool fine: false}) {
     _stopwatch.start();
 
-    if (log.json.enabled) return;
+    var level = fine ? log.Level.FINE : log.Level.MESSAGE;
 
-    // Only animate if we're writing to a TTY in human format.
-    if (stdioType(stdout) == StdioType.TERMINAL) {
-      _update();
-      _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
-        _update();
-      });
-    } else {
-      stdout.write("$_message... ");
+    // The animation is only shown when it would be meaningful to a human.
+    // That means we're writing a visible message to a TTY at normal log levels
+    // with non-JSON output.
+    if (stdioType(stdout) != StdioType.TERMINAL ||
+        !log.verbosity.isLevelVisible(level) ||
+        log.json.enabled || fine ||
+        log.verbosity.isLevelVisible(log.Level.FINE)) {
+      // Not animating, so just log the start and wait until the task is
+      // completed.
+      log.write(level, "$_message...");
+      return;
     }
+
+    _update();
+    _timer = new Timer.periodic(new Duration(milliseconds: 100), (_) {
+      _update();
+    });
   }
 
   /// Stops the progress indicator.
-  ///
-  /// Returns the complete final progress message.
-  String stop() {
+  void stop() {
     _stopwatch.stop();
 
-    // If we aren't animating, just log the final time.
-    if (log.json.enabled) {
-      // Do nothing.
-    } else if (_timer == null) {
-      stdout.writeln(_time);
-    } else {
-      _timer.cancel();
+    // Always log the final time as [log.fine] because for the most part normal
+    // users don't care about the precise time information beyond what's shown
+    // in the animation.
+    log.fine("$_message finished $_time.");
 
-      // Show one final update.
-      _update();
-      stdout.writeln();
-    }
-
-    return "$_message... ${_time}";
+    // If we were animating, print one final update to show the user the final
+    // time.
+    if (_timer == null) return;
+    _timer.cancel();
+    _timer = null;
+    _update();
+    stdout.writeln();
   }
 
-  /// Gets the current progress time as a parenthesized, formatted string.
-  String get _time {
-    var elapsed = _stopwatch.elapsed;
-    var time = "(";
+  /// Stop animating the progress indicator.
+  ///
+  /// This will continue running the stopwatch so that the full time can be
+  /// logged in [stop].
+  void stopAnimating() {
+    if (_timer == null) return;
 
-    // TODO(rnystrom): Move this somewhere reusable.
-    if (elapsed.inMinutes > 0) {
-      time += "${elapsed.inMinutes}:";
-    }
-
-    var s = elapsed.inSeconds % 59;
-    var ms = (elapsed.inMilliseconds % 1000) ~/ 100;
-    return time + "$s.${ms}s)";
+    // Print a final message without a time indicator so that we don't leave a
+    // misleading half-complete time indicator on the console.
+    stdout.writeln("\r$_message...");
+    _timer.cancel();
+    _timer = null;
   }
 
   /// Refreshes the progress line.
diff --git a/sdk/lib/_internal/pub/lib/src/pubspec.dart b/sdk/lib/_internal/pub/lib/src/pubspec.dart
index 8c29253..3291b34 100644
--- a/sdk/lib/_internal/pub/lib/src/pubspec.dart
+++ b/sdk/lib/_internal/pub/lib/src/pubspec.dart
@@ -4,10 +4,12 @@
 
 library pub.pubspec;
 
-import 'package:yaml/yaml.dart';
 import 'package:path/path.dart' as path;
+import 'package:source_maps/source_maps.dart';
+import 'package:yaml/yaml.dart';
 
-import 'barback.dart';
+import 'barback/transformer_config.dart';
+import 'exceptions.dart';
 import 'io.dart';
 import 'package.dart';
 import 'source_registry.dart';
@@ -22,7 +24,7 @@
 /// [allErrors].
 class Pubspec {
   // If a new lazily-initialized field is added to this class and the
-  // initialization can throw a [PubspecError], that error should also be
+  // initialization can throw a [PubspecException], that error should also be
   // exposed through [allErrors].
 
   /// The registry of sources to use when parsing [dependencies] and
@@ -35,12 +37,14 @@
   /// The location from which the pubspec was loaded.
   ///
   /// This can be null if the pubspec was created in-memory or if its location
-  /// is unknown or can't be represented by a Uri.
-  final Uri _location;
+  /// is unknown.
+  Uri get _location => fields.span.sourceUrl == null ? null :
+      Uri.parse(fields.span.sourceUrl);
 
-  /// All pubspec fields. This includes the fields from which other properties
-  /// are derived.
-  final Map fields;
+  /// All pubspec fields.
+  ///
+  /// This includes the fields from which other properties are derived.
+  final YamlMap fields;
 
   /// The package's name.
   String get name {
@@ -48,11 +52,11 @@
 
     var name = fields['name'];
     if (name == null) {
-      throw new PubspecException(null, _location,
-          'Missing the required "name" field.');
+      throw new PubspecException(
+          'Missing the required "name" field.', fields.span);
     } else if (name is! String) {
-      throw new PubspecException(null, _location,
-          '"name" field must be a string, but was "$name".');
+      throw new PubspecException(
+          '"name" field must be a string.', fields.nodes['name'].span);
     }
 
     _name = name;
@@ -69,11 +73,13 @@
       _version = Version.none;
       return _version;
     }
+
+    var span = fields.nodes['version'].span;
     if (version is! String) {
-      _error('"version" field must be a string, but was "$version".');
+      _error('"version" field must be a string.', span);
     }
 
-    _version = _wrapFormatException('version number', 'version',
+    _version = _wrapFormatException('version number', span,
         () => new Version.parse(version));
     return _version;
   }
@@ -113,8 +119,8 @@
   }
   List<PackageDep> _dependencyOverrides;
 
-  /// The ids of the transformers to use for this package.
-  List<Set<TransformerId>> get transformers {
+  /// The configurations of the transformers to use for this package.
+  List<Set<TransformerConfig>> get transformers {
     if (_transformers != null) return _transformers;
 
     var transformers = fields['transformers'];
@@ -124,65 +130,64 @@
     }
 
     if (transformers is! List) {
-      _error('"transformers" field must be a list, but was "$transformers".');
+      _error('"transformers" field must be a list.',
+          fields.nodes['transformers'].span);
     }
 
     var i = 0;
-    _transformers = transformers.map((phase) {
-      var field = "transformers";
-      if (phase is! List) {
-        phase = [phase];
-      } else {
-        field = "$field[${i++}]";
-      }
-
-      return phase.map((transformer) {
+    _transformers = transformers.nodes.map((phase) {
+      var phaseNodes = phase is YamlList ? phase.nodes : [phase];
+      return phaseNodes.map((transformerNode) {
+        var transformer = transformerNode.value;
         if (transformer is! String && transformer is! Map) {
-          _error('"$field" field must be a string or map, but was '
-              '"$transformer".');
+          _error('A transformer must be a string or map.',
+                 transformerNode.span);
         }
 
-        var library;
-        var configuration;
+        var libraryNode;
+        var configurationNode;
         if (transformer is String) {
-          library = transformer;
+          libraryNode = transformerNode;
         } else {
           if (transformer.length != 1) {
-            _error('"$field" must have a single key: the transformer '
-                'identifier. Was "$transformer".');
+            _error('A transformer map must have a single key: the transformer '
+                'identifier.', transformerNode.span);
           } else if (transformer.keys.single is! String) {
-            _error('"$field" transformer identifier must be a string, but was '
-                '"$library".');
+            _error('A transformer identifier must be a string.',
+                transformer.nodes.keys.single.span);
           }
 
-          library = transformer.keys.single;
-          configuration = transformer.values.single;
-          if (configuration is! Map) {
-            _error('"$field.$library" field must be a map, but was '
-                '"$configuration".');
+          libraryNode = transformer.nodes.keys.single;
+          configurationNode = transformer.nodes.values.single;
+          if (configurationNode is! YamlMap) {
+            _error("A transformer's configuration must be a map.",
+                configurationNode.span);
           }
         }
 
-        var id = _wrapFormatException("transformer configuration",
-            "$field.$library",
-            () => new TransformerId.parse(library, configuration));
+        var config = _wrapSpanFormatException('transformer config', () {
+          return new TransformerConfig.parse(
+            libraryNode.value, libraryNode.span,
+            configurationNode);
+        });
 
-        if (id.package != name &&
-            !id.isBuiltInTransformer &&
-            !dependencies.any((ref) => ref.name == id.package) &&
-            !devDependencies.any((ref) => ref.name == id.package) &&
-            !dependencyOverrides.any((ref) => ref.name == id.package)) {
-          _error('"$field.$library" refers to a package that\'s not a '
-              'dependency.');
+        var package = config.id.package;
+        if (package != name &&
+            !config.id.isBuiltInTransformer &&
+            !dependencies.any((ref) => ref.name == package) &&
+            !devDependencies.any((ref) => ref.name == package) &&
+            !dependencyOverrides.any((ref) => ref.name == package)) {
+          _error('"$package" is not a dependency.',
+              libraryNode.span);
         }
 
-        return id;
+        return config;
       }).toSet();
     }).toList();
 
     return _transformers;
   }
-  List<Set<TransformerId>> _transformers;
+  List<Set<TransformerConfig>> _transformers;
 
   /// The environment-related metadata.
   PubspecEnvironment get environment {
@@ -195,11 +200,12 @@
     }
 
     if (yaml is! Map) {
-      _error('"environment" field must be a map, but was "$yaml".');
+      _error('"environment" field must be a map.',
+             fields.nodes['environment'].span);
     }
 
     _environment = new PubspecEnvironment(
-        _parseVersionConstraint(yaml['sdk'], 'environment.sdk'));
+        _parseVersionConstraint(yaml.nodes['sdk']));
     return _environment;
   }
   PubspecEnvironment _environment;
@@ -217,35 +223,28 @@
     var pubspecPath = path.join(packageDir, 'pubspec.yaml');
     var pubspecUri = path.toUri(pubspecPath);
     if (!fileExists(pubspecPath)) {
-      throw new PubspecException(expectedName, pubspecUri,
-          'Could not find a file named "pubspec.yaml" in "$packageDir".');
+      fail('Could not find a file named "pubspec.yaml" in "$packageDir".');
     }
 
-    try {
-      return new Pubspec.parse(readTextFile(pubspecPath), sources,
-          expectedName: expectedName, location: pubspecUri);
-    } on YamlException catch (error) {
-      throw new PubspecException(expectedName, pubspecUri, error.toString());
-    }
+    return new Pubspec.parse(readTextFile(pubspecPath), sources,
+        expectedName: expectedName, location: pubspecUri);
   }
 
   Pubspec(this._name, this._version, this._dependencies, this._devDependencies,
           this._dependencyOverrides, this._environment, this._transformers,
           [Map fields])
-    : this.fields = fields == null ? {} : fields,
-      _sources = null,
-      _location = null;
+    : this.fields = fields == null ? new YamlMap() : fields,
+      _sources = null;
 
   Pubspec.empty()
     : _sources = null,
-      _location = null,
       _name = null,
       _version = Version.none,
       _dependencies = <PackageDep>[],
       _devDependencies = <PackageDep>[],
       _environment = new PubspecEnvironment(),
-      _transformers = <Set<TransformerId>>[],
-      fields = {};
+      _transformers = <Set<TransformerConfig>>[],
+      fields = new YamlMap();
 
   /// Returns a Pubspec object for an already-parsed map representing its
   /// contents.
@@ -254,52 +253,36 @@
   /// field, this will throw a [PubspecError].
   ///
   /// [location] is the location from which this pubspec was loaded.
-  Pubspec.fromMap(this.fields, this._sources, {String expectedName,
+  Pubspec.fromMap(Map fields, this._sources, {String expectedName,
       Uri location})
-      : _location = location {
-    if (expectedName == null) return;
-
+      : fields = fields is YamlMap ? fields : new YamlMap.wrap(fields,
+          sourceName: location == null ? null : location.toString()) {
     // If [expectedName] is passed, ensure that the actual 'name' field exists
     // and matches the expectation.
+    if (expectedName == null) return;
+    if (name == expectedName) return;
 
-    // If the 'name' field doesn't exist, manually throw an exception rather
-    // than relying on the exception thrown by [name] so that we can provide a
-    // suggested fix.
-    if (fields['name'] == null) {
-      throw new PubspecException(expectedName, _location,
-          'Missing the required "name" field (e.g. "name: $expectedName").');
-    }
-
-    try {
-      if (name == expectedName) return;
-      throw new PubspecException(expectedName, _location,
-          '"name" field "$name" doesn\'t match expected name '
-          '"$expectedName".');
-    } on PubspecException catch (e) {
-      // Catch and re-throw any exceptions thrown by [name] so that they refer
-      // to [expectedName] for additional context.
-      throw new PubspecException(expectedName, e.location,
-          split1(e.message, '\n').last);
-    }
+    throw new PubspecException('"name" field doesn\'t match expected name '
+        '"$expectedName".', this.fields.nodes["name"].span);
   }
 
-  /// Parses the pubspec stored at [filePath] whose text is [contents]. If the
-  /// pubspec doesn't define version for itself, it defaults to [Version.none].
-  /// [filePath] may be `null` if the pubspec is not on the user's local
-  /// file system.
+  /// Parses the pubspec stored at [filePath] whose text is [contents].
+  ///
+  /// If the pubspec doesn't define a version for itself, it defaults to
+  /// [Version.none].
   factory Pubspec.parse(String contents, SourceRegistry sources,
       {String expectedName, Uri location}) {
     if (contents.trim() == '') return new Pubspec.empty();
 
-    var parsedPubspec = loadYaml(contents);
-    if (parsedPubspec == null) return new Pubspec.empty();
-
-    if (parsedPubspec is! Map) {
-      throw new PubspecException(expectedName, location,
-          'The pubspec must be a YAML mapping.');
+    var pubspecNode = loadYamlNode(contents, sourceName: location.toString());
+    if (pubspecNode is YamlScalar && pubspecNode.value == null) {
+      pubspecNode = new YamlMap();
+    } else if (pubspecNode is! YamlMap) {
+      throw new PubspecException(
+          'The pubspec must be a YAML mapping.', pubspecNode.span);
     }
 
-    return new Pubspec.fromMap(parsedPubspec, sources,
+    return new Pubspec.fromMap(pubspecNode, sources,
         expectedName: expectedName, location: location);
   }
 
@@ -334,65 +317,72 @@
     // Allow an empty dependencies key.
     if (yaml == null) return dependencies;
 
-    if (yaml is! Map || yaml.keys.any((e) => e is! String)) {
-      _error('"$field" field should be a map of package names, but was '
-          '"$yaml".');
+    if (yaml is! Map) {
+      _error('"$field" field must be a map.', fields.nodes[field].span);
     }
 
-    yaml.forEach((name, spec) {
+    var nonStringNode = yaml.nodes.keys.firstWhere((e) => e.value is! String,
+        orElse: () => null);
+    if (nonStringNode != null) {
+      _error('A dependency name must be a string.', nonStringNode.span);
+    }
+
+    yaml.nodes.forEach((nameNode, specNode) {
+      var name = nameNode.value;
+      var spec = specNode.value;
       if (fields['name'] != null && name == this.name) {
-        _error('"$field.$name": Package may not list itself as a '
-            'dependency.');
+        _error('A package may not list itself as a dependency.',
+            nameNode.span);
       }
 
-      var description;
+      var descriptionNode;
       var sourceName;
 
       var versionConstraint = new VersionRange();
       if (spec == null) {
-        description = name;
+        descriptionNode = nameNode;
         sourceName = _sources.defaultSource.name;
       } else if (spec is String) {
-        description = name;
+        descriptionNode = nameNode;
         sourceName = _sources.defaultSource.name;
-        versionConstraint = _parseVersionConstraint(spec, "$field.$name");
+        versionConstraint = _parseVersionConstraint(specNode);
       } else if (spec is Map) {
         // Don't write to the immutable YAML map.
         spec = new Map.from(spec);
 
         if (spec.containsKey('version')) {
-          versionConstraint = _parseVersionConstraint(spec.remove('version'),
-              "$field.$name.version");
+          spec.remove('version');
+          versionConstraint = _parseVersionConstraint(
+              specNode.nodes['version']);
         }
 
         var sourceNames = spec.keys.toList();
         if (sourceNames.length > 1) {
-          _error('"$field.$name" field may only have one source, but it had '
-              '${toSentence(sourceNames)}.');
+          _error('A dependency may only have one source.', specNode.span);
         }
 
         sourceName = sourceNames.single;
         if (sourceName is! String) {
-          _error('"$field.$name" source name must be a string, but was '
-              '"$sourceName".');
+          _error('A source name must be a string.',
+              specNode.nodes.keys.single.span);
         }
 
-        description = spec[sourceName];
+        descriptionNode = specNode.nodes[sourceName];
       } else {
-        _error('"$field.$name" field must be a string or a mapping.');
+        _error('A dependency specification must be a string or a mapping.',
+            specNode.span);
       }
 
       // Let the source validate the description.
-      var descriptionField = "$field.$name";
-      if (spec is Map) descriptionField = "$descriptionField.$sourceName";
-      _wrapFormatException('description', descriptionField, () {
+      var description = _wrapFormatException('description',
+          descriptionNode.span, () {
         var pubspecPath;
         if (_location != null && _isFileUri(_location)) {
           pubspecPath = path.fromUri(_location);
         }
 
-        description = _sources[sourceName].parseDescription(
-            pubspecPath, description, fromLockFile: false);
+        return _sources[sourceName].parseDescription(
+            pubspecPath, descriptionNode.value, fromLockFile: false);
       });
 
       dependencies.add(new PackageDep(
@@ -402,21 +392,19 @@
     return dependencies;
   }
 
-  /// Parses [yaml] to a [VersionConstraint].
-  ///
-  /// If [yaml] is `null`, returns [VersionConstraint.any].
-  VersionConstraint _parseVersionConstraint(yaml, String field) {
-    if (yaml == null) return VersionConstraint.any;
-    if (yaml is! String) {
-      _error('"$field" must be a string, but was "$yaml".');
+  /// Parses [node] to a [VersionConstraint].
+  VersionConstraint _parseVersionConstraint(YamlNode node) {
+    if (node.value == null) return VersionConstraint.any;
+    if (node.value is! String) {
+      _error('A version constraint must be a string.', node.span);
     }
 
-    return _wrapFormatException('version constraint', field,
-        () => new VersionConstraint.parse(yaml));
+    return _wrapFormatException('version constraint', node.span,
+        () => new VersionConstraint.parse(node.value));
   }
 
-  // Make sure the same package doesn't appear as both a regular and dev
-  // dependency.
+  /// Makes sure the same package doesn't appear as both a regular and dev
+  /// dependency.
   void _checkDependencyOverlap(List<PackageDep> dependencies,
       List<PackageDep> devDependencies) {
     var dependencyNames = dependencies.map((dep) => dep.name).toSet();
@@ -424,27 +412,41 @@
         devDependencies.map((dep) => dep.name).toSet());
     if (collisions.isEmpty) return;
 
+    var span = fields["dependencies"].nodes.keys
+        .firstWhere((key) => collisions.contains(key.value)).span;
+
+    // TODO(nweiz): associate source range info with PackageDeps and use it
+    // here.
     _error('${pluralize('Package', collisions.length)} '
         '${toSentence(collisions.map((package) => '"$package"'))} cannot '
-        'appear in both "dependencies" and "dev_dependencies".');
+        'appear in both "dependencies" and "dev_dependencies".',
+        span);
   }
 
   /// Runs [fn] and wraps any [FormatException] it throws in a
   /// [PubspecException].
   ///
   /// [description] should be a noun phrase that describes whatever's being
-  /// parsed or processed by [fn]. [field] should be the location of whatever's
+  /// parsed or processed by [fn]. [span] should be the location of whatever's
   /// being processed within the pubspec.
-  _wrapFormatException(String description, String field, fn()) {
+  _wrapFormatException(String description, Span span, fn()) {
     try {
       return fn();
     } on FormatException catch (e) {
-      _error('Invalid $description for "$field": ${e.message}');
+      _error('Invalid $description: ${e.message}', span);
+    }
+  }
+
+  _wrapSpanFormatException(String description, fn()) {
+    try {
+      return fn();
+    } on SpanFormatException catch (e) {
+      _error('Invalid $description: ${e.message}', e.span);
     }
   }
 
   /// Throws a [PubspecException] with the given message.
-  void _error(String message) {
+  void _error(String message, Span span) {
     var name;
     try {
       name = this.name;
@@ -452,12 +454,13 @@
       // [name] is null.
     }
 
-    throw new PubspecException(name, _location, message);
+    throw new PubspecException(message, span);
   }
 }
 
-/// The environment-related metadata in the pubspec. Corresponds to the data
-/// under the "environment:" key in the pubspec.
+/// The environment-related metadata in the pubspec.
+///
+/// Corresponds to the data under the "environment:" key in the pubspec.
 class PubspecEnvironment {
   /// The version constraint specifying which SDK versions this package works
   /// with.
@@ -470,46 +473,10 @@
 /// An exception thrown when parsing a pubspec.
 ///
 /// These exceptions are often thrown lazily while accessing pubspec properties.
-/// Their string representation contains additional contextual information about
-/// the pubspec for which parsing failed.
-class PubspecException extends ApplicationException {
-  /// The name of the package that the pubspec is for.
-  ///
-  /// This can be null if the pubspec didn't specify a name and no external name
-  /// was provided.
-  final String name;
-
-  /// The location of the pubspec.
-  ///
-  /// This can be null if the pubspec has no physical location, or if the
-  /// location is unknown.
-  final Uri location;
-
-  PubspecException(String name, Uri location, String subMessage)
-      : this.name = name,
-        this.location = location,
-        super(_computeMessage(name, location, subMessage));
-
-  static String _computeMessage(String name, Uri location, String subMessage) {
-    var str = 'Error in';
-
-    if (name != null) {
-      str += ' pubspec for package "$name"';
-      if (location != null) str += ' loaded from';
-    } else if (location == null) {
-      str += ' pubspec for an unknown package';
-    }
-
-    if (location != null) {
-      if (_isFileUri(location)) {
-        str += ' ${nicePath(path.fromUri(location))}';
-      } else {
-        str += ' $location';
-      }
-    }
-
-    return "$str:\n$subMessage";
-  }
+class PubspecException extends SpanFormatException
+    implements ApplicationException {
+  PubspecException(String message, Span span)
+      : super(message, span);
 }
 
 /// Returns whether [uri] is a file URI.
diff --git a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
index 552cc6d..44a9c7d 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/backtracking_solver.dart
@@ -2,11 +2,13 @@
 // for 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 back-tracking depth-first solver. Attempts to find the best solution for
-/// a root package's transitive dependency graph, where a "solution" is a set
-/// of concrete package versions. A valid solution will select concrete
-/// versions for every package reached from the root package's dependency graph,
-/// and each of those packages will fit the version constraints placed on it.
+/// A back-tracking depth-first solver.
+///
+/// Attempts to find the best solution for a root package's transitive
+/// dependency graph, where a "solution" is a set of concrete package versions.
+/// A valid solution will select concrete versions for every package reached
+/// from the root package's dependency graph, and each of those packages will
+/// fit the version constraints placed on it.
 ///
 /// The solver builds up a solution incrementally by traversing the dependency
 /// graph starting at the root package. When it reaches a new package, it gets
@@ -37,6 +39,7 @@
 import 'dart:collection' show Queue;
 
 import '../barback.dart' as barback;
+import '../exceptions.dart';
 import '../lock_file.dart';
 import '../log.dart' as log;
 import '../package.dart';
@@ -50,9 +53,11 @@
 import 'version_queue.dart';
 import 'version_solver.dart';
 
-/// The top-level solver. Keeps track of the current potential solution, and
-/// the other possible versions for speculative package selections. Backtracks
-/// and advances to the next potential solution in the case of a failure.
+/// The top-level solver.
+///
+/// Keeps track of the current potential solution, and the other possible
+/// versions for speculative package selections. Backtracks and advances to the
+/// next potential solution in the case of a failure.
 class BacktrackingSolver {
   final SourceRegistry sources;
   final Package root;
@@ -62,8 +67,10 @@
 
   final PubspecCache cache;
 
-  /// The set of packages that are being explicitly upgraded. The solver will
-  /// only allow the very latest version for each of these packages.
+  /// The set of packages that are being explicitly upgraded.
+  ///
+  /// The solver will only allow the very latest version for each of these
+  /// packages.
   final _forceLatest = new Set<String>();
 
   /// If this is set, the contents of [lockFile] are ignored while solving.
@@ -76,6 +83,9 @@
   /// to use the one here.
   final _overrides = new Map<String, PackageDep>();
 
+  /// The package versions currently selected by the solver, along with the
+  /// versions which are remaining to be tried.
+  ///
   /// Every time a package is encountered when traversing the dependency graph,
   /// the solver must select a version for it, sometimes when multiple versions
   /// are valid. This keeps track of which versions have been selected so far
@@ -113,8 +123,10 @@
     }
   }
 
-  /// Run the solver. Completes with a list of specific package versions if
-  /// successful or an error if it failed to find a solution.
+  /// Run the solver.
+  ///
+  /// Completes with a list of specific package versions if successful or an
+  /// error if it failed to find a solution.
   Future<SolveResult> solve() {
     var stopwatch = new Stopwatch();
 
@@ -177,10 +189,11 @@
   }
 
   /// Adds [versions], which is the list of all allowed versions of a given
-  /// package, to the set of versions to consider for solutions. The first item
-  /// in the list will be the currently selected version of that package.
-  /// Subsequent items will be tried if it the current selection fails. Returns
-  /// the first selected version.
+  /// package, to the set of versions to consider for solutions.
+  ///
+  /// The first item in the list will be the currently selected version of that
+  /// package. Subsequent items will be tried if it the current selection fails.
+  /// Returns the first selected version.
   PackageId select(VersionQueue versions) {
     _selected.add(versions);
     logSolve();
@@ -201,8 +214,9 @@
     return null;
   }
 
-  /// Gets the version of [package] currently locked in the lock file. Returns
-  /// `null` if it isn't in the lockfile (or has been unlocked).
+  /// Gets the version of [package] currently locked in the lock file.
+  ///
+  /// Returns `null` if it isn't in the lockfile (or has been unlocked).
   PackageId getLocked(String package) {
     if (_upgradeAll) return null;
     if (_forceLatest.contains(package)) return null;
@@ -211,10 +225,12 @@
   }
 
   /// Traverses the root package's dependency graph using the current potential
-  /// solution. If successful, completes to the solution. If not, backtracks
-  /// to the most recently selected version of a package and tries the next
-  /// version of it. If there are no more versions, continues to backtrack to
-  /// previous selections, and so on. If there is nothing left to backtrack to,
+  /// solution.
+  ///
+  /// If successful, completes to the solution. If not, backtracks to the most
+  /// recently selected version of a package and tries the next version of it.
+  /// If there are no more versions, continues to backtrack to previous
+  /// selections, and so on. If there is nothing left to backtrack to,
   /// completes to the last failure that occurred.
   Future<List<PackageId>> _traverseSolution() => resetStack(() {
     return new Traverser(this).traverse().catchError((error) {
@@ -233,9 +249,11 @@
   });
 
   /// Backtracks from the current failed solution and determines the next
-  /// solution to try. If possible, it will backjump based on the cause of the
-  /// [failure] to minize backtracking. Otherwise, it will simply backtrack to
-  /// the next possible solution.
+  /// solution to try.
+  ///
+  /// If possible, it will backjump based on the cause of the [failure] to
+  /// minize backtracking. Otherwise, it will simply backtrack to the next
+  /// possible solution.
   ///
   /// Returns `true` if there is a new solution to try.
   Future<bool> _backtrack(SolveFailure failure) {
@@ -278,9 +296,10 @@
   }
 
   /// Walks the selected packages from most to least recent to determine which
-  /// ones can be ignored and jumped over by the backtracker. The only packages
-  /// we need to backtrack to are ones that led (possibly indirectly) to the
-  /// failure. Everything else can be skipped.
+  /// ones can be ignored and jumped over by the backtracker.
+  ///
+  /// The only packages we need to backtrack to are ones that led (possibly
+  /// indirectly) to the failure. Everything else can be skipped.
   void _backjump(SolveFailure failure) {
     for (var i = _selected.length - 1; i >= 0; i--) {
       // Each queue will never be empty since it gets discarded by _backtrack()
@@ -382,8 +401,9 @@
     log.solver(buffer.toString().trim());
   }
 
-  /// Logs [message] in the context of the current selected packages. If
-  /// [message] is omitted, just logs a description of leaf-most selection.
+  /// Logs [message] in the context of the current selected packages.
+  ///
+  /// If [message] is omitted, just logs a description of leaf-most selection.
   void logSolve([String message]) {
     if (message == null) {
       if (_selected.isEmpty) {
@@ -404,26 +424,32 @@
 
 /// Given the solver's current set of selected package versions, this tries to
 /// traverse the dependency graph and see if a complete set of valid versions
-/// has been chosen. If it reaches a conflict, it will fail and stop
-/// traversing. If it reaches a package that isn't selected it will refine the
-/// solution by adding that package's set of allowed versions to the solver and
-/// then select the best one and continue.
+/// has been chosen.
+///
+/// If it reaches a conflict, it fails and stops traversing. If it reaches a
+/// package that isn't selected, it refines the solution by adding that
+/// package's set of allowed versions to the solver and then select the best
+/// one and continuing.
 class Traverser {
   final BacktrackingSolver _solver;
 
-  /// The queue of packages left to traverse. We do a breadth-first traversal
-  /// using an explicit queue just to avoid the code complexity of a recursive
-  /// asynchronous traversal.
+  /// The queue of packages left to traverse.
+  ///
+  /// We do a breadth-first traversal using an explicit queue just to avoid the
+  /// code complexity of a recursive asynchronous traversal.
   final _packages = new Queue<PackageId>();
 
-  /// The packages we have already traversed. Used to avoid traversing the same
-  /// package multiple times, and to build the complete solution results.
+  /// The packages we have already traversed.
+  ///
+  /// Used to avoid traversing the same package multiple times, and to build
+  /// the complete solution results.
   final _visited = new Set<PackageId>();
 
-  /// The dependencies visited so far in the traversal. For each package name
-  /// (the map key) we track the list of dependencies that other packages have
-  /// placed on it so that we can calculate the complete constraint for shared
-  /// dependencies.
+  /// The dependencies visited so far in the traversal.
+  ///
+  /// For each package name (the map key) we track the list of dependencies
+  /// that other packages have placed on it so that we can calculate the
+  /// complete constraint for shared dependencies.
   final _dependencies = <String, List<Dependency>>{};
 
   Traverser(this._solver);
@@ -436,10 +462,11 @@
     return _traversePackage();
   }
 
-  /// Traverses the next package in the queue. Completes to a list of package
-  /// IDs if the traversal completed successfully and found a solution.
-  /// Completes to an error if the traversal failed. Otherwise, recurses to the
-  /// next package in the queue, etc.
+  /// Traverses the next package in the queue.
+  ///
+  /// Completes to a list of package IDs if the traversal completed
+  /// successfully and found a solution. Completes to an error if the traversal
+  /// failed. Otherwise, recurses to the next package in the queue, etc.
   Future<List<PackageId>> _traversePackage() {
     if (_packages.isEmpty) {
       // We traversed the whole graph. If we got here, we successfully found
@@ -476,7 +503,7 @@
 
         // Not overridden.
         return dep;
-      });
+      }).toSet();
 
       // Make sure the package doesn't have any bad dependencies.
       for (var dep in deps) {
@@ -487,6 +514,12 @@
       }
 
       return _traverseDeps(id, new DependencyQueue(_solver, deps));
+    }).catchError((error) {
+      if (error is! PackageNotFoundException) throw error;
+
+      // We can only get here if the lockfile refers to a specific package
+      // version that doesn't exist (probably because it was yanked).
+      throw new NoVersionException(id.name, null, id.version, []);
     });
   }
 
@@ -597,9 +630,10 @@
   }
 
   /// Ensures that dependency [dep] from [depender] is consistent with the
-  /// other dependencies on the same package. Throws a [SolveFailure]
-  /// exception if not. Only validates sources and descriptions, not the
-  /// version.
+  /// other dependencies on the same package.
+  ///
+  /// Throws a [SolveFailure] exception if not. Only validates sources and
+  /// descriptions, not the version.
   void _validateDependency(PackageDep dep, PackageId depender) {
     // Make sure the dependencies agree on source and description.
     var required = _getRequired(dep.name);
@@ -624,10 +658,11 @@
   }
 
   /// Validates the currently selected package against the new dependency that
-  /// [dep] and [constraint] place on it. Returns `null` if there is no
-  /// currently selected package, throws a [SolveFailure] if the new reference
-  /// it not does not allow the previously selected version, or returns the
-  /// selected package if successful.
+  /// [dep] and [constraint] place on it.
+  ///
+  /// Returns `null` if there is no currently selected package, throws a
+  /// [SolveFailure] if the new reference it not does not allow the previously
+  /// selected version, or returns the selected package if successful.
   PackageId _validateSelected(PackageDep dep, VersionConstraint constraint) {
     var selected = _solver.getSelected(dep.name);
     if (selected == null) return null;
@@ -642,17 +677,19 @@
     return selected;
   }
 
-  /// Gets the list of dependencies for package [name]. Will create an empty
-  /// list if needed.
+  /// Gets the list of dependencies for package [name].
+  ///
+  /// Creates an empty list if needed.
   List<Dependency> _getDependencies(String name) {
     return _dependencies.putIfAbsent(name, () => <Dependency>[]);
   }
 
-  /// Gets a "required" reference to the package [name]. This is the first
-  /// non-root dependency on that package. All dependencies on a package must
-  /// agree on source and description, except for references to the root
-  /// package. This will return a reference to that "canonical" source and
-  /// description, or `null` if there is no required reference yet.
+  /// Gets a "required" reference to the package [name].
+  ///
+  /// This is the first non-root dependency on that package. All dependencies
+  /// on a package must agree on source and description, except for references
+  /// to the root package. This will return a reference to that "canonical"
+  /// source and description, or `null` if there is no required reference yet.
   ///
   /// This is required because you may have a circular dependency back onto the
   /// root package. That second dependency won't be a root dependency and it's
@@ -676,7 +713,9 @@
 
   /// Gets the package [name] that's currently contained in the lockfile if it
   /// meets [constraint] and has the same source and description as other
-  /// references to that package. Returns `null` otherwise.
+  /// references to that package.
+  ///
+  /// Returns `null` otherwise.
   PackageId _getValidLocked(String name) {
     var package = _solver.getLocked(name);
     if (package == null) return null;
@@ -703,7 +742,9 @@
 }
 
 /// Ensures that if [pubspec] has an SDK constraint, then it is compatible
-/// with the current SDK. Throws a [SolveFailure] if not.
+/// with the current SDK.
+///
+/// Throws a [SolveFailure] if not.
 void _validateSdkConstraint(Pubspec pubspec) {
   if (pubspec.environment.sdkVersion.allows(sdk.version)) return;
 
diff --git a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
index b3a147b..aafa5d0 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/solve_report.dart
@@ -11,24 +11,15 @@
 import '../utils.dart';
 import 'version_solver.dart';
 
-/// Generates and displays nicely formatted reports for the results of running
-/// a version resolution.
-///
-/// If [showAll] is true, then all of the previous and current dependencies
-/// are shown and their changes relative to the previous lock file are
-/// highlighted. Otherwise, only overrides are shown.
-///
-/// Returns the number of changed dependencies.
-int show(SourceRegistry sources, Package root, LockFile previousLockFile,
-         SolveResult result, {bool showAll: false}) {
-  var report = new _SolveReport(sources, root, previousLockFile, result);
-  return report.show(showAll: showAll);
-}
-
 /// Unlike [SolveResult], which is the static data describing a resolution,
 /// this class contains the mutable state used while generating the report
-/// itself. It's a report builder.
-class _SolveReport {
+/// itself.
+///
+/// It's a report builder.
+class SolveReport {
+  /// Whether all dependencies should be reported, or just ones that changed.
+  final bool _showAll;
+
   final SourceRegistry _sources;
   final Package _root;
   final LockFile _previousLockFile;
@@ -39,8 +30,9 @@
 
   final _output = new StringBuffer();
 
-  _SolveReport(this._sources, this._root, this._previousLockFile,
-      this._result) {
+  SolveReport(this._sources, this._root, this._previousLockFile,
+      this._result, {bool showAll: false})
+      : _showAll = showAll {
     // Fill the map so we can use it later.
     for (var id in _result.packages) {
       _dependencies[id.name] = id;
@@ -49,22 +41,22 @@
 
   /// Displays a report of the results of the version resolution relative to
   /// the previous lock file.
-  ///
-  /// If [showAll] is true, then all of the previous and current dependencies
-  /// are shown and their changes relative to the previous lock file are
-  /// highlighted. Otherwise, only overrides are shown.
-  ///
-  /// Returns the number of changed dependencies.
-  int show({bool showAll: false}) {
-    if (showAll) _reportChanges();
+  void show() {
+    _reportChanges();
     _reportOverrides();
+  }
 
+  /// Displays a one-line message summarizing what changes were made (or would
+  /// be made) to the lockfile.
+  ///
+  /// If [dryRun] is true, describes it in terms of what would be done.
+  void summarize({bool dryRun: false}) {
     // Count how many dependencies actually changed.
     var dependencies = _dependencies.keys.toSet();
     dependencies.addAll(_previousLockFile.packages.keys);
     dependencies.remove(_root.name);
 
-    return dependencies.where((name) {
+    var numChanged = dependencies.where((name) {
       var oldId = _previousLockFile.packages[name];
       var newId = _dependencies[name];
 
@@ -76,6 +68,28 @@
       return !_descriptionsEqual(oldId, newId) ||
           oldId.version != newId.version;
     }).length;
+
+    if (dryRun) {
+      if (numChanged == 0) {
+        log.message("No dependencies would change.");
+      } else if (numChanged == 1) {
+        log.message("Would change $numChanged dependency.");
+      } else {
+        log.message("Would change $numChanged dependencies.");
+      }
+    } else {
+      if (numChanged == 0) {
+        if (_showAll) {
+          log.message("No dependencies changed.");
+        } else {
+          log.message("Got dependencies!");
+        }
+      } else if (numChanged == 1) {
+        log.message("Changed $numChanged dependency!");
+      } else {
+        log.message("Changed $numChanged dependencies!");
+      }
+    }
   }
 
   /// Displays a report of all of the previous and current dependencies and
@@ -96,7 +110,7 @@
       _output.writeln("These packages are no longer being depended on:");
       removed = removed.toList();
       removed.sort();
-      removed.forEach(_reportPackage);
+      removed.forEach((name) => _reportPackage(name, alwaysShow: true));
     }
 
     log.message(_output);
@@ -112,7 +126,8 @@
       overrides.sort((a, b) => a.compareTo(b));
 
       overrides.forEach(
-          (name) => _reportPackage(name, highlightOverride: false));
+          (name) => _reportPackage(name, alwaysShow: true,
+              highlightOverride: false));
 
       log.warning(_output);
     }
@@ -120,11 +135,11 @@
 
   /// Reports the results of the upgrade on the package named [name].
   ///
-  /// If [highlightOverride] is true (or absent), writes "(override)" next to
-  /// overridden packages.
-  void _reportPackage(String name, {bool highlightOverride}) {
-    if (highlightOverride == null) highlightOverride = true;
-
+  /// If [alwaysShow] is true, the package is reported even if it didn't change,
+  /// regardless of [_showAll]. If [highlightOverride] is true (or absent),
+  /// writes "(override)" next to overridden packages.
+  void _reportPackage(String name,
+      {bool alwaysShow: false, bool highlightOverride: true}) {
     var newId = _dependencies[name];
     var oldId = _previousLockFile.packages[name];
     var id = newId != null ? newId : oldId;
@@ -132,8 +147,13 @@
     var isOverridden = _result.overrides.map(
         (dep) => dep.name).contains(id.name);
 
+    // If the package was previously a dependency but the dependency has
+    // changed in some way.
     var changed = false;
 
+    // If the dependency was added or removed.
+    var addedOrRemoved = false;
+
     // Show a one-character "icon" describing the change. They are:
     //
     //     ! The package is being overridden.
@@ -142,26 +162,32 @@
     //     > The package was upgraded from a lower version.
     //     < The package was downgraded from a higher version.
     //     * Any other change between the old and new package.
+    var icon;
     if (isOverridden) {
-      _output.write(log.magenta("! "));
+      icon = log.magenta("! ");
     } else if (newId == null) {
-      _output.write(log.red("- "));
+      icon = log.red("- ");
+      addedOrRemoved = true;
     } else if (oldId == null) {
-      _output.write(log.green("+ "));
+      icon = log.green("+ ");
+      addedOrRemoved = true;
     } else if (!_descriptionsEqual(oldId, newId)) {
-      _output.write(log.cyan("* "));
+      icon = log.cyan("* ");
       changed = true;
     } else if (oldId.version < newId.version) {
-      _output.write(log.green("> "));
+      icon = log.green("> ");
       changed = true;
     } else if (oldId.version > newId.version) {
-      _output.write(log.cyan("< "));
+      icon = log.cyan("< ");
       changed = true;
     } else {
       // Unchanged.
-      _output.write("  ");
+      icon = "  ";
     }
 
+    if (!(alwaysShow || changed || addedOrRemoved || _showAll)) return;
+
+    _output.write(icon);
     _output.write(log.bold(id.name));
     _output.write(" ");
     _writeId(id);
diff --git a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
index 3fc55d0..9e0939c 100644
--- a/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
+++ b/sdk/lib/_internal/pub/lib/src/solver/version_solver.dart
@@ -7,6 +7,9 @@
 import 'dart:async';
 import "dart:convert";
 
+import 'package:stack_trace/stack_trace.dart';
+
+import '../exceptions.dart';
 import '../lock_file.dart';
 import '../log.dart' as log;
 import '../package.dart';
@@ -15,7 +18,7 @@
 import '../version.dart';
 import '../utils.dart';
 import 'backtracking_solver.dart';
-import 'solve_report.dart' as solve_report;
+import 'solve_report.dart';
 
 /// Attempts to select the best concrete versions for all of the transitive
 /// dependencies of [root] taking into account all of the [VersionConstraint]s
@@ -62,9 +65,10 @@
   final SolveFailure error;
 
   /// The number of solutions that were attempted before either finding a
-  /// successful solution or exhausting all options. In other words, one more
-  /// than the number of times it had to backtrack because it found an invalid
-  /// solution.
+  /// successful solution or exhausting all options.
+  ///
+  /// In other words, one more than the number of times it had to backtrack
+  /// because it found an invalid solution.
   final int attemptedSolutions;
 
   final SourceRegistry _sources;
@@ -83,13 +87,21 @@
 
   /// Displays a report of what changes were made to the lockfile.
   ///
-  /// If [showAll] is true, displays all new and previous dependencies.
-  /// Otherwise, just shows a warning for any overrides in effect.
+  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
+  /// command.
+  void showReport({bool isUpgrade: false}) {
+    new SolveReport(_sources, _root, _previousLockFile, this,
+        showAll: isUpgrade).show();
+  }
+
+  /// Displays a one-line message summarizing what changes were made (or would
+  /// be made) to the lockfile.
   ///
-  /// Returns the number of changed (added, removed, or modified) dependencies.
-  int showReport({bool showAll: false}) {
-    return solve_report.show(_sources, _root, _previousLockFile, this,
-        showAll: showAll);
+  /// If [isUpgrade] is true, a "pub upgrade" was run, otherwise it was another
+  /// command.
+  void summarizeChanges({bool isUpgrade: false, bool dryRun: false}) {
+    new SolveReport(_sources, _root, _previousLockFile, this,
+        showAll: isUpgrade).summarize(dryRun: dryRun);
   }
 
   String toString() {
@@ -104,6 +116,7 @@
 }
 
 /// Maintains a cache of previously-requested data: pubspecs and version lists.
+///
 /// Used to avoid requesting the same pubspec from the server repeatedly.
 class PubspecCache {
   final SourceRegistry _sources;
@@ -111,6 +124,9 @@
   /// The already-requested cached version lists.
   final _versions = new Map<PackageRef, List<PackageId>>();
 
+  /// The errors from failed version list requests.
+  final _versionErrors = new Map<PackageRef, Pair<Object, Chain>>();
+
   /// The already-requested cached pubspecs.
   final _pubspecs = new Map<PackageId, Pubspec>();
 
@@ -175,6 +191,14 @@
       _versionCacheHits++;
       return new Future.value(versions);
     }
+
+    // See if we cached a failure.
+    var error = _versionErrors[package];
+    if (error != null) {
+      _versionCacheHits++;
+      return new Future.error(error.first, error.last);
+    }
+
     _versionCacheMisses++;
 
     var source = _sources[package.source];
@@ -187,6 +211,12 @@
           (version) => package.atVersion(version)).toList();
       _versions[package] = ids;
       return ids;
+    }).catchError((error, trace) {
+      // If an error occurs, cache that too. We only want to do one request
+      // for any given package, successful or not.
+      log.solver("Could not get versions for $package:\n$error\n\n$trace");
+      _versionErrors[package] = new Pair(error, new Chain.forTrace(trace));
+      throw error;
     });
   }
 
@@ -258,17 +288,16 @@
 
 /// Base class for all failures that can occur while trying to resolve versions.
 abstract class SolveFailure implements ApplicationException {
-  /// The name of the package whose version could not be solved. Will be `null`
-  /// if the failure is not specific to one package.
+  /// The name of the package whose version could not be solved.
+  ///
+  /// Will be `null` if the failure is not specific to one package.
   final String package;
 
-  /// The known dependencies on [package] at the time of the failure. Will be
-  /// an empty collection if the failure is not specific to one package.
+  /// The known dependencies on [package] at the time of the failure.
+  ///
+  /// Will be an empty collection if the failure is not specific to one package.
   final Iterable<Dependency> dependencies;
 
-  final innerError = null;
-  final innerTrace = null;
-
   String get message => toString();
 
   /// A message describing the specific kind of solve failure.
@@ -300,8 +329,9 @@
     return buffer.toString();
   }
 
-  /// Describes a dependency's reference in the output message. Override this
-  /// to highlight which aspect of [dep] led to the failure.
+  /// Describes a dependency's reference in the output message.
+  ///
+  /// Override this to highlight which aspect of [dep] led to the failure.
   String _describeDependency(PackageDep dep) =>
       "depends on version ${dep.constraint}";
 }
diff --git a/sdk/lib/_internal/pub/lib/src/source.dart b/sdk/lib/_internal/pub/lib/src/source.dart
index 3f1d5db..823b860 100644
--- a/sdk/lib/_internal/pub/lib/src/source.dart
+++ b/sdk/lib/_internal/pub/lib/src/source.dart
@@ -21,8 +21,10 @@
 /// package needs a dependency from a cached source, it is first installed in
 /// the [SystemCache] and then acquired from there.
 abstract class Source {
-  /// The name of the source. Should be lower-case, suitable for use in a
-  /// filename, and unique accross all sources.
+  /// The name of the source.
+  ///
+  /// Should be lower-case, suitable for use in a filename, and unique accross
+  /// all sources.
   String get name;
 
   /// Whether or not this source is the default source.
@@ -49,7 +51,9 @@
   }
 
   /// Get the list of all versions that exist for the package described by
-  /// [description]. [name] is the expected name of the package.
+  /// [description].
+  ///
+  /// [name] is the expected name of the package.
   ///
   /// Note that this does *not* require the packages to be downloaded locally,
   /// which is the point. This is used during version resolution to determine
@@ -64,8 +68,10 @@
   }
 
   /// Loads the (possibly remote) pubspec for the package version identified by
-  /// [id]. This may be called for packages that have not yet been downloaded
-  /// during the version resolution process.
+  /// [id].
+  ///
+  /// This may be called for packages that have not yet been downloaded during
+  /// the version resolution process.
   ///
   /// Sources should not override this. Instead, they implement [doDescribe].
   Future<Pubspec> describe(PackageId id) {
@@ -79,18 +85,26 @@
   }
 
   /// Loads the (possibly remote) pubspec for the package version identified by
-  /// [id]. This may be called for packages that have not yet been downloaded
-  /// during the version resolution process.
+  /// [id].
+  ///
+  /// This may be called for packages that have not yet been downloaded during
+  /// the version resolution process.
   ///
   /// This method is effectively protected: subclasses must implement it, but
   /// external code should not call this. Instead, call [describe].
   Future<Pubspec> doDescribe(PackageId id);
 
-  /// Gets the package identified by [id] and places it at [path].
+  /// Ensures that the package identified by [id] is present on the local file
+  /// system.
   ///
-  /// Returns a [Future] that completes when the operation finishes. [path] is
-  /// guaranteed not to exist, and its parent directory is guaranteed to exist.
-  Future get(PackageId id, String path);
+  /// For cached sources, this ensures the package is in the system cache. (If
+  /// already cached, it does nothing.) For uncached sources, it does nothing
+  /// since the package is already local.
+  Future ensureLocal(PackageId id);
+
+  /// Ensures [id] is available locally and creates a symlink at [symlink]
+  /// pointing it.
+  Future get(PackageId id, String symlink);
 
   /// Returns the directory where this package can (or could) be found locally.
   ///
@@ -99,6 +113,9 @@
   /// installed into the cache yet.
   Future<String> getDirectory(PackageId id);
 
+  /// Gives the source a chance to interpret and validate the description for
+  /// a package coming from this source.
+  ///
   /// When a [Pubspec] or [LockFile] is parsed, it reads in the description for
   /// each dependency. It is up to the dependency's [Source] to determine how
   /// that should be interpreted. This will be called during parsing to validate
@@ -137,10 +154,15 @@
   }
 
   /// Returns whether or not [description1] describes the same package as
-  /// [description2] for this source. This method should be light-weight. It
-  /// doesn't need to validate that either package exists.
+  /// [description2] for this source.
+  ///
+  /// This method should be light-weight. It doesn't need to validate that
+  /// either package exists.
   bool descriptionsEqual(description1, description2);
 
+  /// Resolves [id] to a more possibly more precise that will uniquely identify
+  /// a package regardless of when the package is requested.
+  ///
   /// For some sources, [PackageId]s can point to different chunks of code at
   /// different times. This takes such an [id] and returns a future that
   /// completes to a [PackageId] that will uniquely specify a single chunk of
diff --git a/sdk/lib/_internal/pub/lib/src/source/cached.dart b/sdk/lib/_internal/pub/lib/src/source/cached.dart
index 4fada96..aaafd31 100644
--- a/sdk/lib/_internal/pub/lib/src/source/cached.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/cached.dart
@@ -47,9 +47,14 @@
   /// the system cache.
   Future<Pubspec> describeUncached(PackageId id);
 
-  Future get(PackageId id, String packageDir) {
-    return downloadToSystemCache(id).then(
-        (pkg) => createPackageSymlink(id.name, pkg.dir, packageDir));
+  Future ensureLocal(PackageId id) {
+    return downloadToSystemCache(id);
+  }
+
+  Future get(PackageId id, String symlink) {
+    return downloadToSystemCache(id).then((pkg) {
+      createPackageSymlink(id.name, pkg.dir, symlink);
+    });
   }
 
   /// Determines if the package with [id] is already downloaded to the system
diff --git a/sdk/lib/_internal/pub/lib/src/source/git.dart b/sdk/lib/_internal/pub/lib/src/source/git.dart
index b0488c4..9f4c38c 100644
--- a/sdk/lib/_internal/pub/lib/src/source/git.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/git.dart
@@ -24,8 +24,6 @@
   /// has already been run during this run of pub.
   final _updatedRepos = new Set<String>();
 
-  GitSource();
-
   /// Since we don't have an easy way to read from a remote Git repo, this
   /// just installs [id] into the system cache, then describes it from there.
   Future<Pubspec> describeUncached(PackageId id) {
@@ -44,23 +42,16 @@
   /// `<package name>-<url hash>`. These are used to check out the repository
   /// itself; each of the commit-specific directories are clones of a directory
   /// in `cache/`.
-  Future<Package> downloadToSystemCache(PackageId id, {bool force}) {
-    // Force is not supported because the cache repair command doesn't need it.
-    // Instead, it uses [resetCachedPackages].
-    assert(force != true);
-
+  Future<Package> downloadToSystemCache(PackageId id) {
     var revisionCachePath;
 
-    return git.isInstalled.then((installed) {
-      if (!installed) {
-        throw new ApplicationException(
-            "Cannot get ${id.name} from Git (${_getUrl(id)}).\n"
-            "Please ensure Git is correctly installed.");
-      }
+    if (!git.isInstalled) {
+      fail("Cannot get ${id.name} from Git (${_getUrl(id)}).\n"
+          "Please ensure Git is correctly installed.");
+    }
 
-      ensureDir(path.join(systemCacheRoot, 'cache'));
-      return _ensureRevision(id);
-    }).then((_) => getDirectory(id)).then((path) {
+    ensureDir(path.join(systemCacheRoot, 'cache'));
+    return _ensureRevision(id).then((_) => getDirectory(id)).then((path) {
       revisionCachePath = path;
       if (entryExists(revisionCachePath)) return null;
       return _clone(_repoCachePath(id), revisionCachePath, mirror: false);
diff --git a/sdk/lib/_internal/pub/lib/src/source/hosted.dart b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
index 56a76a9..ec21d20 100644
--- a/sdk/lib/_internal/pub/lib/src/source/hosted.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/hosted.dart
@@ -11,6 +11,7 @@
 import 'package:http/http.dart' as http;
 import 'package:path/path.dart' as path;
 
+import '../exceptions.dart';
 import '../http.dart';
 import '../io.dart';
 import '../log.dart' as log;
@@ -179,8 +180,8 @@
       return httpClient.send(new http.Request("GET", url))
           .then((response) => response.stream)
           .then((stream) {
-        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT,
-            'fetching URL "$url"');
+        return timeout(extractTarGz(stream, tempDir), HTTP_TIMEOUT, url,
+            'downloading $url');
       }).then((_) {
         // Remove the existing directory if it exists. This will happen if
         // we're forcing a download to repair the cache.
@@ -196,8 +197,9 @@
   }
 
   /// When an error occurs trying to read something about [package] from [url],
-  /// this tries to translate into a more user friendly error message. Always
-  /// throws an error, either the original one or a better one.
+  /// this tries to translate into a more user friendly error message.
+  ///
+  /// Always throws an error, either the original one or a better one.
   void _throwFriendlyError(error, StackTrace stackTrace, String package,
       String url) {
     if (error is PubHttpException &&
@@ -222,8 +224,10 @@
 }
 
 /// This is the modified hosted source used when pub get or upgrade are run
-/// with "--offline". This uses the system cache to get the list of available
-/// packages and does no network access.
+/// with "--offline".
+///
+/// This uses the system cache to get the list of available packages and does
+/// no network access.
 class OfflineHostedSource extends HostedSource {
   /// Gets the list of all versions of [name] that are in the system cache.
   Future<List<Version>> getVersions(String name, description) {
@@ -274,7 +278,9 @@
 ///
 /// This behavior is a bug, but is being preserved for compatibility.
 String _urlToDirectory(String url) {
-  url = url.replaceAll(new RegExp(r"^https?://"), "");
+  // Normalize all loopback URLs to "localhost".
+  url = url.replaceAllMapped(new RegExp(r"^https?://(127\.0\.0\.1|\[::1\])?"),
+      (match) => match[1] == null ? '' : 'localhost');
   return replace(url, new RegExp(r'[<>:"\\/|?*%]'),
       (match) => '%${match[0].codeUnitAt(0)}');
 }
@@ -298,23 +304,14 @@
   var scheme = "https";
 
   // See if it's a loopback IP address.
-  try {
-    var urlWithoutPort = url.replaceAll(new RegExp(":.*"), "");
-    var address = new io.InternetAddress(urlWithoutPort);
-    if (address.isLoopback) scheme = "http";
-  } on ArgumentError catch(error) {
-    // If we got here, it's not a raw IP address, so it's probably a regular
-    // URL.
-  }
-
-  if (url == "localhost") scheme = "http";
-
+  if (isLoopback(url.replaceAll(new RegExp(":.*"), ""))) scheme = "http";
   return "$scheme://$url";
 }
 
 /// Parses [description] into its server and package name components, then
-/// converts that to a Uri given [pattern]. Ensures the package name is
-/// properly URL encoded.
+/// converts that to a Uri given [pattern].
+///
+/// Ensures the package name is properly URL encoded.
 Uri _makeUrl(description, String pattern(String server, String package)) {
   var parsed = _parseDescription(description);
   var server = parsed.last;
@@ -323,8 +320,9 @@
 }
 
 /// Parses [id] into its server, package name, and version components, then
-/// converts that to a Uri given [pattern]. Ensures the package name is
-/// properly URL encoded.
+/// converts that to a Uri given [pattern].
+///
+/// Ensures the package name is properly URL encoded.
 Uri _makeVersionUrl(PackageId id,
     String pattern(String server, String package, String version)) {
   var parsed = _parseDescription(id.description);
diff --git a/sdk/lib/_internal/pub/lib/src/source/path.dart b/sdk/lib/_internal/pub/lib/src/source/path.dart
index c6d20cd..ec0f9a2 100644
--- a/sdk/lib/_internal/pub/lib/src/source/path.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/path.dart
@@ -8,6 +8,7 @@
 
 import 'package:path/path.dart' as path;
 
+import '../exceptions.dart';
 import '../io.dart';
 import '../package.dart';
 import '../pubspec.dart';
@@ -33,12 +34,13 @@
     return path1 == path2;
   }
 
-  /// Create a symlink from the source path directly to the destination
-  /// directory.
-  Future get(PackageId id, String destination) {
+  /// Path dependencies are already local.
+  Future ensureLocal(PackageId id) => new Future.value();
+
+  Future get(PackageId id, String symlink) {
     return syncFuture(() {
       var dir = _validatePath(id.name, id.description);
-      createPackageSymlink(id.name, dir, destination,
+      createPackageSymlink(id.name, dir, symlink,
           relative: id.description["relative"]);
     });
   }
@@ -46,10 +48,11 @@
   Future<String> getDirectory(PackageId id) =>
       newFuture(() => _validatePath(id.name, id.description));
 
-  /// Parses a path dependency. This takes in a path string and returns a map.
-  /// The "path" key will be the original path but resolved relative to the
-  /// containing path. The "relative" key will be `true` if the original path
-  /// was relative.
+  /// Parses a path dependency.
+  ///
+  /// This takes in a path string and returns a map. The "path" key will be the
+  /// original path but resolved relative to the containing path. The
+  /// "relative" key will be `true` if the original path was relative.
   ///
   /// A path coming from a pubspec is a simple string. From a lock file, it's
   /// an expanded {"path": ..., "relative": ...} map.
@@ -95,9 +98,10 @@
     };
   }
 
-  /// Serializes path dependency's [description]. For the descriptions where
-  /// `relative` attribute is `true`, tries to make `path` relative to the
-  /// specified [containingPath].
+  /// Serializes path dependency's [description].
+  ///
+  /// For the descriptions where `relative` attribute is `true`, tries to make
+  /// `path` relative to the specified [containingPath].
   dynamic serializeDescription(String containingPath, description) {
     if (description["relative"]) {
       return {
diff --git a/sdk/lib/_internal/pub/lib/src/source/unknown.dart b/sdk/lib/_internal/pub/lib/src/source/unknown.dart
index 5fcd273..da20dc2 100644
--- a/sdk/lib/_internal/pub/lib/src/source/unknown.dart
+++ b/sdk/lib/_internal/pub/lib/src/source/unknown.dart
@@ -31,9 +31,12 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe a package from unknown source '$name'.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
       "Cannot get a package from an unknown source '$name'.");
 
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
+      "Cannot get an unknown source '$name'.");
+
   /// Returns the directory where this package can be found locally.
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
       "Cannot find a package from an unknown source '$name'.");
diff --git a/sdk/lib/_internal/pub/lib/src/source_registry.dart b/sdk/lib/_internal/pub/lib/src/source_registry.dart
index 15c4bc1..ffac4f8 100644
--- a/sdk/lib/_internal/pub/lib/src/source_registry.dart
+++ b/sdk/lib/_internal/pub/lib/src/source_registry.dart
@@ -24,8 +24,9 @@
     return sources.iterator;
   }
 
-  /// Sets the default source. This takes a string, which must be the name of a
-  /// registered source.
+  /// Sets the default source.
+  ///
+  /// This takes a string, which must be the name of a registered source.
   void setDefault(String name) {
     if (!_sources.containsKey(name)) {
       throw new StateError('Default source $name is not in the registry');
@@ -34,8 +35,10 @@
     _default = _sources[name];
   }
 
-  /// Registers a new source. This source may not have the same name as a source
-  /// that's already been registered.
+  /// Registers a new source.
+  ///
+  /// This source may not have the same name as a source that's already been
+  /// registered.
   void register(Source source) {
     if (_sources.containsKey(source.name)) {
       throw new StateError('Source registry already has a source named '
diff --git a/sdk/lib/_internal/pub/lib/src/system_cache.dart b/sdk/lib/_internal/pub/lib/src/system_cache.dart
index 4c48fba..6508615 100644
--- a/sdk/lib/_internal/pub/lib/src/system_cache.dart
+++ b/sdk/lib/_internal/pub/lib/src/system_cache.dart
@@ -37,8 +37,9 @@
   /// user's file system.
   SystemCache(this.rootDir);
 
-  /// Creates a system cache and registers the standard set of sources. If
-  /// [isOffline] is `true`, then the offline hosted source will be used.
+  /// Creates a system cache and registers the standard set of sources.
+  ///
+  /// If [isOffline] is `true`, then the offline hosted source will be used.
   /// Defaults to `false`.
   factory SystemCache.withSources(String rootDir, {bool isOffline: false}) {
     var cache = new SystemCache(rootDir);
@@ -55,8 +56,10 @@
     return cache;
   }
 
-  /// Registers a new source. This source must not have the same name as a
-  /// source that's already been registered.
+  /// Registers a new source.
+  ///
+  /// This source must not have the same name as a source that's already been
+  /// registered.
   void register(Source source) {
     source.bind(this);
     sources.register(source);
@@ -73,11 +76,12 @@
     return source.isInSystemCache(id);
   }
 
-  /// Create a new temporary directory within the system cache. The system
-  /// cache maintains its own temporary directory that it uses to stage
-  /// packages into while downloading. It uses this instead of the OS's system
-  /// temp directory to ensure that it's on the same volume as the pub system
-  /// cache so that it can move the directory from it.
+  /// Create a new temporary directory within the system cache.
+  ///
+  /// The system cache maintains its own temporary directory that it uses to
+  /// stage packages into while downloading. It uses this instead of the OS's
+  /// system temp directory to ensure that it's on the same volume as the pub
+  /// system cache so that it can move the directory from it.
   String createTempDir() {
     var temp = ensureDir(tempDir);
     return io.createTempDir(temp, 'dir');
diff --git a/sdk/lib/_internal/pub/lib/src/utils.dart b/sdk/lib/_internal/pub/lib/src/utils.dart
index d9ab8a9..6f904c3 100644
--- a/sdk/lib/_internal/pub/lib/src/utils.dart
+++ b/sdk/lib/_internal/pub/lib/src/utils.dart
@@ -6,20 +6,16 @@
 library pub.utils;
 
 import 'dart:async';
-import "dart:collection";
 import "dart:convert";
 import 'dart:io';
-import 'dart:isolate';
 @MirrorsUsed(targets: 'pub.io')
 import 'dart:mirrors';
 
-import "package:analyzer/analyzer.dart";
 import "package:crypto/crypto.dart";
-import "package:http/http.dart" as http;
 import 'package:path/path.dart' as path;
 import "package:stack_trace/stack_trace.dart";
 
-import '../../asset/dart/serialize.dart';
+import 'exceptions.dart';
 
 export '../../asset/dart/utils.dart';
 
@@ -190,6 +186,10 @@
 ///
 /// Handles properly formatting IPv6 addresses.
 Uri baseUrlForAddress(InternetAddress address, int port) {
+  if (address.isLoopback) {
+    return new Uri(scheme: "http", host: "localhost", port: port);
+  }
+
   // IPv6 addresses in URLs need to be enclosed in square brackets to avoid
   // URL ambiguity with the ":" in the address.
   if (address.type == InternetAddressType.IP_V6) {
@@ -199,6 +199,27 @@
   return new Uri(scheme: "http", host: address.address, port: port);
 }
 
+/// Returns whether [host] is a host for a localhost or loopback URL.
+///
+/// Unlike [InternetAddress.isLoopback], this hostnames from URLs as well as
+/// from [InternetAddress]es, including "localhost".
+bool isLoopback(String host) {
+  if (host == 'localhost') return true;
+
+  // IPv6 hosts in URLs are surrounded by square brackets.
+  if (host.startsWith("[") && host.endsWith("]")) {
+    host = host.substring(1, host.length - 1);
+  }
+
+  try {
+    return new InternetAddress(host).isLoopback;
+  } on ArgumentError catch (_) {
+    // The host isn't an IP address and isn't "localhost', so it's almost
+    // certainly not a loopback host.
+    return false;
+  }
+}
+
 /// Flattens nested lists inside an iterable into a single list containing only
 /// non-list elements.
 List flatten(Iterable nested) {
@@ -259,94 +280,73 @@
   });
 }
 
-/// Creates a map from [iter], using the return values of [keyFn] as the keys
-/// and the return values of [valueFn] as the values.
-Map listToMap(Iterable iter, keyFn(element), valueFn(element)) {
-  var map = new Map();
-  for (var element in iter) {
-    map[keyFn(element)] = valueFn(element);
-  }
-  return map;
-}
-
 /// Creates a new map from [map] with new keys and values.
 ///
-/// The return values of [keyFn] are used as the keys and the return values of
-/// [valueFn] are used as the values for the new map.
-Map mapMap(Map map, keyFn(key, value), valueFn(key, value)) =>
-  listToMap(map.keys,
-      (key) => keyFn(key, map[key]),
-      (key) => valueFn(key, map[key]));
-
-/// Creates a new map from [map] with the same keys.
+/// The return values of [key] are used as the keys and the return values of
+/// [value] are used as the values for the new map.
 ///
-/// The return values of [valueFn] are used as the values for the new map.
-Map mapMapValues(Map map, fn(key, value)) => mapMap(map, (key, _) => key, fn);
+/// [key] defaults to returning the original key and [value] defaults to
+/// returning the original value.
+Map mapMap(Map map, {key(key, value), value(key, value)}) {
+  if (key == null) key = (key, _) => key;
+  if (value == null) value = (_, value) => value;
 
-/// Returns the shortest path from [start] to [end] in [graph].
-///
-/// The graph is represented by a map where each key is a vertex and the value
-/// is the set of other vertices directly reachable from the key. [start] and
-/// [end] must be vertices in this graph.
-List shortestPath(Map<dynamic, Iterable> graph, start, end) {
-  assert(graph.containsKey(start));
-  assert(graph.containsKey(end));
-
-  // Dijkstra's algorithm.
-  var infinity = graph.length;
-  var distance = mapMapValues(graph, (_1, _2) => infinity);
-
-  // A map from each node to the node that came before it on the shortest path
-  // from it back to [start].
-  var previous = {};
-
-  distance[start] = 0;
-  var remaining = graph.keys.toSet();
-  while (!remaining.isEmpty) {
-    var current = minBy(remaining, (node) => distance[node]);
-    remaining.remove(current);
-
-    // If there's no remaining node that's reachable from [start], then there's
-    // no path from [start] to [end].
-    if (distance[current] == infinity) return null;
-
-    // If we've reached [end], we've found the shortest path to it and we just
-    // need to reconstruct that path.
-    if (current == end) break;
-
-    for (var neighbor in graph[current]) {
-      if (!remaining.contains(neighbor)) continue;
-      var newDistance = distance[current] + 1;
-      if (newDistance >= distance[neighbor]) continue;
-      distance[neighbor] = newDistance;
-      previous[neighbor] = current;
-    }
-  }
-
-  var path = new Queue();
-  var current = end;
-  while (current != null) {
-    path.addFirst(current);
-    current = previous[current];
-  }
-
-  return path.toList();
-}
-
-/// Returns a copy of [graph] with all the edges reversed.
-///
-/// The graph is represented by a map where each key is a vertex and the value
-/// is the set of other vertices directly reachable from the key.
-Map<dynamic, Set> reverseGraph(Map<dynamic, Set> graph) {
-  var reversed = new Map.fromIterable(graph.keys, value: (_) => new Set());
-  graph.forEach((vertex, edges) {
-    for (var edge in edges) {
-      reversed[edge].add(vertex);
-    }
+  var result = {};
+  map.forEach((mapKey, mapValue) {
+    result[key(mapKey, mapValue)] = value(mapKey, mapValue);
   });
-  return reversed;
+  return result;
 }
 
+/// Like [Map.fromIterable], but [key] and [value] may return [Future]s.
+Future<Map> mapFromIterableAsync(Iterable iter, {key(element),
+    value(element)}) {
+  if (key == null) key = (element) => element;
+  if (value == null) value = (element) => element;
+
+  var map = new Map();
+  return Future.wait(iter.map((element) {
+    return Future.wait([
+      syncFuture(() => key(element)),
+      syncFuture(() => value(element))
+    ]).then((results) {
+      map[results[0]] = results[1];
+    });
+  })).then((_) => map);
+}
+
+/// Given a list of filenames, returns a set of patterns that can be used to
+/// filter for those filenames.
+///
+/// For a given path, that path ends with some string in the returned set if
+/// and only if that path's basename is in [files].
+Set<String> createFileFilter(Iterable<String> files) {
+  return files.expand((file) {
+    var result = ["/$file"];
+    if (Platform.operatingSystem == 'windows') result.add("\\$file");
+    return result;
+  }).toSet();
+}
+
+/// Given a blacklist of directory names, returns a set of patterns that can
+/// be used to filter for those directory names.
+///
+/// For a given path, that path contains some string in the returned set if
+/// and only if one of that path's components is in [dirs].
+Set<String> createDirectoryFilter(Iterable<String> dirs) {
+  return dirs.expand((dir) {
+    var result = ["/$dir/"];
+    if (Platform.operatingSystem == 'windows') {
+      result..add("/$dir\\")..add("\\$dir/")..add("\\$dir\\");
+    }
+    return result;
+  }).toSet();
+}
+
+/// Returns the maximum value in [iter].
+int maxAll(Iterable<int> iter) =>
+    iter.reduce((max, element) => element > max ? element : max);
+
 /// Replace each instance of [matcher] in [source] with the return value of
 /// [fn].
 String replace(String source, Pattern matcher, String fn(Match)) {
@@ -427,6 +427,7 @@
 
 // TODO(nweiz): remove this when issue 7964 is fixed.
 /// Returns a [Future] that will complete to the first element of [stream].
+///
 /// Unlike [Stream.first], this is safe to use with single-subscription streams.
 Future streamFirst(Stream stream) {
   var completer = new Completer();
@@ -456,8 +457,10 @@
 
 // TODO(nweiz): remove this when issue 7787 is fixed.
 /// Creates two single-subscription [Stream]s that each emit all values and
-/// errors from [stream]. This is useful if [stream] is single-subscription but
-/// multiple subscribers are necessary.
+/// errors from [stream].
+///
+/// This is useful if [stream] is single-subscription but multiple subscribers
+/// are necessary.
 Pair<Stream, Stream> tee(Stream stream) {
   var controller1 = new StreamController(sync: true);
   var controller2 = new StreamController(sync: true);
@@ -503,6 +506,7 @@
   text.split("\n").map((line) => line.replaceFirst(_trailingCR, "")).toList();
 
 /// Converts a stream of arbitrarily chunked strings into a line-by-line stream.
+///
 /// The lines don't include line termination characters. A single trailing
 /// newline is ignored.
 Stream<String> streamToLines(Stream<String> stream) {
@@ -544,7 +548,8 @@
 // pkg/http.
 
 /// Like [String.split], but only splits on the first occurrence of the pattern.
-/// This will always return an array of two elements or fewer.
+///
+/// This always returns an array of two elements or fewer.
 List<String> split1(String toSplit, String pattern) {
   if (toSplit.isEmpty) return <String>[];
 
@@ -596,8 +601,10 @@
   sets.fold(new Set(), (union, set) => union.union(set));
 
 // TODO(nweiz): remove this when issue 9068 has been fixed.
-/// Whether [uri1] and [uri2] are equal. This consider HTTP URIs to default to
-/// port 80, and HTTPs URIs to default to port 443.
+/// Whether [uri1] and [uri2] are equal.
+///
+/// This consider HTTP URIs to default to port 80, and HTTPs URIs to default to
+/// port 443.
 bool urisEqual(Uri uri1, Uri uri2) =>
   canonicalizeUri(uri1) == canonicalizeUri(uri2);
 
@@ -620,14 +627,26 @@
   return relative;
 }
 
-/// Decodes a URL-encoded string. Unlike [Uri.decodeComponent], this includes
-/// replacing `+` with ` `.
+/// Returns a human-friendly representation of [duration].
+String niceDuration(Duration duration) {
+  var result = duration.inMinutes > 0 ? "${duration.inMinutes}:" : "";
+
+  var s = duration.inSeconds % 59;
+  var ms = (duration.inMilliseconds % 1000) ~/ 100;
+  return result + "$s.${ms}s";
+}
+
+/// Decodes a URL-encoded string.
+///
+/// Unlike [Uri.decodeComponent], this includes replacing `+` with ` `.
 String urlDecode(String encoded) =>
   Uri.decodeComponent(encoded.replaceAll("+", " "));
 
 /// Takes a simple data structure (composed of [Map]s, [Iterable]s, scalar
 /// objects, and [Future]s) and recursively resolves all the [Future]s contained
-/// within. Completes with the fully resolved structure.
+/// within.
+///
+/// Completes with the fully resolved structure.
 Future awaitObject(object) {
   // Unroll nested futures.
   if (object is Future) return object.then(awaitObject);
@@ -660,22 +679,25 @@
   return path.fromUri(lib.uri);
 }
 
+/// Whether "special" strings such as Unicode characters or color escapes are
+/// safe to use.
+///
+/// On Windows or when not printing to a terminal, only printable ASCII
+/// characters should be used.
+bool get canUseSpecialChars => !runningAsTest &&
+    Platform.operatingSystem != 'windows' &&
+    stdioType(stdout) == StdioType.TERMINAL;
+
 /// Gets a "special" string (ANSI escape or Unicode).
 ///
 /// On Windows or when not printing to a terminal, returns something else since
 /// those aren't supported.
-String getSpecial(String color, [String onWindows = '']) {
-  // No ANSI escapes on windows or when running tests.
-  if (runningAsTest || Platform.operatingSystem == 'windows' ||
-      stdioType(stdout) != StdioType.TERMINAL) {
-    return onWindows;
-  } else {
-    return color;
-  }
-}
+String getSpecial(String special, [String onWindows = '']) =>
+    canUseSpecialChars ? special : onWindows;
 
-/// Prepends each line in [text] with [prefix]. If [firstPrefix] is passed, the
-/// first line is prefixed with that instead.
+/// Prepends each line in [text] with [prefix].
+///
+/// If [firstPrefix] is passed, the first line is prefixed with that instead.
 String prefixLines(String text, {String prefix: '| ', String firstPrefix}) {
   var lines = text.split('\n');
   if (firstPrefix == null) {
@@ -717,9 +739,10 @@
   return completer.future;
 }
 
-/// The subset of strings that don't need quoting in YAML. This pattern does
-/// not strictly follow the plain scalar grammar of YAML, which means some
-/// strings may be unnecessarily quoted, but it's much simpler.
+/// The subset of strings that don't need quoting in YAML.
+///
+/// This pattern does not strictly follow the plain scalar grammar of YAML,
+/// which means some strings may be unnecessarily quoted, but it's much simpler.
 final _unquotableYamlString = new RegExp(r"^[a-zA-Z_-][a-zA-Z_0-9-]*$");
 
 /// Converts [data], which is a parsed YAML object, to a pretty-printed string,
@@ -779,92 +802,11 @@
   return buffer.toString();
 }
 
-/// An exception class for exceptions that are intended to be seen by the user.
-/// These exceptions won't have any debugging information printed when they're
-/// thrown.
-class ApplicationException implements Exception {
-  final String message;
-
-  /// The underlying exception that [this] is wrapping, if any.
-  final innerError;
-
-  /// The stack trace for [innerError] if it exists.
-  final Trace innerTrace;
-
-  ApplicationException(this.message, [this.innerError, StackTrace innerTrace])
-      : innerTrace = innerTrace == null ? null : new Trace.from(innerTrace);
-
-  String toString() => message;
-}
-
-/// A class for command usage exceptions.
-class UsageException extends ApplicationException {
-  /// The command usage information.
-  final String usage;
-
-  UsageException(String message, this.usage)
-      : super(message);
-
-  String toString() => "$message\n\n$usage";
-}
-
-/// A class for errors in a command's input data.
-///
-/// This corresponds to the [exit_codes.DATA] exit code.
-class DataException extends ApplicationException {
-  DataException(String message)
-      : super(message);
-}
-
-/// An class for exceptions where a package could not be found in a [Source].
-///
-/// The source is responsible for wrapping its internal exceptions in this so
-/// that other code in pub can use this to show a more detailed explanation of
-/// why the package was being requested.
-class PackageNotFoundException extends ApplicationException {
-  PackageNotFoundException(String message, [innerError, StackTrace innerTrace])
-      : super(message, innerError, innerTrace);
-}
-
 /// Throw a [ApplicationException] with [message].
 void fail(String message, [innerError, StackTrace innerTrace]) {
-  throw new ApplicationException(message, innerError, innerTrace);
-}
-
-/// All the names of user-facing exceptions.
-final _userFacingExceptions = new Set<String>.from([
-  'ApplicationException',
-  // This refers to http.ClientException.
-  'ClientException',
-  // Errors coming from the Dart analyzer are probably caused by syntax errors
-  // in user code, so they're user-facing.
-  'AnalyzerError', 'AnalyzerErrorGroup',
-  // An error spawning an isolate probably indicates a transformer with an
-  // invalid import.
-  'IsolateSpawnException',
-  // TODO(nweiz): clean up the dart:io errors when issue 9955 is fixed.
-  'FileSystemException', 'HttpException', 'OSError',
-  'ProcessException', 'SocketException', 'WebSocketException'
-]);
-
-/// Returns whether [error] is a user-facing error object. This includes both
-/// [ApplicationException] and any dart:io errors.
-bool isUserFacingException(error) {
-  if (error is CrossIsolateException) {
-    return _userFacingExceptions.contains(error.type);
+  if (innerError != null) {
+    throw new WrappedException(message, innerError, innerTrace);
+  } else {
+    throw new ApplicationException(message);
   }
-
-  // TODO(nweiz): unify this list with _userFacingExceptions when issue 5897 is
-  // fixed.
-  return error is ApplicationException ||
-    error is AnalyzerError ||
-    error is AnalyzerErrorGroup ||
-    error is IsolateSpawnException ||
-    error is FileSystemException ||
-    error is HttpException ||
-    error is http.ClientException ||
-    error is OSError ||
-    error is ProcessException ||
-    error is SocketException ||
-    error is WebSocketException;
 }
diff --git a/sdk/lib/_internal/pub/lib/src/validator.dart b/sdk/lib/_internal/pub/lib/src/validator.dart
index e448058..32194fe 100644
--- a/sdk/lib/_internal/pub/lib/src/validator.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator.dart
@@ -20,18 +20,24 @@
 import 'validator/utf8_readme.dart';
 
 /// The base class for validators that check whether a package is fit for
-/// uploading. Each validator should override [errors], [warnings], or both to
-/// return lists of errors or warnings to display to the user. Errors will cause
-/// the package not to be uploaded; warnings will require the user to confirm
-/// the upload.
+/// uploading.
+///
+/// Each validator should override [errors], [warnings], or both to return
+/// lists of errors or warnings to display to the user. Errors will cause the
+/// package not to be uploaded; warnings will require the user to confirm the
+/// upload.
 abstract class Validator {
   /// The entrypoint that's being validated.
   final Entrypoint entrypoint;
 
-  /// The accumulated errors for this validator. Filled by calling [validate].
+  /// The accumulated errors for this validator.
+  ///
+  /// Filled by calling [validate].
   final errors = <String>[];
 
-  /// The accumulated warnings for this validator. Filled by calling [validate].
+  /// The accumulated warnings for this validator.
+  ///
+  /// Filled by calling [validate].
   final warnings = <String>[];
 
   Validator(this.entrypoint);
@@ -41,8 +47,8 @@
   Future validate();
 
   /// Run all validators on the [entrypoint] package and print their results.
-  /// The future will complete with the error and warning messages,
-  /// respectively.
+  ///
+  /// The future completes with the error and warning messages, respectively.
   ///
   /// [packageSize], if passed, should complete to the size of the tarred
   /// package, in bytes. This is used to validate that it's not too big to
diff --git a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
index 400e6b2..6ad79ce6 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/compiled_dartdoc.dart
@@ -21,7 +21,7 @@
 
   Future validate() {
     return syncFuture(() {
-      for (var entry in listDir(entrypoint.root.dir, recursive: true)) {
+      for (var entry in entrypoint.root.listFiles()) {
         if (path.basename(entry) != "nav.json") continue;
         var dir = path.dirname(entry);
 
diff --git a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
index 0f06d3f..c341e33 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/dependency.dart
@@ -90,7 +90,7 @@
             'future versions of "${dep.name}".');
   }
 
-  // Warn that dependencies should allow more than a single version.
+  /// Warn that dependencies should allow more than a single version.
   void _warnAboutSingleVersionConstraint(PackageDep dep) {
     warnings.add(
         'Your dependency on "${dep.name}" should allow more than one version. '
@@ -104,7 +104,7 @@
         'along with other packages that also depend on "${dep.name}".');
   }
 
-  // Warn that dependencies should have lower bounds on their constraints.
+  /// Warn that dependencies should have lower bounds on their constraints.
   void _warnAboutNoConstraintLowerBound(PackageDep dep) {
     var message = 'Your dependency on "${dep.name}" should have a lower bound.';
     var locked = entrypoint.loadLockFile().packages[dep.name];
@@ -126,7 +126,7 @@
             'previous versions of "${dep.name}".');
   }
 
-  // Warn that dependencies should have upper bounds on their constraints.
+  /// Warn that dependencies should have upper bounds on their constraints.
   void _warnAboutNoConstraintUpperBound(PackageDep dep) {
     warnings.add(
         'Your dependency on "${dep.name}" should have an upper bound. For '
diff --git a/sdk/lib/_internal/pub/lib/src/validator/name.dart b/sdk/lib/_internal/pub/lib/src/validator/name.dart
index 1b77ead..b939ac8 100644
--- a/sdk/lib/_internal/pub/lib/src/validator/name.dart
+++ b/sdk/lib/_internal/pub/lib/src/validator/name.dart
@@ -53,7 +53,7 @@
   List<String> get _libraries {
     var libDir = path.join(entrypoint.root.dir, "lib");
     if (!dirExists(libDir)) return [];
-    return listDir(libDir, recursive: true)
+    return entrypoint.root.listFiles(beneath: libDir)
         .map((file) => path.relative(file, from: path.dirname(libDir)))
         .where((file) => !path.split(file).contains("src") &&
                          path.extension(file) == '.dart')
diff --git a/sdk/lib/_internal/pub/lib/src/version.dart b/sdk/lib/_internal/pub/lib/src/version.dart
index a726fd0..7e33fe2 100644
--- a/sdk/lib/_internal/pub/lib/src/version.dart
+++ b/sdk/lib/_internal/pub/lib/src/version.dart
@@ -125,9 +125,10 @@
     }
   }
 
-  /// Returns the primary version out of a list of candidates. This is the
-  /// highest-numbered stable (non-prerelease) version. If there are no stable
-  /// versions, it's just the highest-numbered version.
+  /// Returns the primary version out of a list of candidates.
+  ///
+  /// This is the highest-numbered stable (non-prerelease) version. If there
+  /// are no stable versions, it's just the highest-numbered version.
   static Version primary(List<Version> versions) {
     var primary;
     for (var version in versions) {
@@ -203,7 +204,7 @@
   }
 
   /// Gets the next patch version number that follows this one.
-  ///bed8b33fda6ec81c3ba52274d189bc0661ed12bf
+  ///
   /// If this version is a pre-release, then it just strips the pre-release
   /// suffix. Otherwise, it increments the patch version.
   Version get nextPatch {
@@ -292,9 +293,11 @@
 }
 
 /// A [VersionConstraint] is a predicate that can determine whether a given
-/// version is valid or not. For example, a ">= 2.0.0" constraint allows any
-/// version that is "2.0.0" or greater. Version objects themselves implement
-/// this to match a specific version.
+/// version is valid or not.
+///
+/// For example, a ">= 2.0.0" constraint allows any version that is "2.0.0" or
+/// greater. Version objects themselves implement this to match a specific
+/// version.
 abstract class VersionConstraint {
   /// A [VersionConstraint] that allows all versions.
   static VersionConstraint any = new VersionRange();
@@ -302,8 +305,10 @@
   /// A [VersionConstraint] that allows no versions: i.e. the empty set.
   static VersionConstraint empty = const _EmptyVersion();
 
-  /// Parses a version constraint. This string is either "any" or a series of
-  /// version parts. Each part can be one of:
+  /// Parses a version constraint.
+  ///
+  /// This string is either "any" or a series of version parts. Each part can
+  /// be one of:
   ///
   ///   * A version string like `1.2.3`. In other words, anything that can be
   ///     parsed by [Version.parse()].
@@ -395,9 +400,11 @@
   }
 
   /// Creates a new version constraint that is the intersection of
-  /// [constraints]. It will only allow versions that all of those constraints
-  /// allow. If constraints is empty, then it returns a VersionConstraint that
-  /// allows all versions.
+  /// [constraints].
+  ///
+  /// It only allows versions that all of those constraints allow. If
+  /// constraints is empty, then it returns a VersionConstraint that allows
+  /// all versions.
   factory VersionConstraint.intersection(
       Iterable<VersionConstraint> constraints) {
     var constraint = new VersionRange();
@@ -421,10 +428,11 @@
   VersionConstraint intersect(VersionConstraint other);
 }
 
-/// Constrains versions to a fall within a given range. If there is a minimum,
-/// then this only allows versions that are at that minimum or greater. If there
-/// is a maximum, then only versions less than that are allowed. In other words,
-/// this allows `>= min, < max`.
+/// Constrains versions to a fall within a given range.
+///
+/// If there is a minimum, then this only allows versions that are at that
+/// minimum or greater. If there is a maximum, then only versions less than
+/// that are allowed. In other words, this allows `>= min, < max`.
 class VersionRange implements VersionConstraint {
   final Version min;
   final Version max;
diff --git a/sdk/lib/_internal/pub/pub.status b/sdk/lib/_internal/pub/pub.status
index d4fa045..f9df64b 100644
--- a/sdk/lib/_internal/pub/pub.status
+++ b/sdk/lib/_internal/pub/pub.status
@@ -2,15 +2,8 @@
 # for details. All rights reserved. Use of this source code is governed by a
 # BSD-style license that can be found in the LICENSE file.
 
-test/hosted/version_negotiation_test: Pass, Timeout # Issue 14346
 test/serve/web_socket/url_to_asset_id_test: Pass, Slow
 
-[ $runtime == vm && $system == windows ]
-test/serve/warns_on_assets_paths_test: Pass, Fail # Issue 15741
-
-[ $runtime == vm && $system == macos ]
-test/serve/native_watch_modified_file_test: Pass, Fail # Issue 19052
-
 # Pub only runs on the VM, so just rule out all compilers.
 [ $compiler == dart2js || $compiler == dart2dart ]
 *: Skip
@@ -18,3 +11,6 @@
 # Pub only runs on the standalone VM, not the browser.
 [ $runtime == drt || $runtime == dartium || $runtime == opera ]
 *: Skip
+
+[ $runtime == vm && $system == windows ]
+test/run/app_can_read_from_stdin_test: Fail # Issue 19448
diff --git a/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
new file mode 100644
index 0000000..e49fe21
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/build/preserves_htaccess_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+
+  integration("preserves .htaccess as a special case", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir('web', [
+        d.file('.htaccess', 'fblthp'),
+        d.file('.hidden', 'asdfgh')
+      ])
+    ]).create();
+
+    schedulePub(args: ["build"],
+        output: new RegExp(r'Built \d+ files? to "build".'));
+
+    d.dir(appPath, [
+      d.dir('build', [
+        d.dir('web', [
+          d.file('.htaccess', 'fblthp'),
+          d.nothing('.hidden')
+        ])
+      ])
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
index 8519a74..eb43c7e 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/handles_failure_test.dart
@@ -23,7 +23,7 @@
     // Set up a cache with some packages.
     d.dir(cachePath, [
       d.dir('hosted', [
-        d.async(port.then((p) => d.dir('127.0.0.1%58$p', [
+        d.async(port.then((p) => d.dir('localhost%58$p', [
           d.dir("foo-1.2.3", [
             d.libPubspec("foo", "1.2.3"),
             d.file("broken.txt")
diff --git a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
index 5df38af..eee64d5 100644
--- a/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
+++ b/sdk/lib/_internal/pub/test/cache/repair/reinstalls_hosted_packages_test.dart
@@ -21,7 +21,7 @@
     // Set up a cache with some broken packages.
     d.dir(cachePath, [
       d.dir('hosted', [
-        d.async(port.then((p) => d.dir('127.0.0.1%58$p', [
+        d.async(port.then((p) => d.dir('localhost%58$p', [
           d.dir("foo-1.2.3", [
             d.libPubspec("foo", "1.2.3"),
             d.file("broken.txt")
diff --git a/sdk/lib/_internal/pub/test/descriptor.dart b/sdk/lib/_internal/pub/test/descriptor.dart
index 25991ba..aec82a3 100644
--- a/sdk/lib/_internal/pub/test/descriptor.dart
+++ b/sdk/lib/_internal/pub/test/descriptor.dart
@@ -145,7 +145,7 @@
 Descriptor hostedCache(Iterable<Descriptor> contents) {
   return dir(cachePath, [
     dir('hosted', [
-      async(port.then((p) => dir('127.0.0.1%58$p', contents)))
+      async(port.then((p) => dir('localhost%58$p', contents)))
     ])
   ]);
 }
diff --git a/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
new file mode 100644
index 0000000..add71d2
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/dry_run_does_not_apply_changes_test.dart
@@ -0,0 +1,33 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("--dry-run shows but does not apply changes", () {
+    servePackages([
+      packageMap("foo", "1.0.0")
+    ]);
+
+    d.appDir({
+      "foo": "1.0.0"
+    }).create();
+
+    pubGet(args: ["--dry-run"], output: allOf([
+      contains("+ foo 1.0.0"),
+      contains("Would change 1 dependency.")
+    ]));
+
+    d.dir(appPath, [
+      // The lockfile should not be created.
+      d.nothing("pubspec.lock"),
+      // The "packages" directory should not have been generated.
+      d.nothing("packages")
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart b/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
index 0a1f645..880a251 100644
--- a/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/get/git/dependency_name_match_pubspec_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -24,7 +27,7 @@
       })
     ]).create();
 
-    pubGet(error: new RegExp(r'"name" field "foo" doesn' "'" r't match '
-        r'expected name "weirdname"\.'));
+    pubGet(error: contains('"name" field doesn\'t match expected name '
+        '"weirdname".'), exitCode: exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart b/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
index 5195b55..530cc82 100644
--- a/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
+++ b/sdk/lib/_internal/pub/test/get/git/require_pubspec_name_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -20,7 +23,7 @@
 
     d.appDir({"foo": {"git": "../foo.git"}}).create();
 
-    pubGet(error: new RegExp(r'Missing the required "name" field \(e\.g\. '
-        r'"name: foo"\)\.'));
+    pubGet(error: contains('Missing the required "name" field.'),
+        exitCode: exit_codes.DATA);
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
index 8dd1d0e..2779da1 100644
--- a/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
+++ b/sdk/lib/_internal/pub/test/get/hosted/get_test.dart
@@ -26,6 +26,6 @@
     d.appDir({"bad name!": "1.2.3"}).create();
 
     pubGet(error: new RegExp(
-        r"Could not find package bad name! at http://127\.0\.0\.1:\d+\."));
+        r"Could not find package bad name! at http://localhost:\d+\."));
   });
 }
diff --git a/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
new file mode 100644
index 0000000..2b662e6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/get/hosted/unlock_if_version_doesnt_exist_test.dart
@@ -0,0 +1,30 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/io.dart';
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('upgrades a locked pub server package with a nonexistent version',
+      () {
+    servePackages([packageMap("foo", "1.0.0")]);
+
+    d.appDir({"foo": "any"}).create();
+    pubGet();
+    d.packagesDir({"foo": "1.0.0"}).validate();
+
+    schedule(() => deleteEntry(p.join(sandboxDir, cachePath)));
+
+    servePackages([packageMap("foo", "1.0.1")], replace: true);
+    pubGet();
+    d.packagesDir({"foo": "1.0.1"}).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
index 944e6ed..527f597 100644
--- a/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/fail_gracefully_on_missing_package_test.dart
@@ -17,7 +17,7 @@
       d.appDir({"foo": "1.2.3"}).create();
 
       pubCommand(command, error: new RegExp(r"""
-Could not find package foo at http://127\.0\.0\.1:\d+\.
+Could not find package foo at http://localhost:\d+\.
 Depended on by:
 - myapp""", multiLine: true));
     });
diff --git a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
index b9ca6bd..f602618 100644
--- a/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
+++ b/sdk/lib/_internal/pub/test/hosted/version_negotiation_test.dart
@@ -55,14 +55,10 @@
       server.handle('GET', '/api/packages/foo',
           (request) => new shelf.Response(406));
 
-      // TODO(nweiz): this shouldn't request the versions twice (issue 11077).
-      server.handle('GET', '/api/packages/foo',
-          (request) => new shelf.Response(406));
-
       pub.shouldExit(1);
 
       pub.stderr.expect(emitsLines(
-          "Pub 0.1.2+3 is incompatible with the current version of 127.0.0.1.\n"
+          "Pub 0.1.2+3 is incompatible with the current version of localhost.\n"
           "Upgrade pub to the latest version and try again."));
     });
   });
diff --git a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
index b8bcffb..c920e19 100644
--- a/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
+++ b/sdk/lib/_internal/pub/test/list_package_dirs/lists_dependency_directories_test.dart
@@ -36,7 +36,7 @@
           "packages": {
             "foo": path.join(sandboxDir, "foo", "lib"),
             "bar": port.then((p) => path.join(sandboxDir, cachePath, "hosted",
-                "127.0.0.1%58$p", "bar-1.0.0", "lib")),
+                "localhost%58$p", "bar-1.0.0", "lib")),
             "myapp": canonicalize(path.join(sandboxDir, appPath, "lib"))
           },
           "input_files": [
diff --git a/sdk/lib/_internal/pub/test/lock_file_test.dart b/sdk/lib/_internal/pub/test/lock_file_test.dart
index 04430ab..85724e4 100644
--- a/sdk/lib/_internal/pub/test/lock_file_test.dart
+++ b/sdk/lib/_internal/pub/test/lock_file_test.dart
@@ -23,9 +23,12 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe mock packages.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
       "Cannot get a mock package.");
 
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
+      "Cannot get an mock.");
+
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
       "Cannot get the directory for mock packages.");
 
diff --git a/sdk/lib/_internal/pub/test/package_files_test.dart b/sdk/lib/_internal/pub/test/package_list_files_test.dart
similarity index 85%
rename from sdk/lib/_internal/pub/test/package_files_test.dart
rename to sdk/lib/_internal/pub/test/package_list_files_test.dart
index 9598c76..9b5a06c 100644
--- a/sdk/lib/_internal/pub/test/package_files_test.dart
+++ b/sdk/lib/_internal/pub/test/package_list_files_test.dart
@@ -2,7 +2,7 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-library packages_files_test;
+library packages_list_files_test;
 
 import 'package:path/path.dart' as path;
 import 'package:scheduled_test/scheduled_test.dart';
@@ -37,13 +37,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, 'file1.txt'),
           path.join(root, 'file2.txt'),
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -68,13 +68,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, 'file1.txt'),
           path.join(root, 'file2.txt'),
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -90,12 +90,12 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(), completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(), unorderedEquals([
           path.join(root, 'pubspec.yaml'),
           path.join(root, '.gitignore'),
           path.join(root, 'file2.text'),
           path.join(root, 'subdir', 'subfile2.text')
-        ])));
+        ]));
       });
     });
 
@@ -122,8 +122,8 @@
     schedule(() => deleteEntry(path.join(sandboxDir, appPath, 'target')));
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -134,8 +134,8 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -148,8 +148,8 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(),
-          completion(equals([path.join(root, 'pubspec.yaml')])));
+      expect(entrypoint.root.listFiles(),
+          equals([path.join(root, 'pubspec.yaml')]));
     });
   });
 
@@ -161,10 +161,10 @@
     ]).create();
 
     schedule(() {
-      expect(entrypoint.packageFiles(), completion(unorderedEquals([
+      expect(entrypoint.root.listFiles(), unorderedEquals([
         path.join(root, 'pubspec.yaml'),
         path.join(root, 'pubspec.lock', 'file.txt')
-      ])));
+      ]));
     });
   });
 
@@ -184,13 +184,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(beneath: path.join(root, 'subdir')),
-            completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(beneath: path.join(root, 'subdir')),
+            unorderedEquals([
           path.join(root, 'subdir', 'subfile1.txt'),
           path.join(root, 'subdir', 'subfile2.txt'),
           path.join(root, 'subdir', 'subsubdir', 'subsubfile1.txt'),
           path.join(root, 'subdir', 'subsubdir', 'subsubfile2.txt')
-        ])));
+        ]));
       });
     });
 
@@ -209,13 +209,13 @@
       ]).create();
 
       schedule(() {
-        expect(entrypoint.packageFiles(beneath: path.join(root, 'packages')),
-            completion(unorderedEquals([
+        expect(entrypoint.root.listFiles(beneath: path.join(root, 'packages')),
+            unorderedEquals([
           path.join(root, 'packages', 'subfile1.txt'),
           path.join(root, 'packages', 'subfile2.txt'),
           path.join(root, 'packages', 'subsubdir', 'subsubfile1.txt'),
           path.join(root, 'packages', 'subsubdir', 'subsubfile2.txt')
-        ])));
+        ]));
       });
     });
   });
diff --git a/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart b/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
index 337c957..c5d78a3 100644
--- a/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_get_and_upgrade_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
+import '../lib/src/exit_codes.dart' as exit_codes;
 import 'descriptor.dart' as d;
 import 'test_pub.dart';
 
@@ -27,8 +28,9 @@
           d.pubspec({"dependencies": {"foo": null}})
         ]).create();
 
-        pubCommand(command, error: new RegExp(r'Missing the required "name" '
-            r'field\.'));
+        pubCommand(command,
+            error: contains('Missing the required "name" field.'),
+            exitCode: exit_codes.DATA);
       });
     });
 
@@ -120,8 +122,9 @@
         })
       ]).create();
 
-      pubCommand(command, error: new RegExp(r'"dependencies.myapp": Package '
-          r'may not list itself as a dependency\.'));
+      pubCommand(command,
+          error: contains('A package may not list itself as a dependency.'),
+          exitCode: exit_codes.DATA);
     });
 
     integration('does not allow a dev dependency on itself', () {
@@ -134,8 +137,9 @@
         })
       ]).create();
 
-      pubCommand(command, error: new RegExp(r'"dev_dependencies.myapp": '
-          r'Package may not list itself as a dependency\.'));
+      pubCommand(command,
+          error: contains('A package may not list itself as a dependency.'),
+          exitCode: exit_codes.DATA);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/pub_test.dart b/sdk/lib/_internal/pub/test/pub_test.dart
index 168008c..585b3f4 100644
--- a/sdk/lib/_internal/pub/test/pub_test.dart
+++ b/sdk/lib/_internal/pub/test/pub_test.dart
@@ -34,6 +34,7 @@
       get        Get the current package's dependencies.
       help       Display help information for Pub.
       publish    Publish the current package to pub.dartlang.org.
+      run        Run an executable from a package.
       serve      Run a local web development server.
       upgrade    Upgrade the current package's dependencies to latest versions.
       uploader   Manage uploaders for a package on pub.dartlang.org.
@@ -69,6 +70,7 @@
           Usage: pub get
           -h, --help            Print usage information for this command.
               --[no-]offline    Use cached packages instead of accessing the network.
+          -n, --dry-run         Report what dependencies would change but don't change any.
     ''');
   });
 
@@ -80,6 +82,7 @@
           Usage: pub get
           -h, --help            Print usage information for this command.
               --[no-]offline    Use cached packages instead of accessing the network.
+          -n, --dry-run         Report what dependencies would change but don't change any.
     ''');
   });
 
@@ -115,6 +118,7 @@
           get        Get the current package's dependencies.
           help       Display help information for Pub.
           publish    Publish the current package to pub.dartlang.org.
+          run        Run an executable from a package.
           serve      Run a local web development server.
           upgrade    Upgrade the current package's dependencies to latest versions.
           uploader   Manage uploaders for a package on pub.dartlang.org.
@@ -197,6 +201,7 @@
             Usage: pub get
             -h, --help            Print usage information for this command.
                 --[no-]offline    Use cached packages instead of accessing the network.
+            -n, --dry-run         Report what dependencies would change but don't change any.
             ''');
     });
 
@@ -263,6 +268,7 @@
               get        Get the current package's dependencies.
               help       Display help information for Pub.
               publish    Publish the current package to pub.dartlang.org.
+              run        Run an executable from a package.
               serve      Run a local web development server.
               upgrade    Upgrade the current package's dependencies to latest versions.
               uploader   Manage uploaders for a package on pub.dartlang.org.
diff --git a/sdk/lib/_internal/pub/test/pubspec_test.dart b/sdk/lib/_internal/pub/test/pubspec_test.dart
index bbdca4f..bf65072 100644
--- a/sdk/lib/_internal/pub/test/pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/pubspec_test.dart
@@ -21,7 +21,10 @@
   Future<Pubspec> doDescribe(PackageId id) => throw new UnsupportedError(
       "Cannot describe mock packages.");
 
-  Future<bool> get(PackageId id, String path) => throw new UnsupportedError(
+  Future ensureLocal(PackageId id) => throw new UnsupportedError(
+      "Cannot get a mock package.");
+
+  Future get(PackageId id, String symlink) => throw new UnsupportedError(
       "Cannot get a mock package.");
 
   Future<String> getDirectory(PackageId id) => throw new UnsupportedError(
@@ -248,13 +251,13 @@
     test("throws if a transformer isn't a string or map", () {
       expectPubspecException('transformers: [12]',
           (pubspec) => pubspec.transformers,
-          '"transformers" field must be a string or map');
+          'A transformer must be a string or map.');
     });
 
     test("throws if a transformer's configuration isn't a map", () {
       expectPubspecException('transformers: [{pkg: 12}]',
           (pubspec) => pubspec.transformers,
-          '"transformers.pkg" field must be a map');
+          "A transformer's configuration must be a map.");
     });
 
     test("throws if a transformer's configuration contains an unknown "
@@ -263,8 +266,7 @@
 name: pkg
 transformers: [{pkg: {\$key: "value"}}]''',
           (pubspec) => pubspec.transformers,
-          'Invalid transformer configuration for "transformers.pkg": '
-          'Unknown reserved field "\$key"');
+          'Invalid transformer config: Unknown reserved field.');
     });
 
     test("doesn't throw if a transformer's configuration contains a "
@@ -285,8 +287,8 @@
 transformers:
 - pkg: {\$include: 123}''',
           (pubspec) => pubspec.transformers,
-          'Invalid transformer configuration for "transformers.pkg": '
-          '"\$include" field must be a string or list, but was "123"');
+          'Invalid transformer config: "\$include" field must be a string or '
+            'list.');
     });
 
     test("throws if the \$include list contains a non-string", () {
@@ -295,9 +297,8 @@
 transformers:
 - pkg: {\$include: ["ok", 123, "alright", null]}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$include" list field may only contain strings, but contained '
-        '"123" and "null"');
+        'Invalid transformer config: "\$include" field may contain only '
+          'strings.');
     });
 
     test("throws if the \$exclude value is not a string or list", () {
@@ -306,8 +307,8 @@
 transformers:
 - pkg: {\$exclude: 123}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$exclude" field must be a string or list, but was "123"');
+        'Invalid transformer config: "\$exclude" field must be a string or '
+          'list.');
     });
 
     test("throws if the \$exclude list contains a non-string", () {
@@ -316,9 +317,8 @@
 transformers:
 - pkg: {\$exclude: ["ok", 123, "alright", null]}''',
         (pubspec) => pubspec.transformers,
-        'Invalid transformer configuration for "transformers.pkg": '
-        '"\$exclude" list field may only contain strings, but contained '
-        '"123" and "null"');
+        'Invalid transformer config: "\$exclude" field may contain only '
+          'strings.');
     });
 
     test("throws if a transformer is not from a dependency", () {
@@ -327,7 +327,7 @@
 transformers: [foo]
 ''',
         (pubspec) => pubspec.transformers,
-        '"transformers.foo" refers to a package that\'s not a dependency.');
+        '"foo" is not a dependency.');
     });
 
     test("allows a transformer from a normal dependency", () {
@@ -339,7 +339,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows a transformer from a dev dependency", () {
@@ -351,7 +351,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows a transformer from a dependency override", () {
@@ -363,7 +363,7 @@
 transformers:
 - foo''', sources);
 
-      expect(pubspec.transformers[0].single.package, equals("foo"));
+      expect(pubspec.transformers[0].single.id.package, equals("foo"));
     });
 
     test("allows comment-only files", () {
diff --git a/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
new file mode 100644
index 0000000..3dbb7031
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/app_can_read_from_stdin_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  var line1 = stdin.readLineSync();
+  print("between");
+  var line2 = stdin.readLineSync();
+  print(line1);
+  print(line2);
+}
+""";
+
+main() {
+  initConfig();
+  integration('the spawned application can read from stdin', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+
+    pub.writeLine("first");
+    pub.stdout.expect("between");
+    pub.writeLine("second");
+    pub.stdout.expect("first");
+    pub.stdout.expect("second");
+    pub.shouldExit(0);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
new file mode 100644
index 0000000..d47b950
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/displays_transformer_logs_test.dart
@@ -0,0 +1,94 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import "package:myapp/lib.dart";
+main() {
+  callLib();
+}
+""";
+
+const LIB = """
+callLib() {
+  print("lib");
+}
+""";
+
+// Make it lazy so that "lib.dart" isn't transformed until after the process
+// is started. Otherwise, since this tranformer modifies .dart files, it will
+// be run while the transformers themselves are loading during pub run's
+// startup.
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class LoggingTransformer extends Transformer implements LazyTransformer {
+  LoggingTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    transform.logger.info('\${transform.primaryInput.id}.');
+    transform.logger.warning('\${transform.primaryInput.id}.');
+  }
+
+  void declareOutputs(DeclaringTransform transform) {
+    // TODO(rnystrom): Remove this when #19408 is fixed.
+    transform.declareOutput(transform.primaryId);
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('displays transformer log messages', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [
+          d.file("lib.dart", LIB),
+          d.dir("src", [
+            d.file("transformer.dart", TRANSFORMER)
+          ])
+        ]),
+        d.dir("bin", [
+          d.file("script.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      // Note that the info log is only displayed here because the test
+      // harness runs pub in verbose mode. By default, only the warning would
+      // be shown.
+      pub.stdout.expect("[Info from Logging]:");
+      pub.stdout.expect("myapp|bin/script.dart.");
+
+      pub.stderr.expect("[Warning from Logging]:");
+      pub.stderr.expect("myapp|bin/script.dart.");
+
+      pub.stdout.expect("[Info from Logging]:");
+      pub.stdout.expect("myapp|lib/lib.dart.");
+
+      pub.stderr.expect("[Warning from Logging]:");
+      pub.stderr.expect("myapp|lib/lib.dart.");
+
+      pub.stdout.expect("lib");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
new file mode 100644
index 0000000..8634e1e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/does_not_run_on_transformer_error_test.dart
@@ -0,0 +1,64 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+main() {
+  print("should not get here!");
+}
+""";
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class FailingTransformer extends Transformer {
+  FailingTransformer.asPlugin();
+
+  String get allowedExtensions => '.dart';
+
+  void apply(Transform transform) {
+    // Don't run on the transformer itself.
+    if (transform.primaryInput.id.path.startsWith("lib")) return;
+    transform.logger.error('\${transform.primaryInput.id}.');
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('does not run if a transformer has an error', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [
+          d.dir("src", [
+            d.file("transformer.dart", TRANSFORMER)
+          ])
+        ]),
+        d.dir("bin", [
+          d.file("script.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stderr.expect("[Error from Failing]:");
+      pub.stderr.expect("myapp|bin/script.dart.");
+
+      // Note: no output from the script.
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_test.dart
new file mode 100644
index 0000000..e92f4c3c
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_no_executable_is_given_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.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the executable does not exist.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    schedulePub(args: ["run"],
+        error: """
+Must specify an executable to run.
+
+Usage: pub run <executable> [args...]
+-h, --help    Print usage information for this command.
+""",
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
new file mode 100644
index 0000000..ca9493f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_only_transitive_dependency_test.dart
@@ -0,0 +1,39 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script is in a non-immediate dependency.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "bar": {"path": "../bar"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect('Package "foo" is not an immediate dependency.');
+    pub.stderr.expect('Cannot run executables in transitive dependencies.');
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
new file mode 100644
index 0000000..81f3a51
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/errors_if_path_in_dependency_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the executable is in a subdirectory in a '
+      'dependency.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    schedulePub(args: ["run", "foo:sub/dir"],
+        error: """
+Can not run an executable in a subdirectory of a dependency.
+
+Usage: pub run <executable> [args...]
+-h, --help    Print usage information for this command.
+""",
+        exitCode: exit_codes.USAGE);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
new file mode 100644
index 0000000..f938d30
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/includes_parent_directories_of_entrypoint_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = r"""
+import '../../a.dart';
+import '../b.dart';
+main() {
+  print("$a $b");
+}
+""";
+
+main() {
+  initConfig();
+  integration('allows assets in parent directories of the entrypoint to be'
+      'accessed', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("tool", [
+        d.file("a.dart", "var a = 'a';"),
+        d.dir("a", [
+          d.file("b.dart", "var b = 'b';"),
+          d.dir("b", [
+            d.file("app.dart", SCRIPT)
+          ])
+        ])
+      ])
+    ]).create();
+
+    var pub = pubRun(args: [path.join("tool", "a", "b", "app")]);
+    pub.stdout.expect("a b");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_test.dart
new file mode 100644
index 0000000..10eb68b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_dependency_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.
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script is in an unknown package.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect('Could not find package "foo". Did you forget to add a '
+        'dependency?');
+    pub.shouldExit(exit_codes.DATA);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
new file mode 100644
index 0000000..8379a86
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_in_dependency_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script in a dependency does not exist.', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0")
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:script"]);
+    pub.stderr.expect(
+        "Could not find ${p.join("bin", "script.dart")} in package foo.");
+    pub.shouldExit(exit_codes.NO_INPUT);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
new file mode 100644
index 0000000..03e9d9d
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/nonexistent_script_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as p;
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('Errors if the script does not exist.', () {
+    d.dir(appPath, [
+      d.appPubspec()
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stderr.expect("Could not find ${p.join("bin", "script.dart")}.");
+    pub.shouldExit(exit_codes.NO_INPUT);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
new file mode 100644
index 0000000..888319e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/passes_along_arguments_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+main(List<String> args) {
+  print(args.join(" "));
+}
+""";
+
+main() {
+  initConfig();
+  integration('passes arguments to the spawned script', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("args.dart", SCRIPT)
+      ])
+    ]).create();
+
+    // Use some args that would trip up pub's arg parser to ensure that it
+    // isn't trying to look at them.
+    var pub = pubRun(args: ["args", "--verbose", "-m", "--", "help"]);
+
+    pub.stdout.expect("--verbose -m -- help");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
new file mode 100644
index 0000000..daedf25
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_a_generated_script_test.dart
@@ -0,0 +1,51 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+
+class DartTransformer extends Transformer {
+  DartTransformer.asPlugin();
+
+  String get allowedExtensions => '.in';
+
+  void apply(Transform transform) {
+    transform.addOutput(new Asset.fromString(
+        new AssetId("myapp", "bin/script.dart"),
+        "void main() => print('generated');"));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs a script generated from scratch by a transformer', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", TRANSFORMER),
+          d.file("primary.in", "")
+        ])])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["script"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stdout.expect("generated");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
new file mode 100644
index 0000000..9eea7b6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_directory_in_entrypoint_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a Dart application in the entrypoint package', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("tool", [
+        d.file("app.dart", "main() => print('tool');"),
+        d.dir("sub", [
+          d.file("app.dart", "main() => print('sub');")
+        ])
+      ])
+    ]).create();
+
+    var pub = pubRun(args: [path.join("tool", "app")]);
+    pub.stdout.expect("tool");
+    pub.shouldExit();
+
+    pub = pubRun(args: [path.join("tool", "sub", "app")]);
+    pub.stdout.expect("sub");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
new file mode 100644
index 0000000..f9a0209
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_app_in_entrypoint_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+import 'dart:io';
+
+main() {
+  stdout.writeln("stdout output");
+  stderr.writeln("stderr output");
+  exitCode = 123;
+}
+""";
+
+main() {
+  initConfig();
+  integration('runs a Dart application in the entrypoint package', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    var pub = pubRun(args: ["script"]);
+    pub.stdout.expect("stdout output");
+    pub.stderr.expect("stderr output");
+    pub.shouldExit(123);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
new file mode 100644
index 0000000..d8b3425
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dependency_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a named Dart application in a dependency', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.appPubspec({
+        "foo": {"path": "../foo"}
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:bar"]);
+    pub.stdout.expect("foobar");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
new file mode 100644
index 0000000..65c75b9
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_named_app_in_dev_dependency_test.dart
@@ -0,0 +1,34 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration('runs a named Dart application in a dev dependency', () {
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("bin", [
+        d.file("bar.dart", "main() => print('foobar');")
+      ])
+    ]).create();
+
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dev_dependencies": {
+          "foo": {"path": "../foo"}
+        }
+      })
+    ]).create();
+
+    pubGet();
+
+    var pub = pubRun(args: ["foo:bar"]);
+    pub.stdout.expect("foobar");
+    pub.shouldExit();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_test.dart b/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_test.dart
new file mode 100644
index 0000000..fd6b27a
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_the_script_in_checked_mode_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 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+const SCRIPT = """
+main() {
+  int a = true;
+}
+""";
+
+main() {
+  initConfig();
+  integration('runs the script in checked mode by default', () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("bin", [
+        d.file("script.dart", SCRIPT)
+      ])
+    ]).create();
+
+    schedulePub(args: ["run", "script"],
+        error: contains("'bool' is not a subtype of type 'int' of 'a'"),
+        exitCode: 255);
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
new file mode 100644
index 0000000..d777d61
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/runs_transformer_in_entrypoint_test.dart
@@ -0,0 +1,43 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+import 'utils.dart';
+
+const SCRIPT = """
+const TOKEN = "hi";
+main() {
+  print(TOKEN);
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration('runs transformers in the entrypoint package', () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/src/transformer"]
+        }),
+        d.dir("lib", [d.dir("src", [
+          d.file("transformer.dart", dartTransformer("transformed"))
+        ])]),
+        d.dir("bin", [
+          d.file("hi.dart", SCRIPT)
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var pub = pubRun(args: ["hi"],
+          transformers: ["myapp/src/transformer"]);
+
+      pub.stdout.expect("(hi, transformed)");
+      pub.shouldExit();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/run/utils.dart b/sdk/lib/_internal/pub/test/run/utils.dart
new file mode 100644
index 0000000..6535b33
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/run/utils.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:scheduled_test/scheduled_process.dart';
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../test_pub.dart';
+
+/// Schedules starting the "pub run" process and validates the expected startup
+/// output.
+///
+/// if [transformers] is given, it should contain a list of transformer IDs
+/// (like "myapp/src/transformer") and this will validate that the output for
+/// loading those is shown.
+///
+/// Returns the `pub run` process.
+ScheduledProcess pubRun({Iterable<String> args,
+  Iterable<String> transformers}) {
+  var pub = startPub(args: ["run"]..addAll(args));
+
+  // This isn't normally printed, but the pub test infrastructure runs pub in
+  // verbose mode, which enables this.
+  pub.stdout.expect(startsWith("Loading source assets"));
+
+  if (transformers != null) {
+    for (var transformer in transformers) {
+      pub.stdout.expect(startsWith("Loading $transformer transformers"));
+    }
+  }
+  return pub;
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
new file mode 100644
index 0000000..d92eb26
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_in_a_path_dependency_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve .gitignored assets in a path dependency", () {
+    ensureGit();
+
+    d.dir(appPath, [
+      d.appPubspec({"foo": {"path": "../foo"}}),
+    ]).create();
+
+    d.git("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [
+        d.file("outer.txt", "outer contents"),
+        d.file("visible.txt", "visible"),
+        d.dir("dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ]),
+      d.file(".gitignore", "/lib/outer.txt\n/lib/dir")
+    ]).create();
+
+    pubServe(shouldGetFirst: true);
+    requestShould404("packages/foo/outer.txt");
+    requestShould404("packages/foo/dir/inner.txt");
+    requestShouldSucceed("packages/foo/visible.txt", "visible");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
new file mode 100644
index 0000000..598ecf7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_gitignored_assets_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve .gitignored assets", () {
+    ensureGit();
+
+    d.git(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file("outer.txt", "outer contents"),
+        d.dir("dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ]),
+      d.file(".gitignore", "/web/outer.txt\n/web/dir")
+    ]).create();
+
+    pubServe();
+    requestShould404("outer.txt");
+    requestShould404("dir/inner.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart b/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart
new file mode 100644
index 0000000..0429e7e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/does_not_serve_hidden_assets_test.dart
@@ -0,0 +1,29 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("doesn't serve hidden assets", () {
+    d.dir(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file(".outer.txt", "outer contents"),
+        d.dir(".dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ])
+    ]).create();
+
+    pubServe();
+    requestShould404(".outer.txt");
+    requestShould404(".dir/inner.txt");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart b/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
new file mode 100644
index 0000000..5ef198f
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/serve/serves_hidden_assets_that_arent_gitignored_test.dart
@@ -0,0 +1,31 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+main() {
+  initConfig();
+  integration("serves hidden assets that aren't .gitignored", () {
+    ensureGit();
+
+    d.git(appPath, [
+      d.appPubspec(),
+      d.dir("web", [
+        d.file(".outer.txt", "outer contents"),
+        d.dir(".dir", [
+          d.file("inner.txt", "inner contents"),
+        ])
+      ])
+    ]).create();
+
+    pubServe();
+    requestShouldSucceed(".outer.txt", "outer contents");
+    requestShouldSucceed(".dir/inner.txt", "inner contents");
+    endPubServe();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/serve/utils.dart b/sdk/lib/_internal/pub/test/serve/utils.dart
index 725c3b4..0e5d021 100644
--- a/sdk/lib/_internal/pub/test/serve/utils.dart
+++ b/sdk/lib/_internal/pub/test/serve/utils.dart
@@ -98,6 +98,9 @@
 /// If [import] is passed, it should be the name of a package that defines its
 /// own TOKEN constant. The primary library of that package will be imported
 /// here and its TOKEN value will be added to this library's.
+///
+/// This transformer takes one configuration field: "addition". This is
+/// concatenated to its TOKEN value before adding it to the output library.
 String dartTransformer(String id, {String import}) {
   if (import != null) {
     id = '$id imports \${$import.TOKEN}';
@@ -112,12 +115,16 @@
 import 'package:barback/barback.dart';
 $import
 
+import 'dart:io';
+
 const TOKEN = "$id";
 
 final _tokenRegExp = new RegExp(r'^const TOKEN = "(.*?)";\$', multiLine: true);
 
 class DartTransformer extends Transformer {
-  DartTransformer.asPlugin();
+  final BarbackSettings _settings;
+
+  DartTransformer.asPlugin(this._settings);
 
   String get allowedExtensions => '.dart';
 
@@ -125,7 +132,10 @@
     return transform.primaryInput.readAsString().then((contents) {
       transform.addOutput(new Asset.fromString(transform.primaryInput.id,
           contents.replaceAllMapped(_tokenRegExp, (match) {
-        return 'const TOKEN = "(\${match[1]}, \$TOKEN)";';
+        var token = TOKEN;
+        var addition = _settings.configuration["addition"];
+        if (addition != null) token += addition;
+        return 'const TOKEN = "(\${match[1]}, \$token)";';
       })));
     });
   }
@@ -144,7 +154,6 @@
   var pubArgs = [
     "serve",
     "--port=0", // Use port 0 to get an ephemeral port.
-    "--hostname=127.0.0.1", // Force IPv4 on bots.
     "--force-poll",
     "--log-admin-url"
   ];
@@ -185,7 +194,10 @@
   });
 
   if (shouldGetFirst) {
-    _pubServer.stdout.expect(consumeThrough("Got dependencies!"));
+    _pubServer.stdout.expect(consumeThrough(anyOf([
+      "Got dependencies!",
+      matches(new RegExp(r"^Changed \d+ dependenc"))
+    ])));
   }
 
   _pubServer.stdout.expect(startsWith("Loading source assets..."));
@@ -206,9 +218,9 @@
 
 /// The regular expression for parsing pub's output line describing the URL for
 /// the server.
-final _parsePortRegExp = new RegExp(r"([^ ]+) +on http://127\.0\.0\.1:(\d+)");
+final _parsePortRegExp = new RegExp(r"([^ ]+) +on http://localhost:(\d+)");
 
-/// Parses the port number from the "Running admin server on 127.0.0.1:1234"
+/// Parses the port number from the "Running admin server on localhost:1234"
 /// line printed by pub serve.
 bool _parseAdminPort(String line) {
   var match = _parsePortRegExp.firstMatch(line);
@@ -217,7 +229,7 @@
   return true;
 }
 
-/// Parses the port number from the "Serving blah on 127.0.0.1:1234" line
+/// Parses the port number from the "Serving blah on localhost:1234" line
 /// printed by pub serve.
 bool _parsePort(String line) {
   var match = _parsePortRegExp.firstMatch(line);
@@ -322,7 +334,7 @@
   expect(_pubServer, isNotNull);
   expect(_adminPort, isNotNull);
 
-  return WebSocket.connect("ws://127.0.0.1:$_adminPort").then((socket) {
+  return WebSocket.connect("ws://localhost:$_adminPort").then((socket) {
     _webSocket = socket;
     // TODO(rnystrom): Works around #13913.
     _webSocketBroadcastStream = _webSocket.map(JSON.decode).asBroadcastStream();
@@ -480,7 +492,7 @@
 String _getServerUrlSync([String root, String path]) {
   if (root == null) root = 'web';
   expect(_ports, contains(root));
-  var url = "http://127.0.0.1:${_ports[root]}";
+  var url = "http://localhost:${_ports[root]}";
   if (path != null) url = "$url/$path";
   return url;
 }
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
index d8f60e4..984a658 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_and_immediately_unserve_test.dart
@@ -42,8 +42,7 @@
         // of the new server and "unserveDirectory" returns the URL of the
         // server that was turned off. We're asserting that the same server was
         // both started and stopped.
-        expect(results[0]["result"]["url"],
-            matches(r"http://127\.0\.0\.1:\d+"));
+        expect(results[0]["result"]["url"], matches(r"http://localhost:\d+"));
         expect(results[0]["result"], equals(results[1]["result"]));
       });
     });
diff --git a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
index a3de26a..148f74d 100644
--- a/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
+++ b/sdk/lib/_internal/pub/test/serve/web_socket/serve_directory_test.dart
@@ -27,7 +27,7 @@
 
     // Bind the new directory.
     expectWebSocketResult("serveDirectory", {"path": "test"}, {
-      "url": matches(r"http://127\.0\.0\.1:\d+")
+      "url": matches(r"http://localhost:\d+")
     }).then((response) {
       var url = Uri.parse(response["url"]);
       registerServerPort("test", url.port);
diff --git a/sdk/lib/_internal/pub/test/test_pub.dart b/sdk/lib/_internal/pub/test/test_pub.dart
index bdeebe0..1f7d94c 100644
--- a/sdk/lib/_internal/pub/test/test_pub.dart
+++ b/sdk/lib/_internal/pub/test/test_pub.dart
@@ -2,10 +2,11 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-/// Test infrastructure for testing pub. Unlike typical unit tests, most pub
-/// tests are integration tests that stage some stuff on the file system, run
-/// pub, and then validate the results. This library provides an API to build
-/// tests like that.
+/// Test infrastructure for testing pub.
+///
+/// Unlike typical unit tests, most pub tests are integration tests that stage
+/// some stuff on the file system, run pub, and then validate the results. This
+/// library provides an API to build tests like that.
 library test_pub;
 
 import 'dart:async';
@@ -149,10 +150,10 @@
   }, "get previous network requests");
 }
 
-/// Creates an HTTP server to serve [contents] as static files. This server will
-/// exist only for the duration of the pub run.
+/// Creates an HTTP server to serve [contents] as static files.
 ///
-/// Subsequent calls to [serve] will replace the previous server.
+/// This server will exist only for the duration of the pub run. Subsequent
+/// calls to [serve] replace the previous server.
 void serve([List<d.Descriptor> contents]) {
   var baseDir = d.dir("serve-dir", contents);
 
@@ -170,7 +171,7 @@
             .catchError((error) {
           return new shelf.Response.notFound('File "$path" not found.');
         });
-      }, '127.0.0.1', 0).then((server) {
+      }, 'localhost', 0).then((server) {
         _server = server;
         _portCompleter.complete(_server.port);
         currentSchedule.onComplete.schedule(_closeServer);
@@ -179,8 +180,9 @@
   }, 'starting a server serving:\n${baseDir.describe()}');
 }
 
-/// Closes [_server]. Returns a [Future] that will complete after the [_server]
-/// is closed.
+/// Closes [_server].
+///
+/// Returns a [Future] that completes after the [_server] is closed.
 Future _closeServer() {
   if (_server == null) return new Future.value();
   var future = _server.close();
@@ -209,18 +211,21 @@
 /// this test.
 d.DirectoryDescriptor _servedPackageDir;
 
-/// A map from package names to parsed pubspec maps for those packages. This
-/// represents the packages currently being served by [servePackages], and is
-/// `null` if [servePackages] has not yet been called for this test.
+/// A map from package names to parsed pubspec maps for those packages.
+///
+/// This represents the packages currently being served by [servePackages], and
+/// is `null` if [servePackages] has not yet been called for this test.
 Map<String, List<Map>> _servedPackages;
 
 /// Creates an HTTP server that replicates the structure of pub.dartlang.org.
+///
 /// [pubspecs] is a list of unserialized pubspecs representing the packages to
 /// serve.
 ///
-/// Subsequent calls to [servePackages] will add to the set of packages that
-/// are being served. Previous packages will continue to be served.
-void servePackages(List<Map> pubspecs) {
+/// If [replace] is false, subsequent calls to [servePackages] will add to the
+/// set of packages that are being served. Previous packages will continue to be
+/// served. Otherwise, the previous packages will no longer be served.
+void servePackages(List<Map> pubspecs, {bool replace: false}) {
   if (_servedPackages == null || _servedPackageDir == null) {
     _servedPackages = <String, List<Map>>{};
     _servedApiPackageDir = d.dir('packages', []);
@@ -239,6 +244,8 @@
 
   schedule(() {
     return awaitObject(pubspecs).then((resolvedPubspecs) {
+      if (replace) _servedPackages.clear();
+
       for (var spec in resolvedPubspecs) {
         var name = spec['name'];
         var version = spec['version'];
@@ -284,15 +291,20 @@
 String get sandboxDir => _sandboxDir;
 String _sandboxDir;
 
-/// The path of the package cache directory used for tests. Relative to the
+/// The path to the Dart repo's packages.
+final String pkgPath = path.absolute(path.join(
+    path.dirname(Platform.executable),
+    '..', '..', '..', '..', 'pkg'));
+
+/// The path of the package cache directory used for tests, relative to the
 /// sandbox directory.
 final String cachePath = "cache";
 
-/// The path of the mock app directory used for tests. Relative to the sandbox
+/// The path of the mock app directory used for tests, relative to the sandbox
 /// directory.
 final String appPath = "myapp";
 
-/// The path of the packages directory in the mock app used for tests. Relative
+/// The path of the packages directory in the mock app used for tests, relative
 /// to the sandbox directory.
 final String packagesPath = "$appPath/packages";
 
@@ -302,7 +314,8 @@
 /// Enum identifying a pub command that can be run with a well-defined success
 /// output.
 class RunCommand {
-  static final get = new RunCommand('get', new RegExp(r'Got dependencies!$'));
+  static final get = new RunCommand('get', new RegExp(
+      r'Got dependencies!|Changed \d+ dependenc(y|ies)!'));
   static final upgrade = new RunCommand('upgrade', new RegExp(
       r'(No dependencies changed\.|Changed \d+ dependenc(y|ies)!)$'));
 
@@ -311,6 +324,8 @@
   RunCommand(this.name, this.success);
 }
 
+/// Runs the tests defined within [callback] using both pub get and pub upgrade.
+///
 /// Many tests validate behavior that is the same between pub get and
 /// upgrade have the same behavior. Instead of duplicating those tests, this
 /// takes a callback that defines get/upgrade agnostic tests and runs them
@@ -327,10 +342,13 @@
 /// understands the normal output of a successful pub command. If [warning] is
 /// given, it expects the command to complete successfully *and* print
 /// [warning] to stderr. If [error] is given, it expects the command to *only*
-/// print [error] to stderr.
+/// print [error] to stderr. [output], [error], and [warning] may be strings,
+/// [RegExp]s, or [Matcher]s.
+///
+/// If [exitCode] is given, expects the command to exit with that code.
 // TODO(rnystrom): Clean up other tests to call this when possible.
 void pubCommand(RunCommand command,
-    {Iterable<String> args, Pattern output, Pattern error, Pattern warning}) {
+    {Iterable<String> args, output, error, warning, int exitCode}) {
   if (error != null && warning != null) {
     throw new ArgumentError("Cannot pass both 'error' and 'warning'.");
   }
@@ -340,8 +358,7 @@
 
   if (output == null) output = command.success;
 
-  var exitCode = null;
-  if (error != null) exitCode = 1;
+  if (error != null && exitCode == null) exitCode = 1;
 
   // No success output on an error.
   if (error != null) output = null;
@@ -350,19 +367,20 @@
   schedulePub(args: allArgs, output: output, error: error, exitCode: exitCode);
 }
 
-void pubGet({Iterable<String> args, Pattern error,
-    Pattern warning}) {
-  pubCommand(RunCommand.get, args: args, error: error, warning: warning);
+void pubGet({Iterable<String> args, output, error, warning, int exitCode}) {
+  pubCommand(RunCommand.get, args: args, output: output, error: error,
+      warning: warning, exitCode: exitCode);
 }
 
-void pubUpgrade({Iterable<String> args, Pattern output, Pattern error,
-    Pattern warning}) {
+void pubUpgrade({Iterable<String> args, output, error, warning, int exitCode}) {
   pubCommand(RunCommand.upgrade, args: args, output: output, error: error,
-      warning: warning);
+      warning: warning, exitCode: exitCode);
 }
 
-/// Defines an integration test. The [body] should schedule a series of
-/// operations which will be run asynchronously.
+/// Defines an integration test.
+///
+/// The [body] should schedule a series of operations which will be run
+/// asynchronously.
 void integration(String description, void body()) =>
   _integration(description, body, test);
 
@@ -473,6 +491,7 @@
 }
 
 /// Handles the beginning confirmation process for uploading a packages.
+///
 /// Ensures that the right output is shown and then enters "y" to confirm the
 /// upload.
 void confirmPublish(ScheduledProcess pub) {
@@ -535,7 +554,7 @@
     // dependencies will look there.
     if (_hasServer) {
       return port.then((p) {
-        environment['PUB_HOSTED_URL'] = "http://127.0.0.1:$p";
+        environment['PUB_HOSTED_URL'] = "http://localhost:$p";
         return environment;
       });
     }
@@ -646,16 +665,12 @@
     currentSchedule.timeout = new Duration(seconds: 30);
   }
 
-  schedule(() {
-    return gitlib.isInstalled.then((installed) {
-      if (!installed) {
-        throw new Exception("Git must be installed to run this test.");
-      }
-    });
-  }, 'ensuring that Git is installed');
+  if (!gitlib.isInstalled) {
+    throw new Exception("Git must be installed to run this test.");
+  }
 }
 
-/// Create a lock file for [package] without running `pub get`.
+/// Creates a lock file for [package] without running `pub get`.
 ///
 /// [sandbox] is a list of path dependencies to be found in the sandbox
 /// directory. [pkg] is a list of packages in the Dart repo's "pkg" directory;
@@ -675,10 +690,6 @@
   }
 
   if (pkg != null) {
-    var pkgDir = path.absolute(path.join(
-        path.dirname(Platform.executable),
-        '..', '..', '..', '..', 'pkg'));
-
     _addPackage(String package) {
       if (dependencies.containsKey(package)) return;
 
@@ -691,7 +702,7 @@
         }
         packagePath = _barbackDir;
       } else {
-        packagePath = path.join(pkgDir, package);
+        packagePath = path.join(pkgPath, package);
       }
 
       dependencies[package] = packagePath;
@@ -729,7 +740,7 @@
       lockFile.serialize(null, sources)).create();
 }
 
-/// Use [client] as the mock HTTP client for this test.
+/// Uses [client] as the mock HTTP client for this test.
 ///
 /// Note that this will only affect HTTP requests made via http.dart in the
 /// parent process.
@@ -877,8 +888,10 @@
 /// A function that creates a [Validator] subclass.
 typedef Validator ValidatorCreator(Entrypoint entrypoint);
 
-/// Schedules a single [Validator] to run on the [appPath]. Returns a scheduled
-/// Future that contains the errors and warnings produced by that validator.
+/// Schedules a single [Validator] to run on the [appPath].
+///
+/// Returns a scheduled Future that contains the errors and warnings produced
+/// by that validator.
 Future<Pair<List<String>, List<String>>> schedulePackageValidation(
     ValidatorCreator fn) {
   return schedule(() {
diff --git a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
index 4b95584..528b9c8 100644
--- a/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/can_log_messages_test.dart
@@ -69,9 +69,19 @@
       pub.stderr.expect(emitsLines("""
 [Rewrite on myapp|web/foo.txt with input myapp|web/foo.foo]:
 Warning!
-[Rewrite on myapp|web/foo.txt]:
-http://fake.com/not_real.dart:2:1: ERROR!
-Build failed."""));
+[Rewrite on myapp|web/foo.txt]:"""));
+
+      // The details of the analyzer's error message change pretty frequently,
+      // so instead of validating the entire line, just look for a couple of
+      // salient bits of information.
+      pub.stderr.expect(allOf([
+        contains("2"),                              // The line number.
+        contains("1"),                              // The column number.
+        contains("http://fake.com/not_real.dart"),  // The library.
+        contains("ERROR"),                          // That it's an error.
+      ]));
+
+      pub.stderr.expect("Build failed.");
 
       pub.shouldExit(exit_codes.DATA);
     });
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
deleted file mode 100644
index df8c0ba..0000000
--- a/sdk/lib/_internal/pub/test/transformer/detects_a_transformer_cycle_test.dart
+++ /dev/null
@@ -1,48 +0,0 @@
-// 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';
-
-main() {
-  initConfig();
-  withBarbackVersions("any", () {
-    integration("detects a transformer cycle", () {
-      d.dir("foo", [
-        d.pubspec({
-          "name": "foo",
-          "version": "1.0.0",
-          "transformers": ["myapp/transformer"],
-          "dependencies": {'myapp': {'path': '../myapp'}}
-        }),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('foo')),
-        ])
-      ]).create();
-
-      d.dir(appPath, [
-        d.pubspec({
-          "name": "myapp",
-          "transformers": ["foo/transformer"],
-          "dependencies": {'foo': {'path': '../foo'}}
-        }),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('myapp')),
-        ])
-      ]).create();
-
-      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
-
-      var process = startPubServe();
-      process.shouldExit(1);
-      process.stderr.expect(emitsLines(
-          "Transformer cycle detected:\n"
-          "  foo is transformed by myapp/transformer\n"
-          "  myapp is transformed by foo/transformer"));
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart b/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
deleted file mode 100644
index fe973e8..0000000
--- a/sdk/lib/_internal/pub/test/transformer/detects_an_ordering_dependency_cycle_test.dart
+++ /dev/null
@@ -1,66 +0,0 @@
-// 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';
-
-main() {
-  initConfig();
-  withBarbackVersions("any", () {
-    integration("detects an ordering dependency cycle", () {
-      d.dir("foo", [
-        d.pubspec({
-          "name": "foo",
-          "version": "1.0.0",
-          "transformers": ["myapp/transformer"],
-          "dependencies": {'myapp': {'path': '../myapp'}}
-        })
-      ]).create();
-
-      d.dir("bar", [
-        d.pubspec({
-          "name": "bar",
-          "version": "1.0.0",
-          "dependencies": {'foo': {'path': '../foo'}}
-        }),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('bar')),
-        ])
-      ]).create();
-
-      d.dir("baz", [
-        d.pubspec({
-          "name": "baz",
-          "version": "1.0.0",
-          "transformers": ["bar/transformer"],
-          "dependencies": {'bar': {'path': '../bar'}}
-        })
-      ]).create();
-
-      d.dir(appPath, [
-        d.pubspec({
-          "name": "myapp",
-          "dependencies": {'baz': {'path': '../baz'}}
-        }),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('myapp')),
-        ])
-      ]).create();
-
-      createLockFile('myapp', sandbox: ['foo', 'bar', 'baz'], pkg: ['barback']);
-
-      var process = startPubServe();
-      process.shouldExit(1);
-      process.stderr.expect(emitsLines(
-          "Transformer cycle detected:\n"
-          "  bar depends on foo\n"
-          "  foo is transformed by myapp/transformer\n"
-          "  myapp depends on baz\n"
-          "  baz is transformed by bar/transformer"));
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart
new file mode 100644
index 0000000..819d30fff
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/exclusion/works_on_aggregate_transformer_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../../descriptor.dart' as d;
+import '../../test_pub.dart';
+import '../../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("works on an aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "myapp": {
+                "\$include": ["web/a.txt", "web/b.txt", "web/c.txt"],
+                "\$exclude": "web/a.txt"
+              }
+            }
+          ]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("a.txt", "a"),
+          d.file("b.txt", "b"),
+          d.file("c.txt", "c"),
+          d.file("d.txt", "d")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("out.txt", "b\nc");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
index 0f6e950..79f0fcb 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_pubspec_with_reserved_transformer_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
@@ -26,11 +29,9 @@
       createLockFile('myapp', pkg: ['barback']);
 
       var pub = startPubServe();
-      pub.stderr.expect(emitsLines(
-          'Error in pubspec for package "myapp" loaded from pubspec.yaml:\n'
-          'Invalid transformer configuration for "transformers.\$nonexistent": '
-              'Unsupported built-in transformer \$nonexistent.'));
-      pub.shouldExit(1);
+      pub.stderr.expect(contains('Invalid transformer config: Unsupported '
+          'built-in transformer \$nonexistent.'));
+      pub.shouldExit(exit_codes.DATA);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
index 64be015..1e649c1 100644
--- a/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
+++ b/sdk/lib/_internal/pub/test/transformer/fails_to_load_a_transform_from_a_non_dependency_test.dart
@@ -6,6 +6,7 @@
 
 import 'package:scheduled_test/scheduled_test.dart';
 
+import '../../lib/src/exit_codes.dart' as exit_codes;
 import '../descriptor.dart' as d;
 import '../test_pub.dart';
 import '../serve/utils.dart';
@@ -22,11 +23,8 @@
       ]).create();
 
       var pub = startPubServe();
-      // Ignore the line containing the path to the pubspec.
-      pub.stderr.expect(anything);
-      pub.stderr.expect('"transformers.foo" refers to a package that\'s not a '
-          'dependency.');
-      pub.shouldExit(1);
+      pub.stderr.expect(contains('"foo" is not a dependency.'));
+      pub.shouldExit(exit_codes.DATA);
     });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart
new file mode 100644
index 0000000..ff4ba7d7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_declaring_aggregate_transformer_test.dart
@@ -0,0 +1,73 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer
+    implements DeclaringAggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.out') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          p.url.join(transform.key, 'out.final'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        p.url.join(transform.key, 'out.final')));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads a declaring aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp/lazy", "myapp/aggregate"]
+        }),
+        d.dir("lib", [
+          d.file("lazy.dart", LAZY_TRANSFORMER),
+          d.file("aggregate.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var server = pubServe();
+      // The transformer should preserve laziness.
+      server.stdout.expect("Build completed successfully");
+
+      requestShouldSucceed("out.final", "bar.out\nfoo.out");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart
new file mode 100644
index 0000000..80d1072
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_a_lazy_aggregate_transformer_test.dart
@@ -0,0 +1,72 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer
+    implements LazyAggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+
+  void declareOutputs(DeclaringAggregateTransform transform) {
+    transform.declareOutput(new AssetId(transform.package,
+        p.url.join(transform.key, 'out.txt')));
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads a lazy aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      var server = pubServe();
+      // The transformer should preserve laziness.
+      server.stdout.expect("Build completed successfully");
+
+      requestShouldSucceed("out.txt", "bar\nfoo");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart
new file mode 100644
index 0000000..1b058f6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_an_aggregate_transformer_test.dart
@@ -0,0 +1,63 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+const AGGREGATE_TRANSFORMER = """
+import 'dart:async';
+
+import 'package:barback/barback.dart';
+import 'package:path/path.dart' as p;
+
+class ManyToOneTransformer extends AggregateTransformer {
+  ManyToOneTransformer.asPlugin();
+
+  String classifyPrimary(AssetId id) {
+    if (id.extension != '.txt') return null;
+    return p.url.dirname(id.path);
+  }
+
+  Future apply(AggregateTransform transform) {
+    return transform.primaryInputs.toList().then((assets) {
+      assets.sort((asset1, asset2) => asset1.id.path.compareTo(asset2.id.path));
+      return Future.wait(assets.map((asset) => asset.readAsString()));
+    }).then((contents) {
+      var id = new AssetId(transform.package,
+          p.url.join(transform.key, 'out.txt'));
+      transform.addOutput(new Asset.fromString(id, contents.join('\\n')));
+    });
+  }
+}
+""";
+
+main() {
+  initConfig();
+  withBarbackVersions(">=0.14.1", () {
+    integration("loads an aggregate transformer", () {
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": ["myapp"]
+        }),
+        d.dir("lib", [
+          d.file("transformer.dart", AGGREGATE_TRANSFORMER),
+        ]),
+        d.dir("web", [
+          d.file("foo.txt", "foo"),
+          d.file("bar.txt", "bar")
+        ])
+      ]).create();
+
+      createLockFile('myapp', pkg: ['barback']);
+
+      pubServe();
+      requestShouldSucceed("out.txt", "bar\nfoo");
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
new file mode 100644
index 0000000..ab2b92b
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformer/loads_different_configurations_from_the_same_isolate_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import '../serve/utils.dart';
+
+main() {
+  initConfig();
+  withBarbackVersions("any", () {
+    integration("loads different configurations from the same isolate", () {
+      // If different configurations are loaded from different isolates, a
+      // transformer can end up being loaded twice. It's even possible for the
+      // second load to use code that's transformed by the first, which is
+      // really bad. This tests sets up such a scenario.
+      //
+      // The foo package has two self-transformers: foo/first and foo/second,
+      // loaded in that order. This means that *no instances of foo/first*
+      // should ever have their code transformed by foo/second.
+      //
+      // The myapp package also has a reference to foo/first. This reference has
+      // a different configuration than foo's, which means that if it's loaded
+      // in a separate isolate, it will be loaded after all of foo's
+      // transformers have run. This means that foo/first.dart will have been
+      // transformed by foo/first and foo/second, causing it to have different
+      // code than the previous instance. This tests asserts that that doesn't
+      // happen.
+
+      d.dir("foo", [
+        d.pubspec({
+          "name": "foo",
+          "version": "1.0.0",
+          "transformers": [
+            {"foo/first": {"addition": " in foo"}},
+            "foo/second"
+          ]
+        }),
+        d.dir("lib", [
+          d.file("first.dart", dartTransformer('foo/first')),
+          d.file("second.dart", dartTransformer('foo/second'))
+        ])
+      ]).create();
+
+      d.dir(appPath, [
+        d.pubspec({
+          "name": "myapp",
+          "transformers": [
+            {
+              "foo/first": {
+                "addition": " in myapp",
+                "\$include": "web/first.dart"
+              }
+            },
+            {"foo/second": {"\$include": "web/second.dart"}}
+          ],
+          "dependencies": {'foo': {'path': '../foo'}}
+        }),
+        d.dir("web", [
+          // This is transformed by foo/first. It's used to see which
+          // transformers ran on foo/first.
+          d.file("first.dart", 'const TOKEN = "myapp/first";'),
+
+          // This is transformed by foo/second. It's used to see which
+          // transformers ran on foo/second.
+          d.file("second.dart", 'const TOKEN = "myapp/second";')
+        ])
+      ]).create();
+
+      createLockFile('myapp', sandbox: ['foo'], pkg: ['barback']);
+
+      pubServe();
+
+      // The version of foo/first used on myapp should have myapp's
+      // configuration and shouldn't be transformed by foo/second.
+      requestShouldSucceed("first.dart",
+          'const TOKEN = "(myapp/first, foo/first in myapp)";');
+
+      // foo/second should be transformed by only foo/first.
+      requestShouldSucceed("second.dart",
+          'const TOKEN = "(myapp/second, (foo/second, foo/first in foo))";');
+
+      endPubServe();
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart b/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
deleted file mode 100644
index 7689b6a..0000000
--- a/sdk/lib/_internal/pub/test/transformer/loads_ordering_dependencies_in_the_correct_order_test.dart
+++ /dev/null
@@ -1,56 +0,0 @@
-// 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';
-
-main() {
-  initConfig();
-  withBarbackVersions("any", () {
-    integration("loads ordering dependencies in the correct order", () {
-      d.dir("foo", [
-        d.libPubspec("foo", '1.0.0'),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('foo'))
-        ])
-      ]).create();
-
-      d.dir("bar", [
-        d.pubspec({
-          "name": "bar",
-          "version": "1.0.0",
-          "transformers": ["foo/transformer"],
-          "dependencies": {"foo": {"path": "../foo"}}
-        }),
-        d.dir("lib", [
-          d.file("bar.dart", 'const TOKEN = "bar";')
-        ])
-      ]).create();
-
-      d.dir(appPath, [
-        d.pubspec({
-          "name": "myapp",
-          "transformers": ["myapp/transformer"],
-          "dependencies": {"bar": {"path": "../bar"}}
-        }),
-        d.dir("lib", [
-          d.file("transformer.dart", dartTransformer('myapp', import: 'bar'))
-        ]),
-        d.dir("web", [
-          d.file("main.dart", 'const TOKEN = "main.dart";')
-        ])
-      ]).create();
-
-      createLockFile('myapp', sandbox: ['foo', 'bar'], pkg: ['barback']);
-
-      pubServe();
-      requestShouldSucceed("main.dart",
-          'const TOKEN = "(main.dart, myapp imports (bar, foo))";');
-      endPubServe();
-    });
-  });
-}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
new file mode 100644
index 0000000..19118a6
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/conservative_dependencies_test.dart
@@ -0,0 +1,466 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports previous transformers as dependencies if the "
+      "transformer is transformed", () {
+    // The root app just exists so that something is transformed by pkg and qux.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "version": "1.0.0",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["pkg", "qux"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"},
+        },
+        "transformers": [
+          {"foo": {"\$include": "lib/pkg.dart"}},
+          {"bar": {"\$exclude": "lib/transformer.dart"}},
+          "baz"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("pkg.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    // Even though foo and bar don't modify pkg/lib/transformer.dart themselves,
+    // it may be modified to import a library that they modify or generate, so
+    // pkg will depend on them.
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz transforms pkg/lib/transformer.dart, so pkg will obviously
+    // depend on it.
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0"),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux doesn't transform anything in pkg, so pkg won't depend on it.
+    d.dir("qux", [
+      d.libPubspec("qux", "1.0.0"),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'pkg': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports all transitive package dependencies' transformers as "
+      "dependencies if the transformer is transformed", () {
+    // The root app just exists so that something is transformed by pkg and qux.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["pkg"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("pkg.dart", transformer())])
+    ]).create();
+
+    // pkg depends on foo. Even though it's not transformed by foo, its
+    // transformed transformer could import foo, so it has to depend on foo.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {"bar": {"path": "../bar"}},
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // foo depends on bar, and like pkg's dependency on foo, the transformed
+    // version of foo's transformer could import bar, so foo has to depend on
+    // bar.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    /// foo is transformed by baz.
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0"),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    /// qux is not part of pkg's transitive dependency tree, so pkg shouldn't
+    /// depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'pkg': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports previous transformers as dependencies if a "
+      "nonexistent local file is imported", () {
+    // The root app just exists so that something is transformed by pkg and bar.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "pkg": {"path": "../pkg"},
+          "bar": {"path": "../bar"}
+        },
+        "transformers": ["pkg", "bar"]
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "version": "1.0.0",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "bar": {"path": "../bar"}
+        },
+        "transformers": [{"foo": {"\$include": "lib/pkg.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("pkg.dart", ""),
+        d.file("transformer.dart", transformer(["nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // Since pkg's transformer imports a nonexistent file, we assume that file
+    // was generated by foo's transformer. Thus pkg's transformer depends on
+    // foo's even though the latter doesn't transform the former.
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    /// qux is not part of pkg's transitive dependency tree, so pkg shouldn't
+    /// depend on it.
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'pkg': ['foo'], 'foo': [], 'bar': []});
+  });
+
+  integration("reports all that package's dependencies' transformers as "
+      "dependencies if a non-existent file is imported from another package",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer(["package:foo/nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // myapp imported a nonexistent file from foo so myapp will depend on every
+    // transformer transitively reachable from foo, since the nonexistent file
+    // could be generated to import anything.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dependency of foo so myapp will depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dependency of foo so myapp will depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux is not transitively reachable from foo so myapp won't depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  integration("reports all that package's dependencies' transformers as "
+      "dependencies if a non-existent transformer is used from another package",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {
+          "foo": {"path": "../foo"},
+          "qux": {"path": "../qux"}
+        },
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer(["package:foo/nonexistent.dart"]))
+      ])
+    ]).create();
+
+    // myapp imported a nonexistent file from foo so myapp will depend on every
+    // transformer transitively reachable from foo, since the nonexistent file
+    // could be generated to import anything.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {
+          "bar": {"path": "../bar"},
+          "baz": {"path": "../baz"}
+        },
+        "transformers": ["bar"]
+      })
+    ]).create();
+
+    // bar is a dependency of foo so myapp will depend on it.
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0"),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dependency of foo so myapp will depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    // qux is not transitively reachable from foo so myapp won't depend on it.
+    d.dir("qux", [
+      d.pubspec({
+        "name": "qux",
+        "version": "1.0.0",
+        "transformers": ["qux"]
+      }),
+      d.dir("lib", [d.file("qux.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['bar', 'baz'], 'bar': [], 'baz': [], 'qux': []
+    });
+  });
+
+  test("reports dependencies on transformers in past phases", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": [
+          "myapp/first",
+          "myapp/second",
+          "myapp/third"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer()),
+        d.file("third.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({
+      'myapp/first': [],
+      'myapp/second': ['myapp/first'],
+      'myapp/third': ['myapp/second', 'myapp/first']
+    });
+  });
+
+  integration("considers the entrypoint package's dev and override "
+      "dependencies", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "dev_dependencies": {"bar": {"path": "../bar"}},
+        "dependency_overrides": {"baz": {"path": "../baz"}},
+        "transformers": ["foo", "myapp"]
+      }),
+      d.dir("lib", [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    // foo transforms myapp's transformer so it could import from bar or baz.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dev dependency that myapp could import from, so myapp should
+    // depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is an override dependency that myapp could import from, so myapp
+    // should depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    expectDependencies({
+      'myapp': ['foo', 'bar', 'baz'], 'foo': [], 'bar': [], 'baz': []
+    });
+  });
+
+  integration("doesn't consider a non-entrypoint package's dev and override "
+      "dependencies", () {
+    // myapp just exists so that pkg isn't the entrypoint.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"pkg": {"path": "../pkg"}}
+      })
+    ]).create();
+
+    d.dir("pkg", [
+      d.pubspec({
+        "name": "pkg",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "dev_dependencies": {"bar": {"path": "../bar"}},
+        "dependency_overrides": {"baz": {"path": "../baz"}},
+        "transformers": ["foo", "pkg"]
+      }),
+      d.dir("lib", [d.file("pkg.dart", transformer())])
+    ]).create();
+
+    // foo transforms pkg's transformer so it could theoretcially import from
+    // bar or baz. However, since pkg isn't the entrypoint, it doesn't have
+    // access to them.
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": ["foo"]
+      }),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    // bar is a dev dependency that myapp can't import from, so myapp shouldn't
+    // depend on it.
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": ["bar"]
+      }),
+      d.dir("lib", [d.file("bar.dart", transformer())])
+    ]).create();
+
+    // baz is a dev dependency that myapp can't import from, so myapp shouldn't
+    // depend on it.
+    d.dir("baz", [
+      d.pubspec({
+        "name": "baz",
+        "version": "1.0.0",
+        "transformers": ["baz"]
+      }),
+      d.dir("lib", [d.file("baz.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'pkg': ['foo'], 'foo': [], 'bar': [], 'baz': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
new file mode 100644
index 0000000..a8458c1
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/cycle_test.dart
@@ -0,0 +1,212 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("allows a package dependency cycle that's unrelated to "
+      "transformers", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp/first", "myapp/second"]
+      }),
+      d.dir('lib', [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}})
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"baz": {"path": "../baz"}})
+    ]).create();
+
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0", deps: {"foo": {"path": "../foo"}})
+    ]).create();
+
+    expectDependencies({'myapp/first': [], 'myapp/second': ['myapp/first']});
+  });
+
+  integration("disallows a package dependency cycle that may be related to "
+      "transformers", () {
+    // Two layers of myapp transformers are necessary here because otherwise pub
+    // will figure out that the transformer doesn't import "foo" and thus
+    // doesn't transitively import itself. Import loops are tested below.
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp/first", "myapp/second"]
+      }),
+      d.dir('lib', [
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}})
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"myapp": {"path": "../myapp"}})
+    ]).create();
+
+    expectCycleException([
+      "myapp is transformed by myapp/second",
+      "myapp depends on foo",
+      "foo depends on bar",
+      "bar depends on myapp",
+      "myapp is transformed by myapp/first"
+    ]);
+  });
+
+  integration("disallows a transformation dependency cycle", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["foo"]
+      }),
+      d.dir('lib', [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "dependencies": {"bar": {"path": "../bar"}},
+        "transformers": ["bar"]
+      }),
+      d.dir('lib', [d.file("foo.dart", transformer())])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "dependencies": {"myapp": {"path": "../myapp"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [d.file("bar.dart", transformer())])
+    ]).create();
+
+    expectCycleException([
+      "bar is transformed by myapp",
+      "myapp is transformed by foo",
+      "foo is transformed by bar"
+    ]);
+  });
+
+  integration("allows a cross-package import cycle that's unrelated to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['package:foo/foo.dart']))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}}),
+      d.dir('lib', [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"baz": {"path": "../baz"}}),
+      d.dir('lib', [d.file("bar.dart", "import 'package:baz/baz.dart';")])
+    ]).create();
+
+    d.dir("baz", [
+      d.libPubspec("baz", "1.0.0", deps: {"foo": {"path": "../foo"}}),
+      d.dir('lib', [d.file("baz.dart", "import 'package:foo/foo.dart';")])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+
+  integration("disallows a cross-package import cycle that's related to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['package:foo/foo.dart']))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0", deps: {"bar": {"path": "../bar"}}),
+      d.dir('lib', [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.libPubspec("bar", "1.0.0", deps: {"myapp": {"path": "../myapp"}}),
+      d.dir('lib', [d.file("bar.dart", "import 'package:myapp/myapp.dart';")])
+    ]).create();
+
+    expectCycleException([
+      "myapp is transformed by myapp",
+      "myapp depends on foo",
+      "foo depends on bar",
+      "bar depends on myapp"
+    ]);
+  });
+
+  integration("allows a single-package import cycle that's unrelated to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['foo.dart'])),
+        d.file("foo.dart", "import 'bar.dart';"),
+        d.file("bar.dart", "import 'baz.dart';"),
+        d.file("baz.dart", "import 'foo.dart';")
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+
+  integration("allows a single-package import cycle that's related to "
+      "transformers", () {
+     d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(['foo.dart'])),
+        d.file("foo.dart", "import 'bar.dart';"),
+        d.file("bar.dart", "import 'myapp.dart';"),
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart
new file mode 100644
index 0000000..a06a566
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/error_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/exceptions.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("fails if an unknown package is imported", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    expectException(predicate((error) {
+      expect(error, new isInstanceOf<ApplicationException>());
+      expect(error.message, equals(
+          'A transformer imported unknown package "foo" (in '
+          '"package:foo/foo.dart").'));
+      return true;
+    }));
+  });
+
+  integration("fails on a syntax error", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir('lib', [
+        d.file("myapp.dart", "library;")
+      ])
+    ]).create();
+
+    expectException(new isInstanceOf<AnalyzerErrorGroup>());
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
new file mode 100644
index 0000000..342425e
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/import_dependencies_test.dart
@@ -0,0 +1,195 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports a dependency if a transformed local file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/lib.dart"}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("lib.dart", ""),
+        d.file("transformer.dart", transformer(["lib.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is imported",
+      () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed external package file is "
+      "imported from an export", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "export 'package:foo/foo.dart';")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is "
+      "transitively imported", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "import 'package:foo/foreign.dart';")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$include": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer()),
+        d.file("foreign.dart", "import 'foo.dart';")
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+
+  integration("reports a dependency if a transformed foreign file is "
+      "transitively imported across packages", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"])),
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "dependencies": {"bar": {"path": "../bar"}}
+      }),
+      d.dir("lib", [d.file("foo.dart", "import 'package:bar/bar.dart';")])
+    ]).create();
+
+    d.dir("bar", [
+      d.pubspec({
+        "name": "bar",
+        "version": "1.0.0",
+        "transformers": [{"bar": {"\$include": "lib/bar.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("bar.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': ['bar'], 'bar': []});
+  });
+
+  integration("reports a dependency if an imported file is transformed by a "
+      "different package", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {'\$include': 'lib/local.dart'}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["local.dart"])),
+        d.file("local.dart", "")
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({"name": "foo", "version": "1.0.0"}),
+      d.dir("lib", [d.file("transformer.dart", transformer())])
+    ]).create();
+
+    expectDependencies({'myapp': ['foo'], 'foo': []});
+  });
+}
\ No newline at end of file
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart
new file mode 100644
index 0000000..c28e4a0
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/no_dependencies_test.dart
@@ -0,0 +1,161 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+import 'utils.dart';
+
+void main() {
+  initConfig();
+
+  integration("reports no dependencies if no transformers are used", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}}
+      })
+    ]).create();
+
+    d.dir("foo", [d.libPubspec("foo", "1.0.0")]).create();
+
+    expectDependencies({});
+  });
+
+  integration("reports no dependencies if a transformer is used in a "
+      "package that doesn't expose a transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["foo"]
+      })
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"foo": []});
+  });
+
+  integration("reports no dependencies for non-file/package imports", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", transformer([
+          "dart:async",
+          "http://dartlang.org/nonexistent.dart"
+        ]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": []});
+  });
+
+  integration("reports no dependencies for a single self transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [d.file("myapp.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": []});
+  });
+
+  integration("reports no dependencies if a transformer applies to files that "
+      "aren't used by the exposed transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": [
+          {"foo": {"\$include": "lib/myapp.dart"}},
+          {"foo": {"\$exclude": "lib/transformer.dart"}},
+          "myapp"
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.libPubspec("foo", "1.0.0"),
+      d.dir("lib", [d.file("foo.dart", transformer())])
+    ]).create();
+
+    expectDependencies({"myapp": [], "foo": []});
+  });
+
+  integration("reports no dependencies if a transformer applies to a "
+      "dependency's files that aren't used by the exposed transformer", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "dependencies": {"foo": {"path": "../foo"}},
+        "transformers": ["myapp"]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("transformer.dart", transformer(["package:foo/foo.dart"]))
+      ])
+    ]).create();
+
+    d.dir("foo", [
+      d.pubspec({
+        "name": "foo",
+        "version": "1.0.0",
+        "transformers": [{"foo": {"\$exclude": "lib/foo.dart"}}]
+      }),
+      d.dir("lib", [
+        d.file("foo.dart", ""),
+        d.file("transformer.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({'myapp': [], 'foo': []});
+  });
+
+  test("reports no dependencies on transformers in future phases", () {
+    d.dir(appPath, [
+      d.pubspec({
+        "name": "myapp",
+        "transformers": [
+          {"myapp/first": {"\$include": "lib/myapp.dart"}},
+          {"myapp/second": {"\$include": "lib/first.dart"}},
+          {"myapp/third": {"\$include": "lib/second.dart"}}
+        ]
+      }),
+      d.dir("lib", [
+        d.file("myapp.dart", ""),
+        d.file("first.dart", transformer()),
+        d.file("second.dart", transformer()),
+        d.file("third.dart", transformer())
+      ])
+    ]).create();
+
+    expectDependencies({
+      'myapp/first': [],
+      'myapp/second': [],
+      'myapp/third': []
+    });
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
new file mode 100644
index 0000000..47e1cf7
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/transformers_needed_by_transformers/utils.dart
@@ -0,0 +1,112 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS d.file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library pub_tests;
+
+import 'package:path/path.dart' as p;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/barback/cycle_exception.dart';
+import '../../lib/src/barback/transformers_needed_by_transformers.dart';
+import '../../lib/src/entrypoint.dart';
+import '../../lib/src/io.dart';
+import '../../lib/src/package.dart';
+import '../../lib/src/package_graph.dart';
+import '../../lib/src/source/path.dart';
+import '../../lib/src/system_cache.dart';
+import '../../lib/src/utils.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+/// Expects that [computeTransformersNeededByTransformers] will return a graph
+/// matching [expected] when run on the package graph defined by packages in
+/// the sandbox.
+void expectDependencies(Map<String, Iterable<String>> expected) {
+  expected = mapMap(expected, value: (_, ids) => ids.toSet());
+
+  schedule(() {
+    var result = mapMap(
+        computeTransformersNeededByTransformers(_loadPackageGraph()),
+        key: (id, _) => id.toString(),
+        value: (_, ids) => ids.map((id) => id.toString()).toSet());
+    expect(result, equals(expected));
+  }, "expect dependencies to match $expected");
+}
+
+/// Expects that [computeTransformersNeededByTransformers] will throw an
+/// exception matching [matcher] when run on the package graph defiend by
+/// packages in the sandbox.
+void expectException(matcher) {
+  schedule(() {
+    expect(() => computeTransformersNeededByTransformers(_loadPackageGraph()),
+        throwsA(matcher));
+  }, "expect an exception: $matcher");
+}
+
+/// Expects that [computeTransformersNeededByTransformers] will throw a
+/// [CycleException] with the given [steps] when run on the package graph
+/// defiend by packages in the sandbox.
+void expectCycleException(Iterable<String> steps) {
+  expectException(predicate((error) {
+    expect(error, new isInstanceOf<CycleException>());
+    expect(error.steps, equals(steps));
+    return true;
+  }, "cycle exception:\n${steps.map((step) => "  $step").join("\n")}"));
+}
+
+/// Loads a [PackageGraph] from the packages in the sandbox.
+///
+/// This graph will also include barback and its transitive dependencies from
+/// the repo.
+PackageGraph _loadPackageGraph() {
+  // Load the sandbox packages.
+  var packages = {};
+
+  var systemCache = new SystemCache(p.join(sandboxDir, cachePath));
+  systemCache.sources
+      ..register(new PathSource())
+      ..setDefault('path');
+  var entrypoint = new Entrypoint(p.join(sandboxDir, appPath), systemCache);
+
+  for (var package in listDir(sandboxDir)) {
+    if (!fileExists(p.join(package, 'pubspec.yaml'))) continue;
+    var packageName = p.basename(package);
+    packages[packageName] = new Package.load(
+        packageName, package, systemCache.sources);
+  }
+
+  loadPackage(packageName) {
+    if (packages.containsKey(packageName)) return;
+    packages[packageName] = new Package.load(
+        packageName, p.join(pkgPath, packageName), systemCache.sources);
+    for (var dep in packages[packageName].dependencies) {
+      loadPackage(dep.name);
+    }
+  }
+
+  loadPackage('barback');
+
+  return new PackageGraph(entrypoint, null, packages);
+}
+
+/// Returns the contents of a no-op transformer that imports each URL in
+/// [imports].
+String transformer([Iterable<String> imports]) {
+  if (imports == null) imports = [];
+
+  var buffer = new StringBuffer()
+      ..writeln('import "package:barback/barback.dart";');
+  for (var import in imports) {
+    buffer.writeln('import "$import";');
+  }
+
+  buffer.writeln("""
+NoOpTransformer extends Transformer {
+  bool isPrimary(AssetId id) => true;
+  void apply(Transform transform) {}
+}
+""");
+
+  return buffer.toString();
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
new file mode 100644
index 0000000..da950b5
--- /dev/null
+++ b/sdk/lib/_internal/pub/test/upgrade/dry_run_does_not_apply_changes_test.dart
@@ -0,0 +1,50 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import 'package:path/path.dart' as path;
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../lib/src/io.dart';
+import '../descriptor.dart' as d;
+import '../test_pub.dart';
+
+main() {
+  initConfig();
+  integration("--dry-run shows report but does not apply changes", () {
+    servePackages([
+      packageMap("foo", "1.0.0"),
+      packageMap("foo", "2.0.0"),
+    ]);
+
+    // Create the first lockfile.
+    d.appDir({
+      "foo": "1.0.0"
+    }).create();
+
+    pubGet();
+
+    // Change the pubspec.
+    d.appDir({
+      "foo": "any"
+    }).create();
+
+    // Also delete the "packages" directory.
+    schedule(() {
+      deleteEntry(path.join(sandboxDir, appPath, "packages"));
+    });
+
+    // Do the dry run.
+    pubUpgrade(args: ["--dry-run"], output: allOf([
+      contains("> foo 2.0.0 (was 1.0.0)"),
+      contains("Would change 1 dependency.")
+    ]));
+
+    d.dir(appPath, [
+      // The lockfile should be unmodified.
+      d.matcherFile("pubspec.lock", contains("1.0.0")),
+      // The "packages" directory should not have been regenerated.
+      d.nothing("packages")
+    ]).validate();
+  });
+}
diff --git a/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart b/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
index b6440fd..90995ea 100644
--- a/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
+++ b/sdk/lib/_internal/pub/test/upgrade/git/upgrade_to_incompatible_pubspec_test.dart
@@ -4,6 +4,9 @@
 
 library pub_tests;
 
+import 'package:scheduled_test/scheduled_test.dart';
+
+import '../../../lib/src/exit_codes.dart' as exit_codes;
 import '../../descriptor.dart' as d;
 import '../../test_pub.dart';
 
@@ -32,8 +35,8 @@
       d.libPubspec('zoo', '1.0.0')
     ]).commit();
 
-    pubUpgrade(error: new RegExp(r'"name" field "zoo" doesn' "'" r't match '
-        r'expected name "foo"\.'));
+    pubUpgrade(error: contains('"name" field doesn\'t match expected name '
+        '"foo".'), exitCode: exit_codes.DATA);
 
     d.dir(packagesPath, [
       d.dir('foo', [
diff --git a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
index 425ad83..38ee284 100644
--- a/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
+++ b/sdk/lib/_internal/pub/test/validator/compiled_dartdoc_test.dart
@@ -33,22 +33,73 @@
       ]).create();
       expectNoValidationError(compiledDartdoc);
     });
+
+    integration('contains compiled dartdoc in a hidden directory', () {
+      ensureGit();
+
+      d.dir(appPath, [
+        d.dir(".doc-out", [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
+      expectNoValidationError(compiledDartdoc);
+    });
+
+    integration('contains compiled dartdoc in a gitignored directory', () {
+      ensureGit();
+
+      d.git(appPath, [
+        d.dir("doc-out", [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ]),
+        d.file(".gitignore", "/doc-out")
+      ]).create();
+      expectNoValidationError(compiledDartdoc);
+    });
   });
 
-  integration('should consider a package invalid if it contains compiled '
-      'dartdoc', () {
-    d.validPackage.create();
+  group("should consider a package invalid if it", () {
+    integration('contains compiled dartdoc', () {
+      d.validPackage.create();
 
-    d.dir(appPath, [
-      d.dir('doc-out', [
-        d.file('nav.json', ''),
-        d.file('index.html', ''),
-        d.file('styles.css', ''),
-        d.file('dart-logo-small.png', ''),
-        d.file('client-live-nav.js', '')
-      ])
-    ]).create();
+      d.dir(appPath, [
+        d.dir('doc-out', [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
 
-    expectValidationWarning(compiledDartdoc);
+      expectValidationWarning(compiledDartdoc);
+    });
+
+    integration('contains compiled dartdoc in a non-gitignored hidden '
+        'directory', () {
+      ensureGit();
+
+      d.validPackage.create();
+
+      d.git(appPath, [
+        d.dir('.doc-out', [
+          d.file('nav.json', ''),
+          d.file('index.html', ''),
+          d.file('styles.css', ''),
+          d.file('dart-logo-small.png', ''),
+          d.file('client-live-nav.js', '')
+        ])
+      ]).create();
+
+      expectValidationWarning(compiledDartdoc);
+    });
   });
 }
diff --git a/sdk/lib/_internal/pub/test/version_solver_test.dart b/sdk/lib/_internal/pub/test/version_solver_test.dart
index 54c8921..b5302cb 100644
--- a/sdk/lib/_internal/pub/test/version_solver_test.dart
+++ b/sdk/lib/_internal/pub/test/version_solver_test.dart
@@ -27,7 +27,7 @@
   initConfig();
 
   // Uncomment this to debug failing tests.
-  // log.showSolver();
+  // log.verbosity = log.Verbosity.SOLVER;
 
   // Since this test isn't run from the SDK, it can't find the "version" file
   // to load. Instead, just manually inject a version.
@@ -1067,7 +1067,7 @@
 solo_testResolve(String description, Map packages, {
     Map lockfile, Map overrides, Map result, FailMatcherBuilder error,
     int maxTries}) {
-  log.showSolver();
+  log.verbosity = log.Verbosity.SOLVER;
   _testResolve(solo_test, description, packages, lockfile: lockfile,
       overrides: overrides, result: result, error: error, maxTries: maxTries);
 }
diff --git a/sdk/lib/async/async.dart b/sdk/lib/async/async.dart
index adf54f1..b244191 100644
--- a/sdk/lib/async/async.dart
+++ b/sdk/lib/async/async.dart
@@ -91,7 +91,8 @@
 library dart.async;
 
 import "dart:collection";
-import "dart:_internal" show deprecated, printToZone, printToConsole;
+import "dart:_internal" show deprecated, printToZone, printToConsole,
+                             IterableElementError;
 
 part 'async_error.dart';
 part 'broadcast_stream_controller.dart';
diff --git a/sdk/lib/async/future.dart b/sdk/lib/async/future.dart
index b7a7475..f88305b 100644
--- a/sdk/lib/async/future.dart
+++ b/sdk/lib/async/future.dart
@@ -316,7 +316,7 @@
    * immediately, but will be scheduled in a later microtask.
    *
    * If [onError] is provided, and this future completes with an error,
-   * the `onError` callback is called with that error its stack trace.
+   * the `onError` callback is called with that error and its stack trace.
    * The `onError` callback must accept either one argument or two arguments.
    * If `onError` accepts two arguments,
    * it is called with both the error and the stack trace,
@@ -337,7 +337,7 @@
    *
    * If the callback returns a [Future],
    * the future returned by `then` will be completed with
-   * the same result of the future returned by the callback.
+   * the same result as the future returned by the callback.
    *
    * If [onError] is not given, and this future completes with an error,
    * the error is forwarded directly to the returned future.
diff --git a/sdk/lib/async/future_impl.dart b/sdk/lib/async/future_impl.dart
index 5fcbe3d..a1f09a4 100644
--- a/sdk/lib/async/future_impl.dart
+++ b/sdk/lib/async/future_impl.dart
@@ -128,10 +128,10 @@
   // If we store the type of a closure in the state field (where there are
   // still bits left), we can just store two closures instead of using 4
   // fields of which 2 are always null.
-  final _FutureOnValue _onValueCallback;
-  final _FutureErrorTest _errorTestCallback;
-  final Function _onErrorCallback;
-  final _FutureAction _whenCompleteActionCallback;
+  _FutureOnValue _onValueCallback;
+  _FutureErrorTest _errorTestCallback;
+  Function _onErrorCallback;
+  _FutureAction _whenCompleteActionCallback;
 
   _FutureOnValue get _onValue => _isChained ? null : _onValueCallback;
   _FutureErrorTest get _errorTest => _isChained ? null : _errorTestCallback;
@@ -578,6 +578,10 @@
         }
         // If we changed zone, oldZone will not be null.
         if (oldZone != null) Zone._leave(oldZone);
+        listener._onValueCallback = null;
+        listener._errorTestCallback = null;
+        listener._onErrorCallback = null;
+        listener._whenCompleteActionCallback = null;
 
         if (isPropagationAborted) return;
         // If the listener's value is a future we need to chain it. Note that
diff --git a/sdk/lib/async/stream.dart b/sdk/lib/async/stream.dart
index ab50c24..2392739 100644
--- a/sdk/lib/async/stream.dart
+++ b/sdk/lib/async/stream.dart
@@ -501,7 +501,11 @@
       onError: result._completeError,
       onDone: () {
         if (!seenFirst) {
-          result._completeError(new StateError("No elements"));
+          try {
+            throw IterableElementError.noElement();
+          } catch (e, s) {
+            result._completeError(e, s);
+          }
         } else {
           result._complete(value);
         }
@@ -902,7 +906,11 @@
       },
       onError: future._completeError,
       onDone: () {
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -933,7 +941,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -956,8 +968,11 @@
       (T value) {
         if (foundResult) {
           // This is the second element we get.
-          Error error = new StateError("More than one element");
-          _cancelAndError(subscription, future, error, null);
+          try {
+            throw IterableElementError.tooMany();
+          } catch (e, s) {
+            _cancelAndError(subscription, future, e, s);
+          }
           return;
         }
         foundResult = true;
@@ -969,7 +984,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("No elements"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1017,7 +1036,11 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        future._completeError(new StateError("firstMatch ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1058,7 +1081,11 @@
           _runUserCode(defaultValue, future._complete, future._completeError);
           return;
         }
-        future._completeError(new StateError("lastMatch ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
@@ -1082,11 +1109,11 @@
           (bool isMatch) {
             if (isMatch) {
               if (foundResult) {
-                _cancelAndError(
-                    subscription,
-                    future,
-                    new StateError('Multiple matches for "single"'),
-                    null);
+                try {
+                  throw IterableElementError.tooMany();
+                } catch (e, s) {
+                  _cancelAndError(subscription, future, e, s);
+                }
                 return;
               }
               foundResult = true;
@@ -1102,7 +1129,11 @@
           future._complete(result);
           return;
         }
-        future._completeError(new StateError("single ended without match"));
+        try {
+          throw IterableElementError.noElement();
+        } catch (e, s) {
+          future._completeError(e, s);
+        }
       },
       cancelOnError: true);
     return future;
diff --git a/sdk/lib/core/annotations.dart b/sdk/lib/core/annotations.dart
index 97eb11f..5ceed34 100644
--- a/sdk/lib/core/annotations.dart
+++ b/sdk/lib/core/annotations.dart
@@ -81,7 +81,7 @@
  */
 const Deprecated deprecated = const Deprecated("next release");
 
-/*
+/**
  * The annotation `@override` marks an instance member as overriding a
  * superclass member with the same name.
  *
diff --git a/sdk/lib/core/stopwatch.dart b/sdk/lib/core/stopwatch.dart
index 9650a57..e923083 100644
--- a/sdk/lib/core/stopwatch.dart
+++ b/sdk/lib/core/stopwatch.dart
@@ -11,7 +11,7 @@
   /**
    * Frequency of the elapsed counter in Hz.
    */
-  final int frequency = _frequency();
+  int get frequency => _frequency;
 
   // The _start and _stop fields capture the time when [start] and [stop]
   // are called respectively.
@@ -29,7 +29,9 @@
    *
    *     Stopwatch stopwatch = new Stopwatch()..start();
    */
-  Stopwatch();
+  Stopwatch() {
+    _initTicker();
+  }
 
   /**
    * Starts the [Stopwatch].
@@ -127,6 +129,15 @@
    */
   bool get isRunning => _start != null && _stop == null;
 
-  external static int _frequency();
+  /**
+   * Cached frequency of the system. Must be initialized in [_initTicker];
+   */
+  static int _frequency;
+
+  /**
+   * Initializes the time-measuring system. *Must* initialize the [_frequency]
+   * variable.
+   */
+  external static void _initTicker();
   external static int _now();
 }
diff --git a/sdk/lib/core/uri.dart b/sdk/lib/core/uri.dart
index 091e1fe..73a97d8 100644
--- a/sdk/lib/core/uri.dart
+++ b/sdk/lib/core/uri.dart
@@ -116,7 +116,11 @@
   Map<String, String> _queryParameters;
 
   /**
-   * Creates a new URI object by parsing a URI string.
+   * Creates a new `Uri` object by parsing a URI string.
+   *
+   * If the string is not valid as a URI or URI reference,
+   * invalid characters will be percent escaped where possible.
+   * The resulting `Uri` will represent a valid URI or URI reference.
    */
   static Uri parse(String uri) {
     // This parsing will not validate percent-encoding, IPv6, etc. When done
@@ -175,171 +179,231 @@
     bool isRegName(int ch) {
       return ch < 128 && ((_regNameTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
     }
+    const int EOI = -1;
 
-    int ipV6Address(int index) {
-      // IPv6. Skip to ']'.
-      index = uri.indexOf(']', index);
-      if (index == -1) {
-        throw new FormatException("Bad end of IPv6 host");
-      }
-      return index + 1;
-    }
+    String scheme = "";
+    String path;
+    String userinfo = "";
+    String host = "";
+    int port = 0;
+    String query = "";
+    String fragment = "";
 
-    int length = uri.length;
     int index = 0;
+    int pathStart = 0;
+    // End of input-marker.
+    int char = EOI;
 
-    int schemeEndIndex = 0;
-
-    if (length == 0) {
-      return new Uri();
-    }
-
-    if (uri.codeUnitAt(0) != _SLASH) {
-      // Can be scheme.
-      while (index < length) {
-        // Look for ':'. If found, continue from the post of ':'. If not (end
-        // reached or invalid scheme char found) back up one char, and continue
-        // to path.
-        // Note that scheme-chars is contained in path-chars.
-        int codeUnit = uri.codeUnitAt(index++);
-        if (!_isSchemeCharacter(codeUnit)) {
-          if (codeUnit == _COLON) {
-            schemeEndIndex = index;
-          } else {
-            // Back up one char, since we met an invalid scheme char.
-            index--;
-          }
+    void parseAuth() {
+      if (index == uri.length) {
+        char = EOI;
+        return;
+      }
+      int authStart = index;
+      int lastColon = -1;
+      int lastAt = -1;
+      char = uri.codeUnitAt(index);
+      while (index < uri.length) {
+        char = uri.codeUnitAt(index);
+        if (char == _SLASH || char == _QUESTION || char == _NUMBER_SIGN) {
           break;
         }
-      }
-    }
-
-    int userInfoEndIndex = -1;
-    int portIndex = -1;
-    int authorityEndIndex = schemeEndIndex;
-    // If we see '//', there must be an authority.
-    if (authorityEndIndex == index &&
-        authorityEndIndex + 1 < length &&
-        uri.codeUnitAt(authorityEndIndex) == _SLASH &&
-        uri.codeUnitAt(authorityEndIndex + 1) == _SLASH) {
-      // Skip '//'.
-      authorityEndIndex += 2;
-      // It can both be host and userInfo.
-      while (authorityEndIndex < length) {
-        int codeUnit = uri.codeUnitAt(authorityEndIndex++);
-        if (!isRegName(codeUnit)) {
-          if (codeUnit == _LEFT_BRACKET) {
-            authorityEndIndex = ipV6Address(authorityEndIndex);
-          } else if (portIndex == -1 && codeUnit == _COLON) {
-            // First time ':'.
-            portIndex = authorityEndIndex;
-          } else if (codeUnit == _AT_SIGN || codeUnit == _COLON) {
-            // Second time ':' or first '@'. Must be userInfo.
-            userInfoEndIndex = uri.indexOf('@', authorityEndIndex - 1);
-            // Not found. Must be path then.
-            if (userInfoEndIndex == -1) {
-              authorityEndIndex = index;
-              break;
-            }
-            portIndex = -1;
-            authorityEndIndex = userInfoEndIndex + 1;
-            // Now it can only be host:port.
-            while (authorityEndIndex < length) {
-              int codeUnit = uri.codeUnitAt(authorityEndIndex++);
-              if (!isRegName(codeUnit)) {
-                if (codeUnit == _LEFT_BRACKET) {
-                  authorityEndIndex = ipV6Address(authorityEndIndex);
-                } else if (codeUnit == _COLON) {
-                  if (portIndex != -1) {
-                    throw new FormatException("Double port in host");
-                  }
-                  portIndex = authorityEndIndex;
-                } else {
-                  authorityEndIndex--;
-                  break;
-                }
-              }
-            }
+        if (char == _AT_SIGN) {
+          lastAt = index;
+          lastColon = -1;
+        } else if (char == _COLON) {
+          lastColon = index;
+        } else if (char == _LEFT_BRACKET) {
+          lastColon = -1;
+          int endBracket = uri.indexOf(']', index + 1);
+          if (endBracket == -1) {
+            index = uri.length;
+            char = EOI;
             break;
           } else {
-            authorityEndIndex--;
-            break;
+            index = endBracket;
           }
         }
+        index++;
+        char = EOI;
       }
-    } else {
-      authorityEndIndex = schemeEndIndex;
+      int hostStart = authStart;
+      int hostEnd = index;
+      if (lastAt >= 0) {
+        userinfo = _makeUserInfo(uri, authStart, lastAt);
+        hostStart = lastAt + 1;
+      }
+      if (lastColon >= 0) {
+        int portNumber = 0;
+        for (int i = lastColon + 1; i < index; i++) {
+          int digit = uri.codeUnitAt(i);
+          if (_ZERO > digit || _NINE < digit) {
+            _fail(uri, i, "Invalid port number");
+          }
+          portNumber = portNumber * 10 + (digit - _ZERO);
+        }
+        port = _makePort(portNumber, scheme);
+        hostEnd = lastColon;
+      }
+      host = _makeHost(uri, hostStart, hostEnd, true);
+      if (index < uri.length) {
+        char = uri.codeUnitAt(index);
+      }
     }
 
-    // At path now.
-    int pathEndIndex = authorityEndIndex;
-    while (pathEndIndex < length) {
-      int codeUnit = uri.codeUnitAt(pathEndIndex++);
-      if (codeUnit == _QUESTION || codeUnit == _NUMBER_SIGN) {
-        pathEndIndex--;
+    // When reaching path parsing, the current character is known to not
+    // be part of the path.
+    const int NOT_IN_PATH = 0;
+    // When reaching path parsing, the current character is part
+    // of the a non-empty path.
+    const int IN_PATH = 1;
+    // When reaching authority parsing, authority is possible.
+    // This is only true at start or right after scheme.
+    const int ALLOW_AUTH = 2;
+
+    // Current state.
+    // Initialized to the default value that is used when exiting the
+    // scheme loop by reaching the end of input.
+    // All other breaks set their own state.
+    int state = NOT_IN_PATH;
+    int i = index;  // Temporary alias for index to avoid bug 19550 in dart2js.
+    while (i < uri.length) {
+      char = uri.codeUnitAt(i);
+      if (char == _QUESTION || char == _NUMBER_SIGN) {
+        state = NOT_IN_PATH;
         break;
       }
+      if (char == _SLASH) {
+        state = (i == 0) ? ALLOW_AUTH : IN_PATH;
+        break;
+      }
+      if (char == _COLON) {
+        if (i == 0) _fail(uri, 0, "Invalid empty scheme");
+        scheme = _makeScheme(uri, i);
+        i++;
+        pathStart = i;
+        if (i == uri.length) {
+          char = EOI;
+          state = NOT_IN_PATH;
+        } else {
+          char = uri.codeUnitAt(i);
+          if (char == _QUESTION || char == _NUMBER_SIGN) {
+            state = NOT_IN_PATH;
+          } else if (char == _SLASH) {
+            state = ALLOW_AUTH;
+          } else {
+            state = IN_PATH;
+          }
+        }
+        break;
+      }
+      i++;
+      char = EOI;
+    }
+    index = i;  // Remove alias when bug is fixed.
+
+    if (state == ALLOW_AUTH) {
+      assert(char == _SLASH);
+      // Have seen one slash either at start or right after scheme.
+      // If two slashes, it's an authority, otherwise it's just the path.
+      index++;
+      if (index == uri.length) {
+        char = EOI;
+        state = NOT_IN_PATH;
+      } else {
+        char = uri.codeUnitAt(index);
+        if (char == _SLASH) {
+          index++;
+          parseAuth();
+          pathStart = index;
+        }
+        if (char == _QUESTION || char == _NUMBER_SIGN || char == EOI) {
+          state = NOT_IN_PATH;
+        } else {
+          state = IN_PATH;
+        }
+      }
     }
 
-    // Maybe query.
-    int queryEndIndex = pathEndIndex;
-    if (queryEndIndex < length && uri.codeUnitAt(queryEndIndex) == _QUESTION) {
-      while (queryEndIndex < length) {
-        int codeUnit = uri.codeUnitAt(queryEndIndex++);
-        if (codeUnit == _NUMBER_SIGN) {
-          queryEndIndex--;
+    assert(state == IN_PATH || state == NOT_IN_PATH);
+    if (state == IN_PATH) {
+      // Characters from pathStart to index (inclusive) are known
+      // to be part of the path.
+      while (++index < uri.length) {
+        char = uri.codeUnitAt(index);
+        if (char == _QUESTION || char == _NUMBER_SIGN) {
           break;
         }
+        char = EOI;
       }
+      state = NOT_IN_PATH;
     }
 
-    var scheme = null;
-    if (schemeEndIndex > 0) {
-      scheme = uri.substring(0, schemeEndIndex - 1);
-    }
+    assert(state == NOT_IN_PATH);
+    bool ensureLeadingSlash = (host != "" || scheme == "file");
+    path = _makePath(uri, pathStart, index, null, ensureLeadingSlash);
 
-    var host = "";
-    var userInfo = "";
-    var port = 0;
-    if (schemeEndIndex != authorityEndIndex) {
-      int startIndex = schemeEndIndex + 2;
-      if (userInfoEndIndex > 0) {
-        userInfo = uri.substring(startIndex, userInfoEndIndex);
-        startIndex = userInfoEndIndex + 1;
-      }
-      if (portIndex > 0) {
-        var portStr = uri.substring(portIndex, authorityEndIndex);
-        try {
-          port = int.parse(portStr);
-        } catch (_) {
-          throw new FormatException("Invalid port: '$portStr'");
-        }
-        host = uri.substring(startIndex, portIndex - 1);
+    if (char == _QUESTION) {
+      int numberSignIndex = uri.indexOf('#', index + 1);
+      if (numberSignIndex < 0) {
+        query = _makeQuery(uri, index + 1, uri.length, null);
       } else {
-        host = uri.substring(startIndex, authorityEndIndex);
+        query = _makeQuery(uri, index + 1, numberSignIndex, null);
+        fragment = _makeFragment(uri, numberSignIndex + 1, uri.length);
       }
+    } else if (char == _NUMBER_SIGN) {
+      fragment = _makeFragment(uri, index + 1, uri.length);
     }
-
-    var path = uri.substring(authorityEndIndex, pathEndIndex);
-    var query = "";
-    if (pathEndIndex < queryEndIndex) {
-      query = uri.substring(pathEndIndex + 1, queryEndIndex);
-    }
-    var fragment = "";
-    // If queryEndIndex is not at end (length), there is a fragment.
-    if (queryEndIndex < length) {
-      fragment = uri.substring(queryEndIndex + 1, length);
-    }
-
-    return new Uri(scheme: scheme,
-                   userInfo: userInfo,
-                   host: host,
-                   port: port,
-                   path: path,
-                   query: query,
-                   fragment: fragment);
+    return new Uri._internal(scheme,
+                             userinfo,
+                             host,
+                             port,
+                             path,
+                             query,
+                             fragment);
   }
 
+  // Report a parse failure.
+  static void _fail(String uri, int index, String message) {
+    // TODO(lrn): Consider adding this to FormatException.
+    if (index == uri.length) {
+      message += " at end of input.";
+    } else {
+      message += " at position $index.\n";
+      // Pick a slice of uri containing index and, if
+      // necessary, truncate the ends to ensure the entire
+      // slice fits on one line.
+      int min = 0;
+      int max = uri.length;
+      String pre = "";
+      String post = "";
+      if (uri.length > 78) {
+        min = index - 10;
+        if (min < 0) min = 0;
+        int max = min + 72;
+        if (max > uri.length) {
+          max = uri.length;
+          min = max - 72;
+        }
+        if (min != 0) pre = "...";
+        if (max != uri.length) post = "...";
+      }
+      // Combine message, slice and a caret pointing to the error index.
+      message = "$message$pre${uri.substring(min, max)}$post\n"
+                "${' ' * (pre.length + index - min)}^";
+    }
+    throw new FormatException(message);
+  }
+
+  /// Internal non-verifying constructor. Only call with validated arguments.
+  Uri._internal(this.scheme,
+                this.userInfo,
+                this._host,
+                this._port,
+                this._path,
+                this.query,
+                this.fragment);
+
   /**
    * Creates a new URI from its components.
    *
@@ -359,6 +423,7 @@
    * [host]. The host can either be a hostname, an IPv4 address or an
    * IPv6 address, contained in '[' and ']'. If the host contains a
    * ':' character, the '[' and ']' are added if not already provided.
+   * The host is normalized to all lowercase letters.
    *
    * The port part of the authority component is set through
    * [port]. The port is normalized for scheme http and https where
@@ -386,29 +451,27 @@
    *
    * The fragment component is set through [fragment].
    */
-  Uri({String scheme,
-       this.userInfo: "",
+  factory Uri({String scheme,
+       String userInfo: "",
        String host: "",
        port: 0,
        String path,
        Iterable<String> pathSegments,
        String query,
        Map<String, String> queryParameters,
-       fragment: ""}) :
-      scheme = _makeScheme(scheme),
-      _host = _makeHost(host),
-      query = _makeQuery(query, queryParameters),
-      fragment = _makeFragment(fragment) {
-    // Perform scheme specific normalization.
-    if (scheme == "http" && port == 80) {
-      _port = 0;
-    } else if (scheme == "https" && port == 443) {
-      _port = 0;
-    } else {
-      _port = port;
-    }
-    // Fill the path.
-    _path = _makePath(path, pathSegments);
+       fragment: ""}) {
+    scheme = _makeScheme(scheme, _stringOrNullLength(scheme));
+    userInfo = _makeUserInfo(userInfo, 0, _stringOrNullLength(userInfo));
+    host = _makeHost(host, 0, _stringOrNullLength(host), false);
+    query = _makeQuery(query, 0, _stringOrNullLength(query), queryParameters);
+    fragment = _makeFragment(fragment, 0, _stringOrNullLength(fragment));
+    port = _makePort(port, scheme);
+    bool ensureLeadingSlash = (host != "" || scheme == "file");
+    path = _makePath(path, 0, _stringOrNullLength(path), pathSegments,
+                     ensureLeadingSlash);
+
+    return new Uri._internal(scheme, userInfo, host, port,
+                             path, query, fragment);
   }
 
   /**
@@ -416,11 +479,19 @@
    *
    * Examples:
    *
-   *     // Create the URI http://example.org/path?q=abc.
-   *     new Uri.http("google.com", "/search", { "q" : "dart" });http://example.org/path?q=abc.
-   *     new Uri.http("user:pass@localhost:8080, "");  // http://user:pass@localhost:8080/
-   *     new Uri.http("example.org, "a b");  // http://example.org/a%20b
-   *     new Uri.http("example.org, "/a%2F");  // http://example.org/a%25%2F
+   * ```
+   * // http://example.org/path?q=dart.
+   * new Uri.http("google.com", "/search", { "q" : "dart" });
+   *
+   * // http://user:pass@localhost:8080
+   * new Uri.http("user:pass@localhost:8080", "");
+   *
+   * // http://example.org/a%20b
+   * new Uri.http("example.org", "a b");
+   *
+   * // http://example.org/a%252F
+   * new Uri.http("example.org", "/a%2F");
+   * ```
    *
    * The `scheme` is always set to `http`.
    *
@@ -481,7 +552,7 @@
       if (hostEnd == authority.length) {
         throw new FormatException("Invalid IPv6 host entry.");
       }
-      parseIPv6Address(authority.substring(hostStart + 1, hostEnd));
+      parseIPv6Address(authority, hostStart + 1, hostEnd);
       hostEnd++;  // Skip the closing bracket.
       if (hostEnd != authority.length &&
           authority.codeUnitAt(hostEnd) != _COLON) {
@@ -540,26 +611,52 @@
    * a value for [windows]. Passing `true` will use Windows
    * semantics and passing `false` will use non-Windows semantics.
    *
-   * Examples using non-Windows semantics (resulting URI in comment):
+   * Examples using non-Windows semantics:
    *
-   *     new Uri.file("xxx/yyy");  // xxx/yyy
-   *     new Uri.file("xxx/yyy/");  // xxx/yyy/
-   *     new Uri.file("/xxx/yyy");  // file:///xxx/yyy
-   *     new Uri.file("/xxx/yyy/");  // file:///xxx/yyy/
-   *     new Uri.file("C:");  // C:
+   * ```
+   * // xxx/yyy
+   * new Uri.file("xxx/yyy", windows: false);
    *
-   * Examples using Windows semantics (resulting URI in comment):
+   * // xxx/yyy/
+   * new Uri.file("xxx/yyy/", windows: false);
    *
-   *     new Uri.file(r"xxx\yyy");  // xxx/yyy
-   *     new Uri.file(r"xxx\yyy\");  // xxx/yyy/
-   *     new Uri.file(r"\xxx\yyy");  // file:///xxx/yyy
-   *     new Uri.file(r"\xxx\yyy/");  // file:///xxx/yyy/
-   *     new Uri.file(r"C:\xxx\yyy");  // file:///C:/xxx/yyy
-   *     new Uri.file(r"C:xxx\yyy");  // Throws as path with drive letter
-   *                                  // is not absolute.
-   *     new Uri.file(r"\\server\share\file");  // file://server/share/file
-   *     new Uri.file(r"C:");  // Throws as path with drive letter
-   *                           // is not absolute.
+   * // file:///xxx/yyy
+   * new Uri.file("/xxx/yyy", windows: false);
+   *
+   * // file:///xxx/yyy/
+   * new Uri.file("/xxx/yyy/", windows: false);
+   *
+   * // C:
+   * new Uri.file("C:", windows: false);
+   * ```
+   *
+   * Examples using Windows semantics:
+   *
+   * ```
+   * // xxx/yyy
+   * new Uri.file(r"xxx\yyy", windows: true);
+   *
+   * // xxx/yyy/
+   * new Uri.file(r"xxx\yyy\", windows: true);
+   *
+   * file:///xxx/yyy
+   * new Uri.file(r"\xxx\yyy", windows: true);
+   *
+   * file:///xxx/yyy/
+   * new Uri.file(r"\xxx\yyy/", windows: true);
+   *
+   * // file:///C:/xxx/yyy
+   * new Uri.file(r"C:\xxx\yyy", windows: true);
+   *
+   * // This throws an error. A path with a drive letter is not absolute.
+   * new Uri.file(r"C:", windows: true);
+   *
+   * // This throws an error. A path with a drive letter is not absolute.
+   * new Uri.file(r"C:xxx\yyy", windows: true);
+   *
+   * // file://server/share/file
+   * new Uri.file(r"\\server\share\file", windows: true);
+   * ```
    *
    * If the path passed is not a legal file path [ArgumentError] is thrown.
    */
@@ -731,75 +828,193 @@
     return _queryParameters;
   }
 
-  static String _makeHost(String host) {
-    if (host == null || host.isEmpty) return host;
-    if (host.codeUnitAt(0) == _LEFT_BRACKET) {
-      if (host.codeUnitAt(host.length - 1) != _RIGHT_BRACKET) {
-        throw new FormatException('Missing end `]` to match `[` in host');
-      }
-      parseIPv6Address(host.substring(1, host.length - 1));
-      return host;
+  static int _makePort(int port, String scheme) {
+    // Perform scheme specific normalization.
+    if (port == 80 && scheme == "http") {
+      return 0;
     }
-    for (int i = 0; i < host.length; i++) {
-      if (host.codeUnitAt(i) == _COLON) {
-        parseIPv6Address(host);
-        return '[$host]';
-      }
+    if (port == 443 && scheme == "https") {
+      return 0;
     }
-    return host;
+    return port;
   }
 
-  static String _makeScheme(String scheme) {
-    bool isSchemeLowerCharacter(int ch) {
-      return ch < 128 &&
-             ((_schemeLowerTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
-    }
+  /**
+   * Check and normalize a most name.
+   *
+   * If the host name starts and ends with '[' and ']', it is considered an
+   * IPv6 address. If [strictIPv6] is false, the address is also considered
+   * an IPv6 address if it contains any ':' character.
+   *
+   * If it is not an IPv6 address, it is case- and escape-normalized.
+   * This escapes all characters not valid in a reg-name,
+   * and converts all non-escape upper-case letters to lower-case.
+   */
+  static String _makeHost(String host, int start, int end, bool strictIPv6) {
+    // TODO(lrn): Should we normalize IPv6 addresses according to RFC 5952?
 
-    if (scheme == null) return "";
-    bool allLowercase = true;
-    int length = scheme.length;
-    for (int i = 0; i < length; i++) {
-      int codeUnit = scheme.codeUnitAt(i);
-      if (i == 0 && !_isAlphabeticCharacter(codeUnit)) {
-        // First code unit must be an alphabetic character.
-        throw new ArgumentError('Illegal scheme: $scheme');
+    if (host == null) return null;
+    if (start == end) return "";
+    // Host is an IPv6 address if it starts with '[' or contains a colon.
+    if (host.codeUnitAt(start) == _LEFT_BRACKET) {
+      if (host.codeUnitAt(end - 1) != _RIGHT_BRACKET) {
+        _fail(host, start, 'Missing end `]` to match `[` in host');
       }
-      if (!isSchemeLowerCharacter(codeUnit)) {
-        if (_isSchemeCharacter(codeUnit)) {
-          allLowercase = false;
-        } else {
-          throw new ArgumentError('Illegal scheme: $scheme');
+      parseIPv6Address(host, start + 1, end - 1);
+      // RFC 5952 requires hex digits to be lower case.
+      return host.substring(start, end).toLowerCase();
+    }
+    if (!strictIPv6) {
+      // TODO(lrn): skip if too short to be a valid IPv6 address?
+      for (int i = start; i < end; i++) {
+        if (host.codeUnitAt(i) == _COLON) {
+          parseIPv6Address(host, start, end);
+          return '[$host]';
         }
       }
     }
-
-    return allLowercase ? scheme : scheme.toLowerCase();
+    return _normalizeRegName(host, start, end);
   }
 
-  String _makePath(String path, Iterable<String> pathSegments) {
+  static bool _isRegNameChar(int char) {
+    return char < 127 && (_regNameTable[char >> 4] & (1 << (char & 0xf))) != 0;
+  }
+
+  /**
+   * Validates and does case- and percent-encoding normalization.
+   *
+   * The [host] must be an RFC3986 "reg-name". It is converted
+   * to lower case, and percent escapes are converted to either
+   * lower case unreserved characters or upper case escapes.
+   */
+  static String _normalizeRegName(String host, int start, int end) {
+    StringBuffer buffer;
+    int sectionStart = start;
+    int index = start;
+    // Whether all characters between sectionStart and index are normalized,
+    bool isNormalized = true;
+
+    while (index < end) {
+      int char = host.codeUnitAt(index);
+      if (char == _PERCENT) {
+        // The _regNameTable contains "%", so we check that first.
+        String replacement = _normalizeEscape(host, index, true);
+        if (replacement == null && isNormalized) {
+          index += 3;
+          continue;
+        }
+        if (buffer == null) buffer = new StringBuffer();
+        String slice = host.substring(sectionStart, index);
+        if (!isNormalized) slice = slice.toLowerCase();
+        buffer.write(slice);
+        int sourceLength = 3;
+        if (replacement == null) {
+          replacement = host.substring(index, index + 3);
+        } else if (replacement == "%") {
+          replacement = "%25";
+          sourceLength = 1;
+        }
+        buffer.write(replacement);
+        index += sourceLength;
+        sectionStart = index;
+        isNormalized = true;
+      } else if (_isRegNameChar(char)) {
+        if (isNormalized && _UPPER_CASE_A <= char && _UPPER_CASE_Z >= char) {
+          // Put initial slice in buffer and continue in non-normalized mode
+          if (buffer == null) buffer = new StringBuffer();
+          if (sectionStart < index) {
+            buffer.write(host.substring(sectionStart, index));
+            sectionStart = index;
+          }
+          isNormalized = false;
+        }
+        index++;
+      } else if (_isGeneralDelimiter(char)) {
+        _fail(host, index, "Invalid character");
+      } else {
+        int sourceLength = 1;
+        if ((char & 0xFC00) == 0xD800 && (index + 1) < end) {
+          int tail = host.codeUnitAt(index + 1);
+          if ((tail & 0xFC00) == 0xDC00) {
+            char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
+            sourceLength = 2;
+          }
+        }
+        if (buffer == null) buffer = new StringBuffer();
+        String slice = host.substring(sectionStart, index);
+        if (!isNormalized) slice = slice.toLowerCase();
+        buffer.write(slice);
+        buffer.write(_escapeChar(char));
+        index += sourceLength;
+        sectionStart = index;
+      }
+    }
+    if (buffer == null) return host.substring(start, end);
+    if (sectionStart < end) {
+      String slice = host.substring(sectionStart, end);
+      if (!isNormalized) slice = slice.toLowerCase();
+      buffer.write(slice);
+    }
+    return buffer.toString();
+  }
+
+  /**
+   * Validates scheme characters and does case-normalization.
+   *
+   * Schemes are converted to lower case. They cannot contain escapes.
+   */
+  static String _makeScheme(String scheme, int end) {
+    if (end == 0) return "";
+    int char = scheme.codeUnitAt(0);
+    if (!_isAlphabeticCharacter(char)) {
+      _fail(scheme, 0, "Scheme not starting with alphabetic character");
+    }
+    bool allLowercase = char >= _LOWER_CASE_A;
+    for (int i = 0; i < end; i++) {
+      int codeUnit = scheme.codeUnitAt(i);
+      if (!_isSchemeCharacter(codeUnit)) {
+        _fail(scheme, i, "Illegal scheme character");
+      }
+      if (_LOWER_CASE_A <= char && _LOWER_CASE_Z >= char) {
+        allLowercase = false;
+      }
+    }
+    scheme = scheme.substring(0, end);
+    if (!allLowercase) scheme = scheme.toLowerCase();
+    return scheme;
+  }
+
+  static String _makeUserInfo(String userInfo, int start, int end) {
+    if (userInfo == null) return "null";
+    return _normalize(userInfo, start, end, _userinfoTable);
+  }
+
+  static String _makePath(String path, int start, int end,
+                          Iterable<String> pathSegments,
+                          bool ensureLeadingSlash) {
     if (path == null && pathSegments == null) return "";
     if (path != null && pathSegments != null) {
       throw new ArgumentError('Both path and pathSegments specified');
     }
     var result;
     if (path != null) {
-      result = _normalize(path);
+      result = _normalize(path, start, end, _pathCharOrSlashTable);
     } else {
       result = pathSegments.map((s) => _uriEncode(_pathCharTable, s)).join("/");
     }
-    if ((hasAuthority || (scheme == "file")) &&
-        result.isNotEmpty && !result.startsWith("/")) {
+    if (ensureLeadingSlash && result.isNotEmpty && !result.startsWith("/")) {
       return "/$result";
     }
     return result;
   }
 
-  static String _makeQuery(String query, Map<String, String> queryParameters) {
+  static String _makeQuery(String query, int start, int end,
+                           Map<String, String> queryParameters) {
     if (query == null && queryParameters == null) return "";
     if (query != null && queryParameters != null) {
       throw new ArgumentError('Both query and queryParameters specified');
     }
-    if (query != null) return _normalize(query);
+    if (query != null) return _normalize(query, start, end, _queryCharTable);
 
     var result = new StringBuffer();
     var first = true;
@@ -817,123 +1032,184 @@
     return result.toString();
   }
 
-  static String _makeFragment(String fragment) {
+  static String _makeFragment(String fragment, int start, int end) {
     if (fragment == null) return "";
-    return _normalize(fragment);
+    return _normalize(fragment, start, end, _queryCharTable);
   }
 
-  static String _normalize(String component) {
-    int index = component.indexOf('%');
-    if (index < 0) return component;
+  static int _stringOrNullLength(String s) => (s == null) ? 0 : s.length;
 
-    bool isNormalizedHexDigit(int digit) {
-      return (_ZERO <= digit && digit <= _NINE) ||
-          (_UPPER_CASE_A <= digit && digit <= _UPPER_CASE_F);
+  static bool _isHexDigit(int char) {
+    if (_NINE >= char) return _ZERO <= char;
+    char |= 0x20;
+    return _LOWER_CASE_A <= char && _LOWER_CASE_F >= char;
+  }
+
+  static int _hexValue(int char) {
+    assert(_isHexDigit(char));
+    if (_NINE >= char) return char - _ZERO;
+    char |= 0x20;
+    return char - (_LOWER_CASE_A - 10);
+  }
+
+  /**
+   * Performs RFC 3986 Percent-Encoding Normalization.
+   *
+   * Returns a replacement string that should be replace the original escape.
+   * Returns null if no replacement is necessary because the escape is
+   * not for an unreserved character and is already non-lower-case.
+   *
+   * Returns "%" if the escape is invalid (not two valid hex digits following
+   * the percent sign). The calling code should replace the percent
+   * sign with "%25", but leave the following two characters unmodified.
+   *
+   * If [lowerCase] is true, a single character returned is always lower case,
+   */
+  static String _normalizeEscape(String source, int index, bool lowerCase) {
+    assert(source.codeUnitAt(index) == _PERCENT);
+    if (index + 2 >= source.length) {
+      return "%";  // Marks the escape as invalid.
     }
-
-    bool isLowerCaseHexDigit(int digit) {
-      return _LOWER_CASE_A <= digit && digit <= _LOWER_CASE_F;
+    int firstDigit = source.codeUnitAt(index + 1);
+    int secondDigit = source.codeUnitAt(index + 2);
+    if (!_isHexDigit(firstDigit) || !_isHexDigit(secondDigit)) {
+      return "%";  // Marks the escape as invalid.
     }
-
-    bool isUnreserved(int ch) {
-      return ch < 128 &&
-             ((_unreservedTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+    int value = _hexValue(firstDigit) * 16 + _hexValue(secondDigit);
+    if (_isUnreservedChar(value)) {
+      if (lowerCase && _UPPER_CASE_A <= value && _UPPER_CASE_Z >= value) {
+        value |= 0x20;
+      }
+      return new String.fromCharCode(value);
     }
+    if (firstDigit >= _LOWER_CASE_A || secondDigit >= _LOWER_CASE_A) {
+      // Either digit is lower case.
+      return source.substring(index, index + 3).toUpperCase();
+    }
+    // Escape is retained, and is already non-lower case, so return null to
+    // represent "no replacement necessary".
+    return null;
+  }
 
-    int normalizeHexDigit(int index) {
-      var codeUnit = component.codeUnitAt(index);
-      if (isLowerCaseHexDigit(codeUnit)) {
-        return codeUnit - 0x20;
-      } else if (!isNormalizedHexDigit(codeUnit)) {
-        throw new ArgumentError("Invalid URI component: $component");
-      } else {
-        return codeUnit;
+  static bool _isUnreservedChar(int ch) {
+    return ch < 127 &&
+           ((_unreservedTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+  }
+
+  static String _escapeChar(char) {
+    assert(char <= 0x10ffff);  // It's a valid unicode code point.
+    const hexDigits = "0123456789ABCDEF";
+    List codeUnits;
+    if (char < 0x80) {
+      // ASCII, a single percent encoded sequence.
+      codeUnits = new List(3);
+      codeUnits[0] = _PERCENT;
+      codeUnits[1] = hexDigits.codeUnitAt(char >> 4);
+      codeUnits[2] = hexDigits.codeUnitAt(char & 0xf);
+    } else {
+      // Do UTF-8 encoding of character, then percent encode bytes.
+      int flag = 0xc0;  // The high-bit markers on the first byte of UTF-8.
+      int encodedBytes = 2;
+      if (char > 0x7ff) {
+        flag = 0xe0;
+        encodedBytes = 3;
+        if (char > 0xffff) {
+          encodedBytes = 4;
+          flag = 0xf0;
+        }
+      }
+      codeUnits = new List(3 * encodedBytes);
+      int index = 0;
+      while (--encodedBytes >= 0) {
+        int byte = ((char >> (6 * encodedBytes)) & 0x3f) | flag;
+        codeUnits[index] = _PERCENT;
+        codeUnits[index + 1] = hexDigits.codeUnitAt(byte >> 4);
+        codeUnits[index + 2] = hexDigits.codeUnitAt(byte & 0xf);
+        index += 3;
+        flag = 0x80;  // Following bytes have only high bit set.
       }
     }
+    return new String.fromCharCodes(codeUnits);
+  }
 
-    int decodeHexDigitPair(int index) {
-      int byte = 0;
-      for (int i = 0; i < 2; i++) {
-        var codeUnit = component.codeUnitAt(index + i);
-        if (_ZERO <= codeUnit && codeUnit <= _NINE) {
-          byte = byte * 16 + codeUnit - _ZERO;
-        } else {
-          // Check ranges A-F (0x41-0x46) and a-f (0x61-0x66).
-          codeUnit |= 0x20;
-          if (_LOWER_CASE_A <= codeUnit &&
-              codeUnit <= _LOWER_CASE_F) {
-            byte = byte * 16 + codeUnit - _LOWER_CASE_A + 10;
-          } else {
-            throw new ArgumentError(
-                "Invalid percent-encoding in URI component: $component");
+  /**
+   * Runs through component checking that each character is valid and
+   * normalize percent escapes.
+   *
+   * Uses [charTable] to check if a non-`%` character is allowed.
+   * Each `%` character must be followed by two hex digits.
+   * If the hex-digits are lower case letters, they are converted to
+   * upper case.
+   */
+  static String _normalize(String component, int start, int end,
+                           List<int> charTable) {
+    StringBuffer buffer;
+    int sectionStart = start;
+    int index = start;
+    // Loop while characters are valid and escapes correct and upper-case.
+    while (index < end) {
+      int char = component.codeUnitAt(index);
+      if (char < 127 && (charTable[char >> 4] & (1 << (char & 0x0f))) != 0) {
+        index++;
+      } else {
+        String replacement;
+        int sourceLength;
+        if (char == _PERCENT) {
+          replacement = _normalizeEscape(component, index, false);
+          // Returns null if we should keep the existing escape.
+          if (replacement == null) {
+            index += 3;
+            continue;
           }
-        }
-      }
-      return byte;
-    }
-
-    // Start building the normalized component string.
-    StringBuffer result;
-    int length = component.length;
-    int prevIndex = 0;
-
-    // Copy a part of the component string to the result.
-    void fillResult() {
-      if (result == null) {
-        assert(prevIndex == 0);
-        result = new StringBuffer(component.substring(prevIndex, index));
-      } else {
-        result.write(component.substring(prevIndex, index));
-      }
-    }
-
-    while (index < length) {
-      // Normalize percent-encoding to uppercase and don't encode
-      // unreserved characters.
-      assert(component.codeUnitAt(index) == _PERCENT);
-      if (length < index + 2) {
-          throw new ArgumentError(
-              "Invalid percent-encoding in URI component: $component");
-      }
-
-      var codeUnit1 = component.codeUnitAt(index + 1);
-      var codeUnit2 = component.codeUnitAt(index + 2);
-      var decodedCodeUnit = decodeHexDigitPair(index + 1);
-      if (isNormalizedHexDigit(codeUnit1) &&
-          isNormalizedHexDigit(codeUnit2) &&
-          !isUnreserved(decodedCodeUnit)) {
-        index += 3;
-      } else {
-        fillResult();
-        if (isUnreserved(decodedCodeUnit)) {
-          result.writeCharCode(decodedCodeUnit);
+          // Returns "%" if we should escape the existing percent.
+          if ("%" == replacement) {
+            replacement = "%25";
+            sourceLength = 1;
+          } else {
+            sourceLength = 3;
+          }
+        } else if (_isGeneralDelimiter(char)) {
+          _fail(component, index, "Invalid character");
         } else {
-          result.write("%");
-          result.writeCharCode(normalizeHexDigit(index + 1));
-          result.writeCharCode(normalizeHexDigit(index + 2));
+          sourceLength = 1;
+          if ((char & 0xFC00) == 0xD800) {
+            // Possible lead surrogate.
+            if (index + 1 < end) {
+              int tail = component.codeUnitAt(index + 1);
+              if ((tail & 0xFC00) == 0xDC00) {
+                // Tail surrogat.
+                sourceLength = 2;
+                char = 0x10000 | ((char & 0x3ff) << 10) | (tail & 0x3ff);
+              }
+            }
+          }
+          replacement = _escapeChar(char);
         }
-        index += 3;
-        prevIndex = index;
-      }
-      int next = component.indexOf('%', index);
-      if (next >= index) {
-        index = next;
-      } else {
-        index = length;
+        if (buffer == null) buffer = new StringBuffer();
+        buffer.write(component.substring(sectionStart, index));
+        buffer.write(replacement);
+        index += sourceLength;
+        sectionStart = index;
       }
     }
-    if (result == null) return component;
-
-    if (result != null && prevIndex != index) fillResult();
-    assert(index == length);
-
-    return result.toString();
+    if (buffer == null) {
+      // Makes no copy if start == 0 and end == component.length.
+      return component.substring(start, end);
+    }
+    if (sectionStart < end) {
+      buffer.write(component.substring(sectionStart, end));
+    }
+    return buffer.toString();
   }
 
   static bool _isSchemeCharacter(int ch) {
     return ch < 128 && ((_schemeTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
   }
 
+  static bool _isGeneralDelimiter(int ch) {
+    return ch <= _RIGHT_BRACKET &&
+        ((_genDelimitersTable[ch >> 4] & (1 << (ch & 0x0f))) != 0);
+  }
 
   /**
    * Returns whether the URI is absolute.
@@ -1206,7 +1482,9 @@
   String toString() {
     StringBuffer sb = new StringBuffer();
     _addIfNonEmpty(sb, scheme, scheme, ':');
-    if (hasAuthority || (scheme == "file")) {
+    if (hasAuthority || path.startsWith("//") || (scheme == "file")) {
+      // File URIS always have the authority, even if it is empty.
+      // The empty URI means "localhost".
       sb.write("//");
       _writeAuthority(sb);
     }
@@ -1431,6 +1709,9 @@
    * Throws a [FormatException] if [host] is not a valid IPv6 address
    * representation.
    *
+   * Acts on the substring from [start] to [end]. If [end] is omitted, it
+   * defaults ot the end of the string.
+   *
    * Some examples of IPv6 addresses:
    *  * ::1
    *  * FEDC:BA98:7654:3210:FEDC:BA98:7654:3210
@@ -1438,7 +1719,8 @@
    *  * ::FFFF:129.144.52.38
    *  * 2010:836B:4179::836B:4179
    */
-  static List<int> parseIPv6Address(String host) {
+  static List<int> parseIPv6Address(String host, [int start = 0, int end]) {
+    if (end == null) end = host.length;
     // An IPv6 address consists of exactly 8 parts of 1-4 hex digits, seperated
     // by `:`'s, with the following exceptions:
     //
@@ -1461,11 +1743,11 @@
     if (host.length < 2) error('address is too short');
     List<int> parts = [];
     bool wildcardSeen = false;
-    int partStart = 0;
+    int partStart = start;
     // Parse all parts, except a potential last one.
-    for (int i = 0; i < host.length; i++) {
+    for (int i = start; i < end; i++) {
       if (host.codeUnitAt(i) == _COLON) {
-        if (i == 0) {
+        if (i == start) {
           // If we see a `:` in the beginning, expect wildcard.
           i++;
           if (host.codeUnitAt(i) != _COLON) {
@@ -1488,18 +1770,18 @@
       }
     }
     if (parts.length == 0) error('too few parts');
-    bool atEnd = partStart == host.length;
-    bool isLastWildcard = parts.last == -1;
+    bool atEnd = (partStart == end);
+    bool isLastWildcard = (parts.last == -1);
     if (atEnd && !isLastWildcard) {
       error('expected a part after last `:`');
     }
     if (!atEnd) {
       try {
-        parts.add(parseHex(partStart, host.length));
+        parts.add(parseHex(partStart, end));
       } catch (e) {
         // Failed to parse the last chunk as hex. Try IPv4.
         try {
-          List<int> last = parseIPv4Address(host.substring(partStart));
+          List<int> last = parseIPv4Address(host.substring(partStart, end));
           parts.add(last[0] << 8 | last[1]);
           parts.add(last[2] << 8 | last[3]);
         } catch (e) {
@@ -1515,15 +1797,23 @@
       error('an address without a wildcard must contain exactly 8 parts');
     }
     // TODO(ajohnsen): Consider using Uint8List.
-    return parts
-        .expand((value) {
-          if (value == -1) {
-            return new List.filled((9 - parts.length) * 2, 0);
-          } else {
-            return [(value >> 8) & 0xFF, value & 0xFF];
-          }
-        })
-        .toList();
+    List bytes = new List<int>(16);
+    for (int i = 0, index = 0; i < parts.length; i++) {
+      int value = parts[i];
+      if (value == -1) {
+        int wildCardLength = 9 - parts.length;
+        for (int j = 0; j < wildCardLength; j++) {
+          bytes[index] = 0;
+          bytes[index + 1] = 0;
+          index += 2;
+        }
+      } else {
+        bytes[index] = value >> 8;
+        bytes[index + 1] = value & 0xff;
+        index += 2;
+      }
+    }
+    return bytes;
   }
 
   // Frequently used character codes.
@@ -1713,7 +2003,7 @@
       0x0000,   // 0x00 - 0x0f  0000000000000000
       0x0000,   // 0x10 - 0x1f  0000000000000000
                 //               ! #$ &'()*+,-./
-      0xf7da,   // 0x20 - 0x2f  0101101111101111
+      0xffda,   // 0x20 - 0x2f  0101101111111111
                 //              0123456789:; = ?
       0xafff,   // 0x30 - 0x3f  1111111111110101
                 //              @ABCDEFGHIJKLMNO
@@ -1786,6 +2076,48 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 
+  // General delimiter characters, RFC 3986 section 2.2.
+  // gen-delims  = ":" / "/" / "?" / "#" / "[" / "]" / "@"
+  //
+  static const _genDelimitersTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //                 #           /
+      0x8008,   // 0x20 - 0x2f  0001000000000001
+                //                        :    ?
+      0x8400,   // 0x30 - 0x3f  0000000000100001
+                //              @
+      0x0001,   // 0x40 - 0x4f  1000000000000000
+                //                         [ ]
+      0x2800,   // 0x50 - 0x5f  0000000000010100
+                //
+      0x0000,   // 0x60 - 0x6f  0000000000000000
+                //
+      0x0000];  // 0x70 - 0x7f  0000000000000000
+
+  // Characters allowed in the userinfo as of RFC 3986.
+  // RFC 3986 Apendix A
+  // userinfo = *( unreserved / pct-encoded / sub-delims / ':')
+  static const _userinfoTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //               !  $ &'()*+,-.
+      0x7fd2,   // 0x20 - 0x2f  0100101111111110
+                //              0123456789:; =
+      0x2fff,   // 0x30 - 0x3f  1111111111110100
+                //               ABCDEFGHIJKLMNO
+      0xfffe,   // 0x40 - 0x4f  0111111111111111
+                //              PQRSTUVWXYZ    _
+      0x87ff,   // 0x50 - 0x5f  1111111111100001
+                //               abcdefghijklmno
+      0xfffe,   // 0x60 - 0x6f  0111111111111111
+                //              pqrstuvwxyz   ~
+      0x47ff];  // 0x70 - 0x7f  1111111111100010
+
   // Characters allowed in the reg-name as of RFC 3986.
   // RFC 3986 Apendix A
   // reg-name = *( unreserved / pct-encoded / sub-delims )
@@ -1828,6 +2160,27 @@
                 //              pqrstuvwxyz   ~
       0x47ff];  // 0x70 - 0x7f  1111111111100010
 
+  // Characters allowed in the path as of RFC 3986.
+  // RFC 3986 section 3.3 *and* slash.
+  static const _pathCharOrSlashTable = const [
+                //             LSB            MSB
+                //              |              |
+      0x0000,   // 0x00 - 0x0f  0000000000000000
+      0x0000,   // 0x10 - 0x1f  0000000000000000
+                //               !  $ &'()*+,-./
+      0xffd2,   // 0x20 - 0x2f  0100101111111111
+                //              0123456789:; =
+      0x2fff,   // 0x30 - 0x3f  1111111111110100
+                //              @ABCDEFGHIJKLMNO
+      0xffff,   // 0x40 - 0x4f  1111111111111111
+
+                //              PQRSTUVWXYZ    _
+      0x87ff,   // 0x50 - 0x5f  1111111111100001
+                //               abcdefghijklmno
+      0xfffe,   // 0x60 - 0x6f  0111111111111111
+                //              pqrstuvwxyz   ~
+      0x47ff];  // 0x70 - 0x7f  1111111111100010
+
   // Characters allowed in the query as of RFC 3986.
   // RFC 3986 section 3.4.
   // query = *( pchar / "/" / "?" )
diff --git a/sdk/lib/html/dartium/html_dartium.dart b/sdk/lib/html/dartium/html_dartium.dart
index b7ff13b..839930e 100644
--- a/sdk/lib/html/dartium/html_dartium.dart
+++ b/sdk/lib/html/dartium/html_dartium.dart
@@ -110,384 +110,384 @@
   return _Utils.spawnDomUri(uri.toString());
 }
 // FIXME: Can we make this private?
-const htmlBlinkMap = const {
-  '_HistoryCrossFrame': _HistoryCrossFrame,
-  '_LocationCrossFrame': _LocationCrossFrame,
-  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+final htmlBlinkMap = {
+  '_HistoryCrossFrame': () => _HistoryCrossFrame,
+  '_LocationCrossFrame': () => _LocationCrossFrame,
+  '_DOMWindowCrossFrame': () => _DOMWindowCrossFrame,
   // FIXME: Move these to better locations.
-  'DateTime': DateTime,
-  'JsObject': js.JsObject,
-  'JsFunction': js.JsFunction,
-  'JsArray': js.JsArray,
-  'AbstractWorker': AbstractWorker,
-  'Algorithm': Algorithm,
-  'Animation': Animation,
-  'ApplicationCache': ApplicationCache,
-  'Attr': _Attr,
-  'AutocompleteErrorEvent': AutocompleteErrorEvent,
-  'BarProp': BarProp,
-  'BeforeLoadEvent': BeforeLoadEvent,
-  'BeforeUnloadEvent': BeforeUnloadEvent,
-  'Blob': Blob,
-  'CDATASection': CDataSection,
-  'CSS': Css,
-  'CSSCharsetRule': CssCharsetRule,
-  'CSSFontFaceLoadEvent': CssFontFaceLoadEvent,
-  'CSSFontFaceRule': CssFontFaceRule,
-  'CSSImportRule': CssImportRule,
-  'CSSKeyframeRule': CssKeyframeRule,
-  'CSSKeyframesRule': CssKeyframesRule,
-  'CSSMediaRule': CssMediaRule,
-  'CSSPageRule': CssPageRule,
-  'CSSPrimitiveValue': _CSSPrimitiveValue,
-  'CSSRule': CssRule,
-  'CSSRuleList': _CssRuleList,
-  'CSSStyleDeclaration': CssStyleDeclaration,
-  'CSSStyleRule': CssStyleRule,
-  'CSSStyleSheet': CssStyleSheet,
-  'CSSSupportsRule': CssSupportsRule,
-  'CSSUnknownRule': _CSSUnknownRule,
-  'CSSValue': _CSSValue,
-  'CSSValueList': _CssValueList,
-  'CSSViewportRule': CssViewportRule,
-  'Canvas2DContextAttributes': Canvas2DContextAttributes,
-  'CanvasGradient': CanvasGradient,
-  'CanvasPattern': CanvasPattern,
-  'CanvasRenderingContext': CanvasRenderingContext,
-  'CanvasRenderingContext2D': CanvasRenderingContext2D,
-  'CharacterData': CharacterData,
-  'ChildNode': ChildNode,
-  'ClientRect': _ClientRect,
-  'ClientRectList': _ClientRectList,
-  'Clipboard': DataTransfer,
-  'CloseEvent': CloseEvent,
-  'Comment': Comment,
-  'CompositionEvent': CompositionEvent,
-  'Console': Console,
-  'ConsoleBase': ConsoleBase,
-  'Coordinates': Coordinates,
-  'Counter': _Counter,
-  'Crypto': Crypto,
-  'CustomEvent': CustomEvent,
-  'DOMError': DomError,
-  'DOMException': DomException,
-  'DOMFileSystem': FileSystem,
-  'DOMFileSystemSync': _DOMFileSystemSync,
-  'DOMImplementation': DomImplementation,
-  'DOMParser': DomParser,
-  'DOMSettableTokenList': DomSettableTokenList,
-  'DOMStringList': DomStringList,
-  'DOMStringMap': DomStringMap,
-  'DOMTokenList': DomTokenList,
-  'DataTransferItem': DataTransferItem,
-  'DataTransferItemList': DataTransferItemList,
-  'DatabaseSync': _DatabaseSync,
-  'DedicatedWorkerGlobalScope': DedicatedWorkerGlobalScope,
-  'DeprecatedStorageInfo': DeprecatedStorageInfo,
-  'DeprecatedStorageQuota': DeprecatedStorageQuota,
-  'DeviceAcceleration': DeviceAcceleration,
-  'DeviceMotionEvent': DeviceMotionEvent,
-  'DeviceOrientationEvent': DeviceOrientationEvent,
-  'DeviceRotationRate': DeviceRotationRate,
-  'DirectoryEntry': DirectoryEntry,
-  'DirectoryEntrySync': _DirectoryEntrySync,
-  'DirectoryReader': DirectoryReader,
-  'DirectoryReaderSync': _DirectoryReaderSync,
-  'Document': Document,
-  'DocumentFragment': DocumentFragment,
-  'DocumentType': _DocumentType,
-  'Element': Element,
-  'Entry': Entry,
-  'EntrySync': _EntrySync,
-  'ErrorEvent': ErrorEvent,
-  'Event': Event,
-  'EventSource': EventSource,
-  'EventTarget': EventTarget,
-  'File': File,
-  'FileEntry': FileEntry,
-  'FileEntrySync': _FileEntrySync,
-  'FileError': FileError,
-  'FileList': FileList,
-  'FileReader': FileReader,
-  'FileReaderSync': _FileReaderSync,
-  'FileWriter': FileWriter,
-  'FileWriterSync': _FileWriterSync,
-  'FocusEvent': FocusEvent,
-  'FontFace': FontFace,
-  'FontFaceSet': FontFaceSet,
-  'FormData': FormData,
-  'Gamepad': Gamepad,
-  'GamepadList': _GamepadList,
-  'Geolocation': Geolocation,
-  'Geoposition': Geoposition,
-  'GlobalEventHandlers': GlobalEventHandlers,
-  'HTMLAllCollection': _HTMLAllCollection,
-  'HTMLAnchorElement': AnchorElement,
-  'HTMLAppletElement': _HTMLAppletElement,
-  'HTMLAreaElement': AreaElement,
-  'HTMLAudioElement': AudioElement,
-  'HTMLBRElement': BRElement,
-  'HTMLBaseElement': BaseElement,
-  'HTMLBodyElement': BodyElement,
-  'HTMLButtonElement': ButtonElement,
-  'HTMLCanvasElement': CanvasElement,
-  'HTMLCollection': HtmlCollection,
-  'HTMLContentElement': ContentElement,
-  'HTMLDListElement': DListElement,
-  'HTMLDataListElement': DataListElement,
-  'HTMLDetailsElement': DetailsElement,
-  'HTMLDialogElement': DialogElement,
-  'HTMLDirectoryElement': _HTMLDirectoryElement,
-  'HTMLDivElement': DivElement,
-  'HTMLDocument': HtmlDocument,
-  'HTMLElement': HtmlElement,
-  'HTMLEmbedElement': EmbedElement,
-  'HTMLFieldSetElement': FieldSetElement,
-  'HTMLFontElement': _HTMLFontElement,
-  'HTMLFormControlsCollection': HtmlFormControlsCollection,
-  'HTMLFormElement': FormElement,
-  'HTMLFrameElement': _HTMLFrameElement,
-  'HTMLFrameSetElement': _HTMLFrameSetElement,
-  'HTMLHRElement': HRElement,
-  'HTMLHeadElement': HeadElement,
-  'HTMLHeadingElement': HeadingElement,
-  'HTMLHtmlElement': HtmlHtmlElement,
-  'HTMLIFrameElement': IFrameElement,
-  'HTMLImageElement': ImageElement,
-  'HTMLInputElement': InputElement,
-  'HTMLKeygenElement': KeygenElement,
-  'HTMLLIElement': LIElement,
-  'HTMLLabelElement': LabelElement,
-  'HTMLLegendElement': LegendElement,
-  'HTMLLinkElement': LinkElement,
-  'HTMLMapElement': MapElement,
-  'HTMLMarqueeElement': _HTMLMarqueeElement,
-  'HTMLMediaElement': MediaElement,
-  'HTMLMenuElement': MenuElement,
-  'HTMLMetaElement': MetaElement,
-  'HTMLMeterElement': MeterElement,
-  'HTMLModElement': ModElement,
-  'HTMLOListElement': OListElement,
-  'HTMLObjectElement': ObjectElement,
-  'HTMLOptGroupElement': OptGroupElement,
-  'HTMLOptionElement': OptionElement,
-  'HTMLOptionsCollection': HtmlOptionsCollection,
-  'HTMLOutputElement': OutputElement,
-  'HTMLParagraphElement': ParagraphElement,
-  'HTMLParamElement': ParamElement,
-  'HTMLPreElement': PreElement,
-  'HTMLProgressElement': ProgressElement,
-  'HTMLQuoteElement': QuoteElement,
-  'HTMLScriptElement': ScriptElement,
-  'HTMLSelectElement': SelectElement,
-  'HTMLShadowElement': ShadowElement,
-  'HTMLSourceElement': SourceElement,
-  'HTMLSpanElement': SpanElement,
-  'HTMLStyleElement': StyleElement,
-  'HTMLTableCaptionElement': TableCaptionElement,
-  'HTMLTableCellElement': TableCellElement,
-  'HTMLTableColElement': TableColElement,
-  'HTMLTableElement': TableElement,
-  'HTMLTableRowElement': TableRowElement,
-  'HTMLTableSectionElement': TableSectionElement,
-  'HTMLTemplateElement': TemplateElement,
-  'HTMLTextAreaElement': TextAreaElement,
-  'HTMLTitleElement': TitleElement,
-  'HTMLTrackElement': TrackElement,
-  'HTMLUListElement': UListElement,
-  'HTMLUnknownElement': UnknownElement,
-  'HTMLVideoElement': VideoElement,
-  'HashChangeEvent': HashChangeEvent,
-  'History': History,
-  'ImageBitmap': ImageBitmap,
-  'ImageData': ImageData,
-  'InjectedScriptHost': InjectedScriptHost,
-  'InputMethodContext': InputMethodContext,
-  'InstallEvent': InstallEvent,
-  'InstallPhaseEvent': InstallPhaseEvent,
-  'Key': CryptoKey,
-  'KeyPair': KeyPair,
-  'KeyboardEvent': KeyboardEvent,
-  'Location': Location,
-  'MIDIAccess': MidiAccess,
-  'MIDIAccessPromise': MidiAccessPromise,
-  'MIDIConnectionEvent': MidiConnectionEvent,
-  'MIDIInput': MidiInput,
-  'MIDIMessageEvent': MidiMessageEvent,
-  'MIDIOutput': MidiOutput,
-  'MIDIPort': MidiPort,
-  'MediaController': MediaController,
-  'MediaError': MediaError,
-  'MediaKeyError': MediaKeyError,
-  'MediaKeyEvent': MediaKeyEvent,
-  'MediaKeyMessageEvent': MediaKeyMessageEvent,
-  'MediaKeyNeededEvent': MediaKeyNeededEvent,
-  'MediaKeySession': MediaKeySession,
-  'MediaKeys': MediaKeys,
-  'MediaList': MediaList,
-  'MediaQueryList': MediaQueryList,
-  'MediaSource': MediaSource,
-  'MediaStream': MediaStream,
-  'MediaStreamEvent': MediaStreamEvent,
-  'MediaStreamTrack': MediaStreamTrack,
-  'MediaStreamTrackEvent': MediaStreamTrackEvent,
-  'MemoryInfo': MemoryInfo,
-  'MessageChannel': MessageChannel,
-  'MessageEvent': MessageEvent,
-  'MessagePort': MessagePort,
-  'Metadata': Metadata,
-  'MimeType': MimeType,
-  'MimeTypeArray': MimeTypeArray,
-  'MouseEvent': MouseEvent,
-  'MutationEvent': _MutationEvent,
-  'MutationObserver': MutationObserver,
-  'MutationRecord': MutationRecord,
-  'NamedNodeMap': _NamedNodeMap,
-  'Navigator': Navigator,
-  'NavigatorID': NavigatorID,
-  'NavigatorOnLine': NavigatorOnLine,
-  'NavigatorUserMediaError': NavigatorUserMediaError,
-  'Node': Node,
-  'NodeFilter': NodeFilter,
-  'NodeIterator': NodeIterator,
-  'NodeList': NodeList,
-  'Notation': _Notation,
-  'Notification': Notification,
-  'NotificationCenter': _NotificationCenter,
-  'OverflowEvent': OverflowEvent,
-  'PagePopupController': _PagePopupController,
-  'PageTransitionEvent': PageTransitionEvent,
-  'ParentNode': ParentNode,
-  'Path': Path,
-  'Performance': Performance,
-  'PerformanceEntry': PerformanceEntry,
-  'PerformanceMark': PerformanceMark,
-  'PerformanceMeasure': PerformanceMeasure,
-  'PerformanceNavigation': PerformanceNavigation,
-  'PerformanceResourceTiming': PerformanceResourceTiming,
-  'PerformanceTiming': PerformanceTiming,
-  'Player': Player,
-  'Plugin': Plugin,
-  'PluginArray': PluginArray,
-  'PopStateEvent': PopStateEvent,
-  'PositionError': PositionError,
-  'ProcessingInstruction': ProcessingInstruction,
-  'ProgressEvent': ProgressEvent,
-  'RGBColor': _RGBColor,
-  'RTCDTMFSender': RtcDtmfSender,
-  'RTCDTMFToneChangeEvent': RtcDtmfToneChangeEvent,
-  'RTCDataChannel': RtcDataChannel,
-  'RTCDataChannelEvent': RtcDataChannelEvent,
-  'RTCIceCandidate': RtcIceCandidate,
-  'RTCIceCandidateEvent': RtcIceCandidateEvent,
-  'RTCPeerConnection': RtcPeerConnection,
-  'RTCSessionDescription': RtcSessionDescription,
-  'RTCStatsReport': RtcStatsReport,
-  'RTCStatsResponse': RtcStatsResponse,
-  'RadioNodeList': _RadioNodeList,
-  'Range': Range,
-  'Rect': _Rect,
-  'ResourceProgressEvent': ResourceProgressEvent,
-  'Screen': Screen,
-  'SecurityPolicyViolationEvent': SecurityPolicyViolationEvent,
-  'Selection': Selection,
-  'ServiceWorker': _ServiceWorker,
-  'ServiceWorkerContainer': ServiceWorkerContainer,
-  'ServiceWorkerGlobalScope': ServiceWorkerGlobalScope,
-  'ShadowRoot': ShadowRoot,
-  'SharedWorker': SharedWorker,
-  'SharedWorkerGlobalScope': SharedWorkerGlobalScope,
-  'SourceBuffer': SourceBuffer,
-  'SourceBufferList': SourceBufferList,
-  'SourceInfo': SourceInfo,
-  'SpeechGrammar': SpeechGrammar,
-  'SpeechGrammarList': SpeechGrammarList,
-  'SpeechInputEvent': SpeechInputEvent,
-  'SpeechInputResult': SpeechInputResult,
-  'SpeechInputResultList': _SpeechInputResultList,
-  'SpeechRecognition': SpeechRecognition,
-  'SpeechRecognitionAlternative': SpeechRecognitionAlternative,
-  'SpeechRecognitionError': SpeechRecognitionError,
-  'SpeechRecognitionEvent': SpeechRecognitionEvent,
-  'SpeechRecognitionResult': SpeechRecognitionResult,
-  'SpeechRecognitionResultList': _SpeechRecognitionResultList,
-  'SpeechSynthesis': SpeechSynthesis,
-  'SpeechSynthesisEvent': SpeechSynthesisEvent,
-  'SpeechSynthesisUtterance': SpeechSynthesisUtterance,
-  'SpeechSynthesisVoice': SpeechSynthesisVoice,
-  'Storage': Storage,
-  'StorageEvent': StorageEvent,
-  'StorageInfo': StorageInfo,
-  'StorageQuota': StorageQuota,
-  'Stream': FileStream,
-  'StyleMedia': StyleMedia,
-  'StyleSheet': StyleSheet,
-  'StyleSheetList': _StyleSheetList,
-  'SubtleCrypto': _SubtleCrypto,
-  'Text': Text,
-  'TextEvent': TextEvent,
-  'TextMetrics': TextMetrics,
-  'TextTrack': TextTrack,
-  'TextTrackCue': TextTrackCue,
-  'TextTrackCueList': TextTrackCueList,
-  'TextTrackList': TextTrackList,
-  'TimeRanges': TimeRanges,
-  'TimedItem': TimedItem,
-  'Timeline': Timeline,
-  'Timing': Timing,
-  'Touch': Touch,
-  'TouchEvent': TouchEvent,
-  'TouchList': TouchList,
-  'TrackEvent': TrackEvent,
-  'TransitionEvent': TransitionEvent,
-  'TreeWalker': TreeWalker,
-  'UIEvent': UIEvent,
-  'URL': Url,
-  'URLUtils': UrlUtils,
-  'URLUtilsReadOnly': UrlUtilsReadOnly,
-  'VTTCue': VttCue,
-  'VTTRegion': VttRegion,
-  'VTTRegionList': VttRegionList,
-  'ValidityState': ValidityState,
-  'VideoPlaybackQuality': VideoPlaybackQuality,
-  'WebKitAnimationEvent': AnimationEvent,
-  'WebKitCSSFilterRule': CssFilterRule,
-  'WebKitCSSFilterValue': _WebKitCSSFilterValue,
-  'WebKitCSSMatrix': _WebKitCSSMatrix,
-  'WebKitCSSTransformValue': _WebKitCSSTransformValue,
-  'WebKitMediaSource': _WebKitMediaSource,
-  'WebKitNotification': _WebKitNotification,
-  'WebKitPoint': _DomPoint,
-  'WebKitSourceBuffer': _WebKitSourceBuffer,
-  'WebKitSourceBufferList': _WebKitSourceBufferList,
-  'WebSocket': WebSocket,
-  'WheelEvent': WheelEvent,
-  'Window': Window,
-  'WindowBase64': WindowBase64,
-  'WindowEventHandlers': WindowEventHandlers,
-  'WindowTimers': _WindowTimers,
-  'Worker': Worker,
-  'WorkerConsole': WorkerConsole,
-  'WorkerCrypto': WorkerCrypto,
-  'WorkerGlobalScope': WorkerGlobalScope,
-  'WorkerLocation': _WorkerLocation,
-  'WorkerNavigator': _WorkerNavigator,
-  'WorkerPerformance': WorkerPerformance,
-  'XMLDocument': XmlDocument,
-  'XMLHttpRequest': HttpRequest,
-  'XMLHttpRequestEventTarget': HttpRequestEventTarget,
-  'XMLHttpRequestProgressEvent': _XMLHttpRequestProgressEvent,
-  'XMLHttpRequestUpload': HttpRequestUpload,
-  'XMLSerializer': XmlSerializer,
-  'XPathEvaluator': XPathEvaluator,
-  'XPathExpression': XPathExpression,
-  'XPathNSResolver': XPathNSResolver,
-  'XPathResult': XPathResult,
-  'XSLTProcessor': XsltProcessor,
+  'DateTime': () => DateTime,
+  'JsObject': () => js.JsObject,
+  'JsFunction': () => js.JsFunction,
+  'JsArray': () => js.JsArray,
+  'AbstractWorker': () => AbstractWorker,
+  'Algorithm': () => Algorithm,
+  'Animation': () => Animation,
+  'ApplicationCache': () => ApplicationCache,
+  'Attr': () => _Attr,
+  'AutocompleteErrorEvent': () => AutocompleteErrorEvent,
+  'BarProp': () => BarProp,
+  'BeforeLoadEvent': () => BeforeLoadEvent,
+  'BeforeUnloadEvent': () => BeforeUnloadEvent,
+  'Blob': () => Blob,
+  'CDATASection': () => CDataSection,
+  'CSS': () => Css,
+  'CSSCharsetRule': () => CssCharsetRule,
+  'CSSFontFaceLoadEvent': () => CssFontFaceLoadEvent,
+  'CSSFontFaceRule': () => CssFontFaceRule,
+  'CSSImportRule': () => CssImportRule,
+  'CSSKeyframeRule': () => CssKeyframeRule,
+  'CSSKeyframesRule': () => CssKeyframesRule,
+  'CSSMediaRule': () => CssMediaRule,
+  'CSSPageRule': () => CssPageRule,
+  'CSSPrimitiveValue': () => _CSSPrimitiveValue,
+  'CSSRule': () => CssRule,
+  'CSSRuleList': () => _CssRuleList,
+  'CSSStyleDeclaration': () => CssStyleDeclaration,
+  'CSSStyleRule': () => CssStyleRule,
+  'CSSStyleSheet': () => CssStyleSheet,
+  'CSSSupportsRule': () => CssSupportsRule,
+  'CSSUnknownRule': () => _CSSUnknownRule,
+  'CSSValue': () => _CSSValue,
+  'CSSValueList': () => _CssValueList,
+  'CSSViewportRule': () => CssViewportRule,
+  'Canvas2DContextAttributes': () => Canvas2DContextAttributes,
+  'CanvasGradient': () => CanvasGradient,
+  'CanvasPattern': () => CanvasPattern,
+  'CanvasRenderingContext': () => CanvasRenderingContext,
+  'CanvasRenderingContext2D': () => CanvasRenderingContext2D,
+  'CharacterData': () => CharacterData,
+  'ChildNode': () => ChildNode,
+  'ClientRect': () => _ClientRect,
+  'ClientRectList': () => _ClientRectList,
+  'Clipboard': () => DataTransfer,
+  'CloseEvent': () => CloseEvent,
+  'Comment': () => Comment,
+  'CompositionEvent': () => CompositionEvent,
+  'Console': () => Console,
+  'ConsoleBase': () => ConsoleBase,
+  'Coordinates': () => Coordinates,
+  'Counter': () => _Counter,
+  'Crypto': () => Crypto,
+  'CustomEvent': () => CustomEvent,
+  'DOMError': () => DomError,
+  'DOMException': () => DomException,
+  'DOMFileSystem': () => FileSystem,
+  'DOMFileSystemSync': () => _DOMFileSystemSync,
+  'DOMImplementation': () => DomImplementation,
+  'DOMParser': () => DomParser,
+  'DOMSettableTokenList': () => DomSettableTokenList,
+  'DOMStringList': () => DomStringList,
+  'DOMStringMap': () => DomStringMap,
+  'DOMTokenList': () => DomTokenList,
+  'DataTransferItem': () => DataTransferItem,
+  'DataTransferItemList': () => DataTransferItemList,
+  'DatabaseSync': () => _DatabaseSync,
+  'DedicatedWorkerGlobalScope': () => DedicatedWorkerGlobalScope,
+  'DeprecatedStorageInfo': () => DeprecatedStorageInfo,
+  'DeprecatedStorageQuota': () => DeprecatedStorageQuota,
+  'DeviceAcceleration': () => DeviceAcceleration,
+  'DeviceMotionEvent': () => DeviceMotionEvent,
+  'DeviceOrientationEvent': () => DeviceOrientationEvent,
+  'DeviceRotationRate': () => DeviceRotationRate,
+  'DirectoryEntry': () => DirectoryEntry,
+  'DirectoryEntrySync': () => _DirectoryEntrySync,
+  'DirectoryReader': () => DirectoryReader,
+  'DirectoryReaderSync': () => _DirectoryReaderSync,
+  'Document': () => Document,
+  'DocumentFragment': () => DocumentFragment,
+  'DocumentType': () => _DocumentType,
+  'Element': () => Element,
+  'Entry': () => Entry,
+  'EntrySync': () => _EntrySync,
+  'ErrorEvent': () => ErrorEvent,
+  'Event': () => Event,
+  'EventSource': () => EventSource,
+  'EventTarget': () => EventTarget,
+  'File': () => File,
+  'FileEntry': () => FileEntry,
+  'FileEntrySync': () => _FileEntrySync,
+  'FileError': () => FileError,
+  'FileList': () => FileList,
+  'FileReader': () => FileReader,
+  'FileReaderSync': () => _FileReaderSync,
+  'FileWriter': () => FileWriter,
+  'FileWriterSync': () => _FileWriterSync,
+  'FocusEvent': () => FocusEvent,
+  'FontFace': () => FontFace,
+  'FontFaceSet': () => FontFaceSet,
+  'FormData': () => FormData,
+  'Gamepad': () => Gamepad,
+  'GamepadList': () => _GamepadList,
+  'Geolocation': () => Geolocation,
+  'Geoposition': () => Geoposition,
+  'GlobalEventHandlers': () => GlobalEventHandlers,
+  'HTMLAllCollection': () => _HTMLAllCollection,
+  'HTMLAnchorElement': () => AnchorElement,
+  'HTMLAppletElement': () => _HTMLAppletElement,
+  'HTMLAreaElement': () => AreaElement,
+  'HTMLAudioElement': () => AudioElement,
+  'HTMLBRElement': () => BRElement,
+  'HTMLBaseElement': () => BaseElement,
+  'HTMLBodyElement': () => BodyElement,
+  'HTMLButtonElement': () => ButtonElement,
+  'HTMLCanvasElement': () => CanvasElement,
+  'HTMLCollection': () => HtmlCollection,
+  'HTMLContentElement': () => ContentElement,
+  'HTMLDListElement': () => DListElement,
+  'HTMLDataListElement': () => DataListElement,
+  'HTMLDetailsElement': () => DetailsElement,
+  'HTMLDialogElement': () => DialogElement,
+  'HTMLDirectoryElement': () => _HTMLDirectoryElement,
+  'HTMLDivElement': () => DivElement,
+  'HTMLDocument': () => HtmlDocument,
+  'HTMLElement': () => HtmlElement,
+  'HTMLEmbedElement': () => EmbedElement,
+  'HTMLFieldSetElement': () => FieldSetElement,
+  'HTMLFontElement': () => _HTMLFontElement,
+  'HTMLFormControlsCollection': () => HtmlFormControlsCollection,
+  'HTMLFormElement': () => FormElement,
+  'HTMLFrameElement': () => _HTMLFrameElement,
+  'HTMLFrameSetElement': () => _HTMLFrameSetElement,
+  'HTMLHRElement': () => HRElement,
+  'HTMLHeadElement': () => HeadElement,
+  'HTMLHeadingElement': () => HeadingElement,
+  'HTMLHtmlElement': () => HtmlHtmlElement,
+  'HTMLIFrameElement': () => IFrameElement,
+  'HTMLImageElement': () => ImageElement,
+  'HTMLInputElement': () => InputElement,
+  'HTMLKeygenElement': () => KeygenElement,
+  'HTMLLIElement': () => LIElement,
+  'HTMLLabelElement': () => LabelElement,
+  'HTMLLegendElement': () => LegendElement,
+  'HTMLLinkElement': () => LinkElement,
+  'HTMLMapElement': () => MapElement,
+  'HTMLMarqueeElement': () => _HTMLMarqueeElement,
+  'HTMLMediaElement': () => MediaElement,
+  'HTMLMenuElement': () => MenuElement,
+  'HTMLMetaElement': () => MetaElement,
+  'HTMLMeterElement': () => MeterElement,
+  'HTMLModElement': () => ModElement,
+  'HTMLOListElement': () => OListElement,
+  'HTMLObjectElement': () => ObjectElement,
+  'HTMLOptGroupElement': () => OptGroupElement,
+  'HTMLOptionElement': () => OptionElement,
+  'HTMLOptionsCollection': () => HtmlOptionsCollection,
+  'HTMLOutputElement': () => OutputElement,
+  'HTMLParagraphElement': () => ParagraphElement,
+  'HTMLParamElement': () => ParamElement,
+  'HTMLPreElement': () => PreElement,
+  'HTMLProgressElement': () => ProgressElement,
+  'HTMLQuoteElement': () => QuoteElement,
+  'HTMLScriptElement': () => ScriptElement,
+  'HTMLSelectElement': () => SelectElement,
+  'HTMLShadowElement': () => ShadowElement,
+  'HTMLSourceElement': () => SourceElement,
+  'HTMLSpanElement': () => SpanElement,
+  'HTMLStyleElement': () => StyleElement,
+  'HTMLTableCaptionElement': () => TableCaptionElement,
+  'HTMLTableCellElement': () => TableCellElement,
+  'HTMLTableColElement': () => TableColElement,
+  'HTMLTableElement': () => TableElement,
+  'HTMLTableRowElement': () => TableRowElement,
+  'HTMLTableSectionElement': () => TableSectionElement,
+  'HTMLTemplateElement': () => TemplateElement,
+  'HTMLTextAreaElement': () => TextAreaElement,
+  'HTMLTitleElement': () => TitleElement,
+  'HTMLTrackElement': () => TrackElement,
+  'HTMLUListElement': () => UListElement,
+  'HTMLUnknownElement': () => UnknownElement,
+  'HTMLVideoElement': () => VideoElement,
+  'HashChangeEvent': () => HashChangeEvent,
+  'History': () => History,
+  'ImageBitmap': () => ImageBitmap,
+  'ImageData': () => ImageData,
+  'InjectedScriptHost': () => InjectedScriptHost,
+  'InputMethodContext': () => InputMethodContext,
+  'InstallEvent': () => InstallEvent,
+  'InstallPhaseEvent': () => InstallPhaseEvent,
+  'Key': () => CryptoKey,
+  'KeyPair': () => KeyPair,
+  'KeyboardEvent': () => KeyboardEvent,
+  'Location': () => Location,
+  'MIDIAccess': () => MidiAccess,
+  'MIDIAccessPromise': () => MidiAccessPromise,
+  'MIDIConnectionEvent': () => MidiConnectionEvent,
+  'MIDIInput': () => MidiInput,
+  'MIDIMessageEvent': () => MidiMessageEvent,
+  'MIDIOutput': () => MidiOutput,
+  'MIDIPort': () => MidiPort,
+  'MediaController': () => MediaController,
+  'MediaError': () => MediaError,
+  'MediaKeyError': () => MediaKeyError,
+  'MediaKeyEvent': () => MediaKeyEvent,
+  'MediaKeyMessageEvent': () => MediaKeyMessageEvent,
+  'MediaKeyNeededEvent': () => MediaKeyNeededEvent,
+  'MediaKeySession': () => MediaKeySession,
+  'MediaKeys': () => MediaKeys,
+  'MediaList': () => MediaList,
+  'MediaQueryList': () => MediaQueryList,
+  'MediaSource': () => MediaSource,
+  'MediaStream': () => MediaStream,
+  'MediaStreamEvent': () => MediaStreamEvent,
+  'MediaStreamTrack': () => MediaStreamTrack,
+  'MediaStreamTrackEvent': () => MediaStreamTrackEvent,
+  'MemoryInfo': () => MemoryInfo,
+  'MessageChannel': () => MessageChannel,
+  'MessageEvent': () => MessageEvent,
+  'MessagePort': () => MessagePort,
+  'Metadata': () => Metadata,
+  'MimeType': () => MimeType,
+  'MimeTypeArray': () => MimeTypeArray,
+  'MouseEvent': () => MouseEvent,
+  'MutationEvent': () => _MutationEvent,
+  'MutationObserver': () => MutationObserver,
+  'MutationRecord': () => MutationRecord,
+  'NamedNodeMap': () => _NamedNodeMap,
+  'Navigator': () => Navigator,
+  'NavigatorID': () => NavigatorID,
+  'NavigatorOnLine': () => NavigatorOnLine,
+  'NavigatorUserMediaError': () => NavigatorUserMediaError,
+  'Node': () => Node,
+  'NodeFilter': () => NodeFilter,
+  'NodeIterator': () => NodeIterator,
+  'NodeList': () => NodeList,
+  'Notation': () => _Notation,
+  'Notification': () => Notification,
+  'NotificationCenter': () => _NotificationCenter,
+  'OverflowEvent': () => OverflowEvent,
+  'PagePopupController': () => _PagePopupController,
+  'PageTransitionEvent': () => PageTransitionEvent,
+  'ParentNode': () => ParentNode,
+  'Path': () => Path,
+  'Performance': () => Performance,
+  'PerformanceEntry': () => PerformanceEntry,
+  'PerformanceMark': () => PerformanceMark,
+  'PerformanceMeasure': () => PerformanceMeasure,
+  'PerformanceNavigation': () => PerformanceNavigation,
+  'PerformanceResourceTiming': () => PerformanceResourceTiming,
+  'PerformanceTiming': () => PerformanceTiming,
+  'Player': () => Player,
+  'Plugin': () => Plugin,
+  'PluginArray': () => PluginArray,
+  'PopStateEvent': () => PopStateEvent,
+  'PositionError': () => PositionError,
+  'ProcessingInstruction': () => ProcessingInstruction,
+  'ProgressEvent': () => ProgressEvent,
+  'RGBColor': () => _RGBColor,
+  'RTCDTMFSender': () => RtcDtmfSender,
+  'RTCDTMFToneChangeEvent': () => RtcDtmfToneChangeEvent,
+  'RTCDataChannel': () => RtcDataChannel,
+  'RTCDataChannelEvent': () => RtcDataChannelEvent,
+  'RTCIceCandidate': () => RtcIceCandidate,
+  'RTCIceCandidateEvent': () => RtcIceCandidateEvent,
+  'RTCPeerConnection': () => RtcPeerConnection,
+  'RTCSessionDescription': () => RtcSessionDescription,
+  'RTCStatsReport': () => RtcStatsReport,
+  'RTCStatsResponse': () => RtcStatsResponse,
+  'RadioNodeList': () => _RadioNodeList,
+  'Range': () => Range,
+  'Rect': () => _Rect,
+  'ResourceProgressEvent': () => ResourceProgressEvent,
+  'Screen': () => Screen,
+  'SecurityPolicyViolationEvent': () => SecurityPolicyViolationEvent,
+  'Selection': () => Selection,
+  'ServiceWorker': () => _ServiceWorker,
+  'ServiceWorkerContainer': () => ServiceWorkerContainer,
+  'ServiceWorkerGlobalScope': () => ServiceWorkerGlobalScope,
+  'ShadowRoot': () => ShadowRoot,
+  'SharedWorker': () => SharedWorker,
+  'SharedWorkerGlobalScope': () => SharedWorkerGlobalScope,
+  'SourceBuffer': () => SourceBuffer,
+  'SourceBufferList': () => SourceBufferList,
+  'SourceInfo': () => SourceInfo,
+  'SpeechGrammar': () => SpeechGrammar,
+  'SpeechGrammarList': () => SpeechGrammarList,
+  'SpeechInputEvent': () => SpeechInputEvent,
+  'SpeechInputResult': () => SpeechInputResult,
+  'SpeechInputResultList': () => _SpeechInputResultList,
+  'SpeechRecognition': () => SpeechRecognition,
+  'SpeechRecognitionAlternative': () => SpeechRecognitionAlternative,
+  'SpeechRecognitionError': () => SpeechRecognitionError,
+  'SpeechRecognitionEvent': () => SpeechRecognitionEvent,
+  'SpeechRecognitionResult': () => SpeechRecognitionResult,
+  'SpeechRecognitionResultList': () => _SpeechRecognitionResultList,
+  'SpeechSynthesis': () => SpeechSynthesis,
+  'SpeechSynthesisEvent': () => SpeechSynthesisEvent,
+  'SpeechSynthesisUtterance': () => SpeechSynthesisUtterance,
+  'SpeechSynthesisVoice': () => SpeechSynthesisVoice,
+  'Storage': () => Storage,
+  'StorageEvent': () => StorageEvent,
+  'StorageInfo': () => StorageInfo,
+  'StorageQuota': () => StorageQuota,
+  'Stream': () => FileStream,
+  'StyleMedia': () => StyleMedia,
+  'StyleSheet': () => StyleSheet,
+  'StyleSheetList': () => _StyleSheetList,
+  'SubtleCrypto': () => _SubtleCrypto,
+  'Text': () => Text,
+  'TextEvent': () => TextEvent,
+  'TextMetrics': () => TextMetrics,
+  'TextTrack': () => TextTrack,
+  'TextTrackCue': () => TextTrackCue,
+  'TextTrackCueList': () => TextTrackCueList,
+  'TextTrackList': () => TextTrackList,
+  'TimeRanges': () => TimeRanges,
+  'TimedItem': () => TimedItem,
+  'Timeline': () => Timeline,
+  'Timing': () => Timing,
+  'Touch': () => Touch,
+  'TouchEvent': () => TouchEvent,
+  'TouchList': () => TouchList,
+  'TrackEvent': () => TrackEvent,
+  'TransitionEvent': () => TransitionEvent,
+  'TreeWalker': () => TreeWalker,
+  'UIEvent': () => UIEvent,
+  'URL': () => Url,
+  'URLUtils': () => UrlUtils,
+  'URLUtilsReadOnly': () => UrlUtilsReadOnly,
+  'VTTCue': () => VttCue,
+  'VTTRegion': () => VttRegion,
+  'VTTRegionList': () => VttRegionList,
+  'ValidityState': () => ValidityState,
+  'VideoPlaybackQuality': () => VideoPlaybackQuality,
+  'WebKitAnimationEvent': () => AnimationEvent,
+  'WebKitCSSFilterRule': () => CssFilterRule,
+  'WebKitCSSFilterValue': () => _WebKitCSSFilterValue,
+  'WebKitCSSMatrix': () => _WebKitCSSMatrix,
+  'WebKitCSSTransformValue': () => _WebKitCSSTransformValue,
+  'WebKitMediaSource': () => _WebKitMediaSource,
+  'WebKitNotification': () => _WebKitNotification,
+  'WebKitPoint': () => _DomPoint,
+  'WebKitSourceBuffer': () => _WebKitSourceBuffer,
+  'WebKitSourceBufferList': () => _WebKitSourceBufferList,
+  'WebSocket': () => WebSocket,
+  'WheelEvent': () => WheelEvent,
+  'Window': () => Window,
+  'WindowBase64': () => WindowBase64,
+  'WindowEventHandlers': () => WindowEventHandlers,
+  'WindowTimers': () => _WindowTimers,
+  'Worker': () => Worker,
+  'WorkerConsole': () => WorkerConsole,
+  'WorkerCrypto': () => WorkerCrypto,
+  'WorkerGlobalScope': () => WorkerGlobalScope,
+  'WorkerLocation': () => _WorkerLocation,
+  'WorkerNavigator': () => _WorkerNavigator,
+  'WorkerPerformance': () => WorkerPerformance,
+  'XMLDocument': () => XmlDocument,
+  'XMLHttpRequest': () => HttpRequest,
+  'XMLHttpRequestEventTarget': () => HttpRequestEventTarget,
+  'XMLHttpRequestProgressEvent': () => _XMLHttpRequestProgressEvent,
+  'XMLHttpRequestUpload': () => HttpRequestUpload,
+  'XMLSerializer': () => XmlSerializer,
+  'XPathEvaluator': () => XPathEvaluator,
+  'XPathExpression': () => XPathExpression,
+  'XPathNSResolver': () => XPathNSResolver,
+  'XPathResult': () => XPathResult,
+  'XSLTProcessor': () => XsltProcessor,
 
   // FIXME: Temporary workaround.  The Blink name matches the Dart name
   // post Chrome 35.  We still generate the old mapping from 'Clipboard'.
-  'DataTransfer': DataTransfer,
+  'DataTransfer': () => DataTransfer,
 };
 // 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
@@ -532,7 +532,7 @@
   @DomName('Algorithm.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_Algorithm_name_Getter(this);
+  String get name => _blink.BlinkAlgorithm.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -564,137 +564,137 @@
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  String get download => _blink.Native_HTMLAnchorElement_download_Getter(this);
+  String get download => _blink.BlinkHTMLAnchorElement.$download_Getter(this);
 
   @DomName('HTMLAnchorElement.download')
   @DocsEditable()
-  void set download(String value) => _blink.Native_HTMLAnchorElement_download_Setter(this, value);
+  void set download(String value) => _blink.BlinkHTMLAnchorElement.$download_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.Native_HTMLAnchorElement_hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLAnchorElement.$hreflang_Getter(this);
 
   @DomName('HTMLAnchorElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.Native_HTMLAnchorElement_hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLAnchorElement.$hreflang_Setter(this, value);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  String get rel => _blink.Native_HTMLAnchorElement_rel_Getter(this);
+  String get rel => _blink.BlinkHTMLAnchorElement.$rel_Getter(this);
 
   @DomName('HTMLAnchorElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.Native_HTMLAnchorElement_rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLAnchorElement.$rel_Setter(this, value);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLAnchorElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLAnchorElement.$target_Getter(this);
 
   @DomName('HTMLAnchorElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLAnchorElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAnchorElement.$target_Setter(this, value);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLAnchorElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLAnchorElement.$type_Getter(this);
 
   @DomName('HTMLAnchorElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLAnchorElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLAnchorElement.$type_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  String get hash => _blink.Native_HTMLAnchorElement_hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAnchorElement.$hash_Getter(this);
 
   @DomName('HTMLAnchorElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_HTMLAnchorElement_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAnchorElement.$hash_Setter(this, value);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  String get host => _blink.Native_HTMLAnchorElement_host_Getter(this);
+  String get host => _blink.BlinkHTMLAnchorElement.$host_Getter(this);
 
   @DomName('HTMLAnchorElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_HTMLAnchorElement_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAnchorElement.$host_Setter(this, value);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_HTMLAnchorElement_hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAnchorElement.$hostname_Getter(this);
 
   @DomName('HTMLAnchorElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_HTMLAnchorElement_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAnchorElement.$hostname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLAnchorElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLAnchorElement.$href_Getter(this);
 
   @DomName('HTMLAnchorElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLAnchorElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAnchorElement.$href_Setter(this, value);
 
   @DomName('HTMLAnchorElement.origin')
   @DocsEditable()
   // WebKit only
   @Experimental() // non-standard
-  String get origin => _blink.Native_HTMLAnchorElement_origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAnchorElement.$origin_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_HTMLAnchorElement_password_Getter(this);
+  String get password => _blink.BlinkHTMLAnchorElement.$password_Getter(this);
 
   @DomName('HTMLAnchorElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_HTMLAnchorElement_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAnchorElement.$password_Setter(this, value);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_HTMLAnchorElement_pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAnchorElement.$pathname_Getter(this);
 
   @DomName('HTMLAnchorElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_HTMLAnchorElement_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAnchorElement.$pathname_Setter(this, value);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  String get port => _blink.Native_HTMLAnchorElement_port_Getter(this);
+  String get port => _blink.BlinkHTMLAnchorElement.$port_Getter(this);
 
   @DomName('HTMLAnchorElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_HTMLAnchorElement_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAnchorElement.$port_Setter(this, value);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_HTMLAnchorElement_protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAnchorElement.$protocol_Getter(this);
 
   @DomName('HTMLAnchorElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_HTMLAnchorElement_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAnchorElement.$protocol_Setter(this, value);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  String get search => _blink.Native_HTMLAnchorElement_search_Getter(this);
+  String get search => _blink.BlinkHTMLAnchorElement.$search_Getter(this);
 
   @DomName('HTMLAnchorElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_HTMLAnchorElement_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAnchorElement.$search_Setter(this, value);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_HTMLAnchorElement_username_Getter(this);
+  String get username => _blink.BlinkHTMLAnchorElement.$username_Getter(this);
 
   @DomName('HTMLAnchorElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_HTMLAnchorElement_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAnchorElement.$username_Setter(this, value);
 
   @DomName('HTMLAnchorElement.toString')
   @DocsEditable()
-  String toString() => _blink.Native_HTMLAnchorElement_toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAnchorElement.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -713,7 +713,7 @@
 
   @DomName('Animation.Animation')
   @DocsEditable()
-  factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.Native_Animation_Animation(target, keyframes, timingInput);
+  factory Animation(Element target, List<Map> keyframes, [timingInput]) => _blink.BlinkAnimation.$mkAnimation(target, keyframes, timingInput);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -734,11 +734,11 @@
 
   @DomName('WebKitAnimationEvent.animationName')
   @DocsEditable()
-  String get animationName => _blink.Native_WebKitAnimationEvent_animationName_Getter(this);
+  String get animationName => _blink.BlinkWebKitAnimationEvent.$animationName_Getter(this);
 
   @DomName('WebKitAnimationEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_WebKitAnimationEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkWebKitAnimationEvent.$elapsedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -869,19 +869,19 @@
 
   @DomName('ApplicationCache.status')
   @DocsEditable()
-  int get status => _blink.Native_ApplicationCache_status_Getter(this);
+  int get status => _blink.BlinkApplicationCache.$status_Getter(this);
 
   @DomName('ApplicationCache.abort')
   @DocsEditable()
-  void abort() => _blink.Native_ApplicationCache_abort_Callback(this);
+  void abort() => _blink.BlinkApplicationCache.$abort_Callback(this);
 
   @DomName('ApplicationCache.swapCache')
   @DocsEditable()
-  void swapCache() => _blink.Native_ApplicationCache_swapCache_Callback(this);
+  void swapCache() => _blink.BlinkApplicationCache.$swapCache_Callback(this);
 
   @DomName('ApplicationCache.update')
   @DocsEditable()
-  void update() => _blink.Native_ApplicationCache_update_Callback(this);
+  void update() => _blink.BlinkApplicationCache.$update_Callback(this);
 
   /// Stream of `cached` events handled by this [ApplicationCache].
   @DomName('ApplicationCache.oncached')
@@ -959,129 +959,129 @@
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLAreaElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLAreaElement.$alt_Getter(this);
 
   @DomName('HTMLAreaElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLAreaElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLAreaElement.$alt_Setter(this, value);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  String get coords => _blink.Native_HTMLAreaElement_coords_Getter(this);
+  String get coords => _blink.BlinkHTMLAreaElement.$coords_Getter(this);
 
   @DomName('HTMLAreaElement.coords')
   @DocsEditable()
-  void set coords(String value) => _blink.Native_HTMLAreaElement_coords_Setter(this, value);
+  void set coords(String value) => _blink.BlinkHTMLAreaElement.$coords_Setter(this, value);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  String get shape => _blink.Native_HTMLAreaElement_shape_Getter(this);
+  String get shape => _blink.BlinkHTMLAreaElement.$shape_Getter(this);
 
   @DomName('HTMLAreaElement.shape')
   @DocsEditable()
-  void set shape(String value) => _blink.Native_HTMLAreaElement_shape_Setter(this, value);
+  void set shape(String value) => _blink.BlinkHTMLAreaElement.$shape_Setter(this, value);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLAreaElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLAreaElement.$target_Getter(this);
 
   @DomName('HTMLAreaElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLAreaElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLAreaElement.$target_Setter(this, value);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  String get hash => _blink.Native_HTMLAreaElement_hash_Getter(this);
+  String get hash => _blink.BlinkHTMLAreaElement.$hash_Getter(this);
 
   @DomName('HTMLAreaElement.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_HTMLAreaElement_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkHTMLAreaElement.$hash_Setter(this, value);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  String get host => _blink.Native_HTMLAreaElement_host_Getter(this);
+  String get host => _blink.BlinkHTMLAreaElement.$host_Getter(this);
 
   @DomName('HTMLAreaElement.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_HTMLAreaElement_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkHTMLAreaElement.$host_Setter(this, value);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_HTMLAreaElement_hostname_Getter(this);
+  String get hostname => _blink.BlinkHTMLAreaElement.$hostname_Getter(this);
 
   @DomName('HTMLAreaElement.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_HTMLAreaElement_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkHTMLAreaElement.$hostname_Setter(this, value);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLAreaElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLAreaElement.$href_Getter(this);
 
   @DomName('HTMLAreaElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLAreaElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLAreaElement.$href_Setter(this, value);
 
   @DomName('HTMLAreaElement.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_HTMLAreaElement_origin_Getter(this);
+  String get origin => _blink.BlinkHTMLAreaElement.$origin_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_HTMLAreaElement_password_Getter(this);
+  String get password => _blink.BlinkHTMLAreaElement.$password_Getter(this);
 
   @DomName('HTMLAreaElement.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_HTMLAreaElement_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkHTMLAreaElement.$password_Setter(this, value);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_HTMLAreaElement_pathname_Getter(this);
+  String get pathname => _blink.BlinkHTMLAreaElement.$pathname_Getter(this);
 
   @DomName('HTMLAreaElement.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_HTMLAreaElement_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkHTMLAreaElement.$pathname_Setter(this, value);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  String get port => _blink.Native_HTMLAreaElement_port_Getter(this);
+  String get port => _blink.BlinkHTMLAreaElement.$port_Getter(this);
 
   @DomName('HTMLAreaElement.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_HTMLAreaElement_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkHTMLAreaElement.$port_Setter(this, value);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_HTMLAreaElement_protocol_Getter(this);
+  String get protocol => _blink.BlinkHTMLAreaElement.$protocol_Getter(this);
 
   @DomName('HTMLAreaElement.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_HTMLAreaElement_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkHTMLAreaElement.$protocol_Setter(this, value);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  String get search => _blink.Native_HTMLAreaElement_search_Getter(this);
+  String get search => _blink.BlinkHTMLAreaElement.$search_Getter(this);
 
   @DomName('HTMLAreaElement.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_HTMLAreaElement_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkHTMLAreaElement.$search_Setter(this, value);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_HTMLAreaElement_username_Getter(this);
+  String get username => _blink.BlinkHTMLAreaElement.$username_Getter(this);
 
   @DomName('HTMLAreaElement.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_HTMLAreaElement_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkHTMLAreaElement.$username_Setter(this, value);
 
   @DomName('HTMLAreaElement.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_HTMLAreaElement_toString_Callback(this);
+  String toString() => _blink.BlinkHTMLAreaElement.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1099,7 +1099,7 @@
 
   @DomName('HTMLAudioElement.HTMLAudioElement')
   @DocsEditable()
-  factory AudioElement([String src]) => _blink.Native_HTMLAudioElement_AudioElement(src);
+  factory AudioElement([String src]) => _blink.BlinkHTMLAudioElement.$mkAudioElement(src);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -1125,7 +1125,7 @@
 
   @DomName('AutocompleteErrorEvent.reason')
   @DocsEditable()
-  String get reason => _blink.Native_AutocompleteErrorEvent_reason_Getter(this);
+  String get reason => _blink.BlinkAutocompleteErrorEvent.$reason_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1169,7 +1169,7 @@
 
   @DomName('BarProp.visible')
   @DocsEditable()
-  bool get visible => _blink.Native_BarProp_visible_Getter(this);
+  bool get visible => _blink.BlinkBarProp.$visible_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1197,19 +1197,19 @@
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLBaseElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLBaseElement.$href_Getter(this);
 
   @DomName('HTMLBaseElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLBaseElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLBaseElement.$href_Setter(this, value);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLBaseElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLBaseElement.$target_Getter(this);
 
   @DomName('HTMLBaseElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLBaseElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLBaseElement.$target_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1242,11 +1242,11 @@
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  String get returnValue => _blink.Native_BeforeUnloadEvent_returnValue_Getter(this);
+  String get returnValue => _blink.BlinkBeforeUnloadEvent.$returnValue_Getter(this);
 
   @DomName('BeforeUnloadEvent.returnValue')
   @DocsEditable()
-  void set returnValue(String value) => _blink.Native_BeforeUnloadEvent_returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkBeforeUnloadEvent.$returnValue_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1264,17 +1264,17 @@
   factory Blob(List blobParts, [String type, String endings]) => _create(blobParts, type, endings);
 
   @DocsEditable()
-  static Blob _create(blobParts, type, endings) => _blink.Native_Blob_constructorCallback(blobParts, type, endings);
+  static Blob _create(blobParts, type, endings) => _blink.BlinkBlob.$constructorCallback(blobParts, type, endings);
 
   @DomName('Blob.size')
   @DocsEditable()
-  int get size => _blink.Native_Blob_size_Getter(this);
+  int get size => _blink.BlinkBlob.$size_Getter(this);
 
   @DomName('Blob.type')
   @DocsEditable()
-  String get type => _blink.Native_Blob_type_Getter(this);
+  String get type => _blink.BlinkBlob.$type_Getter(this);
 
-  Blob slice([int start, int end, String contentType]) => _blink.Native_Blob_slice(this, start, end, contentType);
+  Blob slice([int start, int end, String contentType]) => _blink.BlinkBlob.$slice(this, start, end, contentType);
 
 }
 
@@ -1517,112 +1517,112 @@
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLButtonElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLButtonElement.$autofocus_Getter(this);
 
   @DomName('HTMLButtonElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLButtonElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLButtonElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLButtonElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLButtonElement.$disabled_Getter(this);
 
   @DomName('HTMLButtonElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLButtonElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLButtonElement.$disabled_Setter(this, value);
 
   @DomName('HTMLButtonElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLButtonElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLButtonElement.$form_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.Native_HTMLButtonElement_formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLButtonElement.$formAction_Getter(this);
 
   @DomName('HTMLButtonElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.Native_HTMLButtonElement_formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLButtonElement.$formAction_Setter(this, value);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.Native_HTMLButtonElement_formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLButtonElement.$formEnctype_Getter(this);
 
   @DomName('HTMLButtonElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.Native_HTMLButtonElement_formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLButtonElement.$formEnctype_Setter(this, value);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.Native_HTMLButtonElement_formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLButtonElement.$formMethod_Getter(this);
 
   @DomName('HTMLButtonElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.Native_HTMLButtonElement_formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLButtonElement.$formMethod_Setter(this, value);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.Native_HTMLButtonElement_formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLButtonElement.$formNoValidate_Getter(this);
 
   @DomName('HTMLButtonElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.Native_HTMLButtonElement_formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLButtonElement.$formNoValidate_Setter(this, value);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.Native_HTMLButtonElement_formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLButtonElement.$formTarget_Getter(this);
 
   @DomName('HTMLButtonElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.Native_HTMLButtonElement_formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLButtonElement.$formTarget_Setter(this, value);
 
   @DomName('HTMLButtonElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLButtonElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLButtonElement.$labels_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLButtonElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLButtonElement.$name_Getter(this);
 
   @DomName('HTMLButtonElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLButtonElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLButtonElement.$name_Setter(this, value);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLButtonElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLButtonElement.$type_Getter(this);
 
   @DomName('HTMLButtonElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLButtonElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLButtonElement.$type_Setter(this, value);
 
   @DomName('HTMLButtonElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLButtonElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLButtonElement.$validationMessage_Getter(this);
 
   @DomName('HTMLButtonElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLButtonElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLButtonElement.$validity_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLButtonElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLButtonElement.$value_Getter(this);
 
   @DomName('HTMLButtonElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLButtonElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLButtonElement.$value_Setter(this, value);
 
   @DomName('HTMLButtonElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLButtonElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLButtonElement.$willValidate_Getter(this);
 
   @DomName('HTMLButtonElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLButtonElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLButtonElement.$checkValidity_Callback(this);
 
   @DomName('HTMLButtonElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLButtonElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLButtonElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1658,11 +1658,11 @@
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.Native_Canvas2DContextAttributes_alpha_Getter(this);
+  bool get alpha => _blink.BlinkCanvas2DContextAttributes.$alpha_Getter(this);
 
   @DomName('Canvas2DContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.Native_Canvas2DContextAttributes_alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkCanvas2DContextAttributes.$alpha_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1713,30 +1713,30 @@
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLCanvasElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLCanvasElement.$height_Getter(this);
 
   /// The height of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLCanvasElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLCanvasElement.$height_Setter(this, value);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLCanvasElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLCanvasElement.$width_Getter(this);
 
   /// The width of this canvas element in CSS pixels.
   @DomName('HTMLCanvasElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLCanvasElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLCanvasElement.$width_Setter(this, value);
 
   @DomName('HTMLCanvasElement.getContext')
   @DocsEditable()
-  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.Native_HTMLCanvasElement_getContext_Callback(this, contextId, attrs);
+  CanvasRenderingContext getContext(String contextId, [Map attrs]) => _blink.BlinkHTMLCanvasElement.$getContext_Callback(this, contextId, attrs);
 
   @DomName('HTMLCanvasElement.toDataURL')
   @DocsEditable()
-  String _toDataUrl(String type, [num quality]) => _blink.Native_HTMLCanvasElement_toDataURL_Callback(this, type, quality);
+  String _toDataUrl(String type, [num quality]) => _blink.BlinkHTMLCanvasElement.$toDataURL_Callback(this, type, quality);
 
   /// Stream of `webglcontextlost` events handled by this [CanvasElement].
   @DomName('HTMLCanvasElement.onwebglcontextlost')
@@ -1879,7 +1879,7 @@
    */
   @DomName('CanvasGradient.addColorStop')
   @DocsEditable()
-  void addColorStop(num offset, String color) => _blink.Native_CanvasGradient_addColorStop_Callback(this, offset, color);
+  void addColorStop(num offset, String color) => _blink.BlinkCanvasGradient.$addColorStop_Callback(this, offset, color);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1945,7 +1945,7 @@
   /// Reference to the canvas element to which this context belongs.
   @DomName('CanvasRenderingContext.canvas')
   @DocsEditable()
-  CanvasElement get canvas => _blink.Native_CanvasRenderingContext_canvas_Getter(this);
+  CanvasElement get canvas => _blink.BlinkCanvasRenderingContext.$canvas_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1961,44 +1961,44 @@
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix get currentTransform => _blink.Native_CanvasRenderingContext2D_currentTransform_Getter(this);
+  Matrix get currentTransform => _blink.BlinkCanvasRenderingContext2D.$currentTransform_Getter(this);
 
   @DomName('CanvasRenderingContext2D.currentTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTransform(Matrix value) => _blink.Native_CanvasRenderingContext2D_currentTransform_Setter(this, value);
+  void set currentTransform(Matrix value) => _blink.BlinkCanvasRenderingContext2D.$currentTransform_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  Object get fillStyle => _blink.Native_CanvasRenderingContext2D_fillStyle_Getter(this);
+  Object get fillStyle => _blink.BlinkCanvasRenderingContext2D.$fillStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.fillStyle')
   @DocsEditable()
-  void set fillStyle(Object value) => _blink.Native_CanvasRenderingContext2D_fillStyle_Setter(this, value);
+  void set fillStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.$fillStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  String get font => _blink.Native_CanvasRenderingContext2D_font_Getter(this);
+  String get font => _blink.BlinkCanvasRenderingContext2D.$font_Getter(this);
 
   @DomName('CanvasRenderingContext2D.font')
   @DocsEditable()
-  void set font(String value) => _blink.Native_CanvasRenderingContext2D_font_Setter(this, value);
+  void set font(String value) => _blink.BlinkCanvasRenderingContext2D.$font_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  num get globalAlpha => _blink.Native_CanvasRenderingContext2D_globalAlpha_Getter(this);
+  num get globalAlpha => _blink.BlinkCanvasRenderingContext2D.$globalAlpha_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalAlpha')
   @DocsEditable()
-  void set globalAlpha(num value) => _blink.Native_CanvasRenderingContext2D_globalAlpha_Setter(this, value);
+  void set globalAlpha(num value) => _blink.BlinkCanvasRenderingContext2D.$globalAlpha_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  String get globalCompositeOperation => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Getter(this);
+  String get globalCompositeOperation => _blink.BlinkCanvasRenderingContext2D.$globalCompositeOperation_Getter(this);
 
   @DomName('CanvasRenderingContext2D.globalCompositeOperation')
   @DocsEditable()
-  void set globalCompositeOperation(String value) => _blink.Native_CanvasRenderingContext2D_globalCompositeOperation_Setter(this, value);
+  void set globalCompositeOperation(String value) => _blink.BlinkCanvasRenderingContext2D.$globalCompositeOperation_Setter(this, value);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2013,7 +2013,7 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get imageSmoothingEnabled => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Getter(this);
+  bool get imageSmoothingEnabled => _blink.BlinkCanvasRenderingContext2D.$imageSmoothingEnabled_Getter(this);
 
   /**
    * Whether images and patterns on this canvas will be smoothed when this
@@ -2028,262 +2028,262 @@
   @DomName('CanvasRenderingContext2D.imageSmoothingEnabled')
   @DocsEditable()
   @Experimental() // untriaged
-  void set imageSmoothingEnabled(bool value) => _blink.Native_CanvasRenderingContext2D_imageSmoothingEnabled_Setter(this, value);
+  void set imageSmoothingEnabled(bool value) => _blink.BlinkCanvasRenderingContext2D.$imageSmoothingEnabled_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  String get lineCap => _blink.Native_CanvasRenderingContext2D_lineCap_Getter(this);
+  String get lineCap => _blink.BlinkCanvasRenderingContext2D.$lineCap_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineCap')
   @DocsEditable()
-  void set lineCap(String value) => _blink.Native_CanvasRenderingContext2D_lineCap_Setter(this, value);
+  void set lineCap(String value) => _blink.BlinkCanvasRenderingContext2D.$lineCap_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  num get lineDashOffset => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Getter(this);
+  num get lineDashOffset => _blink.BlinkCanvasRenderingContext2D.$lineDashOffset_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineDashOffset')
   @DocsEditable()
-  void set lineDashOffset(num value) => _blink.Native_CanvasRenderingContext2D_lineDashOffset_Setter(this, value);
+  void set lineDashOffset(num value) => _blink.BlinkCanvasRenderingContext2D.$lineDashOffset_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  String get lineJoin => _blink.Native_CanvasRenderingContext2D_lineJoin_Getter(this);
+  String get lineJoin => _blink.BlinkCanvasRenderingContext2D.$lineJoin_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineJoin')
   @DocsEditable()
-  void set lineJoin(String value) => _blink.Native_CanvasRenderingContext2D_lineJoin_Setter(this, value);
+  void set lineJoin(String value) => _blink.BlinkCanvasRenderingContext2D.$lineJoin_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  num get lineWidth => _blink.Native_CanvasRenderingContext2D_lineWidth_Getter(this);
+  num get lineWidth => _blink.BlinkCanvasRenderingContext2D.$lineWidth_Getter(this);
 
   @DomName('CanvasRenderingContext2D.lineWidth')
   @DocsEditable()
-  void set lineWidth(num value) => _blink.Native_CanvasRenderingContext2D_lineWidth_Setter(this, value);
+  void set lineWidth(num value) => _blink.BlinkCanvasRenderingContext2D.$lineWidth_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  num get miterLimit => _blink.Native_CanvasRenderingContext2D_miterLimit_Getter(this);
+  num get miterLimit => _blink.BlinkCanvasRenderingContext2D.$miterLimit_Getter(this);
 
   @DomName('CanvasRenderingContext2D.miterLimit')
   @DocsEditable()
-  void set miterLimit(num value) => _blink.Native_CanvasRenderingContext2D_miterLimit_Setter(this, value);
+  void set miterLimit(num value) => _blink.BlinkCanvasRenderingContext2D.$miterLimit_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  num get shadowBlur => _blink.Native_CanvasRenderingContext2D_shadowBlur_Getter(this);
+  num get shadowBlur => _blink.BlinkCanvasRenderingContext2D.$shadowBlur_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowBlur')
   @DocsEditable()
-  void set shadowBlur(num value) => _blink.Native_CanvasRenderingContext2D_shadowBlur_Setter(this, value);
+  void set shadowBlur(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowBlur_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  String get shadowColor => _blink.Native_CanvasRenderingContext2D_shadowColor_Getter(this);
+  String get shadowColor => _blink.BlinkCanvasRenderingContext2D.$shadowColor_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowColor')
   @DocsEditable()
-  void set shadowColor(String value) => _blink.Native_CanvasRenderingContext2D_shadowColor_Setter(this, value);
+  void set shadowColor(String value) => _blink.BlinkCanvasRenderingContext2D.$shadowColor_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  num get shadowOffsetX => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Getter(this);
+  num get shadowOffsetX => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetX_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetX')
   @DocsEditable()
-  void set shadowOffsetX(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetX_Setter(this, value);
+  void set shadowOffsetX(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetX_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  num get shadowOffsetY => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Getter(this);
+  num get shadowOffsetY => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetY_Getter(this);
 
   @DomName('CanvasRenderingContext2D.shadowOffsetY')
   @DocsEditable()
-  void set shadowOffsetY(num value) => _blink.Native_CanvasRenderingContext2D_shadowOffsetY_Setter(this, value);
+  void set shadowOffsetY(num value) => _blink.BlinkCanvasRenderingContext2D.$shadowOffsetY_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  Object get strokeStyle => _blink.Native_CanvasRenderingContext2D_strokeStyle_Getter(this);
+  Object get strokeStyle => _blink.BlinkCanvasRenderingContext2D.$strokeStyle_Getter(this);
 
   @DomName('CanvasRenderingContext2D.strokeStyle')
   @DocsEditable()
-  void set strokeStyle(Object value) => _blink.Native_CanvasRenderingContext2D_strokeStyle_Setter(this, value);
+  void set strokeStyle(Object value) => _blink.BlinkCanvasRenderingContext2D.$strokeStyle_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  String get textAlign => _blink.Native_CanvasRenderingContext2D_textAlign_Getter(this);
+  String get textAlign => _blink.BlinkCanvasRenderingContext2D.$textAlign_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textAlign')
   @DocsEditable()
-  void set textAlign(String value) => _blink.Native_CanvasRenderingContext2D_textAlign_Setter(this, value);
+  void set textAlign(String value) => _blink.BlinkCanvasRenderingContext2D.$textAlign_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  String get textBaseline => _blink.Native_CanvasRenderingContext2D_textBaseline_Getter(this);
+  String get textBaseline => _blink.BlinkCanvasRenderingContext2D.$textBaseline_Getter(this);
 
   @DomName('CanvasRenderingContext2D.textBaseline')
   @DocsEditable()
-  void set textBaseline(String value) => _blink.Native_CanvasRenderingContext2D_textBaseline_Setter(this, value);
+  void set textBaseline(String value) => _blink.BlinkCanvasRenderingContext2D.$textBaseline_Setter(this, value);
 
   @DomName('CanvasRenderingContext2D.arc')
   @DocsEditable()
-  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void _arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.$arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('CanvasRenderingContext2D.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_CanvasRenderingContext2D_arcTo_Callback(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkCanvasRenderingContext2D.$arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('CanvasRenderingContext2D.beginPath')
   @DocsEditable()
-  void beginPath() => _blink.Native_CanvasRenderingContext2D_beginPath_Callback(this);
+  void beginPath() => _blink.BlinkCanvasRenderingContext2D.$beginPath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_CanvasRenderingContext2D_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkCanvasRenderingContext2D.$bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('CanvasRenderingContext2D.clearRect')
   @DocsEditable()
-  void clearRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_clearRect_Callback(this, x, y, width, height);
+  void clearRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$clearRect_Callback(this, x, y, width, height);
 
-  void clip([String winding]) => _blink.Native_CanvasRenderingContext2D_clip(this, winding);
+  void clip([String winding]) => _blink.BlinkCanvasRenderingContext2D.$clip(this, winding);
 
   @DomName('CanvasRenderingContext2D.closePath')
   @DocsEditable()
-  void closePath() => _blink.Native_CanvasRenderingContext2D_closePath_Callback(this);
+  void closePath() => _blink.BlinkCanvasRenderingContext2D.$closePath_Callback(this);
 
   @DomName('CanvasRenderingContext2D.createImageData')
   @DocsEditable()
-  ImageData createImageData(num sw, num sh) => _blink.Native_CanvasRenderingContext2D_createImageData_Callback(this, sw, sh);
+  ImageData createImageData(num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.$createImageData_Callback(this, sw, sh);
 
   @DomName('CanvasRenderingContext2D.createImageDataFromImageData')
   @DocsEditable()
-  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.Native_CanvasRenderingContext2D_createImageDataFromImageData_Callback(this, imagedata);
+  ImageData createImageDataFromImageData(ImageData imagedata) => _blink.BlinkCanvasRenderingContext2D.$createImageDataFromImageData_Callback(this, imagedata);
 
   @DomName('CanvasRenderingContext2D.createLinearGradient')
   @DocsEditable()
-  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.Native_CanvasRenderingContext2D_createLinearGradient_Callback(this, x0, y0, x1, y1);
+  CanvasGradient createLinearGradient(num x0, num y0, num x1, num y1) => _blink.BlinkCanvasRenderingContext2D.$createLinearGradient_Callback(this, x0, y0, x1, y1);
 
   @DomName('CanvasRenderingContext2D.createPattern')
   @DocsEditable()
-  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPattern_Callback(this, canvas, repetitionType);
+  CanvasPattern createPattern(CanvasElement canvas, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.$createPattern_Callback(this, canvas, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createPatternFromImage')
   @DocsEditable()
-  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.Native_CanvasRenderingContext2D_createPatternFromImage_Callback(this, image, repetitionType);
+  CanvasPattern createPatternFromImage(ImageElement image, String repetitionType) => _blink.BlinkCanvasRenderingContext2D.$createPatternFromImage_Callback(this, image, repetitionType);
 
   @DomName('CanvasRenderingContext2D.createRadialGradient')
   @DocsEditable()
-  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.Native_CanvasRenderingContext2D_createRadialGradient_Callback(this, x0, y0, r0, x1, y1, r1);
+  CanvasGradient createRadialGradient(num x0, num y0, num r0, num x1, num y1, num r1) => _blink.BlinkCanvasRenderingContext2D.$createRadialGradient_Callback(this, x0, y0, r0, x1, y1, r1);
 
   @DomName('CanvasRenderingContext2D.drawCustomFocusRing')
   @DocsEditable()
   @Experimental() // untriaged
-  bool drawCustomFocusRing(Element element) => _blink.Native_CanvasRenderingContext2D_drawCustomFocusRing_Callback(this, element);
+  bool drawCustomFocusRing(Element element) => _blink.BlinkCanvasRenderingContext2D.$drawCustomFocusRing_Callback(this, element);
 
-  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.Native_CanvasRenderingContext2D__drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
+  void _drawImage(canvas_OR_image_OR_imageBitmap_OR_video, num sx_OR_x, num sy_OR_y, [num sw_OR_width, num height_OR_sh, num dx, num dy, num dw, num dh]) => _blink.BlinkCanvasRenderingContext2D.$_drawImage(this, canvas_OR_image_OR_imageBitmap_OR_video, sx_OR_x, sy_OR_y, sw_OR_width, height_OR_sh, dx, dy, dw, dh);
 
   @DomName('CanvasRenderingContext2D.ellipse')
   @DocsEditable()
   @Experimental() // untriaged
-  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_CanvasRenderingContext2D_ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
+  void ellipse(num x, num y, num radiusX, num radiusY, num rotation, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkCanvasRenderingContext2D.$ellipse_Callback(this, x, y, radiusX, radiusY, rotation, startAngle, endAngle, anticlockwise);
 
-  void fill([String winding]) => _blink.Native_CanvasRenderingContext2D_fill(this, winding);
+  void fill([String winding]) => _blink.BlinkCanvasRenderingContext2D.$fill(this, winding);
 
   @DomName('CanvasRenderingContext2D.fillRect')
   @DocsEditable()
-  void fillRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_fillRect_Callback(this, x, y, width, height);
+  void fillRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$fillRect_Callback(this, x, y, width, height);
 
-  void fillText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_fillText(this, text, x, y, maxWidth);
+  void fillText(String text, num x, num y, [num maxWidth]) => _blink.BlinkCanvasRenderingContext2D.$fillText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.getContextAttributes')
   @DocsEditable()
   // http://wiki.whatwg.org/wiki/CanvasOpaque#Suggested_IDL
   @Experimental()
-  Canvas2DContextAttributes getContextAttributes() => _blink.Native_CanvasRenderingContext2D_getContextAttributes_Callback(this);
+  Canvas2DContextAttributes getContextAttributes() => _blink.BlinkCanvasRenderingContext2D.$getContextAttributes_Callback(this);
 
   @DomName('CanvasRenderingContext2D.getImageData')
   @DocsEditable()
-  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.Native_CanvasRenderingContext2D_getImageData_Callback(this, sx, sy, sw, sh);
+  ImageData getImageData(num sx, num sy, num sw, num sh) => _blink.BlinkCanvasRenderingContext2D.$getImageData_Callback(this, sx, sy, sw, sh);
 
   @DomName('CanvasRenderingContext2D.getLineDash')
   @DocsEditable()
-  List<num> _getLineDash() => _blink.Native_CanvasRenderingContext2D_getLineDash_Callback(this);
+  List<num> _getLineDash() => _blink.BlinkCanvasRenderingContext2D.$getLineDash_Callback(this);
 
-  bool isPointInPath(num x, num y, [String winding]) => _blink.Native_CanvasRenderingContext2D_isPointInPath(this, x, y, winding);
+  bool isPointInPath(num x, num y, [String winding]) => _blink.BlinkCanvasRenderingContext2D.$isPointInPath(this, x, y, winding);
 
   @DomName('CanvasRenderingContext2D.isPointInStroke')
   @DocsEditable()
-  bool isPointInStroke(num x, num y) => _blink.Native_CanvasRenderingContext2D_isPointInStroke_Callback(this, x, y);
+  bool isPointInStroke(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$isPointInStroke_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_lineTo_Callback(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$lineTo_Callback(this, x, y);
 
   @DomName('CanvasRenderingContext2D.measureText')
   @DocsEditable()
-  TextMetrics measureText(String text) => _blink.Native_CanvasRenderingContext2D_measureText_Callback(this, text);
+  TextMetrics measureText(String text) => _blink.BlinkCanvasRenderingContext2D.$measureText_Callback(this, text);
 
   @DomName('CanvasRenderingContext2D.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.Native_CanvasRenderingContext2D_moveTo_Callback(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkCanvasRenderingContext2D.$moveTo_Callback(this, x, y);
 
-  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.Native_CanvasRenderingContext2D_putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
+  void putImageData(ImageData imagedata, num dx, num dy, [num dirtyX, num dirtyY, num dirtyWidth, num dirtyHeight]) => _blink.BlinkCanvasRenderingContext2D.$putImageData(this, imagedata, dx, dy, dirtyX, dirtyY, dirtyWidth, dirtyHeight);
 
   @DomName('CanvasRenderingContext2D.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_CanvasRenderingContext2D_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkCanvasRenderingContext2D.$quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('CanvasRenderingContext2D.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_rect_Callback(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$rect_Callback(this, x, y, width, height);
 
   @DomName('CanvasRenderingContext2D.resetTransform')
   @DocsEditable()
   @Experimental() // untriaged
-  void resetTransform() => _blink.Native_CanvasRenderingContext2D_resetTransform_Callback(this);
+  void resetTransform() => _blink.BlinkCanvasRenderingContext2D.$resetTransform_Callback(this);
 
   @DomName('CanvasRenderingContext2D.restore')
   @DocsEditable()
-  void restore() => _blink.Native_CanvasRenderingContext2D_restore_Callback(this);
+  void restore() => _blink.BlinkCanvasRenderingContext2D.$restore_Callback(this);
 
   @DomName('CanvasRenderingContext2D.rotate')
   @DocsEditable()
-  void rotate(num angle) => _blink.Native_CanvasRenderingContext2D_rotate_Callback(this, angle);
+  void rotate(num angle) => _blink.BlinkCanvasRenderingContext2D.$rotate_Callback(this, angle);
 
   @DomName('CanvasRenderingContext2D.save')
   @DocsEditable()
-  void save() => _blink.Native_CanvasRenderingContext2D_save_Callback(this);
+  void save() => _blink.BlinkCanvasRenderingContext2D.$save_Callback(this);
 
   @DomName('CanvasRenderingContext2D.scale')
   @DocsEditable()
-  void scale(num sx, num sy) => _blink.Native_CanvasRenderingContext2D_scale_Callback(this, sx, sy);
+  void scale(num sx, num sy) => _blink.BlinkCanvasRenderingContext2D.$scale_Callback(this, sx, sy);
 
   @DomName('CanvasRenderingContext2D.setLineDash')
   @DocsEditable()
-  void setLineDash(List<num> dash) => _blink.Native_CanvasRenderingContext2D_setLineDash_Callback(this, dash);
+  void setLineDash(List<num> dash) => _blink.BlinkCanvasRenderingContext2D.$setLineDash_Callback(this, dash);
 
   @DomName('CanvasRenderingContext2D.setTransform')
   @DocsEditable()
-  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_setTransform_Callback(this, m11, m12, m21, m22, dx, dy);
+  void setTransform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.$setTransform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.stroke')
   @DocsEditable()
-  void stroke() => _blink.Native_CanvasRenderingContext2D_stroke_Callback(this);
+  void stroke() => _blink.BlinkCanvasRenderingContext2D.$stroke_Callback(this);
 
   @DomName('CanvasRenderingContext2D.strokeRect')
   @DocsEditable()
-  void strokeRect(num x, num y, num width, num height) => _blink.Native_CanvasRenderingContext2D_strokeRect_Callback(this, x, y, width, height);
+  void strokeRect(num x, num y, num width, num height) => _blink.BlinkCanvasRenderingContext2D.$strokeRect_Callback(this, x, y, width, height);
 
-  void strokeText(String text, num x, num y, [num maxWidth]) => _blink.Native_CanvasRenderingContext2D_strokeText(this, text, x, y, maxWidth);
+  void strokeText(String text, num x, num y, [num maxWidth]) => _blink.BlinkCanvasRenderingContext2D.$strokeText(this, text, x, y, maxWidth);
 
   @DomName('CanvasRenderingContext2D.transform')
   @DocsEditable()
-  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.Native_CanvasRenderingContext2D_transform_Callback(this, m11, m12, m21, m22, dx, dy);
+  void transform(num m11, num m12, num m21, num m22, num dx, num dy) => _blink.BlinkCanvasRenderingContext2D.$transform_Callback(this, m11, m12, m21, m22, dx, dy);
 
   @DomName('CanvasRenderingContext2D.translate')
   @DocsEditable()
-  void translate(num tx, num ty) => _blink.Native_CanvasRenderingContext2D_translate_Callback(this, tx, ty);
+  void translate(num tx, num ty) => _blink.BlinkCanvasRenderingContext2D.$translate_Callback(this, tx, ty);
 
 
   /**
@@ -2535,43 +2535,43 @@
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  String get data => _blink.Native_CharacterData_data_Getter(this);
+  String get data => _blink.BlinkCharacterData.$data_Getter(this);
 
   @DomName('CharacterData.data')
   @DocsEditable()
-  void set data(String value) => _blink.Native_CharacterData_data_Setter(this, value);
+  void set data(String value) => _blink.BlinkCharacterData.$data_Setter(this, value);
 
   @DomName('CharacterData.length')
   @DocsEditable()
-  int get length => _blink.Native_CharacterData_length_Getter(this);
+  int get length => _blink.BlinkCharacterData.$length_Getter(this);
 
   @DomName('CharacterData.appendData')
   @DocsEditable()
-  void appendData(String data) => _blink.Native_CharacterData_appendData_Callback(this, data);
+  void appendData(String data) => _blink.BlinkCharacterData.$appendData_Callback(this, data);
 
   @DomName('CharacterData.deleteData')
   @DocsEditable()
-  void deleteData(int offset, int length) => _blink.Native_CharacterData_deleteData_Callback(this, offset, length);
+  void deleteData(int offset, int length) => _blink.BlinkCharacterData.$deleteData_Callback(this, offset, length);
 
   @DomName('CharacterData.insertData')
   @DocsEditable()
-  void insertData(int offset, String data) => _blink.Native_CharacterData_insertData_Callback(this, offset, data);
+  void insertData(int offset, String data) => _blink.BlinkCharacterData.$insertData_Callback(this, offset, data);
 
   @DomName('CharacterData.replaceData')
   @DocsEditable()
-  void replaceData(int offset, int length, String data) => _blink.Native_CharacterData_replaceData_Callback(this, offset, length, data);
+  void replaceData(int offset, int length, String data) => _blink.BlinkCharacterData.$replaceData_Callback(this, offset, length, data);
 
   @DomName('CharacterData.substringData')
   @DocsEditable()
-  String substringData(int offset, int length) => _blink.Native_CharacterData_substringData_Callback(this, offset, length);
+  String substringData(int offset, int length) => _blink.BlinkCharacterData.$substringData_Callback(this, offset, length);
 
   @DomName('CharacterData.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.Native_CharacterData_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkCharacterData.$nextElementSibling_Getter(this);
 
   @DomName('CharacterData.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.Native_CharacterData_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkCharacterData.$previousElementSibling_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2591,17 +2591,17 @@
   @DomName('ChildNode.nextElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get nextElementSibling => _blink.Native_ChildNode_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkChildNode.$nextElementSibling_Getter(this);
 
   @DomName('ChildNode.previousElementSibling')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get previousElementSibling => _blink.Native_ChildNode_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkChildNode.$previousElementSibling_Getter(this);
 
   @DomName('ChildNode.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove() => _blink.Native_ChildNode_remove_Callback(this);
+  void remove() => _blink.BlinkChildNode.$remove_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2619,15 +2619,15 @@
 
   @DomName('CloseEvent.code')
   @DocsEditable()
-  int get code => _blink.Native_CloseEvent_code_Getter(this);
+  int get code => _blink.BlinkCloseEvent.$code_Getter(this);
 
   @DomName('CloseEvent.reason')
   @DocsEditable()
-  String get reason => _blink.Native_CloseEvent_reason_Getter(this);
+  String get reason => _blink.BlinkCloseEvent.$reason_Getter(this);
 
   @DomName('CloseEvent.wasClean')
   @DocsEditable()
-  bool get wasClean => _blink.Native_CloseEvent_wasClean_Getter(this);
+  bool get wasClean => _blink.BlinkCloseEvent.$wasClean_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2643,7 +2643,7 @@
 
   @DomName('Comment.Comment')
   @DocsEditable()
-  factory Comment([String data]) => _blink.Native_Comment_Comment(data);
+  factory Comment([String data]) => _blink.BlinkComment.$mkComment(data);
 }
 // 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
@@ -2670,20 +2670,20 @@
   @DomName('CompositionEvent.activeSegmentEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentEnd => _blink.Native_CompositionEvent_activeSegmentEnd_Getter(this);
+  int get activeSegmentEnd => _blink.BlinkCompositionEvent.$activeSegmentEnd_Getter(this);
 
   @DomName('CompositionEvent.activeSegmentStart')
   @DocsEditable()
   @Experimental() // untriaged
-  int get activeSegmentStart => _blink.Native_CompositionEvent_activeSegmentStart_Getter(this);
+  int get activeSegmentStart => _blink.BlinkCompositionEvent.$activeSegmentStart_Getter(this);
 
   @DomName('CompositionEvent.data')
   @DocsEditable()
-  String get data => _blink.Native_CompositionEvent_data_Getter(this);
+  String get data => _blink.BlinkCompositionEvent.$data_Getter(this);
 
   @DomName('CompositionEvent.initCompositionEvent')
   @DocsEditable()
-  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_CompositionEvent_initCompositionEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initCompositionEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkCompositionEvent.$initCompositionEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2702,7 +2702,7 @@
   @DomName('Console.memory')
   @DocsEditable()
   @Experimental()
-  MemoryInfo get memory => _blink.Native_Console_memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkConsole.$memory_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2722,117 +2722,117 @@
   @DomName('ConsoleBase.assertCondition')
   @DocsEditable()
   @Experimental() // untriaged
-  void assertCondition(bool condition, Object arg) => _blink.Native_ConsoleBase_assertCondition_Callback(this, condition, arg);
+  void assertCondition(bool condition, Object arg) => _blink.BlinkConsoleBase.$assertCondition_Callback(this, condition, arg);
 
   @DomName('ConsoleBase.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear(Object arg) => _blink.Native_ConsoleBase_clear_Callback(this, arg);
+  void clear(Object arg) => _blink.BlinkConsoleBase.$clear_Callback(this, arg);
 
   @DomName('ConsoleBase.count')
   @DocsEditable()
   @Experimental() // untriaged
-  void count(Object arg) => _blink.Native_ConsoleBase_count_Callback(this, arg);
+  void count(Object arg) => _blink.BlinkConsoleBase.$count_Callback(this, arg);
 
   @DomName('ConsoleBase.debug')
   @DocsEditable()
   @Experimental() // untriaged
-  void debug(Object arg) => _blink.Native_ConsoleBase_debug_Callback(this, arg);
+  void debug(Object arg) => _blink.BlinkConsoleBase.$debug_Callback(this, arg);
 
   @DomName('ConsoleBase.dir')
   @DocsEditable()
   @Experimental() // untriaged
-  void dir(Object arg) => _blink.Native_ConsoleBase_dir_Callback(this, arg);
+  void dir(Object arg) => _blink.BlinkConsoleBase.$dir_Callback(this, arg);
 
   @DomName('ConsoleBase.dirxml')
   @DocsEditable()
   @Experimental() // untriaged
-  void dirxml(Object arg) => _blink.Native_ConsoleBase_dirxml_Callback(this, arg);
+  void dirxml(Object arg) => _blink.BlinkConsoleBase.$dirxml_Callback(this, arg);
 
   @DomName('ConsoleBase.error')
   @DocsEditable()
   @Experimental() // untriaged
-  void error(Object arg) => _blink.Native_ConsoleBase_error_Callback(this, arg);
+  void error(Object arg) => _blink.BlinkConsoleBase.$error_Callback(this, arg);
 
   @DomName('ConsoleBase.group')
   @DocsEditable()
   @Experimental() // untriaged
-  void group(Object arg) => _blink.Native_ConsoleBase_group_Callback(this, arg);
+  void group(Object arg) => _blink.BlinkConsoleBase.$group_Callback(this, arg);
 
   @DomName('ConsoleBase.groupCollapsed')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupCollapsed(Object arg) => _blink.Native_ConsoleBase_groupCollapsed_Callback(this, arg);
+  void groupCollapsed(Object arg) => _blink.BlinkConsoleBase.$groupCollapsed_Callback(this, arg);
 
   @DomName('ConsoleBase.groupEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void groupEnd() => _blink.Native_ConsoleBase_groupEnd_Callback(this);
+  void groupEnd() => _blink.BlinkConsoleBase.$groupEnd_Callback(this);
 
   @DomName('ConsoleBase.info')
   @DocsEditable()
   @Experimental() // untriaged
-  void info(Object arg) => _blink.Native_ConsoleBase_info_Callback(this, arg);
+  void info(Object arg) => _blink.BlinkConsoleBase.$info_Callback(this, arg);
 
   @DomName('ConsoleBase.log')
   @DocsEditable()
   @Experimental() // untriaged
-  void log(Object arg) => _blink.Native_ConsoleBase_log_Callback(this, arg);
+  void log(Object arg) => _blink.BlinkConsoleBase.$log_Callback(this, arg);
 
   @DomName('ConsoleBase.markTimeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void markTimeline(String title) => _blink.Native_ConsoleBase_markTimeline_Callback(this, title);
+  void markTimeline(String title) => _blink.BlinkConsoleBase.$markTimeline_Callback(this, title);
 
   @DomName('ConsoleBase.profile')
   @DocsEditable()
   @Experimental() // untriaged
-  void profile(String title) => _blink.Native_ConsoleBase_profile_Callback(this, title);
+  void profile(String title) => _blink.BlinkConsoleBase.$profile_Callback(this, title);
 
   @DomName('ConsoleBase.profileEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void profileEnd(String title) => _blink.Native_ConsoleBase_profileEnd_Callback(this, title);
+  void profileEnd(String title) => _blink.BlinkConsoleBase.$profileEnd_Callback(this, title);
 
   @DomName('ConsoleBase.table')
   @DocsEditable()
   @Experimental() // untriaged
-  void table(Object arg) => _blink.Native_ConsoleBase_table_Callback(this, arg);
+  void table(Object arg) => _blink.BlinkConsoleBase.$table_Callback(this, arg);
 
   @DomName('ConsoleBase.time')
   @DocsEditable()
   @Experimental() // untriaged
-  void time(String title) => _blink.Native_ConsoleBase_time_Callback(this, title);
+  void time(String title) => _blink.BlinkConsoleBase.$time_Callback(this, title);
 
   @DomName('ConsoleBase.timeEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeEnd(String title) => _blink.Native_ConsoleBase_timeEnd_Callback(this, title);
+  void timeEnd(String title) => _blink.BlinkConsoleBase.$timeEnd_Callback(this, title);
 
   @DomName('ConsoleBase.timeStamp')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeStamp(String title) => _blink.Native_ConsoleBase_timeStamp_Callback(this, title);
+  void timeStamp(String title) => _blink.BlinkConsoleBase.$timeStamp_Callback(this, title);
 
   @DomName('ConsoleBase.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  void timeline(String title) => _blink.Native_ConsoleBase_timeline_Callback(this, title);
+  void timeline(String title) => _blink.BlinkConsoleBase.$timeline_Callback(this, title);
 
   @DomName('ConsoleBase.timelineEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void timelineEnd(String title) => _blink.Native_ConsoleBase_timelineEnd_Callback(this, title);
+  void timelineEnd(String title) => _blink.BlinkConsoleBase.$timelineEnd_Callback(this, title);
 
   @DomName('ConsoleBase.trace')
   @DocsEditable()
   @Experimental() // untriaged
-  void trace(Object arg) => _blink.Native_ConsoleBase_trace_Callback(this, arg);
+  void trace(Object arg) => _blink.BlinkConsoleBase.$trace_Callback(this, arg);
 
   @DomName('ConsoleBase.warn')
   @DocsEditable()
   @Experimental() // untriaged
-  void warn(Object arg) => _blink.Native_ConsoleBase_warn_Callback(this, arg);
+  void warn(Object arg) => _blink.BlinkConsoleBase.$warn_Callback(this, arg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2866,23 +2866,23 @@
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance => _blink.Native_HTMLContentElement_resetStyleInheritance_Getter(this);
+  bool get resetStyleInheritance => _blink.BlinkHTMLContentElement.$resetStyleInheritance_Getter(this);
 
   @DomName('HTMLContentElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.Native_HTMLContentElement_resetStyleInheritance_Setter(this, value);
+  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLContentElement.$resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  String get select => _blink.Native_HTMLContentElement_select_Getter(this);
+  String get select => _blink.BlinkHTMLContentElement.$select_Getter(this);
 
   @DomName('HTMLContentElement.select')
   @DocsEditable()
-  void set select(String value) => _blink.Native_HTMLContentElement_select_Setter(this, value);
+  void set select(String value) => _blink.BlinkHTMLContentElement.$select_Setter(this, value);
 
   @DomName('HTMLContentElement.getDistributedNodes')
   @DocsEditable()
-  List<Node> getDistributedNodes() => _blink.Native_HTMLContentElement_getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLContentElement.$getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2900,31 +2900,31 @@
 
   @DomName('Coordinates.accuracy')
   @DocsEditable()
-  double get accuracy => _blink.Native_Coordinates_accuracy_Getter(this);
+  double get accuracy => _blink.BlinkCoordinates.$accuracy_Getter(this);
 
   @DomName('Coordinates.altitude')
   @DocsEditable()
-  double get altitude => _blink.Native_Coordinates_altitude_Getter(this);
+  double get altitude => _blink.BlinkCoordinates.$altitude_Getter(this);
 
   @DomName('Coordinates.altitudeAccuracy')
   @DocsEditable()
-  double get altitudeAccuracy => _blink.Native_Coordinates_altitudeAccuracy_Getter(this);
+  double get altitudeAccuracy => _blink.BlinkCoordinates.$altitudeAccuracy_Getter(this);
 
   @DomName('Coordinates.heading')
   @DocsEditable()
-  double get heading => _blink.Native_Coordinates_heading_Getter(this);
+  double get heading => _blink.BlinkCoordinates.$heading_Getter(this);
 
   @DomName('Coordinates.latitude')
   @DocsEditable()
-  double get latitude => _blink.Native_Coordinates_latitude_Getter(this);
+  double get latitude => _blink.BlinkCoordinates.$latitude_Getter(this);
 
   @DomName('Coordinates.longitude')
   @DocsEditable()
-  double get longitude => _blink.Native_Coordinates_longitude_Getter(this);
+  double get longitude => _blink.BlinkCoordinates.$longitude_Getter(this);
 
   @DomName('Coordinates.speed')
   @DocsEditable()
-  double get speed => _blink.Native_Coordinates_speed_Getter(this);
+  double get speed => _blink.BlinkCoordinates.$speed_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2950,11 +2950,11 @@
   @DomName('Crypto.subtle')
   @DocsEditable()
   @Experimental() // untriaged
-  _SubtleCrypto get subtle => _blink.Native_Crypto_subtle_Getter(this);
+  _SubtleCrypto get subtle => _blink.BlinkCrypto.$subtle_Getter(this);
 
   @DomName('Crypto.getRandomValues')
   @DocsEditable()
-  TypedData getRandomValues(TypedData array) => _blink.Native_Crypto_getRandomValues_Callback(this, array);
+  TypedData getRandomValues(TypedData array) => _blink.BlinkCrypto.$getRandomValues_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2974,22 +2974,22 @@
   @DomName('Key.algorithm')
   @DocsEditable()
   @Experimental() // untriaged
-  Algorithm get algorithm => _blink.Native_Key_algorithm_Getter(this);
+  Algorithm get algorithm => _blink.BlinkKey.$algorithm_Getter(this);
 
   @DomName('Key.extractable')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get extractable => _blink.Native_Key_extractable_Getter(this);
+  bool get extractable => _blink.BlinkKey.$extractable_Getter(this);
 
   @DomName('Key.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.Native_Key_type_Getter(this);
+  String get type => _blink.BlinkKey.$type_Getter(this);
 
   @DomName('Key.usages')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get usages => _blink.Native_Key_usages_Getter(this);
+  List<String> get usages => _blink.BlinkKey.$usages_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3009,11 +3009,11 @@
 
   @DomName('CSS.supports')
   @DocsEditable()
-  bool supports(String property, String value) => _blink.Native_CSS_supports_Callback(this, property, value);
+  bool supports(String property, String value) => _blink.BlinkCSS.$supports_Callback(this, property, value);
 
   @DomName('CSS.supportsCondition')
   @DocsEditable()
-  bool supportsCondition(String conditionText) => _blink.Native_CSS_supportsCondition_Callback(this, conditionText);
+  bool supportsCondition(String conditionText) => _blink.BlinkCSS.$supportsCondition_Callback(this, conditionText);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3033,11 +3033,11 @@
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  String get encoding => _blink.Native_CSSCharsetRule_encoding_Getter(this);
+  String get encoding => _blink.BlinkCSSCharsetRule.$encoding_Getter(this);
 
   @DomName('CSSCharsetRule.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.Native_CSSCharsetRule_encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkCSSCharsetRule.$encoding_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3059,7 +3059,7 @@
 
   @DomName('WebKitCSSFilterRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_WebKitCSSFilterRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkWebKitCSSFilterRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3080,7 +3080,7 @@
   @DomName('CSSFontFaceLoadEvent.fontfaces')
   @DocsEditable()
   @Experimental() // untriaged
-  List<FontFace> get fontfaces => _blink.Native_CSSFontFaceLoadEvent_fontfaces_Getter(this);
+  List<FontFace> get fontfaces => _blink.BlinkCSSFontFaceLoadEvent.$fontfaces_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3098,7 +3098,7 @@
 
   @DomName('CSSFontFaceRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSFontFaceRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSFontFaceRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3116,15 +3116,15 @@
 
   @DomName('CSSImportRule.href')
   @DocsEditable()
-  String get href => _blink.Native_CSSImportRule_href_Getter(this);
+  String get href => _blink.BlinkCSSImportRule.$href_Getter(this);
 
   @DomName('CSSImportRule.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_CSSImportRule_media_Getter(this);
+  MediaList get media => _blink.BlinkCSSImportRule.$media_Getter(this);
 
   @DomName('CSSImportRule.styleSheet')
   @DocsEditable()
-  CssStyleSheet get styleSheet => _blink.Native_CSSImportRule_styleSheet_Getter(this);
+  CssStyleSheet get styleSheet => _blink.BlinkCSSImportRule.$styleSheet_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3144,17 +3144,17 @@
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  String get keyText => _blink.Native_CSSKeyframeRule_keyText_Getter(this);
+  String get keyText => _blink.BlinkCSSKeyframeRule.$keyText_Getter(this);
 
   @DomName('CSSKeyframeRule.keyText')
   @DocsEditable()
   @Experimental() // untriaged
-  void set keyText(String value) => _blink.Native_CSSKeyframeRule_keyText_Setter(this, value);
+  void set keyText(String value) => _blink.BlinkCSSKeyframeRule.$keyText_Setter(this, value);
 
   @DomName('CSSKeyframeRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_CSSKeyframeRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSKeyframeRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3174,37 +3174,37 @@
   @DomName('CSSKeyframesRule.cssRules')
   @DocsEditable()
   @Experimental() // untriaged
-  List<CssRule> get cssRules => _blink.Native_CSSKeyframesRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSKeyframesRule.$cssRules_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_CSSKeyframesRule_name_Getter(this);
+  String get name => _blink.BlinkCSSKeyframesRule.$name_Getter(this);
 
   @DomName('CSSKeyframesRule.name')
   @DocsEditable()
   @Experimental() // untriaged
-  void set name(String value) => _blink.Native_CSSKeyframesRule_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkCSSKeyframesRule.$name_Setter(this, value);
 
   @DomName('CSSKeyframesRule.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule __getter__(int index) => _blink.Native_CSSKeyframesRule___getter___Callback(this, index);
+  CssKeyframeRule __getter__(int index) => _blink.BlinkCSSKeyframesRule.$__getter___Callback(this, index);
 
   @DomName('CSSKeyframesRule.deleteRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void deleteRule(String key) => _blink.Native_CSSKeyframesRule_deleteRule_Callback(this, key);
+  void deleteRule(String key) => _blink.BlinkCSSKeyframesRule.$deleteRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.findRule')
   @DocsEditable()
   @Experimental() // untriaged
-  CssKeyframeRule findRule(String key) => _blink.Native_CSSKeyframesRule_findRule_Callback(this, key);
+  CssKeyframeRule findRule(String key) => _blink.BlinkCSSKeyframesRule.$findRule_Callback(this, key);
 
   @DomName('CSSKeyframesRule.insertRule')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendRule(String rule) => _blink.Native_CSSKeyframesRule_insertRule_Callback(this, rule);
+  void appendRule(String rule) => _blink.BlinkCSSKeyframesRule.$insertRule_Callback(this, rule);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3222,19 +3222,19 @@
 
   @DomName('CSSMediaRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSMediaRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSMediaRule.$cssRules_Getter(this);
 
   @DomName('CSSMediaRule.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_CSSMediaRule_media_Getter(this);
+  MediaList get media => _blink.BlinkCSSMediaRule.$media_Getter(this);
 
   @DomName('CSSMediaRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSMediaRule_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSMediaRule.$deleteRule_Callback(this, index);
 
   @DomName('CSSMediaRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.Native_CSSMediaRule_insertRule_Callback(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSMediaRule.$insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3252,15 +3252,15 @@
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.Native_CSSPageRule_selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSPageRule.$selectorText_Getter(this);
 
   @DomName('CSSPageRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.Native_CSSPageRule_selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSPageRule.$selectorText_Setter(this, value);
 
   @DomName('CSSPageRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSPageRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSPageRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3339,23 +3339,23 @@
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  String get cssText => _blink.Native_CSSRule_cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSRule.$cssText_Getter(this);
 
   @DomName('CSSRule.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.Native_CSSRule_cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSRule.$cssText_Setter(this, value);
 
   @DomName('CSSRule.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.Native_CSSRule_parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSRule.$parentRule_Getter(this);
 
   @DomName('CSSRule.parentStyleSheet')
   @DocsEditable()
-  CssStyleSheet get parentStyleSheet => _blink.Native_CSSRule_parentStyleSheet_Getter(this);
+  CssStyleSheet get parentStyleSheet => _blink.BlinkCSSRule.$parentStyleSheet_Getter(this);
 
   @DomName('CSSRule.type')
   @DocsEditable()
-  int get type => _blink.Native_CSSRule_type_Getter(this);
+  int get type => _blink.BlinkCSSRule.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3396,43 +3396,43 @@
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  String get cssText => _blink.Native_CSSStyleDeclaration_cssText_Getter(this);
+  String get cssText => _blink.BlinkCSSStyleDeclaration.$cssText_Getter(this);
 
   @DomName('CSSStyleDeclaration.cssText')
   @DocsEditable()
-  void set cssText(String value) => _blink.Native_CSSStyleDeclaration_cssText_Setter(this, value);
+  void set cssText(String value) => _blink.BlinkCSSStyleDeclaration.$cssText_Setter(this, value);
 
   @DomName('CSSStyleDeclaration.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSStyleDeclaration_length_Getter(this);
+  int get length => _blink.BlinkCSSStyleDeclaration.$length_Getter(this);
 
   @DomName('CSSStyleDeclaration.parentRule')
   @DocsEditable()
-  CssRule get parentRule => _blink.Native_CSSStyleDeclaration_parentRule_Getter(this);
+  CssRule get parentRule => _blink.BlinkCSSStyleDeclaration.$parentRule_Getter(this);
 
   @DomName('CSSStyleDeclaration.__setter__')
   @DocsEditable()
-  void __setter__(String propertyName, String propertyValue) => _blink.Native_CSSStyleDeclaration___setter___Callback(this, propertyName, propertyValue);
+  void __setter__(String propertyName, String propertyValue) => _blink.BlinkCSSStyleDeclaration.$__setter___Callback(this, propertyName, propertyValue);
 
   @DomName('CSSStyleDeclaration.getPropertyPriority')
   @DocsEditable()
-  String getPropertyPriority(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyPriority_Callback(this, propertyName);
+  String getPropertyPriority(String propertyName) => _blink.BlinkCSSStyleDeclaration.$getPropertyPriority_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.getPropertyValue')
   @DocsEditable()
-  String _getPropertyValue(String propertyName) => _blink.Native_CSSStyleDeclaration_getPropertyValue_Callback(this, propertyName);
+  String _getPropertyValue(String propertyName) => _blink.BlinkCSSStyleDeclaration.$getPropertyValue_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_CSSStyleDeclaration_item_Callback(this, index);
+  String item(int index) => _blink.BlinkCSSStyleDeclaration.$item_Callback(this, index);
 
   @DomName('CSSStyleDeclaration.removeProperty')
   @DocsEditable()
-  String removeProperty(String propertyName) => _blink.Native_CSSStyleDeclaration_removeProperty_Callback(this, propertyName);
+  String removeProperty(String propertyName) => _blink.BlinkCSSStyleDeclaration.$removeProperty_Callback(this, propertyName);
 
   @DomName('CSSStyleDeclaration.setProperty')
   @DocsEditable()
-  void _setProperty(String propertyName, String value, String priority) => _blink.Native_CSSStyleDeclaration_setProperty_Callback(this, propertyName, value, priority);
+  void _setProperty(String propertyName, String value, String priority) => _blink.BlinkCSSStyleDeclaration.$setProperty_Callback(this, propertyName, value, priority);
 
 }
 
@@ -6648,15 +6648,15 @@
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  String get selectorText => _blink.Native_CSSStyleRule_selectorText_Getter(this);
+  String get selectorText => _blink.BlinkCSSStyleRule.$selectorText_Getter(this);
 
   @DomName('CSSStyleRule.selectorText')
   @DocsEditable()
-  void set selectorText(String value) => _blink.Native_CSSStyleRule_selectorText_Setter(this, value);
+  void set selectorText(String value) => _blink.BlinkCSSStyleRule.$selectorText_Setter(this, value);
 
   @DomName('CSSStyleRule.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_CSSStyleRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSStyleRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6674,29 +6674,29 @@
 
   @DomName('CSSStyleSheet.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSStyleSheet_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSStyleSheet.$cssRules_Getter(this);
 
   @DomName('CSSStyleSheet.ownerRule')
   @DocsEditable()
-  CssRule get ownerRule => _blink.Native_CSSStyleSheet_ownerRule_Getter(this);
+  CssRule get ownerRule => _blink.BlinkCSSStyleSheet.$ownerRule_Getter(this);
 
   @DomName('CSSStyleSheet.rules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> get rules => _blink.Native_CSSStyleSheet_rules_Getter(this);
+  List<CssRule> get rules => _blink.BlinkCSSStyleSheet.$rules_Getter(this);
 
-  int addRule(String selector, String style, [int index]) => _blink.Native_CSSStyleSheet_addRule(this, selector, style, index);
+  int addRule(String selector, String style, [int index]) => _blink.BlinkCSSStyleSheet.$addRule(this, selector, style, index);
 
   @DomName('CSSStyleSheet.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSStyleSheet_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSStyleSheet.$deleteRule_Callback(this, index);
 
-  int insertRule(String rule, [int index]) => _blink.Native_CSSStyleSheet_insertRule(this, rule, index);
+  int insertRule(String rule, [int index]) => _blink.BlinkCSSStyleSheet.$insertRule(this, rule, index);
 
   @DomName('CSSStyleSheet.removeRule')
   @DocsEditable()
   @Experimental() // non-standard
-  void removeRule(int index) => _blink.Native_CSSStyleSheet_removeRule_Callback(this, index);
+  void removeRule(int index) => _blink.BlinkCSSStyleSheet.$removeRule_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6714,19 +6714,19 @@
 
   @DomName('CSSSupportsRule.conditionText')
   @DocsEditable()
-  String get conditionText => _blink.Native_CSSSupportsRule_conditionText_Getter(this);
+  String get conditionText => _blink.BlinkCSSSupportsRule.$conditionText_Getter(this);
 
   @DomName('CSSSupportsRule.cssRules')
   @DocsEditable()
-  List<CssRule> get cssRules => _blink.Native_CSSSupportsRule_cssRules_Getter(this);
+  List<CssRule> get cssRules => _blink.BlinkCSSSupportsRule.$cssRules_Getter(this);
 
   @DomName('CSSSupportsRule.deleteRule')
   @DocsEditable()
-  void deleteRule(int index) => _blink.Native_CSSSupportsRule_deleteRule_Callback(this, index);
+  void deleteRule(int index) => _blink.BlinkCSSSupportsRule.$deleteRule_Callback(this, index);
 
   @DomName('CSSSupportsRule.insertRule')
   @DocsEditable()
-  int insertRule(String rule, int index) => _blink.Native_CSSSupportsRule_insertRule_Callback(this, rule, index);
+  int insertRule(String rule, int index) => _blink.BlinkCSSSupportsRule.$insertRule_Callback(this, rule, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6746,7 +6746,7 @@
   @DomName('CSSViewportRule.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_CSSViewportRule_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkCSSViewportRule.$style_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6794,11 +6794,11 @@
 
   @DomName('CustomEvent.detail')
   @DocsEditable()
-  Object get _detail => _blink.Native_CustomEvent_detail_Getter(this);
+  Object get _detail => _blink.BlinkCustomEvent.$detail_Getter(this);
 
   @DomName('CustomEvent.initCustomEvent')
   @DocsEditable()
-  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.Native_CustomEvent_initCustomEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, detailArg);
+  void _initCustomEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object detailArg) => _blink.BlinkCustomEvent.$initCustomEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, detailArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6857,7 +6857,7 @@
 
   @DomName('HTMLDataListElement.options')
   @DocsEditable()
-  List<Node> get options => _blink.Native_HTMLDataListElement_options_Getter(this);
+  List<Node> get options => _blink.BlinkHTMLDataListElement.$options_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6875,33 +6875,33 @@
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  String get dropEffect => _blink.Native_Clipboard_dropEffect_Getter(this);
+  String get dropEffect => _blink.BlinkClipboard.$dropEffect_Getter(this);
 
   @DomName('Clipboard.dropEffect')
   @DocsEditable()
-  void set dropEffect(String value) => _blink.Native_Clipboard_dropEffect_Setter(this, value);
+  void set dropEffect(String value) => _blink.BlinkClipboard.$dropEffect_Setter(this, value);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  String get effectAllowed => _blink.Native_Clipboard_effectAllowed_Getter(this);
+  String get effectAllowed => _blink.BlinkClipboard.$effectAllowed_Getter(this);
 
   @DomName('Clipboard.effectAllowed')
   @DocsEditable()
-  void set effectAllowed(String value) => _blink.Native_Clipboard_effectAllowed_Setter(this, value);
+  void set effectAllowed(String value) => _blink.BlinkClipboard.$effectAllowed_Setter(this, value);
 
   @DomName('Clipboard.files')
   @DocsEditable()
-  List<File> get files => _blink.Native_Clipboard_files_Getter(this);
+  List<File> get files => _blink.BlinkClipboard.$files_Getter(this);
 
   @DomName('Clipboard.items')
   @DocsEditable()
-  DataTransferItemList get items => _blink.Native_Clipboard_items_Getter(this);
+  DataTransferItemList get items => _blink.BlinkClipboard.$items_Getter(this);
 
   @DomName('Clipboard.types')
   @DocsEditable()
-  List<String> get types => _blink.Native_Clipboard_types_Getter(this);
+  List<String> get types => _blink.BlinkClipboard.$types_Getter(this);
 
-  void clearData([String type]) => _blink.Native_Clipboard_clearData(this, type);
+  void clearData([String type]) => _blink.BlinkClipboard.$clearData(this, type);
 
   /**
    * Gets the data for the specified type.
@@ -6921,15 +6921,15 @@
    */
   @DomName('Clipboard.getData')
   @DocsEditable()
-  String getData(String type) => _blink.Native_Clipboard_getData_Callback(this, type);
+  String getData(String type) => _blink.BlinkClipboard.$getData_Callback(this, type);
 
   @DomName('Clipboard.setData')
   @DocsEditable()
-  bool setData(String type, String data) => _blink.Native_Clipboard_setData_Callback(this, type, data);
+  bool setData(String type, String data) => _blink.BlinkClipboard.$setData_Callback(this, type, data);
 
   @DomName('Clipboard.setDragImage')
   @DocsEditable()
-  void setDragImage(Element image, int x, int y) => _blink.Native_Clipboard_setDragImage_Callback(this, image, x, y);
+  void setDragImage(Element image, int x, int y) => _blink.BlinkClipboard.$setDragImage_Callback(this, image, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6949,19 +6949,19 @@
 
   @DomName('DataTransferItem.kind')
   @DocsEditable()
-  String get kind => _blink.Native_DataTransferItem_kind_Getter(this);
+  String get kind => _blink.BlinkDataTransferItem.$kind_Getter(this);
 
   @DomName('DataTransferItem.type')
   @DocsEditable()
-  String get type => _blink.Native_DataTransferItem_type_Getter(this);
+  String get type => _blink.BlinkDataTransferItem.$type_Getter(this);
 
   @DomName('DataTransferItem.getAsFile')
   @DocsEditable()
-  Blob getAsFile() => _blink.Native_DataTransferItem_getAsFile_Callback(this);
+  Blob getAsFile() => _blink.BlinkDataTransferItem.$getAsFile_Callback(this);
 
   @DomName('DataTransferItem.getAsString')
   @DocsEditable()
-  void _getAsString(_StringCallback callback) => _blink.Native_DataTransferItem_getAsString_Callback(this, callback);
+  void _getAsString(_StringCallback callback) => _blink.BlinkDataTransferItem.$getAsString_Callback(this, callback);
 
   Future<String> getAsString() {
     var completer = new Completer<String>();
@@ -6975,7 +6975,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Entry getAsEntry() => _blink.Native_DataTransferItem_webkitGetAsEntry_Callback(this);
+  Entry getAsEntry() => _blink.BlinkDataTransferItem.$webkitGetAsEntry_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -6993,31 +6993,31 @@
 
   @DomName('DataTransferItemList.length')
   @DocsEditable()
-  int get length => _blink.Native_DataTransferItemList_length_Getter(this);
+  int get length => _blink.BlinkDataTransferItemList.$length_Getter(this);
 
   @DomName('DataTransferItemList.__getter__')
   @DocsEditable()
   @Experimental() // untriaged
-  DataTransferItem __getter__(int index) => _blink.Native_DataTransferItemList___getter___Callback(this, index);
+  DataTransferItem __getter__(int index) => _blink.BlinkDataTransferItemList.$__getter___Callback(this, index);
 
-  DataTransferItem add(data_OR_file, [String type]) => _blink.Native_DataTransferItemList_add(this, data_OR_file, type);
+  DataTransferItem add(data_OR_file, [String type]) => _blink.BlinkDataTransferItemList.$add(this, data_OR_file, type);
 
   @DomName('DataTransferItemList.addData')
   @DocsEditable()
-  DataTransferItem addData(String data, String type) => _blink.Native_DataTransferItemList_addData_Callback(this, data, type);
+  DataTransferItem addData(String data, String type) => _blink.BlinkDataTransferItemList.$addData_Callback(this, data, type);
 
   @DomName('DataTransferItemList.addFile')
   @DocsEditable()
-  DataTransferItem addFile(File file) => _blink.Native_DataTransferItemList_addFile_Callback(this, file);
+  DataTransferItem addFile(File file) => _blink.BlinkDataTransferItemList.$addFile_Callback(this, file);
 
   @DomName('DataTransferItemList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_DataTransferItemList_clear_Callback(this);
+  void clear() => _blink.BlinkDataTransferItemList.$clear_Callback(this);
 
   @DomName('DataTransferItemList.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(int index) => _blink.Native_DataTransferItemList_remove_Callback(this, index);
+  void remove(int index) => _blink.BlinkDataTransferItemList.$remove_Callback(this, index);
 
 
   DataTransferItem operator[] (int index) {
@@ -7064,7 +7064,7 @@
   @DomName('DedicatedWorkerGlobalScope.postMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_DedicatedWorkerGlobalScope_postMessage_Callback(this, message, messagePorts);
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.BlinkDedicatedWorkerGlobalScope.$postMessage_Callback(this, message, messagePorts);
 
   /// Stream of `message` events handled by this [DedicatedWorkerGlobalScope].
   @DomName('DedicatedWorkerGlobalScope.onmessage')
@@ -7100,12 +7100,12 @@
   @DomName('DeprecatedStorageInfo.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_queryUsageAndQuota_Callback(this, storageType, usageCallback, errorCallback);
+  void queryUsageAndQuota(int storageType, [StorageUsageCallback usageCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageInfo.$queryUsageAndQuota_Callback(this, storageType, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageInfo.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageInfo_requestQuota_Callback(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
+  void requestQuota(int storageType, int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageInfo.$requestQuota_Callback(this, storageType, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7125,12 +7125,12 @@
   @DomName('DeprecatedStorageQuota.queryUsageAndQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_queryUsageAndQuota_Callback(this, usageCallback, errorCallback);
+  void queryUsageAndQuota(StorageUsageCallback usageCallback, [StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageQuota.$queryUsageAndQuota_Callback(this, usageCallback, errorCallback);
 
   @DomName('DeprecatedStorageQuota.requestQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.Native_DeprecatedStorageQuota_requestQuota_Callback(this, newQuotaInBytes, quotaCallback, errorCallback);
+  void requestQuota(int newQuotaInBytes, [StorageQuotaCallback quotaCallback, StorageErrorCallback errorCallback]) => _blink.BlinkDeprecatedStorageQuota.$requestQuota_Callback(this, newQuotaInBytes, quotaCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7164,11 +7164,11 @@
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  bool get open => _blink.Native_HTMLDetailsElement_open_Getter(this);
+  bool get open => _blink.BlinkHTMLDetailsElement.$open_Getter(this);
 
   @DomName('HTMLDetailsElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.Native_HTMLDetailsElement_open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDetailsElement.$open_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7188,15 +7188,15 @@
 
   @DomName('DeviceAcceleration.x')
   @DocsEditable()
-  double get x => _blink.Native_DeviceAcceleration_x_Getter(this);
+  double get x => _blink.BlinkDeviceAcceleration.$x_Getter(this);
 
   @DomName('DeviceAcceleration.y')
   @DocsEditable()
-  double get y => _blink.Native_DeviceAcceleration_y_Getter(this);
+  double get y => _blink.BlinkDeviceAcceleration.$y_Getter(this);
 
   @DomName('DeviceAcceleration.z')
   @DocsEditable()
-  double get z => _blink.Native_DeviceAcceleration_z_Getter(this);
+  double get z => _blink.BlinkDeviceAcceleration.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7216,24 +7216,24 @@
 
   @DomName('DeviceMotionEvent.acceleration')
   @DocsEditable()
-  DeviceAcceleration get acceleration => _blink.Native_DeviceMotionEvent_acceleration_Getter(this);
+  DeviceAcceleration get acceleration => _blink.BlinkDeviceMotionEvent.$acceleration_Getter(this);
 
   @DomName('DeviceMotionEvent.accelerationIncludingGravity')
   @DocsEditable()
-  DeviceAcceleration get accelerationIncludingGravity => _blink.Native_DeviceMotionEvent_accelerationIncludingGravity_Getter(this);
+  DeviceAcceleration get accelerationIncludingGravity => _blink.BlinkDeviceMotionEvent.$accelerationIncludingGravity_Getter(this);
 
   @DomName('DeviceMotionEvent.interval')
   @DocsEditable()
-  double get interval => _blink.Native_DeviceMotionEvent_interval_Getter(this);
+  double get interval => _blink.BlinkDeviceMotionEvent.$interval_Getter(this);
 
   @DomName('DeviceMotionEvent.rotationRate')
   @DocsEditable()
-  DeviceRotationRate get rotationRate => _blink.Native_DeviceMotionEvent_rotationRate_Getter(this);
+  DeviceRotationRate get rotationRate => _blink.BlinkDeviceMotionEvent.$rotationRate_Getter(this);
 
   @DomName('DeviceMotionEvent.initDeviceMotionEvent')
   @DocsEditable()
   @Experimental() // untriaged
-  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.Native_DeviceMotionEvent_initDeviceMotionEvent_Callback(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
+  void initDeviceMotionEvent(String type, bool bubbles, bool cancelable, DeviceAcceleration acceleration, DeviceAcceleration accelerationIncludingGravity, DeviceRotationRate rotationRate, num interval) => _blink.BlinkDeviceMotionEvent.$initDeviceMotionEvent_Callback(this, type, bubbles, cancelable, acceleration, accelerationIncludingGravity, rotationRate, interval);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7259,23 +7259,23 @@
 
   @DomName('DeviceOrientationEvent.absolute')
   @DocsEditable()
-  bool get absolute => _blink.Native_DeviceOrientationEvent_absolute_Getter(this);
+  bool get absolute => _blink.BlinkDeviceOrientationEvent.$absolute_Getter(this);
 
   @DomName('DeviceOrientationEvent.alpha')
   @DocsEditable()
-  double get alpha => _blink.Native_DeviceOrientationEvent_alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceOrientationEvent.$alpha_Getter(this);
 
   @DomName('DeviceOrientationEvent.beta')
   @DocsEditable()
-  double get beta => _blink.Native_DeviceOrientationEvent_beta_Getter(this);
+  double get beta => _blink.BlinkDeviceOrientationEvent.$beta_Getter(this);
 
   @DomName('DeviceOrientationEvent.gamma')
   @DocsEditable()
-  double get gamma => _blink.Native_DeviceOrientationEvent_gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceOrientationEvent.$gamma_Getter(this);
 
   @DomName('DeviceOrientationEvent.initDeviceOrientationEvent')
   @DocsEditable()
-  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.Native_DeviceOrientationEvent_initDeviceOrientationEvent_Callback(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
+  void _initDeviceOrientationEvent(String type, bool bubbles, bool cancelable, num alpha, num beta, num gamma, bool absolute) => _blink.BlinkDeviceOrientationEvent.$initDeviceOrientationEvent_Callback(this, type, bubbles, cancelable, alpha, beta, gamma, absolute);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7295,15 +7295,15 @@
 
   @DomName('DeviceRotationRate.alpha')
   @DocsEditable()
-  double get alpha => _blink.Native_DeviceRotationRate_alpha_Getter(this);
+  double get alpha => _blink.BlinkDeviceRotationRate.$alpha_Getter(this);
 
   @DomName('DeviceRotationRate.beta')
   @DocsEditable()
-  double get beta => _blink.Native_DeviceRotationRate_beta_Getter(this);
+  double get beta => _blink.BlinkDeviceRotationRate.$beta_Getter(this);
 
   @DomName('DeviceRotationRate.gamma')
   @DocsEditable()
-  double get gamma => _blink.Native_DeviceRotationRate_gamma_Getter(this);
+  double get gamma => _blink.BlinkDeviceRotationRate.$gamma_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7328,33 +7328,33 @@
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  bool get open => _blink.Native_HTMLDialogElement_open_Getter(this);
+  bool get open => _blink.BlinkHTMLDialogElement.$open_Getter(this);
 
   @DomName('HTMLDialogElement.open')
   @DocsEditable()
-  void set open(bool value) => _blink.Native_HTMLDialogElement_open_Setter(this, value);
+  void set open(bool value) => _blink.BlinkHTMLDialogElement.$open_Setter(this, value);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  String get returnValue => _blink.Native_HTMLDialogElement_returnValue_Getter(this);
+  String get returnValue => _blink.BlinkHTMLDialogElement.$returnValue_Getter(this);
 
   @DomName('HTMLDialogElement.returnValue')
   @DocsEditable()
   @Experimental() // untriaged
-  void set returnValue(String value) => _blink.Native_HTMLDialogElement_returnValue_Setter(this, value);
+  void set returnValue(String value) => _blink.BlinkHTMLDialogElement.$returnValue_Setter(this, value);
 
   @DomName('HTMLDialogElement.close')
   @DocsEditable()
-  void close(String returnValue) => _blink.Native_HTMLDialogElement_close_Callback(this, returnValue);
+  void close(String returnValue) => _blink.BlinkHTMLDialogElement.$close_Callback(this, returnValue);
 
   @DomName('HTMLDialogElement.show')
   @DocsEditable()
-  void show() => _blink.Native_HTMLDialogElement_show_Callback(this);
+  void show() => _blink.BlinkHTMLDialogElement.$show_Callback(this);
 
   @DomName('HTMLDialogElement.showModal')
   @DocsEditable()
-  void showModal() => _blink.Native_HTMLDialogElement_showModal_Callback(this);
+  void showModal() => _blink.BlinkHTMLDialogElement.$showModal_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -7408,11 +7408,11 @@
 
   @DomName('DirectoryEntry.createReader')
   @DocsEditable()
-  DirectoryReader createReader() => _blink.Native_DirectoryEntry_createReader_Callback(this);
+  DirectoryReader createReader() => _blink.BlinkDirectoryEntry.$createReader_Callback(this);
 
   @DomName('DirectoryEntry.getDirectory')
   @DocsEditable()
-  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getDirectory_Callback(this, path, options, successCallback, errorCallback);
+  void __getDirectory(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkDirectoryEntry.$getDirectory_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getDirectory(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7424,7 +7424,7 @@
 
   @DomName('DirectoryEntry.getFile')
   @DocsEditable()
-  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_DirectoryEntry_getFile_Callback(this, path, options, successCallback, errorCallback);
+  void __getFile(String path, {Map options, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkDirectoryEntry.$getFile_Callback(this, path, options, successCallback, errorCallback);
 
   Future<Entry> _getFile(String path, {Map options}) {
     var completer = new Completer<Entry>();
@@ -7436,7 +7436,7 @@
 
   @DomName('DirectoryEntry.removeRecursively')
   @DocsEditable()
-  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryEntry_removeRecursively_Callback(this, successCallback, errorCallback);
+  void _removeRecursively(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkDirectoryEntry.$removeRecursively_Callback(this, successCallback, errorCallback);
 
   Future removeRecursively() {
     var completer = new Completer();
@@ -7465,7 +7465,7 @@
 
   @DomName('DirectoryReader.readEntries')
   @DocsEditable()
-  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_DirectoryReader_readEntries_Callback(this, successCallback, errorCallback);
+  void _readEntries(_EntriesCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkDirectoryReader.$readEntries_Callback(this, successCallback, errorCallback);
 
   Future<List<Entry>> readEntries() {
     var completer = new Completer<List<Entry>>();
@@ -7607,109 +7607,109 @@
   @DomName('Document.activeElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get activeElement => _blink.Native_Document_activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkDocument.$activeElement_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  HtmlElement get _body => _blink.Native_Document_body_Getter(this);
+  HtmlElement get _body => _blink.BlinkDocument.$body_Getter(this);
 
   @DomName('Document.body')
   @DocsEditable()
-  void set _body(HtmlElement value) => _blink.Native_Document_body_Setter(this, value);
+  void set _body(HtmlElement value) => _blink.BlinkDocument.$body_Setter(this, value);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  String get cookie => _blink.Native_Document_cookie_Getter(this);
+  String get cookie => _blink.BlinkDocument.$cookie_Getter(this);
 
   @DomName('Document.cookie')
   @DocsEditable()
-  void set cookie(String value) => _blink.Native_Document_cookie_Setter(this, value);
+  void set cookie(String value) => _blink.BlinkDocument.$cookie_Setter(this, value);
 
   @DomName('Document.currentScript')
   @DocsEditable()
   @Experimental() // untriaged
-  ScriptElement get currentScript => _blink.Native_Document_currentScript_Getter(this);
+  ScriptElement get currentScript => _blink.BlinkDocument.$currentScript_Getter(this);
 
   @DomName('Document.defaultView')
   @DocsEditable()
-  WindowBase get window => _blink.Native_Document_defaultView_Getter(this);
+  WindowBase get window => _blink.BlinkDocument.$defaultView_Getter(this);
 
   @DomName('Document.documentElement')
   @DocsEditable()
-  Element get documentElement => _blink.Native_Document_documentElement_Getter(this);
+  Element get documentElement => _blink.BlinkDocument.$documentElement_Getter(this);
 
   @DomName('Document.domain')
   @DocsEditable()
-  String get domain => _blink.Native_Document_domain_Getter(this);
+  String get domain => _blink.BlinkDocument.$domain_Getter(this);
 
   @DomName('Document.fonts')
   @DocsEditable()
   @Experimental() // untriaged
-  FontFaceSet get fonts => _blink.Native_Document_fonts_Getter(this);
+  FontFaceSet get fonts => _blink.BlinkDocument.$fonts_Getter(this);
 
   @DomName('Document.head')
   @DocsEditable()
-  HeadElement get _head => _blink.Native_Document_head_Getter(this);
+  HeadElement get _head => _blink.BlinkDocument.$head_Getter(this);
 
   @DomName('Document.hidden')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get hidden => _blink.Native_Document_hidden_Getter(this);
+  bool get hidden => _blink.BlinkDocument.$hidden_Getter(this);
 
   @DomName('Document.implementation')
   @DocsEditable()
-  DomImplementation get implementation => _blink.Native_Document_implementation_Getter(this);
+  DomImplementation get implementation => _blink.BlinkDocument.$implementation_Getter(this);
 
   @DomName('Document.lastModified')
   @DocsEditable()
-  String get _lastModified => _blink.Native_Document_lastModified_Getter(this);
+  String get _lastModified => _blink.BlinkDocument.$lastModified_Getter(this);
 
   @DomName('Document.preferredStylesheetSet')
   @DocsEditable()
-  String get _preferredStylesheetSet => _blink.Native_Document_preferredStylesheetSet_Getter(this);
+  String get _preferredStylesheetSet => _blink.BlinkDocument.$preferredStylesheetSet_Getter(this);
 
   @DomName('Document.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_Document_readyState_Getter(this);
+  String get readyState => _blink.BlinkDocument.$readyState_Getter(this);
 
   @DomName('Document.referrer')
   @DocsEditable()
-  String get _referrer => _blink.Native_Document_referrer_Getter(this);
+  String get _referrer => _blink.BlinkDocument.$referrer_Getter(this);
 
   @DomName('Document.rootElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgSvgElement get rootElement => _blink.Native_Document_rootElement_Getter(this);
+  SvgSvgElement get rootElement => _blink.BlinkDocument.$rootElement_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  String get _selectedStylesheetSet => _blink.Native_Document_selectedStylesheetSet_Getter(this);
+  String get _selectedStylesheetSet => _blink.BlinkDocument.$selectedStylesheetSet_Getter(this);
 
   @DomName('Document.selectedStylesheetSet')
   @DocsEditable()
-  void set _selectedStylesheetSet(String value) => _blink.Native_Document_selectedStylesheetSet_Setter(this, value);
+  void set _selectedStylesheetSet(String value) => _blink.BlinkDocument.$selectedStylesheetSet_Setter(this, value);
 
   @DomName('Document.styleSheets')
   @DocsEditable()
-  List<StyleSheet> get _styleSheets => _blink.Native_Document_styleSheets_Getter(this);
+  List<StyleSheet> get _styleSheets => _blink.BlinkDocument.$styleSheets_Getter(this);
 
   @DomName('Document.timeline')
   @DocsEditable()
   @Experimental() // untriaged
-  Timeline get timeline => _blink.Native_Document_timeline_Getter(this);
+  Timeline get timeline => _blink.BlinkDocument.$timeline_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  String get _title => _blink.Native_Document_title_Getter(this);
+  String get _title => _blink.BlinkDocument.$title_Getter(this);
 
   @DomName('Document.title')
   @DocsEditable()
-  void set _title(String value) => _blink.Native_Document_title_Setter(this, value);
+  void set _title(String value) => _blink.BlinkDocument.$title_Setter(this, value);
 
   @DomName('Document.visibilityState')
   @DocsEditable()
   @Experimental() // untriaged
-  String get visibilityState => _blink.Native_Document_visibilityState_Getter(this);
+  String get visibilityState => _blink.BlinkDocument.$visibilityState_Getter(this);
 
   @DomName('Document.webkitFullscreenElement')
   @DocsEditable()
@@ -7717,7 +7717,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenelement
-  Element get _webkitFullscreenElement => _blink.Native_Document_webkitFullscreenElement_Getter(this);
+  Element get _webkitFullscreenElement => _blink.BlinkDocument.$webkitFullscreenElement_Getter(this);
 
   @DomName('Document.webkitFullscreenEnabled')
   @DocsEditable()
@@ -7725,7 +7725,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-fullscreenenabled
-  bool get _webkitFullscreenEnabled => _blink.Native_Document_webkitFullscreenEnabled_Getter(this);
+  bool get _webkitFullscreenEnabled => _blink.BlinkDocument.$webkitFullscreenEnabled_Getter(this);
 
   @DomName('Document.webkitHidden')
   @DocsEditable()
@@ -7733,7 +7733,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#document
-  bool get _webkitHidden => _blink.Native_Document_webkitHidden_Getter(this);
+  bool get _webkitHidden => _blink.BlinkDocument.$webkitHidden_Getter(this);
 
   @DomName('Document.webkitPointerLockElement')
   @DocsEditable()
@@ -7741,7 +7741,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-pointerLockElement
-  Element get _webkitPointerLockElement => _blink.Native_Document_webkitPointerLockElement_Getter(this);
+  Element get _webkitPointerLockElement => _blink.BlinkDocument.$webkitPointerLockElement_Getter(this);
 
   @DomName('Document.webkitVisibilityState')
   @DocsEditable()
@@ -7749,101 +7749,101 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/PageVisibility/Overview.html#dom-document-visibilitystate
-  String get _webkitVisibilityState => _blink.Native_Document_webkitVisibilityState_Getter(this);
+  String get _webkitVisibilityState => _blink.BlinkDocument.$webkitVisibilityState_Getter(this);
 
   @DomName('Document.adoptNode')
   @DocsEditable()
-  Node adoptNode(Node node) => _blink.Native_Document_adoptNode_Callback(this, node);
+  Node adoptNode(Node node) => _blink.BlinkDocument.$adoptNode_Callback(this, node);
 
   @DomName('Document.caretRangeFromPoint')
   @DocsEditable()
   // http://www.w3.org/TR/2009/WD-cssom-view-20090804/#dom-documentview-caretrangefrompoint
   @Experimental()
-  Range _caretRangeFromPoint(int x, int y) => _blink.Native_Document_caretRangeFromPoint_Callback(this, x, y);
+  Range _caretRangeFromPoint(int x, int y) => _blink.BlinkDocument.$caretRangeFromPoint_Callback(this, x, y);
 
   @DomName('Document.createDocumentFragment')
   @DocsEditable()
-  DocumentFragment createDocumentFragment() => _blink.Native_Document_createDocumentFragment_Callback(this);
+  DocumentFragment createDocumentFragment() => _blink.BlinkDocument.$createDocumentFragment_Callback(this);
 
   @DomName('Document.createElement')
   @DocsEditable()
-  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.Native_Document_createElement_Callback(this, localName_OR_tagName, typeExtension);
+  Element _createElement(String localName_OR_tagName, [String typeExtension]) => _blink.BlinkDocument.$createElement_Callback(this, localName_OR_tagName, typeExtension);
 
   @DomName('Document.createElementNS')
   @DocsEditable()
-  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.Native_Document_createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
+  Element createElementNS(String namespaceURI, String qualifiedName, [String typeExtension]) => _blink.BlinkDocument.$createElementNS_Callback(this, namespaceURI, qualifiedName, typeExtension);
 
-  Event _createEvent([String eventType]) => _blink.Native_Document__createEvent(this, eventType);
+  Event _createEvent([String eventType]) => _blink.BlinkDocument.$_createEvent(this, eventType);
 
-  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createNodeIterator(this, root, whatToShow, filter);
+  NodeIterator _createNodeIterator(Node root, [int whatToShow, NodeFilter filter]) => _blink.BlinkDocument.$_createNodeIterator(this, root, whatToShow, filter);
 
   @DomName('Document.createRange')
   @DocsEditable()
-  Range createRange() => _blink.Native_Document_createRange_Callback(this);
+  Range createRange() => _blink.BlinkDocument.$createRange_Callback(this);
 
   @DomName('Document.createTextNode')
   @DocsEditable()
-  Text _createTextNode(String data) => _blink.Native_Document_createTextNode_Callback(this, data);
+  Text _createTextNode(String data) => _blink.BlinkDocument.$createTextNode_Callback(this, data);
 
   @DomName('Document.createTouch')
   @DocsEditable()
   // http://www.w3.org/TR/touch-events/, http://www.chromestatus.com/features
   @Experimental()
-  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.Native_Document_createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
+  Touch _createTouch(Window window, EventTarget target, int identifier, int pageX, int pageY, int screenX, int screenY, int webkitRadiusX, int webkitRadiusY, num webkitRotationAngle, num webkitForce) => _blink.BlinkDocument.$createTouch_Callback(this, window, target, identifier, pageX, pageY, screenX, screenY, webkitRadiusX, webkitRadiusY, webkitRotationAngle, webkitForce);
 
-  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.Native_Document__createTreeWalker(this, root, whatToShow, filter);
+  TreeWalker _createTreeWalker(Node root, [int whatToShow, NodeFilter filter]) => _blink.BlinkDocument.$_createTreeWalker(this, root, whatToShow, filter);
 
   @DomName('Document.elementFromPoint')
   @DocsEditable()
-  Element _elementFromPoint(int x, int y) => _blink.Native_Document_elementFromPoint_Callback(this, x, y);
+  Element _elementFromPoint(int x, int y) => _blink.BlinkDocument.$elementFromPoint_Callback(this, x, y);
 
   @DomName('Document.execCommand')
   @DocsEditable()
-  bool execCommand(String command, bool userInterface, String value) => _blink.Native_Document_execCommand_Callback(this, command, userInterface, value);
+  bool execCommand(String command, bool userInterface, String value) => _blink.BlinkDocument.$execCommand_Callback(this, command, userInterface, value);
 
   @DomName('Document.getCSSCanvasContext')
   @DocsEditable()
   // https://developer.apple.com/library/safari/#documentation/AppleApplications/Reference/SafariCSSRef/Articles/Functions.html
   @Experimental() // non-standard
-  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.Native_Document_getCSSCanvasContext_Callback(this, contextId, name, width, height);
+  CanvasRenderingContext _getCssCanvasContext(String contextId, String name, int width, int height) => _blink.BlinkDocument.$getCSSCanvasContext_Callback(this, contextId, name, width, height);
 
   @DomName('Document.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_Document_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkDocument.$getElementById_Callback(this, elementId);
 
   @DomName('Document.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.Native_Document_getElementsByClassName_Callback(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkDocument.$getElementsByClassName_Callback(this, classNames);
 
   @DomName('Document.getElementsByName')
   @DocsEditable()
-  List<Node> getElementsByName(String elementName) => _blink.Native_Document_getElementsByName_Callback(this, elementName);
+  List<Node> getElementsByName(String elementName) => _blink.BlinkDocument.$getElementsByName_Callback(this, elementName);
 
   @DomName('Document.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String localName) => _blink.Native_Document_getElementsByTagName_Callback(this, localName);
+  List<Node> getElementsByTagName(String localName) => _blink.BlinkDocument.$getElementsByTagName_Callback(this, localName);
 
-  Node importNode(Node node, [bool deep]) => _blink.Native_Document_importNode(this, node, deep);
+  Node importNode(Node node, [bool deep]) => _blink.BlinkDocument.$importNode(this, node, deep);
 
   @DomName('Document.queryCommandEnabled')
   @DocsEditable()
-  bool queryCommandEnabled(String command) => _blink.Native_Document_queryCommandEnabled_Callback(this, command);
+  bool queryCommandEnabled(String command) => _blink.BlinkDocument.$queryCommandEnabled_Callback(this, command);
 
   @DomName('Document.queryCommandIndeterm')
   @DocsEditable()
-  bool queryCommandIndeterm(String command) => _blink.Native_Document_queryCommandIndeterm_Callback(this, command);
+  bool queryCommandIndeterm(String command) => _blink.BlinkDocument.$queryCommandIndeterm_Callback(this, command);
 
   @DomName('Document.queryCommandState')
   @DocsEditable()
-  bool queryCommandState(String command) => _blink.Native_Document_queryCommandState_Callback(this, command);
+  bool queryCommandState(String command) => _blink.BlinkDocument.$queryCommandState_Callback(this, command);
 
   @DomName('Document.queryCommandSupported')
   @DocsEditable()
-  bool queryCommandSupported(String command) => _blink.Native_Document_queryCommandSupported_Callback(this, command);
+  bool queryCommandSupported(String command) => _blink.BlinkDocument.$queryCommandSupported_Callback(this, command);
 
   @DomName('Document.queryCommandValue')
   @DocsEditable()
-  String queryCommandValue(String command) => _blink.Native_Document_queryCommandValue_Callback(this, command);
+  String queryCommandValue(String command) => _blink.BlinkDocument.$queryCommandValue_Callback(this, command);
 
   /**
    * Finds the first descendant element of this document that matches the
@@ -7864,11 +7864,11 @@
    */
   @DomName('Document.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_Document_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocument.$querySelector_Callback(this, selectors);
 
   @DomName('Document.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_Document_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocument.$querySelectorAll_Callback(this, selectors);
 
   @DomName('Document.webkitExitFullscreen')
   @DocsEditable()
@@ -7876,7 +7876,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void _webkitExitFullscreen() => _blink.Native_Document_webkitExitFullscreen_Callback(this);
+  void _webkitExitFullscreen() => _blink.BlinkDocument.$webkitExitFullscreen_Callback(this);
 
   @DomName('Document.webkitExitPointerLock')
   @DocsEditable()
@@ -7884,23 +7884,23 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Document-exitPointerLock-void
-  void _webkitExitPointerLock() => _blink.Native_Document_webkitExitPointerLock_Callback(this);
+  void _webkitExitPointerLock() => _blink.BlinkDocument.$webkitExitPointerLock_Callback(this);
 
   @DomName('Document.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_Document_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocument.$childElementCount_Getter(this);
 
   @DomName('Document.children')
   @DocsEditable()
-  List<Node> get _children => _blink.Native_Document_children_Getter(this);
+  List<Node> get _children => _blink.BlinkDocument.$children_Getter(this);
 
   @DomName('Document.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_Document_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocument.$firstElementChild_Getter(this);
 
   @DomName('Document.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_Document_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocument.$lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Document].
   @DomName('Document.onabort')
@@ -8380,23 +8380,23 @@
    */
   @DomName('DocumentFragment.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_DocumentFragment_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkDocumentFragment.$querySelector_Callback(this, selectors);
 
   @DomName('DocumentFragment.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_DocumentFragment_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkDocumentFragment.$querySelectorAll_Callback(this, selectors);
 
   @DomName('DocumentFragment.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_DocumentFragment_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkDocumentFragment.$childElementCount_Getter(this);
 
   @DomName('DocumentFragment.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_DocumentFragment_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkDocumentFragment.$firstElementChild_Getter(this);
 
   @DomName('DocumentFragment.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_DocumentFragment_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkDocumentFragment.$lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8415,11 +8415,11 @@
   @DomName('DOMError.message')
   @DocsEditable()
   @Experimental() // untriaged
-  String get message => _blink.Native_DOMError_message_Getter(this);
+  String get message => _blink.BlinkDOMError.$message_Getter(this);
 
   @DomName('DOMError.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMError_name_Getter(this);
+  String get name => _blink.BlinkDOMError.$name_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -8458,15 +8458,15 @@
 
   @DomName('DOMException.message')
   @DocsEditable()
-  String get message => _blink.Native_DOMException_message_Getter(this);
+  String get message => _blink.BlinkDOMException.$message_Getter(this);
 
   @DomName('DOMException.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMException_name_Getter(this);
+  String get name => _blink.BlinkDOMException.$name_Getter(this);
 
   @DomName('DOMException.toString')
   @DocsEditable()
-  String toString() => _blink.Native_DOMException_toString_Callback(this);
+  String toString() => _blink.BlinkDOMException.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8484,19 +8484,19 @@
 
   @DomName('DOMImplementation.createDocument')
   @DocsEditable()
-  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.Native_DOMImplementation_createDocument_Callback(this, namespaceURI, qualifiedName, doctype);
+  XmlDocument createDocument(String namespaceURI, String qualifiedName, _DocumentType doctype) => _blink.BlinkDOMImplementation.$createDocument_Callback(this, namespaceURI, qualifiedName, doctype);
 
   @DomName('DOMImplementation.createDocumentType')
   @DocsEditable()
-  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.Native_DOMImplementation_createDocumentType_Callback(this, qualifiedName, publicId, systemId);
+  _DocumentType createDocumentType(String qualifiedName, String publicId, String systemId) => _blink.BlinkDOMImplementation.$createDocumentType_Callback(this, qualifiedName, publicId, systemId);
 
   @DomName('DOMImplementation.createHTMLDocument')
   @DocsEditable()
-  HtmlDocument createHtmlDocument(String title) => _blink.Native_DOMImplementation_createHTMLDocument_Callback(this, title);
+  HtmlDocument createHtmlDocument(String title) => _blink.BlinkDOMImplementation.$createHTMLDocument_Callback(this, title);
 
   @DomName('DOMImplementation.hasFeature')
   @DocsEditable()
-  bool hasFeature(String feature, String version) => _blink.Native_DOMImplementation_hasFeature_Callback(this, feature, version);
+  bool hasFeature(String feature, String version) => _blink.BlinkDOMImplementation.$hasFeature_Callback(this, feature, version);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8514,11 +8514,11 @@
 
   @DomName('DOMParser.DOMParser')
   @DocsEditable()
-  factory DomParser() => _blink.Native_DOMParser_DomParser();
+  factory DomParser() => _blink.BlinkDOMParser.$mkDomParser();
 
   @DomName('DOMParser.parseFromString')
   @DocsEditable()
-  Document parseFromString(String str, String contentType) => _blink.Native_DOMParser_parseFromString_Callback(this, str, contentType);
+  Document parseFromString(String str, String contentType) => _blink.BlinkDOMParser.$parseFromString_Callback(this, str, contentType);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8536,15 +8536,15 @@
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  String get value => _blink.Native_DOMSettableTokenList_value_Getter(this);
+  String get value => _blink.BlinkDOMSettableTokenList.$value_Getter(this);
 
   @DomName('DOMSettableTokenList.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_DOMSettableTokenList_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkDOMSettableTokenList.$value_Setter(this, value);
 
   @DomName('DOMSettableTokenList.__getter__')
   @DocsEditable()
-  String __getter__(int index) => _blink.Native_DOMSettableTokenList___getter___Callback(this, index);
+  String __getter__(int index) => _blink.BlinkDOMSettableTokenList.$__getter___Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8562,15 +8562,15 @@
 
   @DomName('DOMStringList.length')
   @DocsEditable()
-  int get length => _blink.Native_DOMStringList_length_Getter(this);
+  int get length => _blink.BlinkDOMStringList.$length_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkDOMStringList.$NativeIndexed_Getter(this, index);
   }
 
-  String _nativeIndexedGetter(int index) => _blink.Native_DOMStringList_NativeIndexed_Getter(this, index);
+  String _nativeIndexedGetter(int index) => _blink.BlinkDOMStringList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, String value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -8612,11 +8612,11 @@
 
   @DomName('DOMStringList.contains')
   @DocsEditable()
-  bool contains(String string) => _blink.Native_DOMStringList_contains_Callback(this, string);
+  bool contains(String string) => _blink.BlinkDOMStringList.$contains_Callback(this, string);
 
   @DomName('DOMStringList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_DOMStringList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkDOMStringList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8632,11 +8632,11 @@
   // To suppress missing implicit constructor warnings.
   factory DomStringMap._() { throw new UnsupportedError("Not supported"); }
 
-  bool __delete__(index_OR_name) => _blink.Native_DOMStringMap___delete__(this, index_OR_name);
+  bool __delete__(index_OR_name) => _blink.BlinkDOMStringMap.$__delete__(this, index_OR_name);
 
-  String __getter__(index_OR_name) => _blink.Native_DOMStringMap___getter__(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.BlinkDOMStringMap.$__getter__(this, index_OR_name);
 
-  void __setter__(index_OR_name, String value) => _blink.Native_DOMStringMap___setter__(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.BlinkDOMStringMap.$__setter__(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -8654,21 +8654,21 @@
 
   @DomName('DOMTokenList.length')
   @DocsEditable()
-  int get length => _blink.Native_DOMTokenList_length_Getter(this);
+  int get length => _blink.BlinkDOMTokenList.$length_Getter(this);
 
   @DomName('DOMTokenList.contains')
   @DocsEditable()
-  bool contains(String token) => _blink.Native_DOMTokenList_contains_Callback(this, token);
+  bool contains(String token) => _blink.BlinkDOMTokenList.$contains_Callback(this, token);
 
   @DomName('DOMTokenList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_DOMTokenList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkDOMTokenList.$item_Callback(this, index);
 
   @DomName('DOMTokenList.toString')
   @DocsEditable()
-  String toString() => _blink.Native_DOMTokenList_toString_Callback(this);
+  String toString() => _blink.BlinkDOMTokenList.$toString_Callback(this);
 
-  bool toggle(String token, [bool force]) => _blink.Native_DOMTokenList_toggle(this, token, force);
+  bool toggle(String token, [bool force]) => _blink.BlinkDOMTokenList.$toggle(this, token, force);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -10548,59 +10548,59 @@
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this).round();
+  int get offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this).round();
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this).round();
+  int get offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this).round();
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this).round();
+  int get offsetTop => _blink.BlinkElement.$offsetTop_Getter(this).round();
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this).round();
+  int get offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this).round();
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this).round();
+  int get clientHeight => _blink.BlinkElement.$clientHeight_Getter(this).round();
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this).round();
+  int get clientLeft => _blink.BlinkElement.$clientLeft_Getter(this).round();
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.Native_Element_clientTop_Getter(this).round();
+  int get clientTop => _blink.BlinkElement.$clientTop_Getter(this).round();
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this).round();
+  int get clientWidth => _blink.BlinkElement.$clientWidth_Getter(this).round();
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this).round();
+  int get scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this).round();
+  int get scrollLeft => _blink.BlinkElement.$scrollLeft_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value.round());
+  void set scrollLeft(int value) => _blink.BlinkElement.$scrollLeft_Setter(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this).round();
+  int get scrollTop => _blink.BlinkElement.$scrollTop_Getter(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value.round());
+  void set scrollTop(int value) => _blink.BlinkElement.$scrollTop_Setter(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this).round();
+  int get scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this).round();
 
   // To suppress missing implicit constructor warnings.
   factory Element._() { throw new UnsupportedError("Not supported"); }
@@ -11209,146 +11209,146 @@
 
   @DomName('Element.attributes')
   @DocsEditable()
-  _NamedNodeMap get _attributes => _blink.Native_Element_attributes_Getter(this);
+  _NamedNodeMap get _attributes => _blink.BlinkElement.$attributes_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  String get className => _blink.Native_Element_className_Getter(this);
+  String get className => _blink.BlinkElement.$className_Getter(this);
 
   @DomName('Element.className')
   @DocsEditable()
-  void set className(String value) => _blink.Native_Element_className_Setter(this, value);
+  void set className(String value) => _blink.BlinkElement.$className_Setter(this, value);
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get _clientHeight => _blink.Native_Element_clientHeight_Getter(this);
+  int get _clientHeight => _blink.BlinkElement.$clientHeight_Getter(this);
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get _clientLeft => _blink.Native_Element_clientLeft_Getter(this);
+  int get _clientLeft => _blink.BlinkElement.$clientLeft_Getter(this);
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get _clientTop => _blink.Native_Element_clientTop_Getter(this);
+  int get _clientTop => _blink.BlinkElement.$clientTop_Getter(this);
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get _clientWidth => _blink.Native_Element_clientWidth_Getter(this);
+  int get _clientWidth => _blink.BlinkElement.$clientWidth_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  String get id => _blink.Native_Element_id_Getter(this);
+  String get id => _blink.BlinkElement.$id_Getter(this);
 
   @DomName('Element.id')
   @DocsEditable()
-  void set id(String value) => _blink.Native_Element_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkElement.$id_Setter(this, value);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  String get _innerHtml => _blink.Native_Element_innerHTML_Getter(this);
+  String get _innerHtml => _blink.BlinkElement.$innerHTML_Getter(this);
 
   @DomName('Element.innerHTML')
   @DocsEditable()
-  void set _innerHtml(String value) => _blink.Native_Element_innerHTML_Setter(this, value);
+  void set _innerHtml(String value) => _blink.BlinkElement.$innerHTML_Setter(this, value);
 
   @DomName('Element.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.Native_Element_localName_Getter(this);
+  String get _localName => _blink.BlinkElement.$localName_Getter(this);
 
   @DomName('Element.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.Native_Element_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkElement.$namespaceURI_Getter(this);
 
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get _offsetHeight => _blink.Native_Element_offsetHeight_Getter(this);
+  int get _offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this);
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get _offsetLeft => _blink.Native_Element_offsetLeft_Getter(this);
+  int get _offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this);
 
   @DomName('Element.offsetParent')
   @DocsEditable()
-  Element get offsetParent => _blink.Native_Element_offsetParent_Getter(this);
+  Element get offsetParent => _blink.BlinkElement.$offsetParent_Getter(this);
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get _offsetTop => _blink.Native_Element_offsetTop_Getter(this);
+  int get _offsetTop => _blink.BlinkElement.$offsetTop_Getter(this);
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get _offsetWidth => _blink.Native_Element_offsetWidth_Getter(this);
+  int get _offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this);
 
   @DomName('Element.outerHTML')
   @DocsEditable()
-  String get outerHtml => _blink.Native_Element_outerHTML_Getter(this);
+  String get outerHtml => _blink.BlinkElement.$outerHTML_Getter(this);
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get _scrollHeight => _blink.Native_Element_scrollHeight_Getter(this);
+  int get _scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get _scrollLeft => _blink.Native_Element_scrollLeft_Getter(this);
+  int get _scrollLeft => _blink.BlinkElement.$scrollLeft_Getter(this);
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set _scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value);
+  void set _scrollLeft(int value) => _blink.BlinkElement.$scrollLeft_Setter(this, value);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get _scrollTop => _blink.Native_Element_scrollTop_Getter(this);
+  int get _scrollTop => _blink.BlinkElement.$scrollTop_Getter(this);
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set _scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value);
+  void set _scrollTop(int value) => _blink.BlinkElement.$scrollTop_Setter(this, value);
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get _scrollWidth => _blink.Native_Element_scrollWidth_Getter(this);
+  int get _scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this);
 
   @DomName('Element.shadowRoot')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
   @Experimental()
-  ShadowRoot get shadowRoot => _blink.Native_Element_shadowRoot_Getter(this);
+  ShadowRoot get shadowRoot => _blink.BlinkElement.$shadowRoot_Getter(this);
 
   @DomName('Element.style')
   @DocsEditable()
-  CssStyleDeclaration get style => _blink.Native_Element_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkElement.$style_Getter(this);
 
   @DomName('Element.tagName')
   @DocsEditable()
-  String get tagName => _blink.Native_Element_tagName_Getter(this);
+  String get tagName => _blink.BlinkElement.$tagName_Getter(this);
 
-  Animation animate(List<Map> keyframes, [timingInput]) => _blink.Native_Element_animate(this, keyframes, timingInput);
+  Animation animate(List<Map> keyframes, [timingInput]) => _blink.BlinkElement.$animate(this, keyframes, timingInput);
 
   @DomName('Element.blur')
   @DocsEditable()
-  void blur() => _blink.Native_Element_blur_Callback(this);
+  void blur() => _blink.BlinkElement.$blur_Callback(this);
 
   @DomName('Element.createShadowRoot')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME, '25')
   @Experimental()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#api-shadow-aware-create-shadow-root
-  ShadowRoot createShadowRoot() => _blink.Native_Element_createShadowRoot_Callback(this);
+  ShadowRoot createShadowRoot() => _blink.BlinkElement.$createShadowRoot_Callback(this);
 
   @DomName('Element.focus')
   @DocsEditable()
-  void focus() => _blink.Native_Element_focus_Callback(this);
+  void focus() => _blink.BlinkElement.$focus_Callback(this);
 
   @DomName('Element.getAttribute')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttribute(String name) => _blink.Native_Element_getAttribute_Callback(this, name);
+  String getAttribute(String name) => _blink.BlinkElement.$getAttribute_Callback(this, name);
 
   @DomName('Element.getAttributeNS')
   @DocsEditable()
   @Experimental() // untriaged
-  String getAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_getAttributeNS_Callback(this, namespaceURI, localName);
+  String getAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$getAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Returns the smallest bounding rectangle that encompasses this element's
@@ -11365,7 +11365,7 @@
    */
   @DomName('Element.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.Native_Element_getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkElement.$getBoundingClientRect_Callback(this);
 
   /**
    * Returns a list of bounding rectangles for each box associated with this
@@ -11382,7 +11382,7 @@
    */
   @DomName('Element.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.Native_Element_getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkElement.$getClientRects_Callback(this);
 
   /**
    * Returns a list of shadow DOM insertion points to which this element is
@@ -11397,7 +11397,7 @@
   @DomName('Element.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.Native_Element_getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkElement.$getDestinationInsertionPoints_Callback(this);
 
   /**
    * Returns a list of nodes with the given class name inside this element.
@@ -11412,39 +11412,39 @@
    */
   @DomName('Element.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String classNames) => _blink.Native_Element_getElementsByClassName_Callback(this, classNames);
+  List<Node> getElementsByClassName(String classNames) => _blink.BlinkElement.$getElementsByClassName_Callback(this, classNames);
 
   @DomName('Element.getElementsByTagName')
   @DocsEditable()
-  List<Node> _getElementsByTagName(String name) => _blink.Native_Element_getElementsByTagName_Callback(this, name);
+  List<Node> _getElementsByTagName(String name) => _blink.BlinkElement.$getElementsByTagName_Callback(this, name);
 
   @DomName('Element.hasAttribute')
   @DocsEditable()
-  bool _hasAttribute(String name) => _blink.Native_Element_hasAttribute_Callback(this, name);
+  bool _hasAttribute(String name) => _blink.BlinkElement.$hasAttribute_Callback(this, name);
 
   @DomName('Element.hasAttributeNS')
   @DocsEditable()
-  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_hasAttributeNS_Callback(this, namespaceURI, localName);
+  bool _hasAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$hasAttributeNS_Callback(this, namespaceURI, localName);
 
   @DomName('Element.insertAdjacentElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Element insertAdjacentElement(String where, Element element) => _blink.Native_Element_insertAdjacentElement_Callback(this, where, element);
+  Element insertAdjacentElement(String where, Element element) => _blink.BlinkElement.$insertAdjacentElement_Callback(this, where, element);
 
   @DomName('Element.insertAdjacentHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentHtml(String where, String html) => _blink.Native_Element_insertAdjacentHTML_Callback(this, where, html);
+  void insertAdjacentHtml(String where, String html) => _blink.BlinkElement.$insertAdjacentHTML_Callback(this, where, html);
 
   @DomName('Element.insertAdjacentText')
   @DocsEditable()
   @Experimental() // untriaged
-  void insertAdjacentText(String where, String text) => _blink.Native_Element_insertAdjacentText_Callback(this, where, text);
+  void insertAdjacentText(String where, String text) => _blink.BlinkElement.$insertAdjacentText_Callback(this, where, text);
 
   @DomName('Element.matches')
   @DocsEditable()
   @Experimental() // untriaged
-  bool matches(String selectors) => _blink.Native_Element_matches_Callback(this, selectors);
+  bool matches(String selectors) => _blink.BlinkElement.$matches_Callback(this, selectors);
 
   /**
    * Finds the first descendant element of this element that matches the
@@ -11464,19 +11464,19 @@
    */
   @DomName('Element.querySelector')
   @DocsEditable()
-  Element querySelector(String selectors) => _blink.Native_Element_querySelector_Callback(this, selectors);
+  Element querySelector(String selectors) => _blink.BlinkElement.$querySelector_Callback(this, selectors);
 
   @DomName('Element.querySelectorAll')
   @DocsEditable()
-  List<Node> _querySelectorAll(String selectors) => _blink.Native_Element_querySelectorAll_Callback(this, selectors);
+  List<Node> _querySelectorAll(String selectors) => _blink.BlinkElement.$querySelectorAll_Callback(this, selectors);
 
   @DomName('Element.removeAttribute')
   @DocsEditable()
-  void _removeAttribute(String name) => _blink.Native_Element_removeAttribute_Callback(this, name);
+  void _removeAttribute(String name) => _blink.BlinkElement.$removeAttribute_Callback(this, name);
 
   @DomName('Element.removeAttributeNS')
   @DocsEditable()
-  void _removeAttributeNS(String namespaceURI, String localName) => _blink.Native_Element_removeAttributeNS_Callback(this, namespaceURI, localName);
+  void _removeAttributeNS(String namespaceURI, String localName) => _blink.BlinkElement.$removeAttributeNS_Callback(this, namespaceURI, localName);
 
   /**
    * Scrolls the element by a number of lines.
@@ -11488,7 +11488,7 @@
    */
   @DomName('Element.scrollByLines')
   @DocsEditable()
-  void scrollByLines(int lines) => _blink.Native_Element_scrollByLines_Callback(this, lines);
+  void scrollByLines(int lines) => _blink.BlinkElement.$scrollByLines_Callback(this, lines);
 
   /**
    * Scrolls the element by a number of pages.
@@ -11500,19 +11500,19 @@
    */
   @DomName('Element.scrollByPages')
   @DocsEditable()
-  void scrollByPages(int pages) => _blink.Native_Element_scrollByPages_Callback(this, pages);
+  void scrollByPages(int pages) => _blink.BlinkElement.$scrollByPages_Callback(this, pages);
 
-  void _scrollIntoView([bool alignWithTop]) => _blink.Native_Element__scrollIntoView(this, alignWithTop);
+  void _scrollIntoView([bool alignWithTop]) => _blink.BlinkElement.$_scrollIntoView(this, alignWithTop);
 
-  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.Native_Element__scrollIntoViewIfNeeded(this, centerIfNeeded);
+  void _scrollIntoViewIfNeeded([bool centerIfNeeded]) => _blink.BlinkElement.$_scrollIntoViewIfNeeded(this, centerIfNeeded);
 
   @DomName('Element.setAttribute')
   @DocsEditable()
-  void setAttribute(String name, String value) => _blink.Native_Element_setAttribute_Callback(this, name, value);
+  void setAttribute(String name, String value) => _blink.BlinkElement.$setAttribute_Callback(this, name, value);
 
   @DomName('Element.setAttributeNS')
   @DocsEditable()
-  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.Native_Element_setAttributeNS_Callback(this, namespaceURI, qualifiedName, value);
+  void setAttributeNS(String namespaceURI, String qualifiedName, String value) => _blink.BlinkElement.$setAttributeNS_Callback(this, namespaceURI, qualifiedName, value);
 
   /**
    * Displays this element fullscreen.
@@ -11531,7 +11531,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-element-requestfullscreen
-  void requestFullscreen() => _blink.Native_Element_webkitRequestFullscreen_Callback(this);
+  void requestFullscreen() => _blink.BlinkElement.$webkitRequestFullscreen_Callback(this);
 
   /**
    * Locks the mouse pointer to this element.
@@ -11551,35 +11551,35 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/pointerlock/raw-file/default/index.html#widl-Element-requestPointerLock-void
-  void requestPointerLock() => _blink.Native_Element_webkitRequestPointerLock_Callback(this);
+  void requestPointerLock() => _blink.BlinkElement.$webkitRequestPointerLock_Callback(this);
 
   @DomName('Element.nextElementSibling')
   @DocsEditable()
-  Element get nextElementSibling => _blink.Native_Element_nextElementSibling_Getter(this);
+  Element get nextElementSibling => _blink.BlinkElement.$nextElementSibling_Getter(this);
 
   @DomName('Element.previousElementSibling')
   @DocsEditable()
-  Element get previousElementSibling => _blink.Native_Element_previousElementSibling_Getter(this);
+  Element get previousElementSibling => _blink.BlinkElement.$previousElementSibling_Getter(this);
 
   @DomName('Element.remove')
   @DocsEditable()
-  void remove() => _blink.Native_Element_remove_Callback(this);
+  void remove() => _blink.BlinkElement.$remove_Callback(this);
 
   @DomName('Element.childElementCount')
   @DocsEditable()
-  int get _childElementCount => _blink.Native_Element_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkElement.$childElementCount_Getter(this);
 
   @DomName('Element.children')
   @DocsEditable()
-  List<Node> get _children => _blink.Native_Element_children_Getter(this);
+  List<Node> get _children => _blink.BlinkElement.$children_Getter(this);
 
   @DomName('Element.firstElementChild')
   @DocsEditable()
-  Element get _firstElementChild => _blink.Native_Element_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkElement.$firstElementChild_Getter(this);
 
   @DomName('Element.lastElementChild')
   @DocsEditable()
-  Element get _lastElementChild => _blink.Native_Element_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkElement.$lastElementChild_Getter(this);
 
   /// Stream of `abort` events handled by this [Element].
   @DomName('Element.onabort')
@@ -12015,51 +12015,51 @@
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLEmbedElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLEmbedElement.$height_Getter(this);
 
   @DomName('HTMLEmbedElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLEmbedElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLEmbedElement.$height_Setter(this, value);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLEmbedElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLEmbedElement.$name_Getter(this);
 
   @DomName('HTMLEmbedElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLEmbedElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLEmbedElement.$name_Setter(this, value);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLEmbedElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLEmbedElement.$src_Getter(this);
 
   @DomName('HTMLEmbedElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLEmbedElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLEmbedElement.$src_Setter(this, value);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLEmbedElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLEmbedElement.$type_Getter(this);
 
   @DomName('HTMLEmbedElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLEmbedElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLEmbedElement.$type_Setter(this, value);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLEmbedElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLEmbedElement.$width_Getter(this);
 
   @DomName('HTMLEmbedElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLEmbedElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLEmbedElement.$width_Setter(this, value);
 
   @DomName('HTMLEmbedElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.Native_HTMLEmbedElement___getter___Callback(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLEmbedElement.$__getter___Callback(this, index_OR_name);
 
   @DomName('HTMLEmbedElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLEmbedElement___setter___Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLEmbedElement.$__setter___Callback(this, index_OR_name, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12090,25 +12090,25 @@
 
   @DomName('Entry.filesystem')
   @DocsEditable()
-  FileSystem get filesystem => _blink.Native_Entry_filesystem_Getter(this);
+  FileSystem get filesystem => _blink.BlinkEntry.$filesystem_Getter(this);
 
   @DomName('Entry.fullPath')
   @DocsEditable()
-  String get fullPath => _blink.Native_Entry_fullPath_Getter(this);
+  String get fullPath => _blink.BlinkEntry.$fullPath_Getter(this);
 
   @DomName('Entry.isDirectory')
   @DocsEditable()
-  bool get isDirectory => _blink.Native_Entry_isDirectory_Getter(this);
+  bool get isDirectory => _blink.BlinkEntry.$isDirectory_Getter(this);
 
   @DomName('Entry.isFile')
   @DocsEditable()
-  bool get isFile => _blink.Native_Entry_isFile_Getter(this);
+  bool get isFile => _blink.BlinkEntry.$isFile_Getter(this);
 
   @DomName('Entry.name')
   @DocsEditable()
-  String get name => _blink.Native_Entry_name_Getter(this);
+  String get name => _blink.BlinkEntry.$name_Getter(this);
 
-  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__copyTo(this, parent, name, successCallback, errorCallback);
+  void _copyTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkEntry.$_copyTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> copyTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12120,7 +12120,7 @@
 
   @DomName('Entry.getMetadata')
   @DocsEditable()
-  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_getMetadata_Callback(this, successCallback, errorCallback);
+  void _getMetadata(MetadataCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkEntry.$getMetadata_Callback(this, successCallback, errorCallback);
 
   Future<Metadata> getMetadata() {
     var completer = new Completer<Metadata>();
@@ -12132,7 +12132,7 @@
 
   @DomName('Entry.getParent')
   @DocsEditable()
-  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_Entry_getParent_Callback(this, successCallback, errorCallback);
+  void _getParent([_EntryCallback successCallback, _ErrorCallback errorCallback]) => _blink.BlinkEntry.$getParent_Callback(this, successCallback, errorCallback);
 
   Future<Entry> getParent() {
     var completer = new Completer<Entry>();
@@ -12142,7 +12142,7 @@
     return completer.future;
   }
 
-  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.Native_Entry__moveTo(this, parent, name, successCallback, errorCallback);
+  void _moveTo(DirectoryEntry parent, {String name, _EntryCallback successCallback, _ErrorCallback errorCallback}) => _blink.BlinkEntry.$_moveTo(this, parent, name, successCallback, errorCallback);
 
   Future<Entry> moveTo(DirectoryEntry parent, {String name}) {
     var completer = new Completer<Entry>();
@@ -12154,7 +12154,7 @@
 
   @DomName('Entry.remove')
   @DocsEditable()
-  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Entry_remove_Callback(this, successCallback, errorCallback);
+  void _remove(VoidCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkEntry.$remove_Callback(this, successCallback, errorCallback);
 
   Future remove() {
     var completer = new Completer();
@@ -12166,7 +12166,7 @@
 
   @DomName('Entry.toURL')
   @DocsEditable()
-  String toUrl() => _blink.Native_Entry_toURL_Callback(this);
+  String toUrl() => _blink.BlinkEntry.$toURL_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12208,24 +12208,24 @@
   @DomName('ErrorEvent.colno')
   @DocsEditable()
   @Experimental() // untriaged
-  int get colno => _blink.Native_ErrorEvent_colno_Getter(this);
+  int get colno => _blink.BlinkErrorEvent.$colno_Getter(this);
 
   @DomName('ErrorEvent.error')
   @DocsEditable()
   @Experimental() // untriaged
-  Object get error => _blink.Native_ErrorEvent_error_Getter(this);
+  Object get error => _blink.BlinkErrorEvent.$error_Getter(this);
 
   @DomName('ErrorEvent.filename')
   @DocsEditable()
-  String get filename => _blink.Native_ErrorEvent_filename_Getter(this);
+  String get filename => _blink.BlinkErrorEvent.$filename_Getter(this);
 
   @DomName('ErrorEvent.lineno')
   @DocsEditable()
-  int get lineno => _blink.Native_ErrorEvent_lineno_Getter(this);
+  int get lineno => _blink.BlinkErrorEvent.$lineno_Getter(this);
 
   @DomName('ErrorEvent.message')
   @DocsEditable()
-  String get message => _blink.Native_ErrorEvent_message_Getter(this);
+  String get message => _blink.BlinkErrorEvent.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12328,11 +12328,11 @@
 
   @DomName('Event.bubbles')
   @DocsEditable()
-  bool get bubbles => _blink.Native_Event_bubbles_Getter(this);
+  bool get bubbles => _blink.BlinkEvent.$bubbles_Getter(this);
 
   @DomName('Event.cancelable')
   @DocsEditable()
-  bool get cancelable => _blink.Native_Event_cancelable_Getter(this);
+  bool get cancelable => _blink.BlinkEvent.$cancelable_Getter(this);
 
   /**
    * Access to the system's clipboard data during copy, cut, and paste events.
@@ -12349,19 +12349,19 @@
   @Experimental()
   // Part of copy/paste
   @Experimental() // nonstandard
-  DataTransfer get clipboardData => _blink.Native_Event_clipboardData_Getter(this);
+  DataTransfer get clipboardData => _blink.BlinkEvent.$clipboardData_Getter(this);
 
   @DomName('Event.currentTarget')
   @DocsEditable()
-  EventTarget get currentTarget => _blink.Native_Event_currentTarget_Getter(this);
+  EventTarget get currentTarget => _blink.BlinkEvent.$currentTarget_Getter(this);
 
   @DomName('Event.defaultPrevented')
   @DocsEditable()
-  bool get defaultPrevented => _blink.Native_Event_defaultPrevented_Getter(this);
+  bool get defaultPrevented => _blink.BlinkEvent.$defaultPrevented_Getter(this);
 
   @DomName('Event.eventPhase')
   @DocsEditable()
-  int get eventPhase => _blink.Native_Event_eventPhase_Getter(this);
+  int get eventPhase => _blink.BlinkEvent.$eventPhase_Getter(this);
 
   /**
    * This event's path, taking into account shadow DOM.
@@ -12376,35 +12376,35 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/shadow/index.html#extensions-to-event
   @Experimental()
-  List<Node> get path => _blink.Native_Event_path_Getter(this);
+  List<Node> get path => _blink.BlinkEvent.$path_Getter(this);
 
   @DomName('Event.target')
   @DocsEditable()
-  EventTarget get target => _blink.Native_Event_target_Getter(this);
+  EventTarget get target => _blink.BlinkEvent.$target_Getter(this);
 
   @DomName('Event.timeStamp')
   @DocsEditable()
-  int get timeStamp => _blink.Native_Event_timeStamp_Getter(this);
+  int get timeStamp => _blink.BlinkEvent.$timeStamp_Getter(this);
 
   @DomName('Event.type')
   @DocsEditable()
-  String get type => _blink.Native_Event_type_Getter(this);
+  String get type => _blink.BlinkEvent.$type_Getter(this);
 
   @DomName('Event.initEvent')
   @DocsEditable()
-  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.Native_Event_initEvent_Callback(this, eventTypeArg, canBubbleArg, cancelableArg);
+  void _initEvent(String eventTypeArg, bool canBubbleArg, bool cancelableArg) => _blink.BlinkEvent.$initEvent_Callback(this, eventTypeArg, canBubbleArg, cancelableArg);
 
   @DomName('Event.preventDefault')
   @DocsEditable()
-  void preventDefault() => _blink.Native_Event_preventDefault_Callback(this);
+  void preventDefault() => _blink.BlinkEvent.$preventDefault_Callback(this);
 
   @DomName('Event.stopImmediatePropagation')
   @DocsEditable()
-  void stopImmediatePropagation() => _blink.Native_Event_stopImmediatePropagation_Callback(this);
+  void stopImmediatePropagation() => _blink.BlinkEvent.$stopImmediatePropagation_Callback(this);
 
   @DomName('Event.stopPropagation')
   @DocsEditable()
-  void stopPropagation() => _blink.Native_Event_stopPropagation_Callback(this);
+  void stopPropagation() => _blink.BlinkEvent.$stopPropagation_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -12457,7 +12457,7 @@
 
   @DomName('EventSource.EventSource')
   @DocsEditable()
-  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.Native_EventSource_EventSource(url, eventSourceInit);
+  static EventSource _factoryEventSource(String url, [Map eventSourceInit]) => _blink.BlinkEventSource.$mkEventSource(url, eventSourceInit);
 
   @DomName('EventSource.CLOSED')
   @DocsEditable()
@@ -12473,19 +12473,19 @@
 
   @DomName('EventSource.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_EventSource_readyState_Getter(this);
+  int get readyState => _blink.BlinkEventSource.$readyState_Getter(this);
 
   @DomName('EventSource.url')
   @DocsEditable()
-  String get url => _blink.Native_EventSource_url_Getter(this);
+  String get url => _blink.BlinkEventSource.$url_Getter(this);
 
   @DomName('EventSource.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.Native_EventSource_withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkEventSource.$withCredentials_Getter(this);
 
   @DomName('EventSource.close')
   @DocsEditable()
-  void close() => _blink.Native_EventSource_close_Callback(this);
+  void close() => _blink.BlinkEventSource.$close_Callback(this);
 
   /// Stream of `error` events handled by this [EventSource].
   @DomName('EventSource.onerror')
@@ -12610,15 +12610,15 @@
 
   @DomName('EventTarget.addEventListener')
   @DocsEditable()
-  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_addEventListener_Callback(this, type, listener, useCapture);
+  void addEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.$addEventListener_Callback(this, type, listener, useCapture);
 
   @DomName('EventTarget.dispatchEvent')
   @DocsEditable()
-  bool dispatchEvent(Event event) => _blink.Native_EventTarget_dispatchEvent_Callback(this, event);
+  bool dispatchEvent(Event event) => _blink.BlinkEventTarget.$dispatchEvent_Callback(this, event);
 
   @DomName('EventTarget.removeEventListener')
   @DocsEditable()
-  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.Native_EventTarget_removeEventListener_Callback(this, type, listener, useCapture);
+  void removeEventListener(String type, EventListener listener, [bool useCapture]) => _blink.BlinkEventTarget.$removeEventListener_Callback(this, type, listener, useCapture);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12647,51 +12647,51 @@
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLFieldSetElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLFieldSetElement.$disabled_Getter(this);
 
   @DomName('HTMLFieldSetElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLFieldSetElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLFieldSetElement.$disabled_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.elements')
   @DocsEditable()
-  List<Node> get elements => _blink.Native_HTMLFieldSetElement_elements_Getter(this);
+  List<Node> get elements => _blink.BlinkHTMLFieldSetElement.$elements_Getter(this);
 
   @DomName('HTMLFieldSetElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLFieldSetElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLFieldSetElement.$form_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLFieldSetElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLFieldSetElement.$name_Getter(this);
 
   @DomName('HTMLFieldSetElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLFieldSetElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFieldSetElement.$name_Setter(this, value);
 
   @DomName('HTMLFieldSetElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLFieldSetElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLFieldSetElement.$type_Getter(this);
 
   @DomName('HTMLFieldSetElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLFieldSetElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLFieldSetElement.$validationMessage_Getter(this);
 
   @DomName('HTMLFieldSetElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLFieldSetElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLFieldSetElement.$validity_Getter(this);
 
   @DomName('HTMLFieldSetElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLFieldSetElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLFieldSetElement.$willValidate_Getter(this);
 
   @DomName('HTMLFieldSetElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLFieldSetElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFieldSetElement.$checkValidity_Callback(this);
 
   @DomName('HTMLFieldSetElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLFieldSetElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLFieldSetElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12710,15 +12710,15 @@
   @DomName('File.lastModified')
   @DocsEditable()
   @Experimental() // untriaged
-  int get lastModified => _blink.Native_File_lastModified_Getter(this);
+  int get lastModified => _blink.BlinkFile.$lastModified_Getter(this);
 
   @DomName('File.lastModifiedDate')
   @DocsEditable()
-  DateTime get lastModifiedDate => _blink.Native_File_lastModifiedDate_Getter(this);
+  DateTime get lastModifiedDate => _blink.BlinkFile.$lastModifiedDate_Getter(this);
 
   @DomName('File.name')
   @DocsEditable()
-  String get name => _blink.Native_File_name_Getter(this);
+  String get name => _blink.BlinkFile.$name_Getter(this);
 
   @DomName('File.webkitRelativePath')
   @DocsEditable()
@@ -12726,7 +12726,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  String get relativePath => _blink.Native_File_webkitRelativePath_Getter(this);
+  String get relativePath => _blink.BlinkFile.$webkitRelativePath_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12757,7 +12757,7 @@
 
   @DomName('FileEntry.createWriter')
   @DocsEditable()
-  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_createWriter_Callback(this, successCallback, errorCallback);
+  void _createWriter(_FileWriterCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkFileEntry.$createWriter_Callback(this, successCallback, errorCallback);
 
   Future<FileWriter> createWriter() {
     var completer = new Completer<FileWriter>();
@@ -12769,7 +12769,7 @@
 
   @DomName('FileEntry.file')
   @DocsEditable()
-  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_FileEntry_file_Callback(this, successCallback, errorCallback);
+  void _file(_FileCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkFileEntry.$file_Callback(this, successCallback, errorCallback);
 
   Future<File> file() {
     var completer = new Completer<File>();
@@ -12845,7 +12845,7 @@
 
   @DomName('FileError.code')
   @DocsEditable()
-  int get code => _blink.Native_FileError_code_Getter(this);
+  int get code => _blink.BlinkFileError.$code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -12863,15 +12863,15 @@
 
   @DomName('FileList.length')
   @DocsEditable()
-  int get length => _blink.Native_FileList_length_Getter(this);
+  int get length => _blink.BlinkFileList.$length_Getter(this);
 
   File operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_FileList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkFileList.$NativeIndexed_Getter(this, index);
   }
 
-  File _nativeIndexedGetter(int index) => _blink.Native_FileList_NativeIndexed_Getter(this, index);
+  File _nativeIndexedGetter(int index) => _blink.BlinkFileList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, File value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -12913,7 +12913,7 @@
 
   @DomName('FileList.item')
   @DocsEditable()
-  File item(int index) => _blink.Native_FileList_item_Callback(this, index);
+  File item(int index) => _blink.BlinkFileList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -12991,7 +12991,7 @@
 
   @DomName('FileReader.FileReader')
   @DocsEditable()
-  factory FileReader() => _blink.Native_FileReader_FileReader();
+  factory FileReader() => _blink.BlinkFileReader.$mkFileReader();
 
   @DomName('FileReader.DONE')
   @DocsEditable()
@@ -13007,29 +13007,29 @@
 
   @DomName('FileReader.error')
   @DocsEditable()
-  FileError get error => _blink.Native_FileReader_error_Getter(this);
+  FileError get error => _blink.BlinkFileReader.$error_Getter(this);
 
   @DomName('FileReader.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_FileReader_readyState_Getter(this);
+  int get readyState => _blink.BlinkFileReader.$readyState_Getter(this);
 
   @DomName('FileReader.result')
   @DocsEditable()
-  Object get result => _blink.Native_FileReader_result_Getter(this);
+  Object get result => _blink.BlinkFileReader.$result_Getter(this);
 
   @DomName('FileReader.abort')
   @DocsEditable()
-  void abort() => _blink.Native_FileReader_abort_Callback(this);
+  void abort() => _blink.BlinkFileReader.$abort_Callback(this);
 
   @DomName('FileReader.readAsArrayBuffer')
   @DocsEditable()
-  void readAsArrayBuffer(Blob blob) => _blink.Native_FileReader_readAsArrayBuffer_Callback(this, blob);
+  void readAsArrayBuffer(Blob blob) => _blink.BlinkFileReader.$readAsArrayBuffer_Callback(this, blob);
 
   @DomName('FileReader.readAsDataURL')
   @DocsEditable()
-  void readAsDataUrl(Blob blob) => _blink.Native_FileReader_readAsDataURL_Callback(this, blob);
+  void readAsDataUrl(Blob blob) => _blink.BlinkFileReader.$readAsDataURL_Callback(this, blob);
 
-  void readAsText(Blob blob, [String encoding]) => _blink.Native_FileReader_readAsText(this, blob, encoding);
+  void readAsText(Blob blob, [String encoding]) => _blink.BlinkFileReader.$readAsText(this, blob, encoding);
 
   /// Stream of `abort` events handled by this [FileReader].
   @DomName('FileReader.onabort')
@@ -13079,7 +13079,7 @@
   @DomName('Stream.type')
   @DocsEditable()
   @Experimental() // untriaged
-  String get type => _blink.Native_Stream_type_Getter(this);
+  String get type => _blink.BlinkStream.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13103,11 +13103,11 @@
 
   @DomName('DOMFileSystem.name')
   @DocsEditable()
-  String get name => _blink.Native_DOMFileSystem_name_Getter(this);
+  String get name => _blink.BlinkDOMFileSystem.$name_Getter(this);
 
   @DomName('DOMFileSystem.root')
   @DocsEditable()
-  DirectoryEntry get root => _blink.Native_DOMFileSystem_root_Getter(this);
+  DirectoryEntry get root => _blink.BlinkDOMFileSystem.$root_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13210,35 +13210,35 @@
 
   @DomName('FileWriter.error')
   @DocsEditable()
-  FileError get error => _blink.Native_FileWriter_error_Getter(this);
+  FileError get error => _blink.BlinkFileWriter.$error_Getter(this);
 
   @DomName('FileWriter.length')
   @DocsEditable()
-  int get length => _blink.Native_FileWriter_length_Getter(this);
+  int get length => _blink.BlinkFileWriter.$length_Getter(this);
 
   @DomName('FileWriter.position')
   @DocsEditable()
-  int get position => _blink.Native_FileWriter_position_Getter(this);
+  int get position => _blink.BlinkFileWriter.$position_Getter(this);
 
   @DomName('FileWriter.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_FileWriter_readyState_Getter(this);
+  int get readyState => _blink.BlinkFileWriter.$readyState_Getter(this);
 
   @DomName('FileWriter.abort')
   @DocsEditable()
-  void abort() => _blink.Native_FileWriter_abort_Callback(this);
+  void abort() => _blink.BlinkFileWriter.$abort_Callback(this);
 
   @DomName('FileWriter.seek')
   @DocsEditable()
-  void seek(int position) => _blink.Native_FileWriter_seek_Callback(this, position);
+  void seek(int position) => _blink.BlinkFileWriter.$seek_Callback(this, position);
 
   @DomName('FileWriter.truncate')
   @DocsEditable()
-  void truncate(int size) => _blink.Native_FileWriter_truncate_Callback(this, size);
+  void truncate(int size) => _blink.BlinkFileWriter.$truncate_Callback(this, size);
 
   @DomName('FileWriter.write')
   @DocsEditable()
-  void write(Blob data) => _blink.Native_FileWriter_write_Callback(this, data);
+  void write(Blob data) => _blink.BlinkFileWriter.$write_Callback(this, data);
 
   /// Stream of `abort` events handled by this [FileWriter].
   @DomName('FileWriter.onabort')
@@ -13297,7 +13297,7 @@
 
   @DomName('FocusEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.Native_FocusEvent_relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkFocusEvent.$relatedTarget_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13316,87 +13316,87 @@
 
   @DomName('FontFace.FontFace')
   @DocsEditable()
-  factory FontFace(String family, String source, Map descriptors) => _blink.Native_FontFace_FontFace(family, source, descriptors);
+  factory FontFace(String family, String source, Map descriptors) => _blink.BlinkFontFace.$mkFontFace(family, source, descriptors);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  String get family => _blink.Native_FontFace_family_Getter(this);
+  String get family => _blink.BlinkFontFace.$family_Getter(this);
 
   @DomName('FontFace.family')
   @DocsEditable()
   @Experimental() // untriaged
-  void set family(String value) => _blink.Native_FontFace_family_Setter(this, value);
+  void set family(String value) => _blink.BlinkFontFace.$family_Setter(this, value);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  String get featureSettings => _blink.Native_FontFace_featureSettings_Getter(this);
+  String get featureSettings => _blink.BlinkFontFace.$featureSettings_Getter(this);
 
   @DomName('FontFace.featureSettings')
   @DocsEditable()
   @Experimental() // untriaged
-  void set featureSettings(String value) => _blink.Native_FontFace_featureSettings_Setter(this, value);
+  void set featureSettings(String value) => _blink.BlinkFontFace.$featureSettings_Setter(this, value);
 
   @DomName('FontFace.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.Native_FontFace_status_Getter(this);
+  String get status => _blink.BlinkFontFace.$status_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  String get stretch => _blink.Native_FontFace_stretch_Getter(this);
+  String get stretch => _blink.BlinkFontFace.$stretch_Getter(this);
 
   @DomName('FontFace.stretch')
   @DocsEditable()
   @Experimental() // untriaged
-  void set stretch(String value) => _blink.Native_FontFace_stretch_Setter(this, value);
+  void set stretch(String value) => _blink.BlinkFontFace.$stretch_Setter(this, value);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  String get style => _blink.Native_FontFace_style_Getter(this);
+  String get style => _blink.BlinkFontFace.$style_Getter(this);
 
   @DomName('FontFace.style')
   @DocsEditable()
   @Experimental() // untriaged
-  void set style(String value) => _blink.Native_FontFace_style_Setter(this, value);
+  void set style(String value) => _blink.BlinkFontFace.$style_Setter(this, value);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  String get unicodeRange => _blink.Native_FontFace_unicodeRange_Getter(this);
+  String get unicodeRange => _blink.BlinkFontFace.$unicodeRange_Getter(this);
 
   @DomName('FontFace.unicodeRange')
   @DocsEditable()
   @Experimental() // untriaged
-  void set unicodeRange(String value) => _blink.Native_FontFace_unicodeRange_Setter(this, value);
+  void set unicodeRange(String value) => _blink.BlinkFontFace.$unicodeRange_Setter(this, value);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  String get variant => _blink.Native_FontFace_variant_Getter(this);
+  String get variant => _blink.BlinkFontFace.$variant_Getter(this);
 
   @DomName('FontFace.variant')
   @DocsEditable()
   @Experimental() // untriaged
-  void set variant(String value) => _blink.Native_FontFace_variant_Setter(this, value);
+  void set variant(String value) => _blink.BlinkFontFace.$variant_Setter(this, value);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  String get weight => _blink.Native_FontFace_weight_Getter(this);
+  String get weight => _blink.BlinkFontFace.$weight_Getter(this);
 
   @DomName('FontFace.weight')
   @DocsEditable()
   @Experimental() // untriaged
-  void set weight(String value) => _blink.Native_FontFace_weight_Setter(this, value);
+  void set weight(String value) => _blink.BlinkFontFace.$weight_Setter(this, value);
 
   @DomName('FontFace.load')
   @DocsEditable()
   @Experimental() // untriaged
-  void load() => _blink.Native_FontFace_load_Callback(this);
+  void load() => _blink.BlinkFontFace.$load_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13416,39 +13416,39 @@
   @DomName('FontFaceSet.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.Native_FontFaceSet_size_Getter(this);
+  int get size => _blink.BlinkFontFaceSet.$size_Getter(this);
 
   @DomName('FontFaceSet.status')
   @DocsEditable()
   @Experimental() // untriaged
-  String get status => _blink.Native_FontFaceSet_status_Getter(this);
+  String get status => _blink.BlinkFontFaceSet.$status_Getter(this);
 
   @DomName('FontFaceSet.add')
   @DocsEditable()
   @Experimental() // untriaged
-  void add(FontFace fontFace) => _blink.Native_FontFaceSet_add_Callback(this, fontFace);
+  void add(FontFace fontFace) => _blink.BlinkFontFaceSet.$add_Callback(this, fontFace);
 
   @DomName('FontFaceSet.check')
   @DocsEditable()
   @Experimental() // untriaged
-  bool check(String font, String text) => _blink.Native_FontFaceSet_check_Callback(this, font, text);
+  bool check(String font, String text) => _blink.BlinkFontFaceSet.$check_Callback(this, font, text);
 
   @DomName('FontFaceSet.clear')
   @DocsEditable()
   @Experimental() // untriaged
-  void clear() => _blink.Native_FontFaceSet_clear_Callback(this);
+  void clear() => _blink.BlinkFontFaceSet.$clear_Callback(this);
 
   @DomName('FontFaceSet.delete')
   @DocsEditable()
   @Experimental() // untriaged
-  bool delete(FontFace fontFace) => _blink.Native_FontFaceSet_delete_Callback(this, fontFace);
+  bool delete(FontFace fontFace) => _blink.BlinkFontFaceSet.$delete_Callback(this, fontFace);
 
-  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.Native_FontFaceSet_forEach(this, callback, thisArg);
+  void forEach(FontFaceSetForEachCallback callback, [Object thisArg]) => _blink.BlinkFontFaceSet.$forEach(this, callback, thisArg);
 
   @DomName('FontFaceSet.has')
   @DocsEditable()
   @Experimental() // untriaged
-  bool has(FontFace fontFace) => _blink.Native_FontFaceSet_has_Callback(this, fontFace);
+  bool has(FontFace fontFace) => _blink.BlinkFontFaceSet.$has_Callback(this, fontFace);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13483,18 +13483,18 @@
   factory FormData([FormElement form]) => _create(form);
 
   @DocsEditable()
-  static FormData _create(form) => _blink.Native_FormData_constructorCallback(form);
+  static FormData _create(form) => _blink.BlinkFormData.$constructorCallback(form);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('FormData.append')
   @DocsEditable()
-  void append(String name, String value) => _blink.Native_FormData_append_Callback(this, name, value);
+  void append(String name, String value) => _blink.BlinkFormData.$append_Callback(this, name, value);
 
   @DomName('FormData.appendBlob')
   @DocsEditable()
-  void appendBlob(String name, Blob value, [String filename]) => _blink.Native_FormData_appendBlob_Callback(this, name, value, filename);
+  void appendBlob(String name, Blob value, [String filename]) => _blink.BlinkFormData.$appendBlob_Callback(this, name, value, filename);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13546,105 +13546,105 @@
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  String get acceptCharset => _blink.Native_HTMLFormElement_acceptCharset_Getter(this);
+  String get acceptCharset => _blink.BlinkHTMLFormElement.$acceptCharset_Getter(this);
 
   @DomName('HTMLFormElement.acceptCharset')
   @DocsEditable()
-  void set acceptCharset(String value) => _blink.Native_HTMLFormElement_acceptCharset_Setter(this, value);
+  void set acceptCharset(String value) => _blink.BlinkHTMLFormElement.$acceptCharset_Setter(this, value);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  String get action => _blink.Native_HTMLFormElement_action_Getter(this);
+  String get action => _blink.BlinkHTMLFormElement.$action_Getter(this);
 
   @DomName('HTMLFormElement.action')
   @DocsEditable()
-  void set action(String value) => _blink.Native_HTMLFormElement_action_Setter(this, value);
+  void set action(String value) => _blink.BlinkHTMLFormElement.$action_Setter(this, value);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  String get autocomplete => _blink.Native_HTMLFormElement_autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLFormElement.$autocomplete_Getter(this);
 
   @DomName('HTMLFormElement.autocomplete')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/association-of-controls-and-forms.html#autofilling-form-controls:-the-autocomplete-attribute
   @Experimental()
-  void set autocomplete(String value) => _blink.Native_HTMLFormElement_autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLFormElement.$autocomplete_Setter(this, value);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  String get encoding => _blink.Native_HTMLFormElement_encoding_Getter(this);
+  String get encoding => _blink.BlinkHTMLFormElement.$encoding_Getter(this);
 
   @DomName('HTMLFormElement.encoding')
   @DocsEditable()
-  void set encoding(String value) => _blink.Native_HTMLFormElement_encoding_Setter(this, value);
+  void set encoding(String value) => _blink.BlinkHTMLFormElement.$encoding_Setter(this, value);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  String get enctype => _blink.Native_HTMLFormElement_enctype_Getter(this);
+  String get enctype => _blink.BlinkHTMLFormElement.$enctype_Getter(this);
 
   @DomName('HTMLFormElement.enctype')
   @DocsEditable()
-  void set enctype(String value) => _blink.Native_HTMLFormElement_enctype_Setter(this, value);
+  void set enctype(String value) => _blink.BlinkHTMLFormElement.$enctype_Setter(this, value);
 
   @DomName('HTMLFormElement.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLFormElement_length_Getter(this);
+  int get length => _blink.BlinkHTMLFormElement.$length_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  String get method => _blink.Native_HTMLFormElement_method_Getter(this);
+  String get method => _blink.BlinkHTMLFormElement.$method_Getter(this);
 
   @DomName('HTMLFormElement.method')
   @DocsEditable()
-  void set method(String value) => _blink.Native_HTMLFormElement_method_Setter(this, value);
+  void set method(String value) => _blink.BlinkHTMLFormElement.$method_Setter(this, value);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLFormElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLFormElement.$name_Getter(this);
 
   @DomName('HTMLFormElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLFormElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLFormElement.$name_Setter(this, value);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  bool get noValidate => _blink.Native_HTMLFormElement_noValidate_Getter(this);
+  bool get noValidate => _blink.BlinkHTMLFormElement.$noValidate_Getter(this);
 
   @DomName('HTMLFormElement.noValidate')
   @DocsEditable()
-  void set noValidate(bool value) => _blink.Native_HTMLFormElement_noValidate_Setter(this, value);
+  void set noValidate(bool value) => _blink.BlinkHTMLFormElement.$noValidate_Setter(this, value);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  String get target => _blink.Native_HTMLFormElement_target_Getter(this);
+  String get target => _blink.BlinkHTMLFormElement.$target_Getter(this);
 
   @DomName('HTMLFormElement.target')
   @DocsEditable()
-  void set target(String value) => _blink.Native_HTMLFormElement_target_Setter(this, value);
+  void set target(String value) => _blink.BlinkHTMLFormElement.$target_Setter(this, value);
 
   @DomName('HTMLFormElement.__getter__')
   @DocsEditable()
-  Element __getter__(int index) => _blink.Native_HTMLFormElement___getter___Callback(this, index);
+  Element __getter__(int index) => _blink.BlinkHTMLFormElement.$__getter___Callback(this, index);
 
   @DomName('HTMLFormElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLFormElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLFormElement.$checkValidity_Callback(this);
 
   @DomName('HTMLFormElement.requestAutocomplete')
   @DocsEditable()
   // http://lists.whatwg.org/htdig.cgi/whatwg-whatwg.org/2012-October/037711.html
   @Experimental()
-  void requestAutocomplete(Map details) => _blink.Native_HTMLFormElement_requestAutocomplete_Callback(this, details);
+  void requestAutocomplete(Map details) => _blink.BlinkHTMLFormElement.$requestAutocomplete_Callback(this, details);
 
   @DomName('HTMLFormElement.reset')
   @DocsEditable()
-  void reset() => _blink.Native_HTMLFormElement_reset_Callback(this);
+  void reset() => _blink.BlinkHTMLFormElement.$reset_Callback(this);
 
   @DomName('HTMLFormElement.submit')
   @DocsEditable()
-  void submit() => _blink.Native_HTMLFormElement_submit_Callback(this);
+  void submit() => _blink.BlinkHTMLFormElement.$submit_Callback(this);
 
   /// Stream of `autocomplete` events handled by this [FormElement].
   @DomName('HTMLFormElement.onautocomplete')
@@ -13678,23 +13678,23 @@
 
   @DomName('Gamepad.axes')
   @DocsEditable()
-  List<num> get axes => _blink.Native_Gamepad_axes_Getter(this);
+  List<num> get axes => _blink.BlinkGamepad.$axes_Getter(this);
 
   @DomName('Gamepad.buttons')
   @DocsEditable()
-  List<num> get buttons => _blink.Native_Gamepad_buttons_Getter(this);
+  List<num> get buttons => _blink.BlinkGamepad.$buttons_Getter(this);
 
   @DomName('Gamepad.id')
   @DocsEditable()
-  String get id => _blink.Native_Gamepad_id_Getter(this);
+  String get id => _blink.BlinkGamepad.$id_Getter(this);
 
   @DomName('Gamepad.index')
   @DocsEditable()
-  int get index => _blink.Native_Gamepad_index_Getter(this);
+  int get index => _blink.BlinkGamepad.$index_Getter(this);
 
   @DomName('Gamepad.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.Native_Gamepad_timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGamepad.$timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -13782,15 +13782,15 @@
 
   @DomName('Geolocation.clearWatch')
   @DocsEditable()
-  void _clearWatch(int watchID) => _blink.Native_Geolocation_clearWatch_Callback(this, watchID);
+  void _clearWatch(int watchID) => _blink.BlinkGeolocation.$clearWatch_Callback(this, watchID);
 
   @DomName('Geolocation.getCurrentPosition')
   @DocsEditable()
-  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_getCurrentPosition_Callback(this, successCallback, errorCallback, options);
+  void _getCurrentPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.BlinkGeolocation.$getCurrentPosition_Callback(this, successCallback, errorCallback, options);
 
   @DomName('Geolocation.watchPosition')
   @DocsEditable()
-  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.Native_Geolocation_watchPosition_Callback(this, successCallback, errorCallback, options);
+  int _watchPosition(_PositionCallback successCallback, [_PositionErrorCallback errorCallback, Object options]) => _blink.BlinkGeolocation.$watchPosition_Callback(this, successCallback, errorCallback, options);
 }
 
 
@@ -13811,11 +13811,11 @@
 
   @DomName('Geoposition.coords')
   @DocsEditable()
-  Coordinates get coords => _blink.Native_Geoposition_coords_Getter(this);
+  Coordinates get coords => _blink.BlinkGeoposition.$coords_Getter(this);
 
   @DomName('Geoposition.timestamp')
   @DocsEditable()
-  int get timestamp => _blink.Native_Geoposition_timestamp_Getter(this);
+  int get timestamp => _blink.BlinkGeoposition.$timestamp_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14199,12 +14199,12 @@
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  String get color => _blink.Native_HTMLHRElement_color_Getter(this);
+  String get color => _blink.BlinkHTMLHRElement.$color_Getter(this);
 
   @DomName('HTMLHRElement.color')
   @DocsEditable()
   @Experimental() // untriaged
-  void set color(String value) => _blink.Native_HTMLHRElement_color_Setter(this, value);
+  void set color(String value) => _blink.BlinkHTMLHRElement.$color_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -14234,15 +14234,15 @@
 
   @DomName('HashChangeEvent.newURL')
   @DocsEditable()
-  String get newUrl => _blink.Native_HashChangeEvent_newURL_Getter(this);
+  String get newUrl => _blink.BlinkHashChangeEvent.$newURL_Getter(this);
 
   @DomName('HashChangeEvent.oldURL')
   @DocsEditable()
-  String get oldUrl => _blink.Native_HashChangeEvent_oldURL_Getter(this);
+  String get oldUrl => _blink.BlinkHashChangeEvent.$oldURL_Getter(this);
 
   @DomName('HashChangeEvent.initHashChangeEvent')
   @DocsEditable()
-  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.Native_HashChangeEvent_initHashChangeEvent_Callback(this, type, canBubble, cancelable, oldURL, newURL);
+  void _initHashChangeEvent(String type, bool canBubble, bool cancelable, String oldURL, String newURL) => _blink.BlinkHashChangeEvent.$initHashChangeEvent_Callback(this, type, canBubble, cancelable, oldURL, newURL);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -14336,23 +14336,23 @@
 
   @DomName('History.length')
   @DocsEditable()
-  int get length => _blink.Native_History_length_Getter(this);
+  int get length => _blink.BlinkHistory.$length_Getter(this);
 
   @DomName('History.state')
   @DocsEditable()
-  dynamic get state => _blink.Native_History_state_Getter(this);
+  dynamic get state => _blink.BlinkHistory.$state_Getter(this);
 
   @DomName('History.back')
   @DocsEditable()
-  void back() => _blink.Native_History_back_Callback(this);
+  void back() => _blink.BlinkHistory.$back_Callback(this);
 
   @DomName('History.forward')
   @DocsEditable()
-  void forward() => _blink.Native_History_forward_Callback(this);
+  void forward() => _blink.BlinkHistory.$forward_Callback(this);
 
   @DomName('History.go')
   @DocsEditable()
-  void go(int distance) => _blink.Native_History_go_Callback(this, distance);
+  void go(int distance) => _blink.BlinkHistory.$go_Callback(this, distance);
 
   @DomName('History.pushState')
   @DocsEditable()
@@ -14360,7 +14360,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void pushState(Object data, String title, [String url]) => _blink.Native_History_pushState_Callback(this, data, title, url);
+  void pushState(Object data, String title, [String url]) => _blink.BlinkHistory.$pushState_Callback(this, data, title, url);
 
   @DomName('History.replaceState')
   @DocsEditable()
@@ -14368,7 +14368,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void replaceState(Object data, String title, [String url]) => _blink.Native_History_replaceState_Callback(this, data, title, url);
+  void replaceState(Object data, String title, [String url]) => _blink.BlinkHistory.$replaceState_Callback(this, data, title, url);
 }
 // 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
@@ -14385,15 +14385,15 @@
 
   @DomName('HTMLCollection.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLCollection_length_Getter(this);
+  int get length => _blink.BlinkHTMLCollection.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
+    return _blink.BlinkHTMLCollection.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_HTMLCollection_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkHTMLCollection.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -14435,11 +14435,11 @@
 
   @DomName('HTMLCollection.item')
   @DocsEditable()
-  Element item(int index) => _blink.Native_HTMLCollection_item_Callback(this, index);
+  Element item(int index) => _blink.BlinkHTMLCollection.$item_Callback(this, index);
 
   @DomName('HTMLCollection.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.Native_HTMLCollection_namedItem_Callback(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLCollection.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -15007,88 +15007,88 @@
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  String get contentEditable => _blink.Native_HTMLElement_contentEditable_Getter(this);
+  String get contentEditable => _blink.BlinkHTMLElement.$contentEditable_Getter(this);
 
   @DomName('HTMLElement.contentEditable')
   @DocsEditable()
-  void set contentEditable(String value) => _blink.Native_HTMLElement_contentEditable_Setter(this, value);
+  void set contentEditable(String value) => _blink.BlinkHTMLElement.$contentEditable_Setter(this, value);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  String get dir => _blink.Native_HTMLElement_dir_Getter(this);
+  String get dir => _blink.BlinkHTMLElement.$dir_Getter(this);
 
   @DomName('HTMLElement.dir')
   @DocsEditable()
-  void set dir(String value) => _blink.Native_HTMLElement_dir_Setter(this, value);
+  void set dir(String value) => _blink.BlinkHTMLElement.$dir_Setter(this, value);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  bool get draggable => _blink.Native_HTMLElement_draggable_Getter(this);
+  bool get draggable => _blink.BlinkHTMLElement.$draggable_Getter(this);
 
   @DomName('HTMLElement.draggable')
   @DocsEditable()
-  void set draggable(bool value) => _blink.Native_HTMLElement_draggable_Setter(this, value);
+  void set draggable(bool value) => _blink.BlinkHTMLElement.$draggable_Setter(this, value);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  bool get hidden => _blink.Native_HTMLElement_hidden_Getter(this);
+  bool get hidden => _blink.BlinkHTMLElement.$hidden_Getter(this);
 
   @DomName('HTMLElement.hidden')
   @DocsEditable()
-  void set hidden(bool value) => _blink.Native_HTMLElement_hidden_Setter(this, value);
+  void set hidden(bool value) => _blink.BlinkHTMLElement.$hidden_Setter(this, value);
 
   @DomName('HTMLElement.inputMethodContext')
   @DocsEditable()
   @Experimental() // untriaged
-  InputMethodContext get inputMethodContext => _blink.Native_HTMLElement_inputMethodContext_Getter(this);
+  InputMethodContext get inputMethodContext => _blink.BlinkHTMLElement.$inputMethodContext_Getter(this);
 
   @DomName('HTMLElement.isContentEditable')
   @DocsEditable()
-  bool get isContentEditable => _blink.Native_HTMLElement_isContentEditable_Getter(this);
+  bool get isContentEditable => _blink.BlinkHTMLElement.$isContentEditable_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  String get lang => _blink.Native_HTMLElement_lang_Getter(this);
+  String get lang => _blink.BlinkHTMLElement.$lang_Getter(this);
 
   @DomName('HTMLElement.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_HTMLElement_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkHTMLElement.$lang_Setter(this, value);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  bool get spellcheck => _blink.Native_HTMLElement_spellcheck_Getter(this);
+  bool get spellcheck => _blink.BlinkHTMLElement.$spellcheck_Getter(this);
 
   @DomName('HTMLElement.spellcheck')
   @DocsEditable()
   // http://blog.whatwg.org/the-road-to-html-5-spellchecking
   @Experimental() // nonstandard
-  void set spellcheck(bool value) => _blink.Native_HTMLElement_spellcheck_Setter(this, value);
+  void set spellcheck(bool value) => _blink.BlinkHTMLElement.$spellcheck_Setter(this, value);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  int get tabIndex => _blink.Native_HTMLElement_tabIndex_Getter(this);
+  int get tabIndex => _blink.BlinkHTMLElement.$tabIndex_Getter(this);
 
   @DomName('HTMLElement.tabIndex')
   @DocsEditable()
-  void set tabIndex(int value) => _blink.Native_HTMLElement_tabIndex_Setter(this, value);
+  void set tabIndex(int value) => _blink.BlinkHTMLElement.$tabIndex_Setter(this, value);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  String get title => _blink.Native_HTMLElement_title_Getter(this);
+  String get title => _blink.BlinkHTMLElement.$title_Getter(this);
 
   @DomName('HTMLElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.Native_HTMLElement_title_Setter(this, value);
+  void set title(String value) => _blink.BlinkHTMLElement.$title_Setter(this, value);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  bool get translate => _blink.Native_HTMLElement_translate_Getter(this);
+  bool get translate => _blink.BlinkHTMLElement.$translate_Getter(this);
 
   @DomName('HTMLElement.translate')
   @DocsEditable()
-  void set translate(bool value) => _blink.Native_HTMLElement_translate_Setter(this, value);
+  void set translate(bool value) => _blink.BlinkHTMLElement.$translate_Setter(this, value);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15096,7 +15096,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  String get dropzone => _blink.Native_HTMLElement_webkitdropzone_Getter(this);
+  String get dropzone => _blink.BlinkHTMLElement.$webkitdropzone_Getter(this);
 
   @DomName('HTMLElement.webkitdropzone')
   @DocsEditable()
@@ -15104,11 +15104,11 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/dnd.html#the-dropzone-attribute
-  void set dropzone(String value) => _blink.Native_HTMLElement_webkitdropzone_Setter(this, value);
+  void set dropzone(String value) => _blink.BlinkHTMLElement.$webkitdropzone_Setter(this, value);
 
   @DomName('HTMLElement.click')
   @DocsEditable()
-  void click() => _blink.Native_HTMLElement_click_Callback(this);
+  void click() => _blink.BlinkHTMLElement.$click_Callback(this);
 
   @DomName('HTMLElement.onabort')
   @DocsEditable()
@@ -15785,7 +15785,7 @@
   factory HttpRequest() => _create();
 
   @DocsEditable()
-  static HttpRequest _create() => _blink.Native_XMLHttpRequest_constructorCallback();
+  static HttpRequest _create() => _blink.BlinkXMLHttpRequest.$constructorCallback();
 
   @DomName('XMLHttpRequest.DONE')
   @DocsEditable()
@@ -15841,7 +15841,7 @@
    */
   @DomName('XMLHttpRequest.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_XMLHttpRequest_readyState_Getter(this);
+  int get readyState => _blink.BlinkXMLHttpRequest.$readyState_Getter(this);
 
   /**
    * The data received as a reponse from the request.
@@ -15856,14 +15856,14 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  Object get response => _blink.Native_XMLHttpRequest_response_Getter(this);
+  Object get response => _blink.BlinkXMLHttpRequest.$response_Getter(this);
 
   /**
    * The response in String form or empty String on failure.
    */
   @DomName('XMLHttpRequest.responseText')
   @DocsEditable()
-  String get responseText => _blink.Native_XMLHttpRequest_responseText_Getter(this);
+  String get responseText => _blink.BlinkXMLHttpRequest.$responseText_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15877,7 +15877,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  String get responseType => _blink.Native_XMLHttpRequest_responseType_Getter(this);
+  String get responseType => _blink.BlinkXMLHttpRequest.$responseType_Getter(this);
 
   /**
    * [String] telling the server the desired response format.
@@ -15891,7 +15891,7 @@
    */
   @DomName('XMLHttpRequest.responseType')
   @DocsEditable()
-  void set responseType(String value) => _blink.Native_XMLHttpRequest_responseType_Setter(this, value);
+  void set responseType(String value) => _blink.BlinkXMLHttpRequest.$responseType_Setter(this, value);
 
   /**
    * The request response, or null on failure.
@@ -15902,7 +15902,7 @@
    */
   @DomName('XMLHttpRequest.responseXML')
   @DocsEditable()
-  Document get responseXml => _blink.Native_XMLHttpRequest_responseXML_Getter(this);
+  Document get responseXml => _blink.BlinkXMLHttpRequest.$responseXML_Getter(this);
 
   /**
    * The http result code from the request (200, 404, etc).
@@ -15910,7 +15910,7 @@
    */
   @DomName('XMLHttpRequest.status')
   @DocsEditable()
-  int get status => _blink.Native_XMLHttpRequest_status_Getter(this);
+  int get status => _blink.BlinkXMLHttpRequest.$status_Getter(this);
 
   /**
    * The request response string (such as \"200 OK\").
@@ -15918,7 +15918,7 @@
    */
   @DomName('XMLHttpRequest.statusText')
   @DocsEditable()
-  String get statusText => _blink.Native_XMLHttpRequest_statusText_Getter(this);
+  String get statusText => _blink.BlinkXMLHttpRequest.$statusText_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -15939,7 +15939,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int get timeout => _blink.Native_XMLHttpRequest_timeout_Getter(this);
+  int get timeout => _blink.BlinkXMLHttpRequest.$timeout_Getter(this);
 
   /**
    * Length of time before a request is automatically terminated.
@@ -15960,7 +15960,7 @@
   @DomName('XMLHttpRequest.timeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void set timeout(int value) => _blink.Native_XMLHttpRequest_timeout_Setter(this, value);
+  void set timeout(int value) => _blink.BlinkXMLHttpRequest.$timeout_Setter(this, value);
 
   /**
    * [EventTarget] that can hold listeners to track the progress of the request.
@@ -15969,7 +15969,7 @@
   @DomName('XMLHttpRequest.upload')
   @DocsEditable()
   @Unstable()
-  HttpRequestUpload get upload => _blink.Native_XMLHttpRequest_upload_Getter(this);
+  HttpRequestUpload get upload => _blink.BlinkXMLHttpRequest.$upload_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -15979,7 +15979,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  bool get withCredentials => _blink.Native_XMLHttpRequest_withCredentials_Getter(this);
+  bool get withCredentials => _blink.BlinkXMLHttpRequest.$withCredentials_Getter(this);
 
   /**
    * True if cross-site requests should use credentials such as cookies
@@ -15989,7 +15989,7 @@
    */
   @DomName('XMLHttpRequest.withCredentials')
   @DocsEditable()
-  void set withCredentials(bool value) => _blink.Native_XMLHttpRequest_withCredentials_Setter(this, value);
+  void set withCredentials(bool value) => _blink.BlinkXMLHttpRequest.$withCredentials_Setter(this, value);
 
   /**
    * Stop the current request.
@@ -16000,7 +16000,7 @@
    */
   @DomName('XMLHttpRequest.abort')
   @DocsEditable()
-  void abort() => _blink.Native_XMLHttpRequest_abort_Callback(this);
+  void abort() => _blink.BlinkXMLHttpRequest.$abort_Callback(this);
 
   /**
    * Retrieve all the response headers from a request.
@@ -16015,7 +16015,7 @@
   @DomName('XMLHttpRequest.getAllResponseHeaders')
   @DocsEditable()
   @Unstable()
-  String getAllResponseHeaders() => _blink.Native_XMLHttpRequest_getAllResponseHeaders_Callback(this);
+  String getAllResponseHeaders() => _blink.BlinkXMLHttpRequest.$getAllResponseHeaders_Callback(this);
 
   /**
    * Return the response header named `header`, or null if not found.
@@ -16026,7 +16026,7 @@
   @DomName('XMLHttpRequest.getResponseHeader')
   @DocsEditable()
   @Unstable()
-  String getResponseHeader(String header) => _blink.Native_XMLHttpRequest_getResponseHeader_Callback(this, header);
+  String getResponseHeader(String header) => _blink.BlinkXMLHttpRequest.$getResponseHeader_Callback(this, header);
 
   /**
    * Specify the desired `url`, and `method` to use in making the request.
@@ -16045,7 +16045,7 @@
    */
   @DomName('XMLHttpRequest.open')
   @DocsEditable()
-  void open(String method, String url, {bool async, String user, String password}) => _blink.Native_XMLHttpRequest_open_Callback(this, method, url, async, user, password);
+  void open(String method, String url, {bool async, String user, String password}) => _blink.BlinkXMLHttpRequest.$open_Callback(this, method, url, async, user, password);
 
   /**
    * Specify a particular MIME type (such as `text/xml`) desired for the
@@ -16059,7 +16059,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.SAFARI)
-  void overrideMimeType(String override) => _blink.Native_XMLHttpRequest_overrideMimeType_Callback(this, override);
+  void overrideMimeType(String override) => _blink.BlinkXMLHttpRequest.$overrideMimeType_Callback(this, override);
 
   /**
    * Send the request with any given `data`.
@@ -16077,7 +16077,7 @@
    */
   @DomName('XMLHttpRequest.send')
   @DocsEditable()
-  void send([data]) => _blink.Native_XMLHttpRequest_send_Callback(this, data);
+  void send([data]) => _blink.BlinkXMLHttpRequest.$send_Callback(this, data);
 
   /**
    * Sets the value of an HTTP requst header.
@@ -16099,7 +16099,7 @@
    */
   @DomName('XMLHttpRequest.setRequestHeader')
   @DocsEditable()
-  void setRequestHeader(String header, String value) => _blink.Native_XMLHttpRequest_setRequestHeader_Callback(this, header, value);
+  void setRequestHeader(String header, String value) => _blink.BlinkXMLHttpRequest.$setRequestHeader_Callback(this, header, value);
 
   /// Stream of `readystatechange` events handled by this [HttpRequest].
 /**
@@ -16294,55 +16294,55 @@
 
   @DomName('HTMLIFrameElement.contentWindow')
   @DocsEditable()
-  WindowBase get contentWindow => _blink.Native_HTMLIFrameElement_contentWindow_Getter(this);
+  WindowBase get contentWindow => _blink.BlinkHTMLIFrameElement.$contentWindow_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLIFrameElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLIFrameElement.$height_Getter(this);
 
   @DomName('HTMLIFrameElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLIFrameElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLIFrameElement.$height_Setter(this, value);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLIFrameElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLIFrameElement.$name_Getter(this);
 
   @DomName('HTMLIFrameElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLIFrameElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLIFrameElement.$name_Setter(this, value);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  String get sandbox => _blink.Native_HTMLIFrameElement_sandbox_Getter(this);
+  String get sandbox => _blink.BlinkHTMLIFrameElement.$sandbox_Getter(this);
 
   @DomName('HTMLIFrameElement.sandbox')
   @DocsEditable()
-  void set sandbox(String value) => _blink.Native_HTMLIFrameElement_sandbox_Setter(this, value);
+  void set sandbox(String value) => _blink.BlinkHTMLIFrameElement.$sandbox_Setter(this, value);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLIFrameElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLIFrameElement.$src_Getter(this);
 
   @DomName('HTMLIFrameElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLIFrameElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLIFrameElement.$src_Setter(this, value);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  String get srcdoc => _blink.Native_HTMLIFrameElement_srcdoc_Getter(this);
+  String get srcdoc => _blink.BlinkHTMLIFrameElement.$srcdoc_Getter(this);
 
   @DomName('HTMLIFrameElement.srcdoc')
   @DocsEditable()
-  void set srcdoc(String value) => _blink.Native_HTMLIFrameElement_srcdoc_Setter(this, value);
+  void set srcdoc(String value) => _blink.BlinkHTMLIFrameElement.$srcdoc_Setter(this, value);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLIFrameElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLIFrameElement.$width_Getter(this);
 
   @DomName('HTMLIFrameElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLIFrameElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLIFrameElement.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16362,12 +16362,12 @@
   @DomName('ImageBitmap.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.Native_ImageBitmap_height_Getter(this);
+  int get height => _blink.BlinkImageBitmap.$height_Getter(this);
 
   @DomName('ImageBitmap.width')
   @DocsEditable()
   @Experimental() // untriaged
-  int get width => _blink.Native_ImageBitmap_width_Getter(this);
+  int get width => _blink.BlinkImageBitmap.$width_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -16390,15 +16390,15 @@
 
   @DomName('ImageData.data')
   @DocsEditable()
-  List<int> get _data => _blink.Native_ImageData_data_Getter(this);
+  List<int> get _data => _blink.BlinkImageData.$data_Getter(this);
 
   @DomName('ImageData.height')
   @DocsEditable()
-  int get height => _blink.Native_ImageData_height_Getter(this);
+  int get height => _blink.BlinkImageData.$height_Getter(this);
 
   @DomName('ImageData.width')
   @DocsEditable()
-  int get width => _blink.Native_ImageData_width_Getter(this);
+  int get width => _blink.BlinkImageData.$width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16429,81 +16429,81 @@
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLImageElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLImageElement.$alt_Getter(this);
 
   @DomName('HTMLImageElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLImageElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLImageElement.$alt_Setter(this, value);
 
   @DomName('HTMLImageElement.complete')
   @DocsEditable()
-  bool get complete => _blink.Native_HTMLImageElement_complete_Getter(this);
+  bool get complete => _blink.BlinkHTMLImageElement.$complete_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  String get crossOrigin => _blink.Native_HTMLImageElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLImageElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLImageElement.crossOrigin')
   @DocsEditable()
-  void set crossOrigin(String value) => _blink.Native_HTMLImageElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLImageElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLImageElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLImageElement.$height_Getter(this);
 
   @DomName('HTMLImageElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLImageElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLImageElement.$height_Setter(this, value);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  bool get isMap => _blink.Native_HTMLImageElement_isMap_Getter(this);
+  bool get isMap => _blink.BlinkHTMLImageElement.$isMap_Getter(this);
 
   @DomName('HTMLImageElement.isMap')
   @DocsEditable()
-  void set isMap(bool value) => _blink.Native_HTMLImageElement_isMap_Setter(this, value);
+  void set isMap(bool value) => _blink.BlinkHTMLImageElement.$isMap_Setter(this, value);
 
   @DomName('HTMLImageElement.naturalHeight')
   @DocsEditable()
-  int get naturalHeight => _blink.Native_HTMLImageElement_naturalHeight_Getter(this);
+  int get naturalHeight => _blink.BlinkHTMLImageElement.$naturalHeight_Getter(this);
 
   @DomName('HTMLImageElement.naturalWidth')
   @DocsEditable()
-  int get naturalWidth => _blink.Native_HTMLImageElement_naturalWidth_Getter(this);
+  int get naturalWidth => _blink.BlinkHTMLImageElement.$naturalWidth_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLImageElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLImageElement.$src_Getter(this);
 
   @DomName('HTMLImageElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLImageElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLImageElement.$src_Setter(this, value);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  String get srcset => _blink.Native_HTMLImageElement_srcset_Getter(this);
+  String get srcset => _blink.BlinkHTMLImageElement.$srcset_Getter(this);
 
   @DomName('HTMLImageElement.srcset')
   @DocsEditable()
   @Experimental() // untriaged
-  void set srcset(String value) => _blink.Native_HTMLImageElement_srcset_Setter(this, value);
+  void set srcset(String value) => _blink.BlinkHTMLImageElement.$srcset_Setter(this, value);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.Native_HTMLImageElement_useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLImageElement.$useMap_Getter(this);
 
   @DomName('HTMLImageElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.Native_HTMLImageElement_useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLImageElement.$useMap_Setter(this, value);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLImageElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLImageElement.$width_Getter(this);
 
   @DomName('HTMLImageElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLImageElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLImageElement.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16523,7 +16523,7 @@
   @DomName('InjectedScriptHost.inspect')
   @DocsEditable()
   @Experimental() // untriaged
-  void inspect(Object objectId, Object hints) => _blink.Native_InjectedScriptHost_inspect_Callback(this, objectId, hints);
+  void inspect(Object objectId, Object hints) => _blink.BlinkInjectedScriptHost.$inspect_Callback(this, objectId, hints);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -16592,333 +16592,333 @@
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  String get accept => _blink.Native_HTMLInputElement_accept_Getter(this);
+  String get accept => _blink.BlinkHTMLInputElement.$accept_Getter(this);
 
   @DomName('HTMLInputElement.accept')
   @DocsEditable()
-  void set accept(String value) => _blink.Native_HTMLInputElement_accept_Setter(this, value);
+  void set accept(String value) => _blink.BlinkHTMLInputElement.$accept_Setter(this, value);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  String get alt => _blink.Native_HTMLInputElement_alt_Getter(this);
+  String get alt => _blink.BlinkHTMLInputElement.$alt_Getter(this);
 
   @DomName('HTMLInputElement.alt')
   @DocsEditable()
-  void set alt(String value) => _blink.Native_HTMLInputElement_alt_Setter(this, value);
+  void set alt(String value) => _blink.BlinkHTMLInputElement.$alt_Setter(this, value);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  String get autocomplete => _blink.Native_HTMLInputElement_autocomplete_Getter(this);
+  String get autocomplete => _blink.BlinkHTMLInputElement.$autocomplete_Getter(this);
 
   @DomName('HTMLInputElement.autocomplete')
   @DocsEditable()
-  void set autocomplete(String value) => _blink.Native_HTMLInputElement_autocomplete_Setter(this, value);
+  void set autocomplete(String value) => _blink.BlinkHTMLInputElement.$autocomplete_Setter(this, value);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLInputElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLInputElement.$autofocus_Getter(this);
 
   @DomName('HTMLInputElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLInputElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLInputElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  bool get checked => _blink.Native_HTMLInputElement_checked_Getter(this);
+  bool get checked => _blink.BlinkHTMLInputElement.$checked_Getter(this);
 
   @DomName('HTMLInputElement.checked')
   @DocsEditable()
-  void set checked(bool value) => _blink.Native_HTMLInputElement_checked_Setter(this, value);
+  void set checked(bool value) => _blink.BlinkHTMLInputElement.$checked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  bool get defaultChecked => _blink.Native_HTMLInputElement_defaultChecked_Getter(this);
+  bool get defaultChecked => _blink.BlinkHTMLInputElement.$defaultChecked_Getter(this);
 
   @DomName('HTMLInputElement.defaultChecked')
   @DocsEditable()
-  void set defaultChecked(bool value) => _blink.Native_HTMLInputElement_defaultChecked_Setter(this, value);
+  void set defaultChecked(bool value) => _blink.BlinkHTMLInputElement.$defaultChecked_Setter(this, value);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLInputElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLInputElement.$defaultValue_Getter(this);
 
   @DomName('HTMLInputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLInputElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLInputElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  String get dirName => _blink.Native_HTMLInputElement_dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLInputElement.$dirName_Getter(this);
 
   @DomName('HTMLInputElement.dirName')
   @DocsEditable()
-  void set dirName(String value) => _blink.Native_HTMLInputElement_dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLInputElement.$dirName_Setter(this, value);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLInputElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLInputElement.$disabled_Getter(this);
 
   @DomName('HTMLInputElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLInputElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLInputElement.$disabled_Setter(this, value);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  List<File> get files => _blink.Native_HTMLInputElement_files_Getter(this);
+  List<File> get files => _blink.BlinkHTMLInputElement.$files_Getter(this);
 
   @DomName('HTMLInputElement.files')
   @DocsEditable()
-  void set files(List<File> value) => _blink.Native_HTMLInputElement_files_Setter(this, value);
+  void set files(List<File> value) => _blink.BlinkHTMLInputElement.$files_Setter(this, value);
 
   @DomName('HTMLInputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLInputElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLInputElement.$form_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  String get formAction => _blink.Native_HTMLInputElement_formAction_Getter(this);
+  String get formAction => _blink.BlinkHTMLInputElement.$formAction_Getter(this);
 
   @DomName('HTMLInputElement.formAction')
   @DocsEditable()
-  void set formAction(String value) => _blink.Native_HTMLInputElement_formAction_Setter(this, value);
+  void set formAction(String value) => _blink.BlinkHTMLInputElement.$formAction_Setter(this, value);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  String get formEnctype => _blink.Native_HTMLInputElement_formEnctype_Getter(this);
+  String get formEnctype => _blink.BlinkHTMLInputElement.$formEnctype_Getter(this);
 
   @DomName('HTMLInputElement.formEnctype')
   @DocsEditable()
-  void set formEnctype(String value) => _blink.Native_HTMLInputElement_formEnctype_Setter(this, value);
+  void set formEnctype(String value) => _blink.BlinkHTMLInputElement.$formEnctype_Setter(this, value);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  String get formMethod => _blink.Native_HTMLInputElement_formMethod_Getter(this);
+  String get formMethod => _blink.BlinkHTMLInputElement.$formMethod_Getter(this);
 
   @DomName('HTMLInputElement.formMethod')
   @DocsEditable()
-  void set formMethod(String value) => _blink.Native_HTMLInputElement_formMethod_Setter(this, value);
+  void set formMethod(String value) => _blink.BlinkHTMLInputElement.$formMethod_Setter(this, value);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  bool get formNoValidate => _blink.Native_HTMLInputElement_formNoValidate_Getter(this);
+  bool get formNoValidate => _blink.BlinkHTMLInputElement.$formNoValidate_Getter(this);
 
   @DomName('HTMLInputElement.formNoValidate')
   @DocsEditable()
-  void set formNoValidate(bool value) => _blink.Native_HTMLInputElement_formNoValidate_Setter(this, value);
+  void set formNoValidate(bool value) => _blink.BlinkHTMLInputElement.$formNoValidate_Setter(this, value);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  String get formTarget => _blink.Native_HTMLInputElement_formTarget_Getter(this);
+  String get formTarget => _blink.BlinkHTMLInputElement.$formTarget_Getter(this);
 
   @DomName('HTMLInputElement.formTarget')
   @DocsEditable()
-  void set formTarget(String value) => _blink.Native_HTMLInputElement_formTarget_Setter(this, value);
+  void set formTarget(String value) => _blink.BlinkHTMLInputElement.$formTarget_Setter(this, value);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLInputElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLInputElement.$height_Getter(this);
 
   @DomName('HTMLInputElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLInputElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLInputElement.$height_Setter(this, value);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  bool get incremental => _blink.Native_HTMLInputElement_incremental_Getter(this);
+  bool get incremental => _blink.BlinkHTMLInputElement.$incremental_Getter(this);
 
   @DomName('HTMLInputElement.incremental')
   @DocsEditable()
   // http://www.w3.org/TR/html-markup/input.search.html
   @Experimental()
-  void set incremental(bool value) => _blink.Native_HTMLInputElement_incremental_Setter(this, value);
+  void set incremental(bool value) => _blink.BlinkHTMLInputElement.$incremental_Setter(this, value);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  bool get indeterminate => _blink.Native_HTMLInputElement_indeterminate_Getter(this);
+  bool get indeterminate => _blink.BlinkHTMLInputElement.$indeterminate_Getter(this);
 
   @DomName('HTMLInputElement.indeterminate')
   @DocsEditable()
-  void set indeterminate(bool value) => _blink.Native_HTMLInputElement_indeterminate_Setter(this, value);
+  void set indeterminate(bool value) => _blink.BlinkHTMLInputElement.$indeterminate_Setter(this, value);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.Native_HTMLInputElement_inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLInputElement.$inputMode_Getter(this);
 
   @DomName('HTMLInputElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.Native_HTMLInputElement_inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLInputElement.$inputMode_Setter(this, value);
 
   @DomName('HTMLInputElement.labels')
   @DocsEditable()
-  List<Node> get labels => _blink.Native_HTMLInputElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLInputElement.$labels_Getter(this);
 
   @DomName('HTMLInputElement.list')
   @DocsEditable()
-  HtmlElement get list => _blink.Native_HTMLInputElement_list_Getter(this);
+  HtmlElement get list => _blink.BlinkHTMLInputElement.$list_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  String get max => _blink.Native_HTMLInputElement_max_Getter(this);
+  String get max => _blink.BlinkHTMLInputElement.$max_Getter(this);
 
   @DomName('HTMLInputElement.max')
   @DocsEditable()
-  void set max(String value) => _blink.Native_HTMLInputElement_max_Setter(this, value);
+  void set max(String value) => _blink.BlinkHTMLInputElement.$max_Setter(this, value);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.Native_HTMLInputElement_maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLInputElement.$maxLength_Getter(this);
 
   @DomName('HTMLInputElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.Native_HTMLInputElement_maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLInputElement.$maxLength_Setter(this, value);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  String get min => _blink.Native_HTMLInputElement_min_Getter(this);
+  String get min => _blink.BlinkHTMLInputElement.$min_Getter(this);
 
   @DomName('HTMLInputElement.min')
   @DocsEditable()
-  void set min(String value) => _blink.Native_HTMLInputElement_min_Setter(this, value);
+  void set min(String value) => _blink.BlinkHTMLInputElement.$min_Setter(this, value);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.Native_HTMLInputElement_multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLInputElement.$multiple_Getter(this);
 
   @DomName('HTMLInputElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.Native_HTMLInputElement_multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLInputElement.$multiple_Setter(this, value);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLInputElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLInputElement.$name_Getter(this);
 
   @DomName('HTMLInputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLInputElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLInputElement.$name_Setter(this, value);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  String get pattern => _blink.Native_HTMLInputElement_pattern_Getter(this);
+  String get pattern => _blink.BlinkHTMLInputElement.$pattern_Getter(this);
 
   @DomName('HTMLInputElement.pattern')
   @DocsEditable()
-  void set pattern(String value) => _blink.Native_HTMLInputElement_pattern_Setter(this, value);
+  void set pattern(String value) => _blink.BlinkHTMLInputElement.$pattern_Setter(this, value);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.Native_HTMLInputElement_placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLInputElement.$placeholder_Getter(this);
 
   @DomName('HTMLInputElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.Native_HTMLInputElement_placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLInputElement.$placeholder_Setter(this, value);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.Native_HTMLInputElement_readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLInputElement.$readOnly_Getter(this);
 
   @DomName('HTMLInputElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.Native_HTMLInputElement_readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLInputElement.$readOnly_Setter(this, value);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLInputElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLInputElement.$required_Getter(this);
 
   @DomName('HTMLInputElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLInputElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLInputElement.$required_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.Native_HTMLInputElement_selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLInputElement.$selectionDirection_Getter(this);
 
   @DomName('HTMLInputElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.Native_HTMLInputElement_selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLInputElement.$selectionDirection_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.Native_HTMLInputElement_selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLInputElement.$selectionEnd_Getter(this);
 
   @DomName('HTMLInputElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.Native_HTMLInputElement_selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLInputElement.$selectionEnd_Setter(this, value);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.Native_HTMLInputElement_selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLInputElement.$selectionStart_Getter(this);
 
   @DomName('HTMLInputElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.Native_HTMLInputElement_selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLInputElement.$selectionStart_Setter(this, value);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  int get size => _blink.Native_HTMLInputElement_size_Getter(this);
+  int get size => _blink.BlinkHTMLInputElement.$size_Getter(this);
 
   @DomName('HTMLInputElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.Native_HTMLInputElement_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLInputElement.$size_Setter(this, value);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLInputElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLInputElement.$src_Getter(this);
 
   @DomName('HTMLInputElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLInputElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLInputElement.$src_Setter(this, value);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  String get step => _blink.Native_HTMLInputElement_step_Getter(this);
+  String get step => _blink.BlinkHTMLInputElement.$step_Getter(this);
 
   @DomName('HTMLInputElement.step')
   @DocsEditable()
-  void set step(String value) => _blink.Native_HTMLInputElement_step_Setter(this, value);
+  void set step(String value) => _blink.BlinkHTMLInputElement.$step_Setter(this, value);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLInputElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLInputElement.$type_Getter(this);
 
   @DomName('HTMLInputElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLInputElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLInputElement.$type_Setter(this, value);
 
   @DomName('HTMLInputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLInputElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLInputElement.$validationMessage_Getter(this);
 
   @DomName('HTMLInputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLInputElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLInputElement.$validity_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLInputElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLInputElement.$value_Getter(this);
 
   @DomName('HTMLInputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLInputElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLInputElement.$value_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  DateTime get valueAsDate => _blink.Native_HTMLInputElement_valueAsDate_Getter(this);
+  DateTime get valueAsDate => _blink.BlinkHTMLInputElement.$valueAsDate_Getter(this);
 
   @DomName('HTMLInputElement.valueAsDate')
   @DocsEditable()
-  void set valueAsDate(DateTime value) => _blink.Native_HTMLInputElement_valueAsDate_Setter(this, value);
+  void set valueAsDate(DateTime value) => _blink.BlinkHTMLInputElement.$valueAsDate_Setter(this, value);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  num get valueAsNumber => _blink.Native_HTMLInputElement_valueAsNumber_Getter(this);
+  num get valueAsNumber => _blink.BlinkHTMLInputElement.$valueAsNumber_Getter(this);
 
   @DomName('HTMLInputElement.valueAsNumber')
   @DocsEditable()
-  void set valueAsNumber(num value) => _blink.Native_HTMLInputElement_valueAsNumber_Setter(this, value);
+  void set valueAsNumber(num value) => _blink.BlinkHTMLInputElement.$valueAsNumber_Setter(this, value);
 
   @DomName('HTMLInputElement.webkitEntries')
   @DocsEditable()
@@ -16926,7 +16926,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/states-of-the-type-attribute.html#concept-input-type-file-selected
-  List<Entry> get entries => _blink.Native_HTMLInputElement_webkitEntries_Getter(this);
+  List<Entry> get entries => _blink.BlinkHTMLInputElement.$webkitEntries_Getter(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -16934,7 +16934,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  bool get directory => _blink.Native_HTMLInputElement_webkitdirectory_Getter(this);
+  bool get directory => _blink.BlinkHTMLInputElement.$webkitdirectory_Getter(this);
 
   @DomName('HTMLInputElement.webkitdirectory')
   @DocsEditable()
@@ -16942,39 +16942,39 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://plus.sandbox.google.com/+AddyOsmani/posts/Dk5UhZ6zfF3
-  void set directory(bool value) => _blink.Native_HTMLInputElement_webkitdirectory_Setter(this, value);
+  void set directory(bool value) => _blink.BlinkHTMLInputElement.$webkitdirectory_Setter(this, value);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLInputElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLInputElement.$width_Getter(this);
 
   @DomName('HTMLInputElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLInputElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLInputElement.$width_Setter(this, value);
 
   @DomName('HTMLInputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLInputElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLInputElement.$willValidate_Getter(this);
 
   @DomName('HTMLInputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLInputElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLInputElement.$checkValidity_Callback(this);
 
   @DomName('HTMLInputElement.select')
   @DocsEditable()
-  void select() => _blink.Native_HTMLInputElement_select_Callback(this);
+  void select() => _blink.BlinkHTMLInputElement.$select_Callback(this);
 
   @DomName('HTMLInputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLInputElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLInputElement.$setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLInputElement_setRangeText(this, replacement, start, end, selectionMode);
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.BlinkHTMLInputElement.$setRangeText(this, replacement, start, end, selectionMode);
 
-  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLInputElement_setSelectionRange(this, start, end, direction);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.BlinkHTMLInputElement.$setSelectionRange(this, start, end, direction);
 
-  void stepDown([int n]) => _blink.Native_HTMLInputElement_stepDown(this, n);
+  void stepDown([int n]) => _blink.BlinkHTMLInputElement.$stepDown(this, n);
 
-  void stepUp([int n]) => _blink.Native_HTMLInputElement_stepUp(this, n);
+  void stepUp([int n]) => _blink.BlinkHTMLInputElement.$stepUp(this, n);
 
   /// Stream of `speechchange` events handled by this [InputElement].
   @DomName('HTMLInputElement.onwebkitSpeechChange')
@@ -17558,25 +17558,25 @@
   @DomName('InputMethodContext.compositionEndOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionEndOffset => _blink.Native_InputMethodContext_compositionEndOffset_Getter(this);
+  int get compositionEndOffset => _blink.BlinkInputMethodContext.$compositionEndOffset_Getter(this);
 
   @DomName('InputMethodContext.compositionStartOffset')
   @DocsEditable()
   @Experimental() // untriaged
-  int get compositionStartOffset => _blink.Native_InputMethodContext_compositionStartOffset_Getter(this);
+  int get compositionStartOffset => _blink.BlinkInputMethodContext.$compositionStartOffset_Getter(this);
 
   @DomName('InputMethodContext.locale')
   @DocsEditable()
-  String get locale => _blink.Native_InputMethodContext_locale_Getter(this);
+  String get locale => _blink.BlinkInputMethodContext.$locale_Getter(this);
 
   @DomName('InputMethodContext.target')
   @DocsEditable()
   @Experimental() // untriaged
-  HtmlElement get target => _blink.Native_InputMethodContext_target_Getter(this);
+  HtmlElement get target => _blink.BlinkInputMethodContext.$target_Getter(this);
 
   @DomName('InputMethodContext.confirmComposition')
   @DocsEditable()
-  void confirmComposition() => _blink.Native_InputMethodContext_confirmComposition_Callback(this);
+  void confirmComposition() => _blink.BlinkInputMethodContext.$confirmComposition_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17596,7 +17596,7 @@
   @DomName('InstallEvent.replace')
   @DocsEditable()
   @Experimental() // untriaged
-  void replace() => _blink.Native_InstallEvent_replace_Callback(this);
+  void replace() => _blink.BlinkInstallEvent.$replace_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17616,7 +17616,7 @@
   @DomName('InstallPhaseEvent.waitUntil')
   @DocsEditable()
   @Experimental() // untriaged
-  void waitUntil(Object value) => _blink.Native_InstallPhaseEvent_waitUntil_Callback(this, value);
+  void waitUntil(Object value) => _blink.BlinkInstallPhaseEvent.$waitUntil_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17636,12 +17636,12 @@
   @DomName('KeyPair.privateKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get privateKey => _blink.Native_KeyPair_privateKey_Getter(this);
+  CryptoKey get privateKey => _blink.BlinkKeyPair.$privateKey_Getter(this);
 
   @DomName('KeyPair.publicKey')
   @DocsEditable()
   @Experimental() // untriaged
-  CryptoKey get publicKey => _blink.Native_KeyPair_publicKey_Getter(this);
+  CryptoKey get publicKey => _blink.BlinkKeyPair.$publicKey_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17697,52 +17697,52 @@
   @DomName('KeyboardEvent.altGraphKey')
   @DocsEditable()
   @Experimental() // nonstandard
-  bool get altGraphKey => _blink.Native_KeyboardEvent_altGraphKey_Getter(this);
+  bool get altGraphKey => _blink.BlinkKeyboardEvent.$altGraphKey_Getter(this);
 
   @DomName('KeyboardEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_KeyboardEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkKeyboardEvent.$altKey_Getter(this);
 
   @DomName('KeyboardEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_KeyboardEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkKeyboardEvent.$ctrlKey_Getter(this);
 
   @DomName('KeyboardEvent.keyIdentifier')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get _keyIdentifier => _blink.Native_KeyboardEvent_keyIdentifier_Getter(this);
+  String get _keyIdentifier => _blink.BlinkKeyboardEvent.$keyIdentifier_Getter(this);
 
   @DomName('KeyboardEvent.keyLocation')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get keyLocation => _blink.Native_KeyboardEvent_keyLocation_Getter(this);
+  int get keyLocation => _blink.BlinkKeyboardEvent.$keyLocation_Getter(this);
 
   @DomName('KeyboardEvent.location')
   @DocsEditable()
   @Experimental() // untriaged
-  int get location => _blink.Native_KeyboardEvent_location_Getter(this);
+  int get location => _blink.BlinkKeyboardEvent.$location_Getter(this);
 
   @DomName('KeyboardEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_KeyboardEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkKeyboardEvent.$metaKey_Getter(this);
 
   @DomName('KeyboardEvent.repeat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get repeat => _blink.Native_KeyboardEvent_repeat_Getter(this);
+  bool get repeat => _blink.BlinkKeyboardEvent.$repeat_Getter(this);
 
   @DomName('KeyboardEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_KeyboardEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkKeyboardEvent.$shiftKey_Getter(this);
 
   @DomName('KeyboardEvent.getModifierState')
   @DocsEditable()
   @Experimental() // untriaged
-  bool getModifierState(String keyArgument) => _blink.Native_KeyboardEvent_getModifierState_Callback(this, keyArgument);
+  bool getModifierState(String keyArgument) => _blink.BlinkKeyboardEvent.$getModifierState_Callback(this, keyArgument);
 
   @DomName('KeyboardEvent.initKeyboardEvent')
   @DocsEditable()
-  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) => _blink.Native_KeyboardEvent_initKeyboardEvent_Callback(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
+  void _initKeyboardEvent(String type, bool canBubble, bool cancelable, Window view, String keyIdentifier, int location, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, bool altGraphKey) => _blink.BlinkKeyboardEvent.$initKeyboardEvent_Callback(this, type, canBubble, cancelable, view, keyIdentifier, location, ctrlKey, altKey, shiftKey, metaKey, altGraphKey);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17777,76 +17777,76 @@
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLKeygenElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLKeygenElement.$autofocus_Getter(this);
 
   @DomName('HTMLKeygenElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLKeygenElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLKeygenElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  String get challenge => _blink.Native_HTMLKeygenElement_challenge_Getter(this);
+  String get challenge => _blink.BlinkHTMLKeygenElement.$challenge_Getter(this);
 
   @DomName('HTMLKeygenElement.challenge')
   @DocsEditable()
-  void set challenge(String value) => _blink.Native_HTMLKeygenElement_challenge_Setter(this, value);
+  void set challenge(String value) => _blink.BlinkHTMLKeygenElement.$challenge_Setter(this, value);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLKeygenElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLKeygenElement.$disabled_Getter(this);
 
   @DomName('HTMLKeygenElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLKeygenElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLKeygenElement.$disabled_Setter(this, value);
 
   @DomName('HTMLKeygenElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLKeygenElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLKeygenElement.$form_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  String get keytype => _blink.Native_HTMLKeygenElement_keytype_Getter(this);
+  String get keytype => _blink.BlinkHTMLKeygenElement.$keytype_Getter(this);
 
   @DomName('HTMLKeygenElement.keytype')
   @DocsEditable()
-  void set keytype(String value) => _blink.Native_HTMLKeygenElement_keytype_Setter(this, value);
+  void set keytype(String value) => _blink.BlinkHTMLKeygenElement.$keytype_Setter(this, value);
 
   @DomName('HTMLKeygenElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLKeygenElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLKeygenElement.$labels_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLKeygenElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLKeygenElement.$name_Getter(this);
 
   @DomName('HTMLKeygenElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLKeygenElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLKeygenElement.$name_Setter(this, value);
 
   @DomName('HTMLKeygenElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLKeygenElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLKeygenElement.$type_Getter(this);
 
   @DomName('HTMLKeygenElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLKeygenElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLKeygenElement.$validationMessage_Getter(this);
 
   @DomName('HTMLKeygenElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLKeygenElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLKeygenElement.$validity_Getter(this);
 
   @DomName('HTMLKeygenElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLKeygenElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLKeygenElement.$willValidate_Getter(this);
 
   @DomName('HTMLKeygenElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLKeygenElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLKeygenElement.$checkValidity_Callback(this);
 
   @DomName('HTMLKeygenElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLKeygenElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLKeygenElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17874,11 +17874,11 @@
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  int get value => _blink.Native_HTMLLIElement_value_Getter(this);
+  int get value => _blink.BlinkHTMLLIElement.$value_Getter(this);
 
   @DomName('HTMLLIElement.value')
   @DocsEditable()
-  void set value(int value) => _blink.Native_HTMLLIElement_value_Setter(this, value);
+  void set value(int value) => _blink.BlinkHTMLLIElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17906,19 +17906,19 @@
 
   @DomName('HTMLLabelElement.control')
   @DocsEditable()
-  HtmlElement get control => _blink.Native_HTMLLabelElement_control_Getter(this);
+  HtmlElement get control => _blink.BlinkHTMLLabelElement.$control_Getter(this);
 
   @DomName('HTMLLabelElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLLabelElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLabelElement.$form_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  String get htmlFor => _blink.Native_HTMLLabelElement_htmlFor_Getter(this);
+  String get htmlFor => _blink.BlinkHTMLLabelElement.$htmlFor_Getter(this);
 
   @DomName('HTMLLabelElement.htmlFor')
   @DocsEditable()
-  void set htmlFor(String value) => _blink.Native_HTMLLabelElement_htmlFor_Setter(this, value);
+  void set htmlFor(String value) => _blink.BlinkHTMLLabelElement.$htmlFor_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -17946,7 +17946,7 @@
 
   @DomName('HTMLLegendElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLLegendElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLLegendElement.$form_Getter(this);
 
 }
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
@@ -17973,74 +17973,74 @@
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.Native_HTMLLinkElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLLinkElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLLinkElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.Native_HTMLLinkElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLLinkElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLLinkElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLLinkElement.$disabled_Getter(this);
 
   @DomName('HTMLLinkElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLLinkElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLLinkElement.$disabled_Setter(this, value);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  String get href => _blink.Native_HTMLLinkElement_href_Getter(this);
+  String get href => _blink.BlinkHTMLLinkElement.$href_Getter(this);
 
   @DomName('HTMLLinkElement.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_HTMLLinkElement_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkHTMLLinkElement.$href_Setter(this, value);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  String get hreflang => _blink.Native_HTMLLinkElement_hreflang_Getter(this);
+  String get hreflang => _blink.BlinkHTMLLinkElement.$hreflang_Getter(this);
 
   @DomName('HTMLLinkElement.hreflang')
   @DocsEditable()
-  void set hreflang(String value) => _blink.Native_HTMLLinkElement_hreflang_Setter(this, value);
+  void set hreflang(String value) => _blink.BlinkHTMLLinkElement.$hreflang_Setter(this, value);
 
   @DomName('HTMLLinkElement.import')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webcomponents/raw-file/tip/spec/imports/index.html#interface-import
   @Experimental()
-  Document get import => _blink.Native_HTMLLinkElement_import_Getter(this);
+  Document get import => _blink.BlinkHTMLLinkElement.$import_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLLinkElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLLinkElement.$media_Getter(this);
 
   @DomName('HTMLLinkElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLLinkElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLLinkElement.$media_Setter(this, value);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  String get rel => _blink.Native_HTMLLinkElement_rel_Getter(this);
+  String get rel => _blink.BlinkHTMLLinkElement.$rel_Getter(this);
 
   @DomName('HTMLLinkElement.rel')
   @DocsEditable()
-  void set rel(String value) => _blink.Native_HTMLLinkElement_rel_Setter(this, value);
+  void set rel(String value) => _blink.BlinkHTMLLinkElement.$rel_Setter(this, value);
 
   @DomName('HTMLLinkElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.Native_HTMLLinkElement_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLLinkElement.$sheet_Getter(this);
 
   @DomName('HTMLLinkElement.sizes')
   @DocsEditable()
-  DomSettableTokenList get sizes => _blink.Native_HTMLLinkElement_sizes_Getter(this);
+  DomSettableTokenList get sizes => _blink.BlinkHTMLLinkElement.$sizes_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLLinkElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLLinkElement.$type_Getter(this);
 
   @DomName('HTMLLinkElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLLinkElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLLinkElement.$type_Setter(this, value);
 
 
     /// Checks if HTML imports are supported on the current platform.
@@ -18062,93 +18062,93 @@
   @DomName('Location.ancestorOrigins')
   @DocsEditable()
   @Experimental() // nonstandard
-  List<String> get ancestorOrigins => _blink.Native_Location_ancestorOrigins_Getter(this);
+  List<String> get ancestorOrigins => _blink.BlinkLocation.$ancestorOrigins_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  String get hash => _blink.Native_Location_hash_Getter(this);
+  String get hash => _blink.BlinkLocation.$hash_Getter(this);
 
   @DomName('Location.hash')
   @DocsEditable()
-  void set hash(String value) => _blink.Native_Location_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkLocation.$hash_Setter(this, value);
 
   @DomName('Location.host')
   @DocsEditable()
-  String get host => _blink.Native_Location_host_Getter(this);
+  String get host => _blink.BlinkLocation.$host_Getter(this);
 
   @DomName('Location.host')
   @DocsEditable()
-  void set host(String value) => _blink.Native_Location_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkLocation.$host_Setter(this, value);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  String get hostname => _blink.Native_Location_hostname_Getter(this);
+  String get hostname => _blink.BlinkLocation.$hostname_Getter(this);
 
   @DomName('Location.hostname')
   @DocsEditable()
-  void set hostname(String value) => _blink.Native_Location_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkLocation.$hostname_Setter(this, value);
 
   @DomName('Location.href')
   @DocsEditable()
-  String get href => _blink.Native_Location_href_Getter(this);
+  String get href => _blink.BlinkLocation.$href_Getter(this);
 
   @DomName('Location.href')
   @DocsEditable()
-  void set href(String value) => _blink.Native_Location_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkLocation.$href_Setter(this, value);
 
   @DomName('Location.origin')
   @DocsEditable()
   // http://url.spec.whatwg.org/#urlutils Webkit Only
   @Experimental() // non-standard
-  String get origin => _blink.Native_Location_origin_Getter(this);
+  String get origin => _blink.BlinkLocation.$origin_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  String get pathname => _blink.Native_Location_pathname_Getter(this);
+  String get pathname => _blink.BlinkLocation.$pathname_Getter(this);
 
   @DomName('Location.pathname')
   @DocsEditable()
-  void set pathname(String value) => _blink.Native_Location_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkLocation.$pathname_Setter(this, value);
 
   @DomName('Location.port')
   @DocsEditable()
-  String get port => _blink.Native_Location_port_Getter(this);
+  String get port => _blink.BlinkLocation.$port_Getter(this);
 
   @DomName('Location.port')
   @DocsEditable()
-  void set port(String value) => _blink.Native_Location_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkLocation.$port_Setter(this, value);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_Location_protocol_Getter(this);
+  String get protocol => _blink.BlinkLocation.$protocol_Getter(this);
 
   @DomName('Location.protocol')
   @DocsEditable()
-  void set protocol(String value) => _blink.Native_Location_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkLocation.$protocol_Setter(this, value);
 
   @DomName('Location.search')
   @DocsEditable()
-  String get search => _blink.Native_Location_search_Getter(this);
+  String get search => _blink.BlinkLocation.$search_Getter(this);
 
   @DomName('Location.search')
   @DocsEditable()
-  void set search(String value) => _blink.Native_Location_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkLocation.$search_Setter(this, value);
 
   @DomName('Location.assign')
   @DocsEditable()
-  void assign(String url) => _blink.Native_Location_assign_Callback(this, url);
+  void assign(String url) => _blink.BlinkLocation.$assign_Callback(this, url);
 
   @DomName('Location.reload')
   @DocsEditable()
-  void reload() => _blink.Native_Location_reload_Callback(this);
+  void reload() => _blink.BlinkLocation.$reload_Callback(this);
 
   @DomName('Location.replace')
   @DocsEditable()
-  void replace(String url) => _blink.Native_Location_replace_Callback(this, url);
+  void replace(String url) => _blink.BlinkLocation.$replace_Callback(this, url);
 
   @DomName('Location.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Location_toString_Callback(this);
+  String toString() => _blink.BlinkLocation.$toString_Callback(this);
 
 
 }
@@ -18198,15 +18198,15 @@
 
   @DomName('HTMLMapElement.areas')
   @DocsEditable()
-  List<Node> get areas => _blink.Native_HTMLMapElement_areas_Getter(this);
+  List<Node> get areas => _blink.BlinkHTMLMapElement.$areas_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLMapElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLMapElement.$name_Getter(this);
 
   @DomName('HTMLMapElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLMapElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMapElement.$name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18226,83 +18226,83 @@
 
   @DomName('MediaController.MediaController')
   @DocsEditable()
-  factory MediaController() => _blink.Native_MediaController_MediaController();
+  factory MediaController() => _blink.BlinkMediaController.$mkMediaController();
 
   @DomName('MediaController.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_MediaController_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkMediaController.$buffered_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.Native_MediaController_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkMediaController.$currentTime_Getter(this);
 
   @DomName('MediaController.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.Native_MediaController_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkMediaController.$currentTime_Setter(this, value);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.Native_MediaController_defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkMediaController.$defaultPlaybackRate_Getter(this);
 
   @DomName('MediaController.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.Native_MediaController_defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkMediaController.$defaultPlaybackRate_Setter(this, value);
 
   @DomName('MediaController.duration')
   @DocsEditable()
-  double get duration => _blink.Native_MediaController_duration_Getter(this);
+  double get duration => _blink.BlinkMediaController.$duration_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  bool get muted => _blink.Native_MediaController_muted_Getter(this);
+  bool get muted => _blink.BlinkMediaController.$muted_Getter(this);
 
   @DomName('MediaController.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.Native_MediaController_muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkMediaController.$muted_Setter(this, value);
 
   @DomName('MediaController.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_MediaController_paused_Getter(this);
+  bool get paused => _blink.BlinkMediaController.$paused_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.Native_MediaController_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkMediaController.$playbackRate_Getter(this);
 
   @DomName('MediaController.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.Native_MediaController_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkMediaController.$playbackRate_Setter(this, value);
 
   @DomName('MediaController.playbackState')
   @DocsEditable()
-  String get playbackState => _blink.Native_MediaController_playbackState_Getter(this);
+  String get playbackState => _blink.BlinkMediaController.$playbackState_Getter(this);
 
   @DomName('MediaController.played')
   @DocsEditable()
-  TimeRanges get played => _blink.Native_MediaController_played_Getter(this);
+  TimeRanges get played => _blink.BlinkMediaController.$played_Getter(this);
 
   @DomName('MediaController.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.Native_MediaController_seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkMediaController.$seekable_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  num get volume => _blink.Native_MediaController_volume_Getter(this);
+  num get volume => _blink.BlinkMediaController.$volume_Getter(this);
 
   @DomName('MediaController.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_MediaController_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkMediaController.$volume_Setter(this, value);
 
   @DomName('MediaController.pause')
   @DocsEditable()
-  void pause() => _blink.Native_MediaController_pause_Callback(this);
+  void pause() => _blink.BlinkMediaController.$pause_Callback(this);
 
   @DomName('MediaController.play')
   @DocsEditable()
-  void play() => _blink.Native_MediaController_play_Callback(this);
+  void play() => _blink.BlinkMediaController.$play_Callback(this);
 
   @DomName('MediaController.unpause')
   @DocsEditable()
-  void unpause() => _blink.Native_MediaController_unpause_Callback(this);
+  void unpause() => _blink.BlinkMediaController.$unpause_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -18631,173 +18631,173 @@
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  bool get autoplay => _blink.Native_HTMLMediaElement_autoplay_Getter(this);
+  bool get autoplay => _blink.BlinkHTMLMediaElement.$autoplay_Getter(this);
 
   @DomName('HTMLMediaElement.autoplay')
   @DocsEditable()
-  void set autoplay(bool value) => _blink.Native_HTMLMediaElement_autoplay_Setter(this, value);
+  void set autoplay(bool value) => _blink.BlinkHTMLMediaElement.$autoplay_Setter(this, value);
 
   @DomName('HTMLMediaElement.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_HTMLMediaElement_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkHTMLMediaElement.$buffered_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  MediaController get controller => _blink.Native_HTMLMediaElement_controller_Getter(this);
+  MediaController get controller => _blink.BlinkHTMLMediaElement.$controller_Getter(this);
 
   @DomName('HTMLMediaElement.controller')
   @DocsEditable()
-  void set controller(MediaController value) => _blink.Native_HTMLMediaElement_controller_Setter(this, value);
+  void set controller(MediaController value) => _blink.BlinkHTMLMediaElement.$controller_Setter(this, value);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  bool get controls => _blink.Native_HTMLMediaElement_controls_Getter(this);
+  bool get controls => _blink.BlinkHTMLMediaElement.$controls_Getter(this);
 
   @DomName('HTMLMediaElement.controls')
   @DocsEditable()
-  void set controls(bool value) => _blink.Native_HTMLMediaElement_controls_Setter(this, value);
+  void set controls(bool value) => _blink.BlinkHTMLMediaElement.$controls_Setter(this, value);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get crossOrigin => _blink.Native_HTMLMediaElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLMediaElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLMediaElement.crossOrigin')
   @DocsEditable()
   @Experimental() // untriaged
-  void set crossOrigin(String value) => _blink.Native_HTMLMediaElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLMediaElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLMediaElement.currentSrc')
   @DocsEditable()
-  String get currentSrc => _blink.Native_HTMLMediaElement_currentSrc_Getter(this);
+  String get currentSrc => _blink.BlinkHTMLMediaElement.$currentSrc_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  num get currentTime => _blink.Native_HTMLMediaElement_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkHTMLMediaElement.$currentTime_Getter(this);
 
   @DomName('HTMLMediaElement.currentTime')
   @DocsEditable()
-  void set currentTime(num value) => _blink.Native_HTMLMediaElement_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkHTMLMediaElement.$currentTime_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  bool get defaultMuted => _blink.Native_HTMLMediaElement_defaultMuted_Getter(this);
+  bool get defaultMuted => _blink.BlinkHTMLMediaElement.$defaultMuted_Getter(this);
 
   @DomName('HTMLMediaElement.defaultMuted')
   @DocsEditable()
-  void set defaultMuted(bool value) => _blink.Native_HTMLMediaElement_defaultMuted_Setter(this, value);
+  void set defaultMuted(bool value) => _blink.BlinkHTMLMediaElement.$defaultMuted_Setter(this, value);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  num get defaultPlaybackRate => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Getter(this);
+  num get defaultPlaybackRate => _blink.BlinkHTMLMediaElement.$defaultPlaybackRate_Getter(this);
 
   @DomName('HTMLMediaElement.defaultPlaybackRate')
   @DocsEditable()
-  void set defaultPlaybackRate(num value) => _blink.Native_HTMLMediaElement_defaultPlaybackRate_Setter(this, value);
+  void set defaultPlaybackRate(num value) => _blink.BlinkHTMLMediaElement.$defaultPlaybackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.duration')
   @DocsEditable()
-  double get duration => _blink.Native_HTMLMediaElement_duration_Getter(this);
+  double get duration => _blink.BlinkHTMLMediaElement.$duration_Getter(this);
 
   @DomName('HTMLMediaElement.ended')
   @DocsEditable()
-  bool get ended => _blink.Native_HTMLMediaElement_ended_Getter(this);
+  bool get ended => _blink.BlinkHTMLMediaElement.$ended_Getter(this);
 
   @DomName('HTMLMediaElement.error')
   @DocsEditable()
-  MediaError get error => _blink.Native_HTMLMediaElement_error_Getter(this);
+  MediaError get error => _blink.BlinkHTMLMediaElement.$error_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  bool get loop => _blink.Native_HTMLMediaElement_loop_Getter(this);
+  bool get loop => _blink.BlinkHTMLMediaElement.$loop_Getter(this);
 
   @DomName('HTMLMediaElement.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.Native_HTMLMediaElement_loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkHTMLMediaElement.$loop_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  String get mediaGroup => _blink.Native_HTMLMediaElement_mediaGroup_Getter(this);
+  String get mediaGroup => _blink.BlinkHTMLMediaElement.$mediaGroup_Getter(this);
 
   @DomName('HTMLMediaElement.mediaGroup')
   @DocsEditable()
-  void set mediaGroup(String value) => _blink.Native_HTMLMediaElement_mediaGroup_Setter(this, value);
+  void set mediaGroup(String value) => _blink.BlinkHTMLMediaElement.$mediaGroup_Setter(this, value);
 
   @DomName('HTMLMediaElement.mediaKeys')
   @DocsEditable()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html
   @Experimental()
-  MediaKeys get mediaKeys => _blink.Native_HTMLMediaElement_mediaKeys_Getter(this);
+  MediaKeys get mediaKeys => _blink.BlinkHTMLMediaElement.$mediaKeys_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  bool get muted => _blink.Native_HTMLMediaElement_muted_Getter(this);
+  bool get muted => _blink.BlinkHTMLMediaElement.$muted_Getter(this);
 
   @DomName('HTMLMediaElement.muted')
   @DocsEditable()
-  void set muted(bool value) => _blink.Native_HTMLMediaElement_muted_Setter(this, value);
+  void set muted(bool value) => _blink.BlinkHTMLMediaElement.$muted_Setter(this, value);
 
   @DomName('HTMLMediaElement.networkState')
   @DocsEditable()
-  int get networkState => _blink.Native_HTMLMediaElement_networkState_Getter(this);
+  int get networkState => _blink.BlinkHTMLMediaElement.$networkState_Getter(this);
 
   @DomName('HTMLMediaElement.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_HTMLMediaElement_paused_Getter(this);
+  bool get paused => _blink.BlinkHTMLMediaElement.$paused_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  num get playbackRate => _blink.Native_HTMLMediaElement_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkHTMLMediaElement.$playbackRate_Getter(this);
 
   @DomName('HTMLMediaElement.playbackRate')
   @DocsEditable()
-  void set playbackRate(num value) => _blink.Native_HTMLMediaElement_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkHTMLMediaElement.$playbackRate_Setter(this, value);
 
   @DomName('HTMLMediaElement.played')
   @DocsEditable()
-  TimeRanges get played => _blink.Native_HTMLMediaElement_played_Getter(this);
+  TimeRanges get played => _blink.BlinkHTMLMediaElement.$played_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  String get preload => _blink.Native_HTMLMediaElement_preload_Getter(this);
+  String get preload => _blink.BlinkHTMLMediaElement.$preload_Getter(this);
 
   @DomName('HTMLMediaElement.preload')
   @DocsEditable()
-  void set preload(String value) => _blink.Native_HTMLMediaElement_preload_Setter(this, value);
+  void set preload(String value) => _blink.BlinkHTMLMediaElement.$preload_Setter(this, value);
 
   @DomName('HTMLMediaElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_HTMLMediaElement_readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLMediaElement.$readyState_Getter(this);
 
   @DomName('HTMLMediaElement.seekable')
   @DocsEditable()
-  TimeRanges get seekable => _blink.Native_HTMLMediaElement_seekable_Getter(this);
+  TimeRanges get seekable => _blink.BlinkHTMLMediaElement.$seekable_Getter(this);
 
   @DomName('HTMLMediaElement.seeking')
   @DocsEditable()
-  bool get seeking => _blink.Native_HTMLMediaElement_seeking_Getter(this);
+  bool get seeking => _blink.BlinkHTMLMediaElement.$seeking_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLMediaElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLMediaElement.$src_Getter(this);
 
   @DomName('HTMLMediaElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLMediaElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLMediaElement.$src_Setter(this, value);
 
   @DomName('HTMLMediaElement.textTracks')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-video-element.html#dom-media-texttracks
   @Experimental()
-  TextTrackList get textTracks => _blink.Native_HTMLMediaElement_textTracks_Getter(this);
+  TextTrackList get textTracks => _blink.BlinkHTMLMediaElement.$textTracks_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  num get volume => _blink.Native_HTMLMediaElement_volume_Getter(this);
+  num get volume => _blink.BlinkHTMLMediaElement.$volume_Getter(this);
 
   @DomName('HTMLMediaElement.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_HTMLMediaElement_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkHTMLMediaElement.$volume_Setter(this, value);
 
   @DomName('HTMLMediaElement.webkitAudioDecodedByteCount')
   @DocsEditable()
@@ -18805,7 +18805,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get audioDecodedByteCount => _blink.Native_HTMLMediaElement_webkitAudioDecodedByteCount_Getter(this);
+  int get audioDecodedByteCount => _blink.BlinkHTMLMediaElement.$webkitAudioDecodedByteCount_Getter(this);
 
   @DomName('HTMLMediaElement.webkitVideoDecodedByteCount')
   @DocsEditable()
@@ -18813,33 +18813,33 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // nonstandard
-  int get videoDecodedByteCount => _blink.Native_HTMLMediaElement_webkitVideoDecodedByteCount_Getter(this);
+  int get videoDecodedByteCount => _blink.BlinkHTMLMediaElement.$webkitVideoDecodedByteCount_Getter(this);
 
-  TextTrack addTextTrack(String kind, [String label, String language]) => _blink.Native_HTMLMediaElement_addTextTrack(this, kind, label, language);
+  TextTrack addTextTrack(String kind, [String label, String language]) => _blink.BlinkHTMLMediaElement.$addTextTrack(this, kind, label, language);
 
   @DomName('HTMLMediaElement.canPlayType')
   @DocsEditable()
   @Unstable()
-  String canPlayType(String type, [String keySystem]) => _blink.Native_HTMLMediaElement_canPlayType_Callback(this, type, keySystem);
+  String canPlayType(String type, [String keySystem]) => _blink.BlinkHTMLMediaElement.$canPlayType_Callback(this, type, keySystem);
 
   @DomName('HTMLMediaElement.load')
   @DocsEditable()
-  void load() => _blink.Native_HTMLMediaElement_load_Callback(this);
+  void load() => _blink.BlinkHTMLMediaElement.$load_Callback(this);
 
   @DomName('HTMLMediaElement.pause')
   @DocsEditable()
-  void pause() => _blink.Native_HTMLMediaElement_pause_Callback(this);
+  void pause() => _blink.BlinkHTMLMediaElement.$pause_Callback(this);
 
   @DomName('HTMLMediaElement.play')
   @DocsEditable()
-  void play() => _blink.Native_HTMLMediaElement_play_Callback(this);
+  void play() => _blink.BlinkHTMLMediaElement.$play_Callback(this);
 
   @DomName('HTMLMediaElement.setMediaKeys')
   @DocsEditable()
   @Experimental() // untriaged
-  void setMediaKeys(MediaKeys mediaKeys) => _blink.Native_HTMLMediaElement_setMediaKeys_Callback(this, mediaKeys);
+  void setMediaKeys(MediaKeys mediaKeys) => _blink.BlinkHTMLMediaElement.$setMediaKeys_Callback(this, mediaKeys);
 
-  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.Native_HTMLMediaElement_addKey(this, keySystem, key, initData, sessionId);
+  void addKey(String keySystem, Uint8List key, [Uint8List initData, String sessionId]) => _blink.BlinkHTMLMediaElement.$addKey(this, keySystem, key, initData, sessionId);
 
   @DomName('HTMLMediaElement.webkitCancelKeyRequest')
   @DocsEditable()
@@ -18847,9 +18847,9 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/html-media/raw-file/eme-v0.1/encrypted-media/encrypted-media.html#extensions
-  void cancelKeyRequest(String keySystem, String sessionId) => _blink.Native_HTMLMediaElement_webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
+  void cancelKeyRequest(String keySystem, String sessionId) => _blink.BlinkHTMLMediaElement.$webkitCancelKeyRequest_Callback(this, keySystem, sessionId);
 
-  void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.Native_HTMLMediaElement_generateKeyRequest(this, keySystem, initData);
+  void generateKeyRequest(String keySystem, [Uint8List initData]) => _blink.BlinkHTMLMediaElement.$generateKeyRequest(this, keySystem, initData);
 
   /// Stream of `canplay` events handled by this [MediaElement].
   @DomName('HTMLMediaElement.oncanplay')
@@ -19025,7 +19025,7 @@
 
   @DomName('MediaError.code')
   @DocsEditable()
-  int get code => _blink.Native_MediaError_code_Getter(this);
+  int get code => _blink.BlinkMediaError.$code_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19069,12 +19069,12 @@
 
   @DomName('MediaKeyError.code')
   @DocsEditable()
-  int get code => _blink.Native_MediaKeyError_code_Getter(this);
+  int get code => _blink.BlinkMediaKeyError.$code_Getter(this);
 
   @DomName('MediaKeyError.systemCode')
   @DocsEditable()
   @Experimental() // non-standard
-  int get systemCode => _blink.Native_MediaKeyError_systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyError.$systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19094,31 +19094,31 @@
 
   @DomName('MediaKeyEvent.defaultURL')
   @DocsEditable()
-  String get defaultUrl => _blink.Native_MediaKeyEvent_defaultURL_Getter(this);
+  String get defaultUrl => _blink.BlinkMediaKeyEvent.$defaultURL_Getter(this);
 
   @DomName('MediaKeyEvent.errorCode')
   @DocsEditable()
-  MediaKeyError get errorCode => _blink.Native_MediaKeyEvent_errorCode_Getter(this);
+  MediaKeyError get errorCode => _blink.BlinkMediaKeyEvent.$errorCode_Getter(this);
 
   @DomName('MediaKeyEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.Native_MediaKeyEvent_initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyEvent.$initData_Getter(this);
 
   @DomName('MediaKeyEvent.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeyEvent_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeyEvent.$keySystem_Getter(this);
 
   @DomName('MediaKeyEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.Native_MediaKeyEvent_message_Getter(this);
+  Uint8List get message => _blink.BlinkMediaKeyEvent.$message_Getter(this);
 
   @DomName('MediaKeyEvent.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.Native_MediaKeyEvent_sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeyEvent.$sessionId_Getter(this);
 
   @DomName('MediaKeyEvent.systemCode')
   @DocsEditable()
-  int get systemCode => _blink.Native_MediaKeyEvent_systemCode_Getter(this);
+  int get systemCode => _blink.BlinkMediaKeyEvent.$systemCode_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19138,11 +19138,11 @@
 
   @DomName('MediaKeyMessageEvent.destinationURL')
   @DocsEditable()
-  String get destinationUrl => _blink.Native_MediaKeyMessageEvent_destinationURL_Getter(this);
+  String get destinationUrl => _blink.BlinkMediaKeyMessageEvent.$destinationURL_Getter(this);
 
   @DomName('MediaKeyMessageEvent.message')
   @DocsEditable()
-  Uint8List get message => _blink.Native_MediaKeyMessageEvent_message_Getter(this);
+  Uint8List get message => _blink.BlinkMediaKeyMessageEvent.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19163,11 +19163,11 @@
   @DomName('MediaKeyNeededEvent.contentType')
   @DocsEditable()
   @Experimental() // untriaged
-  String get contentType => _blink.Native_MediaKeyNeededEvent_contentType_Getter(this);
+  String get contentType => _blink.BlinkMediaKeyNeededEvent.$contentType_Getter(this);
 
   @DomName('MediaKeyNeededEvent.initData')
   @DocsEditable()
-  Uint8List get initData => _blink.Native_MediaKeyNeededEvent_initData_Getter(this);
+  Uint8List get initData => _blink.BlinkMediaKeyNeededEvent.$initData_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19187,24 +19187,24 @@
 
   @DomName('MediaKeySession.error')
   @DocsEditable()
-  MediaKeyError get error => _blink.Native_MediaKeySession_error_Getter(this);
+  MediaKeyError get error => _blink.BlinkMediaKeySession.$error_Getter(this);
 
   @DomName('MediaKeySession.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeySession_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeySession.$keySystem_Getter(this);
 
   @DomName('MediaKeySession.sessionId')
   @DocsEditable()
-  String get sessionId => _blink.Native_MediaKeySession_sessionId_Getter(this);
+  String get sessionId => _blink.BlinkMediaKeySession.$sessionId_Getter(this);
 
   @DomName('MediaKeySession.release')
   @DocsEditable()
   @Experimental() // untriaged
-  void release() => _blink.Native_MediaKeySession_release_Callback(this);
+  void release() => _blink.BlinkMediaKeySession.$release_Callback(this);
 
   @DomName('MediaKeySession.update')
   @DocsEditable()
-  void update(Uint8List response) => _blink.Native_MediaKeySession_update_Callback(this, response);
+  void update(Uint8List response) => _blink.BlinkMediaKeySession.$update_Callback(this, response);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19224,15 +19224,15 @@
 
   @DomName('MediaKeys.MediaKeys')
   @DocsEditable()
-  factory MediaKeys(String keySystem) => _blink.Native_MediaKeys_MediaKeys(keySystem);
+  factory MediaKeys(String keySystem) => _blink.BlinkMediaKeys.$mkMediaKeys(keySystem);
 
   @DomName('MediaKeys.keySystem')
   @DocsEditable()
-  String get keySystem => _blink.Native_MediaKeys_keySystem_Getter(this);
+  String get keySystem => _blink.BlinkMediaKeys.$keySystem_Getter(this);
 
   @DomName('MediaKeys.createSession')
   @DocsEditable()
-  MediaKeySession createSession(String type, Uint8List initData) => _blink.Native_MediaKeys_createSession_Callback(this, type, initData);
+  MediaKeySession createSession(String type, Uint8List initData) => _blink.BlinkMediaKeys.$createSession_Callback(this, type, initData);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19251,27 +19251,27 @@
 
   @DomName('MediaList.length')
   @DocsEditable()
-  int get length => _blink.Native_MediaList_length_Getter(this);
+  int get length => _blink.BlinkMediaList.$length_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  String get mediaText => _blink.Native_MediaList_mediaText_Getter(this);
+  String get mediaText => _blink.BlinkMediaList.$mediaText_Getter(this);
 
   @DomName('MediaList.mediaText')
   @DocsEditable()
-  void set mediaText(String value) => _blink.Native_MediaList_mediaText_Setter(this, value);
+  void set mediaText(String value) => _blink.BlinkMediaList.$mediaText_Setter(this, value);
 
   @DomName('MediaList.appendMedium')
   @DocsEditable()
-  void appendMedium(String newMedium) => _blink.Native_MediaList_appendMedium_Callback(this, newMedium);
+  void appendMedium(String newMedium) => _blink.BlinkMediaList.$appendMedium_Callback(this, newMedium);
 
   @DomName('MediaList.deleteMedium')
   @DocsEditable()
-  void deleteMedium(String oldMedium) => _blink.Native_MediaList_deleteMedium_Callback(this, oldMedium);
+  void deleteMedium(String oldMedium) => _blink.BlinkMediaList.$deleteMedium_Callback(this, oldMedium);
 
   @DomName('MediaList.item')
   @DocsEditable()
-  String item(int index) => _blink.Native_MediaList_item_Callback(this, index);
+  String item(int index) => _blink.BlinkMediaList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19290,11 +19290,11 @@
 
   @DomName('MediaQueryList.matches')
   @DocsEditable()
-  bool get matches => _blink.Native_MediaQueryList_matches_Getter(this);
+  bool get matches => _blink.BlinkMediaQueryList.$matches_Getter(this);
 
   @DomName('MediaQueryList.media')
   @DocsEditable()
-  String get media => _blink.Native_MediaQueryList_media_Getter(this);
+  String get media => _blink.BlinkMediaQueryList.$media_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19314,41 +19314,41 @@
 
   @DomName('MediaSource.MediaSource')
   @DocsEditable()
-  factory MediaSource() => _blink.Native_MediaSource_MediaSource();
+  factory MediaSource() => _blink.BlinkMediaSource.$mkMediaSource();
 
   @DomName('MediaSource.activeSourceBuffers')
   @DocsEditable()
-  SourceBufferList get activeSourceBuffers => _blink.Native_MediaSource_activeSourceBuffers_Getter(this);
+  SourceBufferList get activeSourceBuffers => _blink.BlinkMediaSource.$activeSourceBuffers_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  num get duration => _blink.Native_MediaSource_duration_Getter(this);
+  num get duration => _blink.BlinkMediaSource.$duration_Getter(this);
 
   @DomName('MediaSource.duration')
   @DocsEditable()
-  void set duration(num value) => _blink.Native_MediaSource_duration_Setter(this, value);
+  void set duration(num value) => _blink.BlinkMediaSource.$duration_Setter(this, value);
 
   @DomName('MediaSource.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_MediaSource_readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaSource.$readyState_Getter(this);
 
   @DomName('MediaSource.sourceBuffers')
   @DocsEditable()
-  SourceBufferList get sourceBuffers => _blink.Native_MediaSource_sourceBuffers_Getter(this);
+  SourceBufferList get sourceBuffers => _blink.BlinkMediaSource.$sourceBuffers_Getter(this);
 
   @DomName('MediaSource.addSourceBuffer')
   @DocsEditable()
-  SourceBuffer addSourceBuffer(String type) => _blink.Native_MediaSource_addSourceBuffer_Callback(this, type);
+  SourceBuffer addSourceBuffer(String type) => _blink.BlinkMediaSource.$addSourceBuffer_Callback(this, type);
 
-  void endOfStream([String error]) => _blink.Native_MediaSource_endOfStream(this, error);
+  void endOfStream([String error]) => _blink.BlinkMediaSource.$endOfStream(this, error);
 
   @DomName('MediaSource.isTypeSupported')
   @DocsEditable()
-  static bool isTypeSupported(String type) => _blink.Native_MediaSource_isTypeSupported_Callback(type);
+  static bool isTypeSupported(String type) => _blink.BlinkMediaSource.$isTypeSupported_Callback(type);
 
   @DomName('MediaSource.removeSourceBuffer')
   @DocsEditable()
-  void removeSourceBuffer(SourceBuffer buffer) => _blink.Native_MediaSource_removeSourceBuffer_Callback(this, buffer);
+  void removeSourceBuffer(SourceBuffer buffer) => _blink.BlinkMediaSource.$removeSourceBuffer_Callback(this, buffer);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19396,44 +19396,44 @@
 
   @DomName('MediaStream.MediaStream')
   @DocsEditable()
-  factory MediaStream([stream_OR_tracks]) => _blink.Native_MediaStream_MediaStream(stream_OR_tracks);
+  factory MediaStream([stream_OR_tracks]) => _blink.BlinkMediaStream.$mkMediaStream(stream_OR_tracks);
 
   @DomName('MediaStream.ended')
   @DocsEditable()
-  bool get ended => _blink.Native_MediaStream_ended_Getter(this);
+  bool get ended => _blink.BlinkMediaStream.$ended_Getter(this);
 
   @DomName('MediaStream.id')
   @DocsEditable()
-  String get id => _blink.Native_MediaStream_id_Getter(this);
+  String get id => _blink.BlinkMediaStream.$id_Getter(this);
 
   @DomName('MediaStream.label')
   @DocsEditable()
   @Experimental() // non-standard
-  String get label => _blink.Native_MediaStream_label_Getter(this);
+  String get label => _blink.BlinkMediaStream.$label_Getter(this);
 
   @DomName('MediaStream.addTrack')
   @DocsEditable()
-  void addTrack(MediaStreamTrack track) => _blink.Native_MediaStream_addTrack_Callback(this, track);
+  void addTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.$addTrack_Callback(this, track);
 
   @DomName('MediaStream.getAudioTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getAudioTracks() => _blink.Native_MediaStream_getAudioTracks_Callback(this);
+  List<MediaStreamTrack> getAudioTracks() => _blink.BlinkMediaStream.$getAudioTracks_Callback(this);
 
   @DomName('MediaStream.getTrackById')
   @DocsEditable()
-  MediaStreamTrack getTrackById(String trackId) => _blink.Native_MediaStream_getTrackById_Callback(this, trackId);
+  MediaStreamTrack getTrackById(String trackId) => _blink.BlinkMediaStream.$getTrackById_Callback(this, trackId);
 
   @DomName('MediaStream.getVideoTracks')
   @DocsEditable()
-  List<MediaStreamTrack> getVideoTracks() => _blink.Native_MediaStream_getVideoTracks_Callback(this);
+  List<MediaStreamTrack> getVideoTracks() => _blink.BlinkMediaStream.$getVideoTracks_Callback(this);
 
   @DomName('MediaStream.removeTrack')
   @DocsEditable()
-  void removeTrack(MediaStreamTrack track) => _blink.Native_MediaStream_removeTrack_Callback(this, track);
+  void removeTrack(MediaStreamTrack track) => _blink.BlinkMediaStream.$removeTrack_Callback(this, track);
 
   @DomName('MediaStream.stop')
   @DocsEditable()
-  void stop() => _blink.Native_MediaStream_stop_Callback(this);
+  void stop() => _blink.BlinkMediaStream.$stop_Callback(this);
 
   /// Stream of `addtrack` events handled by this [MediaStream].
   @DomName('MediaStream.onaddtrack')
@@ -19481,7 +19481,7 @@
 
   @DomName('MediaStreamEvent.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.Native_MediaStreamEvent_stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamEvent.$stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19532,32 +19532,32 @@
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  bool get enabled => _blink.Native_MediaStreamTrack_enabled_Getter(this);
+  bool get enabled => _blink.BlinkMediaStreamTrack.$enabled_Getter(this);
 
   @DomName('MediaStreamTrack.enabled')
   @DocsEditable()
-  void set enabled(bool value) => _blink.Native_MediaStreamTrack_enabled_Setter(this, value);
+  void set enabled(bool value) => _blink.BlinkMediaStreamTrack.$enabled_Setter(this, value);
 
   @DomName('MediaStreamTrack.id')
   @DocsEditable()
-  String get id => _blink.Native_MediaStreamTrack_id_Getter(this);
+  String get id => _blink.BlinkMediaStreamTrack.$id_Getter(this);
 
   @DomName('MediaStreamTrack.kind')
   @DocsEditable()
-  String get kind => _blink.Native_MediaStreamTrack_kind_Getter(this);
+  String get kind => _blink.BlinkMediaStreamTrack.$kind_Getter(this);
 
   @DomName('MediaStreamTrack.label')
   @DocsEditable()
-  String get label => _blink.Native_MediaStreamTrack_label_Getter(this);
+  String get label => _blink.BlinkMediaStreamTrack.$label_Getter(this);
 
   @DomName('MediaStreamTrack.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_MediaStreamTrack_readyState_Getter(this);
+  String get readyState => _blink.BlinkMediaStreamTrack.$readyState_Getter(this);
 
   @DomName('MediaStreamTrack.getSources')
   @DocsEditable()
   @Experimental() // untriaged
-  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.Native_MediaStreamTrack_getSources_Callback(callback);
+  static void _getSources(MediaStreamTrackSourcesCallback callback) => _blink.BlinkMediaStreamTrack.$getSources_Callback(callback);
 
   static Future<List<SourceInfo>> getSources() {
     var completer = new Completer<List<SourceInfo>>();
@@ -19569,7 +19569,7 @@
   @DomName('MediaStreamTrack.stop')
   @DocsEditable()
   @Experimental() // untriaged
-  void stop() => _blink.Native_MediaStreamTrack_stop_Callback(this);
+  void stop() => _blink.BlinkMediaStreamTrack.$stop_Callback(this);
 
   /// Stream of `ended` events handled by this [MediaStreamTrack].
   @DomName('MediaStreamTrack.onended')
@@ -19608,7 +19608,7 @@
 
   @DomName('MediaStreamTrackEvent.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.Native_MediaStreamTrackEvent_track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkMediaStreamTrackEvent.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19637,15 +19637,15 @@
 
   @DomName('MemoryInfo.jsHeapSizeLimit')
   @DocsEditable()
-  int get jsHeapSizeLimit => _blink.Native_MemoryInfo_jsHeapSizeLimit_Getter(this);
+  int get jsHeapSizeLimit => _blink.BlinkMemoryInfo.$jsHeapSizeLimit_Getter(this);
 
   @DomName('MemoryInfo.totalJSHeapSize')
   @DocsEditable()
-  int get totalJSHeapSize => _blink.Native_MemoryInfo_totalJSHeapSize_Getter(this);
+  int get totalJSHeapSize => _blink.BlinkMemoryInfo.$totalJSHeapSize_Getter(this);
 
   @DomName('MemoryInfo.usedJSHeapSize')
   @DocsEditable()
-  int get usedJSHeapSize => _blink.Native_MemoryInfo_usedJSHeapSize_Getter(this);
+  int get usedJSHeapSize => _blink.BlinkMemoryInfo.$usedJSHeapSize_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19698,11 +19698,11 @@
 
   @DomName('MessageChannel.port1')
   @DocsEditable()
-  MessagePort get port1 => _blink.Native_MessageChannel_port1_Getter(this);
+  MessagePort get port1 => _blink.BlinkMessageChannel.$port1_Getter(this);
 
   @DomName('MessageChannel.port2')
   @DocsEditable()
-  MessagePort get port2 => _blink.Native_MessageChannel_port2_Getter(this);
+  MessagePort get port2 => _blink.BlinkMessageChannel.$port2_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -19731,24 +19731,24 @@
 
   @DomName('MessageEvent.data')
   @DocsEditable()
-  Object get data => _blink.Native_MessageEvent_data_Getter(this);
+  Object get data => _blink.BlinkMessageEvent.$data_Getter(this);
 
   @DomName('MessageEvent.lastEventId')
   @DocsEditable()
   @Unstable()
-  String get lastEventId => _blink.Native_MessageEvent_lastEventId_Getter(this);
+  String get lastEventId => _blink.BlinkMessageEvent.$lastEventId_Getter(this);
 
   @DomName('MessageEvent.origin')
   @DocsEditable()
-  String get origin => _blink.Native_MessageEvent_origin_Getter(this);
+  String get origin => _blink.BlinkMessageEvent.$origin_Getter(this);
 
   @DomName('MessageEvent.source')
   @DocsEditable()
-  EventTarget get source => _blink.Native_MessageEvent_source_Getter(this);
+  EventTarget get source => _blink.BlinkMessageEvent.$source_Getter(this);
 
   @DomName('MessageEvent.initMessageEvent')
   @DocsEditable()
-  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.Native_MessageEvent_initMessageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
+  void _initMessageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Object dataArg, String originArg, String lastEventIdArg, Window sourceArg, List<MessagePort> messagePorts) => _blink.BlinkMessageEvent.$initMessageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, dataArg, originArg, lastEventIdArg, sourceArg, messagePorts);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19777,15 +19777,15 @@
 
   @DomName('MessagePort.close')
   @DocsEditable()
-  void close() => _blink.Native_MessagePort_close_Callback(this);
+  void close() => _blink.BlinkMessagePort.$close_Callback(this);
 
   @DomName('MessagePort.postMessage')
   @DocsEditable()
-  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.Native_MessagePort_postMessage_Callback(this, message, messagePorts);
+  void postMessage(Object message, [List<MessagePort> messagePorts]) => _blink.BlinkMessagePort.$postMessage_Callback(this, message, messagePorts);
 
   @DomName('MessagePort.start')
   @DocsEditable()
-  void start() => _blink.Native_MessagePort_start_Callback(this);
+  void start() => _blink.BlinkMessagePort.$start_Callback(this);
 
   /// Stream of `message` events handled by this [MessagePort].
   @DomName('MessagePort.onmessage')
@@ -19818,27 +19818,27 @@
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  String get content => _blink.Native_HTMLMetaElement_content_Getter(this);
+  String get content => _blink.BlinkHTMLMetaElement.$content_Getter(this);
 
   @DomName('HTMLMetaElement.content')
   @DocsEditable()
-  void set content(String value) => _blink.Native_HTMLMetaElement_content_Setter(this, value);
+  void set content(String value) => _blink.BlinkHTMLMetaElement.$content_Setter(this, value);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  String get httpEquiv => _blink.Native_HTMLMetaElement_httpEquiv_Getter(this);
+  String get httpEquiv => _blink.BlinkHTMLMetaElement.$httpEquiv_Getter(this);
 
   @DomName('HTMLMetaElement.httpEquiv')
   @DocsEditable()
-  void set httpEquiv(String value) => _blink.Native_HTMLMetaElement_httpEquiv_Setter(this, value);
+  void set httpEquiv(String value) => _blink.BlinkHTMLMetaElement.$httpEquiv_Setter(this, value);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLMetaElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLMetaElement.$name_Getter(this);
 
   @DomName('HTMLMetaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLMetaElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLMetaElement.$name_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19858,11 +19858,11 @@
 
   @DomName('Metadata.modificationTime')
   @DocsEditable()
-  DateTime get modificationTime => _blink.Native_Metadata_modificationTime_Getter(this);
+  DateTime get modificationTime => _blink.BlinkMetadata.$modificationTime_Getter(this);
 
   @DomName('Metadata.size')
   @DocsEditable()
-  int get size => _blink.Native_Metadata_size_Getter(this);
+  int get size => _blink.BlinkMetadata.$size_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19908,56 +19908,56 @@
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  num get high => _blink.Native_HTMLMeterElement_high_Getter(this);
+  num get high => _blink.BlinkHTMLMeterElement.$high_Getter(this);
 
   @DomName('HTMLMeterElement.high')
   @DocsEditable()
-  void set high(num value) => _blink.Native_HTMLMeterElement_high_Setter(this, value);
+  void set high(num value) => _blink.BlinkHTMLMeterElement.$high_Setter(this, value);
 
   @DomName('HTMLMeterElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLMeterElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLMeterElement.$labels_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  num get low => _blink.Native_HTMLMeterElement_low_Getter(this);
+  num get low => _blink.BlinkHTMLMeterElement.$low_Getter(this);
 
   @DomName('HTMLMeterElement.low')
   @DocsEditable()
-  void set low(num value) => _blink.Native_HTMLMeterElement_low_Setter(this, value);
+  void set low(num value) => _blink.BlinkHTMLMeterElement.$low_Setter(this, value);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  num get max => _blink.Native_HTMLMeterElement_max_Getter(this);
+  num get max => _blink.BlinkHTMLMeterElement.$max_Getter(this);
 
   @DomName('HTMLMeterElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.Native_HTMLMeterElement_max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLMeterElement.$max_Setter(this, value);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  num get min => _blink.Native_HTMLMeterElement_min_Getter(this);
+  num get min => _blink.BlinkHTMLMeterElement.$min_Getter(this);
 
   @DomName('HTMLMeterElement.min')
   @DocsEditable()
-  void set min(num value) => _blink.Native_HTMLMeterElement_min_Setter(this, value);
+  void set min(num value) => _blink.BlinkHTMLMeterElement.$min_Setter(this, value);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  num get optimum => _blink.Native_HTMLMeterElement_optimum_Getter(this);
+  num get optimum => _blink.BlinkHTMLMeterElement.$optimum_Getter(this);
 
   @DomName('HTMLMeterElement.optimum')
   @DocsEditable()
-  void set optimum(num value) => _blink.Native_HTMLMeterElement_optimum_Setter(this, value);
+  void set optimum(num value) => _blink.BlinkHTMLMeterElement.$optimum_Setter(this, value);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  num get value => _blink.Native_HTMLMeterElement_value_Getter(this);
+  num get value => _blink.BlinkHTMLMeterElement.$value_Getter(this);
 
   @DomName('HTMLMeterElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_HTMLMeterElement_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLMeterElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -19997,11 +19997,11 @@
 
   @DomName('MIDIAccess.inputs')
   @DocsEditable()
-  List<MidiInput> inputs() => _blink.Native_MIDIAccess_inputs_Callback(this);
+  List<MidiInput> inputs() => _blink.BlinkMIDIAccess.$inputs_Callback(this);
 
   @DomName('MIDIAccess.outputs')
   @DocsEditable()
-  List<MidiOutput> outputs() => _blink.Native_MIDIAccess_outputs_Callback(this);
+  List<MidiOutput> outputs() => _blink.BlinkMIDIAccess.$outputs_Callback(this);
 
   /// Stream of `connect` events handled by this [MidiAccess].
   @DomName('MIDIAccess.onconnect')
@@ -20031,7 +20031,7 @@
   @DomName('MIDIAccessPromise.then')
   @DocsEditable()
   @Experimental() // untriaged
-  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.Native_MIDIAccessPromise_then_Callback(this, successCallback, errorCallback);
+  void then(MidiSuccessCallback successCallback, MidiErrorCallback errorCallback) => _blink.BlinkMIDIAccessPromise.$then_Callback(this, successCallback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20051,7 +20051,7 @@
 
   @DomName('MIDIConnectionEvent.port')
   @DocsEditable()
-  MidiPort get port => _blink.Native_MIDIConnectionEvent_port_Getter(this);
+  MidiPort get port => _blink.BlinkMIDIConnectionEvent.$port_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20102,11 +20102,11 @@
 
   @DomName('MIDIMessageEvent.data')
   @DocsEditable()
-  Uint8List get data => _blink.Native_MIDIMessageEvent_data_Getter(this);
+  Uint8List get data => _blink.BlinkMIDIMessageEvent.$data_Getter(this);
 
   @DomName('MIDIMessageEvent.receivedTime')
   @DocsEditable()
-  double get receivedTime => _blink.Native_MIDIMessageEvent_receivedTime_Getter(this);
+  double get receivedTime => _blink.BlinkMIDIMessageEvent.$receivedTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20124,7 +20124,7 @@
   // To suppress missing implicit constructor warnings.
   factory MidiOutput._() { throw new UnsupportedError("Not supported"); }
 
-  void send(Uint8List data, [num timestamp]) => _blink.Native_MIDIOutput_send(this, data, timestamp);
+  void send(Uint8List data, [num timestamp]) => _blink.BlinkMIDIOutput.$send(this, data, timestamp);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20154,23 +20154,23 @@
 
   @DomName('MIDIPort.id')
   @DocsEditable()
-  String get id => _blink.Native_MIDIPort_id_Getter(this);
+  String get id => _blink.BlinkMIDIPort.$id_Getter(this);
 
   @DomName('MIDIPort.manufacturer')
   @DocsEditable()
-  String get manufacturer => _blink.Native_MIDIPort_manufacturer_Getter(this);
+  String get manufacturer => _blink.BlinkMIDIPort.$manufacturer_Getter(this);
 
   @DomName('MIDIPort.name')
   @DocsEditable()
-  String get name => _blink.Native_MIDIPort_name_Getter(this);
+  String get name => _blink.BlinkMIDIPort.$name_Getter(this);
 
   @DomName('MIDIPort.type')
   @DocsEditable()
-  String get type => _blink.Native_MIDIPort_type_Getter(this);
+  String get type => _blink.BlinkMIDIPort.$type_Getter(this);
 
   @DomName('MIDIPort.version')
   @DocsEditable()
-  String get version => _blink.Native_MIDIPort_version_Getter(this);
+  String get version => _blink.BlinkMIDIPort.$version_Getter(this);
 
   /// Stream of `disconnect` events handled by this [MidiPort].
   @DomName('MIDIPort.ondisconnect')
@@ -20194,19 +20194,19 @@
 
   @DomName('MimeType.description')
   @DocsEditable()
-  String get description => _blink.Native_MimeType_description_Getter(this);
+  String get description => _blink.BlinkMimeType.$description_Getter(this);
 
   @DomName('MimeType.enabledPlugin')
   @DocsEditable()
-  Plugin get enabledPlugin => _blink.Native_MimeType_enabledPlugin_Getter(this);
+  Plugin get enabledPlugin => _blink.BlinkMimeType.$enabledPlugin_Getter(this);
 
   @DomName('MimeType.suffixes')
   @DocsEditable()
-  String get suffixes => _blink.Native_MimeType_suffixes_Getter(this);
+  String get suffixes => _blink.BlinkMimeType.$suffixes_Getter(this);
 
   @DomName('MimeType.type')
   @DocsEditable()
-  String get type => _blink.Native_MimeType_type_Getter(this);
+  String get type => _blink.BlinkMimeType.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20225,15 +20225,15 @@
 
   @DomName('MimeTypeArray.length')
   @DocsEditable()
-  int get length => _blink.Native_MimeTypeArray_length_Getter(this);
+  int get length => _blink.BlinkMimeTypeArray.$length_Getter(this);
 
   MimeType operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
+    return _blink.BlinkMimeTypeArray.$NativeIndexed_Getter(this, index);
   }
 
-  MimeType _nativeIndexedGetter(int index) => _blink.Native_MimeTypeArray_NativeIndexed_Getter(this, index);
+  MimeType _nativeIndexedGetter(int index) => _blink.BlinkMimeTypeArray.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, MimeType value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -20275,15 +20275,15 @@
 
   @DomName('MimeTypeArray.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.Native_MimeTypeArray___getter___Callback(this, name);
+  MimeType __getter__(String name) => _blink.BlinkMimeTypeArray.$__getter___Callback(this, name);
 
   @DomName('MimeTypeArray.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.Native_MimeTypeArray_item_Callback(this, index);
+  MimeType item(int index) => _blink.BlinkMimeTypeArray.$item_Callback(this, index);
 
   @DomName('MimeTypeArray.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.Native_MimeTypeArray_namedItem_Callback(this, name);
+  MimeType namedItem(String name) => _blink.BlinkMimeTypeArray.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20308,19 +20308,19 @@
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  String get cite => _blink.Native_HTMLModElement_cite_Getter(this);
+  String get cite => _blink.BlinkHTMLModElement.$cite_Getter(this);
 
   @DomName('HTMLModElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.Native_HTMLModElement_cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLModElement.$cite_Setter(this, value);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  String get dateTime => _blink.Native_HTMLModElement_dateTime_Getter(this);
+  String get dateTime => _blink.BlinkHTMLModElement.$dateTime_Getter(this);
 
   @DomName('HTMLModElement.dateTime')
   @DocsEditable()
-  void set dateTime(String value) => _blink.Native_HTMLModElement_dateTime_Setter(this, value);
+  void set dateTime(String value) => _blink.BlinkHTMLModElement.$dateTime_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20352,86 +20352,86 @@
 
   @DomName('MouseEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_MouseEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkMouseEvent.$altKey_Getter(this);
 
   @DomName('MouseEvent.button')
   @DocsEditable()
-  int get button => _blink.Native_MouseEvent_button_Getter(this);
+  int get button => _blink.BlinkMouseEvent.$button_Getter(this);
 
   @DomName('MouseEvent.clientX')
   @DocsEditable()
-  int get _clientX => _blink.Native_MouseEvent_clientX_Getter(this);
+  int get _clientX => _blink.BlinkMouseEvent.$clientX_Getter(this);
 
   @DomName('MouseEvent.clientY')
   @DocsEditable()
-  int get _clientY => _blink.Native_MouseEvent_clientY_Getter(this);
+  int get _clientY => _blink.BlinkMouseEvent.$clientY_Getter(this);
 
   @DomName('MouseEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_MouseEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkMouseEvent.$ctrlKey_Getter(this);
 
   @DomName('MouseEvent.dataTransfer')
   @DocsEditable()
   @Unstable()
-  DataTransfer get dataTransfer => _blink.Native_MouseEvent_dataTransfer_Getter(this);
+  DataTransfer get dataTransfer => _blink.BlinkMouseEvent.$dataTransfer_Getter(this);
 
   @DomName('MouseEvent.fromElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get fromElement => _blink.Native_MouseEvent_fromElement_Getter(this);
+  Node get fromElement => _blink.BlinkMouseEvent.$fromElement_Getter(this);
 
   @DomName('MouseEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_MouseEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkMouseEvent.$metaKey_Getter(this);
 
   @DomName('MouseEvent.offsetX')
   @DocsEditable()
   @Unstable()
-  int get _offsetX => _blink.Native_MouseEvent_offsetX_Getter(this);
+  int get _offsetX => _blink.BlinkMouseEvent.$offsetX_Getter(this);
 
   @DomName('MouseEvent.offsetY')
   @DocsEditable()
   @Unstable()
-  int get _offsetY => _blink.Native_MouseEvent_offsetY_Getter(this);
+  int get _offsetY => _blink.BlinkMouseEvent.$offsetY_Getter(this);
 
   @DomName('MouseEvent.relatedTarget')
   @DocsEditable()
-  EventTarget get relatedTarget => _blink.Native_MouseEvent_relatedTarget_Getter(this);
+  EventTarget get relatedTarget => _blink.BlinkMouseEvent.$relatedTarget_Getter(this);
 
   @DomName('MouseEvent.screenX')
   @DocsEditable()
-  int get _screenX => _blink.Native_MouseEvent_screenX_Getter(this);
+  int get _screenX => _blink.BlinkMouseEvent.$screenX_Getter(this);
 
   @DomName('MouseEvent.screenY')
   @DocsEditable()
-  int get _screenY => _blink.Native_MouseEvent_screenY_Getter(this);
+  int get _screenY => _blink.BlinkMouseEvent.$screenY_Getter(this);
 
   @DomName('MouseEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_MouseEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkMouseEvent.$shiftKey_Getter(this);
 
   @DomName('MouseEvent.toElement')
   @DocsEditable()
   @Experimental() // nonstandard
-  Node get toElement => _blink.Native_MouseEvent_toElement_Getter(this);
+  Node get toElement => _blink.BlinkMouseEvent.$toElement_Getter(this);
 
   @DomName('MouseEvent.webkitMovementX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementX => _blink.Native_MouseEvent_webkitMovementX_Getter(this);
+  int get _webkitMovementX => _blink.BlinkMouseEvent.$webkitMovementX_Getter(this);
 
   @DomName('MouseEvent.webkitMovementY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get _webkitMovementY => _blink.Native_MouseEvent_webkitMovementY_Getter(this);
+  int get _webkitMovementY => _blink.BlinkMouseEvent.$webkitMovementY_Getter(this);
 
   @DomName('MouseEvent.initMouseEvent')
   @DocsEditable()
-  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.Native_MouseEvent_initMouseEvent_Callback(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
+  void _initMouseEvent(String type, bool canBubble, bool cancelable, Window view, int detail, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey, int button, EventTarget relatedTarget) => _blink.BlinkMouseEvent.$initMouseEvent_Callback(this, type, canBubble, cancelable, view, detail, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey, button, relatedTarget);
 
 
   @deprecated
@@ -20501,19 +20501,19 @@
   factory MutationObserver._(MutationCallback callback) => _create(callback);
 
   @DocsEditable()
-  static MutationObserver _create(callback) => _blink.Native_MutationObserver_constructorCallback(callback);
+  static MutationObserver _create(callback) => _blink.BlinkMutationObserver.$constructorCallback(callback);
 
   @DomName('MutationObserver.disconnect')
   @DocsEditable()
-  void disconnect() => _blink.Native_MutationObserver_disconnect_Callback(this);
+  void disconnect() => _blink.BlinkMutationObserver.$disconnect_Callback(this);
 
   @DomName('MutationObserver.observe')
   @DocsEditable()
-  void _observe(Node target, Map options) => _blink.Native_MutationObserver_observe_Callback(this, target, options);
+  void _observe(Node target, Map options) => _blink.BlinkMutationObserver.$observe_Callback(this, target, options);
 
   @DomName('MutationObserver.takeRecords')
   @DocsEditable()
-  List<MutationRecord> takeRecords() => _blink.Native_MutationObserver_takeRecords_Callback(this);
+  List<MutationRecord> takeRecords() => _blink.BlinkMutationObserver.$takeRecords_Callback(this);
 
   /**
    * Checks to see if the mutation observer API is supported on the current
@@ -20598,39 +20598,39 @@
 
   @DomName('MutationRecord.addedNodes')
   @DocsEditable()
-  List<Node> get addedNodes => _blink.Native_MutationRecord_addedNodes_Getter(this);
+  List<Node> get addedNodes => _blink.BlinkMutationRecord.$addedNodes_Getter(this);
 
   @DomName('MutationRecord.attributeName')
   @DocsEditable()
-  String get attributeName => _blink.Native_MutationRecord_attributeName_Getter(this);
+  String get attributeName => _blink.BlinkMutationRecord.$attributeName_Getter(this);
 
   @DomName('MutationRecord.attributeNamespace')
   @DocsEditable()
-  String get attributeNamespace => _blink.Native_MutationRecord_attributeNamespace_Getter(this);
+  String get attributeNamespace => _blink.BlinkMutationRecord.$attributeNamespace_Getter(this);
 
   @DomName('MutationRecord.nextSibling')
   @DocsEditable()
-  Node get nextSibling => _blink.Native_MutationRecord_nextSibling_Getter(this);
+  Node get nextSibling => _blink.BlinkMutationRecord.$nextSibling_Getter(this);
 
   @DomName('MutationRecord.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.Native_MutationRecord_oldValue_Getter(this);
+  String get oldValue => _blink.BlinkMutationRecord.$oldValue_Getter(this);
 
   @DomName('MutationRecord.previousSibling')
   @DocsEditable()
-  Node get previousSibling => _blink.Native_MutationRecord_previousSibling_Getter(this);
+  Node get previousSibling => _blink.BlinkMutationRecord.$previousSibling_Getter(this);
 
   @DomName('MutationRecord.removedNodes')
   @DocsEditable()
-  List<Node> get removedNodes => _blink.Native_MutationRecord_removedNodes_Getter(this);
+  List<Node> get removedNodes => _blink.BlinkMutationRecord.$removedNodes_Getter(this);
 
   @DomName('MutationRecord.target')
   @DocsEditable()
-  Node get target => _blink.Native_MutationRecord_target_Getter(this);
+  Node get target => _blink.BlinkMutationRecord.$target_Getter(this);
 
   @DomName('MutationRecord.type')
   @DocsEditable()
-  String get type => _blink.Native_MutationRecord_type_Getter(this);
+  String get type => _blink.BlinkMutationRecord.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20703,57 +20703,57 @@
   @DomName('Navigator.cookieEnabled')
   @DocsEditable()
   @Unstable()
-  bool get cookieEnabled => _blink.Native_Navigator_cookieEnabled_Getter(this);
+  bool get cookieEnabled => _blink.BlinkNavigator.$cookieEnabled_Getter(this);
 
   @DomName('Navigator.doNotTrack')
   @DocsEditable()
   // http://www.w3.org/2011/tracking-protection/drafts/tracking-dnt.html#js-dom
   @Experimental() // experimental
-  String get doNotTrack => _blink.Native_Navigator_doNotTrack_Getter(this);
+  String get doNotTrack => _blink.BlinkNavigator.$doNotTrack_Getter(this);
 
   @DomName('Navigator.geolocation')
   @DocsEditable()
   @Unstable()
-  Geolocation get geolocation => _blink.Native_Navigator_geolocation_Getter(this);
+  Geolocation get geolocation => _blink.BlinkNavigator.$geolocation_Getter(this);
 
   @DomName('Navigator.language')
   @DocsEditable()
-  String get language => _blink.Native_Navigator_language_Getter(this);
+  String get language => _blink.BlinkNavigator.$language_Getter(this);
 
   @DomName('Navigator.maxTouchPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxTouchPoints => _blink.Native_Navigator_maxTouchPoints_Getter(this);
+  int get maxTouchPoints => _blink.BlinkNavigator.$maxTouchPoints_Getter(this);
 
   @DomName('Navigator.mimeTypes')
   @DocsEditable()
   @Experimental() // nonstandard
-  MimeTypeArray get mimeTypes => _blink.Native_Navigator_mimeTypes_Getter(this);
+  MimeTypeArray get mimeTypes => _blink.BlinkNavigator.$mimeTypes_Getter(this);
 
   @DomName('Navigator.productSub')
   @DocsEditable()
   @Unstable()
-  String get productSub => _blink.Native_Navigator_productSub_Getter(this);
+  String get productSub => _blink.BlinkNavigator.$productSub_Getter(this);
 
   @DomName('Navigator.serviceWorker')
   @DocsEditable()
   @Experimental() // untriaged
-  ServiceWorkerContainer get serviceWorker => _blink.Native_Navigator_serviceWorker_Getter(this);
+  ServiceWorkerContainer get serviceWorker => _blink.BlinkNavigator.$serviceWorker_Getter(this);
 
   @DomName('Navigator.storageQuota')
   @DocsEditable()
   @Experimental() // untriaged
-  StorageQuota get storageQuota => _blink.Native_Navigator_storageQuota_Getter(this);
+  StorageQuota get storageQuota => _blink.BlinkNavigator.$storageQuota_Getter(this);
 
   @DomName('Navigator.vendor')
   @DocsEditable()
   @Unstable()
-  String get vendor => _blink.Native_Navigator_vendor_Getter(this);
+  String get vendor => _blink.BlinkNavigator.$vendor_Getter(this);
 
   @DomName('Navigator.vendorSub')
   @DocsEditable()
   @Unstable()
-  String get vendorSub => _blink.Native_Navigator_vendorSub_Getter(this);
+  String get vendorSub => _blink.BlinkNavigator.$vendorSub_Getter(this);
 
   @DomName('Navigator.webkitPersistentStorage')
   @DocsEditable()
@@ -20761,7 +20761,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get persistentStorage => _blink.Native_Navigator_webkitPersistentStorage_Getter(this);
+  DeprecatedStorageQuota get persistentStorage => _blink.BlinkNavigator.$webkitPersistentStorage_Getter(this);
 
   @DomName('Navigator.webkitTemporaryStorage')
   @DocsEditable()
@@ -20769,33 +20769,33 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3.org/TR/quota-api/#accessing-storagequota
-  DeprecatedStorageQuota get temporaryStorage => _blink.Native_Navigator_webkitTemporaryStorage_Getter(this);
+  DeprecatedStorageQuota get temporaryStorage => _blink.BlinkNavigator.$webkitTemporaryStorage_Getter(this);
 
   @DomName('Navigator.getStorageUpdates')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/timers.html#navigatorstorageutils
   @Experimental()
-  void getStorageUpdates() => _blink.Native_Navigator_getStorageUpdates_Callback(this);
+  void getStorageUpdates() => _blink.BlinkNavigator.$getStorageUpdates_Callback(this);
 
   @DomName('Navigator.isProtocolHandlerRegistered')
   @DocsEditable()
   @Experimental() // untriaged
-  String isProtocolHandlerRegistered(String scheme, String url) => _blink.Native_Navigator_isProtocolHandlerRegistered_Callback(this, scheme, url);
+  String isProtocolHandlerRegistered(String scheme, String url) => _blink.BlinkNavigator.$isProtocolHandlerRegistered_Callback(this, scheme, url);
 
   @DomName('Navigator.registerProtocolHandler')
   @DocsEditable()
   @Unstable()
-  void registerProtocolHandler(String scheme, String url, String title) => _blink.Native_Navigator_registerProtocolHandler_Callback(this, scheme, url, title);
+  void registerProtocolHandler(String scheme, String url, String title) => _blink.BlinkNavigator.$registerProtocolHandler_Callback(this, scheme, url, title);
 
   @DomName('Navigator.requestMIDIAccess')
   @DocsEditable()
   @Experimental() // untriaged
-  MidiAccessPromise requestMidiAccess([Map options]) => _blink.Native_Navigator_requestMIDIAccess_Callback(this, options);
+  MidiAccessPromise requestMidiAccess([Map options]) => _blink.BlinkNavigator.$requestMIDIAccess_Callback(this, options);
 
   @DomName('Navigator.unregisterProtocolHandler')
   @DocsEditable()
   @Experimental() // untriaged
-  void unregisterProtocolHandler(String scheme, String url) => _blink.Native_Navigator_unregisterProtocolHandler_Callback(this, scheme, url);
+  void unregisterProtocolHandler(String scheme, String url) => _blink.BlinkNavigator.$unregisterProtocolHandler_Callback(this, scheme, url);
 
   @DomName('Navigator.webkitGetGamepads')
   @DocsEditable()
@@ -20803,44 +20803,44 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/gamepad/raw-file/default/gamepad.html#widl-Navigator-getGamepads-Gamepad
-  List<Gamepad> getGamepads() => _blink.Native_Navigator_webkitGetGamepads_Callback(this);
+  List<Gamepad> getGamepads() => _blink.BlinkNavigator.$webkitGetGamepads_Callback(this);
 
   @DomName('Navigator.webkitGetUserMedia')
   @DocsEditable()
   // http://dev.w3.org/2011/webrtc/editor/getusermedia.html#navigatorusermedia
   @Experimental()
-  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) => _blink.Native_Navigator_webkitGetUserMedia_Callback(this, options, successCallback, errorCallback);
+  void _getUserMedia(Map options, _NavigatorUserMediaSuccessCallback successCallback, [_NavigatorUserMediaErrorCallback errorCallback]) => _blink.BlinkNavigator.$webkitGetUserMedia_Callback(this, options, successCallback, errorCallback);
 
   @DomName('Navigator.appCodeName')
   @DocsEditable()
   @Experimental() // non-standard
-  String get appCodeName => _blink.Native_Navigator_appCodeName_Getter(this);
+  String get appCodeName => _blink.BlinkNavigator.$appCodeName_Getter(this);
 
   @DomName('Navigator.appName')
   @DocsEditable()
-  String get appName => _blink.Native_Navigator_appName_Getter(this);
+  String get appName => _blink.BlinkNavigator.$appName_Getter(this);
 
   @DomName('Navigator.appVersion')
   @DocsEditable()
-  String get appVersion => _blink.Native_Navigator_appVersion_Getter(this);
+  String get appVersion => _blink.BlinkNavigator.$appVersion_Getter(this);
 
   @DomName('Navigator.platform')
   @DocsEditable()
-  String get platform => _blink.Native_Navigator_platform_Getter(this);
+  String get platform => _blink.BlinkNavigator.$platform_Getter(this);
 
   @DomName('Navigator.product')
   @DocsEditable()
   @Unstable()
-  String get product => _blink.Native_Navigator_product_Getter(this);
+  String get product => _blink.BlinkNavigator.$product_Getter(this);
 
   @DomName('Navigator.userAgent')
   @DocsEditable()
-  String get userAgent => _blink.Native_Navigator_userAgent_Getter(this);
+  String get userAgent => _blink.BlinkNavigator.$userAgent_Getter(this);
 
   @DomName('Navigator.onLine')
   @DocsEditable()
   @Unstable()
-  bool get onLine => _blink.Native_Navigator_onLine_Getter(this);
+  bool get onLine => _blink.BlinkNavigator.$onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20860,32 +20860,32 @@
   @DomName('NavigatorID.appCodeName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appCodeName => _blink.Native_NavigatorID_appCodeName_Getter(this);
+  String get appCodeName => _blink.BlinkNavigatorID.$appCodeName_Getter(this);
 
   @DomName('NavigatorID.appName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appName => _blink.Native_NavigatorID_appName_Getter(this);
+  String get appName => _blink.BlinkNavigatorID.$appName_Getter(this);
 
   @DomName('NavigatorID.appVersion')
   @DocsEditable()
   @Experimental() // untriaged
-  String get appVersion => _blink.Native_NavigatorID_appVersion_Getter(this);
+  String get appVersion => _blink.BlinkNavigatorID.$appVersion_Getter(this);
 
   @DomName('NavigatorID.platform')
   @DocsEditable()
   @Experimental() // untriaged
-  String get platform => _blink.Native_NavigatorID_platform_Getter(this);
+  String get platform => _blink.BlinkNavigatorID.$platform_Getter(this);
 
   @DomName('NavigatorID.product')
   @DocsEditable()
   @Experimental() // untriaged
-  String get product => _blink.Native_NavigatorID_product_Getter(this);
+  String get product => _blink.BlinkNavigatorID.$product_Getter(this);
 
   @DomName('NavigatorID.userAgent')
   @DocsEditable()
   @Experimental() // untriaged
-  String get userAgent => _blink.Native_NavigatorID_userAgent_Getter(this);
+  String get userAgent => _blink.BlinkNavigatorID.$userAgent_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20905,7 +20905,7 @@
   @DomName('NavigatorOnLine.onLine')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get onLine => _blink.Native_NavigatorOnLine_onLine_Getter(this);
+  bool get onLine => _blink.BlinkNavigatorOnLine.$onLine_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -20925,15 +20925,15 @@
 
   @DomName('NavigatorUserMediaError.constraintName')
   @DocsEditable()
-  String get constraintName => _blink.Native_NavigatorUserMediaError_constraintName_Getter(this);
+  String get constraintName => _blink.BlinkNavigatorUserMediaError.$constraintName_Getter(this);
 
   @DomName('NavigatorUserMediaError.message')
   @DocsEditable()
-  String get message => _blink.Native_NavigatorUserMediaError_message_Getter(this);
+  String get message => _blink.BlinkNavigatorUserMediaError.$message_Getter(this);
 
   @DomName('NavigatorUserMediaError.name')
   @DocsEditable()
-  String get name => _blink.Native_NavigatorUserMediaError_name_Getter(this);
+  String get name => _blink.BlinkNavigatorUserMediaError.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21263,7 +21263,7 @@
 
   @DomName('Node.baseURI')
   @DocsEditable()
-  String get baseUri => _blink.Native_Node_baseURI_Getter(this);
+  String get baseUri => _blink.BlinkNode.$baseURI_Getter(this);
 
   /**
    * A list of this node's children.
@@ -21276,7 +21276,7 @@
    */
   @DomName('Node.childNodes')
   @DocsEditable()
-  List<Node> get childNodes => _blink.Native_Node_childNodes_Getter(this);
+  List<Node> get childNodes => _blink.BlinkNode.$childNodes_Getter(this);
 
   /**
    * The first child of this node.
@@ -21289,7 +21289,7 @@
    */
   @DomName('Node.firstChild')
   @DocsEditable()
-  Node get firstChild => _blink.Native_Node_firstChild_Getter(this);
+  Node get firstChild => _blink.BlinkNode.$firstChild_Getter(this);
 
   /**
    * The last child of this node.
@@ -21302,15 +21302,15 @@
    */
   @DomName('Node.lastChild')
   @DocsEditable()
-  Node get lastChild => _blink.Native_Node_lastChild_Getter(this);
+  Node get lastChild => _blink.BlinkNode.$lastChild_Getter(this);
 
   @DomName('Node.localName')
   @DocsEditable()
-  String get _localName => _blink.Native_Node_localName_Getter(this);
+  String get _localName => _blink.BlinkNode.$localName_Getter(this);
 
   @DomName('Node.namespaceURI')
   @DocsEditable()
-  String get _namespaceUri => _blink.Native_Node_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkNode.$namespaceURI_Getter(this);
 
   /**
    * The next sibling node.
@@ -21323,7 +21323,7 @@
    */
   @DomName('Node.nextSibling')
   @DocsEditable()
-  Node get nextNode => _blink.Native_Node_nextSibling_Getter(this);
+  Node get nextNode => _blink.BlinkNode.$nextSibling_Getter(this);
 
   /**
    * The name of this node.
@@ -21339,7 +21339,7 @@
    */
   @DomName('Node.nodeName')
   @DocsEditable()
-  String get nodeName => _blink.Native_Node_nodeName_Getter(this);
+  String get nodeName => _blink.BlinkNode.$nodeName_Getter(this);
 
   /**
    * The type of node.
@@ -21366,7 +21366,7 @@
    */
   @DomName('Node.nodeType')
   @DocsEditable()
-  int get nodeType => _blink.Native_Node_nodeType_Getter(this);
+  int get nodeType => _blink.BlinkNode.$nodeType_Getter(this);
 
   /**
    * The value of this node.
@@ -21382,7 +21382,7 @@
    */
   @DomName('Node.nodeValue')
   @DocsEditable()
-  String get nodeValue => _blink.Native_Node_nodeValue_Getter(this);
+  String get nodeValue => _blink.BlinkNode.$nodeValue_Getter(this);
 
   /**
    * The document this node belongs to.
@@ -21397,7 +21397,7 @@
    */
   @DomName('Node.ownerDocument')
   @DocsEditable()
-  Document get ownerDocument => _blink.Native_Node_ownerDocument_Getter(this);
+  Document get ownerDocument => _blink.BlinkNode.$ownerDocument_Getter(this);
 
   /**
    * The parent element of this node.
@@ -21413,7 +21413,7 @@
    */
   @DomName('Node.parentElement')
   @DocsEditable()
-  Element get parent => _blink.Native_Node_parentElement_Getter(this);
+  Element get parent => _blink.BlinkNode.$parentElement_Getter(this);
 
   /**
    * The parent node of this node.
@@ -21426,7 +21426,7 @@
    */
   @DomName('Node.parentNode')
   @DocsEditable()
-  Node get parentNode => _blink.Native_Node_parentNode_Getter(this);
+  Node get parentNode => _blink.BlinkNode.$parentNode_Getter(this);
 
   /**
    * The previous sibling node.
@@ -21439,7 +21439,7 @@
    */
   @DomName('Node.previousSibling')
   @DocsEditable()
-  Node get previousNode => _blink.Native_Node_previousSibling_Getter(this);
+  Node get previousNode => _blink.BlinkNode.$previousSibling_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21452,7 +21452,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  String get text => _blink.Native_Node_textContent_Getter(this);
+  String get text => _blink.BlinkNode.$textContent_Getter(this);
 
   /**
    * All text within this node and its decendents.
@@ -21465,7 +21465,7 @@
    */
   @DomName('Node.textContent')
   @DocsEditable()
-  void set text(String value) => _blink.Native_Node_textContent_Setter(this, value);
+  void set text(String value) => _blink.BlinkNode.$textContent_Setter(this, value);
 
   /**
    * Adds a node to the end of the child [nodes] list of this node.
@@ -21478,7 +21478,7 @@
    */
   @DomName('Node.appendChild')
   @DocsEditable()
-  Node append(Node newChild) => _blink.Native_Node_appendChild_Callback(this, newChild);
+  Node append(Node newChild) => _blink.BlinkNode.$appendChild_Callback(this, newChild);
 
   /**
    * Returns a copy of this node.
@@ -21494,7 +21494,7 @@
    */
   @DomName('Node.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.Native_Node_cloneNode_Callback(this, deep);
+  Node clone(bool deep) => _blink.BlinkNode.$cloneNode_Callback(this, deep);
 
   /**
    * Returns true if this node contains the specified node.
@@ -21506,7 +21506,7 @@
    */
   @DomName('Node.contains')
   @DocsEditable()
-  bool contains(Node other) => _blink.Native_Node_contains_Callback(this, other);
+  bool contains(Node other) => _blink.BlinkNode.$contains_Callback(this, other);
 
   /**
    * Returns true if this node has any children.
@@ -21519,7 +21519,7 @@
    */
   @DomName('Node.hasChildNodes')
   @DocsEditable()
-  bool hasChildNodes() => _blink.Native_Node_hasChildNodes_Callback(this);
+  bool hasChildNodes() => _blink.BlinkNode.$hasChildNodes_Callback(this);
 
   /**
    * Inserts all of the nodes into this node directly before refChild.
@@ -21532,15 +21532,15 @@
    */
   @DomName('Node.insertBefore')
   @DocsEditable()
-  Node insertBefore(Node newChild, Node refChild) => _blink.Native_Node_insertBefore_Callback(this, newChild, refChild);
+  Node insertBefore(Node newChild, Node refChild) => _blink.BlinkNode.$insertBefore_Callback(this, newChild, refChild);
 
   @DomName('Node.removeChild')
   @DocsEditable()
-  Node _removeChild(Node oldChild) => _blink.Native_Node_removeChild_Callback(this, oldChild);
+  Node _removeChild(Node oldChild) => _blink.BlinkNode.$removeChild_Callback(this, oldChild);
 
   @DomName('Node.replaceChild')
   @DocsEditable()
-  Node _replaceChild(Node newChild, Node oldChild) => _blink.Native_Node_replaceChild_Callback(this, newChild, oldChild);
+  Node _replaceChild(Node newChild, Node oldChild) => _blink.BlinkNode.$replaceChild_Callback(this, newChild, oldChild);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21618,31 +21618,31 @@
 
   @DomName('NodeIterator.pointerBeforeReferenceNode')
   @DocsEditable()
-  bool get pointerBeforeReferenceNode => _blink.Native_NodeIterator_pointerBeforeReferenceNode_Getter(this);
+  bool get pointerBeforeReferenceNode => _blink.BlinkNodeIterator.$pointerBeforeReferenceNode_Getter(this);
 
   @DomName('NodeIterator.referenceNode')
   @DocsEditable()
-  Node get referenceNode => _blink.Native_NodeIterator_referenceNode_Getter(this);
+  Node get referenceNode => _blink.BlinkNodeIterator.$referenceNode_Getter(this);
 
   @DomName('NodeIterator.root')
   @DocsEditable()
-  Node get root => _blink.Native_NodeIterator_root_Getter(this);
+  Node get root => _blink.BlinkNodeIterator.$root_Getter(this);
 
   @DomName('NodeIterator.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.Native_NodeIterator_whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkNodeIterator.$whatToShow_Getter(this);
 
   @DomName('NodeIterator.detach')
   @DocsEditable()
-  void detach() => _blink.Native_NodeIterator_detach_Callback(this);
+  void detach() => _blink.BlinkNodeIterator.$detach_Callback(this);
 
   @DomName('NodeIterator.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.Native_NodeIterator_nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkNodeIterator.$nextNode_Callback(this);
 
   @DomName('NodeIterator.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.Native_NodeIterator_previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkNodeIterator.$previousNode_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21660,15 +21660,15 @@
 
   @DomName('NodeList.length')
   @DocsEditable()
-  int get length => _blink.Native_NodeList_length_Getter(this);
+  int get length => _blink.BlinkNodeList.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_NodeList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkNodeList.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_NodeList_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNodeList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -21710,7 +21710,7 @@
 
   @DomName('NodeList.item')
   @DocsEditable()
-  Node _item(int index) => _blink.Native_NodeList_item_Callback(this, index);
+  Node _item(int index) => _blink.BlinkNodeList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -21780,49 +21780,49 @@
 
   @DomName('Notification.Notification')
   @DocsEditable()
-  static Notification _factoryNotification(String title, [Map options]) => _blink.Native_Notification_Notification(title, options);
+  static Notification _factoryNotification(String title, [Map options]) => _blink.BlinkNotification.$mkNotification(title, options);
 
   @DomName('Notification.body')
   @DocsEditable()
   @Experimental() // untriaged
-  String get body => _blink.Native_Notification_body_Getter(this);
+  String get body => _blink.BlinkNotification.$body_Getter(this);
 
   @DomName('Notification.dir')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get dir => _blink.Native_Notification_dir_Getter(this);
+  String get dir => _blink.BlinkNotification.$dir_Getter(this);
 
   @DomName('Notification.icon')
   @DocsEditable()
   @Experimental() // untriaged
-  String get icon => _blink.Native_Notification_icon_Getter(this);
+  String get icon => _blink.BlinkNotification.$icon_Getter(this);
 
   @DomName('Notification.lang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get lang => _blink.Native_Notification_lang_Getter(this);
+  String get lang => _blink.BlinkNotification.$lang_Getter(this);
 
   @DomName('Notification.permission')
   @DocsEditable()
-  String get permission => _blink.Native_Notification_permission_Getter(this);
+  String get permission => _blink.BlinkNotification.$permission_Getter(this);
 
   @DomName('Notification.tag')
   @DocsEditable()
   @Experimental() // nonstandard
-  String get tag => _blink.Native_Notification_tag_Getter(this);
+  String get tag => _blink.BlinkNotification.$tag_Getter(this);
 
   @DomName('Notification.title')
   @DocsEditable()
   @Experimental() // untriaged
-  String get title => _blink.Native_Notification_title_Getter(this);
+  String get title => _blink.BlinkNotification.$title_Getter(this);
 
   @DomName('Notification.close')
   @DocsEditable()
-  void close() => _blink.Native_Notification_close_Callback(this);
+  void close() => _blink.BlinkNotification.$close_Callback(this);
 
   @DomName('Notification.requestPermission')
   @DocsEditable()
-  static void _requestPermission([_NotificationPermissionCallback callback]) => _blink.Native_Notification_requestPermission_Callback(callback);
+  static void _requestPermission([_NotificationPermissionCallback callback]) => _blink.BlinkNotification.$requestPermission_Callback(callback);
 
   static Future<String> requestPermission() {
     var completer = new Completer<String>();
@@ -21888,27 +21888,27 @@
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  bool get reversed => _blink.Native_HTMLOListElement_reversed_Getter(this);
+  bool get reversed => _blink.BlinkHTMLOListElement.$reversed_Getter(this);
 
   @DomName('HTMLOListElement.reversed')
   @DocsEditable()
-  void set reversed(bool value) => _blink.Native_HTMLOListElement_reversed_Setter(this, value);
+  void set reversed(bool value) => _blink.BlinkHTMLOListElement.$reversed_Setter(this, value);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  int get start => _blink.Native_HTMLOListElement_start_Getter(this);
+  int get start => _blink.BlinkHTMLOListElement.$start_Getter(this);
 
   @DomName('HTMLOListElement.start')
   @DocsEditable()
-  void set start(int value) => _blink.Native_HTMLOListElement_start_Setter(this, value);
+  void set start(int value) => _blink.BlinkHTMLOListElement.$start_Setter(this, value);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLOListElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLOListElement.$type_Getter(this);
 
   @DomName('HTMLOListElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLOListElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLOListElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -21943,83 +21943,83 @@
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  String get data => _blink.Native_HTMLObjectElement_data_Getter(this);
+  String get data => _blink.BlinkHTMLObjectElement.$data_Getter(this);
 
   @DomName('HTMLObjectElement.data')
   @DocsEditable()
-  void set data(String value) => _blink.Native_HTMLObjectElement_data_Setter(this, value);
+  void set data(String value) => _blink.BlinkHTMLObjectElement.$data_Setter(this, value);
 
   @DomName('HTMLObjectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLObjectElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLObjectElement.$form_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  String get height => _blink.Native_HTMLObjectElement_height_Getter(this);
+  String get height => _blink.BlinkHTMLObjectElement.$height_Getter(this);
 
   @DomName('HTMLObjectElement.height')
   @DocsEditable()
-  void set height(String value) => _blink.Native_HTMLObjectElement_height_Setter(this, value);
+  void set height(String value) => _blink.BlinkHTMLObjectElement.$height_Setter(this, value);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLObjectElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLObjectElement.$name_Getter(this);
 
   @DomName('HTMLObjectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLObjectElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLObjectElement.$name_Setter(this, value);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLObjectElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLObjectElement.$type_Getter(this);
 
   @DomName('HTMLObjectElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLObjectElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLObjectElement.$type_Setter(this, value);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  String get useMap => _blink.Native_HTMLObjectElement_useMap_Getter(this);
+  String get useMap => _blink.BlinkHTMLObjectElement.$useMap_Getter(this);
 
   @DomName('HTMLObjectElement.useMap')
   @DocsEditable()
-  void set useMap(String value) => _blink.Native_HTMLObjectElement_useMap_Setter(this, value);
+  void set useMap(String value) => _blink.BlinkHTMLObjectElement.$useMap_Setter(this, value);
 
   @DomName('HTMLObjectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLObjectElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLObjectElement.$validationMessage_Getter(this);
 
   @DomName('HTMLObjectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLObjectElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLObjectElement.$validity_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  String get width => _blink.Native_HTMLObjectElement_width_Getter(this);
+  String get width => _blink.BlinkHTMLObjectElement.$width_Getter(this);
 
   @DomName('HTMLObjectElement.width')
   @DocsEditable()
-  void set width(String value) => _blink.Native_HTMLObjectElement_width_Setter(this, value);
+  void set width(String value) => _blink.BlinkHTMLObjectElement.$width_Setter(this, value);
 
   @DomName('HTMLObjectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLObjectElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLObjectElement.$willValidate_Getter(this);
 
   @DomName('HTMLObjectElement.__getter__')
   @DocsEditable()
-  bool __getter__(index_OR_name) => _blink.Native_HTMLObjectElement___getter___Callback(this, index_OR_name);
+  bool __getter__(index_OR_name) => _blink.BlinkHTMLObjectElement.$__getter___Callback(this, index_OR_name);
 
   @DomName('HTMLObjectElement.__setter__')
   @DocsEditable()
-  void __setter__(index_OR_name, Node value) => _blink.Native_HTMLObjectElement___setter___Callback(this, index_OR_name, value);
+  void __setter__(index_OR_name, Node value) => _blink.BlinkHTMLObjectElement.$__setter___Callback(this, index_OR_name, value);
 
   @DomName('HTMLObjectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLObjectElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLObjectElement.$checkValidity_Callback(this);
 
   @DomName('HTMLObjectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLObjectElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLObjectElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22047,19 +22047,19 @@
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLOptGroupElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptGroupElement.$disabled_Getter(this);
 
   @DomName('HTMLOptGroupElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLOptGroupElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptGroupElement.$disabled_Setter(this, value);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLOptGroupElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLOptGroupElement.$label_Getter(this);
 
   @DomName('HTMLOptGroupElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLOptGroupElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptGroupElement.$label_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -22075,7 +22075,7 @@
 
   @DomName('HTMLOptionElement.HTMLOptionElement')
   @DocsEditable()
-  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.Native_HTMLOptionElement_OptionElement__(data, value, defaultSelected, selected);
+  factory OptionElement._([String data, String value, bool defaultSelected, bool selected]) => _blink.BlinkHTMLOptionElement.$mkOptionElement__(data, value, defaultSelected, selected);
   /**
    * Constructor instantiated by the DOM when a custom element has been created.
    *
@@ -22085,51 +22085,51 @@
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  bool get defaultSelected => _blink.Native_HTMLOptionElement_defaultSelected_Getter(this);
+  bool get defaultSelected => _blink.BlinkHTMLOptionElement.$defaultSelected_Getter(this);
 
   @DomName('HTMLOptionElement.defaultSelected')
   @DocsEditable()
-  void set defaultSelected(bool value) => _blink.Native_HTMLOptionElement_defaultSelected_Setter(this, value);
+  void set defaultSelected(bool value) => _blink.BlinkHTMLOptionElement.$defaultSelected_Setter(this, value);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLOptionElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLOptionElement.$disabled_Getter(this);
 
   @DomName('HTMLOptionElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLOptionElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLOptionElement.$disabled_Setter(this, value);
 
   @DomName('HTMLOptionElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLOptionElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOptionElement.$form_Getter(this);
 
   @DomName('HTMLOptionElement.index')
   @DocsEditable()
-  int get index => _blink.Native_HTMLOptionElement_index_Getter(this);
+  int get index => _blink.BlinkHTMLOptionElement.$index_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLOptionElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLOptionElement.$label_Getter(this);
 
   @DomName('HTMLOptionElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLOptionElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLOptionElement.$label_Setter(this, value);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  bool get selected => _blink.Native_HTMLOptionElement_selected_Getter(this);
+  bool get selected => _blink.BlinkHTMLOptionElement.$selected_Getter(this);
 
   @DomName('HTMLOptionElement.selected')
   @DocsEditable()
-  void set selected(bool value) => _blink.Native_HTMLOptionElement_selected_Setter(this, value);
+  void set selected(bool value) => _blink.BlinkHTMLOptionElement.$selected_Setter(this, value);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLOptionElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLOptionElement.$value_Getter(this);
 
   @DomName('HTMLOptionElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLOptionElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOptionElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22163,64 +22163,64 @@
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLOutputElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLOutputElement.$defaultValue_Getter(this);
 
   @DomName('HTMLOutputElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLOutputElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLOutputElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLOutputElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLOutputElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLOutputElement.$form_Getter(this);
 
   @DomName('HTMLOutputElement.htmlFor')
   @DocsEditable()
-  DomSettableTokenList get htmlFor => _blink.Native_HTMLOutputElement_htmlFor_Getter(this);
+  DomSettableTokenList get htmlFor => _blink.BlinkHTMLOutputElement.$htmlFor_Getter(this);
 
   @DomName('HTMLOutputElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLOutputElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLOutputElement.$labels_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLOutputElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLOutputElement.$name_Getter(this);
 
   @DomName('HTMLOutputElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLOutputElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLOutputElement.$name_Setter(this, value);
 
   @DomName('HTMLOutputElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLOutputElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLOutputElement.$type_Getter(this);
 
   @DomName('HTMLOutputElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLOutputElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLOutputElement.$validationMessage_Getter(this);
 
   @DomName('HTMLOutputElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLOutputElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLOutputElement.$validity_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLOutputElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLOutputElement.$value_Getter(this);
 
   @DomName('HTMLOutputElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLOutputElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLOutputElement.$value_Setter(this, value);
 
   @DomName('HTMLOutputElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLOutputElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLOutputElement.$willValidate_Getter(this);
 
   @DomName('HTMLOutputElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLOutputElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLOutputElement.$checkValidity_Callback(this);
 
   @DomName('HTMLOutputElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLOutputElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLOutputElement.$setCustomValidity_Callback(this, error);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22251,15 +22251,15 @@
 
   @DomName('OverflowEvent.horizontalOverflow')
   @DocsEditable()
-  bool get horizontalOverflow => _blink.Native_OverflowEvent_horizontalOverflow_Getter(this);
+  bool get horizontalOverflow => _blink.BlinkOverflowEvent.$horizontalOverflow_Getter(this);
 
   @DomName('OverflowEvent.orient')
   @DocsEditable()
-  int get orient => _blink.Native_OverflowEvent_orient_Getter(this);
+  int get orient => _blink.BlinkOverflowEvent.$orient_Getter(this);
 
   @DomName('OverflowEvent.verticalOverflow')
   @DocsEditable()
-  bool get verticalOverflow => _blink.Native_OverflowEvent_verticalOverflow_Getter(this);
+  bool get verticalOverflow => _blink.BlinkOverflowEvent.$verticalOverflow_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22279,7 +22279,7 @@
 
   @DomName('PageTransitionEvent.persisted')
   @DocsEditable()
-  bool get persisted => _blink.Native_PageTransitionEvent_persisted_Getter(this);
+  bool get persisted => _blink.BlinkPageTransitionEvent.$persisted_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22332,19 +22332,19 @@
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLParamElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLParamElement.$name_Getter(this);
 
   @DomName('HTMLParamElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLParamElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLParamElement.$name_Setter(this, value);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLParamElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLParamElement.$value_Getter(this);
 
   @DomName('HTMLParamElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLParamElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLParamElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22364,22 +22364,22 @@
   @DomName('ParentNode.childElementCount')
   @DocsEditable()
   @Experimental() // untriaged
-  int get _childElementCount => _blink.Native_ParentNode_childElementCount_Getter(this);
+  int get _childElementCount => _blink.BlinkParentNode.$childElementCount_Getter(this);
 
   @DomName('ParentNode.children')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> get _children => _blink.Native_ParentNode_children_Getter(this);
+  List<Node> get _children => _blink.BlinkParentNode.$children_Getter(this);
 
   @DomName('ParentNode.firstElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _firstElementChild => _blink.Native_ParentNode_firstElementChild_Getter(this);
+  Element get _firstElementChild => _blink.BlinkParentNode.$firstElementChild_Getter(this);
 
   @DomName('ParentNode.lastElementChild')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get _lastElementChild => _blink.Native_ParentNode_lastElementChild_Getter(this);
+  Element get _lastElementChild => _blink.BlinkParentNode.$lastElementChild_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22399,39 +22399,39 @@
 
   @DomName('Path.Path')
   @DocsEditable()
-  factory Path([path_OR_text]) => _blink.Native_Path_Path(path_OR_text);
+  factory Path([path_OR_text]) => _blink.BlinkPath.$mkPath(path_OR_text);
 
   @DomName('Path.arc')
   @DocsEditable()
-  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.Native_Path_arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
+  void arc(num x, num y, num radius, num startAngle, num endAngle, bool anticlockwise) => _blink.BlinkPath.$arc_Callback(this, x, y, radius, startAngle, endAngle, anticlockwise);
 
   @DomName('Path.arcTo')
   @DocsEditable()
-  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.Native_Path_arcTo_Callback(this, x1, y1, x2, y2, radius);
+  void arcTo(num x1, num y1, num x2, num y2, num radius) => _blink.BlinkPath.$arcTo_Callback(this, x1, y1, x2, y2, radius);
 
   @DomName('Path.bezierCurveTo')
   @DocsEditable()
-  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.Native_Path_bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
+  void bezierCurveTo(num cp1x, num cp1y, num cp2x, num cp2y, num x, num y) => _blink.BlinkPath.$bezierCurveTo_Callback(this, cp1x, cp1y, cp2x, cp2y, x, y);
 
   @DomName('Path.closePath')
   @DocsEditable()
-  void closePath() => _blink.Native_Path_closePath_Callback(this);
+  void closePath() => _blink.BlinkPath.$closePath_Callback(this);
 
   @DomName('Path.lineTo')
   @DocsEditable()
-  void lineTo(num x, num y) => _blink.Native_Path_lineTo_Callback(this, x, y);
+  void lineTo(num x, num y) => _blink.BlinkPath.$lineTo_Callback(this, x, y);
 
   @DomName('Path.moveTo')
   @DocsEditable()
-  void moveTo(num x, num y) => _blink.Native_Path_moveTo_Callback(this, x, y);
+  void moveTo(num x, num y) => _blink.BlinkPath.$moveTo_Callback(this, x, y);
 
   @DomName('Path.quadraticCurveTo')
   @DocsEditable()
-  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.Native_Path_quadraticCurveTo_Callback(this, cpx, cpy, x, y);
+  void quadraticCurveTo(num cpx, num cpy, num x, num y) => _blink.BlinkPath.$quadraticCurveTo_Callback(this, cpx, cpy, x, y);
 
   @DomName('Path.rect')
   @DocsEditable()
-  void rect(num x, num y, num width, num height) => _blink.Native_Path_rect_Callback(this, x, y, width, height);
+  void rect(num x, num y, num width, num height) => _blink.BlinkPath.$rect_Callback(this, x, y, width, height);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22470,61 +22470,61 @@
   @DomName('Performance.memory')
   @DocsEditable()
   @Experimental() // nonstandard
-  MemoryInfo get memory => _blink.Native_Performance_memory_Getter(this);
+  MemoryInfo get memory => _blink.BlinkPerformance.$memory_Getter(this);
 
   @DomName('Performance.navigation')
   @DocsEditable()
-  PerformanceNavigation get navigation => _blink.Native_Performance_navigation_Getter(this);
+  PerformanceNavigation get navigation => _blink.BlinkPerformance.$navigation_Getter(this);
 
   @DomName('Performance.timing')
   @DocsEditable()
-  PerformanceTiming get timing => _blink.Native_Performance_timing_Getter(this);
+  PerformanceTiming get timing => _blink.BlinkPerformance.$timing_Getter(this);
 
   @DomName('Performance.clearMarks')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMarks(String markName) => _blink.Native_Performance_clearMarks_Callback(this, markName);
+  void clearMarks(String markName) => _blink.BlinkPerformance.$clearMarks_Callback(this, markName);
 
   @DomName('Performance.clearMeasures')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void clearMeasures(String measureName) => _blink.Native_Performance_clearMeasures_Callback(this, measureName);
+  void clearMeasures(String measureName) => _blink.BlinkPerformance.$clearMeasures_Callback(this, measureName);
 
   @DomName('Performance.getEntries')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntries() => _blink.Native_Performance_getEntries_Callback(this);
+  List<PerformanceEntry> getEntries() => _blink.BlinkPerformance.$getEntries_Callback(this);
 
   @DomName('Performance.getEntriesByName')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.Native_Performance_getEntriesByName_Callback(this, name, entryType);
+  List<PerformanceEntry> getEntriesByName(String name, String entryType) => _blink.BlinkPerformance.$getEntriesByName_Callback(this, name, entryType);
 
   @DomName('Performance.getEntriesByType')
   @DocsEditable()
   // http://www.w3.org/TR/performance-timeline/#sec-window.performance-attribute
   @Experimental()
-  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.Native_Performance_getEntriesByType_Callback(this, entryType);
+  List<PerformanceEntry> getEntriesByType(String entryType) => _blink.BlinkPerformance.$getEntriesByType_Callback(this, entryType);
 
   @DomName('Performance.mark')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void mark(String markName) => _blink.Native_Performance_mark_Callback(this, markName);
+  void mark(String markName) => _blink.BlinkPerformance.$mark_Callback(this, markName);
 
   @DomName('Performance.measure')
   @DocsEditable()
   // https://dvcs.w3.org/hg/webperf/raw-file/tip/specs/UserTiming/Overview.html#extensions-performance-interface
   @Experimental()
-  void measure(String measureName, String startMark, String endMark) => _blink.Native_Performance_measure_Callback(this, measureName, startMark, endMark);
+  void measure(String measureName, String startMark, String endMark) => _blink.BlinkPerformance.$measure_Callback(this, measureName, startMark, endMark);
 
   @DomName('Performance.now')
   @DocsEditable()
-  double now() => _blink.Native_Performance_now_Callback(this);
+  double now() => _blink.BlinkPerformance.$now_Callback(this);
 
   @DomName('Performance.webkitClearResourceTimings')
   @DocsEditable()
@@ -22532,7 +22532,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#extensions-performance-interface
-  void clearResourceTimings() => _blink.Native_Performance_webkitClearResourceTimings_Callback(this);
+  void clearResourceTimings() => _blink.BlinkPerformance.$webkitClearResourceTimings_Callback(this);
 
   @DomName('Performance.webkitSetResourceTimingBufferSize')
   @DocsEditable()
@@ -22540,7 +22540,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://www.w3c-test.org/webperf/specs/ResourceTiming/#performanceresourcetiming-methods
-  void setResourceTimingBufferSize(int maxSize) => _blink.Native_Performance_webkitSetResourceTimingBufferSize_Callback(this, maxSize);
+  void setResourceTimingBufferSize(int maxSize) => _blink.BlinkPerformance.$webkitSetResourceTimingBufferSize_Callback(this, maxSize);
 
   /// Stream of `resourcetimingbufferfull` events handled by this [Performance].
   @DomName('Performance.onwebkitresourcetimingbufferfull')
@@ -22567,19 +22567,19 @@
 
   @DomName('PerformanceEntry.duration')
   @DocsEditable()
-  double get duration => _blink.Native_PerformanceEntry_duration_Getter(this);
+  double get duration => _blink.BlinkPerformanceEntry.$duration_Getter(this);
 
   @DomName('PerformanceEntry.entryType')
   @DocsEditable()
-  String get entryType => _blink.Native_PerformanceEntry_entryType_Getter(this);
+  String get entryType => _blink.BlinkPerformanceEntry.$entryType_Getter(this);
 
   @DomName('PerformanceEntry.name')
   @DocsEditable()
-  String get name => _blink.Native_PerformanceEntry_name_Getter(this);
+  String get name => _blink.BlinkPerformanceEntry.$name_Getter(this);
 
   @DomName('PerformanceEntry.startTime')
   @DocsEditable()
-  double get startTime => _blink.Native_PerformanceEntry_startTime_Getter(this);
+  double get startTime => _blink.BlinkPerformanceEntry.$startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22646,11 +22646,11 @@
 
   @DomName('PerformanceNavigation.redirectCount')
   @DocsEditable()
-  int get redirectCount => _blink.Native_PerformanceNavigation_redirectCount_Getter(this);
+  int get redirectCount => _blink.BlinkPerformanceNavigation.$redirectCount_Getter(this);
 
   @DomName('PerformanceNavigation.type')
   @DocsEditable()
-  int get type => _blink.Native_PerformanceNavigation_type_Getter(this);
+  int get type => _blink.BlinkPerformanceNavigation.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22670,54 +22670,54 @@
 
   @DomName('PerformanceResourceTiming.connectEnd')
   @DocsEditable()
-  double get connectEnd => _blink.Native_PerformanceResourceTiming_connectEnd_Getter(this);
+  double get connectEnd => _blink.BlinkPerformanceResourceTiming.$connectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.connectStart')
   @DocsEditable()
-  double get connectStart => _blink.Native_PerformanceResourceTiming_connectStart_Getter(this);
+  double get connectStart => _blink.BlinkPerformanceResourceTiming.$connectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupEnd')
   @DocsEditable()
-  double get domainLookupEnd => _blink.Native_PerformanceResourceTiming_domainLookupEnd_Getter(this);
+  double get domainLookupEnd => _blink.BlinkPerformanceResourceTiming.$domainLookupEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.domainLookupStart')
   @DocsEditable()
-  double get domainLookupStart => _blink.Native_PerformanceResourceTiming_domainLookupStart_Getter(this);
+  double get domainLookupStart => _blink.BlinkPerformanceResourceTiming.$domainLookupStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.fetchStart')
   @DocsEditable()
-  double get fetchStart => _blink.Native_PerformanceResourceTiming_fetchStart_Getter(this);
+  double get fetchStart => _blink.BlinkPerformanceResourceTiming.$fetchStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.initiatorType')
   @DocsEditable()
-  String get initiatorType => _blink.Native_PerformanceResourceTiming_initiatorType_Getter(this);
+  String get initiatorType => _blink.BlinkPerformanceResourceTiming.$initiatorType_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectEnd')
   @DocsEditable()
-  double get redirectEnd => _blink.Native_PerformanceResourceTiming_redirectEnd_Getter(this);
+  double get redirectEnd => _blink.BlinkPerformanceResourceTiming.$redirectEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.redirectStart')
   @DocsEditable()
-  double get redirectStart => _blink.Native_PerformanceResourceTiming_redirectStart_Getter(this);
+  double get redirectStart => _blink.BlinkPerformanceResourceTiming.$redirectStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.requestStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get requestStart => _blink.Native_PerformanceResourceTiming_requestStart_Getter(this);
+  double get requestStart => _blink.BlinkPerformanceResourceTiming.$requestStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseEnd')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseEnd => _blink.Native_PerformanceResourceTiming_responseEnd_Getter(this);
+  double get responseEnd => _blink.BlinkPerformanceResourceTiming.$responseEnd_Getter(this);
 
   @DomName('PerformanceResourceTiming.responseStart')
   @DocsEditable()
   @Experimental() // nonstandard
-  double get responseStart => _blink.Native_PerformanceResourceTiming_responseStart_Getter(this);
+  double get responseStart => _blink.BlinkPerformanceResourceTiming.$responseStart_Getter(this);
 
   @DomName('PerformanceResourceTiming.secureConnectionStart')
   @DocsEditable()
-  double get secureConnectionStart => _blink.Native_PerformanceResourceTiming_secureConnectionStart_Getter(this);
+  double get secureConnectionStart => _blink.BlinkPerformanceResourceTiming.$secureConnectionStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22736,87 +22736,87 @@
 
   @DomName('PerformanceTiming.connectEnd')
   @DocsEditable()
-  int get connectEnd => _blink.Native_PerformanceTiming_connectEnd_Getter(this);
+  int get connectEnd => _blink.BlinkPerformanceTiming.$connectEnd_Getter(this);
 
   @DomName('PerformanceTiming.connectStart')
   @DocsEditable()
-  int get connectStart => _blink.Native_PerformanceTiming_connectStart_Getter(this);
+  int get connectStart => _blink.BlinkPerformanceTiming.$connectStart_Getter(this);
 
   @DomName('PerformanceTiming.domComplete')
   @DocsEditable()
-  int get domComplete => _blink.Native_PerformanceTiming_domComplete_Getter(this);
+  int get domComplete => _blink.BlinkPerformanceTiming.$domComplete_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventEnd')
   @DocsEditable()
-  int get domContentLoadedEventEnd => _blink.Native_PerformanceTiming_domContentLoadedEventEnd_Getter(this);
+  int get domContentLoadedEventEnd => _blink.BlinkPerformanceTiming.$domContentLoadedEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.domContentLoadedEventStart')
   @DocsEditable()
-  int get domContentLoadedEventStart => _blink.Native_PerformanceTiming_domContentLoadedEventStart_Getter(this);
+  int get domContentLoadedEventStart => _blink.BlinkPerformanceTiming.$domContentLoadedEventStart_Getter(this);
 
   @DomName('PerformanceTiming.domInteractive')
   @DocsEditable()
-  int get domInteractive => _blink.Native_PerformanceTiming_domInteractive_Getter(this);
+  int get domInteractive => _blink.BlinkPerformanceTiming.$domInteractive_Getter(this);
 
   @DomName('PerformanceTiming.domLoading')
   @DocsEditable()
-  int get domLoading => _blink.Native_PerformanceTiming_domLoading_Getter(this);
+  int get domLoading => _blink.BlinkPerformanceTiming.$domLoading_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupEnd')
   @DocsEditable()
-  int get domainLookupEnd => _blink.Native_PerformanceTiming_domainLookupEnd_Getter(this);
+  int get domainLookupEnd => _blink.BlinkPerformanceTiming.$domainLookupEnd_Getter(this);
 
   @DomName('PerformanceTiming.domainLookupStart')
   @DocsEditable()
-  int get domainLookupStart => _blink.Native_PerformanceTiming_domainLookupStart_Getter(this);
+  int get domainLookupStart => _blink.BlinkPerformanceTiming.$domainLookupStart_Getter(this);
 
   @DomName('PerformanceTiming.fetchStart')
   @DocsEditable()
-  int get fetchStart => _blink.Native_PerformanceTiming_fetchStart_Getter(this);
+  int get fetchStart => _blink.BlinkPerformanceTiming.$fetchStart_Getter(this);
 
   @DomName('PerformanceTiming.loadEventEnd')
   @DocsEditable()
-  int get loadEventEnd => _blink.Native_PerformanceTiming_loadEventEnd_Getter(this);
+  int get loadEventEnd => _blink.BlinkPerformanceTiming.$loadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.loadEventStart')
   @DocsEditable()
-  int get loadEventStart => _blink.Native_PerformanceTiming_loadEventStart_Getter(this);
+  int get loadEventStart => _blink.BlinkPerformanceTiming.$loadEventStart_Getter(this);
 
   @DomName('PerformanceTiming.navigationStart')
   @DocsEditable()
-  int get navigationStart => _blink.Native_PerformanceTiming_navigationStart_Getter(this);
+  int get navigationStart => _blink.BlinkPerformanceTiming.$navigationStart_Getter(this);
 
   @DomName('PerformanceTiming.redirectEnd')
   @DocsEditable()
-  int get redirectEnd => _blink.Native_PerformanceTiming_redirectEnd_Getter(this);
+  int get redirectEnd => _blink.BlinkPerformanceTiming.$redirectEnd_Getter(this);
 
   @DomName('PerformanceTiming.redirectStart')
   @DocsEditable()
-  int get redirectStart => _blink.Native_PerformanceTiming_redirectStart_Getter(this);
+  int get redirectStart => _blink.BlinkPerformanceTiming.$redirectStart_Getter(this);
 
   @DomName('PerformanceTiming.requestStart')
   @DocsEditable()
-  int get requestStart => _blink.Native_PerformanceTiming_requestStart_Getter(this);
+  int get requestStart => _blink.BlinkPerformanceTiming.$requestStart_Getter(this);
 
   @DomName('PerformanceTiming.responseEnd')
   @DocsEditable()
-  int get responseEnd => _blink.Native_PerformanceTiming_responseEnd_Getter(this);
+  int get responseEnd => _blink.BlinkPerformanceTiming.$responseEnd_Getter(this);
 
   @DomName('PerformanceTiming.responseStart')
   @DocsEditable()
-  int get responseStart => _blink.Native_PerformanceTiming_responseStart_Getter(this);
+  int get responseStart => _blink.BlinkPerformanceTiming.$responseStart_Getter(this);
 
   @DomName('PerformanceTiming.secureConnectionStart')
   @DocsEditable()
-  int get secureConnectionStart => _blink.Native_PerformanceTiming_secureConnectionStart_Getter(this);
+  int get secureConnectionStart => _blink.BlinkPerformanceTiming.$secureConnectionStart_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventEnd')
   @DocsEditable()
-  int get unloadEventEnd => _blink.Native_PerformanceTiming_unloadEventEnd_Getter(this);
+  int get unloadEventEnd => _blink.BlinkPerformanceTiming.$unloadEventEnd_Getter(this);
 
   @DomName('PerformanceTiming.unloadEventStart')
   @DocsEditable()
-  int get unloadEventStart => _blink.Native_PerformanceTiming_unloadEventStart_Getter(this);
+  int get unloadEventStart => _blink.BlinkPerformanceTiming.$unloadEventStart_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22836,82 +22836,82 @@
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get currentTime => _blink.Native_Player_currentTime_Getter(this);
+  num get currentTime => _blink.BlinkPlayer.$currentTime_Getter(this);
 
   @DomName('Player.currentTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set currentTime(num value) => _blink.Native_Player_currentTime_Setter(this, value);
+  void set currentTime(num value) => _blink.BlinkPlayer.$currentTime_Setter(this, value);
 
   @DomName('Player.finished')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get finished => _blink.Native_Player_finished_Getter(this);
+  bool get finished => _blink.BlinkPlayer.$finished_Getter(this);
 
   @DomName('Player.paused')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get paused => _blink.Native_Player_paused_Getter(this);
+  bool get paused => _blink.BlinkPlayer.$paused_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.Native_Player_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkPlayer.$playbackRate_Getter(this);
 
   @DomName('Player.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.Native_Player_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkPlayer.$playbackRate_Setter(this, value);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  TimedItem get source => _blink.Native_Player_source_Getter(this);
+  TimedItem get source => _blink.BlinkPlayer.$source_Getter(this);
 
   @DomName('Player.source')
   @DocsEditable()
   @Experimental() // untriaged
-  void set source(TimedItem value) => _blink.Native_Player_source_Setter(this, value);
+  void set source(TimedItem value) => _blink.BlinkPlayer.$source_Setter(this, value);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  num get startTime => _blink.Native_Player_startTime_Getter(this);
+  num get startTime => _blink.BlinkPlayer.$startTime_Getter(this);
 
   @DomName('Player.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  void set startTime(num value) => _blink.Native_Player_startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkPlayer.$startTime_Setter(this, value);
 
   @DomName('Player.timeLag')
   @DocsEditable()
   @Experimental() // untriaged
-  double get timeLag => _blink.Native_Player_timeLag_Getter(this);
+  double get timeLag => _blink.BlinkPlayer.$timeLag_Getter(this);
 
   @DomName('Player.cancel')
   @DocsEditable()
   @Experimental() // untriaged
-  void cancel() => _blink.Native_Player_cancel_Callback(this);
+  void cancel() => _blink.BlinkPlayer.$cancel_Callback(this);
 
   @DomName('Player.finish')
   @DocsEditable()
   @Experimental() // untriaged
-  void finish() => _blink.Native_Player_finish_Callback(this);
+  void finish() => _blink.BlinkPlayer.$finish_Callback(this);
 
   @DomName('Player.pause')
   @DocsEditable()
   @Experimental() // untriaged
-  void pause() => _blink.Native_Player_pause_Callback(this);
+  void pause() => _blink.BlinkPlayer.$pause_Callback(this);
 
   @DomName('Player.play')
   @DocsEditable()
   @Experimental() // untriaged
-  void play() => _blink.Native_Player_play_Callback(this);
+  void play() => _blink.BlinkPlayer.$play_Callback(this);
 
   @DomName('Player.reverse')
   @DocsEditable()
   @Experimental() // untriaged
-  void reverse() => _blink.Native_Player_reverse_Callback(this);
+  void reverse() => _blink.BlinkPlayer.$reverse_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22930,31 +22930,31 @@
 
   @DomName('Plugin.description')
   @DocsEditable()
-  String get description => _blink.Native_Plugin_description_Getter(this);
+  String get description => _blink.BlinkPlugin.$description_Getter(this);
 
   @DomName('Plugin.filename')
   @DocsEditable()
-  String get filename => _blink.Native_Plugin_filename_Getter(this);
+  String get filename => _blink.BlinkPlugin.$filename_Getter(this);
 
   @DomName('Plugin.length')
   @DocsEditable()
-  int get length => _blink.Native_Plugin_length_Getter(this);
+  int get length => _blink.BlinkPlugin.$length_Getter(this);
 
   @DomName('Plugin.name')
   @DocsEditable()
-  String get name => _blink.Native_Plugin_name_Getter(this);
+  String get name => _blink.BlinkPlugin.$name_Getter(this);
 
   @DomName('Plugin.__getter__')
   @DocsEditable()
-  MimeType __getter__(String name) => _blink.Native_Plugin___getter___Callback(this, name);
+  MimeType __getter__(String name) => _blink.BlinkPlugin.$__getter___Callback(this, name);
 
   @DomName('Plugin.item')
   @DocsEditable()
-  MimeType item(int index) => _blink.Native_Plugin_item_Callback(this, index);
+  MimeType item(int index) => _blink.BlinkPlugin.$item_Callback(this, index);
 
   @DomName('Plugin.namedItem')
   @DocsEditable()
-  MimeType namedItem(String name) => _blink.Native_Plugin_namedItem_Callback(this, name);
+  MimeType namedItem(String name) => _blink.BlinkPlugin.$namedItem_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -22973,15 +22973,15 @@
 
   @DomName('PluginArray.length')
   @DocsEditable()
-  int get length => _blink.Native_PluginArray_length_Getter(this);
+  int get length => _blink.BlinkPluginArray.$length_Getter(this);
 
   Plugin operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
+    return _blink.BlinkPluginArray.$NativeIndexed_Getter(this, index);
   }
 
-  Plugin _nativeIndexedGetter(int index) => _blink.Native_PluginArray_NativeIndexed_Getter(this, index);
+  Plugin _nativeIndexedGetter(int index) => _blink.BlinkPluginArray.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Plugin value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -23023,19 +23023,19 @@
 
   @DomName('PluginArray.__getter__')
   @DocsEditable()
-  Plugin __getter__(String name) => _blink.Native_PluginArray___getter___Callback(this, name);
+  Plugin __getter__(String name) => _blink.BlinkPluginArray.$__getter___Callback(this, name);
 
   @DomName('PluginArray.item')
   @DocsEditable()
-  Plugin item(int index) => _blink.Native_PluginArray_item_Callback(this, index);
+  Plugin item(int index) => _blink.BlinkPluginArray.$item_Callback(this, index);
 
   @DomName('PluginArray.namedItem')
   @DocsEditable()
-  Plugin namedItem(String name) => _blink.Native_PluginArray_namedItem_Callback(this, name);
+  Plugin namedItem(String name) => _blink.BlinkPluginArray.$namedItem_Callback(this, name);
 
   @DomName('PluginArray.refresh')
   @DocsEditable()
-  void refresh(bool reload) => _blink.Native_PluginArray_refresh_Callback(this, reload);
+  void refresh(bool reload) => _blink.BlinkPluginArray.$refresh_Callback(this, reload);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23057,7 +23057,7 @@
 
   @DomName('PopStateEvent.state')
   @DocsEditable()
-  Object get state => _blink.Native_PopStateEvent_state_Getter(this);
+  Object get state => _blink.BlinkPopStateEvent.$state_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23098,11 +23098,11 @@
 
   @DomName('PositionError.code')
   @DocsEditable()
-  int get code => _blink.Native_PositionError_code_Getter(this);
+  int get code => _blink.BlinkPositionError.$code_Getter(this);
 
   @DomName('PositionError.message')
   @DocsEditable()
-  String get message => _blink.Native_PositionError_message_Getter(this);
+  String get message => _blink.BlinkPositionError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23156,11 +23156,11 @@
   @DomName('ProcessingInstruction.sheet')
   @DocsEditable()
   @Experimental() // non-standard
-  StyleSheet get sheet => _blink.Native_ProcessingInstruction_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkProcessingInstruction.$sheet_Getter(this);
 
   @DomName('ProcessingInstruction.target')
   @DocsEditable()
-  String get target => _blink.Native_ProcessingInstruction_target_Getter(this);
+  String get target => _blink.BlinkProcessingInstruction.$target_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23196,27 +23196,27 @@
   @DomName('HTMLProgressElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLProgressElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLProgressElement.$labels_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  num get max => _blink.Native_HTMLProgressElement_max_Getter(this);
+  num get max => _blink.BlinkHTMLProgressElement.$max_Getter(this);
 
   @DomName('HTMLProgressElement.max')
   @DocsEditable()
-  void set max(num value) => _blink.Native_HTMLProgressElement_max_Setter(this, value);
+  void set max(num value) => _blink.BlinkHTMLProgressElement.$max_Setter(this, value);
 
   @DomName('HTMLProgressElement.position')
   @DocsEditable()
-  double get position => _blink.Native_HTMLProgressElement_position_Getter(this);
+  double get position => _blink.BlinkHTMLProgressElement.$position_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  num get value => _blink.Native_HTMLProgressElement_value_Getter(this);
+  num get value => _blink.BlinkHTMLProgressElement.$value_Getter(this);
 
   @DomName('HTMLProgressElement.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_HTMLProgressElement_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkHTMLProgressElement.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23234,15 +23234,15 @@
 
   @DomName('ProgressEvent.lengthComputable')
   @DocsEditable()
-  bool get lengthComputable => _blink.Native_ProgressEvent_lengthComputable_Getter(this);
+  bool get lengthComputable => _blink.BlinkProgressEvent.$lengthComputable_Getter(this);
 
   @DomName('ProgressEvent.loaded')
   @DocsEditable()
-  int get loaded => _blink.Native_ProgressEvent_loaded_Getter(this);
+  int get loaded => _blink.BlinkProgressEvent.$loaded_Getter(this);
 
   @DomName('ProgressEvent.total')
   @DocsEditable()
-  int get total => _blink.Native_ProgressEvent_total_Getter(this);
+  int get total => _blink.BlinkProgressEvent.$total_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23270,11 +23270,11 @@
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  String get cite => _blink.Native_HTMLQuoteElement_cite_Getter(this);
+  String get cite => _blink.BlinkHTMLQuoteElement.$cite_Getter(this);
 
   @DomName('HTMLQuoteElement.cite')
   @DocsEditable()
-  void set cite(String value) => _blink.Native_HTMLQuoteElement_cite_Setter(this, value);
+  void set cite(String value) => _blink.BlinkHTMLQuoteElement.$cite_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23365,120 +23365,120 @@
 
   @DomName('Range.collapsed')
   @DocsEditable()
-  bool get collapsed => _blink.Native_Range_collapsed_Getter(this);
+  bool get collapsed => _blink.BlinkRange.$collapsed_Getter(this);
 
   @DomName('Range.commonAncestorContainer')
   @DocsEditable()
-  Node get commonAncestorContainer => _blink.Native_Range_commonAncestorContainer_Getter(this);
+  Node get commonAncestorContainer => _blink.BlinkRange.$commonAncestorContainer_Getter(this);
 
   @DomName('Range.endContainer')
   @DocsEditable()
-  Node get endContainer => _blink.Native_Range_endContainer_Getter(this);
+  Node get endContainer => _blink.BlinkRange.$endContainer_Getter(this);
 
   @DomName('Range.endOffset')
   @DocsEditable()
-  int get endOffset => _blink.Native_Range_endOffset_Getter(this);
+  int get endOffset => _blink.BlinkRange.$endOffset_Getter(this);
 
   @DomName('Range.startContainer')
   @DocsEditable()
-  Node get startContainer => _blink.Native_Range_startContainer_Getter(this);
+  Node get startContainer => _blink.BlinkRange.$startContainer_Getter(this);
 
   @DomName('Range.startOffset')
   @DocsEditable()
-  int get startOffset => _blink.Native_Range_startOffset_Getter(this);
+  int get startOffset => _blink.BlinkRange.$startOffset_Getter(this);
 
   @DomName('Range.cloneContents')
   @DocsEditable()
-  DocumentFragment cloneContents() => _blink.Native_Range_cloneContents_Callback(this);
+  DocumentFragment cloneContents() => _blink.BlinkRange.$cloneContents_Callback(this);
 
   @DomName('Range.cloneRange')
   @DocsEditable()
-  Range cloneRange() => _blink.Native_Range_cloneRange_Callback(this);
+  Range cloneRange() => _blink.BlinkRange.$cloneRange_Callback(this);
 
   @DomName('Range.collapse')
   @DocsEditable()
-  void collapse(bool toStart) => _blink.Native_Range_collapse_Callback(this, toStart);
+  void collapse(bool toStart) => _blink.BlinkRange.$collapse_Callback(this, toStart);
 
   @DomName('Range.comparePoint')
   @DocsEditable()
-  int comparePoint(Node refNode, int offset) => _blink.Native_Range_comparePoint_Callback(this, refNode, offset);
+  int comparePoint(Node refNode, int offset) => _blink.BlinkRange.$comparePoint_Callback(this, refNode, offset);
 
   @DomName('Range.createContextualFragment')
   @DocsEditable()
-  DocumentFragment createContextualFragment(String html) => _blink.Native_Range_createContextualFragment_Callback(this, html);
+  DocumentFragment createContextualFragment(String html) => _blink.BlinkRange.$createContextualFragment_Callback(this, html);
 
   @DomName('Range.deleteContents')
   @DocsEditable()
-  void deleteContents() => _blink.Native_Range_deleteContents_Callback(this);
+  void deleteContents() => _blink.BlinkRange.$deleteContents_Callback(this);
 
   @DomName('Range.detach')
   @DocsEditable()
-  void detach() => _blink.Native_Range_detach_Callback(this);
+  void detach() => _blink.BlinkRange.$detach_Callback(this);
 
   @DomName('Range.expand')
   @DocsEditable()
   @Experimental() // non-standard
-  void expand(String unit) => _blink.Native_Range_expand_Callback(this, unit);
+  void expand(String unit) => _blink.BlinkRange.$expand_Callback(this, unit);
 
   @DomName('Range.extractContents')
   @DocsEditable()
-  DocumentFragment extractContents() => _blink.Native_Range_extractContents_Callback(this);
+  DocumentFragment extractContents() => _blink.BlinkRange.$extractContents_Callback(this);
 
   @DomName('Range.getBoundingClientRect')
   @DocsEditable()
-  Rectangle getBoundingClientRect() => _blink.Native_Range_getBoundingClientRect_Callback(this);
+  Rectangle getBoundingClientRect() => _blink.BlinkRange.$getBoundingClientRect_Callback(this);
 
   @DomName('Range.getClientRects')
   @DocsEditable()
-  List<Rectangle> getClientRects() => _blink.Native_Range_getClientRects_Callback(this);
+  List<Rectangle> getClientRects() => _blink.BlinkRange.$getClientRects_Callback(this);
 
   @DomName('Range.insertNode')
   @DocsEditable()
-  void insertNode(Node newNode) => _blink.Native_Range_insertNode_Callback(this, newNode);
+  void insertNode(Node newNode) => _blink.BlinkRange.$insertNode_Callback(this, newNode);
 
   @DomName('Range.isPointInRange')
   @DocsEditable()
-  bool isPointInRange(Node refNode, int offset) => _blink.Native_Range_isPointInRange_Callback(this, refNode, offset);
+  bool isPointInRange(Node refNode, int offset) => _blink.BlinkRange.$isPointInRange_Callback(this, refNode, offset);
 
   @DomName('Range.selectNode')
   @DocsEditable()
-  void selectNode(Node refNode) => _blink.Native_Range_selectNode_Callback(this, refNode);
+  void selectNode(Node refNode) => _blink.BlinkRange.$selectNode_Callback(this, refNode);
 
   @DomName('Range.selectNodeContents')
   @DocsEditable()
-  void selectNodeContents(Node refNode) => _blink.Native_Range_selectNodeContents_Callback(this, refNode);
+  void selectNodeContents(Node refNode) => _blink.BlinkRange.$selectNodeContents_Callback(this, refNode);
 
   @DomName('Range.setEnd')
   @DocsEditable()
-  void setEnd(Node refNode, int offset) => _blink.Native_Range_setEnd_Callback(this, refNode, offset);
+  void setEnd(Node refNode, int offset) => _blink.BlinkRange.$setEnd_Callback(this, refNode, offset);
 
   @DomName('Range.setEndAfter')
   @DocsEditable()
-  void setEndAfter(Node refNode) => _blink.Native_Range_setEndAfter_Callback(this, refNode);
+  void setEndAfter(Node refNode) => _blink.BlinkRange.$setEndAfter_Callback(this, refNode);
 
   @DomName('Range.setEndBefore')
   @DocsEditable()
-  void setEndBefore(Node refNode) => _blink.Native_Range_setEndBefore_Callback(this, refNode);
+  void setEndBefore(Node refNode) => _blink.BlinkRange.$setEndBefore_Callback(this, refNode);
 
   @DomName('Range.setStart')
   @DocsEditable()
-  void setStart(Node refNode, int offset) => _blink.Native_Range_setStart_Callback(this, refNode, offset);
+  void setStart(Node refNode, int offset) => _blink.BlinkRange.$setStart_Callback(this, refNode, offset);
 
   @DomName('Range.setStartAfter')
   @DocsEditable()
-  void setStartAfter(Node refNode) => _blink.Native_Range_setStartAfter_Callback(this, refNode);
+  void setStartAfter(Node refNode) => _blink.BlinkRange.$setStartAfter_Callback(this, refNode);
 
   @DomName('Range.setStartBefore')
   @DocsEditable()
-  void setStartBefore(Node refNode) => _blink.Native_Range_setStartBefore_Callback(this, refNode);
+  void setStartBefore(Node refNode) => _blink.BlinkRange.$setStartBefore_Callback(this, refNode);
 
   @DomName('Range.surroundContents')
   @DocsEditable()
-  void surroundContents(Node newParent) => _blink.Native_Range_surroundContents_Callback(this, newParent);
+  void surroundContents(Node newParent) => _blink.BlinkRange.$surroundContents_Callback(this, newParent);
 
   @DomName('Range.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Range_toString_Callback(this);
+  String toString() => _blink.BlinkRange.$toString_Callback(this);
 
 
   /**
@@ -23516,7 +23516,7 @@
 
   @DomName('ResourceProgressEvent.url')
   @DocsEditable()
-  String get url => _blink.Native_ResourceProgressEvent_url_Getter(this);
+  String get url => _blink.BlinkResourceProgressEvent.$url_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23576,79 +23576,79 @@
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.Native_RTCDataChannel_binaryType_Getter(this);
+  String get binaryType => _blink.BlinkRTCDataChannel.$binaryType_Getter(this);
 
   @DomName('RTCDataChannel.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.Native_RTCDataChannel_binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkRTCDataChannel.$binaryType_Setter(this, value);
 
   @DomName('RTCDataChannel.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.Native_RTCDataChannel_bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkRTCDataChannel.$bufferedAmount_Getter(this);
 
   @DomName('RTCDataChannel.id')
   @DocsEditable()
   @Experimental() // untriaged
-  int get id => _blink.Native_RTCDataChannel_id_Getter(this);
+  int get id => _blink.BlinkRTCDataChannel.$id_Getter(this);
 
   @DomName('RTCDataChannel.label')
   @DocsEditable()
-  String get label => _blink.Native_RTCDataChannel_label_Getter(this);
+  String get label => _blink.BlinkRTCDataChannel.$label_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmitTime')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmitTime => _blink.Native_RTCDataChannel_maxRetransmitTime_Getter(this);
+  int get maxRetransmitTime => _blink.BlinkRTCDataChannel.$maxRetransmitTime_Getter(this);
 
   @DomName('RTCDataChannel.maxRetransmits')
   @DocsEditable()
   @Experimental() // untriaged
-  int get maxRetransmits => _blink.Native_RTCDataChannel_maxRetransmits_Getter(this);
+  int get maxRetransmits => _blink.BlinkRTCDataChannel.$maxRetransmits_Getter(this);
 
   @DomName('RTCDataChannel.negotiated')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get negotiated => _blink.Native_RTCDataChannel_negotiated_Getter(this);
+  bool get negotiated => _blink.BlinkRTCDataChannel.$negotiated_Getter(this);
 
   @DomName('RTCDataChannel.ordered')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get ordered => _blink.Native_RTCDataChannel_ordered_Getter(this);
+  bool get ordered => _blink.BlinkRTCDataChannel.$ordered_Getter(this);
 
   @DomName('RTCDataChannel.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_RTCDataChannel_protocol_Getter(this);
+  String get protocol => _blink.BlinkRTCDataChannel.$protocol_Getter(this);
 
   @DomName('RTCDataChannel.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_RTCDataChannel_readyState_Getter(this);
+  String get readyState => _blink.BlinkRTCDataChannel.$readyState_Getter(this);
 
   @DomName('RTCDataChannel.reliable')
   @DocsEditable()
-  bool get reliable => _blink.Native_RTCDataChannel_reliable_Getter(this);
+  bool get reliable => _blink.BlinkRTCDataChannel.$reliable_Getter(this);
 
   @DomName('RTCDataChannel.close')
   @DocsEditable()
-  void close() => _blink.Native_RTCDataChannel_close_Callback(this);
+  void close() => _blink.BlinkRTCDataChannel.$close_Callback(this);
 
-  void send(data) => _blink.Native_RTCDataChannel_send(this, data);
+  void send(data) => _blink.BlinkRTCDataChannel.$send(this, data);
 
   @DomName('RTCDataChannel.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.Native_RTCDataChannel_sendBlob_Callback(this, data);
+  void sendBlob(Blob data) => _blink.BlinkRTCDataChannel.$sendBlob_Callback(this, data);
 
   @DomName('RTCDataChannel.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.Native_RTCDataChannel_sendByteBuffer_Callback(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkRTCDataChannel.$sendByteBuffer_Callback(this, data);
 
   @DomName('RTCDataChannel.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.Native_RTCDataChannel_sendString_Callback(this, data);
+  void sendString(String data) => _blink.BlinkRTCDataChannel.$sendString_Callback(this, data);
 
   @DomName('RTCDataChannel.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.Native_RTCDataChannel_sendTypedData_Callback(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkRTCDataChannel.$sendTypedData_Callback(this, data);
 
   /// Stream of `close` events handled by this [RtcDataChannel].
   @DomName('RTCDataChannel.onclose')
@@ -23688,7 +23688,7 @@
 
   @DomName('RTCDataChannelEvent.channel')
   @DocsEditable()
-  RtcDataChannel get channel => _blink.Native_RTCDataChannelEvent_channel_Getter(this);
+  RtcDataChannel get channel => _blink.BlinkRTCDataChannelEvent.$channel_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23718,25 +23718,25 @@
 
   @DomName('RTCDTMFSender.canInsertDTMF')
   @DocsEditable()
-  bool get canInsertDtmf => _blink.Native_RTCDTMFSender_canInsertDTMF_Getter(this);
+  bool get canInsertDtmf => _blink.BlinkRTCDTMFSender.$canInsertDTMF_Getter(this);
 
   @DomName('RTCDTMFSender.duration')
   @DocsEditable()
-  int get duration => _blink.Native_RTCDTMFSender_duration_Getter(this);
+  int get duration => _blink.BlinkRTCDTMFSender.$duration_Getter(this);
 
   @DomName('RTCDTMFSender.interToneGap')
   @DocsEditable()
-  int get interToneGap => _blink.Native_RTCDTMFSender_interToneGap_Getter(this);
+  int get interToneGap => _blink.BlinkRTCDTMFSender.$interToneGap_Getter(this);
 
   @DomName('RTCDTMFSender.toneBuffer')
   @DocsEditable()
-  String get toneBuffer => _blink.Native_RTCDTMFSender_toneBuffer_Getter(this);
+  String get toneBuffer => _blink.BlinkRTCDTMFSender.$toneBuffer_Getter(this);
 
   @DomName('RTCDTMFSender.track')
   @DocsEditable()
-  MediaStreamTrack get track => _blink.Native_RTCDTMFSender_track_Getter(this);
+  MediaStreamTrack get track => _blink.BlinkRTCDTMFSender.$track_Getter(this);
 
-  void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.Native_RTCDTMFSender_insertDtmf(this, tones, duration, interToneGap);
+  void insertDtmf(String tones, [int duration, int interToneGap]) => _blink.BlinkRTCDTMFSender.$insertDtmf(this, tones, duration, interToneGap);
 
   /// Stream of `tonechange` events handled by this [RtcDtmfSender].
   @DomName('RTCDTMFSender.ontonechange')
@@ -23761,7 +23761,7 @@
 
   @DomName('RTCDTMFToneChangeEvent.tone')
   @DocsEditable()
-  String get tone => _blink.Native_RTCDTMFToneChangeEvent_tone_Getter(this);
+  String get tone => _blink.BlinkRTCDTMFToneChangeEvent.$tone_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23782,19 +23782,19 @@
 
   @DomName('RTCIceCandidate.RTCIceCandidate')
   @DocsEditable()
-  factory RtcIceCandidate(Map dictionary) => _blink.Native_RTCIceCandidate_RtcIceCandidate(dictionary);
+  factory RtcIceCandidate(Map dictionary) => _blink.BlinkRTCIceCandidate.$mkRtcIceCandidate(dictionary);
 
   @DomName('RTCIceCandidate.candidate')
   @DocsEditable()
-  String get candidate => _blink.Native_RTCIceCandidate_candidate_Getter(this);
+  String get candidate => _blink.BlinkRTCIceCandidate.$candidate_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMLineIndex')
   @DocsEditable()
-  int get sdpMLineIndex => _blink.Native_RTCIceCandidate_sdpMLineIndex_Getter(this);
+  int get sdpMLineIndex => _blink.BlinkRTCIceCandidate.$sdpMLineIndex_Getter(this);
 
   @DomName('RTCIceCandidate.sdpMid')
   @DocsEditable()
-  String get sdpMid => _blink.Native_RTCIceCandidate_sdpMid_Getter(this);
+  String get sdpMid => _blink.BlinkRTCIceCandidate.$sdpMid_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -23814,7 +23814,7 @@
 
   @DomName('RTCIceCandidateEvent.candidate')
   @DocsEditable()
-  RtcIceCandidate get candidate => _blink.Native_RTCIceCandidateEvent_candidate_Getter(this);
+  RtcIceCandidate get candidate => _blink.BlinkRTCIceCandidateEvent.$candidate_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -23930,79 +23930,79 @@
 
   @DomName('RTCPeerConnection.RTCPeerConnection')
   @DocsEditable()
-  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_RtcPeerConnection(rtcIceServers, mediaConstraints);
+  factory RtcPeerConnection(Map rtcIceServers, [Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$mkRtcPeerConnection(rtcIceServers, mediaConstraints);
 
   @DomName('RTCPeerConnection.iceConnectionState')
   @DocsEditable()
-  String get iceConnectionState => _blink.Native_RTCPeerConnection_iceConnectionState_Getter(this);
+  String get iceConnectionState => _blink.BlinkRTCPeerConnection.$iceConnectionState_Getter(this);
 
   @DomName('RTCPeerConnection.iceGatheringState')
   @DocsEditable()
-  String get iceGatheringState => _blink.Native_RTCPeerConnection_iceGatheringState_Getter(this);
+  String get iceGatheringState => _blink.BlinkRTCPeerConnection.$iceGatheringState_Getter(this);
 
   @DomName('RTCPeerConnection.localDescription')
   @DocsEditable()
-  RtcSessionDescription get localDescription => _blink.Native_RTCPeerConnection_localDescription_Getter(this);
+  RtcSessionDescription get localDescription => _blink.BlinkRTCPeerConnection.$localDescription_Getter(this);
 
   @DomName('RTCPeerConnection.remoteDescription')
   @DocsEditable()
-  RtcSessionDescription get remoteDescription => _blink.Native_RTCPeerConnection_remoteDescription_Getter(this);
+  RtcSessionDescription get remoteDescription => _blink.BlinkRTCPeerConnection.$remoteDescription_Getter(this);
 
   @DomName('RTCPeerConnection.signalingState')
   @DocsEditable()
-  String get signalingState => _blink.Native_RTCPeerConnection_signalingState_Getter(this);
+  String get signalingState => _blink.BlinkRTCPeerConnection.$signalingState_Getter(this);
 
   @DomName('RTCPeerConnection.addIceCandidate')
   @DocsEditable()
-  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.Native_RTCPeerConnection_addIceCandidate_Callback(this, candidate, successCallback, failureCallback);
+  void addIceCandidate(RtcIceCandidate candidate, VoidCallback successCallback, _RtcErrorCallback failureCallback) => _blink.BlinkRTCPeerConnection.$addIceCandidate_Callback(this, candidate, successCallback, failureCallback);
 
   @DomName('RTCPeerConnection.addStream')
   @DocsEditable()
-  void addStream(MediaStream stream, [Map mediaConstraints]) => _blink.Native_RTCPeerConnection_addStream_Callback(this, stream, mediaConstraints);
+  void addStream(MediaStream stream, [Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$addStream_Callback(this, stream, mediaConstraints);
 
   @DomName('RTCPeerConnection.close')
   @DocsEditable()
-  void close() => _blink.Native_RTCPeerConnection_close_Callback(this);
+  void close() => _blink.BlinkRTCPeerConnection.$close_Callback(this);
 
   @DomName('RTCPeerConnection.createAnswer')
   @DocsEditable()
-  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createAnswer_Callback(this, successCallback, failureCallback, mediaConstraints);
+  void _createAnswer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$createAnswer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.createDTMFSender')
   @DocsEditable()
-  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.Native_RTCPeerConnection_createDTMFSender_Callback(this, track);
+  RtcDtmfSender createDtmfSender(MediaStreamTrack track) => _blink.BlinkRTCPeerConnection.$createDTMFSender_Callback(this, track);
 
   @DomName('RTCPeerConnection.createDataChannel')
   @DocsEditable()
-  RtcDataChannel createDataChannel(String label, [Map options]) => _blink.Native_RTCPeerConnection_createDataChannel_Callback(this, label, options);
+  RtcDataChannel createDataChannel(String label, [Map options]) => _blink.BlinkRTCPeerConnection.$createDataChannel_Callback(this, label, options);
 
   @DomName('RTCPeerConnection.createOffer')
   @DocsEditable()
-  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_createOffer_Callback(this, successCallback, failureCallback, mediaConstraints);
+  void _createOffer(_RtcSessionDescriptionCallback successCallback, [_RtcErrorCallback failureCallback, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$createOffer_Callback(this, successCallback, failureCallback, mediaConstraints);
 
   @DomName('RTCPeerConnection.getLocalStreams')
   @DocsEditable()
-  List<MediaStream> getLocalStreams() => _blink.Native_RTCPeerConnection_getLocalStreams_Callback(this);
+  List<MediaStream> getLocalStreams() => _blink.BlinkRTCPeerConnection.$getLocalStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getRemoteStreams')
   @DocsEditable()
-  List<MediaStream> getRemoteStreams() => _blink.Native_RTCPeerConnection_getRemoteStreams_Callback(this);
+  List<MediaStream> getRemoteStreams() => _blink.BlinkRTCPeerConnection.$getRemoteStreams_Callback(this);
 
   @DomName('RTCPeerConnection.getStats')
   @DocsEditable()
-  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.Native_RTCPeerConnection_getStats_Callback(this, successCallback, selector);
+  void _getStats(RtcStatsCallback successCallback, MediaStreamTrack selector) => _blink.BlinkRTCPeerConnection.$getStats_Callback(this, successCallback, selector);
 
   @DomName('RTCPeerConnection.getStreamById')
   @DocsEditable()
-  MediaStream getStreamById(String streamId) => _blink.Native_RTCPeerConnection_getStreamById_Callback(this, streamId);
+  MediaStream getStreamById(String streamId) => _blink.BlinkRTCPeerConnection.$getStreamById_Callback(this, streamId);
 
   @DomName('RTCPeerConnection.removeStream')
   @DocsEditable()
-  void removeStream(MediaStream stream) => _blink.Native_RTCPeerConnection_removeStream_Callback(this, stream);
+  void removeStream(MediaStream stream) => _blink.BlinkRTCPeerConnection.$removeStream_Callback(this, stream);
 
   @DomName('RTCPeerConnection.setLocalDescription')
   @DocsEditable()
-  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setLocalDescription_Callback(this, description, successCallback, failureCallback);
+  void _setLocalDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.$setLocalDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setLocalDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24014,7 +24014,7 @@
 
   @DomName('RTCPeerConnection.setRemoteDescription')
   @DocsEditable()
-  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.Native_RTCPeerConnection_setRemoteDescription_Callback(this, description, successCallback, failureCallback);
+  void _setRemoteDescription(RtcSessionDescription description, [VoidCallback successCallback, _RtcErrorCallback failureCallback]) => _blink.BlinkRTCPeerConnection.$setRemoteDescription_Callback(this, description, successCallback, failureCallback);
 
   Future setRemoteDescription(RtcSessionDescription description) {
     var completer = new Completer();
@@ -24026,7 +24026,7 @@
 
   @DomName('RTCPeerConnection.updateIce')
   @DocsEditable()
-  void updateIce([Map configuration, Map mediaConstraints]) => _blink.Native_RTCPeerConnection_updateIce_Callback(this, configuration, mediaConstraints);
+  void updateIce([Map configuration, Map mediaConstraints]) => _blink.BlinkRTCPeerConnection.$updateIce_Callback(this, configuration, mediaConstraints);
 
   /// Stream of `addstream` events handled by this [RtcPeerConnection].
   @DomName('RTCPeerConnection.onaddstream')
@@ -24082,23 +24082,23 @@
 
   @DomName('RTCSessionDescription.RTCSessionDescription')
   @DocsEditable()
-  factory RtcSessionDescription([Map descriptionInitDict]) => _blink.Native_RTCSessionDescription_RtcSessionDescription(descriptionInitDict);
+  factory RtcSessionDescription([Map descriptionInitDict]) => _blink.BlinkRTCSessionDescription.$mkRtcSessionDescription(descriptionInitDict);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  String get sdp => _blink.Native_RTCSessionDescription_sdp_Getter(this);
+  String get sdp => _blink.BlinkRTCSessionDescription.$sdp_Getter(this);
 
   @DomName('RTCSessionDescription.sdp')
   @DocsEditable()
-  void set sdp(String value) => _blink.Native_RTCSessionDescription_sdp_Setter(this, value);
+  void set sdp(String value) => _blink.BlinkRTCSessionDescription.$sdp_Setter(this, value);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  String get type => _blink.Native_RTCSessionDescription_type_Getter(this);
+  String get type => _blink.BlinkRTCSessionDescription.$type_Getter(this);
 
   @DomName('RTCSessionDescription.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_RTCSessionDescription_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkRTCSessionDescription.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24118,31 +24118,31 @@
 
   @DomName('RTCStatsReport.id')
   @DocsEditable()
-  String get id => _blink.Native_RTCStatsReport_id_Getter(this);
+  String get id => _blink.BlinkRTCStatsReport.$id_Getter(this);
 
   @DomName('RTCStatsReport.local')
   @DocsEditable()
-  RtcStatsReport get local => _blink.Native_RTCStatsReport_local_Getter(this);
+  RtcStatsReport get local => _blink.BlinkRTCStatsReport.$local_Getter(this);
 
   @DomName('RTCStatsReport.remote')
   @DocsEditable()
-  RtcStatsReport get remote => _blink.Native_RTCStatsReport_remote_Getter(this);
+  RtcStatsReport get remote => _blink.BlinkRTCStatsReport.$remote_Getter(this);
 
   @DomName('RTCStatsReport.timestamp')
   @DocsEditable()
-  DateTime get timestamp => _blink.Native_RTCStatsReport_timestamp_Getter(this);
+  DateTime get timestamp => _blink.BlinkRTCStatsReport.$timestamp_Getter(this);
 
   @DomName('RTCStatsReport.type')
   @DocsEditable()
-  String get type => _blink.Native_RTCStatsReport_type_Getter(this);
+  String get type => _blink.BlinkRTCStatsReport.$type_Getter(this);
 
   @DomName('RTCStatsReport.names')
   @DocsEditable()
-  List<String> names() => _blink.Native_RTCStatsReport_names_Callback(this);
+  List<String> names() => _blink.BlinkRTCStatsReport.$names_Callback(this);
 
   @DomName('RTCStatsReport.stat')
   @DocsEditable()
-  String stat(String name) => _blink.Native_RTCStatsReport_stat_Callback(this, name);
+  String stat(String name) => _blink.BlinkRTCStatsReport.$stat_Callback(this, name);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24162,15 +24162,15 @@
 
   @DomName('RTCStatsResponse.__getter__')
   @DocsEditable()
-  RtcStatsReport __getter__(String name) => _blink.Native_RTCStatsResponse___getter___Callback(this, name);
+  RtcStatsReport __getter__(String name) => _blink.BlinkRTCStatsResponse.$__getter___Callback(this, name);
 
   @DomName('RTCStatsResponse.namedItem')
   @DocsEditable()
-  RtcStatsReport namedItem(String name) => _blink.Native_RTCStatsResponse_namedItem_Callback(this, name);
+  RtcStatsReport namedItem(String name) => _blink.BlinkRTCStatsResponse.$namedItem_Callback(this, name);
 
   @DomName('RTCStatsResponse.result')
   @DocsEditable()
-  List<RtcStatsReport> result() => _blink.Native_RTCStatsResponse_result_Callback(this);
+  List<RtcStatsReport> result() => _blink.BlinkRTCStatsResponse.$result_Callback(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -24193,52 +24193,52 @@
 
   @DomName('Screen.availHeight')
   @DocsEditable()
-  int get _availHeight => _blink.Native_Screen_availHeight_Getter(this);
+  int get _availHeight => _blink.BlinkScreen.$availHeight_Getter(this);
 
   @DomName('Screen.availLeft')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availLeft => _blink.Native_Screen_availLeft_Getter(this);
+  int get _availLeft => _blink.BlinkScreen.$availLeft_Getter(this);
 
   @DomName('Screen.availTop')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get _availTop => _blink.Native_Screen_availTop_Getter(this);
+  int get _availTop => _blink.BlinkScreen.$availTop_Getter(this);
 
   @DomName('Screen.availWidth')
   @DocsEditable()
-  int get _availWidth => _blink.Native_Screen_availWidth_Getter(this);
+  int get _availWidth => _blink.BlinkScreen.$availWidth_Getter(this);
 
   @DomName('Screen.colorDepth')
   @DocsEditable()
-  int get colorDepth => _blink.Native_Screen_colorDepth_Getter(this);
+  int get colorDepth => _blink.BlinkScreen.$colorDepth_Getter(this);
 
   @DomName('Screen.height')
   @DocsEditable()
-  int get height => _blink.Native_Screen_height_Getter(this);
+  int get height => _blink.BlinkScreen.$height_Getter(this);
 
   @DomName('Screen.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  String get orientation => _blink.Native_Screen_orientation_Getter(this);
+  String get orientation => _blink.BlinkScreen.$orientation_Getter(this);
 
   @DomName('Screen.pixelDepth')
   @DocsEditable()
-  int get pixelDepth => _blink.Native_Screen_pixelDepth_Getter(this);
+  int get pixelDepth => _blink.BlinkScreen.$pixelDepth_Getter(this);
 
   @DomName('Screen.width')
   @DocsEditable()
-  int get width => _blink.Native_Screen_width_Getter(this);
+  int get width => _blink.BlinkScreen.$width_Getter(this);
 
   @DomName('Screen.lockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  bool lockOrientation(String orientation) => _blink.Native_Screen_lockOrientation_Callback(this, orientation);
+  bool lockOrientation(String orientation) => _blink.BlinkScreen.$lockOrientation_Callback(this, orientation);
 
   @DomName('Screen.unlockOrientation')
   @DocsEditable()
   @Experimental() // untriaged
-  void unlockOrientation() => _blink.Native_Screen_unlockOrientation_Callback(this);
+  void unlockOrientation() => _blink.BlinkScreen.$unlockOrientation_Callback(this);
 }
 // 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
@@ -24265,67 +24265,67 @@
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  bool get async => _blink.Native_HTMLScriptElement_async_Getter(this);
+  bool get async => _blink.BlinkHTMLScriptElement.$async_Getter(this);
 
   @DomName('HTMLScriptElement.async')
   @DocsEditable()
-  void set async(bool value) => _blink.Native_HTMLScriptElement_async_Setter(this, value);
+  void set async(bool value) => _blink.BlinkHTMLScriptElement.$async_Setter(this, value);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  String get charset => _blink.Native_HTMLScriptElement_charset_Getter(this);
+  String get charset => _blink.BlinkHTMLScriptElement.$charset_Getter(this);
 
   @DomName('HTMLScriptElement.charset')
   @DocsEditable()
-  void set charset(String value) => _blink.Native_HTMLScriptElement_charset_Setter(this, value);
+  void set charset(String value) => _blink.BlinkHTMLScriptElement.$charset_Setter(this, value);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  String get crossOrigin => _blink.Native_HTMLScriptElement_crossOrigin_Getter(this);
+  String get crossOrigin => _blink.BlinkHTMLScriptElement.$crossOrigin_Getter(this);
 
   @DomName('HTMLScriptElement.crossOrigin')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/scripting-1.html#attr-script-crossorigin
   @Experimental()
-  void set crossOrigin(String value) => _blink.Native_HTMLScriptElement_crossOrigin_Setter(this, value);
+  void set crossOrigin(String value) => _blink.BlinkHTMLScriptElement.$crossOrigin_Setter(this, value);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  bool get defer => _blink.Native_HTMLScriptElement_defer_Getter(this);
+  bool get defer => _blink.BlinkHTMLScriptElement.$defer_Getter(this);
 
   @DomName('HTMLScriptElement.defer')
   @DocsEditable()
-  void set defer(bool value) => _blink.Native_HTMLScriptElement_defer_Setter(this, value);
+  void set defer(bool value) => _blink.BlinkHTMLScriptElement.$defer_Setter(this, value);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  String get nonce => _blink.Native_HTMLScriptElement_nonce_Getter(this);
+  String get nonce => _blink.BlinkHTMLScriptElement.$nonce_Getter(this);
 
   @DomName('HTMLScriptElement.nonce')
   @DocsEditable()
   // https://dvcs.w3.org/hg/content-security-policy/raw-file/tip/csp-specification.dev.html#interaction-with-the-script-src-directive
   @Experimental()
-  void set nonce(String value) => _blink.Native_HTMLScriptElement_nonce_Setter(this, value);
+  void set nonce(String value) => _blink.BlinkHTMLScriptElement.$nonce_Setter(this, value);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLScriptElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLScriptElement.$src_Getter(this);
 
   @DomName('HTMLScriptElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLScriptElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLScriptElement.$src_Setter(this, value);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLScriptElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLScriptElement.$type_Getter(this);
 
   @DomName('HTMLScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLScriptElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLScriptElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24345,44 +24345,44 @@
 
   @DomName('SecurityPolicyViolationEvent.blockedURI')
   @DocsEditable()
-  String get blockedUri => _blink.Native_SecurityPolicyViolationEvent_blockedURI_Getter(this);
+  String get blockedUri => _blink.BlinkSecurityPolicyViolationEvent.$blockedURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.columnNumber')
   @DocsEditable()
-  int get columnNumber => _blink.Native_SecurityPolicyViolationEvent_columnNumber_Getter(this);
+  int get columnNumber => _blink.BlinkSecurityPolicyViolationEvent.$columnNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.documentURI')
   @DocsEditable()
-  String get documentUri => _blink.Native_SecurityPolicyViolationEvent_documentURI_Getter(this);
+  String get documentUri => _blink.BlinkSecurityPolicyViolationEvent.$documentURI_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.effectiveDirective')
   @DocsEditable()
-  String get effectiveDirective => _blink.Native_SecurityPolicyViolationEvent_effectiveDirective_Getter(this);
+  String get effectiveDirective => _blink.BlinkSecurityPolicyViolationEvent.$effectiveDirective_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.lineNumber')
   @DocsEditable()
-  int get lineNumber => _blink.Native_SecurityPolicyViolationEvent_lineNumber_Getter(this);
+  int get lineNumber => _blink.BlinkSecurityPolicyViolationEvent.$lineNumber_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.originalPolicy')
   @DocsEditable()
-  String get originalPolicy => _blink.Native_SecurityPolicyViolationEvent_originalPolicy_Getter(this);
+  String get originalPolicy => _blink.BlinkSecurityPolicyViolationEvent.$originalPolicy_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.referrer')
   @DocsEditable()
-  String get referrer => _blink.Native_SecurityPolicyViolationEvent_referrer_Getter(this);
+  String get referrer => _blink.BlinkSecurityPolicyViolationEvent.$referrer_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.sourceFile')
   @DocsEditable()
-  String get sourceFile => _blink.Native_SecurityPolicyViolationEvent_sourceFile_Getter(this);
+  String get sourceFile => _blink.BlinkSecurityPolicyViolationEvent.$sourceFile_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.statusCode')
   @DocsEditable()
   @Experimental() // untriaged
-  int get statusCode => _blink.Native_SecurityPolicyViolationEvent_statusCode_Getter(this);
+  int get statusCode => _blink.BlinkSecurityPolicyViolationEvent.$statusCode_Getter(this);
 
   @DomName('SecurityPolicyViolationEvent.violatedDirective')
   @DocsEditable()
-  String get violatedDirective => _blink.Native_SecurityPolicyViolationEvent_violatedDirective_Getter(this);
+  String get violatedDirective => _blink.BlinkSecurityPolicyViolationEvent.$violatedDirective_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24407,120 +24407,120 @@
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLSelectElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLSelectElement.$autofocus_Getter(this);
 
   @DomName('HTMLSelectElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLSelectElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLSelectElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLSelectElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLSelectElement.$disabled_Getter(this);
 
   @DomName('HTMLSelectElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLSelectElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLSelectElement.$disabled_Setter(this, value);
 
   @DomName('HTMLSelectElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLSelectElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLSelectElement.$form_Getter(this);
 
   @DomName('HTMLSelectElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLSelectElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLSelectElement.$labels_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  int get length => _blink.Native_HTMLSelectElement_length_Getter(this);
+  int get length => _blink.BlinkHTMLSelectElement.$length_Getter(this);
 
   @DomName('HTMLSelectElement.length')
   @DocsEditable()
-  void set length(int value) => _blink.Native_HTMLSelectElement_length_Setter(this, value);
+  void set length(int value) => _blink.BlinkHTMLSelectElement.$length_Setter(this, value);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  bool get multiple => _blink.Native_HTMLSelectElement_multiple_Getter(this);
+  bool get multiple => _blink.BlinkHTMLSelectElement.$multiple_Getter(this);
 
   @DomName('HTMLSelectElement.multiple')
   @DocsEditable()
-  void set multiple(bool value) => _blink.Native_HTMLSelectElement_multiple_Setter(this, value);
+  void set multiple(bool value) => _blink.BlinkHTMLSelectElement.$multiple_Setter(this, value);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLSelectElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLSelectElement.$name_Getter(this);
 
   @DomName('HTMLSelectElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLSelectElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLSelectElement.$name_Setter(this, value);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLSelectElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLSelectElement.$required_Getter(this);
 
   @DomName('HTMLSelectElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLSelectElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLSelectElement.$required_Setter(this, value);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  int get selectedIndex => _blink.Native_HTMLSelectElement_selectedIndex_Getter(this);
+  int get selectedIndex => _blink.BlinkHTMLSelectElement.$selectedIndex_Getter(this);
 
   @DomName('HTMLSelectElement.selectedIndex')
   @DocsEditable()
-  void set selectedIndex(int value) => _blink.Native_HTMLSelectElement_selectedIndex_Setter(this, value);
+  void set selectedIndex(int value) => _blink.BlinkHTMLSelectElement.$selectedIndex_Setter(this, value);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  int get size => _blink.Native_HTMLSelectElement_size_Getter(this);
+  int get size => _blink.BlinkHTMLSelectElement.$size_Getter(this);
 
   @DomName('HTMLSelectElement.size')
   @DocsEditable()
-  void set size(int value) => _blink.Native_HTMLSelectElement_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkHTMLSelectElement.$size_Setter(this, value);
 
   @DomName('HTMLSelectElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLSelectElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLSelectElement.$type_Getter(this);
 
   @DomName('HTMLSelectElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLSelectElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLSelectElement.$validationMessage_Getter(this);
 
   @DomName('HTMLSelectElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLSelectElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLSelectElement.$validity_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLSelectElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLSelectElement.$value_Getter(this);
 
   @DomName('HTMLSelectElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLSelectElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLSelectElement.$value_Setter(this, value);
 
   @DomName('HTMLSelectElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLSelectElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLSelectElement.$willValidate_Getter(this);
 
   @DomName('HTMLSelectElement.__setter__')
   @DocsEditable()
-  void __setter__(int index, OptionElement value) => _blink.Native_HTMLSelectElement___setter___Callback(this, index, value);
+  void __setter__(int index, OptionElement value) => _blink.BlinkHTMLSelectElement.$__setter___Callback(this, index, value);
 
   @DomName('HTMLSelectElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLSelectElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLSelectElement.$checkValidity_Callback(this);
 
   @DomName('HTMLSelectElement.item')
   @DocsEditable()
-  Element item(int index) => _blink.Native_HTMLSelectElement_item_Callback(this, index);
+  Element item(int index) => _blink.BlinkHTMLSelectElement.$item_Callback(this, index);
 
   @DomName('HTMLSelectElement.namedItem')
   @DocsEditable()
-  Element namedItem(String name) => _blink.Native_HTMLSelectElement_namedItem_Callback(this, name);
+  Element namedItem(String name) => _blink.BlinkHTMLSelectElement.$namedItem_Callback(this, name);
 
   @DomName('HTMLSelectElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLSelectElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLSelectElement.$setCustomValidity_Callback(this, error);
 
 
   // Override default options, since IE returns SelectElement itself and it
@@ -24556,117 +24556,117 @@
 
   @DomName('Selection.anchorNode')
   @DocsEditable()
-  Node get anchorNode => _blink.Native_Selection_anchorNode_Getter(this);
+  Node get anchorNode => _blink.BlinkSelection.$anchorNode_Getter(this);
 
   @DomName('Selection.anchorOffset')
   @DocsEditable()
-  int get anchorOffset => _blink.Native_Selection_anchorOffset_Getter(this);
+  int get anchorOffset => _blink.BlinkSelection.$anchorOffset_Getter(this);
 
   @DomName('Selection.baseNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get baseNode => _blink.Native_Selection_baseNode_Getter(this);
+  Node get baseNode => _blink.BlinkSelection.$baseNode_Getter(this);
 
   @DomName('Selection.baseOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get baseOffset => _blink.Native_Selection_baseOffset_Getter(this);
+  int get baseOffset => _blink.BlinkSelection.$baseOffset_Getter(this);
 
   @DomName('Selection.extentNode')
   @DocsEditable()
   @Experimental() // non-standard
-  Node get extentNode => _blink.Native_Selection_extentNode_Getter(this);
+  Node get extentNode => _blink.BlinkSelection.$extentNode_Getter(this);
 
   @DomName('Selection.extentOffset')
   @DocsEditable()
   @Experimental() // non-standard
-  int get extentOffset => _blink.Native_Selection_extentOffset_Getter(this);
+  int get extentOffset => _blink.BlinkSelection.$extentOffset_Getter(this);
 
   @DomName('Selection.focusNode')
   @DocsEditable()
-  Node get focusNode => _blink.Native_Selection_focusNode_Getter(this);
+  Node get focusNode => _blink.BlinkSelection.$focusNode_Getter(this);
 
   @DomName('Selection.focusOffset')
   @DocsEditable()
-  int get focusOffset => _blink.Native_Selection_focusOffset_Getter(this);
+  int get focusOffset => _blink.BlinkSelection.$focusOffset_Getter(this);
 
   @DomName('Selection.isCollapsed')
   @DocsEditable()
-  bool get isCollapsed => _blink.Native_Selection_isCollapsed_Getter(this);
+  bool get isCollapsed => _blink.BlinkSelection.$isCollapsed_Getter(this);
 
   @DomName('Selection.rangeCount')
   @DocsEditable()
-  int get rangeCount => _blink.Native_Selection_rangeCount_Getter(this);
+  int get rangeCount => _blink.BlinkSelection.$rangeCount_Getter(this);
 
   @DomName('Selection.type')
   @DocsEditable()
   @Experimental() // non-standard
-  String get type => _blink.Native_Selection_type_Getter(this);
+  String get type => _blink.BlinkSelection.$type_Getter(this);
 
   @DomName('Selection.addRange')
   @DocsEditable()
-  void addRange(Range range) => _blink.Native_Selection_addRange_Callback(this, range);
+  void addRange(Range range) => _blink.BlinkSelection.$addRange_Callback(this, range);
 
   @DomName('Selection.collapse')
   @DocsEditable()
-  void collapse(Node node, int index) => _blink.Native_Selection_collapse_Callback(this, node, index);
+  void collapse(Node node, int index) => _blink.BlinkSelection.$collapse_Callback(this, node, index);
 
   @DomName('Selection.collapseToEnd')
   @DocsEditable()
-  void collapseToEnd() => _blink.Native_Selection_collapseToEnd_Callback(this);
+  void collapseToEnd() => _blink.BlinkSelection.$collapseToEnd_Callback(this);
 
   @DomName('Selection.collapseToStart')
   @DocsEditable()
-  void collapseToStart() => _blink.Native_Selection_collapseToStart_Callback(this);
+  void collapseToStart() => _blink.BlinkSelection.$collapseToStart_Callback(this);
 
   @DomName('Selection.containsNode')
   @DocsEditable()
   @Experimental() // non-standard
-  bool containsNode(Node node, bool allowPartial) => _blink.Native_Selection_containsNode_Callback(this, node, allowPartial);
+  bool containsNode(Node node, bool allowPartial) => _blink.BlinkSelection.$containsNode_Callback(this, node, allowPartial);
 
   @DomName('Selection.deleteFromDocument')
   @DocsEditable()
-  void deleteFromDocument() => _blink.Native_Selection_deleteFromDocument_Callback(this);
+  void deleteFromDocument() => _blink.BlinkSelection.$deleteFromDocument_Callback(this);
 
   @DomName('Selection.empty')
   @DocsEditable()
   @Experimental() // non-standard
-  void empty() => _blink.Native_Selection_empty_Callback(this);
+  void empty() => _blink.BlinkSelection.$empty_Callback(this);
 
   @DomName('Selection.extend')
   @DocsEditable()
-  void extend(Node node, int offset) => _blink.Native_Selection_extend_Callback(this, node, offset);
+  void extend(Node node, int offset) => _blink.BlinkSelection.$extend_Callback(this, node, offset);
 
   @DomName('Selection.getRangeAt')
   @DocsEditable()
-  Range getRangeAt(int index) => _blink.Native_Selection_getRangeAt_Callback(this, index);
+  Range getRangeAt(int index) => _blink.BlinkSelection.$getRangeAt_Callback(this, index);
 
   @DomName('Selection.modify')
   @DocsEditable()
   @Experimental() // non-standard
-  void modify(String alter, String direction, String granularity) => _blink.Native_Selection_modify_Callback(this, alter, direction, granularity);
+  void modify(String alter, String direction, String granularity) => _blink.BlinkSelection.$modify_Callback(this, alter, direction, granularity);
 
   @DomName('Selection.removeAllRanges')
   @DocsEditable()
-  void removeAllRanges() => _blink.Native_Selection_removeAllRanges_Callback(this);
+  void removeAllRanges() => _blink.BlinkSelection.$removeAllRanges_Callback(this);
 
   @DomName('Selection.selectAllChildren')
   @DocsEditable()
-  void selectAllChildren(Node node) => _blink.Native_Selection_selectAllChildren_Callback(this, node);
+  void selectAllChildren(Node node) => _blink.BlinkSelection.$selectAllChildren_Callback(this, node);
 
   @DomName('Selection.setBaseAndExtent')
   @DocsEditable()
   @Experimental() // non-standard
-  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.Native_Selection_setBaseAndExtent_Callback(this, baseNode, baseOffset, extentNode, extentOffset);
+  void setBaseAndExtent(Node baseNode, int baseOffset, Node extentNode, int extentOffset) => _blink.BlinkSelection.$setBaseAndExtent_Callback(this, baseNode, baseOffset, extentNode, extentOffset);
 
   @DomName('Selection.setPosition')
   @DocsEditable()
   @Experimental() // non-standard
-  void setPosition(Node node, int offset) => _blink.Native_Selection_setPosition_Callback(this, node, offset);
+  void setPosition(Node node, int offset) => _blink.BlinkSelection.$setPosition_Callback(this, node, offset);
 
   @DomName('Selection.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Selection_toString_Callback(this);
+  String toString() => _blink.BlinkSelection.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24730,16 +24730,16 @@
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  bool get resetStyleInheritance => _blink.Native_HTMLShadowElement_resetStyleInheritance_Getter(this);
+  bool get resetStyleInheritance => _blink.BlinkHTMLShadowElement.$resetStyleInheritance_Getter(this);
 
   @DomName('HTMLShadowElement.resetStyleInheritance')
   @DocsEditable()
-  void set resetStyleInheritance(bool value) => _blink.Native_HTMLShadowElement_resetStyleInheritance_Setter(this, value);
+  void set resetStyleInheritance(bool value) => _blink.BlinkHTMLShadowElement.$resetStyleInheritance_Setter(this, value);
 
   @DomName('HTMLShadowElement.getDistributedNodes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDistributedNodes() => _blink.Native_HTMLShadowElement_getDistributedNodes_Callback(this);
+  List<Node> getDistributedNodes() => _blink.BlinkHTMLShadowElement.$getDistributedNodes_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -24759,62 +24759,62 @@
 
   @DomName('ShadowRoot.activeElement')
   @DocsEditable()
-  Element get activeElement => _blink.Native_ShadowRoot_activeElement_Getter(this);
+  Element get activeElement => _blink.BlinkShadowRoot.$activeElement_Getter(this);
 
   @DomName('ShadowRoot.host')
   @DocsEditable()
   @Experimental() // untriaged
-  Element get host => _blink.Native_ShadowRoot_host_Getter(this);
+  Element get host => _blink.BlinkShadowRoot.$host_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  String get innerHtml => _blink.Native_ShadowRoot_innerHTML_Getter(this);
+  String get innerHtml => _blink.BlinkShadowRoot.$innerHTML_Getter(this);
 
   @DomName('ShadowRoot.innerHTML')
   @DocsEditable()
-  void set innerHtml(String value) => _blink.Native_ShadowRoot_innerHTML_Setter(this, value);
+  void set innerHtml(String value) => _blink.BlinkShadowRoot.$innerHTML_Setter(this, value);
 
   @DomName('ShadowRoot.olderShadowRoot')
   @DocsEditable()
   @Experimental() // untriaged
-  ShadowRoot get olderShadowRoot => _blink.Native_ShadowRoot_olderShadowRoot_Getter(this);
+  ShadowRoot get olderShadowRoot => _blink.BlinkShadowRoot.$olderShadowRoot_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  bool get _resetStyleInheritance => _blink.Native_ShadowRoot_resetStyleInheritance_Getter(this);
+  bool get _resetStyleInheritance => _blink.BlinkShadowRoot.$resetStyleInheritance_Getter(this);
 
   @DomName('ShadowRoot.resetStyleInheritance')
   @DocsEditable()
-  void set _resetStyleInheritance(bool value) => _blink.Native_ShadowRoot_resetStyleInheritance_Setter(this, value);
+  void set _resetStyleInheritance(bool value) => _blink.BlinkShadowRoot.$resetStyleInheritance_Setter(this, value);
 
   @DomName('ShadowRoot.styleSheets')
   @DocsEditable()
   @Experimental() // untriaged
-  List<StyleSheet> get styleSheets => _blink.Native_ShadowRoot_styleSheets_Getter(this);
+  List<StyleSheet> get styleSheets => _blink.BlinkShadowRoot.$styleSheets_Getter(this);
 
   @DomName('ShadowRoot.cloneNode')
   @DocsEditable()
-  Node clone(bool deep) => _blink.Native_ShadowRoot_cloneNode_Callback(this, deep);
+  Node clone(bool deep) => _blink.BlinkShadowRoot.$cloneNode_Callback(this, deep);
 
   @DomName('ShadowRoot.elementFromPoint')
   @DocsEditable()
-  Element elementFromPoint(int x, int y) => _blink.Native_ShadowRoot_elementFromPoint_Callback(this, x, y);
+  Element elementFromPoint(int x, int y) => _blink.BlinkShadowRoot.$elementFromPoint_Callback(this, x, y);
 
   @DomName('ShadowRoot.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_ShadowRoot_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkShadowRoot.$getElementById_Callback(this, elementId);
 
   @DomName('ShadowRoot.getElementsByClassName')
   @DocsEditable()
-  List<Node> getElementsByClassName(String className) => _blink.Native_ShadowRoot_getElementsByClassName_Callback(this, className);
+  List<Node> getElementsByClassName(String className) => _blink.BlinkShadowRoot.$getElementsByClassName_Callback(this, className);
 
   @DomName('ShadowRoot.getElementsByTagName')
   @DocsEditable()
-  List<Node> getElementsByTagName(String tagName) => _blink.Native_ShadowRoot_getElementsByTagName_Callback(this, tagName);
+  List<Node> getElementsByTagName(String tagName) => _blink.BlinkShadowRoot.$getElementsByTagName_Callback(this, tagName);
 
   @DomName('ShadowRoot.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.Native_ShadowRoot_getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkShadowRoot.$getSelection_Callback(this);
 
   static final bool supported = true;
 
@@ -24875,16 +24875,16 @@
 
   @DomName('SharedWorker.SharedWorker')
   @DocsEditable()
-  factory SharedWorker(String scriptURL, [String name]) => _blink.Native_SharedWorker_SharedWorker(scriptURL, name);
+  factory SharedWorker(String scriptURL, [String name]) => _blink.BlinkSharedWorker.$mkSharedWorker(scriptURL, name);
 
   @DomName('SharedWorker.port')
   @DocsEditable()
-  MessagePort get port => _blink.Native_SharedWorker_port_Getter(this);
+  MessagePort get port => _blink.BlinkSharedWorker.$port_Getter(this);
 
   @DomName('SharedWorker.workerStart')
   @DocsEditable()
   @Experimental() // untriaged
-  double get workerStart => _blink.Native_SharedWorker_workerStart_Getter(this);
+  double get workerStart => _blink.BlinkSharedWorker.$workerStart_Getter(this);
 
   @DomName('SharedWorker.onerror')
   @DocsEditable()
@@ -24920,7 +24920,7 @@
   @DomName('SharedWorkerGlobalScope.name')
   @DocsEditable()
   @Experimental() // untriaged
-  String get name => _blink.Native_SharedWorkerGlobalScope_name_Getter(this);
+  String get name => _blink.BlinkSharedWorkerGlobalScope.$name_Getter(this);
 
   /// Stream of `connect` events handled by this [SharedWorkerGlobalScope].
   @DomName('SharedWorkerGlobalScope.onconnect')
@@ -24947,70 +24947,70 @@
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowEnd => _blink.Native_SourceBuffer_appendWindowEnd_Getter(this);
+  num get appendWindowEnd => _blink.BlinkSourceBuffer.$appendWindowEnd_Getter(this);
 
   @DomName('SourceBuffer.appendWindowEnd')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowEnd(num value) => _blink.Native_SourceBuffer_appendWindowEnd_Setter(this, value);
+  void set appendWindowEnd(num value) => _blink.BlinkSourceBuffer.$appendWindowEnd_Setter(this, value);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get appendWindowStart => _blink.Native_SourceBuffer_appendWindowStart_Getter(this);
+  num get appendWindowStart => _blink.BlinkSourceBuffer.$appendWindowStart_Getter(this);
 
   @DomName('SourceBuffer.appendWindowStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set appendWindowStart(num value) => _blink.Native_SourceBuffer_appendWindowStart_Setter(this, value);
+  void set appendWindowStart(num value) => _blink.BlinkSourceBuffer.$appendWindowStart_Setter(this, value);
 
   @DomName('SourceBuffer.buffered')
   @DocsEditable()
-  TimeRanges get buffered => _blink.Native_SourceBuffer_buffered_Getter(this);
+  TimeRanges get buffered => _blink.BlinkSourceBuffer.$buffered_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get mode => _blink.Native_SourceBuffer_mode_Getter(this);
+  String get mode => _blink.BlinkSourceBuffer.$mode_Getter(this);
 
   @DomName('SourceBuffer.mode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set mode(String value) => _blink.Native_SourceBuffer_mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkSourceBuffer.$mode_Setter(this, value);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  num get timestampOffset => _blink.Native_SourceBuffer_timestampOffset_Getter(this);
+  num get timestampOffset => _blink.BlinkSourceBuffer.$timestampOffset_Getter(this);
 
   @DomName('SourceBuffer.timestampOffset')
   @DocsEditable()
-  void set timestampOffset(num value) => _blink.Native_SourceBuffer_timestampOffset_Setter(this, value);
+  void set timestampOffset(num value) => _blink.BlinkSourceBuffer.$timestampOffset_Setter(this, value);
 
   @DomName('SourceBuffer.updating')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get updating => _blink.Native_SourceBuffer_updating_Getter(this);
+  bool get updating => _blink.BlinkSourceBuffer.$updating_Getter(this);
 
   @DomName('SourceBuffer.abort')
   @DocsEditable()
-  void abort() => _blink.Native_SourceBuffer_abort_Callback(this);
+  void abort() => _blink.BlinkSourceBuffer.$abort_Callback(this);
 
   @DomName('SourceBuffer.appendBuffer')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendBuffer(ByteBuffer data) => _blink.Native_SourceBuffer_appendBuffer_Callback(this, data);
+  void appendBuffer(ByteBuffer data) => _blink.BlinkSourceBuffer.$appendBuffer_Callback(this, data);
 
-  void appendStream(FileStream stream, [int maxSize]) => _blink.Native_SourceBuffer_appendStream(this, stream, maxSize);
+  void appendStream(FileStream stream, [int maxSize]) => _blink.BlinkSourceBuffer.$appendStream(this, stream, maxSize);
 
   @DomName('SourceBuffer.appendTypedData')
   @DocsEditable()
   @Experimental() // untriaged
-  void appendTypedData(TypedData data) => _blink.Native_SourceBuffer_appendTypedData_Callback(this, data);
+  void appendTypedData(TypedData data) => _blink.BlinkSourceBuffer.$appendTypedData_Callback(this, data);
 
   @DomName('SourceBuffer.remove')
   @DocsEditable()
   @Experimental() // untriaged
-  void remove(num start, num end) => _blink.Native_SourceBuffer_remove_Callback(this, start, end);
+  void remove(num start, num end) => _blink.BlinkSourceBuffer.$remove_Callback(this, start, end);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25030,15 +25030,15 @@
 
   @DomName('SourceBufferList.length')
   @DocsEditable()
-  int get length => _blink.Native_SourceBufferList_length_Getter(this);
+  int get length => _blink.BlinkSourceBufferList.$length_Getter(this);
 
   SourceBuffer operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSourceBufferList.$NativeIndexed_Getter(this, index);
   }
 
-  SourceBuffer _nativeIndexedGetter(int index) => _blink.Native_SourceBufferList_NativeIndexed_Getter(this, index);
+  SourceBuffer _nativeIndexedGetter(int index) => _blink.BlinkSourceBufferList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SourceBuffer value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25080,7 +25080,7 @@
 
   @DomName('SourceBufferList.item')
   @DocsEditable()
-  SourceBuffer item(int index) => _blink.Native_SourceBufferList_item_Callback(this, index);
+  SourceBuffer item(int index) => _blink.BlinkSourceBufferList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25108,27 +25108,27 @@
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLSourceElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLSourceElement.$media_Getter(this);
 
   @DomName('HTMLSourceElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLSourceElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLSourceElement.$media_Setter(this, value);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLSourceElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLSourceElement.$src_Getter(this);
 
   @DomName('HTMLSourceElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLSourceElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLSourceElement.$src_Setter(this, value);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLSourceElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLSourceElement.$type_Getter(this);
 
   @DomName('HTMLSourceElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLSourceElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLSourceElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25148,22 +25148,22 @@
   @DomName('SourceInfo.facing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get facing => _blink.Native_SourceInfo_facing_Getter(this);
+  String get facing => _blink.BlinkSourceInfo.$facing_Getter(this);
 
   @DomName('SourceInfo.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_SourceInfo_id_Getter(this);
+  String get id => _blink.BlinkSourceInfo.$id_Getter(this);
 
   @DomName('SourceInfo.kind')
   @DocsEditable()
   @Experimental() // untriaged
-  String get kind => _blink.Native_SourceInfo_kind_Getter(this);
+  String get kind => _blink.BlinkSourceInfo.$kind_Getter(this);
 
   @DomName('SourceInfo.label')
   @DocsEditable()
   @Experimental() // untriaged
-  String get label => _blink.Native_SourceInfo_label_Getter(this);
+  String get label => _blink.BlinkSourceInfo.$label_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25207,23 +25207,23 @@
 
   @DomName('SpeechGrammar.SpeechGrammar')
   @DocsEditable()
-  factory SpeechGrammar() => _blink.Native_SpeechGrammar_SpeechGrammar();
+  factory SpeechGrammar() => _blink.BlinkSpeechGrammar.$mkSpeechGrammar();
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  String get src => _blink.Native_SpeechGrammar_src_Getter(this);
+  String get src => _blink.BlinkSpeechGrammar.$src_Getter(this);
 
   @DomName('SpeechGrammar.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_SpeechGrammar_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkSpeechGrammar.$src_Setter(this, value);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  num get weight => _blink.Native_SpeechGrammar_weight_Getter(this);
+  num get weight => _blink.BlinkSpeechGrammar.$weight_Getter(this);
 
   @DomName('SpeechGrammar.weight')
   @DocsEditable()
-  void set weight(num value) => _blink.Native_SpeechGrammar_weight_Setter(this, value);
+  void set weight(num value) => _blink.BlinkSpeechGrammar.$weight_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25243,19 +25243,19 @@
 
   @DomName('SpeechGrammarList.SpeechGrammarList')
   @DocsEditable()
-  factory SpeechGrammarList() => _blink.Native_SpeechGrammarList_SpeechGrammarList();
+  factory SpeechGrammarList() => _blink.BlinkSpeechGrammarList.$mkSpeechGrammarList();
 
   @DomName('SpeechGrammarList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechGrammarList_length_Getter(this);
+  int get length => _blink.BlinkSpeechGrammarList.$length_Getter(this);
 
   SpeechGrammar operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechGrammarList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechGrammar _nativeIndexedGetter(int index) => _blink.Native_SpeechGrammarList_NativeIndexed_Getter(this, index);
+  SpeechGrammar _nativeIndexedGetter(int index) => _blink.BlinkSpeechGrammarList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechGrammar value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -25295,13 +25295,13 @@
   SpeechGrammar elementAt(int index) => this[index];
   // -- end List<SpeechGrammar> mixins.
 
-  void addFromString(String string, [num weight]) => _blink.Native_SpeechGrammarList_addFromString(this, string, weight);
+  void addFromString(String string, [num weight]) => _blink.BlinkSpeechGrammarList.$addFromString(this, string, weight);
 
-  void addFromUri(String src, [num weight]) => _blink.Native_SpeechGrammarList_addFromUri(this, src, weight);
+  void addFromUri(String src, [num weight]) => _blink.BlinkSpeechGrammarList.$addFromUri(this, src, weight);
 
   @DomName('SpeechGrammarList.item')
   @DocsEditable()
-  SpeechGrammar item(int index) => _blink.Native_SpeechGrammarList_item_Callback(this, index);
+  SpeechGrammar item(int index) => _blink.BlinkSpeechGrammarList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25464,62 +25464,62 @@
 
   @DomName('SpeechRecognition.SpeechRecognition')
   @DocsEditable()
-  factory SpeechRecognition() => _blink.Native_SpeechRecognition_SpeechRecognition();
+  factory SpeechRecognition() => _blink.BlinkSpeechRecognition.$mkSpeechRecognition();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  bool get continuous => _blink.Native_SpeechRecognition_continuous_Getter(this);
+  bool get continuous => _blink.BlinkSpeechRecognition.$continuous_Getter(this);
 
   @DomName('SpeechRecognition.continuous')
   @DocsEditable()
-  void set continuous(bool value) => _blink.Native_SpeechRecognition_continuous_Setter(this, value);
+  void set continuous(bool value) => _blink.BlinkSpeechRecognition.$continuous_Setter(this, value);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  SpeechGrammarList get grammars => _blink.Native_SpeechRecognition_grammars_Getter(this);
+  SpeechGrammarList get grammars => _blink.BlinkSpeechRecognition.$grammars_Getter(this);
 
   @DomName('SpeechRecognition.grammars')
   @DocsEditable()
-  void set grammars(SpeechGrammarList value) => _blink.Native_SpeechRecognition_grammars_Setter(this, value);
+  void set grammars(SpeechGrammarList value) => _blink.BlinkSpeechRecognition.$grammars_Setter(this, value);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  bool get interimResults => _blink.Native_SpeechRecognition_interimResults_Getter(this);
+  bool get interimResults => _blink.BlinkSpeechRecognition.$interimResults_Getter(this);
 
   @DomName('SpeechRecognition.interimResults')
   @DocsEditable()
-  void set interimResults(bool value) => _blink.Native_SpeechRecognition_interimResults_Setter(this, value);
+  void set interimResults(bool value) => _blink.BlinkSpeechRecognition.$interimResults_Setter(this, value);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechRecognition_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechRecognition.$lang_Getter(this);
 
   @DomName('SpeechRecognition.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_SpeechRecognition_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechRecognition.$lang_Setter(this, value);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  int get maxAlternatives => _blink.Native_SpeechRecognition_maxAlternatives_Getter(this);
+  int get maxAlternatives => _blink.BlinkSpeechRecognition.$maxAlternatives_Getter(this);
 
   @DomName('SpeechRecognition.maxAlternatives')
   @DocsEditable()
-  void set maxAlternatives(int value) => _blink.Native_SpeechRecognition_maxAlternatives_Setter(this, value);
+  void set maxAlternatives(int value) => _blink.BlinkSpeechRecognition.$maxAlternatives_Setter(this, value);
 
   @DomName('SpeechRecognition.abort')
   @DocsEditable()
-  void abort() => _blink.Native_SpeechRecognition_abort_Callback(this);
+  void abort() => _blink.BlinkSpeechRecognition.$abort_Callback(this);
 
   @DomName('SpeechRecognition.start')
   @DocsEditable()
-  void start() => _blink.Native_SpeechRecognition_start_Callback(this);
+  void start() => _blink.BlinkSpeechRecognition.$start_Callback(this);
 
   @DomName('SpeechRecognition.stop')
   @DocsEditable()
-  void stop() => _blink.Native_SpeechRecognition_stop_Callback(this);
+  void stop() => _blink.BlinkSpeechRecognition.$stop_Callback(this);
 
   /// Stream of `audioend` events handled by this [SpeechRecognition].
   @DomName('SpeechRecognition.onaudioend')
@@ -25595,11 +25595,11 @@
 
   @DomName('SpeechRecognitionAlternative.confidence')
   @DocsEditable()
-  double get confidence => _blink.Native_SpeechRecognitionAlternative_confidence_Getter(this);
+  double get confidence => _blink.BlinkSpeechRecognitionAlternative.$confidence_Getter(this);
 
   @DomName('SpeechRecognitionAlternative.transcript')
   @DocsEditable()
-  String get transcript => _blink.Native_SpeechRecognitionAlternative_transcript_Getter(this);
+  String get transcript => _blink.BlinkSpeechRecognitionAlternative.$transcript_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25620,11 +25620,11 @@
 
   @DomName('SpeechRecognitionError.error')
   @DocsEditable()
-  String get error => _blink.Native_SpeechRecognitionError_error_Getter(this);
+  String get error => _blink.BlinkSpeechRecognitionError.$error_Getter(this);
 
   @DomName('SpeechRecognitionError.message')
   @DocsEditable()
-  String get message => _blink.Native_SpeechRecognitionError_message_Getter(this);
+  String get message => _blink.BlinkSpeechRecognitionError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25645,19 +25645,19 @@
 
   @DomName('SpeechRecognitionEvent.emma')
   @DocsEditable()
-  Document get emma => _blink.Native_SpeechRecognitionEvent_emma_Getter(this);
+  Document get emma => _blink.BlinkSpeechRecognitionEvent.$emma_Getter(this);
 
   @DomName('SpeechRecognitionEvent.interpretation')
   @DocsEditable()
-  Document get interpretation => _blink.Native_SpeechRecognitionEvent_interpretation_Getter(this);
+  Document get interpretation => _blink.BlinkSpeechRecognitionEvent.$interpretation_Getter(this);
 
   @DomName('SpeechRecognitionEvent.resultIndex')
   @DocsEditable()
-  int get resultIndex => _blink.Native_SpeechRecognitionEvent_resultIndex_Getter(this);
+  int get resultIndex => _blink.BlinkSpeechRecognitionEvent.$resultIndex_Getter(this);
 
   @DomName('SpeechRecognitionEvent.results')
   @DocsEditable()
-  List<SpeechRecognitionResult> get results => _blink.Native_SpeechRecognitionEvent_results_Getter(this);
+  List<SpeechRecognitionResult> get results => _blink.BlinkSpeechRecognitionEvent.$results_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25678,15 +25678,15 @@
 
   @DomName('SpeechRecognitionResult.isFinal')
   @DocsEditable()
-  bool get isFinal => _blink.Native_SpeechRecognitionResult_isFinal_Getter(this);
+  bool get isFinal => _blink.BlinkSpeechRecognitionResult.$isFinal_Getter(this);
 
   @DomName('SpeechRecognitionResult.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechRecognitionResult_length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResult.$length_Getter(this);
 
   @DomName('SpeechRecognitionResult.item')
   @DocsEditable()
-  SpeechRecognitionAlternative item(int index) => _blink.Native_SpeechRecognitionResult_item_Callback(this, index);
+  SpeechRecognitionAlternative item(int index) => _blink.BlinkSpeechRecognitionResult.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25706,35 +25706,35 @@
 
   @DomName('SpeechSynthesis.paused')
   @DocsEditable()
-  bool get paused => _blink.Native_SpeechSynthesis_paused_Getter(this);
+  bool get paused => _blink.BlinkSpeechSynthesis.$paused_Getter(this);
 
   @DomName('SpeechSynthesis.pending')
   @DocsEditable()
-  bool get pending => _blink.Native_SpeechSynthesis_pending_Getter(this);
+  bool get pending => _blink.BlinkSpeechSynthesis.$pending_Getter(this);
 
   @DomName('SpeechSynthesis.speaking')
   @DocsEditable()
-  bool get speaking => _blink.Native_SpeechSynthesis_speaking_Getter(this);
+  bool get speaking => _blink.BlinkSpeechSynthesis.$speaking_Getter(this);
 
   @DomName('SpeechSynthesis.cancel')
   @DocsEditable()
-  void cancel() => _blink.Native_SpeechSynthesis_cancel_Callback(this);
+  void cancel() => _blink.BlinkSpeechSynthesis.$cancel_Callback(this);
 
   @DomName('SpeechSynthesis.getVoices')
   @DocsEditable()
-  List<SpeechSynthesisVoice> getVoices() => _blink.Native_SpeechSynthesis_getVoices_Callback(this);
+  List<SpeechSynthesisVoice> getVoices() => _blink.BlinkSpeechSynthesis.$getVoices_Callback(this);
 
   @DomName('SpeechSynthesis.pause')
   @DocsEditable()
-  void pause() => _blink.Native_SpeechSynthesis_pause_Callback(this);
+  void pause() => _blink.BlinkSpeechSynthesis.$pause_Callback(this);
 
   @DomName('SpeechSynthesis.resume')
   @DocsEditable()
-  void resume() => _blink.Native_SpeechSynthesis_resume_Callback(this);
+  void resume() => _blink.BlinkSpeechSynthesis.$resume_Callback(this);
 
   @DomName('SpeechSynthesis.speak')
   @DocsEditable()
-  void speak(SpeechSynthesisUtterance utterance) => _blink.Native_SpeechSynthesis_speak_Callback(this, utterance);
+  void speak(SpeechSynthesisUtterance utterance) => _blink.BlinkSpeechSynthesis.$speak_Callback(this, utterance);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25754,15 +25754,15 @@
 
   @DomName('SpeechSynthesisEvent.charIndex')
   @DocsEditable()
-  int get charIndex => _blink.Native_SpeechSynthesisEvent_charIndex_Getter(this);
+  int get charIndex => _blink.BlinkSpeechSynthesisEvent.$charIndex_Getter(this);
 
   @DomName('SpeechSynthesisEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_SpeechSynthesisEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkSpeechSynthesisEvent.$elapsedTime_Getter(this);
 
   @DomName('SpeechSynthesisEvent.name')
   @DocsEditable()
-  String get name => _blink.Native_SpeechSynthesisEvent_name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisEvent.$name_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -25852,55 +25852,55 @@
 
   @DomName('SpeechSynthesisUtterance.SpeechSynthesisUtterance')
   @DocsEditable()
-  factory SpeechSynthesisUtterance([String text]) => _blink.Native_SpeechSynthesisUtterance_SpeechSynthesisUtterance(text);
+  factory SpeechSynthesisUtterance([String text]) => _blink.BlinkSpeechSynthesisUtterance.$mkSpeechSynthesisUtterance(text);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechSynthesisUtterance_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisUtterance.$lang_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.lang')
   @DocsEditable()
-  void set lang(String value) => _blink.Native_SpeechSynthesisUtterance_lang_Setter(this, value);
+  void set lang(String value) => _blink.BlinkSpeechSynthesisUtterance.$lang_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  num get pitch => _blink.Native_SpeechSynthesisUtterance_pitch_Getter(this);
+  num get pitch => _blink.BlinkSpeechSynthesisUtterance.$pitch_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.pitch')
   @DocsEditable()
-  void set pitch(num value) => _blink.Native_SpeechSynthesisUtterance_pitch_Setter(this, value);
+  void set pitch(num value) => _blink.BlinkSpeechSynthesisUtterance.$pitch_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  num get rate => _blink.Native_SpeechSynthesisUtterance_rate_Getter(this);
+  num get rate => _blink.BlinkSpeechSynthesisUtterance.$rate_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.rate')
   @DocsEditable()
-  void set rate(num value) => _blink.Native_SpeechSynthesisUtterance_rate_Setter(this, value);
+  void set rate(num value) => _blink.BlinkSpeechSynthesisUtterance.$rate_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  String get text => _blink.Native_SpeechSynthesisUtterance_text_Getter(this);
+  String get text => _blink.BlinkSpeechSynthesisUtterance.$text_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.text')
   @DocsEditable()
-  void set text(String value) => _blink.Native_SpeechSynthesisUtterance_text_Setter(this, value);
+  void set text(String value) => _blink.BlinkSpeechSynthesisUtterance.$text_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  SpeechSynthesisVoice get voice => _blink.Native_SpeechSynthesisUtterance_voice_Getter(this);
+  SpeechSynthesisVoice get voice => _blink.BlinkSpeechSynthesisUtterance.$voice_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.voice')
   @DocsEditable()
-  void set voice(SpeechSynthesisVoice value) => _blink.Native_SpeechSynthesisUtterance_voice_Setter(this, value);
+  void set voice(SpeechSynthesisVoice value) => _blink.BlinkSpeechSynthesisUtterance.$voice_Setter(this, value);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  num get volume => _blink.Native_SpeechSynthesisUtterance_volume_Getter(this);
+  num get volume => _blink.BlinkSpeechSynthesisUtterance.$volume_Getter(this);
 
   @DomName('SpeechSynthesisUtterance.volume')
   @DocsEditable()
-  void set volume(num value) => _blink.Native_SpeechSynthesisUtterance_volume_Setter(this, value);
+  void set volume(num value) => _blink.BlinkSpeechSynthesisUtterance.$volume_Setter(this, value);
 
   /// Stream of `boundary` events handled by this [SpeechSynthesisUtterance].
   @DomName('SpeechSynthesisUtterance.onboundary')
@@ -25955,23 +25955,23 @@
 
   @DomName('SpeechSynthesisVoice.default')
   @DocsEditable()
-  bool get defaultValue => _blink.Native_SpeechSynthesisVoice_default_Getter(this);
+  bool get defaultValue => _blink.BlinkSpeechSynthesisVoice.$default_Getter(this);
 
   @DomName('SpeechSynthesisVoice.lang')
   @DocsEditable()
-  String get lang => _blink.Native_SpeechSynthesisVoice_lang_Getter(this);
+  String get lang => _blink.BlinkSpeechSynthesisVoice.$lang_Getter(this);
 
   @DomName('SpeechSynthesisVoice.localService')
   @DocsEditable()
-  bool get localService => _blink.Native_SpeechSynthesisVoice_localService_Getter(this);
+  bool get localService => _blink.BlinkSpeechSynthesisVoice.$localService_Getter(this);
 
   @DomName('SpeechSynthesisVoice.name')
   @DocsEditable()
-  String get name => _blink.Native_SpeechSynthesisVoice_name_Getter(this);
+  String get name => _blink.BlinkSpeechSynthesisVoice.$name_Getter(this);
 
   @DomName('SpeechSynthesisVoice.voiceURI')
   @DocsEditable()
-  String get voiceUri => _blink.Native_SpeechSynthesisVoice_voiceURI_Getter(this);
+  String get voiceUri => _blink.BlinkSpeechSynthesisVoice.$voiceURI_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26066,33 +26066,33 @@
 
   @DomName('Storage.length')
   @DocsEditable()
-  int get _length => _blink.Native_Storage_length_Getter(this);
+  int get _length => _blink.BlinkStorage.$length_Getter(this);
 
-  bool __delete__(index_OR_name) => _blink.Native_Storage___delete__(this, index_OR_name);
+  bool __delete__(index_OR_name) => _blink.BlinkStorage.$__delete__(this, index_OR_name);
 
-  String __getter__(index_OR_name) => _blink.Native_Storage___getter__(this, index_OR_name);
+  String __getter__(index_OR_name) => _blink.BlinkStorage.$__getter__(this, index_OR_name);
 
-  void __setter__(index_OR_name, String value) => _blink.Native_Storage___setter__(this, index_OR_name, value);
+  void __setter__(index_OR_name, String value) => _blink.BlinkStorage.$__setter__(this, index_OR_name, value);
 
   @DomName('Storage.clear')
   @DocsEditable()
-  void _clear() => _blink.Native_Storage_clear_Callback(this);
+  void _clear() => _blink.BlinkStorage.$clear_Callback(this);
 
   @DomName('Storage.getItem')
   @DocsEditable()
-  String _getItem(String key) => _blink.Native_Storage_getItem_Callback(this, key);
+  String _getItem(String key) => _blink.BlinkStorage.$getItem_Callback(this, key);
 
   @DomName('Storage.key')
   @DocsEditable()
-  String _key(int index) => _blink.Native_Storage_key_Callback(this, index);
+  String _key(int index) => _blink.BlinkStorage.$key_Callback(this, index);
 
   @DomName('Storage.removeItem')
   @DocsEditable()
-  void _removeItem(String key) => _blink.Native_Storage_removeItem_Callback(this, key);
+  void _removeItem(String key) => _blink.BlinkStorage.$removeItem_Callback(this, key);
 
   @DomName('Storage.setItem')
   @DocsEditable()
-  void _setItem(String key, String data) => _blink.Native_Storage_setItem_Callback(this, key, data);
+  void _setItem(String key, String data) => _blink.BlinkStorage.$setItem_Callback(this, key, data);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26130,27 +26130,27 @@
 
   @DomName('StorageEvent.key')
   @DocsEditable()
-  String get key => _blink.Native_StorageEvent_key_Getter(this);
+  String get key => _blink.BlinkStorageEvent.$key_Getter(this);
 
   @DomName('StorageEvent.newValue')
   @DocsEditable()
-  String get newValue => _blink.Native_StorageEvent_newValue_Getter(this);
+  String get newValue => _blink.BlinkStorageEvent.$newValue_Getter(this);
 
   @DomName('StorageEvent.oldValue')
   @DocsEditable()
-  String get oldValue => _blink.Native_StorageEvent_oldValue_Getter(this);
+  String get oldValue => _blink.BlinkStorageEvent.$oldValue_Getter(this);
 
   @DomName('StorageEvent.storageArea')
   @DocsEditable()
-  Storage get storageArea => _blink.Native_StorageEvent_storageArea_Getter(this);
+  Storage get storageArea => _blink.BlinkStorageEvent.$storageArea_Getter(this);
 
   @DomName('StorageEvent.url')
   @DocsEditable()
-  String get url => _blink.Native_StorageEvent_url_Getter(this);
+  String get url => _blink.BlinkStorageEvent.$url_Getter(this);
 
   @DomName('StorageEvent.initStorageEvent')
   @DocsEditable()
-  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.Native_StorageEvent_initStorageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
+  void _initStorageEvent(String typeArg, bool canBubbleArg, bool cancelableArg, String keyArg, String oldValueArg, String newValueArg, String urlArg, Storage storageAreaArg) => _blink.BlinkStorageEvent.$initStorageEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, keyArg, oldValueArg, newValueArg, urlArg, storageAreaArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26171,12 +26171,12 @@
   @DomName('StorageInfo.quota')
   @DocsEditable()
   @Experimental() // untriaged
-  int get quota => _blink.Native_StorageInfo_quota_Getter(this);
+  int get quota => _blink.BlinkStorageInfo.$quota_Getter(this);
 
   @DomName('StorageInfo.usage')
   @DocsEditable()
   @Experimental() // untriaged
-  int get usage => _blink.Native_StorageInfo_usage_Getter(this);
+  int get usage => _blink.BlinkStorageInfo.$usage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26197,7 +26197,7 @@
   @DomName('StorageQuota.supportedTypes')
   @DocsEditable()
   @Experimental() // untriaged
-  List<String> get supportedTypes => _blink.Native_StorageQuota_supportedTypes_Getter(this);
+  List<String> get supportedTypes => _blink.BlinkStorageQuota.$supportedTypes_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26258,39 +26258,39 @@
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLStyleElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLStyleElement.$disabled_Getter(this);
 
   @DomName('HTMLStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLStyleElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLStyleElement.$disabled_Setter(this, value);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  String get media => _blink.Native_HTMLStyleElement_media_Getter(this);
+  String get media => _blink.BlinkHTMLStyleElement.$media_Getter(this);
 
   @DomName('HTMLStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_HTMLStyleElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkHTMLStyleElement.$media_Setter(this, value);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  bool get scoped => _blink.Native_HTMLStyleElement_scoped_Getter(this);
+  bool get scoped => _blink.BlinkHTMLStyleElement.$scoped_Getter(this);
 
   @DomName('HTMLStyleElement.scoped')
   @DocsEditable()
-  void set scoped(bool value) => _blink.Native_HTMLStyleElement_scoped_Setter(this, value);
+  void set scoped(bool value) => _blink.BlinkHTMLStyleElement.$scoped_Setter(this, value);
 
   @DomName('HTMLStyleElement.sheet')
   @DocsEditable()
-  StyleSheet get sheet => _blink.Native_HTMLStyleElement_sheet_Getter(this);
+  StyleSheet get sheet => _blink.BlinkHTMLStyleElement.$sheet_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLStyleElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLStyleElement.$type_Getter(this);
 
   @DomName('HTMLStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_HTMLStyleElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkHTMLStyleElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26310,11 +26310,11 @@
 
   @DomName('StyleMedia.type')
   @DocsEditable()
-  String get type => _blink.Native_StyleMedia_type_Getter(this);
+  String get type => _blink.BlinkStyleMedia.$type_Getter(this);
 
   @DomName('StyleMedia.matchMedium')
   @DocsEditable()
-  bool matchMedium(String mediaquery) => _blink.Native_StyleMedia_matchMedium_Callback(this, mediaquery);
+  bool matchMedium(String mediaquery) => _blink.BlinkStyleMedia.$matchMedium_Callback(this, mediaquery);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26332,35 +26332,35 @@
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_StyleSheet_disabled_Getter(this);
+  bool get disabled => _blink.BlinkStyleSheet.$disabled_Getter(this);
 
   @DomName('StyleSheet.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_StyleSheet_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkStyleSheet.$disabled_Setter(this, value);
 
   @DomName('StyleSheet.href')
   @DocsEditable()
-  String get href => _blink.Native_StyleSheet_href_Getter(this);
+  String get href => _blink.BlinkStyleSheet.$href_Getter(this);
 
   @DomName('StyleSheet.media')
   @DocsEditable()
-  MediaList get media => _blink.Native_StyleSheet_media_Getter(this);
+  MediaList get media => _blink.BlinkStyleSheet.$media_Getter(this);
 
   @DomName('StyleSheet.ownerNode')
   @DocsEditable()
-  Node get ownerNode => _blink.Native_StyleSheet_ownerNode_Getter(this);
+  Node get ownerNode => _blink.BlinkStyleSheet.$ownerNode_Getter(this);
 
   @DomName('StyleSheet.parentStyleSheet')
   @DocsEditable()
-  StyleSheet get parentStyleSheet => _blink.Native_StyleSheet_parentStyleSheet_Getter(this);
+  StyleSheet get parentStyleSheet => _blink.BlinkStyleSheet.$parentStyleSheet_Getter(this);
 
   @DomName('StyleSheet.title')
   @DocsEditable()
-  String get title => _blink.Native_StyleSheet_title_Getter(this);
+  String get title => _blink.BlinkStyleSheet.$title_Getter(this);
 
   @DomName('StyleSheet.type')
   @DocsEditable()
-  String get type => _blink.Native_StyleSheet_type_Getter(this);
+  String get type => _blink.BlinkStyleSheet.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26412,31 +26412,31 @@
 
   @DomName('HTMLTableCellElement.cellIndex')
   @DocsEditable()
-  int get cellIndex => _blink.Native_HTMLTableCellElement_cellIndex_Getter(this);
+  int get cellIndex => _blink.BlinkHTMLTableCellElement.$cellIndex_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  int get colSpan => _blink.Native_HTMLTableCellElement_colSpan_Getter(this);
+  int get colSpan => _blink.BlinkHTMLTableCellElement.$colSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.colSpan')
   @DocsEditable()
-  void set colSpan(int value) => _blink.Native_HTMLTableCellElement_colSpan_Setter(this, value);
+  void set colSpan(int value) => _blink.BlinkHTMLTableCellElement.$colSpan_Setter(this, value);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  String get headers => _blink.Native_HTMLTableCellElement_headers_Getter(this);
+  String get headers => _blink.BlinkHTMLTableCellElement.$headers_Getter(this);
 
   @DomName('HTMLTableCellElement.headers')
   @DocsEditable()
-  void set headers(String value) => _blink.Native_HTMLTableCellElement_headers_Setter(this, value);
+  void set headers(String value) => _blink.BlinkHTMLTableCellElement.$headers_Setter(this, value);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  int get rowSpan => _blink.Native_HTMLTableCellElement_rowSpan_Getter(this);
+  int get rowSpan => _blink.BlinkHTMLTableCellElement.$rowSpan_Getter(this);
 
   @DomName('HTMLTableCellElement.rowSpan')
   @DocsEditable()
-  void set rowSpan(int value) => _blink.Native_HTMLTableCellElement_rowSpan_Setter(this, value);
+  void set rowSpan(int value) => _blink.BlinkHTMLTableCellElement.$rowSpan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26464,11 +26464,11 @@
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  int get span => _blink.Native_HTMLTableColElement_span_Getter(this);
+  int get span => _blink.BlinkHTMLTableColElement.$span_Getter(this);
 
   @DomName('HTMLTableColElement.span')
   @DocsEditable()
-  void set span(int value) => _blink.Native_HTMLTableColElement_span_Setter(this, value);
+  void set span(int value) => _blink.BlinkHTMLTableColElement.$span_Setter(this, value);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26514,71 +26514,71 @@
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  TableCaptionElement get caption => _blink.Native_HTMLTableElement_caption_Getter(this);
+  TableCaptionElement get caption => _blink.BlinkHTMLTableElement.$caption_Getter(this);
 
   @DomName('HTMLTableElement.caption')
   @DocsEditable()
-  void set caption(TableCaptionElement value) => _blink.Native_HTMLTableElement_caption_Setter(this, value);
+  void set caption(TableCaptionElement value) => _blink.BlinkHTMLTableElement.$caption_Setter(this, value);
 
   @DomName('HTMLTableElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.Native_HTMLTableElement_rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableElement.$rows_Getter(this);
 
   @DomName('HTMLTableElement.tBodies')
   @DocsEditable()
-  List<Node> get _tBodies => _blink.Native_HTMLTableElement_tBodies_Getter(this);
+  List<Node> get _tBodies => _blink.BlinkHTMLTableElement.$tBodies_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  TableSectionElement get tFoot => _blink.Native_HTMLTableElement_tFoot_Getter(this);
+  TableSectionElement get tFoot => _blink.BlinkHTMLTableElement.$tFoot_Getter(this);
 
   @DomName('HTMLTableElement.tFoot')
   @DocsEditable()
-  void set tFoot(TableSectionElement value) => _blink.Native_HTMLTableElement_tFoot_Setter(this, value);
+  void set tFoot(TableSectionElement value) => _blink.BlinkHTMLTableElement.$tFoot_Setter(this, value);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  TableSectionElement get tHead => _blink.Native_HTMLTableElement_tHead_Getter(this);
+  TableSectionElement get tHead => _blink.BlinkHTMLTableElement.$tHead_Getter(this);
 
   @DomName('HTMLTableElement.tHead')
   @DocsEditable()
-  void set tHead(TableSectionElement value) => _blink.Native_HTMLTableElement_tHead_Setter(this, value);
+  void set tHead(TableSectionElement value) => _blink.BlinkHTMLTableElement.$tHead_Setter(this, value);
 
   @DomName('HTMLTableElement.createCaption')
   @DocsEditable()
-  HtmlElement _createCaption() => _blink.Native_HTMLTableElement_createCaption_Callback(this);
+  HtmlElement _createCaption() => _blink.BlinkHTMLTableElement.$createCaption_Callback(this);
 
   @DomName('HTMLTableElement.createTBody')
   @DocsEditable()
-  HtmlElement _createTBody() => _blink.Native_HTMLTableElement_createTBody_Callback(this);
+  HtmlElement _createTBody() => _blink.BlinkHTMLTableElement.$createTBody_Callback(this);
 
   @DomName('HTMLTableElement.createTFoot')
   @DocsEditable()
-  HtmlElement _createTFoot() => _blink.Native_HTMLTableElement_createTFoot_Callback(this);
+  HtmlElement _createTFoot() => _blink.BlinkHTMLTableElement.$createTFoot_Callback(this);
 
   @DomName('HTMLTableElement.createTHead')
   @DocsEditable()
-  HtmlElement _createTHead() => _blink.Native_HTMLTableElement_createTHead_Callback(this);
+  HtmlElement _createTHead() => _blink.BlinkHTMLTableElement.$createTHead_Callback(this);
 
   @DomName('HTMLTableElement.deleteCaption')
   @DocsEditable()
-  void deleteCaption() => _blink.Native_HTMLTableElement_deleteCaption_Callback(this);
+  void deleteCaption() => _blink.BlinkHTMLTableElement.$deleteCaption_Callback(this);
 
   @DomName('HTMLTableElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.Native_HTMLTableElement_deleteRow_Callback(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableElement.$deleteRow_Callback(this, index);
 
   @DomName('HTMLTableElement.deleteTFoot')
   @DocsEditable()
-  void deleteTFoot() => _blink.Native_HTMLTableElement_deleteTFoot_Callback(this);
+  void deleteTFoot() => _blink.BlinkHTMLTableElement.$deleteTFoot_Callback(this);
 
   @DomName('HTMLTableElement.deleteTHead')
   @DocsEditable()
-  void deleteTHead() => _blink.Native_HTMLTableElement_deleteTHead_Callback(this);
+  void deleteTHead() => _blink.BlinkHTMLTableElement.$deleteTHead_Callback(this);
 
   @DomName('HTMLTableElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableElement_insertRow_Callback(this, index);
+  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableElement.$insertRow_Callback(this, index);
 }
 // 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
@@ -26615,23 +26615,23 @@
 
   @DomName('HTMLTableRowElement.cells')
   @DocsEditable()
-  List<Node> get _cells => _blink.Native_HTMLTableRowElement_cells_Getter(this);
+  List<Node> get _cells => _blink.BlinkHTMLTableRowElement.$cells_Getter(this);
 
   @DomName('HTMLTableRowElement.rowIndex')
   @DocsEditable()
-  int get rowIndex => _blink.Native_HTMLTableRowElement_rowIndex_Getter(this);
+  int get rowIndex => _blink.BlinkHTMLTableRowElement.$rowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.sectionRowIndex')
   @DocsEditable()
-  int get sectionRowIndex => _blink.Native_HTMLTableRowElement_sectionRowIndex_Getter(this);
+  int get sectionRowIndex => _blink.BlinkHTMLTableRowElement.$sectionRowIndex_Getter(this);
 
   @DomName('HTMLTableRowElement.deleteCell')
   @DocsEditable()
-  void deleteCell(int index) => _blink.Native_HTMLTableRowElement_deleteCell_Callback(this, index);
+  void deleteCell(int index) => _blink.BlinkHTMLTableRowElement.$deleteCell_Callback(this, index);
 
   @DomName('HTMLTableRowElement.insertCell')
   @DocsEditable()
-  HtmlElement _insertCell(int index) => _blink.Native_HTMLTableRowElement_insertCell_Callback(this, index);
+  HtmlElement _insertCell(int index) => _blink.BlinkHTMLTableRowElement.$insertCell_Callback(this, index);
 }
 // 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
@@ -26664,15 +26664,15 @@
 
   @DomName('HTMLTableSectionElement.rows')
   @DocsEditable()
-  List<Node> get _rows => _blink.Native_HTMLTableSectionElement_rows_Getter(this);
+  List<Node> get _rows => _blink.BlinkHTMLTableSectionElement.$rows_Getter(this);
 
   @DomName('HTMLTableSectionElement.deleteRow')
   @DocsEditable()
-  void deleteRow(int index) => _blink.Native_HTMLTableSectionElement_deleteRow_Callback(this, index);
+  void deleteRow(int index) => _blink.BlinkHTMLTableSectionElement.$deleteRow_Callback(this, index);
 
   @DomName('HTMLTableSectionElement.insertRow')
   @DocsEditable()
-  HtmlElement _insertRow(int index) => _blink.Native_HTMLTableSectionElement_insertRow_Callback(this, index);
+  HtmlElement _insertRow(int index) => _blink.BlinkHTMLTableSectionElement.$insertRow_Callback(this, index);
 }
 // 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
@@ -26705,7 +26705,7 @@
 
   @DomName('HTMLTemplateElement.content')
   @DocsEditable()
-  DocumentFragment get content => _blink.Native_HTMLTemplateElement_content_Getter(this);
+  DocumentFragment get content => _blink.BlinkHTMLTemplateElement.$content_Getter(this);
 
 
   /**
@@ -26739,16 +26739,16 @@
 
   @DomName('Text.wholeText')
   @DocsEditable()
-  String get wholeText => _blink.Native_Text_wholeText_Getter(this);
+  String get wholeText => _blink.BlinkText.$wholeText_Getter(this);
 
   @DomName('Text.getDestinationInsertionPoints')
   @DocsEditable()
   @Experimental() // untriaged
-  List<Node> getDestinationInsertionPoints() => _blink.Native_Text_getDestinationInsertionPoints_Callback(this);
+  List<Node> getDestinationInsertionPoints() => _blink.BlinkText.$getDestinationInsertionPoints_Callback(this);
 
   @DomName('Text.splitText')
   @DocsEditable()
-  Text splitText(int offset) => _blink.Native_Text_splitText_Callback(this, offset);
+  Text splitText(int offset) => _blink.BlinkText.$splitText_Callback(this, offset);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -26776,190 +26776,190 @@
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  bool get autofocus => _blink.Native_HTMLTextAreaElement_autofocus_Getter(this);
+  bool get autofocus => _blink.BlinkHTMLTextAreaElement.$autofocus_Getter(this);
 
   @DomName('HTMLTextAreaElement.autofocus')
   @DocsEditable()
-  void set autofocus(bool value) => _blink.Native_HTMLTextAreaElement_autofocus_Setter(this, value);
+  void set autofocus(bool value) => _blink.BlinkHTMLTextAreaElement.$autofocus_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  int get cols => _blink.Native_HTMLTextAreaElement_cols_Getter(this);
+  int get cols => _blink.BlinkHTMLTextAreaElement.$cols_Getter(this);
 
   @DomName('HTMLTextAreaElement.cols')
   @DocsEditable()
-  void set cols(int value) => _blink.Native_HTMLTextAreaElement_cols_Setter(this, value);
+  void set cols(int value) => _blink.BlinkHTMLTextAreaElement.$cols_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  String get defaultValue => _blink.Native_HTMLTextAreaElement_defaultValue_Getter(this);
+  String get defaultValue => _blink.BlinkHTMLTextAreaElement.$defaultValue_Getter(this);
 
   @DomName('HTMLTextAreaElement.defaultValue')
   @DocsEditable()
-  void set defaultValue(String value) => _blink.Native_HTMLTextAreaElement_defaultValue_Setter(this, value);
+  void set defaultValue(String value) => _blink.BlinkHTMLTextAreaElement.$defaultValue_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  String get dirName => _blink.Native_HTMLTextAreaElement_dirName_Getter(this);
+  String get dirName => _blink.BlinkHTMLTextAreaElement.$dirName_Getter(this);
 
   @DomName('HTMLTextAreaElement.dirName')
   @DocsEditable()
   // http://www.whatwg.org/specs/web-apps/current-work/multipage/the-button-element.html#dom-textarea-dirname
   @Experimental()
-  void set dirName(String value) => _blink.Native_HTMLTextAreaElement_dirName_Setter(this, value);
+  void set dirName(String value) => _blink.BlinkHTMLTextAreaElement.$dirName_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_HTMLTextAreaElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkHTMLTextAreaElement.$disabled_Getter(this);
 
   @DomName('HTMLTextAreaElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_HTMLTextAreaElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkHTMLTextAreaElement.$disabled_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.form')
   @DocsEditable()
-  FormElement get form => _blink.Native_HTMLTextAreaElement_form_Getter(this);
+  FormElement get form => _blink.BlinkHTMLTextAreaElement.$form_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  String get inputMode => _blink.Native_HTMLTextAreaElement_inputMode_Getter(this);
+  String get inputMode => _blink.BlinkHTMLTextAreaElement.$inputMode_Getter(this);
 
   @DomName('HTMLTextAreaElement.inputMode')
   @DocsEditable()
   @Experimental() // untriaged
-  void set inputMode(String value) => _blink.Native_HTMLTextAreaElement_inputMode_Setter(this, value);
+  void set inputMode(String value) => _blink.BlinkHTMLTextAreaElement.$inputMode_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.labels')
   @DocsEditable()
   @Unstable()
-  List<Node> get labels => _blink.Native_HTMLTextAreaElement_labels_Getter(this);
+  List<Node> get labels => _blink.BlinkHTMLTextAreaElement.$labels_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  int get maxLength => _blink.Native_HTMLTextAreaElement_maxLength_Getter(this);
+  int get maxLength => _blink.BlinkHTMLTextAreaElement.$maxLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.maxLength')
   @DocsEditable()
-  void set maxLength(int value) => _blink.Native_HTMLTextAreaElement_maxLength_Setter(this, value);
+  void set maxLength(int value) => _blink.BlinkHTMLTextAreaElement.$maxLength_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  String get name => _blink.Native_HTMLTextAreaElement_name_Getter(this);
+  String get name => _blink.BlinkHTMLTextAreaElement.$name_Getter(this);
 
   @DomName('HTMLTextAreaElement.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_HTMLTextAreaElement_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkHTMLTextAreaElement.$name_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  String get placeholder => _blink.Native_HTMLTextAreaElement_placeholder_Getter(this);
+  String get placeholder => _blink.BlinkHTMLTextAreaElement.$placeholder_Getter(this);
 
   @DomName('HTMLTextAreaElement.placeholder')
   @DocsEditable()
-  void set placeholder(String value) => _blink.Native_HTMLTextAreaElement_placeholder_Setter(this, value);
+  void set placeholder(String value) => _blink.BlinkHTMLTextAreaElement.$placeholder_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  bool get readOnly => _blink.Native_HTMLTextAreaElement_readOnly_Getter(this);
+  bool get readOnly => _blink.BlinkHTMLTextAreaElement.$readOnly_Getter(this);
 
   @DomName('HTMLTextAreaElement.readOnly')
   @DocsEditable()
-  void set readOnly(bool value) => _blink.Native_HTMLTextAreaElement_readOnly_Setter(this, value);
+  void set readOnly(bool value) => _blink.BlinkHTMLTextAreaElement.$readOnly_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  bool get required => _blink.Native_HTMLTextAreaElement_required_Getter(this);
+  bool get required => _blink.BlinkHTMLTextAreaElement.$required_Getter(this);
 
   @DomName('HTMLTextAreaElement.required')
   @DocsEditable()
-  void set required(bool value) => _blink.Native_HTMLTextAreaElement_required_Setter(this, value);
+  void set required(bool value) => _blink.BlinkHTMLTextAreaElement.$required_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  int get rows => _blink.Native_HTMLTextAreaElement_rows_Getter(this);
+  int get rows => _blink.BlinkHTMLTextAreaElement.$rows_Getter(this);
 
   @DomName('HTMLTextAreaElement.rows')
   @DocsEditable()
-  void set rows(int value) => _blink.Native_HTMLTextAreaElement_rows_Setter(this, value);
+  void set rows(int value) => _blink.BlinkHTMLTextAreaElement.$rows_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  String get selectionDirection => _blink.Native_HTMLTextAreaElement_selectionDirection_Getter(this);
+  String get selectionDirection => _blink.BlinkHTMLTextAreaElement.$selectionDirection_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionDirection')
   @DocsEditable()
-  void set selectionDirection(String value) => _blink.Native_HTMLTextAreaElement_selectionDirection_Setter(this, value);
+  void set selectionDirection(String value) => _blink.BlinkHTMLTextAreaElement.$selectionDirection_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  int get selectionEnd => _blink.Native_HTMLTextAreaElement_selectionEnd_Getter(this);
+  int get selectionEnd => _blink.BlinkHTMLTextAreaElement.$selectionEnd_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionEnd')
   @DocsEditable()
-  void set selectionEnd(int value) => _blink.Native_HTMLTextAreaElement_selectionEnd_Setter(this, value);
+  void set selectionEnd(int value) => _blink.BlinkHTMLTextAreaElement.$selectionEnd_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  int get selectionStart => _blink.Native_HTMLTextAreaElement_selectionStart_Getter(this);
+  int get selectionStart => _blink.BlinkHTMLTextAreaElement.$selectionStart_Getter(this);
 
   @DomName('HTMLTextAreaElement.selectionStart')
   @DocsEditable()
-  void set selectionStart(int value) => _blink.Native_HTMLTextAreaElement_selectionStart_Setter(this, value);
+  void set selectionStart(int value) => _blink.BlinkHTMLTextAreaElement.$selectionStart_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.textLength')
   @DocsEditable()
-  int get textLength => _blink.Native_HTMLTextAreaElement_textLength_Getter(this);
+  int get textLength => _blink.BlinkHTMLTextAreaElement.$textLength_Getter(this);
 
   @DomName('HTMLTextAreaElement.type')
   @DocsEditable()
-  String get type => _blink.Native_HTMLTextAreaElement_type_Getter(this);
+  String get type => _blink.BlinkHTMLTextAreaElement.$type_Getter(this);
 
   @DomName('HTMLTextAreaElement.validationMessage')
   @DocsEditable()
-  String get validationMessage => _blink.Native_HTMLTextAreaElement_validationMessage_Getter(this);
+  String get validationMessage => _blink.BlinkHTMLTextAreaElement.$validationMessage_Getter(this);
 
   @DomName('HTMLTextAreaElement.validity')
   @DocsEditable()
-  ValidityState get validity => _blink.Native_HTMLTextAreaElement_validity_Getter(this);
+  ValidityState get validity => _blink.BlinkHTMLTextAreaElement.$validity_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  String get value => _blink.Native_HTMLTextAreaElement_value_Getter(this);
+  String get value => _blink.BlinkHTMLTextAreaElement.$value_Getter(this);
 
   @DomName('HTMLTextAreaElement.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_HTMLTextAreaElement_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkHTMLTextAreaElement.$value_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.willValidate')
   @DocsEditable()
-  bool get willValidate => _blink.Native_HTMLTextAreaElement_willValidate_Getter(this);
+  bool get willValidate => _blink.BlinkHTMLTextAreaElement.$willValidate_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  String get wrap => _blink.Native_HTMLTextAreaElement_wrap_Getter(this);
+  String get wrap => _blink.BlinkHTMLTextAreaElement.$wrap_Getter(this);
 
   @DomName('HTMLTextAreaElement.wrap')
   @DocsEditable()
-  void set wrap(String value) => _blink.Native_HTMLTextAreaElement_wrap_Setter(this, value);
+  void set wrap(String value) => _blink.BlinkHTMLTextAreaElement.$wrap_Setter(this, value);
 
   @DomName('HTMLTextAreaElement.checkValidity')
   @DocsEditable()
-  bool checkValidity() => _blink.Native_HTMLTextAreaElement_checkValidity_Callback(this);
+  bool checkValidity() => _blink.BlinkHTMLTextAreaElement.$checkValidity_Callback(this);
 
   @DomName('HTMLTextAreaElement.select')
   @DocsEditable()
-  void select() => _blink.Native_HTMLTextAreaElement_select_Callback(this);
+  void select() => _blink.BlinkHTMLTextAreaElement.$select_Callback(this);
 
   @DomName('HTMLTextAreaElement.setCustomValidity')
   @DocsEditable()
-  void setCustomValidity(String error) => _blink.Native_HTMLTextAreaElement_setCustomValidity_Callback(this, error);
+  void setCustomValidity(String error) => _blink.BlinkHTMLTextAreaElement.$setCustomValidity_Callback(this, error);
 
-  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.Native_HTMLTextAreaElement_setRangeText(this, replacement, start, end, selectionMode);
+  void setRangeText(String replacement, {int start, int end, String selectionMode}) => _blink.BlinkHTMLTextAreaElement.$setRangeText(this, replacement, start, end, selectionMode);
 
-  void setSelectionRange(int start, int end, [String direction]) => _blink.Native_HTMLTextAreaElement_setSelectionRange(this, start, end, direction);
+  void setSelectionRange(int start, int end, [String direction]) => _blink.BlinkHTMLTextAreaElement.$setSelectionRange(this, start, end, direction);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -26986,11 +26986,11 @@
 
   @DomName('TextEvent.data')
   @DocsEditable()
-  String get data => _blink.Native_TextEvent_data_Getter(this);
+  String get data => _blink.BlinkTextEvent.$data_Getter(this);
 
   @DomName('TextEvent.initTextEvent')
   @DocsEditable()
-  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.Native_TextEvent_initTextEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
+  void _initTextEvent(String typeArg, bool canBubbleArg, bool cancelableArg, Window viewArg, String dataArg) => _blink.BlinkTextEvent.$initTextEvent_Callback(this, typeArg, canBubbleArg, cancelableArg, viewArg, dataArg);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27008,7 +27008,7 @@
 
   @DomName('TextMetrics.width')
   @DocsEditable()
-  double get width => _blink.Native_TextMetrics_width_Getter(this);
+  double get width => _blink.BlinkTextMetrics.$width_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27038,59 +27038,59 @@
 
   @DomName('TextTrack.activeCues')
   @DocsEditable()
-  TextTrackCueList get activeCues => _blink.Native_TextTrack_activeCues_Getter(this);
+  TextTrackCueList get activeCues => _blink.BlinkTextTrack.$activeCues_Getter(this);
 
   @DomName('TextTrack.cues')
   @DocsEditable()
-  TextTrackCueList get cues => _blink.Native_TextTrack_cues_Getter(this);
+  TextTrackCueList get cues => _blink.BlinkTextTrack.$cues_Getter(this);
 
   @DomName('TextTrack.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_TextTrack_id_Getter(this);
+  String get id => _blink.BlinkTextTrack.$id_Getter(this);
 
   @DomName('TextTrack.kind')
   @DocsEditable()
-  String get kind => _blink.Native_TextTrack_kind_Getter(this);
+  String get kind => _blink.BlinkTextTrack.$kind_Getter(this);
 
   @DomName('TextTrack.label')
   @DocsEditable()
-  String get label => _blink.Native_TextTrack_label_Getter(this);
+  String get label => _blink.BlinkTextTrack.$label_Getter(this);
 
   @DomName('TextTrack.language')
   @DocsEditable()
-  String get language => _blink.Native_TextTrack_language_Getter(this);
+  String get language => _blink.BlinkTextTrack.$language_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  String get mode => _blink.Native_TextTrack_mode_Getter(this);
+  String get mode => _blink.BlinkTextTrack.$mode_Getter(this);
 
   @DomName('TextTrack.mode')
   @DocsEditable()
-  void set mode(String value) => _blink.Native_TextTrack_mode_Setter(this, value);
+  void set mode(String value) => _blink.BlinkTextTrack.$mode_Setter(this, value);
 
   @DomName('TextTrack.regions')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegionList get regions => _blink.Native_TextTrack_regions_Getter(this);
+  VttRegionList get regions => _blink.BlinkTextTrack.$regions_Getter(this);
 
   @DomName('TextTrack.addCue')
   @DocsEditable()
-  void addCue(TextTrackCue cue) => _blink.Native_TextTrack_addCue_Callback(this, cue);
+  void addCue(TextTrackCue cue) => _blink.BlinkTextTrack.$addCue_Callback(this, cue);
 
   @DomName('TextTrack.addRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void addRegion(VttRegion region) => _blink.Native_TextTrack_addRegion_Callback(this, region);
+  void addRegion(VttRegion region) => _blink.BlinkTextTrack.$addRegion_Callback(this, region);
 
   @DomName('TextTrack.removeCue')
   @DocsEditable()
-  void removeCue(TextTrackCue cue) => _blink.Native_TextTrack_removeCue_Callback(this, cue);
+  void removeCue(TextTrackCue cue) => _blink.BlinkTextTrack.$removeCue_Callback(this, cue);
 
   @DomName('TextTrack.removeRegion')
   @DocsEditable()
   @Experimental() // untriaged
-  void removeRegion(VttRegion region) => _blink.Native_TextTrack_removeRegion_Callback(this, region);
+  void removeRegion(VttRegion region) => _blink.BlinkTextTrack.$removeRegion_Callback(this, region);
 
   /// Stream of `cuechange` events handled by this [TextTrack].
   @DomName('TextTrack.oncuechange')
@@ -27135,39 +27135,39 @@
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  num get endTime => _blink.Native_TextTrackCue_endTime_Getter(this);
+  num get endTime => _blink.BlinkTextTrackCue.$endTime_Getter(this);
 
   @DomName('TextTrackCue.endTime')
   @DocsEditable()
-  void set endTime(num value) => _blink.Native_TextTrackCue_endTime_Setter(this, value);
+  void set endTime(num value) => _blink.BlinkTextTrackCue.$endTime_Setter(this, value);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  String get id => _blink.Native_TextTrackCue_id_Getter(this);
+  String get id => _blink.BlinkTextTrackCue.$id_Getter(this);
 
   @DomName('TextTrackCue.id')
   @DocsEditable()
-  void set id(String value) => _blink.Native_TextTrackCue_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkTextTrackCue.$id_Setter(this, value);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  bool get pauseOnExit => _blink.Native_TextTrackCue_pauseOnExit_Getter(this);
+  bool get pauseOnExit => _blink.BlinkTextTrackCue.$pauseOnExit_Getter(this);
 
   @DomName('TextTrackCue.pauseOnExit')
   @DocsEditable()
-  void set pauseOnExit(bool value) => _blink.Native_TextTrackCue_pauseOnExit_Setter(this, value);
+  void set pauseOnExit(bool value) => _blink.BlinkTextTrackCue.$pauseOnExit_Setter(this, value);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  num get startTime => _blink.Native_TextTrackCue_startTime_Getter(this);
+  num get startTime => _blink.BlinkTextTrackCue.$startTime_Getter(this);
 
   @DomName('TextTrackCue.startTime')
   @DocsEditable()
-  void set startTime(num value) => _blink.Native_TextTrackCue_startTime_Setter(this, value);
+  void set startTime(num value) => _blink.BlinkTextTrackCue.$startTime_Setter(this, value);
 
   @DomName('TextTrackCue.track')
   @DocsEditable()
-  TextTrack get track => _blink.Native_TextTrackCue_track_Getter(this);
+  TextTrack get track => _blink.BlinkTextTrackCue.$track_Getter(this);
 
   /// Stream of `enter` events handled by this [TextTrackCue].
   @DomName('TextTrackCue.onenter')
@@ -27197,15 +27197,15 @@
 
   @DomName('TextTrackCueList.length')
   @DocsEditable()
-  int get length => _blink.Native_TextTrackCueList_length_Getter(this);
+  int get length => _blink.BlinkTextTrackCueList.$length_Getter(this);
 
   TextTrackCue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTextTrackCueList.$NativeIndexed_Getter(this, index);
   }
 
-  TextTrackCue _nativeIndexedGetter(int index) => _blink.Native_TextTrackCueList_NativeIndexed_Getter(this, index);
+  TextTrackCue _nativeIndexedGetter(int index) => _blink.BlinkTextTrackCueList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrackCue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27247,11 +27247,11 @@
 
   @DomName('TextTrackCueList.getCueById')
   @DocsEditable()
-  TextTrackCue getCueById(String id) => _blink.Native_TextTrackCueList_getCueById_Callback(this, id);
+  TextTrackCue getCueById(String id) => _blink.BlinkTextTrackCueList.$getCueById_Callback(this, id);
 
   @DomName('TextTrackCueList.item')
   @DocsEditable()
-  TextTrackCue item(int index) => _blink.Native_TextTrackCueList_item_Callback(this, index);
+  TextTrackCue item(int index) => _blink.BlinkTextTrackCueList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27286,15 +27286,15 @@
 
   @DomName('TextTrackList.length')
   @DocsEditable()
-  int get length => _blink.Native_TextTrackList_length_Getter(this);
+  int get length => _blink.BlinkTextTrackList.$length_Getter(this);
 
   TextTrack operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTextTrackList.$NativeIndexed_Getter(this, index);
   }
 
-  TextTrack _nativeIndexedGetter(int index) => _blink.Native_TextTrackList_NativeIndexed_Getter(this, index);
+  TextTrack _nativeIndexedGetter(int index) => _blink.BlinkTextTrackList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, TextTrack value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27337,11 +27337,11 @@
   @DomName('TextTrackList.getTrackById')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack getTrackById(String id) => _blink.Native_TextTrackList_getTrackById_Callback(this, id);
+  TextTrack getTrackById(String id) => _blink.BlinkTextTrackList.$getTrackById_Callback(this, id);
 
   @DomName('TextTrackList.item')
   @DocsEditable()
-  TextTrack item(int index) => _blink.Native_TextTrackList_item_Callback(this, index);
+  TextTrack item(int index) => _blink.BlinkTextTrackList.$item_Callback(this, index);
 
   /// Stream of `addtrack` events handled by this [TextTrackList].
   @DomName('TextTrackList.onaddtrack')
@@ -27370,15 +27370,15 @@
 
   @DomName('TimeRanges.length')
   @DocsEditable()
-  int get length => _blink.Native_TimeRanges_length_Getter(this);
+  int get length => _blink.BlinkTimeRanges.$length_Getter(this);
 
   @DomName('TimeRanges.end')
   @DocsEditable()
-  double end(int index) => _blink.Native_TimeRanges_end_Callback(this, index);
+  double end(int index) => _blink.BlinkTimeRanges.$end_Callback(this, index);
 
   @DomName('TimeRanges.start')
   @DocsEditable()
-  double start(int index) => _blink.Native_TimeRanges_start_Callback(this, index);
+  double start(int index) => _blink.BlinkTimeRanges.$start_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27398,37 +27398,37 @@
   @DomName('TimedItem.activeDuration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get activeDuration => _blink.Native_TimedItem_activeDuration_Getter(this);
+  double get activeDuration => _blink.BlinkTimedItem.$activeDuration_Getter(this);
 
   @DomName('TimedItem.currentIteration')
   @DocsEditable()
   @Experimental() // untriaged
-  int get currentIteration => _blink.Native_TimedItem_currentIteration_Getter(this);
+  int get currentIteration => _blink.BlinkTimedItem.$currentIteration_Getter(this);
 
   @DomName('TimedItem.duration')
   @DocsEditable()
   @Experimental() // untriaged
-  double get duration => _blink.Native_TimedItem_duration_Getter(this);
+  double get duration => _blink.BlinkTimedItem.$duration_Getter(this);
 
   @DomName('TimedItem.endTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get endTime => _blink.Native_TimedItem_endTime_Getter(this);
+  double get endTime => _blink.BlinkTimedItem.$endTime_Getter(this);
 
   @DomName('TimedItem.localTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get localTime => _blink.Native_TimedItem_localTime_Getter(this);
+  double get localTime => _blink.BlinkTimedItem.$localTime_Getter(this);
 
   @DomName('TimedItem.player')
   @DocsEditable()
   @Experimental() // untriaged
-  Player get player => _blink.Native_TimedItem_player_Getter(this);
+  Player get player => _blink.BlinkTimedItem.$player_Getter(this);
 
   @DomName('TimedItem.startTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get startTime => _blink.Native_TimedItem_startTime_Getter(this);
+  double get startTime => _blink.BlinkTimedItem.$startTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27448,7 +27448,7 @@
   @DomName('Timeline.play')
   @DocsEditable()
   @Experimental() // untriaged
-  Player play(TimedItem source) => _blink.Native_Timeline_play_Callback(this, source);
+  Player play(TimedItem source) => _blink.BlinkTimeline.$play_Callback(this, source);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27477,87 +27477,87 @@
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get delay => _blink.Native_Timing_delay_Getter(this);
+  num get delay => _blink.BlinkTiming.$delay_Getter(this);
 
   @DomName('Timing.delay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set delay(num value) => _blink.Native_Timing_delay_Setter(this, value);
+  void set delay(num value) => _blink.BlinkTiming.$delay_Setter(this, value);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  String get direction => _blink.Native_Timing_direction_Getter(this);
+  String get direction => _blink.BlinkTiming.$direction_Getter(this);
 
   @DomName('Timing.direction')
   @DocsEditable()
   @Experimental() // untriaged
-  void set direction(String value) => _blink.Native_Timing_direction_Setter(this, value);
+  void set direction(String value) => _blink.BlinkTiming.$direction_Setter(this, value);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  String get easing => _blink.Native_Timing_easing_Getter(this);
+  String get easing => _blink.BlinkTiming.$easing_Getter(this);
 
   @DomName('Timing.easing')
   @DocsEditable()
   @Experimental() // untriaged
-  void set easing(String value) => _blink.Native_Timing_easing_Setter(this, value);
+  void set easing(String value) => _blink.BlinkTiming.$easing_Setter(this, value);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  num get endDelay => _blink.Native_Timing_endDelay_Getter(this);
+  num get endDelay => _blink.BlinkTiming.$endDelay_Getter(this);
 
   @DomName('Timing.endDelay')
   @DocsEditable()
   @Experimental() // untriaged
-  void set endDelay(num value) => _blink.Native_Timing_endDelay_Setter(this, value);
+  void set endDelay(num value) => _blink.BlinkTiming.$endDelay_Setter(this, value);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  String get fill => _blink.Native_Timing_fill_Getter(this);
+  String get fill => _blink.BlinkTiming.$fill_Getter(this);
 
   @DomName('Timing.fill')
   @DocsEditable()
   @Experimental() // untriaged
-  void set fill(String value) => _blink.Native_Timing_fill_Setter(this, value);
+  void set fill(String value) => _blink.BlinkTiming.$fill_Setter(this, value);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterationStart => _blink.Native_Timing_iterationStart_Getter(this);
+  num get iterationStart => _blink.BlinkTiming.$iterationStart_Getter(this);
 
   @DomName('Timing.iterationStart')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterationStart(num value) => _blink.Native_Timing_iterationStart_Setter(this, value);
+  void set iterationStart(num value) => _blink.BlinkTiming.$iterationStart_Setter(this, value);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  num get iterations => _blink.Native_Timing_iterations_Getter(this);
+  num get iterations => _blink.BlinkTiming.$iterations_Getter(this);
 
   @DomName('Timing.iterations')
   @DocsEditable()
   @Experimental() // untriaged
-  void set iterations(num value) => _blink.Native_Timing_iterations_Setter(this, value);
+  void set iterations(num value) => _blink.BlinkTiming.$iterations_Setter(this, value);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  num get playbackRate => _blink.Native_Timing_playbackRate_Getter(this);
+  num get playbackRate => _blink.BlinkTiming.$playbackRate_Getter(this);
 
   @DomName('Timing.playbackRate')
   @DocsEditable()
   @Experimental() // untriaged
-  void set playbackRate(num value) => _blink.Native_Timing_playbackRate_Setter(this, value);
+  void set playbackRate(num value) => _blink.BlinkTiming.$playbackRate_Setter(this, value);
 
   @DomName('Timing.__setter__')
   @DocsEditable()
   @Experimental() // untriaged
-  void __setter__(String name, num duration) => _blink.Native_Timing___setter___Callback(this, name, duration);
+  void __setter__(String name, num duration) => _blink.BlinkTiming.$__setter___Callback(this, name, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27599,63 +27599,63 @@
 
   @DomName('Touch.clientX')
   @DocsEditable()
-  int get _clientX => _blink.Native_Touch_clientX_Getter(this);
+  int get _clientX => _blink.BlinkTouch.$clientX_Getter(this);
 
   @DomName('Touch.clientY')
   @DocsEditable()
-  int get _clientY => _blink.Native_Touch_clientY_Getter(this);
+  int get _clientY => _blink.BlinkTouch.$clientY_Getter(this);
 
   @DomName('Touch.identifier')
   @DocsEditable()
-  int get identifier => _blink.Native_Touch_identifier_Getter(this);
+  int get identifier => _blink.BlinkTouch.$identifier_Getter(this);
 
   @DomName('Touch.pageX')
   @DocsEditable()
-  int get _pageX => _blink.Native_Touch_pageX_Getter(this);
+  int get _pageX => _blink.BlinkTouch.$pageX_Getter(this);
 
   @DomName('Touch.pageY')
   @DocsEditable()
-  int get _pageY => _blink.Native_Touch_pageY_Getter(this);
+  int get _pageY => _blink.BlinkTouch.$pageY_Getter(this);
 
   @DomName('Touch.screenX')
   @DocsEditable()
-  int get _screenX => _blink.Native_Touch_screenX_Getter(this);
+  int get _screenX => _blink.BlinkTouch.$screenX_Getter(this);
 
   @DomName('Touch.screenY')
   @DocsEditable()
-  int get _screenY => _blink.Native_Touch_screenY_Getter(this);
+  int get _screenY => _blink.BlinkTouch.$screenY_Getter(this);
 
   @DomName('Touch.target')
   @DocsEditable()
-  EventTarget get target => _blink.Native_Touch_target_Getter(this);
+  EventTarget get target => _blink.BlinkTouch.$target_Getter(this);
 
   @DomName('Touch.webkitForce')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get force => _blink.Native_Touch_webkitForce_Getter(this);
+  double get force => _blink.BlinkTouch.$webkitForce_Getter(this);
 
   @DomName('Touch.webkitRadiusX')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusX => _blink.Native_Touch_webkitRadiusX_Getter(this);
+  int get radiusX => _blink.BlinkTouch.$webkitRadiusX_Getter(this);
 
   @DomName('Touch.webkitRadiusY')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get radiusY => _blink.Native_Touch_webkitRadiusY_Getter(this);
+  int get radiusY => _blink.BlinkTouch.$webkitRadiusY_Getter(this);
 
   @DomName('Touch.webkitRotationAngle')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  double get rotationAngle => _blink.Native_Touch_webkitRotationAngle_Getter(this);
+  double get rotationAngle => _blink.BlinkTouch.$webkitRotationAngle_Getter(this);
 
 
   @DomName('Touch.clientX')
@@ -27699,35 +27699,35 @@
 
   @DomName('TouchEvent.altKey')
   @DocsEditable()
-  bool get altKey => _blink.Native_TouchEvent_altKey_Getter(this);
+  bool get altKey => _blink.BlinkTouchEvent.$altKey_Getter(this);
 
   @DomName('TouchEvent.changedTouches')
   @DocsEditable()
-  TouchList get changedTouches => _blink.Native_TouchEvent_changedTouches_Getter(this);
+  TouchList get changedTouches => _blink.BlinkTouchEvent.$changedTouches_Getter(this);
 
   @DomName('TouchEvent.ctrlKey')
   @DocsEditable()
-  bool get ctrlKey => _blink.Native_TouchEvent_ctrlKey_Getter(this);
+  bool get ctrlKey => _blink.BlinkTouchEvent.$ctrlKey_Getter(this);
 
   @DomName('TouchEvent.metaKey')
   @DocsEditable()
-  bool get metaKey => _blink.Native_TouchEvent_metaKey_Getter(this);
+  bool get metaKey => _blink.BlinkTouchEvent.$metaKey_Getter(this);
 
   @DomName('TouchEvent.shiftKey')
   @DocsEditable()
-  bool get shiftKey => _blink.Native_TouchEvent_shiftKey_Getter(this);
+  bool get shiftKey => _blink.BlinkTouchEvent.$shiftKey_Getter(this);
 
   @DomName('TouchEvent.targetTouches')
   @DocsEditable()
-  TouchList get targetTouches => _blink.Native_TouchEvent_targetTouches_Getter(this);
+  TouchList get targetTouches => _blink.BlinkTouchEvent.$targetTouches_Getter(this);
 
   @DomName('TouchEvent.touches')
   @DocsEditable()
-  TouchList get touches => _blink.Native_TouchEvent_touches_Getter(this);
+  TouchList get touches => _blink.BlinkTouchEvent.$touches_Getter(this);
 
   @DomName('TouchEvent.initTouchEvent')
   @DocsEditable()
-  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_TouchEvent_initTouchEvent_Callback(this, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  void _initTouchEvent(TouchList touches, TouchList targetTouches, TouchList changedTouches, String type, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkTouchEvent.$initTouchEvent_Callback(this, touches, targetTouches, changedTouches, type, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -27762,15 +27762,15 @@
 
   @DomName('TouchList.length')
   @DocsEditable()
-  int get length => _blink.Native_TouchList_length_Getter(this);
+  int get length => _blink.BlinkTouchList.$length_Getter(this);
 
   Touch operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_TouchList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkTouchList.$NativeIndexed_Getter(this, index);
   }
 
-  Touch _nativeIndexedGetter(int index) => _blink.Native_TouchList_NativeIndexed_Getter(this, index);
+  Touch _nativeIndexedGetter(int index) => _blink.BlinkTouchList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Touch value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -27812,7 +27812,7 @@
 
   @DomName('TouchList.item')
   @DocsEditable()
-  Touch item(int index) => _blink.Native_TouchList_item_Callback(this, index);
+  Touch item(int index) => _blink.BlinkTouchList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27864,51 +27864,51 @@
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  bool get defaultValue => _blink.Native_HTMLTrackElement_default_Getter(this);
+  bool get defaultValue => _blink.BlinkHTMLTrackElement.$default_Getter(this);
 
   @DomName('HTMLTrackElement.default')
   @DocsEditable()
-  void set defaultValue(bool value) => _blink.Native_HTMLTrackElement_default_Setter(this, value);
+  void set defaultValue(bool value) => _blink.BlinkHTMLTrackElement.$default_Setter(this, value);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  String get kind => _blink.Native_HTMLTrackElement_kind_Getter(this);
+  String get kind => _blink.BlinkHTMLTrackElement.$kind_Getter(this);
 
   @DomName('HTMLTrackElement.kind')
   @DocsEditable()
-  void set kind(String value) => _blink.Native_HTMLTrackElement_kind_Setter(this, value);
+  void set kind(String value) => _blink.BlinkHTMLTrackElement.$kind_Setter(this, value);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  String get label => _blink.Native_HTMLTrackElement_label_Getter(this);
+  String get label => _blink.BlinkHTMLTrackElement.$label_Getter(this);
 
   @DomName('HTMLTrackElement.label')
   @DocsEditable()
-  void set label(String value) => _blink.Native_HTMLTrackElement_label_Setter(this, value);
+  void set label(String value) => _blink.BlinkHTMLTrackElement.$label_Setter(this, value);
 
   @DomName('HTMLTrackElement.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_HTMLTrackElement_readyState_Getter(this);
+  int get readyState => _blink.BlinkHTMLTrackElement.$readyState_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  String get src => _blink.Native_HTMLTrackElement_src_Getter(this);
+  String get src => _blink.BlinkHTMLTrackElement.$src_Getter(this);
 
   @DomName('HTMLTrackElement.src')
   @DocsEditable()
-  void set src(String value) => _blink.Native_HTMLTrackElement_src_Setter(this, value);
+  void set src(String value) => _blink.BlinkHTMLTrackElement.$src_Setter(this, value);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  String get srclang => _blink.Native_HTMLTrackElement_srclang_Getter(this);
+  String get srclang => _blink.BlinkHTMLTrackElement.$srclang_Getter(this);
 
   @DomName('HTMLTrackElement.srclang')
   @DocsEditable()
-  void set srclang(String value) => _blink.Native_HTMLTrackElement_srclang_Setter(this, value);
+  void set srclang(String value) => _blink.BlinkHTMLTrackElement.$srclang_Setter(this, value);
 
   @DomName('HTMLTrackElement.track')
   @DocsEditable()
-  TextTrack get track => _blink.Native_HTMLTrackElement_track_Getter(this);
+  TextTrack get track => _blink.BlinkHTMLTrackElement.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27927,7 +27927,7 @@
 
   @DomName('TrackEvent.track')
   @DocsEditable()
-  Object get track => _blink.Native_TrackEvent_track_Getter(this);
+  Object get track => _blink.BlinkTrackEvent.$track_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -27945,15 +27945,15 @@
 
   @DomName('TransitionEvent.elapsedTime')
   @DocsEditable()
-  double get elapsedTime => _blink.Native_TransitionEvent_elapsedTime_Getter(this);
+  double get elapsedTime => _blink.BlinkTransitionEvent.$elapsedTime_Getter(this);
 
   @DomName('TransitionEvent.propertyName')
   @DocsEditable()
-  String get propertyName => _blink.Native_TransitionEvent_propertyName_Getter(this);
+  String get propertyName => _blink.BlinkTransitionEvent.$propertyName_Getter(this);
 
   @DomName('TransitionEvent.pseudoElement')
   @DocsEditable()
-  String get pseudoElement => _blink.Native_TransitionEvent_pseudoElement_Getter(this);
+  String get pseudoElement => _blink.BlinkTransitionEvent.$pseudoElement_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -27972,51 +27972,51 @@
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  Node get currentNode => _blink.Native_TreeWalker_currentNode_Getter(this);
+  Node get currentNode => _blink.BlinkTreeWalker.$currentNode_Getter(this);
 
   @DomName('TreeWalker.currentNode')
   @DocsEditable()
-  void set currentNode(Node value) => _blink.Native_TreeWalker_currentNode_Setter(this, value);
+  void set currentNode(Node value) => _blink.BlinkTreeWalker.$currentNode_Setter(this, value);
 
   @DomName('TreeWalker.filter')
   @DocsEditable()
-  NodeFilter get filter => _blink.Native_TreeWalker_filter_Getter(this);
+  NodeFilter get filter => _blink.BlinkTreeWalker.$filter_Getter(this);
 
   @DomName('TreeWalker.root')
   @DocsEditable()
-  Node get root => _blink.Native_TreeWalker_root_Getter(this);
+  Node get root => _blink.BlinkTreeWalker.$root_Getter(this);
 
   @DomName('TreeWalker.whatToShow')
   @DocsEditable()
-  int get whatToShow => _blink.Native_TreeWalker_whatToShow_Getter(this);
+  int get whatToShow => _blink.BlinkTreeWalker.$whatToShow_Getter(this);
 
   @DomName('TreeWalker.firstChild')
   @DocsEditable()
-  Node firstChild() => _blink.Native_TreeWalker_firstChild_Callback(this);
+  Node firstChild() => _blink.BlinkTreeWalker.$firstChild_Callback(this);
 
   @DomName('TreeWalker.lastChild')
   @DocsEditable()
-  Node lastChild() => _blink.Native_TreeWalker_lastChild_Callback(this);
+  Node lastChild() => _blink.BlinkTreeWalker.$lastChild_Callback(this);
 
   @DomName('TreeWalker.nextNode')
   @DocsEditable()
-  Node nextNode() => _blink.Native_TreeWalker_nextNode_Callback(this);
+  Node nextNode() => _blink.BlinkTreeWalker.$nextNode_Callback(this);
 
   @DomName('TreeWalker.nextSibling')
   @DocsEditable()
-  Node nextSibling() => _blink.Native_TreeWalker_nextSibling_Callback(this);
+  Node nextSibling() => _blink.BlinkTreeWalker.$nextSibling_Callback(this);
 
   @DomName('TreeWalker.parentNode')
   @DocsEditable()
-  Node parentNode() => _blink.Native_TreeWalker_parentNode_Callback(this);
+  Node parentNode() => _blink.BlinkTreeWalker.$parentNode_Callback(this);
 
   @DomName('TreeWalker.previousNode')
   @DocsEditable()
-  Node previousNode() => _blink.Native_TreeWalker_previousNode_Callback(this);
+  Node previousNode() => _blink.BlinkTreeWalker.$previousNode_Callback(this);
 
   @DomName('TreeWalker.previousSibling')
   @DocsEditable()
-  Node previousSibling() => _blink.Native_TreeWalker_previousSibling_Callback(this);
+  Node previousSibling() => _blink.BlinkTreeWalker.$previousSibling_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28050,53 +28050,53 @@
   @DomName('UIEvent.charCode')
   @DocsEditable()
   @Unstable()
-  int get _charCode => _blink.Native_UIEvent_charCode_Getter(this);
+  int get _charCode => _blink.BlinkUIEvent.$charCode_Getter(this);
 
   @DomName('UIEvent.detail')
   @DocsEditable()
-  int get detail => _blink.Native_UIEvent_detail_Getter(this);
+  int get detail => _blink.BlinkUIEvent.$detail_Getter(this);
 
   @DomName('UIEvent.keyCode')
   @DocsEditable()
   @Unstable()
-  int get _keyCode => _blink.Native_UIEvent_keyCode_Getter(this);
+  int get _keyCode => _blink.BlinkUIEvent.$keyCode_Getter(this);
 
   @DomName('UIEvent.layerX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerX => _blink.Native_UIEvent_layerX_Getter(this);
+  int get _layerX => _blink.BlinkUIEvent.$layerX_Getter(this);
 
   @DomName('UIEvent.layerY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _layerY => _blink.Native_UIEvent_layerY_Getter(this);
+  int get _layerY => _blink.BlinkUIEvent.$layerY_Getter(this);
 
   @DomName('UIEvent.pageX')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageX => _blink.Native_UIEvent_pageX_Getter(this);
+  int get _pageX => _blink.BlinkUIEvent.$pageX_Getter(this);
 
   @DomName('UIEvent.pageY')
   @DocsEditable()
   // http://dev.w3.org/2006/webapi/DOM-Level-3-Events/html/DOM3-Events.html#events-mouseevents
   @Experimental() // nonstandard
-  int get _pageY => _blink.Native_UIEvent_pageY_Getter(this);
+  int get _pageY => _blink.BlinkUIEvent.$pageY_Getter(this);
 
   @DomName('UIEvent.view')
   @DocsEditable()
-  WindowBase get view => _blink.Native_UIEvent_view_Getter(this);
+  WindowBase get view => _blink.BlinkUIEvent.$view_Getter(this);
 
   @DomName('UIEvent.which')
   @DocsEditable()
   @Unstable()
-  int get which => _blink.Native_UIEvent_which_Getter(this);
+  int get which => _blink.BlinkUIEvent.$which_Getter(this);
 
   @DomName('UIEvent.initUIEvent')
   @DocsEditable()
-  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.Native_UIEvent_initUIEvent_Callback(this, type, canBubble, cancelable, view, detail);
+  void _initUIEvent(String type, bool canBubble, bool cancelable, Window view, int detail) => _blink.BlinkUIEvent.$initUIEvent_Callback(this, type, canBubble, cancelable, view, detail);
 
 
   @DomName('UIEvent.layerX')
@@ -28164,133 +28164,133 @@
   // To suppress missing implicit constructor warnings.
   factory Url._() { throw new UnsupportedError("Not supported"); }
 
-  static String createObjectUrl(blob_OR_source_OR_stream) => _blink.Native_URL_createObjectUrl(blob_OR_source_OR_stream);
+  static String createObjectUrl(blob_OR_source_OR_stream) => _blink.BlinkURL.$createObjectUrl(blob_OR_source_OR_stream);
 
   @DomName('URL.createObjectUrlFromBlob')
   @DocsEditable()
-  static String createObjectUrlFromBlob(Blob blob) => _blink.Native_URL_createObjectUrlFromBlob_Callback(blob);
+  static String createObjectUrlFromBlob(Blob blob) => _blink.BlinkURL.$createObjectUrlFromBlob_Callback(blob);
 
   @DomName('URL.createObjectUrlFromSource')
   @DocsEditable()
-  static String createObjectUrlFromSource(MediaSource source) => _blink.Native_URL_createObjectUrlFromSource_Callback(source);
+  static String createObjectUrlFromSource(MediaSource source) => _blink.BlinkURL.$createObjectUrlFromSource_Callback(source);
 
   @DomName('URL.createObjectUrlFromStream')
   @DocsEditable()
-  static String createObjectUrlFromStream(MediaStream stream) => _blink.Native_URL_createObjectUrlFromStream_Callback(stream);
+  static String createObjectUrlFromStream(MediaStream stream) => _blink.BlinkURL.$createObjectUrlFromStream_Callback(stream);
 
   @DomName('URL.revokeObjectURL')
   @DocsEditable()
-  static void revokeObjectUrl(String url) => _blink.Native_URL_revokeObjectURL_Callback(url);
+  static void revokeObjectUrl(String url) => _blink.BlinkURL.$revokeObjectURL_Callback(url);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URL_hash_Getter(this);
+  String get hash => _blink.BlinkURL.$hash_Getter(this);
 
   @DomName('URL.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.Native_URL_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkURL.$hash_Setter(this, value);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URL_host_Getter(this);
+  String get host => _blink.BlinkURL.$host_Getter(this);
 
   @DomName('URL.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.Native_URL_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkURL.$host_Setter(this, value);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URL_hostname_Getter(this);
+  String get hostname => _blink.BlinkURL.$hostname_Getter(this);
 
   @DomName('URL.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.Native_URL_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkURL.$hostname_Setter(this, value);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URL_href_Getter(this);
+  String get href => _blink.BlinkURL.$href_Getter(this);
 
   @DomName('URL.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.Native_URL_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkURL.$href_Setter(this, value);
 
   @DomName('URL.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_URL_origin_Getter(this);
+  String get origin => _blink.BlinkURL.$origin_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_URL_password_Getter(this);
+  String get password => _blink.BlinkURL.$password_Getter(this);
 
   @DomName('URL.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_URL_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkURL.$password_Setter(this, value);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URL_pathname_Getter(this);
+  String get pathname => _blink.BlinkURL.$pathname_Getter(this);
 
   @DomName('URL.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.Native_URL_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkURL.$pathname_Setter(this, value);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URL_port_Getter(this);
+  String get port => _blink.BlinkURL.$port_Getter(this);
 
   @DomName('URL.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.Native_URL_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkURL.$port_Setter(this, value);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URL_protocol_Getter(this);
+  String get protocol => _blink.BlinkURL.$protocol_Getter(this);
 
   @DomName('URL.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.Native_URL_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkURL.$protocol_Setter(this, value);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URL_search_Getter(this);
+  String get search => _blink.BlinkURL.$search_Getter(this);
 
   @DomName('URL.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.Native_URL_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkURL.$search_Setter(this, value);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_URL_username_Getter(this);
+  String get username => _blink.BlinkURL.$username_Getter(this);
 
   @DomName('URL.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_URL_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkURL.$username_Setter(this, value);
 
   @DomName('URL.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URL_toString_Callback(this);
+  String toString() => _blink.BlinkURL.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28310,112 +28310,112 @@
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URLUtils_hash_Getter(this);
+  String get hash => _blink.BlinkURLUtils.$hash_Getter(this);
 
   @DomName('URLUtils.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hash(String value) => _blink.Native_URLUtils_hash_Setter(this, value);
+  void set hash(String value) => _blink.BlinkURLUtils.$hash_Setter(this, value);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URLUtils_host_Getter(this);
+  String get host => _blink.BlinkURLUtils.$host_Getter(this);
 
   @DomName('URLUtils.host')
   @DocsEditable()
   @Experimental() // untriaged
-  void set host(String value) => _blink.Native_URLUtils_host_Setter(this, value);
+  void set host(String value) => _blink.BlinkURLUtils.$host_Setter(this, value);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URLUtils_hostname_Getter(this);
+  String get hostname => _blink.BlinkURLUtils.$hostname_Getter(this);
 
   @DomName('URLUtils.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set hostname(String value) => _blink.Native_URLUtils_hostname_Setter(this, value);
+  void set hostname(String value) => _blink.BlinkURLUtils.$hostname_Setter(this, value);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URLUtils_href_Getter(this);
+  String get href => _blink.BlinkURLUtils.$href_Getter(this);
 
   @DomName('URLUtils.href')
   @DocsEditable()
   @Experimental() // untriaged
-  void set href(String value) => _blink.Native_URLUtils_href_Setter(this, value);
+  void set href(String value) => _blink.BlinkURLUtils.$href_Setter(this, value);
 
   @DomName('URLUtils.origin')
   @DocsEditable()
   @Experimental() // untriaged
-  String get origin => _blink.Native_URLUtils_origin_Getter(this);
+  String get origin => _blink.BlinkURLUtils.$origin_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  String get password => _blink.Native_URLUtils_password_Getter(this);
+  String get password => _blink.BlinkURLUtils.$password_Getter(this);
 
   @DomName('URLUtils.password')
   @DocsEditable()
   @Experimental() // untriaged
-  void set password(String value) => _blink.Native_URLUtils_password_Setter(this, value);
+  void set password(String value) => _blink.BlinkURLUtils.$password_Setter(this, value);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URLUtils_pathname_Getter(this);
+  String get pathname => _blink.BlinkURLUtils.$pathname_Getter(this);
 
   @DomName('URLUtils.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  void set pathname(String value) => _blink.Native_URLUtils_pathname_Setter(this, value);
+  void set pathname(String value) => _blink.BlinkURLUtils.$pathname_Setter(this, value);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URLUtils_port_Getter(this);
+  String get port => _blink.BlinkURLUtils.$port_Getter(this);
 
   @DomName('URLUtils.port')
   @DocsEditable()
   @Experimental() // untriaged
-  void set port(String value) => _blink.Native_URLUtils_port_Setter(this, value);
+  void set port(String value) => _blink.BlinkURLUtils.$port_Setter(this, value);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URLUtils_protocol_Getter(this);
+  String get protocol => _blink.BlinkURLUtils.$protocol_Getter(this);
 
   @DomName('URLUtils.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  void set protocol(String value) => _blink.Native_URLUtils_protocol_Setter(this, value);
+  void set protocol(String value) => _blink.BlinkURLUtils.$protocol_Setter(this, value);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URLUtils_search_Getter(this);
+  String get search => _blink.BlinkURLUtils.$search_Getter(this);
 
   @DomName('URLUtils.search')
   @DocsEditable()
   @Experimental() // untriaged
-  void set search(String value) => _blink.Native_URLUtils_search_Setter(this, value);
+  void set search(String value) => _blink.BlinkURLUtils.$search_Setter(this, value);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  String get username => _blink.Native_URLUtils_username_Getter(this);
+  String get username => _blink.BlinkURLUtils.$username_Getter(this);
 
   @DomName('URLUtils.username')
   @DocsEditable()
   @Experimental() // untriaged
-  void set username(String value) => _blink.Native_URLUtils_username_Setter(this, value);
+  void set username(String value) => _blink.BlinkURLUtils.$username_Setter(this, value);
 
   @DomName('URLUtils.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URLUtils_toString_Callback(this);
+  String toString() => _blink.BlinkURLUtils.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28435,47 +28435,47 @@
   @DomName('URLUtilsReadOnly.hash')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hash => _blink.Native_URLUtilsReadOnly_hash_Getter(this);
+  String get hash => _blink.BlinkURLUtilsReadOnly.$hash_Getter(this);
 
   @DomName('URLUtilsReadOnly.host')
   @DocsEditable()
   @Experimental() // untriaged
-  String get host => _blink.Native_URLUtilsReadOnly_host_Getter(this);
+  String get host => _blink.BlinkURLUtilsReadOnly.$host_Getter(this);
 
   @DomName('URLUtilsReadOnly.hostname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get hostname => _blink.Native_URLUtilsReadOnly_hostname_Getter(this);
+  String get hostname => _blink.BlinkURLUtilsReadOnly.$hostname_Getter(this);
 
   @DomName('URLUtilsReadOnly.href')
   @DocsEditable()
   @Experimental() // untriaged
-  String get href => _blink.Native_URLUtilsReadOnly_href_Getter(this);
+  String get href => _blink.BlinkURLUtilsReadOnly.$href_Getter(this);
 
   @DomName('URLUtilsReadOnly.pathname')
   @DocsEditable()
   @Experimental() // untriaged
-  String get pathname => _blink.Native_URLUtilsReadOnly_pathname_Getter(this);
+  String get pathname => _blink.BlinkURLUtilsReadOnly.$pathname_Getter(this);
 
   @DomName('URLUtilsReadOnly.port')
   @DocsEditable()
   @Experimental() // untriaged
-  String get port => _blink.Native_URLUtilsReadOnly_port_Getter(this);
+  String get port => _blink.BlinkURLUtilsReadOnly.$port_Getter(this);
 
   @DomName('URLUtilsReadOnly.protocol')
   @DocsEditable()
   @Experimental() // untriaged
-  String get protocol => _blink.Native_URLUtilsReadOnly_protocol_Getter(this);
+  String get protocol => _blink.BlinkURLUtilsReadOnly.$protocol_Getter(this);
 
   @DomName('URLUtilsReadOnly.search')
   @DocsEditable()
   @Experimental() // untriaged
-  String get search => _blink.Native_URLUtilsReadOnly_search_Getter(this);
+  String get search => _blink.BlinkURLUtilsReadOnly.$search_Getter(this);
 
   @DomName('URLUtilsReadOnly.toString')
   @DocsEditable()
   @Experimental() // untriaged
-  String toString() => _blink.Native_URLUtilsReadOnly_toString_Callback(this);
+  String toString() => _blink.BlinkURLUtilsReadOnly.$toString_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28493,43 +28493,43 @@
 
   @DomName('ValidityState.badInput')
   @DocsEditable()
-  bool get badInput => _blink.Native_ValidityState_badInput_Getter(this);
+  bool get badInput => _blink.BlinkValidityState.$badInput_Getter(this);
 
   @DomName('ValidityState.customError')
   @DocsEditable()
-  bool get customError => _blink.Native_ValidityState_customError_Getter(this);
+  bool get customError => _blink.BlinkValidityState.$customError_Getter(this);
 
   @DomName('ValidityState.patternMismatch')
   @DocsEditable()
-  bool get patternMismatch => _blink.Native_ValidityState_patternMismatch_Getter(this);
+  bool get patternMismatch => _blink.BlinkValidityState.$patternMismatch_Getter(this);
 
   @DomName('ValidityState.rangeOverflow')
   @DocsEditable()
-  bool get rangeOverflow => _blink.Native_ValidityState_rangeOverflow_Getter(this);
+  bool get rangeOverflow => _blink.BlinkValidityState.$rangeOverflow_Getter(this);
 
   @DomName('ValidityState.rangeUnderflow')
   @DocsEditable()
-  bool get rangeUnderflow => _blink.Native_ValidityState_rangeUnderflow_Getter(this);
+  bool get rangeUnderflow => _blink.BlinkValidityState.$rangeUnderflow_Getter(this);
 
   @DomName('ValidityState.stepMismatch')
   @DocsEditable()
-  bool get stepMismatch => _blink.Native_ValidityState_stepMismatch_Getter(this);
+  bool get stepMismatch => _blink.BlinkValidityState.$stepMismatch_Getter(this);
 
   @DomName('ValidityState.tooLong')
   @DocsEditable()
-  bool get tooLong => _blink.Native_ValidityState_tooLong_Getter(this);
+  bool get tooLong => _blink.BlinkValidityState.$tooLong_Getter(this);
 
   @DomName('ValidityState.typeMismatch')
   @DocsEditable()
-  bool get typeMismatch => _blink.Native_ValidityState_typeMismatch_Getter(this);
+  bool get typeMismatch => _blink.BlinkValidityState.$typeMismatch_Getter(this);
 
   @DomName('ValidityState.valid')
   @DocsEditable()
-  bool get valid => _blink.Native_ValidityState_valid_Getter(this);
+  bool get valid => _blink.BlinkValidityState.$valid_Getter(this);
 
   @DomName('ValidityState.valueMissing')
   @DocsEditable()
-  bool get valueMissing => _blink.Native_ValidityState_valueMissing_Getter(this);
+  bool get valueMissing => _blink.BlinkValidityState.$valueMissing_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28554,54 +28554,54 @@
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  int get height => _blink.Native_HTMLVideoElement_height_Getter(this);
+  int get height => _blink.BlinkHTMLVideoElement.$height_Getter(this);
 
   @DomName('HTMLVideoElement.height')
   @DocsEditable()
-  void set height(int value) => _blink.Native_HTMLVideoElement_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkHTMLVideoElement.$height_Setter(this, value);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  String get poster => _blink.Native_HTMLVideoElement_poster_Getter(this);
+  String get poster => _blink.BlinkHTMLVideoElement.$poster_Getter(this);
 
   @DomName('HTMLVideoElement.poster')
   @DocsEditable()
-  void set poster(String value) => _blink.Native_HTMLVideoElement_poster_Setter(this, value);
+  void set poster(String value) => _blink.BlinkHTMLVideoElement.$poster_Setter(this, value);
 
   @DomName('HTMLVideoElement.videoHeight')
   @DocsEditable()
-  int get videoHeight => _blink.Native_HTMLVideoElement_videoHeight_Getter(this);
+  int get videoHeight => _blink.BlinkHTMLVideoElement.$videoHeight_Getter(this);
 
   @DomName('HTMLVideoElement.videoWidth')
   @DocsEditable()
-  int get videoWidth => _blink.Native_HTMLVideoElement_videoWidth_Getter(this);
+  int get videoWidth => _blink.BlinkHTMLVideoElement.$videoWidth_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDecodedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get decodedFrameCount => _blink.Native_HTMLVideoElement_webkitDecodedFrameCount_Getter(this);
+  int get decodedFrameCount => _blink.BlinkHTMLVideoElement.$webkitDecodedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.webkitDroppedFrameCount')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  int get droppedFrameCount => _blink.Native_HTMLVideoElement_webkitDroppedFrameCount_Getter(this);
+  int get droppedFrameCount => _blink.BlinkHTMLVideoElement.$webkitDroppedFrameCount_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  int get width => _blink.Native_HTMLVideoElement_width_Getter(this);
+  int get width => _blink.BlinkHTMLVideoElement.$width_Getter(this);
 
   @DomName('HTMLVideoElement.width')
   @DocsEditable()
-  void set width(int value) => _blink.Native_HTMLVideoElement_width_Setter(this, value);
+  void set width(int value) => _blink.BlinkHTMLVideoElement.$width_Setter(this, value);
 
   @DomName('HTMLVideoElement.getVideoPlaybackQuality')
   @DocsEditable()
   @Experimental() // untriaged
-  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.Native_HTMLVideoElement_getVideoPlaybackQuality_Callback(this);
+  VideoPlaybackQuality getVideoPlaybackQuality() => _blink.BlinkHTMLVideoElement.$getVideoPlaybackQuality_Callback(this);
 
   @DomName('HTMLVideoElement.webkitEnterFullscreen')
   @DocsEditable()
@@ -28609,7 +28609,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html
-  void enterFullscreen() => _blink.Native_HTMLVideoElement_webkitEnterFullscreen_Callback(this);
+  void enterFullscreen() => _blink.BlinkHTMLVideoElement.$webkitEnterFullscreen_Callback(this);
 
   @DomName('HTMLVideoElement.webkitExitFullscreen')
   @DocsEditable()
@@ -28617,7 +28617,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // https://dvcs.w3.org/hg/fullscreen/raw-file/tip/Overview.html#dom-document-exitfullscreen
-  void exitFullscreen() => _blink.Native_HTMLVideoElement_webkitExitFullscreen_Callback(this);
+  void exitFullscreen() => _blink.BlinkHTMLVideoElement.$webkitExitFullscreen_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28637,22 +28637,22 @@
   @DomName('VideoPlaybackQuality.corruptedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get corruptedVideoFrames => _blink.Native_VideoPlaybackQuality_corruptedVideoFrames_Getter(this);
+  int get corruptedVideoFrames => _blink.BlinkVideoPlaybackQuality.$corruptedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.creationTime')
   @DocsEditable()
   @Experimental() // untriaged
-  double get creationTime => _blink.Native_VideoPlaybackQuality_creationTime_Getter(this);
+  double get creationTime => _blink.BlinkVideoPlaybackQuality.$creationTime_Getter(this);
 
   @DomName('VideoPlaybackQuality.droppedVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get droppedVideoFrames => _blink.Native_VideoPlaybackQuality_droppedVideoFrames_Getter(this);
+  int get droppedVideoFrames => _blink.BlinkVideoPlaybackQuality.$droppedVideoFrames_Getter(this);
 
   @DomName('VideoPlaybackQuality.totalVideoFrames')
   @DocsEditable()
   @Experimental() // untriaged
-  int get totalVideoFrames => _blink.Native_VideoPlaybackQuality_totalVideoFrames_Getter(this);
+  int get totalVideoFrames => _blink.BlinkVideoPlaybackQuality.$totalVideoFrames_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28682,92 +28682,92 @@
 
   @DomName('VTTCue.VTTCue')
   @DocsEditable()
-  factory VttCue(num startTime, num endTime, String text) => _blink.Native_VTTCue_VttCue(startTime, endTime, text);
+  factory VttCue(num startTime, num endTime, String text) => _blink.BlinkVTTCue.$mkVttCue(startTime, endTime, text);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  String get align => _blink.Native_VTTCue_align_Getter(this);
+  String get align => _blink.BlinkVTTCue.$align_Getter(this);
 
   @DomName('VTTCue.align')
   @DocsEditable()
   @Experimental() // untriaged
-  void set align(String value) => _blink.Native_VTTCue_align_Setter(this, value);
+  void set align(String value) => _blink.BlinkVTTCue.$align_Setter(this, value);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  int get line => _blink.Native_VTTCue_line_Getter(this);
+  int get line => _blink.BlinkVTTCue.$line_Getter(this);
 
   @DomName('VTTCue.line')
   @DocsEditable()
   @Experimental() // untriaged
-  void set line(int value) => _blink.Native_VTTCue_line_Setter(this, value);
+  void set line(int value) => _blink.BlinkVTTCue.$line_Setter(this, value);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  int get position => _blink.Native_VTTCue_position_Getter(this);
+  int get position => _blink.BlinkVTTCue.$position_Getter(this);
 
   @DomName('VTTCue.position')
   @DocsEditable()
   @Experimental() // untriaged
-  void set position(int value) => _blink.Native_VTTCue_position_Setter(this, value);
+  void set position(int value) => _blink.BlinkVTTCue.$position_Setter(this, value);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  String get regionId => _blink.Native_VTTCue_regionId_Getter(this);
+  String get regionId => _blink.BlinkVTTCue.$regionId_Getter(this);
 
   @DomName('VTTCue.regionId')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionId(String value) => _blink.Native_VTTCue_regionId_Setter(this, value);
+  void set regionId(String value) => _blink.BlinkVTTCue.$regionId_Setter(this, value);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  int get size => _blink.Native_VTTCue_size_Getter(this);
+  int get size => _blink.BlinkVTTCue.$size_Getter(this);
 
   @DomName('VTTCue.size')
   @DocsEditable()
   @Experimental() // untriaged
-  void set size(int value) => _blink.Native_VTTCue_size_Setter(this, value);
+  void set size(int value) => _blink.BlinkVTTCue.$size_Setter(this, value);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get snapToLines => _blink.Native_VTTCue_snapToLines_Getter(this);
+  bool get snapToLines => _blink.BlinkVTTCue.$snapToLines_Getter(this);
 
   @DomName('VTTCue.snapToLines')
   @DocsEditable()
   @Experimental() // untriaged
-  void set snapToLines(bool value) => _blink.Native_VTTCue_snapToLines_Setter(this, value);
+  void set snapToLines(bool value) => _blink.BlinkVTTCue.$snapToLines_Setter(this, value);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  String get text => _blink.Native_VTTCue_text_Getter(this);
+  String get text => _blink.BlinkVTTCue.$text_Getter(this);
 
   @DomName('VTTCue.text')
   @DocsEditable()
   @Experimental() // untriaged
-  void set text(String value) => _blink.Native_VTTCue_text_Setter(this, value);
+  void set text(String value) => _blink.BlinkVTTCue.$text_Setter(this, value);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  String get vertical => _blink.Native_VTTCue_vertical_Getter(this);
+  String get vertical => _blink.BlinkVTTCue.$vertical_Getter(this);
 
   @DomName('VTTCue.vertical')
   @DocsEditable()
   @Experimental() // untriaged
-  void set vertical(String value) => _blink.Native_VTTCue_vertical_Setter(this, value);
+  void set vertical(String value) => _blink.BlinkVTTCue.$vertical_Setter(this, value);
 
   @DomName('VTTCue.getCueAsHTML')
   @DocsEditable()
   @Experimental() // untriaged
-  DocumentFragment getCueAsHtml() => _blink.Native_VTTCue_getCueAsHTML_Callback(this);
+  DocumentFragment getCueAsHtml() => _blink.BlinkVTTCue.$getCueAsHTML_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28786,92 +28786,92 @@
 
   @DomName('VTTRegion.VTTRegion')
   @DocsEditable()
-  factory VttRegion() => _blink.Native_VTTRegion_VttRegion();
+  factory VttRegion() => _blink.BlinkVTTRegion.$mkVttRegion();
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  int get height => _blink.Native_VTTRegion_height_Getter(this);
+  int get height => _blink.BlinkVTTRegion.$height_Getter(this);
 
   @DomName('VTTRegion.height')
   @DocsEditable()
   @Experimental() // untriaged
-  void set height(int value) => _blink.Native_VTTRegion_height_Setter(this, value);
+  void set height(int value) => _blink.BlinkVTTRegion.$height_Setter(this, value);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  String get id => _blink.Native_VTTRegion_id_Getter(this);
+  String get id => _blink.BlinkVTTRegion.$id_Getter(this);
 
   @DomName('VTTRegion.id')
   @DocsEditable()
   @Experimental() // untriaged
-  void set id(String value) => _blink.Native_VTTRegion_id_Setter(this, value);
+  void set id(String value) => _blink.BlinkVTTRegion.$id_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorX => _blink.Native_VTTRegion_regionAnchorX_Getter(this);
+  num get regionAnchorX => _blink.BlinkVTTRegion.$regionAnchorX_Getter(this);
 
   @DomName('VTTRegion.regionAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorX(num value) => _blink.Native_VTTRegion_regionAnchorX_Setter(this, value);
+  void set regionAnchorX(num value) => _blink.BlinkVTTRegion.$regionAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get regionAnchorY => _blink.Native_VTTRegion_regionAnchorY_Getter(this);
+  num get regionAnchorY => _blink.BlinkVTTRegion.$regionAnchorY_Getter(this);
 
   @DomName('VTTRegion.regionAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set regionAnchorY(num value) => _blink.Native_VTTRegion_regionAnchorY_Setter(this, value);
+  void set regionAnchorY(num value) => _blink.BlinkVTTRegion.$regionAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  String get scroll => _blink.Native_VTTRegion_scroll_Getter(this);
+  String get scroll => _blink.BlinkVTTRegion.$scroll_Getter(this);
 
   @DomName('VTTRegion.scroll')
   @DocsEditable()
   @Experimental() // untriaged
-  void set scroll(String value) => _blink.Native_VTTRegion_scroll_Setter(this, value);
+  void set scroll(String value) => _blink.BlinkVTTRegion.$scroll_Setter(this, value);
 
   @DomName('VTTRegion.track')
   @DocsEditable()
   @Experimental() // untriaged
-  TextTrack get track => _blink.Native_VTTRegion_track_Getter(this);
+  TextTrack get track => _blink.BlinkVTTRegion.$track_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorX => _blink.Native_VTTRegion_viewportAnchorX_Getter(this);
+  num get viewportAnchorX => _blink.BlinkVTTRegion.$viewportAnchorX_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorX')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorX(num value) => _blink.Native_VTTRegion_viewportAnchorX_Setter(this, value);
+  void set viewportAnchorX(num value) => _blink.BlinkVTTRegion.$viewportAnchorX_Setter(this, value);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  num get viewportAnchorY => _blink.Native_VTTRegion_viewportAnchorY_Getter(this);
+  num get viewportAnchorY => _blink.BlinkVTTRegion.$viewportAnchorY_Getter(this);
 
   @DomName('VTTRegion.viewportAnchorY')
   @DocsEditable()
   @Experimental() // untriaged
-  void set viewportAnchorY(num value) => _blink.Native_VTTRegion_viewportAnchorY_Setter(this, value);
+  void set viewportAnchorY(num value) => _blink.BlinkVTTRegion.$viewportAnchorY_Setter(this, value);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  num get width => _blink.Native_VTTRegion_width_Getter(this);
+  num get width => _blink.BlinkVTTRegion.$width_Getter(this);
 
   @DomName('VTTRegion.width')
   @DocsEditable()
   @Experimental() // untriaged
-  void set width(num value) => _blink.Native_VTTRegion_width_Setter(this, value);
+  void set width(num value) => _blink.BlinkVTTRegion.$width_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28891,17 +28891,17 @@
   @DomName('VTTRegionList.length')
   @DocsEditable()
   @Experimental() // untriaged
-  int get length => _blink.Native_VTTRegionList_length_Getter(this);
+  int get length => _blink.BlinkVTTRegionList.$length_Getter(this);
 
   @DomName('VTTRegionList.getRegionById')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion getRegionById(String id) => _blink.Native_VTTRegionList_getRegionById_Callback(this, id);
+  VttRegion getRegionById(String id) => _blink.BlinkVTTRegionList.$getRegionById_Callback(this, id);
 
   @DomName('VTTRegionList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  VttRegion item(int index) => _blink.Native_VTTRegionList_item_Callback(this, index);
+  VttRegion item(int index) => _blink.BlinkVTTRegionList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -28998,7 +28998,7 @@
 
   @DomName('WebSocket.WebSocket')
   @DocsEditable()
-  factory WebSocket(String url, [protocol_OR_protocols]) => _blink.Native_WebSocket_WebSocket(url, protocol_OR_protocols);
+  factory WebSocket(String url, [protocol_OR_protocols]) => _blink.BlinkWebSocket.$mkWebSocket(url, protocol_OR_protocols);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
@@ -29021,51 +29021,51 @@
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  String get binaryType => _blink.Native_WebSocket_binaryType_Getter(this);
+  String get binaryType => _blink.BlinkWebSocket.$binaryType_Getter(this);
 
   @DomName('WebSocket.binaryType')
   @DocsEditable()
-  void set binaryType(String value) => _blink.Native_WebSocket_binaryType_Setter(this, value);
+  void set binaryType(String value) => _blink.BlinkWebSocket.$binaryType_Setter(this, value);
 
   @DomName('WebSocket.bufferedAmount')
   @DocsEditable()
-  int get bufferedAmount => _blink.Native_WebSocket_bufferedAmount_Getter(this);
+  int get bufferedAmount => _blink.BlinkWebSocket.$bufferedAmount_Getter(this);
 
   @DomName('WebSocket.extensions')
   @DocsEditable()
-  String get extensions => _blink.Native_WebSocket_extensions_Getter(this);
+  String get extensions => _blink.BlinkWebSocket.$extensions_Getter(this);
 
   @DomName('WebSocket.protocol')
   @DocsEditable()
-  String get protocol => _blink.Native_WebSocket_protocol_Getter(this);
+  String get protocol => _blink.BlinkWebSocket.$protocol_Getter(this);
 
   @DomName('WebSocket.readyState')
   @DocsEditable()
-  int get readyState => _blink.Native_WebSocket_readyState_Getter(this);
+  int get readyState => _blink.BlinkWebSocket.$readyState_Getter(this);
 
   @DomName('WebSocket.url')
   @DocsEditable()
-  String get url => _blink.Native_WebSocket_url_Getter(this);
+  String get url => _blink.BlinkWebSocket.$url_Getter(this);
 
-  void close([int code, String reason]) => _blink.Native_WebSocket_close(this, code, reason);
+  void close([int code, String reason]) => _blink.BlinkWebSocket.$close(this, code, reason);
 
-  void send(data) => _blink.Native_WebSocket_send(this, data);
+  void send(data) => _blink.BlinkWebSocket.$send(this, data);
 
   @DomName('WebSocket.sendBlob')
   @DocsEditable()
-  void sendBlob(Blob data) => _blink.Native_WebSocket_sendBlob_Callback(this, data);
+  void sendBlob(Blob data) => _blink.BlinkWebSocket.$sendBlob_Callback(this, data);
 
   @DomName('WebSocket.sendByteBuffer')
   @DocsEditable()
-  void sendByteBuffer(ByteBuffer data) => _blink.Native_WebSocket_sendByteBuffer_Callback(this, data);
+  void sendByteBuffer(ByteBuffer data) => _blink.BlinkWebSocket.$sendByteBuffer_Callback(this, data);
 
   @DomName('WebSocket.sendString')
   @DocsEditable()
-  void sendString(String data) => _blink.Native_WebSocket_sendString_Callback(this, data);
+  void sendString(String data) => _blink.BlinkWebSocket.$sendString_Callback(this, data);
 
   @DomName('WebSocket.sendTypedData')
   @DocsEditable()
-  void sendTypedData(TypedData data) => _blink.Native_WebSocket_sendTypedData_Callback(this, data);
+  void sendTypedData(TypedData data) => _blink.BlinkWebSocket.$sendTypedData_Callback(this, data);
 
   /// Stream of `close` events handled by this [WebSocket].
   @DomName('WebSocket.onclose')
@@ -29144,44 +29144,44 @@
 
   @DomName('WheelEvent.deltaMode')
   @DocsEditable()
-  int get deltaMode => _blink.Native_WheelEvent_deltaMode_Getter(this);
+  int get deltaMode => _blink.BlinkWheelEvent.$deltaMode_Getter(this);
 
   @DomName('WheelEvent.deltaX')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaX => _blink.Native_WheelEvent_deltaX_Getter(this);
+  double get _deltaX => _blink.BlinkWheelEvent.$deltaX_Getter(this);
 
   @DomName('WheelEvent.deltaY')
   @DocsEditable()
   @Experimental() // untriaged
-  double get _deltaY => _blink.Native_WheelEvent_deltaY_Getter(this);
+  double get _deltaY => _blink.BlinkWheelEvent.$deltaY_Getter(this);
 
   @DomName('WheelEvent.deltaZ')
   @DocsEditable()
   @Experimental() // untriaged
-  double get deltaZ => _blink.Native_WheelEvent_deltaZ_Getter(this);
+  double get deltaZ => _blink.BlinkWheelEvent.$deltaZ_Getter(this);
 
   @DomName('WheelEvent.webkitDirectionInvertedFromDevice')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  bool get directionInvertedFromDevice => _blink.Native_WheelEvent_webkitDirectionInvertedFromDevice_Getter(this);
+  bool get directionInvertedFromDevice => _blink.BlinkWheelEvent.$webkitDirectionInvertedFromDevice_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaX')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaX => _blink.Native_WheelEvent_wheelDeltaX_Getter(this);
+  int get wheelDeltaX => _blink.BlinkWheelEvent.$wheelDeltaX_Getter(this);
 
   @DomName('WheelEvent.wheelDeltaY')
   @DocsEditable()
   @Experimental() // non-standard
-  int get wheelDeltaY => _blink.Native_WheelEvent_wheelDeltaY_Getter(this);
+  int get wheelDeltaY => _blink.BlinkWheelEvent.$wheelDeltaY_Getter(this);
 
   @DomName('WheelEvent.initWebKitWheelEvent')
   @DocsEditable()
   @Experimental()
-  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.Native_WheelEvent_initWebKitWheelEvent_Callback(this, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
+  void _initWebKitWheelEvent(int wheelDeltaX, int wheelDeltaY, Window view, int screenX, int screenY, int clientX, int clientY, bool ctrlKey, bool altKey, bool shiftKey, bool metaKey) => _blink.BlinkWheelEvent.$initWebKitWheelEvent_Callback(this, wheelDeltaX, wheelDeltaY, view, screenX, screenY, clientX, clientY, ctrlKey, altKey, shiftKey, metaKey);
 
 
   /**
@@ -29555,7 +29555,7 @@
    */
   @DomName('Window.CSS')
   @DocsEditable()
-  Css get css => _blink.Native_Window_CSS_Getter(this);
+  Css get css => _blink.BlinkWindow.$CSS_Getter(this);
 
   /**
    * The application cache for this window.
@@ -29570,15 +29570,15 @@
    */
   @DomName('Window.applicationCache')
   @DocsEditable()
-  ApplicationCache get applicationCache => _blink.Native_Window_applicationCache_Getter(this);
+  ApplicationCache get applicationCache => _blink.BlinkWindow.$applicationCache_Getter(this);
 
   @DomName('Window.closed')
   @DocsEditable()
-  bool get closed => _blink.Native_Window_closed_Getter(this);
+  bool get closed => _blink.BlinkWindow.$closed_Getter(this);
 
   @DomName('Window.console')
   @DocsEditable()
-  Console get console => _blink.Native_Window_console_Getter(this);
+  Console get console => _blink.BlinkWindow.$console_Getter(this);
 
   /**
    * Entrypoint for the browser's cryptographic functions.
@@ -29591,31 +29591,31 @@
   @DocsEditable()
   // http://www.w3.org/TR/WebCryptoAPI/
   @Experimental()
-  Crypto get crypto => _blink.Native_Window_crypto_Getter(this);
+  Crypto get crypto => _blink.BlinkWindow.$crypto_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultStatus => _blink.Native_Window_defaultStatus_Getter(this);
+  String get defaultStatus => _blink.BlinkWindow.$defaultStatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultStatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultStatus(String value) => _blink.Native_Window_defaultStatus_Setter(this, value);
+  void set defaultStatus(String value) => _blink.BlinkWindow.$defaultStatus_Setter(this, value);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  String get defaultstatus => _blink.Native_Window_defaultstatus_Getter(this);
+  String get defaultstatus => _blink.BlinkWindow.$defaultstatus_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.defaultstatus')
   @DocsEditable()
   @Experimental() // non-standard
-  void set defaultstatus(String value) => _blink.Native_Window_defaultstatus_Setter(this, value);
+  void set defaultstatus(String value) => _blink.BlinkWindow.$defaultstatus_Setter(this, value);
 
   /**
    * The ratio between physical pixels and logical CSS pixels.
@@ -29633,11 +29633,11 @@
   @DocsEditable()
   // http://www.quirksmode.org/blog/archives/2012/06/devicepixelrati.html
   @Experimental() // non-standard
-  double get devicePixelRatio => _blink.Native_Window_devicePixelRatio_Getter(this);
+  double get devicePixelRatio => _blink.BlinkWindow.$devicePixelRatio_Getter(this);
 
   @DomName('Window.document')
   @DocsEditable()
-  Document get document => _blink.Native_Window_document_Getter(this);
+  Document get document => _blink.BlinkWindow.$document_Getter(this);
 
   /**
    * The current session history for this window's newest document.
@@ -29650,7 +29650,7 @@
    */
   @DomName('Window.history')
   @DocsEditable()
-  History get history => _blink.Native_Window_history_Getter(this);
+  History get history => _blink.BlinkWindow.$history_Getter(this);
 
   @DomName('Window.indexedDB')
   @DocsEditable()
@@ -29658,7 +29658,7 @@
   @SupportedBrowser(SupportedBrowser.FIREFOX, '15')
   @SupportedBrowser(SupportedBrowser.IE, '10')
   @Experimental()
-  IdbFactory get indexedDB => _blink.Native_Window_indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWindow.$indexedDB_Getter(this);
 
   /**
    * The height of the viewport including scrollbars.
@@ -29671,7 +29671,7 @@
    */
   @DomName('Window.innerHeight')
   @DocsEditable()
-  int get innerHeight => _blink.Native_Window_innerHeight_Getter(this);
+  int get innerHeight => _blink.BlinkWindow.$innerHeight_Getter(this);
 
   /**
    * The width of the viewport including scrollbars.
@@ -29684,7 +29684,7 @@
    */
   @DomName('Window.innerWidth')
   @DocsEditable()
-  int get innerWidth => _blink.Native_Window_innerWidth_Getter(this);
+  int get innerWidth => _blink.BlinkWindow.$innerWidth_Getter(this);
 
   /**
    * Storage for this window that persists across sessions.
@@ -29701,11 +29701,11 @@
    */
   @DomName('Window.localStorage')
   @DocsEditable()
-  Storage get localStorage => _blink.Native_Window_localStorage_Getter(this);
+  Storage get localStorage => _blink.BlinkWindow.$localStorage_Getter(this);
 
   @DomName('Window.location')
   @DocsEditable()
-  Location get location => _blink.Native_Window_location_Getter(this);
+  Location get location => _blink.BlinkWindow.$location_Getter(this);
 
   /**
    * This window's location bar, which displays the URL.
@@ -29718,7 +29718,7 @@
    */
   @DomName('Window.locationbar')
   @DocsEditable()
-  BarProp get locationbar => _blink.Native_Window_locationbar_Getter(this);
+  BarProp get locationbar => _blink.BlinkWindow.$locationbar_Getter(this);
 
   /**
    * This window's menu bar, which displays menu commands.
@@ -29731,7 +29731,7 @@
    */
   @DomName('Window.menubar')
   @DocsEditable()
-  BarProp get menubar => _blink.Native_Window_menubar_Getter(this);
+  BarProp get menubar => _blink.BlinkWindow.$menubar_Getter(this);
 
   /**
    * The name of this window.
@@ -29744,7 +29744,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  String get name => _blink.Native_Window_name_Getter(this);
+  String get name => _blink.BlinkWindow.$name_Getter(this);
 
   /**
    * The name of this window.
@@ -29757,7 +29757,7 @@
    */
   @DomName('Window.name')
   @DocsEditable()
-  void set name(String value) => _blink.Native_Window_name_Setter(this, value);
+  void set name(String value) => _blink.BlinkWindow.$name_Setter(this, value);
 
   /**
    * The user agent accessing this window.
@@ -29770,7 +29770,7 @@
    */
   @DomName('Window.navigator')
   @DocsEditable()
-  Navigator get navigator => _blink.Native_Window_navigator_Getter(this);
+  Navigator get navigator => _blink.BlinkWindow.$navigator_Getter(this);
 
   /**
    * Whether objects are drawn offscreen before being displayed.
@@ -29784,20 +29784,20 @@
   @DomName('Window.offscreenBuffering')
   @DocsEditable()
   @Experimental() // non-standard
-  bool get offscreenBuffering => _blink.Native_Window_offscreenBuffering_Getter(this);
+  bool get offscreenBuffering => _blink.BlinkWindow.$offscreenBuffering_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  WindowBase get opener => _blink.Native_Window_opener_Getter(this);
+  WindowBase get opener => _blink.BlinkWindow.$opener_Getter(this);
 
   @DomName('Window.opener')
   @DocsEditable()
-  void set opener(Window value) => _blink.Native_Window_opener_Setter(this, value);
+  void set opener(Window value) => _blink.BlinkWindow.$opener_Setter(this, value);
 
   @DomName('Window.orientation')
   @DocsEditable()
   @Experimental() // untriaged
-  int get orientation => _blink.Native_Window_orientation_Getter(this);
+  int get orientation => _blink.BlinkWindow.$orientation_Getter(this);
 
   /**
    * The height of this window including all user interface elements.
@@ -29810,7 +29810,7 @@
    */
   @DomName('Window.outerHeight')
   @DocsEditable()
-  int get outerHeight => _blink.Native_Window_outerHeight_Getter(this);
+  int get outerHeight => _blink.BlinkWindow.$outerHeight_Getter(this);
 
   /**
    * The width of the window including all user interface elements.
@@ -29823,7 +29823,7 @@
    */
   @DomName('Window.outerWidth')
   @DocsEditable()
-  int get outerWidth => _blink.Native_Window_outerWidth_Getter(this);
+  int get outerWidth => _blink.BlinkWindow.$outerWidth_Getter(this);
 
   /**
    * The distance this window has been scrolled horizontally.
@@ -29839,7 +29839,7 @@
    */
   @DomName('Window.pageXOffset')
   @DocsEditable()
-  int get pageXOffset => _blink.Native_Window_pageXOffset_Getter(this);
+  int get pageXOffset => _blink.BlinkWindow.$pageXOffset_Getter(this);
 
   /**
    * The distance this window has been scrolled vertically.
@@ -29855,11 +29855,11 @@
    */
   @DomName('Window.pageYOffset')
   @DocsEditable()
-  int get pageYOffset => _blink.Native_Window_pageYOffset_Getter(this);
+  int get pageYOffset => _blink.BlinkWindow.$pageYOffset_Getter(this);
 
   @DomName('Window.parent')
   @DocsEditable()
-  WindowBase get parent => _blink.Native_Window_parent_Getter(this);
+  WindowBase get parent => _blink.BlinkWindow.$parent_Getter(this);
 
   /**
    * Timing and navigation data for this window.
@@ -29877,7 +29877,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.FIREFOX)
   @SupportedBrowser(SupportedBrowser.IE)
-  Performance get performance => _blink.Native_Window_performance_Getter(this);
+  Performance get performance => _blink.BlinkWindow.$performance_Getter(this);
 
   /**
    * Information about the screen displaying this window.
@@ -29889,7 +29889,7 @@
    */
   @DomName('Window.screen')
   @DocsEditable()
-  Screen get screen => _blink.Native_Window_screen_Getter(this);
+  Screen get screen => _blink.BlinkWindow.$screen_Getter(this);
 
   /**
    * The distance from the left side of the screen to the left side of this
@@ -29902,7 +29902,7 @@
    */
   @DomName('Window.screenLeft')
   @DocsEditable()
-  int get screenLeft => _blink.Native_Window_screenLeft_Getter(this);
+  int get screenLeft => _blink.BlinkWindow.$screenLeft_Getter(this);
 
   /**
    * The distance from the top of the screen to the top of this window.
@@ -29914,7 +29914,7 @@
    */
   @DomName('Window.screenTop')
   @DocsEditable()
-  int get screenTop => _blink.Native_Window_screenTop_Getter(this);
+  int get screenTop => _blink.BlinkWindow.$screenTop_Getter(this);
 
   /**
    * The distance from the left side of the screen to the mouse pointer.
@@ -29926,7 +29926,7 @@
    */
   @DomName('Window.screenX')
   @DocsEditable()
-  int get screenX => _blink.Native_Window_screenX_Getter(this);
+  int get screenX => _blink.BlinkWindow.$screenX_Getter(this);
 
   /**
    * The distance from the top of the screen to the mouse pointer.
@@ -29938,15 +29938,15 @@
    */
   @DomName('Window.screenY')
   @DocsEditable()
-  int get screenY => _blink.Native_Window_screenY_Getter(this);
+  int get screenY => _blink.BlinkWindow.$screenY_Getter(this);
 
   @DomName('Window.scrollX')
   @DocsEditable()
-  int get scrollX => _blink.Native_Window_scrollX_Getter(this);
+  int get scrollX => _blink.BlinkWindow.$scrollX_Getter(this);
 
   @DomName('Window.scrollY')
   @DocsEditable()
-  int get scrollY => _blink.Native_Window_scrollY_Getter(this);
+  int get scrollY => _blink.BlinkWindow.$scrollY_Getter(this);
 
   /**
    * This window's scroll bars.
@@ -29959,7 +29959,7 @@
    */
   @DomName('Window.scrollbars')
   @DocsEditable()
-  BarProp get scrollbars => _blink.Native_Window_scrollbars_Getter(this);
+  BarProp get scrollbars => _blink.BlinkWindow.$scrollbars_Getter(this);
 
   /**
    * The current window.
@@ -29971,7 +29971,7 @@
    */
   @DomName('Window.self')
   @DocsEditable()
-  WindowBase get self => _blink.Native_Window_self_Getter(this);
+  WindowBase get self => _blink.BlinkWindow.$self_Getter(this);
 
   /**
    * Storage for this window that is cleared when this session ends.
@@ -29988,7 +29988,7 @@
    */
   @DomName('Window.sessionStorage')
   @DocsEditable()
-  Storage get sessionStorage => _blink.Native_Window_sessionStorage_Getter(this);
+  Storage get sessionStorage => _blink.BlinkWindow.$sessionStorage_Getter(this);
 
   /**
    * Access to speech synthesis in the browser.
@@ -30003,17 +30003,17 @@
   @DocsEditable()
   // https://dvcs.w3.org/hg/speech-api/raw-file/tip/speechapi.html#tts-section
   @Experimental()
-  SpeechSynthesis get speechSynthesis => _blink.Native_Window_speechSynthesis_Getter(this);
+  SpeechSynthesis get speechSynthesis => _blink.BlinkWindow.$speechSynthesis_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  String get status => _blink.Native_Window_status_Getter(this);
+  String get status => _blink.BlinkWindow.$status_Getter(this);
 
   /// *Deprecated*.
   @DomName('Window.status')
   @DocsEditable()
-  void set status(String value) => _blink.Native_Window_status_Setter(this, value);
+  void set status(String value) => _blink.BlinkWindow.$status_Setter(this, value);
 
   /**
    * This window's status bar.
@@ -30026,7 +30026,7 @@
    */
   @DomName('Window.statusbar')
   @DocsEditable()
-  BarProp get statusbar => _blink.Native_Window_statusbar_Getter(this);
+  BarProp get statusbar => _blink.BlinkWindow.$statusbar_Getter(this);
 
   /**
    * Access to CSS media queries.
@@ -30041,7 +30041,7 @@
   @DocsEditable()
   // http://developer.apple.com/library/safari/#documentation/SafariDOMAdditions/Reference/StyleMedia/StyleMedia/StyleMedia.html
   @Experimental() // nonstandard
-  StyleMedia get styleMedia => _blink.Native_Window_styleMedia_Getter(this);
+  StyleMedia get styleMedia => _blink.BlinkWindow.$styleMedia_Getter(this);
 
   /**
    * This window's tool bar.
@@ -30054,11 +30054,11 @@
    */
   @DomName('Window.toolbar')
   @DocsEditable()
-  BarProp get toolbar => _blink.Native_Window_toolbar_Getter(this);
+  BarProp get toolbar => _blink.BlinkWindow.$toolbar_Getter(this);
 
   @DomName('Window.top')
   @DocsEditable()
-  WindowBase get top => _blink.Native_Window_top_Getter(this);
+  WindowBase get top => _blink.BlinkWindow.$top_Getter(this);
 
   /**
    * The current window.
@@ -30070,9 +30070,9 @@
    */
   @DomName('Window.window')
   @DocsEditable()
-  WindowBase get window => _blink.Native_Window_window_Getter(this);
+  WindowBase get window => _blink.BlinkWindow.$window_Getter(this);
 
-  WindowBase __getter__(index_OR_name) => _blink.Native_Window___getter__(this, index_OR_name);
+  WindowBase __getter__(index_OR_name) => _blink.BlinkWindow.$__getter__(this, index_OR_name);
 
   /**
    * Displays a modal alert to the user.
@@ -30085,15 +30085,15 @@
    */
   @DomName('Window.alert')
   @DocsEditable()
-  void alert(String message) => _blink.Native_Window_alert_Callback(this, message);
+  void alert(String message) => _blink.BlinkWindow.$alert_Callback(this, message);
 
   @DomName('Window.cancelAnimationFrame')
   @DocsEditable()
-  void cancelAnimationFrame(int id) => _blink.Native_Window_cancelAnimationFrame_Callback(this, id);
+  void cancelAnimationFrame(int id) => _blink.BlinkWindow.$cancelAnimationFrame_Callback(this, id);
 
   @DomName('Window.close')
   @DocsEditable()
-  void close() => _blink.Native_Window_close_Callback(this);
+  void close() => _blink.BlinkWindow.$close_Callback(this);
 
   /**
    * Displays a modal OK/Cancel prompt to the user.
@@ -30106,7 +30106,7 @@
    */
   @DomName('Window.confirm')
   @DocsEditable()
-  bool confirm(String message) => _blink.Native_Window_confirm_Callback(this, message);
+  bool confirm(String message) => _blink.BlinkWindow.$confirm_Callback(this, message);
 
   /**
    * Finds text in this window.
@@ -30119,11 +30119,11 @@
   @DomName('Window.find')
   @DocsEditable()
   @Experimental() // non-standard
-  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.Native_Window_find_Callback(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
+  bool find(String string, bool caseSensitive, bool backwards, bool wrap, bool wholeWord, bool searchInFrames, bool showDialog) => _blink.BlinkWindow.$find_Callback(this, string, caseSensitive, backwards, wrap, wholeWord, searchInFrames, showDialog);
 
   @DomName('Window.getComputedStyle')
   @DocsEditable()
-  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.Native_Window_getComputedStyle_Callback(this, element, pseudoElement);
+  CssStyleDeclaration _getComputedStyle(Element element, String pseudoElement) => _blink.BlinkWindow.$getComputedStyle_Callback(this, element, pseudoElement);
 
   /**
    * Returns all CSS rules that apply to the element's pseudo-element.
@@ -30131,7 +30131,7 @@
   @DomName('Window.getMatchedCSSRules')
   @DocsEditable()
   @Experimental() // non-standard
-  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.Native_Window_getMatchedCSSRules_Callback(this, element, pseudoElement);
+  List<CssRule> getMatchedCssRules(Element element, String pseudoElement) => _blink.BlinkWindow.$getMatchedCSSRules_Callback(this, element, pseudoElement);
 
   /**
    * Returns the currently selected text.
@@ -30144,7 +30144,7 @@
    */
   @DomName('Window.getSelection')
   @DocsEditable()
-  Selection getSelection() => _blink.Native_Window_getSelection_Callback(this);
+  Selection getSelection() => _blink.BlinkWindow.$getSelection_Callback(this);
 
   /**
    * Returns a list of media queries for the given query string.
@@ -30159,7 +30159,7 @@
    */
   @DomName('Window.matchMedia')
   @DocsEditable()
-  MediaQueryList matchMedia(String query) => _blink.Native_Window_matchMedia_Callback(this, query);
+  MediaQueryList matchMedia(String query) => _blink.BlinkWindow.$matchMedia_Callback(this, query);
 
   /**
    * Moves this window.
@@ -30175,15 +30175,15 @@
    */
   @DomName('Window.moveBy')
   @DocsEditable()
-  void moveBy(num x, num y) => _blink.Native_Window_moveBy_Callback(this, x, y);
+  void moveBy(num x, num y) => _blink.BlinkWindow.$moveBy_Callback(this, x, y);
 
   @DomName('Window.moveTo')
   @DocsEditable()
-  void _moveTo(num x, num y) => _blink.Native_Window_moveTo_Callback(this, x, y);
+  void _moveTo(num x, num y) => _blink.BlinkWindow.$moveTo_Callback(this, x, y);
 
   @DomName('Window.open')
   @DocsEditable()
-  WindowBase open(String url, String name, [String options]) => _blink.Native_Window_open_Callback(this, url, name, options);
+  WindowBase open(String url, String name, [String options]) => _blink.BlinkWindow.$open_Callback(this, url, name, options);
 
   /// *Deprecated.*
   @DomName('Window.openDatabase')
@@ -30193,11 +30193,11 @@
   @Experimental()
   // http://www.w3.org/TR/webdatabase/
   @Experimental() // deprecated
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_Window_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWindow.$openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('Window.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) => _blink.Native_Window_postMessage_Callback(this, message, targetOrigin, messagePorts);
+  void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List<MessagePort> messagePorts]) => _blink.BlinkWindow.$postMessage_Callback(this, message, targetOrigin, messagePorts);
 
   /**
    * Opens the print dialog for this window.
@@ -30209,11 +30209,11 @@
    */
   @DomName('Window.print')
   @DocsEditable()
-  void print() => _blink.Native_Window_print_Callback(this);
+  void print() => _blink.BlinkWindow.$print_Callback(this);
 
   @DomName('Window.requestAnimationFrame')
   @DocsEditable()
-  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.Native_Window_requestAnimationFrame_Callback(this, callback);
+  int _requestAnimationFrame(RequestAnimationFrameCallback callback) => _blink.BlinkWindow.$requestAnimationFrame_Callback(this, callback);
 
   /**
    * Resizes this window by an offset.
@@ -30225,7 +30225,7 @@
    */
   @DomName('Window.resizeBy')
   @DocsEditable()
-  void resizeBy(num x, num y) => _blink.Native_Window_resizeBy_Callback(this, x, y);
+  void resizeBy(num x, num y) => _blink.BlinkWindow.$resizeBy_Callback(this, x, y);
 
   /**
    * Resizes this window to a specific width and height.
@@ -30237,7 +30237,7 @@
    */
   @DomName('Window.resizeTo')
   @DocsEditable()
-  void resizeTo(num width, num height) => _blink.Native_Window_resizeTo_Callback(this, width, height);
+  void resizeTo(num width, num height) => _blink.BlinkWindow.$resizeTo_Callback(this, width, height);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -30251,7 +30251,7 @@
    */
   @DomName('Window.scroll')
   @DocsEditable()
-  void scroll(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scroll_Callback(this, x, y, scrollOptions);
+  void scroll(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scroll_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically by an offset.
@@ -30263,7 +30263,7 @@
    */
   @DomName('Window.scrollBy')
   @DocsEditable()
-  void scrollBy(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollBy_Callback(this, x, y, scrollOptions);
+  void scrollBy(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scrollBy_Callback(this, x, y, scrollOptions);
 
   /**
    * Scrolls the page horizontally and vertically to a specific point.
@@ -30277,7 +30277,7 @@
    */
   @DomName('Window.scrollTo')
   @DocsEditable()
-  void scrollTo(int x, int y, [Map scrollOptions]) => _blink.Native_Window_scrollTo_Callback(this, x, y, scrollOptions);
+  void scrollTo(int x, int y, [Map scrollOptions]) => _blink.BlinkWindow.$scrollTo_Callback(this, x, y, scrollOptions);
 
   /**
    * Opens a new page as a modal dialog.
@@ -30290,7 +30290,7 @@
    */
   @DomName('Window.showModalDialog')
   @DocsEditable()
-  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.Native_Window_showModalDialog_Callback(this, url, dialogArgs, featureArgs);
+  Object showModalDialog(String url, [Object dialogArgs, String featureArgs]) => _blink.BlinkWindow.$showModalDialog_Callback(this, url, dialogArgs, featureArgs);
 
   /**
    * Stops the window from loading.
@@ -30303,11 +30303,11 @@
    */
   @DomName('Window.stop')
   @DocsEditable()
-  void stop() => _blink.Native_Window_stop_Callback(this);
+  void stop() => _blink.BlinkWindow.$stop_Callback(this);
 
   @DomName('Window.toString')
   @DocsEditable()
-  String toString() => _blink.Native_Window_toString_Callback(this);
+  String toString() => _blink.BlinkWindow.$toString_Callback(this);
 
   @DomName('Window.webkitConvertPointFromNodeToPage')
   @DocsEditable()
@@ -30315,7 +30315,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromNodeToPage_Callback(this, node, p);
+  _DomPoint _convertPointFromNodeToPage(Node node, _DomPoint p) => _blink.BlinkWindow.$webkitConvertPointFromNodeToPage_Callback(this, node, p);
 
   @DomName('Window.webkitConvertPointFromPageToNode')
   @DocsEditable()
@@ -30323,14 +30323,14 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   // http://developer.apple.com/library/safari/#documentation/DataManagement/Reference/DOMWindowAdditionsReference/DOMWindowAdditions/DOMWindowAdditions.html
-  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) => _blink.Native_Window_webkitConvertPointFromPageToNode_Callback(this, node, p);
+  _DomPoint _convertPointFromPageToNode(Node node, _DomPoint p) => _blink.BlinkWindow.$webkitConvertPointFromPageToNode_Callback(this, node, p);
 
   @DomName('Window.webkitRequestFileSystem')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
+  void __requestFileSystem(int type, int size, _FileSystemCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWindow.$webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> _requestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -30354,7 +30354,7 @@
   @SupportedBrowser(SupportedBrowser.CHROME)
   @Experimental()
   // http://www.w3.org/TR/file-system-api/#idl-def-LocalFileSystem
-  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_Window_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
+  void _resolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWindow.$webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> resolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -30366,27 +30366,27 @@
 
   @DomName('Window.atob')
   @DocsEditable()
-  String atob(String string) => _blink.Native_Window_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWindow.$atob_Callback(this, string);
 
   @DomName('Window.btoa')
   @DocsEditable()
-  String btoa(String string) => _blink.Native_Window_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWindow.$btoa_Callback(this, string);
 
   @DomName('Window.clearInterval')
   @DocsEditable()
-  void _clearInterval(int handle) => _blink.Native_Window_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWindow.$clearInterval_Callback(this, handle);
 
   @DomName('Window.clearTimeout')
   @DocsEditable()
-  void _clearTimeout(int handle) => _blink.Native_Window_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWindow.$clearTimeout_Callback(this, handle);
 
   @DomName('Window.setInterval')
   @DocsEditable()
-  int _setInterval(Object handler, int timeout) => _blink.Native_Window_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWindow.$setInterval_Callback(this, handler, timeout);
 
   @DomName('Window.setTimeout')
   @DocsEditable()
-  int _setTimeout(Object handler, int timeout) => _blink.Native_Window_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindow.$setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `contentloaded` events handled by this [Window].
   @DomName('Window.onDOMContentLoaded')
@@ -30757,12 +30757,12 @@
   @DomName('WindowBase64.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.Native_WindowBase64_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWindowBase64.$atob_Callback(this, string);
 
   @DomName('WindowBase64.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.Native_WindowBase64_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWindowBase64.$btoa_Callback(this, string);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -30889,18 +30889,18 @@
 
   @DomName('Worker.Worker')
   @DocsEditable()
-  factory Worker(String scriptUrl) => _blink.Native_Worker_Worker(scriptUrl);
+  factory Worker(String scriptUrl) => _blink.BlinkWorker.$mkWorker(scriptUrl);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('Worker.postMessage')
   @DocsEditable()
-  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.Native_Worker_postMessage_Callback(this, message, messagePorts);
+  void postMessage(/*SerializedScriptValue*/ message, [List<MessagePort> messagePorts]) => _blink.BlinkWorker.$postMessage_Callback(this, message, messagePorts);
 
   @DomName('Worker.terminate')
   @DocsEditable()
-  void terminate() => _blink.Native_Worker_terminate_Callback(this);
+  void terminate() => _blink.BlinkWorker.$terminate_Callback(this);
 
   /// Stream of `error` events handled by this [Worker].
   @DomName('Worker.onerror')
@@ -30982,57 +30982,57 @@
   @DomName('WorkerGlobalScope.console')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerConsole get console => _blink.Native_WorkerGlobalScope_console_Getter(this);
+  WorkerConsole get console => _blink.BlinkWorkerGlobalScope.$console_Getter(this);
 
   @DomName('WorkerGlobalScope.crypto')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerCrypto get crypto => _blink.Native_WorkerGlobalScope_crypto_Getter(this);
+  WorkerCrypto get crypto => _blink.BlinkWorkerGlobalScope.$crypto_Getter(this);
 
   @DomName('WorkerGlobalScope.indexedDB')
   @DocsEditable()
   @Experimental() // untriaged
-  IdbFactory get indexedDB => _blink.Native_WorkerGlobalScope_indexedDB_Getter(this);
+  IdbFactory get indexedDB => _blink.BlinkWorkerGlobalScope.$indexedDB_Getter(this);
 
   @DomName('WorkerGlobalScope.location')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerLocation get location => _blink.Native_WorkerGlobalScope_location_Getter(this);
+  _WorkerLocation get location => _blink.BlinkWorkerGlobalScope.$location_Getter(this);
 
   @DomName('WorkerGlobalScope.navigator')
   @DocsEditable()
   @Experimental() // untriaged
-  _WorkerNavigator get navigator => _blink.Native_WorkerGlobalScope_navigator_Getter(this);
+  _WorkerNavigator get navigator => _blink.BlinkWorkerGlobalScope.$navigator_Getter(this);
 
   @DomName('WorkerGlobalScope.performance')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerPerformance get performance => _blink.Native_WorkerGlobalScope_performance_Getter(this);
+  WorkerPerformance get performance => _blink.BlinkWorkerGlobalScope.$performance_Getter(this);
 
   @DomName('WorkerGlobalScope.self')
   @DocsEditable()
   @Experimental() // untriaged
-  WorkerGlobalScope get self => _blink.Native_WorkerGlobalScope_self_Getter(this);
+  WorkerGlobalScope get self => _blink.BlinkWorkerGlobalScope.$self_Getter(this);
 
   @DomName('WorkerGlobalScope.close')
   @DocsEditable()
   @Experimental() // untriaged
-  void close() => _blink.Native_WorkerGlobalScope_close_Callback(this);
+  void close() => _blink.BlinkWorkerGlobalScope.$close_Callback(this);
 
   @DomName('WorkerGlobalScope.openDatabase')
   @DocsEditable()
   @Experimental() // untriaged
-  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  SqlDatabase openDatabase(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWorkerGlobalScope.$openDatabase_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.openDatabaseSync')
   @DocsEditable()
   @Experimental() // untriaged
-  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.Native_WorkerGlobalScope_openDatabaseSync_Callback(this, name, version, displayName, estimatedSize, creationCallback);
+  _DatabaseSync openDatabaseSync(String name, String version, String displayName, int estimatedSize, [DatabaseCallback creationCallback]) => _blink.BlinkWorkerGlobalScope.$openDatabaseSync_Callback(this, name, version, displayName, estimatedSize, creationCallback);
 
   @DomName('WorkerGlobalScope.webkitRequestFileSystem')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
+  void _webkitRequestFileSystem(int type, int size, [_FileSystemCallback successCallback, _ErrorCallback errorCallback]) => _blink.BlinkWorkerGlobalScope.$webkitRequestFileSystem_Callback(this, type, size, successCallback, errorCallback);
 
   Future<FileSystem> webkitRequestFileSystem(int type, int size) {
     var completer = new Completer<FileSystem>();
@@ -31048,7 +31048,7 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.Native_WorkerGlobalScope_webkitRequestFileSystemSync_Callback(this, type, size);
+  _DOMFileSystemSync requestFileSystemSync(int type, int size) => _blink.BlinkWorkerGlobalScope.$webkitRequestFileSystemSync_Callback(this, type, size);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemSyncURL')
   @DocsEditable()
@@ -31056,12 +31056,12 @@
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
   @Experimental() // untriaged
-  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemSyncURL_Callback(this, url);
+  _EntrySync resolveLocalFileSystemSyncUrl(String url) => _blink.BlinkWorkerGlobalScope.$webkitResolveLocalFileSystemSyncURL_Callback(this, url);
 
   @DomName('WorkerGlobalScope.webkitResolveLocalFileSystemURL')
   @DocsEditable()
   @Experimental() // untriaged
-  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.Native_WorkerGlobalScope_webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
+  void _webkitResolveLocalFileSystemUrl(String url, _EntryCallback successCallback, [_ErrorCallback errorCallback]) => _blink.BlinkWorkerGlobalScope.$webkitResolveLocalFileSystemURL_Callback(this, url, successCallback, errorCallback);
 
   Future<Entry> webkitResolveLocalFileSystemUrl(String url) {
     var completer = new Completer<Entry>();
@@ -31074,32 +31074,32 @@
   @DomName('WorkerGlobalScope.atob')
   @DocsEditable()
   @Experimental() // untriaged
-  String atob(String string) => _blink.Native_WorkerGlobalScope_atob_Callback(this, string);
+  String atob(String string) => _blink.BlinkWorkerGlobalScope.$atob_Callback(this, string);
 
   @DomName('WorkerGlobalScope.btoa')
   @DocsEditable()
   @Experimental() // untriaged
-  String btoa(String string) => _blink.Native_WorkerGlobalScope_btoa_Callback(this, string);
+  String btoa(String string) => _blink.BlinkWorkerGlobalScope.$btoa_Callback(this, string);
 
   @DomName('WorkerGlobalScope.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.Native_WorkerGlobalScope_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWorkerGlobalScope.$clearInterval_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.Native_WorkerGlobalScope_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWorkerGlobalScope.$clearTimeout_Callback(this, handle);
 
   @DomName('WorkerGlobalScope.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.$setInterval_Callback(this, handler, timeout);
 
   @DomName('WorkerGlobalScope.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.Native_WorkerGlobalScope_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWorkerGlobalScope.$setTimeout_Callback(this, handler, timeout);
 
   /// Stream of `error` events handled by this [WorkerGlobalScope].
   @DomName('WorkerGlobalScope.onerror')
@@ -31125,7 +31125,7 @@
   @DomName('WorkerPerformance.now')
   @DocsEditable()
   @Experimental() // untriaged
-  double now() => _blink.Native_WorkerPerformance_now_Callback(this);
+  double now() => _blink.BlinkWorkerPerformance.$now_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31145,19 +31145,19 @@
 
   @DomName('XPathEvaluator.XPathEvaluator')
   @DocsEditable()
-  factory XPathEvaluator() => _blink.Native_XPathEvaluator_XPathEvaluator();
+  factory XPathEvaluator() => _blink.BlinkXPathEvaluator.$mkXPathEvaluator();
 
   @DomName('XPathEvaluator.createExpression')
   @DocsEditable()
-  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.Native_XPathEvaluator_createExpression_Callback(this, expression, resolver);
+  XPathExpression createExpression(String expression, XPathNSResolver resolver) => _blink.BlinkXPathEvaluator.$createExpression_Callback(this, expression, resolver);
 
   @DomName('XPathEvaluator.createNSResolver')
   @DocsEditable()
-  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.Native_XPathEvaluator_createNSResolver_Callback(this, nodeResolver);
+  XPathNSResolver createNSResolver(Node nodeResolver) => _blink.BlinkXPathEvaluator.$createNSResolver_Callback(this, nodeResolver);
 
   @DomName('XPathEvaluator.evaluate')
   @DocsEditable()
-  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.Native_XPathEvaluator_evaluate_Callback(this, expression, contextNode, resolver, type, inResult);
+  XPathResult evaluate(String expression, Node contextNode, XPathNSResolver resolver, int type, XPathResult inResult) => _blink.BlinkXPathEvaluator.$evaluate_Callback(this, expression, contextNode, resolver, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31177,7 +31177,7 @@
 
   @DomName('XPathExpression.evaluate')
   @DocsEditable()
-  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.Native_XPathExpression_evaluate_Callback(this, contextNode, type, inResult);
+  XPathResult evaluate(Node contextNode, int type, XPathResult inResult) => _blink.BlinkXPathExpression.$evaluate_Callback(this, contextNode, type, inResult);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31197,7 +31197,7 @@
 
   @DomName('XPathNSResolver.lookupNamespaceURI')
   @DocsEditable()
-  String lookupNamespaceUri(String prefix) => _blink.Native_XPathNSResolver_lookupNamespaceURI_Callback(this, prefix);
+  String lookupNamespaceUri(String prefix) => _blink.BlinkXPathNSResolver.$lookupNamespaceURI_Callback(this, prefix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31257,39 +31257,39 @@
 
   @DomName('XPathResult.booleanValue')
   @DocsEditable()
-  bool get booleanValue => _blink.Native_XPathResult_booleanValue_Getter(this);
+  bool get booleanValue => _blink.BlinkXPathResult.$booleanValue_Getter(this);
 
   @DomName('XPathResult.invalidIteratorState')
   @DocsEditable()
-  bool get invalidIteratorState => _blink.Native_XPathResult_invalidIteratorState_Getter(this);
+  bool get invalidIteratorState => _blink.BlinkXPathResult.$invalidIteratorState_Getter(this);
 
   @DomName('XPathResult.numberValue')
   @DocsEditable()
-  double get numberValue => _blink.Native_XPathResult_numberValue_Getter(this);
+  double get numberValue => _blink.BlinkXPathResult.$numberValue_Getter(this);
 
   @DomName('XPathResult.resultType')
   @DocsEditable()
-  int get resultType => _blink.Native_XPathResult_resultType_Getter(this);
+  int get resultType => _blink.BlinkXPathResult.$resultType_Getter(this);
 
   @DomName('XPathResult.singleNodeValue')
   @DocsEditable()
-  Node get singleNodeValue => _blink.Native_XPathResult_singleNodeValue_Getter(this);
+  Node get singleNodeValue => _blink.BlinkXPathResult.$singleNodeValue_Getter(this);
 
   @DomName('XPathResult.snapshotLength')
   @DocsEditable()
-  int get snapshotLength => _blink.Native_XPathResult_snapshotLength_Getter(this);
+  int get snapshotLength => _blink.BlinkXPathResult.$snapshotLength_Getter(this);
 
   @DomName('XPathResult.stringValue')
   @DocsEditable()
-  String get stringValue => _blink.Native_XPathResult_stringValue_Getter(this);
+  String get stringValue => _blink.BlinkXPathResult.$stringValue_Getter(this);
 
   @DomName('XPathResult.iterateNext')
   @DocsEditable()
-  Node iterateNext() => _blink.Native_XPathResult_iterateNext_Callback(this);
+  Node iterateNext() => _blink.BlinkXPathResult.$iterateNext_Callback(this);
 
   @DomName('XPathResult.snapshotItem')
   @DocsEditable()
-  Node snapshotItem(int index) => _blink.Native_XPathResult_snapshotItem_Callback(this, index);
+  Node snapshotItem(int index) => _blink.BlinkXPathResult.$snapshotItem_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31324,11 +31324,11 @@
 
   @DomName('XMLSerializer.XMLSerializer')
   @DocsEditable()
-  factory XmlSerializer() => _blink.Native_XMLSerializer_XmlSerializer();
+  factory XmlSerializer() => _blink.BlinkXMLSerializer.$mkXmlSerializer();
 
   @DomName('XMLSerializer.serializeToString')
   @DocsEditable()
-  String serializeToString(Node node) => _blink.Native_XMLSerializer_serializeToString_Callback(this, node);
+  String serializeToString(Node node) => _blink.BlinkXMLSerializer.$serializeToString_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31350,42 +31350,42 @@
 
   @DomName('XSLTProcessor.XSLTProcessor')
   @DocsEditable()
-  factory XsltProcessor() => _blink.Native_XSLTProcessor_XsltProcessor();
+  factory XsltProcessor() => _blink.BlinkXSLTProcessor.$mkXsltProcessor();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('XSLTProcessor.clearParameters')
   @DocsEditable()
-  void clearParameters() => _blink.Native_XSLTProcessor_clearParameters_Callback(this);
+  void clearParameters() => _blink.BlinkXSLTProcessor.$clearParameters_Callback(this);
 
   @DomName('XSLTProcessor.getParameter')
   @DocsEditable()
-  String getParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_getParameter_Callback(this, namespaceURI, localName);
+  String getParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.$getParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.importStylesheet')
   @DocsEditable()
-  void importStylesheet(Node stylesheet) => _blink.Native_XSLTProcessor_importStylesheet_Callback(this, stylesheet);
+  void importStylesheet(Node stylesheet) => _blink.BlinkXSLTProcessor.$importStylesheet_Callback(this, stylesheet);
 
   @DomName('XSLTProcessor.removeParameter')
   @DocsEditable()
-  void removeParameter(String namespaceURI, String localName) => _blink.Native_XSLTProcessor_removeParameter_Callback(this, namespaceURI, localName);
+  void removeParameter(String namespaceURI, String localName) => _blink.BlinkXSLTProcessor.$removeParameter_Callback(this, namespaceURI, localName);
 
   @DomName('XSLTProcessor.reset')
   @DocsEditable()
-  void reset() => _blink.Native_XSLTProcessor_reset_Callback(this);
+  void reset() => _blink.BlinkXSLTProcessor.$reset_Callback(this);
 
   @DomName('XSLTProcessor.setParameter')
   @DocsEditable()
-  void setParameter(String namespaceURI, String localName, String value) => _blink.Native_XSLTProcessor_setParameter_Callback(this, namespaceURI, localName, value);
+  void setParameter(String namespaceURI, String localName, String value) => _blink.BlinkXSLTProcessor.$setParameter_Callback(this, namespaceURI, localName, value);
 
   @DomName('XSLTProcessor.transformToDocument')
   @DocsEditable()
-  Document transformToDocument(Node source) => _blink.Native_XSLTProcessor_transformToDocument_Callback(this, source);
+  Document transformToDocument(Node source) => _blink.BlinkXSLTProcessor.$transformToDocument_Callback(this, source);
 
   @DomName('XSLTProcessor.transformToFragment')
   @DocsEditable()
-  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.Native_XSLTProcessor_transformToFragment_Callback(this, source, docVal);
+  DocumentFragment transformToFragment(Node source, Document docVal) => _blink.BlinkXSLTProcessor.$transformToFragment_Callback(this, source, docVal);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31404,24 +31404,24 @@
   @DomName('Attr.localName')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _localName => _blink.Native_Attr_localName_Getter(this);
+  String get _localName => _blink.BlinkAttr.$localName_Getter(this);
 
   @DomName('Attr.name')
   @DocsEditable()
-  String get name => _blink.Native_Attr_name_Getter(this);
+  String get name => _blink.BlinkAttr.$name_Getter(this);
 
   @DomName('Attr.namespaceURI')
   @DocsEditable()
   @Experimental() // untriaged
-  String get _namespaceUri => _blink.Native_Attr_namespaceURI_Getter(this);
+  String get _namespaceUri => _blink.BlinkAttr.$namespaceURI_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  String get value => _blink.Native_Attr_value_Getter(this);
+  String get value => _blink.BlinkAttr.$value_Getter(this);
 
   @DomName('Attr.value')
   @DocsEditable()
-  void set value(String value) => _blink.Native_Attr_value_Setter(this, value);
+  void set value(String value) => _blink.BlinkAttr.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31575,27 +31575,27 @@
 
   @DomName('ClientRect.bottom')
   @DocsEditable()
-  double get bottom => _blink.Native_ClientRect_bottom_Getter(this);
+  double get bottom => _blink.BlinkClientRect.$bottom_Getter(this);
 
   @DomName('ClientRect.height')
   @DocsEditable()
-  double get height => _blink.Native_ClientRect_height_Getter(this);
+  double get height => _blink.BlinkClientRect.$height_Getter(this);
 
   @DomName('ClientRect.left')
   @DocsEditable()
-  double get left => _blink.Native_ClientRect_left_Getter(this);
+  double get left => _blink.BlinkClientRect.$left_Getter(this);
 
   @DomName('ClientRect.right')
   @DocsEditable()
-  double get right => _blink.Native_ClientRect_right_Getter(this);
+  double get right => _blink.BlinkClientRect.$right_Getter(this);
 
   @DomName('ClientRect.top')
   @DocsEditable()
-  double get top => _blink.Native_ClientRect_top_Getter(this);
+  double get top => _blink.BlinkClientRect.$top_Getter(this);
 
   @DomName('ClientRect.width')
   @DocsEditable()
-  double get width => _blink.Native_ClientRect_width_Getter(this);
+  double get width => _blink.BlinkClientRect.$width_Getter(this);
 }
 
 /**
@@ -31649,15 +31649,15 @@
 
   @DomName('ClientRectList.length')
   @DocsEditable()
-  int get length => _blink.Native_ClientRectList_length_Getter(this);
+  int get length => _blink.BlinkClientRectList.$length_Getter(this);
 
   Rectangle operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkClientRectList.$NativeIndexed_Getter(this, index);
   }
 
-  Rectangle _nativeIndexedGetter(int index) => _blink.Native_ClientRectList_NativeIndexed_Getter(this, index);
+  Rectangle _nativeIndexedGetter(int index) => _blink.BlinkClientRectList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Rectangle value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31699,7 +31699,7 @@
 
   @DomName('ClientRectList.item')
   @DocsEditable()
-  Rectangle item(int index) => _blink.Native_ClientRectList_item_Callback(this, index);
+  Rectangle item(int index) => _blink.BlinkClientRectList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31733,15 +31733,15 @@
 
   @DomName('CSSRuleList.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSRuleList_length_Getter(this);
+  int get length => _blink.BlinkCSSRuleList.$length_Getter(this);
 
   CssRule operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkCSSRuleList.$NativeIndexed_Getter(this, index);
   }
 
-  CssRule _nativeIndexedGetter(int index) => _blink.Native_CSSRuleList_NativeIndexed_Getter(this, index);
+  CssRule _nativeIndexedGetter(int index) => _blink.BlinkCSSRuleList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, CssRule value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31783,7 +31783,7 @@
 
   @DomName('CSSRuleList.item')
   @DocsEditable()
-  CssRule item(int index) => _blink.Native_CSSRuleList_item_Callback(this, index);
+  CssRule item(int index) => _blink.BlinkCSSRuleList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31803,15 +31803,15 @@
 
   @DomName('CSSValueList.length')
   @DocsEditable()
-  int get length => _blink.Native_CSSValueList_length_Getter(this);
+  int get length => _blink.BlinkCSSValueList.$length_Getter(this);
 
   _CSSValue operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkCSSValueList.$NativeIndexed_Getter(this, index);
   }
 
-  _CSSValue _nativeIndexedGetter(int index) => _blink.Native_CSSValueList_NativeIndexed_Getter(this, index);
+  _CSSValue _nativeIndexedGetter(int index) => _blink.BlinkCSSValueList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, _CSSValue value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -31853,7 +31853,7 @@
 
   @DomName('CSSValueList.item')
   @DocsEditable()
-  _CSSValue item(int index) => _blink.Native_CSSValueList_item_Callback(this, index);
+  _CSSValue item(int index) => _blink.BlinkCSSValueList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -31963,26 +31963,26 @@
   factory _DomPoint(num x, num y) => _create(x, y);
 
   @DocsEditable()
-  static _DomPoint _create(x, y) => _blink.Native_WebKitPoint_constructorCallback(x, y);
+  static _DomPoint _create(x, y) => _blink.BlinkWebKitPoint.$constructorCallback(x, y);
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  num get x => _blink.Native_WebKitPoint_x_Getter(this);
+  num get x => _blink.BlinkWebKitPoint.$x_Getter(this);
 
   @DomName('WebKitPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_WebKitPoint_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkWebKitPoint.$x_Setter(this, value);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  num get y => _blink.Native_WebKitPoint_y_Getter(this);
+  num get y => _blink.BlinkWebKitPoint.$y_Getter(this);
 
   @DomName('WebKitPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_WebKitPoint_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkWebKitPoint.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32034,7 +32034,7 @@
 
   @DomName('FileReaderSync.FileReaderSync')
   @DocsEditable()
-  factory _FileReaderSync() => _blink.Native_FileReaderSync__FileReaderSync();
+  factory _FileReaderSync() => _blink.BlinkFileReaderSync.$mk_FileReaderSync();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32070,15 +32070,15 @@
 
   @DomName('GamepadList.length')
   @DocsEditable()
-  int get length => _blink.Native_GamepadList_length_Getter(this);
+  int get length => _blink.BlinkGamepadList.$length_Getter(this);
 
   Gamepad operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkGamepadList.$NativeIndexed_Getter(this, index);
   }
 
-  Gamepad _nativeIndexedGetter(int index) => _blink.Native_GamepadList_NativeIndexed_Getter(this, index);
+  Gamepad _nativeIndexedGetter(int index) => _blink.BlinkGamepadList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Gamepad value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32120,7 +32120,7 @@
 
   @DomName('GamepadList.item')
   @DocsEditable()
-  Gamepad item(int index) => _blink.Native_GamepadList_item_Callback(this, index);
+  Gamepad item(int index) => _blink.BlinkGamepadList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32140,7 +32140,7 @@
 
   @DomName('HTMLAllCollection.item')
   @DocsEditable()
-  Element _item(int index) => _blink.Native_HTMLAllCollection_item_Callback(this, index);
+  Element _item(int index) => _blink.BlinkHTMLAllCollection.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32317,15 +32317,15 @@
 
   @DomName('NamedNodeMap.length')
   @DocsEditable()
-  int get length => _blink.Native_NamedNodeMap_length_Getter(this);
+  int get length => _blink.BlinkNamedNodeMap.$length_Getter(this);
 
   Node operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
+    return _blink.BlinkNamedNodeMap.$NativeIndexed_Getter(this, index);
   }
 
-  Node _nativeIndexedGetter(int index) => _blink.Native_NamedNodeMap_NativeIndexed_Getter(this, index);
+  Node _nativeIndexedGetter(int index) => _blink.BlinkNamedNodeMap.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Node value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32367,35 +32367,35 @@
 
   @DomName('NamedNodeMap.__getter__')
   @DocsEditable()
-  Node __getter__(String name) => _blink.Native_NamedNodeMap___getter___Callback(this, name);
+  Node __getter__(String name) => _blink.BlinkNamedNodeMap.$__getter___Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItem')
   @DocsEditable()
-  Node getNamedItem(String name) => _blink.Native_NamedNodeMap_getNamedItem_Callback(this, name);
+  Node getNamedItem(String name) => _blink.BlinkNamedNodeMap.$getNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.getNamedItemNS')
   @DocsEditable()
-  Node getNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_getNamedItemNS_Callback(this, namespaceURI, localName);
+  Node getNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.$getNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.item')
   @DocsEditable()
-  Node item(int index) => _blink.Native_NamedNodeMap_item_Callback(this, index);
+  Node item(int index) => _blink.BlinkNamedNodeMap.$item_Callback(this, index);
 
   @DomName('NamedNodeMap.removeNamedItem')
   @DocsEditable()
-  Node removeNamedItem(String name) => _blink.Native_NamedNodeMap_removeNamedItem_Callback(this, name);
+  Node removeNamedItem(String name) => _blink.BlinkNamedNodeMap.$removeNamedItem_Callback(this, name);
 
   @DomName('NamedNodeMap.removeNamedItemNS')
   @DocsEditable()
-  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.Native_NamedNodeMap_removeNamedItemNS_Callback(this, namespaceURI, localName);
+  Node removeNamedItemNS(String namespaceURI, String localName) => _blink.BlinkNamedNodeMap.$removeNamedItemNS_Callback(this, namespaceURI, localName);
 
   @DomName('NamedNodeMap.setNamedItem')
   @DocsEditable()
-  Node setNamedItem(Node node) => _blink.Native_NamedNodeMap_setNamedItem_Callback(this, node);
+  Node setNamedItem(Node node) => _blink.BlinkNamedNodeMap.$setNamedItem_Callback(this, node);
 
   @DomName('NamedNodeMap.setNamedItemNS')
   @DocsEditable()
-  Node setNamedItemNS(Node node) => _blink.Native_NamedNodeMap_setNamedItemNS_Callback(this, node);
+  Node setNamedItemNS(Node node) => _blink.BlinkNamedNodeMap.$setNamedItemNS_Callback(this, node);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32526,15 +32526,15 @@
 
   @DomName('SpeechInputResultList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechInputResultList_length_Getter(this);
+  int get length => _blink.BlinkSpeechInputResultList.$length_Getter(this);
 
   SpeechInputResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechInputResultList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechInputResult _nativeIndexedGetter(int index) => _blink.Native_SpeechInputResultList_NativeIndexed_Getter(this, index);
+  SpeechInputResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechInputResultList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechInputResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32576,7 +32576,7 @@
 
   @DomName('SpeechInputResultList.item')
   @DocsEditable()
-  SpeechInputResult item(int index) => _blink.Native_SpeechInputResultList_item_Callback(this, index);
+  SpeechInputResult item(int index) => _blink.BlinkSpeechInputResultList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32596,15 +32596,15 @@
 
   @DomName('SpeechRecognitionResultList.length')
   @DocsEditable()
-  int get length => _blink.Native_SpeechRecognitionResultList_length_Getter(this);
+  int get length => _blink.BlinkSpeechRecognitionResultList.$length_Getter(this);
 
   SpeechRecognitionResult operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSpeechRecognitionResultList.$NativeIndexed_Getter(this, index);
   }
 
-  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.Native_SpeechRecognitionResultList_NativeIndexed_Getter(this, index);
+  SpeechRecognitionResult _nativeIndexedGetter(int index) => _blink.BlinkSpeechRecognitionResultList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, SpeechRecognitionResult value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32646,7 +32646,7 @@
 
   @DomName('SpeechRecognitionResultList.item')
   @DocsEditable()
-  SpeechRecognitionResult item(int index) => _blink.Native_SpeechRecognitionResultList_item_Callback(this, index);
+  SpeechRecognitionResult item(int index) => _blink.BlinkSpeechRecognitionResultList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32664,15 +32664,15 @@
 
   @DomName('StyleSheetList.length')
   @DocsEditable()
-  int get length => _blink.Native_StyleSheetList_length_Getter(this);
+  int get length => _blink.BlinkStyleSheetList.$length_Getter(this);
 
   StyleSheet operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkStyleSheetList.$NativeIndexed_Getter(this, index);
   }
 
-  StyleSheet _nativeIndexedGetter(int index) => _blink.Native_StyleSheetList_NativeIndexed_Getter(this, index);
+  StyleSheet _nativeIndexedGetter(int index) => _blink.BlinkStyleSheetList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, StyleSheet value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -32714,11 +32714,11 @@
 
   @DomName('StyleSheetList.__getter__')
   @DocsEditable()
-  CssStyleSheet __getter__(String name) => _blink.Native_StyleSheetList___getter___Callback(this, name);
+  CssStyleSheet __getter__(String name) => _blink.BlinkStyleSheetList.$__getter___Callback(this, name);
 
   @DomName('StyleSheetList.item')
   @DocsEditable()
-  StyleSheet item(int index) => _blink.Native_StyleSheetList_item_Callback(this, index);
+  StyleSheet item(int index) => _blink.BlinkStyleSheetList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32772,7 +32772,7 @@
 
   @DomName('WebKitCSSMatrix.WebKitCSSMatrix')
   @DocsEditable()
-  factory _WebKitCSSMatrix([String cssValue]) => _blink.Native_WebKitCSSMatrix__WebKitCSSMatrix(cssValue);
+  factory _WebKitCSSMatrix([String cssValue]) => _blink.BlinkWebKitCSSMatrix.$mk_WebKitCSSMatrix(cssValue);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32807,7 +32807,7 @@
 
   @DomName('WebKitMediaSource.WebKitMediaSource')
   @DocsEditable()
-  factory _WebKitMediaSource() => _blink.Native_WebKitMediaSource__WebKitMediaSource();
+  factory _WebKitMediaSource() => _blink.BlinkWebKitMediaSource.$mk_WebKitMediaSource();
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32857,7 +32857,7 @@
   @DomName('WebKitSourceBufferList.item')
   @DocsEditable()
   @Experimental() // untriaged
-  _WebKitSourceBuffer _item(int index) => _blink.Native_WebKitSourceBufferList_item_Callback(this, index);
+  _WebKitSourceBuffer _item(int index) => _blink.BlinkWebKitSourceBufferList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -32877,22 +32877,22 @@
   @DomName('WindowTimers.clearInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearInterval(int handle) => _blink.Native_WindowTimers_clearInterval_Callback(this, handle);
+  void _clearInterval(int handle) => _blink.BlinkWindowTimers.$clearInterval_Callback(this, handle);
 
   @DomName('WindowTimers.clearTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  void _clearTimeout(int handle) => _blink.Native_WindowTimers_clearTimeout_Callback(this, handle);
+  void _clearTimeout(int handle) => _blink.BlinkWindowTimers.$clearTimeout_Callback(this, handle);
 
   @DomName('WindowTimers.setInterval')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setInterval(Object handler, int timeout) => _blink.Native_WindowTimers_setInterval_Callback(this, handler, timeout);
+  int _setInterval(Object handler, int timeout) => _blink.BlinkWindowTimers.$setInterval_Callback(this, handler, timeout);
 
   @DomName('WindowTimers.setTimeout')
   @DocsEditable()
   @Experimental() // untriaged
-  int _setTimeout(Object handler, int timeout) => _blink.Native_WindowTimers_setTimeout_Callback(this, handler, timeout);
+  int _setTimeout(Object handler, int timeout) => _blink.BlinkWindowTimers.$setTimeout_Callback(this, handler, timeout);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -37558,11 +37558,11 @@
     return element;
   }
 
-  static window() => _blink.Native_Utils_window();
-  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
+  static window() => _blink.Blink_Utils.window();
+  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -38166,16 +38166,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-    _blink.Native_Utils_createElement(document, tagName);
+    _blink.Blink_Utils.createElement(document, tagName);
 
   static void initializeCustomElement(HtmlElement element) =>
-    _blink.Native_Utils_initializeCustomElement(element);
+    _blink.Blink_Utils.initializeCustomElement(element);
 
   static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Native_Utils_changeElementWrapper(element, type);
+    _blink.Blink_Utils.changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -38183,17 +38183,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
-  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
-  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
-  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
-  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
-  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
+    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -38218,9 +38218,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Native_HistoryCrossFrame_back(this);
-  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
-  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -38230,7 +38230,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
+  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -38240,14 +38240,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
-  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
-  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
+  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
+  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
+  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
+  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
+  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
index c39811e..f49e256 100644
--- a/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
+++ b/sdk/lib/indexed_db/dartium/indexed_db_dartium.dart
@@ -35,18 +35,18 @@
       KeyRange.bound_(lower, upper, lowerOpen, upperOpen);
 }
 // FIXME: Can we make this private?
-const indexed_dbBlinkMap = const {
-  'IDBCursor': Cursor,
-  'IDBCursorWithValue': CursorWithValue,
-  'IDBDatabase': Database,
-  'IDBFactory': IdbFactory,
-  'IDBIndex': Index,
-  'IDBKeyRange': KeyRange,
-  'IDBObjectStore': ObjectStore,
-  'IDBOpenDBRequest': OpenDBRequest,
-  'IDBRequest': Request,
-  'IDBTransaction': Transaction,
-  'IDBVersionChangeEvent': VersionChangeEvent,
+final indexed_dbBlinkMap = {
+  'IDBCursor': () => Cursor,
+  'IDBCursorWithValue': () => CursorWithValue,
+  'IDBDatabase': () => Database,
+  'IDBFactory': () => IdbFactory,
+  'IDBIndex': () => Index,
+  'IDBKeyRange': () => KeyRange,
+  'IDBObjectStore': () => ObjectStore,
+  'IDBOpenDBRequest': () => OpenDBRequest,
+  'IDBRequest': () => Request,
+  'IDBTransaction': () => Transaction,
+  'IDBVersionChangeEvent': () => VersionChangeEvent,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -80,41 +80,41 @@
 
   @DomName('IDBCursor.direction')
   @DocsEditable()
-  String get direction => _blink.Native_IDBCursor_direction_Getter(this);
+  String get direction => _blink.BlinkIDBCursor.$direction_Getter(this);
 
   @DomName('IDBCursor.key')
   @DocsEditable()
-  Object get key => _blink.Native_IDBCursor_key_Getter(this);
+  Object get key => _blink.BlinkIDBCursor.$key_Getter(this);
 
   @DomName('IDBCursor.primaryKey')
   @DocsEditable()
-  Object get primaryKey => _blink.Native_IDBCursor_primaryKey_Getter(this);
+  Object get primaryKey => _blink.BlinkIDBCursor.$primaryKey_Getter(this);
 
   @DomName('IDBCursor.source')
   @DocsEditable()
-  Object get source => _blink.Native_IDBCursor_source_Getter(this);
+  Object get source => _blink.BlinkIDBCursor.$source_Getter(this);
 
   @DomName('IDBCursor.advance')
   @DocsEditable()
-  void advance(int count) => _blink.Native_IDBCursor_advance_Callback(this, count);
+  void advance(int count) => _blink.BlinkIDBCursor.$advance_Callback(this, count);
 
   @DomName('IDBCursor.continuePrimaryKey')
   @DocsEditable()
   @Experimental() // untriaged
-  void continuePrimaryKey(Object key, Object primaryKey) => _blink.Native_IDBCursor_continuePrimaryKey_Callback(this, key, primaryKey);
+  void continuePrimaryKey(Object key, Object primaryKey) => _blink.BlinkIDBCursor.$continuePrimaryKey_Callback(this, key, primaryKey);
 
   @DomName('IDBCursor.delete')
   @DocsEditable()
-  Request _delete() => _blink.Native_IDBCursor_delete_Callback(this);
+  Request _delete() => _blink.BlinkIDBCursor.$delete_Callback(this);
 
   @DomName('IDBCursor.next')
   @DocsEditable()
   @Experimental() // non-standard
-  void next([Object key]) => _blink.Native_IDBCursor_next_Callback(this, key);
+  void next([Object key]) => _blink.BlinkIDBCursor.$next_Callback(this, key);
 
   @DomName('IDBCursor.update')
   @DocsEditable()
-  Request _update(Object value) => _blink.Native_IDBCursor_update_Callback(this, value);
+  Request _update(Object value) => _blink.BlinkIDBCursor.$update_Callback(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -133,7 +133,7 @@
 
   @DomName('IDBCursorWithValue.value')
   @DocsEditable()
-  Object get value => _blink.Native_IDBCursorWithValue_value_Getter(this);
+  Object get value => _blink.BlinkIDBCursorWithValue.$value_Getter(this);
 
 }
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -216,41 +216,41 @@
 
   @DomName('IDBDatabase.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBDatabase_name_Getter(this);
+  String get name => _blink.BlinkIDBDatabase.$name_Getter(this);
 
   @DomName('IDBDatabase.objectStoreNames')
   @DocsEditable()
-  List<String> get objectStoreNames => _blink.Native_IDBDatabase_objectStoreNames_Getter(this);
+  List<String> get objectStoreNames => _blink.BlinkIDBDatabase.$objectStoreNames_Getter(this);
 
   @DomName('IDBDatabase.version')
   @DocsEditable()
-  Object get version => _blink.Native_IDBDatabase_version_Getter(this);
+  Object get version => _blink.BlinkIDBDatabase.$version_Getter(this);
 
   @DomName('IDBDatabase.close')
   @DocsEditable()
-  void close() => _blink.Native_IDBDatabase_close_Callback(this);
+  void close() => _blink.BlinkIDBDatabase.$close_Callback(this);
 
   @DomName('IDBDatabase.createObjectStore')
   @DocsEditable()
-  ObjectStore _createObjectStore(String name, [Map options]) => _blink.Native_IDBDatabase_createObjectStore_Callback(this, name, options);
+  ObjectStore _createObjectStore(String name, [Map options]) => _blink.BlinkIDBDatabase.$createObjectStore_Callback(this, name, options);
 
   @DomName('IDBDatabase.deleteObjectStore')
   @DocsEditable()
-  void deleteObjectStore(String name) => _blink.Native_IDBDatabase_deleteObjectStore_Callback(this, name);
+  void deleteObjectStore(String name) => _blink.BlinkIDBDatabase.$deleteObjectStore_Callback(this, name);
 
-  Transaction transaction(storeName_OR_storeNames, String mode) => _blink.Native_IDBDatabase_transaction(this, storeName_OR_storeNames, mode);
+  Transaction transaction(storeName_OR_storeNames, String mode) => _blink.BlinkIDBDatabase.$transaction(this, storeName_OR_storeNames, mode);
 
   @DomName('IDBDatabase.transactionList')
   @DocsEditable()
-  Transaction transactionList(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionList_Callback(this, storeNames, mode);
+  Transaction transactionList(List<String> storeNames, String mode) => _blink.BlinkIDBDatabase.$transactionList_Callback(this, storeNames, mode);
 
   @DomName('IDBDatabase.transactionStore')
   @DocsEditable()
-  Transaction transactionStore(String storeName, String mode) => _blink.Native_IDBDatabase_transactionStore_Callback(this, storeName, mode);
+  Transaction transactionStore(String storeName, String mode) => _blink.BlinkIDBDatabase.$transactionStore_Callback(this, storeName, mode);
 
   @DomName('IDBDatabase.transactionStores')
   @DocsEditable()
-  Transaction transactionStores(List<String> storeNames, String mode) => _blink.Native_IDBDatabase_transactionStores_Callback(this, storeNames, mode);
+  Transaction transactionStores(List<String> storeNames, String mode) => _blink.BlinkIDBDatabase.$transactionStores_Callback(this, storeNames, mode);
 
   /// Stream of `abort` events handled by this [Database].
   @DomName('IDBDatabase.onabort')
@@ -366,20 +366,20 @@
 
   @DomName('IDBFactory.cmp')
   @DocsEditable()
-  int cmp(Object first, Object second) => _blink.Native_IDBFactory_cmp_Callback(this, first, second);
+  int cmp(Object first, Object second) => _blink.BlinkIDBFactory.$cmp_Callback(this, first, second);
 
   @DomName('IDBFactory.deleteDatabase')
   @DocsEditable()
-  OpenDBRequest _deleteDatabase(String name) => _blink.Native_IDBFactory_deleteDatabase_Callback(this, name);
+  OpenDBRequest _deleteDatabase(String name) => _blink.BlinkIDBFactory.$deleteDatabase_Callback(this, name);
 
-  OpenDBRequest _open(String name, [int version]) => _blink.Native_IDBFactory__open(this, name, version);
+  OpenDBRequest _open(String name, [int version]) => _blink.BlinkIDBFactory.$_open(this, name, version);
 
   @DomName('IDBFactory.webkitGetDatabaseNames')
   @DocsEditable()
   @SupportedBrowser(SupportedBrowser.CHROME)
   @SupportedBrowser(SupportedBrowser.SAFARI)
   @Experimental()
-  Request _webkitGetDatabaseNames() => _blink.Native_IDBFactory_webkitGetDatabaseNames_Callback(this);
+  Request _webkitGetDatabaseNames() => _blink.BlinkIDBFactory.$webkitGetDatabaseNames_Callback(this);
 
 }
 
@@ -497,43 +497,43 @@
 
   @DomName('IDBIndex.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.Native_IDBIndex_keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBIndex.$keyPath_Getter(this);
 
   @DomName('IDBIndex.multiEntry')
   @DocsEditable()
-  bool get multiEntry => _blink.Native_IDBIndex_multiEntry_Getter(this);
+  bool get multiEntry => _blink.BlinkIDBIndex.$multiEntry_Getter(this);
 
   @DomName('IDBIndex.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBIndex_name_Getter(this);
+  String get name => _blink.BlinkIDBIndex.$name_Getter(this);
 
   @DomName('IDBIndex.objectStore')
   @DocsEditable()
-  ObjectStore get objectStore => _blink.Native_IDBIndex_objectStore_Getter(this);
+  ObjectStore get objectStore => _blink.BlinkIDBIndex.$objectStore_Getter(this);
 
   @DomName('IDBIndex.unique')
   @DocsEditable()
-  bool get unique => _blink.Native_IDBIndex_unique_Getter(this);
+  bool get unique => _blink.BlinkIDBIndex.$unique_Getter(this);
 
   @DomName('IDBIndex.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.Native_IDBIndex_count_Callback(this, key);
+  Request _count(Object key) => _blink.BlinkIDBIndex.$count_Callback(this, key);
 
   @DomName('IDBIndex.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.Native_IDBIndex_get_Callback(this, key);
+  Request _get(Object key) => _blink.BlinkIDBIndex.$get_Callback(this, key);
 
   @DomName('IDBIndex.getKey')
   @DocsEditable()
-  Request _getKey(Object key) => _blink.Native_IDBIndex_getKey_Callback(this, key);
+  Request _getKey(Object key) => _blink.BlinkIDBIndex.$getKey_Callback(this, key);
 
   @DomName('IDBIndex.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openCursor_Callback(this, key, direction);
+  Request _openCursor(Object key, [String direction]) => _blink.BlinkIDBIndex.$openCursor_Callback(this, key, direction);
 
   @DomName('IDBIndex.openKeyCursor')
   @DocsEditable()
-  Request _openKeyCursor(Object key, [String direction]) => _blink.Native_IDBIndex_openKeyCursor_Callback(this, key, direction);
+  Request _openKeyCursor(Object key, [String direction]) => _blink.BlinkIDBIndex.$openKeyCursor_Callback(this, key, direction);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -567,39 +567,39 @@
 
   @DomName('IDBKeyRange.lower')
   @DocsEditable()
-  Object get lower => _blink.Native_IDBKeyRange_lower_Getter(this);
+  Object get lower => _blink.BlinkIDBKeyRange.$lower_Getter(this);
 
   @DomName('IDBKeyRange.lowerOpen')
   @DocsEditable()
-  bool get lowerOpen => _blink.Native_IDBKeyRange_lowerOpen_Getter(this);
+  bool get lowerOpen => _blink.BlinkIDBKeyRange.$lowerOpen_Getter(this);
 
   @DomName('IDBKeyRange.upper')
   @DocsEditable()
-  Object get upper => _blink.Native_IDBKeyRange_upper_Getter(this);
+  Object get upper => _blink.BlinkIDBKeyRange.$upper_Getter(this);
 
   @DomName('IDBKeyRange.upperOpen')
   @DocsEditable()
-  bool get upperOpen => _blink.Native_IDBKeyRange_upperOpen_Getter(this);
+  bool get upperOpen => _blink.BlinkIDBKeyRange.$upperOpen_Getter(this);
 
   @DomName('IDBKeyRange.bound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) => _blink.Native_IDBKeyRange_bound__Callback(lower, upper, lowerOpen, upperOpen);
+  static KeyRange bound_(Object lower, Object upper, [bool lowerOpen, bool upperOpen]) => _blink.BlinkIDBKeyRange.$bound__Callback(lower, upper, lowerOpen, upperOpen);
 
   @DomName('IDBKeyRange.lowerBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange lowerBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_lowerBound__Callback(bound, open);
+  static KeyRange lowerBound_(Object bound, [bool open]) => _blink.BlinkIDBKeyRange.$lowerBound__Callback(bound, open);
 
   @DomName('IDBKeyRange.only_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange only_(Object value) => _blink.Native_IDBKeyRange_only__Callback(value);
+  static KeyRange only_(Object value) => _blink.BlinkIDBKeyRange.$only__Callback(value);
 
   @DomName('IDBKeyRange.upperBound_')
   @DocsEditable()
   @Experimental() // non-standard
-  static KeyRange upperBound_(Object bound, [bool open]) => _blink.Native_IDBKeyRange_upperBound__Callback(bound, open);
+  static KeyRange upperBound_(Object bound, [bool open]) => _blink.BlinkIDBKeyRange.$upperBound__Callback(bound, open);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -742,66 +742,66 @@
 
   @DomName('IDBObjectStore.autoIncrement')
   @DocsEditable()
-  bool get autoIncrement => _blink.Native_IDBObjectStore_autoIncrement_Getter(this);
+  bool get autoIncrement => _blink.BlinkIDBObjectStore.$autoIncrement_Getter(this);
 
   @DomName('IDBObjectStore.indexNames')
   @DocsEditable()
-  List<String> get indexNames => _blink.Native_IDBObjectStore_indexNames_Getter(this);
+  List<String> get indexNames => _blink.BlinkIDBObjectStore.$indexNames_Getter(this);
 
   @DomName('IDBObjectStore.keyPath')
   @DocsEditable()
-  Object get keyPath => _blink.Native_IDBObjectStore_keyPath_Getter(this);
+  Object get keyPath => _blink.BlinkIDBObjectStore.$keyPath_Getter(this);
 
   @DomName('IDBObjectStore.name')
   @DocsEditable()
-  String get name => _blink.Native_IDBObjectStore_name_Getter(this);
+  String get name => _blink.BlinkIDBObjectStore.$name_Getter(this);
 
   @DomName('IDBObjectStore.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.Native_IDBObjectStore_transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBObjectStore.$transaction_Getter(this);
 
   @DomName('IDBObjectStore.add')
   @DocsEditable()
-  Request _add(Object value, [Object key]) => _blink.Native_IDBObjectStore_add_Callback(this, value, key);
+  Request _add(Object value, [Object key]) => _blink.BlinkIDBObjectStore.$add_Callback(this, value, key);
 
   @DomName('IDBObjectStore.clear')
   @DocsEditable()
-  Request _clear() => _blink.Native_IDBObjectStore_clear_Callback(this);
+  Request _clear() => _blink.BlinkIDBObjectStore.$clear_Callback(this);
 
   @DomName('IDBObjectStore.count')
   @DocsEditable()
-  Request _count(Object key) => _blink.Native_IDBObjectStore_count_Callback(this, key);
+  Request _count(Object key) => _blink.BlinkIDBObjectStore.$count_Callback(this, key);
 
-  Index _createIndex(String name, keyPath, [Map options]) => _blink.Native_IDBObjectStore__createIndex(this, name, keyPath, options);
+  Index _createIndex(String name, keyPath, [Map options]) => _blink.BlinkIDBObjectStore.$_createIndex(this, name, keyPath, options);
 
   @DomName('IDBObjectStore.delete')
   @DocsEditable()
-  Request _delete(Object key) => _blink.Native_IDBObjectStore_delete_Callback(this, key);
+  Request _delete(Object key) => _blink.BlinkIDBObjectStore.$delete_Callback(this, key);
 
   @DomName('IDBObjectStore.deleteIndex')
   @DocsEditable()
-  void deleteIndex(String name) => _blink.Native_IDBObjectStore_deleteIndex_Callback(this, name);
+  void deleteIndex(String name) => _blink.BlinkIDBObjectStore.$deleteIndex_Callback(this, name);
 
   @DomName('IDBObjectStore.get')
   @DocsEditable()
-  Request _get(Object key) => _blink.Native_IDBObjectStore_get_Callback(this, key);
+  Request _get(Object key) => _blink.BlinkIDBObjectStore.$get_Callback(this, key);
 
   @DomName('IDBObjectStore.index')
   @DocsEditable()
-  Index index(String name) => _blink.Native_IDBObjectStore_index_Callback(this, name);
+  Index index(String name) => _blink.BlinkIDBObjectStore.$index_Callback(this, name);
 
   @DomName('IDBObjectStore.openCursor')
   @DocsEditable()
-  Request _openCursor(Object key, [String direction]) => _blink.Native_IDBObjectStore_openCursor_Callback(this, key, direction);
+  Request _openCursor(Object key, [String direction]) => _blink.BlinkIDBObjectStore.$openCursor_Callback(this, key, direction);
 
   @DomName('IDBObjectStore.openKeyCursor')
   @DocsEditable()
   @Experimental() // untriaged
-  Request openKeyCursor(Object range, String direction) => _blink.Native_IDBObjectStore_openKeyCursor_Callback(this, range, direction);
+  Request openKeyCursor(Object range, String direction) => _blink.BlinkIDBObjectStore.$openKeyCursor_Callback(this, range, direction);
 
   @DomName('IDBObjectStore.put')
   @DocsEditable()
-  Request _put(Object value, [Object key]) => _blink.Native_IDBObjectStore_put_Callback(this, value, key);
+  Request _put(Object value, [Object key]) => _blink.BlinkIDBObjectStore.$put_Callback(this, value, key);
 
 
   /**
@@ -912,23 +912,23 @@
 
   @DomName('IDBRequest.error')
   @DocsEditable()
-  DomError get error => _blink.Native_IDBRequest_error_Getter(this);
+  DomError get error => _blink.BlinkIDBRequest.$error_Getter(this);
 
   @DomName('IDBRequest.readyState')
   @DocsEditable()
-  String get readyState => _blink.Native_IDBRequest_readyState_Getter(this);
+  String get readyState => _blink.BlinkIDBRequest.$readyState_Getter(this);
 
   @DomName('IDBRequest.result')
   @DocsEditable()
-  Object get result => _blink.Native_IDBRequest_result_Getter(this);
+  Object get result => _blink.BlinkIDBRequest.$result_Getter(this);
 
   @DomName('IDBRequest.source')
   @DocsEditable()
-  Object get source => _blink.Native_IDBRequest_source_Getter(this);
+  Object get source => _blink.BlinkIDBRequest.$source_Getter(this);
 
   @DomName('IDBRequest.transaction')
   @DocsEditable()
-  Transaction get transaction => _blink.Native_IDBRequest_transaction_Getter(this);
+  Transaction get transaction => _blink.BlinkIDBRequest.$transaction_Getter(this);
 
   /// Stream of `error` events handled by this [Request].
   @DomName('IDBRequest.onerror')
@@ -1013,23 +1013,23 @@
 
   @DomName('IDBTransaction.db')
   @DocsEditable()
-  Database get db => _blink.Native_IDBTransaction_db_Getter(this);
+  Database get db => _blink.BlinkIDBTransaction.$db_Getter(this);
 
   @DomName('IDBTransaction.error')
   @DocsEditable()
-  DomError get error => _blink.Native_IDBTransaction_error_Getter(this);
+  DomError get error => _blink.BlinkIDBTransaction.$error_Getter(this);
 
   @DomName('IDBTransaction.mode')
   @DocsEditable()
-  String get mode => _blink.Native_IDBTransaction_mode_Getter(this);
+  String get mode => _blink.BlinkIDBTransaction.$mode_Getter(this);
 
   @DomName('IDBTransaction.abort')
   @DocsEditable()
-  void abort() => _blink.Native_IDBTransaction_abort_Callback(this);
+  void abort() => _blink.BlinkIDBTransaction.$abort_Callback(this);
 
   @DomName('IDBTransaction.objectStore')
   @DocsEditable()
-  ObjectStore objectStore(String name) => _blink.Native_IDBTransaction_objectStore_Callback(this, name);
+  ObjectStore objectStore(String name) => _blink.BlinkIDBTransaction.$objectStore_Callback(this, name);
 
   /// Stream of `abort` events handled by this [Transaction].
   @DomName('IDBTransaction.onabort')
@@ -1064,19 +1064,19 @@
   @DomName('IDBVersionChangeEvent.dataLoss')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLoss => _blink.Native_IDBVersionChangeEvent_dataLoss_Getter(this);
+  String get dataLoss => _blink.BlinkIDBVersionChangeEvent.$dataLoss_Getter(this);
 
   @DomName('IDBVersionChangeEvent.dataLossMessage')
   @DocsEditable()
   @Experimental() // untriaged
-  String get dataLossMessage => _blink.Native_IDBVersionChangeEvent_dataLossMessage_Getter(this);
+  String get dataLossMessage => _blink.BlinkIDBVersionChangeEvent.$dataLossMessage_Getter(this);
 
   @DomName('IDBVersionChangeEvent.newVersion')
   @DocsEditable()
-  Object get newVersion => _blink.Native_IDBVersionChangeEvent_newVersion_Getter(this);
+  Object get newVersion => _blink.BlinkIDBVersionChangeEvent.$newVersion_Getter(this);
 
   @DomName('IDBVersionChangeEvent.oldVersion')
   @DocsEditable()
-  Object get oldVersion => _blink.Native_IDBVersionChangeEvent_oldVersion_Getter(this);
+  Object get oldVersion => _blink.BlinkIDBVersionChangeEvent.$oldVersion_Getter(this);
 
 }
diff --git a/sdk/lib/internal/internal.dart b/sdk/lib/internal/internal.dart
index 2d41870..d838dc5 100644
--- a/sdk/lib/internal/internal.dart
+++ b/sdk/lib/internal/internal.dart
@@ -13,6 +13,7 @@
 part 'iterable.dart';
 part 'list.dart';
 part 'lists.dart';
+part 'lru.dart';
 part 'print.dart';
 part 'sort.dart';
 part 'symbol.dart';
diff --git a/sdk/lib/internal/internal_sources.gypi b/sdk/lib/internal/internal_sources.gypi
index 17cc287..acdf220 100644
--- a/sdk/lib/internal/internal_sources.gypi
+++ b/sdk/lib/internal/internal_sources.gypi
@@ -10,6 +10,7 @@
     'iterable.dart',
     'list.dart',
     'lists.dart',
+    'lru.dart',
     'print.dart',
     'sort.dart',
     'symbol.dart',
diff --git a/sdk/lib/io/http_impl.dart b/sdk/lib/io/http_impl.dart
index 5d1d535..b0a1d8f 100644
--- a/sdk/lib/io/http_impl.dart
+++ b/sdk/lib/io/http_impl.dart
@@ -1674,10 +1674,10 @@
                                  String host,
                                  int port,
                                  String path) {
+    Uri uri = new Uri(scheme: "http", host: host, port: port).resolve(path);
     // TODO(sgjesse): The path set here can contain both query and
     // fragment. They should be cracked and set correctly.
-    return _openUrl(method, new Uri(
-        scheme: "http", host: host, port: port, path: path));
+    return _openUrl(method, uri);
   }
 
   Future<HttpClientRequest> openUrl(String method, Uri url) {
@@ -1992,13 +1992,18 @@
 }
 
 
-class _HttpConnection extends LinkedListEntry<_HttpConnection> {
+class _HttpConnection
+    extends LinkedListEntry<_HttpConnection> with _ServiceObject {
   static const _ACTIVE = 0;
   static const _IDLE = 1;
   static const _CLOSING = 2;
   static const _DETACHED = 3;
 
-  final Socket _socket;
+  // Use HashMap, as we don't need to keep order.
+  static Map<int, _HttpConnection> _connections =
+      new HashMap<int, _HttpConnection>();
+
+  final _socket;
   final _HttpServer _httpServer;
   final _HttpParser _httpParser;
   int _state = _IDLE;
@@ -2009,6 +2014,8 @@
 
   _HttpConnection(this._socket, this._httpServer)
       : _httpParser = new _HttpParser.requestParser() {
+    try { _socket._owner = this; } catch (_) { print(_); }
+    _connections[_serviceId] = this;
     _httpParser.listenToStream(_socket);
     _subscription = _httpParser.listen(
         (incoming) {
@@ -2074,6 +2081,7 @@
     _state = _CLOSING;
     _socket.destroy();
     _httpServer._connectionClosed(this);
+    _connections.remove(_serviceId);
   }
 
   Future<Socket> detachSocket() {
@@ -2084,6 +2092,7 @@
     _HttpDetachedIncoming detachedIncoming = _httpParser.detachIncoming();
 
     return _streamFuture.then((_) {
+      _connections.remove(_serviceId);
       return new _DetachedSocket(_socket, detachedIncoming);
     });
   }
@@ -2094,6 +2103,42 @@
   bool get _isIdle => _state == _IDLE;
   bool get _isClosing => _state == _CLOSING;
   bool get _isDetached => _state == _DETACHED;
+
+  String get _serviceTypePath => 'io/http/serverconnections';
+  String get _serviceTypeName => 'HttpServerConnection';
+
+  Map _toJSON(bool ref) {
+    var name = "${_socket.address.host}:${_socket.port} <-> "
+        "${_socket.remoteAddress.host}:${_socket.remotePort}";
+    var r = {
+      'id': _servicePath,
+      'type': _serviceType(ref),
+      'name': name,
+      'user_name': name,
+    };
+    if (ref) {
+      return r;
+    }
+    r['server'] = _httpServer._toJSON(true);
+    try {
+      r['socket'] = _socket._toJSON(true);
+    } catch (_) {
+      r['socket'] = {
+        'id': _servicePath,
+        'type': '@Socket',
+        'name': 'UserSocket',
+        'user_name': 'UserSocket',
+      };
+    }
+    switch (_state) {
+      case _ACTIVE: r['state'] = "Active"; break;
+      case _IDLE: r['state'] = "Idle"; break;
+      case _CLOSING: r['state'] = "Closing"; break;
+      case _DETACHED: r['state'] = "Detached"; break;
+      default: r['state'] = 'Unknown'; break;
+    }
+    return r;
+  }
 }
 
 
@@ -2323,8 +2368,8 @@
     }
     r['port'] = port;
     r['address'] = address.host;
-    r['active'] = _activeConnections.length;
-    r['idle'] = _idleConnections.length;
+    r['active'] = _activeConnections.map((c) => c._toJSON(true)).toList();
+    r['idle'] = _idleConnections.map((c) => c._toJSON(true)).toList();
     r['closed'] = closed;
     return r;
   }
diff --git a/sdk/lib/io/platform_impl.dart b/sdk/lib/io/platform_impl.dart
index c6063a8..91bb7a7 100644
--- a/sdk/lib/io/platform_impl.dart
+++ b/sdk/lib/io/platform_impl.dart
@@ -71,7 +71,7 @@
           result[str.substring(0, equalsIndex)] =
               str.substring(equalsIndex + 1);
         }
-        _environmentCache = new UnmodifiableMapView(result);
+        _environmentCache = new UnmodifiableMapView<String, String>(result);
       } else {
         _environmentCache = env;
       }
@@ -90,16 +90,7 @@
 // Environment variables are case-insensitive on Windows. In order
 // to reflect that we use a case-insensitive string map on Windows.
 class _CaseInsensitiveStringMap<V> implements Map<String, V> {
-  Map<String, V> _map;
-
-  _CaseInsensitiveStringMap() : _map = new Map<String, V>();
-
-  _CaseInsensitiveStringMap.from(Map<String, V> other)
-      : _map = new Map<String, V>() {
-    other.forEach((String key, V value) {
-      _map[key.toUpperCase()] = value;
-    });
-  }
+  final Map<String, V> _map = new Map<String, V>();
 
   bool containsKey(String key) => _map.containsKey(key.toUpperCase());
   bool containsValue(Object value) => _map.containsValue(value);
@@ -121,4 +112,5 @@
   int get length => _map.length;
   bool get isEmpty => _map.isEmpty;
   bool get isNotEmpty => _map.isNotEmpty;
+  String toString() => _map.toString();
 }
diff --git a/sdk/lib/io/secure_socket.dart b/sdk/lib/io/secure_socket.dart
index 680acb6..6261cf8 100644
--- a/sdk/lib/io/secure_socket.dart
+++ b/sdk/lib/io/secure_socket.dart
@@ -609,6 +609,10 @@
 
   int get remotePort => _socket.remotePort;
 
+  void set _owner(owner) {
+    (_socket as dynamic)._owner = owner;
+  }
+
   int available() {
     return _status != CONNECTED ? 0
                                 : _secureFilter.buffers[READ_PLAINTEXT].length;
diff --git a/sdk/lib/isolate/isolate.dart b/sdk/lib/isolate/isolate.dart
index 4683218..96c55b8 100644
--- a/sdk/lib/isolate/isolate.dart
+++ b/sdk/lib/isolate/isolate.dart
@@ -7,10 +7,6 @@
  * independent workers that are similar to threads
  * but don't share memory,
  * communicating only via messages.
- *
- * See also:
- * [dart:isolate - Concurrency with Isolates](https://www.dartlang.org/docs/dart-up-and-running/contents/ch03.html#ch03-dartisolate---concurrency-with-isolates)
- * in the library tour.
  */
 library dart.isolate;
 
diff --git a/sdk/lib/js/dart2js/js_dart2js.dart b/sdk/lib/js/dart2js/js_dart2js.dart
index 84ec8f3..27fac2e 100644
--- a/sdk/lib/js/dart2js/js_dart2js.dart
+++ b/sdk/lib/js/dart2js/js_dart2js.dart
@@ -97,7 +97,7 @@
 import 'dart:_js_helper' show Primitives, convertDartClosureToJS,
     getIsolateAffinityTag;
 
-final JsObject context = _wrapToDart(Primitives.computeGlobalThis());
+final JsObject context = _wrapToDart(JS('', 'self'));
 
 _convertDartFunction(Function f, {bool captureThis: false}) {
   return JS('',
diff --git a/sdk/lib/svg/dartium/svg_dartium.dart b/sdk/lib/svg/dartium/svg_dartium.dart
index ebfc7e4..c2bf722 100644
--- a/sdk/lib/svg/dartium/svg_dartium.dart
+++ b/sdk/lib/svg/dartium/svg_dartium.dart
@@ -15,151 +15,151 @@
 
 
 // FIXME: Can we make this private?
-const svgBlinkMap = const {
-  'SVGAElement': AElement,
-  'SVGAltGlyphDefElement': _SVGAltGlyphDefElement,
-  'SVGAltGlyphElement': AltGlyphElement,
-  'SVGAltGlyphItemElement': _SVGAltGlyphItemElement,
-  'SVGAngle': Angle,
-  'SVGAnimateElement': AnimateElement,
-  'SVGAnimateMotionElement': AnimateMotionElement,
-  'SVGAnimateTransformElement': AnimateTransformElement,
-  'SVGAnimatedAngle': AnimatedAngle,
-  'SVGAnimatedBoolean': AnimatedBoolean,
-  'SVGAnimatedEnumeration': AnimatedEnumeration,
-  'SVGAnimatedInteger': AnimatedInteger,
-  'SVGAnimatedLength': AnimatedLength,
-  'SVGAnimatedLengthList': AnimatedLengthList,
-  'SVGAnimatedNumber': AnimatedNumber,
-  'SVGAnimatedNumberList': AnimatedNumberList,
-  'SVGAnimatedPreserveAspectRatio': AnimatedPreserveAspectRatio,
-  'SVGAnimatedRect': AnimatedRect,
-  'SVGAnimatedString': AnimatedString,
-  'SVGAnimatedTransformList': AnimatedTransformList,
-  'SVGAnimationElement': AnimationElement,
-  'SVGCircleElement': CircleElement,
-  'SVGClipPathElement': ClipPathElement,
-  'SVGComponentTransferFunctionElement': _SVGComponentTransferFunctionElement,
-  'SVGCursorElement': _SVGCursorElement,
-  'SVGDefsElement': DefsElement,
-  'SVGDescElement': DescElement,
-  'SVGDiscardElement': DiscardElement,
-  'SVGElement': SvgElement,
-  'SVGElementInstance': ElementInstance,
-  'SVGElementInstanceList': _ElementInstanceList,
-  'SVGEllipseElement': EllipseElement,
-  'SVGFEBlendElement': FEBlendElement,
-  'SVGFEColorMatrixElement': FEColorMatrixElement,
-  'SVGFEComponentTransferElement': FEComponentTransferElement,
-  'SVGFECompositeElement': FECompositeElement,
-  'SVGFEConvolveMatrixElement': FEConvolveMatrixElement,
-  'SVGFEDiffuseLightingElement': FEDiffuseLightingElement,
-  'SVGFEDisplacementMapElement': FEDisplacementMapElement,
-  'SVGFEDistantLightElement': FEDistantLightElement,
-  'SVGFEDropShadowElement': _SVGFEDropShadowElement,
-  'SVGFEFloodElement': FEFloodElement,
-  'SVGFEFuncAElement': FEFuncAElement,
-  'SVGFEFuncBElement': FEFuncBElement,
-  'SVGFEFuncGElement': FEFuncGElement,
-  'SVGFEFuncRElement': FEFuncRElement,
-  'SVGFEGaussianBlurElement': FEGaussianBlurElement,
-  'SVGFEImageElement': FEImageElement,
-  'SVGFEMergeElement': FEMergeElement,
-  'SVGFEMergeNodeElement': FEMergeNodeElement,
-  'SVGFEMorphologyElement': FEMorphologyElement,
-  'SVGFEOffsetElement': FEOffsetElement,
-  'SVGFEPointLightElement': FEPointLightElement,
-  'SVGFESpecularLightingElement': FESpecularLightingElement,
-  'SVGFESpotLightElement': FESpotLightElement,
-  'SVGFETileElement': FETileElement,
-  'SVGFETurbulenceElement': FETurbulenceElement,
-  'SVGFilterElement': FilterElement,
-  'SVGFilterPrimitiveStandardAttributes': FilterPrimitiveStandardAttributes,
-  'SVGFitToViewBox': FitToViewBox,
-  'SVGFontElement': _SVGFontElement,
-  'SVGFontFaceElement': _SVGFontFaceElement,
-  'SVGFontFaceFormatElement': _SVGFontFaceFormatElement,
-  'SVGFontFaceNameElement': _SVGFontFaceNameElement,
-  'SVGFontFaceSrcElement': _SVGFontFaceSrcElement,
-  'SVGFontFaceUriElement': _SVGFontFaceUriElement,
-  'SVGForeignObjectElement': ForeignObjectElement,
-  'SVGGElement': GElement,
-  'SVGGeometryElement': GeometryElement,
-  'SVGGlyphElement': _SVGGlyphElement,
-  'SVGGlyphRefElement': _SVGGlyphRefElement,
-  'SVGGradientElement': _GradientElement,
-  'SVGGraphicsElement': GraphicsElement,
-  'SVGHKernElement': _SVGHKernElement,
-  'SVGImageElement': ImageElement,
-  'SVGLength': Length,
-  'SVGLengthList': LengthList,
-  'SVGLineElement': LineElement,
-  'SVGLinearGradientElement': LinearGradientElement,
-  'SVGMPathElement': _SVGMPathElement,
-  'SVGMarkerElement': MarkerElement,
-  'SVGMaskElement': MaskElement,
-  'SVGMatrix': Matrix,
-  'SVGMetadataElement': MetadataElement,
-  'SVGMissingGlyphElement': _SVGMissingGlyphElement,
-  'SVGNumber': Number,
-  'SVGNumberList': NumberList,
-  'SVGPathElement': PathElement,
-  'SVGPathSeg': PathSeg,
-  'SVGPathSegArcAbs': PathSegArcAbs,
-  'SVGPathSegArcRel': PathSegArcRel,
-  'SVGPathSegClosePath': PathSegClosePath,
-  'SVGPathSegCurvetoCubicAbs': PathSegCurvetoCubicAbs,
-  'SVGPathSegCurvetoCubicRel': PathSegCurvetoCubicRel,
-  'SVGPathSegCurvetoCubicSmoothAbs': PathSegCurvetoCubicSmoothAbs,
-  'SVGPathSegCurvetoCubicSmoothRel': PathSegCurvetoCubicSmoothRel,
-  'SVGPathSegCurvetoQuadraticAbs': PathSegCurvetoQuadraticAbs,
-  'SVGPathSegCurvetoQuadraticRel': PathSegCurvetoQuadraticRel,
-  'SVGPathSegCurvetoQuadraticSmoothAbs': PathSegCurvetoQuadraticSmoothAbs,
-  'SVGPathSegCurvetoQuadraticSmoothRel': PathSegCurvetoQuadraticSmoothRel,
-  'SVGPathSegLinetoAbs': PathSegLinetoAbs,
-  'SVGPathSegLinetoHorizontalAbs': PathSegLinetoHorizontalAbs,
-  'SVGPathSegLinetoHorizontalRel': PathSegLinetoHorizontalRel,
-  'SVGPathSegLinetoRel': PathSegLinetoRel,
-  'SVGPathSegLinetoVerticalAbs': PathSegLinetoVerticalAbs,
-  'SVGPathSegLinetoVerticalRel': PathSegLinetoVerticalRel,
-  'SVGPathSegList': PathSegList,
-  'SVGPathSegMovetoAbs': PathSegMovetoAbs,
-  'SVGPathSegMovetoRel': PathSegMovetoRel,
-  'SVGPatternElement': PatternElement,
-  'SVGPoint': Point,
-  'SVGPointList': PointList,
-  'SVGPolygonElement': PolygonElement,
-  'SVGPolylineElement': PolylineElement,
-  'SVGPreserveAspectRatio': PreserveAspectRatio,
-  'SVGRadialGradientElement': RadialGradientElement,
-  'SVGRect': Rect,
-  'SVGRectElement': RectElement,
-  'SVGRenderingIntent': RenderingIntent,
-  'SVGSVGElement': SvgSvgElement,
-  'SVGScriptElement': ScriptElement,
-  'SVGSetElement': SetElement,
-  'SVGStopElement': StopElement,
-  'SVGStringList': StringList,
-  'SVGStyleElement': StyleElement,
-  'SVGSwitchElement': SwitchElement,
-  'SVGSymbolElement': SymbolElement,
-  'SVGTSpanElement': TSpanElement,
-  'SVGTests': Tests,
-  'SVGTextContentElement': TextContentElement,
-  'SVGTextElement': TextElement,
-  'SVGTextPathElement': TextPathElement,
-  'SVGTextPositioningElement': TextPositioningElement,
-  'SVGTitleElement': TitleElement,
-  'SVGTransform': Transform,
-  'SVGTransformList': TransformList,
-  'SVGURIReference': UriReference,
-  'SVGUnitTypes': UnitTypes,
-  'SVGUseElement': UseElement,
-  'SVGVKernElement': _SVGVKernElement,
-  'SVGViewElement': ViewElement,
-  'SVGViewSpec': ViewSpec,
-  'SVGZoomAndPan': ZoomAndPan,
-  'SVGZoomEvent': ZoomEvent,
+final svgBlinkMap = {
+  'SVGAElement': () => AElement,
+  'SVGAltGlyphDefElement': () => _SVGAltGlyphDefElement,
+  'SVGAltGlyphElement': () => AltGlyphElement,
+  'SVGAltGlyphItemElement': () => _SVGAltGlyphItemElement,
+  'SVGAngle': () => Angle,
+  'SVGAnimateElement': () => AnimateElement,
+  'SVGAnimateMotionElement': () => AnimateMotionElement,
+  'SVGAnimateTransformElement': () => AnimateTransformElement,
+  'SVGAnimatedAngle': () => AnimatedAngle,
+  'SVGAnimatedBoolean': () => AnimatedBoolean,
+  'SVGAnimatedEnumeration': () => AnimatedEnumeration,
+  'SVGAnimatedInteger': () => AnimatedInteger,
+  'SVGAnimatedLength': () => AnimatedLength,
+  'SVGAnimatedLengthList': () => AnimatedLengthList,
+  'SVGAnimatedNumber': () => AnimatedNumber,
+  'SVGAnimatedNumberList': () => AnimatedNumberList,
+  'SVGAnimatedPreserveAspectRatio': () => AnimatedPreserveAspectRatio,
+  'SVGAnimatedRect': () => AnimatedRect,
+  'SVGAnimatedString': () => AnimatedString,
+  'SVGAnimatedTransformList': () => AnimatedTransformList,
+  'SVGAnimationElement': () => AnimationElement,
+  'SVGCircleElement': () => CircleElement,
+  'SVGClipPathElement': () => ClipPathElement,
+  'SVGComponentTransferFunctionElement': () => _SVGComponentTransferFunctionElement,
+  'SVGCursorElement': () => _SVGCursorElement,
+  'SVGDefsElement': () => DefsElement,
+  'SVGDescElement': () => DescElement,
+  'SVGDiscardElement': () => DiscardElement,
+  'SVGElement': () => SvgElement,
+  'SVGElementInstance': () => ElementInstance,
+  'SVGElementInstanceList': () => _ElementInstanceList,
+  'SVGEllipseElement': () => EllipseElement,
+  'SVGFEBlendElement': () => FEBlendElement,
+  'SVGFEColorMatrixElement': () => FEColorMatrixElement,
+  'SVGFEComponentTransferElement': () => FEComponentTransferElement,
+  'SVGFECompositeElement': () => FECompositeElement,
+  'SVGFEConvolveMatrixElement': () => FEConvolveMatrixElement,
+  'SVGFEDiffuseLightingElement': () => FEDiffuseLightingElement,
+  'SVGFEDisplacementMapElement': () => FEDisplacementMapElement,
+  'SVGFEDistantLightElement': () => FEDistantLightElement,
+  'SVGFEDropShadowElement': () => _SVGFEDropShadowElement,
+  'SVGFEFloodElement': () => FEFloodElement,
+  'SVGFEFuncAElement': () => FEFuncAElement,
+  'SVGFEFuncBElement': () => FEFuncBElement,
+  'SVGFEFuncGElement': () => FEFuncGElement,
+  'SVGFEFuncRElement': () => FEFuncRElement,
+  'SVGFEGaussianBlurElement': () => FEGaussianBlurElement,
+  'SVGFEImageElement': () => FEImageElement,
+  'SVGFEMergeElement': () => FEMergeElement,
+  'SVGFEMergeNodeElement': () => FEMergeNodeElement,
+  'SVGFEMorphologyElement': () => FEMorphologyElement,
+  'SVGFEOffsetElement': () => FEOffsetElement,
+  'SVGFEPointLightElement': () => FEPointLightElement,
+  'SVGFESpecularLightingElement': () => FESpecularLightingElement,
+  'SVGFESpotLightElement': () => FESpotLightElement,
+  'SVGFETileElement': () => FETileElement,
+  'SVGFETurbulenceElement': () => FETurbulenceElement,
+  'SVGFilterElement': () => FilterElement,
+  'SVGFilterPrimitiveStandardAttributes': () => FilterPrimitiveStandardAttributes,
+  'SVGFitToViewBox': () => FitToViewBox,
+  'SVGFontElement': () => _SVGFontElement,
+  'SVGFontFaceElement': () => _SVGFontFaceElement,
+  'SVGFontFaceFormatElement': () => _SVGFontFaceFormatElement,
+  'SVGFontFaceNameElement': () => _SVGFontFaceNameElement,
+  'SVGFontFaceSrcElement': () => _SVGFontFaceSrcElement,
+  'SVGFontFaceUriElement': () => _SVGFontFaceUriElement,
+  'SVGForeignObjectElement': () => ForeignObjectElement,
+  'SVGGElement': () => GElement,
+  'SVGGeometryElement': () => GeometryElement,
+  'SVGGlyphElement': () => _SVGGlyphElement,
+  'SVGGlyphRefElement': () => _SVGGlyphRefElement,
+  'SVGGradientElement': () => _GradientElement,
+  'SVGGraphicsElement': () => GraphicsElement,
+  'SVGHKernElement': () => _SVGHKernElement,
+  'SVGImageElement': () => ImageElement,
+  'SVGLength': () => Length,
+  'SVGLengthList': () => LengthList,
+  'SVGLineElement': () => LineElement,
+  'SVGLinearGradientElement': () => LinearGradientElement,
+  'SVGMPathElement': () => _SVGMPathElement,
+  'SVGMarkerElement': () => MarkerElement,
+  'SVGMaskElement': () => MaskElement,
+  'SVGMatrix': () => Matrix,
+  'SVGMetadataElement': () => MetadataElement,
+  'SVGMissingGlyphElement': () => _SVGMissingGlyphElement,
+  'SVGNumber': () => Number,
+  'SVGNumberList': () => NumberList,
+  'SVGPathElement': () => PathElement,
+  'SVGPathSeg': () => PathSeg,
+  'SVGPathSegArcAbs': () => PathSegArcAbs,
+  'SVGPathSegArcRel': () => PathSegArcRel,
+  'SVGPathSegClosePath': () => PathSegClosePath,
+  'SVGPathSegCurvetoCubicAbs': () => PathSegCurvetoCubicAbs,
+  'SVGPathSegCurvetoCubicRel': () => PathSegCurvetoCubicRel,
+  'SVGPathSegCurvetoCubicSmoothAbs': () => PathSegCurvetoCubicSmoothAbs,
+  'SVGPathSegCurvetoCubicSmoothRel': () => PathSegCurvetoCubicSmoothRel,
+  'SVGPathSegCurvetoQuadraticAbs': () => PathSegCurvetoQuadraticAbs,
+  'SVGPathSegCurvetoQuadraticRel': () => PathSegCurvetoQuadraticRel,
+  'SVGPathSegCurvetoQuadraticSmoothAbs': () => PathSegCurvetoQuadraticSmoothAbs,
+  'SVGPathSegCurvetoQuadraticSmoothRel': () => PathSegCurvetoQuadraticSmoothRel,
+  'SVGPathSegLinetoAbs': () => PathSegLinetoAbs,
+  'SVGPathSegLinetoHorizontalAbs': () => PathSegLinetoHorizontalAbs,
+  'SVGPathSegLinetoHorizontalRel': () => PathSegLinetoHorizontalRel,
+  'SVGPathSegLinetoRel': () => PathSegLinetoRel,
+  'SVGPathSegLinetoVerticalAbs': () => PathSegLinetoVerticalAbs,
+  'SVGPathSegLinetoVerticalRel': () => PathSegLinetoVerticalRel,
+  'SVGPathSegList': () => PathSegList,
+  'SVGPathSegMovetoAbs': () => PathSegMovetoAbs,
+  'SVGPathSegMovetoRel': () => PathSegMovetoRel,
+  'SVGPatternElement': () => PatternElement,
+  'SVGPoint': () => Point,
+  'SVGPointList': () => PointList,
+  'SVGPolygonElement': () => PolygonElement,
+  'SVGPolylineElement': () => PolylineElement,
+  'SVGPreserveAspectRatio': () => PreserveAspectRatio,
+  'SVGRadialGradientElement': () => RadialGradientElement,
+  'SVGRect': () => Rect,
+  'SVGRectElement': () => RectElement,
+  'SVGRenderingIntent': () => RenderingIntent,
+  'SVGSVGElement': () => SvgSvgElement,
+  'SVGScriptElement': () => ScriptElement,
+  'SVGSetElement': () => SetElement,
+  'SVGStopElement': () => StopElement,
+  'SVGStringList': () => StringList,
+  'SVGStyleElement': () => StyleElement,
+  'SVGSwitchElement': () => SwitchElement,
+  'SVGSymbolElement': () => SymbolElement,
+  'SVGTSpanElement': () => TSpanElement,
+  'SVGTests': () => Tests,
+  'SVGTextContentElement': () => TextContentElement,
+  'SVGTextElement': () => TextElement,
+  'SVGTextPathElement': () => TextPathElement,
+  'SVGTextPositioningElement': () => TextPositioningElement,
+  'SVGTitleElement': () => TitleElement,
+  'SVGTransform': () => Transform,
+  'SVGTransformList': () => TransformList,
+  'SVGURIReference': () => UriReference,
+  'SVGUnitTypes': () => UnitTypes,
+  'SVGUseElement': () => UseElement,
+  'SVGVKernElement': () => _SVGVKernElement,
+  'SVGViewElement': () => ViewElement,
+  'SVGViewSpec': () => ViewSpec,
+  'SVGZoomAndPan': () => ZoomAndPan,
+  'SVGZoomEvent': () => ZoomEvent,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -200,11 +200,11 @@
 
   @DomName('SVGAElement.target')
   @DocsEditable()
-  AnimatedString get target => _blink.Native_SVGAElement_target_Getter(this);
+  AnimatedString get target => _blink.BlinkSVGAElement.$target_Getter(this);
 
   @DomName('SVGAElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGAElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -239,23 +239,23 @@
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  String get format => _blink.Native_SVGAltGlyphElement_format_Getter(this);
+  String get format => _blink.BlinkSVGAltGlyphElement.$format_Getter(this);
 
   @DomName('SVGAltGlyphElement.format')
   @DocsEditable()
-  void set format(String value) => _blink.Native_SVGAltGlyphElement_format_Setter(this, value);
+  void set format(String value) => _blink.BlinkSVGAltGlyphElement.$format_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  String get glyphRef => _blink.Native_SVGAltGlyphElement_glyphRef_Getter(this);
+  String get glyphRef => _blink.BlinkSVGAltGlyphElement.$glyphRef_Getter(this);
 
   @DomName('SVGAltGlyphElement.glyphRef')
   @DocsEditable()
-  void set glyphRef(String value) => _blink.Native_SVGAltGlyphElement_glyphRef_Setter(this, value);
+  void set glyphRef(String value) => _blink.BlinkSVGAltGlyphElement.$glyphRef_Setter(this, value);
 
   @DomName('SVGAltGlyphElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGAltGlyphElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGAltGlyphElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -294,39 +294,39 @@
 
   @DomName('SVGAngle.unitType')
   @DocsEditable()
-  int get unitType => _blink.Native_SVGAngle_unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGAngle.$unitType_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGAngle_value_Getter(this);
+  num get value => _blink.BlinkSVGAngle.$value_Getter(this);
 
   @DomName('SVGAngle.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGAngle_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGAngle.$value_Setter(this, value);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.Native_SVGAngle_valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGAngle.$valueAsString_Getter(this);
 
   @DomName('SVGAngle.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.Native_SVGAngle_valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGAngle.$valueAsString_Setter(this, value);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.Native_SVGAngle_valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGAngle.$valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGAngle.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGAngle_valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGAngle.$valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGAngle.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGAngle_convertToSpecifiedUnits_Callback(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGAngle.$convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGAngle.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGAngle_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGAngle.$newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -438,11 +438,11 @@
 
   @DomName('SVGAnimatedAngle.animVal')
   @DocsEditable()
-  Angle get animVal => _blink.Native_SVGAnimatedAngle_animVal_Getter(this);
+  Angle get animVal => _blink.BlinkSVGAnimatedAngle.$animVal_Getter(this);
 
   @DomName('SVGAnimatedAngle.baseVal')
   @DocsEditable()
-  Angle get baseVal => _blink.Native_SVGAnimatedAngle_baseVal_Getter(this);
+  Angle get baseVal => _blink.BlinkSVGAnimatedAngle.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -461,15 +461,15 @@
 
   @DomName('SVGAnimatedBoolean.animVal')
   @DocsEditable()
-  bool get animVal => _blink.Native_SVGAnimatedBoolean_animVal_Getter(this);
+  bool get animVal => _blink.BlinkSVGAnimatedBoolean.$animVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  bool get baseVal => _blink.Native_SVGAnimatedBoolean_baseVal_Getter(this);
+  bool get baseVal => _blink.BlinkSVGAnimatedBoolean.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedBoolean.baseVal')
   @DocsEditable()
-  void set baseVal(bool value) => _blink.Native_SVGAnimatedBoolean_baseVal_Setter(this, value);
+  void set baseVal(bool value) => _blink.BlinkSVGAnimatedBoolean.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -488,15 +488,15 @@
 
   @DomName('SVGAnimatedEnumeration.animVal')
   @DocsEditable()
-  int get animVal => _blink.Native_SVGAnimatedEnumeration_animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedEnumeration.$animVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.Native_SVGAnimatedEnumeration_baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedEnumeration.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedEnumeration.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.Native_SVGAnimatedEnumeration_baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedEnumeration.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -515,15 +515,15 @@
 
   @DomName('SVGAnimatedInteger.animVal')
   @DocsEditable()
-  int get animVal => _blink.Native_SVGAnimatedInteger_animVal_Getter(this);
+  int get animVal => _blink.BlinkSVGAnimatedInteger.$animVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  int get baseVal => _blink.Native_SVGAnimatedInteger_baseVal_Getter(this);
+  int get baseVal => _blink.BlinkSVGAnimatedInteger.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedInteger.baseVal')
   @DocsEditable()
-  void set baseVal(int value) => _blink.Native_SVGAnimatedInteger_baseVal_Setter(this, value);
+  void set baseVal(int value) => _blink.BlinkSVGAnimatedInteger.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -542,11 +542,11 @@
 
   @DomName('SVGAnimatedLength.animVal')
   @DocsEditable()
-  Length get animVal => _blink.Native_SVGAnimatedLength_animVal_Getter(this);
+  Length get animVal => _blink.BlinkSVGAnimatedLength.$animVal_Getter(this);
 
   @DomName('SVGAnimatedLength.baseVal')
   @DocsEditable()
-  Length get baseVal => _blink.Native_SVGAnimatedLength_baseVal_Getter(this);
+  Length get baseVal => _blink.BlinkSVGAnimatedLength.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -565,11 +565,11 @@
 
   @DomName('SVGAnimatedLengthList.animVal')
   @DocsEditable()
-  LengthList get animVal => _blink.Native_SVGAnimatedLengthList_animVal_Getter(this);
+  LengthList get animVal => _blink.BlinkSVGAnimatedLengthList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedLengthList.baseVal')
   @DocsEditable()
-  LengthList get baseVal => _blink.Native_SVGAnimatedLengthList_baseVal_Getter(this);
+  LengthList get baseVal => _blink.BlinkSVGAnimatedLengthList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -588,15 +588,15 @@
 
   @DomName('SVGAnimatedNumber.animVal')
   @DocsEditable()
-  double get animVal => _blink.Native_SVGAnimatedNumber_animVal_Getter(this);
+  double get animVal => _blink.BlinkSVGAnimatedNumber.$animVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  num get baseVal => _blink.Native_SVGAnimatedNumber_baseVal_Getter(this);
+  num get baseVal => _blink.BlinkSVGAnimatedNumber.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedNumber.baseVal')
   @DocsEditable()
-  void set baseVal(num value) => _blink.Native_SVGAnimatedNumber_baseVal_Setter(this, value);
+  void set baseVal(num value) => _blink.BlinkSVGAnimatedNumber.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -615,11 +615,11 @@
 
   @DomName('SVGAnimatedNumberList.animVal')
   @DocsEditable()
-  NumberList get animVal => _blink.Native_SVGAnimatedNumberList_animVal_Getter(this);
+  NumberList get animVal => _blink.BlinkSVGAnimatedNumberList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedNumberList.baseVal')
   @DocsEditable()
-  NumberList get baseVal => _blink.Native_SVGAnimatedNumberList_baseVal_Getter(this);
+  NumberList get baseVal => _blink.BlinkSVGAnimatedNumberList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -638,11 +638,11 @@
 
   @DomName('SVGAnimatedPreserveAspectRatio.animVal')
   @DocsEditable()
-  PreserveAspectRatio get animVal => _blink.Native_SVGAnimatedPreserveAspectRatio_animVal_Getter(this);
+  PreserveAspectRatio get animVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.$animVal_Getter(this);
 
   @DomName('SVGAnimatedPreserveAspectRatio.baseVal')
   @DocsEditable()
-  PreserveAspectRatio get baseVal => _blink.Native_SVGAnimatedPreserveAspectRatio_baseVal_Getter(this);
+  PreserveAspectRatio get baseVal => _blink.BlinkSVGAnimatedPreserveAspectRatio.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -661,11 +661,11 @@
 
   @DomName('SVGAnimatedRect.animVal')
   @DocsEditable()
-  Rect get animVal => _blink.Native_SVGAnimatedRect_animVal_Getter(this);
+  Rect get animVal => _blink.BlinkSVGAnimatedRect.$animVal_Getter(this);
 
   @DomName('SVGAnimatedRect.baseVal')
   @DocsEditable()
-  Rect get baseVal => _blink.Native_SVGAnimatedRect_baseVal_Getter(this);
+  Rect get baseVal => _blink.BlinkSVGAnimatedRect.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -684,15 +684,15 @@
 
   @DomName('SVGAnimatedString.animVal')
   @DocsEditable()
-  String get animVal => _blink.Native_SVGAnimatedString_animVal_Getter(this);
+  String get animVal => _blink.BlinkSVGAnimatedString.$animVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  String get baseVal => _blink.Native_SVGAnimatedString_baseVal_Getter(this);
+  String get baseVal => _blink.BlinkSVGAnimatedString.$baseVal_Getter(this);
 
   @DomName('SVGAnimatedString.baseVal')
   @DocsEditable()
-  void set baseVal(String value) => _blink.Native_SVGAnimatedString_baseVal_Setter(this, value);
+  void set baseVal(String value) => _blink.BlinkSVGAnimatedString.$baseVal_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -711,11 +711,11 @@
 
   @DomName('SVGAnimatedTransformList.animVal')
   @DocsEditable()
-  TransformList get animVal => _blink.Native_SVGAnimatedTransformList_animVal_Getter(this);
+  TransformList get animVal => _blink.BlinkSVGAnimatedTransformList.$animVal_Getter(this);
 
   @DomName('SVGAnimatedTransformList.baseVal')
   @DocsEditable()
-  TransformList get baseVal => _blink.Native_SVGAnimatedTransformList_baseVal_Getter(this);
+  TransformList get baseVal => _blink.BlinkSVGAnimatedTransformList.$baseVal_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -744,51 +744,51 @@
 
   @DomName('SVGAnimationElement.targetElement')
   @DocsEditable()
-  SvgElement get targetElement => _blink.Native_SVGAnimationElement_targetElement_Getter(this);
+  SvgElement get targetElement => _blink.BlinkSVGAnimationElement.$targetElement_Getter(this);
 
   @DomName('SVGAnimationElement.beginElement')
   @DocsEditable()
-  void beginElement() => _blink.Native_SVGAnimationElement_beginElement_Callback(this);
+  void beginElement() => _blink.BlinkSVGAnimationElement.$beginElement_Callback(this);
 
   @DomName('SVGAnimationElement.beginElementAt')
   @DocsEditable()
-  void beginElementAt(num offset) => _blink.Native_SVGAnimationElement_beginElementAt_Callback(this, offset);
+  void beginElementAt(num offset) => _blink.BlinkSVGAnimationElement.$beginElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.endElement')
   @DocsEditable()
-  void endElement() => _blink.Native_SVGAnimationElement_endElement_Callback(this);
+  void endElement() => _blink.BlinkSVGAnimationElement.$endElement_Callback(this);
 
   @DomName('SVGAnimationElement.endElementAt')
   @DocsEditable()
-  void endElementAt(num offset) => _blink.Native_SVGAnimationElement_endElementAt_Callback(this, offset);
+  void endElementAt(num offset) => _blink.BlinkSVGAnimationElement.$endElementAt_Callback(this, offset);
 
   @DomName('SVGAnimationElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.Native_SVGAnimationElement_getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGAnimationElement.$getCurrentTime_Callback(this);
 
   @DomName('SVGAnimationElement.getSimpleDuration')
   @DocsEditable()
-  double getSimpleDuration() => _blink.Native_SVGAnimationElement_getSimpleDuration_Callback(this);
+  double getSimpleDuration() => _blink.BlinkSVGAnimationElement.$getSimpleDuration_Callback(this);
 
   @DomName('SVGAnimationElement.getStartTime')
   @DocsEditable()
-  double getStartTime() => _blink.Native_SVGAnimationElement_getStartTime_Callback(this);
+  double getStartTime() => _blink.BlinkSVGAnimationElement.$getStartTime_Callback(this);
 
   @DomName('SVGAnimationElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGAnimationElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGAnimationElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGAnimationElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGAnimationElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGAnimationElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGAnimationElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGAnimationElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGAnimationElement.$systemLanguage_Getter(this);
 
   @DomName('SVGAnimationElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGAnimationElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGAnimationElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -817,15 +817,15 @@
 
   @DomName('SVGCircleElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGCircleElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGCircleElement.$cx_Getter(this);
 
   @DomName('SVGCircleElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGCircleElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGCircleElement.$cy_Getter(this);
 
   @DomName('SVGCircleElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.Native_SVGCircleElement_r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGCircleElement.$r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -854,7 +854,7 @@
 
   @DomName('SVGClipPathElement.clipPathUnits')
   @DocsEditable()
-  AnimatedEnumeration get clipPathUnits => _blink.Native_SVGClipPathElement_clipPathUnits_Getter(this);
+  AnimatedEnumeration get clipPathUnits => _blink.BlinkSVGClipPathElement.$clipPathUnits_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1368,31 +1368,31 @@
 
   @DomName('SVGElementInstance.correspondingElement')
   @DocsEditable()
-  SvgElement get correspondingElement => _blink.Native_SVGElementInstance_correspondingElement_Getter(this);
+  SvgElement get correspondingElement => _blink.BlinkSVGElementInstance.$correspondingElement_Getter(this);
 
   @DomName('SVGElementInstance.correspondingUseElement')
   @DocsEditable()
-  UseElement get correspondingUseElement => _blink.Native_SVGElementInstance_correspondingUseElement_Getter(this);
+  UseElement get correspondingUseElement => _blink.BlinkSVGElementInstance.$correspondingUseElement_Getter(this);
 
   @DomName('SVGElementInstance.firstChild')
   @DocsEditable()
-  ElementInstance get firstChild => _blink.Native_SVGElementInstance_firstChild_Getter(this);
+  ElementInstance get firstChild => _blink.BlinkSVGElementInstance.$firstChild_Getter(this);
 
   @DomName('SVGElementInstance.lastChild')
   @DocsEditable()
-  ElementInstance get lastChild => _blink.Native_SVGElementInstance_lastChild_Getter(this);
+  ElementInstance get lastChild => _blink.BlinkSVGElementInstance.$lastChild_Getter(this);
 
   @DomName('SVGElementInstance.nextSibling')
   @DocsEditable()
-  ElementInstance get nextSibling => _blink.Native_SVGElementInstance_nextSibling_Getter(this);
+  ElementInstance get nextSibling => _blink.BlinkSVGElementInstance.$nextSibling_Getter(this);
 
   @DomName('SVGElementInstance.parentNode')
   @DocsEditable()
-  ElementInstance get parentNode => _blink.Native_SVGElementInstance_parentNode_Getter(this);
+  ElementInstance get parentNode => _blink.BlinkSVGElementInstance.$parentNode_Getter(this);
 
   @DomName('SVGElementInstance.previousSibling')
   @DocsEditable()
-  ElementInstance get previousSibling => _blink.Native_SVGElementInstance_previousSibling_Getter(this);
+  ElementInstance get previousSibling => _blink.BlinkSVGElementInstance.$previousSibling_Getter(this);
 
   /// Stream of `abort` events handled by this [ElementInstance].
   @DomName('SVGElementInstance.onabort')
@@ -1635,19 +1635,19 @@
 
   @DomName('SVGEllipseElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGEllipseElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGEllipseElement.$cx_Getter(this);
 
   @DomName('SVGEllipseElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGEllipseElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGEllipseElement.$cy_Getter(this);
 
   @DomName('SVGEllipseElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.Native_SVGEllipseElement_rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGEllipseElement.$rx_Getter(this);
 
   @DomName('SVGEllipseElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.Native_SVGEllipseElement_ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGEllipseElement.$ry_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1707,35 +1707,35 @@
 
   @DomName('SVGFEBlendElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEBlendElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEBlendElement.$in1_Getter(this);
 
   @DomName('SVGFEBlendElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFEBlendElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEBlendElement.$in2_Getter(this);
 
   @DomName('SVGFEBlendElement.mode')
   @DocsEditable()
-  AnimatedEnumeration get mode => _blink.Native_SVGFEBlendElement_mode_Getter(this);
+  AnimatedEnumeration get mode => _blink.BlinkSVGFEBlendElement.$mode_Getter(this);
 
   @DomName('SVGFEBlendElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEBlendElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEBlendElement.$height_Getter(this);
 
   @DomName('SVGFEBlendElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEBlendElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEBlendElement.$result_Getter(this);
 
   @DomName('SVGFEBlendElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEBlendElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEBlendElement.$width_Getter(this);
 
   @DomName('SVGFEBlendElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEBlendElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEBlendElement.$x_Getter(this);
 
   @DomName('SVGFEBlendElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEBlendElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEBlendElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1791,35 +1791,35 @@
 
   @DomName('SVGFEColorMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEColorMatrixElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEColorMatrixElement.$in1_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.Native_SVGFEColorMatrixElement_type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFEColorMatrixElement.$type_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.values')
   @DocsEditable()
-  AnimatedNumberList get values => _blink.Native_SVGFEColorMatrixElement_values_Getter(this);
+  AnimatedNumberList get values => _blink.BlinkSVGFEColorMatrixElement.$values_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEColorMatrixElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEColorMatrixElement.$height_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEColorMatrixElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEColorMatrixElement.$result_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEColorMatrixElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEColorMatrixElement.$width_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEColorMatrixElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEColorMatrixElement.$x_Getter(this);
 
   @DomName('SVGFEColorMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEColorMatrixElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEColorMatrixElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1855,27 +1855,27 @@
 
   @DomName('SVGFEComponentTransferElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEComponentTransferElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEComponentTransferElement.$in1_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEComponentTransferElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEComponentTransferElement.$height_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEComponentTransferElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEComponentTransferElement.$result_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEComponentTransferElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEComponentTransferElement.$width_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEComponentTransferElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEComponentTransferElement.$x_Getter(this);
 
   @DomName('SVGFEComponentTransferElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEComponentTransferElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEComponentTransferElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1928,51 +1928,51 @@
 
   @DomName('SVGFECompositeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFECompositeElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFECompositeElement.$in1_Getter(this);
 
   @DomName('SVGFECompositeElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFECompositeElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFECompositeElement.$in2_Getter(this);
 
   @DomName('SVGFECompositeElement.k1')
   @DocsEditable()
-  AnimatedNumber get k1 => _blink.Native_SVGFECompositeElement_k1_Getter(this);
+  AnimatedNumber get k1 => _blink.BlinkSVGFECompositeElement.$k1_Getter(this);
 
   @DomName('SVGFECompositeElement.k2')
   @DocsEditable()
-  AnimatedNumber get k2 => _blink.Native_SVGFECompositeElement_k2_Getter(this);
+  AnimatedNumber get k2 => _blink.BlinkSVGFECompositeElement.$k2_Getter(this);
 
   @DomName('SVGFECompositeElement.k3')
   @DocsEditable()
-  AnimatedNumber get k3 => _blink.Native_SVGFECompositeElement_k3_Getter(this);
+  AnimatedNumber get k3 => _blink.BlinkSVGFECompositeElement.$k3_Getter(this);
 
   @DomName('SVGFECompositeElement.k4')
   @DocsEditable()
-  AnimatedNumber get k4 => _blink.Native_SVGFECompositeElement_k4_Getter(this);
+  AnimatedNumber get k4 => _blink.BlinkSVGFECompositeElement.$k4_Getter(this);
 
   @DomName('SVGFECompositeElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.Native_SVGFECompositeElement_operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFECompositeElement.$operator_Getter(this);
 
   @DomName('SVGFECompositeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFECompositeElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFECompositeElement.$height_Getter(this);
 
   @DomName('SVGFECompositeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFECompositeElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFECompositeElement.$result_Getter(this);
 
   @DomName('SVGFECompositeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFECompositeElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFECompositeElement.$width_Getter(this);
 
   @DomName('SVGFECompositeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFECompositeElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFECompositeElement.$x_Getter(this);
 
   @DomName('SVGFECompositeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFECompositeElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFECompositeElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2024,71 +2024,71 @@
 
   @DomName('SVGFEConvolveMatrixElement.bias')
   @DocsEditable()
-  AnimatedNumber get bias => _blink.Native_SVGFEConvolveMatrixElement_bias_Getter(this);
+  AnimatedNumber get bias => _blink.BlinkSVGFEConvolveMatrixElement.$bias_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.divisor')
   @DocsEditable()
-  AnimatedNumber get divisor => _blink.Native_SVGFEConvolveMatrixElement_divisor_Getter(this);
+  AnimatedNumber get divisor => _blink.BlinkSVGFEConvolveMatrixElement.$divisor_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.edgeMode')
   @DocsEditable()
-  AnimatedEnumeration get edgeMode => _blink.Native_SVGFEConvolveMatrixElement_edgeMode_Getter(this);
+  AnimatedEnumeration get edgeMode => _blink.BlinkSVGFEConvolveMatrixElement.$edgeMode_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEConvolveMatrixElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEConvolveMatrixElement.$in1_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelMatrix')
   @DocsEditable()
-  AnimatedNumberList get kernelMatrix => _blink.Native_SVGFEConvolveMatrixElement_kernelMatrix_Getter(this);
+  AnimatedNumberList get kernelMatrix => _blink.BlinkSVGFEConvolveMatrixElement.$kernelMatrix_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEConvolveMatrixElement.$kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEConvolveMatrixElement_kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEConvolveMatrixElement.$kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderX')
   @DocsEditable()
-  AnimatedInteger get orderX => _blink.Native_SVGFEConvolveMatrixElement_orderX_Getter(this);
+  AnimatedInteger get orderX => _blink.BlinkSVGFEConvolveMatrixElement.$orderX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.orderY')
   @DocsEditable()
-  AnimatedInteger get orderY => _blink.Native_SVGFEConvolveMatrixElement_orderY_Getter(this);
+  AnimatedInteger get orderY => _blink.BlinkSVGFEConvolveMatrixElement.$orderY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.preserveAlpha')
   @DocsEditable()
-  AnimatedBoolean get preserveAlpha => _blink.Native_SVGFEConvolveMatrixElement_preserveAlpha_Getter(this);
+  AnimatedBoolean get preserveAlpha => _blink.BlinkSVGFEConvolveMatrixElement.$preserveAlpha_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetX')
   @DocsEditable()
-  AnimatedInteger get targetX => _blink.Native_SVGFEConvolveMatrixElement_targetX_Getter(this);
+  AnimatedInteger get targetX => _blink.BlinkSVGFEConvolveMatrixElement.$targetX_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.targetY')
   @DocsEditable()
-  AnimatedInteger get targetY => _blink.Native_SVGFEConvolveMatrixElement_targetY_Getter(this);
+  AnimatedInteger get targetY => _blink.BlinkSVGFEConvolveMatrixElement.$targetY_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEConvolveMatrixElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEConvolveMatrixElement.$height_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEConvolveMatrixElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEConvolveMatrixElement.$result_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEConvolveMatrixElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEConvolveMatrixElement.$width_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEConvolveMatrixElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEConvolveMatrixElement.$x_Getter(this);
 
   @DomName('SVGFEConvolveMatrixElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEConvolveMatrixElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEConvolveMatrixElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2124,43 +2124,43 @@
 
   @DomName('SVGFEDiffuseLightingElement.diffuseConstant')
   @DocsEditable()
-  AnimatedNumber get diffuseConstant => _blink.Native_SVGFEDiffuseLightingElement_diffuseConstant_Getter(this);
+  AnimatedNumber get diffuseConstant => _blink.BlinkSVGFEDiffuseLightingElement.$diffuseConstant_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEDiffuseLightingElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDiffuseLightingElement.$in1_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthX')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthX => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthX_Getter(this);
+  AnimatedNumber get kernelUnitLengthX => _blink.BlinkSVGFEDiffuseLightingElement.$kernelUnitLengthX_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.kernelUnitLengthY')
   @DocsEditable()
-  AnimatedNumber get kernelUnitLengthY => _blink.Native_SVGFEDiffuseLightingElement_kernelUnitLengthY_Getter(this);
+  AnimatedNumber get kernelUnitLengthY => _blink.BlinkSVGFEDiffuseLightingElement.$kernelUnitLengthY_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.Native_SVGFEDiffuseLightingElement_surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFEDiffuseLightingElement.$surfaceScale_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEDiffuseLightingElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDiffuseLightingElement.$height_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEDiffuseLightingElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDiffuseLightingElement.$result_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEDiffuseLightingElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDiffuseLightingElement.$width_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEDiffuseLightingElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDiffuseLightingElement.$x_Getter(this);
 
   @DomName('SVGFEDiffuseLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEDiffuseLightingElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDiffuseLightingElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2216,43 +2216,43 @@
 
   @DomName('SVGFEDisplacementMapElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEDisplacementMapElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEDisplacementMapElement.$in1_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.in2')
   @DocsEditable()
-  AnimatedString get in2 => _blink.Native_SVGFEDisplacementMapElement_in2_Getter(this);
+  AnimatedString get in2 => _blink.BlinkSVGFEDisplacementMapElement.$in2_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.scale')
   @DocsEditable()
-  AnimatedNumber get scale => _blink.Native_SVGFEDisplacementMapElement_scale_Getter(this);
+  AnimatedNumber get scale => _blink.BlinkSVGFEDisplacementMapElement.$scale_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.xChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get xChannelSelector => _blink.Native_SVGFEDisplacementMapElement_xChannelSelector_Getter(this);
+  AnimatedEnumeration get xChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.$xChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.yChannelSelector')
   @DocsEditable()
-  AnimatedEnumeration get yChannelSelector => _blink.Native_SVGFEDisplacementMapElement_yChannelSelector_Getter(this);
+  AnimatedEnumeration get yChannelSelector => _blink.BlinkSVGFEDisplacementMapElement.$yChannelSelector_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEDisplacementMapElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEDisplacementMapElement.$height_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEDisplacementMapElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEDisplacementMapElement.$result_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEDisplacementMapElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEDisplacementMapElement.$width_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEDisplacementMapElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEDisplacementMapElement.$x_Getter(this);
 
   @DomName('SVGFEDisplacementMapElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEDisplacementMapElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEDisplacementMapElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2288,11 +2288,11 @@
 
   @DomName('SVGFEDistantLightElement.azimuth')
   @DocsEditable()
-  AnimatedNumber get azimuth => _blink.Native_SVGFEDistantLightElement_azimuth_Getter(this);
+  AnimatedNumber get azimuth => _blink.BlinkSVGFEDistantLightElement.$azimuth_Getter(this);
 
   @DomName('SVGFEDistantLightElement.elevation')
   @DocsEditable()
-  AnimatedNumber get elevation => _blink.Native_SVGFEDistantLightElement_elevation_Getter(this);
+  AnimatedNumber get elevation => _blink.BlinkSVGFEDistantLightElement.$elevation_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2328,23 +2328,23 @@
 
   @DomName('SVGFEFloodElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEFloodElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEFloodElement.$height_Getter(this);
 
   @DomName('SVGFEFloodElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEFloodElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEFloodElement.$result_Getter(this);
 
   @DomName('SVGFEFloodElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEFloodElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEFloodElement.$width_Getter(this);
 
   @DomName('SVGFEFloodElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEFloodElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEFloodElement.$x_Getter(this);
 
   @DomName('SVGFEFloodElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEFloodElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEFloodElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2508,39 +2508,39 @@
 
   @DomName('SVGFEGaussianBlurElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEGaussianBlurElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEGaussianBlurElement.$in1_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationX')
   @DocsEditable()
-  AnimatedNumber get stdDeviationX => _blink.Native_SVGFEGaussianBlurElement_stdDeviationX_Getter(this);
+  AnimatedNumber get stdDeviationX => _blink.BlinkSVGFEGaussianBlurElement.$stdDeviationX_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.stdDeviationY')
   @DocsEditable()
-  AnimatedNumber get stdDeviationY => _blink.Native_SVGFEGaussianBlurElement_stdDeviationY_Getter(this);
+  AnimatedNumber get stdDeviationY => _blink.BlinkSVGFEGaussianBlurElement.$stdDeviationY_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.setStdDeviation')
   @DocsEditable()
-  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.Native_SVGFEGaussianBlurElement_setStdDeviation_Callback(this, stdDeviationX, stdDeviationY);
+  void setStdDeviation(num stdDeviationX, num stdDeviationY) => _blink.BlinkSVGFEGaussianBlurElement.$setStdDeviation_Callback(this, stdDeviationX, stdDeviationY);
 
   @DomName('SVGFEGaussianBlurElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEGaussianBlurElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEGaussianBlurElement.$height_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEGaussianBlurElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEGaussianBlurElement.$result_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEGaussianBlurElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEGaussianBlurElement.$width_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEGaussianBlurElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEGaussianBlurElement.$x_Getter(this);
 
   @DomName('SVGFEGaussianBlurElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEGaussianBlurElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEGaussianBlurElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2576,31 +2576,31 @@
 
   @DomName('SVGFEImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFEImageElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFEImageElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGFEImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEImageElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEImageElement.$height_Getter(this);
 
   @DomName('SVGFEImageElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEImageElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEImageElement.$result_Getter(this);
 
   @DomName('SVGFEImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEImageElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEImageElement.$width_Getter(this);
 
   @DomName('SVGFEImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEImageElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEImageElement.$x_Getter(this);
 
   @DomName('SVGFEImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEImageElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEImageElement.$y_Getter(this);
 
   @DomName('SVGFEImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGFEImageElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFEImageElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2636,23 +2636,23 @@
 
   @DomName('SVGFEMergeElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEMergeElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMergeElement.$height_Getter(this);
 
   @DomName('SVGFEMergeElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEMergeElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMergeElement.$result_Getter(this);
 
   @DomName('SVGFEMergeElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEMergeElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMergeElement.$width_Getter(this);
 
   @DomName('SVGFEMergeElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEMergeElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMergeElement.$x_Getter(this);
 
   @DomName('SVGFEMergeElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEMergeElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMergeElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2688,7 +2688,7 @@
 
   @DomName('SVGFEMergeNodeElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEMergeNodeElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMergeNodeElement.$in1_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2729,43 +2729,43 @@
 
   @DomName('SVGFEMorphologyElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEMorphologyElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEMorphologyElement.$in1_Getter(this);
 
   @DomName('SVGFEMorphologyElement.operator')
   @DocsEditable()
-  AnimatedEnumeration get operator => _blink.Native_SVGFEMorphologyElement_operator_Getter(this);
+  AnimatedEnumeration get operator => _blink.BlinkSVGFEMorphologyElement.$operator_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusX')
   @DocsEditable()
-  AnimatedNumber get radiusX => _blink.Native_SVGFEMorphologyElement_radiusX_Getter(this);
+  AnimatedNumber get radiusX => _blink.BlinkSVGFEMorphologyElement.$radiusX_Getter(this);
 
   @DomName('SVGFEMorphologyElement.radiusY')
   @DocsEditable()
-  AnimatedNumber get radiusY => _blink.Native_SVGFEMorphologyElement_radiusY_Getter(this);
+  AnimatedNumber get radiusY => _blink.BlinkSVGFEMorphologyElement.$radiusY_Getter(this);
 
   @DomName('SVGFEMorphologyElement.setRadius')
   @DocsEditable()
-  void setRadius(num radiusX, num radiusY) => _blink.Native_SVGFEMorphologyElement_setRadius_Callback(this, radiusX, radiusY);
+  void setRadius(num radiusX, num radiusY) => _blink.BlinkSVGFEMorphologyElement.$setRadius_Callback(this, radiusX, radiusY);
 
   @DomName('SVGFEMorphologyElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEMorphologyElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEMorphologyElement.$height_Getter(this);
 
   @DomName('SVGFEMorphologyElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEMorphologyElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEMorphologyElement.$result_Getter(this);
 
   @DomName('SVGFEMorphologyElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEMorphologyElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEMorphologyElement.$width_Getter(this);
 
   @DomName('SVGFEMorphologyElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEMorphologyElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEMorphologyElement.$x_Getter(this);
 
   @DomName('SVGFEMorphologyElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEMorphologyElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEMorphologyElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2801,35 +2801,35 @@
 
   @DomName('SVGFEOffsetElement.dx')
   @DocsEditable()
-  AnimatedNumber get dx => _blink.Native_SVGFEOffsetElement_dx_Getter(this);
+  AnimatedNumber get dx => _blink.BlinkSVGFEOffsetElement.$dx_Getter(this);
 
   @DomName('SVGFEOffsetElement.dy')
   @DocsEditable()
-  AnimatedNumber get dy => _blink.Native_SVGFEOffsetElement_dy_Getter(this);
+  AnimatedNumber get dy => _blink.BlinkSVGFEOffsetElement.$dy_Getter(this);
 
   @DomName('SVGFEOffsetElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFEOffsetElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFEOffsetElement.$in1_Getter(this);
 
   @DomName('SVGFEOffsetElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFEOffsetElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFEOffsetElement.$height_Getter(this);
 
   @DomName('SVGFEOffsetElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFEOffsetElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFEOffsetElement.$result_Getter(this);
 
   @DomName('SVGFEOffsetElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFEOffsetElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFEOffsetElement.$width_Getter(this);
 
   @DomName('SVGFEOffsetElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFEOffsetElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFEOffsetElement.$x_Getter(this);
 
   @DomName('SVGFEOffsetElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFEOffsetElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFEOffsetElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2865,15 +2865,15 @@
 
   @DomName('SVGFEPointLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.Native_SVGFEPointLightElement_x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFEPointLightElement.$x_Getter(this);
 
   @DomName('SVGFEPointLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.Native_SVGFEPointLightElement_y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFEPointLightElement.$y_Getter(this);
 
   @DomName('SVGFEPointLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.Native_SVGFEPointLightElement_z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFEPointLightElement.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2909,39 +2909,39 @@
 
   @DomName('SVGFESpecularLightingElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFESpecularLightingElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFESpecularLightingElement.$in1_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularConstant')
   @DocsEditable()
-  AnimatedNumber get specularConstant => _blink.Native_SVGFESpecularLightingElement_specularConstant_Getter(this);
+  AnimatedNumber get specularConstant => _blink.BlinkSVGFESpecularLightingElement.$specularConstant_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.Native_SVGFESpecularLightingElement_specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpecularLightingElement.$specularExponent_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.surfaceScale')
   @DocsEditable()
-  AnimatedNumber get surfaceScale => _blink.Native_SVGFESpecularLightingElement_surfaceScale_Getter(this);
+  AnimatedNumber get surfaceScale => _blink.BlinkSVGFESpecularLightingElement.$surfaceScale_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFESpecularLightingElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFESpecularLightingElement.$height_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFESpecularLightingElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFESpecularLightingElement.$result_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFESpecularLightingElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFESpecularLightingElement.$width_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFESpecularLightingElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFESpecularLightingElement.$x_Getter(this);
 
   @DomName('SVGFESpecularLightingElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFESpecularLightingElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFESpecularLightingElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2977,35 +2977,35 @@
 
   @DomName('SVGFESpotLightElement.limitingConeAngle')
   @DocsEditable()
-  AnimatedNumber get limitingConeAngle => _blink.Native_SVGFESpotLightElement_limitingConeAngle_Getter(this);
+  AnimatedNumber get limitingConeAngle => _blink.BlinkSVGFESpotLightElement.$limitingConeAngle_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtX')
   @DocsEditable()
-  AnimatedNumber get pointsAtX => _blink.Native_SVGFESpotLightElement_pointsAtX_Getter(this);
+  AnimatedNumber get pointsAtX => _blink.BlinkSVGFESpotLightElement.$pointsAtX_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtY')
   @DocsEditable()
-  AnimatedNumber get pointsAtY => _blink.Native_SVGFESpotLightElement_pointsAtY_Getter(this);
+  AnimatedNumber get pointsAtY => _blink.BlinkSVGFESpotLightElement.$pointsAtY_Getter(this);
 
   @DomName('SVGFESpotLightElement.pointsAtZ')
   @DocsEditable()
-  AnimatedNumber get pointsAtZ => _blink.Native_SVGFESpotLightElement_pointsAtZ_Getter(this);
+  AnimatedNumber get pointsAtZ => _blink.BlinkSVGFESpotLightElement.$pointsAtZ_Getter(this);
 
   @DomName('SVGFESpotLightElement.specularExponent')
   @DocsEditable()
-  AnimatedNumber get specularExponent => _blink.Native_SVGFESpotLightElement_specularExponent_Getter(this);
+  AnimatedNumber get specularExponent => _blink.BlinkSVGFESpotLightElement.$specularExponent_Getter(this);
 
   @DomName('SVGFESpotLightElement.x')
   @DocsEditable()
-  AnimatedNumber get x => _blink.Native_SVGFESpotLightElement_x_Getter(this);
+  AnimatedNumber get x => _blink.BlinkSVGFESpotLightElement.$x_Getter(this);
 
   @DomName('SVGFESpotLightElement.y')
   @DocsEditable()
-  AnimatedNumber get y => _blink.Native_SVGFESpotLightElement_y_Getter(this);
+  AnimatedNumber get y => _blink.BlinkSVGFESpotLightElement.$y_Getter(this);
 
   @DomName('SVGFESpotLightElement.z')
   @DocsEditable()
-  AnimatedNumber get z => _blink.Native_SVGFESpotLightElement_z_Getter(this);
+  AnimatedNumber get z => _blink.BlinkSVGFESpotLightElement.$z_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3041,27 +3041,27 @@
 
   @DomName('SVGFETileElement.in1')
   @DocsEditable()
-  AnimatedString get in1 => _blink.Native_SVGFETileElement_in1_Getter(this);
+  AnimatedString get in1 => _blink.BlinkSVGFETileElement.$in1_Getter(this);
 
   @DomName('SVGFETileElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFETileElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETileElement.$height_Getter(this);
 
   @DomName('SVGFETileElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFETileElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETileElement.$result_Getter(this);
 
   @DomName('SVGFETileElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFETileElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETileElement.$width_Getter(this);
 
   @DomName('SVGFETileElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFETileElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETileElement.$x_Getter(this);
 
   @DomName('SVGFETileElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFETileElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETileElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3121,47 +3121,47 @@
 
   @DomName('SVGFETurbulenceElement.baseFrequencyX')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyX => _blink.Native_SVGFETurbulenceElement_baseFrequencyX_Getter(this);
+  AnimatedNumber get baseFrequencyX => _blink.BlinkSVGFETurbulenceElement.$baseFrequencyX_Getter(this);
 
   @DomName('SVGFETurbulenceElement.baseFrequencyY')
   @DocsEditable()
-  AnimatedNumber get baseFrequencyY => _blink.Native_SVGFETurbulenceElement_baseFrequencyY_Getter(this);
+  AnimatedNumber get baseFrequencyY => _blink.BlinkSVGFETurbulenceElement.$baseFrequencyY_Getter(this);
 
   @DomName('SVGFETurbulenceElement.numOctaves')
   @DocsEditable()
-  AnimatedInteger get numOctaves => _blink.Native_SVGFETurbulenceElement_numOctaves_Getter(this);
+  AnimatedInteger get numOctaves => _blink.BlinkSVGFETurbulenceElement.$numOctaves_Getter(this);
 
   @DomName('SVGFETurbulenceElement.seed')
   @DocsEditable()
-  AnimatedNumber get seed => _blink.Native_SVGFETurbulenceElement_seed_Getter(this);
+  AnimatedNumber get seed => _blink.BlinkSVGFETurbulenceElement.$seed_Getter(this);
 
   @DomName('SVGFETurbulenceElement.stitchTiles')
   @DocsEditable()
-  AnimatedEnumeration get stitchTiles => _blink.Native_SVGFETurbulenceElement_stitchTiles_Getter(this);
+  AnimatedEnumeration get stitchTiles => _blink.BlinkSVGFETurbulenceElement.$stitchTiles_Getter(this);
 
   @DomName('SVGFETurbulenceElement.type')
   @DocsEditable()
-  AnimatedEnumeration get type => _blink.Native_SVGFETurbulenceElement_type_Getter(this);
+  AnimatedEnumeration get type => _blink.BlinkSVGFETurbulenceElement.$type_Getter(this);
 
   @DomName('SVGFETurbulenceElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFETurbulenceElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFETurbulenceElement.$height_Getter(this);
 
   @DomName('SVGFETurbulenceElement.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFETurbulenceElement_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFETurbulenceElement.$result_Getter(this);
 
   @DomName('SVGFETurbulenceElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFETurbulenceElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFETurbulenceElement.$width_Getter(this);
 
   @DomName('SVGFETurbulenceElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFETurbulenceElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFETurbulenceElement.$x_Getter(this);
 
   @DomName('SVGFETurbulenceElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFETurbulenceElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFETurbulenceElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3197,43 +3197,43 @@
 
   @DomName('SVGFilterElement.filterResX')
   @DocsEditable()
-  AnimatedInteger get filterResX => _blink.Native_SVGFilterElement_filterResX_Getter(this);
+  AnimatedInteger get filterResX => _blink.BlinkSVGFilterElement.$filterResX_Getter(this);
 
   @DomName('SVGFilterElement.filterResY')
   @DocsEditable()
-  AnimatedInteger get filterResY => _blink.Native_SVGFilterElement_filterResY_Getter(this);
+  AnimatedInteger get filterResY => _blink.BlinkSVGFilterElement.$filterResY_Getter(this);
 
   @DomName('SVGFilterElement.filterUnits')
   @DocsEditable()
-  AnimatedEnumeration get filterUnits => _blink.Native_SVGFilterElement_filterUnits_Getter(this);
+  AnimatedEnumeration get filterUnits => _blink.BlinkSVGFilterElement.$filterUnits_Getter(this);
 
   @DomName('SVGFilterElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFilterElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFilterElement.$height_Getter(this);
 
   @DomName('SVGFilterElement.primitiveUnits')
   @DocsEditable()
-  AnimatedEnumeration get primitiveUnits => _blink.Native_SVGFilterElement_primitiveUnits_Getter(this);
+  AnimatedEnumeration get primitiveUnits => _blink.BlinkSVGFilterElement.$primitiveUnits_Getter(this);
 
   @DomName('SVGFilterElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFilterElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFilterElement.$width_Getter(this);
 
   @DomName('SVGFilterElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFilterElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFilterElement.$x_Getter(this);
 
   @DomName('SVGFilterElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFilterElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFilterElement.$y_Getter(this);
 
   @DomName('SVGFilterElement.setFilterRes')
   @DocsEditable()
-  void setFilterRes(int filterResX, int filterResY) => _blink.Native_SVGFilterElement_setFilterRes_Callback(this, filterResX, filterResY);
+  void setFilterRes(int filterResX, int filterResY) => _blink.BlinkSVGFilterElement.$setFilterRes_Callback(this, filterResX, filterResY);
 
   @DomName('SVGFilterElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGFilterElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGFilterElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3252,23 +3252,23 @@
 
   @DomName('SVGFilterPrimitiveStandardAttributes.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGFilterPrimitiveStandardAttributes_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$height_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.result')
   @DocsEditable()
-  AnimatedString get result => _blink.Native_SVGFilterPrimitiveStandardAttributes_result_Getter(this);
+  AnimatedString get result => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$result_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGFilterPrimitiveStandardAttributes_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$width_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGFilterPrimitiveStandardAttributes_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$x_Getter(this);
 
   @DomName('SVGFilterPrimitiveStandardAttributes.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGFilterPrimitiveStandardAttributes_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGFilterPrimitiveStandardAttributes.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3287,11 +3287,11 @@
 
   @DomName('SVGFitToViewBox.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGFitToViewBox_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGFitToViewBox.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGFitToViewBox.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGFitToViewBox_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGFitToViewBox.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3326,19 +3326,19 @@
 
   @DomName('SVGForeignObjectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGForeignObjectElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGForeignObjectElement.$height_Getter(this);
 
   @DomName('SVGForeignObjectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGForeignObjectElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGForeignObjectElement.$width_Getter(this);
 
   @DomName('SVGForeignObjectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGForeignObjectElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGForeignObjectElement.$x_Getter(this);
 
   @DomName('SVGForeignObjectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGForeignObjectElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGForeignObjectElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3389,12 +3389,12 @@
   @DomName('SVGGeometryElement.isPointInFill')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInFill(Point point) => _blink.Native_SVGGeometryElement_isPointInFill_Callback(this, point);
+  bool isPointInFill(Point point) => _blink.BlinkSVGGeometryElement.$isPointInFill_Callback(this, point);
 
   @DomName('SVGGeometryElement.isPointInStroke')
   @DocsEditable()
   @Experimental() // untriaged
-  bool isPointInStroke(Point point) => _blink.Native_SVGGeometryElement_isPointInStroke_Callback(this, point);
+  bool isPointInStroke(Point point) => _blink.BlinkSVGGeometryElement.$isPointInStroke_Callback(this, point);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3420,57 +3420,57 @@
   @DomName('SVGGraphicsElement.farthestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get farthestViewportElement => _blink.Native_SVGGraphicsElement_farthestViewportElement_Getter(this);
+  SvgElement get farthestViewportElement => _blink.BlinkSVGGraphicsElement.$farthestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.nearestViewportElement')
   @DocsEditable()
   @Experimental() // untriaged
-  SvgElement get nearestViewportElement => _blink.Native_SVGGraphicsElement_nearestViewportElement_Getter(this);
+  SvgElement get nearestViewportElement => _blink.BlinkSVGGraphicsElement.$nearestViewportElement_Getter(this);
 
   @DomName('SVGGraphicsElement.transform')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedTransformList get transform => _blink.Native_SVGGraphicsElement_transform_Getter(this);
+  AnimatedTransformList get transform => _blink.BlinkSVGGraphicsElement.$transform_Getter(this);
 
   @DomName('SVGGraphicsElement.getBBox')
   @DocsEditable()
   @Experimental() // untriaged
-  Rect getBBox() => _blink.Native_SVGGraphicsElement_getBBox_Callback(this);
+  Rect getBBox() => _blink.BlinkSVGGraphicsElement.$getBBox_Callback(this);
 
   @DomName('SVGGraphicsElement.getCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getCtm() => _blink.Native_SVGGraphicsElement_getCTM_Callback(this);
+  Matrix getCtm() => _blink.BlinkSVGGraphicsElement.$getCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getScreenCTM')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getScreenCtm() => _blink.Native_SVGGraphicsElement_getScreenCTM_Callback(this);
+  Matrix getScreenCtm() => _blink.BlinkSVGGraphicsElement.$getScreenCTM_Callback(this);
 
   @DomName('SVGGraphicsElement.getTransformToElement')
   @DocsEditable()
   @Experimental() // untriaged
-  Matrix getTransformToElement(SvgElement element) => _blink.Native_SVGGraphicsElement_getTransformToElement_Callback(this, element);
+  Matrix getTransformToElement(SvgElement element) => _blink.BlinkSVGGraphicsElement.$getTransformToElement_Callback(this, element);
 
   @DomName('SVGGraphicsElement.requiredExtensions')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredExtensions => _blink.Native_SVGGraphicsElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGGraphicsElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGGraphicsElement.requiredFeatures')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get requiredFeatures => _blink.Native_SVGGraphicsElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGGraphicsElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGGraphicsElement.systemLanguage')
   @DocsEditable()
   @Experimental() // untriaged
-  StringList get systemLanguage => _blink.Native_SVGGraphicsElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGGraphicsElement.$systemLanguage_Getter(this);
 
   @DomName('SVGGraphicsElement.hasExtension')
   @DocsEditable()
   @Experimental() // untriaged
-  bool hasExtension(String extension) => _blink.Native_SVGGraphicsElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGGraphicsElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3499,27 +3499,27 @@
 
   @DomName('SVGImageElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGImageElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGImageElement.$height_Getter(this);
 
   @DomName('SVGImageElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGImageElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGImageElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGImageElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGImageElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGImageElement.$width_Getter(this);
 
   @DomName('SVGImageElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGImageElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGImageElement.$x_Getter(this);
 
   @DomName('SVGImageElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGImageElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGImageElement.$y_Getter(this);
 
   @DomName('SVGImageElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGImageElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGImageElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3582,39 +3582,39 @@
 
   @DomName('SVGLength.unitType')
   @DocsEditable()
-  int get unitType => _blink.Native_SVGLength_unitType_Getter(this);
+  int get unitType => _blink.BlinkSVGLength.$unitType_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGLength_value_Getter(this);
+  num get value => _blink.BlinkSVGLength.$value_Getter(this);
 
   @DomName('SVGLength.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGLength_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGLength.$value_Setter(this, value);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  String get valueAsString => _blink.Native_SVGLength_valueAsString_Getter(this);
+  String get valueAsString => _blink.BlinkSVGLength.$valueAsString_Getter(this);
 
   @DomName('SVGLength.valueAsString')
   @DocsEditable()
-  void set valueAsString(String value) => _blink.Native_SVGLength_valueAsString_Setter(this, value);
+  void set valueAsString(String value) => _blink.BlinkSVGLength.$valueAsString_Setter(this, value);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  num get valueInSpecifiedUnits => _blink.Native_SVGLength_valueInSpecifiedUnits_Getter(this);
+  num get valueInSpecifiedUnits => _blink.BlinkSVGLength.$valueInSpecifiedUnits_Getter(this);
 
   @DomName('SVGLength.valueInSpecifiedUnits')
   @DocsEditable()
-  void set valueInSpecifiedUnits(num value) => _blink.Native_SVGLength_valueInSpecifiedUnits_Setter(this, value);
+  void set valueInSpecifiedUnits(num value) => _blink.BlinkSVGLength.$valueInSpecifiedUnits_Setter(this, value);
 
   @DomName('SVGLength.convertToSpecifiedUnits')
   @DocsEditable()
-  void convertToSpecifiedUnits(int unitType) => _blink.Native_SVGLength_convertToSpecifiedUnits_Callback(this, unitType);
+  void convertToSpecifiedUnits(int unitType) => _blink.BlinkSVGLength.$convertToSpecifiedUnits_Callback(this, unitType);
 
   @DomName('SVGLength.newValueSpecifiedUnits')
   @DocsEditable()
-  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.Native_SVGLength_newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
+  void newValueSpecifiedUnits(int unitType, num valueInSpecifiedUnits) => _blink.BlinkSVGLength.$newValueSpecifiedUnits_Callback(this, unitType, valueInSpecifiedUnits);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3633,7 +3633,7 @@
 
   @DomName('SVGLengthList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGLengthList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGLengthList.$numberOfItems_Getter(this);
 
   Length operator[](int index) {
     if (index < 0 || index >= length)
@@ -3683,31 +3683,31 @@
 
   @DomName('SVGLengthList.appendItem')
   @DocsEditable()
-  Length appendItem(Length item) => _blink.Native_SVGLengthList_appendItem_Callback(this, item);
+  Length appendItem(Length item) => _blink.BlinkSVGLengthList.$appendItem_Callback(this, item);
 
   @DomName('SVGLengthList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGLengthList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGLengthList.$clear_Callback(this);
 
   @DomName('SVGLengthList.getItem')
   @DocsEditable()
-  Length getItem(int index) => _blink.Native_SVGLengthList_getItem_Callback(this, index);
+  Length getItem(int index) => _blink.BlinkSVGLengthList.$getItem_Callback(this, index);
 
   @DomName('SVGLengthList.initialize')
   @DocsEditable()
-  Length initialize(Length item) => _blink.Native_SVGLengthList_initialize_Callback(this, item);
+  Length initialize(Length item) => _blink.BlinkSVGLengthList.$initialize_Callback(this, item);
 
   @DomName('SVGLengthList.insertItemBefore')
   @DocsEditable()
-  Length insertItemBefore(Length item, int index) => _blink.Native_SVGLengthList_insertItemBefore_Callback(this, item, index);
+  Length insertItemBefore(Length item, int index) => _blink.BlinkSVGLengthList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGLengthList.removeItem')
   @DocsEditable()
-  Length removeItem(int index) => _blink.Native_SVGLengthList_removeItem_Callback(this, index);
+  Length removeItem(int index) => _blink.BlinkSVGLengthList.$removeItem_Callback(this, index);
 
   @DomName('SVGLengthList.replaceItem')
   @DocsEditable()
-  Length replaceItem(Length item, int index) => _blink.Native_SVGLengthList_replaceItem_Callback(this, item, index);
+  Length replaceItem(Length item, int index) => _blink.BlinkSVGLengthList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3736,19 +3736,19 @@
 
   @DomName('SVGLineElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.Native_SVGLineElement_x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLineElement.$x1_Getter(this);
 
   @DomName('SVGLineElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.Native_SVGLineElement_x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLineElement.$x2_Getter(this);
 
   @DomName('SVGLineElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.Native_SVGLineElement_y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLineElement.$y1_Getter(this);
 
   @DomName('SVGLineElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.Native_SVGLineElement_y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLineElement.$y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3777,19 +3777,19 @@
 
   @DomName('SVGLinearGradientElement.x1')
   @DocsEditable()
-  AnimatedLength get x1 => _blink.Native_SVGLinearGradientElement_x1_Getter(this);
+  AnimatedLength get x1 => _blink.BlinkSVGLinearGradientElement.$x1_Getter(this);
 
   @DomName('SVGLinearGradientElement.x2')
   @DocsEditable()
-  AnimatedLength get x2 => _blink.Native_SVGLinearGradientElement_x2_Getter(this);
+  AnimatedLength get x2 => _blink.BlinkSVGLinearGradientElement.$x2_Getter(this);
 
   @DomName('SVGLinearGradientElement.y1')
   @DocsEditable()
-  AnimatedLength get y1 => _blink.Native_SVGLinearGradientElement_y1_Getter(this);
+  AnimatedLength get y1 => _blink.BlinkSVGLinearGradientElement.$y1_Getter(this);
 
   @DomName('SVGLinearGradientElement.y2')
   @DocsEditable()
-  AnimatedLength get y2 => _blink.Native_SVGLinearGradientElement_y2_Getter(this);
+  AnimatedLength get y2 => _blink.BlinkSVGLinearGradientElement.$y2_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3842,47 +3842,47 @@
 
   @DomName('SVGMarkerElement.markerHeight')
   @DocsEditable()
-  AnimatedLength get markerHeight => _blink.Native_SVGMarkerElement_markerHeight_Getter(this);
+  AnimatedLength get markerHeight => _blink.BlinkSVGMarkerElement.$markerHeight_Getter(this);
 
   @DomName('SVGMarkerElement.markerUnits')
   @DocsEditable()
-  AnimatedEnumeration get markerUnits => _blink.Native_SVGMarkerElement_markerUnits_Getter(this);
+  AnimatedEnumeration get markerUnits => _blink.BlinkSVGMarkerElement.$markerUnits_Getter(this);
 
   @DomName('SVGMarkerElement.markerWidth')
   @DocsEditable()
-  AnimatedLength get markerWidth => _blink.Native_SVGMarkerElement_markerWidth_Getter(this);
+  AnimatedLength get markerWidth => _blink.BlinkSVGMarkerElement.$markerWidth_Getter(this);
 
   @DomName('SVGMarkerElement.orientAngle')
   @DocsEditable()
-  AnimatedAngle get orientAngle => _blink.Native_SVGMarkerElement_orientAngle_Getter(this);
+  AnimatedAngle get orientAngle => _blink.BlinkSVGMarkerElement.$orientAngle_Getter(this);
 
   @DomName('SVGMarkerElement.orientType')
   @DocsEditable()
-  AnimatedEnumeration get orientType => _blink.Native_SVGMarkerElement_orientType_Getter(this);
+  AnimatedEnumeration get orientType => _blink.BlinkSVGMarkerElement.$orientType_Getter(this);
 
   @DomName('SVGMarkerElement.refX')
   @DocsEditable()
-  AnimatedLength get refX => _blink.Native_SVGMarkerElement_refX_Getter(this);
+  AnimatedLength get refX => _blink.BlinkSVGMarkerElement.$refX_Getter(this);
 
   @DomName('SVGMarkerElement.refY')
   @DocsEditable()
-  AnimatedLength get refY => _blink.Native_SVGMarkerElement_refY_Getter(this);
+  AnimatedLength get refY => _blink.BlinkSVGMarkerElement.$refY_Getter(this);
 
   @DomName('SVGMarkerElement.setOrientToAngle')
   @DocsEditable()
-  void setOrientToAngle(Angle angle) => _blink.Native_SVGMarkerElement_setOrientToAngle_Callback(this, angle);
+  void setOrientToAngle(Angle angle) => _blink.BlinkSVGMarkerElement.$setOrientToAngle_Callback(this, angle);
 
   @DomName('SVGMarkerElement.setOrientToAuto')
   @DocsEditable()
-  void setOrientToAuto() => _blink.Native_SVGMarkerElement_setOrientToAuto_Callback(this);
+  void setOrientToAuto() => _blink.BlinkSVGMarkerElement.$setOrientToAuto_Callback(this);
 
   @DomName('SVGMarkerElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGMarkerElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGMarkerElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGMarkerElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGMarkerElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGMarkerElement.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3911,43 +3911,43 @@
 
   @DomName('SVGMaskElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGMaskElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGMaskElement.$height_Getter(this);
 
   @DomName('SVGMaskElement.maskContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskContentUnits => _blink.Native_SVGMaskElement_maskContentUnits_Getter(this);
+  AnimatedEnumeration get maskContentUnits => _blink.BlinkSVGMaskElement.$maskContentUnits_Getter(this);
 
   @DomName('SVGMaskElement.maskUnits')
   @DocsEditable()
-  AnimatedEnumeration get maskUnits => _blink.Native_SVGMaskElement_maskUnits_Getter(this);
+  AnimatedEnumeration get maskUnits => _blink.BlinkSVGMaskElement.$maskUnits_Getter(this);
 
   @DomName('SVGMaskElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGMaskElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGMaskElement.$width_Getter(this);
 
   @DomName('SVGMaskElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGMaskElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGMaskElement.$x_Getter(this);
 
   @DomName('SVGMaskElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGMaskElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGMaskElement.$y_Getter(this);
 
   @DomName('SVGMaskElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGMaskElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGMaskElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGMaskElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGMaskElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGMaskElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGMaskElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGMaskElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGMaskElement.$systemLanguage_Getter(this);
 
   @DomName('SVGMaskElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGMaskElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGMaskElement.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -3966,95 +3966,95 @@
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  num get a => _blink.Native_SVGMatrix_a_Getter(this);
+  num get a => _blink.BlinkSVGMatrix.$a_Getter(this);
 
   @DomName('SVGMatrix.a')
   @DocsEditable()
-  void set a(num value) => _blink.Native_SVGMatrix_a_Setter(this, value);
+  void set a(num value) => _blink.BlinkSVGMatrix.$a_Setter(this, value);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  num get b => _blink.Native_SVGMatrix_b_Getter(this);
+  num get b => _blink.BlinkSVGMatrix.$b_Getter(this);
 
   @DomName('SVGMatrix.b')
   @DocsEditable()
-  void set b(num value) => _blink.Native_SVGMatrix_b_Setter(this, value);
+  void set b(num value) => _blink.BlinkSVGMatrix.$b_Setter(this, value);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  num get c => _blink.Native_SVGMatrix_c_Getter(this);
+  num get c => _blink.BlinkSVGMatrix.$c_Getter(this);
 
   @DomName('SVGMatrix.c')
   @DocsEditable()
-  void set c(num value) => _blink.Native_SVGMatrix_c_Setter(this, value);
+  void set c(num value) => _blink.BlinkSVGMatrix.$c_Setter(this, value);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  num get d => _blink.Native_SVGMatrix_d_Getter(this);
+  num get d => _blink.BlinkSVGMatrix.$d_Getter(this);
 
   @DomName('SVGMatrix.d')
   @DocsEditable()
-  void set d(num value) => _blink.Native_SVGMatrix_d_Setter(this, value);
+  void set d(num value) => _blink.BlinkSVGMatrix.$d_Setter(this, value);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  num get e => _blink.Native_SVGMatrix_e_Getter(this);
+  num get e => _blink.BlinkSVGMatrix.$e_Getter(this);
 
   @DomName('SVGMatrix.e')
   @DocsEditable()
-  void set e(num value) => _blink.Native_SVGMatrix_e_Setter(this, value);
+  void set e(num value) => _blink.BlinkSVGMatrix.$e_Setter(this, value);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  num get f => _blink.Native_SVGMatrix_f_Getter(this);
+  num get f => _blink.BlinkSVGMatrix.$f_Getter(this);
 
   @DomName('SVGMatrix.f')
   @DocsEditable()
-  void set f(num value) => _blink.Native_SVGMatrix_f_Setter(this, value);
+  void set f(num value) => _blink.BlinkSVGMatrix.$f_Setter(this, value);
 
   @DomName('SVGMatrix.flipX')
   @DocsEditable()
-  Matrix flipX() => _blink.Native_SVGMatrix_flipX_Callback(this);
+  Matrix flipX() => _blink.BlinkSVGMatrix.$flipX_Callback(this);
 
   @DomName('SVGMatrix.flipY')
   @DocsEditable()
-  Matrix flipY() => _blink.Native_SVGMatrix_flipY_Callback(this);
+  Matrix flipY() => _blink.BlinkSVGMatrix.$flipY_Callback(this);
 
   @DomName('SVGMatrix.inverse')
   @DocsEditable()
-  Matrix inverse() => _blink.Native_SVGMatrix_inverse_Callback(this);
+  Matrix inverse() => _blink.BlinkSVGMatrix.$inverse_Callback(this);
 
   @DomName('SVGMatrix.multiply')
   @DocsEditable()
-  Matrix multiply(Matrix secondMatrix) => _blink.Native_SVGMatrix_multiply_Callback(this, secondMatrix);
+  Matrix multiply(Matrix secondMatrix) => _blink.BlinkSVGMatrix.$multiply_Callback(this, secondMatrix);
 
   @DomName('SVGMatrix.rotate')
   @DocsEditable()
-  Matrix rotate(num angle) => _blink.Native_SVGMatrix_rotate_Callback(this, angle);
+  Matrix rotate(num angle) => _blink.BlinkSVGMatrix.$rotate_Callback(this, angle);
 
   @DomName('SVGMatrix.rotateFromVector')
   @DocsEditable()
-  Matrix rotateFromVector(num x, num y) => _blink.Native_SVGMatrix_rotateFromVector_Callback(this, x, y);
+  Matrix rotateFromVector(num x, num y) => _blink.BlinkSVGMatrix.$rotateFromVector_Callback(this, x, y);
 
   @DomName('SVGMatrix.scale')
   @DocsEditable()
-  Matrix scale(num scaleFactor) => _blink.Native_SVGMatrix_scale_Callback(this, scaleFactor);
+  Matrix scale(num scaleFactor) => _blink.BlinkSVGMatrix.$scale_Callback(this, scaleFactor);
 
   @DomName('SVGMatrix.scaleNonUniform')
   @DocsEditable()
-  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.Native_SVGMatrix_scaleNonUniform_Callback(this, scaleFactorX, scaleFactorY);
+  Matrix scaleNonUniform(num scaleFactorX, num scaleFactorY) => _blink.BlinkSVGMatrix.$scaleNonUniform_Callback(this, scaleFactorX, scaleFactorY);
 
   @DomName('SVGMatrix.skewX')
   @DocsEditable()
-  Matrix skewX(num angle) => _blink.Native_SVGMatrix_skewX_Callback(this, angle);
+  Matrix skewX(num angle) => _blink.BlinkSVGMatrix.$skewX_Callback(this, angle);
 
   @DomName('SVGMatrix.skewY')
   @DocsEditable()
-  Matrix skewY(num angle) => _blink.Native_SVGMatrix_skewY_Callback(this, angle);
+  Matrix skewY(num angle) => _blink.BlinkSVGMatrix.$skewY_Callback(this, angle);
 
   @DomName('SVGMatrix.translate')
   @DocsEditable()
-  Matrix translate(num x, num y) => _blink.Native_SVGMatrix_translate_Callback(this, x, y);
+  Matrix translate(num x, num y) => _blink.BlinkSVGMatrix.$translate_Callback(this, x, y);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4094,11 +4094,11 @@
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  num get value => _blink.Native_SVGNumber_value_Getter(this);
+  num get value => _blink.BlinkSVGNumber.$value_Getter(this);
 
   @DomName('SVGNumber.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_SVGNumber_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkSVGNumber.$value_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4117,7 +4117,7 @@
 
   @DomName('SVGNumberList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGNumberList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGNumberList.$numberOfItems_Getter(this);
 
   Number operator[](int index) {
     if (index < 0 || index >= length)
@@ -4167,31 +4167,31 @@
 
   @DomName('SVGNumberList.appendItem')
   @DocsEditable()
-  Number appendItem(Number item) => _blink.Native_SVGNumberList_appendItem_Callback(this, item);
+  Number appendItem(Number item) => _blink.BlinkSVGNumberList.$appendItem_Callback(this, item);
 
   @DomName('SVGNumberList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGNumberList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGNumberList.$clear_Callback(this);
 
   @DomName('SVGNumberList.getItem')
   @DocsEditable()
-  Number getItem(int index) => _blink.Native_SVGNumberList_getItem_Callback(this, index);
+  Number getItem(int index) => _blink.BlinkSVGNumberList.$getItem_Callback(this, index);
 
   @DomName('SVGNumberList.initialize')
   @DocsEditable()
-  Number initialize(Number item) => _blink.Native_SVGNumberList_initialize_Callback(this, item);
+  Number initialize(Number item) => _blink.BlinkSVGNumberList.$initialize_Callback(this, item);
 
   @DomName('SVGNumberList.insertItemBefore')
   @DocsEditable()
-  Number insertItemBefore(Number item, int index) => _blink.Native_SVGNumberList_insertItemBefore_Callback(this, item, index);
+  Number insertItemBefore(Number item, int index) => _blink.BlinkSVGNumberList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGNumberList.removeItem')
   @DocsEditable()
-  Number removeItem(int index) => _blink.Native_SVGNumberList_removeItem_Callback(this, index);
+  Number removeItem(int index) => _blink.BlinkSVGNumberList.$removeItem_Callback(this, index);
 
   @DomName('SVGNumberList.replaceItem')
   @DocsEditable()
-  Number replaceItem(Number item, int index) => _blink.Native_SVGNumberList_replaceItem_Callback(this, item, index);
+  Number replaceItem(Number item, int index) => _blink.BlinkSVGNumberList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4220,111 +4220,111 @@
 
   @DomName('SVGPathElement.animatedNormalizedPathSegList')
   @DocsEditable()
-  PathSegList get animatedNormalizedPathSegList => _blink.Native_SVGPathElement_animatedNormalizedPathSegList_Getter(this);
+  PathSegList get animatedNormalizedPathSegList => _blink.BlinkSVGPathElement.$animatedNormalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.animatedPathSegList')
   @DocsEditable()
-  PathSegList get animatedPathSegList => _blink.Native_SVGPathElement_animatedPathSegList_Getter(this);
+  PathSegList get animatedPathSegList => _blink.BlinkSVGPathElement.$animatedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.normalizedPathSegList')
   @DocsEditable()
-  PathSegList get normalizedPathSegList => _blink.Native_SVGPathElement_normalizedPathSegList_Getter(this);
+  PathSegList get normalizedPathSegList => _blink.BlinkSVGPathElement.$normalizedPathSegList_Getter(this);
 
   @DomName('SVGPathElement.pathLength')
   @DocsEditable()
-  AnimatedNumber get pathLength => _blink.Native_SVGPathElement_pathLength_Getter(this);
+  AnimatedNumber get pathLength => _blink.BlinkSVGPathElement.$pathLength_Getter(this);
 
   @DomName('SVGPathElement.pathSegList')
   @DocsEditable()
-  PathSegList get pathSegList => _blink.Native_SVGPathElement_pathSegList_Getter(this);
+  PathSegList get pathSegList => _blink.BlinkSVGPathElement.$pathSegList_Getter(this);
 
   @DomName('SVGPathElement.createSVGPathSegArcAbs')
   @DocsEditable()
-  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcAbs_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcAbs createSvgPathSegArcAbs(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.$createSVGPathSegArcAbs_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegArcRel')
   @DocsEditable()
-  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.Native_SVGPathElement_createSVGPathSegArcRel_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
+  PathSegArcRel createSvgPathSegArcRel(num x, num y, num r1, num r2, num angle, bool largeArcFlag, bool sweepFlag) => _blink.BlinkSVGPathElement.$createSVGPathSegArcRel_Callback(this, x, y, r1, r2, angle, largeArcFlag, sweepFlag);
 
   @DomName('SVGPathElement.createSVGPathSegClosePath')
   @DocsEditable()
-  PathSegClosePath createSvgPathSegClosePath() => _blink.Native_SVGPathElement_createSVGPathSegClosePath_Callback(this);
+  PathSegClosePath createSvgPathSegClosePath() => _blink.BlinkSVGPathElement.$createSVGPathSegClosePath_Callback(this);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicAbs')
   @DocsEditable()
-  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicAbs_Callback(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicAbs createSvgPathSegCurvetoCubicAbs(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicAbs_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicRel')
   @DocsEditable()
-  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicRel_Callback(this, x, y, x1, y1, x2, y2);
+  PathSegCurvetoCubicRel createSvgPathSegCurvetoCubicRel(num x, num y, num x1, num y1, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicRel_Callback(this, x, y, x1, y1, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothAbs_Callback(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothAbs createSvgPathSegCurvetoCubicSmoothAbs(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicSmoothAbs_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoCubicSmoothRel')
   @DocsEditable()
-  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoCubicSmoothRel_Callback(this, x, y, x2, y2);
+  PathSegCurvetoCubicSmoothRel createSvgPathSegCurvetoCubicSmoothRel(num x, num y, num x2, num y2) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoCubicSmoothRel_Callback(this, x, y, x2, y2);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticAbs_Callback(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticAbs createSvgPathSegCurvetoQuadraticAbs(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticAbs_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticRel_Callback(this, x, y, x1, y1);
+  PathSegCurvetoQuadraticRel createSvgPathSegCurvetoQuadraticRel(num x, num y, num x1, num y1) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticRel_Callback(this, x, y, x1, y1);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothAbs')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(this, x, y);
+  PathSegCurvetoQuadraticSmoothAbs createSvgPathSegCurvetoQuadraticSmoothAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticSmoothAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegCurvetoQuadraticSmoothRel')
   @DocsEditable()
-  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegCurvetoQuadraticSmoothRel_Callback(this, x, y);
+  PathSegCurvetoQuadraticSmoothRel createSvgPathSegCurvetoQuadraticSmoothRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegCurvetoQuadraticSmoothRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoAbs')
   @DocsEditable()
-  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoAbs_Callback(this, x, y);
+  PathSegLinetoAbs createSvgPathSegLinetoAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalAbs')
   @DocsEditable()
-  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalAbs_Callback(this, x);
+  PathSegLinetoHorizontalAbs createSvgPathSegLinetoHorizontalAbs(num x) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoHorizontalAbs_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoHorizontalRel')
   @DocsEditable()
-  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.Native_SVGPathElement_createSVGPathSegLinetoHorizontalRel_Callback(this, x);
+  PathSegLinetoHorizontalRel createSvgPathSegLinetoHorizontalRel(num x) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoHorizontalRel_Callback(this, x);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoRel')
   @DocsEditable()
-  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoRel_Callback(this, x, y);
+  PathSegLinetoRel createSvgPathSegLinetoRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalAbs')
   @DocsEditable()
-  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalAbs_Callback(this, y);
+  PathSegLinetoVerticalAbs createSvgPathSegLinetoVerticalAbs(num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoVerticalAbs_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegLinetoVerticalRel')
   @DocsEditable()
-  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.Native_SVGPathElement_createSVGPathSegLinetoVerticalRel_Callback(this, y);
+  PathSegLinetoVerticalRel createSvgPathSegLinetoVerticalRel(num y) => _blink.BlinkSVGPathElement.$createSVGPathSegLinetoVerticalRel_Callback(this, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoAbs')
   @DocsEditable()
-  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoAbs_Callback(this, x, y);
+  PathSegMovetoAbs createSvgPathSegMovetoAbs(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegMovetoAbs_Callback(this, x, y);
 
   @DomName('SVGPathElement.createSVGPathSegMovetoRel')
   @DocsEditable()
-  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.Native_SVGPathElement_createSVGPathSegMovetoRel_Callback(this, x, y);
+  PathSegMovetoRel createSvgPathSegMovetoRel(num x, num y) => _blink.BlinkSVGPathElement.$createSVGPathSegMovetoRel_Callback(this, x, y);
 
   @DomName('SVGPathElement.getPathSegAtLength')
   @DocsEditable()
-  int getPathSegAtLength(num distance) => _blink.Native_SVGPathElement_getPathSegAtLength_Callback(this, distance);
+  int getPathSegAtLength(num distance) => _blink.BlinkSVGPathElement.$getPathSegAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getPointAtLength')
   @DocsEditable()
-  Point getPointAtLength(num distance) => _blink.Native_SVGPathElement_getPointAtLength_Callback(this, distance);
+  Point getPointAtLength(num distance) => _blink.BlinkSVGPathElement.$getPointAtLength_Callback(this, distance);
 
   @DomName('SVGPathElement.getTotalLength')
   @DocsEditable()
-  double getTotalLength() => _blink.Native_SVGPathElement_getTotalLength_Callback(this);
+  double getTotalLength() => _blink.BlinkSVGPathElement.$getTotalLength_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4423,11 +4423,11 @@
 
   @DomName('SVGPathSeg.pathSegType')
   @DocsEditable()
-  int get pathSegType => _blink.Native_SVGPathSeg_pathSegType_Getter(this);
+  int get pathSegType => _blink.BlinkSVGPathSeg.$pathSegType_Getter(this);
 
   @DomName('SVGPathSeg.pathSegTypeAsLetter')
   @DocsEditable()
-  String get pathSegTypeAsLetter => _blink.Native_SVGPathSeg_pathSegTypeAsLetter_Getter(this);
+  String get pathSegTypeAsLetter => _blink.BlinkSVGPathSeg.$pathSegTypeAsLetter_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4446,59 +4446,59 @@
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  num get angle => _blink.Native_SVGPathSegArcAbs_angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcAbs.$angle_Getter(this);
 
   @DomName('SVGPathSegArcAbs.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.Native_SVGPathSegArcAbs_angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcAbs.$angle_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcAbs.$largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcAbs_largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.$largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  num get r1 => _blink.Native_SVGPathSegArcAbs_r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcAbs.$r1_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.Native_SVGPathSegArcAbs_r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcAbs.$r1_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  num get r2 => _blink.Native_SVGPathSegArcAbs_r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcAbs.$r2_Getter(this);
 
   @DomName('SVGPathSegArcAbs.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.Native_SVGPathSegArcAbs_r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcAbs.$r2_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.Native_SVGPathSegArcAbs_sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcAbs.$sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcAbs.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcAbs_sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcAbs.$sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegArcAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcAbs.$x_Getter(this);
 
   @DomName('SVGPathSegArcAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegArcAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegArcAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcAbs.$y_Getter(this);
 
   @DomName('SVGPathSegArcAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegArcAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4517,59 +4517,59 @@
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  num get angle => _blink.Native_SVGPathSegArcRel_angle_Getter(this);
+  num get angle => _blink.BlinkSVGPathSegArcRel.$angle_Getter(this);
 
   @DomName('SVGPathSegArcRel.angle')
   @DocsEditable()
-  void set angle(num value) => _blink.Native_SVGPathSegArcRel_angle_Setter(this, value);
+  void set angle(num value) => _blink.BlinkSVGPathSegArcRel.$angle_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  bool get largeArcFlag => _blink.Native_SVGPathSegArcRel_largeArcFlag_Getter(this);
+  bool get largeArcFlag => _blink.BlinkSVGPathSegArcRel.$largeArcFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.largeArcFlag')
   @DocsEditable()
-  void set largeArcFlag(bool value) => _blink.Native_SVGPathSegArcRel_largeArcFlag_Setter(this, value);
+  void set largeArcFlag(bool value) => _blink.BlinkSVGPathSegArcRel.$largeArcFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  num get r1 => _blink.Native_SVGPathSegArcRel_r1_Getter(this);
+  num get r1 => _blink.BlinkSVGPathSegArcRel.$r1_Getter(this);
 
   @DomName('SVGPathSegArcRel.r1')
   @DocsEditable()
-  void set r1(num value) => _blink.Native_SVGPathSegArcRel_r1_Setter(this, value);
+  void set r1(num value) => _blink.BlinkSVGPathSegArcRel.$r1_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  num get r2 => _blink.Native_SVGPathSegArcRel_r2_Getter(this);
+  num get r2 => _blink.BlinkSVGPathSegArcRel.$r2_Getter(this);
 
   @DomName('SVGPathSegArcRel.r2')
   @DocsEditable()
-  void set r2(num value) => _blink.Native_SVGPathSegArcRel_r2_Setter(this, value);
+  void set r2(num value) => _blink.BlinkSVGPathSegArcRel.$r2_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  bool get sweepFlag => _blink.Native_SVGPathSegArcRel_sweepFlag_Getter(this);
+  bool get sweepFlag => _blink.BlinkSVGPathSegArcRel.$sweepFlag_Getter(this);
 
   @DomName('SVGPathSegArcRel.sweepFlag')
   @DocsEditable()
-  void set sweepFlag(bool value) => _blink.Native_SVGPathSegArcRel_sweepFlag_Setter(this, value);
+  void set sweepFlag(bool value) => _blink.BlinkSVGPathSegArcRel.$sweepFlag_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegArcRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegArcRel.$x_Getter(this);
 
   @DomName('SVGPathSegArcRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegArcRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegArcRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegArcRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegArcRel.$y_Getter(this);
 
   @DomName('SVGPathSegArcRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegArcRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegArcRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4603,51 +4603,51 @@
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicAbs_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicAbs.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4666,51 +4666,51 @@
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoCubicRel.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicRel.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoCubicRel.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicRel.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicRel_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicRel.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4729,35 +4729,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothAbs.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothAbs_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothAbs.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4776,35 +4776,35 @@
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  num get x2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Getter(this);
+  num get x2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.x2')
   @DocsEditable()
-  void set x2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_x2_Setter(this, value);
+  void set x2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$x2_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  num get y2 => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Getter(this);
+  num get y2 => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y2_Getter(this);
 
   @DomName('SVGPathSegCurvetoCubicSmoothRel.y2')
   @DocsEditable()
-  void set y2(num value) => _blink.Native_SVGPathSegCurvetoCubicSmoothRel_y2_Setter(this, value);
+  void set y2(num value) => _blink.BlinkSVGPathSegCurvetoCubicSmoothRel.$y2_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4823,35 +4823,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticAbs.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticAbs_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticAbs.$y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4870,35 +4870,35 @@
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  num get x1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Getter(this);
+  num get x1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.x1')
   @DocsEditable()
-  void set x1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_x1_Setter(this, value);
+  void set x1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$x1_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  num get y1 => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Getter(this);
+  num get y1 => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y1_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticRel.y1')
   @DocsEditable()
-  void set y1(num value) => _blink.Native_SVGPathSegCurvetoQuadraticRel_y1_Setter(this, value);
+  void set y1(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticRel.$y1_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4917,19 +4917,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4948,19 +4948,19 @@
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$x_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$y_Getter(this);
 
   @DomName('SVGPathSegCurvetoQuadraticSmoothRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegCurvetoQuadraticSmoothRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegCurvetoQuadraticSmoothRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -4979,19 +4979,19 @@
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoAbs.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoAbs.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5010,11 +5010,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalAbs.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalAbs.$x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5033,11 +5033,11 @@
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoHorizontalRel.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoHorizontalRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoHorizontalRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoHorizontalRel.$x_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5056,19 +5056,19 @@
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegLinetoRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegLinetoRel.$x_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegLinetoRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegLinetoRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoRel.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5087,11 +5087,11 @@
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalAbs.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5110,11 +5110,11 @@
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegLinetoVerticalRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegLinetoVerticalRel.$y_Getter(this);
 
   @DomName('SVGPathSegLinetoVerticalRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegLinetoVerticalRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegLinetoVerticalRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5133,7 +5133,7 @@
 
   @DomName('SVGPathSegList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGPathSegList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPathSegList.$numberOfItems_Getter(this);
 
   PathSeg operator[](int index) {
     if (index < 0 || index >= length)
@@ -5183,31 +5183,31 @@
 
   @DomName('SVGPathSegList.appendItem')
   @DocsEditable()
-  PathSeg appendItem(PathSeg newItem) => _blink.Native_SVGPathSegList_appendItem_Callback(this, newItem);
+  PathSeg appendItem(PathSeg newItem) => _blink.BlinkSVGPathSegList.$appendItem_Callback(this, newItem);
 
   @DomName('SVGPathSegList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGPathSegList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGPathSegList.$clear_Callback(this);
 
   @DomName('SVGPathSegList.getItem')
   @DocsEditable()
-  PathSeg getItem(int index) => _blink.Native_SVGPathSegList_getItem_Callback(this, index);
+  PathSeg getItem(int index) => _blink.BlinkSVGPathSegList.$getItem_Callback(this, index);
 
   @DomName('SVGPathSegList.initialize')
   @DocsEditable()
-  PathSeg initialize(PathSeg newItem) => _blink.Native_SVGPathSegList_initialize_Callback(this, newItem);
+  PathSeg initialize(PathSeg newItem) => _blink.BlinkSVGPathSegList.$initialize_Callback(this, newItem);
 
   @DomName('SVGPathSegList.insertItemBefore')
   @DocsEditable()
-  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_insertItemBefore_Callback(this, newItem, index);
+  PathSeg insertItemBefore(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.$insertItemBefore_Callback(this, newItem, index);
 
   @DomName('SVGPathSegList.removeItem')
   @DocsEditable()
-  PathSeg removeItem(int index) => _blink.Native_SVGPathSegList_removeItem_Callback(this, index);
+  PathSeg removeItem(int index) => _blink.BlinkSVGPathSegList.$removeItem_Callback(this, index);
 
   @DomName('SVGPathSegList.replaceItem')
   @DocsEditable()
-  PathSeg replaceItem(PathSeg newItem, int index) => _blink.Native_SVGPathSegList_replaceItem_Callback(this, newItem, index);
+  PathSeg replaceItem(PathSeg newItem, int index) => _blink.BlinkSVGPathSegList.$replaceItem_Callback(this, newItem, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5226,19 +5226,19 @@
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegMovetoAbs_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoAbs.$x_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegMovetoAbs_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoAbs.$x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegMovetoAbs_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoAbs.$y_Getter(this);
 
   @DomName('SVGPathSegMovetoAbs.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegMovetoAbs_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoAbs.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5257,19 +5257,19 @@
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPathSegMovetoRel_x_Getter(this);
+  num get x => _blink.BlinkSVGPathSegMovetoRel.$x_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPathSegMovetoRel_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPathSegMovetoRel.$x_Setter(this, value);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPathSegMovetoRel_y_Getter(this);
+  num get y => _blink.BlinkSVGPathSegMovetoRel.$y_Getter(this);
 
   @DomName('SVGPathSegMovetoRel.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPathSegMovetoRel_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPathSegMovetoRel.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5298,59 +5298,59 @@
 
   @DomName('SVGPatternElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGPatternElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGPatternElement.$height_Getter(this);
 
   @DomName('SVGPatternElement.patternContentUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternContentUnits => _blink.Native_SVGPatternElement_patternContentUnits_Getter(this);
+  AnimatedEnumeration get patternContentUnits => _blink.BlinkSVGPatternElement.$patternContentUnits_Getter(this);
 
   @DomName('SVGPatternElement.patternTransform')
   @DocsEditable()
-  AnimatedTransformList get patternTransform => _blink.Native_SVGPatternElement_patternTransform_Getter(this);
+  AnimatedTransformList get patternTransform => _blink.BlinkSVGPatternElement.$patternTransform_Getter(this);
 
   @DomName('SVGPatternElement.patternUnits')
   @DocsEditable()
-  AnimatedEnumeration get patternUnits => _blink.Native_SVGPatternElement_patternUnits_Getter(this);
+  AnimatedEnumeration get patternUnits => _blink.BlinkSVGPatternElement.$patternUnits_Getter(this);
 
   @DomName('SVGPatternElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGPatternElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGPatternElement.$width_Getter(this);
 
   @DomName('SVGPatternElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGPatternElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGPatternElement.$x_Getter(this);
 
   @DomName('SVGPatternElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGPatternElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGPatternElement.$y_Getter(this);
 
   @DomName('SVGPatternElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGPatternElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGPatternElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGPatternElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGPatternElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGPatternElement.$viewBox_Getter(this);
 
   @DomName('SVGPatternElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGPatternElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGPatternElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGPatternElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGPatternElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGPatternElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGPatternElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGPatternElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGPatternElement.$systemLanguage_Getter(this);
 
   @DomName('SVGPatternElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGPatternElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGPatternElement.$hasExtension_Callback(this, extension);
 
   @DomName('SVGPatternElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGPatternElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGPatternElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5369,23 +5369,23 @@
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGPoint_x_Getter(this);
+  num get x => _blink.BlinkSVGPoint.$x_Getter(this);
 
   @DomName('SVGPoint.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGPoint_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGPoint.$x_Setter(this, value);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGPoint_y_Getter(this);
+  num get y => _blink.BlinkSVGPoint.$y_Getter(this);
 
   @DomName('SVGPoint.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGPoint_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGPoint.$y_Setter(this, value);
 
   @DomName('SVGPoint.matrixTransform')
   @DocsEditable()
-  Point matrixTransform(Matrix matrix) => _blink.Native_SVGPoint_matrixTransform_Callback(this, matrix);
+  Point matrixTransform(Matrix matrix) => _blink.BlinkSVGPoint.$matrixTransform_Callback(this, matrix);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5404,35 +5404,35 @@
 
   @DomName('SVGPointList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGPointList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGPointList.$numberOfItems_Getter(this);
 
   @DomName('SVGPointList.appendItem')
   @DocsEditable()
-  Point appendItem(Point item) => _blink.Native_SVGPointList_appendItem_Callback(this, item);
+  Point appendItem(Point item) => _blink.BlinkSVGPointList.$appendItem_Callback(this, item);
 
   @DomName('SVGPointList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGPointList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGPointList.$clear_Callback(this);
 
   @DomName('SVGPointList.getItem')
   @DocsEditable()
-  Point getItem(int index) => _blink.Native_SVGPointList_getItem_Callback(this, index);
+  Point getItem(int index) => _blink.BlinkSVGPointList.$getItem_Callback(this, index);
 
   @DomName('SVGPointList.initialize')
   @DocsEditable()
-  Point initialize(Point item) => _blink.Native_SVGPointList_initialize_Callback(this, item);
+  Point initialize(Point item) => _blink.BlinkSVGPointList.$initialize_Callback(this, item);
 
   @DomName('SVGPointList.insertItemBefore')
   @DocsEditable()
-  Point insertItemBefore(Point item, int index) => _blink.Native_SVGPointList_insertItemBefore_Callback(this, item, index);
+  Point insertItemBefore(Point item, int index) => _blink.BlinkSVGPointList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGPointList.removeItem')
   @DocsEditable()
-  Point removeItem(int index) => _blink.Native_SVGPointList_removeItem_Callback(this, index);
+  Point removeItem(int index) => _blink.BlinkSVGPointList.$removeItem_Callback(this, index);
 
   @DomName('SVGPointList.replaceItem')
   @DocsEditable()
-  Point replaceItem(Point item, int index) => _blink.Native_SVGPointList_replaceItem_Callback(this, item, index);
+  Point replaceItem(Point item, int index) => _blink.BlinkSVGPointList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5461,11 +5461,11 @@
 
   @DomName('SVGPolygonElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.Native_SVGPolygonElement_animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolygonElement.$animatedPoints_Getter(this);
 
   @DomName('SVGPolygonElement.points')
   @DocsEditable()
-  PointList get points => _blink.Native_SVGPolygonElement_points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolygonElement.$points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5494,11 +5494,11 @@
 
   @DomName('SVGPolylineElement.animatedPoints')
   @DocsEditable()
-  PointList get animatedPoints => _blink.Native_SVGPolylineElement_animatedPoints_Getter(this);
+  PointList get animatedPoints => _blink.BlinkSVGPolylineElement.$animatedPoints_Getter(this);
 
   @DomName('SVGPolylineElement.points')
   @DocsEditable()
-  PointList get points => _blink.Native_SVGPolylineElement_points_Getter(this);
+  PointList get points => _blink.BlinkSVGPolylineElement.$points_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5573,19 +5573,19 @@
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  int get align => _blink.Native_SVGPreserveAspectRatio_align_Getter(this);
+  int get align => _blink.BlinkSVGPreserveAspectRatio.$align_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.align')
   @DocsEditable()
-  void set align(int value) => _blink.Native_SVGPreserveAspectRatio_align_Setter(this, value);
+  void set align(int value) => _blink.BlinkSVGPreserveAspectRatio.$align_Setter(this, value);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  int get meetOrSlice => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Getter(this);
+  int get meetOrSlice => _blink.BlinkSVGPreserveAspectRatio.$meetOrSlice_Getter(this);
 
   @DomName('SVGPreserveAspectRatio.meetOrSlice')
   @DocsEditable()
-  void set meetOrSlice(int value) => _blink.Native_SVGPreserveAspectRatio_meetOrSlice_Setter(this, value);
+  void set meetOrSlice(int value) => _blink.BlinkSVGPreserveAspectRatio.$meetOrSlice_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5614,27 +5614,27 @@
 
   @DomName('SVGRadialGradientElement.cx')
   @DocsEditable()
-  AnimatedLength get cx => _blink.Native_SVGRadialGradientElement_cx_Getter(this);
+  AnimatedLength get cx => _blink.BlinkSVGRadialGradientElement.$cx_Getter(this);
 
   @DomName('SVGRadialGradientElement.cy')
   @DocsEditable()
-  AnimatedLength get cy => _blink.Native_SVGRadialGradientElement_cy_Getter(this);
+  AnimatedLength get cy => _blink.BlinkSVGRadialGradientElement.$cy_Getter(this);
 
   @DomName('SVGRadialGradientElement.fr')
   @DocsEditable()
-  AnimatedLength get fr => _blink.Native_SVGRadialGradientElement_fr_Getter(this);
+  AnimatedLength get fr => _blink.BlinkSVGRadialGradientElement.$fr_Getter(this);
 
   @DomName('SVGRadialGradientElement.fx')
   @DocsEditable()
-  AnimatedLength get fx => _blink.Native_SVGRadialGradientElement_fx_Getter(this);
+  AnimatedLength get fx => _blink.BlinkSVGRadialGradientElement.$fx_Getter(this);
 
   @DomName('SVGRadialGradientElement.fy')
   @DocsEditable()
-  AnimatedLength get fy => _blink.Native_SVGRadialGradientElement_fy_Getter(this);
+  AnimatedLength get fy => _blink.BlinkSVGRadialGradientElement.$fy_Getter(this);
 
   @DomName('SVGRadialGradientElement.r')
   @DocsEditable()
-  AnimatedLength get r => _blink.Native_SVGRadialGradientElement_r_Getter(this);
+  AnimatedLength get r => _blink.BlinkSVGRadialGradientElement.$r_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5653,35 +5653,35 @@
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  num get height => _blink.Native_SVGRect_height_Getter(this);
+  num get height => _blink.BlinkSVGRect.$height_Getter(this);
 
   @DomName('SVGRect.height')
   @DocsEditable()
-  void set height(num value) => _blink.Native_SVGRect_height_Setter(this, value);
+  void set height(num value) => _blink.BlinkSVGRect.$height_Setter(this, value);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  num get width => _blink.Native_SVGRect_width_Getter(this);
+  num get width => _blink.BlinkSVGRect.$width_Getter(this);
 
   @DomName('SVGRect.width')
   @DocsEditable()
-  void set width(num value) => _blink.Native_SVGRect_width_Setter(this, value);
+  void set width(num value) => _blink.BlinkSVGRect.$width_Setter(this, value);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  num get x => _blink.Native_SVGRect_x_Getter(this);
+  num get x => _blink.BlinkSVGRect.$x_Getter(this);
 
   @DomName('SVGRect.x')
   @DocsEditable()
-  void set x(num value) => _blink.Native_SVGRect_x_Setter(this, value);
+  void set x(num value) => _blink.BlinkSVGRect.$x_Setter(this, value);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  num get y => _blink.Native_SVGRect_y_Getter(this);
+  num get y => _blink.BlinkSVGRect.$y_Getter(this);
 
   @DomName('SVGRect.y')
   @DocsEditable()
-  void set y(num value) => _blink.Native_SVGRect_y_Setter(this, value);
+  void set y(num value) => _blink.BlinkSVGRect.$y_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5710,27 +5710,27 @@
 
   @DomName('SVGRectElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGRectElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGRectElement.$height_Getter(this);
 
   @DomName('SVGRectElement.rx')
   @DocsEditable()
-  AnimatedLength get rx => _blink.Native_SVGRectElement_rx_Getter(this);
+  AnimatedLength get rx => _blink.BlinkSVGRectElement.$rx_Getter(this);
 
   @DomName('SVGRectElement.ry')
   @DocsEditable()
-  AnimatedLength get ry => _blink.Native_SVGRectElement_ry_Getter(this);
+  AnimatedLength get ry => _blink.BlinkSVGRectElement.$ry_Getter(this);
 
   @DomName('SVGRectElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGRectElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGRectElement.$width_Getter(this);
 
   @DomName('SVGRectElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGRectElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGRectElement.$x_Getter(this);
 
   @DomName('SVGRectElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGRectElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGRectElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5798,15 +5798,15 @@
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  String get type => _blink.Native_SVGScriptElement_type_Getter(this);
+  String get type => _blink.BlinkSVGScriptElement.$type_Getter(this);
 
   @DomName('SVGScriptElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_SVGScriptElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGScriptElement.$type_Setter(this, value);
 
   @DomName('SVGScriptElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGScriptElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGScriptElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5866,7 +5866,7 @@
 
   @DomName('SVGStopElement.offset')
   @DocsEditable()
-  AnimatedNumber get gradientOffset => _blink.Native_SVGStopElement_offset_Getter(this);
+  AnimatedNumber get gradientOffset => _blink.BlinkSVGStopElement.$offset_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5885,7 +5885,7 @@
 
   @DomName('SVGStringList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGStringList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGStringList.$numberOfItems_Getter(this);
 
   String operator[](int index) {
     if (index < 0 || index >= length)
@@ -5935,31 +5935,31 @@
 
   @DomName('SVGStringList.appendItem')
   @DocsEditable()
-  String appendItem(String item) => _blink.Native_SVGStringList_appendItem_Callback(this, item);
+  String appendItem(String item) => _blink.BlinkSVGStringList.$appendItem_Callback(this, item);
 
   @DomName('SVGStringList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGStringList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGStringList.$clear_Callback(this);
 
   @DomName('SVGStringList.getItem')
   @DocsEditable()
-  String getItem(int index) => _blink.Native_SVGStringList_getItem_Callback(this, index);
+  String getItem(int index) => _blink.BlinkSVGStringList.$getItem_Callback(this, index);
 
   @DomName('SVGStringList.initialize')
   @DocsEditable()
-  String initialize(String item) => _blink.Native_SVGStringList_initialize_Callback(this, item);
+  String initialize(String item) => _blink.BlinkSVGStringList.$initialize_Callback(this, item);
 
   @DomName('SVGStringList.insertItemBefore')
   @DocsEditable()
-  String insertItemBefore(String item, int index) => _blink.Native_SVGStringList_insertItemBefore_Callback(this, item, index);
+  String insertItemBefore(String item, int index) => _blink.BlinkSVGStringList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGStringList.removeItem')
   @DocsEditable()
-  String removeItem(int index) => _blink.Native_SVGStringList_removeItem_Callback(this, index);
+  String removeItem(int index) => _blink.BlinkSVGStringList.$removeItem_Callback(this, index);
 
   @DomName('SVGStringList.replaceItem')
   @DocsEditable()
-  String replaceItem(String item, int index) => _blink.Native_SVGStringList_replaceItem_Callback(this, item, index);
+  String replaceItem(String item, int index) => _blink.BlinkSVGStringList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -5989,35 +5989,35 @@
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  bool get disabled => _blink.Native_SVGStyleElement_disabled_Getter(this);
+  bool get disabled => _blink.BlinkSVGStyleElement.$disabled_Getter(this);
 
   @DomName('SVGStyleElement.disabled')
   @DocsEditable()
-  void set disabled(bool value) => _blink.Native_SVGStyleElement_disabled_Setter(this, value);
+  void set disabled(bool value) => _blink.BlinkSVGStyleElement.$disabled_Setter(this, value);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  String get media => _blink.Native_SVGStyleElement_media_Getter(this);
+  String get media => _blink.BlinkSVGStyleElement.$media_Getter(this);
 
   @DomName('SVGStyleElement.media')
   @DocsEditable()
-  void set media(String value) => _blink.Native_SVGStyleElement_media_Setter(this, value);
+  void set media(String value) => _blink.BlinkSVGStyleElement.$media_Setter(this, value);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  String get title => _blink.Native_SVGStyleElement_title_Getter(this);
+  String get title => _blink.BlinkSVGStyleElement.$title_Getter(this);
 
   @DomName('SVGStyleElement.title')
   @DocsEditable()
-  void set title(String value) => _blink.Native_SVGStyleElement_title_Setter(this, value);
+  void set title(String value) => _blink.BlinkSVGStyleElement.$title_Setter(this, value);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  String get type => _blink.Native_SVGStyleElement_type_Getter(this);
+  String get type => _blink.BlinkSVGStyleElement.$type_Getter(this);
 
   @DomName('SVGStyleElement.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_SVGStyleElement_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkSVGStyleElement.$type_Setter(this, value);
 
 }
 // Copyright (c) 2011, the Dart project authors.  Please see the AUTHORS file
@@ -6443,48 +6443,48 @@
   @DomName('SVGElement.className')
   @DocsEditable()
   @Experimental() // untriaged
-  AnimatedString get _svgClassName => _blink.Native_SVGElement_className_Getter(this);
+  AnimatedString get _svgClassName => _blink.BlinkSVGElement.$className_Getter(this);
 
   @DomName('SVGElement.ownerSVGElement')
   @DocsEditable()
-  SvgSvgElement get ownerSvgElement => _blink.Native_SVGElement_ownerSVGElement_Getter(this);
+  SvgSvgElement get ownerSvgElement => _blink.BlinkSVGElement.$ownerSVGElement_Getter(this);
 
   @DomName('SVGElement.style')
   @DocsEditable()
   @Experimental() // untriaged
-  CssStyleDeclaration get style => _blink.Native_SVGElement_style_Getter(this);
+  CssStyleDeclaration get style => _blink.BlinkSVGElement.$style_Getter(this);
 
   @DomName('SVGElement.viewportElement')
   @DocsEditable()
-  SvgElement get viewportElement => _blink.Native_SVGElement_viewportElement_Getter(this);
+  SvgElement get viewportElement => _blink.BlinkSVGElement.$viewportElement_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  String get xmlbase => _blink.Native_SVGElement_xmlbase_Getter(this);
+  String get xmlbase => _blink.BlinkSVGElement.$xmlbase_Getter(this);
 
   @DomName('SVGElement.xmlbase')
   @DocsEditable()
-  void set xmlbase(String value) => _blink.Native_SVGElement_xmlbase_Setter(this, value);
+  void set xmlbase(String value) => _blink.BlinkSVGElement.$xmlbase_Setter(this, value);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmllang => _blink.Native_SVGElement_xmllang_Getter(this);
+  String get xmllang => _blink.BlinkSVGElement.$xmllang_Getter(this);
 
   @DomName('SVGElement.xmllang')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmllang(String value) => _blink.Native_SVGElement_xmllang_Setter(this, value);
+  void set xmllang(String value) => _blink.BlinkSVGElement.$xmllang_Setter(this, value);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  String get xmlspace => _blink.Native_SVGElement_xmlspace_Getter(this);
+  String get xmlspace => _blink.BlinkSVGElement.$xmlspace_Getter(this);
 
   @DomName('SVGElement.xmlspace')
   @DocsEditable()
   @Experimental() // untriaged
-  void set xmlspace(String value) => _blink.Native_SVGElement_xmlspace_Setter(this, value);
+  void set xmlspace(String value) => _blink.BlinkSVGElement.$xmlspace_Setter(this, value);
 
   @DomName('SVGElement.onabort')
   @DocsEditable()
@@ -6773,167 +6773,167 @@
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  num get currentScale => _blink.Native_SVGSVGElement_currentScale_Getter(this);
+  num get currentScale => _blink.BlinkSVGSVGElement.$currentScale_Getter(this);
 
   @DomName('SVGSVGElement.currentScale')
   @DocsEditable()
-  void set currentScale(num value) => _blink.Native_SVGSVGElement_currentScale_Setter(this, value);
+  void set currentScale(num value) => _blink.BlinkSVGSVGElement.$currentScale_Setter(this, value);
 
   @DomName('SVGSVGElement.currentTranslate')
   @DocsEditable()
-  Point get currentTranslate => _blink.Native_SVGSVGElement_currentTranslate_Getter(this);
+  Point get currentTranslate => _blink.BlinkSVGSVGElement.$currentTranslate_Getter(this);
 
   @DomName('SVGSVGElement.currentView')
   @DocsEditable()
-  ViewSpec get currentView => _blink.Native_SVGSVGElement_currentView_Getter(this);
+  ViewSpec get currentView => _blink.BlinkSVGSVGElement.$currentView_Getter(this);
 
   @DomName('SVGSVGElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGSVGElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGSVGElement.$height_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterX')
   @DocsEditable()
-  double get pixelUnitToMillimeterX => _blink.Native_SVGSVGElement_pixelUnitToMillimeterX_Getter(this);
+  double get pixelUnitToMillimeterX => _blink.BlinkSVGSVGElement.$pixelUnitToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.pixelUnitToMillimeterY')
   @DocsEditable()
-  double get pixelUnitToMillimeterY => _blink.Native_SVGSVGElement_pixelUnitToMillimeterY_Getter(this);
+  double get pixelUnitToMillimeterY => _blink.BlinkSVGSVGElement.$pixelUnitToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterX')
   @DocsEditable()
-  double get screenPixelToMillimeterX => _blink.Native_SVGSVGElement_screenPixelToMillimeterX_Getter(this);
+  double get screenPixelToMillimeterX => _blink.BlinkSVGSVGElement.$screenPixelToMillimeterX_Getter(this);
 
   @DomName('SVGSVGElement.screenPixelToMillimeterY')
   @DocsEditable()
-  double get screenPixelToMillimeterY => _blink.Native_SVGSVGElement_screenPixelToMillimeterY_Getter(this);
+  double get screenPixelToMillimeterY => _blink.BlinkSVGSVGElement.$screenPixelToMillimeterY_Getter(this);
 
   @DomName('SVGSVGElement.useCurrentView')
   @DocsEditable()
-  bool get useCurrentView => _blink.Native_SVGSVGElement_useCurrentView_Getter(this);
+  bool get useCurrentView => _blink.BlinkSVGSVGElement.$useCurrentView_Getter(this);
 
   @DomName('SVGSVGElement.viewport')
   @DocsEditable()
-  Rect get viewport => _blink.Native_SVGSVGElement_viewport_Getter(this);
+  Rect get viewport => _blink.BlinkSVGSVGElement.$viewport_Getter(this);
 
   @DomName('SVGSVGElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGSVGElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGSVGElement.$width_Getter(this);
 
   @DomName('SVGSVGElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGSVGElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGSVGElement.$x_Getter(this);
 
   @DomName('SVGSVGElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGSVGElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGSVGElement.$y_Getter(this);
 
   @DomName('SVGSVGElement.animationsPaused')
   @DocsEditable()
-  bool animationsPaused() => _blink.Native_SVGSVGElement_animationsPaused_Callback(this);
+  bool animationsPaused() => _blink.BlinkSVGSVGElement.$animationsPaused_Callback(this);
 
   @DomName('SVGSVGElement.checkEnclosure')
   @DocsEditable()
-  bool checkEnclosure(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkEnclosure_Callback(this, element, rect);
+  bool checkEnclosure(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.$checkEnclosure_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.checkIntersection')
   @DocsEditable()
-  bool checkIntersection(SvgElement element, Rect rect) => _blink.Native_SVGSVGElement_checkIntersection_Callback(this, element, rect);
+  bool checkIntersection(SvgElement element, Rect rect) => _blink.BlinkSVGSVGElement.$checkIntersection_Callback(this, element, rect);
 
   @DomName('SVGSVGElement.createSVGAngle')
   @DocsEditable()
-  Angle createSvgAngle() => _blink.Native_SVGSVGElement_createSVGAngle_Callback(this);
+  Angle createSvgAngle() => _blink.BlinkSVGSVGElement.$createSVGAngle_Callback(this);
 
   @DomName('SVGSVGElement.createSVGLength')
   @DocsEditable()
-  Length createSvgLength() => _blink.Native_SVGSVGElement_createSVGLength_Callback(this);
+  Length createSvgLength() => _blink.BlinkSVGSVGElement.$createSVGLength_Callback(this);
 
   @DomName('SVGSVGElement.createSVGMatrix')
   @DocsEditable()
-  Matrix createSvgMatrix() => _blink.Native_SVGSVGElement_createSVGMatrix_Callback(this);
+  Matrix createSvgMatrix() => _blink.BlinkSVGSVGElement.$createSVGMatrix_Callback(this);
 
   @DomName('SVGSVGElement.createSVGNumber')
   @DocsEditable()
-  Number createSvgNumber() => _blink.Native_SVGSVGElement_createSVGNumber_Callback(this);
+  Number createSvgNumber() => _blink.BlinkSVGSVGElement.$createSVGNumber_Callback(this);
 
   @DomName('SVGSVGElement.createSVGPoint')
   @DocsEditable()
-  Point createSvgPoint() => _blink.Native_SVGSVGElement_createSVGPoint_Callback(this);
+  Point createSvgPoint() => _blink.BlinkSVGSVGElement.$createSVGPoint_Callback(this);
 
   @DomName('SVGSVGElement.createSVGRect')
   @DocsEditable()
-  Rect createSvgRect() => _blink.Native_SVGSVGElement_createSVGRect_Callback(this);
+  Rect createSvgRect() => _blink.BlinkSVGSVGElement.$createSVGRect_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransform')
   @DocsEditable()
-  Transform createSvgTransform() => _blink.Native_SVGSVGElement_createSVGTransform_Callback(this);
+  Transform createSvgTransform() => _blink.BlinkSVGSVGElement.$createSVGTransform_Callback(this);
 
   @DomName('SVGSVGElement.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGSVGElement_createSVGTransformFromMatrix_Callback(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGSVGElement.$createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGSVGElement.deselectAll')
   @DocsEditable()
-  void deselectAll() => _blink.Native_SVGSVGElement_deselectAll_Callback(this);
+  void deselectAll() => _blink.BlinkSVGSVGElement.$deselectAll_Callback(this);
 
   @DomName('SVGSVGElement.forceRedraw')
   @DocsEditable()
-  void forceRedraw() => _blink.Native_SVGSVGElement_forceRedraw_Callback(this);
+  void forceRedraw() => _blink.BlinkSVGSVGElement.$forceRedraw_Callback(this);
 
   @DomName('SVGSVGElement.getCurrentTime')
   @DocsEditable()
-  double getCurrentTime() => _blink.Native_SVGSVGElement_getCurrentTime_Callback(this);
+  double getCurrentTime() => _blink.BlinkSVGSVGElement.$getCurrentTime_Callback(this);
 
   @DomName('SVGSVGElement.getElementById')
   @DocsEditable()
-  Element getElementById(String elementId) => _blink.Native_SVGSVGElement_getElementById_Callback(this, elementId);
+  Element getElementById(String elementId) => _blink.BlinkSVGSVGElement.$getElementById_Callback(this, elementId);
 
   @DomName('SVGSVGElement.getEnclosureList')
   @DocsEditable()
-  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getEnclosureList_Callback(this, rect, referenceElement);
+  List<Node> getEnclosureList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.$getEnclosureList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.getIntersectionList')
   @DocsEditable()
-  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.Native_SVGSVGElement_getIntersectionList_Callback(this, rect, referenceElement);
+  List<Node> getIntersectionList(Rect rect, SvgElement referenceElement) => _blink.BlinkSVGSVGElement.$getIntersectionList_Callback(this, rect, referenceElement);
 
   @DomName('SVGSVGElement.pauseAnimations')
   @DocsEditable()
-  void pauseAnimations() => _blink.Native_SVGSVGElement_pauseAnimations_Callback(this);
+  void pauseAnimations() => _blink.BlinkSVGSVGElement.$pauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.setCurrentTime')
   @DocsEditable()
-  void setCurrentTime(num seconds) => _blink.Native_SVGSVGElement_setCurrentTime_Callback(this, seconds);
+  void setCurrentTime(num seconds) => _blink.BlinkSVGSVGElement.$setCurrentTime_Callback(this, seconds);
 
   @DomName('SVGSVGElement.suspendRedraw')
   @DocsEditable()
-  int suspendRedraw(int maxWaitMilliseconds) => _blink.Native_SVGSVGElement_suspendRedraw_Callback(this, maxWaitMilliseconds);
+  int suspendRedraw(int maxWaitMilliseconds) => _blink.BlinkSVGSVGElement.$suspendRedraw_Callback(this, maxWaitMilliseconds);
 
   @DomName('SVGSVGElement.unpauseAnimations')
   @DocsEditable()
-  void unpauseAnimations() => _blink.Native_SVGSVGElement_unpauseAnimations_Callback(this);
+  void unpauseAnimations() => _blink.BlinkSVGSVGElement.$unpauseAnimations_Callback(this);
 
   @DomName('SVGSVGElement.unsuspendRedraw')
   @DocsEditable()
-  void unsuspendRedraw(int suspendHandleId) => _blink.Native_SVGSVGElement_unsuspendRedraw_Callback(this, suspendHandleId);
+  void unsuspendRedraw(int suspendHandleId) => _blink.BlinkSVGSVGElement.$unsuspendRedraw_Callback(this, suspendHandleId);
 
   @DomName('SVGSVGElement.unsuspendRedrawAll')
   @DocsEditable()
-  void unsuspendRedrawAll() => _blink.Native_SVGSVGElement_unsuspendRedrawAll_Callback(this);
+  void unsuspendRedrawAll() => _blink.BlinkSVGSVGElement.$unsuspendRedrawAll_Callback(this);
 
   @DomName('SVGSVGElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSVGElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSVGElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGSVGElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGSVGElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSVGElement.$viewBox_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGSVGElement_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGSVGElement.$zoomAndPan_Getter(this);
 
   @DomName('SVGSVGElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGSVGElement_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGSVGElement.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -6987,11 +6987,11 @@
 
   @DomName('SVGSymbolElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGSymbolElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGSymbolElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGSymbolElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGSymbolElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGSymbolElement.$viewBox_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7035,19 +7035,19 @@
 
   @DomName('SVGTests.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGTests_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGTests.$requiredExtensions_Getter(this);
 
   @DomName('SVGTests.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGTests_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGTests.$requiredFeatures_Getter(this);
 
   @DomName('SVGTests.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGTests_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGTests.$systemLanguage_Getter(this);
 
   @DomName('SVGTests.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGTests_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGTests.$hasExtension_Callback(this, extension);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7084,47 +7084,47 @@
 
   @DomName('SVGTextContentElement.lengthAdjust')
   @DocsEditable()
-  AnimatedEnumeration get lengthAdjust => _blink.Native_SVGTextContentElement_lengthAdjust_Getter(this);
+  AnimatedEnumeration get lengthAdjust => _blink.BlinkSVGTextContentElement.$lengthAdjust_Getter(this);
 
   @DomName('SVGTextContentElement.textLength')
   @DocsEditable()
-  AnimatedLength get textLength => _blink.Native_SVGTextContentElement_textLength_Getter(this);
+  AnimatedLength get textLength => _blink.BlinkSVGTextContentElement.$textLength_Getter(this);
 
   @DomName('SVGTextContentElement.getCharNumAtPosition')
   @DocsEditable()
-  int getCharNumAtPosition(Point point) => _blink.Native_SVGTextContentElement_getCharNumAtPosition_Callback(this, point);
+  int getCharNumAtPosition(Point point) => _blink.BlinkSVGTextContentElement.$getCharNumAtPosition_Callback(this, point);
 
   @DomName('SVGTextContentElement.getComputedTextLength')
   @DocsEditable()
-  double getComputedTextLength() => _blink.Native_SVGTextContentElement_getComputedTextLength_Callback(this);
+  double getComputedTextLength() => _blink.BlinkSVGTextContentElement.$getComputedTextLength_Callback(this);
 
   @DomName('SVGTextContentElement.getEndPositionOfChar')
   @DocsEditable()
-  Point getEndPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getEndPositionOfChar_Callback(this, offset);
+  Point getEndPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getEndPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getExtentOfChar')
   @DocsEditable()
-  Rect getExtentOfChar(int offset) => _blink.Native_SVGTextContentElement_getExtentOfChar_Callback(this, offset);
+  Rect getExtentOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getExtentOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getNumberOfChars')
   @DocsEditable()
-  int getNumberOfChars() => _blink.Native_SVGTextContentElement_getNumberOfChars_Callback(this);
+  int getNumberOfChars() => _blink.BlinkSVGTextContentElement.$getNumberOfChars_Callback(this);
 
   @DomName('SVGTextContentElement.getRotationOfChar')
   @DocsEditable()
-  double getRotationOfChar(int offset) => _blink.Native_SVGTextContentElement_getRotationOfChar_Callback(this, offset);
+  double getRotationOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getRotationOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getStartPositionOfChar')
   @DocsEditable()
-  Point getStartPositionOfChar(int offset) => _blink.Native_SVGTextContentElement_getStartPositionOfChar_Callback(this, offset);
+  Point getStartPositionOfChar(int offset) => _blink.BlinkSVGTextContentElement.$getStartPositionOfChar_Callback(this, offset);
 
   @DomName('SVGTextContentElement.getSubStringLength')
   @DocsEditable()
-  double getSubStringLength(int offset, int length) => _blink.Native_SVGTextContentElement_getSubStringLength_Callback(this, offset, length);
+  double getSubStringLength(int offset, int length) => _blink.BlinkSVGTextContentElement.$getSubStringLength_Callback(this, offset, length);
 
   @DomName('SVGTextContentElement.selectSubString')
   @DocsEditable()
-  void selectSubString(int offset, int length) => _blink.Native_SVGTextContentElement_selectSubString_Callback(this, offset, length);
+  void selectSubString(int offset, int length) => _blink.BlinkSVGTextContentElement.$selectSubString_Callback(this, offset, length);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7198,19 +7198,19 @@
 
   @DomName('SVGTextPathElement.method')
   @DocsEditable()
-  AnimatedEnumeration get method => _blink.Native_SVGTextPathElement_method_Getter(this);
+  AnimatedEnumeration get method => _blink.BlinkSVGTextPathElement.$method_Getter(this);
 
   @DomName('SVGTextPathElement.spacing')
   @DocsEditable()
-  AnimatedEnumeration get spacing => _blink.Native_SVGTextPathElement_spacing_Getter(this);
+  AnimatedEnumeration get spacing => _blink.BlinkSVGTextPathElement.$spacing_Getter(this);
 
   @DomName('SVGTextPathElement.startOffset')
   @DocsEditable()
-  AnimatedLength get startOffset => _blink.Native_SVGTextPathElement_startOffset_Getter(this);
+  AnimatedLength get startOffset => _blink.BlinkSVGTextPathElement.$startOffset_Getter(this);
 
   @DomName('SVGTextPathElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGTextPathElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGTextPathElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7235,23 +7235,23 @@
 
   @DomName('SVGTextPositioningElement.dx')
   @DocsEditable()
-  AnimatedLengthList get dx => _blink.Native_SVGTextPositioningElement_dx_Getter(this);
+  AnimatedLengthList get dx => _blink.BlinkSVGTextPositioningElement.$dx_Getter(this);
 
   @DomName('SVGTextPositioningElement.dy')
   @DocsEditable()
-  AnimatedLengthList get dy => _blink.Native_SVGTextPositioningElement_dy_Getter(this);
+  AnimatedLengthList get dy => _blink.BlinkSVGTextPositioningElement.$dy_Getter(this);
 
   @DomName('SVGTextPositioningElement.rotate')
   @DocsEditable()
-  AnimatedNumberList get rotate => _blink.Native_SVGTextPositioningElement_rotate_Getter(this);
+  AnimatedNumberList get rotate => _blink.BlinkSVGTextPositioningElement.$rotate_Getter(this);
 
   @DomName('SVGTextPositioningElement.x')
   @DocsEditable()
-  AnimatedLengthList get x => _blink.Native_SVGTextPositioningElement_x_Getter(this);
+  AnimatedLengthList get x => _blink.BlinkSVGTextPositioningElement.$x_Getter(this);
 
   @DomName('SVGTextPositioningElement.y')
   @DocsEditable()
-  AnimatedLengthList get y => _blink.Native_SVGTextPositioningElement_y_Getter(this);
+  AnimatedLengthList get y => _blink.BlinkSVGTextPositioningElement.$y_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7323,39 +7323,39 @@
 
   @DomName('SVGTransform.angle')
   @DocsEditable()
-  double get angle => _blink.Native_SVGTransform_angle_Getter(this);
+  double get angle => _blink.BlinkSVGTransform.$angle_Getter(this);
 
   @DomName('SVGTransform.matrix')
   @DocsEditable()
-  Matrix get matrix => _blink.Native_SVGTransform_matrix_Getter(this);
+  Matrix get matrix => _blink.BlinkSVGTransform.$matrix_Getter(this);
 
   @DomName('SVGTransform.type')
   @DocsEditable()
-  int get type => _blink.Native_SVGTransform_type_Getter(this);
+  int get type => _blink.BlinkSVGTransform.$type_Getter(this);
 
   @DomName('SVGTransform.setMatrix')
   @DocsEditable()
-  void setMatrix(Matrix matrix) => _blink.Native_SVGTransform_setMatrix_Callback(this, matrix);
+  void setMatrix(Matrix matrix) => _blink.BlinkSVGTransform.$setMatrix_Callback(this, matrix);
 
   @DomName('SVGTransform.setRotate')
   @DocsEditable()
-  void setRotate(num angle, num cx, num cy) => _blink.Native_SVGTransform_setRotate_Callback(this, angle, cx, cy);
+  void setRotate(num angle, num cx, num cy) => _blink.BlinkSVGTransform.$setRotate_Callback(this, angle, cx, cy);
 
   @DomName('SVGTransform.setScale')
   @DocsEditable()
-  void setScale(num sx, num sy) => _blink.Native_SVGTransform_setScale_Callback(this, sx, sy);
+  void setScale(num sx, num sy) => _blink.BlinkSVGTransform.$setScale_Callback(this, sx, sy);
 
   @DomName('SVGTransform.setSkewX')
   @DocsEditable()
-  void setSkewX(num angle) => _blink.Native_SVGTransform_setSkewX_Callback(this, angle);
+  void setSkewX(num angle) => _blink.BlinkSVGTransform.$setSkewX_Callback(this, angle);
 
   @DomName('SVGTransform.setSkewY')
   @DocsEditable()
-  void setSkewY(num angle) => _blink.Native_SVGTransform_setSkewY_Callback(this, angle);
+  void setSkewY(num angle) => _blink.BlinkSVGTransform.$setSkewY_Callback(this, angle);
 
   @DomName('SVGTransform.setTranslate')
   @DocsEditable()
-  void setTranslate(num tx, num ty) => _blink.Native_SVGTransform_setTranslate_Callback(this, tx, ty);
+  void setTranslate(num tx, num ty) => _blink.BlinkSVGTransform.$setTranslate_Callback(this, tx, ty);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7374,7 +7374,7 @@
 
   @DomName('SVGTransformList.numberOfItems')
   @DocsEditable()
-  int get numberOfItems => _blink.Native_SVGTransformList_numberOfItems_Getter(this);
+  int get numberOfItems => _blink.BlinkSVGTransformList.$numberOfItems_Getter(this);
 
   Transform operator[](int index) {
     if (index < 0 || index >= length)
@@ -7424,39 +7424,39 @@
 
   @DomName('SVGTransformList.appendItem')
   @DocsEditable()
-  Transform appendItem(Transform item) => _blink.Native_SVGTransformList_appendItem_Callback(this, item);
+  Transform appendItem(Transform item) => _blink.BlinkSVGTransformList.$appendItem_Callback(this, item);
 
   @DomName('SVGTransformList.clear')
   @DocsEditable()
-  void clear() => _blink.Native_SVGTransformList_clear_Callback(this);
+  void clear() => _blink.BlinkSVGTransformList.$clear_Callback(this);
 
   @DomName('SVGTransformList.consolidate')
   @DocsEditable()
-  Transform consolidate() => _blink.Native_SVGTransformList_consolidate_Callback(this);
+  Transform consolidate() => _blink.BlinkSVGTransformList.$consolidate_Callback(this);
 
   @DomName('SVGTransformList.createSVGTransformFromMatrix')
   @DocsEditable()
-  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.Native_SVGTransformList_createSVGTransformFromMatrix_Callback(this, matrix);
+  Transform createSvgTransformFromMatrix(Matrix matrix) => _blink.BlinkSVGTransformList.$createSVGTransformFromMatrix_Callback(this, matrix);
 
   @DomName('SVGTransformList.getItem')
   @DocsEditable()
-  Transform getItem(int index) => _blink.Native_SVGTransformList_getItem_Callback(this, index);
+  Transform getItem(int index) => _blink.BlinkSVGTransformList.$getItem_Callback(this, index);
 
   @DomName('SVGTransformList.initialize')
   @DocsEditable()
-  Transform initialize(Transform item) => _blink.Native_SVGTransformList_initialize_Callback(this, item);
+  Transform initialize(Transform item) => _blink.BlinkSVGTransformList.$initialize_Callback(this, item);
 
   @DomName('SVGTransformList.insertItemBefore')
   @DocsEditable()
-  Transform insertItemBefore(Transform item, int index) => _blink.Native_SVGTransformList_insertItemBefore_Callback(this, item, index);
+  Transform insertItemBefore(Transform item, int index) => _blink.BlinkSVGTransformList.$insertItemBefore_Callback(this, item, index);
 
   @DomName('SVGTransformList.removeItem')
   @DocsEditable()
-  Transform removeItem(int index) => _blink.Native_SVGTransformList_removeItem_Callback(this, index);
+  Transform removeItem(int index) => _blink.BlinkSVGTransformList.$removeItem_Callback(this, index);
 
   @DomName('SVGTransformList.replaceItem')
   @DocsEditable()
-  Transform replaceItem(Transform item, int index) => _blink.Native_SVGTransformList_replaceItem_Callback(this, item, index);
+  Transform replaceItem(Transform item, int index) => _blink.BlinkSVGTransformList.$replaceItem_Callback(this, item, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7502,7 +7502,7 @@
 
   @DomName('SVGURIReference.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGURIReference_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGURIReference.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7531,47 +7531,47 @@
 
   @DomName('SVGUseElement.animatedInstanceRoot')
   @DocsEditable()
-  ElementInstance get animatedInstanceRoot => _blink.Native_SVGUseElement_animatedInstanceRoot_Getter(this);
+  ElementInstance get animatedInstanceRoot => _blink.BlinkSVGUseElement.$animatedInstanceRoot_Getter(this);
 
   @DomName('SVGUseElement.height')
   @DocsEditable()
-  AnimatedLength get height => _blink.Native_SVGUseElement_height_Getter(this);
+  AnimatedLength get height => _blink.BlinkSVGUseElement.$height_Getter(this);
 
   @DomName('SVGUseElement.instanceRoot')
   @DocsEditable()
-  ElementInstance get instanceRoot => _blink.Native_SVGUseElement_instanceRoot_Getter(this);
+  ElementInstance get instanceRoot => _blink.BlinkSVGUseElement.$instanceRoot_Getter(this);
 
   @DomName('SVGUseElement.width')
   @DocsEditable()
-  AnimatedLength get width => _blink.Native_SVGUseElement_width_Getter(this);
+  AnimatedLength get width => _blink.BlinkSVGUseElement.$width_Getter(this);
 
   @DomName('SVGUseElement.x')
   @DocsEditable()
-  AnimatedLength get x => _blink.Native_SVGUseElement_x_Getter(this);
+  AnimatedLength get x => _blink.BlinkSVGUseElement.$x_Getter(this);
 
   @DomName('SVGUseElement.y')
   @DocsEditable()
-  AnimatedLength get y => _blink.Native_SVGUseElement_y_Getter(this);
+  AnimatedLength get y => _blink.BlinkSVGUseElement.$y_Getter(this);
 
   @DomName('SVGUseElement.requiredExtensions')
   @DocsEditable()
-  StringList get requiredExtensions => _blink.Native_SVGUseElement_requiredExtensions_Getter(this);
+  StringList get requiredExtensions => _blink.BlinkSVGUseElement.$requiredExtensions_Getter(this);
 
   @DomName('SVGUseElement.requiredFeatures')
   @DocsEditable()
-  StringList get requiredFeatures => _blink.Native_SVGUseElement_requiredFeatures_Getter(this);
+  StringList get requiredFeatures => _blink.BlinkSVGUseElement.$requiredFeatures_Getter(this);
 
   @DomName('SVGUseElement.systemLanguage')
   @DocsEditable()
-  StringList get systemLanguage => _blink.Native_SVGUseElement_systemLanguage_Getter(this);
+  StringList get systemLanguage => _blink.BlinkSVGUseElement.$systemLanguage_Getter(this);
 
   @DomName('SVGUseElement.hasExtension')
   @DocsEditable()
-  bool hasExtension(String extension) => _blink.Native_SVGUseElement_hasExtension_Callback(this, extension);
+  bool hasExtension(String extension) => _blink.BlinkSVGUseElement.$hasExtension_Callback(this, extension);
 
   @DomName('SVGUseElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGUseElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGUseElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7600,23 +7600,23 @@
 
   @DomName('SVGViewElement.viewTarget')
   @DocsEditable()
-  StringList get viewTarget => _blink.Native_SVGViewElement_viewTarget_Getter(this);
+  StringList get viewTarget => _blink.BlinkSVGViewElement.$viewTarget_Getter(this);
 
   @DomName('SVGViewElement.preserveAspectRatio')
   @DocsEditable()
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewElement_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewElement.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewElement.viewBox')
   @DocsEditable()
-  AnimatedRect get viewBox => _blink.Native_SVGViewElement_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewElement.$viewBox_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGViewElement_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewElement.$zoomAndPan_Getter(this);
 
   @DomName('SVGViewElement.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGViewElement_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewElement.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7635,47 +7635,47 @@
 
   @DomName('SVGViewSpec.preserveAspectRatioString')
   @DocsEditable()
-  String get preserveAspectRatioString => _blink.Native_SVGViewSpec_preserveAspectRatioString_Getter(this);
+  String get preserveAspectRatioString => _blink.BlinkSVGViewSpec.$preserveAspectRatioString_Getter(this);
 
   @DomName('SVGViewSpec.transform')
   @DocsEditable()
-  TransformList get transform => _blink.Native_SVGViewSpec_transform_Getter(this);
+  TransformList get transform => _blink.BlinkSVGViewSpec.$transform_Getter(this);
 
   @DomName('SVGViewSpec.transformString')
   @DocsEditable()
-  String get transformString => _blink.Native_SVGViewSpec_transformString_Getter(this);
+  String get transformString => _blink.BlinkSVGViewSpec.$transformString_Getter(this);
 
   @DomName('SVGViewSpec.viewBoxString')
   @DocsEditable()
-  String get viewBoxString => _blink.Native_SVGViewSpec_viewBoxString_Getter(this);
+  String get viewBoxString => _blink.BlinkSVGViewSpec.$viewBoxString_Getter(this);
 
   @DomName('SVGViewSpec.viewTarget')
   @DocsEditable()
-  SvgElement get viewTarget => _blink.Native_SVGViewSpec_viewTarget_Getter(this);
+  SvgElement get viewTarget => _blink.BlinkSVGViewSpec.$viewTarget_Getter(this);
 
   @DomName('SVGViewSpec.viewTargetString')
   @DocsEditable()
-  String get viewTargetString => _blink.Native_SVGViewSpec_viewTargetString_Getter(this);
+  String get viewTargetString => _blink.BlinkSVGViewSpec.$viewTargetString_Getter(this);
 
   @DomName('SVGViewSpec.preserveAspectRatio')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.Native_SVGViewSpec_preserveAspectRatio_Getter(this);
+  AnimatedPreserveAspectRatio get preserveAspectRatio => _blink.BlinkSVGViewSpec.$preserveAspectRatio_Getter(this);
 
   @DomName('SVGViewSpec.viewBox')
   @DocsEditable()
   @Experimental() // nonstandard
-  AnimatedRect get viewBox => _blink.Native_SVGViewSpec_viewBox_Getter(this);
+  AnimatedRect get viewBox => _blink.BlinkSVGViewSpec.$viewBox_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  int get zoomAndPan => _blink.Native_SVGViewSpec_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGViewSpec.$zoomAndPan_Getter(this);
 
   @DomName('SVGViewSpec.zoomAndPan')
   @DocsEditable()
   @Experimental() // nonstandard
-  void set zoomAndPan(int value) => _blink.Native_SVGViewSpec_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGViewSpec.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7706,11 +7706,11 @@
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  int get zoomAndPan => _blink.Native_SVGZoomAndPan_zoomAndPan_Getter(this);
+  int get zoomAndPan => _blink.BlinkSVGZoomAndPan.$zoomAndPan_Getter(this);
 
   @DomName('SVGZoomAndPan.zoomAndPan')
   @DocsEditable()
-  void set zoomAndPan(int value) => _blink.Native_SVGZoomAndPan_zoomAndPan_Setter(this, value);
+  void set zoomAndPan(int value) => _blink.BlinkSVGZoomAndPan.$zoomAndPan_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7729,23 +7729,23 @@
 
   @DomName('SVGZoomEvent.newScale')
   @DocsEditable()
-  double get newScale => _blink.Native_SVGZoomEvent_newScale_Getter(this);
+  double get newScale => _blink.BlinkSVGZoomEvent.$newScale_Getter(this);
 
   @DomName('SVGZoomEvent.newTranslate')
   @DocsEditable()
-  Point get newTranslate => _blink.Native_SVGZoomEvent_newTranslate_Getter(this);
+  Point get newTranslate => _blink.BlinkSVGZoomEvent.$newTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.previousScale')
   @DocsEditable()
-  double get previousScale => _blink.Native_SVGZoomEvent_previousScale_Getter(this);
+  double get previousScale => _blink.BlinkSVGZoomEvent.$previousScale_Getter(this);
 
   @DomName('SVGZoomEvent.previousTranslate')
   @DocsEditable()
-  Point get previousTranslate => _blink.Native_SVGZoomEvent_previousTranslate_Getter(this);
+  Point get previousTranslate => _blink.BlinkSVGZoomEvent.$previousTranslate_Getter(this);
 
   @DomName('SVGZoomEvent.zoomRectScreen')
   @DocsEditable()
-  Rect get zoomRectScreen => _blink.Native_SVGZoomEvent_zoomRectScreen_Getter(this);
+  Rect get zoomRectScreen => _blink.BlinkSVGZoomEvent.$zoomRectScreen_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7764,15 +7764,15 @@
 
   @DomName('SVGElementInstanceList.length')
   @DocsEditable()
-  int get length => _blink.Native_SVGElementInstanceList_length_Getter(this);
+  int get length => _blink.BlinkSVGElementInstanceList.$length_Getter(this);
 
   ElementInstance operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSVGElementInstanceList.$NativeIndexed_Getter(this, index);
   }
 
-  ElementInstance _nativeIndexedGetter(int index) => _blink.Native_SVGElementInstanceList_NativeIndexed_Getter(this, index);
+  ElementInstance _nativeIndexedGetter(int index) => _blink.BlinkSVGElementInstanceList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, ElementInstance value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -7814,7 +7814,7 @@
 
   @DomName('SVGElementInstanceList.item')
   @DocsEditable()
-  ElementInstance item(int index) => _blink.Native_SVGElementInstanceList_item_Callback(this, index);
+  ElementInstance item(int index) => _blink.BlinkSVGElementInstanceList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -7855,19 +7855,19 @@
 
   @DomName('SVGGradientElement.gradientTransform')
   @DocsEditable()
-  AnimatedTransformList get gradientTransform => _blink.Native_SVGGradientElement_gradientTransform_Getter(this);
+  AnimatedTransformList get gradientTransform => _blink.BlinkSVGGradientElement.$gradientTransform_Getter(this);
 
   @DomName('SVGGradientElement.gradientUnits')
   @DocsEditable()
-  AnimatedEnumeration get gradientUnits => _blink.Native_SVGGradientElement_gradientUnits_Getter(this);
+  AnimatedEnumeration get gradientUnits => _blink.BlinkSVGGradientElement.$gradientUnits_Getter(this);
 
   @DomName('SVGGradientElement.spreadMethod')
   @DocsEditable()
-  AnimatedEnumeration get spreadMethod => _blink.Native_SVGGradientElement_spreadMethod_Getter(this);
+  AnimatedEnumeration get spreadMethod => _blink.BlinkSVGGradientElement.$spreadMethod_Getter(this);
 
   @DomName('SVGGradientElement.href')
   @DocsEditable()
-  AnimatedString get href => _blink.Native_SVGGradientElement_href_Getter(this);
+  AnimatedString get href => _blink.BlinkSVGGradientElement.$href_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
index efc4957..c9c0257 100644
--- a/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
+++ b/sdk/lib/typed_data/dart2js/native_typed_data_dart2js.dart
@@ -242,7 +242,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getInt64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Int64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -297,7 +297,7 @@
    * `byteOffset + 8` is greater than the length of this object.
    */
   int getUint64(int byteOffset, [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -392,7 +392,7 @@
    */
   void setInt64(int byteOffset, int value,
                 [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Int64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Int64 accessor not supported by dart2js.');
   }
 
   /**
@@ -449,7 +449,7 @@
    */
   void setUint64(int byteOffset, int value,
                  [Endianness endian=Endianness.BIG_ENDIAN]) {
-    throw new UnsupportedError("Uint64 accessor not supported by dart2js.");
+    throw new UnsupportedError('Uint64 accessor not supported by dart2js.');
   }
 
   /**
@@ -474,12 +474,9 @@
 }
 
 
-// TODO(sra): Move this type to a public name in a private library so that other
-// platform libraries like dart:html and dart:webaudio can tell a native array
-// from a list that implements the implicit interface.
 abstract class NativeTypedArray extends NativeTypedData
     implements JavaScriptIndexingBehavior {
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   bool _setRangeFast(int start, int end,
       NativeTypedArray source, int skipCount) {
@@ -493,7 +490,7 @@
 
     int sourceLength = source.length;
     if (sourceLength - skipCount < count)  {
-      throw new StateError("Not enough elements");
+      throw new StateError('Not enough elements');
     }
 
     if (skipCount != 0 || sourceLength != count) {
@@ -505,12 +502,21 @@
   }
 }
 
-// TODO(sra): Move to private library, like [NativeTypedArray].
 abstract class NativeTypedArrayOfDouble
     extends NativeTypedArray
         with ListMixin<double>, FixedLengthListMixin<double>
     implements List<double> {
 
+  num operator[](int index) {
+    _checkIndex(index, length);
+    return JS('num', '#[#]', this, index);
+  }
+
+  void operator[]=(int index, num value) {
+    _checkIndex(index, length);
+    JS('void', '#[#] = #', this, index, value);
+  }
+
   void setRange(int start, int end, Iterable<double> iterable,
                 [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfDouble) {
@@ -521,12 +527,19 @@
   }
 }
 
-// TODO(sra): Move to private library, like [NativeTypedArray].
 abstract class NativeTypedArrayOfInt
     extends NativeTypedArray
         with ListMixin<int>, FixedLengthListMixin<int>
     implements List<int> {
 
+  // operator[]() is not here since different versions have different return
+  // types
+
+  void operator[]=(int index, int value) {
+    _checkIndex(index, length);
+    JS('void', '#[#] = #', this, index, value);
+  }
+
   void setRange(int start, int end, Iterable<int> iterable,
                 [int skipCount = 0]) {
     if (iterable is NativeTypedArrayOfInt) {
@@ -558,16 +571,6 @@
 
   Type get runtimeType => Float32List;
 
-  num operator[](int index) {
-    _checkIndex(index, length);
-    return JS("num", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, num value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
-  }
-
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('NativeFloat32List', '#.subarray(#, #)', this, start, end);
@@ -605,16 +608,6 @@
 
   Type get runtimeType => Float64List;
 
-  num operator[](int index) {
-    _checkIndex(index, length);
-    return JS("num", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, num value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
-  }
-
   List<double> sublist(int start, [int end]) {
     end = _checkSublistArguments(start, end, length);
     var source = JS('NativeFloat64List', '#.subarray(#, #)', this, start, end);
@@ -654,12 +647,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -701,12 +689,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -748,12 +731,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("int", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('int', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -795,12 +773,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -842,12 +815,7 @@
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt32", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt32', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -887,16 +855,11 @@
 
   Type get runtimeType => Uint8ClampedList;
 
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
@@ -942,16 +905,11 @@
 
   Type get runtimeType => Uint8List;
 
-  int get length => JS("JSUInt32", '#.length', this);
+  int get length => JS('JSUInt32', '#.length', this);
 
   int operator[](int index) {
     _checkIndex(index, length);
-    return JS("JSUInt31", "#[#]", this, index);
-  }
-
-  void operator[]=(int index, int value) {
-    _checkIndex(index, length);
-    JS("void", "#[#] = #", this, index, value);
+    return JS('JSUInt31', '#[#]', this, index);
   }
 
   List<int> sublist(int start, [int end]) {
diff --git a/sdk/lib/web_audio/dartium/web_audio_dartium.dart b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
index 7719807..8cdf0ea 100644
--- a/sdk/lib/web_audio/dartium/web_audio_dartium.dart
+++ b/sdk/lib/web_audio/dartium/web_audio_dartium.dart
@@ -15,34 +15,34 @@
 
 
 // FIXME: Can we make this private?
-const web_audioBlinkMap = const {
-  'AnalyserNode': AnalyserNode,
-  'AudioBuffer': AudioBuffer,
-  'AudioBufferSourceNode': AudioBufferSourceNode,
-  'AudioContext': AudioContext,
-  'AudioDestinationNode': AudioDestinationNode,
-  'AudioListener': AudioListener,
-  'AudioNode': AudioNode,
-  'AudioParam': AudioParam,
-  'AudioProcessingEvent': AudioProcessingEvent,
-  'AudioSourceNode': AudioSourceNode,
-  'BiquadFilterNode': BiquadFilterNode,
-  'ChannelMergerNode': ChannelMergerNode,
-  'ChannelSplitterNode': ChannelSplitterNode,
-  'ConvolverNode': ConvolverNode,
-  'DelayNode': DelayNode,
-  'DynamicsCompressorNode': DynamicsCompressorNode,
-  'GainNode': GainNode,
-  'MediaElementAudioSourceNode': MediaElementAudioSourceNode,
-  'MediaStreamAudioDestinationNode': MediaStreamAudioDestinationNode,
-  'MediaStreamAudioSourceNode': MediaStreamAudioSourceNode,
-  'OfflineAudioCompletionEvent': OfflineAudioCompletionEvent,
-  'OfflineAudioContext': OfflineAudioContext,
-  'OscillatorNode': OscillatorNode,
-  'PannerNode': PannerNode,
-  'PeriodicWave': PeriodicWave,
-  'ScriptProcessorNode': ScriptProcessorNode,
-  'WaveShaperNode': WaveShaperNode,
+final web_audioBlinkMap = {
+  'AnalyserNode': () => AnalyserNode,
+  'AudioBuffer': () => AudioBuffer,
+  'AudioBufferSourceNode': () => AudioBufferSourceNode,
+  'AudioContext': () => AudioContext,
+  'AudioDestinationNode': () => AudioDestinationNode,
+  'AudioListener': () => AudioListener,
+  'AudioNode': () => AudioNode,
+  'AudioParam': () => AudioParam,
+  'AudioProcessingEvent': () => AudioProcessingEvent,
+  'AudioSourceNode': () => AudioSourceNode,
+  'BiquadFilterNode': () => BiquadFilterNode,
+  'ChannelMergerNode': () => ChannelMergerNode,
+  'ChannelSplitterNode': () => ChannelSplitterNode,
+  'ConvolverNode': () => ConvolverNode,
+  'DelayNode': () => DelayNode,
+  'DynamicsCompressorNode': () => DynamicsCompressorNode,
+  'GainNode': () => GainNode,
+  'MediaElementAudioSourceNode': () => MediaElementAudioSourceNode,
+  'MediaStreamAudioDestinationNode': () => MediaStreamAudioDestinationNode,
+  'MediaStreamAudioSourceNode': () => MediaStreamAudioSourceNode,
+  'OfflineAudioCompletionEvent': () => OfflineAudioCompletionEvent,
+  'OfflineAudioContext': () => OfflineAudioContext,
+  'OscillatorNode': () => OscillatorNode,
+  'PannerNode': () => PannerNode,
+  'PeriodicWave': () => PeriodicWave,
+  'ScriptProcessorNode': () => ScriptProcessorNode,
+  'WaveShaperNode': () => WaveShaperNode,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -62,51 +62,51 @@
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  int get fftSize => _blink.Native_AnalyserNode_fftSize_Getter(this);
+  int get fftSize => _blink.BlinkAnalyserNode.$fftSize_Getter(this);
 
   @DomName('AnalyserNode.fftSize')
   @DocsEditable()
-  void set fftSize(int value) => _blink.Native_AnalyserNode_fftSize_Setter(this, value);
+  void set fftSize(int value) => _blink.BlinkAnalyserNode.$fftSize_Setter(this, value);
 
   @DomName('AnalyserNode.frequencyBinCount')
   @DocsEditable()
-  int get frequencyBinCount => _blink.Native_AnalyserNode_frequencyBinCount_Getter(this);
+  int get frequencyBinCount => _blink.BlinkAnalyserNode.$frequencyBinCount_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  num get maxDecibels => _blink.Native_AnalyserNode_maxDecibels_Getter(this);
+  num get maxDecibels => _blink.BlinkAnalyserNode.$maxDecibels_Getter(this);
 
   @DomName('AnalyserNode.maxDecibels')
   @DocsEditable()
-  void set maxDecibels(num value) => _blink.Native_AnalyserNode_maxDecibels_Setter(this, value);
+  void set maxDecibels(num value) => _blink.BlinkAnalyserNode.$maxDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  num get minDecibels => _blink.Native_AnalyserNode_minDecibels_Getter(this);
+  num get minDecibels => _blink.BlinkAnalyserNode.$minDecibels_Getter(this);
 
   @DomName('AnalyserNode.minDecibels')
   @DocsEditable()
-  void set minDecibels(num value) => _blink.Native_AnalyserNode_minDecibels_Setter(this, value);
+  void set minDecibels(num value) => _blink.BlinkAnalyserNode.$minDecibels_Setter(this, value);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  num get smoothingTimeConstant => _blink.Native_AnalyserNode_smoothingTimeConstant_Getter(this);
+  num get smoothingTimeConstant => _blink.BlinkAnalyserNode.$smoothingTimeConstant_Getter(this);
 
   @DomName('AnalyserNode.smoothingTimeConstant')
   @DocsEditable()
-  void set smoothingTimeConstant(num value) => _blink.Native_AnalyserNode_smoothingTimeConstant_Setter(this, value);
+  void set smoothingTimeConstant(num value) => _blink.BlinkAnalyserNode.$smoothingTimeConstant_Setter(this, value);
 
   @DomName('AnalyserNode.getByteFrequencyData')
   @DocsEditable()
-  void getByteFrequencyData(Uint8List array) => _blink.Native_AnalyserNode_getByteFrequencyData_Callback(this, array);
+  void getByteFrequencyData(Uint8List array) => _blink.BlinkAnalyserNode.$getByteFrequencyData_Callback(this, array);
 
   @DomName('AnalyserNode.getByteTimeDomainData')
   @DocsEditable()
-  void getByteTimeDomainData(Uint8List array) => _blink.Native_AnalyserNode_getByteTimeDomainData_Callback(this, array);
+  void getByteTimeDomainData(Uint8List array) => _blink.BlinkAnalyserNode.$getByteTimeDomainData_Callback(this, array);
 
   @DomName('AnalyserNode.getFloatFrequencyData')
   @DocsEditable()
-  void getFloatFrequencyData(Float32List array) => _blink.Native_AnalyserNode_getFloatFrequencyData_Callback(this, array);
+  void getFloatFrequencyData(Float32List array) => _blink.BlinkAnalyserNode.$getFloatFrequencyData_Callback(this, array);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -126,23 +126,23 @@
 
   @DomName('AudioBuffer.duration')
   @DocsEditable()
-  double get duration => _blink.Native_AudioBuffer_duration_Getter(this);
+  double get duration => _blink.BlinkAudioBuffer.$duration_Getter(this);
 
   @DomName('AudioBuffer.length')
   @DocsEditable()
-  int get length => _blink.Native_AudioBuffer_length_Getter(this);
+  int get length => _blink.BlinkAudioBuffer.$length_Getter(this);
 
   @DomName('AudioBuffer.numberOfChannels')
   @DocsEditable()
-  int get numberOfChannels => _blink.Native_AudioBuffer_numberOfChannels_Getter(this);
+  int get numberOfChannels => _blink.BlinkAudioBuffer.$numberOfChannels_Getter(this);
 
   @DomName('AudioBuffer.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.Native_AudioBuffer_sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioBuffer.$sampleRate_Getter(this);
 
   @DomName('AudioBuffer.getChannelData')
   @DocsEditable()
-  Float32List getChannelData(int channelIndex) => _blink.Native_AudioBuffer_getChannelData_Callback(this, channelIndex);
+  Float32List getChannelData(int channelIndex) => _blink.BlinkAudioBuffer.$getChannelData_Callback(this, channelIndex);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -200,55 +200,55 @@
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.Native_AudioBufferSourceNode_buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkAudioBufferSourceNode.$buffer_Getter(this);
 
   @DomName('AudioBufferSourceNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.Native_AudioBufferSourceNode_buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkAudioBufferSourceNode.$buffer_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  bool get loop => _blink.Native_AudioBufferSourceNode_loop_Getter(this);
+  bool get loop => _blink.BlinkAudioBufferSourceNode.$loop_Getter(this);
 
   @DomName('AudioBufferSourceNode.loop')
   @DocsEditable()
-  void set loop(bool value) => _blink.Native_AudioBufferSourceNode_loop_Setter(this, value);
+  void set loop(bool value) => _blink.BlinkAudioBufferSourceNode.$loop_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  num get loopEnd => _blink.Native_AudioBufferSourceNode_loopEnd_Getter(this);
+  num get loopEnd => _blink.BlinkAudioBufferSourceNode.$loopEnd_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopEnd')
   @DocsEditable()
-  void set loopEnd(num value) => _blink.Native_AudioBufferSourceNode_loopEnd_Setter(this, value);
+  void set loopEnd(num value) => _blink.BlinkAudioBufferSourceNode.$loopEnd_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  num get loopStart => _blink.Native_AudioBufferSourceNode_loopStart_Getter(this);
+  num get loopStart => _blink.BlinkAudioBufferSourceNode.$loopStart_Getter(this);
 
   @DomName('AudioBufferSourceNode.loopStart')
   @DocsEditable()
-  void set loopStart(num value) => _blink.Native_AudioBufferSourceNode_loopStart_Setter(this, value);
+  void set loopStart(num value) => _blink.BlinkAudioBufferSourceNode.$loopStart_Setter(this, value);
 
   @DomName('AudioBufferSourceNode.playbackRate')
   @DocsEditable()
-  AudioParam get playbackRate => _blink.Native_AudioBufferSourceNode_playbackRate_Getter(this);
+  AudioParam get playbackRate => _blink.BlinkAudioBufferSourceNode.$playbackRate_Getter(this);
 
   @DomName('AudioBufferSourceNode.noteGrainOn')
   @DocsEditable()
-  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.Native_AudioBufferSourceNode_noteGrainOn_Callback(this, when, grainOffset, grainDuration);
+  void noteGrainOn(num when, num grainOffset, num grainDuration) => _blink.BlinkAudioBufferSourceNode.$noteGrainOn_Callback(this, when, grainOffset, grainDuration);
 
   @DomName('AudioBufferSourceNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) => _blink.Native_AudioBufferSourceNode_noteOff_Callback(this, when);
+  void noteOff(num when) => _blink.BlinkAudioBufferSourceNode.$noteOff_Callback(this, when);
 
   @DomName('AudioBufferSourceNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) => _blink.Native_AudioBufferSourceNode_noteOn_Callback(this, when);
+  void noteOn(num when) => _blink.BlinkAudioBufferSourceNode.$noteOn_Callback(this, when);
 
-  void start([num when, num grainOffset, num grainDuration]) => _blink.Native_AudioBufferSourceNode_start(this, when, grainOffset, grainDuration);
+  void start([num when, num grainOffset, num grainDuration]) => _blink.BlinkAudioBufferSourceNode.$start(this, when, grainOffset, grainDuration);
 
-  void stop([num when]) => _blink.Native_AudioBufferSourceNode_stop(this, when);
+  void stop([num when]) => _blink.BlinkAudioBufferSourceNode.$stop(this, when);
 
   /// Stream of `ended` events handled by this [AudioBufferSourceNode].
   @DomName('AudioBufferSourceNode.onended')
@@ -281,99 +281,99 @@
 
   @DomName('AudioContext.AudioContext')
   @DocsEditable()
-  factory AudioContext() => _blink.Native_AudioContext_AudioContext();
+  factory AudioContext() => _blink.BlinkAudioContext.$mkAudioContext();
 
   /// Checks if this type is supported on the current platform.
   static bool get supported => true;
 
   @DomName('AudioContext.currentTime')
   @DocsEditable()
-  double get currentTime => _blink.Native_AudioContext_currentTime_Getter(this);
+  double get currentTime => _blink.BlinkAudioContext.$currentTime_Getter(this);
 
   @DomName('AudioContext.destination')
   @DocsEditable()
-  AudioDestinationNode get destination => _blink.Native_AudioContext_destination_Getter(this);
+  AudioDestinationNode get destination => _blink.BlinkAudioContext.$destination_Getter(this);
 
   @DomName('AudioContext.listener')
   @DocsEditable()
-  AudioListener get listener => _blink.Native_AudioContext_listener_Getter(this);
+  AudioListener get listener => _blink.BlinkAudioContext.$listener_Getter(this);
 
   @DomName('AudioContext.sampleRate')
   @DocsEditable()
-  double get sampleRate => _blink.Native_AudioContext_sampleRate_Getter(this);
+  double get sampleRate => _blink.BlinkAudioContext.$sampleRate_Getter(this);
 
   @DomName('AudioContext.createAnalyser')
   @DocsEditable()
-  AnalyserNode createAnalyser() => _blink.Native_AudioContext_createAnalyser_Callback(this);
+  AnalyserNode createAnalyser() => _blink.BlinkAudioContext.$createAnalyser_Callback(this);
 
   @DomName('AudioContext.createBiquadFilter')
   @DocsEditable()
-  BiquadFilterNode createBiquadFilter() => _blink.Native_AudioContext_createBiquadFilter_Callback(this);
+  BiquadFilterNode createBiquadFilter() => _blink.BlinkAudioContext.$createBiquadFilter_Callback(this);
 
   @DomName('AudioContext.createBuffer')
   @DocsEditable()
-  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_AudioContext_createBuffer_Callback(this, numberOfChannels, numberOfFrames, sampleRate);
+  AudioBuffer createBuffer(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkAudioContext.$createBuffer_Callback(this, numberOfChannels, numberOfFrames, sampleRate);
 
   @DomName('AudioContext.createBufferSource')
   @DocsEditable()
-  AudioBufferSourceNode createBufferSource() => _blink.Native_AudioContext_createBufferSource_Callback(this);
+  AudioBufferSourceNode createBufferSource() => _blink.BlinkAudioContext.$createBufferSource_Callback(this);
 
-  ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.Native_AudioContext_createChannelMerger(this, numberOfInputs);
+  ChannelMergerNode createChannelMerger([int numberOfInputs]) => _blink.BlinkAudioContext.$createChannelMerger(this, numberOfInputs);
 
-  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.Native_AudioContext_createChannelSplitter(this, numberOfOutputs);
+  ChannelSplitterNode createChannelSplitter([int numberOfOutputs]) => _blink.BlinkAudioContext.$createChannelSplitter(this, numberOfOutputs);
 
   @DomName('AudioContext.createConvolver')
   @DocsEditable()
-  ConvolverNode createConvolver() => _blink.Native_AudioContext_createConvolver_Callback(this);
+  ConvolverNode createConvolver() => _blink.BlinkAudioContext.$createConvolver_Callback(this);
 
-  DelayNode createDelay([num maxDelayTime]) => _blink.Native_AudioContext_createDelay(this, maxDelayTime);
+  DelayNode createDelay([num maxDelayTime]) => _blink.BlinkAudioContext.$createDelay(this, maxDelayTime);
 
   @DomName('AudioContext.createDynamicsCompressor')
   @DocsEditable()
-  DynamicsCompressorNode createDynamicsCompressor() => _blink.Native_AudioContext_createDynamicsCompressor_Callback(this);
+  DynamicsCompressorNode createDynamicsCompressor() => _blink.BlinkAudioContext.$createDynamicsCompressor_Callback(this);
 
   @DomName('AudioContext.createGain')
   @DocsEditable()
-  GainNode createGain() => _blink.Native_AudioContext_createGain_Callback(this);
+  GainNode createGain() => _blink.BlinkAudioContext.$createGain_Callback(this);
 
   @DomName('AudioContext.createMediaElementSource')
   @DocsEditable()
-  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.Native_AudioContext_createMediaElementSource_Callback(this, mediaElement);
+  MediaElementAudioSourceNode createMediaElementSource(MediaElement mediaElement) => _blink.BlinkAudioContext.$createMediaElementSource_Callback(this, mediaElement);
 
   @DomName('AudioContext.createMediaStreamDestination')
   @DocsEditable()
-  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.Native_AudioContext_createMediaStreamDestination_Callback(this);
+  MediaStreamAudioDestinationNode createMediaStreamDestination() => _blink.BlinkAudioContext.$createMediaStreamDestination_Callback(this);
 
   @DomName('AudioContext.createMediaStreamSource')
   @DocsEditable()
-  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.Native_AudioContext_createMediaStreamSource_Callback(this, mediaStream);
+  MediaStreamAudioSourceNode createMediaStreamSource(MediaStream mediaStream) => _blink.BlinkAudioContext.$createMediaStreamSource_Callback(this, mediaStream);
 
   @DomName('AudioContext.createOscillator')
   @DocsEditable()
-  OscillatorNode createOscillator() => _blink.Native_AudioContext_createOscillator_Callback(this);
+  OscillatorNode createOscillator() => _blink.BlinkAudioContext.$createOscillator_Callback(this);
 
   @DomName('AudioContext.createPanner')
   @DocsEditable()
-  PannerNode createPanner() => _blink.Native_AudioContext_createPanner_Callback(this);
+  PannerNode createPanner() => _blink.BlinkAudioContext.$createPanner_Callback(this);
 
   @DomName('AudioContext.createPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.Native_AudioContext_createPeriodicWave_Callback(this, real, imag);
+  PeriodicWave createPeriodicWave(Float32List real, Float32List imag) => _blink.BlinkAudioContext.$createPeriodicWave_Callback(this, real, imag);
 
-  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.Native_AudioContext_createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
+  ScriptProcessorNode createScriptProcessor([int bufferSize, int numberOfInputChannels, int numberOfOutputChannels]) => _blink.BlinkAudioContext.$createScriptProcessor(this, bufferSize, numberOfInputChannels, numberOfOutputChannels);
 
   @DomName('AudioContext.createWaveShaper')
   @DocsEditable()
-  WaveShaperNode createWaveShaper() => _blink.Native_AudioContext_createWaveShaper_Callback(this);
+  WaveShaperNode createWaveShaper() => _blink.BlinkAudioContext.$createWaveShaper_Callback(this);
 
   @DomName('AudioContext.decodeAudioData')
   @DocsEditable()
-  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.Native_AudioContext_decodeAudioData_Callback(this, audioData, successCallback, errorCallback);
+  void _decodeAudioData(ByteBuffer audioData, AudioBufferCallback successCallback, [AudioBufferCallback errorCallback]) => _blink.BlinkAudioContext.$decodeAudioData_Callback(this, audioData, successCallback, errorCallback);
 
   @DomName('AudioContext.startRendering')
   @DocsEditable()
-  void startRendering() => _blink.Native_AudioContext_startRendering_Callback(this);
+  void startRendering() => _blink.BlinkAudioContext.$startRendering_Callback(this);
 
   /// Stream of `complete` events handled by this [AudioContext].
   @DomName('AudioContext.oncomplete')
@@ -412,7 +412,7 @@
 
   @DomName('AudioDestinationNode.maxChannelCount')
   @DocsEditable()
-  int get maxChannelCount => _blink.Native_AudioDestinationNode_maxChannelCount_Getter(this);
+  int get maxChannelCount => _blink.BlinkAudioDestinationNode.$maxChannelCount_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -432,31 +432,31 @@
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  num get dopplerFactor => _blink.Native_AudioListener_dopplerFactor_Getter(this);
+  num get dopplerFactor => _blink.BlinkAudioListener.$dopplerFactor_Getter(this);
 
   @DomName('AudioListener.dopplerFactor')
   @DocsEditable()
-  void set dopplerFactor(num value) => _blink.Native_AudioListener_dopplerFactor_Setter(this, value);
+  void set dopplerFactor(num value) => _blink.BlinkAudioListener.$dopplerFactor_Setter(this, value);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  num get speedOfSound => _blink.Native_AudioListener_speedOfSound_Getter(this);
+  num get speedOfSound => _blink.BlinkAudioListener.$speedOfSound_Getter(this);
 
   @DomName('AudioListener.speedOfSound')
   @DocsEditable()
-  void set speedOfSound(num value) => _blink.Native_AudioListener_speedOfSound_Setter(this, value);
+  void set speedOfSound(num value) => _blink.BlinkAudioListener.$speedOfSound_Setter(this, value);
 
   @DomName('AudioListener.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.Native_AudioListener_setOrientation_Callback(this, x, y, z, xUp, yUp, zUp);
+  void setOrientation(num x, num y, num z, num xUp, num yUp, num zUp) => _blink.BlinkAudioListener.$setOrientation_Callback(this, x, y, z, xUp, yUp, zUp);
 
   @DomName('AudioListener.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.Native_AudioListener_setPosition_Callback(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkAudioListener.$setPosition_Callback(this, x, y, z);
 
   @DomName('AudioListener.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.Native_AudioListener_setVelocity_Callback(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkAudioListener.$setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -473,45 +473,45 @@
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  int get channelCount => _blink.Native_AudioNode_channelCount_Getter(this);
+  int get channelCount => _blink.BlinkAudioNode.$channelCount_Getter(this);
 
   @DomName('AudioNode.channelCount')
   @DocsEditable()
-  void set channelCount(int value) => _blink.Native_AudioNode_channelCount_Setter(this, value);
+  void set channelCount(int value) => _blink.BlinkAudioNode.$channelCount_Setter(this, value);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  String get channelCountMode => _blink.Native_AudioNode_channelCountMode_Getter(this);
+  String get channelCountMode => _blink.BlinkAudioNode.$channelCountMode_Getter(this);
 
   @DomName('AudioNode.channelCountMode')
   @DocsEditable()
-  void set channelCountMode(String value) => _blink.Native_AudioNode_channelCountMode_Setter(this, value);
+  void set channelCountMode(String value) => _blink.BlinkAudioNode.$channelCountMode_Setter(this, value);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  String get channelInterpretation => _blink.Native_AudioNode_channelInterpretation_Getter(this);
+  String get channelInterpretation => _blink.BlinkAudioNode.$channelInterpretation_Getter(this);
 
   @DomName('AudioNode.channelInterpretation')
   @DocsEditable()
-  void set channelInterpretation(String value) => _blink.Native_AudioNode_channelInterpretation_Setter(this, value);
+  void set channelInterpretation(String value) => _blink.BlinkAudioNode.$channelInterpretation_Setter(this, value);
 
   @DomName('AudioNode.context')
   @DocsEditable()
-  AudioContext get context => _blink.Native_AudioNode_context_Getter(this);
+  AudioContext get context => _blink.BlinkAudioNode.$context_Getter(this);
 
   @DomName('AudioNode.numberOfInputs')
   @DocsEditable()
-  int get numberOfInputs => _blink.Native_AudioNode_numberOfInputs_Getter(this);
+  int get numberOfInputs => _blink.BlinkAudioNode.$numberOfInputs_Getter(this);
 
   @DomName('AudioNode.numberOfOutputs')
   @DocsEditable()
-  int get numberOfOutputs => _blink.Native_AudioNode_numberOfOutputs_Getter(this);
+  int get numberOfOutputs => _blink.BlinkAudioNode.$numberOfOutputs_Getter(this);
 
-  void _connect(destination, int output, [int input]) => _blink.Native_AudioNode__connect(this, destination, output, input);
+  void _connect(destination, int output, [int input]) => _blink.BlinkAudioNode.$_connect(this, destination, output, input);
 
   @DomName('AudioNode.disconnect')
   @DocsEditable()
-  void disconnect(int output) => _blink.Native_AudioNode_disconnect_Callback(this, output);
+  void disconnect(int output) => _blink.BlinkAudioNode.$disconnect_Callback(this, output);
 
   @DomName('AudioNode.connect')
   void connectNode(AudioNode destination, [int output = 0, int input = 0]) =>
@@ -538,55 +538,55 @@
 
   @DomName('AudioParam.defaultValue')
   @DocsEditable()
-  double get defaultValue => _blink.Native_AudioParam_defaultValue_Getter(this);
+  double get defaultValue => _blink.BlinkAudioParam.$defaultValue_Getter(this);
 
   @DomName('AudioParam.maxValue')
   @DocsEditable()
-  double get maxValue => _blink.Native_AudioParam_maxValue_Getter(this);
+  double get maxValue => _blink.BlinkAudioParam.$maxValue_Getter(this);
 
   @DomName('AudioParam.minValue')
   @DocsEditable()
-  double get minValue => _blink.Native_AudioParam_minValue_Getter(this);
+  double get minValue => _blink.BlinkAudioParam.$minValue_Getter(this);
 
   @DomName('AudioParam.name')
   @DocsEditable()
-  String get name => _blink.Native_AudioParam_name_Getter(this);
+  String get name => _blink.BlinkAudioParam.$name_Getter(this);
 
   @DomName('AudioParam.units')
   @DocsEditable()
-  int get units => _blink.Native_AudioParam_units_Getter(this);
+  int get units => _blink.BlinkAudioParam.$units_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  num get value => _blink.Native_AudioParam_value_Getter(this);
+  num get value => _blink.BlinkAudioParam.$value_Getter(this);
 
   @DomName('AudioParam.value')
   @DocsEditable()
-  void set value(num value) => _blink.Native_AudioParam_value_Setter(this, value);
+  void set value(num value) => _blink.BlinkAudioParam.$value_Setter(this, value);
 
   @DomName('AudioParam.cancelScheduledValues')
   @DocsEditable()
-  void cancelScheduledValues(num startTime) => _blink.Native_AudioParam_cancelScheduledValues_Callback(this, startTime);
+  void cancelScheduledValues(num startTime) => _blink.BlinkAudioParam.$cancelScheduledValues_Callback(this, startTime);
 
   @DomName('AudioParam.exponentialRampToValueAtTime')
   @DocsEditable()
-  void exponentialRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_exponentialRampToValueAtTime_Callback(this, value, time);
+  void exponentialRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.$exponentialRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.linearRampToValueAtTime')
   @DocsEditable()
-  void linearRampToValueAtTime(num value, num time) => _blink.Native_AudioParam_linearRampToValueAtTime_Callback(this, value, time);
+  void linearRampToValueAtTime(num value, num time) => _blink.BlinkAudioParam.$linearRampToValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setTargetAtTime')
   @DocsEditable()
-  void setTargetAtTime(num target, num time, num timeConstant) => _blink.Native_AudioParam_setTargetAtTime_Callback(this, target, time, timeConstant);
+  void setTargetAtTime(num target, num time, num timeConstant) => _blink.BlinkAudioParam.$setTargetAtTime_Callback(this, target, time, timeConstant);
 
   @DomName('AudioParam.setValueAtTime')
   @DocsEditable()
-  void setValueAtTime(num value, num time) => _blink.Native_AudioParam_setValueAtTime_Callback(this, value, time);
+  void setValueAtTime(num value, num time) => _blink.BlinkAudioParam.$setValueAtTime_Callback(this, value, time);
 
   @DomName('AudioParam.setValueCurveAtTime')
   @DocsEditable()
-  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.Native_AudioParam_setValueCurveAtTime_Callback(this, values, time, duration);
+  void setValueCurveAtTime(Float32List values, num time, num duration) => _blink.BlinkAudioParam.$setValueCurveAtTime_Callback(this, values, time, duration);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -606,11 +606,11 @@
 
   @DomName('AudioProcessingEvent.inputBuffer')
   @DocsEditable()
-  AudioBuffer get inputBuffer => _blink.Native_AudioProcessingEvent_inputBuffer_Getter(this);
+  AudioBuffer get inputBuffer => _blink.BlinkAudioProcessingEvent.$inputBuffer_Getter(this);
 
   @DomName('AudioProcessingEvent.outputBuffer')
   @DocsEditable()
-  AudioBuffer get outputBuffer => _blink.Native_AudioProcessingEvent_outputBuffer_Getter(this);
+  AudioBuffer get outputBuffer => _blink.BlinkAudioProcessingEvent.$outputBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -678,31 +678,31 @@
 
   @DomName('BiquadFilterNode.Q')
   @DocsEditable()
-  AudioParam get Q => _blink.Native_BiquadFilterNode_Q_Getter(this);
+  AudioParam get Q => _blink.BlinkBiquadFilterNode.$Q_Getter(this);
 
   @DomName('BiquadFilterNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.Native_BiquadFilterNode_detune_Getter(this);
+  AudioParam get detune => _blink.BlinkBiquadFilterNode.$detune_Getter(this);
 
   @DomName('BiquadFilterNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.Native_BiquadFilterNode_frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkBiquadFilterNode.$frequency_Getter(this);
 
   @DomName('BiquadFilterNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.Native_BiquadFilterNode_gain_Getter(this);
+  AudioParam get gain => _blink.BlinkBiquadFilterNode.$gain_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  String get type => _blink.Native_BiquadFilterNode_type_Getter(this);
+  String get type => _blink.BlinkBiquadFilterNode.$type_Getter(this);
 
   @DomName('BiquadFilterNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_BiquadFilterNode_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkBiquadFilterNode.$type_Setter(this, value);
 
   @DomName('BiquadFilterNode.getFrequencyResponse')
   @DocsEditable()
-  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.Native_BiquadFilterNode_getFrequencyResponse_Callback(this, frequencyHz, magResponse, phaseResponse);
+  void getFrequencyResponse(Float32List frequencyHz, Float32List magResponse, Float32List phaseResponse) => _blink.BlinkBiquadFilterNode.$getFrequencyResponse_Callback(this, frequencyHz, magResponse, phaseResponse);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -754,19 +754,19 @@
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  AudioBuffer get buffer => _blink.Native_ConvolverNode_buffer_Getter(this);
+  AudioBuffer get buffer => _blink.BlinkConvolverNode.$buffer_Getter(this);
 
   @DomName('ConvolverNode.buffer')
   @DocsEditable()
-  void set buffer(AudioBuffer value) => _blink.Native_ConvolverNode_buffer_Setter(this, value);
+  void set buffer(AudioBuffer value) => _blink.BlinkConvolverNode.$buffer_Setter(this, value);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  bool get normalize => _blink.Native_ConvolverNode_normalize_Getter(this);
+  bool get normalize => _blink.BlinkConvolverNode.$normalize_Getter(this);
 
   @DomName('ConvolverNode.normalize')
   @DocsEditable()
-  void set normalize(bool value) => _blink.Native_ConvolverNode_normalize_Setter(this, value);
+  void set normalize(bool value) => _blink.BlinkConvolverNode.$normalize_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -786,7 +786,7 @@
 
   @DomName('DelayNode.delayTime')
   @DocsEditable()
-  AudioParam get delayTime => _blink.Native_DelayNode_delayTime_Getter(this);
+  AudioParam get delayTime => _blink.BlinkDelayNode.$delayTime_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -806,27 +806,27 @@
 
   @DomName('DynamicsCompressorNode.attack')
   @DocsEditable()
-  AudioParam get attack => _blink.Native_DynamicsCompressorNode_attack_Getter(this);
+  AudioParam get attack => _blink.BlinkDynamicsCompressorNode.$attack_Getter(this);
 
   @DomName('DynamicsCompressorNode.knee')
   @DocsEditable()
-  AudioParam get knee => _blink.Native_DynamicsCompressorNode_knee_Getter(this);
+  AudioParam get knee => _blink.BlinkDynamicsCompressorNode.$knee_Getter(this);
 
   @DomName('DynamicsCompressorNode.ratio')
   @DocsEditable()
-  AudioParam get ratio => _blink.Native_DynamicsCompressorNode_ratio_Getter(this);
+  AudioParam get ratio => _blink.BlinkDynamicsCompressorNode.$ratio_Getter(this);
 
   @DomName('DynamicsCompressorNode.reduction')
   @DocsEditable()
-  AudioParam get reduction => _blink.Native_DynamicsCompressorNode_reduction_Getter(this);
+  AudioParam get reduction => _blink.BlinkDynamicsCompressorNode.$reduction_Getter(this);
 
   @DomName('DynamicsCompressorNode.release')
   @DocsEditable()
-  AudioParam get release => _blink.Native_DynamicsCompressorNode_release_Getter(this);
+  AudioParam get release => _blink.BlinkDynamicsCompressorNode.$release_Getter(this);
 
   @DomName('DynamicsCompressorNode.threshold')
   @DocsEditable()
-  AudioParam get threshold => _blink.Native_DynamicsCompressorNode_threshold_Getter(this);
+  AudioParam get threshold => _blink.BlinkDynamicsCompressorNode.$threshold_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -846,7 +846,7 @@
 
   @DomName('GainNode.gain')
   @DocsEditable()
-  AudioParam get gain => _blink.Native_GainNode_gain_Getter(this);
+  AudioParam get gain => _blink.BlinkGainNode.$gain_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -867,7 +867,7 @@
   @DomName('MediaElementAudioSourceNode.mediaElement')
   @DocsEditable()
   @Experimental() // non-standard
-  MediaElement get mediaElement => _blink.Native_MediaElementAudioSourceNode_mediaElement_Getter(this);
+  MediaElement get mediaElement => _blink.BlinkMediaElementAudioSourceNode.$mediaElement_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -887,7 +887,7 @@
 
   @DomName('MediaStreamAudioDestinationNode.stream')
   @DocsEditable()
-  MediaStream get stream => _blink.Native_MediaStreamAudioDestinationNode_stream_Getter(this);
+  MediaStream get stream => _blink.BlinkMediaStreamAudioDestinationNode.$stream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -907,7 +907,7 @@
 
   @DomName('MediaStreamAudioSourceNode.mediaStream')
   @DocsEditable()
-  MediaStream get mediaStream => _blink.Native_MediaStreamAudioSourceNode_mediaStream_Getter(this);
+  MediaStream get mediaStream => _blink.BlinkMediaStreamAudioSourceNode.$mediaStream_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -927,7 +927,7 @@
 
   @DomName('OfflineAudioCompletionEvent.renderedBuffer')
   @DocsEditable()
-  AudioBuffer get renderedBuffer => _blink.Native_OfflineAudioCompletionEvent_renderedBuffer_Getter(this);
+  AudioBuffer get renderedBuffer => _blink.BlinkOfflineAudioCompletionEvent.$renderedBuffer_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -947,7 +947,7 @@
 
   @DomName('OfflineAudioContext.OfflineAudioContext')
   @DocsEditable()
-  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.Native_OfflineAudioContext_OfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
+  factory OfflineAudioContext(int numberOfChannels, int numberOfFrames, num sampleRate) => _blink.BlinkOfflineAudioContext.$mkOfflineAudioContext(numberOfChannels, numberOfFrames, sampleRate);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -994,36 +994,36 @@
 
   @DomName('OscillatorNode.detune')
   @DocsEditable()
-  AudioParam get detune => _blink.Native_OscillatorNode_detune_Getter(this);
+  AudioParam get detune => _blink.BlinkOscillatorNode.$detune_Getter(this);
 
   @DomName('OscillatorNode.frequency')
   @DocsEditable()
-  AudioParam get frequency => _blink.Native_OscillatorNode_frequency_Getter(this);
+  AudioParam get frequency => _blink.BlinkOscillatorNode.$frequency_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  String get type => _blink.Native_OscillatorNode_type_Getter(this);
+  String get type => _blink.BlinkOscillatorNode.$type_Getter(this);
 
   @DomName('OscillatorNode.type')
   @DocsEditable()
-  void set type(String value) => _blink.Native_OscillatorNode_type_Setter(this, value);
+  void set type(String value) => _blink.BlinkOscillatorNode.$type_Setter(this, value);
 
   @DomName('OscillatorNode.noteOff')
   @DocsEditable()
-  void noteOff(num when) => _blink.Native_OscillatorNode_noteOff_Callback(this, when);
+  void noteOff(num when) => _blink.BlinkOscillatorNode.$noteOff_Callback(this, when);
 
   @DomName('OscillatorNode.noteOn')
   @DocsEditable()
-  void noteOn(num when) => _blink.Native_OscillatorNode_noteOn_Callback(this, when);
+  void noteOn(num when) => _blink.BlinkOscillatorNode.$noteOn_Callback(this, when);
 
   @DomName('OscillatorNode.setPeriodicWave')
   @DocsEditable()
   @Experimental() // untriaged
-  void setPeriodicWave(PeriodicWave periodicWave) => _blink.Native_OscillatorNode_setPeriodicWave_Callback(this, periodicWave);
+  void setPeriodicWave(PeriodicWave periodicWave) => _blink.BlinkOscillatorNode.$setPeriodicWave_Callback(this, periodicWave);
 
-  void start([num when]) => _blink.Native_OscillatorNode_start(this, when);
+  void start([num when]) => _blink.BlinkOscillatorNode.$start(this, when);
 
-  void stop([num when]) => _blink.Native_OscillatorNode_stop(this, when);
+  void stop([num when]) => _blink.BlinkOscillatorNode.$stop(this, when);
 
   /// Stream of `ended` events handled by this [OscillatorNode].
   @DomName('OscillatorNode.onended')
@@ -1049,79 +1049,79 @@
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  num get coneInnerAngle => _blink.Native_PannerNode_coneInnerAngle_Getter(this);
+  num get coneInnerAngle => _blink.BlinkPannerNode.$coneInnerAngle_Getter(this);
 
   @DomName('PannerNode.coneInnerAngle')
   @DocsEditable()
-  void set coneInnerAngle(num value) => _blink.Native_PannerNode_coneInnerAngle_Setter(this, value);
+  void set coneInnerAngle(num value) => _blink.BlinkPannerNode.$coneInnerAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  num get coneOuterAngle => _blink.Native_PannerNode_coneOuterAngle_Getter(this);
+  num get coneOuterAngle => _blink.BlinkPannerNode.$coneOuterAngle_Getter(this);
 
   @DomName('PannerNode.coneOuterAngle')
   @DocsEditable()
-  void set coneOuterAngle(num value) => _blink.Native_PannerNode_coneOuterAngle_Setter(this, value);
+  void set coneOuterAngle(num value) => _blink.BlinkPannerNode.$coneOuterAngle_Setter(this, value);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  num get coneOuterGain => _blink.Native_PannerNode_coneOuterGain_Getter(this);
+  num get coneOuterGain => _blink.BlinkPannerNode.$coneOuterGain_Getter(this);
 
   @DomName('PannerNode.coneOuterGain')
   @DocsEditable()
-  void set coneOuterGain(num value) => _blink.Native_PannerNode_coneOuterGain_Setter(this, value);
+  void set coneOuterGain(num value) => _blink.BlinkPannerNode.$coneOuterGain_Setter(this, value);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  String get distanceModel => _blink.Native_PannerNode_distanceModel_Getter(this);
+  String get distanceModel => _blink.BlinkPannerNode.$distanceModel_Getter(this);
 
   @DomName('PannerNode.distanceModel')
   @DocsEditable()
-  void set distanceModel(String value) => _blink.Native_PannerNode_distanceModel_Setter(this, value);
+  void set distanceModel(String value) => _blink.BlinkPannerNode.$distanceModel_Setter(this, value);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  num get maxDistance => _blink.Native_PannerNode_maxDistance_Getter(this);
+  num get maxDistance => _blink.BlinkPannerNode.$maxDistance_Getter(this);
 
   @DomName('PannerNode.maxDistance')
   @DocsEditable()
-  void set maxDistance(num value) => _blink.Native_PannerNode_maxDistance_Setter(this, value);
+  void set maxDistance(num value) => _blink.BlinkPannerNode.$maxDistance_Setter(this, value);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  String get panningModel => _blink.Native_PannerNode_panningModel_Getter(this);
+  String get panningModel => _blink.BlinkPannerNode.$panningModel_Getter(this);
 
   @DomName('PannerNode.panningModel')
   @DocsEditable()
-  void set panningModel(String value) => _blink.Native_PannerNode_panningModel_Setter(this, value);
+  void set panningModel(String value) => _blink.BlinkPannerNode.$panningModel_Setter(this, value);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  num get refDistance => _blink.Native_PannerNode_refDistance_Getter(this);
+  num get refDistance => _blink.BlinkPannerNode.$refDistance_Getter(this);
 
   @DomName('PannerNode.refDistance')
   @DocsEditable()
-  void set refDistance(num value) => _blink.Native_PannerNode_refDistance_Setter(this, value);
+  void set refDistance(num value) => _blink.BlinkPannerNode.$refDistance_Setter(this, value);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  num get rolloffFactor => _blink.Native_PannerNode_rolloffFactor_Getter(this);
+  num get rolloffFactor => _blink.BlinkPannerNode.$rolloffFactor_Getter(this);
 
   @DomName('PannerNode.rolloffFactor')
   @DocsEditable()
-  void set rolloffFactor(num value) => _blink.Native_PannerNode_rolloffFactor_Setter(this, value);
+  void set rolloffFactor(num value) => _blink.BlinkPannerNode.$rolloffFactor_Setter(this, value);
 
   @DomName('PannerNode.setOrientation')
   @DocsEditable()
-  void setOrientation(num x, num y, num z) => _blink.Native_PannerNode_setOrientation_Callback(this, x, y, z);
+  void setOrientation(num x, num y, num z) => _blink.BlinkPannerNode.$setOrientation_Callback(this, x, y, z);
 
   @DomName('PannerNode.setPosition')
   @DocsEditable()
-  void setPosition(num x, num y, num z) => _blink.Native_PannerNode_setPosition_Callback(this, x, y, z);
+  void setPosition(num x, num y, num z) => _blink.BlinkPannerNode.$setPosition_Callback(this, x, y, z);
 
   @DomName('PannerNode.setVelocity')
   @DocsEditable()
-  void setVelocity(num x, num y, num z) => _blink.Native_PannerNode_setVelocity_Callback(this, x, y, z);
+  void setVelocity(num x, num y, num z) => _blink.BlinkPannerNode.$setVelocity_Callback(this, x, y, z);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1167,12 +1167,12 @@
 
   @DomName('ScriptProcessorNode.bufferSize')
   @DocsEditable()
-  int get bufferSize => _blink.Native_ScriptProcessorNode_bufferSize_Getter(this);
+  int get bufferSize => _blink.BlinkScriptProcessorNode.$bufferSize_Getter(this);
 
   @DomName('ScriptProcessorNode._setEventListener')
   @DocsEditable()
   @Experimental() // non-standard
-  void _setEventListener(EventListener eventListener) => _blink.Native_ScriptProcessorNode__setEventListener_Callback(this, eventListener);
+  void _setEventListener(EventListener eventListener) => _blink.BlinkScriptProcessorNode.$_setEventListener_Callback(this, eventListener);
 
   /// Stream of `audioprocess` events handled by this [ScriptProcessorNode].
 /**
@@ -1205,18 +1205,18 @@
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  Float32List get curve => _blink.Native_WaveShaperNode_curve_Getter(this);
+  Float32List get curve => _blink.BlinkWaveShaperNode.$curve_Getter(this);
 
   @DomName('WaveShaperNode.curve')
   @DocsEditable()
-  void set curve(Float32List value) => _blink.Native_WaveShaperNode_curve_Setter(this, value);
+  void set curve(Float32List value) => _blink.BlinkWaveShaperNode.$curve_Setter(this, value);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  String get oversample => _blink.Native_WaveShaperNode_oversample_Getter(this);
+  String get oversample => _blink.BlinkWaveShaperNode.$oversample_Getter(this);
 
   @DomName('WaveShaperNode.oversample')
   @DocsEditable()
-  void set oversample(String value) => _blink.Native_WaveShaperNode_oversample_Setter(this, value);
+  void set oversample(String value) => _blink.BlinkWaveShaperNode.$oversample_Setter(this, value);
 
 }
diff --git a/sdk/lib/web_gl/dartium/web_gl_dartium.dart b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
index 2c2de6c..f1ed131 100644
--- a/sdk/lib/web_gl/dartium/web_gl_dartium.dart
+++ b/sdk/lib/web_gl/dartium/web_gl_dartium.dart
@@ -16,38 +16,38 @@
 
 
 // FIXME: Can we make this private?
-const web_glBlinkMap = const {
-  'ANGLEInstancedArrays': AngleInstancedArrays,
-  'EXTFragDepth': ExtFragDepth,
-  'EXTTextureFilterAnisotropic': ExtTextureFilterAnisotropic,
-  'OESElementIndexUint': OesElementIndexUint,
-  'OESStandardDerivatives': OesStandardDerivatives,
-  'OESTextureFloat': OesTextureFloat,
-  'OESTextureFloatLinear': OesTextureFloatLinear,
-  'OESTextureHalfFloat': OesTextureHalfFloat,
-  'OESTextureHalfFloatLinear': OesTextureHalfFloatLinear,
-  'OESVertexArrayObject': OesVertexArrayObject,
-  'WebGLActiveInfo': ActiveInfo,
-  'WebGLBuffer': Buffer,
-  'WebGLCompressedTextureATC': CompressedTextureAtc,
-  'WebGLCompressedTexturePVRTC': CompressedTexturePvrtc,
-  'WebGLCompressedTextureS3TC': CompressedTextureS3TC,
-  'WebGLContextAttributes': ContextAttributes,
-  'WebGLContextEvent': ContextEvent,
-  'WebGLDebugRendererInfo': DebugRendererInfo,
-  'WebGLDebugShaders': DebugShaders,
-  'WebGLDepthTexture': DepthTexture,
-  'WebGLDrawBuffers': DrawBuffers,
-  'WebGLFramebuffer': Framebuffer,
-  'WebGLLoseContext': LoseContext,
-  'WebGLProgram': Program,
-  'WebGLRenderbuffer': Renderbuffer,
-  'WebGLRenderingContext': RenderingContext,
-  'WebGLShader': Shader,
-  'WebGLShaderPrecisionFormat': ShaderPrecisionFormat,
-  'WebGLTexture': Texture,
-  'WebGLUniformLocation': UniformLocation,
-  'WebGLVertexArrayObjectOES': VertexArrayObject,
+final web_glBlinkMap = {
+  'ANGLEInstancedArrays': () => AngleInstancedArrays,
+  'EXTFragDepth': () => ExtFragDepth,
+  'EXTTextureFilterAnisotropic': () => ExtTextureFilterAnisotropic,
+  'OESElementIndexUint': () => OesElementIndexUint,
+  'OESStandardDerivatives': () => OesStandardDerivatives,
+  'OESTextureFloat': () => OesTextureFloat,
+  'OESTextureFloatLinear': () => OesTextureFloatLinear,
+  'OESTextureHalfFloat': () => OesTextureHalfFloat,
+  'OESTextureHalfFloatLinear': () => OesTextureHalfFloatLinear,
+  'OESVertexArrayObject': () => OesVertexArrayObject,
+  'WebGLActiveInfo': () => ActiveInfo,
+  'WebGLBuffer': () => Buffer,
+  'WebGLCompressedTextureATC': () => CompressedTextureAtc,
+  'WebGLCompressedTexturePVRTC': () => CompressedTexturePvrtc,
+  'WebGLCompressedTextureS3TC': () => CompressedTextureS3TC,
+  'WebGLContextAttributes': () => ContextAttributes,
+  'WebGLContextEvent': () => ContextEvent,
+  'WebGLDebugRendererInfo': () => DebugRendererInfo,
+  'WebGLDebugShaders': () => DebugShaders,
+  'WebGLDepthTexture': () => DepthTexture,
+  'WebGLDrawBuffers': () => DrawBuffers,
+  'WebGLFramebuffer': () => Framebuffer,
+  'WebGLLoseContext': () => LoseContext,
+  'WebGLProgram': () => Program,
+  'WebGLRenderbuffer': () => Renderbuffer,
+  'WebGLRenderingContext': () => RenderingContext,
+  'WebGLShader': () => Shader,
+  'WebGLShaderPrecisionFormat': () => ShaderPrecisionFormat,
+  'WebGLTexture': () => Texture,
+  'WebGLUniformLocation': () => UniformLocation,
+  'WebGLVertexArrayObjectOES': () => VertexArrayObject,
 
 };
 // Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
@@ -367,15 +367,15 @@
 
   @DomName('WebGLActiveInfo.name')
   @DocsEditable()
-  String get name => _blink.Native_WebGLActiveInfo_name_Getter(this);
+  String get name => _blink.BlinkWebGLActiveInfo.$name_Getter(this);
 
   @DomName('WebGLActiveInfo.size')
   @DocsEditable()
-  int get size => _blink.Native_WebGLActiveInfo_size_Getter(this);
+  int get size => _blink.BlinkWebGLActiveInfo.$size_Getter(this);
 
   @DomName('WebGLActiveInfo.type')
   @DocsEditable()
-  int get type => _blink.Native_WebGLActiveInfo_type_Getter(this);
+  int get type => _blink.BlinkWebGLActiveInfo.$type_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -400,17 +400,17 @@
   @DomName('ANGLEInstancedArrays.drawArraysInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.Native_ANGLEInstancedArrays_drawArraysInstancedANGLE_Callback(this, mode, first, count, primcount);
+  void drawArraysInstancedAngle(int mode, int first, int count, int primcount) => _blink.BlinkANGLEInstancedArrays.$drawArraysInstancedANGLE_Callback(this, mode, first, count, primcount);
 
   @DomName('ANGLEInstancedArrays.drawElementsInstancedANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.Native_ANGLEInstancedArrays_drawElementsInstancedANGLE_Callback(this, mode, count, type, offset, primcount);
+  void drawElementsInstancedAngle(int mode, int count, int type, int offset, int primcount) => _blink.BlinkANGLEInstancedArrays.$drawElementsInstancedANGLE_Callback(this, mode, count, type, offset, primcount);
 
   @DomName('ANGLEInstancedArrays.vertexAttribDivisorANGLE')
   @DocsEditable()
   @Experimental() // untriaged
-  void vertexAttribDivisorAngle(int index, int divisor) => _blink.Native_ANGLEInstancedArrays_vertexAttribDivisorANGLE_Callback(this, index, divisor);
+  void vertexAttribDivisorAngle(int index, int divisor) => _blink.BlinkANGLEInstancedArrays.$vertexAttribDivisorANGLE_Callback(this, index, divisor);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -558,61 +558,61 @@
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  bool get alpha => _blink.Native_WebGLContextAttributes_alpha_Getter(this);
+  bool get alpha => _blink.BlinkWebGLContextAttributes.$alpha_Getter(this);
 
   @DomName('WebGLContextAttributes.alpha')
   @DocsEditable()
-  void set alpha(bool value) => _blink.Native_WebGLContextAttributes_alpha_Setter(this, value);
+  void set alpha(bool value) => _blink.BlinkWebGLContextAttributes.$alpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  bool get antialias => _blink.Native_WebGLContextAttributes_antialias_Getter(this);
+  bool get antialias => _blink.BlinkWebGLContextAttributes.$antialias_Getter(this);
 
   @DomName('WebGLContextAttributes.antialias')
   @DocsEditable()
-  void set antialias(bool value) => _blink.Native_WebGLContextAttributes_antialias_Setter(this, value);
+  void set antialias(bool value) => _blink.BlinkWebGLContextAttributes.$antialias_Setter(this, value);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  bool get depth => _blink.Native_WebGLContextAttributes_depth_Getter(this);
+  bool get depth => _blink.BlinkWebGLContextAttributes.$depth_Getter(this);
 
   @DomName('WebGLContextAttributes.depth')
   @DocsEditable()
-  void set depth(bool value) => _blink.Native_WebGLContextAttributes_depth_Setter(this, value);
+  void set depth(bool value) => _blink.BlinkWebGLContextAttributes.$depth_Setter(this, value);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  bool get failIfMajorPerformanceCaveat => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Getter(this);
+  bool get failIfMajorPerformanceCaveat => _blink.BlinkWebGLContextAttributes.$failIfMajorPerformanceCaveat_Getter(this);
 
   @DomName('WebGLContextAttributes.failIfMajorPerformanceCaveat')
   @DocsEditable()
   @Experimental() // untriaged
-  void set failIfMajorPerformanceCaveat(bool value) => _blink.Native_WebGLContextAttributes_failIfMajorPerformanceCaveat_Setter(this, value);
+  void set failIfMajorPerformanceCaveat(bool value) => _blink.BlinkWebGLContextAttributes.$failIfMajorPerformanceCaveat_Setter(this, value);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  bool get premultipliedAlpha => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Getter(this);
+  bool get premultipliedAlpha => _blink.BlinkWebGLContextAttributes.$premultipliedAlpha_Getter(this);
 
   @DomName('WebGLContextAttributes.premultipliedAlpha')
   @DocsEditable()
-  void set premultipliedAlpha(bool value) => _blink.Native_WebGLContextAttributes_premultipliedAlpha_Setter(this, value);
+  void set premultipliedAlpha(bool value) => _blink.BlinkWebGLContextAttributes.$premultipliedAlpha_Setter(this, value);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  bool get preserveDrawingBuffer => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Getter(this);
+  bool get preserveDrawingBuffer => _blink.BlinkWebGLContextAttributes.$preserveDrawingBuffer_Getter(this);
 
   @DomName('WebGLContextAttributes.preserveDrawingBuffer')
   @DocsEditable()
-  void set preserveDrawingBuffer(bool value) => _blink.Native_WebGLContextAttributes_preserveDrawingBuffer_Setter(this, value);
+  void set preserveDrawingBuffer(bool value) => _blink.BlinkWebGLContextAttributes.$preserveDrawingBuffer_Setter(this, value);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  bool get stencil => _blink.Native_WebGLContextAttributes_stencil_Getter(this);
+  bool get stencil => _blink.BlinkWebGLContextAttributes.$stencil_Getter(this);
 
   @DomName('WebGLContextAttributes.stencil')
   @DocsEditable()
-  void set stencil(bool value) => _blink.Native_WebGLContextAttributes_stencil_Setter(this, value);
+  void set stencil(bool value) => _blink.BlinkWebGLContextAttributes.$stencil_Setter(this, value);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -631,7 +631,7 @@
 
   @DomName('WebGLContextEvent.statusMessage')
   @DocsEditable()
-  String get statusMessage => _blink.Native_WebGLContextEvent_statusMessage_Getter(this);
+  String get statusMessage => _blink.BlinkWebGLContextEvent.$statusMessage_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -675,7 +675,7 @@
 
   @DomName('WebGLDebugShaders.getTranslatedShaderSource')
   @DocsEditable()
-  String getTranslatedShaderSource(Shader shader) => _blink.Native_WebGLDebugShaders_getTranslatedShaderSource_Callback(this, shader);
+  String getTranslatedShaderSource(Shader shader) => _blink.BlinkWebGLDebugShaders.$getTranslatedShaderSource_Callback(this, shader);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -851,7 +851,7 @@
 
   @DomName('WebGLDrawBuffers.drawBuffersWEBGL')
   @DocsEditable()
-  void drawBuffersWebgl(List<int> buffers) => _blink.Native_WebGLDrawBuffers_drawBuffersWEBGL_Callback(this, buffers);
+  void drawBuffersWebgl(List<int> buffers) => _blink.BlinkWebGLDrawBuffers.$drawBuffersWEBGL_Callback(this, buffers);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -926,11 +926,11 @@
 
   @DomName('WebGLLoseContext.loseContext')
   @DocsEditable()
-  void loseContext() => _blink.Native_WebGLLoseContext_loseContext_Callback(this);
+  void loseContext() => _blink.BlinkWebGLLoseContext.$loseContext_Callback(this);
 
   @DomName('WebGLLoseContext.restoreContext')
   @DocsEditable()
-  void restoreContext() => _blink.Native_WebGLLoseContext_restoreContext_Callback(this);
+  void restoreContext() => _blink.BlinkWebGLLoseContext.$restoreContext_Callback(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -1058,19 +1058,19 @@
 
   @DomName('OESVertexArrayObject.bindVertexArrayOES')
   @DocsEditable()
-  void bindVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_bindVertexArrayOES_Callback(this, arrayObject);
+  void bindVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$bindVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.createVertexArrayOES')
   @DocsEditable()
-  VertexArrayObject createVertexArray() => _blink.Native_OESVertexArrayObject_createVertexArrayOES_Callback(this);
+  VertexArrayObject createVertexArray() => _blink.BlinkOESVertexArrayObject.$createVertexArrayOES_Callback(this);
 
   @DomName('OESVertexArrayObject.deleteVertexArrayOES')
   @DocsEditable()
-  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_deleteVertexArrayOES_Callback(this, arrayObject);
+  void deleteVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$deleteVertexArrayOES_Callback(this, arrayObject);
 
   @DomName('OESVertexArrayObject.isVertexArrayOES')
   @DocsEditable()
-  bool isVertexArray(VertexArrayObject arrayObject) => _blink.Native_OESVertexArrayObject_isVertexArrayOES_Callback(this, arrayObject);
+  bool isVertexArray(VertexArrayObject arrayObject) => _blink.BlinkOESVertexArrayObject.$isVertexArrayOES_Callback(this, arrayObject);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -2302,595 +2302,595 @@
 
   @DomName('WebGLRenderingContext.drawingBufferHeight')
   @DocsEditable()
-  int get drawingBufferHeight => _blink.Native_WebGLRenderingContext_drawingBufferHeight_Getter(this);
+  int get drawingBufferHeight => _blink.BlinkWebGLRenderingContext.$drawingBufferHeight_Getter(this);
 
   @DomName('WebGLRenderingContext.drawingBufferWidth')
   @DocsEditable()
-  int get drawingBufferWidth => _blink.Native_WebGLRenderingContext_drawingBufferWidth_Getter(this);
+  int get drawingBufferWidth => _blink.BlinkWebGLRenderingContext.$drawingBufferWidth_Getter(this);
 
   @DomName('WebGLRenderingContext.activeTexture')
   @DocsEditable()
-  void activeTexture(int texture) => _blink.Native_WebGLRenderingContext_activeTexture_Callback(this, texture);
+  void activeTexture(int texture) => _blink.BlinkWebGLRenderingContext.$activeTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.attachShader')
   @DocsEditable()
-  void attachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_attachShader_Callback(this, program, shader);
+  void attachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.$attachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.bindAttribLocation')
   @DocsEditable()
-  void bindAttribLocation(Program program, int index, String name) => _blink.Native_WebGLRenderingContext_bindAttribLocation_Callback(this, program, index, name);
+  void bindAttribLocation(Program program, int index, String name) => _blink.BlinkWebGLRenderingContext.$bindAttribLocation_Callback(this, program, index, name);
 
   @DomName('WebGLRenderingContext.bindBuffer')
   @DocsEditable()
-  void bindBuffer(int target, Buffer buffer) => _blink.Native_WebGLRenderingContext_bindBuffer_Callback(this, target, buffer);
+  void bindBuffer(int target, Buffer buffer) => _blink.BlinkWebGLRenderingContext.$bindBuffer_Callback(this, target, buffer);
 
   @DomName('WebGLRenderingContext.bindFramebuffer')
   @DocsEditable()
-  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_bindFramebuffer_Callback(this, target, framebuffer);
+  void bindFramebuffer(int target, Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$bindFramebuffer_Callback(this, target, framebuffer);
 
   @DomName('WebGLRenderingContext.bindRenderbuffer')
   @DocsEditable()
-  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_bindRenderbuffer_Callback(this, target, renderbuffer);
+  void bindRenderbuffer(int target, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$bindRenderbuffer_Callback(this, target, renderbuffer);
 
   @DomName('WebGLRenderingContext.bindTexture')
   @DocsEditable()
-  void bindTexture(int target, Texture texture) => _blink.Native_WebGLRenderingContext_bindTexture_Callback(this, target, texture);
+  void bindTexture(int target, Texture texture) => _blink.BlinkWebGLRenderingContext.$bindTexture_Callback(this, target, texture);
 
   @DomName('WebGLRenderingContext.blendColor')
   @DocsEditable()
-  void blendColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_blendColor_Callback(this, red, green, blue, alpha);
+  void blendColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.$blendColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.blendEquation')
   @DocsEditable()
-  void blendEquation(int mode) => _blink.Native_WebGLRenderingContext_blendEquation_Callback(this, mode);
+  void blendEquation(int mode) => _blink.BlinkWebGLRenderingContext.$blendEquation_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.blendEquationSeparate')
   @DocsEditable()
-  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.Native_WebGLRenderingContext_blendEquationSeparate_Callback(this, modeRGB, modeAlpha);
+  void blendEquationSeparate(int modeRGB, int modeAlpha) => _blink.BlinkWebGLRenderingContext.$blendEquationSeparate_Callback(this, modeRGB, modeAlpha);
 
   @DomName('WebGLRenderingContext.blendFunc')
   @DocsEditable()
-  void blendFunc(int sfactor, int dfactor) => _blink.Native_WebGLRenderingContext_blendFunc_Callback(this, sfactor, dfactor);
+  void blendFunc(int sfactor, int dfactor) => _blink.BlinkWebGLRenderingContext.$blendFunc_Callback(this, sfactor, dfactor);
 
   @DomName('WebGLRenderingContext.blendFuncSeparate')
   @DocsEditable()
-  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.Native_WebGLRenderingContext_blendFuncSeparate_Callback(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
+  void blendFuncSeparate(int srcRGB, int dstRGB, int srcAlpha, int dstAlpha) => _blink.BlinkWebGLRenderingContext.$blendFuncSeparate_Callback(this, srcRGB, dstRGB, srcAlpha, dstAlpha);
 
   @DomName('WebGLRenderingContext.bufferByteData')
   @DocsEditable()
-  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.Native_WebGLRenderingContext_bufferByteData_Callback(this, target, data, usage);
+  void bufferByteData(int target, ByteBuffer data, int usage) => _blink.BlinkWebGLRenderingContext.$bufferByteData_Callback(this, target, data, usage);
 
-  void bufferData(int target, data_OR_size, int usage) => _blink.Native_WebGLRenderingContext_bufferData(this, target, data_OR_size, usage);
+  void bufferData(int target, data_OR_size, int usage) => _blink.BlinkWebGLRenderingContext.$bufferData(this, target, data_OR_size, usage);
 
   @DomName('WebGLRenderingContext.bufferDataTyped')
   @DocsEditable()
-  void bufferDataTyped(int target, TypedData data, int usage) => _blink.Native_WebGLRenderingContext_bufferDataTyped_Callback(this, target, data, usage);
+  void bufferDataTyped(int target, TypedData data, int usage) => _blink.BlinkWebGLRenderingContext.$bufferDataTyped_Callback(this, target, data, usage);
 
   @DomName('WebGLRenderingContext.bufferSubByteData')
   @DocsEditable()
-  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.Native_WebGLRenderingContext_bufferSubByteData_Callback(this, target, offset, data);
+  void bufferSubByteData(int target, int offset, ByteBuffer data) => _blink.BlinkWebGLRenderingContext.$bufferSubByteData_Callback(this, target, offset, data);
 
-  void bufferSubData(int target, int offset, data) => _blink.Native_WebGLRenderingContext_bufferSubData(this, target, offset, data);
+  void bufferSubData(int target, int offset, data) => _blink.BlinkWebGLRenderingContext.$bufferSubData(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.bufferSubDataTyped')
   @DocsEditable()
-  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.Native_WebGLRenderingContext_bufferSubDataTyped_Callback(this, target, offset, data);
+  void bufferSubDataTyped(int target, int offset, TypedData data) => _blink.BlinkWebGLRenderingContext.$bufferSubDataTyped_Callback(this, target, offset, data);
 
   @DomName('WebGLRenderingContext.checkFramebufferStatus')
   @DocsEditable()
-  int checkFramebufferStatus(int target) => _blink.Native_WebGLRenderingContext_checkFramebufferStatus_Callback(this, target);
+  int checkFramebufferStatus(int target) => _blink.BlinkWebGLRenderingContext.$checkFramebufferStatus_Callback(this, target);
 
   @DomName('WebGLRenderingContext.clear')
   @DocsEditable()
-  void clear(int mask) => _blink.Native_WebGLRenderingContext_clear_Callback(this, mask);
+  void clear(int mask) => _blink.BlinkWebGLRenderingContext.$clear_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.clearColor')
   @DocsEditable()
-  void clearColor(num red, num green, num blue, num alpha) => _blink.Native_WebGLRenderingContext_clearColor_Callback(this, red, green, blue, alpha);
+  void clearColor(num red, num green, num blue, num alpha) => _blink.BlinkWebGLRenderingContext.$clearColor_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.clearDepth')
   @DocsEditable()
-  void clearDepth(num depth) => _blink.Native_WebGLRenderingContext_clearDepth_Callback(this, depth);
+  void clearDepth(num depth) => _blink.BlinkWebGLRenderingContext.$clearDepth_Callback(this, depth);
 
   @DomName('WebGLRenderingContext.clearStencil')
   @DocsEditable()
-  void clearStencil(int s) => _blink.Native_WebGLRenderingContext_clearStencil_Callback(this, s);
+  void clearStencil(int s) => _blink.BlinkWebGLRenderingContext.$clearStencil_Callback(this, s);
 
   @DomName('WebGLRenderingContext.colorMask')
   @DocsEditable()
-  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.Native_WebGLRenderingContext_colorMask_Callback(this, red, green, blue, alpha);
+  void colorMask(bool red, bool green, bool blue, bool alpha) => _blink.BlinkWebGLRenderingContext.$colorMask_Callback(this, red, green, blue, alpha);
 
   @DomName('WebGLRenderingContext.compileShader')
   @DocsEditable()
-  void compileShader(Shader shader) => _blink.Native_WebGLRenderingContext_compileShader_Callback(this, shader);
+  void compileShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$compileShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.compressedTexImage2D')
   @DocsEditable()
-  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexImage2D_Callback(this, target, level, internalformat, width, height, border, data);
+  void compressedTexImage2D(int target, int level, int internalformat, int width, int height, int border, TypedData data) => _blink.BlinkWebGLRenderingContext.$compressedTexImage2D_Callback(this, target, level, internalformat, width, height, border, data);
 
   @DomName('WebGLRenderingContext.compressedTexSubImage2D')
   @DocsEditable()
-  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.Native_WebGLRenderingContext_compressedTexSubImage2D_Callback(this, target, level, xoffset, yoffset, width, height, format, data);
+  void compressedTexSubImage2D(int target, int level, int xoffset, int yoffset, int width, int height, int format, TypedData data) => _blink.BlinkWebGLRenderingContext.$compressedTexSubImage2D_Callback(this, target, level, xoffset, yoffset, width, height, format, data);
 
   @DomName('WebGLRenderingContext.copyTexImage2D')
   @DocsEditable()
-  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.Native_WebGLRenderingContext_copyTexImage2D_Callback(this, target, level, internalformat, x, y, width, height, border);
+  void copyTexImage2D(int target, int level, int internalformat, int x, int y, int width, int height, int border) => _blink.BlinkWebGLRenderingContext.$copyTexImage2D_Callback(this, target, level, internalformat, x, y, width, height, border);
 
   @DomName('WebGLRenderingContext.copyTexSubImage2D')
   @DocsEditable()
-  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_copyTexSubImage2D_Callback(this, target, level, xoffset, yoffset, x, y, width, height);
+  void copyTexSubImage2D(int target, int level, int xoffset, int yoffset, int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$copyTexSubImage2D_Callback(this, target, level, xoffset, yoffset, x, y, width, height);
 
   @DomName('WebGLRenderingContext.createBuffer')
   @DocsEditable()
-  Buffer createBuffer() => _blink.Native_WebGLRenderingContext_createBuffer_Callback(this);
+  Buffer createBuffer() => _blink.BlinkWebGLRenderingContext.$createBuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createFramebuffer')
   @DocsEditable()
-  Framebuffer createFramebuffer() => _blink.Native_WebGLRenderingContext_createFramebuffer_Callback(this);
+  Framebuffer createFramebuffer() => _blink.BlinkWebGLRenderingContext.$createFramebuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createProgram')
   @DocsEditable()
-  Program createProgram() => _blink.Native_WebGLRenderingContext_createProgram_Callback(this);
+  Program createProgram() => _blink.BlinkWebGLRenderingContext.$createProgram_Callback(this);
 
   @DomName('WebGLRenderingContext.createRenderbuffer')
   @DocsEditable()
-  Renderbuffer createRenderbuffer() => _blink.Native_WebGLRenderingContext_createRenderbuffer_Callback(this);
+  Renderbuffer createRenderbuffer() => _blink.BlinkWebGLRenderingContext.$createRenderbuffer_Callback(this);
 
   @DomName('WebGLRenderingContext.createShader')
   @DocsEditable()
-  Shader createShader(int type) => _blink.Native_WebGLRenderingContext_createShader_Callback(this, type);
+  Shader createShader(int type) => _blink.BlinkWebGLRenderingContext.$createShader_Callback(this, type);
 
   @DomName('WebGLRenderingContext.createTexture')
   @DocsEditable()
-  Texture createTexture() => _blink.Native_WebGLRenderingContext_createTexture_Callback(this);
+  Texture createTexture() => _blink.BlinkWebGLRenderingContext.$createTexture_Callback(this);
 
   @DomName('WebGLRenderingContext.cullFace')
   @DocsEditable()
-  void cullFace(int mode) => _blink.Native_WebGLRenderingContext_cullFace_Callback(this, mode);
+  void cullFace(int mode) => _blink.BlinkWebGLRenderingContext.$cullFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.deleteBuffer')
   @DocsEditable()
-  void deleteBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_deleteBuffer_Callback(this, buffer);
+  void deleteBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.$deleteBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.deleteFramebuffer')
   @DocsEditable()
-  void deleteFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_deleteFramebuffer_Callback(this, framebuffer);
+  void deleteFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$deleteFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.deleteProgram')
   @DocsEditable()
-  void deleteProgram(Program program) => _blink.Native_WebGLRenderingContext_deleteProgram_Callback(this, program);
+  void deleteProgram(Program program) => _blink.BlinkWebGLRenderingContext.$deleteProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.deleteRenderbuffer')
   @DocsEditable()
-  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_deleteRenderbuffer_Callback(this, renderbuffer);
+  void deleteRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$deleteRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.deleteShader')
   @DocsEditable()
-  void deleteShader(Shader shader) => _blink.Native_WebGLRenderingContext_deleteShader_Callback(this, shader);
+  void deleteShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$deleteShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.deleteTexture')
   @DocsEditable()
-  void deleteTexture(Texture texture) => _blink.Native_WebGLRenderingContext_deleteTexture_Callback(this, texture);
+  void deleteTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.$deleteTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.depthFunc')
   @DocsEditable()
-  void depthFunc(int func) => _blink.Native_WebGLRenderingContext_depthFunc_Callback(this, func);
+  void depthFunc(int func) => _blink.BlinkWebGLRenderingContext.$depthFunc_Callback(this, func);
 
   @DomName('WebGLRenderingContext.depthMask')
   @DocsEditable()
-  void depthMask(bool flag) => _blink.Native_WebGLRenderingContext_depthMask_Callback(this, flag);
+  void depthMask(bool flag) => _blink.BlinkWebGLRenderingContext.$depthMask_Callback(this, flag);
 
   @DomName('WebGLRenderingContext.depthRange')
   @DocsEditable()
-  void depthRange(num zNear, num zFar) => _blink.Native_WebGLRenderingContext_depthRange_Callback(this, zNear, zFar);
+  void depthRange(num zNear, num zFar) => _blink.BlinkWebGLRenderingContext.$depthRange_Callback(this, zNear, zFar);
 
   @DomName('WebGLRenderingContext.detachShader')
   @DocsEditable()
-  void detachShader(Program program, Shader shader) => _blink.Native_WebGLRenderingContext_detachShader_Callback(this, program, shader);
+  void detachShader(Program program, Shader shader) => _blink.BlinkWebGLRenderingContext.$detachShader_Callback(this, program, shader);
 
   @DomName('WebGLRenderingContext.disable')
   @DocsEditable()
-  void disable(int cap) => _blink.Native_WebGLRenderingContext_disable_Callback(this, cap);
+  void disable(int cap) => _blink.BlinkWebGLRenderingContext.$disable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.disableVertexAttribArray')
   @DocsEditable()
-  void disableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_disableVertexAttribArray_Callback(this, index);
+  void disableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.$disableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.drawArrays')
   @DocsEditable()
-  void drawArrays(int mode, int first, int count) => _blink.Native_WebGLRenderingContext_drawArrays_Callback(this, mode, first, count);
+  void drawArrays(int mode, int first, int count) => _blink.BlinkWebGLRenderingContext.$drawArrays_Callback(this, mode, first, count);
 
   @DomName('WebGLRenderingContext.drawElements')
   @DocsEditable()
-  void drawElements(int mode, int count, int type, int offset) => _blink.Native_WebGLRenderingContext_drawElements_Callback(this, mode, count, type, offset);
+  void drawElements(int mode, int count, int type, int offset) => _blink.BlinkWebGLRenderingContext.$drawElements_Callback(this, mode, count, type, offset);
 
   @DomName('WebGLRenderingContext.enable')
   @DocsEditable()
-  void enable(int cap) => _blink.Native_WebGLRenderingContext_enable_Callback(this, cap);
+  void enable(int cap) => _blink.BlinkWebGLRenderingContext.$enable_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.enableVertexAttribArray')
   @DocsEditable()
-  void enableVertexAttribArray(int index) => _blink.Native_WebGLRenderingContext_enableVertexAttribArray_Callback(this, index);
+  void enableVertexAttribArray(int index) => _blink.BlinkWebGLRenderingContext.$enableVertexAttribArray_Callback(this, index);
 
   @DomName('WebGLRenderingContext.finish')
   @DocsEditable()
-  void finish() => _blink.Native_WebGLRenderingContext_finish_Callback(this);
+  void finish() => _blink.BlinkWebGLRenderingContext.$finish_Callback(this);
 
   @DomName('WebGLRenderingContext.flush')
   @DocsEditable()
-  void flush() => _blink.Native_WebGLRenderingContext_flush_Callback(this);
+  void flush() => _blink.BlinkWebGLRenderingContext.$flush_Callback(this);
 
   @DomName('WebGLRenderingContext.framebufferRenderbuffer')
   @DocsEditable()
-  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_framebufferRenderbuffer_Callback(this, target, attachment, renderbuffertarget, renderbuffer);
+  void framebufferRenderbuffer(int target, int attachment, int renderbuffertarget, Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$framebufferRenderbuffer_Callback(this, target, attachment, renderbuffertarget, renderbuffer);
 
   @DomName('WebGLRenderingContext.framebufferTexture2D')
   @DocsEditable()
-  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.Native_WebGLRenderingContext_framebufferTexture2D_Callback(this, target, attachment, textarget, texture, level);
+  void framebufferTexture2D(int target, int attachment, int textarget, Texture texture, int level) => _blink.BlinkWebGLRenderingContext.$framebufferTexture2D_Callback(this, target, attachment, textarget, texture, level);
 
   @DomName('WebGLRenderingContext.frontFace')
   @DocsEditable()
-  void frontFace(int mode) => _blink.Native_WebGLRenderingContext_frontFace_Callback(this, mode);
+  void frontFace(int mode) => _blink.BlinkWebGLRenderingContext.$frontFace_Callback(this, mode);
 
   @DomName('WebGLRenderingContext.generateMipmap')
   @DocsEditable()
-  void generateMipmap(int target) => _blink.Native_WebGLRenderingContext_generateMipmap_Callback(this, target);
+  void generateMipmap(int target) => _blink.BlinkWebGLRenderingContext.$generateMipmap_Callback(this, target);
 
   @DomName('WebGLRenderingContext.getActiveAttrib')
   @DocsEditable()
-  ActiveInfo getActiveAttrib(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveAttrib_Callback(this, program, index);
+  ActiveInfo getActiveAttrib(Program program, int index) => _blink.BlinkWebGLRenderingContext.$getActiveAttrib_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getActiveUniform')
   @DocsEditable()
-  ActiveInfo getActiveUniform(Program program, int index) => _blink.Native_WebGLRenderingContext_getActiveUniform_Callback(this, program, index);
+  ActiveInfo getActiveUniform(Program program, int index) => _blink.BlinkWebGLRenderingContext.$getActiveUniform_Callback(this, program, index);
 
   @DomName('WebGLRenderingContext.getAttachedShaders')
   @DocsEditable()
-  void getAttachedShaders(Program program) => _blink.Native_WebGLRenderingContext_getAttachedShaders_Callback(this, program);
+  void getAttachedShaders(Program program) => _blink.BlinkWebGLRenderingContext.$getAttachedShaders_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getAttribLocation')
   @DocsEditable()
-  int getAttribLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getAttribLocation_Callback(this, program, name);
+  int getAttribLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.$getAttribLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getBufferParameter')
   @DocsEditable()
-  Object getBufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getBufferParameter_Callback(this, target, pname);
+  Object getBufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getBufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getContextAttributes')
   @DocsEditable()
-  ContextAttributes getContextAttributes() => _blink.Native_WebGLRenderingContext_getContextAttributes_Callback(this);
+  ContextAttributes getContextAttributes() => _blink.BlinkWebGLRenderingContext.$getContextAttributes_Callback(this);
 
   @DomName('WebGLRenderingContext.getError')
   @DocsEditable()
-  int getError() => _blink.Native_WebGLRenderingContext_getError_Callback(this);
+  int getError() => _blink.BlinkWebGLRenderingContext.$getError_Callback(this);
 
   @DomName('WebGLRenderingContext.getExtension')
   @DocsEditable()
-  Object getExtension(String name) => _blink.Native_WebGLRenderingContext_getExtension_Callback(this, name);
+  Object getExtension(String name) => _blink.BlinkWebGLRenderingContext.$getExtension_Callback(this, name);
 
   @DomName('WebGLRenderingContext.getFramebufferAttachmentParameter')
   @DocsEditable()
-  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.Native_WebGLRenderingContext_getFramebufferAttachmentParameter_Callback(this, target, attachment, pname);
+  Object getFramebufferAttachmentParameter(int target, int attachment, int pname) => _blink.BlinkWebGLRenderingContext.$getFramebufferAttachmentParameter_Callback(this, target, attachment, pname);
 
   @DomName('WebGLRenderingContext.getParameter')
   @DocsEditable()
-  Object getParameter(int pname) => _blink.Native_WebGLRenderingContext_getParameter_Callback(this, pname);
+  Object getParameter(int pname) => _blink.BlinkWebGLRenderingContext.$getParameter_Callback(this, pname);
 
   @DomName('WebGLRenderingContext.getProgramInfoLog')
   @DocsEditable()
-  String getProgramInfoLog(Program program) => _blink.Native_WebGLRenderingContext_getProgramInfoLog_Callback(this, program);
+  String getProgramInfoLog(Program program) => _blink.BlinkWebGLRenderingContext.$getProgramInfoLog_Callback(this, program);
 
   @DomName('WebGLRenderingContext.getProgramParameter')
   @DocsEditable()
-  Object getProgramParameter(Program program, int pname) => _blink.Native_WebGLRenderingContext_getProgramParameter_Callback(this, program, pname);
+  Object getProgramParameter(Program program, int pname) => _blink.BlinkWebGLRenderingContext.$getProgramParameter_Callback(this, program, pname);
 
   @DomName('WebGLRenderingContext.getRenderbufferParameter')
   @DocsEditable()
-  Object getRenderbufferParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getRenderbufferParameter_Callback(this, target, pname);
+  Object getRenderbufferParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getRenderbufferParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getShaderInfoLog')
   @DocsEditable()
-  String getShaderInfoLog(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderInfoLog_Callback(this, shader);
+  String getShaderInfoLog(Shader shader) => _blink.BlinkWebGLRenderingContext.$getShaderInfoLog_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getShaderParameter')
   @DocsEditable()
-  Object getShaderParameter(Shader shader, int pname) => _blink.Native_WebGLRenderingContext_getShaderParameter_Callback(this, shader, pname);
+  Object getShaderParameter(Shader shader, int pname) => _blink.BlinkWebGLRenderingContext.$getShaderParameter_Callback(this, shader, pname);
 
   @DomName('WebGLRenderingContext.getShaderPrecisionFormat')
   @DocsEditable()
-  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.Native_WebGLRenderingContext_getShaderPrecisionFormat_Callback(this, shadertype, precisiontype);
+  ShaderPrecisionFormat getShaderPrecisionFormat(int shadertype, int precisiontype) => _blink.BlinkWebGLRenderingContext.$getShaderPrecisionFormat_Callback(this, shadertype, precisiontype);
 
   @DomName('WebGLRenderingContext.getShaderSource')
   @DocsEditable()
-  String getShaderSource(Shader shader) => _blink.Native_WebGLRenderingContext_getShaderSource_Callback(this, shader);
+  String getShaderSource(Shader shader) => _blink.BlinkWebGLRenderingContext.$getShaderSource_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.getSupportedExtensions')
   @DocsEditable()
-  List<String> getSupportedExtensions() => _blink.Native_WebGLRenderingContext_getSupportedExtensions_Callback(this);
+  List<String> getSupportedExtensions() => _blink.BlinkWebGLRenderingContext.$getSupportedExtensions_Callback(this);
 
   @DomName('WebGLRenderingContext.getTexParameter')
   @DocsEditable()
-  Object getTexParameter(int target, int pname) => _blink.Native_WebGLRenderingContext_getTexParameter_Callback(this, target, pname);
+  Object getTexParameter(int target, int pname) => _blink.BlinkWebGLRenderingContext.$getTexParameter_Callback(this, target, pname);
 
   @DomName('WebGLRenderingContext.getUniform')
   @DocsEditable()
-  Object getUniform(Program program, UniformLocation location) => _blink.Native_WebGLRenderingContext_getUniform_Callback(this, program, location);
+  Object getUniform(Program program, UniformLocation location) => _blink.BlinkWebGLRenderingContext.$getUniform_Callback(this, program, location);
 
   @DomName('WebGLRenderingContext.getUniformLocation')
   @DocsEditable()
-  UniformLocation getUniformLocation(Program program, String name) => _blink.Native_WebGLRenderingContext_getUniformLocation_Callback(this, program, name);
+  UniformLocation getUniformLocation(Program program, String name) => _blink.BlinkWebGLRenderingContext.$getUniformLocation_Callback(this, program, name);
 
   @DomName('WebGLRenderingContext.getVertexAttrib')
   @DocsEditable()
-  Object getVertexAttrib(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttrib_Callback(this, index, pname);
+  Object getVertexAttrib(int index, int pname) => _blink.BlinkWebGLRenderingContext.$getVertexAttrib_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.getVertexAttribOffset')
   @DocsEditable()
-  int getVertexAttribOffset(int index, int pname) => _blink.Native_WebGLRenderingContext_getVertexAttribOffset_Callback(this, index, pname);
+  int getVertexAttribOffset(int index, int pname) => _blink.BlinkWebGLRenderingContext.$getVertexAttribOffset_Callback(this, index, pname);
 
   @DomName('WebGLRenderingContext.hint')
   @DocsEditable()
-  void hint(int target, int mode) => _blink.Native_WebGLRenderingContext_hint_Callback(this, target, mode);
+  void hint(int target, int mode) => _blink.BlinkWebGLRenderingContext.$hint_Callback(this, target, mode);
 
   @DomName('WebGLRenderingContext.isBuffer')
   @DocsEditable()
-  bool isBuffer(Buffer buffer) => _blink.Native_WebGLRenderingContext_isBuffer_Callback(this, buffer);
+  bool isBuffer(Buffer buffer) => _blink.BlinkWebGLRenderingContext.$isBuffer_Callback(this, buffer);
 
   @DomName('WebGLRenderingContext.isContextLost')
   @DocsEditable()
-  bool isContextLost() => _blink.Native_WebGLRenderingContext_isContextLost_Callback(this);
+  bool isContextLost() => _blink.BlinkWebGLRenderingContext.$isContextLost_Callback(this);
 
   @DomName('WebGLRenderingContext.isEnabled')
   @DocsEditable()
-  bool isEnabled(int cap) => _blink.Native_WebGLRenderingContext_isEnabled_Callback(this, cap);
+  bool isEnabled(int cap) => _blink.BlinkWebGLRenderingContext.$isEnabled_Callback(this, cap);
 
   @DomName('WebGLRenderingContext.isFramebuffer')
   @DocsEditable()
-  bool isFramebuffer(Framebuffer framebuffer) => _blink.Native_WebGLRenderingContext_isFramebuffer_Callback(this, framebuffer);
+  bool isFramebuffer(Framebuffer framebuffer) => _blink.BlinkWebGLRenderingContext.$isFramebuffer_Callback(this, framebuffer);
 
   @DomName('WebGLRenderingContext.isProgram')
   @DocsEditable()
-  bool isProgram(Program program) => _blink.Native_WebGLRenderingContext_isProgram_Callback(this, program);
+  bool isProgram(Program program) => _blink.BlinkWebGLRenderingContext.$isProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.isRenderbuffer')
   @DocsEditable()
-  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.Native_WebGLRenderingContext_isRenderbuffer_Callback(this, renderbuffer);
+  bool isRenderbuffer(Renderbuffer renderbuffer) => _blink.BlinkWebGLRenderingContext.$isRenderbuffer_Callback(this, renderbuffer);
 
   @DomName('WebGLRenderingContext.isShader')
   @DocsEditable()
-  bool isShader(Shader shader) => _blink.Native_WebGLRenderingContext_isShader_Callback(this, shader);
+  bool isShader(Shader shader) => _blink.BlinkWebGLRenderingContext.$isShader_Callback(this, shader);
 
   @DomName('WebGLRenderingContext.isTexture')
   @DocsEditable()
-  bool isTexture(Texture texture) => _blink.Native_WebGLRenderingContext_isTexture_Callback(this, texture);
+  bool isTexture(Texture texture) => _blink.BlinkWebGLRenderingContext.$isTexture_Callback(this, texture);
 
   @DomName('WebGLRenderingContext.lineWidth')
   @DocsEditable()
-  void lineWidth(num width) => _blink.Native_WebGLRenderingContext_lineWidth_Callback(this, width);
+  void lineWidth(num width) => _blink.BlinkWebGLRenderingContext.$lineWidth_Callback(this, width);
 
   @DomName('WebGLRenderingContext.linkProgram')
   @DocsEditable()
-  void linkProgram(Program program) => _blink.Native_WebGLRenderingContext_linkProgram_Callback(this, program);
+  void linkProgram(Program program) => _blink.BlinkWebGLRenderingContext.$linkProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.pixelStorei')
   @DocsEditable()
-  void pixelStorei(int pname, int param) => _blink.Native_WebGLRenderingContext_pixelStorei_Callback(this, pname, param);
+  void pixelStorei(int pname, int param) => _blink.BlinkWebGLRenderingContext.$pixelStorei_Callback(this, pname, param);
 
   @DomName('WebGLRenderingContext.polygonOffset')
   @DocsEditable()
-  void polygonOffset(num factor, num units) => _blink.Native_WebGLRenderingContext_polygonOffset_Callback(this, factor, units);
+  void polygonOffset(num factor, num units) => _blink.BlinkWebGLRenderingContext.$polygonOffset_Callback(this, factor, units);
 
   @DomName('WebGLRenderingContext.readPixels')
   @DocsEditable()
-  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.Native_WebGLRenderingContext_readPixels_Callback(this, x, y, width, height, format, type, pixels);
+  void readPixels(int x, int y, int width, int height, int format, int type, TypedData pixels) => _blink.BlinkWebGLRenderingContext.$readPixels_Callback(this, x, y, width, height, format, type, pixels);
 
   @DomName('WebGLRenderingContext.renderbufferStorage')
   @DocsEditable()
-  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.Native_WebGLRenderingContext_renderbufferStorage_Callback(this, target, internalformat, width, height);
+  void renderbufferStorage(int target, int internalformat, int width, int height) => _blink.BlinkWebGLRenderingContext.$renderbufferStorage_Callback(this, target, internalformat, width, height);
 
   @DomName('WebGLRenderingContext.sampleCoverage')
   @DocsEditable()
-  void sampleCoverage(num value, bool invert) => _blink.Native_WebGLRenderingContext_sampleCoverage_Callback(this, value, invert);
+  void sampleCoverage(num value, bool invert) => _blink.BlinkWebGLRenderingContext.$sampleCoverage_Callback(this, value, invert);
 
   @DomName('WebGLRenderingContext.scissor')
   @DocsEditable()
-  void scissor(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_scissor_Callback(this, x, y, width, height);
+  void scissor(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$scissor_Callback(this, x, y, width, height);
 
   @DomName('WebGLRenderingContext.shaderSource')
   @DocsEditable()
-  void shaderSource(Shader shader, String string) => _blink.Native_WebGLRenderingContext_shaderSource_Callback(this, shader, string);
+  void shaderSource(Shader shader, String string) => _blink.BlinkWebGLRenderingContext.$shaderSource_Callback(this, shader, string);
 
   @DomName('WebGLRenderingContext.stencilFunc')
   @DocsEditable()
-  void stencilFunc(int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFunc_Callback(this, func, ref, mask);
+  void stencilFunc(int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.$stencilFunc_Callback(this, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilFuncSeparate')
   @DocsEditable()
-  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.Native_WebGLRenderingContext_stencilFuncSeparate_Callback(this, face, func, ref, mask);
+  void stencilFuncSeparate(int face, int func, int ref, int mask) => _blink.BlinkWebGLRenderingContext.$stencilFuncSeparate_Callback(this, face, func, ref, mask);
 
   @DomName('WebGLRenderingContext.stencilMask')
   @DocsEditable()
-  void stencilMask(int mask) => _blink.Native_WebGLRenderingContext_stencilMask_Callback(this, mask);
+  void stencilMask(int mask) => _blink.BlinkWebGLRenderingContext.$stencilMask_Callback(this, mask);
 
   @DomName('WebGLRenderingContext.stencilMaskSeparate')
   @DocsEditable()
-  void stencilMaskSeparate(int face, int mask) => _blink.Native_WebGLRenderingContext_stencilMaskSeparate_Callback(this, face, mask);
+  void stencilMaskSeparate(int face, int mask) => _blink.BlinkWebGLRenderingContext.$stencilMaskSeparate_Callback(this, face, mask);
 
   @DomName('WebGLRenderingContext.stencilOp')
   @DocsEditable()
-  void stencilOp(int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOp_Callback(this, fail, zfail, zpass);
+  void stencilOp(int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.$stencilOp_Callback(this, fail, zfail, zpass);
 
   @DomName('WebGLRenderingContext.stencilOpSeparate')
   @DocsEditable()
-  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.Native_WebGLRenderingContext_stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
+  void stencilOpSeparate(int face, int fail, int zfail, int zpass) => _blink.BlinkWebGLRenderingContext.$stencilOpSeparate_Callback(this, face, fail, zfail, zpass);
 
-  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
+  void texImage2D(int target, int level, int internalformat, int format_OR_width, int height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, [int format, int type, TypedData pixels]) => _blink.BlinkWebGLRenderingContext.$texImage2D(this, target, level, internalformat, format_OR_width, height_OR_type, border_OR_canvas_OR_image_OR_pixels_OR_video, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DCanvas')
   @DocsEditable()
-  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texImage2DCanvas_Callback(this, target, level, internalformat, format, type, canvas);
+  void texImage2DCanvas(int target, int level, int internalformat, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.$texImage2DCanvas_Callback(this, target, level, internalformat, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texImage2DImage')
   @DocsEditable()
-  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texImage2DImage_Callback(this, target, level, internalformat, format, type, image);
+  void texImage2DImage(int target, int level, int internalformat, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.$texImage2DImage_Callback(this, target, level, internalformat, format, type, image);
 
   @DomName('WebGLRenderingContext.texImage2DImageData')
   @DocsEditable()
-  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texImage2DImageData_Callback(this, target, level, internalformat, format, type, pixels);
+  void texImage2DImageData(int target, int level, int internalformat, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.$texImage2DImageData_Callback(this, target, level, internalformat, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texImage2DVideo')
   @DocsEditable()
-  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texImage2DVideo_Callback(this, target, level, internalformat, format, type, video);
+  void texImage2DVideo(int target, int level, int internalformat, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.$texImage2DVideo_Callback(this, target, level, internalformat, format, type, video);
 
   @DomName('WebGLRenderingContext.texParameterf')
   @DocsEditable()
-  void texParameterf(int target, int pname, num param) => _blink.Native_WebGLRenderingContext_texParameterf_Callback(this, target, pname, param);
+  void texParameterf(int target, int pname, num param) => _blink.BlinkWebGLRenderingContext.$texParameterf_Callback(this, target, pname, param);
 
   @DomName('WebGLRenderingContext.texParameteri')
   @DocsEditable()
-  void texParameteri(int target, int pname, int param) => _blink.Native_WebGLRenderingContext_texParameteri_Callback(this, target, pname, param);
+  void texParameteri(int target, int pname, int param) => _blink.BlinkWebGLRenderingContext.$texParameteri_Callback(this, target, pname, param);
 
-  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.Native_WebGLRenderingContext_texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
+  void texSubImage2D(int target, int level, int xoffset, int yoffset, int format_OR_width, int height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, [int type, TypedData pixels]) => _blink.BlinkWebGLRenderingContext.$texSubImage2D(this, target, level, xoffset, yoffset, format_OR_width, height_OR_type, canvas_OR_format_OR_image_OR_pixels_OR_video, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DCanvas')
   @DocsEditable()
-  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.Native_WebGLRenderingContext_texSubImage2DCanvas_Callback(this, target, level, xoffset, yoffset, format, type, canvas);
+  void texSubImage2DCanvas(int target, int level, int xoffset, int yoffset, int format, int type, CanvasElement canvas) => _blink.BlinkWebGLRenderingContext.$texSubImage2DCanvas_Callback(this, target, level, xoffset, yoffset, format, type, canvas);
 
   @DomName('WebGLRenderingContext.texSubImage2DImage')
   @DocsEditable()
-  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.Native_WebGLRenderingContext_texSubImage2DImage_Callback(this, target, level, xoffset, yoffset, format, type, image);
+  void texSubImage2DImage(int target, int level, int xoffset, int yoffset, int format, int type, ImageElement image) => _blink.BlinkWebGLRenderingContext.$texSubImage2DImage_Callback(this, target, level, xoffset, yoffset, format, type, image);
 
   @DomName('WebGLRenderingContext.texSubImage2DImageData')
   @DocsEditable()
-  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.Native_WebGLRenderingContext_texSubImage2DImageData_Callback(this, target, level, xoffset, yoffset, format, type, pixels);
+  void texSubImage2DImageData(int target, int level, int xoffset, int yoffset, int format, int type, ImageData pixels) => _blink.BlinkWebGLRenderingContext.$texSubImage2DImageData_Callback(this, target, level, xoffset, yoffset, format, type, pixels);
 
   @DomName('WebGLRenderingContext.texSubImage2DVideo')
   @DocsEditable()
-  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.Native_WebGLRenderingContext_texSubImage2DVideo_Callback(this, target, level, xoffset, yoffset, format, type, video);
+  void texSubImage2DVideo(int target, int level, int xoffset, int yoffset, int format, int type, VideoElement video) => _blink.BlinkWebGLRenderingContext.$texSubImage2DVideo_Callback(this, target, level, xoffset, yoffset, format, type, video);
 
   @DomName('WebGLRenderingContext.uniform1f')
   @DocsEditable()
-  void uniform1f(UniformLocation location, num x) => _blink.Native_WebGLRenderingContext_uniform1f_Callback(this, location, x);
+  void uniform1f(UniformLocation location, num x) => _blink.BlinkWebGLRenderingContext.$uniform1f_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1fv')
   @DocsEditable()
-  void uniform1fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform1fv_Callback(this, location, v);
+  void uniform1fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform1fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform1i')
   @DocsEditable()
-  void uniform1i(UniformLocation location, int x) => _blink.Native_WebGLRenderingContext_uniform1i_Callback(this, location, x);
+  void uniform1i(UniformLocation location, int x) => _blink.BlinkWebGLRenderingContext.$uniform1i_Callback(this, location, x);
 
   @DomName('WebGLRenderingContext.uniform1iv')
   @DocsEditable()
-  void uniform1iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform1iv_Callback(this, location, v);
+  void uniform1iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform1iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2f')
   @DocsEditable()
-  void uniform2f(UniformLocation location, num x, num y) => _blink.Native_WebGLRenderingContext_uniform2f_Callback(this, location, x, y);
+  void uniform2f(UniformLocation location, num x, num y) => _blink.BlinkWebGLRenderingContext.$uniform2f_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2fv')
   @DocsEditable()
-  void uniform2fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform2fv_Callback(this, location, v);
+  void uniform2fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform2fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform2i')
   @DocsEditable()
-  void uniform2i(UniformLocation location, int x, int y) => _blink.Native_WebGLRenderingContext_uniform2i_Callback(this, location, x, y);
+  void uniform2i(UniformLocation location, int x, int y) => _blink.BlinkWebGLRenderingContext.$uniform2i_Callback(this, location, x, y);
 
   @DomName('WebGLRenderingContext.uniform2iv')
   @DocsEditable()
-  void uniform2iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform2iv_Callback(this, location, v);
+  void uniform2iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform2iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3f')
   @DocsEditable()
-  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.Native_WebGLRenderingContext_uniform3f_Callback(this, location, x, y, z);
+  void uniform3f(UniformLocation location, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.$uniform3f_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3fv')
   @DocsEditable()
-  void uniform3fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform3fv_Callback(this, location, v);
+  void uniform3fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform3fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform3i')
   @DocsEditable()
-  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.Native_WebGLRenderingContext_uniform3i_Callback(this, location, x, y, z);
+  void uniform3i(UniformLocation location, int x, int y, int z) => _blink.BlinkWebGLRenderingContext.$uniform3i_Callback(this, location, x, y, z);
 
   @DomName('WebGLRenderingContext.uniform3iv')
   @DocsEditable()
-  void uniform3iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform3iv_Callback(this, location, v);
+  void uniform3iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform3iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4f')
   @DocsEditable()
-  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_uniform4f_Callback(this, location, x, y, z, w);
+  void uniform4f(UniformLocation location, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.$uniform4f_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4fv')
   @DocsEditable()
-  void uniform4fv(UniformLocation location, Float32List v) => _blink.Native_WebGLRenderingContext_uniform4fv_Callback(this, location, v);
+  void uniform4fv(UniformLocation location, Float32List v) => _blink.BlinkWebGLRenderingContext.$uniform4fv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniform4i')
   @DocsEditable()
-  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.Native_WebGLRenderingContext_uniform4i_Callback(this, location, x, y, z, w);
+  void uniform4i(UniformLocation location, int x, int y, int z, int w) => _blink.BlinkWebGLRenderingContext.$uniform4i_Callback(this, location, x, y, z, w);
 
   @DomName('WebGLRenderingContext.uniform4iv')
   @DocsEditable()
-  void uniform4iv(UniformLocation location, Int32List v) => _blink.Native_WebGLRenderingContext_uniform4iv_Callback(this, location, v);
+  void uniform4iv(UniformLocation location, Int32List v) => _blink.BlinkWebGLRenderingContext.$uniform4iv_Callback(this, location, v);
 
   @DomName('WebGLRenderingContext.uniformMatrix2fv')
   @DocsEditable()
-  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix2fv_Callback(this, location, transpose, array);
+  void uniformMatrix2fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix2fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix3fv')
   @DocsEditable()
-  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix3fv_Callback(this, location, transpose, array);
+  void uniformMatrix3fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix3fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.uniformMatrix4fv')
   @DocsEditable()
-  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.Native_WebGLRenderingContext_uniformMatrix4fv_Callback(this, location, transpose, array);
+  void uniformMatrix4fv(UniformLocation location, bool transpose, Float32List array) => _blink.BlinkWebGLRenderingContext.$uniformMatrix4fv_Callback(this, location, transpose, array);
 
   @DomName('WebGLRenderingContext.useProgram')
   @DocsEditable()
-  void useProgram(Program program) => _blink.Native_WebGLRenderingContext_useProgram_Callback(this, program);
+  void useProgram(Program program) => _blink.BlinkWebGLRenderingContext.$useProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.validateProgram')
   @DocsEditable()
-  void validateProgram(Program program) => _blink.Native_WebGLRenderingContext_validateProgram_Callback(this, program);
+  void validateProgram(Program program) => _blink.BlinkWebGLRenderingContext.$validateProgram_Callback(this, program);
 
   @DomName('WebGLRenderingContext.vertexAttrib1f')
   @DocsEditable()
-  void vertexAttrib1f(int indx, num x) => _blink.Native_WebGLRenderingContext_vertexAttrib1f_Callback(this, indx, x);
+  void vertexAttrib1f(int indx, num x) => _blink.BlinkWebGLRenderingContext.$vertexAttrib1f_Callback(this, indx, x);
 
   @DomName('WebGLRenderingContext.vertexAttrib1fv')
   @DocsEditable()
-  void vertexAttrib1fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib1fv_Callback(this, indx, values);
+  void vertexAttrib1fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib1fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib2f')
   @DocsEditable()
-  void vertexAttrib2f(int indx, num x, num y) => _blink.Native_WebGLRenderingContext_vertexAttrib2f_Callback(this, indx, x, y);
+  void vertexAttrib2f(int indx, num x, num y) => _blink.BlinkWebGLRenderingContext.$vertexAttrib2f_Callback(this, indx, x, y);
 
   @DomName('WebGLRenderingContext.vertexAttrib2fv')
   @DocsEditable()
-  void vertexAttrib2fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib2fv_Callback(this, indx, values);
+  void vertexAttrib2fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib2fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib3f')
   @DocsEditable()
-  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.Native_WebGLRenderingContext_vertexAttrib3f_Callback(this, indx, x, y, z);
+  void vertexAttrib3f(int indx, num x, num y, num z) => _blink.BlinkWebGLRenderingContext.$vertexAttrib3f_Callback(this, indx, x, y, z);
 
   @DomName('WebGLRenderingContext.vertexAttrib3fv')
   @DocsEditable()
-  void vertexAttrib3fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib3fv_Callback(this, indx, values);
+  void vertexAttrib3fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib3fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttrib4f')
   @DocsEditable()
-  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.Native_WebGLRenderingContext_vertexAttrib4f_Callback(this, indx, x, y, z, w);
+  void vertexAttrib4f(int indx, num x, num y, num z, num w) => _blink.BlinkWebGLRenderingContext.$vertexAttrib4f_Callback(this, indx, x, y, z, w);
 
   @DomName('WebGLRenderingContext.vertexAttrib4fv')
   @DocsEditable()
-  void vertexAttrib4fv(int indx, Float32List values) => _blink.Native_WebGLRenderingContext_vertexAttrib4fv_Callback(this, indx, values);
+  void vertexAttrib4fv(int indx, Float32List values) => _blink.BlinkWebGLRenderingContext.$vertexAttrib4fv_Callback(this, indx, values);
 
   @DomName('WebGLRenderingContext.vertexAttribPointer')
   @DocsEditable()
-  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.Native_WebGLRenderingContext_vertexAttribPointer_Callback(this, indx, size, type, normalized, stride, offset);
+  void vertexAttribPointer(int indx, int size, int type, bool normalized, int stride, int offset) => _blink.BlinkWebGLRenderingContext.$vertexAttribPointer_Callback(this, indx, size, type, normalized, stride, offset);
 
   @DomName('WebGLRenderingContext.viewport')
   @DocsEditable()
-  void viewport(int x, int y, int width, int height) => _blink.Native_WebGLRenderingContext_viewport_Callback(this, x, y, width, height);
+  void viewport(int x, int y, int width, int height) => _blink.BlinkWebGLRenderingContext.$viewport_Callback(this, x, y, width, height);
 
 
   /**
@@ -2982,15 +2982,15 @@
 
   @DomName('WebGLShaderPrecisionFormat.precision')
   @DocsEditable()
-  int get precision => _blink.Native_WebGLShaderPrecisionFormat_precision_Getter(this);
+  int get precision => _blink.BlinkWebGLShaderPrecisionFormat.$precision_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMax')
   @DocsEditable()
-  int get rangeMax => _blink.Native_WebGLShaderPrecisionFormat_rangeMax_Getter(this);
+  int get rangeMax => _blink.BlinkWebGLShaderPrecisionFormat.$rangeMax_Getter(this);
 
   @DomName('WebGLShaderPrecisionFormat.rangeMin')
   @DocsEditable()
-  int get rangeMin => _blink.Native_WebGLShaderPrecisionFormat_rangeMin_Getter(this);
+  int get rangeMin => _blink.BlinkWebGLShaderPrecisionFormat.$rangeMin_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/sdk/lib/web_sql/dartium/web_sql_dartium.dart b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
index 968b7c7..dd4d696 100644
--- a/sdk/lib/web_sql/dartium/web_sql_dartium.dart
+++ b/sdk/lib/web_sql/dartium/web_sql_dartium.dart
@@ -25,13 +25,13 @@
 
 
 // FIXME: Can we make this private?
-const web_sqlBlinkMap = const {
-  'Database': SqlDatabase,
-  'SQLError': SqlError,
-  'SQLResultSet': SqlResultSet,
-  'SQLResultSetRowList': SqlResultSetRowList,
-  'SQLTransaction': SqlTransaction,
-  'SQLTransactionSync': _SQLTransactionSync,
+final web_sqlBlinkMap = {
+  'Database': () => SqlDatabase,
+  'SQLError': () => SqlError,
+  'SQLResultSet': () => SqlResultSet,
+  'SQLResultSetRowList': () => SqlResultSetRowList,
+  'SQLTransaction': () => SqlTransaction,
+  'SQLTransactionSync': () => _SQLTransactionSync,
 
 };
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -101,7 +101,7 @@
 
   @DomName('Database.version')
   @DocsEditable()
-  String get version => _blink.Native_Database_version_Getter(this);
+  String get version => _blink.BlinkDatabase.$version_Getter(this);
 
   /**
    * Atomically update the database version to [newVersion], asynchronously
@@ -117,15 +117,15 @@
    */
   @DomName('Database.changeVersion')
   @DocsEditable()
-  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_changeVersion_Callback(this, oldVersion, newVersion, callback, errorCallback, successCallback);
+  void changeVersion(String oldVersion, String newVersion, [SqlTransactionCallback callback, SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$changeVersion_Callback(this, oldVersion, newVersion, callback, errorCallback, successCallback);
 
   @DomName('Database.readTransaction')
   @DocsEditable()
-  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_readTransaction_Callback(this, callback, errorCallback, successCallback);
+  void readTransaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$readTransaction_Callback(this, callback, errorCallback, successCallback);
 
   @DomName('Database.transaction')
   @DocsEditable()
-  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.Native_Database_transaction_Callback(this, callback, errorCallback, successCallback);
+  void transaction(SqlTransactionCallback callback, [SqlTransactionErrorCallback errorCallback, VoidCallback successCallback]) => _blink.BlinkDatabase.$transaction_Callback(this, callback, errorCallback, successCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -177,11 +177,11 @@
 
   @DomName('SQLError.code')
   @DocsEditable()
-  int get code => _blink.Native_SQLError_code_Getter(this);
+  int get code => _blink.BlinkSQLError.$code_Getter(this);
 
   @DomName('SQLError.message')
   @DocsEditable()
-  String get message => _blink.Native_SQLError_message_Getter(this);
+  String get message => _blink.BlinkSQLError.$message_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -201,15 +201,15 @@
 
   @DomName('SQLResultSet.insertId')
   @DocsEditable()
-  int get insertId => _blink.Native_SQLResultSet_insertId_Getter(this);
+  int get insertId => _blink.BlinkSQLResultSet.$insertId_Getter(this);
 
   @DomName('SQLResultSet.rows')
   @DocsEditable()
-  SqlResultSetRowList get rows => _blink.Native_SQLResultSet_rows_Getter(this);
+  SqlResultSetRowList get rows => _blink.BlinkSQLResultSet.$rows_Getter(this);
 
   @DomName('SQLResultSet.rowsAffected')
   @DocsEditable()
-  int get rowsAffected => _blink.Native_SQLResultSet_rowsAffected_Getter(this);
+  int get rowsAffected => _blink.BlinkSQLResultSet.$rowsAffected_Getter(this);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -229,15 +229,15 @@
 
   @DomName('SQLResultSetRowList.length')
   @DocsEditable()
-  int get length => _blink.Native_SQLResultSetRowList_length_Getter(this);
+  int get length => _blink.BlinkSQLResultSetRowList.$length_Getter(this);
 
   Map operator[](int index) {
     if (index < 0 || index >= length)
       throw new RangeError.range(index, 0, length);
-    return _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
+    return _blink.BlinkSQLResultSetRowList.$NativeIndexed_Getter(this, index);
   }
 
-  Map _nativeIndexedGetter(int index) => _blink.Native_SQLResultSetRowList_NativeIndexed_Getter(this, index);
+  Map _nativeIndexedGetter(int index) => _blink.BlinkSQLResultSetRowList.$NativeIndexed_Getter(this, index);
 
   void operator[]=(int index, Map value) {
     throw new UnsupportedError("Cannot assign element of immutable List.");
@@ -279,7 +279,7 @@
 
   @DomName('SQLResultSetRowList.item')
   @DocsEditable()
-  Map item(int index) => _blink.Native_SQLResultSetRowList_item_Callback(this, index);
+  Map item(int index) => _blink.BlinkSQLResultSetRowList.$item_Callback(this, index);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
@@ -302,7 +302,7 @@
 
   @DomName('SQLTransaction.executeSql')
   @DocsEditable()
-  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.Native_SQLTransaction_executeSql_Callback(this, sqlStatement, arguments, callback, errorCallback);
+  void executeSql(String sqlStatement, List<Object> arguments, [SqlStatementCallback callback, SqlStatementErrorCallback errorCallback]) => _blink.BlinkSQLTransaction.$executeSql_Callback(this, sqlStatement, arguments, callback, errorCallback);
 
 }
 // Copyright (c) 2012, the Dart project authors.  Please see the AUTHORS file
diff --git a/site/try/app.yaml b/site/try/app.yaml
index 24ae310..dd447c0 100644
--- a/site/try/app.yaml
+++ b/site/try/app.yaml
@@ -28,6 +28,53 @@
 default_expiration: 1s
 
 handlers:
+- url: /packages/analyzer
+  static_dir: packages/analyzer
+
+- url: /packages/args
+  static_dir: packages/args
+
+- url: /packages/collection
+  static_dir: packages/collection
+
+- url: /packages/crypto
+  static_dir: packages/crypto
+
+- url: /packages/http
+  static_dir: packages/http
+
+- url: /packages/http_parser
+  static_dir: packages/http_parser
+
+- url: /packages/intl
+  static_dir: packages/intl
+
+- url: /packages/logging
+  static_dir: packages/logging
+
+- url: /packages/matcher
+  static_dir: packages/matcher
+
+- url: /packages/math
+  static_dir: packages/math
+
+- url: /packages/path
+  static_dir: packages/path
+
+- url: /packages/serialization
+  static_dir: packages/serialization
+
+- url: /packages/stack_trace
+  static_dir: packages/stack_trace
+
+- url: /packages/string_scanner
+  static_dir: packages/string_scanner
+
+- url: /packages/unittest
+  static_dir: packages/unittest
+
+- url: /packages/yaml
+  static_dir: packages/yaml
 
 - url: /favicon\.ico
   static_files: favicon.ico
diff --git a/site/try/build_try.gyp b/site/try/build_try.gyp
index 654fce0..b22d0df 100644
--- a/site/try/build_try.gyp
+++ b/site/try/build_try.gyp
@@ -20,6 +20,7 @@
       'dependencies': [
         '../../runtime/dart-runtime.gyp:dart',
         '../../create_sdk.gyp:create_sdk_internal',
+        '../../pkg/pkg.gyp:pkg_packages',
       ],
       'variables': {
         'try_dart_static_files': [
@@ -39,8 +40,29 @@
           'favicon.ico',
 
           '<(SHARED_INTERMEDIATE_DIR)/leap.dart.js',
+          '<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
           '<(SHARED_INTERMEDIATE_DIR)/sdk.json',
         ],
+        'try_dart_hosted_package_directories': [
+          # These packages are uploaded to Try Dart and can be used in code
+          # there.
+          '../../pkg/analyzer/lib',
+          '../../pkg/args/lib',
+          '../../pkg/collection/lib',
+          '../../pkg/crypto/lib',
+          '../../pkg/http/lib',
+          '../../pkg/http_parser/lib',
+          '../../pkg/intl/lib',
+          '../../pkg/logging/lib',
+          '../../pkg/matcher/lib',
+          '../../pkg/math/lib',
+          '../../pkg/path/lib',
+          '../../pkg/serialization/lib',
+          '../../pkg/stack_trace/lib',
+          '../../pkg/string_scanner/lib',
+          '../../pkg/unittest/lib',
+          '../../pkg/yaml/lib',
+        ],
       },
       'actions': [
         {
@@ -79,6 +101,9 @@
             # action is executed.
             '<(PRODUCT_DIR)/dart-sdk/README',
 
+            # Ensure the packages directory is built first.
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+
             '<!@(["python", "../../tools/list_files.py", "\\.dart$", "src"])',
           ],
           'outputs': [
@@ -86,13 +111,40 @@
           ],
           'action': [
             '<(PRODUCT_DIR)/dart-sdk/bin/dart2js<(script_suffix)',
-            '-p../../sdk/lib/_internal/',
+            '-p<(PRODUCT_DIR)/packages/',
             '-Denable_ir=false',
+            '--show-package-warnings',
             'src/leap.dart',
             '-o<(SHARED_INTERMEDIATE_DIR)/leap.dart.js',
           ],
         },
         {
+          'action_name': 'compile_isolate',
+          'message': 'Creating compiler_isolate.dart.js',
+          'inputs': [
+            # Depending on this file ensures that the SDK is built before this
+            # action is executed.
+            '<(PRODUCT_DIR)/dart-sdk/README',
+
+            # Ensure the packages directory is built first.
+            '<(SHARED_INTERMEDIATE_DIR)/packages.stamp',
+
+            '<!@(["python", "../../tools/list_files.py", "\\.dart$", "src"])',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
+          ],
+          'action': [
+            '<(PRODUCT_DIR)/dart-sdk/bin/dart2js<(script_suffix)',
+            '-p<(PRODUCT_DIR)/packages/',
+            '-Denable_ir=false',
+            '--show-package-warnings',
+            '--trust-type-annotations',
+            'src/compiler_isolate.dart',
+            '-o<(SHARED_INTERMEDIATE_DIR)/compiler_isolate.dart.js',
+          ],
+        },
+        {
           'action_name': 'nossl_appcache',
           'message': 'Creating nossl.appcache',
           'inputs': [
@@ -113,6 +165,24 @@
             '<(SHARED_INTERMEDIATE_DIR)/nossl.appcache',
           ],
         },
+        {
+          'action_name': 'make_pkg_packages',
+          'inputs': [
+            '../../tools/make_links.py',
+            '<@(try_dart_hosted_package_directories)',
+          ],
+          'outputs': [
+            '<(SHARED_INTERMEDIATE_DIR)/try_dartlang_org_packages.stamp',
+            '<(PRODUCT_DIR)/try_dartlang_org/packages'
+          ],
+          'action': [
+            'python', '../../tools/make_links.py',
+            '--timestamp_file=<(SHARED_INTERMEDIATE_DIR)'
+            '/try_dartlang_org_packages.stamp',
+            '<(PRODUCT_DIR)/try_dartlang_org/packages',
+            '<@(_inputs)',
+          ],
+        },
       ],
       'copies': [
         {
diff --git a/site/try/index.html b/site/try/index.html
index 6d6fecb..969e2f1 100644
--- a/site/try/index.html
+++ b/site/try/index.html
@@ -28,13 +28,14 @@
 }
 a.diagnostic>span {
   display: none;
+  max-width: 70%;
 }
 a:hover.diagnostic>span {
   display: block;
   position: absolute;
   /* left: 1em; */
   /* top: 2em; */
-  right: 19px;
+  right: 1%;
 }
 
 .offline {
diff --git a/site/try/src/Makefile b/site/try/src/Makefile
index a7f64a6..d114353 100644
--- a/site/try/src/Makefile
+++ b/site/try/src/Makefile
@@ -3,9 +3,16 @@
 # BSD-style license that can be found in the LICENSE file.
 
 SDK_DIR=../../../xcodebuild/ReleaseIA32/dart-sdk
-PACKAGE_ROOT=../../../sdk/lib/_internal/
+PACKAGE_ROOT=../../../xcodebuild/ReleaseIA32/packages/
 
 all:
-	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) leap.dart --machine 2>&1\
+	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) \
+	--package-warnings --machine leap.dart 2>&1 \
+	| grep -v DEPRECATED_MEMBER_USE \
 	| sed -e "s,$(PWD)/,," \
-	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": " $$8}'
+	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": [" $$3 "] " $$8 }'
+	$(SDK_DIR)/bin/dartanalyzer -p $(PACKAGE_ROOT) \
+	--package-warnings --machine compiler_isolate.dart 2>&1 \
+	| grep -v DEPRECATED_MEMBER_USE \
+	| sed -e "s,$(PWD)/,," \
+	| awk -F'|' '{print $$4 ":" $$5 ":" $$6 ": [" $$3 "] " $$8 }'
diff --git a/site/try/src/caching_compiler.dart b/site/try/src/caching_compiler.dart
deleted file mode 100644
index 0fdd619..0000000
--- a/site/try/src/caching_compiler.dart
+++ /dev/null
@@ -1,139 +0,0 @@
-// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library trydart.caching_compiler;
-
-import 'dart:async' show EventSink;
-
-import 'package:compiler/compiler.dart' show
-    CompilerOutputProvider,
-    Diagnostic,
-    DiagnosticHandler;
-
-import 'package:compiler/implementation/apiimpl.dart' show
-    Compiler;
-
-// This file is copied from a dart2js test which uses dart:io. For now, mock up
-// a bunch of interfaces to silence the analyzer. This file will serve as basis
-// for incremental analysis.
-abstract class SourceFileProvider {}
-class FormattingDiagnosticHandler {
-  FormattingDiagnosticHandler(a);
-}
-abstract class Platform {
-  static var script;
-  static var packageRoot;
-}
-class MemorySourceFileProvider extends SourceFileProvider {
-  var readStringFromUri;
-  var memorySourceFiles;
-  MemorySourceFileProvider(a);
-}
-class NullSink extends EventSink<String> {
-  NullSink(a);
-  add(a) {}
-  addError(a, [b]) {}
-  close() {}
-}
-var expando;
-
-DiagnosticHandler createDiagnosticHandler(DiagnosticHandler diagnosticHandler,
-                                          SourceFileProvider provider,
-                                          bool showDiagnostics) {
-  var handler = diagnosticHandler;
-  if (showDiagnostics) {
-    if (diagnosticHandler == null) {
-      handler = new FormattingDiagnosticHandler(provider);
-    } else {
-      var formattingHandler = new FormattingDiagnosticHandler(provider);
-      handler = (Uri uri, int begin, int end, String message, Diagnostic kind) {
-        diagnosticHandler(uri, begin, end, message, kind);
-        formattingHandler(uri, begin, end, message, kind);
-      };
-    }
-  } else if (diagnosticHandler == null) {
-    handler = (Uri uri, int begin, int end, String message, Diagnostic kind) {};
-  }
-  return handler;
-}
-
-Compiler compilerFor(Map<String,String> memorySourceFiles,
-                     {DiagnosticHandler diagnosticHandler,
-                      CompilerOutputProvider outputProvider,
-                      List<String> options: const [],
-                      Compiler cachedCompiler,
-                      bool showDiagnostics: true,
-                      Uri packageRoot}) {
-  Uri libraryRoot = Uri.base.resolve('sdk/');
-  Uri script = Uri.base.resolveUri(Platform.script);
-  if (packageRoot == null) {
-    packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
-  }
-
-  MemorySourceFileProvider provider;
-  var readStringFromUri;
-  if (cachedCompiler == null) {
-    provider = new MemorySourceFileProvider(memorySourceFiles);
-    readStringFromUri = provider.readStringFromUri;
-    // Saving the provider in case we need it later for a cached compiler.
-    expando[readStringFromUri] = provider;
-  } else {
-    // When using a cached compiler, it has read a number of files from disk
-    // already (and will not attemp to read them again due to caching). These
-    // files must be available to the new diagnostic handler.
-    provider = expando[cachedCompiler.provider];
-    readStringFromUri = cachedCompiler.provider;
-    provider.memorySourceFiles = memorySourceFiles;
-  }
-  var handler =
-      createDiagnosticHandler(diagnosticHandler, provider, showDiagnostics);
-
-  EventSink<String> noOutputProvider(String name, String extension) {
-    if (name != '') throw 'Attempt to output file "$name.$extension"';
-    return new NullSink('$name.$extension');
-  }
-  if (outputProvider == null) {
-    outputProvider = noOutputProvider;
-  }
-
-  Compiler compiler = new Compiler(readStringFromUri,
-                                   outputProvider,
-                                   handler,
-                                   libraryRoot,
-                                   packageRoot,
-                                   options,
-                                   {});
-  if (cachedCompiler != null) {
-    compiler.coreLibrary = cachedCompiler.libraries['dart:core'];
-    compiler.types = cachedCompiler.types;
-    cachedCompiler.libraries.forEach((String uri, library) {
-      if (library.isPlatformLibrary) {
-        compiler.libraries[uri] = library;
-        compiler.onLibraryLoaded(library, library.canonicalUri);
-      }
-    });
-
-    compiler.symbolConstructor = cachedCompiler.symbolConstructor;
-    compiler.mirrorSystemClass = cachedCompiler.mirrorSystemClass;
-    compiler.mirrorsUsedClass = cachedCompiler.mirrorsUsedClass;
-    compiler.mirrorSystemGetNameFunction =
-        cachedCompiler.mirrorSystemGetNameFunction;
-    compiler.symbolImplementationClass =
-        cachedCompiler.symbolImplementationClass;
-    compiler.symbolValidatedConstructor =
-        cachedCompiler.symbolValidatedConstructor;
-    compiler.mirrorsUsedConstructor = cachedCompiler.mirrorsUsedConstructor;
-    compiler.deferredLibraryClass = cachedCompiler.deferredLibraryClass;
-
-    Map cachedTreeElements =
-        cachedCompiler.enqueuer.resolution.resolvedElements;
-    cachedTreeElements.forEach((element, treeElements) {
-      if (element.getLibrary().isPlatformLibrary) {
-        compiler.enqueuer.resolution.resolvedElements[element] =
-            treeElements;
-      }
-    });
-  }
-  return compiler;
-}
diff --git a/site/try/src/compilation.dart b/site/try/src/compilation.dart
index d2cdbc6..d9b28af 100644
--- a/site/try/src/compilation.dart
+++ b/site/try/src/compilation.dart
@@ -14,9 +14,6 @@
     Worker,
     window;
 
-import 'dart:async' show
-    Timer;
-
 import 'dart:isolate' show
     ReceivePort,
     SendPort;
@@ -30,21 +27,19 @@
 
 import 'ui.dart' show
     buildButton,
+    interaction,
     outputDiv,
     outputFrame;
 
 import 'settings.dart' show
     alwaysRunInWorker,
+    incrementalCompilation,
     minified,
     onlyAnalyze,
     verboseCompiler;
 
-@lazy import 'caching_compiler.dart' as cacheCompiler;
-
-@lazy import 'compiler_isolate.dart';
-
-// const lazy = const DeferredLibrary('compiler_isolate');
-const lazy = null;
+import 'iframe_error_handler.dart' show
+    errorStream;
 
 /**
  * Scheme for recognizing files stored in memory.
@@ -78,7 +73,7 @@
   final String source;
   final Element console;
   final ReceivePort receivePort = new ReceivePort();
-  bool isCleared = false;
+  final Set<String> seenMessages = new Set<String>();
   bool isDone = false;
   bool usesDartHtml = false;
   Worker worker;
@@ -95,12 +90,6 @@
     return true;
   }
 
-  void clear() {
-    if (verboseCompiler) return;
-    if (!isCleared) console.nodes.clear();
-    isCleared = true;
-  }
-
   void start() {
     if (!shouldStartCompilation()) {
       receivePort.close();
@@ -108,15 +97,18 @@
     }
     if (current != null) current.dispose();
     current = this;
-    console.nodes.clear();
-    var options = ['--disable-type-inference'];
+    var options = [
+        '--analyze-main',
+        '--no-source-maps',
+    ];
     if (verboseCompiler) options.add('--verbose');
     if (minified) options.add('--minify');
     if (onlyAnalyze) options.add('--analyze-only');
+    if (incrementalCompilation.value) {
+      options.addAll(['--incremental-support', '--disable-type-inference']);
+    }
+    interaction.compilationStarting();
     compilerPort.send([['options', options], receivePort.sendPort]);
-    console.appendHtml('<i class="icon-spinner icon-spin"></i>');
-    console.appendText(' Compiling Dart program...\n');
-    outputFrame.style.display = 'none';
     receivePort.listen(onMessage);
     compilerPort.send([source, receivePort.sendPort]);
   }
@@ -147,11 +139,12 @@
   }
 
   onFail(_) {
-    clear();
-    consolePrint('Compilation failed');
+    // TODO(ahe): Call interaction.onCompilationFailed().
+    interaction.consolePrintLine('Compilation failed');
   }
 
   onDone(_) {
+    interaction.onCompilationDone();
     isDone = true;
     receivePort.close();
   }
@@ -160,7 +153,6 @@
   // web worker.  For example, Chrome and Firefox 21.
   onUrl(String url) {
     objectUrls.add(url);
-    clear();
     String wrapper = '''
 // Fool isolate_helper.dart so it does not think this is an isolate.
 var window = self;
@@ -172,50 +164,25 @@
     var wrapperUrl =
         Url.createObjectUrl(new Blob([wrapper], 'application/javascript'));
     objectUrls.add(wrapperUrl);
-    void retryInIframe(_) {
-      var frame = makeOutputFrame(url);
-      outputFrame.replaceWith(frame);
-      outputFrame = frame;
-      console.append(buildButton('Try in iframe', retryInIframe));
-    }
-    void onError(String errorMessage) {
-      console.appendText(errorMessage);
-      console.appendText(' ');
-      console.append(buildButton('Try in iframe', retryInIframe));
-      console.appendText('\n');
-    }
-    if (usesDartHtml && !alwaysRunInWorker) {
-      retryInIframe(null);
-    } else {
-      runInWorker(wrapperUrl, onError);
-    }
+
+    run(wrapperUrl, () => makeOutputFrame(url));
   }
 
   // This is called in browsers that do not support creating Object
   // URLs in a web worker.  For example, Safari and Firefox < 21.
   onCode(String code) {
-    clear();
-
-    void retryInIframe(_) {
+    IFrameElement makeIframe() {
       // The obvious thing would be to call [makeOutputFrame], but
       // Safari doesn't support access to Object URLs in an iframe.
 
-      var frame = new IFrameElement()
+      IFrameElement frame = new IFrameElement()
           ..src = 'iframe.html'
           ..style.width = '100%'
           ..style.height = '0px';
       frame.onLoad.listen((_) {
         frame.contentWindow.postMessage(['source', code], '*');
       });
-      outputFrame.replaceWith(frame);
-      outputFrame = frame;
-    }
-
-    void onError(String errorMessage) {
-      console.appendText(errorMessage);
-      console.appendText(' ');
-      console.append(buildButton('Try in iframe', retryInIframe));
-      console.appendText('\n');
+      return frame;
     }
 
     String codeWithPrint =
@@ -226,8 +193,29 @@
             new Blob([codeWithPrint], 'application/javascript'));
     objectUrls.add(url);
 
+    run(url, makeIframe);
+  }
+
+  void run(String url, IFrameElement makeIframe()) {
+    void retryInIframe() {
+      var frame = makeIframe();
+      frame.style
+          ..visibility = 'hidden'
+          ..position = 'absolute';
+      outputFrame.parent.insertBefore(frame, outputFrame);
+      outputFrame = frame;
+      errorStream(frame).listen(interaction.onIframeError);
+    }
+    void onError(String errorMessage) {
+      console
+          ..appendText(errorMessage)
+          ..appendText(' ')
+          ..append(buildButton('Try in iframe', (_) => retryInIframe()))
+          ..appendText('\n');
+    }
+    interaction.aboutToRun();
     if (usesDartHtml && !alwaysRunInWorker) {
-      retryInIframe(null);
+      retryInIframe();
     } else {
       runInWorker(url, onError);
     }
@@ -236,7 +224,7 @@
   void runInWorker(String url, void onError(String errorMessage)) {
     worker = new Worker(url)
         ..onMessage.listen((MessageEvent event) {
-          consolePrint(event.data);
+          interaction.consolePrintLine(event.data);
         })
         ..onError.listen((ErrorEvent event) {
           worker.terminate();
@@ -246,61 +234,28 @@
   }
 
   onDiagnostic(Map<String, dynamic> diagnostic) {
+    if (currentSource != source) return;
     String kind = diagnostic['kind'];
     String message = diagnostic['message'];
     if (kind == 'verbose info') {
-      if (verboseCompiler) {
-        consolePrint(message);
-      } else {
-        console.appendText('.');
-      }
+      interaction.verboseCompilerMessage(message);
       return;
     }
     String uri = diagnostic['uri'];
-    if (uri == null) {
-      clear();
-      consolePrint(message);
+    if (uri != '${PRIVATE_SCHEME}:/main.dart') {
+      interaction.consolePrintLine('$uri: [$kind] $message');
       return;
     }
-    if (uri != '${PRIVATE_SCHEME}:/main.dart') return;
-    if (currentSource != source) return;
     int begin = diagnostic['begin'];
     int end = diagnostic['end'];
     if (begin == null) return;
-    addDiagnostic(kind, message, begin, end);
+    if (seenMessages.add('$begin:$end: [$kind] $message')) {
+      // Guard against duplicated messages.
+      addDiagnostic(kind, message, begin, end);
+    }
   }
 
   onCrash(data) {
-    consolePrint(data);
-  }
-
-  void consolePrint(message) {
-    if (window.parent != window) {
-      // Test support.
-      // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
-      // 30 across build bots.  Support for '/' was added in version 29, and we
-      // support the two most recent versions.
-      window.parent.postMessage('$message\n', '*');
-    }
-    console.appendText('$message\n');
-  }
-}
-
-void compilerIsolate(SendPort port) {
-  // TODO(ahe): Restore when restoring deferred loading.
-  // lazy.load().then((_) => port.listen(compile));
-  ReceivePort replyTo = new ReceivePort();
-  port.send(replyTo.sendPort);
-  replyTo.listen((message) {
-    List list = message as List;
-    try {
-      compile(list[0], list[1]);
-    } catch (exception, stack) {
-      port.send('$exception\n$stack');
-    }
-  });
-  var notTrue = false; // Confuse the analyzer.
-  if (notTrue) {
-    cacheCompiler.compilerFor(null);
+    interaction.consolePrintLine(data);
   }
 }
diff --git a/site/try/src/compiler_isolate.dart b/site/try/src/compiler_isolate.dart
index d9981b3..844aaa9 100644
--- a/site/try/src/compiler_isolate.dart
+++ b/site/try/src/compiler_isolate.dart
@@ -13,13 +13,25 @@
 
 import 'package:compiler/compiler.dart' as compiler;
 
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    reuseCompiler;
+
 const bool THROW_ON_ERROR = false;
 
-final cachedSources = new Map<Uri, String>();
+final cachedSources = new Map<Uri, Future<String>>();
 
 Uri sdkLocation;
 List options = [];
 
+var cachedCompiler;
+
+void notifyDartHtml(SendPort port) {
+  // Notify the controlling isolate (Try Dart UI) that the program imports
+  // dart:html. This is used to determine how to run the program: in an iframe
+  // or in a worker.
+  port.send('dart:html');
+}
+
 compile(source, SendPort replyTo) {
   if (sdkLocation == null) {
     // The first message received gives us the URI of this web app.
@@ -32,7 +44,7 @@
       }
       sdkLocation = Uri.parse('sdk:/sdk/');
       JSON.decode(request.responseText).forEach((file, content) {
-        cachedSources[Uri.parse(file)] = content;
+        cachedSources[Uri.parse(file)] = new Future<String>.value(content);
       });
     } else {
       sdkLocation = Uri.parse(source);
@@ -50,29 +62,34 @@
   }
   int charactersRead = 0;
   Future<String> inputProvider(Uri uri) {
-    if (uri.path.endsWith('/lib/html/dart2js/html_dart2js.dart')) {
-      replyTo.send('dart:html');
-    }
+    Future<String> future;
     if (uri.scheme == 'sdk') {
-      var value = cachedSources[uri];
-      charactersRead += value.length;
-      return new Future.value(value);
+      if (uri.path.endsWith('/lib/html/dart2js/html_dart2js.dart')) {
+        notifyDartHtml(replyTo);
+      }
+      future = cachedSources[uri];
     } else if (uri.scheme == 'http' || uri.scheme == 'https') {
-      var value = cachedSources.putIfAbsent(uri, () {
-        var request = new HttpRequest();
-        request.open('GET', '$uri', async: false);
-        request.send(null);
-        return request.responseText;
-      });
-      charactersRead += value.length;
-      return new Future.value(value);
+      future =
+          cachedSources.putIfAbsent(uri, () => HttpRequest.getString('$uri'));
     } else if ('$uri' == '$PRIVATE_SCHEME:/main.dart') {
-      charactersRead += source.length;
-      return new Future.value(source);
+      future = new Future<String>.value(source);
     } else if (uri.scheme == PRIVATE_SCHEME) {
-      return HttpRequest.getString('project${uri.path}');
+      future = HttpRequest.getString('project${uri.path}');
     }
-    throw new Exception('Error: Cannot read: $uri');
+    if (future == null) {
+      future = new Future<String>.error('$uri: Not found');
+    }
+    return future.then((String value) {
+      charactersRead += value.length;
+      return value;
+    }).catchError((Event event) {
+      var target = event.target;
+      if (target is HttpRequest) {
+        throw '$uri: ${target.statusText}';
+      } else {
+        throw event;
+      }
+    }, test: (error) => error is Event);
   }
   void handler(Uri uri, int begin, int end,
                String message, compiler.Diagnostic kind) {
@@ -85,40 +102,61 @@
       throw new Exception('Throw on error');
     }
   }
-  compiler.compile(Uri.parse('$PRIVATE_SCHEME:/main.dart'),
-                   sdkLocation,
-                   Uri.parse('packages/'),
-                   inputProvider,
-                   handler,
-                   options).then((js) {
-    try {
-      if (js == null) {
-        if (!options.contains('--analyze-only')) replyTo.send('failed');
-      } else {
-        var url;
-        if (options.contains('--verbose')) {
-          handler(null, 0, 0,
-                  'Compiled ${source.length}/${charactersRead} characters Dart'
-                  ' -> ${js.length} characters.',
-                  compiler.Diagnostic.VERBOSE_INFO);
-        }
-        try {
-          // At least Safari and Firefox do not support creating an
-          // object URL from a web worker.  MDN claims that it will be
-          // supported in Firefox 21.
-          url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
-        } catch (_) {
-          // Ignored.
-        }
-        if (url != null) {
-          replyTo.send(['url', url]);
-        } else {
-          replyTo.send(['code', js]);
-        }
-      }
-    } catch (e, trace) {
-      replyTo.send(['crash', '$e, $trace']);
+  Stopwatch compilationTimer = new Stopwatch()..start();
+  cachedCompiler = reuseCompiler(
+      diagnosticHandler: handler,
+      inputProvider: inputProvider,
+      options: options,
+      cachedCompiler: cachedCompiler,
+      libraryRoot: sdkLocation,
+      packageRoot: Uri.base.resolve('/packages/'),
+      packagesAreImmutable: true);
+
+  cachedCompiler.run(Uri.parse('$PRIVATE_SCHEME:/main.dart')).then((success) {
+    compilationTimer.stop();
+    print('Compilation took ${compilationTimer.elapsed}');
+    if (cachedCompiler.libraries.containsKey('dart:html')) {
+      notifyDartHtml(replyTo);
     }
+    String js = cachedCompiler.assembledCode;
+    if (js == null) {
+      if (!options.contains('--analyze-only')) replyTo.send('failed');
+    } else {
+      var url;
+      handler(null, 0, 0,
+              'Compiled ${source.length}/${charactersRead} characters Dart'
+              ' -> ${js.length} characters.',
+              compiler.Diagnostic.VERBOSE_INFO);
+      try {
+        // At least Safari and Firefox do not support creating an
+        // object URL from a web worker.  MDN claims that it will be
+        // supported in Firefox 21.
+        url = Url.createObjectUrl(new Blob([js], 'application/javascript'));
+      } catch (_) {
+        // Ignored.
+      }
+      if (url != null) {
+        replyTo.send(['url', url]);
+      } else {
+        replyTo.send(['code', js]);
+      }
+    }
+  }).catchError((e, trace) {
+    replyTo.send(['crash', '$e, $trace']);
+  }).whenComplete(() {
     replyTo.send('done');
   });
 }
+
+void main(List<String> arguments, SendPort port) {
+  ReceivePort replyTo = new ReceivePort();
+  port.send(replyTo.sendPort);
+  replyTo.listen((message) {
+    try {
+      List list = message as List;
+      compile(list[0], list[1]);
+    } catch (exception, stack) {
+      port.send('$exception\n$stack');
+    }
+  });
+}
diff --git a/site/try/src/decoration.dart b/site/try/src/decoration.dart
index 930cbcb..663aeea 100644
--- a/site/try/src/decoration.dart
+++ b/site/try/src/decoration.dart
@@ -80,7 +80,7 @@
   }
   SpanElement result = new SpanElement()
       ..classes.addAll(classes)
-      ..style.opacity = '0.75';
+      ..style.fontWeight = 'normal';
   setShadowRoot(result, text);
   return result;
 }
diff --git a/site/try/src/editor.dart b/site/try/src/editor.dart
index db21ef9..615a853 100644
--- a/site/try/src/editor.dart
+++ b/site/try/src/editor.dart
@@ -15,6 +15,7 @@
 import 'ui.dart' show
     currentTheme,
     hackDiv,
+    interaction,
     mainEditorPane,
     observer,
     outputDiv;
@@ -33,6 +34,8 @@
 import 'shadow_root.dart' show
     getShadowRoot;
 
+import 'settings.dart' as settings;
+
 const String INDENT = '\u{a0}\u{a0}';
 
 Set<String> seenIdentifiers;
@@ -150,20 +153,54 @@
       if (offset <= begin && begin < newOffset) {
         hasSelection = node == anchorNode;
         anchorOffset = selection.anchorOffset;
-        Node marker = new Text("");
-        node.replaceWith(marker);
-        // TODO(ahe): Don't highlight everything in the node.  Find the
-        // relevant token (works for now as we create a node for each token,
-        // which is probably not great for performance).
+        var alert;
         if (kind == 'error') {
-          marker.replaceWith(diagnostic(node, error(message)));
+          alert = error(message);
         } else if (kind == 'warning') {
-          marker.replaceWith(diagnostic(node, warning(message)));
+          alert = warning(message);
         } else {
-          marker.replaceWith(diagnostic(node, info(message)));
+          alert = info(message);
         }
-        if (hasSelection) {
-          selection.collapse(node, anchorOffset);
+        Element parent = node.parent;
+        if (parent.classes.contains("diagnostic") &&
+            !interaction.oldDiagnostics.contains(parent)) {
+          Element other = parent.lastChild;
+          other.remove();
+          SpanElement wrapper = new SpanElement();
+          wrapper.style
+              ..fontWeight = 'normal';
+          var root = getShadowRoot(wrapper);
+          if (root is ShadowRoot) {
+            // When https://code.google.com/p/chromium/issues/detail?id=313458
+            // is fixed:
+            // var link = new LinkElement()
+            //     ..rel = "stylesheet"
+            //     ..type = "text/css"
+            //     ..href = "dartlang-style.css";
+            // root.append(link);
+            root.append(
+                new StyleElement()..text = '@import url(dartlang-style.css)');
+          }
+          root
+              ..append(other)
+              ..append(alert);
+          other.style.display = 'block';
+          alert.style.display = 'block';
+          parent.append(wrapper);
+        } else {
+          if (interaction.oldDiagnostics.contains(parent)) {
+            node.remove();
+            parent.replaceWith(node);
+          }
+          Node marker = new Text("");
+          node.replaceWith(marker);
+          // TODO(ahe): Don't highlight everything in the node.  Find the
+          // relevant token (works for now as we create a node for each token,
+          // which is probably not great for performance).
+          marker.replaceWith(diagnostic(node, alert));
+          if (hasSelection) {
+            selection.collapse(node, anchorOffset);
+          }
         }
         foundNode = true;
         return;
@@ -216,7 +253,11 @@
   if (tokenInfo == 'string') return currentTheme.string;
   if (tokenInfo == 'identifier') {
     seenIdentifiers.add(tokenValue);
-    return CodeCompletionDecoration.from(currentTheme.foreground);
+    Decoration decoration = currentTheme.foreground;
+    if (settings.enableCodeCompletion.value) {
+      decoration = CodeCompletionDecoration.from(decoration);
+    }
+    return decoration;
   }
   if (tokenInfo == 'keyword') return currentTheme.keyword;
   if (tokenInfo == 'comment') return currentTheme.singleLineComment;
diff --git a/site/try/src/iframe_error_handler.dart b/site/try/src/iframe_error_handler.dart
new file mode 100644
index 0000000..a1077be
--- /dev/null
+++ b/site/try/src/iframe_error_handler.dart
@@ -0,0 +1,96 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+library trydart.iframe_error_handler;
+
+// TODO(ahe): Remove this import if issue 17936 is fixed.
+import 'dart:js' as hack;
+
+import 'dart:html' show
+    Event,
+    IFrameElement,
+    window;
+
+import 'dart:async' show
+    Stream,
+    StreamController;
+
+class ErrorMessage {
+  final String message;
+  final String filename;
+  final num lineno;
+  final num colno;
+  final String stack;
+
+  ErrorMessage(
+      this.message, this.filename, this.lineno, this.colno, this.stack);
+
+  String toString() {
+    String result = filename == null ? '' : filename;
+    if (lineno != null && lineno != 0 && !lineno.isNaN) {
+      result += ':$lineno';
+    }
+    if (colno != null && colno != 0 && !colno.isNaN) {
+      result += ':$colno';
+    }
+    if (message != null && !message.isEmpty) {
+      if (!result.isEmpty) {
+        result += ': ';
+      }
+      result += message;
+    }
+    if (stack != null && !stack.isEmpty) {
+      if (!result.isEmpty) {
+        result += '\n';
+      }
+      result += stack;
+    }
+    return result;
+  }
+}
+
+Stream<ErrorMessage> errorStream(IFrameElement iframe) {
+  StreamController<ErrorMessage> controller =
+      new StreamController<ErrorMessage>();
+  void onError(
+      String message,
+      String filename,
+      int lineno,
+      [int colno,
+       error]) {
+    // See:
+    // https://mikewest.org/2013/08/debugging-runtime-errors-with-window-onerror
+    String stack;
+    if (error != null) {
+      var jsStack = error['stack'];
+      if (jsStack != null) {
+        stack = hack.context.callMethod('String', [jsStack]);
+      }
+    }
+    controller.add(new ErrorMessage(message, filename, lineno, colno, stack));
+  }
+
+  void installErrorHandler() {
+    // This method uses dart:js to install an error event handler on the content
+    // window of [iframe]. This is a workaround for http://dartbug.com/17936.
+    var iframeProxy = new hack.JsObject.fromBrowserObject(iframe);
+    var contentWindowProxy = iframeProxy['contentWindow'];
+    if (contentWindowProxy == null) {
+      String message =
+          'No contentWindow, call this method *after* adding iframe to'
+          ' document.';
+      window.console.error(message);
+      throw message;
+    }
+
+    // Note: we have two options, use "iframe.contentWindow.onerror = ..." or
+    // "iframe.contentWindow.addEventListener('error', ...)".  The former seems
+    // to provide more details on both Chrome and Firefox (which provides no
+    // information at all in error events).
+    contentWindowProxy['onerror'] = onError;
+  }
+  iframe.onLoad.listen((Event event) => installErrorHandler());
+  installErrorHandler();
+  return controller.stream;
+}
diff --git a/site/try/src/interaction_manager.dart b/site/try/src/interaction_manager.dart
index 4e1d454..dba6d55 100644
--- a/site/try/src/interaction_manager.dart
+++ b/site/try/src/interaction_manager.dart
@@ -43,6 +43,7 @@
     mainEditorPane,
     observer,
     outputDiv,
+    outputFrame,
     statusDiv;
 
 import 'decoration.dart' show
@@ -75,16 +76,34 @@
     removeShadowRootPolyfill,
     setShadowRoot;
 
+import 'iframe_error_handler.dart' show
+    ErrorMessage;
+
 const String TRY_DART_NEW_DEFECT =
     'https://code.google.com/p/dart/issues/entry'
     '?template=Try+Dart+Internal+Error';
 
-const Duration HEARTBEAT_INTERVAL = const Duration(milliseconds: 500);
+/// How frequently [InteractionManager.onHeartbeat] is called.
+const Duration HEARTBEAT_INTERVAL = const Duration(milliseconds: 50);
 
+/// Determines how frequently "project" files are saved.  The time is measured
+/// from the time of last modification.
 const Duration SAVE_INTERVAL = const Duration(seconds: 5);
 
+/// Determines how frequently the compiler is invoked.  The time is measured
+/// from the time of last modification.
 const Duration COMPILE_INTERVAL = const Duration(seconds: 1);
 
+/// Determines how frequently the compiler is invoked in "live" mode.  The time
+/// is measured from the time of last modification.
+const Duration LIVE_COMPILE_INTERVAL = const Duration(seconds: 0);
+
+/// Determines if a compilation is slow.  The time is measured from the last
+/// compilation started.  If a compilation is slow, progress information is
+/// displayed to the user, but the console is untouched if the compilation
+/// finished quickly.  The purpose is to reduce flicker in the UI.
+const Duration SLOW_COMPILE = const Duration(seconds: 1);
+
 /**
  * UI interaction manager for the entire application.
  */
@@ -107,6 +126,9 @@
 
   InteractionManager.internal();
 
+  // TODO(ahe): Remove this.
+  Set<AnchorElement> get oldDiagnostics;
+
   void onInput(Event event);
 
   // TODO(ahe): Rename to onKeyDown (as it is called in response to keydown
@@ -128,8 +150,30 @@
   /// Called when notified about a project file changed (on the server).
   void onProjectFileFsEvent(MessageEvent e);
 
-  /// Called every 500ms.
+  /// Called every [HEARTBEAT_INTERVAL].
   void onHeartbeat(Timer timer);
+
+  /// Called by [:window.onMessage.listen:].
+  void onWindowMessage(MessageEvent event);
+
+  void onCompilationFailed();
+
+  void onCompilationDone();
+
+  /// Called when a compilation is starting, but just before sending the
+  /// initiating message to the compiler isolate.
+  void compilationStarting();
+
+  // TODO(ahe): Remove this from InteractionManager, but not from InitialState.
+  void consolePrintLine(line);
+
+  /// Called just before running a freshly compiled program.
+  void aboutToRun();
+
+  /// Called when an error occurs when running user code in an iframe.
+  void onIframeError(ErrorMessage message);
+
+  void verboseCompilerMessage(String message);
 }
 
 /**
@@ -144,10 +188,15 @@
 
   final Queue<CompilationUnit> unitsToSave = new Queue<CompilationUnit>();
 
+  /// Tracks time since last modification of a "project" file.
   final Stopwatch saveTimer = new Stopwatch();
 
+  /// Tracks time since last modification.
   final Stopwatch compileTimer = new Stopwatch();
 
+  /// Tracks elapsed time of current compilation.
+  final Stopwatch elapsedCompilationTime = new Stopwatch();
+
   CompilationUnit currentCompilationUnit =
       // TODO(ahe): Don't use a fake unit.
       new CompilationUnit('fake', '');
@@ -156,6 +205,18 @@
 
   Completer<String> completeSaveOperation;
 
+  bool shouldClearConsole = false;
+
+  Element compilerConsole;
+
+  bool isFirstCompile = true;
+
+  final Set<AnchorElement> oldDiagnostics = new Set<AnchorElement>();
+
+  final Duration compileInterval = settings.live.value
+      ? LIVE_COMPILE_INTERVAL
+      : COMPILE_INTERVAL;
+
   InteractionContext()
       : super.internal() {
     state = new InitialState(this);
@@ -213,11 +274,34 @@
   }
 
   void onHeartbeat(Timer timer) => state.onHeartbeat(timer);
+
+  void onWindowMessage(MessageEvent event) => state.onWindowMessage(event);
+
+  void onCompilationFailed() => state.onCompilationFailed();
+
+  void onCompilationDone() => state.onCompilationDone();
+
+  void compilationStarting() => state.compilationStarting();
+
+  void consolePrintLine(line) => state.consolePrintLine(line);
+
+  void aboutToRun() => state.aboutToRun();
+
+  void onIframeError(ErrorMessage message) => state.onIframeError(message);
+
+  void verboseCompilerMessage(String message) {
+    return state.verboseCompilerMessage(message);
+  }
 }
 
 abstract class InteractionState implements InteractionManager {
   InteractionContext get context;
 
+  // TODO(ahe): Remove this.
+  Set<AnchorElement> get oldDiagnostics {
+    throw 'Use context.oldDiagnostics instead';
+  }
+
   void set state(InteractionState newState);
 
   void onStateChanged(InteractionState previous) {
@@ -493,13 +577,19 @@
       saveUnits();
     }
     if (!settings.compilationPaused &&
-        context.compileTimer.elapsed > COMPILE_INTERVAL) {
+        context.compileTimer.elapsed > context.compileInterval) {
       if (startCompilation()) {
         context.compileTimer
             ..stop()
             ..reset();
       }
     }
+
+    if (context.elapsedCompilationTime.elapsed > SLOW_COMPILE) {
+      if (context.compilerConsole.parent == null) {
+        outputDiv.append(context.compilerConsole);
+      }
+    }
   }
 
   void saveUnits() {
@@ -527,6 +617,132 @@
     }
     setupCompleter();
   }
+
+  void onWindowMessage(MessageEvent event) {
+    if (event.source is! WindowBase || event.source == window) {
+      return onBadMessage(event);
+    }
+    if (event.data is List) {
+      List message = event.data;
+      if (message.length > 0) {
+        switch (message[0]) {
+          case 'scrollHeight':
+            return onScrollHeightMessage(message[1]);
+        }
+      }
+      return onBadMessage(event);
+    } else {
+      return consolePrintLine(event.data);
+    }
+  }
+
+  /// Called when an exception occurs in an iframe.
+  void onErrorMessage(ErrorMessage message) {
+    outputDiv.appendText('$message\n');
+  }
+
+  /// Called when an iframe is modified.
+  void onScrollHeightMessage(int scrollHeight) {
+    window.console.log('scrollHeight = $scrollHeight');
+    if (scrollHeight > 8) {
+      outputFrame.style
+          ..height = '${scrollHeight}px'
+          ..visibility = ''
+          ..position = '';
+      while (outputFrame.nextNode is IFrameElement) {
+        outputFrame.nextNode.remove();
+      }
+    }
+  }
+
+  void onBadMessage(MessageEvent event) {
+    window.console
+        ..groupCollapsed('Bad message')
+        ..dir(event)
+        ..log(event.source.runtimeType)
+        ..groupEnd();
+  }
+
+  void consolePrintLine(line) {
+    if (context.shouldClearConsole) {
+      context.shouldClearConsole = false;
+      outputDiv.nodes.clear();
+    }
+    if (window.parent != window) {
+      // Test support.
+      // TODO(ahe): Use '/' instead of '*' when Firefox is upgraded to version
+      // 30 across build bots.  Support for '/' was added in version 29, and we
+      // support the two most recent versions.
+      window.parent.postMessage('$line\n', '*');
+    }
+    outputDiv.appendText('$line\n');
+  }
+
+  void onCompilationFailed() {
+  }
+
+  void onCompilationDone() {
+    context.isFirstCompile = false;
+    context.elapsedCompilationTime.stop();
+    Duration compilationDuration = context.elapsedCompilationTime.elapsed;
+    context.elapsedCompilationTime.reset();
+    print('Compilation took $compilationDuration.');
+    if (context.compilerConsole.parent != null) {
+      context.compilerConsole.remove();
+    }
+    for (AnchorElement diagnostic in context.oldDiagnostics) {
+      if (diagnostic.parent != null) {
+        // Problem fixed, remove the diagnostic.
+        diagnostic.replaceWith(new Text(getText(diagnostic)));
+      }
+    }
+    context.oldDiagnostics.clear();
+    observer.takeRecords(); // Discard mutations.
+  }
+
+  void compilationStarting() {
+    var progress = new SpanElement()
+        ..appendHtml('<i class="icon-spinner icon-spin"></i>')
+        ..appendText(' Compiling Dart program.');
+    if (settings.verboseCompiler) {
+      progress.appendText('..');
+    }
+    context.compilerConsole = new SpanElement()
+        ..append(progress)
+        ..appendText('\n');
+    context.shouldClearConsole = true;
+    context.elapsedCompilationTime
+        ..start()
+        ..reset();
+    if (context.isFirstCompile) {
+      outputDiv.append(context.compilerConsole);
+    }
+    context.oldDiagnostics
+        ..clear()
+        ..addAll(mainEditorPane.querySelectorAll('a.diagnostic'));
+  }
+
+  void aboutToRun() {
+    context.shouldClearConsole = true;
+  }
+
+  void onIframeError(ErrorMessage message) {
+    // TODO(ahe): Consider replacing object URLs with something like <a
+    // href='...'>out.js</a>.
+    // TODO(ahe): Use source maps to translate stack traces.
+    consolePrintLine(message);
+  }
+
+  void verboseCompilerMessage(String message) {
+    if (settings.verboseCompiler) {
+      context.compilerConsole.appendText('$message\n');
+    } else {
+      if (isCompilerStageMarker(message)) {
+        Element progress = context.compilerConsole.firstChild;
+        progress.appendText('.');
+      }
+    }
+  }
 }
 
 Future<String> getString(uri) {
@@ -976,3 +1192,14 @@
     element.remove();
   }
 }
+
+bool isCompilerStageMarker(String message) {
+  return
+      message.startsWith('Package root is ') ||
+      message.startsWith('Compiling ') ||
+      message == "Resolving..." ||
+      message.startsWith('Resolved ') ||
+      message == "Inferring types..." ||
+      message == "Compiling..." ||
+      message.startsWith('Compiled ');
+}
diff --git a/site/try/src/isolate_legacy.dart b/site/try/src/isolate_legacy.dart
deleted file mode 100644
index 4b2dd6e..0000000
--- a/site/try/src/isolate_legacy.dart
+++ /dev/null
@@ -1,17 +0,0 @@
-// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
-// for details. All rights reserved. Use of this source code is governed by a
-// BSD-style license that can be found in the LICENSE file.
-
-library trydart.isolate_legacy;
-
-import 'dart:isolate';
-
-ReceivePort spawnFunction(void function(SendPort port)) {
-  ReceivePort port = new ReceivePort();
-  Isolate.spawn(function, port.sendPort);
-  return port;
-}
-
-ReceivePort spawnDomFunction(void function(SendPort port)) {
-  throw 'spawnDomFunction is no more';
-}
diff --git a/site/try/src/leap.dart b/site/try/src/leap.dart
index 1504c6e..4a9d0c6 100644
--- a/site/try/src/leap.dart
+++ b/site/try/src/leap.dart
@@ -11,6 +11,7 @@
     window;
 
 import 'dart:isolate' show
+    Isolate,
     ReceivePort,
     SendPort;
 
@@ -19,10 +20,6 @@
     compilerPort,
     currentSource;
 
-import 'isolate_legacy.dart' show
-    spawnDomFunction,
-    spawnFunction;
-
 import 'samples.dart' show
     EXAMPLE_HELLO;
 
@@ -36,19 +33,6 @@
 
 int count = 0;
 
-const String HAS_NON_DOM_HTTP_REQUEST = 'spawnFunction supports HttpRequest';
-const String NO_NON_DOM_HTTP_REQUEST =
-    'spawnFunction does not support HttpRequest';
-
-checkHttpRequest(SendPort replyTo) {
-  try {
-    new HttpRequest();
-    replyTo.send(HAS_NON_DOM_HTTP_REQUEST);
-  } catch (e, trace) {
-    replyTo.send(NO_NON_DOM_HTTP_REQUEST);
-  }
-}
-
 main() {
   UserOption.storage = window.localStorage;
   if (currentSource == null) {
@@ -56,13 +40,10 @@
   }
 
   buildUI();
-  spawnFunction(checkHttpRequest).first.then((reply) {
-    ReceivePort port;
-    if (reply == HAS_NON_DOM_HTTP_REQUEST) {
-      port = spawnFunction(compilerIsolate);
-    } else {
-      port = spawnDomFunction(compilerIsolate);
-    }
+  ReceivePort port = new ReceivePort();
+  Isolate.spawnUri(
+      Uri.base.resolve('compiler_isolate.dart.js'),
+      const <String>[], port.sendPort).then((Isolate isolate) {
     LinkElement link = querySelector('link[rel="dart-sdk"]');
     String sdk = link.href;
     print('Using Dart SDK: $sdk');
diff --git a/site/try/src/messages.dart b/site/try/src/messages.dart
index 830f19f..62f4fb4 100644
--- a/site/try/src/messages.dart
+++ b/site/try/src/messages.dart
@@ -32,4 +32,7 @@
 
   'theme':
     'Theme:',
+
+  'incrementalCompilation':
+    'Enable incremental compilation (EXPERIMENTAL)',
 };
diff --git a/site/try/src/run.dart b/site/try/src/run.dart
index 3eae698..e453a70 100644
--- a/site/try/src/run.dart
+++ b/site/try/src/run.dart
@@ -35,37 +35,37 @@
 
 const String OUTPUT_HELPER = r'''
 function dartPrint(msg) {
+  // Send a message to the main Try Dart window.
   window.parent.postMessage(String(msg), "*");
 }
 
 function dartMainRunner(main) {
+  // Store the current height (of an empty document).  This implies that the
+  // main Try Dart application is only notified if the document is actually
+  // changed.
+  var previousScrollHeight = document.documentElement.scrollHeight;
+
+  function postScrollHeight(mutations, observer) {
+    var scrollHeight = document.documentElement.scrollHeight;
+    if (scrollHeight !== previousScrollHeight) {
+      previousScrollHeight = scrollHeight;
+      window.parent.postMessage(["scrollHeight", scrollHeight], "*");
+    }
+  }
+
+  var MutationObserver =
+      window.MutationObserver ||
+      window.WebKitMutationObserver ||
+      window.MozMutationObserver;
+
+  // Listen to any changes to the DOM.
+  new MutationObserver(postScrollHeight).observe(
+      document.documentElement,
+      { attributes: true,
+        childList: true,
+        characterData: true,
+        subtree: true });
+
   main();
 }
-
-window.onerror = function (message, url, lineNumber) {
-  window.parent.postMessage(
-      ["error", {message: message, url: url, lineNumber: lineNumber}], "*");
-};
-
-(function () {
-
-function postScrollHeight() {
-  window.parent.postMessage(
-      ["scrollHeight", document.documentElement.scrollHeight], "*");
-}
-
-var observer = new (window.MutationObserver ||
-                    window.WebKitMutationObserver ||
-                    window.MozMutationObserver)(function(mutations) {
-  postScrollHeight()
-  window.setTimeout(postScrollHeight, 500);
-});
-
-observer.observe(
-    document.body,
-    { attributes: true,
-      childList: true,
-      characterData: true,
-      subtree: true });
-})();
 ''';
diff --git a/site/try/src/settings.dart b/site/try/src/settings.dart
index 58b306e74..9778206 100644
--- a/site/try/src/settings.dart
+++ b/site/try/src/settings.dart
@@ -90,6 +90,11 @@
 const BooleanUserOption enableCodeCompletion =
     const BooleanUserOption('enableCodeCompletion', isHidden: true);
 
+const BooleanUserOption incrementalCompilation =
+    const BooleanUserOption('incrementalCompilation');
+
+const BooleanUserOption live = const BooleanUserOption('live', isHidden: true);
+
 const List<UserOption> options = const <UserOption>[
     _alwaysRunInWorker,
     _verboseCompiler,
@@ -97,8 +102,10 @@
     _onlyAnalyze,
     _enableDartMind,
     _compilationPaused,
+    incrementalCompilation,
+    live,
+    enableCodeCompletion,
     _codeFont,
     _theme,
     _currentSample,
-    enableCodeCompletion,
   ];
diff --git a/site/try/src/ui.dart b/site/try/src/ui.dart
index 2909888..e678f38 100644
--- a/site/try/src/ui.dart
+++ b/site/try/src/ui.dart
@@ -92,6 +92,7 @@
   Function action = codeCallbacks[id];
   if (action != null) action(event);
   outputFrame.style.display = 'none';
+  outputDiv.nodes.clear();
 }
 
 buildUI() {
@@ -198,27 +199,7 @@
   var settingsElement = document.getElementById('settings');
   settingsElement.onClick.listen(openSettings);
 
-  window.onMessage.listen((MessageEvent event) {
-    if (event.data is List) {
-      List message = event.data;
-      if (message.length > 0) {
-        switch (message[0]) {
-        case 'error':
-          Map diagnostics = message[1];
-          String url = diagnostics['url'];
-          outputDiv.appendText('${diagnostics["message"]}\n');
-          return;
-        case 'scrollHeight':
-          int scrollHeight = message[1];
-          if (scrollHeight > 0) {
-            outputFrame.style.height = '${scrollHeight}px';
-          }
-          return;
-        }
-      }
-    }
-    outputDiv.appendText('${event.data}\n');
-  });
+  window.onMessage.listen(interaction.onWindowMessage);
 
   observer = new MutationObserver(interaction.onMutation)
       ..observe(
diff --git a/site/try/src/user_option.dart b/site/try/src/user_option.dart
index ce802a4..25c0f0f 100644
--- a/site/try/src/user_option.dart
+++ b/site/try/src/user_option.dart
@@ -4,6 +4,23 @@
 
 library trydart.userOption;
 
+/// Persistent user-configurable option.
+///
+/// Options included in [options] in settings.dart will automatically be
+/// included in the settings UI unless [isHidden] is true.
+///
+/// The value of an option is persisted in [storage] which is normally the
+/// browser's "localStorage", and [name] is a key in "localStorage".  This
+/// means that hidden options can be controlled by opening the JavaScript
+/// console and evaluate:
+///
+///   localStorage['name'] = value // or
+///   localStorage.name = value
+///
+/// An option can be reset to the default value using:
+///
+///   delete localStorage['name'] // or
+///   delete localStorage.name
 class UserOption {
   final String name;
 
diff --git a/tests/co19/co19-analyzer.status b/tests/co19/co19-analyzer.status
index 1baf670..076b009 100644
--- a/tests/co19/co19-analyzer.status
+++ b/tests/co19/co19-analyzer.status
@@ -39,17 +39,6 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #685: Non-bool operand of && and || produces a static type warning
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
-
-# co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
-Language/07_Classes/07_Classes_A03_t06: Fail, OK
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
-
-Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
-
 LibTest/isolate/IsolateStream/any_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/asBroadcastStream_A01_t01: Fail # co19-roll r706: Please triage this failure.
 LibTest/isolate/IsolateStream/contains_A01_t01: Fail # co19-roll r706: Please triage this failure.
@@ -166,6 +155,7 @@
 LibTest/math/Point/operator_subtraction_A02_t01: StaticWarning # co19-roll r706: Please triage this failure.
 WebPlatformTest/dom/events/event_constants/constants_A01_t01: StaticWarning # co19-roll r706: Please triage this failure.
 
+# co19-roll r722
 LayoutTests/fast/dom/HTMLAnchorElement/anchor-ismap-crash_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLAnchorElement/set-href-attribute-rebase_t01: StaticWarning # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLBaseElement/href-attribute-resolves-with-respect-to-document_t01: StaticWarning # co19-roll r722: Please triage this failure.
@@ -225,3 +215,58 @@
 WebPlatformTest/dom/nodes/Node-isEqualNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
+
+# co19-roll r738
+Language/07_Classes/4_Abstract_Instance_Members_A07_t02: MissingStaticWarning # co19-roll r738: Please triage this failure.
+Language/07_Classes/07_Classes_A03_t06: MissingStaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/replaceable_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-rule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/destroy-selected-radio-button-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-missing-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-named-attribute-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
diff --git a/tests/co19/co19-analyzer2.status b/tests/co19/co19-analyzer2.status
index 2561cc9..b9f6ace 100644
--- a/tests/co19/co19-analyzer2.status
+++ b/tests/co19/co19-analyzer2.status
@@ -3,6 +3,8 @@
 # BSD-style license that can be found in the LICENSE file.
 
 [ $compiler == dart2analyzer ]
+LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash # co19 issue 692
+LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash # co19 issue 692
 
 LibTest/core/RegExp/firstMatch_A01_t01: Fail
 
@@ -39,14 +41,8 @@
 # co19 issue #615: Expect import missing
 LibTest/collection/LinkedList/LinkedList_A01_t01: Fail, OK
 
-# co19 issue #685: Non-bool operand of && and || produces a static type warning
-Language/12_Expressions/04_Booleans/1_Boolean_Conversion_A01_t02: Fail, OK
-
 # co19 issue #686: Abstract methods are allowed in concrete classes if they override a concrete method
 Language/07_Classes/07_Classes_A03_t06: Fail, OK
-Language/12_Expressions/15_Method_Invocation/1_Ordinary_Invocation_A03_t04: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t05: Fail, OK
-Language/12_Expressions/16_Getter_Lookup_A02_t06: Fail, OK
 
 Language/07_Classes/4_Abstract_Instance_Members_A07_t02: Fail # Issue 18914
 
@@ -226,5 +222,56 @@
 WebPlatformTest/dom/nodes/Node-parentNode_t01: StaticWarning # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/Node-replaceChild_t01: CompileTimeError # co19-roll r722: Please triage this failure.
 
-LayoutTests/fast/dom/Range/range-comparePoint_t01: Crash
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: Crash
+# co19-roll r738.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/replaceable_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-rule-functions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/destroy-selected-radio-button-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-missing-arguments_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-named-attribute-crash_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: StaticWarning # co19-roll r738: Please triage this failure.
+LibTest/typed_data/ByteData/buffer_A01_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Event.bubbles.false_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.head_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/the-audio-element/audio_constructor_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: StaticWarning # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: StaticWarning # co19-roll r738: Please triage this failure.
diff --git a/tests/co19/co19-co19.status b/tests/co19/co19-co19.status
index a421a89..0d87424 100644
--- a/tests/co19/co19-co19.status
+++ b/tests/co19/co19-co19.status
@@ -14,6 +14,9 @@
 # Tests that fail everywhere, including the analyzer.
 
 LibTest/isolate/IsolateStream/contains_A02_t01: Fail # co19 issue 668
+LibTest/typed_data/ByteData/buffer_A01_t01: Fail # co19 r736 bug - sent comment.
+
+Language/07_Classes/6_Constructors/1_Generative_Constructors_A01_t06: Fail, Pass, OK # co19 issue 695
 
 # These tests are obsolete and need updating.
 WebPlatformTest/shadow-dom/elements-and-dom-objects/shadowroot-object/shadowroot-attributes/test-002_t01: Skip # Issue 19019
@@ -21,6 +24,9 @@
 
 [ $compiler != dartanalyzer && $compiler != dart2analyzer ]
 # Tests that fail on every runtime, but not on the analyzer.
+
+LibTest/core/Uri/fragment_A01_t01: Fail # assumes space valid in fragment.
+
 LibTest/isolate/ReceivePort/asBroadcastStream_A02_t01: Fail # co19 issue 687
 LibTest/async/Stream/asBroadcastStream_A02_t01: Fail # co19 issue 687
 
@@ -41,9 +47,6 @@
 LibTest/math/cos_A01_t01: PASS, FAIL, OK # co19 issue 44
 LibTest/math/tan_A01_t01: PASS, FAIL, OK  # co19 issue 44
 
-LibTest/math/MutableRectangle/MutableRectangle_A01_t01: RuntimeError # co19 issue 674
-LibTest/math/Rectangle/Rectangle_A01_t01: RuntimeError # co19 issue 674
-
 LibTest/core/Expando/Expando_A03_t01: RuntimeError # Issue 17735
 LibTest/core/Expando/Expando_A03_t03: RuntimeError # Issue 17735
 LibTest/core/Expando/Expando_A03_t04: RuntimeError # Issue 17735
@@ -87,9 +90,3 @@
 [ $compiler != dartanalyzer && $compiler != dart2analyzer && $checked ]
 LibTest/collection/DoubleLinkedQueue/removeFirst_A01_t01: RuntimeError # co19-roll r607: Please triage this failure
 LibTest/collection/LinkedList/LinkedList_A01_t01: RuntimeError # co19-roll r623: Please triage this failure
-LibTest/math/MutableRectangle/boundingBox_A01_t01: RuntimeError # co19 issue 675
-LibTest/math/MutableRectangle/boundingBox_A01_t02: RuntimeError # co19 issue 675
-LibTest/math/MutableRectangle/intersection_A01_t01: RuntimeError # co19 issue 675
-
-[ $compiler == dart2js ]
-LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # co19 issue 688
diff --git a/tests/co19/co19-dart2dart.status b/tests/co19/co19-dart2dart.status
index be3eb8d..e832dee 100644
--- a/tests/co19/co19-dart2dart.status
+++ b/tests/co19/co19-dart2dart.status
@@ -12,8 +12,6 @@
 
 Language/13_Statements/04_Local_Function_Declaration_A04_t01: Fail, MissingCompileTimeError # co19-roll r607: Please triage this failure
 
-LibTest/core/Symbol/Symbol_A01_t02: CompileTimeError # co19-roll r607: Please triage this failure
-
 Language/12_Expressions/12_Instance_Creation/1_New_A04_t02: RuntimeError # co19-roll r607: Please triage this failure
 Language/12_Expressions/17_Getter_Invocation_A07_t02: Pass, RuntimeError # co19-roll r607: Please triage this failure
 LibTest/core/Invocation/memberName_A01_t01: Pass, RuntimeError # co18-roll r607: Please triage this failure
@@ -63,6 +61,7 @@
 LibTest/typed_data/Float32x4/greaterThanOrEqual_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThan_A01_t01: Skip # co19 issue 656
 LibTest/typed_data/Float32x4/lessThanOrEqual_A01_t01: Skip # co19 issue 656
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 
 [ $compiler == dart2dart && $system == windows ]
 LibTest/core/double/operator_remainder_A01_t04: Fail # Result is NaN
@@ -75,7 +74,6 @@
 LibTest/math/asin_A01_t01: Fail, OK # co19 issue 44
 LibTest/math/atan_A01_t01: Fail, OK # co19 issue 44
 
-
 [ $compiler == dart2dart ]
 Language/03_Overview/1_Scoping_A02_t28: Fail # co19-roll r559: Please triage this failure
 Language/05_Variables/05_Variables_A05_t01: fail # co19-roll r546: Please triage this failure
@@ -108,9 +106,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/5_Function_Types_A06_t01: fail # co19-roll r546: Please triage this failure
diff --git a/tests/co19/co19-dart2js.status b/tests/co19/co19-dart2js.status
index 8de3045..d79cff9 100644
--- a/tests/co19/co19-dart2js.status
+++ b/tests/co19/co19-dart2js.status
@@ -10,6 +10,8 @@
 LibTest/core/Uri/encodeFull_A01_t02: Skip
 LibTest/core/Uri/encodeQueryComponent_A01_t02: Skip
 LayoutTests/fast/dom/HTMLLabelElement/form/test1_t01: RuntimeError # co19-roll r722: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError # co19-roll r738: Please triage this failure.
 
 # Crashes first, please. Then untriaged bugs. There is a section below
 # for co19 bugs.
@@ -730,6 +732,284 @@
 WebPlatformTest/dom/nodes/attributes/setAttribute_A03_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/dom/nodes/attributes/setAttribute_A04_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
+LayoutTests/fast/dom/52776_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/allowed-children_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/anchor-origin_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/assertion-on-node-removal_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/boolean-attribute-reflection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/click-method-on-html-element_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/comment-not-documentElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/computed-style-set-property_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/containerNode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createDocumentType2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createDocumentType-ownerDocument_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElementNS-namespace-errors_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElementNS_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/createElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-delete-doc_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-selectorText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-set-property-exception_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-shorthand-common-value_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/constructor-calls-created-synchronously_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/created-callback_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-basic_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-on-create-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-type-extensions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-names_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/element-upgrade_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/invalid-type-extension-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/lifecycle-created-createElement-recursion_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/unresolved-pseudoclass_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/upgrade-candidate-remove-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/delete-contents_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-importNode-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-mutations_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-no-child-on-empty_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/document-set-title-no-reuse_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/domparser-parsefromstring-mimetype-support_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize-display_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-parse-serialize-xmldecl_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/fragment-activation-focuses-target_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency3_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency4_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency5_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementById-consistency_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getelementbyname-invalidation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/010_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/011_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/014_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getelementsbyname-invalidation-cache_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-size-property_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/image-object_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-api-args_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/implementation-createHTMLDocument_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNodeHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNodeXML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/jsDevicePixelRatio_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/length-attribute-mapping_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/is-protocol-handler-registered_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/register-protocol-handler_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigatorcontentutils/unregister-protocol-handler_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigator-userAgent_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/navigator-vendorSub_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/node-iterator-with-doctype-root_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/offset-position-writing-modes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-non-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/script-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseID-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseID_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/caseTagX_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/dumpNodeList_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-almost-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/id-fastpath-strict_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/serialize-attribute_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/setAttributeNS-namespace-errors_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/base-in-shadow-tree_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-api_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-includer_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-element-outside-shadow-style_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-dynamic-attribute-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-relative-selector-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-reprojection-fallback-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/custom-pseudo-in-selector-api_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-for-event-path_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/elements-in-frameless-document_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getComputedStyle-composed-parent-dirty_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/get-element-by-id-in-shadow-mutation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-context-pseudo-class-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-pseudo-class-css-text_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/host-wrapper-reclaimed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-shadow-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/link-in-shadow-tree_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/offsetWidth-host-style-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/olderShadowRoot_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/reinsert-insertion-point_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-and-insert-style_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash-2_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/remove-styles-in-shadow-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-aware-shadow-root_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-dynamic-styling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-spellcheck_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-input-type-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowdom-for-unknown-with-form_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-element-inactive_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-element_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-hierarchy-exception_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-clonenode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-host_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowroot-keyframes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-node-list_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-text-child_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-ul-li_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/sibling-rules-dynamic-changes_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/stale-distribution-after-shadow-removal_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-insertion-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-sharing-sibling-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-sharing-styles-in-older-shadow-roots_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/suppress-mutation-events-in-shadow-characterdata_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/title-element-in-shadow_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/css-insert-import-rule-to-shadow-stylesheets_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/css-medialist-item_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-parent-rule-without-wrapper_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-stylesheet-without-wrapper_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-media-rule-deleted-parent-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/removed-stylesheet-rule-deleted-parent-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/next-element-sibling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/normalize-crash-in-spell-checker_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Text/previous-element-sibling_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/TreeWalker/TreeWalker-basic_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/atob-btoa_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-null-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-invalid-pseudo-elements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements-complex_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-with-pseudo-elements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/invalid-protocol_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-attribute-entities_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-attribute-namespaces_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/XMLSerializer-element-ns-no-reemit_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-attributes_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-comparePoint_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-comparePoint_t03: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/dom/ranges/Range-detach_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/Document.getElementsByClassName-null_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-case_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-id_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-newelements_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-param_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t04: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t06: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/disabled-elements/disabledElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/textTracks_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/kind_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/label_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/readyState_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/srclang_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/track_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/kind_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection-not-application-textarea_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistelement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-datalist-element/datalistoptions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/HTMLFieldSetElement_t01: RuntimeError # co19-roll r738: Please triage this failure.
+
+
+
+LayoutTests/fast/dom/gc-image-element-2_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/background-shorthand-csstext_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/client-width-height-quirks_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/clone-node-form-elements_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/clone-node-form-elements-with-attr_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-cached-import-rule_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-insert-import-rule-twice_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-deleteRule-update_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-insertRule-update_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dom-instanceof_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/domtimestamp-is-number_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/empty-hash-and-search_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/getElementsByClassName/dumpNodeList_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-change_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/icon-url-list_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/id-attribute-with-namespace-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/insert-span-into-long-text-bug-28245_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/javascript-backslash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/left-overflow-in-ltr_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/remove-body-during-body-replacement_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/bug-17313_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/SelectorAPI/not-supported-namespace-in-selector_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/setAttribute-using-initial-input-value_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/access-document-of-detached-stylesheetlist-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-overridden_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/content-pseudo-element-with-host-pseudo-class_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/distribution-update-recalcs-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/elementfrompoint_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/event-path_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/get-distributed-nodes-orphan_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getelementbyid-in-orphan_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/getelementbyid-shadow_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-list-menu-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/insertion-point-video-crash_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/nested-reprojection-inconsistent_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-disable_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-append_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-root-js-api_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/style-of-distributed-node_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-shadow-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-style-2_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/detached-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/discarded-sheet-owner-null_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/StyleSheet/empty-shadow-style_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-nested-rules_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/getMatchedCSSRules-parent-stylesheets_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: Skip # Times out, co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out or fails, co19-roll r738: Please triage this failure.
+
 [ $compiler == dart2js && $runtime == jsshell ]
 LibTest/core/Map/Map_class_A01_t04: Pass, Slow # Issue 8096
 LibTest/core/double/round_A01_t01: RuntimeError # co19-roll r706: Please triage this failure
@@ -793,8 +1073,6 @@
 # can understand so he can file a bug later.
 #
 [ $compiler == dart2js ]
-LibTest/async/DeferredLibrary/DeferredLibrary_A01_t01: fail # Call to deferred non-loaded functions does not throw NoSuchMethodError.
-
 Language/03_Overview/2_Privacy_A01_t09: RuntimeError, OK # co19 issue 198
 Language/03_Overview/2_Privacy_A01_t11: Pass, OK # co19 issue 316
 Language/06_Functions/4_External_Functions_A01_t01: CompileTimeError, OK # http://dartbug.com/5021
@@ -908,9 +1186,7 @@
 LibTest/typed_data/Float32x4List/Float32x4List.view_A01_t02: RuntimeError # TODO(dart2js-team): Please triage this failure.
 LibTest/typed_data/Float32x4List/Float32x4List.view_A06_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
-
 LibTest/isolate/Isolate/spawnUri_A02_t01: RuntimeError # TODO(dart2js-team): Please triage this failure.
-LibTest/isolate/Isolate/spawn_A01_t04: RuntimeError # TODO(dart2js-team): Please triage this failure.
 
 # These tests are marked failing on all platforms, but they timeout here instead
 LibTest/isolate/Isolate/spawnUri_A01_t01: Skip # TODO(dart2js-team): Please triage this failure.
@@ -993,7 +1269,7 @@
 LibTest/typed_data/ByteBuffer/runtimeType_A01_t01: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteBuffer/runtimeType_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteBuffer/toString_A01_t01: fail # co19-roll r569: Please triage this failure
-LibTest/typed_data/ByteData/buffer_A01_t01: fail # co19-roll r569: Please triage this failure
+LibTest/typed_data/ByteData/buffer_A01_t01: fail # co19 issue 694
 LibTest/typed_data/ByteData/buffer_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/ByteData_A01_t02: fail # co19-roll r569: Please triage this failure
 LibTest/typed_data/ByteData/ByteData.view_A01_t01: fail # co19-roll r569: Please triage this failure
@@ -1072,7 +1348,6 @@
 Language/12_Expressions/00_Object_Identity/1_Object_Identity_A06_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t06: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/03_Numbers_A01_t09: fail # co19-roll r546: Please triage this failure
-Language/12_Expressions/05_Strings_A20_t01: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t03: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t05: fail # co19-roll r546: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A02_t06: fail # co19-roll r546: Please triage this failure
@@ -1095,9 +1370,6 @@
 Language/14_Libraries_and_Scripts/1_Imports_A03_t29: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/1_Imports_A03_t30: fail # co19-roll r546: Please triage this failure
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t01: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t11: fail # co19-roll r546: Please triage this failure
-Language/14_Libraries_and_Scripts/5_URIs_A01_t21: fail # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t01: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t02: crash # co19-roll r546: Please triage this failure
 Language/15_Types/4_Interface_Types_A12_t10: fail # co19-roll r546: Please triage this failure
@@ -1258,12 +1530,10 @@
 Language/07_Classes/6_Constructors/2_Factories_A10_t02: fail # co19-roll r587: Please triage this failure
 Language/07_Classes/6_Constructors/2_Factories_A10_t03: fail # co19-roll r587: Please triage this failure
 Language/10_Generics/09_Generics_A01_t17: fail # co19-roll r587: Please triage this failure
-Language/12_Expressions/06_Symbols_A01_t02: CompileTimeError # co19-roll r623: Please triage this failure
 Language/12_Expressions/12_Instance_Creation/1_New_A06_t15: CompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t17: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/12_Expressions/14_Function_Invocation/3_Unqualified_Invocation_A01_t18: MissingCompileTimeError # co19-roll r651: Please triage this failure
 Language/15_Types/4_Interface_Types_A11_t04: fail # Issue 14654
-LibTest/core/Symbol/Symbol_A01_t02: CompileTimeError # co19-roll r607: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t01: Fail # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t02: Fail # co19-roll r672: Please triage this failure
 LibTest/isolate/Isolate/spawnUri_A01_t03: Fail # co19-roll r672: Please triage this failure
diff --git a/tests/co19/co19-dartium.status b/tests/co19/co19-dartium.status
index 49bbb13..8498895 100644
--- a/tests/co19/co19-dartium.status
+++ b/tests/co19/co19-dartium.status
@@ -6,14 +6,23 @@
 *: Skip # running co19 tests on content_shell would make our dartium cycle-times very long
 
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
-# Something is breaking browser_test.dart in the test infrastructure in these tests. Issue 18558.
-LayoutTests/fast/dom/HTMLB*: Skip # Issue 18558
+# Temporarily skip tests, to narrow down new breakage to a particular test by binary search:
+LayoutTests/fast/dom: Skip # Unknown tests are breaking the test infrastructure. Issue 18558
+
+LayoutTests/fast/dom/HTMLButtonElement/change-type_t01: Skip # Breaks the test infrastructure. Issue 18558
+LayoutTests/fast/dom/shadow/form-in-shadow_t01: Skip # Breaks the test infrastructure. Issue 18558.
+# Only one of the next two causes the problem - not sure which.
+LayoutTests/fast/dom/Range/create-contextual-fragment-script-not-ran_t01: Skip # Breaks the test infrastructure. Issue 18558.
+LayoutTests/fast/dom/Range/bug-19527_t01: Skip # Breaks the test infrastructure. Issue 18558.
+LayoutTests/fast/dom/MutationObserver/database-callback-delivery_t01: Skip # Breaks the test infrastructure. Issue 18558.
 
 Language/07_Classes/6_Constructors/1_Generative_Constructors_A09_t01: Pass, Fail # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/3_Parts_A02_t02: Skip # Issue 13719: Please triage this failure.
 Language/14_Libraries_and_Scripts/4_Scripts_A03_t03: Pass # Issue 14478: This should break.
 LibTest/async/Completer/completeError_A02_t01: Pass, Fail # Issue 13719: Please triage this failure.
 LibTest/core/int/operator_left_shift_A01_t02: Pass, Fail # Issue 13719: Please triage this failure.
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # Issue co19 694
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/isolate/SendPort/send_A02_t01: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t04: Fail # Issue 13921
 LibTest/isolate/SendPort/send_A02_t05: Fail # Issue 13921
@@ -285,7 +294,6 @@
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/distributed-pseudo-element/test-002_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/lower-boundary-encapsulation/test-004_t01: RuntimeError # co19-roll r722: Please triage this failure.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-006_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-007_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-008_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-009_t01: RuntimeError # Issue 19055.
@@ -296,7 +304,6 @@
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-014_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-015_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-016_t01: RuntimeError # Issue 19055.
-WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-017_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-018_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-019_t01: RuntimeError # Issue 19055.
 WebPlatformTest/shadow-dom/shadow-trees/satisfying-matching-criteria/test-020_t01: RuntimeError # Issue 19055.
@@ -308,7 +315,7 @@
 LayoutTests/fast/dom/HTMLScriptElement/async-false-inside-async-false-load_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/async-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/async-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError # co19-roll r722: Please triage this failure.
+LayoutTests/fast/dom/HTMLScriptElement/defer-inline-script_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/defer-onbeforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLScriptElement/remove-in-beforeload_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/HTMLSelectElement/selected-index-preserved-when-option-text-changes_t01: RuntimeError # co19-roll r722: Please triage this failure.
@@ -319,11 +326,8 @@
 LayoutTests/fast/dom/MutationObserver/observe-childList_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/MutationObserver/weak-callback-gc-crash_t01: RuntimeError # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Node/initial-values_t01: RuntimeError # co19-roll r722: Please triage this failure.
-LayoutTests/fast/dom/Range/bug-19527_t01: RuntimeError # Issue 19055.
-LayoutTests/fast/dom/Range/range-comparePoint_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/dom/Range/range-created-during-remove-children_t01: RuntimeError, Pass # co19-roll r722: Please triage this failure.
 LayoutTests/fast/dom/Range/range-detached-exceptions_t01: RuntimeError # Issue 19055.
-LayoutTests/fast/dom/Range/range-isPointInRange_t01: RuntimeError # Issue 19055.
 LayoutTests/fast/html/imports/import-element-removed-flag_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19-roll r722: Please triage this failure.
@@ -369,8 +373,69 @@
 WebPlatformTest/shadow-dom/events/retargeting-relatedtarget/test-002_t01: RuntimeError # Issue 18931
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/test-009_t01: RuntimeError # Issue 18931
 
+# co19-roll r738.
+WebPlatformTest/DOMEvents/approved/ProcessingInstruction.DOMCharacterDataModified_t01: Skip # Times out. co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/error-codes/error_t01: Skip # Times out and fails. # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/cues_t01: Skip # Times out and fails. # co19-roll r738: Please triage this failure.LayoutTests/fast/dom/Window/window-resize-contents_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-resize-contents_t01: Pass, RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/Window/window-scroll-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/anchor-without-content_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/attribute-namespaces-get-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/blur-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/characterdata-api-arguments_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/client-width-height-quirks_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/css-mediarule-functions_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/attribute-changed-callback_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/document-register-svg-extends_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset-xhtml_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/dataset_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/focus-contenteditable_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-in-rtl-doesnt-fire-onscroll_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/horizontal-scrollbar-when-dir-change_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-null_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/importNode-unsupported-node-type_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/location-hash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/option-properties_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/partial-layout-overlay-scrollbars_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/set-innerHTML_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/no-renderers-for-light-children_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-checked-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-optgroup_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-disabled-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-optgroup_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/pseudoclass-update-enabled-option_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-content-crash_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadow-removechild-and-blur-event_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/EventObject.after.dispatchEvenr_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/EventObject.multiple.dispatchEvent_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/DOMEvents/approved/addEventListener.optional.useCapture_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-image_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-media/pageload-video_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/browsers/browsing-the-web/read-text/load-text-plain_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-getter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.body-setter_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.getElementsByName-namespace_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t05: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/document.title_t07: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/documents/dom-tree-accessors/nameditem_t02: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-delete_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-get_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-set_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/document-metadata/styling/LinkStyle_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLMediaElement/addTextTrack_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/HTMLElement/HTMLTrackElement/src_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formAction_document_address_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/attributes-common-to-form-controls/formaction_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/selection_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setRangeText_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/textfieldselection/textfieldselection-setSelectionRange_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.  Pass on macos.
+WebPlatformTest/html/semantics/forms/the-button-element/button-validation_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/semantics/forms/the-fieldset-element/disabled_t01: RuntimeError # co19-roll r738: Please triage this failure.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid ) && $checked ]
-LibTest/core/List/removeAt_A02_t01: Fail # co19-roll r641: Please triage this failure
 # New Dartium checked failures on new co19 browser tests in co19 revision 706.
 LayoutTests/fast/html/article-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
 LayoutTests/fast/html/aside-element_t01: RuntimeError # Issue 17758.  Please triage this failure.
@@ -389,6 +454,16 @@
 WebPlatformTest/html-templates/parsing-html-templates/clearing-the-stack-back-to-a-given-context/clearing-stack-back-to-a-table-row-context_t01: RuntimeError # co19-roll r722: Please triage this failure.
 WebPlatformTest/shadow-dom/shadow-trees/upper-boundary-encapsulation/ownerdocument-001_t01: RuntimeError # co19-roll r722: Please triage this failure.
 
+# co19-roll r738
+WebPlatformTest/DOMEvents/approved/Propagation.path.target.removed_t01: RuntimeError # co19-roll r738: Please triage this failure.
+WebPlatformTest/html/dom/elements/global-attributes/dataset-enumeration_t01: RuntimeError # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/custom/type-extensions_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+LayoutTests/fast/dom/shadow/shadowhost-keyframes_t01: RuntimeError, Pass # co19-roll r738: Please triage this failure.
+
+[ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
+WebPlatformTest/html/semantics/embedded-content/media-elements/interfaces/TextTrack/mode_t01: Skip # Issue 19495.
+
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
 LibTest/math/log_A01_t01: Pass, Fail # co19 issue 44.
 LibTest/html/Element/getBoundingClientRect_A01_t02: RuntimeError # Issue 19127.
+LayoutTests/fast/dom/HTMLLinkElement/prefetch-beforeload_t01: Pass, Fail # Issue 19274.
diff --git a/tests/co19/co19-runtime.status b/tests/co19/co19-runtime.status
index 151ebc9..47e138d 100644
--- a/tests/co19/co19-runtime.status
+++ b/tests/co19/co19-runtime.status
@@ -46,6 +46,7 @@
 LibTest/core/Symbol/Symbol_A01_t05: RuntimeError # Issue 13596
 
 [ $compiler == none && $runtime == vm ]
+LibTest/typed_data/Int64List/buffer_A01_t01: Fail # co19 issue 694
 LibTest/typed_data/Float32x4/reciprocalSqrt_A01_t01: Pass, Fail # co19 issue 599
 LibTest/typed_data/Float32x4/reciprocal_A01_t01: Pass, Fail # co19 issue 599
 
@@ -58,13 +59,8 @@
 # These flaky tests also fail with dart2dart.
 LibTest/math/MutableRectangle/MutableRectangle.fromPoints_A01_t01: Pass, RuntimeError # co19-roll r607: Please triage this failure
 
-[ $compiler == none && $runtime == vm && $checked ]
-LibTest/core/List/removeAt_A02_t01: Fail # co19 issue 670
-
-#end [ $compiler == none && $runtime == vm && $checked ]
-
 [ $compiler == none && $runtime == vm && $mode == debug ]
-LibTest/core/List/List_class_A01_t01: Pass, Slow
+LibTest/core/List/List_class_A01_t02: Pass, Slow
 
 [ $compiler == none && $runtime == vm && ($arch != x64 && $arch != simarm64) ]
 LibTest/core/int/operator_left_shift_A01_t02: Fail # co19 issue 129
@@ -73,9 +69,9 @@
 LibTest/core/double/toInt_A01_t01: Fail
 # These tests take too much memory (300 MB) for our 1 GB test machine.
 # co19 issue 673. http://code.google.com/p/co19/issues/detail?id=673
-LibTest/core/List/List_class_A01_t01: Skip # co19 issue 673
-LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip # co19 issue 673
-LibTest/collection/ListBase/ListBase_class_A01_t01: Skip # co19 issue 673
+LibTest/core/List/List_class_A01_t02: Skip # co19 issue 673
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip # co19 issue 673
+LibTest/collection/ListBase/ListBase_class_A01_t02: Skip # co19 issue 673
 
 [ $compiler == none && $runtime == vm && $arch == mips && $mode == debug ]
 LibTest/isolate/Isolate/spawnUri_A01_t04: Crash, Pass # dartbug.com/17440
@@ -85,6 +81,8 @@
 LibTest/core/Uri/Uri_A06_t03: Skip  # Timeout
 LibTest/collection/ListMixin/ListMixin_class_A01_t01: Skip  # Timeout
 LibTest/collection/ListBase/ListBase_class_A01_t01: Skip  # Timeout
+LibTest/collection/ListMixin/ListMixin_class_A01_t02: Skip  # Timeout
+LibTest/collection/ListBase/ListBase_class_A01_t02: Skip  # Timeout
 
 [ $runtime == vm ]
 LibTest/isolate/Isolate/spawn_A02_t01: Skip # co19 issue 667
diff --git a/tests/compiler/dart2js/analyze_dart2js_test.dart b/tests/compiler/dart2js/analyze_dart2js_test.dart
index ccd379e..d17f15e 100644
--- a/tests/compiler/dart2js/analyze_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_dart2js_test.dart
@@ -5,7 +5,7 @@
 library analyze_dart2js;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/filenames.dart';
 import 'analyze_helper.dart';
 import "package:async_helper/async_helper.dart";
 
diff --git a/tests/compiler/dart2js/analyze_helper.dart b/tests/compiler/dart2js/analyze_helper.dart
index c9a80ee..89f00c6 100644
--- a/tests/compiler/dart2js/analyze_helper.dart
+++ b/tests/compiler/dart2js/analyze_helper.dart
@@ -6,13 +6,13 @@
 
 import 'dart:async';
 import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/apiimpl.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     hide Compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import 'package:compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/util/uri_extras.dart';
 
 /**
  * Map of whitelisted warnings and errors.
diff --git a/tests/compiler/dart2js/analyze_only_test.dart b/tests/compiler/dart2js/analyze_only_test.dart
index a49cd42..ce0ce69 100644
--- a/tests/compiler/dart2js/analyze_only_test.dart
+++ b/tests/compiler/dart2js/analyze_only_test.dart
@@ -10,7 +10,7 @@
 import "package:async_helper/async_helper.dart";
 
 import '../../utils/dummy_compiler_test.dart' as dummy;
-import '../../../sdk/lib/_internal/compiler/compiler.dart';
+import 'package:compiler/compiler.dart';
 
 runCompiler(String main, List<String> options,
             onValue(String code, List errors, List warnings)) {
@@ -44,7 +44,7 @@
   result.then((String code) {
     onValue(code, errors, warnings);
   }, onError: (e) {
-      throw 'Compilation failed';
+    throw 'Compilation failed: ${Error.safeToString(e)}';
   }).then(asyncSuccess);
 }
 
diff --git a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
index a9b9b5a..4e04726 100644
--- a/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
+++ b/tests/compiler/dart2js/analyze_unused_dart2js_test.dart
@@ -6,8 +6,8 @@
 
 import 'package:async_helper/async_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/filenames.dart';
 
 import 'analyze_helper.dart';
 
diff --git a/tests/compiler/dart2js/arithmetic_simplification_test.dart b/tests/compiler/dart2js/arithmetic_simplification_test.dart
index 5350a33..8b69d50 100644
--- a/tests/compiler/dart2js/arithmetic_simplification_test.dart
+++ b/tests/compiler/dart2js/arithmetic_simplification_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String INT_PLUS_ZERO = """
@@ -74,15 +75,17 @@
 main() {
   var plusZero = new RegExp(r"\+ 0");
   var zeroPlus = new RegExp(r"0 \+");
-  compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero);
-  compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus);
-  compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero);
-  compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus);
-
   var timesOne = new RegExp(r"\* 1");
   var oneTimes = new RegExp(r"1 \*");
-  compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne);
-  compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes);
-  compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne);
-  compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes);
+
+  asyncTest(() => Future.wait([
+    compileAndDoNotMatch(INT_PLUS_ZERO, 'main', plusZero),
+    compileAndDoNotMatch(ZERO_PLUS_INT, 'main', zeroPlus),
+    compileAndMatch(NUM_PLUS_ZERO, 'main', plusZero),
+    compileAndMatch(ZERO_PLUS_NUM, 'main', zeroPlus),
+    compileAndDoNotMatch(INT_TIMES_ONE, 'main', timesOne),
+    compileAndDoNotMatch(ONE_TIMES_INT, 'main', oneTimes),
+    compileAndDoNotMatch(NUM_TIMES_ONE, 'main', timesOne),
+    compileAndDoNotMatch(ONE_TIMES_NUM, 'main', oneTimes),
+  ]));
 }
diff --git a/tests/compiler/dart2js/array_static_intercept_test.dart b/tests/compiler/dart2js/array_static_intercept_test.dart
index 23e88eb..d53e10b1 100644
--- a/tests/compiler/dart2js/array_static_intercept_test.dart
+++ b/tests/compiler/dart2js/array_static_intercept_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -14,8 +15,9 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'.add$1('));
-  Expect.isTrue(generated.contains(r'.removeLast$0('));
-  Expect.isTrue(generated.contains(r'.length'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains(r'.add$1('));
+    Expect.isTrue(generated.contains(r'.removeLast$0('));
+    Expect.isTrue(generated.contains(r'.length'));
+  }));
 }
diff --git a/tests/compiler/dart2js/async_compiler_input_provider_test.dart b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
index 7f370c3..4ebe2ab 100644
--- a/tests/compiler/dart2js/async_compiler_input_provider_test.dart
+++ b/tests/compiler/dart2js/async_compiler_input_provider_test.dart
@@ -8,8 +8,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
+import 'package:compiler/compiler.dart' as compiler;
+import 'package:compiler/implementation/filenames.dart';
 
 const SOURCES = const {
   "/main.dart": """
diff --git a/tests/compiler/dart2js/bad_loop_test.dart b/tests/compiler/dart2js/bad_loop_test.dart
index e8c2848..fd9291b7 100644
--- a/tests/compiler/dart2js/bad_loop_test.dart
+++ b/tests/compiler/dart2js/bad_loop_test.dart
@@ -6,7 +6,7 @@
 import 'memory_source_file_helper.dart';
 import "package:async_helper/async_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 main() {
diff --git a/tests/compiler/dart2js/bad_output_io_test.dart b/tests/compiler/dart2js/bad_output_io_test.dart
index ebc3a6d..fc2cf34 100644
--- a/tests/compiler/dart2js/bad_output_io_test.dart
+++ b/tests/compiler/dart2js/bad_output_io_test.dart
@@ -9,11 +9,11 @@
 import 'dart:io' show exit;
 import 'package:expect/expect.dart';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
        show exitFunc, compileFunc, compile, diagnosticHandler;
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+import 'package:compiler/implementation/source_file_provider.dart'
        show FormattingDiagnosticHandler;
 
 class CollectingFormattingDiagnosticHandler
diff --git a/tests/compiler/dart2js/begin_end_token_test.dart b/tests/compiler/dart2js/begin_end_token_test.dart
index 355bbb5..d4cad6e 100644
--- a/tests/compiler/dart2js/begin_end_token_test.dart
+++ b/tests/compiler/dart2js/begin_end_token_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 void testNode(Node node, String expected, String text, [bool hard = true]) {
   var debug = 'text=$text,expected=$expected,node:${node}';
diff --git a/tests/compiler/dart2js/boolified_operator_test.dart b/tests/compiler/dart2js/boolified_operator_test.dart
index 5ec4c83..6a8bd9f 100644
--- a/tests/compiler/dart2js/boolified_operator_test.dart
+++ b/tests/compiler/dart2js/boolified_operator_test.dart
@@ -3,7 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
-import "package:expect/expect.dart";
+
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_EQUAL = r"""
@@ -50,27 +53,30 @@
 main() {
   RegExp regexp = new RegExp('=== true');
 
-  String generated = compile(TEST_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('eqB'));
-
-  generated = compile(TEST_EQUAL_NULL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('== null'));
-
-  generated = compile(TEST_LESS, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('ltB'));
-
-  generated = compile(TEST_LESS_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('leB'));
-  
-  generated = compile(TEST_GREATER, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('gtB'));
-  
-  generated = compile(TEST_GREATER_EQUAL, entry: 'foo');
-  Expect.isFalse(generated.contains('=== true'));
-  Expect.isTrue(generated.contains('geB'));
+  asyncTest(() => Future.wait([
+    compile(TEST_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('eqB'));
+    }),
+    compile(TEST_EQUAL_NULL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('== null'));
+    }),
+    compile(TEST_LESS, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('ltB'));
+    }),
+    compile(TEST_LESS_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('leB'));
+    }),
+    compile(TEST_GREATER, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('gtB'));
+    }),
+    compile(TEST_GREATER_EQUAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('=== true'));
+      Expect.isTrue(generated.contains('geB'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/boolify_test.dart b/tests/compiler/dart2js/boolify_test.dart
index d029379..6536386 100644
--- a/tests/compiler/dart2js/boolify_test.dart
+++ b/tests/compiler/dart2js/boolify_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 library boolified_operator_test;
-import "package:expect/expect.dart";
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -15,6 +17,7 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  Expect.isTrue(generated.contains('foo() !== true)'));
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains('foo() !== true)'));
+  }));
 }
diff --git a/tests/compiler/dart2js/builtin_equals_test.dart b/tests/compiler/dart2js/builtin_equals_test.dart
index 3b1807a..57656c0 100644
--- a/tests/compiler/dart2js/builtin_equals_test.dart
+++ b/tests/compiler/dart2js/builtin_equals_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -17,10 +18,12 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo', enableTypeAssertions: true);
-  Expect.isTrue(!generated.contains('eqB'));
+  asyncTest(() => compile(TEST, entry: 'foo', enableTypeAssertions: true,
+      check: (String generated) {
+    Expect.isTrue(!generated.contains('eqB'));
 
-  RegExp regexp = new RegExp('==');
-  Iterator<Match> matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 4);
+    RegExp regexp = new RegExp('==');
+    Iterator<Match> matches = regexp.allMatches(generated).iterator;
+    checkNumberOfMatches(matches, 4);
+  }));
 }
diff --git a/tests/compiler/dart2js/builtin_interceptor_test.dart b/tests/compiler/dart2js/builtin_interceptor_test.dart
index 00aead3..24e3a2c 100644
--- a/tests/compiler/dart2js/builtin_interceptor_test.dart
+++ b/tests/compiler/dart2js/builtin_interceptor_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,12 +26,15 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains("return 3;"));
-
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(generated.contains("return 3;"));
-
-  generated = compile(TEST_THREE, entry: 'foo');
-  Expect.isTrue(generated.contains("push(2);"));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("return 3;"));
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("push(2);"));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
index 16eee71..cd127f2 100644
--- a/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
+++ b/tests/compiler/dart2js/call_site_simple_type_inferer_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/closure_codegen_test.dart b/tests/compiler/dart2js/closure_codegen_test.dart
index e3f9f4a..d9d05d6 100644
--- a/tests/compiler/dart2js/closure_codegen_test.dart
+++ b/tests/compiler/dart2js/closure_codegen_test.dart
@@ -3,10 +3,10 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
-import 'parser_helper.dart';
 
 const String TEST_INVOCATION0 = r"""
 main() {
@@ -41,29 +41,35 @@
 main() { new A().foo(1); }
 """;
 
-closureInvocation(bool minify, String prefix) {
-  String generated = compile(TEST_INVOCATION0, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$0()"));
-  generated = compile(TEST_INVOCATION1, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$1(1)"));
-  generated = compile(TEST_INVOCATION2, minify: minify);
-  Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
+Future closureInvocation(bool minify, String prefix) {
+  return Future.wait([
+    compile(TEST_INVOCATION0, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$0()"));
+    }),
+    compile(TEST_INVOCATION1, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$1(1)"));
+    }),
+    compile(TEST_INVOCATION2, minify: minify, check: (String generated) {
+      Expect.isTrue(generated.contains(".$prefix\$2(1,${minify ? "" : " "}2)"));
+    })
+  ]);
 }
 
 // Make sure that the bailout version does not introduce a second version of
 // the closure.
-closureBailout(bool minify, String prefix) {
-  asyncTest(() => compileAll(TEST_BAILOUT, minify: minify)
-      .then((generated) {
+Future closureBailout(bool minify, String prefix) {
+  return compileAll(TEST_BAILOUT, minify: minify).then((generated) {
     RegExp regexp = new RegExp("$prefix\\\$0:${minify ? "" : " "}function");
     Iterator<Match> matches = regexp.allMatches(generated).iterator;
     checkNumberOfMatches(matches, 1);
-  }));
+  });
 }
 
 main() {
-  closureInvocation(false, "call");
-  closureInvocation(true, "");
-  closureBailout(false, "call");
-  closureBailout(true, "");
+  asyncTest(() => Future.wait([
+    closureInvocation(false, "call"),
+    closureInvocation(true, ""),
+    closureBailout(false, "call"),
+    closureBailout(true, ""),
+  ]));
 }
diff --git a/tests/compiler/dart2js/code_motion_test.dart b/tests/compiler/dart2js/code_motion_test.dart
index e45095a..ea4036b 100644
--- a/tests/compiler/dart2js/code_motion_test.dart
+++ b/tests/compiler/dart2js/code_motion_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -21,9 +22,10 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp('a \\+ b');
-  Iterator matches = regexp.allMatches(generated).iterator;
-  Expect.isTrue(matches.moveNext());
-  Expect.isFalse(matches.moveNext());
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    RegExp regexp = new RegExp('a \\+ b');
+    Iterator matches = regexp.allMatches(generated).iterator;
+    Expect.isTrue(matches.moveNext());
+    Expect.isFalse(matches.moveNext());
+  }));
 }
diff --git a/tests/compiler/dart2js/command_line_split_test.dart b/tests/compiler/dart2js/command_line_split_test.dart
index 8e21815..d54a351 100644
--- a/tests/compiler/dart2js/command_line_split_test.dart
+++ b/tests/compiler/dart2js/command_line_split_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/util/command_line.dart';
+import 'package:compiler/implementation/util/command_line.dart';
 
 main() {
   Expect.listEquals(["foo", "bar"], splitLine("foo bar"));
diff --git a/tests/compiler/dart2js/compiler_helper.dart b/tests/compiler/dart2js/compiler_helper.dart
index 5353bcf..bfd45b9 100644
--- a/tests/compiler/dart2js/compiler_helper.dart
+++ b/tests/compiler/dart2js/compiler_helper.dart
@@ -8,16 +8,16 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
        as lego;
-export '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+export 'package:compiler/implementation/elements/elements.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        as js;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as leg;
-export '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+export 'package:compiler/implementation/dart2jslib.dart'
        show Constant,
             Message,
             MessageKind,
@@ -25,62 +25,68 @@
             TypedSelector,
             SourceSpan;
 
-import '../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart' as ssa;
+import 'package:compiler/implementation/ssa/ssa.dart' as ssa;
 
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
        as types;
-export '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+export 'package:compiler/implementation/types/types.dart'
        show TypeMask;
 
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-export '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/util/util.dart';
+export 'package:compiler/implementation/util/util.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/source_file.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show Compiler;
 
-export '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+export 'package:compiler/implementation/tree/tree.dart';
 
 import 'mock_compiler.dart';
 export 'mock_compiler.dart';
 
-import 'parser_helper.dart';
-
-String compile(String code, {String entry: 'main',
-                             String coreSource: DEFAULT_CORELIB,
-                             String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
-                             bool enableTypeAssertions: false,
-                             bool minify: false,
-                             bool analyzeAll: false,
-                             bool disableInlining: true}) {
-  MockCompiler compiler =
-      new MockCompiler(enableTypeAssertions: enableTypeAssertions,
-                       coreSource: coreSource,
-                       // Type inference does not run when manually
-                       // compiling a method.
-                       disableTypeInference: true,
-                       interceptorsSource: interceptorsSource,
-                       enableMinification: minify,
-                       disableInlining: disableInlining);
-  compiler.parseScript(code);
-  lego.Element element = compiler.mainApp.find(entry);
-  if (element == null) return null;
-  compiler.phase = Compiler.PHASE_RESOLVING;
-  compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
-                                  compiler.globalDependencies);
-  compiler.processQueue(compiler.enqueuer.resolution, element);
-  compiler.world.populate();
-  var context = new js.JavaScriptItemCompilationContext();
-  leg.ResolutionWorkItem resolutionWork =
-      new leg.ResolutionWorkItem(element, context);
-  resolutionWork.run(compiler, compiler.enqueuer.resolution);
-  leg.CodegenWorkItem work =
-      new leg.CodegenWorkItem(element, context);
-  compiler.phase = Compiler.PHASE_COMPILING;
-  work.run(compiler, compiler.enqueuer.codegen);
-  js.JavaScriptBackend backend = compiler.backend;
-  return backend.assembleCode(element);
+Future<String> compile(String code,
+                       {String entry: 'main',
+                        String coreSource: DEFAULT_CORELIB,
+                        String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
+                        bool enableTypeAssertions: false,
+                        bool minify: false,
+                        bool analyzeAll: false,
+                        bool disableInlining: true,
+                        void check(String generated)}) {
+  MockCompiler compiler = new MockCompiler.internal(
+      enableTypeAssertions: enableTypeAssertions,
+      coreSource: coreSource,
+      // Type inference does not run when manually
+      // compiling a method.
+      disableTypeInference: true,
+      interceptorsSource: interceptorsSource,
+      enableMinification: minify,
+      disableInlining: disableInlining);
+  return compiler.init().then((_) {
+    compiler.parseScript(code);
+    lego.Element element = compiler.mainApp.find(entry);
+    if (element == null) return null;
+    compiler.phase = Compiler.PHASE_RESOLVING;
+    compiler.backend.enqueueHelpers(compiler.enqueuer.resolution,
+                                    compiler.globalDependencies);
+    compiler.processQueue(compiler.enqueuer.resolution, element);
+    compiler.world.populate();
+    var context = new js.JavaScriptItemCompilationContext();
+    leg.ResolutionWorkItem resolutionWork =
+        new leg.ResolutionWorkItem(element, context);
+    resolutionWork.run(compiler, compiler.enqueuer.resolution);
+    leg.CodegenWorkItem work =
+        new leg.CodegenWorkItem(element, context);
+    compiler.phase = Compiler.PHASE_COMPILING;
+    work.run(compiler, compiler.enqueuer.codegen);
+    js.JavaScriptBackend backend = compiler.backend;
+    String generated = backend.assembleCode(element);
+    if (check != null) {
+      check(generated);
+    }
+    return generated;
+  });
 }
 
 // TODO(herhut): Disallow warnings and errors during compilation by default.
@@ -92,7 +98,7 @@
                           bool minify: false,
                           int expectedErrors,
                           int expectedWarnings}) {
-  MockCompiler compiler = new MockCompiler(
+  MockCompiler compiler = new MockCompiler.internal(
       analyzeAll: analyzeAll,
       analyzeOnly: analyzeOnly,
       coreSource: coreSource,
@@ -100,8 +106,7 @@
       enableMinification: minify,
       expectedErrors: expectedErrors,
       expectedWarnings: expectedWarnings);
-  compiler.sourceFiles[uri.toString()] =
-      new StringSourceFile(uri.toString(), code);
+  compiler.registerSource(uri, code);
   return compiler;
 }
 
@@ -118,7 +123,7 @@
       expectedWarnings: expectedWarnings);
   return compiler.runCompiler(uri).then((_) {
     Expect.isFalse(compiler.compilationFailed,
-                   'Unexpected compilation error');
+                   'Unexpected compilation error(s): ${compiler.errors}');
     return compiler.assembledCode;
   });
 }
@@ -193,7 +198,7 @@
   return """\\(typeof $variable ?!== ?"number"\\)""";
 }
 
-bool checkNumberOfMatches(Iterator it, int nb) {
+void checkNumberOfMatches(Iterator it, int nb) {
   bool hasNext = it.moveNext();
   for (int i = 0; i < nb; i++) {
     Expect.isTrue(hasNext, "Found less than $nb matches");
@@ -202,40 +207,43 @@
   Expect.isFalse(hasNext, "Found more than $nb matches");
 }
 
-void compileAndMatch(String code, String entry, RegExp regexp) {
-  String generated = compile(code, entry: entry);
-  Expect.isTrue(regexp.hasMatch(generated),
-                '"$generated" does not match /$regexp/');
+Future compileAndMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
+    Expect.isTrue(regexp.hasMatch(generated),
+                  '"$generated" does not match /$regexp/');
+  });
 }
 
-void compileAndDoNotMatch(String code, String entry, RegExp regexp) {
-  String generated = compile(code, entry: entry);
-  Expect.isFalse(regexp.hasMatch(generated),
-                 '"$generated" has a match in /$regexp/');
+Future compileAndDoNotMatch(String code, String entry, RegExp regexp) {
+  return compile(code, entry: entry, check: (String generated) {
+    Expect.isFalse(regexp.hasMatch(generated),
+                   '"$generated" has a match in /$regexp/');
+  });
 }
 
 int length(Link link) => link.isEmpty ? 0 : length(link.tail) + 1;
 
 // Does a compile and then a match where every 'x' is replaced by something
 // that matches any variable, and every space is optional.
-void compileAndMatchFuzzy(String code, String entry, String regexp) {
-  compileAndMatchFuzzyHelper(code, entry, regexp, true);
+Future compileAndMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, true);
 }
 
-void compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
-  compileAndMatchFuzzyHelper(code, entry, regexp, false);
+Future compileAndDoNotMatchFuzzy(String code, String entry, String regexp) {
+  return compileAndMatchFuzzyHelper(code, entry, regexp, false);
 }
 
-void compileAndMatchFuzzyHelper(
+Future compileAndMatchFuzzyHelper(
     String code, String entry, String regexp, bool shouldMatch) {
-  String generated = compile(code, entry: entry);
-  final xRe = new RegExp('\\bx\\b');
-  regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
-  final spaceRe = new RegExp('\\s+');
-  regexp = regexp.replaceAll(spaceRe, '(?:\\s*)');
-  if (shouldMatch) {
-    Expect.isTrue(new RegExp(regexp).hasMatch(generated));
-  } else {
-    Expect.isFalse(new RegExp(regexp).hasMatch(generated));
-  }
+  return compile(code, entry: entry, check: (String generated) {
+    final xRe = new RegExp('\\bx\\b');
+    regexp = regexp.replaceAll(xRe, '(?:$anyIdentifier)');
+    final spaceRe = new RegExp('\\s+');
+    regexp = regexp.replaceAll(spaceRe, '(?:\\s*)');
+    if (shouldMatch) {
+      Expect.isTrue(new RegExp(regexp).hasMatch(generated));
+    } else {
+      Expect.isFalse(new RegExp(regexp).hasMatch(generated));
+    }
+  });
 }
diff --git a/tests/compiler/dart2js/compiler_test.dart b/tests/compiler/dart2js/compiler_test.dart
index 8415ee8..8235686 100644
--- a/tests/compiler/dart2js/compiler_test.dart
+++ b/tests/compiler/dart2js/compiler_test.dart
@@ -2,17 +2,18 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import "dart:async";
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:async_helper/async_helper.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/resolution/resolution.dart";
+import "package:compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
-import "parser_helper.dart";
+
 
 class CallbackMockCompiler extends MockCompiler {
-  CallbackMockCompiler();
+  CallbackMockCompiler() : super.internal();
 
   var onError;
   var onWarning;
@@ -39,19 +40,21 @@
   }
 }
 
-testErrorHandling() {
+Future testErrorHandling() {
   // Test that compiler.currentElement is set correctly when
   // reporting errors/warnings.
   CallbackMockCompiler compiler = new CallbackMockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  compiler.parseScript('NoSuchPrefix.NoSuchType foo() {}');
-  FunctionElement foo = compiler.mainApp.find('foo');
-  compiler.setOnWarning(
-      (c, n, m) => Expect.equals(foo, compiler.currentElement));
-  foo.computeType(compiler);
-  Expect.equals(1, compiler.warnings.length);
+  return compiler.init().then((_) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    compiler.parseScript('NoSuchPrefix.NoSuchType foo() {}');
+    FunctionElement foo = compiler.mainApp.find('foo');
+    compiler.setOnWarning(
+        (c, n, m) => Expect.equals(foo, compiler.currentElement));
+    foo.computeType(compiler);
+    Expect.equals(1, compiler.warnings.length);
+  });
 }
 
 main() {
-  testErrorHandling();
+  asyncTest(() => testErrorHandling());
 }
diff --git a/tests/compiler/dart2js/constant_folding_test.dart b/tests/compiler/dart2js/constant_folding_test.dart
index cdf4c1d..82100cb 100644
--- a/tests/compiler/dart2js/constant_folding_test.dart
+++ b/tests/compiler/dart2js/constant_folding_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String NUMBER_FOLDING = """
@@ -56,36 +58,39 @@
 """;
 
 main() {
-  compileAndMatch(
-      NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)"));
-  compileAndMatch(
-      NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)"));
+  asyncTest(() => Future.wait([
+    compileAndMatch(
+        NUMBER_FOLDING, 'main', new RegExp(r"print\(7\)")),
+    compileAndMatch(
+        NEGATIVE_NUMBER_FOLDING, 'main', new RegExp(r"print\(1\)")),
 
-  String generated = compile(NULL_EQUALS_FOLDING, entry: 'foo');
-  RegExp regexp = new RegExp(r'a == null');
-  Expect.isTrue(regexp.hasMatch(generated));
+    compile(NULL_EQUALS_FOLDING, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(r'a == null');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp(r'null == b');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(r'null == b');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp(r'4 === c');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(r'4 === c');
+      Expect.isTrue(regexp.hasMatch(generated));
 
-  regexp = new RegExp('"foo" === d');
-  Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp('"foo" === d');
+      Expect.isTrue(regexp.hasMatch(generated));
+    }),
 
-  compileAndMatch(
-      LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    compileAndMatch(
+        LIST_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
 
-  compileAndMatch(
-      LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1"));
+    compileAndMatch(
+        LIST_INDEX_FOLDING, 'foo', new RegExp(r"return 1")),
 
-  compileAndDoNotMatch(
-      LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
+    compileAndDoNotMatch(
+        LIST_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
 
-  compileAndMatch(
-      STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3"));
+    compileAndMatch(
+        STRING_LENGTH_FOLDING, 'foo', new RegExp(r"return 3")),
 
-  compileAndMatch(
-      RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore"));
+    compileAndMatch(
+        RANGE_ERROR_INDEX_FOLDING, 'foo', new RegExp(r"ioore")),
+  ]));
 }
diff --git a/tests/compiler/dart2js/constant_namer_test.dart b/tests/compiler/dart2js/constant_namer_test.dart
index dd78c63..3e779ad 100644
--- a/tests/compiler/dart2js/constant_namer_test.dart
+++ b/tests/compiler/dart2js/constant_namer_test.dart
@@ -2,6 +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.
 
+import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
@@ -26,11 +27,11 @@
     Expect.isTrue(generated.contains(text), text);
   }
 
-  var generated = compile(TEST_ONE, entry: 'test');
-
-  check(generated, '.List_12_53.');
-  check(generated, '.Token_start_null.');
-  check(generated, '.Token_end_null.');
-  check(generated, '.Token_yes_12.');
-  check(generated, '.Token_true_false.');
+  asyncTest(() => compile(TEST_ONE, entry: 'test').then((String generated) {
+    check(generated, '.List_12_53.');
+    check(generated, '.Token_start_null.');
+    check(generated, '.Token_end_null.');
+    check(generated, '.Token_yes_12.');
+    check(generated, '.Token_true_false.');
+  }));
 }
diff --git a/tests/compiler/dart2js/cpa_inference_test.dart b/tests/compiler/dart2js/cpa_inference_test.dart
index 8f7ab3c..87c39ea 100644
--- a/tests/compiler/dart2js/cpa_inference_test.dart
+++ b/tests/compiler/dart2js/cpa_inference_test.dart
@@ -5,9 +5,9 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/inferrer/concrete_types_inferrer.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/inferrer/concrete_types_inferrer.dart';
 
 import "parser_helper.dart";
 import "compiler_helper.dart";
@@ -154,46 +154,12 @@
 
 const String DYNAMIC = '"__dynamic_for_test"';
 
-const String CORELIB = r'''
-  print(var obj) {}
-  abstract class num {
-    num operator +(num x);
-    num operator *(num x);
-    num operator -(num x);
-    operator ==(x);
-    num floor();
-  }
-  abstract class int extends num {
-    bool get isEven;
-  }
-  abstract class double extends num {
-    bool get isNaN;
-  }
-  class bool {}
-  class String {}
-  class Object {
-    Object();
-  }
-  class Function {}
-  abstract class List<E> {
-    factory List([int length]) {}
-  }
-  abstract class Map<K, V> {}
-  class Closure {}
-  class Type {}
-  class StackTrace {}
-  class Dynamic_ {}
-  bool identical(Object a, Object b) {}
-  const proxy = 0;''';
-
 Future<AnalysisResult> analyze(String code, {int maxConcreteTypeSize: 1000}) {
-  Uri uri = new Uri(scheme: 'source');
-  MockCompiler compiler = new MockCompiler(
-      coreSource: CORELIB,
+  Uri uri = new Uri(scheme: 'dart', path: 'test');
+  MockCompiler compiler = new MockCompiler.internal(
       enableConcreteTypeInference: true,
       maxConcreteTypeSize: maxConcreteTypeSize);
-  compiler.sourceFiles[uri.toString()] =
-      new StringSourceFile(uri.toString(), code);
+  compiler.registerSource(uri, code);
   compiler.typesTask.concreteTypesInferrer.testMode = true;
   return compiler.runCompiler(uri).then((_) {
     return new AnalysisResult(compiler);
@@ -1435,9 +1401,8 @@
 
 testJsCall() {
   final String source = r"""
-    import 'dart:foreign';
-    import 'dart:helper' show Null;
-    import 'dart:interceptors';
+    import 'dart:_foreign_helper';
+    import 'dart:_interceptors';
 
     abstract class AbstractA {}
     class A extends AbstractA {}
@@ -1517,7 +1482,7 @@
   }).whenComplete(() {
 
     final String source2 = """
-      import 'dart:foreign';
+      import 'dart:_foreign_helper';
 
       main () {
         var x = $DYNAMIC.truncate();
@@ -1686,16 +1651,16 @@
         new TypeMask.unionOf([a, b, c]
             .map((cls) => new TypeMask.nonNullExact(cls)), result.compiler));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(x, foo),
+        new TypedSelector.subclass(x, foo, result.compiler),
         new TypeMask.nonNullExact(b));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(y, foo),
+        new TypedSelector.subclass(y, foo, result.compiler),
         new TypeMask.nonNullExact(c));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(z, foo),
+        new TypedSelector.subclass(z, foo, result.compiler),
         new TypeMask.nonNullExact(a));
     result.checkSelectorHasType(
-        new TypedSelector.subclass(xy, foo),
+        new TypedSelector.subclass(xy, foo, result.compiler),
         new TypeMask.unionOf([b, c].map((cls) =>
             new TypeMask.nonNullExact(cls)), result.compiler));
 
diff --git a/tests/compiler/dart2js/dart_backend_test.dart b/tests/compiler/dart2js/dart_backend_test.dart
index cb3a5e4..40feb8c 100644
--- a/tests/compiler/dart2js/dart_backend_test.dart
+++ b/tests/compiler/dart2js/dart_backend_test.dart
@@ -6,11 +6,11 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' as leg;
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/compiler.dart';
+import 'package:compiler/implementation/dart2jslib.dart' as leg;
+import 'package:compiler/implementation/dart_backend/dart_backend.dart';
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 const coreLib = r'''
 library corelib;
@@ -44,6 +44,13 @@
 const proxy = 0;
 ''';
 
+const corePatch = r'''
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';
+import 'dart:_foreign_helper';
+''';
+
 const ioLib = r'''
 library io;
 class Platform {
@@ -67,6 +74,9 @@
 library js_helper;
 class JSInvocationMirror {}
 assertHelper(a) {}
+class Closure {}
+class BoundClosure {}
+const patch = 0;
 ''';
 
 const foreignLib = r'''
@@ -107,7 +117,9 @@
     }
     if (uri.path.endsWith('/core.dart')) {
       return new Future.value(coreLib);
-    } else  if (uri.path.endsWith('/io.dart')) {
+    } else if (uri.path.endsWith('/core_patch.dart')) {
+      return new Future.value(corePatch);
+    } else if (uri.path.endsWith('/io.dart')) {
       return new Future.value(ioLib);
     } else if (uri.path.endsWith('/js_helper.dart')) {
       return new Future.value(helperLib);
@@ -208,7 +220,7 @@
 }
 
 testAbstractClass() {
-  testDart2Dart('main(){A.foo;}abstract class A{final static num foo=0;}');
+  testDart2Dart('main(){A.foo;}abstract class A{static final num foo=0;}');
 }
 
 testConflictSendsRename() {
@@ -445,9 +457,7 @@
   final compiler;
   DynoMap(this.compiler);
 
-  get resolvedElements => compiler.enqueuer.resolution.resolvedElements;
-  ElementAst operator[](Element element) =>
-      new ElementAst(element.parseNode(compiler), resolvedElements[element]);
+  ElementAst operator[](Element element) => new ElementAst(element);
 
   noSuchMethod(Invocation invocation) => throw 'unimplemented method';
 }
@@ -463,19 +473,21 @@
   localfoo();
 }
 ''';
-  MockCompiler compiler = new MockCompiler(emitJavaScript: false);
-  assert(compiler.backend is DartBackend);
-  compiler.parseScript(src);
-  FunctionElement mainElement = compiler.mainApp.find(leg.Compiler.MAIN);
-  compiler.processQueue(compiler.enqueuer.resolution, mainElement);
-  PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
-  FunctionExpression mainNode = mainElement.parseNode(compiler);
-  Block body = mainNode.body;
-  FunctionDeclaration functionDeclaration = body.statements.nodes.head;
-  FunctionExpression fooNode = functionDeclaration.function;
-  LocalPlaceholder fooPlaceholder =
-      collector.functionScopes[mainElement].localPlaceholders.first;
-  Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
+  MockCompiler compiler = new MockCompiler.internal(emitJavaScript: false);
+  asyncTest(() => compiler.init().then((_) {
+    assert(compiler.backend is DartBackend);
+    compiler.parseScript(src);
+    FunctionElement mainElement = compiler.mainApp.find(leg.Compiler.MAIN);
+    compiler.processQueue(compiler.enqueuer.resolution, mainElement);
+    PlaceholderCollector collector = collectPlaceholders(compiler, mainElement);
+    FunctionExpression mainNode = mainElement.parseNode(compiler);
+    Block body = mainNode.body;
+    FunctionDeclaration functionDeclaration = body.statements.nodes.head;
+    FunctionExpression fooNode = functionDeclaration.function;
+    LocalPlaceholder fooPlaceholder =
+        collector.functionScopes[mainElement].localPlaceholders.first;
+    Expect.isTrue(fooPlaceholder.nodes.contains(fooNode.name));
+  }));
 }
 
 testTypeVariablesAreRenamed() {
diff --git a/tests/compiler/dart2js/dart_printer_test.dart b/tests/compiler/dart2js/dart_printer_test.dart
index 3321202..857da91 100644
--- a/tests/compiler/dart2js/dart_printer_test.dart
+++ b/tests/compiler/dart2js/dart_printer_test.dart
@@ -5,15 +5,15 @@
 library dart_printer_test;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_printer.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' show DartString;
+import 'package:compiler/implementation/dart_backend/dart_printer.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/tree/tree.dart' show DartString;
 import 'dart:mirrors';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart' as tree;
-import '../../../sdk/lib/_internal/compiler/implementation/string_validator.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
+import 'package:compiler/implementation/tree/tree.dart' as tree;
+import 'package:compiler/implementation/string_validator.dart';
+import 'package:compiler/implementation/dart_backend/dart_tree_printer.dart' show TreePrinter;
 
 /// For debugging the [AstBuilder] stack. Prints information about [x].
 void show(x) {
diff --git a/tests/compiler/dart2js/dead_phi_eliminator_test.dart b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
index 4551e34..a7088d5 100644
--- a/tests/compiler/dart2js/dead_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/dead_phi_eliminator_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -17,7 +18,8 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    RegExp regexp = new RegExp("toBeRemoved");
+    Expect.isTrue(!regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/declare_once_test.dart b/tests/compiler/dart2js/declare_once_test.dart
index 01fb13e..729a5ab 100644
--- a/tests/compiler/dart2js/declare_once_test.dart
+++ b/tests/compiler/dart2js/declare_once_test.dart
@@ -3,23 +3,25 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 main() {
   // For a function with only one variable we declare it inline for more
   // compactness.  Test that we don't also declare it at the start of the
   // method.
-  var generated = compile(
+  asyncTest(() => compile(
       'final List a = const ["bar", "baz"];'
       'int foo() {'
       '  for (int i = 0; i < a.length; i++) {'
       '    print(a[i]);'
       '  }'
       '}',
-      entry: 'foo', minify: false);
-  RegExp re = new RegExp(r"var ");
-  Expect.isTrue(re.hasMatch(generated));
-  print(generated);
-  Expect.equals(1, re.allMatches(generated).length);
+      entry: 'foo', minify: false).then((String generated) {
+    RegExp re = new RegExp(r"var ");
+    Expect.isTrue(re.hasMatch(generated));
+    print(generated);
+    Expect.equals(1, re.allMatches(generated).length);
+  }));
 }
diff --git a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
index 487b733..55cc05c 100644
--- a/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
+++ b/tests/compiler/dart2js/deferred_dont_inline_deferred_constants_test.dart
@@ -10,7 +10,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class MemoryOutputSink extends EventSink<String> {
diff --git a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
index 45291da..ecf6ffb 100644
--- a/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
+++ b/tests/compiler/dart2js/deferred_emit_type_checks_test.dart
@@ -10,7 +10,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class MemoryOutputSink<T> extends EventSink<T> {
@@ -52,7 +52,7 @@
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     String mainOutput = outputs['main.js'].mem[0];
     String deferredOutput = outputs['out_deferred.part.js'].mem[0];
-    RegExp re = new RegExp(r"\n.\.A\.\$isA = true;");
+    RegExp re = new RegExp(r"\n  _ = .\.A;\n  _.\$isA = TRUE;");
     print(deferredOutput);
     Expect.isTrue(re.hasMatch(deferredOutput));
     Expect.isFalse(re.hasMatch(mainOutput));
diff --git a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
index cbd5447..1d6d60a 100644
--- a/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
+++ b/tests/compiler/dart2js/deferred_follow_constant_dependencies_test.dart
@@ -8,7 +8,7 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 import "dart:async";
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
   hide Compiler;
 
 
diff --git a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
index 0d47ce1..8ac7838 100644
--- a/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
+++ b/tests/compiler/dart2js/deferred_follow_implicit_super_regression_test.dart
@@ -8,7 +8,7 @@
 import "memory_compiler.dart";
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 runTest(String mainScript, test) {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
index 3de5634..2be733f 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation2_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
index 582bcf0..9e3f8af 100644
--- a/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
+++ b/tests/compiler/dart2js/deferred_load_graph_segmentation_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/deferred_mirrors_test.dart b/tests/compiler/dart2js/deferred_mirrors_test.dart
index 5f7eea1..f7b4fb7 100644
--- a/tests/compiler/dart2js/deferred_mirrors_test.dart
+++ b/tests/compiler/dart2js/deferred_mirrors_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "memory_compiler.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 runTest(String mainScript, test) {
diff --git a/tests/compiler/dart2js/deferred_not_in_main_test.dart b/tests/compiler/dart2js/deferred_not_in_main_test.dart
index 5c1bf87..636525d 100644
--- a/tests/compiler/dart2js/deferred_not_in_main_test.dart
+++ b/tests/compiler/dart2js/deferred_not_in_main_test.dart
@@ -11,7 +11,7 @@
 import 'memory_source_file_helper.dart';
 import "dart:async";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        as dart2js;
 
 class FakeOutputStream<T> extends EventSink<T> {
diff --git a/tests/compiler/dart2js/diagnose_ambiguous_test.dart b/tests/compiler/dart2js/diagnose_ambiguous_test.dart
index f9a41a4..f73c43f 100644
--- a/tests/compiler/dart2js/diagnose_ambiguous_test.dart
+++ b/tests/compiler/dart2js/diagnose_ambiguous_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 main() {
diff --git a/tests/compiler/dart2js/dump_info_test.dart b/tests/compiler/dart2js/dump_info_test.dart
index 374b862..678e6a8 100644
--- a/tests/compiler/dart2js/dump_info_test.dart
+++ b/tests/compiler/dart2js/dump_info_test.dart
@@ -6,7 +6,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dump_info.dart';
+import 'package:compiler/implementation/dump_info.dart';
 
 const String TEST_ONE = r"""
 library main;
diff --git a/tests/compiler/dart2js/erroneous_element_test.dart b/tests/compiler/dart2js/erroneous_element_test.dart
index 893dc3c..f4f21e8 100644
--- a/tests/compiler/dart2js/erroneous_element_test.dart
+++ b/tests/compiler/dart2js/erroneous_element_test.dart
@@ -3,13 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/elements/elements.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
     show ErroneousElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show MessageKind;
 
 void main() {
diff --git a/tests/compiler/dart2js/exit_code_test.dart b/tests/compiler/dart2js/exit_code_test.dart
index 074e33d..c81b99f 100644
--- a/tests/compiler/dart2js/exit_code_test.dart
+++ b/tests/compiler/dart2js/exit_code_test.dart
@@ -12,14 +12,15 @@
 import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart' as entry;
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' as apiimpl;
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/dart2js.dart' as entry;
+import 'package:compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/apiimpl.dart' as apiimpl;
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/library_loader.dart';
+import 'package:compiler/implementation/resolution/resolution.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/util/util.dart';
 
 class TestCompiler extends apiimpl.Compiler {
   final String testMarker;
@@ -48,14 +49,14 @@
     return super.run(uri);
   }
 
-  Future scanBuiltinLibraries() {
-    test('Compiler.scanBuiltinLibraries');
-    return super.scanBuiltinLibraries();
+  Future onLibraryScanned(LibraryElement element, LibraryLoader loader) {
+    test('Compiler.onLibraryScanned');
+    return super.onLibraryScanned(element, loader);
   }
 
-  void initializeSpecialClasses() {
-    test('Compiler.initializeSpecialClasses');
-    super.initializeSpecialClasses();
+  Future onLibrariesLoaded(Map<Uri, LibraryElement> loadedLibraries) {
+    test('Compiler.onLibrariesLoaded');
+    return super.onLibrariesLoaded(loadedLibraries);
   }
 
   TreeElements analyzeElement(Element element) {
@@ -248,8 +249,8 @@
   final tests = {
     'Compiler': beforeRun,
     'Compiler.run': beforeRun,
-    'Compiler.scanBuiltinLibraries': beforeRun,
-    'Compiler.initializeSpecialClasses': beforeRun,
+    'Compiler.onLibraryScanned': beforeRun,
+    'Compiler.onLibrariesLoaded': beforeRun,
     'ScannerTask.scanElements': duringRun,
     'Compiler.withCurrentElement': duringRun,
     'Compiler.analyzeElement': duringRun,
diff --git a/tests/compiler/dart2js/field_type_simple_inferer_test.dart b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
index 9f0d498..82a6613 100644
--- a/tests/compiler/dart2js/field_type_simple_inferer_test.dart
+++ b/tests/compiler/dart2js/field_type_simple_inferer_test.dart
@@ -5,7 +5,7 @@
 import 'dart:async';
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/find_my_name_test.dart b/tests/compiler/dart2js/find_my_name_test.dart
index 4de23ca..4fbdfb0 100644
--- a/tests/compiler/dart2js/find_my_name_test.dart
+++ b/tests/compiler/dart2js/find_my_name_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
+import "package:async_helper/async_helper.dart";
+import "package:compiler/implementation/elements/elements.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 
@@ -25,9 +26,10 @@
 ''';
 
 main() {
-  MockCompiler compiler = new MockCompiler();
-  testClass(TEST_0, compiler);
-  testClass(TEST_1, compiler);
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    testClass(TEST_0, compiler);
+    testClass(TEST_1, compiler);
+  }));
 }
 
 testClass(String code, MockCompiler compiler) {
diff --git a/tests/compiler/dart2js/for_in_test.dart b/tests/compiler/dart2js/for_in_test.dart
index 4ded809..23db24a 100644
--- a/tests/compiler/dart2js/for_in_test.dart
+++ b/tests/compiler/dart2js/for_in_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -27,8 +29,12 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(!generated.contains(r'break'));
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/generate_at_use_site_test.dart b/tests/compiler/dart2js/generate_at_use_site_test.dart
index 573b302..4e9e100 100644
--- a/tests/compiler/dart2js/generate_at_use_site_test.dart
+++ b/tests/compiler/dart2js/generate_at_use_site_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String FIB = r"""
@@ -49,16 +51,17 @@
 """;
 
 main() {
-  // Make sure we don't introduce a new variable.
-  RegExp regexp = new RegExp("var $anyIdentifier =");
-  compileAndDoNotMatch(FIB, 'fib', regexp);
+  asyncTest(() => Future.wait([
+    // Make sure we don't introduce a new variable.
+    compileAndDoNotMatch(FIB, 'fib', new RegExp("var $anyIdentifier =")),
 
-  regexp = new RegExp("isLeaf");
-  compileAndDoNotMatch(BAR, 'bar', regexp);
+    compileAndDoNotMatch(BAR, 'bar', new RegExp("isLeaf")),
 
-  String generated = compile(TEST, entry: 'foo');
-  Expect.isFalse(generated.contains('else'));
-  // Regression check to ensure that there is no floating variable
-  // expression.
-  Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
+    compile(TEST, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('else'));
+      // Regression check to ensure that there is no floating variable
+      // expression.
+      Expect.isFalse(new RegExp('^[ ]*a;').hasMatch(generated));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/gvn_test.dart b/tests/compiler/dart2js/gvn_test.dart
index 150237d..4050222 100644
--- a/tests/compiler/dart2js/gvn_test.dart
+++ b/tests/compiler/dart2js/gvn_test.dart
@@ -2,8 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -106,33 +107,41 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp(r"1 \+ [a-z]+");
-  checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(r"1 \+ [a-z]+");
+      checkNumberOfMatches(regexp.allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_TWO, entry: 'foo');
-  checkNumberOfMatches(new RegExp("length").allMatches(generated).iterator, 1);
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("length").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_THREE, entry: 'foo');
-  checkNumberOfMatches(new RegExp("number").allMatches(generated).iterator, 1);
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(
+          new RegExp("number").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(TEST_FOUR, entry: 'foo');
-  checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+    compile(TEST_FOUR, entry: 'foo', check: (String generated) {
+      checkNumberOfMatches(new RegExp("shr").allMatches(generated).iterator, 1);
+    }),
 
-  asyncTest(() => compileAll(TEST_FIVE).then((generated) {
-    checkNumberOfMatches(
-        new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
-  }));
+    compileAll(TEST_FIVE).then((generated) {
+      checkNumberOfMatches(
+          new RegExp("get\\\$foo").allMatches(generated).iterator, 1);
+    }),
 
-  asyncTest(() => compileAll(TEST_SIX).then((generated) {
-    Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-  }));
+    compileAll(TEST_SIX).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    }),
 
-  asyncTest(() => compileAll(TEST_SEVEN).then((generated) {
-    Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
-  }));
+    compileAll(TEST_SEVEN).then((generated) {
+      Expect.isTrue(generated.contains('for (t1 = a.field === 54; t1;)'));
+    }),
 
-  asyncTest(() => compileAll(TEST_EIGHT).then((generated) {
-    Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
-  }));
+    compileAll(TEST_EIGHT).then((generated) {
+      Expect.isTrue(generated.contains('for (; i < t1; ++i)'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/identity_test.dart b/tests/compiler/dart2js/identity_test.dart
index eec4136..6e25ea4 100644
--- a/tests/compiler/dart2js/identity_test.dart
+++ b/tests/compiler/dart2js/identity_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,15 +16,16 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Check that no boolify code is generated.
-  RegExp regexp = new RegExp("=== true");
-  Iterator matches = regexp.allMatches(generated).iterator;
-  Expect.isFalse(matches.moveNext());
+    // Check that no boolify code is generated.
+    RegExp regexp = new RegExp("=== true");
+    Iterator matches = regexp.allMatches(generated).iterator;
+    Expect.isFalse(matches.moveNext());
 
-  regexp = new RegExp("===");
-  matches = regexp.allMatches(generated).iterator;
-  Expect.isTrue(matches.moveNext());
-  Expect.isFalse(matches.moveNext());
+    regexp = new RegExp("===");
+    matches = regexp.allMatches(generated).iterator;
+    Expect.isTrue(matches.moveNext());
+    Expect.isFalse(matches.moveNext());
+  }));
 }
diff --git a/tests/compiler/dart2js/import_test.dart b/tests/compiler/dart2js/import_test.dart
index aeaa469..2fce82d 100644
--- a/tests/compiler/dart2js/import_test.dart
+++ b/tests/compiler/dart2js/import_test.dart
@@ -33,7 +33,9 @@
   var compiler = compilerFor(MEMORY_SOURCE_FILES, diagnosticHandler: collector);
   asyncTest(() => compiler.run(Uri.parse('memory:main.dart')).then((_) {
     Expect.equals(4, collector.errors.length);
-    Expect.equals(1, collector.warnings.length);
+    // TODO(johnniwinther): Expect 1 warning when analysis of programs with load
+    // failures is reenabled.
+    Expect.equals(0, collector.warnings.length);
   }));
 }
 
diff --git a/tests/compiler/dart2js/incremental/compile_all.dart b/tests/compiler/dart2js/incremental/compile_all.dart
new file mode 100644
index 0000000..0579f51
--- /dev/null
+++ b/tests/compiler/dart2js/incremental/compile_all.dart
@@ -0,0 +1,178 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// Helper file that can be used to manually test the stability of incremental
+// compilation.  Currently this test is not run automatically.
+
+import 'dart:async';
+
+import 'dart:io';
+
+import 'dart:profiler' show
+    UserTag;
+
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    IncrementalCompiler;
+
+import '../memory_source_file_helper.dart' show
+    Compiler;
+
+import '../memory_compiler.dart' show
+    compilerFor;
+
+const bool verbose = false;
+
+main(List<String> arguments) {
+  Stopwatch sw = new Stopwatch()..start();
+  Map<String, String> sources = <String, String>{};
+  for (String argument in arguments) {
+    Uri uri = new Uri(scheme: 'memory', path: argument);
+    String source =
+        new File.fromUri(Uri.base.resolve(argument)).readAsStringSync();
+    sources['${uri.path}'] = source;
+  }
+  sw.stop();
+  print(sw.elapsedMilliseconds);
+  compileTests(sources);
+}
+
+void compileTests(Map<String, String> sources) {
+  int cancellations = 0;
+  int testCount = 0;
+  int skipCount = 0;
+  Set<String> crashes = new Set<String>();
+  Compiler memoryCompiler = compilerFor(sources);
+  memoryCompiler.handler.verbose = verbose;
+  var options = ['--analyze-main'];
+  if (true || verbose) options.add('--verbose');
+  IncrementalCompiler compiler = new IncrementalCompiler(
+      libraryRoot: memoryCompiler.libraryRoot,
+      inputProvider: memoryCompiler.provider,
+      outputProvider: memoryCompiler.outputProvider,
+      diagnosticHandler: memoryCompiler.handler,
+      packageRoot: memoryCompiler.packageRoot,
+      options: options);
+  Future.forEach(sources.keys, (String path) {
+    UserTag.defaultTag.makeCurrent();
+    if (!path.endsWith('_test.dart')) return new Future.value(null);
+    testCount++;
+    for (String brokenTest in brokenTests) {
+      if (path.endsWith(brokenTest)) {
+        print('Skipped broken test $path');
+        skipCount++;
+        return new Future.value(null);
+      }
+    }
+    Stopwatch sw = new Stopwatch()..start();
+    return compiler.compile(Uri.parse('memory:$path')).then((bool success) {
+      UserTag.defaultTag.makeCurrent();
+      sw.stop();
+      print('Compiled $path in ${sw.elapsedMilliseconds}');
+      if (compiler.compilerWasCancelled) cancellations++;
+      sw..reset()..start();
+    }).catchError((error, trace) {
+      sw.stop();
+      print('$error\n$trace');
+      print('Crash when compiling $path after ${sw.elapsedMilliseconds}');
+      sw..reset()..start();
+      crashes.add(path);
+    });
+  }).then((_) {
+    percent(i) => '${(i/testCount*100).toStringAsFixed(3)}%';
+    print('''
+
+Total: $testCount tests
+ * $cancellations tests (${percent(cancellations)}) cancelled the compiler
+ * ${crashes.length} tests (${percent(crashes.length)}) crashed the compiler
+ * $skipCount tests (${percent(skipCount)}) were skipped
+''');
+    for (String crash in crashes) {
+      print('Crashed: $crash');
+    }
+    if (!crashes.isEmpty) {
+      throw 'Test had crashes';
+    }
+  });
+}
+
+Set<String> brokenTests = new Set<String>.from([
+    // TODO(ahe): Fix the outputProvider to not throw an error.
+    "/dart2js_extra/deferred/deferred_class_library.dart",
+    "/dart2js_extra/deferred/deferred_class_library2.dart",
+    "/dart2js_extra/deferred/deferred_class_test.dart",
+    "/dart2js_extra/deferred/deferred_constant2_test.dart",
+    "/dart2js_extra/deferred/deferred_constant3_test.dart",
+    "/dart2js_extra/deferred/deferred_constant4_test.dart",
+    "/dart2js_extra/deferred/deferred_constant_test.dart",
+    "/dart2js_extra/deferred/deferred_function_library.dart",
+    "/dart2js_extra/deferred/deferred_function_test.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib1.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib2.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_lib3.dart",
+    "/dart2js_extra/deferred/deferred_overlapping_test.dart",
+    "/dart2js_extra/deferred/deferred_unused_classes_test.dart",
+    "/language/deferred_closurize_load_library_lib.dart",
+    "/language/deferred_closurize_load_library_test.dart",
+    "/language/deferred_constraints_constants_lib.dart",
+    "/language/deferred_constraints_constants_old_syntax_lib.dart",
+    "/language/deferred_constraints_constants_old_syntax_test.dart",
+    "/language/deferred_constraints_constants_test.dart",
+    "/language/deferred_constraints_lib.dart",
+    "/language/deferred_constraints_lib2.dart",
+    "/language/deferred_constraints_old_syntax_lib.dart",
+    "/language/deferred_constraints_type_annotation_old_syntax_test.dart",
+    "/language/deferred_constraints_type_annotation_test.dart",
+    "/language/deferred_duplicate_prefix1_test.dart",
+    "/language/deferred_duplicate_prefix2_test.dart",
+    "/language/deferred_duplicate_prefix3_test.dart",
+    "/language/deferred_load_inval_code_lib.dart",
+    "/language/deferred_load_inval_code_test.dart",
+    "/language/deferred_load_library_wrong_args_lib.dart",
+    "/language/deferred_load_library_wrong_args_test.dart",
+    "/language/deferred_no_prefix_test.dart",
+    "/language/deferred_no_such_method_lib.dart",
+    "/language/deferred_no_such_method_test.dart",
+    "/language/deferred_not_loaded_check_lib.dart",
+    "/language/deferred_not_loaded_check_test.dart",
+    "/language/deferred_prefix_constraints_lib.dart",
+    "/language/deferred_prefix_constraints_lib2.dart",
+    "/language/deferred_shadow_load_library_lib.dart",
+    "/language/deferred_shadow_load_library_test.dart",
+
+    "/language/bad_constructor_test.dart",
+    "/language/black_listed_test.dart",
+    "/language/built_in_identifier_illegal_test.dart",
+    "/language/built_in_identifier_prefix_test.dart",
+    "/language/built_in_identifier_test.dart",
+    "/language/class_cycle2_test.dart",
+    "/language/class_syntax_test.dart",
+    "/language/cyclic_typedef_test.dart",
+    "/language/external_test.dart",
+    "/language/factory3_negative_test.dart",
+    "/language/generic_field_mixin4_test.dart",
+    "/language/generic_field_mixin5_test.dart",
+    "/language/interface_cycle_test.dart",
+    "/language/interface_injection1_negative_test.dart",
+    "/language/interface_injection2_negative_test.dart",
+    "/language/internal_library_test.dart",
+    "/language/malformed_inheritance_test.dart",
+    "/language/metadata_test.dart",
+    "/language/method_override2_test.dart",
+    "/language/mixin_illegal_syntax_test.dart",
+    "/language/mixin_invalid_inheritance1_test.dart",
+    "/language/null_test.dart",
+    "/language/override_inheritance_generic_test.dart",
+    "/language/prefix18_negative_test.dart",
+    "/language/prefix3_negative_test.dart",
+    "/language/script2_negative_test.dart",
+    "/language/setter_declaration2_negative_test.dart",
+    "/language/source_self_negative_test.dart",
+    "/language/syntax_test.dart",
+    "/language/type_variable_bounds2_test.dart",
+    "/language/type_variable_conflict2_test.dart",
+    "/language/type_variable_field_initializer_test.dart",
+    "/language/type_variable_nested_test.dart",
+    "/language/vm/reflect_core_vm_test.dart",
+    "/language/vm/regress_14903_test.dart",
+]);
diff --git a/tests/compiler/dart2js/incremental/hello_test.dart b/tests/compiler/dart2js/incremental/hello_test.dart
new file mode 100644
index 0000000..026ce57
--- /dev/null
+++ b/tests/compiler/dart2js/incremental/hello_test.dart
@@ -0,0 +1,118 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 a sequence of modifications to hello-world which used to cause problems
+// on Try Dart.
+
+import 'dart:io' show
+    Platform;
+
+import 'dart:async' show
+    Future;
+
+import 'package:dart2js_incremental/dart2js_incremental.dart' show
+    IncrementalCompiler;
+
+import 'package:compiler/compiler.dart' show
+    Diagnostic;
+
+import 'package:async_helper/async_helper.dart' show
+    asyncTest;
+
+import 'package:expect/expect.dart' show
+    Expect;
+
+import '../memory_source_file_helper.dart' show
+    MemorySourceFileProvider;
+
+var tests = {
+'/test1.dart':
+'''
+var greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test2.dart':
+'''
+va greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test3.dart':
+'''
+ greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test4.dart':
+'''
+in greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+'/test5.dart':
+'''
+int greeting = "Hello, World!";
+
+void main() {
+  print(greeting);
+}
+''',
+};
+
+var testResults = {
+  '/test1.dart': true,
+  '/test2.dart': true,
+  '/test3.dart': false,
+  '/test4.dart': false,
+  '/test5.dart': true,
+};
+
+main() {
+  Uri libraryRoot = Uri.base.resolve('sdk/');
+  Uri packageRoot = Uri.base.resolveUri(
+      new Uri.file('${Platform.packageRoot}/'));
+  MemorySourceFileProvider provider =
+      new MemorySourceFileProvider(tests);
+  asyncTest(() => runTests(libraryRoot, packageRoot, provider));
+}
+
+Future runTests(
+    Uri libraryRoot,
+    Uri packageRoot,
+    MemorySourceFileProvider provider) {
+  IncrementalCompiler compiler = new IncrementalCompiler(
+      diagnosticHandler: handler,
+      inputProvider: provider,
+      options: ['--analyze-main'],
+      libraryRoot: libraryRoot,
+      packageRoot: packageRoot);
+
+  return Future.forEach(tests.keys, (String testName) {
+    Uri testUri = Uri.parse('memory:$testName');
+    return compiler.compile(testUri).then((bool success) {
+      Expect.equals(
+          testResults[testName], success,
+          'Compilation unexpectedly ${success ? "succeed" : "failed"}.');
+    });
+  });
+}
+
+void handler(Uri uri,
+             int begin,
+             int end,
+             String message,
+             Diagnostic kind) {
+  if (kind != Diagnostic.VERBOSE_INFO) {
+    print('$uri:$begin:$end:$message:$kind');
+  }
+}
diff --git a/tests/compiler/dart2js/interceptor_test.dart b/tests/compiler/dart2js/interceptor_test.dart
index 53a3ef5..619d018 100644
--- a/tests/compiler/dart2js/interceptor_test.dart
+++ b/tests/compiler/dart2js/interceptor_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,18 +26,23 @@
 """;
 
 main() {
-  // Check that one-shot interceptors preserve variable names, see
-  // https://code.google.com/p/dart/issues/detail?id=8106.
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\(a\)')));
-  Expect.isTrue(generated.contains('myVariableName'));
-
-  // Check that an intercepted getter that does not need to be
-  // intercepted, is turned into a regular getter call or field
-  // access.
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isFalse(generated.contains(r'a.get$length()'));
-  Expect.isTrue(generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
-  Expect.isTrue(
-      generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+  asyncTest(() => Future.wait([
+    // Check that one-shot interceptors preserve variable names, see
+    // https://code.google.com/p/dart/issues/detail?id=8106.
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.toString\$0\(a\)')));
+      Expect.isTrue(generated.contains('myVariableName'));
+    }),
+    // Check that an intercepted getter that does not need to be
+    // intercepted, is turned into a regular getter call or field
+    // access.
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains(r'a.get$length()'));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.A\$\(\)\.length')));
+      Expect.isTrue(
+          generated.contains(new RegExp(r'[$A-Z]+\.get\$length\$as\(a\)')));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/interpolation_folding_test.dart b/tests/compiler/dart2js/interpolation_folding_test.dart
index 1cfc4af..673a85c 100644
--- a/tests/compiler/dart2js/interpolation_folding_test.dart
+++ b/tests/compiler/dart2js/interpolation_folding_test.dart
@@ -2,6 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
@@ -37,22 +39,25 @@
 """;
 
 main() {
-  void check(String test, String contained) {
-    var generated = compile(test, entry: 'foo');
-    Expect.isTrue(generated.contains(contained), contained);
+  Future check(String test, String contained) {
+    return compile(test, entry: 'foo').then((String generated) {
+      Expect.isTrue(generated.contains(contained), contained);
+    });
   }
 
-  // Full substitution.
-  check(TEST_1, r'"u120vhellow"');
+  asyncTest(() => Future.wait([
+    // Full substitution.
+    check(TEST_1, r'"u120vhellow"'),
 
-  // Adjacent string fragments get merged.
-  check(TEST_2, r'"xxxxxyyyyy"');
+    // Adjacent string fragments get merged.
+    check(TEST_2, r'"xxxxxyyyyy"'),
 
-  // 1. No merging of fragments that are multi-use.  Prevents exponential code
-  //    and keeps author's manual CSE.
-  // 2. Know string values require no stringification.
-  check(TEST_3, r'return b + "x" + b');
+    // 1. No merging of fragments that are multi-use.  Prevents exponential code
+    //    and keeps author's manual CSE.
+    // 2. Know string values require no stringification.
+    check(TEST_3, r'return b + "x" + b'),
 
-  // Known int value can be formatted directly.
-  check(TEST_4, r'return "" + b.length');
+    // Known int value can be formatted directly.
+    check(TEST_4, r'return "" + b.length'),
+  ]));
 }
diff --git a/tests/compiler/dart2js/inverse_operator_test.dart b/tests/compiler/dart2js/inverse_operator_test.dart
index e6c7cd5..44c10de 100644
--- a/tests/compiler/dart2js/inverse_operator_test.dart
+++ b/tests/compiler/dart2js/inverse_operator_test.dart
@@ -2,6 +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.
 
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String MAIN = r"""
@@ -17,5 +18,5 @@
 
 main() {
   // Make sure we don't introduce a new variable.
-  compileAndMatchFuzzy(MAIN, 'main', "1 >= x");
+  asyncTest(() => compileAndMatchFuzzy(MAIN, 'main', "1 >= x"));
 }
diff --git a/tests/compiler/dart2js/is_inference2_test.dart b/tests/compiler/dart2js/is_inference2_test.dart
index 2ce07d5..3e3e6ea 100644
--- a/tests/compiler/dart2js/is_inference2_test.dart
+++ b/tests/compiler/dart2js/is_inference2_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_IF_BOOL_FIRST_INSTRUCTION = r"""
@@ -13,9 +14,11 @@
 """;
 
 main() {
-  String generated = compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate');
-  Expect.isTrue(generated.contains("!"));  // We want to see !x.
-  Expect.isFalse(generated.contains("!="));  // And not !== true.
-  Expect.isFalse(generated.contains("true"));
-  Expect.isFalse(generated.contains("false"));
+  asyncTest(() => compile(TEST_IF_BOOL_FIRST_INSTRUCTION, entry: 'negate',
+      check: (String generated) {
+    Expect.isTrue(generated.contains("!"));  // We want to see !x.
+    Expect.isFalse(generated.contains("!="));  // And not !== true.
+    Expect.isFalse(generated.contains("true"));
+    Expect.isFalse(generated.contains("false"));
+  }));
 }
diff --git a/tests/compiler/dart2js/is_inference_test.dart b/tests/compiler/dart2js/is_inference_test.dart
index d648913..6f0a3b8 100644
--- a/tests/compiler/dart2js/is_inference_test.dart
+++ b/tests/compiler/dart2js/is_inference_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_IF = r"""
@@ -69,20 +71,23 @@
 }
 """;
 
-compileAndTest(String code) {
-  String generated = compile(code, entry: 'test');
-  RegExp validAdd =
-      new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
-  RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
-  Expect.isTrue(validAdd.hasMatch(generated));
-  Expect.isFalse(invalidAdd.hasMatch(generated));
+Future compileAndTest(String code) {
+  return compile(code, entry: 'test', check: (String generated) {
+    RegExp validAdd =
+        new RegExp("($anyIdentifier \\+ 42)|($anyIdentifier \\+= 42)");
+    RegExp invalidAdd = new RegExp("$anyIdentifier \\+ 53");
+    Expect.isTrue(validAdd.hasMatch(generated));
+    Expect.isFalse(invalidAdd.hasMatch(generated));
+  });
 }
 
 main() {
-  compileAndTest(TEST_IF);
-  compileAndTest(TEST_IF_ELSE);
-  compileAndTest(TEST_IF_RETURN);
-  compileAndTest(TEST_IF_NOT_ELSE);
-  compileAndTest(TEST_IF_NOT_RETURN);
-  compileAndTest(TEST_IF_NOT_ELSE_RETURN);
+  asyncTest(() => Future.wait([
+    compileAndTest(TEST_IF),
+    compileAndTest(TEST_IF_ELSE),
+    compileAndTest(TEST_IF_RETURN),
+    compileAndTest(TEST_IF_NOT_ELSE),
+    compileAndTest(TEST_IF_NOT_RETURN),
+    compileAndTest(TEST_IF_NOT_ELSE_RETURN),
+  ]));
 }
diff --git a/tests/compiler/dart2js/js_parser_statements_test.dart b/tests/compiler/dart2js/js_parser_statements_test.dart
index 733e4ac..e2dcdbe 100644
--- a/tests/compiler/dart2js/js_parser_statements_test.dart
+++ b/tests/compiler/dart2js/js_parser_statements_test.dart
@@ -2,32 +2,37 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' as jsAst;
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' show js;
+import 'package:compiler/implementation/js/js.dart' as jsAst;
+import 'package:compiler/implementation/js/js.dart' show js;
 
 
-void testStatement(String statement, List arguments, String expect) {
+Future testStatement(String statement, List arguments, String expect) {
   jsAst.Node node = js.statement(statement, arguments);
-  MockCompiler compiler = new MockCompiler();
-  String jsText =
-      jsAst.prettyPrint(node, compiler, allowVariableMinification: false)
-      .getText();
+  return MockCompiler.create((MockCompiler compiler) {
+    String jsText =
+        jsAst.prettyPrint(node, compiler, allowVariableMinification: false)
+        .getText();
 
-  Expect.stringEquals(expect.trim(), jsText.trim());
+    Expect.stringEquals(expect.trim(), jsText.trim());
+  });
 }
 
-void testError(String statement, List arguments, [String expect = ""]) {
-  bool doCheck(exception) {
-    String message = '$exception';
-    Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
-    return true;
-  }
-  void action() {
-    jsAst.Node node = js.statement(statement, arguments);
-  }
-  Expect.throws(action, doCheck);
+Future testError(String statement, List arguments, [String expect = ""]) {
+  return new Future.sync(() {
+    bool doCheck(exception) {
+      String message = '$exception';
+      Expect.isTrue(message.contains(expect), '"$message" contains "$expect"');
+      return true;
+    }
+    void action() {
+      jsAst.Node node = js.statement(statement, arguments);
+    }
+    Expect.throws(action, doCheck);
+  });
 }
 
 // Function declaration and named function.
@@ -64,91 +69,93 @@
   var eTrue = js('true');
   var eVar = js('x');
   var block12 = js.statement('{ 1; 2; }');
+  var seq1 = js('1, 2, 3');
 
   Expect.isTrue(eOne is jsAst.LiteralNumber);
   Expect.isTrue(eTrue is jsAst.LiteralBool);
   Expect.isTrue(block12 is jsAst.Block);
 
-  // Interpolated Expressions are upgraded to ExpressionStatements.
-  testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}');
+  asyncTest(() => Future.wait([
+    // Interpolated Expressions are upgraded to ExpressionStatements.
+    testStatement('{ #; #; }', [eOne, eOne], '{\n  1;\n  1;\n}'),
 
-  // Interpolated sub-blocks are spliced.
-  testStatement('{ #; #; }', [block12, block12],
-      '{\n  1;\n  2;\n  1;\n  2;\n}\n');
+    // Interpolated sub-blocks are spliced.
+    testStatement('{ #; #; }', [block12, block12],
+        '{\n  1;\n  2;\n  1;\n  2;\n}\n'),
 
-  // If-condition.  Dart booleans are evaluated, JS Expression booleans are
-  // substituted.
-  testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}');
-  testStatement('if (#) #;', [false, block12], ';');
-  testStatement('if (#) 3; else #;', [true, block12], '3;');
-  testStatement('if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}');
+    // If-condition.  Dart booleans are evaluated, JS Expression booleans are
+    // substituted.
+    testStatement('if (#) #', [eOne, block12], 'if (1) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [eTrue, block12], 'if (true) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [eVar, block12], 'if (x) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', ['a', block12], 'if (a) {\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [true, block12], '{\n  1;\n  2;\n}'),
+    testStatement('if (#) #;', [false, block12], ';'),
+    testStatement('if (#) 3; else #;', [true, block12], '3;'),
+    testStatement('if (#) 3; else #;', [false, block12], '{\n  1;\n  2;\n}'),
 
 
-  testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE);
+    testStatement(NAMED_FUNCTION_1, [eOne], NAMED_FUNCTION_1_ONE),
 
-  testStatement(MISC_1, [block12], MISC_1_1);
+    testStatement(MISC_1, [block12], MISC_1_1),
 
-  // Argument list splicing.
-  testStatement('foo(#)', [[]], 'foo();');
-  testStatement('foo(#)', [[eOne]], 'foo(1);');
-  testStatement('foo(#)', [eOne], 'foo(1);');
-  testStatement('foo(#)', [[eTrue,eOne]], 'foo(true, 1);');
+    // Argument list splicing.
+    testStatement('foo(#)', [[]], 'foo();'),
+    testStatement('foo(#)', [[eOne]], 'foo(1);'),
+    testStatement('foo(#)', [eOne], 'foo(1);'),
+    testStatement('foo(#)', [[eTrue,eOne]], 'foo(true, 1);'),
 
-  testStatement('foo(2,#)', [[]], 'foo(2);');
-  testStatement('foo(2,#)', [[eOne]], 'foo(2, 1);');
-  testStatement('foo(2,#)', [eOne], 'foo(2, 1);');
-  testStatement('foo(2,#)', [[eTrue,eOne]], 'foo(2, true, 1);');
+    testStatement('foo(2,#)', [[]], 'foo(2);'),
+    testStatement('foo(2,#)', [[eOne]], 'foo(2, 1);'),
+    testStatement('foo(2,#)', [eOne], 'foo(2, 1);'),
+    testStatement('foo(2,#)', [[eTrue,eOne]], 'foo(2, true, 1);'),
 
-  testStatement('foo(#,3)', [[]], 'foo(3);');
-  testStatement('foo(#,3)', [[eOne]], 'foo(1, 3);');
-  testStatement('foo(#,3)', [eOne], 'foo(1, 3);');
-  testStatement('foo(#,3)', [[eTrue,eOne]], 'foo(true, 1, 3);');
+    testStatement('foo(#,3)', [[]], 'foo(3);'),
+    testStatement('foo(#,3)', [[eOne]], 'foo(1, 3);'),
+    testStatement('foo(#,3)', [eOne], 'foo(1, 3);'),
+    testStatement('foo(#,3)', [[eTrue,eOne]], 'foo(true, 1, 3);'),
 
-  testStatement('foo(2,#,3)', [[]], 'foo(2, 3);');
-  testStatement('foo(2,#,3)', [[eOne]], 'foo(2, 1, 3);');
-  testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);');
-  testStatement('foo(2,#,3)', [[eTrue,eOne]], 'foo(2, true, 1, 3);');
+    testStatement('foo(2,#,3)', [[]], 'foo(2, 3);'),
+    testStatement('foo(2,#,3)', [[eOne]], 'foo(2, 1, 3);'),
+    testStatement('foo(2,#,3)', [eOne], 'foo(2, 1, 3);'),
+    testStatement('foo(2,#,3)', [[eTrue,eOne]], 'foo(2, true, 1, 3);'),
 
-  // Interpolated Literals
-  testStatement('a = {#: 1}', [eOne], 'a = {1: 1};');
-  // Maybe we should make this work?
-  testError('a = {#: 1}', [1], 'is not a Literal: 1');
+    // Interpolated Literals
+    testStatement('a = {#: 1}', [eOne], 'a = {1: 1};'),
+    // Maybe we should make this work?
+    testError('a = {#: 1}', [1], 'is not a Literal: 1'),
 
-  // Interpolated parameter splicing.
-  testStatement('function foo(#){}', [new jsAst.Parameter('x')],
-      'function foo(x) {\n}');
-  testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}');
-  testStatement('function foo(#){}', [[]], 'function foo() {\n}');
-  testStatement('function foo(#){}', [['x']], 'function foo(x) {\n}');
-  testStatement('function foo(#){}', [['x', 'y']], 'function foo(x, y) {\n}');
+    // Interpolated parameter splicing.
+    testStatement('function foo(#){}', [new jsAst.Parameter('x')],
+        'function foo(x) {\n}'),
+    testStatement('function foo(#){}', ['x'], 'function foo(x) {\n}'),
+    testStatement('function foo(#){}', [[]], 'function foo() {\n}'),
+    testStatement('function foo(#){}', [['x']], 'function foo(x) {\n}'),
+    testStatement('function foo(#){}', [['x', 'y']], 'function foo(x, y) {\n}'),
 
 
-  testStatement('a = #.#', [eVar,eOne], 'a = x[1];');
-  testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;');
+    testStatement('a = #.#', [eVar,eOne], 'a = x[1];'),
+    testStatement('a = #.#', [eVar,'foo'], 'a = x.foo;'),
 
-  testStatement('function f(#) { return #.#; }', ['x', eVar,'foo'],
-      'function f(x) {\n  return x.foo;\n}');
+    testStatement('function f(#) { return #.#; }', ['x', eVar,'foo'],
+        'function f(x) {\n  return x.foo;\n}'),
 
-  testStatement('#.prototype.# = function(#) { return #.# };',
-      ['className', 'getterName', ['r', 'y'], 'r', 'fieldName'],
-      'className.prototype.getterName = function(r, y) {\n'
-      '  return r.fieldName;\n'
-      '};');
+    testStatement('#.prototype.# = function(#) { return #.# };',
+        ['className', 'getterName', ['r', 'y'], 'r', 'fieldName'],
+        'className.prototype.getterName = function(r, y) {\n'
+        '  return r.fieldName;\n'
+        '};'),
 
-  testStatement('function foo(r, #) { return #[r](#) }',
-      [['a', 'b'], 'g', ['b', 'a']],
-      'function foo(r, a, b) {\n  return g[r](b, a);\n}');
+    testStatement('function foo(r, #) { return #[r](#) }',
+        [['a', 'b'], 'g', ['b', 'a']],
+        'function foo(r, a, b) {\n  return g[r](b, a);\n}'),
 
-  // Sequence is printed flattened
-  var seq1 = js('1, 2, 3');
-  testStatement('x = #', [seq1], 'x = (1, 2, 3);');
-  testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);');
-  testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;');
-  testStatement(
-      'for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
-      'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}');
+    // Sequence is printed flattened
+    testStatement('x = #', [seq1], 'x = (1, 2, 3);'),
+    testStatement('x = (#, #)', [seq1, seq1], 'x = (1, 2, 3, 1, 2, 3);'),
+    testStatement('x = #, #', [seq1, seq1], 'x = (1, 2, 3), 1, 2, 3;'),
+    testStatement(
+        'for (i = 0, j = #, k = 0; ; ++i, ++j, ++k){}', [seq1],
+        'for (i = 0, j = (1, 2, 3), k = 0;; ++i, ++j, ++k) {\n}'),
+  ]));
 }
diff --git a/tests/compiler/dart2js/js_parser_test.dart b/tests/compiler/dart2js/js_parser_test.dart
index db6f43a..54fe2ad 100644
--- a/tests/compiler/dart2js/js_parser_test.dart
+++ b/tests/compiler/dart2js/js_parser_test.dart
@@ -2,188 +2,193 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+import 'dart:async';
 import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' as jsAst;
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart' show js;
+import 'package:compiler/implementation/js/js.dart' as jsAst;
+import 'package:compiler/implementation/js/js.dart' show js;
 
-void testExpression(String expression, [String expect = ""]) {
+Future testExpression(String expression, [String expect = ""]) {
   jsAst.Node node = js(expression);
-  MockCompiler compiler = new MockCompiler();
-  String jsText =
-      jsAst.prettyPrint(node,
-                        compiler,
-                        allowVariableMinification: false).getText();
-  if (expect == "") {
-    Expect.stringEquals(expression, jsText);
-  } else {
-    Expect.stringEquals(expect, jsText);
-  }
+  return MockCompiler.create((MockCompiler compiler) {
+    String jsText =
+        jsAst.prettyPrint(node,
+                          compiler,
+                          allowVariableMinification: false).getText();
+    if (expect == "") {
+      Expect.stringEquals(expression, jsText);
+    } else {
+      Expect.stringEquals(expect, jsText);
+    }
+  });
 }
 
-void testError(String expression, [String expect = ""]) {
-  bool doCheck(exception) {
-    Expect.isTrue(exception.toString().contains(expect));
-    return true;
-  }
-  Expect.throws(() => js(expression), doCheck);
+Future testError(String expression, [String expect = ""]) {
+  return new Future.sync(() {
+    bool doCheck(exception) {
+      Expect.isTrue(exception.toString().contains(expect));
+      return true;
+    }
+    Expect.throws(() => js(expression), doCheck);
+  });
 }
-    
-
 
 void main() {
-  // Asterisk indicates deviations from real JS.
-  // Simple var test.
-  testExpression('var a = ""');
-  // Parse and print will normalize whitespace.
-  testExpression(' var  a  =  "" ', 'var a = ""');
-  // Operator precedence.
-  testExpression('x = a + b * c');
-  testExpression('x = a * b + c');
-  testExpression('x = a + b * c + d');
-  testExpression('x = a * b + c * d');
-  testExpression('remaining = (remaining / 88) | 0',
-                 'remaining = remaining / 88 | 0');
-  // Binary operators have left associativity.
-  testExpression('x = a + b + c');
-  // We can cope with relational operators and non-relational.
-  testExpression('a + b == c + d');
-  // The prettyprinter will insert braces where needed.
-  testExpression('a + (b == c) + d');
-  // We can handle () for calls.
-  testExpression('foo(bar)');
-  testExpression('foo(bar, baz)');
-  // Chained calls without parentheses.
-  testExpression('foo(bar)(baz)');
-  // Chaned calls with and without new.
-  testExpression('new foo(bar)(baz)');
-  testExpression('new foo.bar(bar)(baz)');
-  testExpression('foo.bar(bar)(baz)');
-  testExpression('constructor = new Function(str)()');
-  // The prettyprinter understands chained calls without extra parentheses.
-  testExpression('(foo(bar))(baz)', 'foo(bar)(baz)');
-  // Chains of dotting and calls.
-  testExpression('foo.bar(baz)');
-  // String literal.
-  testExpression('var x = "fisk"');
-  // String literal with \n.
-  testExpression(r'var x = "\n"');
-  // String literal with escaped quote.
-  testExpression(r'var x = "\""');
-  // *No clever escapes.
-  testError(r'var x = "\x42"', 'escapes are not allowed in literals');
-  // Operator new.
-  testExpression('new Foo()');
-  // New with dotted access.
-  testExpression('new Frobinator.frobinate()');
-  testExpression('new Frobinator().frobinate()');
-  // The prettyprinter strips some superfluous parentheses.
-  testExpression('(new Frobinator()).frobinate()',
-                 'new Frobinator().frobinate()');
-  // *We want a bracket on 'new'.
-  testError('new Foo', 'Parentheses are required');
-  testError('(new Foo)', 'Parentheses are required');
-  // Bogus operators.
-  testError('a +++ b', 'Unknown operator');
-  // This isn't perl.  There are rules.
-  testError('a <=> b', 'Unknown operator');
-  // Typeof.
-  testExpression('typeof foo == "number"');
-  // Strange relation.
-  testExpression('a < b < c');
-  // Chained var.
-  testExpression('var x = 0, y = 1.2, z = 42');
-  // Empty object literal.
-  testExpression('foo({}, {})');
-  // *Can't handle non-empty object literals
-  testExpression('foo({meaning: 42})');
-  // Literals.
-  testExpression('x(false, true, null)');
-  // *We should really throw here.
-  testExpression('var false = 42');
-  testExpression('var new = 42');
-  // Bad keyword.
-  testError('var typeof = 42', "Expected ALPHA");
-  // Malformed decimal/hex.
-  testError('var x = 1.1.1', "Unparseable number");
-  testError('var x = 0xabcdefga', "Unparseable number");
-  testError('var x = 0xabcdef\$a', "Unparseable number");
-  testError('var x = 0x ', "Unparseable number");
-  // Good hex constants.
-  testExpression('var x = 0xff');
-  testExpression('var x = 0xff + 0xff');
-  testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF');
-  // All sorts of keywords are allowed as property names in ES5.
-  testExpression('x.new = 0');
-  testExpression('x.delete = 0');
-  testExpression('x.for = 0');
-  testExpression('x.instanceof = 0');
-  testExpression('x.in = 0');
-  testExpression('x.void = 0');
-  testExpression('x.continue = 0');
-  // More unary.
-  testExpression('x = !x');
-  testExpression('!x == false');
-  testExpression('var foo = void 0');
-  testExpression('delete foo.bar');
-  testExpression('delete foo');
-  testExpression('x in y');
-  testExpression('x instanceof y');
-  testExpression('a * b in c * d');
-  testExpression('a * b instanceof c * d');
-  testError('x typeof y', 'Unparsed junk');
-  testExpression('x &= ~mask');
-  // Adjacent tokens.
-  testExpression('foo[x[bar]]');
-  testExpression('foo[[bar]]');
-  // Prefix ++ etc.
-  testExpression("++x");
-  testExpression("++foo.bar");
-  testExpression("+x");
-  testExpression("+foo.bar");
-  testExpression("-x");
-  testExpression("-foo.bar");
-  testExpression("--x");
-  testExpression("--foo.bar");
-  // Postfix ++ etc.
-  testExpression("x++");
-  testExpression("foo.bar++");
-  testExpression("x--");
-  testExpression("foo.bar--");
-  // Both!
-  testExpression("++x++");
-  testExpression("++foo.bar++");
-  testExpression("--x--");
-  testExpression("--foo.bar--");
-  // *We can't handle stacked unary operators (apart from !).
-  testError("x++ ++");
-  testError("++ typeof x");
-  testExpression(r"var $supportsProtoName = !!{}.__proto__");
-  // ++ used as a binary operator.
-  testError("x++ ++ 42");
-  // Shift operators.
-  testExpression("x << 5");
-  testExpression("x << y + 1");
-  testExpression("x <<= y + 1");
-  // Array initializers.
-  testExpression("x = ['foo', 'bar', x[4]]");
-  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]");
-  // Ternary operator.
-  testExpression("x = a ? b : c");
-  testExpression("y = a == null ? b : a");
-  testExpression("y = a == null ? b + c : a + c");
-  testExpression("foo = a ? b : c ? d : e");
-  testExpression("foo = a ? b ? c : d : e");
-  testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z");
-  testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z");
-  // Stacked assignment.
-  testExpression("a = b = c");
-  testExpression("var a = b = c");
+  asyncTest(() => Future.wait([
+    // Asterisk indicates deviations from real JS.
+    // Simple var test.
+    testExpression('var a = ""'),
+    // Parse and print will normalize whitespace.
+    testExpression(' var  a  =  "" ', 'var a = ""'),
+    // Operator precedence.
+    testExpression('x = a + b * c'),
+    testExpression('x = a * b + c'),
+    testExpression('x = a + b * c + d'),
+    testExpression('x = a * b + c * d'),
+    testExpression('remaining = (remaining / 88) | 0',
+                   'remaining = remaining / 88 | 0'),
+    // Binary operators have left associativity.
+    testExpression('x = a + b + c'),
+    // We can cope with relational operators and non-relational.
+    testExpression('a + b == c + d'),
+    // The prettyprinter will insert braces where needed.
+    testExpression('a + (b == c) + d'),
+    // We can handle () for calls.
+    testExpression('foo(bar)'),
+    testExpression('foo(bar, baz)'),
+    // Chained calls without parentheses.
+    testExpression('foo(bar)(baz)'),
+    // Chaned calls with and without new.
+    testExpression('new foo(bar)(baz)'),
+    testExpression('new foo.bar(bar)(baz)'),
+    testExpression('foo.bar(bar)(baz)'),
+    testExpression('constructor = new Function(str)()'),
+    // The prettyprinter understands chained calls without extra parentheses.
+    testExpression('(foo(bar))(baz)', 'foo(bar)(baz)'),
+    // Chains of dotting and calls.
+    testExpression('foo.bar(baz)'),
+    // String literal.
+    testExpression('var x = "fisk"'),
+    // String literal with \n.
+    testExpression(r'var x = "\n"'),
+    // String literal with escaped quote.
+    testExpression(r'var x = "\""'),
+    // *No clever escapes.
+    testError(r'var x = "\x42"', 'escapes are not allowed in literals'),
+    // Operator new.
+    testExpression('new Foo()'),
+    // New with dotted access.
+    testExpression('new Frobinator.frobinate()'),
+    testExpression('new Frobinator().frobinate()'),
+    // The prettyprinter strips some superfluous parentheses.
+    testExpression('(new Frobinator()).frobinate()',
+                   'new Frobinator().frobinate()'),
+    // *We want a bracket on 'new'.
+    testError('new Foo', 'Parentheses are required'),
+    testError('(new Foo)', 'Parentheses are required'),
+    // Bogus operators.
+    testError('a +++ b', 'Unknown operator'),
+    // This isn't perl.  There are rules.
+    testError('a <=> b', 'Unknown operator'),
+    // Typeof.
+    testExpression('typeof foo == "number"'),
+    // Strange relation.
+    testExpression('a < b < c'),
+    // Chained var.
+    testExpression('var x = 0, y = 1.2, z = 42'),
+    // Empty object literal.
+    testExpression('foo({}, {})'),
+    // *Can't handle non-empty object literals
+    testExpression('foo({meaning: 42})'),
+    // Literals.
+    testExpression('x(false, true, null)'),
+    // *We should really throw here.
+    testExpression('var false = 42'),
+    testExpression('var new = 42'),
+    // Bad keyword.
+    testError('var typeof = 42', "Expected ALPHA"),
+    // Malformed decimal/hex.
+    testError('var x = 1.1.1', "Unparseable number"),
+    testError('var x = 0xabcdefga', "Unparseable number"),
+    testError('var x = 0xabcdef\$a', "Unparseable number"),
+    testError('var x = 0x ', "Unparseable number"),
+    // Good hex constants.
+    testExpression('var x = 0xff'),
+    testExpression('var x = 0xff + 0xff'),
+    testExpression('var x = 0xaF + 0x0123456789abcdefABCDEF'),
+    // All sorts of keywords are allowed as property names in ES5.
+    testExpression('x.new = 0'),
+    testExpression('x.delete = 0'),
+    testExpression('x.for = 0'),
+    testExpression('x.instanceof = 0'),
+    testExpression('x.in = 0'),
+    testExpression('x.void = 0'),
+    testExpression('x.continue = 0'),
+    // More unary.
+    testExpression('x = !x'),
+    testExpression('!x == false'),
+    testExpression('var foo = void 0'),
+    testExpression('delete foo.bar'),
+    testExpression('delete foo'),
+    testExpression('x in y'),
+    testExpression('x instanceof y'),
+    testExpression('a * b in c * d'),
+    testExpression('a * b instanceof c * d'),
+    testError('x typeof y', 'Unparsed junk'),
+    testExpression('x &= ~mask'),
+    // Adjacent tokens.
+    testExpression('foo[x[bar]]'),
+    testExpression('foo[[bar]]'),
+    // Prefix ++ etc.
+    testExpression("++x"),
+    testExpression("++foo.bar"),
+    testExpression("+x"),
+    testExpression("+foo.bar"),
+    testExpression("-x"),
+    testExpression("-foo.bar"),
+    testExpression("--x"),
+    testExpression("--foo.bar"),
+    // Postfix ++ etc.
+    testExpression("x++"),
+    testExpression("foo.bar++"),
+    testExpression("x--"),
+    testExpression("foo.bar--"),
+    // Both!
+    testExpression("++x++"),
+    testExpression("++foo.bar++"),
+    testExpression("--x--"),
+    testExpression("--foo.bar--"),
+    // *We can't handle stacked unary operators (apart from !).
+    testError("x++ ++"),
+    testError("++ typeof x"),
+    testExpression(r"var $supportsProtoName = !!{}.__proto__"),
+    // ++ used as a binary operator.
+    testError("x++ ++ 42"),
+    // Shift operators.
+    testExpression("x << 5"),
+    testExpression("x << y + 1"),
+    testExpression("x <<= y + 1"),
+    // Array initializers.
+    testExpression("x = ['foo', 'bar', x[4]]"),
+    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]"),
+    // Ternary operator.
+    testExpression("x = a ? b : c"),
+    testExpression("y = a == null ? b : a"),
+    testExpression("y = a == null ? b + c : a + c"),
+    testExpression("foo = a ? b : c ? d : e"),
+    testExpression("foo = a ? b ? c : d : e"),
+    testExpression("foo = (a = v) ? b = w : c = x ? d = y : e = z"),
+    testExpression("foo = (a = v) ? b = w ? c = x : d = y : e = z"),
+    // Stacked assignment.
+    testExpression("a = b = c"),
+    testExpression("var a = b = c"),
+  ]));
 }
diff --git a/tests/compiler/dart2js/least_upper_bound_test.dart b/tests/compiler/dart2js/least_upper_bound_test.dart
index f263f3b..3be823a 100644
--- a/tests/compiler/dart2js/least_upper_bound_test.dart
+++ b/tests/compiler/dart2js/least_upper_bound_test.dart
@@ -7,10 +7,10 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart'
+import 'package:compiler/implementation/util/util.dart'
        show Link;
 
 void main() {
diff --git a/tests/compiler/dart2js/licm_test.dart b/tests/compiler/dart2js/licm_test.dart
index 3e1a98a..438d174 100644
--- a/tests/compiler/dart2js/licm_test.dart
+++ b/tests/compiler/dart2js/licm_test.dart
@@ -5,8 +5,7 @@
 // Check that we hoist instructions in a loop condition, even if that
 // condition involves control flow.
 
-import 'package:expect/expect.dart';
-
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = '''
@@ -25,6 +24,6 @@
 ''';
 
 main() {
-  compileAndMatch(TEST, 'main',
-      new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while'));
+  asyncTest(() => compileAndMatch(TEST, 'main',
+      new RegExp('if \\(typeof count !== "number"\\)(.|\\n)*while')));
 }
diff --git a/tests/compiler/dart2js/link_test.dart b/tests/compiler/dart2js/link_test.dart
index 55d6ae3..681c5ef 100644
--- a/tests/compiler/dart2js/link_test.dart
+++ b/tests/compiler/dart2js/link_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util_implementation.dart';
+import 'package:compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/util/util_implementation.dart';
 
 main() {
   test(const Link<Comparable>().prepend('three').prepend(2).prepend('one'),
diff --git a/tests/compiler/dart2js/list_tracer2_test.dart b/tests/compiler/dart2js/list_tracer2_test.dart
index 4f2d7b2..f92525f 100644
--- a/tests/compiler/dart2js/list_tracer2_test.dart
+++ b/tests/compiler/dart2js/list_tracer2_test.dart
@@ -7,8 +7,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/list_tracer3_test.dart b/tests/compiler/dart2js/list_tracer3_test.dart
index 4cf3a8f..9c188b3 100644
--- a/tests/compiler/dart2js/list_tracer3_test.dart
+++ b/tests/compiler/dart2js/list_tracer3_test.dart
@@ -7,8 +7,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/list_tracer_test.dart b/tests/compiler/dart2js/list_tracer_test.dart
index 9a3bfda..198f7e4 100644
--- a/tests/compiler/dart2js/list_tracer_test.dart
+++ b/tests/compiler/dart2js/list_tracer_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/literal_list_test.dart b/tests/compiler/dart2js/literal_list_test.dart
index efb146d..7544f90 100644
--- a/tests/compiler/dart2js/literal_list_test.dart
+++ b/tests/compiler/dart2js/literal_list_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,8 +16,9 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains('print([1, 2]);'));
-  Expect.isTrue(generated.contains('print([3]);'));
-  Expect.isTrue(generated.contains('print([4, 5]);'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isTrue(generated.contains('print([1, 2]);'));
+    Expect.isTrue(generated.contains('print([3]);'));
+    Expect.isTrue(generated.contains('print([4, 5]);'));
+  }));
 }
diff --git a/tests/compiler/dart2js/literal_map_test.dart b/tests/compiler/dart2js/literal_map_test.dart
index 1b51336..b2862ea 100644
--- a/tests/compiler/dart2js/literal_map_test.dart
+++ b/tests/compiler/dart2js/literal_map_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import "compiler_helper.dart";
+import 'package:async_helper/async_helper.dart';
+import 'compiler_helper.dart';
 
 const String TEST = """
 foo() {
@@ -14,12 +15,13 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  // Make sure we have all the type information we need.
-  Expect.isFalse(generated.contains('bailout'));
-  Expect.isFalse(generated.contains('interceptor'));
-  // Make sure we don't go through an interceptor.
-  Expect.isTrue(
-      generated.contains(r'a.$indexSet(a') ||
-      generated.contains(r'.$indexSet(0'));
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    // Make sure we have all the type information we need.
+    Expect.isFalse(generated.contains('bailout'));
+    Expect.isFalse(generated.contains('interceptor'));
+    // Make sure we don't go through an interceptor.
+    Expect.isTrue(
+        generated.contains(r'a.$indexSet(a') ||
+        generated.contains(r'.$indexSet(0'));
+  }));
 }
diff --git a/tests/compiler/dart2js/logical_expression_test.dart b/tests/compiler/dart2js/logical_expression_test.dart
index 75d69e9..5e9056a 100644
--- a/tests/compiler/dart2js/logical_expression_test.dart
+++ b/tests/compiler/dart2js/logical_expression_test.dart
@@ -4,7 +4,8 @@
 
 // Test that logical or-expressions don't introduce unnecessary nots.
 
-import "package:async_helper/async_helper.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -24,24 +25,26 @@
 """;
 
 main() {
-  // We want something like:
-  //     var t1 = bar.call$0() === true;
-  //     if (t1 || gee.call$0() === true) gee.call$0();
-  //     if (t1 || gee.call$0() === true) gee.call$0();
-  compileAndDoNotMatchFuzzy(TEST_ONE, 'foo',
-                       r"""var x = [a-zA-Z0-9$.]+\(\) == true;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
+  asyncTest(() => Future.wait([
+    // We want something like:
+    //     var t1 = bar.call$0() === true;
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    //     if (t1 || gee.call$0() === true) gee.call$0();
+    compileAndDoNotMatchFuzzy(TEST_ONE, 'foo',
+        r"""var x = [a-zA-Z0-9$.]+\(\) == true;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
 
 
-  // We want something like:
-  //     var t1 = list == null;
-  //     if (t1) bar.call$0();
-  //     if (t1 || bar.call$0() === true) bar.call$0();
-  //     if (t1 || bar.call$0() === true) bar.call$0();
-  compileAndMatchFuzzy(TEST_TWO, 'foo',
-                       r"""var x = x == null;
-                           if \(x\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
-                           if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;""");
+    // We want something like:
+    //     var t1 = list == null;
+    //     if (t1) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    //     if (t1 || bar.call$0() === true) bar.call$0();
+    compileAndMatchFuzzy(TEST_TWO, 'foo',
+        r"""var x = x == null;
+            if \(x\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;
+            if \(x \|\| [a-zA-Z0-9$.]+\(\) === true\) [^;]+;"""),
+  ]));
 }
diff --git a/tests/compiler/dart2js/lookup_member_test.dart b/tests/compiler/dart2js/lookup_member_test.dart
index bc8bf85..2b3ed47 100644
--- a/tests/compiler/dart2js/lookup_member_test.dart
+++ b/tests/compiler/dart2js/lookup_member_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement, MemberSignature, PublicName;
 
 void main() {
diff --git a/tests/compiler/dart2js/loop_test.dart b/tests/compiler/dart2js/loop_test.dart
index 9be7195..fbb092a 100644
--- a/tests/compiler/dart2js/loop_test.dart
+++ b/tests/compiler/dart2js/loop_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -52,12 +54,18 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'for ('));
-  generated = compile(TEST_TWO, entry: 'foo');
-  Expect.isTrue(!generated.contains(r'break'));
-  generated = compile(TEST_THREE, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
-  generated = compile(TEST_FOUR, entry: 'foo');
-  Expect.isTrue(generated.contains(r'continue'));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'for ('));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(!generated.contains(r'break'));
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+    compile(TEST_FOUR, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r'continue'));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/map_tracer_keys_test.dart b/tests/compiler/dart2js/map_tracer_keys_test.dart
index cec1c29..89904e2 100644
--- a/tests/compiler/dart2js/map_tracer_keys_test.dart
+++ b/tests/compiler/dart2js/map_tracer_keys_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show ContainerTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/map_tracer_test.dart b/tests/compiler/dart2js/map_tracer_test.dart
index a3f10a1..cf0ae97 100644
--- a/tests/compiler/dart2js/map_tracer_test.dart
+++ b/tests/compiler/dart2js/map_tracer_test.dart
@@ -4,8 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show MapTypeMask, TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/members_test.dart b/tests/compiler/dart2js/members_test.dart
index 6b1679c..d650fdd 100644
--- a/tests/compiler/dart2js/members_test.dart
+++ b/tests/compiler/dart2js/members_test.dart
@@ -7,11 +7,11 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement, MemberSignature, Name, PublicName,
             DeclaredMember, Member;
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
+import "package:compiler/implementation/resolution/class_members.dart"
   show DeclaredMember, ErroneousMember, SyntheticMember;
 
 void main() {
@@ -19,6 +19,7 @@
   testInterfaceMembers();
   testClassVsInterfaceMembers();
   testMixinMembers();
+  testMixinMembersWithoutImplements();
 }
 
 MemberSignature getMember(InterfaceType cls, String name,
@@ -680,4 +681,29 @@
     checkMember(C_this, 'method4', checkType: ALSO_CLASS_MEMBER,
                 inheritedFrom: A_U);
   }));
+}
+
+void testMixinMembersWithoutImplements() {
+  asyncTest(() => TypeEnvironment.create(r"""
+    abstract class A {
+      m();
+    }
+    abstract class B implements A {
+    }
+    abstract class C extends Object with B {}
+    """).then((env) {
+
+    DynamicType dynamic_ = env['dynamic'];
+    VoidType void_ = env['void'];
+    InterfaceType num_ = env['num'];
+    InterfaceType int_ = env['int'];
+
+    InterfaceType A = env['A'];
+    InterfaceType B = env['B'];
+    InterfaceType C = env['C'];
+
+    checkMember(C, 'm', checkType: NO_CLASS_MEMBER,
+                inheritedFrom: A,
+                functionType: env.functionType(dynamic_ , []));
+  }));
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/memory_compiler.dart b/tests/compiler/dart2js/memory_compiler.dart
index 5d0431c..938ac9e 100644
--- a/tests/compiler/dart2js/memory_compiler.dart
+++ b/tests/compiler/dart2js/memory_compiler.dart
@@ -6,16 +6,16 @@
 
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic, DiagnosticHandler, CompilerOutputProvider;
 
 import 'dart:async';
 
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
 
 class DiagnosticMessage {
   final Uri uri;
@@ -127,7 +127,7 @@
   Uri libraryRoot = Uri.base.resolve('sdk/');
   Uri script = Uri.base.resolveUri(Platform.script);
   if (packageRoot == null) {
-    packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
+    packageRoot = Uri.base.resolveUri(new Uri.file('${Platform.packageRoot}/'));
   }
 
   MemorySourceFileProvider provider;
@@ -166,12 +166,27 @@
   if (cachedCompiler != null) {
     compiler.coreLibrary = cachedCompiler.libraries['dart:core'];
     compiler.types = cachedCompiler.types.copy(compiler);
+    Map copiedLibraries = {};
     cachedCompiler.libraries.forEach((String uri, library) {
       if (library.isPlatformLibrary) {
+        compiler.onLibraryCreated(library);
         compiler.libraries[uri] = library;
-        compiler.onLibraryLoaded(library, library.canonicalUri);
+        // TODO(johnniwinther): Assert that no libraries are created lazily from
+        // this call.
+        compiler.onLibraryScanned(library, null);
+        if (library.isPatched) {
+          var patchLibrary = library.patch;
+          compiler.onLibraryCreated(patchLibrary);
+          // TODO(johnniwinther): Assert that no libraries are created lazily
+          // from this call.
+          compiler.onLibraryScanned(patchLibrary, null);
+        }
+        copiedLibraries[library.canonicalUri] = library;
       }
     });
+    // TODO(johnniwinther): Assert that no libraries are loaded lazily from
+    // this call.
+    compiler.onLibrariesLoaded(copiedLibraries);
 
     compiler.symbolConstructor = cachedCompiler.symbolConstructor;
     compiler.mirrorSystemClass = cachedCompiler.mirrorSystemClass;
@@ -185,12 +200,11 @@
     compiler.mirrorsUsedConstructor = cachedCompiler.mirrorsUsedConstructor;
     compiler.deferredLibraryClass = cachedCompiler.deferredLibraryClass;
 
-    Map cachedTreeElements =
+    Iterable cachedTreeElements =
         cachedCompiler.enqueuer.resolution.resolvedElements;
-    cachedTreeElements.forEach((element, treeElements) {
+    cachedTreeElements.forEach((element) {
       if (element.library.isPlatformLibrary) {
-        compiler.enqueuer.resolution.resolvedElements[element] =
-            treeElements;
+        compiler.enqueuer.resolution.registerResolvedElement(element);
       }
     });
 
@@ -224,7 +238,8 @@
                                       List<String> options: const [],
                                       bool showDiagnostics: true}) {
   Uri libraryRoot = Uri.base.resolve('sdk/');
-  Uri packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
+  Uri packageRoot = Uri.base.resolveUri(
+      new Uri.file('${Platform.packageRoot}/'));
   Uri script = Uri.base.resolveUri(Platform.script);
 
   var provider = new MemorySourceFileProvider(memorySourceFiles);
diff --git a/tests/compiler/dart2js/memory_source_file_helper.dart b/tests/compiler/dart2js/memory_source_file_helper.dart
index db8010d..09d2d86 100644
--- a/tests/compiler/dart2js/memory_source_file_helper.dart
+++ b/tests/compiler/dart2js/memory_source_file_helper.dart
@@ -7,19 +7,19 @@
 import 'dart:async' show Future;
 export 'dart:io' show Platform;
 
-export '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart'
+export 'package:compiler/implementation/apiimpl.dart'
        show Compiler;
 
-export '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
+export 'package:compiler/implementation/filenames.dart'
        show currentDirectory;
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart'
+import 'package:compiler/implementation/source_file.dart'
        show StringSourceFile;
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+import 'package:compiler/implementation/source_file_provider.dart'
        show SourceFileProvider;
 
-export '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart'
+export 'package:compiler/implementation/source_file_provider.dart'
        show SourceFileProvider, FormattingDiagnosticHandler;
 
 class MemorySourceFileProvider extends SourceFileProvider {
diff --git a/tests/compiler/dart2js/message_kind_helper.dart b/tests/compiler/dart2js/message_kind_helper.dart
index 5a16e56..81b6824 100644
--- a/tests/compiler/dart2js/message_kind_helper.dart
+++ b/tests/compiler/dart2js/message_kind_helper.dart
@@ -7,7 +7,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     Compiler,
     MessageKind;
 
diff --git a/tests/compiler/dart2js/message_kind_test.dart b/tests/compiler/dart2js/message_kind_test.dart
index b3cca95..6482f53 100644
--- a/tests/compiler/dart2js/message_kind_test.dart
+++ b/tests/compiler/dart2js/message_kind_test.dart
@@ -5,7 +5,7 @@
 import 'package:expect/expect.dart';
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     DualKind,
     MessageKind;
 
diff --git a/tests/compiler/dart2js/metadata_test.dart b/tests/compiler/dart2js/metadata_test.dart
index 1c7f596..a5f648b 100644
--- a/tests/compiler/dart2js/metadata_test.dart
+++ b/tests/compiler/dart2js/metadata_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show PrimitiveConstant;
 
 void checkPosition(Spannable spannable, Node node, String source, compiler) {
diff --git a/tests/compiler/dart2js/minify_many_locals_test.dart b/tests/compiler/dart2js/minify_many_locals_test.dart
index 1d62fa4..b1379ae 100644
--- a/tests/compiler/dart2js/minify_many_locals_test.dart
+++ b/tests/compiler/dart2js/minify_many_locals_test.dart
@@ -3,12 +3,13 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 main() {
   var buffer = new StringBuffer();
-  buffer.write("var foo(");
+  buffer.write("foo(");
   for (int i = 0; i < 2000; i++) {
     buffer.write("x$i, ");
   }
@@ -17,25 +18,29 @@
     buffer.write("x$i+");
   }
   buffer.write("2000; return i; }");
-  var generated = compile(buffer.toString(), entry: 'foo', minify: true);
-  RegExp re = new RegExp(r"\(a,b,c");
-  Expect.isTrue(re.hasMatch(generated));
+  String code = buffer.toString();
 
-  re = new RegExp(r"x,y,z,a0,a1,a2");
-  Expect.isTrue(re.hasMatch(generated));
+  asyncTest(() => compile(code, entry: 'foo', minify: true)
+      .then((String generated) {
+    RegExp re = new RegExp(r"\(a,b,c");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"x,y,z,a0,a1,a2");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"g8,g9,h0,h1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"y,z,a0,a1,a2,a3,a4,a5,a6");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"z8,z9,aa0,aa1,aa2");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"g8,g9,h0,h1");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"aa9,ab0,ab1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"z8,z9,aa0,aa1,aa2");
+    Expect.isTrue(re.hasMatch(generated));
 
-  re = new RegExp(r"az9,ba0,ba1");
-  Expect.isTrue(re.hasMatch(generated));
+    re = new RegExp(r"aa9,ab0,ab1");
+    Expect.isTrue(re.hasMatch(generated));
+
+    re = new RegExp(r"az9,ba0,ba1");
+    Expect.isTrue(re.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/mirror_helper_rename_test.dart b/tests/compiler/dart2js/mirror_helper_rename_test.dart
index 10a1e22..13cfc98 100644
--- a/tests/compiler/dart2js/mirror_helper_rename_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_rename_test.dart
@@ -6,16 +6,12 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
     Node;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart';
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart';
+import 'package:compiler/implementation/dart_backend/dart_backend.dart';
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart';
 
 main() {
   testWithMirrorHelperLibrary(minify: true);
diff --git a/tests/compiler/dart2js/mirror_helper_test.dart b/tests/compiler/dart2js/mirror_helper_test.dart
index 1f3b7ae..80888b8 100644
--- a/tests/compiler/dart2js/mirror_helper_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_test.dart
@@ -6,26 +6,17 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show
+import 'package:compiler/implementation/elements/elements.dart' show
     Element, LibraryElement, ClassElement;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
     Block, ExpressionStatement, FunctionExpression, Node, Send;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
-show
+import 'package:compiler/implementation/dart_backend/dart_backend.dart' show
     DartBackend, ElementAst;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
-show
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart' show
     MirrorRenamer;
 
-
 main() {
   testWithMirrorRenaming(minify: true);
   testWithMirrorRenaming(minify: false);
diff --git a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
index 13d9194..9d1c314 100644
--- a/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
+++ b/tests/compiler/dart2js/mirror_helper_unique_minification_test.dart
@@ -6,18 +6,13 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart' show compilerFor;
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/dart_backend/dart_backend.dart'
-show
+import 'package:compiler/implementation/dart_backend/dart_backend.dart' show
     DartBackend;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart'
-show Identifier, Node, Send;
-import
-    '../../../sdk/lib/_internal/compiler/implementation/mirror_renamer/mirror_renamer.dart'
-show
+import 'package:compiler/implementation/tree/tree.dart' show
+    Identifier, Node, Send;
+import 'package:compiler/implementation/mirror_renamer/mirror_renamer.dart' show
     MirrorRenamer;
 
 main() {
diff --git a/tests/compiler/dart2js/mirror_system_helper.dart b/tests/compiler/dart2js/mirror_system_helper.dart
index 3faf23d..c592214 100644
--- a/tests/compiler/dart2js/mirror_system_helper.dart
+++ b/tests/compiler/dart2js/mirror_system_helper.dart
@@ -5,19 +5,19 @@
 library mirror_system_helper;
 
 import 'dart:async';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/dart2js_mirrors.dart';
 import 'mock_compiler.dart';
 
-export '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-export '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+export 'package:compiler/implementation/mirrors/source_mirrors.dart';
+export 'package:compiler/implementation/mirrors/mirrors_util.dart';
 
 const String SOURCE = 'source';
 final Uri SOURCE_URI = new Uri(scheme: SOURCE, path: SOURCE);
 
 // TODO(johnniwinther): Move this to a mirrors helper library.
 Future<MirrorSystem> createMirrorSystem(String source) {
-  MockCompiler compiler = new MockCompiler(
+  MockCompiler compiler = new MockCompiler.internal(
       analyzeOnly: true,
       analyzeAll: true,
       preserveComments: true);
diff --git a/tests/compiler/dart2js/mirror_tree_shaking_test.dart b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
index 68bc816..ddbcd77 100644
--- a/tests/compiler/dart2js/mirror_tree_shaking_test.dart
+++ b/tests/compiler/dart2js/mirror_tree_shaking_test.dart
@@ -8,14 +8,14 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 import 'dart:async';
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        show JavaScriptBackend;
 
 main() {
diff --git a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
index 53c9ceb..83529ca 100644
--- a/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_reader_test.dart
@@ -12,9 +12,9 @@
 
 import "mirrors_test_helper.dart";
 import "../../../lib/mirrors/mirrors_reader.dart";
-import "../../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
-import "../../../../sdk/lib/_internal/compiler/implementation/mirrors/dart2js_mirrors.dart";
-import "../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart";
+import "package:compiler/implementation/util/util.dart";
+import "package:compiler/implementation/mirrors/dart2js_mirrors.dart";
+import "package:compiler/implementation/mirrors/source_mirrors.dart";
 
 class SourceMirrorsReader extends MirrorsReader {
   final Dart2JsMirrorSystem mirrorSystem;
diff --git a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
index b6a954a..61766cc 100644
--- a/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
+++ b/tests/compiler/dart2js/mirrors/mirrors_test_helper.dart
@@ -5,9 +5,9 @@
 import 'dart:io';
 import 'dart:async';
 
-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart' as source_mirrors;
-import '../../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart' as source_mirrors;
+import 'package:compiler/implementation/source_file_provider.dart';
 
 TypeMirror createInstantiation(TypeSourceMirror type,
                                List<TypeMirror> typeArguments) {
@@ -24,7 +24,8 @@
 Future<MirrorSystem> analyzeUri(Uri testUri) {
   Uri repository = Platform.script.resolve('../../../../');
   Uri libraryRoot = repository.resolve('sdk/');
-  Uri packageRoot = Uri.base.resolve('${Platform.packageRoot}/');
+  Uri packageRoot = Uri.base.resolveUri(
+      new Uri.file('${Platform.packageRoot}/'));
   var provider = new CompilerSourceFileProvider();
   var handler = new FormattingDiagnosticHandler(provider);
   return source_mirrors.analyze(
diff --git a/tests/compiler/dart2js/mirrors_exports_test.dart b/tests/compiler/dart2js/mirrors_exports_test.dart
index 51da7c1..0ab74cc 100644
--- a/tests/compiler/dart2js/mirrors_exports_test.dart
+++ b/tests/compiler/dart2js/mirrors_exports_test.dart
@@ -6,7 +6,7 @@
 import 'package:async_helper/async_helper.dart';
 import 'dart:async';
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
 
 const SOURCE_FILES = const {
 'main.dart': '''
diff --git a/tests/compiler/dart2js/mirrors_lookup_test.dart b/tests/compiler/dart2js/mirrors_lookup_test.dart
index 4ef9b70..42b44ad 100644
--- a/tests/compiler/dart2js/mirrors_lookup_test.dart
+++ b/tests/compiler/dart2js/mirrors_lookup_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
 
 const Map MEMORY_SOURCE_FILES = const {
   'main.dart': r"""
diff --git a/tests/compiler/dart2js/mirrors_metadata_test.dart b/tests/compiler/dart2js/mirrors_metadata_test.dart
index c430997..4097da7 100644
--- a/tests/compiler/dart2js/mirrors_metadata_test.dart
+++ b/tests/compiler/dart2js/mirrors_metadata_test.dart
@@ -7,12 +7,12 @@
 import 'dart:async';
 import 'mirror_system_helper.dart';
 
-void validateDeclarationComment(String code,
+Future validateDeclarationComment(String code,
                                 String text,
                                 String trimmedText,
                                 bool isDocComment,
                                 List<Symbol> declarationNames) {
-  asyncTest(() => createMirrorSystem(code).then((mirrors) {
+  return createMirrorSystem(code).then((mirrors) {
     LibraryMirror library = mirrors.libraries[SOURCE_URI];
     Expect.isNotNull(library);
     for (Symbol declarationName in declarationNames) {
@@ -27,42 +27,60 @@
       Expect.equals(trimmedText, commentMetadata.trimmedText);
       Expect.equals(isDocComment, commentMetadata.isDocComment);
     }
-  }));
+  });
 }
 
-void testDeclarationComment(String declaration, List<Symbol> declarationNames) {
-  String text = 'Single line comment';
-  String comment = '// $text';
-  String code = '$comment\n$declaration';
-  validateDeclarationComment(code, comment, text, false, declarationNames);
-
-  comment = '/// $text';
-  code = '$comment\n$declaration';
-  validateDeclarationComment(code, comment, text, true, declarationNames);
-
-  text = 'Multiline comment';
-  comment = '/* $text*/';
-  code = '$comment$declaration';
-  validateDeclarationComment(code, comment, text, false, declarationNames);
-
-  comment = '/** $text*/';
-  code = '$comment$declaration';
-  validateDeclarationComment(code, comment, text, true, declarationNames);
+Future testDeclarationComment(String declaration,
+                              List<Symbol> declarationNames) {
+  return Future.forEach([
+    () {
+      String text = 'Single line comment';
+      String comment = '// $text';
+      String code = '$comment\n$declaration';
+      return validateDeclarationComment(
+          code, comment, text, false, declarationNames);
+    },
+    () {
+      String text = 'Single line comment';
+      String comment = '/// $text';
+      String code = '$comment\n$declaration';
+      return validateDeclarationComment(
+          code, comment, text, true, declarationNames);
+    },
+    () {
+      String text = 'Multiline comment';
+      String comment = '/* $text*/';
+      String code = '$comment$declaration';
+      return validateDeclarationComment(
+          code, comment, text, false, declarationNames);
+    },
+    () {
+      String text = 'Multiline comment';
+      String comment = '/** $text*/';
+      String code = '$comment$declaration';
+      return validateDeclarationComment(
+          code, comment, text, true, declarationNames);
+    },
+  ], (f) => f());
 }
 
 void main() {
-  testDeclarationComment('var field;', [#field]);
-  testDeclarationComment('int field;', [#field]);
-  testDeclarationComment('int field = 0;', [#field]);
-  testDeclarationComment('int field1, field2;', [#field1, #field2]);
-  testDeclarationComment('final field = 0;', [#field]);
-  testDeclarationComment('final int field = 0;', [#field]);
-  testDeclarationComment('final field1 = 0, field2 = 0;', [#field1, #field2]);
-  testDeclarationComment('final int field1 = 0, field2 = 0;',
-                         [#field1, #field2]);
-  testDeclarationComment('const field = 0;', [#field]);
-  testDeclarationComment('const int field = 0;', [#field]);
-  testDeclarationComment('const field1 = 0, field2 = 0;', [#field1, #field2]);
-  testDeclarationComment('const int field1 = 0, field2 = 0;',
-                         [#field1, #field2]);
+  asyncTest(() => Future.forEach([
+    () => testDeclarationComment('var field;', [#field]),
+    () => testDeclarationComment('int field;', [#field]),
+    () => testDeclarationComment('int field = 0;', [#field]),
+    () => testDeclarationComment('int field1, field2;', [#field1, #field2]),
+    () => testDeclarationComment('final field = 0;', [#field]),
+    () => testDeclarationComment('final int field = 0;', [#field]),
+    () => testDeclarationComment('final field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('final int field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('const field = 0;', [#field]),
+    () => testDeclarationComment('const int field = 0;', [#field]),
+    () => testDeclarationComment('const field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+    () => testDeclarationComment('const int field1 = 0, field2 = 0;',
+                                 [#field1, #field2]),
+  ], (f) => f()));
 }
diff --git a/tests/compiler/dart2js/mirrors_test.dart b/tests/compiler/dart2js/mirrors_test.dart
index 0f618b4..6e3a6db 100644
--- a/tests/compiler/dart2js/mirrors_test.dart
+++ b/tests/compiler/dart2js/mirrors_test.dart
@@ -4,12 +4,12 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/source_mirrors.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart'
+import 'package:compiler/implementation/mirrors/source_mirrors.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/filenames.dart'
        show currentDirectory;
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
 
 import 'dart:io';
 
diff --git a/tests/compiler/dart2js/mirrors_used_test.dart b/tests/compiler/dart2js/mirrors_used_test.dart
index 4f78840..ad5d5bb 100644
--- a/tests/compiler/dart2js/mirrors_used_test.dart
+++ b/tests/compiler/dart2js/mirrors_used_test.dart
@@ -12,18 +12,19 @@
 import 'memory_compiler.dart' show
     compilerFor;
 
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart' show
+import 'package:compiler/implementation/apiimpl.dart' show
     Compiler;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart' show
+import 'package:compiler/implementation/dart2jslib.dart' show
     Constant,
     TypeConstant;
 
-import
-    '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
-show Element, Elements;
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
-    show JavaScriptBackend;
+import 'package:compiler/implementation/elements/elements.dart' show
+    Element,
+    Elements;
+
+import 'package:compiler/implementation/js_backend/js_backend.dart' show
+    JavaScriptBackend;
 
 void expectOnlyVerboseInfo(Uri uri, int begin, int end, String message, kind) {
   if (kind.name == 'verbose info') {
diff --git a/tests/compiler/dart2js/missing_file_test.dart b/tests/compiler/dart2js/missing_file_test.dart
index 323ab25..6a335a6 100644
--- a/tests/compiler/dart2js/missing_file_test.dart
+++ b/tests/compiler/dart2js/missing_file_test.dart
@@ -10,10 +10,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show DiagnosticHandler, Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/mixin_typevariable_test.dart b/tests/compiler/dart2js/mixin_typevariable_test.dart
index 9e9f8fb..47bca49 100644
--- a/tests/compiler/dart2js/mixin_typevariable_test.dart
+++ b/tests/compiler/dart2js/mixin_typevariable_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/mock_compiler.dart b/tests/compiler/dart2js/mock_compiler.dart
index af82c4a..4345d13 100644
--- a/tests/compiler/dart2js/mock_compiler.dart
+++ b/tests/compiler/dart2js/mock_compiler.dart
@@ -8,24 +8,24 @@
 import 'dart:async';
 import 'dart:collection';
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart' as api;
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
+import 'package:compiler/compiler.dart' as api;
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/resolution/resolution.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/util/util.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
     show ElementX,
          LibraryElementX,
          ErroneousElementX,
          FunctionElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     hide TreeElementMapping;
 
-import '../../../sdk/lib/_internal/compiler/implementation/deferred_load.dart'
+import 'package:compiler/implementation/deferred_load.dart'
     show DeferredLoadTask,
          OutputUnit;
 
@@ -38,6 +38,7 @@
 }
 
 const String DEFAULT_HELPERLIB = r'''
+  const patch = 0;
   wrapException(x) { return x; }
   iae(x) { throw x; } ioore(x) { throw x; }
   guard$array(x) { return x; }
@@ -59,12 +60,6 @@
     var receiver;
   }
   class Closure implements Function {}
-  class Null {}
-  class Dynamic_ {}
-  class LinkedHashMap {
-    factory LinkedHashMap._empty() => null;
-    factory LinkedHashMap._literal(elements) => null;
-  }
   class ConstantMap {}
   class ConstantStringMap {}
   class TypeImpl {}
@@ -218,6 +213,7 @@
     String toString() { return null; }
     noSuchMethod(im) { throw im; }
   }
+  class Null {}
   abstract class StackTrace {}
   class Type {}
   class Function {}
@@ -234,6 +230,10 @@
     E singleWhere(f) => null;
   }
   abstract class Map<K,V> {}
+  class LinkedHashMap {
+    factory LinkedHashMap._empty() => null;
+    factory LinkedHashMap._literal(elements) => null;
+  }
   class DateTime {
     DateTime(year);
     DateTime.utc(year);
@@ -242,12 +242,26 @@
   bool identical(Object a, Object b) { return true; }
   const proxy = 0;''';
 
+final Uri PATCH_CORE = new Uri(scheme: 'patch', path: 'core');
+
+const String PATCH_CORE_SOURCE = r'''
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';
+''';
+
 const String DEFAULT_ISOLATE_HELPERLIB = r'''
   var startRootIsolate;
   var _currentIsolate;
   var _callInIsolate;
   class _WorkerBase {}''';
 
+const String DEFAULT_MIRRORS = r'''
+class Comment {}
+class MirrorSystem {}
+class MirrorsUsed {}
+''';
+
 class MockCompiler extends Compiler {
   api.DiagnosticHandler diagnosticHandler;
   List<WarningMessage> warnings;
@@ -263,24 +277,23 @@
   final Map<String, SourceFile> sourceFiles;
   Node parsedTree;
 
-  MockCompiler({String coreSource: DEFAULT_CORELIB,
-                String helperSource: DEFAULT_HELPERLIB,
-                String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
-                String isolateHelperSource: DEFAULT_ISOLATE_HELPERLIB,
-                bool enableTypeAssertions: false,
-                bool enableMinification: false,
-                bool enableConcreteTypeInference: false,
-                int maxConcreteTypeSize: 5,
-                bool disableTypeInference: false,
-                bool analyzeAll: false,
-                bool analyzeOnly: false,
-                bool emitJavaScript: true,
-                bool preserveComments: false,
-                // Our unit tests check code generation output that is
-                // affected by inlining support.
-                bool disableInlining: true,
-                int this.expectedWarnings,
-                int this.expectedErrors})
+  MockCompiler.internal(
+      {String coreSource: DEFAULT_CORELIB,
+       String interceptorsSource: DEFAULT_INTERCEPTORSLIB,
+       bool enableTypeAssertions: false,
+       bool enableMinification: false,
+       bool enableConcreteTypeInference: false,
+       int maxConcreteTypeSize: 5,
+       bool disableTypeInference: false,
+       bool analyzeAll: false,
+       bool analyzeOnly: false,
+       bool emitJavaScript: true,
+       bool preserveComments: false,
+       // Our unit tests check code generation output that is
+       // affected by inlining support.
+       bool disableInlining: true,
+       int this.expectedWarnings,
+       int this.expectedErrors})
       : sourceFiles = new Map<String, SourceFile>(),
         super(enableTypeAssertions: enableTypeAssertions,
               enableMinification: enableMinification,
@@ -292,41 +305,41 @@
               emitJavaScript: emitJavaScript,
               preserveComments: preserveComments,
               showPackageWarnings: true) {
-    clearMessages();
-    coreLibrary = createLibrary("core", coreSource);
-
-    // We need to set the assert method to avoid calls with a 'null'
-    // target being interpreted as a call to assert.
-    jsHelperLibrary = createLibrary("helper", helperSource);
-    foreignLibrary = createLibrary("foreign", FOREIGN_LIBRARY);
-    interceptorsLibrary = createLibrary("interceptors", interceptorsSource);
-    isolateHelperLibrary = createLibrary("isolate_helper", isolateHelperSource);
-
-    // Set up the library imports.
-    importHelperLibrary(coreLibrary);
-    libraryLoader.importLibrary(jsHelperLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(foreignLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(interceptorsLibrary, coreLibrary, null);
-    libraryLoader.importLibrary(isolateHelperLibrary, coreLibrary, null);
-
-    assertMethod = jsHelperLibrary.find('assertHelper');
-    identicalFunction = coreLibrary.find('identical');
-
-    mainApp = mockLibrary(this, "");
-    initializeSpecialClasses();
-    // We need to make sure the Object class is resolved. When registering a
-    // dynamic invocation the ArgumentTypesRegistry eventually iterates over
-    // the interfaces of the Object class which would be 'null' if the class
-    // wasn't resolved.
-    objectClass.ensureResolved(this);
-
     this.disableInlining = disableInlining;
 
     deferredLoadTask = new MockDeferredLoadTask(this);
+
+    clearMessages();
+
+    registerSource(Compiler.DART_CORE, coreSource);
+    registerSource(PATCH_CORE, PATCH_CORE_SOURCE);
+
+    registerSource(Compiler.DART_JS_HELPER, DEFAULT_HELPERLIB);
+    registerSource(Compiler.DART_FOREIGN_HELPER, FOREIGN_LIBRARY);
+    registerSource(Compiler.DART_INTERCEPTORS, interceptorsSource);
+    registerSource(Compiler.DART_ISOLATE_HELPER, DEFAULT_ISOLATE_HELPERLIB);
+    registerSource(Compiler.DART_MIRRORS, DEFAULT_MIRRORS);
+  }
+
+  /// Initialize the mock compiler with an empty main library.
+  Future init([String mainSource = ""]) {
+    Uri uri = new Uri(scheme: "mock");
+    registerSource(uri, mainSource);
+    return libraryLoader.loadLibrary(uri)
+        .then((LibraryElement library) {
+      mainApp = library;
+      // We need to make sure the Object class is resolved. When registering a
+      // dynamic invocation the ArgumentTypesRegistry eventually iterates over
+      // the interfaces of the Object class which would be 'null' if the class
+      // wasn't resolved.
+      objectClass.ensureResolved(this);
+    });
   }
 
   Future runCompiler(Uri uri) {
-    return super.runCompiler(uri).then((result) {
+    return init().then((_) {
+      return super.runCompiler(uri);
+    }).then((result) {
       if (expectedErrors != null &&
           expectedErrors != errors.length) {
         throw "unexpected error during compilation ${errors}";
@@ -347,22 +360,6 @@
     sourceFiles[uri.toString()] = new MockFile(source);
   }
 
-  /**
-   * Used internally to create a library from a source text. The created library
-   * is fixed to export its top-level declarations.
-   */
-  LibraryElement createLibrary(String name, String source) {
-    Uri uri = new Uri(scheme: "dart", path: name);
-    var script = new Script(uri, uri, new MockFile(source));
-    var library = new LibraryElementX(script);
-    library.libraryTag = new LibraryName(null, null, null);
-    parseScript(source, library);
-    library.setExports(library.localScope.values.toList());
-    registerSource(uri, source);
-    libraries.putIfAbsent(uri.toString(), () => library);
-    return library;
-  }
-
   // TODO(johnniwinther): Remove this when we don't filter certain type checker
   // warnings.
   void reportWarning(Spannable node, MessageKind messageKind,
@@ -460,7 +457,12 @@
                            Uri resolvedUri, Node node) => resolvedUri;
 
   // The mock library doesn't need any patches.
-  Uri resolvePatchUri(String dartLibraryName) => null;
+  Uri resolvePatchUri(String dartLibraryName) {
+    if (dartLibraryName == 'core') {
+      return PATCH_CORE;
+    }
+    return null;
+  }
 
   Future<Script> readScript(Spannable node, Uri uri) {
     SourceFile sourceFile = sourceFiles[uri.toString()];
@@ -474,6 +476,12 @@
         ? element
         : new ErroneousElementX(null, null, name, container);
   }
+
+  /// Create a new [MockCompiler] and apply it asynchronously to [f].
+  static Future create(f(MockCompiler compiler)) {
+    MockCompiler compiler = new MockCompiler.internal();
+    return compiler.init().then((_) => f(compiler));
+  }
 }
 
 /// A function the checks [message]. If the check fails or if [message] is
@@ -543,23 +551,6 @@
   }
 }
 
-void importLibrary(LibraryElement target, LibraryElementX imported,
-                   Compiler compiler) {
-  for (var element in imported.localMembers) {
-    compiler.withCurrentElement(element, () {
-      target.addToScope(element, compiler);
-    });
-  }
-}
-
-LibraryElement mockLibrary(Compiler compiler, String source) {
-  Uri uri = new Uri(scheme: "source");
-  var library = new LibraryElementX(new Script(uri, uri, new MockFile(source)));
-  importLibrary(library, compiler.coreLibrary, compiler);
-  library.setExports(<Element>[]);
-  return library;
-}
-
 class CollectingTreeElements extends TreeElementMapping {
   final Map<Node, Element> map = new LinkedHashMap<Node, Element>();
 
diff --git a/tests/compiler/dart2js/null_type_test.dart b/tests/compiler/dart2js/null_type_test.dart
index a413027..c4f7606 100644
--- a/tests/compiler/dart2js/null_type_test.dart
+++ b/tests/compiler/dart2js/null_type_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -13,6 +14,7 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  Expect.isFalse(generated.contains('typeof (void 0)'));
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
+    Expect.isFalse(generated.contains('typeof (void 0)'));
+  }));
 }
diff --git a/tests/compiler/dart2js/override_inheritance_test.dart b/tests/compiler/dart2js/override_inheritance_test.dart
index a114417..2513ef1 100644
--- a/tests/compiler/dart2js/override_inheritance_test.dart
+++ b/tests/compiler/dart2js/override_inheritance_test.dart
@@ -2,660 +2,676 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-
-import "compiler_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/class_members.dart"
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'compiler_helper.dart';
+import 'package:compiler/implementation/resolution/class_members.dart'
     show MembersCreator;
 
 main() {
-  testRequiredParameters();
-  testPositionalParameters();
-  testNamedParameters();
-  testNotSubtype();
-  testGetterNotSubtype();
-  testSetterNotSubtype();
-  testGenericNotSubtype();
-  testFieldNotSubtype();
-  testMixedOverride();
-  testAbstractMethods();
-  testNoSuchMethod();
+  asyncTest(() => Future.wait([
+    testRequiredParameters(),
+    testPositionalParameters(),
+    testNamedParameters(),
+    testNotSubtype(),
+    testGetterNotSubtype(),
+    testSetterNotSubtype(),
+    testGenericNotSubtype(),
+    testFieldNotSubtype(),
+    testMixedOverride(),
+    testAbstractMethods(),
+    testNoSuchMethod(),
+  ]));
 }
 
-check(String source, {errors, warnings, hints, infos}) {
-  MockCompiler compiler = new MockCompiler();
-  compiler.diagnosticHandler = createHandler(compiler, source);
-  compiler.parseScript(source);
-  var cls = compiler.mainApp.find('Class');
-  cls.ensureResolved(compiler);
-  MembersCreator.computeAllClassMembers(compiler, cls);
+Future check(String source, {errors, warnings, hints, infos}) {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.diagnosticHandler = createHandler(compiler, source);
+    compiler.parseScript(source);
+    var cls = compiler.mainApp.find('Class');
+    cls.ensureResolved(compiler);
+    MembersCreator.computeAllClassMembers(compiler, cls);
 
-  toList(o) => o == null ? [] : o is List ? o : [o];
+    toList(o) => o == null ? [] : o is List ? o : [o];
 
-  compareMessageKinds(source, toList(errors), compiler.errors, 'error');
+    compareMessageKinds(source, toList(errors), compiler.errors, 'error');
 
-  compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');
+    compareMessageKinds(source, toList(warnings), compiler.warnings, 'warning');
 
-  if (infos != null) {
-    compareMessageKinds(source, toList(infos), compiler.infos, 'info');
-  }
+    if (infos != null) {
+      compareMessageKinds(source, toList(infos), compiler.infos, 'info');
+    }
 
-  if (hints != null) {
-    compareMessageKinds(source, toList(hints), compiler.hints, 'hint');
-  }
+    if (hints != null) {
+      compareMessageKinds(source, toList(hints), compiler.hints, 'hint');
+    }
+  });
 }
 
-testRequiredParameters() {
-  check("""
-        class A {
-          method() => null; // testRequiredParameters:0
-        }
-        class Class extends A {
-          method() => null; // testRequiredParameters:1
-        }
-        """);
+Future testRequiredParameters() {
+  return Future.wait([
+    check("""
+          class A {
+            method() => null; // testRequiredParameters:0
+          }
+          class Class extends A {
+            method() => null; // testRequiredParameters:1
+          }
+          """),
 
-  check("""
-        class A {
-          method(a) => null; // testRequiredParameters:2
-        }
-        class Class extends A {
-          method(b) => null; // testRequiredParameters:3
-        }
-        """);
+    check("""
+          class A {
+            method(a) => null; // testRequiredParameters:2
+          }
+          class Class extends A {
+            method(b) => null; // testRequiredParameters:3
+          }
+          """),
 
-  check("""
-        class A {
-          method(a, b, c, d) => null; // testRequiredParameters:3
-        }
-        class Class extends A {
-          method(b, a, d, c) => null; // testRequiredParameters:4
-        }
-        """);
+    check("""
+          class A {
+            method(a, b, c, d) => null; // testRequiredParameters:3
+          }
+          class Class extends A {
+            method(b, a, d, c) => null; // testRequiredParameters:4
+          }
+          """),
 
-  check("""
-        class A {
-          method() => null; // testRequiredParameters:5
-        }
-        class Class extends A {
-          method(a) => null; // testRequiredParameters:6
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method() => null; // testRequiredParameters:5
+          }
+          class Class extends A {
+            method(a) => null; // testRequiredParameters:6
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method() => null; // testRequiredParameters:7
-        }
-        class Class implements A {
-          method(a) => null; // testRequiredParameters:8
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method() => null; // testRequiredParameters:7
+          }
+          class Class implements A {
+            method(a) => null; // testRequiredParameters:8
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(a, b, c) => null; // testRequiredParameters:9
-        }
-        class Class extends A {
-          method(a, b, c, d) => null; // testRequiredParameters:10
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(a, b, c) => null; // testRequiredParameters:9
+          }
+          class Class extends A {
+            method(a, b, c, d) => null; // testRequiredParameters:10
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
+  ]);
 }
 
-testPositionalParameters() {
-  check("""
-        class A {
-          method([a]) => null; // testPositionalParameters:1
-        }
-        class Class extends A {
-          method([a]) => null; // testPositionalParameters:2
-        }
-        """);
+Future testPositionalParameters() {
+  return Future.wait([
+    check("""
+          class A {
+            method([a]) => null; // testPositionalParameters:1
+          }
+          class Class extends A {
+            method([a]) => null; // testPositionalParameters:2
+          }
+          """),
 
-  check("""
-        class A {
-          method([a, b]) => null; // testPositionalParameters:3
-        }
-        class Class extends A {
-          method([b, a]) => null; // testPositionalParameters:4
-        }
-        """);
+    check("""
+          class A {
+            method([a, b]) => null; // testPositionalParameters:3
+          }
+          class Class extends A {
+            method([b, a]) => null; // testPositionalParameters:4
+          }
+          """),
 
-  check("""
-        class A {
-          method([a, b, c]) => null; // testPositionalParameters:5
-        }
-        class Class extends A {
-          method([b, d, a, c]) => null; // testPositionalParameters:6
-        }
-        """);
+    check("""
+          class A {
+            method([a, b, c]) => null; // testPositionalParameters:5
+          }
+          class Class extends A {
+            method([b, d, a, c]) => null; // testPositionalParameters:6
+          }
+          """),
 
-  check("""
-        class A {
-          method([a]) => null; // testPositionalParameters:7
-        }
-        class Class extends A {
-          method([a]) => null; // testPositionalParameters:8
-        }
-        """);
+    check("""
+          class A {
+            method([a]) => null; // testPositionalParameters:7
+          }
+          class Class extends A {
+            method([a]) => null; // testPositionalParameters:8
+          }
+          """),
 
-  check("""
-        class A {
-          method(a) => null; // testPositionalParameters:9
-        }
-        class Class extends A {
-          method() => null; // testPositionalParameters:10
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(a) => null; // testPositionalParameters:9
+          }
+          class Class extends A {
+            method() => null; // testPositionalParameters:10
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(a, [b]) => null; // testPositionalParameters:11
-        }
-        class Class extends A {
-          method(a) => null; // testPositionalParameters:12
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(a, [b]) => null; // testPositionalParameters:11
+          }
+          class Class extends A {
+            method(a) => null; // testPositionalParameters:12
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(a, [b]) => null; // testPositionalParameters:13
-        }
-        class Class extends A {
-          method([a]) => null; // testPositionalParameters:14
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(a, [b]) => null; // testPositionalParameters:13
+          }
+          class Class extends A {
+            method([a]) => null; // testPositionalParameters:14
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(a, b, [c, d, e]) => null; // testPositionalParameters:15
-        }
-        class Class extends A {
-          method([a, b, c, d]) => null; // testPositionalParameters:16
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(a, b, [c, d, e]) => null; // testPositionalParameters:15
+          }
+          class Class extends A {
+            method([a, b, c, d]) => null; // testPositionalParameters:16
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
+  ]);
 }
 
-testNamedParameters() {
-  check("""
-        class A {
-          method({a}) => null; // testNamedParameters:1
-        }
-        class Class extends A {
-          method({a}) => null; // testNamedParameters:2
-        }
-        """);
+Future testNamedParameters() {
+  return Future.wait([
+    check("""
+          class A {
+            method({a}) => null; // testNamedParameters:1
+          }
+          class Class extends A {
+            method({a}) => null; // testNamedParameters:2
+          }
+          """),
 
-  check("""
-        class A {
-          method({a, b}) => null; // testNamedParameters:3
-        }
-        class Class extends A {
-          method({b, a}) => null; // testNamedParameters:4
-        }
-        """);
+    check("""
+          class A {
+            method({a, b}) => null; // testNamedParameters:3
+          }
+          class Class extends A {
+            method({b, a}) => null; // testNamedParameters:4
+          }
+          """),
 
-  check("""
-        class A {
-          method({a, b, c}) => null; // testNamedParameters:5
-        }
-        class Class extends A {
-          method({b, c, a, d}) => null; // testNamedParameters:6
-        }
-        """);
+    check("""
+          class A {
+            method({a, b, c}) => null; // testNamedParameters:5
+          }
+          class Class extends A {
+            method({b, c, a, d}) => null; // testNamedParameters:6
+          }
+          """),
 
-  check("""
-        class A {
-          method(d, {a, b, c}) => null; // testNamedParameters:7
-        }
-        class Class extends A {
-          method(e, {b, c, a, d}) => null; // testNamedParameters:8
-        }
-        """);
+    check("""
+          class A {
+            method(d, {a, b, c}) => null; // testNamedParameters:7
+          }
+          class Class extends A {
+            method(e, {b, c, a, d}) => null; // testNamedParameters:8
+          }
+          """),
 
-  check("""
-        class A {
-          method({a}) => null; // testNamedParameters:9
-        }
-        class Class extends A {
-          method() => null; // testNamedParameters:10
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method({a}) => null; // testNamedParameters:9
+          }
+          class Class extends A {
+            method() => null; // testNamedParameters:10
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method({a, b}) => null; // testNamedParameters:11
-        }
-        class Class extends A {
-          method({b}) => null; // testNamedParameters:12
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method({a, b}) => null; // testNamedParameters:11
+          }
+          class Class extends A {
+            method({b}) => null; // testNamedParameters:12
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method({a, b, c, d}) => null; // testNamedParameters:13
-        }
-        class Class extends A {
-          method({a, e, d, c}) => null; // testNamedParameters:14
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method({a, b, c, d}) => null; // testNamedParameters:13
+          }
+          class Class extends A {
+            method({a, e, d, c}) => null; // testNamedParameters:14
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
+  ]);
 }
 
-testNotSubtype() {
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:1
-        }
-        class Class extends A {
-          method(int a) => null; // testNotSubtype:2
-        }
-        """);
+Future testNotSubtype() {
+  return Future.wait([
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:1
+          }
+          class Class extends A {
+            method(int a) => null; // testNotSubtype:2
+          }
+          """),
 
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:3
-        }
-        class Class extends A {
-          method(num a) => null; // testNotSubtype:4
-        }
-        """);
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:3
+          }
+          class Class extends A {
+            method(num a) => null; // testNotSubtype:4
+          }
+          """),
 
-  check("""
-        class A {
-          void method() {} // testNotSubtype:5
-        }
-        class Class extends A {
-          method() => null; // testNotSubtype:6
-        }
-        """);
+    check("""
+          class A {
+            void method() {} // testNotSubtype:5
+          }
+          class Class extends A {
+            method() => null; // testNotSubtype:6
+          }
+          """),
 
-  check("""
-        class A {
-          method() => null; // testNotSubtype:7
-        }
-        class Class extends A {
-          void method() {} // testNotSubtype:8
-        }
-        """);
+    check("""
+          class A {
+            method() => null; // testNotSubtype:7
+          }
+          class Class extends A {
+            void method() {} // testNotSubtype:8
+          }
+          """),
 
-  check("""
-        class A {
-          void method() {} // testNotSubtype:9
-        }
-        class Class extends A {
-          int method() => null; // testNotSubtype:10
-        }
-        """);
+    check("""
+          class A {
+            void method() {} // testNotSubtype:9
+          }
+          class Class extends A {
+            int method() => null; // testNotSubtype:10
+          }
+          """),
 
-  check("""
-        class A {
-          int method() => null; // testNotSubtype:11
-        }
-        class Class extends A {
-          void method() {} // testNotSubtype:12
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            int method() => null; // testNotSubtype:11
+          }
+          class Class extends A {
+            void method() {} // testNotSubtype:12
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:13
-        }
-        class B extends A {
-          method(num a) => null; // testNotSubtype:14
-        }
-        class Class extends B {
-          method(double a) => null; // testNotSubtype:15
-        }
-        """);
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:13
+          }
+          class B extends A {
+            method(num a) => null; // testNotSubtype:14
+          }
+          class Class extends B {
+            method(double a) => null; // testNotSubtype:15
+          }
+          """),
 
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:16
-        }
-        class B extends A {
-          method(a) => null; // testNotSubtype:17
-        }
-        class Class extends B {
-          method(String a) => null; // testNotSubtype:18
-        }
-        """);
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:16
+          }
+          class B extends A {
+            method(a) => null; // testNotSubtype:17
+          }
+          class Class extends B {
+            method(String a) => null; // testNotSubtype:18
+          }
+          """),
 
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:19
-        }
-        class Class extends A {
-          method(String a) => null; // testNotSubtype:20
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:19
+          }
+          class Class extends A {
+            method(String a) => null; // testNotSubtype:20
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:23
-        }
-        class B {
-          method(num a) => null; // testNotSubtype:24
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          method(double a) => null; // testNotSubtype:25
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:23
+          }
+          class B {
+            method(num a) => null; // testNotSubtype:24
+          }
+          abstract class C implements A, B {
+          }
+          class Class implements C {
+            method(double a) => null; // testNotSubtype:25
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(num a) => null; // testNotSubtype:29
-        }
-        class B {
-          method(int a) => null; // testNotSubtype:30
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          method(double a) => null; // testNotSubtype:31
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A {
+            method(num a) => null; // testNotSubtype:29
+          }
+          class B {
+            method(int a) => null; // testNotSubtype:30
+          }
+          abstract class C implements A, B {
+          }
+          class Class implements C {
+            method(double a) => null; // testNotSubtype:31
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A {
-          method(int a) => null; // testNotSubtype:26
-        }
-        class B {
-          method(num a) => null; // testNotSubtype:27
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          method(String a) => null; // testNotSubtype:28
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
-                        MessageKind.INVALID_OVERRIDE_METHOD],
-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);
+    check("""
+          class A {
+            method(int a) => null; // testNotSubtype:26
+          }
+          class B {
+            method(num a) => null; // testNotSubtype:27
+          }
+          abstract class C implements A, B {
+          }
+          class Class implements C {
+            method(String a) => null; // testNotSubtype:28
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
+                          MessageKind.INVALID_OVERRIDE_METHOD],
+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
+  ]);
 }
 
-testGetterNotSubtype() {
-  check("""
-        class A {
-          get getter => null; // testGetterNotSubtype:1
-        }
-        class Class extends A {
-          get getter => null; // testGetterNotSubtype:2
-        }
-        """);
+Future testGetterNotSubtype() {
+  return Future.wait([
+    check("""
+          class A {
+            get getter => null; // testGetterNotSubtype:1
+          }
+          class Class extends A {
+            get getter => null; // testGetterNotSubtype:2
+          }
+          """),
 
-  check("""
-        class A {
-          num get getter => null; // testGetterNotSubtype:3
-        }
-        class Class extends A {
-          num get getter => null; // testGetterNotSubtype:4
-        }
-        """);
+    check("""
+          class A {
+            num get getter => null; // testGetterNotSubtype:3
+          }
+          class Class extends A {
+            num get getter => null; // testGetterNotSubtype:4
+          }
+          """),
 
-  check("""
-        class A {
-          num get getter => null; // testGetterNotSubtype:5
-        }
-        class Class extends A {
-          int get getter => null; // testGetterNotSubtype:6
-        }
-        """);
+    check("""
+          class A {
+            num get getter => null; // testGetterNotSubtype:5
+          }
+          class Class extends A {
+            int get getter => null; // testGetterNotSubtype:6
+          }
+          """),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:7
-        }
-        class Class extends A {
-          num get getter => null; // testGetterNotSubtype:8
-        }
-        """);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:7
+          }
+          class Class extends A {
+            num get getter => null; // testGetterNotSubtype:8
+          }
+          """),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:9
-        }
-        class Class extends A {
-          double get getter => null; // testGetterNotSubtype:10
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:9
+          }
+          class Class extends A {
+            double get getter => null; // testGetterNotSubtype:10
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:11
-        }
-        class B extends A {
-          num get getter => null; // testGetterNotSubtype:12
-        }
-        class Class extends B {
-          double get getter => null; // testGetterNotSubtype:13
-        }
-        """);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:11
+          }
+          class B extends A {
+            num get getter => null; // testGetterNotSubtype:12
+          }
+          class Class extends B {
+            double get getter => null; // testGetterNotSubtype:13
+          }
+          """),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:14
-        }
-        class B {
-          num get getter => null; // testGetterNotSubtype:15
-        }
-        class Class extends A implements B {
-          double get getter => null; // testGetterNotSubtype:16
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:14
+          }
+          class B {
+            num get getter => null; // testGetterNotSubtype:15
+          }
+          class Class extends A implements B {
+            double get getter => null; // testGetterNotSubtype:16
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:17
-        }
-        class B {
-          String get getter => null; // testGetterNotSubtype:18
-        }
-        class Class extends A implements B {
-          double get getter => null; // testGetterNotSubtype:19
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
-                        MessageKind.INVALID_OVERRIDE_GETTER],
-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:17
+          }
+          class B {
+            String get getter => null; // testGetterNotSubtype:18
+          }
+          class Class extends A implements B {
+            double get getter => null; // testGetterNotSubtype:19
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
+                          MessageKind.INVALID_OVERRIDE_GETTER],
+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:20
-        }
-        class B {
-          String get getter => null; // testGetterNotSubtype:21
-        }
-        class Class implements A, B {
-          double get getter => null; // testGetterNotSubtype:22
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
-                        MessageKind.INVALID_OVERRIDE_GETTER],
-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:20
+          }
+          class B {
+            String get getter => null; // testGetterNotSubtype:21
+          }
+          class Class implements A, B {
+            double get getter => null; // testGetterNotSubtype:22
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
+                          MessageKind.INVALID_OVERRIDE_GETTER],
+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),
 
-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:23
-        }
-        class B {
-          num get getter => null; // testGetterNotSubtype:24
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          double get getter => null; // testGetterNotSubtype:25
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:23
+          }
+          class B {
+            num get getter => null; // testGetterNotSubtype:24
+          }
+          abstract class C implements A, B {
+          }
+          class Class implements C {
+            double get getter => null; // testGetterNotSubtype:25
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER,
+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
 
-  check("""
-        class A {
-          int get getter => null; // testGetterNotSubtype:26
-        }
-        class B {
-          num get getter => null; // testGetterNotSubtype:27
-        }
-        abstract class C implements A, B {
-        }
-        class Class implements C {
-          String get getter => null; // testGetterNotSubtype:28
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
-                        MessageKind.INVALID_OVERRIDE_GETTER],
-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
-                     MessageKind.INVALID_OVERRIDDEN_GETTER]);
+    check("""
+          class A {
+            int get getter => null; // testGetterNotSubtype:26
+          }
+          class B {
+            num get getter => null; // testGetterNotSubtype:27
+          }
+          abstract class C implements A, B {
+          }
+          class Class implements C {
+            String get getter => null; // testGetterNotSubtype:28
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER,
+                          MessageKind.INVALID_OVERRIDE_GETTER],
+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
+                       MessageKind.INVALID_OVERRIDDEN_GETTER]),
+  ]);
 }
 
-testGenericNotSubtype() {
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:1
-        }
-        class Class<S> extends A<S> {
-          method(S s) => null; // testGenericNotSubtype:2
-        }
-        """);
+Future testGenericNotSubtype() {
+  return Future.wait([
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:1
+          }
+          class Class<S> extends A<S> {
+            method(S s) => null; // testGenericNotSubtype:2
+          }
+          """),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:3
-        }
-        class Class extends A<num> {
-          method(int i) => null; // testGenericNotSubtype:4
-        }
-        """);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:3
+          }
+          class Class extends A<num> {
+            method(int i) => null; // testGenericNotSubtype:4
+          }
+          """),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:5
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:6
-        }
-        class Class extends A<double> implements B<int> {
-          method(num i) => null; // testGenericNotSubtype:7
-        }
-        """);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:5
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:6
+          }
+          class Class extends A<double> implements B<int> {
+            method(num i) => null; // testGenericNotSubtype:7
+          }
+          """),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:8
-        }
-        class Class<S> extends A<S> {
-          method(int i) => null; // testGenericNotSubtype:9
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:8
+          }
+          class Class<S> extends A<S> {
+            method(int i) => null; // testGenericNotSubtype:9
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:10
-        }
-        class B<S> extends A<S> {
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:10
+          }
+          class B<S> extends A<S> {
 
-        }
-        class Class<U> extends B<U> {
-          method(U u) => null; // testGenericNotSubtype:11
-        }
-        """);
+          }
+          class Class<U> extends B<U> {
+            method(U u) => null; // testGenericNotSubtype:11
+          }
+          """),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:12
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:13
-        }
-        class Class<U> extends A<U> implements B<num> {
-          method(int i) => null; // testGenericNotSubtype:14
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:12
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:13
+          }
+          class Class<U> extends A<U> implements B<num> {
+            method(int i) => null; // testGenericNotSubtype:14
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:15
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:16
-        }
-        class Class extends A<int> implements B<String> {
-          method(double d) => null; // testGenericNotSubtype:17
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
-                        MessageKind.INVALID_OVERRIDE_METHOD],
-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:15
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:16
+          }
+          class Class extends A<int> implements B<String> {
+            method(double d) => null; // testGenericNotSubtype:17
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
+                          MessageKind.INVALID_OVERRIDE_METHOD],
+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:18
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:19
-        }
-        class Class implements A<int>, B<String> {
-          method(double d) => null; // testGenericNotSubtype:20
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
-                        MessageKind.INVALID_OVERRIDE_METHOD],
-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:18
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:19
+          }
+          class Class implements A<int>, B<String> {
+            method(double d) => null; // testGenericNotSubtype:20
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
+                          MessageKind.INVALID_OVERRIDE_METHOD],
+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
 
-  // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:21
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:22
-        }
-        abstract class C implements A<int>, B<num> {
-        }
-        class Class implements C {
-          method(double d) => null; // testGenericNotSubtype:23
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
-             infos: MessageKind.INVALID_OVERRIDDEN_METHOD);
+    // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:21
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:22
+          }
+          abstract class C implements A<int>, B<num> {
+          }
+          class Class implements C {
+            method(double d) => null; // testGenericNotSubtype:23
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_METHOD,
+               infos: MessageKind.INVALID_OVERRIDDEN_METHOD),
 
-  check("""
-        class A<T> {
-          method(T t) => null; // testGenericNotSubtype:24
-        }
-        class B<S> {
-          method(S s) => null; // testGenericNotSubtype:25
-        }
-        abstract class C implements A<int>, B<num> {
-        }
-        class Class implements C {
-          method(String s) => null; // testGenericNotSubtype:26
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
-                        MessageKind.INVALID_OVERRIDE_METHOD],
-             infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
-                     MessageKind.INVALID_OVERRIDDEN_METHOD]);
+    check("""
+          class A<T> {
+            method(T t) => null; // testGenericNotSubtype:24
+          }
+          class B<S> {
+            method(S s) => null; // testGenericNotSubtype:25
+          }
+          abstract class C implements A<int>, B<num> {
+          }
+          class Class implements C {
+            method(String s) => null; // testGenericNotSubtype:26
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_METHOD,
+                          MessageKind.INVALID_OVERRIDE_METHOD],
+               infos: [MessageKind.INVALID_OVERRIDDEN_METHOD,
+                       MessageKind.INVALID_OVERRIDDEN_METHOD]),
+  ]);
 }
 
-testSetterNotSubtype() {
+Future testSetterNotSubtype() {
+  return Future.wait([
   check("""
         class A {
           set setter(_) => null; // testSetterNotSubtype:1
@@ -663,7 +679,7 @@
         class Class extends A {
           set setter(_) => null; // testSetterNotSubtype:2
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -672,7 +688,7 @@
         class Class extends A {
           set setter(_) => null; // testSetterNotSubtype:4
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -681,7 +697,7 @@
         class Class extends A {
           void set setter(_) {} // testSetterNotSubtype:6
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -690,7 +706,7 @@
         class Class extends A {
           void set setter(_) {} // testSetterNotSubtype:8
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -699,7 +715,7 @@
         class Class extends A {
           set setter(num _) => null; // testSetterNotSubtype:10
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -708,7 +724,7 @@
         class Class extends A {
           set setter(int _) => null; // testSetterNotSubtype:12
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -717,7 +733,7 @@
         class Class extends A {
           set setter(num _) => null; // testSetterNotSubtype:14
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -727,7 +743,7 @@
           set setter(double _) => null; // testSetterNotSubtype:16
         }
         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
 
   check("""
         class A {
@@ -739,7 +755,7 @@
         class Class extends B {
           set setter(double _) => null; // testSetterNotSubtype:19
         }
-        """);
+        """),
 
   check("""
         class A {
@@ -752,7 +768,7 @@
           set setter(double _) => null; // testSetterNotSubtype:22
         }
         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
 
   check("""
         class A {
@@ -767,7 +783,7 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                         MessageKind.INVALID_OVERRIDE_SETTER],
              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);
+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),
 
   check("""
         class A {
@@ -782,7 +798,7 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                         MessageKind.INVALID_OVERRIDE_SETTER],
              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);
+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),
 
   // TODO(johnniwinther): These are unclear. Issue 16443 has been filed.
   check("""
@@ -798,7 +814,7 @@
           set setter(double _) => null; // testSetterNotSubtype:31
         }
         """, warnings: MessageKind.INVALID_OVERRIDE_SETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
+             infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
 
   check("""
         class A {
@@ -815,701 +831,710 @@
         """, warnings: [MessageKind.INVALID_OVERRIDE_SETTER,
                         MessageKind.INVALID_OVERRIDE_SETTER],
              infos: [MessageKind.INVALID_OVERRIDDEN_SETTER,
-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);
+                     MessageKind.INVALID_OVERRIDDEN_SETTER]),
+  ]);
 }
 
-testFieldNotSubtype() {
-  check("""
-        class A {
-          int field; // testFieldNotSubtype:1
-        }
-        class Class extends A {
-          int field; // testFieldNotSubtype:2
-        }
-        """);
+Future testFieldNotSubtype() {
+  return Future.wait([
+    check("""
+          class A {
+            int field; // testFieldNotSubtype:1
+          }
+          class Class extends A {
+            int field; // testFieldNotSubtype:2
+          }
+          """),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:3
-        }
-        class Class extends A {
-          int field; // testFieldNotSubtype:4
-        }
-        """);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:3
+          }
+          class Class extends A {
+            int field; // testFieldNotSubtype:4
+          }
+          """),
 
-  check("""
-        class A {
-          int field; // testFieldNotSubtype:5
-        }
-        class Class extends A {
-          num field; // testFieldNotSubtype:6
-        }
-        """);
+    check("""
+          class A {
+            int field; // testFieldNotSubtype:5
+          }
+          class Class extends A {
+            num field; // testFieldNotSubtype:6
+          }
+          """),
 
-  check("""
-        class A {
-          int field; // testFieldNotSubtype:7
-        }
-        class Class extends A {
-          double field; // testFieldNotSubtype:8
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
+    check("""
+          class A {
+            int field; // testFieldNotSubtype:7
+          }
+          class Class extends A {
+            double field; // testFieldNotSubtype:8
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD,
+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
 
-  check("""
-        class A {
-          int field; // testFieldNotSubtype:9
-        }
-        class B extends A {
-          num field; // testFieldNotSubtype:10
-        }
-        class Class extends B {
-          double field; // testFieldNotSubtype:11
-        }
-        """);
+    check("""
+          class A {
+            int field; // testFieldNotSubtype:9
+          }
+          class B extends A {
+            num field; // testFieldNotSubtype:10
+          }
+          class Class extends B {
+            double field; // testFieldNotSubtype:11
+          }
+          """),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:12
-        }
-        class Class extends A {
-          int get field => null; // testFieldNotSubtype:13
-        }
-        """);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:12
+          }
+          class Class extends A {
+            int get field => null; // testFieldNotSubtype:13
+          }
+          """),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:14
-        }
-        class Class extends A {
-          String get field => null; // testFieldNotSubtype:15
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:14
+          }
+          class Class extends A {
+            String get field => null; // testFieldNotSubtype:15
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
 
-  check("""
-        class A {
-          num get field => null; // testFieldNotSubtype:16
-        }
-        class Class extends A {
-          String field; // testFieldNotSubtype:17
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
-             infos: MessageKind.INVALID_OVERRIDDEN_GETTER);
+    check("""
+          class A {
+            num get field => null; // testFieldNotSubtype:16
+          }
+          class Class extends A {
+            String field; // testFieldNotSubtype:17
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
+               infos: MessageKind.INVALID_OVERRIDDEN_GETTER),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:18
-        }
-        class Class extends A {
-          set field(int _) {} // testFieldNotSubtype:19
-        }
-        """);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:18
+          }
+          class Class extends A {
+            set field(int _) {} // testFieldNotSubtype:19
+          }
+          """),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:19
-        }
-        class Class extends A {
-          void set field(int _) {} // testFieldNotSubtype:20
-        }
-        """);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:19
+          }
+          class Class extends A {
+            void set field(int _) {} // testFieldNotSubtype:20
+          }
+          """),
 
-  check("""
-        class A {
-          set field(int _) {} // testFieldNotSubtype:21
-        }
-        class Class extends A {
-          num field; // testFieldNotSubtype:22
-        }
-        """);
+    check("""
+          class A {
+            set field(int _) {} // testFieldNotSubtype:21
+          }
+          class Class extends A {
+            num field; // testFieldNotSubtype:22
+          }
+          """),
 
-  check("""
-        class A {
-          void set field(int _) {} // testFieldNotSubtype:23
-        }
-        class Class extends A {
-          num field; // testFieldNotSubtype:24
-        }
-        """);
+    check("""
+          class A {
+            void set field(int _) {} // testFieldNotSubtype:23
+          }
+          class Class extends A {
+            num field; // testFieldNotSubtype:24
+          }
+          """),
 
-  check("""
-        class A {
-          num field; // testFieldNotSubtype:25
-        }
-        class Class extends A {
-          set field(String _) {} // testFieldNotSubtype:26
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
-             infos: MessageKind.INVALID_OVERRIDDEN_FIELD);
+    check("""
+          class A {
+            num field; // testFieldNotSubtype:25
+          }
+          class Class extends A {
+            set field(String _) {} // testFieldNotSubtype:26
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER,
+               infos: MessageKind.INVALID_OVERRIDDEN_FIELD),
 
-  check("""
-        class A {
-          set field(num _) {} // testFieldNotSubtype:27
-        }
-        class Class extends A {
-          String field; // testFieldNotSubtype:28
-        }
-        """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
-             infos: MessageKind.INVALID_OVERRIDDEN_SETTER);
+    check("""
+          class A {
+            set field(num _) {} // testFieldNotSubtype:27
+          }
+          class Class extends A {
+            String field; // testFieldNotSubtype:28
+          }
+          """, warnings: MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD,
+               infos: MessageKind.INVALID_OVERRIDDEN_SETTER),
 
-  check("""
-        class A {
-          int field; // testFieldNotSubtype:29
-        }
-        class Class implements A {
-          String get field => null; // testFieldNotSubtype:30
-          void set field(String s) {} // testFieldNotSubtype:31
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
-                        MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
-             infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
-                     MessageKind.INVALID_OVERRIDDEN_FIELD]);
+    check("""
+          class A {
+            int field; // testFieldNotSubtype:29
+          }
+          class Class implements A {
+            String get field => null; // testFieldNotSubtype:30
+            void set field(String s) {} // testFieldNotSubtype:31
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_FIELD_WITH_GETTER,
+                          MessageKind.INVALID_OVERRIDE_FIELD_WITH_SETTER],
+               infos: [MessageKind.INVALID_OVERRIDDEN_FIELD,
+                       MessageKind.INVALID_OVERRIDDEN_FIELD]),
 
 
-  check("""
-        class A {
-          String get field => null; // testFieldNotSubtype:32
-          void set field(String s) {} // testFieldNotSubtype:33
-        }
-        class Class implements A {
-          int field; // testFieldNotSubtype:34
-        }
-        """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
-                        MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
-             infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
-                     MessageKind.INVALID_OVERRIDDEN_SETTER]);
+    check("""
+          class A {
+            String get field => null; // testFieldNotSubtype:32
+            void set field(String s) {} // testFieldNotSubtype:33
+          }
+          class Class implements A {
+            int field; // testFieldNotSubtype:34
+          }
+          """, warnings: [MessageKind.INVALID_OVERRIDE_GETTER_WITH_FIELD,
+                          MessageKind.INVALID_OVERRIDE_SETTER_WITH_FIELD],
+               infos: [MessageKind.INVALID_OVERRIDDEN_GETTER,
+                       MessageKind.INVALID_OVERRIDDEN_SETTER]),
+  ]);
 }
 
-testMixedOverride() {
-  check("""
-        class A {
-          var member; // testMixedOverride:1
-        }
-        class Class extends A {
-          member() {} // testMixedOverride:2
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
-             infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT);
+Future testMixedOverride() {
+  return Future.wait([
+    check("""
+          class A {
+            var member; // testMixedOverride:1
+          }
+          class Class extends A {
+            member() {} // testMixedOverride:2
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD,
+               infos: MessageKind.CANNOT_OVERRIDE_FIELD_WITH_METHOD_CONT),
 
-  check("""
-        class A {
-          member() {} // testMixedOverride:3
-        }
-        class Class extends A {
-          var member; // testMixedOverride:4
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
-             infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT);
+    check("""
+          class A {
+            member() {} // testMixedOverride:3
+          }
+          class Class extends A {
+            var member; // testMixedOverride:4
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD,
+               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_FIELD_CONT),
 
-  check("""
-        class A {
-          get member => null; // testMixedOverride:5
-        }
-        class Class extends A {
-          member() {} // testMixedOverride:6
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
-             infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT);
+    check("""
+          class A {
+            get member => null; // testMixedOverride:5
+          }
+          class Class extends A {
+            member() {} // testMixedOverride:6
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
+               infos: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT),
 
-  check("""
-        class A {
-          member() {} // testMixedOverride:7
-        }
-        class Class extends A {
-          get member => null; // testMixedOverride:8
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
-             infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT);
+    check("""
+          class A {
+            member() {} // testMixedOverride:7
+          }
+          class Class extends A {
+            get member => null; // testMixedOverride:8
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
+               infos: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT),
 
-  check("""
-        abstract class A {
-          var member; // testMixedOverride:9
-        }
-        abstract class B {
-          get member; // testMixedOverride:10
-        }
-        abstract class Class implements A, B {
-        }
-        """);
+    check("""
+          abstract class A {
+            var member; // testMixedOverride:9
+          }
+          abstract class B {
+            get member; // testMixedOverride:10
+          }
+          abstract class Class implements A, B {
+          }
+          """),
 
-  check("""
-        abstract class A {
-          var member; // testMixedOverride:11
-        }
-        abstract class B {
-          member() {} // testMixedOverride:12
-        }
-        abstract class Class implements A, B {
-        }
-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-             infos: [MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_IMPLICIT_GETTER]);
+    check("""
+          abstract class A {
+            var member; // testMixedOverride:11
+          }
+          abstract class B {
+            member() {} // testMixedOverride:12
+          }
+          abstract class Class implements A, B {
+          }
+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
+               infos: [MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_IMPLICIT_GETTER]),
 
-  check("""
-        abstract class A {
-          get member; // testMixedOverride:13
-        }
-        abstract class B {
-          member() {} // testMixedOverride:14
-        }
-        abstract class Class implements A, B {
-        }
-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-             infos: [MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_EXPLICIT_GETTER]);
+    check("""
+          abstract class A {
+            get member; // testMixedOverride:13
+          }
+          abstract class B {
+            member() {} // testMixedOverride:14
+          }
+          abstract class Class implements A, B {
+          }
+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
+               infos: [MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_EXPLICIT_GETTER]),
 
-  check("""
-        abstract class A {
-          get member; // testMixedOverride:15
-        }
-        abstract class B {
-          member() {} // testMixedOverride:16
-        }
-        abstract class C {
-          var member; // testMixedOverride:17
-        }
-        abstract class D {
-          member() {} // testMixedOverride:18
-        }
-        abstract class E {
-          get member; // testMixedOverride:19
-        }
-        abstract class Class implements A, B, C, D, E {
-        }
-        """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-             infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
-                     MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_IMPLICIT_GETTER,
-                     MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_EXPLICIT_GETTER]);
+    check("""
+          abstract class A {
+            get member; // testMixedOverride:15
+          }
+          abstract class B {
+            member() {} // testMixedOverride:16
+          }
+          abstract class C {
+            var member; // testMixedOverride:17
+          }
+          abstract class D {
+            member() {} // testMixedOverride:18
+          }
+          abstract class E {
+            get member; // testMixedOverride:19
+          }
+          abstract class Class implements A, B, C, D, E {
+          }
+          """, warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
+               infos: [MessageKind.INHERITED_EXPLICIT_GETTER,
+                       MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_IMPLICIT_GETTER,
+                       MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_EXPLICIT_GETTER]),
 
-  check("""
-        abstract class A {
-          get member; // testMixedOverride:20
-        }
-        abstract class B {
-          member() {} // testMixedOverride:21
-        }
-        abstract class C implements A, B {
-        }
-        class Class extends C {
-          member() {} // testMixedOverride:22
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
-             warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-             infos: [MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_EXPLICIT_GETTER,
-                     MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]);
+    check("""
+          abstract class A {
+            get member; // testMixedOverride:20
+          }
+          abstract class B {
+            member() {} // testMixedOverride:21
+          }
+          abstract class C implements A, B {
+          }
+          class Class extends C {
+            member() {} // testMixedOverride:22
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD,
+               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
+               infos: [MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_EXPLICIT_GETTER,
+                       MessageKind.CANNOT_OVERRIDE_GETTER_WITH_METHOD_CONT]),
 
-  check("""
-        abstract class A {
-          get member; // testMixedOverride:23
-        }
-        abstract class B {
-          member() {} // testMixedOverride:24
-        }
-        abstract class C implements A, B {
-        }
-        class Class extends C {
-          get member => null; // testMixedOverride:25
-        }
-        """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
-             warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
-             infos: [MessageKind.INHERITED_METHOD,
-                     MessageKind.INHERITED_EXPLICIT_GETTER,
-                     MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]);
+    check("""
+          abstract class A {
+            get member; // testMixedOverride:23
+          }
+          abstract class B {
+            member() {} // testMixedOverride:24
+          }
+          abstract class C implements A, B {
+          }
+          class Class extends C {
+            get member => null; // testMixedOverride:25
+          }
+          """, errors: MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER,
+               warnings: MessageKind.INHERIT_GETTER_AND_METHOD,
+               infos: [MessageKind.INHERITED_METHOD,
+                       MessageKind.INHERITED_EXPLICIT_GETTER,
+                       MessageKind.CANNOT_OVERRIDE_METHOD_WITH_GETTER_CONT]),
+  ]);
 }
 
-testAbstractMethods() {
-  check("""
-        abstract class Class {
-          method(); // testAbstractMethod:1
-        }
-        """);
+Future testAbstractMethods() {
+  return Future.wait([
+    check("""
+          abstract class Class {
+            method(); // testAbstractMethod:1
+          }
+          """),
 
-  check("""
-        class Class {
-          method(); // testAbstractMethod:2
-        }
-        """, warnings: MessageKind.ABSTRACT_METHOD,
-             infos: []);
+    check("""
+          class Class {
+            method(); // testAbstractMethod:2
+          }
+          """, warnings: MessageKind.ABSTRACT_METHOD,
+               infos: []),
 
-  check("""
-        class Class {
-          get getter; // testAbstractMethod:3
-        }
-        """, warnings: MessageKind.ABSTRACT_GETTER,
-             infos: []);
+    check("""
+          class Class {
+            get getter; // testAbstractMethod:3
+          }
+          """, warnings: MessageKind.ABSTRACT_GETTER,
+               infos: []),
 
-  check("""
-        class Class {
-          set setter(_); // testAbstractMethod:4
-        }
-        """, warnings: MessageKind.ABSTRACT_SETTER,
-             infos: []);
+    check("""
+          class Class {
+            set setter(_); // testAbstractMethod:4
+          }
+          """, warnings: MessageKind.ABSTRACT_SETTER,
+               infos: []),
 
-  check("""
-        abstract class A {
-          method(); // testAbstractMethod:5
-        }
-        class Class extends A {
-          method() {} // testAbstractMethod:6
-        }
-        """);
+    check("""
+          abstract class A {
+            method(); // testAbstractMethod:5
+          }
+          class Class extends A {
+            method() {} // testAbstractMethod:6
+          }
+          """),
 
-  check("""
-        abstract class A {
-          method(); // testAbstractMethod:7
-        }
-        class Class extends A {
-          method([a]) {} // testAbstractMethod:8
-        }
-        """);
+    check("""
+          abstract class A {
+            method(); // testAbstractMethod:7
+          }
+          class Class extends A {
+            method([a]) {} // testAbstractMethod:8
+          }
+          """),
 
-  check("""
-        abstract class A {
-          method(); // testAbstractMethod:9
-        }
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          abstract class A {
+            method(); // testAbstractMethod:9
+          }
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        abstract class A {
-          get getter; // testAbstractMethod:10
-        }
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);
+    check("""
+          abstract class A {
+            get getter; // testAbstractMethod:10
+          }
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
 
-  check("""
-        abstract class A {
-          set setter(_); // testAbstractMethod:11
-        }
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);
+    check("""
+          abstract class A {
+            set setter(_); // testAbstractMethod:11
+          }
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
 
-  check("""
-        abstract class A {
-          method(); // testAbstractMethod:12
-        }
-        class B {
-          method() {} // testAbstractMethod:13
-        }
-        class Class extends A implements B {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
-             infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
-                     MessageKind.UNIMPLEMENTED_METHOD_CONT]);
+    check("""
+          abstract class A {
+            method(); // testAbstractMethod:12
+          }
+          class B {
+            method() {} // testAbstractMethod:13
+          }
+          class Class extends A implements B {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD,
+               infos: [MessageKind.UNIMPLEMENTED_METHOD_CONT,
+                       MessageKind.UNIMPLEMENTED_METHOD_CONT]),
 
-  check("""
-        abstract class A {
-          get getter; // testAbstractMethod:14
-        }
-        class B {
-          get getter => 0; // testAbstractMethod:15
-        }
-        class Class extends A implements B {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]);
+    check("""
+          abstract class A {
+            get getter; // testAbstractMethod:14
+          }
+          class B {
+            get getter => 0; // testAbstractMethod:15
+          }
+          class Class extends A implements B {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER]),
 
-  check("""
-        abstract class A {
-          set setter(_); // testAbstractMethod:16
-        }
-        class B {
-          set setter(_) {} // testAbstractMethod:17
-        }
-        class Class extends A implements B {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-                     MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]);
+    check("""
+          abstract class A {
+            set setter(_); // testAbstractMethod:16
+          }
+          class B {
+            set setter(_) {} // testAbstractMethod:17
+          }
+          class Class extends A implements B {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER]),
 
-  check("""
-        abstract class A {
-          get field; // testAbstractMethod:18
-        }
-        class B {
-          var field; // testAbstractMethod:19
-        }
-        class Class extends A implements B {
-          set field(_) {} // testAbstractMethod:20
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]);
+    check("""
+          abstract class A {
+            get field; // testAbstractMethod:18
+          }
+          class B {
+            var field; // testAbstractMethod:19
+          }
+          class Class extends A implements B {
+            set field(_) {} // testAbstractMethod:20
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER,
+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER]),
 
-  check("""
-        abstract class A {
-          set field(_); // testAbstractMethod:21
-        }
-        class B {
-          var field; // testAbstractMethod:22
-        }
-        class Class extends A implements B {
-          get field => 0; // testAbstractMethod:23
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
+    check("""
+          abstract class A {
+            set field(_); // testAbstractMethod:21
+          }
+          class B {
+            var field; // testAbstractMethod:22
+          }
+          class Class extends A implements B {
+            get field => 0; // testAbstractMethod:23
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER,
+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
 
-  check("""
-        class A {
-          method() {} // testAbstractMethod:24
-        }
-        class Class implements A {
-          method() {} // testAbstractMethod:25
-        }
-        """);
+    check("""
+          class A {
+            method() {} // testAbstractMethod:24
+          }
+          class Class implements A {
+            method() {} // testAbstractMethod:25
+          }
+          """),
 
-  check("""
-        class A {
-          method() {} // testAbstractMethod:26
-        }
-        class Class implements A {
-          method([a]) {} // testAbstractMethod:27
-        }
-        """);
+    check("""
+          class A {
+            method() {} // testAbstractMethod:26
+          }
+          class Class implements A {
+            method([a]) {} // testAbstractMethod:27
+          }
+          """),
 
-  check("""
-        class A {
-          method() {} // testAbstractMethod:28
-        }
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          class A {
+            method() {} // testAbstractMethod:28
+          }
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        class A {
-          method() {} // testAbstractMethod:29
-        }
-        class B {
-          method() {} // testAbstractMethod:30
-        }
-        class Class extends A implements B {
-        }
-        """);
+    check("""
+          class A {
+            method() {} // testAbstractMethod:29
+          }
+          class B {
+            method() {} // testAbstractMethod:30
+          }
+          class Class extends A implements B {
+          }
+          """),
 
-  check("""
-        class A {
-          var member; // testAbstractMethod:31
-        }
-        class Class implements A {
-        }
-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
-                        MessageKind.UNIMPLEMENTED_SETTER_ONE],
-             infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
+    check("""
+          class A {
+            var member; // testAbstractMethod:31
+          }
+          class Class implements A {
+          }
+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER_ONE,
+                          MessageKind.UNIMPLEMENTED_SETTER_ONE],
+               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
 
-  check("""
-        class A {
-          var member; // testAbstractMethod:32
-        }
-        class B {
-          get member => null; // testAbstractMethod:33
-          set member(_) {} // testAbstractMethod:34
-        }
-        class Class implements A, B {
-        }
-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
-                        MessageKind.UNIMPLEMENTED_SETTER],
-             infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
+    check("""
+          class A {
+            var member; // testAbstractMethod:32
+          }
+          class B {
+            get member => null; // testAbstractMethod:33
+            set member(_) {} // testAbstractMethod:34
+          }
+          class Class implements A, B {
+          }
+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
+                          MessageKind.UNIMPLEMENTED_SETTER],
+               infos: [MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
 
-  check("""
-        class A {
-          var member; // testAbstractMethod:35
-        }
-        class B {
-          var member; // testAbstractMethod:36
-        }
-        class Class implements A, B {
-        }
-        """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
-                        MessageKind.UNIMPLEMENTED_SETTER],
-             infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
-                     MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]);
+    check("""
+          class A {
+            var member; // testAbstractMethod:35
+          }
+          class B {
+            var member; // testAbstractMethod:36
+          }
+          class Class implements A, B {
+          }
+          """, warnings: [MessageKind.UNIMPLEMENTED_GETTER,
+                          MessageKind.UNIMPLEMENTED_SETTER],
+               infos: [MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER,
+                       MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER]),
 
-  check("""
-        class A {
-          get member => 0; // testAbstractMethod:37
-        }
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER);
+    check("""
+          class A {
+            get member => 0; // testAbstractMethod:37
+          }
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_GETTER),
 
-  check("""
-        class A {
-          set member(_) {} // testAbstractMethod:38
-        }
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER);
+    check("""
+          class A {
+            set member(_) {} // testAbstractMethod:38
+          }
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_EXPLICIT_SETTER),
 
-  check("""
-        class A {
-          var member; // testAbstractMethod:39
-        }
-        class Class implements A {
-          get member => 0;
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
+    check("""
+          class A {
+            var member; // testAbstractMethod:39
+          }
+          class Class implements A {
+            get member => 0;
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
 
-  check("""
-        class A {
-          var field; // testAbstractMethod:40
-        }
-        class Class implements A {
-          final field = 0; // testAbstractMethod:41
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER);
+    check("""
+          class A {
+            var field; // testAbstractMethod:40
+          }
+          class Class implements A {
+            final field = 0; // testAbstractMethod:41
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_SETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_SETTER),
 
-  check("""
-        class A {
-          var member; // testAbstractMethod:42
-        }
-        class Class implements A {
-          set member(_) {}
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
-             infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER);
+    check("""
+          class A {
+            var member; // testAbstractMethod:42
+          }
+          class Class implements A {
+            set member(_) {}
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_GETTER_ONE,
+               infos: MessageKind.UNIMPLEMENTED_IMPLICIT_GETTER),
 
-  check("""
-        abstract class A {
-          method() {} // testAbstractMethod:43
-        }
-        class Class extends A {
-          method();
-        }
-        """);
+    check("""
+          abstract class A {
+            method() {} // testAbstractMethod:43
+          }
+          class Class extends A {
+            method();
+          }
+          """),
+  ]);
 }
 
-testNoSuchMethod() {
-  check("""
-        class Class {
-          method(); // testNoSuchMethod:1
-        }
-        """, warnings: MessageKind.ABSTRACT_METHOD,
-             infos: []);
+Future testNoSuchMethod() {
+  return Future.wait([
+    check("""
+          class Class {
+            method(); // testNoSuchMethod:1
+          }
+          """, warnings: MessageKind.ABSTRACT_METHOD,
+               infos: []),
 
-  check("""
-        @proxy
-        class Class {
-          method(); // testNoSuchMethod:2
-        }
-        """, warnings: MessageKind.ABSTRACT_METHOD,
-             infos: []);
+    check("""
+          @proxy
+          class Class {
+            method(); // testNoSuchMethod:2
+          }
+          """, warnings: MessageKind.ABSTRACT_METHOD,
+               infos: []),
 
-  check("""
-        class Class {
-          noSuchMethod(_) => null;
-          method(); // testNoSuchMethod:3
-        }
-        """);
+    check("""
+          class Class {
+            noSuchMethod(_) => null;
+            method(); // testNoSuchMethod:3
+          }
+          """),
 
-  check("""
-        class Class {
-          noSuchMethod(_, [__]) => null;
-          method(); // testNoSuchMethod:4
-        }
-        """);
+    check("""
+          class Class {
+            noSuchMethod(_, [__]) => null;
+            method(); // testNoSuchMethod:4
+          }
+          """),
 
-  check("""
-        class Class {
-          noSuchMethod(_);
-          method(); // testNoSuchMethod:5
-        }
-        """);
+    check("""
+          class Class {
+            noSuchMethod(_);
+            method(); // testNoSuchMethod:5
+          }
+          """),
 
-  check("""
-        abstract class A {
-          method(); // testNoSuchMethod:6
-        }
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          abstract class A {
+            method(); // testNoSuchMethod:6
+          }
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        abstract class A {
-          method(); // testNoSuchMethod:7
-        }
-        @proxy
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          abstract class A {
+            method(); // testNoSuchMethod:7
+          }
+          @proxy
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        abstract class A {
-          method(); // testNoSuchMethod:8
-        }
-        class Class extends A {
-          noSuchMethod(_) => null;
-        }
-        """);
+    check("""
+          abstract class A {
+            method(); // testNoSuchMethod:8
+          }
+          class Class extends A {
+            noSuchMethod(_) => null;
+          }
+          """),
 
-  check("""
-        class A {
-          method() {} // testNoSuchMethod:9
-        }
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          class A {
+            method() {} // testNoSuchMethod:9
+          }
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        class A {
-          method() {} // testNoSuchMethod:10
-        }
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          class A {
+            method() {} // testNoSuchMethod:10
+          }
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        class A {
-          method() {} // testNoSuchMethod:11
-        }
-        @proxy
-        class Class implements A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          class A {
+            method() {} // testNoSuchMethod:11
+          }
+          @proxy
+          class Class implements A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
 
-  check("""
-        class A {
-          method() {} // testNoSuchMethod:12
-        }
-        class Class implements A {
-          noSuchMethod(_) => null;
-        }
-        """);
+    check("""
+          class A {
+            method() {} // testNoSuchMethod:12
+          }
+          class Class implements A {
+            noSuchMethod(_) => null;
+          }
+          """),
 
-  check("""
-        class A {
-          noSuchMethod(_) => null;
-          method(); // testNoSuchMethod:13
-        }
-        class Class extends A {
-        }
-        """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
-             infos: MessageKind.UNIMPLEMENTED_METHOD_CONT);
+    check("""
+          class A {
+            noSuchMethod(_) => null;
+            method(); // testNoSuchMethod:13
+          }
+          class Class extends A {
+          }
+          """, warnings: MessageKind.UNIMPLEMENTED_METHOD_ONE,
+               infos: MessageKind.UNIMPLEMENTED_METHOD_CONT),
+  ]);
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/package_root_test.dart b/tests/compiler/dart2js/package_root_test.dart
index 704e6b2..18c6f84 100644
--- a/tests/compiler/dart2js/package_root_test.dart
+++ b/tests/compiler/dart2js/package_root_test.dart
@@ -10,10 +10,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show DiagnosticHandler, Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/parser_helper.dart b/tests/compiler/dart2js/parser_helper.dart
index a948f7d..27abe72 100644
--- a/tests/compiler/dart2js/parser_helper.dart
+++ b/tests/compiler/dart2js/parser_helper.dart
@@ -6,22 +6,22 @@
 
 import "package:expect/expect.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/source_file.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/scanner/scannerlib.dart";
+import "package:compiler/implementation/source_file.dart";
+import "package:compiler/implementation/util/util.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart"
+import "package:compiler/implementation/elements/modelx.dart"
     show CompilationUnitElementX,
          LibraryElementX;
 
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/dart2jslib.dart";
 
-export "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+export "package:compiler/implementation/dart2jslib.dart"
     show DiagnosticListener;
 // TODO(ahe): We should have token library to export instead.
-export "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
+export "package:compiler/implementation/scanner/scannerlib.dart";
 
 class LoggerCanceler implements DiagnosticListener {
   void cancel(String reason, {node, token, instruction, element}) {
diff --git a/tests/compiler/dart2js/parser_test.dart b/tests/compiler/dart2js/parser_test.dart
index 9b47f8d..9582575 100644
--- a/tests/compiler/dart2js/parser_test.dart
+++ b/tests/compiler/dart2js/parser_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 void testStatement(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/part_of_test.dart b/tests/compiler/dart2js/part_of_test.dart
index 79eebf2..4cf2e12 100644
--- a/tests/compiler/dart2js/part_of_test.dart
+++ b/tests/compiler/dart2js/part_of_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
     show MessageKind;
 
 final libraryUri = Uri.parse('test:library.dart');
@@ -22,13 +22,11 @@
 ''';
 
 void main() {
-  var compiler = new MockCompiler();
+  MockCompiler compiler = new MockCompiler.internal();
   compiler.registerSource(libraryUri, LIBRARY_SOURCE);
   compiler.registerSource(partUri, PART_SOURCE);
 
-  asyncTest(() =>
-      compiler.libraryLoader.loadLibrary(libraryUri, null, libraryUri).
-      then((_) {
+  asyncTest(() => compiler.libraryLoader.loadLibrary(libraryUri).then((_) {
     print('errors: ${compiler.errors}');
     print('warnings: ${compiler.warnings}');
     Expect.isTrue(compiler.errors.isEmpty);
diff --git a/tests/compiler/dart2js/patch_test.dart b/tests/compiler/dart2js/patch_test.dart
index 1ae7f8d..a016613 100644
--- a/tests/compiler/dart2js/patch_test.dart
+++ b/tests/compiler/dart2js/patch_test.dart
@@ -5,27 +5,22 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/util/util.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/elements/elements.dart";
+import "package:compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/util/util.dart";
 import "mock_compiler.dart";
 import "parser_helper.dart";
 
 Future<Compiler> applyPatch(String script, String patch,
                             {bool analyzeAll: false, bool analyzeOnly: false}) {
   String core = "$DEFAULT_CORELIB\n$script";
-  MockCompiler compiler = new MockCompiler(coreSource: core,
-                                           analyzeAll: analyzeAll,
-                                           analyzeOnly: analyzeOnly);
-  var uri = Uri.parse("core.dartp");
-  compiler.sourceFiles[uri.toString()] = new MockFile(patch);
-  var handler = new LibraryDependencyHandler(compiler);
-  return compiler.patchParser.patchLibrary(handler, uri, compiler.coreLibrary)
-      .then((_) {
-    handler.computeExports();
-    return compiler;
-  });
+  MockCompiler compiler = new MockCompiler.internal(coreSource: core,
+                                                    analyzeAll: analyzeAll,
+                                                    analyzeOnly: analyzeOnly);
+  var uri = Uri.parse("patch:core");
+  compiler.registerSource(uri, "$PATCH_CORE_SOURCE\n$patch");
+  return compiler.init().then((_) => compiler);
 }
 
 void expectHasBody(compiler, Element element) {
@@ -112,7 +107,7 @@
 testPatchFunction() {
   asyncTest(() => applyPatch(
       "external test();",
-      "patch test() { return 'string'; } ").then((compiler) {
+      "@patch test() { return 'string'; } ").then((compiler) {
     ensure(compiler, "test", compiler.coreLibrary.find,
            expectIsPatched: true, checkHasBody: true);
     ensure(compiler, "test", compiler.coreLibrary.patch.find,
@@ -133,8 +128,8 @@
       }
       """,
       """
-      patch class Class {
-        patch Class();
+      @patch class Class {
+        @patch Class();
       }
       """).then((compiler) {
     var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -173,8 +168,8 @@
       }
       """,
       r"""
-      patch class Class {
-        patch Class._(x, y) { print('$x,$y'); }
+      @patch class Class {
+        @patch Class._(x, y) { print('$x,$y'); }
       }
       """).then((compiler) {
     var classOrigin = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -218,8 +213,8 @@
       }
       """,
       """
-      patch class Class {
-        patch String toString() => 'string';
+      @patch class Class {
+        @patch String toString() => 'string';
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -248,8 +243,8 @@
       }
       """,
       """
-      patch class Class {
-        patch int get field => 5;
+      @patch class Class {
+        @patch int get field => 5;
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -283,7 +278,7 @@
       }
       """,
       """
-      patch class Class {
+      @patch class Class {
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -311,7 +306,7 @@
       }
       """,
       """
-      patch class Class {
+      @patch class Class {
         void ghost() {}
       }
       """).then((compiler) {
@@ -371,18 +366,18 @@
       }
       """,
       """
-      patch class Class {
-        patch int method1() => 0;
-        patch void method2() {}
-        patch void method3(String s2) {}
-        patch void method4([String str, int i]) {}
-        patch void method5() {}
-        patch void method6([String str]) {}
-        patch void method7([String s2]) {}
-        patch void method8({String s2}) {}
-        patch void method9(int str) {}
-        patch void method10([int str]) {}
-        patch void method11({int str}) {}
+      @patch class Class {
+        @patch int method1() => 0;
+        @patch void method2() {}
+        @patch void method3(String s2) {}
+        @patch void method4([String str, int i]) {}
+        @patch void method5() {}
+        @patch void method6([String str]) {}
+        @patch void method7([String s2]) {}
+        @patch void method8({String s2}) {}
+        @patch void method9(int str) {}
+        @patch void method10([int str]) {}
+        @patch void method11({int str}) {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -438,7 +433,7 @@
       external void foo();
       """,
       """
-      // patch void foo() {}
+      // @patch void foo() {}
       """).then((compiler) {
     var function = ensure(compiler, "foo", compiler.coreLibrary.find);
     compiler.resolver.resolve(function);
@@ -462,8 +457,8 @@
       }
       """,
       """
-      patch class Class {
-        // patch void foo() {}
+      @patch class Class {
+        // @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -492,7 +487,7 @@
       class A {}
       """,
       """
-      patch class A {}
+      @patch class A {}
       """).then((compiler) {
     ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
                               expectIsPatched: true);
@@ -509,7 +504,7 @@
       // class Class {}
       """,
       """
-      patch class Class {}
+      @patch class Class {}
       """).then((compiler) {
     Expect.isTrue(compiler.warnings.isEmpty,
                   "Unexpected warnings: ${compiler.warnings}");
@@ -526,8 +521,8 @@
       class Class {}
       """,
       """
-      patch class Class {
-        patch void foo() {}
+      @patch class Class {
+        @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -549,7 +544,7 @@
       external get foo;
       """,
       """
-      patch var foo;
+      @patch var foo;
       """).then((compiler) {
     ensure(compiler, "foo", compiler.coreLibrary.find);
 
@@ -568,7 +563,7 @@
       external var foo;
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     ensure(compiler, "foo", compiler.coreLibrary.find);
 
@@ -591,7 +586,7 @@
       void foo() {}
       """,
       """
-      patch void foo() {}
+      @patch void foo() {}
       """).then((compiler) {
     print('testPatchNonExternalTopLevel.errors:${compiler.errors}');
     print('testPatchNonExternalTopLevel.warnings:${compiler.warnings}');
@@ -613,8 +608,8 @@
       }
       """,
       """
-      patch class Class {
-        patch void foo() {}
+      @patch class Class {
+        @patch void foo() {}
       }
       """).then((compiler) {
     var container = ensure(compiler, "Class", compiler.coreLibrary.find,
@@ -639,7 +634,7 @@
       external void Class() {}
       """,
       """
-      patch class Class {}
+      @patch class Class {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -659,7 +654,7 @@
       external void foo() {}
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -679,7 +674,7 @@
       external set foo(var value) {}
       """,
       """
-      patch get foo => 0;
+      @patch get foo => 0;
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -699,7 +694,7 @@
       external void foo() {}
       """,
       """
-      patch set foo(var value) {}
+      @patch set foo(var value) {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -719,7 +714,7 @@
       external get foo;
       """,
       """
-      patch set foo(var value) {}
+      @patch set foo(var value) {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -739,7 +734,7 @@
       external get foo;
       """,
       """
-      patch void foo() {}
+      @patch void foo() {}
       """).then((compiler) {
     print('testPatchNonClass.errors:${compiler.errors}');
     print('testPatchNonClass.warnings:${compiler.warnings}');
@@ -764,9 +759,9 @@
       }
       """,
       """
-      patch class A {
+      @patch class A {
         int method() => 0;
-        patch void clear() {}
+        @patch void clear() {}
       }
       """).then((compiler) {
     ClassElement cls = ensure(compiler, "A", compiler.coreLibrary.find,
@@ -784,7 +779,7 @@
     // Check that a method just in the patch class is a target for a
     // typed selector.
     var selector = new Selector.call('method', compiler.coreLibrary, 0);
-    var typedSelector = new TypedSelector.exact(cls, selector);
+    var typedSelector = new TypedSelector.exact(cls, selector, compiler);
     Element method = cls.implementation.lookupLocalMember('method');
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
@@ -792,7 +787,7 @@
     // Check that the declaration method in the declaration class is a target
     // for a typed selector.
     selector = new Selector.call('clear', compiler.coreLibrary, 0);
-    typedSelector = new TypedSelector.exact(cls, selector);
+    typedSelector = new TypedSelector.exact(cls, selector, compiler);
     method = cls.lookupLocalMember('clear');
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
@@ -801,7 +796,7 @@
     // for a typed selector on a subclass.
     cls = ensure(compiler, "B", compiler.coreLibrary.find);
     cls.ensureResolved(compiler);
-    typedSelector = new TypedSelector.exact(cls, selector);
+    typedSelector = new TypedSelector.exact(cls, selector, compiler);
     Expect.isTrue(selector.applies(method, compiler));
     Expect.isTrue(typedSelector.applies(method, compiler));
   }));
@@ -844,7 +839,7 @@
 void testTypecheckPatchedMembers() {
   String originText = "external void method();";
   String patchText = """
-                     patch void method() {
+                     @patch void method() {
                        String s = 0;
                      }
                      """;
diff --git a/tests/compiler/dart2js/pretty_parameter_test.dart b/tests/compiler/dart2js/pretty_parameter_test.dart
index 91f00fd..723683b 100644
--- a/tests/compiler/dart2js/pretty_parameter_test.dart
+++ b/tests/compiler/dart2js/pretty_parameter_test.dart
@@ -3,7 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String FOO = r"""
@@ -71,26 +73,34 @@
 """;
 
 main() {
-  String generated = compile(FOO, entry: 'foo');
-  Expect.isTrue(generated.contains(r"function(a, b) {"));
+  asyncTest(() => Future.wait([
+    compile(FOO, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains(r"function(a, b) {"));
+    }),
 
-  generated = compile(BAR, entry: 'bar');
-  Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
+    compile(BAR, entry: 'bar', check: (String generated) {
+      Expect.isTrue(generated.contains(r"function($eval, $$eval) {"));
+    }),
 
-  generated = compile(PARAMETER_AND_TEMP, entry: 'bar');
-  Expect.isTrue(generated.contains(r"print(t00)"));
-  // Check that the second 't0' got another name.
-  Expect.isTrue(generated.contains(r"print(t01)"));
+    compile(PARAMETER_AND_TEMP, entry: 'bar', check: (String generated) {
+      Expect.isTrue(generated.contains(r"print(t00)"));
+      // Check that the second 't0' got another name.
+      Expect.isTrue(generated.contains(r"print(t01)"));
+    }),
 
-  generated = compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo');
-  Expect.isTrue(generated.contains("var a;"));
-  // Check that there is only one var declaration.
-  checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    compile(MULTIPLE_PHIS_ONE_LOCAL, entry: 'foo', check: (String generated) {
+      Expect.isTrue(generated.contains("var a;"));
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    }),
 
-  generated = compile(NO_LOCAL, entry: 'foo');
-  Expect.isFalse(generated.contains('var'));
+    compile(NO_LOCAL, entry: 'foo', check: (String generated) {
+      Expect.isFalse(generated.contains('var'));
+    }),
 
-  generated = compile(PARAMETER_INIT, entry: 'foo');
-  // Check that there is only one var declaration.
-  checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    compile(PARAMETER_INIT, entry: 'foo', check: (String generated) {
+      // Check that there is only one var declaration.
+      checkNumberOfMatches(new RegExp("var").allMatches(generated).iterator, 1);
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/private_test.dart b/tests/compiler/dart2js/private_test.dart
index 45c41dd..568fb14 100644
--- a/tests/compiler/dart2js/private_test.dart
+++ b/tests/compiler/dart2js/private_test.dart
@@ -6,8 +6,8 @@
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
 
 const String PRIVATE_SOURCE_URI = 'src:private';
 const String PRIVATE_SOURCE = '''
@@ -45,7 +45,7 @@
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
-  MockCompiler compiler = new MockCompiler(analyzeOnly: true);
+  MockCompiler compiler = new MockCompiler.internal(analyzeOnly: true);
   compiler.registerSource(Uri.parse(PRIVATE_SOURCE_URI), PRIVATE_SOURCE);
   compiler.diagnosticHandler = (uri, int begin, int end, String message, kind) {
     SourceFile sourceFile = compiler.sourceFiles[uri.toString()];
diff --git a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
index de35f7e..d7f2b72 100644
--- a/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
+++ b/tests/compiler/dart2js/redundant_phi_eliminator_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -28,13 +30,17 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    }),
 
-  generated = compile(TEST_TWO, entry: 'foo');
-  regexp = new RegExp("toBeRemoved");
-  Expect.isTrue(!regexp.hasMatch(generated));
-  regexp = new RegExp("temp");
-  Expect.isTrue(!regexp.hasMatch(generated));
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("toBeRemoved");
+      Expect.isTrue(!regexp.hasMatch(generated));
+      regexp = new RegExp("temp");
+      Expect.isTrue(!regexp.hasMatch(generated));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/reexport_handled_test.dart b/tests/compiler/dart2js/reexport_handled_test.dart
index f2982ed..353e0a5 100644
--- a/tests/compiler/dart2js/reexport_handled_test.dart
+++ b/tests/compiler/dart2js/reexport_handled_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
     show Element,
          LibraryElement;
 
@@ -24,21 +24,20 @@
 ''';
 
 void main() {
-  var compiler = new MockCompiler();
-  compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
-  compiler.registerSource(reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
-
-  // Load exporting library before the reexporting library.
-  asyncTest(() => compiler.libraryLoader.loadLibrary(
-      exportingLibraryUri, null, exportingLibraryUri).then((exportingLibrary) {
+  MockCompiler compiler;
+  asyncTest(() => MockCompiler.create((MockCompiler c) {
+    compiler = c;
+    compiler.registerSource(exportingLibraryUri, EXPORTING_LIBRARY_SOURCE);
+    compiler.registerSource(reexportingLibraryUri, REEXPORTING_LIBRARY_SOURCE);
+    return compiler.libraryLoader.loadLibrary(exportingLibraryUri);
+  }).then((exportingLibrary) {
     Expect.isTrue(exportingLibrary.exportsHandled);
     var foo = findInExports(exportingLibrary, 'foo');
     Expect.isNotNull(foo);
     Expect.isTrue(foo.isField);
 
     // Load reexporting library when exports are handled on the exporting library.
-    return compiler.libraryLoader.loadLibrary(
-        reexportingLibraryUri, null, reexportingLibraryUri);
+    return compiler.libraryLoader.loadLibrary(reexportingLibraryUri);
   }).then((reexportingLibrary) {
     var foo = findInExports(reexportingLibrary, 'foo');
     Expect.isNotNull(foo);
diff --git a/tests/compiler/dart2js/resolution_test.dart b/tests/compiler/dart2js/resolution_test.dart
index 3480144..2e8714b 100644
--- a/tests/compiler/dart2js/resolution_test.dart
+++ b/tests/compiler/dart2js/resolution_test.dart
@@ -9,7 +9,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/apiimpl.dart';
+import 'package:compiler/implementation/apiimpl.dart';
 
 const String NO_RUNTIME_TYPE = r"""
 import 'dart:core' as prefix;
diff --git a/tests/compiler/dart2js/resolver_test.dart b/tests/compiler/dart2js/resolver_test.dart
index 4e88fb0..3107d36 100644
--- a/tests/compiler/dart2js/resolver_test.dart
+++ b/tests/compiler/dart2js/resolver_test.dart
@@ -7,12 +7,12 @@
 import "package:async_helper/async_helper.dart";
 import 'dart:collection';
 
-import "../../../sdk/lib/_internal/compiler/implementation/resolution/resolution.dart";
+import "package:compiler/implementation/resolution/resolution.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart';
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/elements/modelx.dart';
 
 Node buildIdentifier(String name) => new Identifier(scan(name));
 
@@ -35,58 +35,61 @@
   return new VariableDefinitions(null, Modifiers.EMPTY, definitions);
 }
 
-testLocals(List variables) {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Element element = visitor.visit(createLocals(variables));
-  // A VariableDefinitions does not have an element.
-  Expect.equals(null, element);
-  Expect.equals(variables.length, map(visitor).length);
+Future testLocals(List variables) {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Element element = visitor.visit(createLocals(variables));
+    // A VariableDefinitions does not have an element.
+    Expect.equals(null, element);
+    Expect.equals(variables.length, map(visitor).length);
 
-  for (final variable in variables) {
-    final name = variable[0];
-    Identifier id = buildIdentifier(name);
-    final VariableElement variableElement = visitor.visit(id);
-    MethodScope scope = visitor.scope;
-    Expect.equals(variableElement, scope.elements[name]);
-  }
-  return compiler;
+    for (final variable in variables) {
+      final name = variable[0];
+      Identifier id = buildIdentifier(name);
+      final VariableElement variableElement = visitor.visit(id);
+      MethodScope scope = visitor.scope;
+      Expect.equals(variableElement, scope.elements[name]);
+    }
+    return compiler;
+  });
 }
 
 main() {
-  testLocalsOne();
-  testLocalsTwo();
-  testLocalsThree();
-  testLocalsFour();
-  testLocalsFive();
-  testParametersOne();
-  testFor();
-  testTypeAnnotation();
-  testSuperclass();
-  // testVarSuperclass(); // The parser crashes with 'class Foo extends var'.
-  // testOneInterface(); // Generates unexpected error message.
-  // testTwoInterfaces(); // Generates unexpected error message.
-  testFunctionExpression();
-  testNewExpression();
-  testTopLevelFields();
-  testClassHierarchy();
-  testInitializers();
-  testThis();
-  testSuperCalls();
-  testSwitch();
-  testTypeVariables();
-  testToString();
-  testIndexedOperator();
-  testIncrementsAndDecrements();
-  testOverrideHashCodeCheck();
-  testSupertypeOrder();
-  testConstructorArgumentMismatch();
-  testConstConstructorAndNonFinalFields();
+  asyncTest(() => Future.forEach([
+    testLocalsOne,
+    testLocalsTwo,
+    testLocalsThree,
+    testLocalsFour,
+    testLocalsFive,
+    testParametersOne,
+    testFor,
+    testTypeAnnotation,
+    testSuperclass,
+    // testVarSuperclass, // The parser crashes with 'class Foo extends var'.
+    // testOneInterface, // Generates unexpected error message.
+    // testTwoInterfaces, // Generates unexpected error message.
+    testFunctionExpression,
+    testNewExpression,
+    testTopLevelFields,
+    testClassHierarchy,
+    testInitializers,
+    testThis,
+    testSuperCalls,
+    testSwitch,
+    testTypeVariables,
+    testToString,
+    testIndexedOperator,
+    testIncrementsAndDecrements,
+    testOverrideHashCodeCheck,
+    testSupertypeOrder,
+    testConstConstructorAndNonFinalFields,
+  ], (f) => f()));
 }
 
-testSupertypeOrder() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("""
+Future testSupertypeOrder() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""
 class I1 {}
 class I2 {}
 class J1 extends K1 {}
@@ -98,32 +101,34 @@
 class B extends A implements J1, J2 {}
 class C extends B implements L1 {}
 """);
-  compiler.resolveStatement("C c;");
-  ClassElement classA = compiler.mainApp.find("A");
-  ClassElement classB = compiler.mainApp.find("B");
-  ClassElement classC = compiler.mainApp.find("C");
-  Expect.equals('[ I2, I1, Object ]', classA.allSupertypes.toString());
-  Expect.equals('[ A, J2, J1, I2, I1, K2, K1, Object ]',
-                classB.allSupertypes.toString());
-  Expect.equals('[ B, L1, A, J2, J1, I2, I1, K2, K1, Object ]',
-                classC.allSupertypes.toString());
-
- compiler = new MockCompiler();
-  compiler.parseScript("""
+      compiler.resolveStatement("C c;");
+      ClassElement classA = compiler.mainApp.find("A");
+      ClassElement classB = compiler.mainApp.find("B");
+      ClassElement classC = compiler.mainApp.find("C");
+      Expect.equals('[ I2, I1, Object ]', classA.allSupertypes.toString());
+      Expect.equals('[ A, J2, J1, I2, I1, K2, K1, Object ]',
+                    classB.allSupertypes.toString());
+      Expect.equals('[ B, L1, A, J2, J1, I2, I1, K2, K1, Object ]',
+                    classC.allSupertypes.toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""
 class X<T> {}
 class Foo extends X<Foo> {}
 class Bar extends Foo implements X<Bar> {}
 """);
-  compiler.resolveStatement("Bar bar;");
-  ClassElement classBar = compiler.mainApp.find("Bar");
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.MULTI_INHERITANCE,
-                compiler.errors[0].message.kind);
-  Expect.equals(0, compiler.crashes.length);
+      compiler.resolveStatement("Bar bar;");
+      ClassElement classBar = compiler.mainApp.find("Bar");
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.MULTI_INHERITANCE,
+                    compiler.errors[0].message.kind);
+      Expect.equals(0, compiler.crashes.length);
+    }),
+  ]);
 }
 
-testTypeVariables() {
+Future testTypeVariables() {
   matchResolvedTypes(visitor, text, name, expectedElements) {
     VariableDefinitions definition = parseStatement(text);
     visitor.visit(definition.type);
@@ -141,300 +146,324 @@
     Expect.equals(index, expectedElements.length);
   }
 
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  compiler.parseScript('class Foo<T, U> {}');
-  ClassElement foo = compiler.mainApp.find('Foo');
-  matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo',
-                     [compiler.intClass, compiler.stringClass]);
-  matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo',
-                     [foo, foo]);
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      ResolverVisitor visitor = compiler.resolverVisitor();
+      compiler.parseScript('class Foo<T, U> {}');
+      ClassElement foo = compiler.mainApp.find('Foo');
+      matchResolvedTypes(visitor, 'Foo<int, String> x;', 'Foo',
+                         [compiler.intClass, compiler.stringClass]);
+      matchResolvedTypes(visitor, 'Foo<Foo, Foo> x;', 'Foo',
+                         [foo, foo]);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T, U> {}');
-  compiler.resolveStatement('Foo<notype, int> x;');
-  Expect.equals(1, compiler.warnings.length);
-  Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-                compiler.warnings[0].message.kind);
-  Expect.equals(0, compiler.errors.length);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T, U> {}');
+      compiler.resolveStatement('Foo<notype, int> x;');
+      Expect.equals(1, compiler.warnings.length);
+      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
+                    compiler.warnings[0].message.kind);
+      Expect.equals(0, compiler.errors.length);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T, U> {}');
-  compiler.resolveStatement('var x = new Foo<notype, int>();');
-  Expect.equals(1, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
-                compiler.warnings[0].message.kind);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T, U> {}');
+      compiler.resolveStatement('var x = new Foo<notype, int>();');
+      Expect.equals(1, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      Expect.equals(MessageKind.CANNOT_RESOLVE_TYPE,
+                    compiler.warnings[0].message.kind);
+    }),
 
-  compiler = new MockCompiler();
-  compiler.parseScript('class Foo<T> {'
-                       '  Foo<T> t;'
-                       '  foo(Foo<T> f) {}'
-                       '  bar() { g(Foo<T> f) {}; g(); }'
-                       '}');
-  foo = compiler.mainApp.find('Foo');
-  foo.ensureResolved(compiler);
-  foo.lookupLocalMember('t').computeType(compiler);;
-  foo.lookupLocalMember('foo').computeType(compiler);;
-  compiler.resolver.resolve(foo.lookupLocalMember('bar'));
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript('class Foo<T> {'
+                           '  Foo<T> t;'
+                           '  foo(Foo<T> f) {}'
+                           '  bar() { g(Foo<T> f) {}; g(); }'
+                           '}');
+      ClassElement foo = compiler.mainApp.find('Foo');
+      foo.ensureResolved(compiler);
+      foo.lookupLocalMember('t').computeType(compiler);;
+      foo.lookupLocalMember('foo').computeType(compiler);;
+      compiler.resolver.resolve(foo.lookupLocalMember('bar'));
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+    }),
+  ]);
 }
 
-testSuperCalls() {
-  MockCompiler compiler = new MockCompiler();
-  String script = """class A { foo() {} }
-                     class B extends A { foo() => super.foo(); }""";
-  compiler.parseScript(script);
-  compiler.resolveStatement("B b;");
+Future testSuperCalls() {
+  return MockCompiler.create((MockCompiler compiler) {
+    String script = """class A { foo() {} }
+                       class B extends A { foo() => super.foo(); }""";
+    compiler.parseScript(script);
+    compiler.resolveStatement("B b;");
 
-  ClassElement classB = compiler.mainApp.find("B");
-  FunctionElement fooB = classB.lookupLocalMember("foo");
-  ClassElement classA = compiler.mainApp.find("A");
-  FunctionElement fooA = classA.lookupLocalMember("foo");
+    ClassElement classB = compiler.mainApp.find("B");
+    FunctionElement fooB = classB.lookupLocalMember("foo");
+    ClassElement classA = compiler.mainApp.find("A");
+    FunctionElement fooA = classA.lookupLocalMember("foo");
 
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, fooB,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(fooB)));
-  FunctionExpression node = fooB.parseNode(compiler);
-  visitor.visit(node.body);
-  Map mapping = map(visitor);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, fooB,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(fooB)));
+    FunctionExpression node = fooB.parseNode(compiler);
+    visitor.visit(node.body);
+    Map mapping = map(visitor);
 
-  Send superCall = node.body.asReturn().expression;
-  FunctionElement called = mapping[superCall];
-  Expect.isNotNull(called);
-  Expect.equals(fooA, called);
+    Send superCall = node.body.asReturn().expression;
+    FunctionElement called = mapping[superCall];
+    Expect.isNotNull(called);
+    Expect.equals(fooA, called);
+  });
 }
 
-testSwitch() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo { foo() {"
-      "switch (null) { case '': break; case 2: break; } } }");
-  compiler.resolveStatement("Foo foo;");
-  ClassElement fooElement = compiler.mainApp.find("Foo");
-  FunctionElement funElement = fooElement.lookupLocalMember("foo");
-  compiler.processQueue(compiler.enqueuer.resolution, funElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
-                compiler.errors[0].message.kind);
-  Expect.equals(2, compiler.infos.length);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-                compiler.infos[0].message.kind);
-  Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
-                compiler.infos[1].message.kind);
+Future testSwitch() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo { foo() {"
+        "switch (null) { case '': break; case 2: break; } } }");
+    compiler.resolveStatement("Foo foo;");
+    ClassElement fooElement = compiler.mainApp.find("Foo");
+    FunctionElement funElement = fooElement.lookupLocalMember("foo");
+    compiler.processQueue(compiler.enqueuer.resolution, funElement);
+    Expect.equals(0, compiler.warnings.length);
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL,
+                  compiler.errors[0].message.kind);
+    Expect.equals(2, compiler.infos.length);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+                  compiler.infos[0].message.kind);
+    Expect.equals(MessageKind.SWITCH_CASE_TYPES_NOT_EQUAL_CASE,
+                  compiler.infos[1].message.kind);
+  });
 }
 
-testThis() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo { foo() { return this; } }");
-  compiler.resolveStatement("Foo foo;");
-  ClassElement fooElement = compiler.mainApp.find("Foo");
-  FunctionElement funElement = fooElement.lookupLocalMember("foo");
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, funElement,
+Future testThis() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo { foo() { return this; } }");
+      compiler.resolveStatement("Foo foo;");
+      ClassElement fooElement = compiler.mainApp.find("Foo");
+      FunctionElement funElement = fooElement.lookupLocalMember("foo");
+      ResolverVisitor visitor =
+          new ResolverVisitor(compiler, funElement,
+              new ResolutionRegistry.internal(compiler,
+                  new CollectingTreeElements(funElement)));
+      FunctionExpression function = funElement.parseNode(compiler);
+      visitor.visit(function.body);
+      Map mapping = map(visitor);
+      List<Element> values = mapping.values.toList();
+      Expect.equals(0, mapping.length);
+      Expect.equals(0, compiler.warnings.length);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.resolveStatement("main() { return this; }");
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo { static foo() { return this; } }");
+      compiler.resolveStatement("Foo foo;");
+      ClassElement fooElement = compiler.mainApp.find("Foo");
+      FunctionElement funElement = fooElement.lookupLocalMember("foo");
+      ResolverVisitor visitor = new ResolverVisitor(compiler, funElement,
           new ResolutionRegistry.internal(compiler,
               new CollectingTreeElements(funElement)));
-  FunctionExpression function = funElement.parseNode(compiler);
-  visitor.visit(function.body);
-  Map mapping = map(visitor);
-  List<Element> values = mapping.values.toList();
-  Expect.equals(0, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
-
-  compiler = new MockCompiler();
-  compiler.resolveStatement("main() { return this; }");
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("class Foo { static foo() { return this; } }");
-  compiler.resolveStatement("Foo foo;");
-  fooElement = compiler.mainApp.find("Foo");
-  funElement = fooElement.lookupLocalMember("foo");
-  visitor = new ResolverVisitor(compiler, funElement,
-      new ResolutionRegistry.internal(compiler,
-          new CollectingTreeElements(funElement)));
-  function = funElement.parseNode(compiler);
-  visitor.visit(function.body);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
-                compiler.errors[0].message.kind);
+      FunctionExpression function = funElement.parseNode(compiler);
+      visitor.visit(function.body);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.NO_INSTANCE_AVAILABLE,
+                    compiler.errors[0].message.kind);
+    }),
+  ]);
 }
 
-testLocalsOne() {
-  testLocals([["foo", false]]);
-  testLocals([["foo", false], ["bar", false]]);
-  testLocals([["foo", false], ["bar", false], ["foobar", false]]);
+Future testLocalsOne() {
+  return Future.forEach([
+      () => testLocals([["foo", false]]),
+      () => testLocals([["foo", false], ["bar", false]]),
+      () => testLocals([["foo", false], ["bar", false], ["foobar", false]]),
 
-  testLocals([["foo", true]]);
-  testLocals([["foo", false], ["bar", true]]);
-  testLocals([["foo", true], ["bar", true]]);
+      () => testLocals([["foo", true]]),
+      () => testLocals([["foo", false], ["bar", true]]),
+      () => testLocals([["foo", true], ["bar", true]]),
 
-  testLocals([["foo", false], ["bar", false], ["foobar", true]]);
-  testLocals([["foo", false], ["bar", true], ["foobar", true]]);
-  testLocals([["foo", true], ["bar", true], ["foobar", true]]);
+      () => testLocals([["foo", false], ["bar", false], ["foobar", true]]),
+      () => testLocals([["foo", false], ["bar", true], ["foobar", true]]),
+      () => testLocals([["foo", true], ["bar", true], ["foobar", true]]),
 
-  MockCompiler compiler = testLocals([["foo", false], ["foo", false]]);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false),
-      compiler.errors[0].message);
+      () => testLocals([["foo", false], ["foo", false]])
+          .then((MockCompiler compiler) {
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(
+          new Message(MessageKind.DUPLICATE_DEFINITION, {'name': 'foo'}, false),
+          compiler.errors[0].message);
+    })], (f) => f());
 }
 
 
-testLocalsTwo() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(2, map(visitor).length);
+Future testLocalsTwo() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("if (true) { var a = 1; var b = 2; }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(2, map(visitor).length);
 
-  List<Element> elements = new List<Element>.from(map(visitor).values);
-  Expect.notEquals(elements[0], elements[1]);
+    List<Element> elements = new List<Element>.from(map(visitor).values);
+    Expect.notEquals(elements[0], elements[1]);
+  });
 }
 
-testLocalsThree() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(3, map(visitor).length);
-  List<Element> elements = map(visitor).values.toList();
-  Expect.equals(elements[0], elements[1]);
+Future testLocalsThree() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("{ var a = 1; if (true) { a; } }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(3, map(visitor).length);
+    List<Element> elements = map(visitor).values.toList();
+    Expect.equals(elements[0], elements[1]);
+  });
 }
 
-testLocalsFour() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(2, map(visitor).length);
-  List<Element> elements = map(visitor).values.toList();
-  Expect.notEquals(elements[0], elements[1]);
+Future testLocalsFour() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Node tree = parseStatement("{ var a = 1; if (true) { var a = 1; } }");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(2, map(visitor).length);
+    List<Element> elements = map(visitor).values.toList();
+    Expect.notEquals(elements[0], elements[1]);
+  });
 }
 
-testLocalsFive() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  If tree = parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
-  Element element = visitor.visit(tree);
-  Expect.equals(null, element);
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(6, map(visitor).length);
+Future testLocalsFive() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    If tree =
+        parseStatement("if (true) { var a = 1; a; } else { var a = 2; a;}");
+    Element element = visitor.visit(tree);
+    Expect.equals(null, element);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(6, map(visitor).length);
 
-  Block thenPart = tree.thenPart;
-  List statements1 = thenPart.statements.nodes.toList();
-  Node def1 = statements1[0].definitions.nodes.head;
-  Node id1 = statements1[1].expression;
-  Expect.equals(visitor.registry.mapping[def1], visitor.registry.mapping[id1]);
+    Block thenPart = tree.thenPart;
+    List statements1 = thenPart.statements.nodes.toList();
+    Node def1 = statements1[0].definitions.nodes.head;
+    Node id1 = statements1[1].expression;
+    Expect.equals(visitor.registry.mapping[def1],
+                  visitor.registry.mapping[id1]);
 
-  Block elsePart = tree.elsePart;
-  List statements2 = elsePart.statements.nodes.toList();
-  Node def2 = statements2[0].definitions.nodes.head;
-  Node id2 = statements2[1].expression;
-  Expect.equals(visitor.registry.mapping[def2], visitor.registry.mapping[id2]);
+    Block elsePart = tree.elsePart;
+    List statements2 = elsePart.statements.nodes.toList();
+    Node def2 = statements2[0].definitions.nodes.head;
+    Node id2 = statements2[1].expression;
+    Expect.equals(visitor.registry.mapping[def2],
+                  visitor.registry.mapping[id2]);
 
-  Expect.notEquals(visitor.registry.mapping[def1],
-                   visitor.registry.mapping[def2]);
-  Expect.notEquals(visitor.registry.mapping[id1],
-                   visitor.registry.mapping[id2]);
+    Expect.notEquals(visitor.registry.mapping[def1],
+                     visitor.registry.mapping[def2]);
+    Expect.notEquals(visitor.registry.mapping[id1],
+                     visitor.registry.mapping[id2]);
+  });
 }
 
-testParametersOne() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  FunctionExpression tree =
-      parseFunction("void foo(int a) { return a; }", compiler);
-  visitor.visit(tree);
+Future testParametersOne() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    FunctionExpression tree =
+        parseFunction("void foo(int a) { return a; }", compiler);
+    visitor.visit(tree);
 
-  // Check that an element has been created for the parameter.
-  VariableDefinitions vardef = tree.parameters.nodes.head;
-  Node param = vardef.definitions.nodes.head;
-  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
+    // Check that an element has been created for the parameter.
+    VariableDefinitions vardef = tree.parameters.nodes.head;
+    Node param = vardef.definitions.nodes.head;
+    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[param].kind);
 
-  // Check that 'a' in 'return a' is resolved to the parameter.
-  Block body = tree.body;
-  Return ret = body.statements.nodes.head;
-  Send use = ret.expression;
-  Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
-  Expect.equals(visitor.registry.mapping[param], visitor.registry.mapping[use]);
+    // Check that 'a' in 'return a' is resolved to the parameter.
+    Block body = tree.body;
+    Return ret = body.statements.nodes.head;
+    Send use = ret.expression;
+    Expect.equals(ElementKind.PARAMETER, visitor.registry.mapping[use].kind);
+    Expect.equals(visitor.registry.mapping[param],
+                  visitor.registry.mapping[use]);
+  });
 }
 
-testFor() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }");
-  visitor.visit(tree);
+Future testFor() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    For tree = parseStatement("for (int i = 0; i < 10; i = i + 1) { i = 5; }");
+    visitor.visit(tree);
 
-  MethodScope scope = visitor.scope;
-  Expect.equals(0, scope.elements.length);
-  Expect.equals(10, map(visitor).length);
+    MethodScope scope = visitor.scope;
+    Expect.equals(0, scope.elements.length);
+    Expect.equals(10, map(visitor).length);
 
-  VariableDefinitions initializer = tree.initializer;
-  Node iNode = initializer.definitions.nodes.head;
-  Element iElement = visitor.registry.mapping[iNode];
+    VariableDefinitions initializer = tree.initializer;
+    Node iNode = initializer.definitions.nodes.head;
+    Element iElement = visitor.registry.mapping[iNode];
 
-  // Check that we have the expected nodes. This test relies on the mapping
-  // field to be a linked hash map (preserving insertion order).
-  Expect.isTrue(map(visitor) is LinkedHashMap);
-  List<Node> nodes = map(visitor).keys.toList();
-  List<Element> elements = map(visitor).values.toList();
+    // Check that we have the expected nodes. This test relies on the mapping
+    // field to be a linked hash map (preserving insertion order).
+    Expect.isTrue(map(visitor) is LinkedHashMap);
+    List<Node> nodes = map(visitor).keys.toList();
+    List<Element> elements = map(visitor).values.toList();
 
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //      ^^^
-  Expect.isTrue(nodes[0] is TypeAnnotation);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //      ^^^
+    Expect.isTrue(nodes[0] is TypeAnnotation);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //          ^^^^^
-  checkSendSet(iElement, nodes[1], elements[1]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //          ^^^^^
+    checkSendSet(iElement, nodes[1], elements[1]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                 ^
-  checkIdentifier(iElement, nodes[2], elements[2]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                 ^
+    checkIdentifier(iElement, nodes[2], elements[2]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                 ^
-  checkSend(iElement, nodes[3], elements[3]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                 ^
+    checkSend(iElement, nodes[3], elements[3]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                         ^
-  checkIdentifier(iElement, nodes[4], elements[4]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                         ^
+    checkIdentifier(iElement, nodes[4], elements[4]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                             ^
-  checkIdentifier(iElement, nodes[5], elements[5]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                             ^
+    checkIdentifier(iElement, nodes[5], elements[5]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                             ^
-  checkSend(iElement, nodes[6], elements[6]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                             ^
+    checkSend(iElement, nodes[6], elements[6]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                         ^^^^^^^^^
-  checkSendSet(iElement, nodes[7], elements[7]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                         ^^^^^^^^^
+    checkSendSet(iElement, nodes[7], elements[7]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                                      ^
-  checkIdentifier(iElement, nodes[8], elements[8]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                                      ^
+    checkIdentifier(iElement, nodes[8], elements[8]);
 
-  // for (int i = 0; i < 10; i = i + 1) { i = 5; };
-  //                                      ^^^^^
-  checkSendSet(iElement, nodes[9], elements[9]);
+    // for (int i = 0; i < 10; i = i + 1) { i = 5; };
+    //                                      ^^^^^
+    checkSendSet(iElement, nodes[9], elements[9]);
+  });
 }
 
 checkIdentifier(Element expected, Node node, Element actual) {
@@ -453,431 +482,459 @@
   Expect.equals(expected, actual);
 }
 
-testTypeAnnotation() {
-  MockCompiler compiler = new MockCompiler();
-  String statement = "Foo bar;";
+Future testTypeAnnotation() {
+  return MockCompiler.create((MockCompiler compiler) {
+    String statement = "Foo bar;";
 
-  // Test that we get a warning when Foo is not defined.
-  Map mapping = compiler.resolveStatement(statement).map;
+    // Test that we get a warning when Foo is not defined.
+    Map mapping = compiler.resolveStatement(statement).map;
 
-  Expect.equals(2, mapping.length); // Both Foo and bar have an element.
-  Expect.equals(1, compiler.warnings.length);
+    Expect.equals(2, mapping.length); // Both Foo and bar have an element.
+    Expect.equals(1, compiler.warnings.length);
 
-  Node warningNode = compiler.warnings[0].node;
+    Node warningNode = compiler.warnings[0].node;
 
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE,  {'typeName': 'Foo'}, false),
-      compiler.warnings[0].message);
-  VariableDefinitions definition = compiler.parsedTree;
-  Expect.equals(warningNode, definition.type);
-  compiler.clearMessages();
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE,  {'typeName': 'Foo'}, false),
+        compiler.warnings[0].message);
+    VariableDefinitions definition = compiler.parsedTree;
+    Expect.equals(warningNode, definition.type);
+    compiler.clearMessages();
 
-  // Test that there is no warning after defining Foo.
-  compiler.parseScript("class Foo {}");
-  mapping = compiler.resolveStatement(statement).map;
-  Expect.equals(2, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
+    // Test that there is no warning after defining Foo.
+    compiler.parseScript("class Foo {}");
+    mapping = compiler.resolveStatement(statement).map;
+    Expect.equals(2, mapping.length);
+    Expect.equals(0, compiler.warnings.length);
 
-  // Test that 'var' does not create a warning.
-  mapping = compiler.resolveStatement("var foo;").map;
-  Expect.equals(1, mapping.length);
-  Expect.equals(0, compiler.warnings.length);
-}
-
-testSuperclass() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends Bar {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  var cannotResolveBar = new Message(MessageKind.CANNOT_EXTEND_MALFORMED,
-                                     {'typeName': 'Bar'}, false);
-  Expect.equals(cannotResolveBar, compiler.errors[0].message);
-  compiler.clearMessages();
-
-  compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends Bar {}");
-  compiler.parseScript("class Bar {}");
-  Map mapping = compiler.resolveStatement("Foo bar;").map;
-  Expect.equals(2, mapping.length);
-
-  ClassElement fooElement = compiler.mainApp.find('Foo');
-  ClassElement barElement = compiler.mainApp.find('Bar');
-  Expect.equals(barElement.computeType(compiler),
-                fooElement.supertype);
-  Expect.isTrue(fooElement.interfaces.isEmpty);
-  Expect.isTrue(barElement.interfaces.isEmpty);
-}
-
-testVarSuperclass() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo extends var {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'var'}, false),
-      compiler.errors[0].message);
-  compiler.clearMessages();
-}
-
-testOneInterface() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class Foo implements Bar {}");
-  compiler.resolveStatement("Foo bar;");
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(
-      new Message(
-          MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'bar'}, false),
-      compiler.errors[0].message);
-  compiler.clearMessages();
-
-  // Add the abstract class to the world and make sure everything is setup
-  // correctly.
-  compiler.parseScript("abstract class Bar {}");
-
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, null,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(null)));
-  compiler.resolveStatement("Foo bar;");
-
-  ClassElement fooElement = compiler.mainApp.find('Foo');
-  ClassElement barElement = compiler.mainApp.find('Bar');
-
-  Expect.equals(null, barElement.supertype);
-  Expect.isTrue(barElement.interfaces.isEmpty);
-
-  Expect.equals(barElement.computeType(compiler),
-                fooElement.interfaces.head);
-  Expect.equals(1, length(fooElement.interfaces));
-}
-
-testTwoInterfaces() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript(
-      "abstract class I1 {} abstract class I2 {} class C implements I1, I2 {}");
-  compiler.resolveStatement("Foo bar;");
-
-  ClassElement c = compiler.mainApp.find('C');
-  Element i1 = compiler.mainApp.find('I1');
-  Element i2 = compiler.mainApp.find('I2');
-
-  Expect.equals(2, length(c.interfaces));
-  Expect.equals(i1.computeType(compiler), at(c.interfaces, 0));
-  Expect.equals(i2.computeType(compiler), at(c.interfaces, 1));
-}
-
-testFunctionExpression() {
-  MockCompiler compiler = new MockCompiler();
-  ResolverVisitor visitor = compiler.resolverVisitor();
-  Map mapping = compiler.resolveStatement("int f() {}").map;
-  Expect.equals(3, mapping.length);
-  Element element;
-  Node node;
-  mapping.forEach((Node n, Element e) {
-    if (n is FunctionExpression) {
-      element = e;
-      node = n;
-    }
+    // Test that 'var' does not create a warning.
+    mapping = compiler.resolveStatement("var foo;").map;
+    Expect.equals(1, mapping.length);
+    Expect.equals(0, compiler.warnings.length);
   });
-  Expect.equals(ElementKind.FUNCTION, element.kind);
-  Expect.equals('f', element.name);
-  Expect.equals(element.parseNode(compiler), node);
 }
 
-testNewExpression() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("class A {} foo() { print(new A()); }");
-  ClassElement aElement = compiler.mainApp.find('A');
-  FunctionElement fooElement = compiler.mainApp.find('foo');
-  Expect.isNotNull(aElement);
-  Expect.isNotNull(fooElement);
+Future testSuperclass() {
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo extends Bar {}");
+      compiler.resolveStatement("Foo bar;");
+      Expect.equals(1, compiler.errors.length);
+      var cannotResolveBar = new Message(MessageKind.CANNOT_EXTEND_MALFORMED,
+          {'className': 'Foo', 'malformedType': 'Bar'}, false);
+      Expect.equals(cannotResolveBar, compiler.errors[0].message);
+      compiler.clearMessages();
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("class Foo extends Bar {}");
+      compiler.parseScript("class Bar {}");
+      Map mapping = compiler.resolveStatement("Foo bar;").map;
+      Expect.equals(2, mapping.length);
 
-  fooElement.parseNode(compiler);
-  compiler.resolver.resolve(fooElement);
-
-  TreeElements elements = compiler.resolveStatement("new A();");
-  NewExpression expression =
-      compiler.parsedTree.asExpressionStatement().expression;
-  Element element = elements[expression.send];
-  Expect.equals(ElementKind.GENERATIVE_CONSTRUCTOR, element.kind);
-  Expect.isTrue(element.isSynthesized);
+      ClassElement fooElement = compiler.mainApp.find('Foo');
+      ClassElement barElement = compiler.mainApp.find('Bar');
+      Expect.equals(barElement.computeType(compiler),
+                    fooElement.supertype);
+      Expect.isTrue(fooElement.interfaces.isEmpty);
+      Expect.isTrue(barElement.interfaces.isEmpty);
+    }),
+  ]);
 }
 
-testConstructorArgumentMismatch() {
-  String script = "class A {} foo() { print(new A(42)); }";
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript(script);
-  FunctionElement fooElement = compiler.mainApp.find('foo');
-  Expect.isNotNull(fooElement);
-  fooElement.parseNode(compiler);
-  compiler.resolver.resolve(fooElement);
-
-  compareWarningKinds(
-      script, [MessageKind.INVALID_ARGUMENTS], compiler.warnings);
-  compareWarningKinds(script, [], compiler.errors);
+Future testVarSuperclass() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo extends var {}");
+    compiler.resolveStatement("Foo bar;");
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'var'}, false),
+        compiler.errors[0].message);
+    compiler.clearMessages();
+  });
 }
 
-testTopLevelFields() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("int a;");
-  VariableElementX element = compiler.mainApp.find("a");
-  Expect.equals(ElementKind.FIELD, element.kind);
-  VariableDefinitions node = element.variables.parseNode(element, compiler);
-  Identifier typeName = node.type.typeName;
-  Expect.equals(typeName.source, 'int');
+Future testOneInterface() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class Foo implements Bar {}");
+    compiler.resolveStatement("Foo bar;");
+    Expect.equals(1, compiler.errors.length);
+    Expect.equals(
+        new Message(
+            MessageKind.CANNOT_RESOLVE_TYPE, {'typeName': 'bar'}, false),
+        compiler.errors[0].message);
+    compiler.clearMessages();
 
-  compiler.parseScript("var b, c;");
-  VariableElementX bElement = compiler.mainApp.find("b");
-  VariableElementX cElement = compiler.mainApp.find("c");
-  Expect.equals(ElementKind.FIELD, bElement.kind);
-  Expect.equals(ElementKind.FIELD, cElement.kind);
-  Expect.isTrue(bElement != cElement);
+    // Add the abstract class to the world and make sure everything is setup
+    // correctly.
+    compiler.parseScript("abstract class Bar {}");
 
-  VariableDefinitions bNode = bElement.variables.parseNode(bElement, compiler);
-  VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
-  Expect.equals(bNode, cNode);
-  Expect.isNull(bNode.type);
-  Expect.isTrue(bNode.modifiers.isVar);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, null,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(null)));
+    compiler.resolveStatement("Foo bar;");
+
+    ClassElement fooElement = compiler.mainApp.find('Foo');
+    ClassElement barElement = compiler.mainApp.find('Bar');
+
+    Expect.equals(null, barElement.supertype);
+    Expect.isTrue(barElement.interfaces.isEmpty);
+
+    Expect.equals(barElement.computeType(compiler),
+                  fooElement.interfaces.head);
+    Expect.equals(1, length(fooElement.interfaces));
+  });
 }
 
-resolveConstructor(String script, String statement, String className,
-                   String constructor, int expectedElementCount,
-                   {List expectedWarnings: const [],
-                    List expectedErrors: const [],
-                    List expectedInfos: const [],
-                    String corelib: DEFAULT_CORELIB}) {
-  MockCompiler compiler = new MockCompiler(coreSource: corelib);
-  compiler.parseScript(script);
-  compiler.resolveStatement(statement);
-  ClassElement classElement = compiler.mainApp.find(className);
-  Element element;
-  if (constructor != '') {
-    element = classElement.lookupConstructor(
-        new Selector.callConstructor(constructor, classElement.library));
-  } else {
-    element = classElement.lookupConstructor(
-        new Selector.callDefaultConstructor(classElement.library));
-  }
+Future testTwoInterfaces() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript(
+        """abstract class I1 {} 
+           abstract class I2 {} 
+           class C implements I1, I2 {}""");
+    compiler.resolveStatement("Foo bar;");
 
-  FunctionExpression tree = element.parseNode(compiler);
-  ResolverVisitor visitor =
-      new ResolverVisitor(compiler, element,
-          new ResolutionRegistry.internal(compiler,
-              new CollectingTreeElements(element)));
-  new InitializerResolver(visitor).resolveInitializers(element, tree);
-  visitor.visit(tree.body);
-  Expect.equals(expectedElementCount, map(visitor).length);
+    ClassElement c = compiler.mainApp.find('C');
+    Element i1 = compiler.mainApp.find('I1');
+    Element i2 = compiler.mainApp.find('I2');
 
-  compareWarningKinds(script, expectedWarnings, compiler.warnings);
-  compareWarningKinds(script, expectedErrors, compiler.errors);
-  compareWarningKinds(script, expectedInfos, compiler.infos);
+    Expect.equals(2, length(c.interfaces));
+    Expect.equals(i1.computeType(compiler), at(c.interfaces, 0));
+    Expect.equals(i2.computeType(compiler), at(c.interfaces, 1));
+  });
 }
 
-testClassHierarchy() {
+Future testFunctionExpression() {
+  return MockCompiler.create((MockCompiler compiler) {
+    ResolverVisitor visitor = compiler.resolverVisitor();
+    Map mapping = compiler.resolveStatement("int f() {}").map;
+    Expect.equals(3, mapping.length);
+    Element element;
+    Node node;
+    mapping.forEach((Node n, Element e) {
+      if (n is FunctionExpression) {
+        element = e;
+        node = n;
+      }
+    });
+    Expect.equals(ElementKind.FUNCTION, element.kind);
+    Expect.equals('f', element.name);
+    Expect.equals(element.parseNode(compiler), node);
+  });
+}
+
+Future testNewExpression() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("class A {} foo() { print(new A()); }");
+    ClassElement aElement = compiler.mainApp.find('A');
+    FunctionElement fooElement = compiler.mainApp.find('foo');
+    Expect.isNotNull(aElement);
+    Expect.isNotNull(fooElement);
+
+    fooElement.parseNode(compiler);
+    compiler.resolver.resolve(fooElement);
+
+    TreeElements elements = compiler.resolveStatement("new A();");
+    NewExpression expression =
+        compiler.parsedTree.asExpressionStatement().expression;
+    Element element = elements[expression.send];
+    Expect.equals(ElementKind.GENERATIVE_CONSTRUCTOR, element.kind);
+    Expect.isTrue(element.isSynthesized);
+  });
+}
+
+Future testTopLevelFields() {
+  return MockCompiler.create((MockCompiler compiler) {
+    compiler.parseScript("int a;");
+    VariableElementX element = compiler.mainApp.find("a");
+    Expect.equals(ElementKind.FIELD, element.kind);
+    VariableDefinitions node = element.variables.parseNode(element, compiler);
+    Identifier typeName = node.type.typeName;
+    Expect.equals(typeName.source, 'int');
+
+    compiler.parseScript("var b, c;");
+    VariableElementX bElement = compiler.mainApp.find("b");
+    VariableElementX cElement = compiler.mainApp.find("c");
+    Expect.equals(ElementKind.FIELD, bElement.kind);
+    Expect.equals(ElementKind.FIELD, cElement.kind);
+    Expect.isTrue(bElement != cElement);
+
+    VariableDefinitions bNode = bElement.variables.parseNode(bElement, compiler);
+    VariableDefinitions cNode = cElement.variables.parseNode(cElement, compiler);
+    Expect.equals(bNode, cNode);
+    Expect.isNull(bNode.type);
+    Expect.isTrue(bNode.modifiers.isVar);
+  });
+}
+
+Future resolveConstructor(
+    String script, String statement, String className,
+    String constructor, int expectedElementCount,
+    {List expectedWarnings: const [],
+     List expectedErrors: const [],
+     List expectedInfos: const [],
+     String corelib: DEFAULT_CORELIB}) {
+  MockCompiler compiler = new MockCompiler.internal(coreSource: corelib);
+  return compiler.init().then((_) {
+    compiler.parseScript(script);
+    compiler.resolveStatement(statement);
+    ClassElement classElement = compiler.mainApp.find(className);
+    Element element;
+    if (constructor != '') {
+      element = classElement.lookupConstructor(
+          new Selector.callConstructor(constructor, classElement.library));
+    } else {
+      element = classElement.lookupConstructor(
+          new Selector.callDefaultConstructor(classElement.library));
+    }
+
+    FunctionExpression tree = element.parseNode(compiler);
+    ResolverVisitor visitor =
+        new ResolverVisitor(compiler, element,
+            new ResolutionRegistry.internal(compiler,
+                new CollectingTreeElements(element)));
+    new InitializerResolver(visitor).resolveInitializers(element, tree);
+    visitor.visit(tree.body);
+    Expect.equals(expectedElementCount, map(visitor).length);
+
+    compareWarningKinds(script, expectedWarnings, compiler.warnings);
+    compareWarningKinds(script, expectedErrors, compiler.errors);
+    compareWarningKinds(script, expectedInfos, compiler.infos);
+  });
+}
+
+Future testClassHierarchy() {
   final MAIN = "main";
-  MockCompiler compiler = new MockCompiler();
-  compiler.parseScript("""class A extends A {}
-                          main() { return new A(); }""");
-  FunctionElement mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A extends B {}
-                          class B extends A {}
-                          main() { return new A(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(2, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-  Expect.equals(MessageKind.CANNOT_FIND_CONSTRUCTOR,
-                compiler.errors[1].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""abstract class A extends B {}
-                          abstract class B extends A {}
-                          class C implements A {}
-                          main() { return new C(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
-                compiler.errors[0].message.kind);
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A extends B {}
-                          class B extends C {}
-                          class C {}
-                          main() { return new A(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  ClassElement aElement = compiler.mainApp.find("A");
-  Link<DartType> supertypes = aElement.allSupertypes;
-  Expect.equals(<String>['B', 'C', 'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class B<Z,W> extends A<int> implements I<Z,List<W>> {}
-                          class I<X,Y> {}
-                          class C extends B<bool,String> {}
-                          main() { return new C(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  aElement = compiler.mainApp.find("C");
-  supertypes = aElement.allSupertypes;
-  // Object is once per inheritance path, that is from both A and I.
-  Expect.equals(<String>['A<int>', 'B<bool, String>', 'I<bool, List<String>>',
-                         'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class D extends A<E> {}
-                          class E extends D {}
-                          main() { return new E(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(0, compiler.errors.length);
-  aElement = compiler.mainApp.find("E");
-  supertypes = aElement.allSupertypes;
-  Expect.equals(<String>['A<E>', 'D', 'Object'].toString(),
-                asSortedStrings(supertypes).toString());
-
-  compiler = new MockCompiler();
-  compiler.parseScript("""class A<T> {}
-                          class D extends A<int> implements A<double> {}
-                          main() { return new D(); }""");
-  mainElement = compiler.mainApp.find(MAIN);
-  compiler.resolver.resolve(mainElement);
-  Expect.equals(0, compiler.warnings.length);
-  Expect.equals(1, compiler.errors.length);
-  Expect.equals(MessageKind.MULTI_INHERITANCE,
-                compiler.errors[0].message.kind);
-  Expect.equals(0, compiler.crashes.length);
+  return Future.wait([
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends A {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends B {}
+                              class B extends A {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(2, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+      Expect.equals(MessageKind.CANNOT_FIND_CONSTRUCTOR,
+                    compiler.errors[1].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""abstract class A extends B {}
+                              abstract class B extends A {}
+                              class C implements A {}
+                              main() { return new C(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.CYCLIC_CLASS_HIERARCHY,
+                    compiler.errors[0].message.kind);
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A extends B {}
+                              class B extends C {}
+                              class C {}
+                              main() { return new A(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("A");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      Expect.equals(<String>['B', 'C', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class B<Z,W> extends A<int> 
+                                  implements I<Z,List<W>> {}
+                              class I<X,Y> {}
+                              class C extends B<bool,String> {}
+                              main() { return new C(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("C");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      // Object is once per inheritance path, that is from both A and I.
+      Expect.equals(<String>['A<int>', 'B<bool, String>',
+                             'I<bool, List<String>>', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class D extends A<E> {}
+                              class E extends D {}
+                              main() { return new E(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(0, compiler.errors.length);
+      ClassElement aElement = compiler.mainApp.find("E");
+      Link<DartType> supertypes = aElement.allSupertypes;
+      Expect.equals(<String>['A<E>', 'D', 'Object'].toString(),
+                    asSortedStrings(supertypes).toString());
+    }),
+    MockCompiler.create((MockCompiler compiler) {
+      compiler.parseScript("""class A<T> {}
+                              class D extends A<int> implements A<double> {}
+                              main() { return new D(); }""");
+      FunctionElement mainElement = compiler.mainApp.find(MAIN);
+      compiler.resolver.resolve(mainElement);
+      Expect.equals(0, compiler.warnings.length);
+      Expect.equals(1, compiler.errors.length);
+      Expect.equals(MessageKind.MULTI_INHERITANCE,
+                    compiler.errors[0].message.kind);
+      Expect.equals(0, compiler.crashes.length);
+    }),
+  ]);
 }
 
-testInitializers() {
-  String script;
-  script = """class A {
-                int foo; int bar;
-                A() : this.foo = 1, bar = 2;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 2);
-
-  script = """class A {
-                int foo; A a;
-                A() : a.foo = 1;
-                }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors:
-                         [MessageKind.INVALID_RECEIVER_IN_INITIALIZER]);
-
-  script = """class A {
-                int foo;
-                A() : this.foo = 1, this.foo = 2;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 2,
-                     expectedInfos: [MessageKind.ALREADY_INITIALIZED],
-                     expectedErrors: [MessageKind.DUPLICATE_INITIALIZER]);
-
-  script = """class A {
-                A() : this.foo = 1;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.CANNOT_RESOLVE]);
-
-  script = """class A {
-                int foo;
-                int bar;
-                A() : this.foo = bar;
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 3,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]);
-
-  script = """class A {
-                int foo() => 42;
-                A() : foo();
-              }""";
-  resolveConstructor(script, "A a = new A();", "A", "", 0,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.CONSTRUCTOR_CALL_EXPECTED]);
-
-  script = """class A {
-                int i;
-                A.a() : this.b(0);
-                A.b(int i);
-              }""";
-  resolveConstructor(script, "A a = new A.a();", "A", "a", 1);
-
-  script = """class A {
-                int i;
-                A.a() : i = 42, this(0);
-                A(int i);
-              }""";
-  resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
-                     expectedWarnings: [],
-                     expectedErrors:
-                         [MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER]);
-
-  script = """class A {
-                int i;
-                A(i);
-              }
-              class B extends A {
-                B() : super(0);
-              }""";
-  resolveConstructor(script, "B a = new B();", "B", "", 1);
-
-  script = """class A {
-                int i;
-                A(i);
-              }
-              class B extends A {
-                B() : super(0), super(1);
-              }""";
-  resolveConstructor(script, "B b = new B();", "B", "", 2,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.DUPLICATE_SUPER_INITIALIZER]);
-
-  script = "";
-  final String CORELIB_WITH_INVALID_OBJECT =
-      '''print(var obj) {}
-         class int {}
-         class double {}
-         class bool {}
-         class String {}
-         class num {}
-         class Function {}
-         class List<E> {}
-         class Map {}
-         class Closure {}
-         class Null {}
-         class StackTrace {}
-         class Dynamic_ {}
-         class Type {}
-         class Object { Object() : super(); }
-         const proxy = 0;''';
-  resolveConstructor(script, "Object o = new Object();", "Object", "", 1,
-                     expectedWarnings: [],
-                     expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
-                     corelib: CORELIB_WITH_INVALID_OBJECT);
+Future testInitializers() {
+  return Future.forEach([
+    () {
+      String script =
+          """class A {
+                    int foo; int bar;
+                    A() : this.foo = 1, bar = 2;
+                  }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 2);
+    },
+    () {
+      String script =
+          """class A {
+               int foo; A a;
+               A() : a.foo = 1;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.INVALID_RECEIVER_IN_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo;
+               A() : this.foo = 1, this.foo = 2;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 2,
+          expectedInfos: [MessageKind.ALREADY_INITIALIZED],
+          expectedErrors: [MessageKind.DUPLICATE_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               A() : this.foo = 1;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.CANNOT_RESOLVE]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo;
+               int bar;
+               A() : this.foo = bar;
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 3,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.NO_INSTANCE_AVAILABLE]);
+    },
+    () {
+      String script =
+          """class A {
+               int foo() => 42;
+               A() : foo();
+             }""";
+      return resolveConstructor(script, "A a = new A();", "A", "", 0,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.CONSTRUCTOR_CALL_EXPECTED]);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A.a() : this.b(0);
+               A.b(int i);
+             }""";
+      return resolveConstructor(script, "A a = new A.a();", "A", "a", 1);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A.a() : i = 42, this(0);
+               A(int i);
+             }""";
+      return resolveConstructor(script, "A a = new A.a();", "A", "a", 2,
+          expectedWarnings: [],
+          expectedErrors:
+              [MessageKind.REDIRECTING_CONSTRUCTOR_HAS_INITIALIZER]);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A(i);
+             }
+             class B extends A {
+               B() : super(0);
+             }""";
+      return resolveConstructor(script, "B a = new B();", "B", "", 1);
+    },
+    () {
+      String script =
+          """class A {
+               int i;
+               A(i);
+             }
+             class B extends A {
+               B() : super(0), super(1);
+             }""";
+      return resolveConstructor(script, "B b = new B();", "B", "", 2,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.DUPLICATE_SUPER_INITIALIZER]);
+    },
+    () {
+      String script = "";
+      final String CORELIB_WITH_INVALID_OBJECT =
+          '''print(var obj) {}
+             class int {}
+             class double {}
+             class bool {}
+             class String {}
+             class num {}
+             class Function {}
+             class List<E> {}
+             class Map {}
+             class Closure {}
+             class Null {}
+             class StackTrace {}
+             class Dynamic_ {}
+             class Type {}
+             class Object { Object() : super(); }
+             const proxy = 0;''';
+      return resolveConstructor(script,
+          "Object o = new Object();", "Object", "", 1,
+          expectedWarnings: [],
+          expectedErrors: [MessageKind.SUPER_INITIALIZER_IN_OBJECT],
+          corelib: CORELIB_WITH_INVALID_OBJECT);
+    },
+  ], (f) => f());
 }
 
 map(ResolverVisitor visitor) {
@@ -907,8 +964,8 @@
   ClassElement cls = findElement(compiler, className);
   Element memberElement = cls.lookupLocalMember(memberName);
   Expect.isNotNull(memberElement);
-  Expect.isNotNull(
-      compiler.enqueuer.resolution.getCachedElements(memberElement));
+  Expect.isTrue(
+      compiler.enqueuer.resolution.hasBeenResolved(memberElement));
 }
 
 testToString() {
diff --git a/tests/compiler/dart2js/scanner_offset_length_test.dart b/tests/compiler/dart2js/scanner_offset_length_test.dart
index 798057d..531be7b 100644
--- a/tests/compiler/dart2js/scanner_offset_length_test.dart
+++ b/tests/compiler/dart2js/scanner_offset_length_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
 
 Token scan(String text) =>
     new StringScanner.fromString(text, includeComments: true).tokenize();
diff --git a/tests/compiler/dart2js/scanner_test.dart b/tests/compiler/dart2js/scanner_test.dart
index 2945bd5..11d5133 100644
--- a/tests/compiler/dart2js/scanner_test.dart
+++ b/tests/compiler/dart2js/scanner_test.dart
@@ -3,8 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/characters.dart';
+import 'package:compiler/implementation/scanner/scannerlib.dart';
+import 'package:compiler/implementation/util/characters.dart';
 import 'dart:typed_data';
 
 Token scan(List<int> bytes) => new Utf8BytesScanner.fromBytes(bytes).tokenize();
diff --git a/tests/compiler/dart2js/setlet_test.dart b/tests/compiler/dart2js/setlet_test.dart
index d57d64a..c4dc493 100644
--- a/tests/compiler/dart2js/setlet_test.dart
+++ b/tests/compiler/dart2js/setlet_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import 'dart:collection';
-import '../../../sdk/lib/_internal/compiler/implementation/util/setlet.dart';
+import 'package:compiler/implementation/util/setlet.dart';
 
 main() {
   for (int i = 1; i <= 32; i++) {
diff --git a/tests/compiler/dart2js/simple_function_subtype_test.dart b/tests/compiler/dart2js/simple_function_subtype_test.dart
index 7329598..3997dea 100644
--- a/tests/compiler/dart2js/simple_function_subtype_test.dart
+++ b/tests/compiler/dart2js/simple_function_subtype_test.dart
@@ -5,7 +5,9 @@
 // Test that simple function subtype checks use predicates.
 
 library simple_function_subtype_test;
-import "package:expect/expect.dart";
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST = r"""
@@ -49,12 +51,13 @@
 """;
 
 main() {
-  String generated = compile(TEST, entry: 'foo');
-  for (int i = 0 ; i <= 15  ; i++) {
-    String predicateCheck = '.\$is_args$i';
-    Expect.isTrue(generated.contains(predicateCheck),
-      'Expected predicate check $predicateCheck');
-  }
-  Expect.isFalse(generated.contains('checkFunctionSubtype'),
-    'Unexpected use of checkFunctionSubtype');
+  asyncTest(() => compile(TEST, entry: 'foo', check: (String generated) {
+    for (int i = 0 ; i <= 15  ; i++) {
+      String predicateCheck = '.\$is_args$i';
+      Expect.isTrue(generated.contains(predicateCheck),
+        'Expected predicate check $predicateCheck');
+    }
+    Expect.isFalse(generated.contains('checkFunctionSubtype'),
+      'Unexpected use of checkFunctionSubtype');
+  }));
 }
\ No newline at end of file
diff --git a/tests/compiler/dart2js/simple_inferrer_callers_test.dart b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
index 165dc18..115ccc5 100644
--- a/tests/compiler/dart2js/simple_inferrer_callers_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_callers_test.dart
@@ -7,8 +7,8 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/inferrer/type_graph_inferrer.dart';
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/inferrer/type_graph_inferrer.dart';
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_relations_test.dart b/tests/compiler/dart2js/simple_inferrer_relations_test.dart
index 313154a..70706e2 100644
--- a/tests/compiler/dart2js/simple_inferrer_relations_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_relations_test.dart
@@ -4,9 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
-    show TypeMask;
+import 'package:compiler/implementation/types/types.dart' show TypeMask;
 
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_test.dart b/tests/compiler/dart2js/simple_inferrer_test.dart
index 10d4d66..18409d8 100644
--- a/tests/compiler/dart2js/simple_inferrer_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_test.dart
@@ -4,9 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import
-    '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
-    show TypeMask;
+import 'package:compiler/implementation/types/types.dart' show TypeMask;
 import 'type_mask_test_helper.dart';
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
index 10aedf9..bf7f0fe 100644
--- a/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
+++ b/tests/compiler/dart2js/simple_inferrer_try_catch_test.dart
@@ -4,7 +4,7 @@
 
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart'
+import 'package:compiler/implementation/types/types.dart'
     show TypeMask;
 
 import 'compiler_helper.dart';
diff --git a/tests/compiler/dart2js/size_test.dart b/tests/compiler/dart2js/size_test.dart
index d15f924..e6f7b25 100644
--- a/tests/compiler/dart2js/size_test.dart
+++ b/tests/compiler/dart2js/size_test.dart
@@ -19,6 +19,7 @@
   class double {}
   class String {}
   class Function {}
+  class Null {}
   class Type {}
   class Map {}
   class StackTrace {}
@@ -29,10 +30,11 @@
 main() {
   asyncTest(() => compileAll(TEST, coreSource: DEFAULT_CORELIB_WITH_LIST).
       then((generated) {
-    MockCompiler compiler = new MockCompiler();
-    var backend = compiler.backend;
+    return MockCompiler.create((MockCompiler compiler) {
+      var backend = compiler.backend;
 
-    // Make sure no class is emitted.
-    Expect.isFalse(generated.contains(backend.emitter.finishClassesName));
+      // Make sure no class is emitted.
+      Expect.isFalse(generated.contains(backend.emitter.finishClassesName));
+    });
   }));
 }
diff --git a/tests/compiler/dart2js/source_map_d2js_validity_test.dart b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
index cbc5ed8..94e4814 100644
--- a/tests/compiler/dart2js/source_map_d2js_validity_test.dart
+++ b/tests/compiler/dart2js/source_map_d2js_validity_test.dart
@@ -8,7 +8,7 @@
 import 'package:async_helper/async_helper.dart';
 
 import 'source_map_validator_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart' as entry;
+import 'package:compiler/implementation/dart2js.dart' as entry;
 
 void main() {
   asyncTest(() => createTempDir().then((Directory tmpDir) {
@@ -26,4 +26,4 @@
         tmpDir.deleteSync(recursive: true);
       });
   }));
-}
\ No newline at end of file
+}
diff --git a/tests/compiler/dart2js/source_mapping_test.dart b/tests/compiler/dart2js/source_mapping_test.dart
index 35c633b..3118cd3 100644
--- a/tests/compiler/dart2js/source_mapping_test.dart
+++ b/tests/compiler/dart2js/source_mapping_test.dart
@@ -5,13 +5,13 @@
 import 'dart:async';
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import "package:compiler/implementation/dart2jslib.dart";
+import 'package:compiler/implementation/source_file.dart';
 import "mock_compiler.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import 'package:compiler/implementation/js_backend/js_backend.dart';
 
 Future<CodeBuffer> compileAll(SourceFile sourceFile) {
-  MockCompiler compiler = new MockCompiler();
+  MockCompiler compiler = new MockCompiler.internal();
   Uri uri = new Uri(path: sourceFile.filename);
   compiler.sourceFiles[uri.toString()] = sourceFile;
   JavaScriptBackend backend = compiler.backend;
diff --git a/tests/compiler/dart2js/space_test.dart b/tests/compiler/dart2js/space_test.dart
index 6eeafcd..59c5f04 100644
--- a/tests/compiler/dart2js/space_test.dart
+++ b/tests/compiler/dart2js/space_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'dart:io';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
   as dart2js;
 
 main() {
diff --git a/tests/compiler/dart2js/ssa_phi_codegen_test.dart b/tests/compiler/dart2js/ssa_phi_codegen_test.dart
index 9a1a0ed..2189e49 100644
--- a/tests/compiler/dart2js/ssa_phi_codegen_test.dart
+++ b/tests/compiler/dart2js/ssa_phi_codegen_test.dart
@@ -3,6 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test that parameters keep their names in the output.
 
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -68,20 +70,22 @@
 """;
 
 main() {
-  compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;");
-  compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);");
+  asyncTest(() => Future.wait([
+    compileAndMatchFuzzy(TEST_ONE, 'foo', "var x = x === true \\? 2 : 3;"),
+    compileAndMatchFuzzy(TEST_ONE, 'foo', "print\\(x\\);"),
 
-  compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10");
-  compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x");
+    compileAndMatchFuzzy(TEST_TWO, 'main', "x \\+= 10"),
+    compileAndMatchFuzzy(TEST_TWO, 'main', "\\+\\+x"),
 
-  // Check that we don't have 'd = d' (using regexp back references).
-  compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1');
-  compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x');
-  // Check that a store just after the declaration of the local
-  // only generates one instruction.
-  compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42');
+    // Check that we don't have 'd = d' (using regexp back references).
+    compileAndDoNotMatchFuzzy(TEST_THREE, 'foo', '(x) = \1'),
+    compileAndMatchFuzzy(TEST_THREE, 'foo', 'return x'),
+    // Check that a store just after the declaration of the local
+    // only generates one instruction.
+    compileAndMatchFuzzy(TEST_THREE, 'foo', 'x = 42'),
 
-  compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;');
+    compileAndDoNotMatchFuzzy(TEST_FOUR, 'foo', '(x) = \1;'),
 
-  compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0'));
+    compileAndDoNotMatch(TEST_FIVE, 'main', new RegExp('hash0')),
+  ]));
 }
diff --git a/tests/compiler/dart2js/stats_test.dart b/tests/compiler/dart2js/stats_test.dart
index fd1796b..c13335a 100644
--- a/tests/compiler/dart2js/stats_test.dart
+++ b/tests/compiler/dart2js/stats_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import 'package:expect/expect.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/helpers/helpers.dart';
+import 'package:compiler/implementation/helpers/helpers.dart';
 
 class CollectingOutput implements StatsOutput {
   final StringBuffer sb = new StringBuffer();
diff --git a/tests/compiler/dart2js/strength_eq_test.dart b/tests/compiler/dart2js/strength_eq_test.dart
index bddafaa..ffc082e 100644
--- a/tests/compiler/dart2js/strength_eq_test.dart
+++ b/tests/compiler/dart2js/strength_eq_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String CODE = """
@@ -27,5 +27,5 @@
   // The `==` is strengthened to a HIdentity instruction.  The HIdentity follows
   // `x.link`, so x cannot be `null`.
   var compare = new RegExp(r'x === x\.get\$link\(\)');
-  compileAndMatch(CODE, 'main', compare);
+  asyncTest(() => compileAndMatch(CODE, 'main', compare));
 }
diff --git a/tests/compiler/dart2js/string_escapes_test.dart b/tests/compiler/dart2js/string_escapes_test.dart
index d47f7f1..1c62a25 100644
--- a/tests/compiler/dart2js/string_escapes_test.dart
+++ b/tests/compiler/dart2js/string_escapes_test.dart
@@ -2,23 +2,68 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
 import 'compiler_helper.dart';
 
 // Test that the compiler handles string literals containing line terminators.
 
-String compileExpression(String expression) {
+Future<String> compileExpression(String expression) {
   var source = "foo() { return $expression; }";
   return compile(source, entry: "foo");
 }
 
 main() {
-  String generated = compileExpression("''' \n\r\u2028\u2029'''");
-  Expect.isTrue(generated.contains(r"\n\r\u2028\u2029"));
-
-  generated = compileExpression("r''' \n\r\u2028\u2029'''");
-  Expect.isTrue(generated.contains(r"\n\r\u2028\u2029"));
-
-  generated = compileExpression("'\u2028\u2029'");
-  Expect.isTrue(generated.contains(r"\u2028\u2029"));
+  asyncTest(() => Future.wait([
+    compileExpression("''' \n\r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r''' \n\r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r''' \r\n\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r''' \r\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r''' \n\u2028\u2029'''").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r'''\t\t      \t\t  \t\t  \t \t \n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t  \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\t\t      \t\t  \t\t  \t \t \\\n\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\r\u2028\u2029"') ||
+                    generated.contains(r"'\r\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t   \\\r\n\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("r'''\\\t\\\t \\   \\  \t\\\t   \\\r\u2028\u2029'''")
+        .then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+    compileExpression("'\u2028\u2029'").then((String generated) {
+      Expect.isTrue(generated.contains(r'"\u2028\u2029"') ||
+                    generated.contains(r"'\u2028\u2029'"));
+    }),
+  ]));
 }
diff --git a/tests/compiler/dart2js/strip_comment_test.dart b/tests/compiler/dart2js/strip_comment_test.dart
index 3808ad8..04e8fb3 100644
--- a/tests/compiler/dart2js/strip_comment_test.dart
+++ b/tests/compiler/dart2js/strip_comment_test.dart
@@ -5,7 +5,7 @@
 library strip_comment_test;
 
 import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/mirrors/mirrors_util.dart';
+import 'package:compiler/implementation/mirrors/mirrors_util.dart';
 
 testComment(String strippedText, String commentText) {
   Expect.stringEquals(strippedText, stripComment(commentText));
diff --git a/tests/compiler/dart2js/subtype_test.dart b/tests/compiler/dart2js/subtype_test.dart
index 2cc9827..054df32 100644
--- a/tests/compiler/dart2js/subtype_test.dart
+++ b/tests/compiler/dart2js/subtype_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/switch_empty_default_test.dart b/tests/compiler/dart2js/switch_empty_default_test.dart
index 8e89fad..d0d2f88 100644
--- a/tests/compiler/dart2js/switch_empty_default_test.dart
+++ b/tests/compiler/dart2js/switch_empty_default_test.dart
@@ -3,7 +3,8 @@
 // BSD-style license that can be found in the LICENSE file.
 // Test constant folding on numbers.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String SIMPLY_EMPTY = """
@@ -119,10 +120,12 @@
   var defOrCase3 = new RegExp(r"(default:|case 3):");
   var case3 = new RegExp(r"case 3:");
 
-  compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def);
-  compileAndDoNotMatch(TOTAL, 'main', defOrCase3);
-  compileAndDoNotMatch(OPTIMIZED, 'main', def);
-  compileAndMatch(LABEL, 'main', case3);
-  compileAndMatch(DEFLABEL, 'main', def);
-  compileAndMatch(EMPTYDEFLABEL, 'main', def);
+  asyncTest(() => Future.wait([
+    compileAndDoNotMatch(SIMPLY_EMPTY, 'main', def),
+    compileAndDoNotMatch(TOTAL, 'main', defOrCase3),
+    compileAndDoNotMatch(OPTIMIZED, 'main', def),
+    compileAndMatch(LABEL, 'main', case3),
+    compileAndMatch(DEFLABEL, 'main', def),
+    compileAndMatch(EMPTYDEFLABEL, 'main', def),
+  ]));
 }
diff --git a/tests/compiler/dart2js/type_checker_test.dart b/tests/compiler/dart2js/type_checker_test.dart
index 02868b7..55b31ba 100644
--- a/tests/compiler/dart2js/type_checker_test.dart
+++ b/tests/compiler/dart2js/type_checker_test.dart
@@ -2,31 +2,26 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
+import 'dart:async';
+import 'package:async_helper/async_helper.dart';
+import 'package:expect/expect.dart';
+import 'package:compiler/implementation/elements/elements.dart';
+import 'package:compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/util/util.dart';
+import 'package:compiler/implementation/source_file.dart';
 import 'mock_compiler.dart';
 import 'parser_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart'
+import 'package:compiler/implementation/elements/modelx.dart'
   show ElementX, CompilationUnitElementX, FunctionElementX;
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart';
+import 'package:compiler/implementation/dart2jslib.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 
 final MessageKind NOT_ASSIGNABLE = MessageKind.NOT_ASSIGNABLE;
 final MessageKind MEMBER_NOT_FOUND = MessageKind.MEMBER_NOT_FOUND;
 
-DartType voidType;
-DartType intType;
-DartType boolType;
-DartType stringType;
-DartType doubleType;
-DartType objectType;
-
 main() {
   List tests = [testSimpleTypes,
                 testReturn,
@@ -60,166 +55,196 @@
                 testTypePromotionHints,
                 testFunctionCall,
                 testCascade];
-  for (Function test in tests) {
-    setup();
-    test();
+  asyncTest(() => Future.forEach(tests, (test) => setup(test)));
+}
+
+testSimpleTypes(MockCompiler compiler) {
+  checkType(DartType type, String code) {
+    Expect.equals(type, analyzeType(compiler, code));
   }
+
+  checkType(compiler.intClass.computeType(compiler), "3");
+  checkType(compiler.boolClass.computeType(compiler), "false");
+  checkType(compiler.boolClass.computeType(compiler), "true");
+  checkType(compiler.stringClass.computeType(compiler), "'hestfisk'");
 }
 
-testSimpleTypes() {
-  Expect.equals(intType, analyzeType("3"));
-  Expect.equals(boolType, analyzeType("false"));
-  Expect.equals(boolType, analyzeType("true"));
-  Expect.equals(stringType, analyzeType("'hestfisk'"));
+Future testReturn(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
+
+  return Future.wait([
+    check("void foo() { return 3; }", MessageKind.RETURN_VALUE_IN_VOID),
+    check("int bar() { return 'hest'; }", NOT_ASSIGNABLE),
+    check("void baz() { var x; return x; }"),
+    check(returnWithType("int", "'string'"), NOT_ASSIGNABLE),
+    check(returnWithType("", "'string'")),
+    check(returnWithType("Object", "'string'")),
+    check(returnWithType("String", "'string'")),
+    check(returnWithType("String", null)),
+    check(returnWithType("int", null)),
+    check(returnWithType("void", "")),
+    check(returnWithType("void", 1), MessageKind.RETURN_VALUE_IN_VOID),
+    check(returnWithType("void", null)),
+    check(returnWithType("String", ""), MessageKind.RETURN_NOTHING),
+    // check("String foo() {};"), // Should probably fail.
+  ]);
 }
 
-testReturn() {
-  analyzeTopLevel("void foo() { return 3; }", MessageKind.RETURN_VALUE_IN_VOID);
-  analyzeTopLevel("int bar() { return 'hest'; }",
-                  NOT_ASSIGNABLE);
-  analyzeTopLevel("void baz() { var x; return x; }");
-  analyzeTopLevel(returnWithType("int", "'string'"),
-                  NOT_ASSIGNABLE);
-  analyzeTopLevel(returnWithType("", "'string'"));
-  analyzeTopLevel(returnWithType("Object", "'string'"));
-  analyzeTopLevel(returnWithType("String", "'string'"));
-  analyzeTopLevel(returnWithType("String", null));
-  analyzeTopLevel(returnWithType("int", null));
-  analyzeTopLevel(returnWithType("void", ""));
-  analyzeTopLevel(returnWithType("void", 1), MessageKind.RETURN_VALUE_IN_VOID);
-  analyzeTopLevel(returnWithType("void", null));
-  analyzeTopLevel(returnWithType("String", ""), MessageKind.RETURN_NOTHING);
-  // analyzeTopLevel("String foo() {};"); // Should probably fail.
-}
+testFor(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-testFor() {
-  analyze("for (var x;true;x = x + 1) {}");
-  analyze("for (var x;null;x = x + 1) {}");
-  analyze("for (var x;0;x = x + 1) {}", warnings: NOT_ASSIGNABLE);
-  analyze("for (var x;'';x = x + 1) {}", warnings: NOT_ASSIGNABLE);
+  check("for (var x;true;x = x + 1) {}");
+  check("for (var x;null;x = x + 1) {}");
+  check("for (var x;0;x = x + 1) {}", warnings: NOT_ASSIGNABLE);
+  check("for (var x;'';x = x + 1) {}", warnings: NOT_ASSIGNABLE);
 
-   analyze("for (;true;) {}");
-   analyze("for (;null;) {}");
-   analyze("for (;0;) {}", warnings: NOT_ASSIGNABLE);
-   analyze("for (;'';) {}", warnings: NOT_ASSIGNABLE);
+  check("for (;true;) {}");
+  check("for (;null;) {}");
+  check("for (;0;) {}", warnings: NOT_ASSIGNABLE);
+  check("for (;'';) {}", warnings: NOT_ASSIGNABLE);
 
   // Foreach tests
 //  TODO(karlklose): for each is not yet implemented.
-//  analyze("{ List<String> strings = ['1','2','3']; " +
-//          "for (String s in strings) {} }");
-//  analyze("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
-//          NOT_ASSIGNABLE);
-//  analyze("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND);
+//  check("{ List<String> strings = ['1','2','3']; " +
+//        "for (String s in strings) {} }");
+//  check("{ List<int> ints = [1,2,3]; for (String s in ints) {} }",
+//        NOT_ASSIGNABLE);
+//  check("for (String s in true) {}", MessageKind.METHOD_NOT_FOUND);
 }
 
-testWhile() {
-  analyze("while (true) {}");
-  analyze("while (null) {}");
-  analyze("while (0) {}", warnings: NOT_ASSIGNABLE);
-  analyze("while ('') {}", warnings: NOT_ASSIGNABLE);
+testWhile(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-  analyze("do {} while (true);");
-  analyze("do {} while (null);");
-  analyze("do {} while (0);", warnings: NOT_ASSIGNABLE);
-  analyze("do {} while ('');", warnings: NOT_ASSIGNABLE);
-  analyze("do { int i = 0.5; } while (true);", warnings: NOT_ASSIGNABLE);
-  analyze("do { int i = 0.5; } while (null);", warnings: NOT_ASSIGNABLE);
+  check("while (true) {}");
+  check("while (null) {}");
+  check("while (0) {}", warnings: NOT_ASSIGNABLE);
+  check("while ('') {}", warnings: NOT_ASSIGNABLE);
+
+  check("do {} while (true);");
+  check("do {} while (null);");
+  check("do {} while (0);", warnings: NOT_ASSIGNABLE);
+  check("do {} while ('');", warnings: NOT_ASSIGNABLE);
+  check("do { int i = 0.5; } while (true);", warnings: NOT_ASSIGNABLE);
+  check("do { int i = 0.5; } while (null);", warnings: NOT_ASSIGNABLE);
 }
 
-testTry() {
-  analyze("try {} finally {}");
-  analyze("try {} catch (e) { int i = e;} finally {}");
-  analyze("try {} catch (e, s) { int i = e; StackTrace j = s; } finally {}");
-  analyze("try {} on String catch (e) {} finally {}");
-  analyze("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
-  analyze("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
-  analyze("try {} on String catch (e) { int i = e; } finally {}",
-          warnings: NOT_ASSIGNABLE);
-  analyze("try {} catch (e, s) { int i = e; int j = s; } finally {}",
-          warnings: NOT_ASSIGNABLE);
-  analyze("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+testTry(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("try {} finally {}");
+  check("try {} catch (e) { int i = e;} finally {}");
+  check("try {} catch (e, s) { int i = e; StackTrace j = s; } finally {}");
+  check("try {} on String catch (e) {} finally {}");
+  check("try { int i = ''; } finally {}", warnings: NOT_ASSIGNABLE);
+  check("try {} finally { int i = ''; }", warnings: NOT_ASSIGNABLE);
+  check("try {} on String catch (e) { int i = e; } finally {}",
+        warnings: NOT_ASSIGNABLE);
+  check("try {} catch (e, s) { int i = e; int j = s; } finally {}",
+        warnings: NOT_ASSIGNABLE);
+  check("try {} on String catch (e, s) { int i = e; int j = s; } finally {}",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
 
-testSwitch() {
-  analyze("switch (0) { case 1: break; case 2: break; }");
-  analyze("switch (0) { case 1: int i = ''; break; case 2: break; }",
-          warnings: NOT_ASSIGNABLE);
-  analyze("switch (0) { case '': break; }",
-          warnings: NOT_ASSIGNABLE);
-  analyze("switch ('') { case 1: break; case 2: break; }",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  analyze("switch (1.5) { case 1: break; case 2: break; }",
-          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+testSwitch(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("switch (0) { case 1: break; case 2: break; }");
+  check("switch (0) { case 1: int i = ''; break; case 2: break; }",
+        warnings: NOT_ASSIGNABLE);
+  check("switch (0) { case '': break; }",
+        warnings: NOT_ASSIGNABLE);
+  check("switch ('') { case 1: break; case 2: break; }",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+  check("switch (1.5) { case 1: break; case 2: break; }",
+        warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
-testOperators() {
+testOperators(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   // TODO(karlklose): add the DartC tests for operators when we can parse
   // classes with operators.
   for (final op in ['+', '-', '*', '/', '%', '~/', '|', '&']) {
-    analyze("{ var i = 1 ${op} 2; }");
-    analyze("{ var i = 1; i ${op}= 2; }");
-    analyze("{ int i; var j = (i = true) ${op} 2; }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
-    analyze("{ int i; var j = 1 ${op} (i = true); }",
-            warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check("{ var i = 1 ${op} 2; }");
+    check("{ var i = 1; i ${op}= 2; }");
+    check("{ int i; var j = (i = true) ${op} 2; }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ int i; var j = 1 ${op} (i = true); }",
+          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
   for (final op in ['-', '~']) {
-    analyze("{ var i = ${op}1; }");
-    analyze("{ int i; var j = ${op}(i = true); }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ var i = ${op}1; }");
+    check("{ int i; var j = ${op}(i = true); }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
   }
   for (final op in ['++', '--']) {
-    analyze("{ int i = 1; int j = i${op}; }");
-    analyze("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = true; bool j = b${op}; }",
-            warnings: MessageKind.OPERATOR_NOT_FOUND);
-    analyze("{ bool b = true; int j = ${op}b; }",
-            warnings: MessageKind.OPERATOR_NOT_FOUND);
+    check("{ int i = 1; int j = i${op}; }");
+    check("{ int i = 1; bool j = i${op}; }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = true; bool j = b${op}; }",
+          warnings: MessageKind.OPERATOR_NOT_FOUND);
+    check("{ bool b = true; int j = ${op}b; }",
+          warnings: MessageKind.OPERATOR_NOT_FOUND);
   }
   for (final op in ['||', '&&']) {
-    analyze("{ bool b = (true ${op} false); }");
-    analyze("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
-    analyze("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (true ${op} false); }");
+    check("{ int b = true ${op} false; }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (1 ${op} false); }", warnings: NOT_ASSIGNABLE);
+    check("{ bool b = (true ${op} 2); }", warnings: NOT_ASSIGNABLE);
   }
   for (final op in ['>', '<', '<=', '>=']) {
-    analyze("{ bool b = 1 ${op} 2; }");
-    analyze("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = (i = true) ${op} 2; }",
-            warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
-    analyze("{ int i; bool b = 1 ${op} (i = true); }",
-            warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check("{ bool b = 1 ${op} 2; }");
+    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = (i = true) ${op} 2; }",
+          warnings: [NOT_ASSIGNABLE, MessageKind.OPERATOR_NOT_FOUND]);
+    check("{ int i; bool b = 1 ${op} (i = true); }",
+          warnings: [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
   }
   for (final op in ['==', '!=']) {
-    analyze("{ bool b = 1 ${op} 2; }");
-    analyze("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = (i = true) ${op} 2; }",
-            warnings: NOT_ASSIGNABLE);
-    analyze("{ int i; bool b = 1 ${op} (i = true); }",
-            warnings: NOT_ASSIGNABLE);
+    check("{ bool b = 1 ${op} 2; }");
+    check("{ int i = 1 ${op} 2; }", warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = (i = true) ${op} 2; }",
+          warnings: NOT_ASSIGNABLE);
+    check("{ int i; bool b = 1 ${op} (i = true); }",
+          warnings: NOT_ASSIGNABLE);
   }
 }
 
-void testConstructorInvocationArgumentCount() {
+void testConstructorInvocationArgumentCount(MockCompiler compiler) {
   compiler.parseScript("""
      class C1 { C1(x, y); }
      class C2 { C2(int x, int y); }
   """);
+
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   // calls to untyped constructor C1
-  analyze("new C1(1, 2);");
-  analyze("new C1();", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C1(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C1(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
+  check("new C1(1, 2);");
+  check("new C1();", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C1(1);", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C1(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
   // calls to typed constructor C2
-  analyze("new C2(1, 2);");
-  analyze("new C2();", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C2(1);", warnings: MessageKind.MISSING_ARGUMENT);
-  analyze("new C2(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
+  check("new C2(1, 2);");
+  check("new C2();", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C2(1);", warnings: MessageKind.MISSING_ARGUMENT);
+  check("new C2(1, 2, 3);", warnings: MessageKind.ADDITIONAL_ARGUMENT);
 }
 
-void testConstructorInvocationArgumentTypes() {
+void testConstructorInvocationArgumentTypes(MockCompiler compiler) {
   compiler.parseScript("""
     class C1 { C1(x); }
     class C2 { C2(int x); }
@@ -229,24 +254,31 @@
       C3.named(this.field);
     }
   """);
-  analyze("new C1(42);");
-  analyze("new C1('string');");
-  analyze("new C2(42);");
-  analyze("new C2('string');",
-          warnings: NOT_ASSIGNABLE);
-  analyze("new C3(42);");
-  analyze("new C3('string');",
-          warnings: NOT_ASSIGNABLE);
-  analyze("new C3.named(42);");
-  analyze("new C3.named('string');",
-          warnings: NOT_ASSIGNABLE);
+
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("new C1(42);");
+  check("new C1('string');");
+  check("new C2(42);");
+  check("new C2('string');",
+        warnings: NOT_ASSIGNABLE);
+  check("new C3(42);");
+  check("new C3('string');",
+        warnings: NOT_ASSIGNABLE);
+  check("new C3.named(42);");
+  check("new C3.named('string');",
+        warnings: NOT_ASSIGNABLE);
 }
 
-void testMethodInvocationArgumentCount() {
+void testMethodInvocationArgumentCount(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]) {
-    analyze("{ ClassWithMethods c; $text }", warnings: expectedWarnings);
+    analyze(compiler,
+            "{ ClassWithMethods c; $text }",
+            warnings: expectedWarnings);
   }
 
   check("c.untypedNoArgumentMethod(1);", MessageKind.ADDITIONAL_ARGUMENT);
@@ -323,11 +355,12 @@
          MessageKind.NAMED_ARGUMENT_NOT_FOUND]);
 }
 
-void testMethodInvocations() {
+void testMethodInvocations(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]){
-    analyze("""{
+    analyze(compiler,
+            """{
                ClassWithMethods c;
                SubClass d;
                var e;
@@ -464,208 +497,214 @@
   check("foo(a: localMethod(1));", NOT_ASSIGNABLE);
 }
 
-testMethodInvocationsInClass() {
-  LibraryElement library = mockLibrary(compiler, CLASS_WITH_METHODS);
-  compiler.parseScript(CLASS_WITH_METHODS, library);
-  ClassElement ClassWithMethods = library.find("ClassWithMethods");
-  ClassWithMethods.ensureResolved(compiler);
-  Element c = ClassWithMethods.lookupLocalMember('method');
-  assert(c != null);
-  ClassElement SubClass = library.find("SubClass");
-  SubClass.ensureResolved(compiler);
-  Element d = SubClass.lookupLocalMember('method');
-  assert(d != null);
+Future testMethodInvocationsInClass(MockCompiler compiler) {
+  MockCompiler compiler = new MockCompiler.internal();
+  return compiler.init(CLASS_WITH_METHODS).then((_) {
+    LibraryElement library = compiler.mainApp;
+    compiler.parseScript(CLASS_WITH_METHODS, library);
+    ClassElement ClassWithMethods = library.find("ClassWithMethods");
+    ClassWithMethods.ensureResolved(compiler);
+    Element c = ClassWithMethods.lookupLocalMember('method');
+    assert(c != null);
+    ClassElement SubClass = library.find("SubClass");
+    SubClass.ensureResolved(compiler);
+    Element d = SubClass.lookupLocalMember('method');
+    assert(d != null);
 
-  check(Element element, String text, [expectedWarnings]){
-    analyzeIn(element,
-              """{
-                   var e;
-                   int i;
-                   int j;
-                   int localMethod(String str) { return 0; }
-                   $text
-                 }""",
-              expectedWarnings);
-  }
+    check(Element element, String text, [expectedWarnings]){
+      analyzeIn(compiler,
+                element,
+                """{
+                     var e;
+                     int i;
+                     int j;
+                     int localMethod(String str) { return 0; }
+                     $text
+                   }""",
+                expectedWarnings);
+    }
 
 
-  check(c, "int k = untypedNoArgumentMethod();");
-  check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
-  check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
-  check(d, "int k = intMethod();");
-  check(c, "int k = untypedOneArgumentMethod(this);");
-  check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-  check(c, "int k = untypedOneArgumentMethod('string');");
-  check(c, "int k = untypedOneArgumentMethod(i);");
-  check(d, "int k = untypedOneArgumentMethod(this);");
-  check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
-  check(d, "int k = untypedOneArgumentMethod('string');");
-  check(d, "int k = untypedOneArgumentMethod(i);");
+    check(c, "int k = untypedNoArgumentMethod();");
+    check(c, "ClassWithMethods x = untypedNoArgumentMethod();");
+    check(d, "ClassWithMethods x = untypedNoArgumentMethod();");
+    check(d, "int k = intMethod();");
+    check(c, "int k = untypedOneArgumentMethod(this);");
+    check(c, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+    check(c, "int k = untypedOneArgumentMethod('string');");
+    check(c, "int k = untypedOneArgumentMethod(i);");
+    check(d, "int k = untypedOneArgumentMethod(this);");
+    check(d, "ClassWithMethods x = untypedOneArgumentMethod(1);");
+    check(d, "int k = untypedOneArgumentMethod('string');");
+    check(d, "int k = untypedOneArgumentMethod(i);");
 
-  check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
-  check(c, "int k = untypedTwoArgumentMethod(i, j);");
-  check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
-  check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
-  check(d, "int k = untypedTwoArgumentMethod(i, j);");
-  check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+    check(c, "int k = untypedTwoArgumentMethod(1, 'string');");
+    check(c, "int k = untypedTwoArgumentMethod(i, j);");
+    check(c, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
+    check(d, "int k = untypedTwoArgumentMethod(1, 'string');");
+    check(d, "int k = untypedTwoArgumentMethod(i, j);");
+    check(d, "ClassWithMethods x = untypedTwoArgumentMethod(i, this);");
 
-  check(c, "int k = intNoArgumentMethod();");
-  check(c, "ClassWithMethods x = intNoArgumentMethod();",
-        NOT_ASSIGNABLE);
+    check(c, "int k = intNoArgumentMethod();");
+    check(c, "ClassWithMethods x = intNoArgumentMethod();",
+          NOT_ASSIGNABLE);
 
-  check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
-  check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intOneArgumentMethod('string');",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intOneArgumentMethod(i);");
+    check(c, "int k = intOneArgumentMethod('');", NOT_ASSIGNABLE);
+    check(c, "ClassWithMethods x = intOneArgumentMethod(1);",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intOneArgumentMethod('string');",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intOneArgumentMethod(i);");
 
-  check(c, "int k = intTwoArgumentMethod(1, 'string');",
-        NOT_ASSIGNABLE);
-  check(c, "int k = intTwoArgumentMethod(i, j);");
-  check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
-        NOT_ASSIGNABLE);
+    check(c, "int k = intTwoArgumentMethod(1, 'string');",
+          NOT_ASSIGNABLE);
+    check(c, "int k = intTwoArgumentMethod(i, j);");
+    check(c, "ClassWithMethods x = intTwoArgumentMethod(i, j);",
+          NOT_ASSIGNABLE);
 
-  check(c, "functionField();");
-  check(d, "functionField();");
-  check(c, "functionField(1);");
-  check(d, "functionField('string');");
+    check(c, "functionField();");
+    check(d, "functionField();");
+    check(c, "functionField(1);");
+    check(d, "functionField('string');");
 
-  check(c, "intField();", MessageKind.NOT_CALLABLE);
-  check(d, "intField();", MessageKind.NOT_CALLABLE);
+    check(c, "intField();", MessageKind.NOT_CALLABLE);
+    check(d, "intField();", MessageKind.NOT_CALLABLE);
 
-  check(c, "untypedField();");
-  check(d, "untypedField();");
-  check(c, "untypedField(1);");
-  check(d, "untypedField('string');");
+    check(c, "untypedField();");
+    check(d, "untypedField();");
+    check(c, "untypedField(1);");
+    check(d, "untypedField('string');");
 
 
-  check(c, "intOneArgumentOneOptionalMethod('');",
-        NOT_ASSIGNABLE);
-  check(c, "intOneArgumentOneOptionalMethod('', '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intOneArgumentOneOptionalMethod('');",
+          NOT_ASSIGNABLE);
+    check(c, "intOneArgumentOneOptionalMethod('', '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
-  check(c, "intTwoOptionalMethod('', '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoOptionalMethod('');", NOT_ASSIGNABLE);
+    check(c, "intTwoOptionalMethod('', '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intOneArgumentOneNamedMethod('');",
-        NOT_ASSIGNABLE);
-  check(c, "intOneArgumentOneNamedMethod('', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intOneArgumentOneNamedMethod('');",
+          NOT_ASSIGNABLE);
+    check(c, "intOneArgumentOneNamedMethod('', b: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
-  check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
-  check(c, "intTwoNamedMethod(a: '', b: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
-  check(c, "intTwoNamedMethod(b: '', a: '');",
-        [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoNamedMethod(a: '');", NOT_ASSIGNABLE);
+    check(c, "intTwoNamedMethod(b: '');", NOT_ASSIGNABLE);
+    check(c, "intTwoNamedMethod(a: '', b: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
+    check(c, "intTwoNamedMethod(b: '', a: '');",
+          [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 
-  // Invocation of dynamic variable.
-  check(c, "e();");
-  check(c, "e(1);");
-  check(c, "e('string');");
+    // Invocation of dynamic variable.
+    check(c, "e();");
+    check(c, "e(1);");
+    check(c, "e('string');");
 
-  // Invocation on local method.
-  check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
-  check(c, "localMethod(1);", NOT_ASSIGNABLE);
-  check(c, "localMethod('string');");
-  check(c, "int k = localMethod('string');");
-  check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
+    // Invocation on local method.
+    check(c, "localMethod();", MessageKind.MISSING_ARGUMENT);
+    check(c, "localMethod(1);", NOT_ASSIGNABLE);
+    check(c, "localMethod('string');");
+    check(c, "int k = localMethod('string');");
+    check(c, "String k = localMethod('string');", NOT_ASSIGNABLE);
 
-  // Invocation on parenthesized expressions.
-  check(c, "(e)();");
-  check(c, "(e)(1);");
-  check(c, "(e)('string');");
-  check(c, "(foo)();", MEMBER_NOT_FOUND);
-  check(c, "(foo)(1);", MEMBER_NOT_FOUND);
-  check(c, "(foo)('string');", MEMBER_NOT_FOUND);
+    // Invocation on parenthesized expressions.
+    check(c, "(e)();");
+    check(c, "(e)(1);");
+    check(c, "(e)('string');");
+    check(c, "(foo)();", MEMBER_NOT_FOUND);
+    check(c, "(foo)(1);", MEMBER_NOT_FOUND);
+    check(c, "(foo)('string');", MEMBER_NOT_FOUND);
 
-  // Invocations on function expressions.
-  check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
-  check(c, "(foo){}(1);");
-  check(c, "(foo){}('string');");
-  check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
-  check(c, "(String foo){}('string');");
-  check(c, "int k = int bar(String foo){ return 0; }('string');");
-  check(c, "int k = String bar(String foo){ return foo; }('string');",
-        NOT_ASSIGNABLE);
+    // Invocations on function expressions.
+    check(c, "(foo){}();", MessageKind.MISSING_ARGUMENT);
+    check(c, "(foo){}(1);");
+    check(c, "(foo){}('string');");
+    check(c, "(int foo){}('string');", NOT_ASSIGNABLE);
+    check(c, "(String foo){}('string');");
+    check(c, "int k = int bar(String foo){ return 0; }('string');");
+    check(c, "int k = String bar(String foo){ return foo; }('string');",
+          NOT_ASSIGNABLE);
 
-  // Static invocations.
-  check(c, "staticMethod();",
-        MessageKind.MISSING_ARGUMENT);
-  check(c, "staticMethod(1);",
-        NOT_ASSIGNABLE);
-  check(c, "staticMethod('string');");
-  check(c, "int k = staticMethod('string');");
-  check(c, "String k = staticMethod('string');",
-        NOT_ASSIGNABLE);
-  check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND);
-  check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND);
-  check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-  check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
-  check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    // Static invocations.
+    check(c, "staticMethod();",
+          MessageKind.MISSING_ARGUMENT);
+    check(c, "staticMethod(1);",
+          NOT_ASSIGNABLE);
+    check(c, "staticMethod('string');");
+    check(c, "int k = staticMethod('string');");
+    check(c, "String k = staticMethod('string');",
+          NOT_ASSIGNABLE);
+    check(d, "staticMethod();", MessageKind.METHOD_NOT_FOUND);
+    check(d, "staticMethod(1);", MessageKind.METHOD_NOT_FOUND);
+    check(d, "staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    check(d, "int k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
+    check(d, "String k = staticMethod('string');", MessageKind.METHOD_NOT_FOUND);
 
-  // Invocation on dynamic variable.
-  check(c, "e.foo();");
-  check(c, "e.foo(1);");
-  check(c, "e.foo('string');");
+    // Invocation on dynamic variable.
+    check(c, "e.foo();");
+    check(c, "e.foo(1);");
+    check(c, "e.foo('string');");
 
-  // Invocation on unresolved variable.
-  check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
-  check(c, "foo(a: localMethod(1));",
-      [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]);
+    // Invocation on unresolved variable.
+    check(c, "foo();", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(1);", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo('string');", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(a: 'string');", MessageKind.METHOD_NOT_FOUND);
+    check(c, "foo(a: localMethod(1));",
+          [MessageKind.METHOD_NOT_FOUND, NOT_ASSIGNABLE]);
+  });
 }
 
 /** Tests analysis of returns (not required by the specification). */
-void testControlFlow() {
-  analyzeTopLevel("void foo() { if (true) { return; } }");
-  analyzeTopLevel("foo() { if (true) { return; } }");
-  analyzeTopLevel("int foo() { if (true) { return 1; } }",
-                  MessageKind.MAYBE_MISSING_RETURN);
-  final bar =
-      """void bar() {
-        if (true) {
-          if (true) { return; } else { return; }
-        } else { return; }
-      }""";
-  analyzeTopLevel(bar);
-  analyzeTopLevel("void baz() { return; int i = 1; }",
-                  MessageKind.UNREACHABLE_CODE);
-  final qux =
-      """void qux() {
-        if (true) {
-          return;
-        } else if (true) {
-          if (true) {
-            return;
-          }
-          throw 'hest';
-        }
-        throw 'fisk';
-      }""";
-  analyzeTopLevel(qux);
-  analyzeTopLevel("int hest() {}", MessageKind.MISSING_RETURN);
-  final fisk = """int fisk() {
-                    if (true) {
-                      if (true) { return 1; } else {}
-                    } else { return 1; }
-                  }""";
-  analyzeTopLevel(fisk, MessageKind.MAYBE_MISSING_RETURN);
-  analyzeTopLevel("int foo() { while(true) { return 1; } }");
-  analyzeTopLevel("int foo() { while(true) { return 1; } return 2; }",
-                  MessageKind.UNREACHABLE_CODE);
+Future testControlFlow(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
+
+  return Future.wait([
+    check("void foo() { if (true) { return; } }"),
+    check("foo() { if (true) { return; } }"),
+    check("int foo() { if (true) { return 1; } }",
+          MessageKind.MAYBE_MISSING_RETURN),
+    check("""void bar() {
+               if (true) {
+                 if (true) { return; } else { return; }
+               } else { return; }
+             }"""),
+    check("void baz() { return; int i = 1; }",
+          MessageKind.UNREACHABLE_CODE),
+    check("""void qux() {
+               if (true) {
+                 return;
+               } else if (true) {
+                 if (true) {
+                   return;
+                 }
+                 throw 'hest';
+               }
+               throw 'fisk';
+             }"""),
+    check("int hest() {}", MessageKind.MISSING_RETURN),
+    check("""int fisk() {
+               if (true) {
+                 if (true) { return 1; } else {}
+               } else { return 1; }
+             }""", MessageKind.MAYBE_MISSING_RETURN),
+    check("int foo() { while(true) { return 1; } }"),
+    check("int foo() { while(true) { return 1; } return 2; }",
+          MessageKind.UNREACHABLE_CODE),
+  ]);
 }
 
 
-void testFunctionCall() {
+void testFunctionCall(MockCompiler compiler) {
   compiler.parseScript(CLASS_WITH_METHODS);
 
   check(String text, [expectedWarnings]){
-    analyze("""{
+    analyze(compiler,
+            """{
                ClassWithMethods x;
                int localMethod(String str) { return 0; }
                String2Int string2int;
@@ -716,10 +755,10 @@
   check("int k = subFunction.call(0);");
 }
 
-testNewExpression() {
+testNewExpression(MockCompiler compiler) {
   compiler.parseScript("class A {}");
-  analyze("A a = new A();");
-  analyze("int i = new A();", warnings: NOT_ASSIGNABLE);
+  analyze(compiler, "A a = new A();");
+  analyze(compiler, "int i = new A();", warnings: NOT_ASSIGNABLE);
 
 // TODO(karlklose): constructors are not yet implemented.
 //  compiler.parseScript(
@@ -752,51 +791,58 @@
 //  analyze("Bar<String> x = new Bar<String>.make('');");
 }
 
-testConditionalExpression() {
-  analyze("int i = true ? 2 : 1;");
-  analyze("int i = true ? 'hest' : 1;");
-  analyze("int i = true ? 'hest' : 'fisk';", warnings: NOT_ASSIGNABLE);
-  analyze("String s = true ? 'hest' : 'fisk';");
+testConditionalExpression(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
 
-  analyze("true ? 1 : 2;");
-  analyze("null ? 1 : 2;");
-  analyze("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  analyze("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; true ? i = 2.7 : 2; }",
+  check("int i = true ? 2 : 1;");
+  check("int i = true ? 'hest' : 1;");
+  check("int i = true ? 'hest' : 'fisk';", warnings: NOT_ASSIGNABLE);
+  check("String s = true ? 'hest' : 'fisk';");
+
+  check("true ? 1 : 2;");
+  check("null ? 1 : 2;");
+  check("0 ? 1 : 2;", warnings: NOT_ASSIGNABLE);
+  check("'' ? 1 : 2;", warnings: NOT_ASSIGNABLE);
+  check("{ int i; true ? i = 2.7 : 2; }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; true ? 2 : i = 2.7; }",
+  check("{ int i; true ? 2 : i = 2.7; }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i; i = true ? 2.7 : 2; }");
+  check("{ int i; i = true ? 2.7 : 2; }");
 }
 
-testIfStatement() {
-  analyze("if (true) {}");
-  analyze("if (null) {}");
-  analyze("if (0) {}",
+testIfStatement(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check("if (true) {}");
+  check("if (null) {}");
+  check("if (0) {}",
           warnings: NOT_ASSIGNABLE);
-  analyze("if ('') {}",
+  check("if ('') {}",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i = 27; if (true) { i = 2.7; } else {} }",
+  check("{ int i = 27; if (true) { i = 2.7; } else {} }",
           warnings: NOT_ASSIGNABLE);
-  analyze("{ int i = 27; if (true) {} else { i = 2.7; } }",
+  check("{ int i = 27; if (true) {} else { i = 2.7; } }",
           warnings: NOT_ASSIGNABLE);
 }
 
-testThis() {
+testThis(MockCompiler compiler) {
   String script = """class Foo {
                        void method() {}
                      }""";
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement foo = library.find("Foo");
+  compiler.parseScript(script);
+  ClassElement foo = compiler.mainApp.find("Foo");
   foo.ensureResolved(compiler);
   Element method = foo.lookupLocalMember('method');
-  analyzeIn(method, "{ int i = this; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ Object o = this; }");
-  analyzeIn(method, "{ Foo f = this; }");
+  analyzeIn(compiler, method, "{ int i = this; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Object o = this; }");
+  analyzeIn(compiler, method, "{ Foo f = this; }");
 }
 
-testSuper() {
+testSuper(MockCompiler compiler) {
   String script = r'''
     class A {
       String field = "42";
@@ -807,14 +853,13 @@
       void method() {}
     }
     ''';
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement B = library.find("B");
+  compiler.parseScript(script);
+  ClassElement B = compiler.mainApp.find("B");
   B.ensureResolved(compiler);
   Element method = B.lookupLocalMember('method');
-  analyzeIn(method, "{ int i = super.field; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ Object o = super.field; }");
-  analyzeIn(method, "{ String s = super.field; }");
+  analyzeIn(compiler, method, "{ int i = super.field; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Object o = super.field; }");
+  analyzeIn(compiler, method, "{ String s = super.field; }");
 }
 
 const String CLASSES_WITH_OPERATORS = '''
@@ -870,7 +915,7 @@
 }
 ''';
 
-testOperatorsAssignability() {
+testOperatorsAssignability(MockCompiler compiler) {
   compiler.parseScript(CLASSES_WITH_OPERATORS);
 
   // Tests against Operators.
@@ -883,7 +928,7 @@
       """;
 
   check(String text, [expectedWarnings]) {
-    analyze('$header $text }', warnings: expectedWarnings);
+    analyze(compiler, '$header $text }', warnings: expectedWarnings);
   }
 
   // Positive tests on operators.
@@ -1092,40 +1137,45 @@
       [NOT_ASSIGNABLE, NOT_ASSIGNABLE]);
 }
 
-void testFieldInitializers() {
-  analyzeTopLevel("""int i = 0;""");
-  analyzeTopLevel("""int i = '';""", NOT_ASSIGNABLE);
+Future testFieldInitializers(MockCompiler compiler) {
+  Future check(String code, [expectedWarnings]) {
+    return analyzeTopLevel(code, expectedWarnings);
+  }
 
-  analyzeTopLevel("""class Class {
-                       int i = 0;
-                     }""");
-  analyzeTopLevel("""class Class {
-                       int i = '';
-                     }""", NOT_ASSIGNABLE);
+  return Future.wait([
+    check("""int i = 0;"""),
+    check("""int i = '';""", NOT_ASSIGNABLE),
+
+    check("""class Class {
+               int i = 0;
+             }"""),
+    check("""class Class {
+               int i = '';
+             }""", NOT_ASSIGNABLE),
+  ]);
 }
 
-void testTypeVariableExpressions() {
+void testTypeVariableExpressions(MockCompiler compiler) {
   String script = """class Foo<T> {
                        void method() {}
                      }""";
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement foo = library.find("Foo");
+  compiler.parseScript(script);
+  ClassElement foo = compiler.mainApp.find("Foo");
   foo.ensureResolved(compiler);
   Element method = foo.lookupLocalMember('method');
 
-  analyzeIn(method, "{ Type type = T; }");
-  analyzeIn(method, "{ T type = T; }", NOT_ASSIGNABLE);
-  analyzeIn(method, "{ int type = T; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ Type type = T; }");
+  analyzeIn(compiler, method, "{ T type = T; }", NOT_ASSIGNABLE);
+  analyzeIn(compiler, method, "{ int type = T; }", NOT_ASSIGNABLE);
 
-  analyzeIn(method, "{ String typeName = T.toString(); }");
-  analyzeIn(method, "{ T.foo; }", MEMBER_NOT_FOUND);
-  analyzeIn(method, "{ T.foo = 0; }", MessageKind.SETTER_NOT_FOUND);
-  analyzeIn(method, "{ T.foo(); }", MessageKind.METHOD_NOT_FOUND);
-  analyzeIn(method, "{ T + 1; }", MessageKind.OPERATOR_NOT_FOUND);
+  analyzeIn(compiler, method, "{ String typeName = T.toString(); }");
+  analyzeIn(compiler, method, "{ T.foo; }", MEMBER_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T.foo = 0; }", MessageKind.SETTER_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T.foo(); }", MessageKind.METHOD_NOT_FOUND);
+  analyzeIn(compiler, method, "{ T + 1; }", MessageKind.OPERATOR_NOT_FOUND);
 }
 
-void testTypeVariableLookup1() {
+void testTypeVariableLookup1(MockCompiler compiler) {
   String script = """
 class Foo {
   int field;
@@ -1141,14 +1191,13 @@
 }
 """;
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.field');
@@ -1168,7 +1217,7 @@
   test('String v = s.getter', NOT_ASSIGNABLE);
 }
 
-void testTypeVariableLookup2() {
+void testTypeVariableLookup2(MockCompiler compiler) {
   String script = """
 class Foo {
   int field;
@@ -1182,14 +1231,13 @@
   test() {}
 }""";
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.field');
@@ -1198,21 +1246,20 @@
   test('s.getter');
 }
 
-void testTypeVariableLookup3() {
+void testTypeVariableLookup3(MockCompiler compiler) {
   String script = """
 class Test<S extends T, T extends S> {
   S s;
   test() {}
 }""";
 
-  LibraryElement library = mockLibrary(compiler, script);
-  compiler.parseScript(script, library);
-  ClassElement classTest = library.find("Test");
+  compiler.parseScript(script);
+  ClassElement classTest = compiler.mainApp.find("Test");
   classTest.ensureResolved(compiler);
   FunctionElement methodTest = classTest.lookupLocalMember("test");
 
   test(String expression, [message]) {
-    analyzeIn(methodTest, "{ $expression; }", message);
+    analyzeIn(compiler, methodTest, "{ $expression; }", message);
   }
 
   test('s.toString');
@@ -1222,22 +1269,34 @@
   test('s.getter', MEMBER_NOT_FOUND);
 }
 
-void testFunctionTypeLookup() {
-  analyze('(int f(int)) => f.toString;');
-  analyze('(int f(int)) => f.toString();');
-  analyze('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  analyze('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+void testFunctionTypeLookup(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
+  check('(int f(int)) => f.toString;');
+  check('(int f(int)) => f.toString();');
+  check('(int f(int)) => f.foo;', warnings: MEMBER_NOT_FOUND);
+  check('(int f(int)) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testTypedefLookup() {
+void testTypedefLookup(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   compiler.parseScript("typedef int F(int);");
-  analyze('(F f) => f.toString;');
-  analyze('(F f) => f.toString();');
-  analyze('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND);
-  analyze('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('(F f) => f.toString;');
+  check('(F f) => f.toString();');
+  check('(F f) => f.foo;', warnings: MEMBER_NOT_FOUND);
+  check('(F f) => f.foo();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testTypeLiteral() {
+void testTypeLiteral(MockCompiler compiler) {
+  check(String code, {warnings}) {
+    analyze(compiler, code, warnings: warnings);
+  }
+
   final String source = r"""class Class {
                               static var field = null;
                               static method() {}
@@ -1245,215 +1304,217 @@
   compiler.parseScript(source);
 
   // Check direct access.
-  analyze('Type m() => int;');
-  analyze('int m() => int;', warnings: NOT_ASSIGNABLE);
+  check('Type m() => int;');
+  check('int m() => int;', warnings: NOT_ASSIGNABLE);
 
   // Check access in assignment.
-  analyze('m(Type val) => val = Class;');
-  analyze('m(int val) => val = Class;', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => val = Class;');
+  check('m(int val) => val = Class;', warnings: NOT_ASSIGNABLE);
 
   // Check access as argument.
-  analyze('m(Type val) => m(int);');
-  analyze('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => m(int);');
+  check('m(int val) => m(int);', warnings: NOT_ASSIGNABLE);
 
   // Check access as argument in member access.
-  analyze('m(Type val) => m(int).foo;');
-  analyze('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
+  check('m(Type val) => m(int).foo;');
+  check('m(int val) => m(int).foo;', warnings: NOT_ASSIGNABLE);
 
   // Check static property access.
-  analyze('m() => Class.field;');
-  analyze('m() => (Class).field;', warnings: MEMBER_NOT_FOUND);
+  check('m() => Class.field;');
+  check('m() => (Class).field;', warnings: MEMBER_NOT_FOUND);
 
   // Check static method access.
-  analyze('m() => Class.method();');
-  analyze('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND);
+  check('m() => Class.method();');
+  check('m() => (Class).method();', warnings: MessageKind.METHOD_NOT_FOUND);
 }
 
-void testInitializers() {
-  check(String text, [expectedWarnings]) {
-    analyzeTopLevel(text, expectedWarnings);
+Future testInitializers(MockCompiler compiler) {
+  Future check(String text, [expectedWarnings]) {
+    return analyzeTopLevel(text, expectedWarnings);
   }
 
-  // Check initializers.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-            }
-            ''');
-  check(r'''class Class {
-              int a;
-              Class(this.a);
-            }
-            ''');
-  check(r'''class Class {
-              var a;
-              Class(int this.a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(int this.a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              var a;
-              Class(int a) : this.a = a;
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(int a) : this.a = a;
-            }
-            ''', NOT_ASSIGNABLE);
+  return Future.wait([
+    // Check initializers.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+              }
+              '''),
+    check(r'''class Class {
+                int a;
+                Class(this.a);
+              }
+              '''),
+    check(r'''class Class {
+                var a;
+                Class(int this.a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(int this.a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                var a;
+                Class(int a) : this.a = a;
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(int a) : this.a = a;
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check this-calls.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-              Class.named(int a) : this(a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(this.a);
-              Class.named(int a) : this(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              String a;
-              Class(var a) : this.a = a;
-              Class.named(int a) : this(a);
-            }
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(String a) : this.a = a;
-              Class.named(int a) : this(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check this-calls.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+                Class.named(int a) : this(a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(this.a);
+                Class.named(int a) : this(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                String a;
+                Class(var a) : this.a = a;
+                Class.named(int a) : this(a);
+              }
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(String a) : this.a = a;
+                Class.named(int a) : this(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check super-calls.
-  check(r'''class Super {
-              var a;
-              Super(this.a);
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super {
-              String a;
-              Super(this.a);
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Super {
-              String a;
-              Super(var a) : this.a = a;
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super {
-              String a;
-              Super(String a) : this.a = a;
-            }
-            class Class extends Super {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check super-calls.
+    check(r'''class Super {
+                var a;
+                Super(this.a);
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super {
+                String a;
+                Super(this.a);
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Super {
+                String a;
+                Super(var a) : this.a = a;
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super {
+                String a;
+                Super(String a) : this.a = a;
+              }
+              class Class extends Super {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check super-calls involving generics.
-  check(r'''class Super<T> {
-              var a;
-              Super(this.a);
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super<T> {
-              T a;
-              Super(this.a);
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Super<T> {
-              T a;
-              Super(var a) : this.a = a;
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''');
-  check(r'''class Super<T> {
-              T a;
-              Super(T a) : this.a = a;
-            }
-            class Class extends Super<String> {
-              Class.named(int a) : super(a);
-            }
-            ''', NOT_ASSIGNABLE);
+    // Check super-calls involving generics.
+    check(r'''class Super<T> {
+                var a;
+                Super(this.a);
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super<T> {
+                T a;
+                Super(this.a);
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Super<T> {
+                T a;
+                Super(var a) : this.a = a;
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              '''),
+    check(r'''class Super<T> {
+                T a;
+                Super(T a) : this.a = a;
+              }
+              class Class extends Super<String> {
+                Class.named(int a) : super(a);
+              }
+              ''', NOT_ASSIGNABLE),
 
-  // Check instance creations.
-  check(r'''class Class {
-              var a;
-              Class(this.a);
-            }
-            method(int a) => new Class(a);
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(this.a);
-            }
-            method(int a) => new Class(a);
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class {
-              String a;
-              Class(var a) : this.a = a;
-            }
-            method(int a) => new Class(a);
-            ''');
-  check(r'''class Class {
-              String a;
-              Class(String a) : this.a = a;
-            }
-            method(int a) => new Class(a);
-            ''', NOT_ASSIGNABLE);
+    // Check instance creations.
+    check(r'''class Class {
+                var a;
+                Class(this.a);
+              }
+              method(int a) => new Class(a);
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(this.a);
+              }
+              method(int a) => new Class(a);
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class {
+                String a;
+                Class(var a) : this.a = a;
+              }
+              method(int a) => new Class(a);
+              '''),
+    check(r'''class Class {
+                String a;
+                Class(String a) : this.a = a;
+              }
+              method(int a) => new Class(a);
+              ''', NOT_ASSIGNABLE),
 
-  // Check instance creations involving generics.
-  check(r'''class Class<T> {
-              var a;
-              Class(this.a);
-            }
-            method(int a) => new Class<String>(a);
-            ''');
-  check(r'''class Class<T> {
-              T a;
-              Class(this.a);
-            }
-            method(int a) => new Class<String>(a);
-            ''', NOT_ASSIGNABLE);
-  check(r'''class Class<T> {
-              T a;
-              Class(var a) : this.a = a;
-            }
-            method(int a) => new Class<String>(a);
-            ''');
-  check(r'''class Class<T> {
-              T a;
-              Class(String a) : this.a = a;
-            }
-            method(int a) => new Class<String>(a);
-            ''', NOT_ASSIGNABLE);
+    // Check instance creations involving generics.
+    check(r'''class Class<T> {
+                var a;
+                Class(this.a);
+              }
+              method(int a) => new Class<String>(a);
+              '''),
+    check(r'''class Class<T> {
+                T a;
+                Class(this.a);
+              }
+              method(int a) => new Class<String>(a);
+              ''', NOT_ASSIGNABLE),
+    check(r'''class Class<T> {
+                T a;
+                Class(var a) : this.a = a;
+              }
+              method(int a) => new Class<String>(a);
+              '''),
+    check(r'''class Class<T> {
+                T a;
+                Class(String a) : this.a = a;
+              }
+              method(int a) => new Class<String>(a);
+              ''', NOT_ASSIGNABLE),
+  ]);
 }
 
-void testGetterSetterInvocation() {
+void testGetterSetterInvocation(MockCompiler compiler) {
   compiler.parseScript(r'''int get variable => 0;
                            void set variable(String s) {}
 
@@ -1485,7 +1546,7 @@
                            ''');
 
   check(String text, [expectedWarnings]) {
-    analyze('{ $text }', warnings: expectedWarnings);
+    analyze(compiler, '{ $text }', warnings: expectedWarnings);
   }
 
   check("variable = '';");
@@ -1548,7 +1609,7 @@
   check("sc.setterField = 0;");
 }
 
-testTypePromotionHints() {
+testTypePromotionHints(MockCompiler compiler) {
   compiler.parseScript(r'''class A {
                              var a = "a";
                            }
@@ -1573,7 +1634,11 @@
                            ''');
 
   check(String text, {warnings, hints, infos}) {
-    analyze('{ $text }', warnings: warnings, hints: hints, infos: infos);
+    analyze(compiler,
+            '{ $text }',
+            warnings: warnings,
+            hints: hints,
+            infos: infos);
   }
 
   check(r'''
@@ -1717,7 +1782,7 @@
       infos: []);
 }
 
-void testCascade() {
+void testCascade(MockCompiler compiler) {
   compiler.parseScript(r'''typedef A AFunc();
                            typedef Function FuncFunc();
                            class A {
@@ -1740,7 +1805,11 @@
                            ''');
 
   check(String text, {warnings, hints, infos}) {
-    analyze('{ $text }', warnings: warnings, hints: hints, infos: infos);
+    analyze(compiler,
+            '{ $text }',
+            warnings: warnings,
+            hints: hints,
+            infos: infos);
   }
 
   check('A a = new A()..a;');
@@ -1921,9 +1990,6 @@
 }
 class SubFunction implements Function {}''';
 
-Types types;
-MockCompiler compiler;
-
 String returnWithType(String type, expression) {
   return "$type foo() { return $expression; }";
 }
@@ -1965,7 +2031,7 @@
 }
 ''';
 
-void setup() {
+Future setup(test(MockCompiler compiler)) {
   RegExp classNum = new RegExp(r'abstract class num {}');
   Expect.isTrue(DEFAULT_CORELIB.contains(classNum));
   RegExp classInt = new RegExp(r'abstract class int extends num { }');
@@ -1978,20 +2044,14 @@
       .replaceAll(classInt, INT_SOURCE)
       .replaceAll(classString, STRING_SOURCE);
 
-  compiler = new MockCompiler(coreSource: CORE_SOURCE);
-  types = compiler.types;
-  voidType = const VoidType();
-  intType = compiler.intClass.computeType(compiler);
-  doubleType = compiler.doubleClass.computeType(compiler);
-  boolType = compiler.boolClass.computeType(compiler);
-  stringType = compiler.stringClass.computeType(compiler);
-  objectType = compiler.objectClass.computeType(compiler);
+  MockCompiler compiler = new MockCompiler.internal(coreSource: CORE_SOURCE);
+  return compiler.init().then((_) => test(compiler));
 }
 
-DartType analyzeType(String text) {
+DartType analyzeType(MockCompiler compiler, String text) {
   var node = parseExpression(text);
-  TypeCheckerVisitor visitor =
-      new TypeCheckerVisitor(compiler, new TreeElementMapping(null), types);
+  TypeCheckerVisitor visitor = new TypeCheckerVisitor(
+      compiler, new TreeElementMapping(null), compiler.types);
   return visitor.analyze(node);
 }
 
@@ -1999,43 +2059,47 @@
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
+  MockCompiler compiler = new MockCompiler.internal();
   compiler.diagnosticHandler = createHandler(compiler, text);
 
-  LibraryElement library = mockLibrary(compiler, text);
+  return compiler.init().then((_) {
+    LibraryElement library = compiler.mainApp;
 
-  Link<Element> topLevelElements = parseUnit(text, compiler, library).reverse();
+    Link<Element> topLevelElements =
+        parseUnit(text, compiler, library).reverse();
 
-  Element element = null;
-  Node node;
-  TreeElements mapping;
-  // Resolve all declarations and members.
-  for (Link<Element> elements = topLevelElements;
-       !elements.isEmpty;
-       elements = elements.tail) {
-    element = elements.head;
-    if (element.isClass) {
-      ClassElement classElement = element;
-      classElement.ensureResolved(compiler);
-      classElement.forEachLocalMember((Element e) {
-        if (!e.isSynthesized) {
-          element = e;
-          node = element.parseNode(compiler);
-          mapping = compiler.resolver.resolve(element);
-        }
-      });
-    } else {
-      node = element.parseNode(compiler);
-      mapping = compiler.resolver.resolve(element);
+    Element element = null;
+    Node node;
+    TreeElements mapping;
+    // Resolve all declarations and members.
+    for (Link<Element> elements = topLevelElements;
+         !elements.isEmpty;
+         elements = elements.tail) {
+      element = elements.head;
+      if (element.isClass) {
+        ClassElement classElement = element;
+        classElement.ensureResolved(compiler);
+        classElement.forEachLocalMember((Element e) {
+          if (!e.isSynthesized) {
+            element = e;
+            node = element.parseNode(compiler);
+            mapping = compiler.resolver.resolve(element);
+          }
+        });
+      } else {
+        node = element.parseNode(compiler);
+        mapping = compiler.resolver.resolve(element);
+      }
     }
-  }
-  // Type check last class declaration or member.
-  TypeCheckerVisitor checker =
-      new TypeCheckerVisitor(compiler, mapping, types);
-  compiler.clearMessages();
-  checker.analyze(node);
-  compareWarningKinds(text, expectedWarnings, compiler.warnings);
+    // Type check last class declaration or member.
+    TypeCheckerVisitor checker =
+        new TypeCheckerVisitor(compiler, mapping, compiler.types);
+    compiler.clearMessages();
+    checker.analyze(node);
+    compareWarningKinds(text, expectedWarnings, compiler.warnings);
 
-  compiler.diagnosticHandler = null;
+    compiler.diagnosticHandler = null;
+  });
 }
 
 /**
@@ -2044,7 +2108,9 @@
  * a list of [MessageKind]s. If [hints] and [infos] are [:null:] the
  * corresponding message kinds are ignored.
  */
-analyze(String text, {errors, warnings, List hints, List infos}) {
+analyze(MockCompiler compiler,
+        String text,
+        {errors, warnings, List hints, List infos}) {
   if (warnings == null) warnings = [];
   if (warnings is !List) warnings = [warnings];
   if (errors == null) errors = [];
@@ -2061,8 +2127,8 @@
     new CompilationUnitElementX(new Script(null, null, null), compiler.mainApp);
   Element function = new MockElement(compilationUnit);
   TreeElements elements = compiler.resolveNodeStatement(node, function);
-  TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
-                                                                types);
+  TypeCheckerVisitor checker = new TypeCheckerVisitor(
+      compiler, elements, compiler.types);
   compiler.clearMessages();
   checker.analyze(node);
   compareWarningKinds(text, warnings, compiler.warnings);
@@ -2072,7 +2138,7 @@
   compiler.diagnosticHandler = null;
 }
 
-void generateOutput(String text) {
+void generateOutput(MockCompiler compiler, String text) {
   for (WarningMessage message in compiler.warnings) {
     Node node = message.node;
     var beginToken = node.getBeginToken();
@@ -2085,7 +2151,10 @@
   }
 }
 
-analyzeIn(Element element, String text, [expectedWarnings]) {
+analyzeIn(MockCompiler compiler,
+          Element element,
+          String text,
+          [expectedWarnings]) {
   if (expectedWarnings == null) expectedWarnings = [];
   if (expectedWarnings is !List) expectedWarnings = [expectedWarnings];
 
@@ -2095,10 +2164,10 @@
   parser.parseStatement(tokens);
   Node node = listener.popNode();
   TreeElements elements = compiler.resolveNodeStatement(node, element);
-  TypeCheckerVisitor checker = new TypeCheckerVisitor(compiler, elements,
-                                                                types);
+  TypeCheckerVisitor checker = new TypeCheckerVisitor(
+      compiler, elements, compiler.types);
   compiler.clearMessages();
   checker.analyze(node);
-  generateOutput(text);
+  generateOutput(compiler, text);
   compareWarningKinds(text, expectedWarnings, compiler.warnings);
 }
diff --git a/tests/compiler/dart2js/type_combination_test.dart b/tests/compiler/dart2js/type_combination_test.dart
index b063bf5..dfd0bbd 100644
--- a/tests/compiler/dart2js/type_combination_test.dart
+++ b/tests/compiler/dart2js/type_combination_test.dart
@@ -2,11 +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.
 
+import "package:async_helper/async_helper.dart";
 import "package:expect/expect.dart";
 import "compiler_helper.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
+import "package:compiler/implementation/types/types.dart";
 import "type_mask_test_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart';
+import 'package:compiler/implementation/js_backend/js_backend.dart';
 
 TypeMask nullType;
 TypeMask objectType;
@@ -676,59 +677,60 @@
 }
 
 void main() {
-  MockCompiler compiler = new MockCompiler();
-  JavaScriptBackend backend = compiler.backend;
-  compiler.interceptorsLibrary.forEachLocalMember((element) {
-    if (element.isClass) {
-      compiler.enqueuer.resolution.registerInstantiatedClass(
-          element, compiler.globalDependencies);
-    }
-  });
-  compiler.enqueuer.resolution.registerInstantiatedClass(
-      compiler.mapClass, compiler.globalDependencies);
-  compiler.world.populate();
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    JavaScriptBackend backend = compiler.backend;
+    compiler.interceptorsLibrary.forEachLocalMember((element) {
+      if (element.isClass) {
+        compiler.enqueuer.resolution.registerInstantiatedClass(
+            element, compiler.globalDependencies);
+      }
+    });
+    compiler.enqueuer.resolution.registerInstantiatedClass(
+        compiler.mapClass, compiler.globalDependencies);
+    compiler.world.populate();
 
-  // Grab hold of a supertype for String so we can produce potential
-  // string types.
-  patternClass = compiler.coreLibrary.find('Pattern');
+    // Grab hold of a supertype for String so we can produce potential
+    // string types.
+    patternClass = compiler.coreLibrary.find('Pattern');
 
-  nonPrimitive1 = new TypeMask.nonNullSubtype(
-      compiler.mapClass);
-  nonPrimitive2 = new TypeMask.nonNullSubtype(
-      compiler.functionClass);
-  potentialArray = new TypeMask.subtype(
-      compiler.listClass);
-  potentialString = new TypeMask.subtype(patternClass);
-  jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
-  jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
-  jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
-  jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
-  jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
-  jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
-  jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
-  jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
-  jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
-  jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
-  jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
-  jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
-  jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
-  jsString = new TypeMask.nonNullExact(backend.jsStringClass);
-  jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
-  jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
-  jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
-  jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
-  jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
-  jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
-  jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
-  jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
-  nullType = const TypeMask.empty();
-  objectType = new TypeMask.nonNullSubclass(
-      compiler.objectClass);
-  emptyType = const TypeMask.nonNullEmpty();
-  dynamicType = new TypeMask.subclass(
-      compiler.objectClass);
+    nonPrimitive1 = new TypeMask.nonNullSubtype(
+        compiler.mapClass);
+    nonPrimitive2 = new TypeMask.nonNullSubtype(
+        compiler.functionClass);
+    potentialArray = new TypeMask.subtype(
+        compiler.listClass);
+    potentialString = new TypeMask.subtype(patternClass);
+    jsInterceptor = new TypeMask.nonNullSubclass(backend.jsInterceptorClass);
+    jsArrayOrNull = new TypeMask.subclass(backend.jsArrayClass);
+    jsReadableArray = new TypeMask.nonNullSubclass(backend.jsArrayClass);
+    jsMutableArrayOrNull = new TypeMask.subclass(backend.jsMutableArrayClass);
+    jsMutableArray = new TypeMask.nonNullSubclass(backend.jsMutableArrayClass);
+    jsFixedArrayOrNull = new TypeMask.exact(backend.jsFixedArrayClass);
+    jsFixedArray = new TypeMask.nonNullExact(backend.jsFixedArrayClass);
+    jsExtendableArrayOrNull = new TypeMask.exact(backend.jsExtendableArrayClass);
+    jsExtendableArray = new TypeMask.nonNullExact(backend.jsExtendableArrayClass);
+    jsIndexableOrNull = new TypeMask.subtype(backend.jsIndexableClass);
+    jsIndexable = new TypeMask.nonNullSubtype(backend.jsIndexableClass);
+    jsInterceptorOrNull = new TypeMask.subclass(backend.jsInterceptorClass);
+    jsStringOrNull = new TypeMask.exact(backend.jsStringClass);
+    jsString = new TypeMask.nonNullExact(backend.jsStringClass);
+    jsBoolean = new TypeMask.nonNullExact(backend.jsBoolClass);
+    jsNumber = new TypeMask.nonNullSubclass(backend.jsNumberClass);
+    jsInteger = new TypeMask.nonNullExact(backend.jsIntClass);
+    jsDouble = new TypeMask.nonNullExact(backend.jsDoubleClass);
+    jsBooleanOrNull = new TypeMask.exact(backend.jsBoolClass);
+    jsNumberOrNull = new TypeMask.subclass(backend.jsNumberClass);
+    jsIntegerOrNull = new TypeMask.exact(backend.jsIntClass);
+    jsDoubleOrNull = new TypeMask.exact(backend.jsDoubleClass);
+    nullType = const TypeMask.empty();
+    objectType = new TypeMask.nonNullSubclass(
+        compiler.objectClass);
+    emptyType = const TypeMask.nonNullEmpty();
+    dynamicType = new TypeMask.subclass(
+        compiler.objectClass);
 
-  testUnion(compiler);
-  testIntersection(compiler);
-  testRegressions(compiler);
+    testUnion(compiler);
+    testIntersection(compiler);
+    testRegressions(compiler);
+  }));
 }
diff --git a/tests/compiler/dart2js/type_equals_test.dart b/tests/compiler/dart2js/type_equals_test.dart
index 11a6004..4831015 100644
--- a/tests/compiler/dart2js/type_equals_test.dart
+++ b/tests/compiler/dart2js/type_equals_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
diff --git a/tests/compiler/dart2js/type_guard_unuser_test.dart b/tests/compiler/dart2js/type_guard_unuser_test.dart
index 7df302b..a6703b9 100644
--- a/tests/compiler/dart2js/type_guard_unuser_test.dart
+++ b/tests/compiler/dart2js/type_guard_unuser_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -41,28 +43,31 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
-  RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
-  Iterator<Match> matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 0);
-  Expect.isTrue(
-      generated.contains(
-          new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
-
-  generated = compile(TEST_TWO, entry: 'foo');
-  regexp = new RegExp("foo\\(1\\)");
-  matches = regexp.allMatches(generated).iterator;
-  checkNumberOfMatches(matches, 1);
-
-  generated = compile(TEST_THREE, entry: 'foo');
-  regexp = new RegExp(getNumberTypeCheck('a'));
-  Expect.isTrue(regexp.hasMatch(generated));
-  regexp = new RegExp(getNumberTypeCheck('b'));
-  Expect.isTrue(regexp.hasMatch(generated));
-
-  generated = compile(TEST_THREE_WITH_BAILOUT, entry: 'foo');
-  regexp = new RegExp(getNumberTypeCheck('a'));
-  Expect.isTrue(regexp.hasMatch(generated));
-  regexp = new RegExp(getNumberTypeCheck('b'));
-  Expect.isTrue(regexp.hasMatch(generated));
+  asyncTest(() => Future.wait([
+    compile(TEST_ONE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getIntTypeCheck(anyIdentifier));
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 0);
+      Expect.isTrue(
+          generated.contains(
+              new RegExp(r'return a === true \? [$A-Z]+\.foo\(2\) : b;')));
+    }),
+    compile(TEST_TWO, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp("foo\\(1\\)");
+      Iterator<Match> matches = regexp.allMatches(generated).iterator;
+      checkNumberOfMatches(matches, 1);
+    }),
+    compile(TEST_THREE, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    }),
+    compile(TEST_THREE_WITH_BAILOUT, entry: 'foo', check: (String generated) {
+      RegExp regexp = new RegExp(getNumberTypeCheck('a'));
+      Expect.isTrue(regexp.hasMatch(generated));
+      regexp = new RegExp(getNumberTypeCheck('b'));
+      Expect.isTrue(regexp.hasMatch(generated));
+    })
+  ]));
 }
diff --git a/tests/compiler/dart2js/type_inference2_test.dart b/tests/compiler/dart2js/type_inference2_test.dart
index a1613ac..5e5f224 100644
--- a/tests/compiler/dart2js/type_inference2_test.dart
+++ b/tests/compiler/dart2js/type_inference2_test.dart
@@ -2,6 +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.
 
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -13,5 +14,5 @@
 """;
 
 main() {
-  compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x");
+  asyncTest(() => compileAndMatchFuzzy(TEST_ONE, 'sum', r"\+\+x"));
 }
diff --git a/tests/compiler/dart2js/type_inference3_test.dart b/tests/compiler/dart2js/type_inference3_test.dart
index 17aa7be..baefe2c 100644
--- a/tests/compiler/dart2js/type_inference3_test.dart
+++ b/tests/compiler/dart2js/type_inference3_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -14,7 +15,8 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'sum');
-  RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
-  Expect.isTrue(regexp.hasMatch(generated));
+  asyncTest(() => compile(TEST_ONE, entry: 'sum', check: (String generated) {
+    RegExp regexp = new RegExp(getNumberTypeCheck('(param1|b)'));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_inference4_test.dart b/tests/compiler/dart2js/type_inference4_test.dart
index ace9eee..e8c4180 100644
--- a/tests/compiler/dart2js/type_inference4_test.dart
+++ b/tests/compiler/dart2js/type_inference4_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -16,13 +17,14 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Test for absence of an illegal argument exception. This means that the
-  // arguments are known to be integers.
-  Expect.isFalse(generated.contains('iae'));
-  // Also make sure that we are not just in bailout mode without speculative
-  // types by grepping for the integer-bailout check on argument j.
-  RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
-  Expect.isTrue(regexp.hasMatch(generated));
+    // Test for absence of an illegal argument exception. This means that the
+    // arguments are known to be integers.
+    Expect.isFalse(generated.contains('iae'));
+    // Also make sure that we are not just in bailout mode without speculative
+    // types by grepping for the integer-bailout check on argument j.
+    RegExp regexp = new RegExp(getIntTypeCheck('[aji]'));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_inference5_test.dart b/tests/compiler/dart2js/type_inference5_test.dart
index ba46456..4bf5caa 100644
--- a/tests/compiler/dart2js/type_inference5_test.dart
+++ b/tests/compiler/dart2js/type_inference5_test.dart
@@ -2,7 +2,8 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const String TEST_ONE = r"""
@@ -15,16 +16,18 @@
 """;
 
 main() {
-  String generated = compile(TEST_ONE, entry: 'foo');
+  asyncTest(() => compile(TEST_ONE, entry: 'foo', check: (String generated) {
 
-  // Test for absence of an illegal argument exception. This means that the
-  // arguments are known to be integers.
-  Expect.isFalse(generated.contains('iae'));
-  // Also make sure that we are not just in bailout mode without speculative
-  // types by grepping for the integer-bailout check on argument j.
-  var argname =
-      new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)').firstMatch(generated)[1];
-  print(argname);
-  RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
-  Expect.isTrue(regexp.hasMatch(generated));
+    // Test for absence of an illegal argument exception. This means that the
+    // arguments are known to be integers.
+    Expect.isFalse(generated.contains('iae'));
+    // Also make sure that we are not just in bailout mode without speculative
+    // types by grepping for the integer-bailout check on argument j.
+    var argname =
+        new RegExp(r'function(?: [a-z]+)?\(([a-zA-Z0-9_]+)\)')
+            .firstMatch(generated)[1];
+    print(argname);
+    RegExp regexp = new RegExp(getIntTypeCheck("(i|$argname)"));
+    Expect.isTrue(regexp.hasMatch(generated));
+  }));
 }
diff --git a/tests/compiler/dart2js/type_mask_test.dart b/tests/compiler/dart2js/type_mask_test.dart
index b0a190b..c1cc2fa 100644
--- a/tests/compiler/dart2js/type_mask_test.dart
+++ b/tests/compiler/dart2js/type_mask_test.dart
@@ -6,7 +6,7 @@
 import "package:async_helper/async_helper.dart";
 import 'compiler_helper.dart';
 import 'parser_helper.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
+import "package:compiler/implementation/types/types.dart";
 
 const String CODE = """
 class A {}
diff --git a/tests/compiler/dart2js/type_mask_test_helper.dart b/tests/compiler/dart2js/type_mask_test_helper.dart
index 88f234d..129ec7a 100644
--- a/tests/compiler/dart2js/type_mask_test_helper.dart
+++ b/tests/compiler/dart2js/type_mask_test_helper.dart
@@ -4,8 +4,8 @@
 
 library type_mask_test_helper;
 
-import '../../../sdk/lib/_internal/compiler/implementation/types/types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/types/types.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     show Compiler;
 
 TypeMask simplify(TypeMask mask, Compiler compiler) {
diff --git a/tests/compiler/dart2js/type_order_test.dart b/tests/compiler/dart2js/type_order_test.dart
index eb6a7c5..9eacf78 100644
--- a/tests/compiler/dart2js/type_order_test.dart
+++ b/tests/compiler/dart2js/type_order_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement, TypedefElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/type_representation_test.dart b/tests/compiler/dart2js/type_representation_test.dart
index 482c03a..51df26a 100644
--- a/tests/compiler/dart2js/type_representation_test.dart
+++ b/tests/compiler/dart2js/type_representation_test.dart
@@ -7,11 +7,11 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/js/js.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/js/js.dart';
+import 'package:compiler/implementation/elements/elements.dart'
        show Element, ClassElement;
-import '../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart'
+import 'package:compiler/implementation/js_backend/js_backend.dart'
        show JavaScriptBackend, TypeRepresentationGenerator;
 
 void main() {
diff --git a/tests/compiler/dart2js/type_substitution_test.dart b/tests/compiler/dart2js/type_substitution_test.dart
index 42aa623..2559a44 100644
--- a/tests/compiler/dart2js/type_substitution_test.dart
+++ b/tests/compiler/dart2js/type_substitution_test.dart
@@ -6,7 +6,7 @@
 
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart_types.dart';
 import "compiler_helper.dart";
 import "parser_helper.dart";
 import "type_test_helper.dart";
diff --git a/tests/compiler/dart2js/type_test_helper.dart b/tests/compiler/dart2js/type_test_helper.dart
index dd7c322..a790262 100644
--- a/tests/compiler/dart2js/type_test_helper.dart
+++ b/tests/compiler/dart2js/type_test_helper.dart
@@ -8,14 +8,14 @@
 import 'package:expect/expect.dart';
 import 'compiler_helper.dart' as mock;
 import 'memory_compiler.dart' as memory;
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart_types.dart';
+import 'package:compiler/implementation/dart2jslib.dart'
     show Compiler;
-import '../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart'
+import 'package:compiler/implementation/elements/elements.dart'
     show Element,
          TypeDeclarationElement,
          ClassElement;
-import '../../../sdk/lib/_internal/compiler/implementation/util/util.dart'
+import 'package:compiler/implementation/util/util.dart'
     show Link, LinkBuilder;
 
 GenericType instantiate(TypeDeclarationElement element,
diff --git a/tests/compiler/dart2js/type_variable_occurrence_test.dart b/tests/compiler/dart2js/type_variable_occurrence_test.dart
index 5c71028..7e69860 100644
--- a/tests/compiler/dart2js/type_variable_occurrence_test.dart
+++ b/tests/compiler/dart2js/type_variable_occurrence_test.dart
@@ -7,8 +7,8 @@
 import 'package:expect/expect.dart';
 import "package:async_helper/async_helper.dart";
 import 'type_test_helper.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/dart_types.dart';
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import 'package:compiler/implementation/dart_types.dart';
+import "package:compiler/implementation/elements/elements.dart"
        show Element, ClassElement;
 
 void main() {
diff --git a/tests/compiler/dart2js/union_type_test.dart b/tests/compiler/dart2js/union_type_test.dart
index 984880f..966d4c5 100644
--- a/tests/compiler/dart2js/union_type_test.dart
+++ b/tests/compiler/dart2js/union_type_test.dart
@@ -3,22 +3,24 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
+import "package:async_helper/async_helper.dart";
 import "compiler_helper.dart";
 import "parser_helper.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/types/types.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart_types.dart";
+import "package:compiler/implementation/types/types.dart";
+import "package:compiler/implementation/dart_types.dart";
 
 main() {
-  MockCompiler compiler = new MockCompiler();
-  compiler.intClass.ensureResolved(compiler);
-  compiler.stringClass.ensureResolved(compiler);
+  asyncTest(() => MockCompiler.create((MockCompiler compiler) {
+    compiler.intClass.ensureResolved(compiler);
+    compiler.stringClass.ensureResolved(compiler);
 
-  FlatTypeMask mask1 =
-      new FlatTypeMask.exact(compiler.intClass);
-  FlatTypeMask mask2 =
-      new FlatTypeMask.exact(compiler.stringClass);
-  UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler);
-  UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler);
-  Expect.equals(union1, union2);
+    FlatTypeMask mask1 =
+        new FlatTypeMask.exact(compiler.intClass);
+    FlatTypeMask mask2 =
+        new FlatTypeMask.exact(compiler.stringClass);
+    UnionTypeMask union1 = mask1.nonNullable().union(mask2, compiler);
+    UnionTypeMask union2 = mask2.nonNullable().union(mask1, compiler);
+    Expect.equals(union1, union2);
+  }));
 }
diff --git a/tests/compiler/dart2js/unneeded_part_js_test.dart b/tests/compiler/dart2js/unneeded_part_js_test.dart
index abbd674..dadcb60 100644
--- a/tests/compiler/dart2js/unneeded_part_js_test.dart
+++ b/tests/compiler/dart2js/unneeded_part_js_test.dart
@@ -8,10 +8,10 @@
 import "package:async_helper/async_helper.dart";
 import 'memory_source_file_helper.dart';
 
-import '../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart'
+import 'package:compiler/implementation/dart2jslib.dart'
        show NullSink;
 
-import '../../../sdk/lib/_internal/compiler/compiler.dart'
+import 'package:compiler/compiler.dart'
        show Diagnostic;
 
 import 'dart:async';
diff --git a/tests/compiler/dart2js/unparser2_test.dart b/tests/compiler/dart2js/unparser2_test.dart
index ced1c31..bbf3e3d 100644
--- a/tests/compiler/dart2js/unparser2_test.dart
+++ b/tests/compiler/dart2js/unparser2_test.dart
@@ -3,18 +3,18 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/scanner/scannerlib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart";
+import "package:compiler/implementation/scanner/scannerlib.dart";
+import "package:compiler/implementation/tree/tree.dart";
 
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart"
+import "package:compiler/implementation/dart2jslib.dart"
     show DiagnosticListener,
          Script;
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/elements.dart"
+import "package:compiler/implementation/elements/elements.dart"
     show CompilationUnitElement,
          LibraryElement;
 
-import "../../../sdk/lib/_internal/compiler/implementation/elements/modelx.dart"
+import "package:compiler/implementation/elements/modelx.dart"
     show CompilationUnitElementX,
          LibraryElementX;
 
diff --git a/tests/compiler/dart2js/unparser_test.dart b/tests/compiler/dart2js/unparser_test.dart
index 21fe65d..a14f676 100644
--- a/tests/compiler/dart2js/unparser_test.dart
+++ b/tests/compiler/dart2js/unparser_test.dart
@@ -5,7 +5,7 @@
 import "package:expect/expect.dart";
 import 'parser_helper.dart';
 import 'mock_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/tree/tree.dart';
+import 'package:compiler/implementation/tree/tree.dart';
 
 testUnparse(String statement) {
   Node node = parseStatement(statement);
diff --git a/tests/compiler/dart2js/uri_extras_test.dart b/tests/compiler/dart2js/uri_extras_test.dart
index 477b84c..fcbc49c 100644
--- a/tests/compiler/dart2js/uri_extras_test.dart
+++ b/tests/compiler/dart2js/uri_extras_test.dart
@@ -4,7 +4,7 @@
 
 import "package:expect/expect.dart";
 
-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import 'package:compiler/implementation/util/uri_extras.dart';
 
 
 void testRelativize() {
diff --git a/tests/compiler/dart2js/value_range2_test.dart b/tests/compiler/dart2js/value_range2_test.dart
index df274a8..5bebf99 100644
--- a/tests/compiler/dart2js/value_range2_test.dart
+++ b/tests/compiler/dart2js/value_range2_test.dart
@@ -3,9 +3,9 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "package:expect/expect.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/ssa/ssa.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/dart2jslib.dart";
-import "../../../sdk/lib/_internal/compiler/implementation/js_backend/js_backend.dart";
+import "package:compiler/implementation/ssa/ssa.dart";
+import "package:compiler/implementation/dart2jslib.dart";
+import "package:compiler/implementation/js_backend/js_backend.dart";
 
 ValueRangeInfo info = new ValueRangeInfo(const JavaScriptConstantSystem());
 
diff --git a/tests/compiler/dart2js/value_range_test.dart b/tests/compiler/dart2js/value_range_test.dart
index 5ea7ee6..c77437b 100644
--- a/tests/compiler/dart2js/value_range_test.dart
+++ b/tests/compiler/dart2js/value_range_test.dart
@@ -2,7 +2,9 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-import "package:expect/expect.dart";
+import 'dart:async';
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
 import 'compiler_helper.dart';
 
 const int REMOVED = 0;
@@ -345,53 +347,61 @@
   class JSUInt31 extends JSUInt32 {}
   getInterceptor(x) {}''';
 
-expect(String code, int kind) {
-  String generated = compile(
+Future expect(String code, int kind) {
+  return compile(
       code,
       coreSource: DEFAULT_CORELIB_WITH_LIST_INTERFACE,
-      interceptorsSource: INTERCEPTORSLIB_WITH_MEMBERS);
-  switch (kind) {
-    case REMOVED:
-      Expect.isTrue(!generated.contains('ioore'));
-      break;
+      interceptorsSource: INTERCEPTORSLIB_WITH_MEMBERS,
+      check: (String generated) {
+    switch (kind) {
+      case REMOVED:
+        Expect.isTrue(!generated.contains('ioore'));
+        break;
 
-    case ABOVE_ZERO:
-      Expect.isTrue(!generated.contains('< 0'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case ABOVE_ZERO:
+        Expect.isTrue(!generated.contains('< 0'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case BELOW_ZERO_CHECK:
-      Expect.isTrue(generated.contains('< 0'));
-      Expect.isTrue(!generated.contains('||'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case BELOW_ZERO_CHECK:
+        Expect.isTrue(generated.contains('< 0'));
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case BELOW_LENGTH:
-      Expect.isTrue(!generated.contains('||'));
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case BELOW_LENGTH:
+        Expect.isTrue(!generated.contains('||'));
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case KEPT:
-      Expect.isTrue(generated.contains('ioore'));
-      break;
+      case KEPT:
+        Expect.isTrue(generated.contains('ioore'));
+        break;
 
-    case ONE_CHECK:
-      RegExp regexp = new RegExp('ioore');
-      Iterator matches = regexp.allMatches(generated).iterator;
-      checkNumberOfMatches(matches, 1);
-      break;
+      case ONE_CHECK:
+        RegExp regexp = new RegExp('ioore');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
 
-    case ONE_ZERO_CHECK:
-      RegExp regexp = new RegExp('< 0|>>> 0 !==');
-      Iterator matches = regexp.allMatches(generated).iterator;
-      checkNumberOfMatches(matches, 1);
-      break;
-  }
+      case ONE_ZERO_CHECK:
+        RegExp regexp = new RegExp('< 0|>>> 0 !==');
+        Iterator matches = regexp.allMatches(generated).iterator;
+        checkNumberOfMatches(matches, 1);
+        break;
+    }
+  });
 }
 
 
 main() {
-  for (int i = 0; i < TESTS.length;  i += 2) {
-    expect(TESTS[i], TESTS[i + 1]);
+  int i = 0;
+  Future testNext() {
+    return expect(TESTS[i], TESTS[i + 1]).then((_) {
+      i += 2;
+      if (i < TESTS.length) return testNext();
+    });
   }
+
+  asyncTest(() => testNext());
 }
diff --git a/tests/compiler/dart2js/warnings_checker.dart b/tests/compiler/dart2js/warnings_checker.dart
index fc70bef..9a3474a 100644
--- a/tests/compiler/dart2js/warnings_checker.dart
+++ b/tests/compiler/dart2js/warnings_checker.dart
@@ -10,10 +10,10 @@
 import 'package:expect/expect.dart';
 import 'package:async_helper/async_helper.dart';
 import 'memory_compiler.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/filenames.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/source_file_provider.dart';
-import '../../../sdk/lib/_internal/compiler/implementation/util/uri_extras.dart';
+import 'package:compiler/implementation/filenames.dart';
+import 'package:compiler/implementation/source_file.dart';
+import 'package:compiler/implementation/source_file_provider.dart';
+import 'package:compiler/implementation/util/uri_extras.dart';
 import 'dart:convert';
 
 void checkWarnings(Map<String, dynamic> tests, [List<String> arguments]) {
diff --git a/tests/compiler/dart2js_native/lru_test.dart b/tests/compiler/dart2js_native/lru_test.dart
new file mode 100644
index 0000000..f5c5200
--- /dev/null
+++ b/tests/compiler/dart2js_native/lru_test.dart
@@ -0,0 +1,10 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "dart:_internal" show LRUMap;
+import "../../lib/mirrors/lru_expect.dart";
+
+main() {
+  expect((shift) => new LRUMap.withShift(shift));
+}
diff --git a/tests/corelib/corelib.status b/tests/corelib/corelib.status
index 373b67b..35e97c4 100644
--- a/tests/corelib/corelib.status
+++ b/tests/corelib/corelib.status
@@ -88,10 +88,6 @@
 string_base_vm_test: RuntimeError, OK # VM specific test.
 nan_infinity_test/01: Fail # Issue 11551
 
-[ $compiler == dart2js || $compiler == dart2dart]
-symbol_operator_test/01: CompileTimeError # Issue 15653.
-symbol_operator_test/02: CompileTimeError # Issue 15653.
-
 [ $compiler == dart2js && $runtime == none ]
 *: Fail, Pass # TODO(ahe): Triage these tests.
 
@@ -105,11 +101,8 @@
 
 [ $compiler == dart2js && ($runtime == firefox || $runtime == safari || $runtime == chrome || $runtime == drt) ]
 
-[ $compiler == dart2js && ($runtime == drt || $runtime == safari || $runtime == safarimobilesim) ]
-string_trimlr_test/none: Fail # Bug in v8. Fixed in v8 r19222, 2014-02-10.
-
-[ $compiler == dart2js && ( $runtime == drt) ]
-string_case_test/02: Fail, OK  # Bug in our version of V8.
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim) ]
+string_trimlr_test/none: Fail
 
 [ $compiler == dart2js && ($runtime == ie9 || $runtime == ie10) ]
 string_case_test/01: Fail, OK  # Bug in IE.
@@ -163,3 +156,7 @@
 [ $runtime == ie9 || $runtime == ie10 ]
 num_parse_test: RuntimeError  # Issue 15316
 num_parse_test/01: RuntimeError  # Issue 15316
+
+[ $system == windows && $arch == x64 ]
+stopwatch_test: Skip  # Flaky test due to expected performance behaviour.
+
diff --git a/tests/corelib/symbol_operator_test.dart b/tests/corelib/symbol_operator_test.dart
index 13cd8bc..981f44b 100644
--- a/tests/corelib/symbol_operator_test.dart
+++ b/tests/corelib/symbol_operator_test.dart
@@ -24,8 +24,8 @@
   testSymbol(#>, $>$, ">");
   testSymbol(#>=, $>=$, ">=");
   testSymbol(#==, new Symbol("=="), "==");  // Can't hit noSuchMethod.
-  testSymbol(#[], $[$], "[]");                      /// 01: ok
-  testSymbol(#[]=, ($[$]=$).lastMember, "[]=");     /// 02: ok
+  testSymbol(#[], $[$], "[]");
+  testSymbol(#[]=, ($[$]=$).lastMember, "[]=");
   testSymbol(const Symbol("unary-"), -$, "unary-");
 
   testSymbolThrows(">>>");  /// 03: ok
diff --git a/tests/corelib/uri_ipv6_test.dart b/tests/corelib/uri_ipv6_test.dart
index 0f3ba03..65014da 100644
--- a/tests/corelib/uri_ipv6_test.dart
+++ b/tests/corelib/uri_ipv6_test.dart
@@ -19,36 +19,36 @@
   path = 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:8080/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(8080, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:80/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('http://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]/index.html',
+  Expect.equals('http://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/index.html',
                 uri.toString());
 
   path = 'https://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]:443/index.html';
   uri = Uri.parse(path);
   Expect.equals('https', uri.scheme);
-  Expect.equals('FEDC:BA98:7654:3210:FEDC:BA98:7654:3210', uri.host);
+  Expect.equals('fedc:ba98:7654:3210:fedc:ba98:7654:3210', uri.host);
   Expect.equals(443, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('https://[FEDC:BA98:7654:3210:FEDC:BA98:7654:3210]/index.html',
+  Expect.equals('https://[fedc:ba98:7654:3210:fedc:ba98:7654:3210]/index.html',
                 uri.toString());
 
   path = 'http://[1080:0:0:0:8:800:200C:417A]/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('1080:0:0:0:8:800:200C:417A', uri.host);
+  Expect.equals('1080:0:0:0:8:800:200c:417a', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[3ffe:2a00:100:7031::1]';
   uri = Uri.parse(path);
@@ -61,10 +61,10 @@
   path = 'http://[1080::8:800:200C:417A]/foo';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('1080::8:800:200C:417A', uri.host);
+  Expect.equals('1080::8:800:200c:417a', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/foo', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[::192.9.5.5]/ipng';
   uri = Uri.parse(path);
@@ -77,34 +77,34 @@
   path = 'http://[::FFFF:129.144.52.38]:8080/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(8080, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 
   path = 'http://[::FFFF:129.144.52.38]:80/index.html';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('http://[::FFFF:129.144.52.38]/index.html', uri.toString());
+  Expect.equals('http://[::ffff:129.144.52.38]/index.html', uri.toString());
 
   path = 'https://[::FFFF:129.144.52.38]:443/index.html';
   uri = Uri.parse(path);
   Expect.equals('https', uri.scheme);
-  Expect.equals('::FFFF:129.144.52.38', uri.host);
+  Expect.equals('::ffff:129.144.52.38', uri.host);
   Expect.equals(443, uri.port);
   Expect.equals('/index.html', uri.path);
-  Expect.equals('https://[::FFFF:129.144.52.38]/index.html', uri.toString());
+  Expect.equals('https://[::ffff:129.144.52.38]/index.html', uri.toString());
 
   path = 'http://[2010:836B:4179::836B:4179]';
   uri = Uri.parse(path);
   Expect.equals('http', uri.scheme);
-  Expect.equals('2010:836B:4179::836B:4179', uri.host);
+  Expect.equals('2010:836b:4179::836b:4179', uri.host);
   Expect.equals(80, uri.port);
   Expect.equals('', uri.path);
-  Expect.equals(path, uri.toString());
+  Expect.equals(path.toLowerCase(), uri.toString());
 }
 
 
diff --git a/tests/corelib/uri_scheme_test.dart b/tests/corelib/uri_scheme_test.dart
index 2565e70..f816624 100644
--- a/tests/corelib/uri_scheme_test.dart
+++ b/tests/corelib/uri_scheme_test.dart
@@ -5,10 +5,10 @@
 import "package:expect/expect.dart";
 
 void testInvalidArguments() {
-  Expect.throws(() => new Uri(scheme: "_"), (e) => e is ArgumentError);
-  Expect.throws(() => new Uri(scheme: "http_s"), (e) => e is ArgumentError);
+  Expect.throws(() => new Uri(scheme: "_"), (e) => e is FormatException);
+  Expect.throws(() => new Uri(scheme: "http_s"), (e) => e is FormatException);
   Expect.throws(() => new Uri(scheme: "127.0.0.1:80"),
-                (e) => e is ArgumentError);
+                (e) => e is FormatException);
 }
 
 void testScheme() {
diff --git a/tests/corelib/uri_test.dart b/tests/corelib/uri_test.dart
index 19d4019..703515d 100644
--- a/tests/corelib/uri_test.dart
+++ b/tests/corelib/uri_test.dart
@@ -124,6 +124,236 @@
       Uri.parse("http://localhost").resolveUri(new Uri(path: path)).toString());
 }
 
+const ALPHA = r"abcdefghijklmnopqrstuvwxuzABCDEFGHIJKLMNOPQRSTUVWXUZ";
+const DIGIT = r"0123456789";
+const PERCENT_ENCODED = "%00%ff";
+const SUBDELIM = r"!$&'()*+,;=";
+
+const SCHEMECHAR = "$ALPHA$DIGIT+-.";
+const UNRESERVED = "$ALPHA$DIGIT-._~";
+const REGNAMECHAR = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED";
+const USERINFOCHAR = "$REGNAMECHAR:";
+
+const PCHAR_NC = "$UNRESERVED$SUBDELIM$PERCENT_ENCODED@";
+const PCHAR = "$PCHAR_NC:";
+const QUERYCHAR = "$PCHAR/?";
+
+void testValidCharacters() {
+  // test that all valid characters are accepted.
+
+  for (var scheme in ["", "$SCHEMECHAR$SCHEMECHAR:"]) {
+    for (var userinfo in ["", "@", "$USERINFOCHAR$USERINFOCHAR@",
+                          "$USERINFOCHAR:$DIGIT@"]) {
+      for (var host in ["", "$REGNAMECHAR$REGNAMECHAR",
+                        "255.255.255.256",  // valid reg-name.
+                        "[ffff::ffff:ffff]", "[ffff::255.255.255.255]"]) {
+        for (var port in ["", ":", ":$DIGIT$DIGIT"]) {
+          var auth = "$userinfo$host$port";
+          if (auth.isNotEmpty) auth = "//$auth";
+          var paths = ["", "/", "/$PCHAR", "/$PCHAR/"];  // Absolute or empty.
+          if (auth.isNotEmpty) {
+            // Initial segment may be empty.
+            paths..add("//$PCHAR");
+          } else {
+            // Path may begin with non-slash.
+            if (scheme.isEmpty) {
+              // Initial segment must not contain colon.
+              paths..add(PCHAR_NC)
+                   ..add("$PCHAR_NC/$PCHAR")
+                   ..add("$PCHAR_NC/$PCHAR/");
+            } else {
+              paths..add(PCHAR)
+                   ..add("$PCHAR/$PCHAR")
+                   ..add("$PCHAR/$PCHAR/");
+            }
+          }
+          for (var path in paths) {
+            for (var query in ["", "?", "?$QUERYCHAR"]) {
+              for (var fragment in ["", "#", "#$QUERYCHAR"]) {
+                var uri = "$scheme$auth$path$query$fragment";
+                // Should not throw.
+                var result = Uri.parse(uri);
+              }
+            }
+          }
+        }
+      }
+    }
+  }
+}
+
+void testInvalidUrls() {
+  void checkInvalid(uri) {
+    try {
+      var result = Uri.parse(uri);
+      Expect.fail("Invalid URI `$uri` parsed to $result\n" + dump(result));
+    } on FormatException {
+      // Success.
+    }
+  }
+  checkInvalid("s%41://x.x/");      // No escapes in scheme,
+                                    // and no colon before slash in path.
+  checkInvalid("1a://x.x/");        // Scheme must start with letter,
+                                    // and no colon before slash in path.
+  checkInvalid(".a://x.x/");        // Scheme must start with letter,
+                                    // and no colon before slash in path.
+  checkInvalid("_:");               // Character not valid in scheme,
+                                    // and no colon before slash in path.
+  checkInvalid(":");                // Scheme must start with letter,
+                                    // and no colon before slash in path.
+
+  void checkInvalidReplaced(uri, invalid, replacement) {
+    var source = uri.replaceAll('{}', invalid);
+    var expected = uri.replaceAll('{}', replacement);
+    var result = Uri.parse(source);
+    Expect.equals(expected, "$result", "Source: $source\n${dump(result)}");
+  }
+
+  // Regression test for http://dartbug.com/16081
+  checkInvalidReplaced("http://www.example.org/red%09ros{}#red)",
+                       "\u00e9", "%C3%A9");
+  checkInvalidReplaced("http://r{}sum\{}.example.org", "\u00E9", "%C3%A9");
+
+  // Invalid characters. The characters must be rejected, even if normalizing
+  // the input would cause them to be valid (normalization happens after
+  // validation).
+  var invalidCharsAndReplacements = [
+    "\xe7",      "%C3%A7",       // Arbitrary non-ASCII letter
+    " ",         "%20",          // Space, not allowed anywhere.
+    '"',         "%22",          // Quote, not allowed anywhere
+    "<>",        "%3C%3E",       // Less/greater-than, not allowed anywhere.
+    "\x7f",      "%7F",          // DEL, not allowed anywhere
+    "\xdf",      "%C3%9F",       // German lower-case scharf-S.
+                                 // Becomes ASCII when upper-cased.
+    "\u0130",    "%C4%B0",       // Latin capital dotted I,
+                                 // becomes ASCII lower-case in Turkish.
+    "%\uFB03",   "%25%EF%AC%83", // % + Ligature ffi,
+                                 // becomes ASCII when upper-cased,
+                                 // should not be read as "%FFI".
+    "\u212a",    "%E2%84%AA",    // Kelvin sign. Becomes ASCII when lower-cased.
+    "%1g",       "%251g",        // Invalid escape.
+    "\u{10000}", "%F0%90%80%80", // Non-BMP character as surrogate pair.
+  ];
+  for (int i = 0; i < invalidCharsAndReplacements.length; i += 2) {
+    var invalid = invalidCharsAndReplacements[i];
+    var valid = invalidCharsAndReplacements[i + 1];
+    checkInvalid("A{}b:///".replaceAll('{}', invalid));
+    checkInvalid("{}b:///".replaceAll('{}', invalid));
+    checkInvalidReplaced("s://user{}info@x.x/", invalid, valid);
+    checkInvalidReplaced("s://reg{}name/", invalid, valid);
+    checkInvalid("s://regname:12{}45/".replaceAll("{}", invalid));
+    checkInvalidReplaced("s://regname/p{}ath/", invalid, valid);
+    checkInvalidReplaced("/p{}ath/", invalid, valid);
+    checkInvalidReplaced("p{}ath/", invalid, valid);
+    checkInvalidReplaced("s://regname/path/?x{}x", invalid, valid);
+    checkInvalidReplaced("s://regname/path/#x{}x", invalid, valid);
+    checkInvalidReplaced("s://regname/path/??#x{}x", invalid, valid);
+  }
+
+  // At most one @ in userinfo.
+  checkInvalid("s://x@x@x.x/");
+  // No colon in host except before a port.
+  checkInvalid("s://x@x:x/");
+  // At most one port.
+  checkInvalid("s://x@x:9:9/");
+  // At most one #.
+  checkInvalid("s://x/x#foo#bar");
+  // @ not allowed in scheme.
+  checkInvalid("s@://x:9/x?x#x");
+  // ] not allowed alone in host.
+  checkInvalid("s://xx]/");
+  // ] not allowed anywhere except in host.
+  checkInvalid("s://xx/]");
+  checkInvalid("s://xx/?]");
+  checkInvalid("s://xx/#]");
+  checkInvalid("s:/]");
+  checkInvalid("s:/?]");
+  checkInvalid("s:/#]");
+  // IPv6 must be enclosed in [ and ] for Uri.parse.
+  // It is allowed un-enclosed as argument to `Uri(host:...)` because we don't
+  // need to delimit.
+  checkInvalid("s://ffff::ffff:1234/");
+}
+
+void testNormalization() {
+  // The Uri constructor and the Uri.parse function performs RFC-3986
+  // syntax based normalization.
+
+  var uri;
+
+  // Scheme: Only case normalization. Schemes cannot contain escapes.
+  uri = Uri.parse("A:");
+  Expect.equals("a", uri.scheme);
+  uri = Uri.parse("Z:");
+  Expect.equals("z", uri.scheme);
+  uri = Uri.parse("$SCHEMECHAR:");
+  Expect.equals(SCHEMECHAR.toLowerCase(), uri.scheme);
+
+  // Percent escape normalization.
+  // Escapes of unreserved characters are converted to the character,
+  // subject to case normalization in reg-name.
+  for (var i = 0; i < UNRESERVED.length; i++) {
+    var char = UNRESERVED[i];
+    var escape = "%" + char.codeUnitAt(0).toRadixString(16);  // all > 0xf.
+
+    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
+                    "?vV${escape}vV#wW${escape}wW");
+    Expect.equals("xX${char}xX", uri.userInfo);
+    Expect.equals("yY${char}yY".toLowerCase(), uri.host);
+    Expect.equals("/zZ${char}zZ", uri.path);
+    Expect.equals("vV${char}vV", uri.query);
+    Expect.equals("wW${char}wW", uri.fragment);
+  }
+
+  // Escapes of reserved characters are kept, but upper-cased.
+  for (var escape in ["%00", "%1f", "%7F", "%fF"]) {
+    uri = Uri.parse("s://xX${escape}xX@yY${escape}yY/zZ${escape}zZ"
+                    "?vV${escape}vV#wW${escape}wW");
+    var normalizedEscape = escape.toUpperCase();
+    Expect.equals("xX${normalizedEscape}xX", uri.userInfo);
+    Expect.equals("yy${normalizedEscape}yy", uri.host);
+    Expect.equals("/zZ${normalizedEscape}zZ", uri.path);
+    Expect.equals("vV${normalizedEscape}vV", uri.query);
+    Expect.equals("wW${normalizedEscape}wW", uri.fragment);
+  }
+
+  // Some host normalization edge cases.
+  uri = Uri.parse("x://x%61X%41x%41X%61x/");
+  Expect.equals("xaxaxaxax", uri.host);
+
+  uri = Uri.parse("x://Xxxxxxxx/");
+  Expect.equals("xxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://xxxxxxxX/");
+  Expect.equals("xxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://xxxxxxxx%61/");
+  Expect.equals("xxxxxxxxa", uri.host);
+
+  uri = Uri.parse("x://%61xxxxxxxx/");
+  Expect.equals("axxxxxxxx", uri.host);
+
+  uri = Uri.parse("x://X/");
+  Expect.equals("x", uri.host);
+
+  uri = Uri.parse("x://%61/");
+  Expect.equals("a", uri.host);
+
+  uri = new Uri(scheme: "x", path: "//y");
+  Expect.equals("//y", uri.path);
+  Expect.equals("x:////y", uri.toString());
+
+  uri = new Uri(scheme: "file", path: "//y");
+  Expect.equals("//y", uri.path);
+  Expect.equals("file:////y", uri.toString());
+
+  // File scheme noralizes to always showing authority, even if empty.
+  uri = new Uri(scheme: "file", path: "/y");
+  Expect.equals("file:///y", uri.toString());
+  uri = new Uri(scheme: "file", path: "y");
+  Expect.equals("file:///y", uri.toString());
+}
+
 main() {
   testUri("http:", true);
   testUri("file://", true);
@@ -233,7 +463,7 @@
 
   Expect.stringEquals("\u{10000}", s);
 
-  testEncodeDecode("A + B", "A%20%2B%20B");
+  testEncodeDecode("A + B", "A%20+%20B");
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
   testEncodeDecode("\uFFFF", "%EF%BF%BF");
   testEncodeDecode("\uFFFE", "%EF%BF%BE");
@@ -241,7 +471,29 @@
   testEncodeDecode("\x7f", "%7F");
   testEncodeDecode("\x80", "%C2%80");
   testEncodeDecode("\u0800", "%E0%A0%80");
-  testEncodeDecode(":/@',;?&=+\$", ":/@',;?&=%2B\$");
+  // All characters not escaped by encodeFull.
+  var unescapedFull =
+      r"abcdefghijklmnopqrstuvwxyz"
+      r"ABCDEFGHIJKLMNOPQRSTUVWXYZ"
+      r"0123456789!#$&'()*+,-./:;=?@_~";
+  // ASCII characters escaped by encodeFull:
+  var escapedFull =
+      "\x00\x01\x02\x03\x04\x05\x06\x07\x08\x09\x0a\x0b\x0c\x0d\x0e\x0f"
+      "\x10\x11\x12\x13\x14\x15\x16\x17\x18\x19\x1a\x1b\x1c\x1d\x1e\x1f"
+      r' "%<>[\]^`{|}'
+      "\x7f";
+  var escapedTo =
+      "%00%01%02%03%04%05%06%07%08%09%0A%0B%0C%0D%0E%0F"
+      "%10%11%12%13%14%15%16%17%18%19%1A%1B%1C%1D%1E%1F"
+      "%20%22%25%3C%3E%5B%5C%5D%5E%60%7B%7C%7D%7F";
+  testEncodeDecode(unescapedFull, unescapedFull);
+  testEncodeDecode(escapedFull, escapedTo);
+  var nonAscii =
+      "\x80-\xff-\u{100}-\u{7ff}-\u{800}-\u{ffff}-\u{10000}-\u{10ffff}";
+  var nonAsciiEncoding =
+      "%C2%80-%C3%BF-%C4%80-%DF%BF-%E0%A0%80-%EF%BF%BF-"
+      "%F0%90%80%80-%F4%8F%BF%BF";
+  testEncodeDecode(nonAscii, nonAsciiEncoding);
   testEncodeDecode(s, "%F0%90%80%80");
   testEncodeDecodeComponent("A + B", "A%20%2B%20B");
   testEncodeDecodeComponent("\uFFFE", "%EF%BF%BE");
@@ -256,9 +508,25 @@
   testEncodeDecodeQueryComponent("A + B", "A+%2B+B", "A+%2B+B", "A+%2B+B");
   testEncodeDecodeQueryComponent(
       "æ ø å", "%C3%A6+%C3%B8+%C3%A5", "%E6+%F8+%E5", null);
+  testEncodeDecodeComponent(nonAscii, nonAsciiEncoding);
 
   // Invalid URI - : and @ is swapped, port ("host") should be numeric.
   Expect.throws(
       () => Uri.parse("file://user@password:host/path"),
       (e) => e is FormatException);
+
+  testValidCharacters();
+  testInvalidUrls();
+  testNormalization();
+}
+
+String dump(Uri uri) {
+  return "URI: $uri\n"
+      "  Scheme:    ${uri.scheme} #${uri.scheme.length}\n"
+      "  User-info: ${uri.userInfo} #${uri.userInfo.length}\n"
+      "  Host:      ${uri.host} #${uri.host.length}\n"
+      "  Port:      ${uri.port}\n"
+      "  Path:      ${uri.path} #${uri.path.length}\n"
+      "  Query:     ${uri.query} #${uri.query.length}\n"
+      "  Fragment:  ${uri.fragment} #${uri.fragment.length}\n";
 }
diff --git a/tests/html/html.status b/tests/html/html.status
index 782d633..bbb4ec6 100644
--- a/tests/html/html.status
+++ b/tests/html/html.status
@@ -10,6 +10,10 @@
 form_data_test/functional: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 indexeddb_5_test: Fail # Issue 18931 (Disabled for Chrome 35 roll)
 custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll)
+blob_constructor_test: Fail # Issue 19500
+transferables_test: Fail # Issue 19500
+indexeddb_1_test/functional: Skip # Issue 19512 (timing out)
+xhr_test/xhr: RuntimeError # Issue 18049
 
 [ $compiler == dart2js && $csp ]
 custom/js_custom_test: Fail # Issue 14643
@@ -18,16 +22,15 @@
 [ $compiler == dart2js && $browser ]
 custom/created_callback_test: Fail # Support for created constructor.
 
-[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie) ]
+[ $compiler == dart2js && ($runtime == safari || $runtime == safarimobilesim || $runtime == ff  || $ie || $runtime == chrome) ]
 custom/entered_left_view_test/viewless_document: Fail # Polyfill does not handle this
-custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Polyfill does not support
+
+[ $compiler == dart2js && $runtime == chrome ]
+custom/attribute_changed_callback_test/unsupported_on_polyfill: Fail # Issue 18931 (Disabled for Chrome 35 roll
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium) && $mode == debug && $system == macos]
 audiobuffersourcenode_test: Pass, Fail, Crash # http://crbug.com/256601
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) && $checked ]
-xhr_test/xhr: Pass, RuntimeError # Issue 18049
-
 [ $compiler == none && $runtime == dartium && $system == macos]
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Pass,Fail # Issue 11834
 
@@ -38,18 +41,23 @@
 async_test: Fail # Background timers not implemented.
 keyboard_event_test: Fail # Issue 13902
 isolates_test: Fail # Issue 13921
-custom/element_upgrade_test: Skip # Issue 17298
+indexeddb_3_test: Skip # Issue 19578.  Timeouts and RuntimeError
 
 [ $compiler == none && ($runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) && $mode == debug ]
 websocket_test/websocket: Skip # Issue 17666
-canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip #Issue 17666
+canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: Skip # Issue 17666
 
 [ $compiler == none && $runtime == ContentShellOnAndroid ]
-element_offset_test/offset: Pass, Fail # Issue 17550
-mouse_event_test: Skip # Times out. Issue 19127
-css_test/supportsPointConversions: Skip # Times out. Issue 19127
+audiobuffersourcenode_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
+audiocontext_test/functional: Skip # Causes the following (next) test to time out.  Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element: RuntimeError # Issue 19127
 canvasrenderingcontext2d_test/drawImage_video_element_dataUrl: RuntimeError # Issue 19127
+css_test/supportsPointConversions: Skip # Times out. Issue 19127
+element_offset_test/offset: Skip # Issue 17550
+indexeddb_1_test/functional: RuntimeError # Issue 19127. Actually a timeout, but do not skip.
+mouse_event_test: Skip # Times out. Issue 19127
+request_animation_frame_test: Timeout # Issue 19127. Do not skip, for stability.
+xhr_test/xhr: RuntimeError # Issue 19127
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 worker_test/functional: Pass, Crash # Issue 9929.
@@ -100,6 +108,11 @@
 websql_test: Fail, Pass # Issue 4941: stderr contains a backtrace.
 native_gc_test: Pass, Slow
 
+[ $compiler == dart2js && $runtime == drt ]
+shadow_dom_test/ShadowDOM_tests: Fail # Issue 19426
+shadow_dom_test/supported: Fail # Issue 19426
+shadowroot_test: Fail # Issue 19426
+
 [ $compiler == dart2js && $runtime == drt && $system == macos]
 audiobuffersourcenode_test: Pass, Fail
 
@@ -314,6 +327,9 @@
 xhr_test/supported_overrideMimeType: Fail
 xsltprocessor_test/supported: Fail
 
+[ $compiler == dart2js && $runtime == drt && $unchecked ]
+audiocontext_test/functional: Fail
+
 [ $runtime == safari || $runtime == safarimobilesim ]
 worker_test: Skip # Issue 13221
 worker_api_test: Skip # Issue 13221
diff --git a/tests/isolate/isolate.status b/tests/isolate/isolate.status
index fae13ca..96060d7 100644
--- a/tests/isolate/isolate.status
+++ b/tests/isolate/isolate.status
@@ -79,6 +79,9 @@
 [ $jscl || $runtime == ie9 ]
 spawn_uri_multi_test/none: RuntimeError # http://dartbug.com/13544
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+nested_spawn2_test: Skip # Issue 19127: This test is timing out.
+
 [ $compiler == none && ($runtime == dartium || $runtime == ContentShellOnAndroid) ]
 spawn_uri_nested_vm_test: Skip # Issue 14479: This test is timing out.
 
diff --git a/tests/language/closure_self_reference_test.dart b/tests/language/closure_self_reference_test.dart
new file mode 100644
index 0000000..9ffc951
--- /dev/null
+++ b/tests/language/closure_self_reference_test.dart
@@ -0,0 +1,23 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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';
+
+// Tests a self-reference of a closure inside a try/catch.
+// Dart2js must not try to box the closure-reference.
+
+main() {
+  var counter = 0;
+  inner(value) {
+    if (value == 0) return 0;
+    try {
+      return inner(value - 1);
+    } finally {
+      counter++;
+    }
+  }
+
+  Expect.equals(0, inner(499));
+  Expect.equals(499, counter);
+}
diff --git a/tests/language/const_global_test.dart b/tests/language/const_global_test.dart
new file mode 100644
index 0000000..20d8a58
--- /dev/null
+++ b/tests/language/const_global_test.dart
@@ -0,0 +1,18 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+const a = 1;
+
+main() {
+    Expect.equals(1, a);
+    Expect.equals(1, const A(a).a);
+    Expect.equals(1, const [const A(a)][0].a);
+}
+
+class A {
+    final a;
+    const A(this.a);
+}
diff --git a/tests/language/const_list_test.dart b/tests/language/const_list_test.dart
index dd7c183..57fc509 100644
--- a/tests/language/const_list_test.dart
+++ b/tests/language/const_list_test.dart
@@ -6,7 +6,7 @@
 
 class ConstListTest {
 
-  static testMain() {
+  static testConstructors() {
     List fixedList = new List(4);
     List fixedList2 = new List(4);
     List growableList = new List();
@@ -28,6 +28,9 @@
     Expect.equals(false, fixedList == growableList);
     fixedList[3] = 0;
     Expect.equals(false, fixedList == growableList);
+  }
+
+  static testLiterals() {
     var a = [1, 2, 3.1];
     var b = [1, 2, 3.1];
     Expect.equals(false, a == b);
@@ -44,5 +47,6 @@
 }
 
 main() {
-  ConstListTest.testMain();
+  ConstListTest.testConstructors();
+  ConstListTest.testLiterals();
 }
diff --git a/tests/language/const_local_test.dart b/tests/language/const_local_test.dart
new file mode 100644
index 0000000..bc5b71b
--- /dev/null
+++ b/tests/language/const_local_test.dart
@@ -0,0 +1,17 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+main() {
+    const a = 1;
+    Expect.equals(1, a);
+    Expect.equals(1, const A(a).a);
+    Expect.equals(1, const [const A(a)][0].a);
+}
+
+class A {
+    final a;
+    const A(this.a);
+}
diff --git a/tests/language/const_map4_test.dart b/tests/language/const_map4_test.dart
new file mode 100644
index 0000000..b263a2c
--- /dev/null
+++ b/tests/language/const_map4_test.dart
@@ -0,0 +1,23 @@
+// 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.
+
+import "package:expect/expect.dart";
+
+main() {
+    var a = {1: 'a', 2: 'b', 3: 'c'};
+    var b = {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(false, a == b);
+
+    a = const {1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(true, a == b);
+
+    a = const <num,String>{1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(false, a == b);
+
+    a = const <dynamic,dynamic>{1: 'a', 2: 'b', 3: 'c'};
+    b = const {1: 'a', 2: 'b', 3: 'c'};
+    Expect.equals(true, a == b);
+}
diff --git a/tests/language/critical_edge2_test.dart b/tests/language/critical_edge2_test.dart
new file mode 100644
index 0000000..75e3f13
--- /dev/null
+++ b/tests/language/critical_edge2_test.dart
@@ -0,0 +1,38 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test broke dart2js.
+// A compiler must not construct a critical edge on this program.
+//
+// See critical_edge_test.dart for a description of the problem.
+
+import "package:expect/expect.dart";
+
+String parse(String uri) {
+  int index = 0;
+  int char = -1;
+
+  void parseAuth() {
+    index;
+    char;
+  }
+
+  while (index < 1000) {
+    char = uri.codeUnitAt(index);
+    if (char == 1234) {
+      break;
+    }
+    if (char == 0x3A) {
+      return "good";
+    }
+    index++;
+  }
+
+  print(char);
+  return "bad";
+}
+
+main() {
+  Expect.equals("good", parse("dart:_foreign_helper"));
+}
diff --git a/tests/language/critical_edge_test.dart b/tests/language/critical_edge_test.dart
new file mode 100644
index 0000000..28c7fd4
--- /dev/null
+++ b/tests/language/critical_edge_test.dart
@@ -0,0 +1,66 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// This test broke dart2js.
+// A compiler must not construct a critical edge on this program.
+//
+// In particular we have to watch out for:
+//  - the while-loop branch going to the body-block and to the exit-block, and
+//  - the exit-block having as incoming the condition-block and the
+//    break-blocks.
+//
+// Triggering the bug is relatively hard, since pushing instructions back the
+// exit-block to the incoming blocks is not guaranteed to trigger an error.
+// Dart2js frequently ended up with update-assignments just before the
+// condition:
+//    for (int i = 0; state = state0, i < 10; i++) {
+//      if (..) { state = 1; }
+//      ...
+//    }
+//    use(state);
+//
+// In this case the "state" variable was assigned before the loop and then
+// reassigned before the break. The exit-block pushed the assignment back
+// to its incoming blocks and that's why the "state = state0" assignment ended
+// up just before the condition.
+// Note that the assignment was executed at every iteration instead of just
+// when exiting the loop.
+// This repeated assignments don't have any negative effect unless the state
+// variable is also assigned and used inside the loop-body. It turns out that
+// this is very rare and needs some tricks to make happen.
+
+import "package:expect/expect.dart";
+
+String parse(String uri) {
+  int index = 0;
+  int char = -1;
+
+  void parseAuth() {
+    index;
+    char;
+  }
+
+  int state = 0;
+  while (true) {
+    char = uri.codeUnitAt(index);
+    if (char == 1234) {
+      state = (index == 0) ? 1 : 2;
+      break;
+    }
+    if (char == 0x3A) {
+      return "good";
+    }
+    index++;
+  }
+
+  if (state == 1) {
+    print(char == 1234);
+    print(index == uri.length);
+  }
+  return "bad";
+}
+
+main() {
+  Expect.equals("good", parse("dart:_foreign_helper"));
+}
diff --git a/tests/language/external_test.dart b/tests/language/external_test.dart
index 06ccb36..6fb32df 100644
--- a/tests/language/external_test.dart
+++ b/tests/language/external_test.dart
@@ -2,10 +2,16 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
+class Bar {
+  Bar(val);
+}
+
 class Foo {
   var x;
   f() {}
 
+  Foo() : x = 0;
+
   external var x01;  /// 01: compile-time error
   external int x02;  /// 02: compile-time error
 
@@ -16,10 +22,12 @@
   static external f14();  /// 14: compile-time error
   int external f16();  /// 16: compile-time error
 
-  external Foo.n20();  /// 20: runtime error
-  external Foo.n21() : x(1);  /// 21: compile-time error
-  external Foo.n22() { x = 1; }  /// 22: compile-time error
-  external factory Foo.n23() => new Foo();  /// 23: compile-time error
+  external Foo.n20(val);  /// 20: runtime error
+  external Foo.n21(val) : x = 1;  /// 21: compile-time error
+  external Foo.n22(val) { x = 1; }  /// 22: compile-time error
+  external factory Foo.n23(val) => new Foo();  /// 23: compile-time error
+  external Foo.n24(this.x);  /// 24: compile-time error
+  external factory Foo.n25(val) = Bar;  /// 25: compile-time error
 }
 
 external int t06(int i) { }  /// 30: compile-time error
@@ -27,39 +35,24 @@
 
 main() {
 
-  // Try calling an unpatched external function.
+  // Ensure Foo class is compiled.
   var foo = new Foo();
-  try {                                               /// 10: continued
-    foo.f05();                                        /// 10: continued
-  } on String catch (exc) {                           /// 10: continued
-    if (exc == "External implementation missing.") {  /// 10: continued
-      throw exc;                                      /// 10: continued
-    }                                                 /// 10: continued
-  }                                                   /// 10: continued
 
+  // Try calling an unpatched external function.
+  new Foo().f10();                                    /// 10: continued
   new Foo().f11();                                    /// 11: continued
   new Foo().f12();                                    /// 12: continued
-
-  try {                                               /// 13: continued
-    Foo.f13();                                        /// 13: continued
-  } on String catch (exc) {                           /// 13: continued
-    if (exc == "External implementation missing.") {  /// 13: continued
-      throw exc;                                      /// 13: continued
-    }                                                 /// 13: continued
-  }                                                   /// 13: continued
+  Foo.f13();                                          /// 13: continued
+  Foo.f14();                                          /// 14: continued
+  new Foo().f16();                                    /// 16: continued
 
   // Try calling an unpatched external constructor.
-  try {                                               /// 20: continued
-    var foo = new Foo.n09();                          /// 20: continued
-  } on String catch (exc) {                           /// 20: continued
-    if (exc == "External implementation missing.") {  /// 20: continued
-      throw exc;                                      /// 20: continued
-    }                                                 /// 20: continued
-  }                                                   /// 20: continued
-
-  new Foo.n21();                                      /// 21: continued
-  new Foo.n22();                                      /// 22: continued
-  new Foo.n23();                                      /// 23: continued
+  new Foo.n20(1);                                      /// 20: continued
+  new Foo.n21(1);                                      /// 21: continued
+  new Foo.n22(1);                                      /// 22: continued
+  new Foo.n23(1);                                      /// 23: continued
+  new Foo.n24(1);                                      /// 24: continued
+  new Foo.n25(1);                                      /// 25: continued
 
   t06(1);                                             /// 30: continued
   t07(1);                                             /// 31: continued
diff --git a/tests/language/keyword_type_expression_test.dart b/tests/language/keyword_type_expression_test.dart
new file mode 100644
index 0000000..66755b9
--- /dev/null
+++ b/tests/language/keyword_type_expression_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.
+
+// Test that a keyword can't be used as type.  Serves as regression test for
+// crashes in dart2js.
+
+in greeting = "fisk";  /// 01: compile-time error
+
+main(
+in greeting  /// 02: compile-time error
+) {
+  in greeting = "fisk";  /// 03: compile-time error
+  print(greeting);  /// 01: continued
+}
diff --git a/tests/language/language.status b/tests/language/language.status
index bdf580a..482b4ba 100644
--- a/tests/language/language.status
+++ b/tests/language/language.status
@@ -112,6 +112,7 @@
 first_class_types_literals_test: Pass, Fail # Issue 13719: Please triage this failure.
 
 [ $compiler == none && ( $runtime == dartium || $runtime == drt || $runtime == ContentShellOnAndroid) ]
+deferred_*: Skip # Lazy deferred loading not yet implemented in Dartium
 issue13474_test: Pass, Fail # Issue 14651.
 typed_message_test: Crash, Fail # Issue 13921, 14400
 vm/optimized_guarded_field_isolates_test: Fail # Issue 13921.
@@ -119,6 +120,12 @@
 [ $compiler == none && $runtime == drt ]
 disassemble_test: Pass, Fail # Issue 18122
 
+[ $compiler == none && $runtime == ContentShellOnAndroid ]
+closure7_test: Skip # Times out. Issue 19127
+abstract_exact_selector_test/01: Skip # Times out. Issue 19127
+function_subtype_local1_test: Skip # Times out. Issue 19127
+mixin_type_parameters_errors_test/02: Timeout # Times out. Do not skip, or more tests fail. Issue 19127
+
 [ $compiler == none && $runtime == vm && $arch == mips && $checked ]
 generic_instanceof3_test: Pass, Crash # Issue 17440.
 
diff --git a/tests/language/language_analyzer.status b/tests/language/language_analyzer.status
index 12f99e6..4c9dad1 100644
--- a/tests/language/language_analyzer.status
+++ b/tests/language/language_analyzer.status
@@ -15,6 +15,10 @@
 
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
+external_test/21: Fail
+external_test/24: Fail
+external_test/25: Fail
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -170,7 +174,6 @@
 body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
 empty_block_case_test: StaticWarning # Test Issue 18701
 error_stacktrace_test: StaticWarning # Test Issue 18702
-external_test/20: StaticWarning # Test Issue 18703
 
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
diff --git a/tests/language/language_analyzer2.status b/tests/language/language_analyzer2.status
index 695c6bc..ca4a746 100644
--- a/tests/language/language_analyzer2.status
+++ b/tests/language/language_analyzer2.status
@@ -15,6 +15,10 @@
 
 type_check_const_function_typedef2_test/00: MissingCompileTimeError, Ok # Compile-time error in checked mode, because of constants.
 
+external_test/21: Fail
+external_test/24: Fail
+external_test/25: Fail
+
 # Please add new failing tests before this line.
 # Section below is for invalid tests.
 #
@@ -159,20 +163,6 @@
 override_inheritance_no_such_method_test/04: StaticWarning # Issue 16132
 override_inheritance_no_such_method_test/05: StaticWarning # Issue 16132
 
-# analyzer issue 17983
-override_inheritance_generic_test/08: MissingStaticWarning # Issue 17983
-override_inheritance_field_test/32: MissingStaticWarning # Issue 17983
-override_inheritance_field_test/09: MissingStaticWarning # Issue 17983
-
-# missing warning for override
-override_inheritance_generic_test/07: MissingStaticWarning # Issue 16135
-override_inheritance_generic_test/09: MissingStaticWarning # Issue 16135
-
-# flaky override tests
-override_inheritance_field_test/33: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_field_test/33a: MissingStaticWarning, Pass # Issue 16498
-override_inheritance_generic_test/09: MissingStaticWarning, Pass # Issue 16498
-
 regress_19413_test/01: MissingStaticWarning # Issue 19424
 
 # The following tests are currently assumed to be failing because the test is wrong.
@@ -184,7 +174,6 @@
 body_less_constructor_wrong_arg_negative_test: CompileTimeError # Test Issue 18695
 empty_block_case_test: StaticWarning # Test Issue 18701
 error_stacktrace_test: StaticWarning # Test Issue 18702
-external_test/20: StaticWarning # Test Issue 18703
 
 const_counter_negative_test: CompileTimeError
 const_optional_args_negative_test: CompileTimeError
diff --git a/tests/language/language_dart2js.status b/tests/language/language_dart2js.status
index c46b8eb..7e9de2c 100644
--- a/tests/language/language_dart2js.status
+++ b/tests/language/language_dart2js.status
@@ -6,12 +6,12 @@
 override_inheritance_mixed_test/08: Fail # Issue 18124
 override_inheritance_mixed_test/09: Fail # Issue 18124
 bad_constructor_test/05: CompileTimeError # Issue 13669
-malformed_test/05: MissingCompileTimeError # Issue 12695
-malformed_test/06: MissingCompileTimeError # Issue 12695
 full_stacktrace1_test: Pass, RuntimeError # Issue 12698
 full_stacktrace2_test: Pass, RuntimeError # Issue 12698
 full_stacktrace3_test: Pass, RuntimeError # Issue 12698
 stacktrace_test: Pass, RuntimeError # # Issue 12698
+stacktrace_rethrow_nonerror_test: Pass, RuntimeError # Issue 12698
+stacktrace_rethrow_error_test: Pass, RuntimeError # Issue 12698
 illegal_invocation_test/01: CompileTimeError # Issue 13630
 instantiate_type_variable_test/01: CompileTimeError # Issue 13631
 library_ambiguous_test/00: CompileTimeError # Issue 13632
@@ -33,6 +33,9 @@
 ref_before_declaration_test/05: MissingCompileTimeError
 ref_before_declaration_test/06: MissingCompileTimeError
 
+external_test/10: Fail
+external_test/20: Fail
+
 setter_declaration2_negative_test: Crash # Issue 17139
 
 # VM specific tests that should not be run by dart2js.
@@ -89,6 +92,7 @@
 mixin_mixin_bound2_test: RuntimeError # Issue 12605
 
 [ $compiler == dart2js ]
+malformed_test/none: Fail # Expect failure in lib/_internal/lib/preambles/d8.js
 generic_field_mixin4_test: Crash # Issue 18651
 generic_field_mixin5_test: Crash # Issue 18651
 
@@ -97,7 +101,7 @@
 type_variable_conflict2_test/06: Crash # Issue 16180
 type_variable_conflict2_test/08: Crash # Issue 16180
 type_variable_conflict2_test/10: Crash # Issue 16180
-malformed_test/none: RuntimeError # Issue 12695
+
 branch_canonicalization_test: RuntimeError # Issue 638.
 identical_closure2_test: RuntimeError # Issue 1533, Issue 12596
 integer_division_by_zero_test: RuntimeError # Issue 8301
diff --git a/tests/language/large_class_declaration_test.dart b/tests/language/large_class_declaration_test.dart
new file mode 100644
index 0000000..2408cca
--- /dev/null
+++ b/tests/language/large_class_declaration_test.dart
@@ -0,0 +1,20018 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 compilation of classes with a large number
+// of fields.
+
+import "package:expect/expect.dart";
+
+class A {
+  var a0;
+  var a1;
+  var a2;
+  var a3;
+  var a4;
+  var a5;
+  var a6;
+  var a7;
+  var a8;
+  var a9;
+  var a10;
+  var a11;
+  var a12;
+  var a13;
+  var a14;
+  var a15;
+  var a16;
+  var a17;
+  var a18;
+  var a19;
+  var a20;
+  var a21;
+  var a22;
+  var a23;
+  var a24;
+  var a25;
+  var a26;
+  var a27;
+  var a28;
+  var a29;
+  var a30;
+  var a31;
+  var a32;
+  var a33;
+  var a34;
+  var a35;
+  var a36;
+  var a37;
+  var a38;
+  var a39;
+  var a40;
+  var a41;
+  var a42;
+  var a43;
+  var a44;
+  var a45;
+  var a46;
+  var a47;
+  var a48;
+  var a49;
+  var a50;
+  var a51;
+  var a52;
+  var a53;
+  var a54;
+  var a55;
+  var a56;
+  var a57;
+  var a58;
+  var a59;
+  var a60;
+  var a61;
+  var a62;
+  var a63;
+  var a64;
+  var a65;
+  var a66;
+  var a67;
+  var a68;
+  var a69;
+  var a70;
+  var a71;
+  var a72;
+  var a73;
+  var a74;
+  var a75;
+  var a76;
+  var a77;
+  var a78;
+  var a79;
+  var a80;
+  var a81;
+  var a82;
+  var a83;
+  var a84;
+  var a85;
+  var a86;
+  var a87;
+  var a88;
+  var a89;
+  var a90;
+  var a91;
+  var a92;
+  var a93;
+  var a94;
+  var a95;
+  var a96;
+  var a97;
+  var a98;
+  var a99;
+  var a100;
+  var a101;
+  var a102;
+  var a103;
+  var a104;
+  var a105;
+  var a106;
+  var a107;
+  var a108;
+  var a109;
+  var a110;
+  var a111;
+  var a112;
+  var a113;
+  var a114;
+  var a115;
+  var a116;
+  var a117;
+  var a118;
+  var a119;
+  var a120;
+  var a121;
+  var a122;
+  var a123;
+  var a124;
+  var a125;
+  var a126;
+  var a127;
+  var a128;
+  var a129;
+  var a130;
+  var a131;
+  var a132;
+  var a133;
+  var a134;
+  var a135;
+  var a136;
+  var a137;
+  var a138;
+  var a139;
+  var a140;
+  var a141;
+  var a142;
+  var a143;
+  var a144;
+  var a145;
+  var a146;
+  var a147;
+  var a148;
+  var a149;
+  var a150;
+  var a151;
+  var a152;
+  var a153;
+  var a154;
+  var a155;
+  var a156;
+  var a157;
+  var a158;
+  var a159;
+  var a160;
+  var a161;
+  var a162;
+  var a163;
+  var a164;
+  var a165;
+  var a166;
+  var a167;
+  var a168;
+  var a169;
+  var a170;
+  var a171;
+  var a172;
+  var a173;
+  var a174;
+  var a175;
+  var a176;
+  var a177;
+  var a178;
+  var a179;
+  var a180;
+  var a181;
+  var a182;
+  var a183;
+  var a184;
+  var a185;
+  var a186;
+  var a187;
+  var a188;
+  var a189;
+  var a190;
+  var a191;
+  var a192;
+  var a193;
+  var a194;
+  var a195;
+  var a196;
+  var a197;
+  var a198;
+  var a199;
+  var a200;
+  var a201;
+  var a202;
+  var a203;
+  var a204;
+  var a205;
+  var a206;
+  var a207;
+  var a208;
+  var a209;
+  var a210;
+  var a211;
+  var a212;
+  var a213;
+  var a214;
+  var a215;
+  var a216;
+  var a217;
+  var a218;
+  var a219;
+  var a220;
+  var a221;
+  var a222;
+  var a223;
+  var a224;
+  var a225;
+  var a226;
+  var a227;
+  var a228;
+  var a229;
+  var a230;
+  var a231;
+  var a232;
+  var a233;
+  var a234;
+  var a235;
+  var a236;
+  var a237;
+  var a238;
+  var a239;
+  var a240;
+  var a241;
+  var a242;
+  var a243;
+  var a244;
+  var a245;
+  var a246;
+  var a247;
+  var a248;
+  var a249;
+  var a250;
+  var a251;
+  var a252;
+  var a253;
+  var a254;
+  var a255;
+  var a256;
+  var a257;
+  var a258;
+  var a259;
+  var a260;
+  var a261;
+  var a262;
+  var a263;
+  var a264;
+  var a265;
+  var a266;
+  var a267;
+  var a268;
+  var a269;
+  var a270;
+  var a271;
+  var a272;
+  var a273;
+  var a274;
+  var a275;
+  var a276;
+  var a277;
+  var a278;
+  var a279;
+  var a280;
+  var a281;
+  var a282;
+  var a283;
+  var a284;
+  var a285;
+  var a286;
+  var a287;
+  var a288;
+  var a289;
+  var a290;
+  var a291;
+  var a292;
+  var a293;
+  var a294;
+  var a295;
+  var a296;
+  var a297;
+  var a298;
+  var a299;
+  var a300;
+  var a301;
+  var a302;
+  var a303;
+  var a304;
+  var a305;
+  var a306;
+  var a307;
+  var a308;
+  var a309;
+  var a310;
+  var a311;
+  var a312;
+  var a313;
+  var a314;
+  var a315;
+  var a316;
+  var a317;
+  var a318;
+  var a319;
+  var a320;
+  var a321;
+  var a322;
+  var a323;
+  var a324;
+  var a325;
+  var a326;
+  var a327;
+  var a328;
+  var a329;
+  var a330;
+  var a331;
+  var a332;
+  var a333;
+  var a334;
+  var a335;
+  var a336;
+  var a337;
+  var a338;
+  var a339;
+  var a340;
+  var a341;
+  var a342;
+  var a343;
+  var a344;
+  var a345;
+  var a346;
+  var a347;
+  var a348;
+  var a349;
+  var a350;
+  var a351;
+  var a352;
+  var a353;
+  var a354;
+  var a355;
+  var a356;
+  var a357;
+  var a358;
+  var a359;
+  var a360;
+  var a361;
+  var a362;
+  var a363;
+  var a364;
+  var a365;
+  var a366;
+  var a367;
+  var a368;
+  var a369;
+  var a370;
+  var a371;
+  var a372;
+  var a373;
+  var a374;
+  var a375;
+  var a376;
+  var a377;
+  var a378;
+  var a379;
+  var a380;
+  var a381;
+  var a382;
+  var a383;
+  var a384;
+  var a385;
+  var a386;
+  var a387;
+  var a388;
+  var a389;
+  var a390;
+  var a391;
+  var a392;
+  var a393;
+  var a394;
+  var a395;
+  var a396;
+  var a397;
+  var a398;
+  var a399;
+  var a400;
+  var a401;
+  var a402;
+  var a403;
+  var a404;
+  var a405;
+  var a406;
+  var a407;
+  var a408;
+  var a409;
+  var a410;
+  var a411;
+  var a412;
+  var a413;
+  var a414;
+  var a415;
+  var a416;
+  var a417;
+  var a418;
+  var a419;
+  var a420;
+  var a421;
+  var a422;
+  var a423;
+  var a424;
+  var a425;
+  var a426;
+  var a427;
+  var a428;
+  var a429;
+  var a430;
+  var a431;
+  var a432;
+  var a433;
+  var a434;
+  var a435;
+  var a436;
+  var a437;
+  var a438;
+  var a439;
+  var a440;
+  var a441;
+  var a442;
+  var a443;
+  var a444;
+  var a445;
+  var a446;
+  var a447;
+  var a448;
+  var a449;
+  var a450;
+  var a451;
+  var a452;
+  var a453;
+  var a454;
+  var a455;
+  var a456;
+  var a457;
+  var a458;
+  var a459;
+  var a460;
+  var a461;
+  var a462;
+  var a463;
+  var a464;
+  var a465;
+  var a466;
+  var a467;
+  var a468;
+  var a469;
+  var a470;
+  var a471;
+  var a472;
+  var a473;
+  var a474;
+  var a475;
+  var a476;
+  var a477;
+  var a478;
+  var a479;
+  var a480;
+  var a481;
+  var a482;
+  var a483;
+  var a484;
+  var a485;
+  var a486;
+  var a487;
+  var a488;
+  var a489;
+  var a490;
+  var a491;
+  var a492;
+  var a493;
+  var a494;
+  var a495;
+  var a496;
+  var a497;
+  var a498;
+  var a499;
+  var a500;
+  var a501;
+  var a502;
+  var a503;
+  var a504;
+  var a505;
+  var a506;
+  var a507;
+  var a508;
+  var a509;
+  var a510;
+  var a511;
+  var a512;
+  var a513;
+  var a514;
+  var a515;
+  var a516;
+  var a517;
+  var a518;
+  var a519;
+  var a520;
+  var a521;
+  var a522;
+  var a523;
+  var a524;
+  var a525;
+  var a526;
+  var a527;
+  var a528;
+  var a529;
+  var a530;
+  var a531;
+  var a532;
+  var a533;
+  var a534;
+  var a535;
+  var a536;
+  var a537;
+  var a538;
+  var a539;
+  var a540;
+  var a541;
+  var a542;
+  var a543;
+  var a544;
+  var a545;
+  var a546;
+  var a547;
+  var a548;
+  var a549;
+  var a550;
+  var a551;
+  var a552;
+  var a553;
+  var a554;
+  var a555;
+  var a556;
+  var a557;
+  var a558;
+  var a559;
+  var a560;
+  var a561;
+  var a562;
+  var a563;
+  var a564;
+  var a565;
+  var a566;
+  var a567;
+  var a568;
+  var a569;
+  var a570;
+  var a571;
+  var a572;
+  var a573;
+  var a574;
+  var a575;
+  var a576;
+  var a577;
+  var a578;
+  var a579;
+  var a580;
+  var a581;
+  var a582;
+  var a583;
+  var a584;
+  var a585;
+  var a586;
+  var a587;
+  var a588;
+  var a589;
+  var a590;
+  var a591;
+  var a592;
+  var a593;
+  var a594;
+  var a595;
+  var a596;
+  var a597;
+  var a598;
+  var a599;
+  var a600;
+  var a601;
+  var a602;
+  var a603;
+  var a604;
+  var a605;
+  var a606;
+  var a607;
+  var a608;
+  var a609;
+  var a610;
+  var a611;
+  var a612;
+  var a613;
+  var a614;
+  var a615;
+  var a616;
+  var a617;
+  var a618;
+  var a619;
+  var a620;
+  var a621;
+  var a622;
+  var a623;
+  var a624;
+  var a625;
+  var a626;
+  var a627;
+  var a628;
+  var a629;
+  var a630;
+  var a631;
+  var a632;
+  var a633;
+  var a634;
+  var a635;
+  var a636;
+  var a637;
+  var a638;
+  var a639;
+  var a640;
+  var a641;
+  var a642;
+  var a643;
+  var a644;
+  var a645;
+  var a646;
+  var a647;
+  var a648;
+  var a649;
+  var a650;
+  var a651;
+  var a652;
+  var a653;
+  var a654;
+  var a655;
+  var a656;
+  var a657;
+  var a658;
+  var a659;
+  var a660;
+  var a661;
+  var a662;
+  var a663;
+  var a664;
+  var a665;
+  var a666;
+  var a667;
+  var a668;
+  var a669;
+  var a670;
+  var a671;
+  var a672;
+  var a673;
+  var a674;
+  var a675;
+  var a676;
+  var a677;
+  var a678;
+  var a679;
+  var a680;
+  var a681;
+  var a682;
+  var a683;
+  var a684;
+  var a685;
+  var a686;
+  var a687;
+  var a688;
+  var a689;
+  var a690;
+  var a691;
+  var a692;
+  var a693;
+  var a694;
+  var a695;
+  var a696;
+  var a697;
+  var a698;
+  var a699;
+  var a700;
+  var a701;
+  var a702;
+  var a703;
+  var a704;
+  var a705;
+  var a706;
+  var a707;
+  var a708;
+  var a709;
+  var a710;
+  var a711;
+  var a712;
+  var a713;
+  var a714;
+  var a715;
+  var a716;
+  var a717;
+  var a718;
+  var a719;
+  var a720;
+  var a721;
+  var a722;
+  var a723;
+  var a724;
+  var a725;
+  var a726;
+  var a727;
+  var a728;
+  var a729;
+  var a730;
+  var a731;
+  var a732;
+  var a733;
+  var a734;
+  var a735;
+  var a736;
+  var a737;
+  var a738;
+  var a739;
+  var a740;
+  var a741;
+  var a742;
+  var a743;
+  var a744;
+  var a745;
+  var a746;
+  var a747;
+  var a748;
+  var a749;
+  var a750;
+  var a751;
+  var a752;
+  var a753;
+  var a754;
+  var a755;
+  var a756;
+  var a757;
+  var a758;
+  var a759;
+  var a760;
+  var a761;
+  var a762;
+  var a763;
+  var a764;
+  var a765;
+  var a766;
+  var a767;
+  var a768;
+  var a769;
+  var a770;
+  var a771;
+  var a772;
+  var a773;
+  var a774;
+  var a775;
+  var a776;
+  var a777;
+  var a778;
+  var a779;
+  var a780;
+  var a781;
+  var a782;
+  var a783;
+  var a784;
+  var a785;
+  var a786;
+  var a787;
+  var a788;
+  var a789;
+  var a790;
+  var a791;
+  var a792;
+  var a793;
+  var a794;
+  var a795;
+  var a796;
+  var a797;
+  var a798;
+  var a799;
+  var a800;
+  var a801;
+  var a802;
+  var a803;
+  var a804;
+  var a805;
+  var a806;
+  var a807;
+  var a808;
+  var a809;
+  var a810;
+  var a811;
+  var a812;
+  var a813;
+  var a814;
+  var a815;
+  var a816;
+  var a817;
+  var a818;
+  var a819;
+  var a820;
+  var a821;
+  var a822;
+  var a823;
+  var a824;
+  var a825;
+  var a826;
+  var a827;
+  var a828;
+  var a829;
+  var a830;
+  var a831;
+  var a832;
+  var a833;
+  var a834;
+  var a835;
+  var a836;
+  var a837;
+  var a838;
+  var a839;
+  var a840;
+  var a841;
+  var a842;
+  var a843;
+  var a844;
+  var a845;
+  var a846;
+  var a847;
+  var a848;
+  var a849;
+  var a850;
+  var a851;
+  var a852;
+  var a853;
+  var a854;
+  var a855;
+  var a856;
+  var a857;
+  var a858;
+  var a859;
+  var a860;
+  var a861;
+  var a862;
+  var a863;
+  var a864;
+  var a865;
+  var a866;
+  var a867;
+  var a868;
+  var a869;
+  var a870;
+  var a871;
+  var a872;
+  var a873;
+  var a874;
+  var a875;
+  var a876;
+  var a877;
+  var a878;
+  var a879;
+  var a880;
+  var a881;
+  var a882;
+  var a883;
+  var a884;
+  var a885;
+  var a886;
+  var a887;
+  var a888;
+  var a889;
+  var a890;
+  var a891;
+  var a892;
+  var a893;
+  var a894;
+  var a895;
+  var a896;
+  var a897;
+  var a898;
+  var a899;
+  var a900;
+  var a901;
+  var a902;
+  var a903;
+  var a904;
+  var a905;
+  var a906;
+  var a907;
+  var a908;
+  var a909;
+  var a910;
+  var a911;
+  var a912;
+  var a913;
+  var a914;
+  var a915;
+  var a916;
+  var a917;
+  var a918;
+  var a919;
+  var a920;
+  var a921;
+  var a922;
+  var a923;
+  var a924;
+  var a925;
+  var a926;
+  var a927;
+  var a928;
+  var a929;
+  var a930;
+  var a931;
+  var a932;
+  var a933;
+  var a934;
+  var a935;
+  var a936;
+  var a937;
+  var a938;
+  var a939;
+  var a940;
+  var a941;
+  var a942;
+  var a943;
+  var a944;
+  var a945;
+  var a946;
+  var a947;
+  var a948;
+  var a949;
+  var a950;
+  var a951;
+  var a952;
+  var a953;
+  var a954;
+  var a955;
+  var a956;
+  var a957;
+  var a958;
+  var a959;
+  var a960;
+  var a961;
+  var a962;
+  var a963;
+  var a964;
+  var a965;
+  var a966;
+  var a967;
+  var a968;
+  var a969;
+  var a970;
+  var a971;
+  var a972;
+  var a973;
+  var a974;
+  var a975;
+  var a976;
+  var a977;
+  var a978;
+  var a979;
+  var a980;
+  var a981;
+  var a982;
+  var a983;
+  var a984;
+  var a985;
+  var a986;
+  var a987;
+  var a988;
+  var a989;
+  var a990;
+  var a991;
+  var a992;
+  var a993;
+  var a994;
+  var a995;
+  var a996;
+  var a997;
+  var a998;
+  var a999;
+  var a1000;
+  var a1001;
+  var a1002;
+  var a1003;
+  var a1004;
+  var a1005;
+  var a1006;
+  var a1007;
+  var a1008;
+  var a1009;
+  var a1010;
+  var a1011;
+  var a1012;
+  var a1013;
+  var a1014;
+  var a1015;
+  var a1016;
+  var a1017;
+  var a1018;
+  var a1019;
+  var a1020;
+  var a1021;
+  var a1022;
+  var a1023;
+  var a1024;
+  var a1025;
+  var a1026;
+  var a1027;
+  var a1028;
+  var a1029;
+  var a1030;
+  var a1031;
+  var a1032;
+  var a1033;
+  var a1034;
+  var a1035;
+  var a1036;
+  var a1037;
+  var a1038;
+  var a1039;
+  var a1040;
+  var a1041;
+  var a1042;
+  var a1043;
+  var a1044;
+  var a1045;
+  var a1046;
+  var a1047;
+  var a1048;
+  var a1049;
+  var a1050;
+  var a1051;
+  var a1052;
+  var a1053;
+  var a1054;
+  var a1055;
+  var a1056;
+  var a1057;
+  var a1058;
+  var a1059;
+  var a1060;
+  var a1061;
+  var a1062;
+  var a1063;
+  var a1064;
+  var a1065;
+  var a1066;
+  var a1067;
+  var a1068;
+  var a1069;
+  var a1070;
+  var a1071;
+  var a1072;
+  var a1073;
+  var a1074;
+  var a1075;
+  var a1076;
+  var a1077;
+  var a1078;
+  var a1079;
+  var a1080;
+  var a1081;
+  var a1082;
+  var a1083;
+  var a1084;
+  var a1085;
+  var a1086;
+  var a1087;
+  var a1088;
+  var a1089;
+  var a1090;
+  var a1091;
+  var a1092;
+  var a1093;
+  var a1094;
+  var a1095;
+  var a1096;
+  var a1097;
+  var a1098;
+  var a1099;
+  var a1100;
+  var a1101;
+  var a1102;
+  var a1103;
+  var a1104;
+  var a1105;
+  var a1106;
+  var a1107;
+  var a1108;
+  var a1109;
+  var a1110;
+  var a1111;
+  var a1112;
+  var a1113;
+  var a1114;
+  var a1115;
+  var a1116;
+  var a1117;
+  var a1118;
+  var a1119;
+  var a1120;
+  var a1121;
+  var a1122;
+  var a1123;
+  var a1124;
+  var a1125;
+  var a1126;
+  var a1127;
+  var a1128;
+  var a1129;
+  var a1130;
+  var a1131;
+  var a1132;
+  var a1133;
+  var a1134;
+  var a1135;
+  var a1136;
+  var a1137;
+  var a1138;
+  var a1139;
+  var a1140;
+  var a1141;
+  var a1142;
+  var a1143;
+  var a1144;
+  var a1145;
+  var a1146;
+  var a1147;
+  var a1148;
+  var a1149;
+  var a1150;
+  var a1151;
+  var a1152;
+  var a1153;
+  var a1154;
+  var a1155;
+  var a1156;
+  var a1157;
+  var a1158;
+  var a1159;
+  var a1160;
+  var a1161;
+  var a1162;
+  var a1163;
+  var a1164;
+  var a1165;
+  var a1166;
+  var a1167;
+  var a1168;
+  var a1169;
+  var a1170;
+  var a1171;
+  var a1172;
+  var a1173;
+  var a1174;
+  var a1175;
+  var a1176;
+  var a1177;
+  var a1178;
+  var a1179;
+  var a1180;
+  var a1181;
+  var a1182;
+  var a1183;
+  var a1184;
+  var a1185;
+  var a1186;
+  var a1187;
+  var a1188;
+  var a1189;
+  var a1190;
+  var a1191;
+  var a1192;
+  var a1193;
+  var a1194;
+  var a1195;
+  var a1196;
+  var a1197;
+  var a1198;
+  var a1199;
+  var a1200;
+  var a1201;
+  var a1202;
+  var a1203;
+  var a1204;
+  var a1205;
+  var a1206;
+  var a1207;
+  var a1208;
+  var a1209;
+  var a1210;
+  var a1211;
+  var a1212;
+  var a1213;
+  var a1214;
+  var a1215;
+  var a1216;
+  var a1217;
+  var a1218;
+  var a1219;
+  var a1220;
+  var a1221;
+  var a1222;
+  var a1223;
+  var a1224;
+  var a1225;
+  var a1226;
+  var a1227;
+  var a1228;
+  var a1229;
+  var a1230;
+  var a1231;
+  var a1232;
+  var a1233;
+  var a1234;
+  var a1235;
+  var a1236;
+  var a1237;
+  var a1238;
+  var a1239;
+  var a1240;
+  var a1241;
+  var a1242;
+  var a1243;
+  var a1244;
+  var a1245;
+  var a1246;
+  var a1247;
+  var a1248;
+  var a1249;
+  var a1250;
+  var a1251;
+  var a1252;
+  var a1253;
+  var a1254;
+  var a1255;
+  var a1256;
+  var a1257;
+  var a1258;
+  var a1259;
+  var a1260;
+  var a1261;
+  var a1262;
+  var a1263;
+  var a1264;
+  var a1265;
+  var a1266;
+  var a1267;
+  var a1268;
+  var a1269;
+  var a1270;
+  var a1271;
+  var a1272;
+  var a1273;
+  var a1274;
+  var a1275;
+  var a1276;
+  var a1277;
+  var a1278;
+  var a1279;
+  var a1280;
+  var a1281;
+  var a1282;
+  var a1283;
+  var a1284;
+  var a1285;
+  var a1286;
+  var a1287;
+  var a1288;
+  var a1289;
+  var a1290;
+  var a1291;
+  var a1292;
+  var a1293;
+  var a1294;
+  var a1295;
+  var a1296;
+  var a1297;
+  var a1298;
+  var a1299;
+  var a1300;
+  var a1301;
+  var a1302;
+  var a1303;
+  var a1304;
+  var a1305;
+  var a1306;
+  var a1307;
+  var a1308;
+  var a1309;
+  var a1310;
+  var a1311;
+  var a1312;
+  var a1313;
+  var a1314;
+  var a1315;
+  var a1316;
+  var a1317;
+  var a1318;
+  var a1319;
+  var a1320;
+  var a1321;
+  var a1322;
+  var a1323;
+  var a1324;
+  var a1325;
+  var a1326;
+  var a1327;
+  var a1328;
+  var a1329;
+  var a1330;
+  var a1331;
+  var a1332;
+  var a1333;
+  var a1334;
+  var a1335;
+  var a1336;
+  var a1337;
+  var a1338;
+  var a1339;
+  var a1340;
+  var a1341;
+  var a1342;
+  var a1343;
+  var a1344;
+  var a1345;
+  var a1346;
+  var a1347;
+  var a1348;
+  var a1349;
+  var a1350;
+  var a1351;
+  var a1352;
+  var a1353;
+  var a1354;
+  var a1355;
+  var a1356;
+  var a1357;
+  var a1358;
+  var a1359;
+  var a1360;
+  var a1361;
+  var a1362;
+  var a1363;
+  var a1364;
+  var a1365;
+  var a1366;
+  var a1367;
+  var a1368;
+  var a1369;
+  var a1370;
+  var a1371;
+  var a1372;
+  var a1373;
+  var a1374;
+  var a1375;
+  var a1376;
+  var a1377;
+  var a1378;
+  var a1379;
+  var a1380;
+  var a1381;
+  var a1382;
+  var a1383;
+  var a1384;
+  var a1385;
+  var a1386;
+  var a1387;
+  var a1388;
+  var a1389;
+  var a1390;
+  var a1391;
+  var a1392;
+  var a1393;
+  var a1394;
+  var a1395;
+  var a1396;
+  var a1397;
+  var a1398;
+  var a1399;
+  var a1400;
+  var a1401;
+  var a1402;
+  var a1403;
+  var a1404;
+  var a1405;
+  var a1406;
+  var a1407;
+  var a1408;
+  var a1409;
+  var a1410;
+  var a1411;
+  var a1412;
+  var a1413;
+  var a1414;
+  var a1415;
+  var a1416;
+  var a1417;
+  var a1418;
+  var a1419;
+  var a1420;
+  var a1421;
+  var a1422;
+  var a1423;
+  var a1424;
+  var a1425;
+  var a1426;
+  var a1427;
+  var a1428;
+  var a1429;
+  var a1430;
+  var a1431;
+  var a1432;
+  var a1433;
+  var a1434;
+  var a1435;
+  var a1436;
+  var a1437;
+  var a1438;
+  var a1439;
+  var a1440;
+  var a1441;
+  var a1442;
+  var a1443;
+  var a1444;
+  var a1445;
+  var a1446;
+  var a1447;
+  var a1448;
+  var a1449;
+  var a1450;
+  var a1451;
+  var a1452;
+  var a1453;
+  var a1454;
+  var a1455;
+  var a1456;
+  var a1457;
+  var a1458;
+  var a1459;
+  var a1460;
+  var a1461;
+  var a1462;
+  var a1463;
+  var a1464;
+  var a1465;
+  var a1466;
+  var a1467;
+  var a1468;
+  var a1469;
+  var a1470;
+  var a1471;
+  var a1472;
+  var a1473;
+  var a1474;
+  var a1475;
+  var a1476;
+  var a1477;
+  var a1478;
+  var a1479;
+  var a1480;
+  var a1481;
+  var a1482;
+  var a1483;
+  var a1484;
+  var a1485;
+  var a1486;
+  var a1487;
+  var a1488;
+  var a1489;
+  var a1490;
+  var a1491;
+  var a1492;
+  var a1493;
+  var a1494;
+  var a1495;
+  var a1496;
+  var a1497;
+  var a1498;
+  var a1499;
+  var a1500;
+  var a1501;
+  var a1502;
+  var a1503;
+  var a1504;
+  var a1505;
+  var a1506;
+  var a1507;
+  var a1508;
+  var a1509;
+  var a1510;
+  var a1511;
+  var a1512;
+  var a1513;
+  var a1514;
+  var a1515;
+  var a1516;
+  var a1517;
+  var a1518;
+  var a1519;
+  var a1520;
+  var a1521;
+  var a1522;
+  var a1523;
+  var a1524;
+  var a1525;
+  var a1526;
+  var a1527;
+  var a1528;
+  var a1529;
+  var a1530;
+  var a1531;
+  var a1532;
+  var a1533;
+  var a1534;
+  var a1535;
+  var a1536;
+  var a1537;
+  var a1538;
+  var a1539;
+  var a1540;
+  var a1541;
+  var a1542;
+  var a1543;
+  var a1544;
+  var a1545;
+  var a1546;
+  var a1547;
+  var a1548;
+  var a1549;
+  var a1550;
+  var a1551;
+  var a1552;
+  var a1553;
+  var a1554;
+  var a1555;
+  var a1556;
+  var a1557;
+  var a1558;
+  var a1559;
+  var a1560;
+  var a1561;
+  var a1562;
+  var a1563;
+  var a1564;
+  var a1565;
+  var a1566;
+  var a1567;
+  var a1568;
+  var a1569;
+  var a1570;
+  var a1571;
+  var a1572;
+  var a1573;
+  var a1574;
+  var a1575;
+  var a1576;
+  var a1577;
+  var a1578;
+  var a1579;
+  var a1580;
+  var a1581;
+  var a1582;
+  var a1583;
+  var a1584;
+  var a1585;
+  var a1586;
+  var a1587;
+  var a1588;
+  var a1589;
+  var a1590;
+  var a1591;
+  var a1592;
+  var a1593;
+  var a1594;
+  var a1595;
+  var a1596;
+  var a1597;
+  var a1598;
+  var a1599;
+  var a1600;
+  var a1601;
+  var a1602;
+  var a1603;
+  var a1604;
+  var a1605;
+  var a1606;
+  var a1607;
+  var a1608;
+  var a1609;
+  var a1610;
+  var a1611;
+  var a1612;
+  var a1613;
+  var a1614;
+  var a1615;
+  var a1616;
+  var a1617;
+  var a1618;
+  var a1619;
+  var a1620;
+  var a1621;
+  var a1622;
+  var a1623;
+  var a1624;
+  var a1625;
+  var a1626;
+  var a1627;
+  var a1628;
+  var a1629;
+  var a1630;
+  var a1631;
+  var a1632;
+  var a1633;
+  var a1634;
+  var a1635;
+  var a1636;
+  var a1637;
+  var a1638;
+  var a1639;
+  var a1640;
+  var a1641;
+  var a1642;
+  var a1643;
+  var a1644;
+  var a1645;
+  var a1646;
+  var a1647;
+  var a1648;
+  var a1649;
+  var a1650;
+  var a1651;
+  var a1652;
+  var a1653;
+  var a1654;
+  var a1655;
+  var a1656;
+  var a1657;
+  var a1658;
+  var a1659;
+  var a1660;
+  var a1661;
+  var a1662;
+  var a1663;
+  var a1664;
+  var a1665;
+  var a1666;
+  var a1667;
+  var a1668;
+  var a1669;
+  var a1670;
+  var a1671;
+  var a1672;
+  var a1673;
+  var a1674;
+  var a1675;
+  var a1676;
+  var a1677;
+  var a1678;
+  var a1679;
+  var a1680;
+  var a1681;
+  var a1682;
+  var a1683;
+  var a1684;
+  var a1685;
+  var a1686;
+  var a1687;
+  var a1688;
+  var a1689;
+  var a1690;
+  var a1691;
+  var a1692;
+  var a1693;
+  var a1694;
+  var a1695;
+  var a1696;
+  var a1697;
+  var a1698;
+  var a1699;
+  var a1700;
+  var a1701;
+  var a1702;
+  var a1703;
+  var a1704;
+  var a1705;
+  var a1706;
+  var a1707;
+  var a1708;
+  var a1709;
+  var a1710;
+  var a1711;
+  var a1712;
+  var a1713;
+  var a1714;
+  var a1715;
+  var a1716;
+  var a1717;
+  var a1718;
+  var a1719;
+  var a1720;
+  var a1721;
+  var a1722;
+  var a1723;
+  var a1724;
+  var a1725;
+  var a1726;
+  var a1727;
+  var a1728;
+  var a1729;
+  var a1730;
+  var a1731;
+  var a1732;
+  var a1733;
+  var a1734;
+  var a1735;
+  var a1736;
+  var a1737;
+  var a1738;
+  var a1739;
+  var a1740;
+  var a1741;
+  var a1742;
+  var a1743;
+  var a1744;
+  var a1745;
+  var a1746;
+  var a1747;
+  var a1748;
+  var a1749;
+  var a1750;
+  var a1751;
+  var a1752;
+  var a1753;
+  var a1754;
+  var a1755;
+  var a1756;
+  var a1757;
+  var a1758;
+  var a1759;
+  var a1760;
+  var a1761;
+  var a1762;
+  var a1763;
+  var a1764;
+  var a1765;
+  var a1766;
+  var a1767;
+  var a1768;
+  var a1769;
+  var a1770;
+  var a1771;
+  var a1772;
+  var a1773;
+  var a1774;
+  var a1775;
+  var a1776;
+  var a1777;
+  var a1778;
+  var a1779;
+  var a1780;
+  var a1781;
+  var a1782;
+  var a1783;
+  var a1784;
+  var a1785;
+  var a1786;
+  var a1787;
+  var a1788;
+  var a1789;
+  var a1790;
+  var a1791;
+  var a1792;
+  var a1793;
+  var a1794;
+  var a1795;
+  var a1796;
+  var a1797;
+  var a1798;
+  var a1799;
+  var a1800;
+  var a1801;
+  var a1802;
+  var a1803;
+  var a1804;
+  var a1805;
+  var a1806;
+  var a1807;
+  var a1808;
+  var a1809;
+  var a1810;
+  var a1811;
+  var a1812;
+  var a1813;
+  var a1814;
+  var a1815;
+  var a1816;
+  var a1817;
+  var a1818;
+  var a1819;
+  var a1820;
+  var a1821;
+  var a1822;
+  var a1823;
+  var a1824;
+  var a1825;
+  var a1826;
+  var a1827;
+  var a1828;
+  var a1829;
+  var a1830;
+  var a1831;
+  var a1832;
+  var a1833;
+  var a1834;
+  var a1835;
+  var a1836;
+  var a1837;
+  var a1838;
+  var a1839;
+  var a1840;
+  var a1841;
+  var a1842;
+  var a1843;
+  var a1844;
+  var a1845;
+  var a1846;
+  var a1847;
+  var a1848;
+  var a1849;
+  var a1850;
+  var a1851;
+  var a1852;
+  var a1853;
+  var a1854;
+  var a1855;
+  var a1856;
+  var a1857;
+  var a1858;
+  var a1859;
+  var a1860;
+  var a1861;
+  var a1862;
+  var a1863;
+  var a1864;
+  var a1865;
+  var a1866;
+  var a1867;
+  var a1868;
+  var a1869;
+  var a1870;
+  var a1871;
+  var a1872;
+  var a1873;
+  var a1874;
+  var a1875;
+  var a1876;
+  var a1877;
+  var a1878;
+  var a1879;
+  var a1880;
+  var a1881;
+  var a1882;
+  var a1883;
+  var a1884;
+  var a1885;
+  var a1886;
+  var a1887;
+  var a1888;
+  var a1889;
+  var a1890;
+  var a1891;
+  var a1892;
+  var a1893;
+  var a1894;
+  var a1895;
+  var a1896;
+  var a1897;
+  var a1898;
+  var a1899;
+  var a1900;
+  var a1901;
+  var a1902;
+  var a1903;
+  var a1904;
+  var a1905;
+  var a1906;
+  var a1907;
+  var a1908;
+  var a1909;
+  var a1910;
+  var a1911;
+  var a1912;
+  var a1913;
+  var a1914;
+  var a1915;
+  var a1916;
+  var a1917;
+  var a1918;
+  var a1919;
+  var a1920;
+  var a1921;
+  var a1922;
+  var a1923;
+  var a1924;
+  var a1925;
+  var a1926;
+  var a1927;
+  var a1928;
+  var a1929;
+  var a1930;
+  var a1931;
+  var a1932;
+  var a1933;
+  var a1934;
+  var a1935;
+  var a1936;
+  var a1937;
+  var a1938;
+  var a1939;
+  var a1940;
+  var a1941;
+  var a1942;
+  var a1943;
+  var a1944;
+  var a1945;
+  var a1946;
+  var a1947;
+  var a1948;
+  var a1949;
+  var a1950;
+  var a1951;
+  var a1952;
+  var a1953;
+  var a1954;
+  var a1955;
+  var a1956;
+  var a1957;
+  var a1958;
+  var a1959;
+  var a1960;
+  var a1961;
+  var a1962;
+  var a1963;
+  var a1964;
+  var a1965;
+  var a1966;
+  var a1967;
+  var a1968;
+  var a1969;
+  var a1970;
+  var a1971;
+  var a1972;
+  var a1973;
+  var a1974;
+  var a1975;
+  var a1976;
+  var a1977;
+  var a1978;
+  var a1979;
+  var a1980;
+  var a1981;
+  var a1982;
+  var a1983;
+  var a1984;
+  var a1985;
+  var a1986;
+  var a1987;
+  var a1988;
+  var a1989;
+  var a1990;
+  var a1991;
+  var a1992;
+  var a1993;
+  var a1994;
+  var a1995;
+  var a1996;
+  var a1997;
+  var a1998;
+  var a1999;
+  var a2000;
+  var a2001;
+  var a2002;
+  var a2003;
+  var a2004;
+  var a2005;
+  var a2006;
+  var a2007;
+  var a2008;
+  var a2009;
+  var a2010;
+  var a2011;
+  var a2012;
+  var a2013;
+  var a2014;
+  var a2015;
+  var a2016;
+  var a2017;
+  var a2018;
+  var a2019;
+  var a2020;
+  var a2021;
+  var a2022;
+  var a2023;
+  var a2024;
+  var a2025;
+  var a2026;
+  var a2027;
+  var a2028;
+  var a2029;
+  var a2030;
+  var a2031;
+  var a2032;
+  var a2033;
+  var a2034;
+  var a2035;
+  var a2036;
+  var a2037;
+  var a2038;
+  var a2039;
+  var a2040;
+  var a2041;
+  var a2042;
+  var a2043;
+  var a2044;
+  var a2045;
+  var a2046;
+  var a2047;
+  var a2048;
+  var a2049;
+  var a2050;
+  var a2051;
+  var a2052;
+  var a2053;
+  var a2054;
+  var a2055;
+  var a2056;
+  var a2057;
+  var a2058;
+  var a2059;
+  var a2060;
+  var a2061;
+  var a2062;
+  var a2063;
+  var a2064;
+  var a2065;
+  var a2066;
+  var a2067;
+  var a2068;
+  var a2069;
+  var a2070;
+  var a2071;
+  var a2072;
+  var a2073;
+  var a2074;
+  var a2075;
+  var a2076;
+  var a2077;
+  var a2078;
+  var a2079;
+  var a2080;
+  var a2081;
+  var a2082;
+  var a2083;
+  var a2084;
+  var a2085;
+  var a2086;
+  var a2087;
+  var a2088;
+  var a2089;
+  var a2090;
+  var a2091;
+  var a2092;
+  var a2093;
+  var a2094;
+  var a2095;
+  var a2096;
+  var a2097;
+  var a2098;
+  var a2099;
+  var a2100;
+  var a2101;
+  var a2102;
+  var a2103;
+  var a2104;
+  var a2105;
+  var a2106;
+  var a2107;
+  var a2108;
+  var a2109;
+  var a2110;
+  var a2111;
+  var a2112;
+  var a2113;
+  var a2114;
+  var a2115;
+  var a2116;
+  var a2117;
+  var a2118;
+  var a2119;
+  var a2120;
+  var a2121;
+  var a2122;
+  var a2123;
+  var a2124;
+  var a2125;
+  var a2126;
+  var a2127;
+  var a2128;
+  var a2129;
+  var a2130;
+  var a2131;
+  var a2132;
+  var a2133;
+  var a2134;
+  var a2135;
+  var a2136;
+  var a2137;
+  var a2138;
+  var a2139;
+  var a2140;
+  var a2141;
+  var a2142;
+  var a2143;
+  var a2144;
+  var a2145;
+  var a2146;
+  var a2147;
+  var a2148;
+  var a2149;
+  var a2150;
+  var a2151;
+  var a2152;
+  var a2153;
+  var a2154;
+  var a2155;
+  var a2156;
+  var a2157;
+  var a2158;
+  var a2159;
+  var a2160;
+  var a2161;
+  var a2162;
+  var a2163;
+  var a2164;
+  var a2165;
+  var a2166;
+  var a2167;
+  var a2168;
+  var a2169;
+  var a2170;
+  var a2171;
+  var a2172;
+  var a2173;
+  var a2174;
+  var a2175;
+  var a2176;
+  var a2177;
+  var a2178;
+  var a2179;
+  var a2180;
+  var a2181;
+  var a2182;
+  var a2183;
+  var a2184;
+  var a2185;
+  var a2186;
+  var a2187;
+  var a2188;
+  var a2189;
+  var a2190;
+  var a2191;
+  var a2192;
+  var a2193;
+  var a2194;
+  var a2195;
+  var a2196;
+  var a2197;
+  var a2198;
+  var a2199;
+  var a2200;
+  var a2201;
+  var a2202;
+  var a2203;
+  var a2204;
+  var a2205;
+  var a2206;
+  var a2207;
+  var a2208;
+  var a2209;
+  var a2210;
+  var a2211;
+  var a2212;
+  var a2213;
+  var a2214;
+  var a2215;
+  var a2216;
+  var a2217;
+  var a2218;
+  var a2219;
+  var a2220;
+  var a2221;
+  var a2222;
+  var a2223;
+  var a2224;
+  var a2225;
+  var a2226;
+  var a2227;
+  var a2228;
+  var a2229;
+  var a2230;
+  var a2231;
+  var a2232;
+  var a2233;
+  var a2234;
+  var a2235;
+  var a2236;
+  var a2237;
+  var a2238;
+  var a2239;
+  var a2240;
+  var a2241;
+  var a2242;
+  var a2243;
+  var a2244;
+  var a2245;
+  var a2246;
+  var a2247;
+  var a2248;
+  var a2249;
+  var a2250;
+  var a2251;
+  var a2252;
+  var a2253;
+  var a2254;
+  var a2255;
+  var a2256;
+  var a2257;
+  var a2258;
+  var a2259;
+  var a2260;
+  var a2261;
+  var a2262;
+  var a2263;
+  var a2264;
+  var a2265;
+  var a2266;
+  var a2267;
+  var a2268;
+  var a2269;
+  var a2270;
+  var a2271;
+  var a2272;
+  var a2273;
+  var a2274;
+  var a2275;
+  var a2276;
+  var a2277;
+  var a2278;
+  var a2279;
+  var a2280;
+  var a2281;
+  var a2282;
+  var a2283;
+  var a2284;
+  var a2285;
+  var a2286;
+  var a2287;
+  var a2288;
+  var a2289;
+  var a2290;
+  var a2291;
+  var a2292;
+  var a2293;
+  var a2294;
+  var a2295;
+  var a2296;
+  var a2297;
+  var a2298;
+  var a2299;
+  var a2300;
+  var a2301;
+  var a2302;
+  var a2303;
+  var a2304;
+  var a2305;
+  var a2306;
+  var a2307;
+  var a2308;
+  var a2309;
+  var a2310;
+  var a2311;
+  var a2312;
+  var a2313;
+  var a2314;
+  var a2315;
+  var a2316;
+  var a2317;
+  var a2318;
+  var a2319;
+  var a2320;
+  var a2321;
+  var a2322;
+  var a2323;
+  var a2324;
+  var a2325;
+  var a2326;
+  var a2327;
+  var a2328;
+  var a2329;
+  var a2330;
+  var a2331;
+  var a2332;
+  var a2333;
+  var a2334;
+  var a2335;
+  var a2336;
+  var a2337;
+  var a2338;
+  var a2339;
+  var a2340;
+  var a2341;
+  var a2342;
+  var a2343;
+  var a2344;
+  var a2345;
+  var a2346;
+  var a2347;
+  var a2348;
+  var a2349;
+  var a2350;
+  var a2351;
+  var a2352;
+  var a2353;
+  var a2354;
+  var a2355;
+  var a2356;
+  var a2357;
+  var a2358;
+  var a2359;
+  var a2360;
+  var a2361;
+  var a2362;
+  var a2363;
+  var a2364;
+  var a2365;
+  var a2366;
+  var a2367;
+  var a2368;
+  var a2369;
+  var a2370;
+  var a2371;
+  var a2372;
+  var a2373;
+  var a2374;
+  var a2375;
+  var a2376;
+  var a2377;
+  var a2378;
+  var a2379;
+  var a2380;
+  var a2381;
+  var a2382;
+  var a2383;
+  var a2384;
+  var a2385;
+  var a2386;
+  var a2387;
+  var a2388;
+  var a2389;
+  var a2390;
+  var a2391;
+  var a2392;
+  var a2393;
+  var a2394;
+  var a2395;
+  var a2396;
+  var a2397;
+  var a2398;
+  var a2399;
+  var a2400;
+  var a2401;
+  var a2402;
+  var a2403;
+  var a2404;
+  var a2405;
+  var a2406;
+  var a2407;
+  var a2408;
+  var a2409;
+  var a2410;
+  var a2411;
+  var a2412;
+  var a2413;
+  var a2414;
+  var a2415;
+  var a2416;
+  var a2417;
+  var a2418;
+  var a2419;
+  var a2420;
+  var a2421;
+  var a2422;
+  var a2423;
+  var a2424;
+  var a2425;
+  var a2426;
+  var a2427;
+  var a2428;
+  var a2429;
+  var a2430;
+  var a2431;
+  var a2432;
+  var a2433;
+  var a2434;
+  var a2435;
+  var a2436;
+  var a2437;
+  var a2438;
+  var a2439;
+  var a2440;
+  var a2441;
+  var a2442;
+  var a2443;
+  var a2444;
+  var a2445;
+  var a2446;
+  var a2447;
+  var a2448;
+  var a2449;
+  var a2450;
+  var a2451;
+  var a2452;
+  var a2453;
+  var a2454;
+  var a2455;
+  var a2456;
+  var a2457;
+  var a2458;
+  var a2459;
+  var a2460;
+  var a2461;
+  var a2462;
+  var a2463;
+  var a2464;
+  var a2465;
+  var a2466;
+  var a2467;
+  var a2468;
+  var a2469;
+  var a2470;
+  var a2471;
+  var a2472;
+  var a2473;
+  var a2474;
+  var a2475;
+  var a2476;
+  var a2477;
+  var a2478;
+  var a2479;
+  var a2480;
+  var a2481;
+  var a2482;
+  var a2483;
+  var a2484;
+  var a2485;
+  var a2486;
+  var a2487;
+  var a2488;
+  var a2489;
+  var a2490;
+  var a2491;
+  var a2492;
+  var a2493;
+  var a2494;
+  var a2495;
+  var a2496;
+  var a2497;
+  var a2498;
+  var a2499;
+  var a2500;
+  var a2501;
+  var a2502;
+  var a2503;
+  var a2504;
+  var a2505;
+  var a2506;
+  var a2507;
+  var a2508;
+  var a2509;
+  var a2510;
+  var a2511;
+  var a2512;
+  var a2513;
+  var a2514;
+  var a2515;
+  var a2516;
+  var a2517;
+  var a2518;
+  var a2519;
+  var a2520;
+  var a2521;
+  var a2522;
+  var a2523;
+  var a2524;
+  var a2525;
+  var a2526;
+  var a2527;
+  var a2528;
+  var a2529;
+  var a2530;
+  var a2531;
+  var a2532;
+  var a2533;
+  var a2534;
+  var a2535;
+  var a2536;
+  var a2537;
+  var a2538;
+  var a2539;
+  var a2540;
+  var a2541;
+  var a2542;
+  var a2543;
+  var a2544;
+  var a2545;
+  var a2546;
+  var a2547;
+  var a2548;
+  var a2549;
+  var a2550;
+  var a2551;
+  var a2552;
+  var a2553;
+  var a2554;
+  var a2555;
+  var a2556;
+  var a2557;
+  var a2558;
+  var a2559;
+  var a2560;
+  var a2561;
+  var a2562;
+  var a2563;
+  var a2564;
+  var a2565;
+  var a2566;
+  var a2567;
+  var a2568;
+  var a2569;
+  var a2570;
+  var a2571;
+  var a2572;
+  var a2573;
+  var a2574;
+  var a2575;
+  var a2576;
+  var a2577;
+  var a2578;
+  var a2579;
+  var a2580;
+  var a2581;
+  var a2582;
+  var a2583;
+  var a2584;
+  var a2585;
+  var a2586;
+  var a2587;
+  var a2588;
+  var a2589;
+  var a2590;
+  var a2591;
+  var a2592;
+  var a2593;
+  var a2594;
+  var a2595;
+  var a2596;
+  var a2597;
+  var a2598;
+  var a2599;
+  var a2600;
+  var a2601;
+  var a2602;
+  var a2603;
+  var a2604;
+  var a2605;
+  var a2606;
+  var a2607;
+  var a2608;
+  var a2609;
+  var a2610;
+  var a2611;
+  var a2612;
+  var a2613;
+  var a2614;
+  var a2615;
+  var a2616;
+  var a2617;
+  var a2618;
+  var a2619;
+  var a2620;
+  var a2621;
+  var a2622;
+  var a2623;
+  var a2624;
+  var a2625;
+  var a2626;
+  var a2627;
+  var a2628;
+  var a2629;
+  var a2630;
+  var a2631;
+  var a2632;
+  var a2633;
+  var a2634;
+  var a2635;
+  var a2636;
+  var a2637;
+  var a2638;
+  var a2639;
+  var a2640;
+  var a2641;
+  var a2642;
+  var a2643;
+  var a2644;
+  var a2645;
+  var a2646;
+  var a2647;
+  var a2648;
+  var a2649;
+  var a2650;
+  var a2651;
+  var a2652;
+  var a2653;
+  var a2654;
+  var a2655;
+  var a2656;
+  var a2657;
+  var a2658;
+  var a2659;
+  var a2660;
+  var a2661;
+  var a2662;
+  var a2663;
+  var a2664;
+  var a2665;
+  var a2666;
+  var a2667;
+  var a2668;
+  var a2669;
+  var a2670;
+  var a2671;
+  var a2672;
+  var a2673;
+  var a2674;
+  var a2675;
+  var a2676;
+  var a2677;
+  var a2678;
+  var a2679;
+  var a2680;
+  var a2681;
+  var a2682;
+  var a2683;
+  var a2684;
+  var a2685;
+  var a2686;
+  var a2687;
+  var a2688;
+  var a2689;
+  var a2690;
+  var a2691;
+  var a2692;
+  var a2693;
+  var a2694;
+  var a2695;
+  var a2696;
+  var a2697;
+  var a2698;
+  var a2699;
+  var a2700;
+  var a2701;
+  var a2702;
+  var a2703;
+  var a2704;
+  var a2705;
+  var a2706;
+  var a2707;
+  var a2708;
+  var a2709;
+  var a2710;
+  var a2711;
+  var a2712;
+  var a2713;
+  var a2714;
+  var a2715;
+  var a2716;
+  var a2717;
+  var a2718;
+  var a2719;
+  var a2720;
+  var a2721;
+  var a2722;
+  var a2723;
+  var a2724;
+  var a2725;
+  var a2726;
+  var a2727;
+  var a2728;
+  var a2729;
+  var a2730;
+  var a2731;
+  var a2732;
+  var a2733;
+  var a2734;
+  var a2735;
+  var a2736;
+  var a2737;
+  var a2738;
+  var a2739;
+  var a2740;
+  var a2741;
+  var a2742;
+  var a2743;
+  var a2744;
+  var a2745;
+  var a2746;
+  var a2747;
+  var a2748;
+  var a2749;
+  var a2750;
+  var a2751;
+  var a2752;
+  var a2753;
+  var a2754;
+  var a2755;
+  var a2756;
+  var a2757;
+  var a2758;
+  var a2759;
+  var a2760;
+  var a2761;
+  var a2762;
+  var a2763;
+  var a2764;
+  var a2765;
+  var a2766;
+  var a2767;
+  var a2768;
+  var a2769;
+  var a2770;
+  var a2771;
+  var a2772;
+  var a2773;
+  var a2774;
+  var a2775;
+  var a2776;
+  var a2777;
+  var a2778;
+  var a2779;
+  var a2780;
+  var a2781;
+  var a2782;
+  var a2783;
+  var a2784;
+  var a2785;
+  var a2786;
+  var a2787;
+  var a2788;
+  var a2789;
+  var a2790;
+  var a2791;
+  var a2792;
+  var a2793;
+  var a2794;
+  var a2795;
+  var a2796;
+  var a2797;
+  var a2798;
+  var a2799;
+  var a2800;
+  var a2801;
+  var a2802;
+  var a2803;
+  var a2804;
+  var a2805;
+  var a2806;
+  var a2807;
+  var a2808;
+  var a2809;
+  var a2810;
+  var a2811;
+  var a2812;
+  var a2813;
+  var a2814;
+  var a2815;
+  var a2816;
+  var a2817;
+  var a2818;
+  var a2819;
+  var a2820;
+  var a2821;
+  var a2822;
+  var a2823;
+  var a2824;
+  var a2825;
+  var a2826;
+  var a2827;
+  var a2828;
+  var a2829;
+  var a2830;
+  var a2831;
+  var a2832;
+  var a2833;
+  var a2834;
+  var a2835;
+  var a2836;
+  var a2837;
+  var a2838;
+  var a2839;
+  var a2840;
+  var a2841;
+  var a2842;
+  var a2843;
+  var a2844;
+  var a2845;
+  var a2846;
+  var a2847;
+  var a2848;
+  var a2849;
+  var a2850;
+  var a2851;
+  var a2852;
+  var a2853;
+  var a2854;
+  var a2855;
+  var a2856;
+  var a2857;
+  var a2858;
+  var a2859;
+  var a2860;
+  var a2861;
+  var a2862;
+  var a2863;
+  var a2864;
+  var a2865;
+  var a2866;
+  var a2867;
+  var a2868;
+  var a2869;
+  var a2870;
+  var a2871;
+  var a2872;
+  var a2873;
+  var a2874;
+  var a2875;
+  var a2876;
+  var a2877;
+  var a2878;
+  var a2879;
+  var a2880;
+  var a2881;
+  var a2882;
+  var a2883;
+  var a2884;
+  var a2885;
+  var a2886;
+  var a2887;
+  var a2888;
+  var a2889;
+  var a2890;
+  var a2891;
+  var a2892;
+  var a2893;
+  var a2894;
+  var a2895;
+  var a2896;
+  var a2897;
+  var a2898;
+  var a2899;
+  var a2900;
+  var a2901;
+  var a2902;
+  var a2903;
+  var a2904;
+  var a2905;
+  var a2906;
+  var a2907;
+  var a2908;
+  var a2909;
+  var a2910;
+  var a2911;
+  var a2912;
+  var a2913;
+  var a2914;
+  var a2915;
+  var a2916;
+  var a2917;
+  var a2918;
+  var a2919;
+  var a2920;
+  var a2921;
+  var a2922;
+  var a2923;
+  var a2924;
+  var a2925;
+  var a2926;
+  var a2927;
+  var a2928;
+  var a2929;
+  var a2930;
+  var a2931;
+  var a2932;
+  var a2933;
+  var a2934;
+  var a2935;
+  var a2936;
+  var a2937;
+  var a2938;
+  var a2939;
+  var a2940;
+  var a2941;
+  var a2942;
+  var a2943;
+  var a2944;
+  var a2945;
+  var a2946;
+  var a2947;
+  var a2948;
+  var a2949;
+  var a2950;
+  var a2951;
+  var a2952;
+  var a2953;
+  var a2954;
+  var a2955;
+  var a2956;
+  var a2957;
+  var a2958;
+  var a2959;
+  var a2960;
+  var a2961;
+  var a2962;
+  var a2963;
+  var a2964;
+  var a2965;
+  var a2966;
+  var a2967;
+  var a2968;
+  var a2969;
+  var a2970;
+  var a2971;
+  var a2972;
+  var a2973;
+  var a2974;
+  var a2975;
+  var a2976;
+  var a2977;
+  var a2978;
+  var a2979;
+  var a2980;
+  var a2981;
+  var a2982;
+  var a2983;
+  var a2984;
+  var a2985;
+  var a2986;
+  var a2987;
+  var a2988;
+  var a2989;
+  var a2990;
+  var a2991;
+  var a2992;
+  var a2993;
+  var a2994;
+  var a2995;
+  var a2996;
+  var a2997;
+  var a2998;
+  var a2999;
+  var a3000;
+  var a3001;
+  var a3002;
+  var a3003;
+  var a3004;
+  var a3005;
+  var a3006;
+  var a3007;
+  var a3008;
+  var a3009;
+  var a3010;
+  var a3011;
+  var a3012;
+  var a3013;
+  var a3014;
+  var a3015;
+  var a3016;
+  var a3017;
+  var a3018;
+  var a3019;
+  var a3020;
+  var a3021;
+  var a3022;
+  var a3023;
+  var a3024;
+  var a3025;
+  var a3026;
+  var a3027;
+  var a3028;
+  var a3029;
+  var a3030;
+  var a3031;
+  var a3032;
+  var a3033;
+  var a3034;
+  var a3035;
+  var a3036;
+  var a3037;
+  var a3038;
+  var a3039;
+  var a3040;
+  var a3041;
+  var a3042;
+  var a3043;
+  var a3044;
+  var a3045;
+  var a3046;
+  var a3047;
+  var a3048;
+  var a3049;
+  var a3050;
+  var a3051;
+  var a3052;
+  var a3053;
+  var a3054;
+  var a3055;
+  var a3056;
+  var a3057;
+  var a3058;
+  var a3059;
+  var a3060;
+  var a3061;
+  var a3062;
+  var a3063;
+  var a3064;
+  var a3065;
+  var a3066;
+  var a3067;
+  var a3068;
+  var a3069;
+  var a3070;
+  var a3071;
+  var a3072;
+  var a3073;
+  var a3074;
+  var a3075;
+  var a3076;
+  var a3077;
+  var a3078;
+  var a3079;
+  var a3080;
+  var a3081;
+  var a3082;
+  var a3083;
+  var a3084;
+  var a3085;
+  var a3086;
+  var a3087;
+  var a3088;
+  var a3089;
+  var a3090;
+  var a3091;
+  var a3092;
+  var a3093;
+  var a3094;
+  var a3095;
+  var a3096;
+  var a3097;
+  var a3098;
+  var a3099;
+  var a3100;
+  var a3101;
+  var a3102;
+  var a3103;
+  var a3104;
+  var a3105;
+  var a3106;
+  var a3107;
+  var a3108;
+  var a3109;
+  var a3110;
+  var a3111;
+  var a3112;
+  var a3113;
+  var a3114;
+  var a3115;
+  var a3116;
+  var a3117;
+  var a3118;
+  var a3119;
+  var a3120;
+  var a3121;
+  var a3122;
+  var a3123;
+  var a3124;
+  var a3125;
+  var a3126;
+  var a3127;
+  var a3128;
+  var a3129;
+  var a3130;
+  var a3131;
+  var a3132;
+  var a3133;
+  var a3134;
+  var a3135;
+  var a3136;
+  var a3137;
+  var a3138;
+  var a3139;
+  var a3140;
+  var a3141;
+  var a3142;
+  var a3143;
+  var a3144;
+  var a3145;
+  var a3146;
+  var a3147;
+  var a3148;
+  var a3149;
+  var a3150;
+  var a3151;
+  var a3152;
+  var a3153;
+  var a3154;
+  var a3155;
+  var a3156;
+  var a3157;
+  var a3158;
+  var a3159;
+  var a3160;
+  var a3161;
+  var a3162;
+  var a3163;
+  var a3164;
+  var a3165;
+  var a3166;
+  var a3167;
+  var a3168;
+  var a3169;
+  var a3170;
+  var a3171;
+  var a3172;
+  var a3173;
+  var a3174;
+  var a3175;
+  var a3176;
+  var a3177;
+  var a3178;
+  var a3179;
+  var a3180;
+  var a3181;
+  var a3182;
+  var a3183;
+  var a3184;
+  var a3185;
+  var a3186;
+  var a3187;
+  var a3188;
+  var a3189;
+  var a3190;
+  var a3191;
+  var a3192;
+  var a3193;
+  var a3194;
+  var a3195;
+  var a3196;
+  var a3197;
+  var a3198;
+  var a3199;
+  var a3200;
+  var a3201;
+  var a3202;
+  var a3203;
+  var a3204;
+  var a3205;
+  var a3206;
+  var a3207;
+  var a3208;
+  var a3209;
+  var a3210;
+  var a3211;
+  var a3212;
+  var a3213;
+  var a3214;
+  var a3215;
+  var a3216;
+  var a3217;
+  var a3218;
+  var a3219;
+  var a3220;
+  var a3221;
+  var a3222;
+  var a3223;
+  var a3224;
+  var a3225;
+  var a3226;
+  var a3227;
+  var a3228;
+  var a3229;
+  var a3230;
+  var a3231;
+  var a3232;
+  var a3233;
+  var a3234;
+  var a3235;
+  var a3236;
+  var a3237;
+  var a3238;
+  var a3239;
+  var a3240;
+  var a3241;
+  var a3242;
+  var a3243;
+  var a3244;
+  var a3245;
+  var a3246;
+  var a3247;
+  var a3248;
+  var a3249;
+  var a3250;
+  var a3251;
+  var a3252;
+  var a3253;
+  var a3254;
+  var a3255;
+  var a3256;
+  var a3257;
+  var a3258;
+  var a3259;
+  var a3260;
+  var a3261;
+  var a3262;
+  var a3263;
+  var a3264;
+  var a3265;
+  var a3266;
+  var a3267;
+  var a3268;
+  var a3269;
+  var a3270;
+  var a3271;
+  var a3272;
+  var a3273;
+  var a3274;
+  var a3275;
+  var a3276;
+  var a3277;
+  var a3278;
+  var a3279;
+  var a3280;
+  var a3281;
+  var a3282;
+  var a3283;
+  var a3284;
+  var a3285;
+  var a3286;
+  var a3287;
+  var a3288;
+  var a3289;
+  var a3290;
+  var a3291;
+  var a3292;
+  var a3293;
+  var a3294;
+  var a3295;
+  var a3296;
+  var a3297;
+  var a3298;
+  var a3299;
+  var a3300;
+  var a3301;
+  var a3302;
+  var a3303;
+  var a3304;
+  var a3305;
+  var a3306;
+  var a3307;
+  var a3308;
+  var a3309;
+  var a3310;
+  var a3311;
+  var a3312;
+  var a3313;
+  var a3314;
+  var a3315;
+  var a3316;
+  var a3317;
+  var a3318;
+  var a3319;
+  var a3320;
+  var a3321;
+  var a3322;
+  var a3323;
+  var a3324;
+  var a3325;
+  var a3326;
+  var a3327;
+  var a3328;
+  var a3329;
+  var a3330;
+  var a3331;
+  var a3332;
+  var a3333;
+  var a3334;
+  var a3335;
+  var a3336;
+  var a3337;
+  var a3338;
+  var a3339;
+  var a3340;
+  var a3341;
+  var a3342;
+  var a3343;
+  var a3344;
+  var a3345;
+  var a3346;
+  var a3347;
+  var a3348;
+  var a3349;
+  var a3350;
+  var a3351;
+  var a3352;
+  var a3353;
+  var a3354;
+  var a3355;
+  var a3356;
+  var a3357;
+  var a3358;
+  var a3359;
+  var a3360;
+  var a3361;
+  var a3362;
+  var a3363;
+  var a3364;
+  var a3365;
+  var a3366;
+  var a3367;
+  var a3368;
+  var a3369;
+  var a3370;
+  var a3371;
+  var a3372;
+  var a3373;
+  var a3374;
+  var a3375;
+  var a3376;
+  var a3377;
+  var a3378;
+  var a3379;
+  var a3380;
+  var a3381;
+  var a3382;
+  var a3383;
+  var a3384;
+  var a3385;
+  var a3386;
+  var a3387;
+  var a3388;
+  var a3389;
+  var a3390;
+  var a3391;
+  var a3392;
+  var a3393;
+  var a3394;
+  var a3395;
+  var a3396;
+  var a3397;
+  var a3398;
+  var a3399;
+  var a3400;
+  var a3401;
+  var a3402;
+  var a3403;
+  var a3404;
+  var a3405;
+  var a3406;
+  var a3407;
+  var a3408;
+  var a3409;
+  var a3410;
+  var a3411;
+  var a3412;
+  var a3413;
+  var a3414;
+  var a3415;
+  var a3416;
+  var a3417;
+  var a3418;
+  var a3419;
+  var a3420;
+  var a3421;
+  var a3422;
+  var a3423;
+  var a3424;
+  var a3425;
+  var a3426;
+  var a3427;
+  var a3428;
+  var a3429;
+  var a3430;
+  var a3431;
+  var a3432;
+  var a3433;
+  var a3434;
+  var a3435;
+  var a3436;
+  var a3437;
+  var a3438;
+  var a3439;
+  var a3440;
+  var a3441;
+  var a3442;
+  var a3443;
+  var a3444;
+  var a3445;
+  var a3446;
+  var a3447;
+  var a3448;
+  var a3449;
+  var a3450;
+  var a3451;
+  var a3452;
+  var a3453;
+  var a3454;
+  var a3455;
+  var a3456;
+  var a3457;
+  var a3458;
+  var a3459;
+  var a3460;
+  var a3461;
+  var a3462;
+  var a3463;
+  var a3464;
+  var a3465;
+  var a3466;
+  var a3467;
+  var a3468;
+  var a3469;
+  var a3470;
+  var a3471;
+  var a3472;
+  var a3473;
+  var a3474;
+  var a3475;
+  var a3476;
+  var a3477;
+  var a3478;
+  var a3479;
+  var a3480;
+  var a3481;
+  var a3482;
+  var a3483;
+  var a3484;
+  var a3485;
+  var a3486;
+  var a3487;
+  var a3488;
+  var a3489;
+  var a3490;
+  var a3491;
+  var a3492;
+  var a3493;
+  var a3494;
+  var a3495;
+  var a3496;
+  var a3497;
+  var a3498;
+  var a3499;
+  var a3500;
+  var a3501;
+  var a3502;
+  var a3503;
+  var a3504;
+  var a3505;
+  var a3506;
+  var a3507;
+  var a3508;
+  var a3509;
+  var a3510;
+  var a3511;
+  var a3512;
+  var a3513;
+  var a3514;
+  var a3515;
+  var a3516;
+  var a3517;
+  var a3518;
+  var a3519;
+  var a3520;
+  var a3521;
+  var a3522;
+  var a3523;
+  var a3524;
+  var a3525;
+  var a3526;
+  var a3527;
+  var a3528;
+  var a3529;
+  var a3530;
+  var a3531;
+  var a3532;
+  var a3533;
+  var a3534;
+  var a3535;
+  var a3536;
+  var a3537;
+  var a3538;
+  var a3539;
+  var a3540;
+  var a3541;
+  var a3542;
+  var a3543;
+  var a3544;
+  var a3545;
+  var a3546;
+  var a3547;
+  var a3548;
+  var a3549;
+  var a3550;
+  var a3551;
+  var a3552;
+  var a3553;
+  var a3554;
+  var a3555;
+  var a3556;
+  var a3557;
+  var a3558;
+  var a3559;
+  var a3560;
+  var a3561;
+  var a3562;
+  var a3563;
+  var a3564;
+  var a3565;
+  var a3566;
+  var a3567;
+  var a3568;
+  var a3569;
+  var a3570;
+  var a3571;
+  var a3572;
+  var a3573;
+  var a3574;
+  var a3575;
+  var a3576;
+  var a3577;
+  var a3578;
+  var a3579;
+  var a3580;
+  var a3581;
+  var a3582;
+  var a3583;
+  var a3584;
+  var a3585;
+  var a3586;
+  var a3587;
+  var a3588;
+  var a3589;
+  var a3590;
+  var a3591;
+  var a3592;
+  var a3593;
+  var a3594;
+  var a3595;
+  var a3596;
+  var a3597;
+  var a3598;
+  var a3599;
+  var a3600;
+  var a3601;
+  var a3602;
+  var a3603;
+  var a3604;
+  var a3605;
+  var a3606;
+  var a3607;
+  var a3608;
+  var a3609;
+  var a3610;
+  var a3611;
+  var a3612;
+  var a3613;
+  var a3614;
+  var a3615;
+  var a3616;
+  var a3617;
+  var a3618;
+  var a3619;
+  var a3620;
+  var a3621;
+  var a3622;
+  var a3623;
+  var a3624;
+  var a3625;
+  var a3626;
+  var a3627;
+  var a3628;
+  var a3629;
+  var a3630;
+  var a3631;
+  var a3632;
+  var a3633;
+  var a3634;
+  var a3635;
+  var a3636;
+  var a3637;
+  var a3638;
+  var a3639;
+  var a3640;
+  var a3641;
+  var a3642;
+  var a3643;
+  var a3644;
+  var a3645;
+  var a3646;
+  var a3647;
+  var a3648;
+  var a3649;
+  var a3650;
+  var a3651;
+  var a3652;
+  var a3653;
+  var a3654;
+  var a3655;
+  var a3656;
+  var a3657;
+  var a3658;
+  var a3659;
+  var a3660;
+  var a3661;
+  var a3662;
+  var a3663;
+  var a3664;
+  var a3665;
+  var a3666;
+  var a3667;
+  var a3668;
+  var a3669;
+  var a3670;
+  var a3671;
+  var a3672;
+  var a3673;
+  var a3674;
+  var a3675;
+  var a3676;
+  var a3677;
+  var a3678;
+  var a3679;
+  var a3680;
+  var a3681;
+  var a3682;
+  var a3683;
+  var a3684;
+  var a3685;
+  var a3686;
+  var a3687;
+  var a3688;
+  var a3689;
+  var a3690;
+  var a3691;
+  var a3692;
+  var a3693;
+  var a3694;
+  var a3695;
+  var a3696;
+  var a3697;
+  var a3698;
+  var a3699;
+  var a3700;
+  var a3701;
+  var a3702;
+  var a3703;
+  var a3704;
+  var a3705;
+  var a3706;
+  var a3707;
+  var a3708;
+  var a3709;
+  var a3710;
+  var a3711;
+  var a3712;
+  var a3713;
+  var a3714;
+  var a3715;
+  var a3716;
+  var a3717;
+  var a3718;
+  var a3719;
+  var a3720;
+  var a3721;
+  var a3722;
+  var a3723;
+  var a3724;
+  var a3725;
+  var a3726;
+  var a3727;
+  var a3728;
+  var a3729;
+  var a3730;
+  var a3731;
+  var a3732;
+  var a3733;
+  var a3734;
+  var a3735;
+  var a3736;
+  var a3737;
+  var a3738;
+  var a3739;
+  var a3740;
+  var a3741;
+  var a3742;
+  var a3743;
+  var a3744;
+  var a3745;
+  var a3746;
+  var a3747;
+  var a3748;
+  var a3749;
+  var a3750;
+  var a3751;
+  var a3752;
+  var a3753;
+  var a3754;
+  var a3755;
+  var a3756;
+  var a3757;
+  var a3758;
+  var a3759;
+  var a3760;
+  var a3761;
+  var a3762;
+  var a3763;
+  var a3764;
+  var a3765;
+  var a3766;
+  var a3767;
+  var a3768;
+  var a3769;
+  var a3770;
+  var a3771;
+  var a3772;
+  var a3773;
+  var a3774;
+  var a3775;
+  var a3776;
+  var a3777;
+  var a3778;
+  var a3779;
+  var a3780;
+  var a3781;
+  var a3782;
+  var a3783;
+  var a3784;
+  var a3785;
+  var a3786;
+  var a3787;
+  var a3788;
+  var a3789;
+  var a3790;
+  var a3791;
+  var a3792;
+  var a3793;
+  var a3794;
+  var a3795;
+  var a3796;
+  var a3797;
+  var a3798;
+  var a3799;
+  var a3800;
+  var a3801;
+  var a3802;
+  var a3803;
+  var a3804;
+  var a3805;
+  var a3806;
+  var a3807;
+  var a3808;
+  var a3809;
+  var a3810;
+  var a3811;
+  var a3812;
+  var a3813;
+  var a3814;
+  var a3815;
+  var a3816;
+  var a3817;
+  var a3818;
+  var a3819;
+  var a3820;
+  var a3821;
+  var a3822;
+  var a3823;
+  var a3824;
+  var a3825;
+  var a3826;
+  var a3827;
+  var a3828;
+  var a3829;
+  var a3830;
+  var a3831;
+  var a3832;
+  var a3833;
+  var a3834;
+  var a3835;
+  var a3836;
+  var a3837;
+  var a3838;
+  var a3839;
+  var a3840;
+  var a3841;
+  var a3842;
+  var a3843;
+  var a3844;
+  var a3845;
+  var a3846;
+  var a3847;
+  var a3848;
+  var a3849;
+  var a3850;
+  var a3851;
+  var a3852;
+  var a3853;
+  var a3854;
+  var a3855;
+  var a3856;
+  var a3857;
+  var a3858;
+  var a3859;
+  var a3860;
+  var a3861;
+  var a3862;
+  var a3863;
+  var a3864;
+  var a3865;
+  var a3866;
+  var a3867;
+  var a3868;
+  var a3869;
+  var a3870;
+  var a3871;
+  var a3872;
+  var a3873;
+  var a3874;
+  var a3875;
+  var a3876;
+  var a3877;
+  var a3878;
+  var a3879;
+  var a3880;
+  var a3881;
+  var a3882;
+  var a3883;
+  var a3884;
+  var a3885;
+  var a3886;
+  var a3887;
+  var a3888;
+  var a3889;
+  var a3890;
+  var a3891;
+  var a3892;
+  var a3893;
+  var a3894;
+  var a3895;
+  var a3896;
+  var a3897;
+  var a3898;
+  var a3899;
+  var a3900;
+  var a3901;
+  var a3902;
+  var a3903;
+  var a3904;
+  var a3905;
+  var a3906;
+  var a3907;
+  var a3908;
+  var a3909;
+  var a3910;
+  var a3911;
+  var a3912;
+  var a3913;
+  var a3914;
+  var a3915;
+  var a3916;
+  var a3917;
+  var a3918;
+  var a3919;
+  var a3920;
+  var a3921;
+  var a3922;
+  var a3923;
+  var a3924;
+  var a3925;
+  var a3926;
+  var a3927;
+  var a3928;
+  var a3929;
+  var a3930;
+  var a3931;
+  var a3932;
+  var a3933;
+  var a3934;
+  var a3935;
+  var a3936;
+  var a3937;
+  var a3938;
+  var a3939;
+  var a3940;
+  var a3941;
+  var a3942;
+  var a3943;
+  var a3944;
+  var a3945;
+  var a3946;
+  var a3947;
+  var a3948;
+  var a3949;
+  var a3950;
+  var a3951;
+  var a3952;
+  var a3953;
+  var a3954;
+  var a3955;
+  var a3956;
+  var a3957;
+  var a3958;
+  var a3959;
+  var a3960;
+  var a3961;
+  var a3962;
+  var a3963;
+  var a3964;
+  var a3965;
+  var a3966;
+  var a3967;
+  var a3968;
+  var a3969;
+  var a3970;
+  var a3971;
+  var a3972;
+  var a3973;
+  var a3974;
+  var a3975;
+  var a3976;
+  var a3977;
+  var a3978;
+  var a3979;
+  var a3980;
+  var a3981;
+  var a3982;
+  var a3983;
+  var a3984;
+  var a3985;
+  var a3986;
+  var a3987;
+  var a3988;
+  var a3989;
+  var a3990;
+  var a3991;
+  var a3992;
+  var a3993;
+  var a3994;
+  var a3995;
+  var a3996;
+  var a3997;
+  var a3998;
+  var a3999;
+  var a4000;
+  var a4001;
+  var a4002;
+  var a4003;
+  var a4004;
+  var a4005;
+  var a4006;
+  var a4007;
+  var a4008;
+  var a4009;
+  var a4010;
+  var a4011;
+  var a4012;
+  var a4013;
+  var a4014;
+  var a4015;
+  var a4016;
+  var a4017;
+  var a4018;
+  var a4019;
+  var a4020;
+  var a4021;
+  var a4022;
+  var a4023;
+  var a4024;
+  var a4025;
+  var a4026;
+  var a4027;
+  var a4028;
+  var a4029;
+  var a4030;
+  var a4031;
+  var a4032;
+  var a4033;
+  var a4034;
+  var a4035;
+  var a4036;
+  var a4037;
+  var a4038;
+  var a4039;
+  var a4040;
+  var a4041;
+  var a4042;
+  var a4043;
+  var a4044;
+  var a4045;
+  var a4046;
+  var a4047;
+  var a4048;
+  var a4049;
+  var a4050;
+  var a4051;
+  var a4052;
+  var a4053;
+  var a4054;
+  var a4055;
+  var a4056;
+  var a4057;
+  var a4058;
+  var a4059;
+  var a4060;
+  var a4061;
+  var a4062;
+  var a4063;
+  var a4064;
+  var a4065;
+  var a4066;
+  var a4067;
+  var a4068;
+  var a4069;
+  var a4070;
+  var a4071;
+  var a4072;
+  var a4073;
+  var a4074;
+  var a4075;
+  var a4076;
+  var a4077;
+  var a4078;
+  var a4079;
+  var a4080;
+  var a4081;
+  var a4082;
+  var a4083;
+  var a4084;
+  var a4085;
+  var a4086;
+  var a4087;
+  var a4088;
+  var a4089;
+  var a4090;
+  var a4091;
+  var a4092;
+  var a4093;
+  var a4094;
+  var a4095;
+  var a4096;
+  var a4097;
+  var a4098;
+  var a4099;
+  var a4100;
+  var a4101;
+  var a4102;
+  var a4103;
+  var a4104;
+  var a4105;
+  var a4106;
+  var a4107;
+  var a4108;
+  var a4109;
+  var a4110;
+  var a4111;
+  var a4112;
+  var a4113;
+  var a4114;
+  var a4115;
+  var a4116;
+  var a4117;
+  var a4118;
+  var a4119;
+  var a4120;
+  var a4121;
+  var a4122;
+  var a4123;
+  var a4124;
+  var a4125;
+  var a4126;
+  var a4127;
+  var a4128;
+  var a4129;
+  var a4130;
+  var a4131;
+  var a4132;
+  var a4133;
+  var a4134;
+  var a4135;
+  var a4136;
+  var a4137;
+  var a4138;
+  var a4139;
+  var a4140;
+  var a4141;
+  var a4142;
+  var a4143;
+  var a4144;
+  var a4145;
+  var a4146;
+  var a4147;
+  var a4148;
+  var a4149;
+  var a4150;
+  var a4151;
+  var a4152;
+  var a4153;
+  var a4154;
+  var a4155;
+  var a4156;
+  var a4157;
+  var a4158;
+  var a4159;
+  var a4160;
+  var a4161;
+  var a4162;
+  var a4163;
+  var a4164;
+  var a4165;
+  var a4166;
+  var a4167;
+  var a4168;
+  var a4169;
+  var a4170;
+  var a4171;
+  var a4172;
+  var a4173;
+  var a4174;
+  var a4175;
+  var a4176;
+  var a4177;
+  var a4178;
+  var a4179;
+  var a4180;
+  var a4181;
+  var a4182;
+  var a4183;
+  var a4184;
+  var a4185;
+  var a4186;
+  var a4187;
+  var a4188;
+  var a4189;
+  var a4190;
+  var a4191;
+  var a4192;
+  var a4193;
+  var a4194;
+  var a4195;
+  var a4196;
+  var a4197;
+  var a4198;
+  var a4199;
+  var a4200;
+  var a4201;
+  var a4202;
+  var a4203;
+  var a4204;
+  var a4205;
+  var a4206;
+  var a4207;
+  var a4208;
+  var a4209;
+  var a4210;
+  var a4211;
+  var a4212;
+  var a4213;
+  var a4214;
+  var a4215;
+  var a4216;
+  var a4217;
+  var a4218;
+  var a4219;
+  var a4220;
+  var a4221;
+  var a4222;
+  var a4223;
+  var a4224;
+  var a4225;
+  var a4226;
+  var a4227;
+  var a4228;
+  var a4229;
+  var a4230;
+  var a4231;
+  var a4232;
+  var a4233;
+  var a4234;
+  var a4235;
+  var a4236;
+  var a4237;
+  var a4238;
+  var a4239;
+  var a4240;
+  var a4241;
+  var a4242;
+  var a4243;
+  var a4244;
+  var a4245;
+  var a4246;
+  var a4247;
+  var a4248;
+  var a4249;
+  var a4250;
+  var a4251;
+  var a4252;
+  var a4253;
+  var a4254;
+  var a4255;
+  var a4256;
+  var a4257;
+  var a4258;
+  var a4259;
+  var a4260;
+  var a4261;
+  var a4262;
+  var a4263;
+  var a4264;
+  var a4265;
+  var a4266;
+  var a4267;
+  var a4268;
+  var a4269;
+  var a4270;
+  var a4271;
+  var a4272;
+  var a4273;
+  var a4274;
+  var a4275;
+  var a4276;
+  var a4277;
+  var a4278;
+  var a4279;
+  var a4280;
+  var a4281;
+  var a4282;
+  var a4283;
+  var a4284;
+  var a4285;
+  var a4286;
+  var a4287;
+  var a4288;
+  var a4289;
+  var a4290;
+  var a4291;
+  var a4292;
+  var a4293;
+  var a4294;
+  var a4295;
+  var a4296;
+  var a4297;
+  var a4298;
+  var a4299;
+  var a4300;
+  var a4301;
+  var a4302;
+  var a4303;
+  var a4304;
+  var a4305;
+  var a4306;
+  var a4307;
+  var a4308;
+  var a4309;
+  var a4310;
+  var a4311;
+  var a4312;
+  var a4313;
+  var a4314;
+  var a4315;
+  var a4316;
+  var a4317;
+  var a4318;
+  var a4319;
+  var a4320;
+  var a4321;
+  var a4322;
+  var a4323;
+  var a4324;
+  var a4325;
+  var a4326;
+  var a4327;
+  var a4328;
+  var a4329;
+  var a4330;
+  var a4331;
+  var a4332;
+  var a4333;
+  var a4334;
+  var a4335;
+  var a4336;
+  var a4337;
+  var a4338;
+  var a4339;
+  var a4340;
+  var a4341;
+  var a4342;
+  var a4343;
+  var a4344;
+  var a4345;
+  var a4346;
+  var a4347;
+  var a4348;
+  var a4349;
+  var a4350;
+  var a4351;
+  var a4352;
+  var a4353;
+  var a4354;
+  var a4355;
+  var a4356;
+  var a4357;
+  var a4358;
+  var a4359;
+  var a4360;
+  var a4361;
+  var a4362;
+  var a4363;
+  var a4364;
+  var a4365;
+  var a4366;
+  var a4367;
+  var a4368;
+  var a4369;
+  var a4370;
+  var a4371;
+  var a4372;
+  var a4373;
+  var a4374;
+  var a4375;
+  var a4376;
+  var a4377;
+  var a4378;
+  var a4379;
+  var a4380;
+  var a4381;
+  var a4382;
+  var a4383;
+  var a4384;
+  var a4385;
+  var a4386;
+  var a4387;
+  var a4388;
+  var a4389;
+  var a4390;
+  var a4391;
+  var a4392;
+  var a4393;
+  var a4394;
+  var a4395;
+  var a4396;
+  var a4397;
+  var a4398;
+  var a4399;
+  var a4400;
+  var a4401;
+  var a4402;
+  var a4403;
+  var a4404;
+  var a4405;
+  var a4406;
+  var a4407;
+  var a4408;
+  var a4409;
+  var a4410;
+  var a4411;
+  var a4412;
+  var a4413;
+  var a4414;
+  var a4415;
+  var a4416;
+  var a4417;
+  var a4418;
+  var a4419;
+  var a4420;
+  var a4421;
+  var a4422;
+  var a4423;
+  var a4424;
+  var a4425;
+  var a4426;
+  var a4427;
+  var a4428;
+  var a4429;
+  var a4430;
+  var a4431;
+  var a4432;
+  var a4433;
+  var a4434;
+  var a4435;
+  var a4436;
+  var a4437;
+  var a4438;
+  var a4439;
+  var a4440;
+  var a4441;
+  var a4442;
+  var a4443;
+  var a4444;
+  var a4445;
+  var a4446;
+  var a4447;
+  var a4448;
+  var a4449;
+  var a4450;
+  var a4451;
+  var a4452;
+  var a4453;
+  var a4454;
+  var a4455;
+  var a4456;
+  var a4457;
+  var a4458;
+  var a4459;
+  var a4460;
+  var a4461;
+  var a4462;
+  var a4463;
+  var a4464;
+  var a4465;
+  var a4466;
+  var a4467;
+  var a4468;
+  var a4469;
+  var a4470;
+  var a4471;
+  var a4472;
+  var a4473;
+  var a4474;
+  var a4475;
+  var a4476;
+  var a4477;
+  var a4478;
+  var a4479;
+  var a4480;
+  var a4481;
+  var a4482;
+  var a4483;
+  var a4484;
+  var a4485;
+  var a4486;
+  var a4487;
+  var a4488;
+  var a4489;
+  var a4490;
+  var a4491;
+  var a4492;
+  var a4493;
+  var a4494;
+  var a4495;
+  var a4496;
+  var a4497;
+  var a4498;
+  var a4499;
+  var a4500;
+  var a4501;
+  var a4502;
+  var a4503;
+  var a4504;
+  var a4505;
+  var a4506;
+  var a4507;
+  var a4508;
+  var a4509;
+  var a4510;
+  var a4511;
+  var a4512;
+  var a4513;
+  var a4514;
+  var a4515;
+  var a4516;
+  var a4517;
+  var a4518;
+  var a4519;
+  var a4520;
+  var a4521;
+  var a4522;
+  var a4523;
+  var a4524;
+  var a4525;
+  var a4526;
+  var a4527;
+  var a4528;
+  var a4529;
+  var a4530;
+  var a4531;
+  var a4532;
+  var a4533;
+  var a4534;
+  var a4535;
+  var a4536;
+  var a4537;
+  var a4538;
+  var a4539;
+  var a4540;
+  var a4541;
+  var a4542;
+  var a4543;
+  var a4544;
+  var a4545;
+  var a4546;
+  var a4547;
+  var a4548;
+  var a4549;
+  var a4550;
+  var a4551;
+  var a4552;
+  var a4553;
+  var a4554;
+  var a4555;
+  var a4556;
+  var a4557;
+  var a4558;
+  var a4559;
+  var a4560;
+  var a4561;
+  var a4562;
+  var a4563;
+  var a4564;
+  var a4565;
+  var a4566;
+  var a4567;
+  var a4568;
+  var a4569;
+  var a4570;
+  var a4571;
+  var a4572;
+  var a4573;
+  var a4574;
+  var a4575;
+  var a4576;
+  var a4577;
+  var a4578;
+  var a4579;
+  var a4580;
+  var a4581;
+  var a4582;
+  var a4583;
+  var a4584;
+  var a4585;
+  var a4586;
+  var a4587;
+  var a4588;
+  var a4589;
+  var a4590;
+  var a4591;
+  var a4592;
+  var a4593;
+  var a4594;
+  var a4595;
+  var a4596;
+  var a4597;
+  var a4598;
+  var a4599;
+  var a4600;
+  var a4601;
+  var a4602;
+  var a4603;
+  var a4604;
+  var a4605;
+  var a4606;
+  var a4607;
+  var a4608;
+  var a4609;
+  var a4610;
+  var a4611;
+  var a4612;
+  var a4613;
+  var a4614;
+  var a4615;
+  var a4616;
+  var a4617;
+  var a4618;
+  var a4619;
+  var a4620;
+  var a4621;
+  var a4622;
+  var a4623;
+  var a4624;
+  var a4625;
+  var a4626;
+  var a4627;
+  var a4628;
+  var a4629;
+  var a4630;
+  var a4631;
+  var a4632;
+  var a4633;
+  var a4634;
+  var a4635;
+  var a4636;
+  var a4637;
+  var a4638;
+  var a4639;
+  var a4640;
+  var a4641;
+  var a4642;
+  var a4643;
+  var a4644;
+  var a4645;
+  var a4646;
+  var a4647;
+  var a4648;
+  var a4649;
+  var a4650;
+  var a4651;
+  var a4652;
+  var a4653;
+  var a4654;
+  var a4655;
+  var a4656;
+  var a4657;
+  var a4658;
+  var a4659;
+  var a4660;
+  var a4661;
+  var a4662;
+  var a4663;
+  var a4664;
+  var a4665;
+  var a4666;
+  var a4667;
+  var a4668;
+  var a4669;
+  var a4670;
+  var a4671;
+  var a4672;
+  var a4673;
+  var a4674;
+  var a4675;
+  var a4676;
+  var a4677;
+  var a4678;
+  var a4679;
+  var a4680;
+  var a4681;
+  var a4682;
+  var a4683;
+  var a4684;
+  var a4685;
+  var a4686;
+  var a4687;
+  var a4688;
+  var a4689;
+  var a4690;
+  var a4691;
+  var a4692;
+  var a4693;
+  var a4694;
+  var a4695;
+  var a4696;
+  var a4697;
+  var a4698;
+  var a4699;
+  var a4700;
+  var a4701;
+  var a4702;
+  var a4703;
+  var a4704;
+  var a4705;
+  var a4706;
+  var a4707;
+  var a4708;
+  var a4709;
+  var a4710;
+  var a4711;
+  var a4712;
+  var a4713;
+  var a4714;
+  var a4715;
+  var a4716;
+  var a4717;
+  var a4718;
+  var a4719;
+  var a4720;
+  var a4721;
+  var a4722;
+  var a4723;
+  var a4724;
+  var a4725;
+  var a4726;
+  var a4727;
+  var a4728;
+  var a4729;
+  var a4730;
+  var a4731;
+  var a4732;
+  var a4733;
+  var a4734;
+  var a4735;
+  var a4736;
+  var a4737;
+  var a4738;
+  var a4739;
+  var a4740;
+  var a4741;
+  var a4742;
+  var a4743;
+  var a4744;
+  var a4745;
+  var a4746;
+  var a4747;
+  var a4748;
+  var a4749;
+  var a4750;
+  var a4751;
+  var a4752;
+  var a4753;
+  var a4754;
+  var a4755;
+  var a4756;
+  var a4757;
+  var a4758;
+  var a4759;
+  var a4760;
+  var a4761;
+  var a4762;
+  var a4763;
+  var a4764;
+  var a4765;
+  var a4766;
+  var a4767;
+  var a4768;
+  var a4769;
+  var a4770;
+  var a4771;
+  var a4772;
+  var a4773;
+  var a4774;
+  var a4775;
+  var a4776;
+  var a4777;
+  var a4778;
+  var a4779;
+  var a4780;
+  var a4781;
+  var a4782;
+  var a4783;
+  var a4784;
+  var a4785;
+  var a4786;
+  var a4787;
+  var a4788;
+  var a4789;
+  var a4790;
+  var a4791;
+  var a4792;
+  var a4793;
+  var a4794;
+  var a4795;
+  var a4796;
+  var a4797;
+  var a4798;
+  var a4799;
+  var a4800;
+  var a4801;
+  var a4802;
+  var a4803;
+  var a4804;
+  var a4805;
+  var a4806;
+  var a4807;
+  var a4808;
+  var a4809;
+  var a4810;
+  var a4811;
+  var a4812;
+  var a4813;
+  var a4814;
+  var a4815;
+  var a4816;
+  var a4817;
+  var a4818;
+  var a4819;
+  var a4820;
+  var a4821;
+  var a4822;
+  var a4823;
+  var a4824;
+  var a4825;
+  var a4826;
+  var a4827;
+  var a4828;
+  var a4829;
+  var a4830;
+  var a4831;
+  var a4832;
+  var a4833;
+  var a4834;
+  var a4835;
+  var a4836;
+  var a4837;
+  var a4838;
+  var a4839;
+  var a4840;
+  var a4841;
+  var a4842;
+  var a4843;
+  var a4844;
+  var a4845;
+  var a4846;
+  var a4847;
+  var a4848;
+  var a4849;
+  var a4850;
+  var a4851;
+  var a4852;
+  var a4853;
+  var a4854;
+  var a4855;
+  var a4856;
+  var a4857;
+  var a4858;
+  var a4859;
+  var a4860;
+  var a4861;
+  var a4862;
+  var a4863;
+  var a4864;
+  var a4865;
+  var a4866;
+  var a4867;
+  var a4868;
+  var a4869;
+  var a4870;
+  var a4871;
+  var a4872;
+  var a4873;
+  var a4874;
+  var a4875;
+  var a4876;
+  var a4877;
+  var a4878;
+  var a4879;
+  var a4880;
+  var a4881;
+  var a4882;
+  var a4883;
+  var a4884;
+  var a4885;
+  var a4886;
+  var a4887;
+  var a4888;
+  var a4889;
+  var a4890;
+  var a4891;
+  var a4892;
+  var a4893;
+  var a4894;
+  var a4895;
+  var a4896;
+  var a4897;
+  var a4898;
+  var a4899;
+  var a4900;
+  var a4901;
+  var a4902;
+  var a4903;
+  var a4904;
+  var a4905;
+  var a4906;
+  var a4907;
+  var a4908;
+  var a4909;
+  var a4910;
+  var a4911;
+  var a4912;
+  var a4913;
+  var a4914;
+  var a4915;
+  var a4916;
+  var a4917;
+  var a4918;
+  var a4919;
+  var a4920;
+  var a4921;
+  var a4922;
+  var a4923;
+  var a4924;
+  var a4925;
+  var a4926;
+  var a4927;
+  var a4928;
+  var a4929;
+  var a4930;
+  var a4931;
+  var a4932;
+  var a4933;
+  var a4934;
+  var a4935;
+  var a4936;
+  var a4937;
+  var a4938;
+  var a4939;
+  var a4940;
+  var a4941;
+  var a4942;
+  var a4943;
+  var a4944;
+  var a4945;
+  var a4946;
+  var a4947;
+  var a4948;
+  var a4949;
+  var a4950;
+  var a4951;
+  var a4952;
+  var a4953;
+  var a4954;
+  var a4955;
+  var a4956;
+  var a4957;
+  var a4958;
+  var a4959;
+  var a4960;
+  var a4961;
+  var a4962;
+  var a4963;
+  var a4964;
+  var a4965;
+  var a4966;
+  var a4967;
+  var a4968;
+  var a4969;
+  var a4970;
+  var a4971;
+  var a4972;
+  var a4973;
+  var a4974;
+  var a4975;
+  var a4976;
+  var a4977;
+  var a4978;
+  var a4979;
+  var a4980;
+  var a4981;
+  var a4982;
+  var a4983;
+  var a4984;
+  var a4985;
+  var a4986;
+  var a4987;
+  var a4988;
+  var a4989;
+  var a4990;
+  var a4991;
+  var a4992;
+  var a4993;
+  var a4994;
+  var a4995;
+  var a4996;
+  var a4997;
+  var a4998;
+  var a4999;
+  var a5000;
+  var a5001;
+  var a5002;
+  var a5003;
+  var a5004;
+  var a5005;
+  var a5006;
+  var a5007;
+  var a5008;
+  var a5009;
+  var a5010;
+  var a5011;
+  var a5012;
+  var a5013;
+  var a5014;
+  var a5015;
+  var a5016;
+  var a5017;
+  var a5018;
+  var a5019;
+  var a5020;
+  var a5021;
+  var a5022;
+  var a5023;
+  var a5024;
+  var a5025;
+  var a5026;
+  var a5027;
+  var a5028;
+  var a5029;
+  var a5030;
+  var a5031;
+  var a5032;
+  var a5033;
+  var a5034;
+  var a5035;
+  var a5036;
+  var a5037;
+  var a5038;
+  var a5039;
+  var a5040;
+  var a5041;
+  var a5042;
+  var a5043;
+  var a5044;
+  var a5045;
+  var a5046;
+  var a5047;
+  var a5048;
+  var a5049;
+  var a5050;
+  var a5051;
+  var a5052;
+  var a5053;
+  var a5054;
+  var a5055;
+  var a5056;
+  var a5057;
+  var a5058;
+  var a5059;
+  var a5060;
+  var a5061;
+  var a5062;
+  var a5063;
+  var a5064;
+  var a5065;
+  var a5066;
+  var a5067;
+  var a5068;
+  var a5069;
+  var a5070;
+  var a5071;
+  var a5072;
+  var a5073;
+  var a5074;
+  var a5075;
+  var a5076;
+  var a5077;
+  var a5078;
+  var a5079;
+  var a5080;
+  var a5081;
+  var a5082;
+  var a5083;
+  var a5084;
+  var a5085;
+  var a5086;
+  var a5087;
+  var a5088;
+  var a5089;
+  var a5090;
+  var a5091;
+  var a5092;
+  var a5093;
+  var a5094;
+  var a5095;
+  var a5096;
+  var a5097;
+  var a5098;
+  var a5099;
+  var a5100;
+  var a5101;
+  var a5102;
+  var a5103;
+  var a5104;
+  var a5105;
+  var a5106;
+  var a5107;
+  var a5108;
+  var a5109;
+  var a5110;
+  var a5111;
+  var a5112;
+  var a5113;
+  var a5114;
+  var a5115;
+  var a5116;
+  var a5117;
+  var a5118;
+  var a5119;
+  var a5120;
+  var a5121;
+  var a5122;
+  var a5123;
+  var a5124;
+  var a5125;
+  var a5126;
+  var a5127;
+  var a5128;
+  var a5129;
+  var a5130;
+  var a5131;
+  var a5132;
+  var a5133;
+  var a5134;
+  var a5135;
+  var a5136;
+  var a5137;
+  var a5138;
+  var a5139;
+  var a5140;
+  var a5141;
+  var a5142;
+  var a5143;
+  var a5144;
+  var a5145;
+  var a5146;
+  var a5147;
+  var a5148;
+  var a5149;
+  var a5150;
+  var a5151;
+  var a5152;
+  var a5153;
+  var a5154;
+  var a5155;
+  var a5156;
+  var a5157;
+  var a5158;
+  var a5159;
+  var a5160;
+  var a5161;
+  var a5162;
+  var a5163;
+  var a5164;
+  var a5165;
+  var a5166;
+  var a5167;
+  var a5168;
+  var a5169;
+  var a5170;
+  var a5171;
+  var a5172;
+  var a5173;
+  var a5174;
+  var a5175;
+  var a5176;
+  var a5177;
+  var a5178;
+  var a5179;
+  var a5180;
+  var a5181;
+  var a5182;
+  var a5183;
+  var a5184;
+  var a5185;
+  var a5186;
+  var a5187;
+  var a5188;
+  var a5189;
+  var a5190;
+  var a5191;
+  var a5192;
+  var a5193;
+  var a5194;
+  var a5195;
+  var a5196;
+  var a5197;
+  var a5198;
+  var a5199;
+  var a5200;
+  var a5201;
+  var a5202;
+  var a5203;
+  var a5204;
+  var a5205;
+  var a5206;
+  var a5207;
+  var a5208;
+  var a5209;
+  var a5210;
+  var a5211;
+  var a5212;
+  var a5213;
+  var a5214;
+  var a5215;
+  var a5216;
+  var a5217;
+  var a5218;
+  var a5219;
+  var a5220;
+  var a5221;
+  var a5222;
+  var a5223;
+  var a5224;
+  var a5225;
+  var a5226;
+  var a5227;
+  var a5228;
+  var a5229;
+  var a5230;
+  var a5231;
+  var a5232;
+  var a5233;
+  var a5234;
+  var a5235;
+  var a5236;
+  var a5237;
+  var a5238;
+  var a5239;
+  var a5240;
+  var a5241;
+  var a5242;
+  var a5243;
+  var a5244;
+  var a5245;
+  var a5246;
+  var a5247;
+  var a5248;
+  var a5249;
+  var a5250;
+  var a5251;
+  var a5252;
+  var a5253;
+  var a5254;
+  var a5255;
+  var a5256;
+  var a5257;
+  var a5258;
+  var a5259;
+  var a5260;
+  var a5261;
+  var a5262;
+  var a5263;
+  var a5264;
+  var a5265;
+  var a5266;
+  var a5267;
+  var a5268;
+  var a5269;
+  var a5270;
+  var a5271;
+  var a5272;
+  var a5273;
+  var a5274;
+  var a5275;
+  var a5276;
+  var a5277;
+  var a5278;
+  var a5279;
+  var a5280;
+  var a5281;
+  var a5282;
+  var a5283;
+  var a5284;
+  var a5285;
+  var a5286;
+  var a5287;
+  var a5288;
+  var a5289;
+  var a5290;
+  var a5291;
+  var a5292;
+  var a5293;
+  var a5294;
+  var a5295;
+  var a5296;
+  var a5297;
+  var a5298;
+  var a5299;
+  var a5300;
+  var a5301;
+  var a5302;
+  var a5303;
+  var a5304;
+  var a5305;
+  var a5306;
+  var a5307;
+  var a5308;
+  var a5309;
+  var a5310;
+  var a5311;
+  var a5312;
+  var a5313;
+  var a5314;
+  var a5315;
+  var a5316;
+  var a5317;
+  var a5318;
+  var a5319;
+  var a5320;
+  var a5321;
+  var a5322;
+  var a5323;
+  var a5324;
+  var a5325;
+  var a5326;
+  var a5327;
+  var a5328;
+  var a5329;
+  var a5330;
+  var a5331;
+  var a5332;
+  var a5333;
+  var a5334;
+  var a5335;
+  var a5336;
+  var a5337;
+  var a5338;
+  var a5339;
+  var a5340;
+  var a5341;
+  var a5342;
+  var a5343;
+  var a5344;
+  var a5345;
+  var a5346;
+  var a5347;
+  var a5348;
+  var a5349;
+  var a5350;
+  var a5351;
+  var a5352;
+  var a5353;
+  var a5354;
+  var a5355;
+  var a5356;
+  var a5357;
+  var a5358;
+  var a5359;
+  var a5360;
+  var a5361;
+  var a5362;
+  var a5363;
+  var a5364;
+  var a5365;
+  var a5366;
+  var a5367;
+  var a5368;
+  var a5369;
+  var a5370;
+  var a5371;
+  var a5372;
+  var a5373;
+  var a5374;
+  var a5375;
+  var a5376;
+  var a5377;
+  var a5378;
+  var a5379;
+  var a5380;
+  var a5381;
+  var a5382;
+  var a5383;
+  var a5384;
+  var a5385;
+  var a5386;
+  var a5387;
+  var a5388;
+  var a5389;
+  var a5390;
+  var a5391;
+  var a5392;
+  var a5393;
+  var a5394;
+  var a5395;
+  var a5396;
+  var a5397;
+  var a5398;
+  var a5399;
+  var a5400;
+  var a5401;
+  var a5402;
+  var a5403;
+  var a5404;
+  var a5405;
+  var a5406;
+  var a5407;
+  var a5408;
+  var a5409;
+  var a5410;
+  var a5411;
+  var a5412;
+  var a5413;
+  var a5414;
+  var a5415;
+  var a5416;
+  var a5417;
+  var a5418;
+  var a5419;
+  var a5420;
+  var a5421;
+  var a5422;
+  var a5423;
+  var a5424;
+  var a5425;
+  var a5426;
+  var a5427;
+  var a5428;
+  var a5429;
+  var a5430;
+  var a5431;
+  var a5432;
+  var a5433;
+  var a5434;
+  var a5435;
+  var a5436;
+  var a5437;
+  var a5438;
+  var a5439;
+  var a5440;
+  var a5441;
+  var a5442;
+  var a5443;
+  var a5444;
+  var a5445;
+  var a5446;
+  var a5447;
+  var a5448;
+  var a5449;
+  var a5450;
+  var a5451;
+  var a5452;
+  var a5453;
+  var a5454;
+  var a5455;
+  var a5456;
+  var a5457;
+  var a5458;
+  var a5459;
+  var a5460;
+  var a5461;
+  var a5462;
+  var a5463;
+  var a5464;
+  var a5465;
+  var a5466;
+  var a5467;
+  var a5468;
+  var a5469;
+  var a5470;
+  var a5471;
+  var a5472;
+  var a5473;
+  var a5474;
+  var a5475;
+  var a5476;
+  var a5477;
+  var a5478;
+  var a5479;
+  var a5480;
+  var a5481;
+  var a5482;
+  var a5483;
+  var a5484;
+  var a5485;
+  var a5486;
+  var a5487;
+  var a5488;
+  var a5489;
+  var a5490;
+  var a5491;
+  var a5492;
+  var a5493;
+  var a5494;
+  var a5495;
+  var a5496;
+  var a5497;
+  var a5498;
+  var a5499;
+  var a5500;
+  var a5501;
+  var a5502;
+  var a5503;
+  var a5504;
+  var a5505;
+  var a5506;
+  var a5507;
+  var a5508;
+  var a5509;
+  var a5510;
+  var a5511;
+  var a5512;
+  var a5513;
+  var a5514;
+  var a5515;
+  var a5516;
+  var a5517;
+  var a5518;
+  var a5519;
+  var a5520;
+  var a5521;
+  var a5522;
+  var a5523;
+  var a5524;
+  var a5525;
+  var a5526;
+  var a5527;
+  var a5528;
+  var a5529;
+  var a5530;
+  var a5531;
+  var a5532;
+  var a5533;
+  var a5534;
+  var a5535;
+  var a5536;
+  var a5537;
+  var a5538;
+  var a5539;
+  var a5540;
+  var a5541;
+  var a5542;
+  var a5543;
+  var a5544;
+  var a5545;
+  var a5546;
+  var a5547;
+  var a5548;
+  var a5549;
+  var a5550;
+  var a5551;
+  var a5552;
+  var a5553;
+  var a5554;
+  var a5555;
+  var a5556;
+  var a5557;
+  var a5558;
+  var a5559;
+  var a5560;
+  var a5561;
+  var a5562;
+  var a5563;
+  var a5564;
+  var a5565;
+  var a5566;
+  var a5567;
+  var a5568;
+  var a5569;
+  var a5570;
+  var a5571;
+  var a5572;
+  var a5573;
+  var a5574;
+  var a5575;
+  var a5576;
+  var a5577;
+  var a5578;
+  var a5579;
+  var a5580;
+  var a5581;
+  var a5582;
+  var a5583;
+  var a5584;
+  var a5585;
+  var a5586;
+  var a5587;
+  var a5588;
+  var a5589;
+  var a5590;
+  var a5591;
+  var a5592;
+  var a5593;
+  var a5594;
+  var a5595;
+  var a5596;
+  var a5597;
+  var a5598;
+  var a5599;
+  var a5600;
+  var a5601;
+  var a5602;
+  var a5603;
+  var a5604;
+  var a5605;
+  var a5606;
+  var a5607;
+  var a5608;
+  var a5609;
+  var a5610;
+  var a5611;
+  var a5612;
+  var a5613;
+  var a5614;
+  var a5615;
+  var a5616;
+  var a5617;
+  var a5618;
+  var a5619;
+  var a5620;
+  var a5621;
+  var a5622;
+  var a5623;
+  var a5624;
+  var a5625;
+  var a5626;
+  var a5627;
+  var a5628;
+  var a5629;
+  var a5630;
+  var a5631;
+  var a5632;
+  var a5633;
+  var a5634;
+  var a5635;
+  var a5636;
+  var a5637;
+  var a5638;
+  var a5639;
+  var a5640;
+  var a5641;
+  var a5642;
+  var a5643;
+  var a5644;
+  var a5645;
+  var a5646;
+  var a5647;
+  var a5648;
+  var a5649;
+  var a5650;
+  var a5651;
+  var a5652;
+  var a5653;
+  var a5654;
+  var a5655;
+  var a5656;
+  var a5657;
+  var a5658;
+  var a5659;
+  var a5660;
+  var a5661;
+  var a5662;
+  var a5663;
+  var a5664;
+  var a5665;
+  var a5666;
+  var a5667;
+  var a5668;
+  var a5669;
+  var a5670;
+  var a5671;
+  var a5672;
+  var a5673;
+  var a5674;
+  var a5675;
+  var a5676;
+  var a5677;
+  var a5678;
+  var a5679;
+  var a5680;
+  var a5681;
+  var a5682;
+  var a5683;
+  var a5684;
+  var a5685;
+  var a5686;
+  var a5687;
+  var a5688;
+  var a5689;
+  var a5690;
+  var a5691;
+  var a5692;
+  var a5693;
+  var a5694;
+  var a5695;
+  var a5696;
+  var a5697;
+  var a5698;
+  var a5699;
+  var a5700;
+  var a5701;
+  var a5702;
+  var a5703;
+  var a5704;
+  var a5705;
+  var a5706;
+  var a5707;
+  var a5708;
+  var a5709;
+  var a5710;
+  var a5711;
+  var a5712;
+  var a5713;
+  var a5714;
+  var a5715;
+  var a5716;
+  var a5717;
+  var a5718;
+  var a5719;
+  var a5720;
+  var a5721;
+  var a5722;
+  var a5723;
+  var a5724;
+  var a5725;
+  var a5726;
+  var a5727;
+  var a5728;
+  var a5729;
+  var a5730;
+  var a5731;
+  var a5732;
+  var a5733;
+  var a5734;
+  var a5735;
+  var a5736;
+  var a5737;
+  var a5738;
+  var a5739;
+  var a5740;
+  var a5741;
+  var a5742;
+  var a5743;
+  var a5744;
+  var a5745;
+  var a5746;
+  var a5747;
+  var a5748;
+  var a5749;
+  var a5750;
+  var a5751;
+  var a5752;
+  var a5753;
+  var a5754;
+  var a5755;
+  var a5756;
+  var a5757;
+  var a5758;
+  var a5759;
+  var a5760;
+  var a5761;
+  var a5762;
+  var a5763;
+  var a5764;
+  var a5765;
+  var a5766;
+  var a5767;
+  var a5768;
+  var a5769;
+  var a5770;
+  var a5771;
+  var a5772;
+  var a5773;
+  var a5774;
+  var a5775;
+  var a5776;
+  var a5777;
+  var a5778;
+  var a5779;
+  var a5780;
+  var a5781;
+  var a5782;
+  var a5783;
+  var a5784;
+  var a5785;
+  var a5786;
+  var a5787;
+  var a5788;
+  var a5789;
+  var a5790;
+  var a5791;
+  var a5792;
+  var a5793;
+  var a5794;
+  var a5795;
+  var a5796;
+  var a5797;
+  var a5798;
+  var a5799;
+  var a5800;
+  var a5801;
+  var a5802;
+  var a5803;
+  var a5804;
+  var a5805;
+  var a5806;
+  var a5807;
+  var a5808;
+  var a5809;
+  var a5810;
+  var a5811;
+  var a5812;
+  var a5813;
+  var a5814;
+  var a5815;
+  var a5816;
+  var a5817;
+  var a5818;
+  var a5819;
+  var a5820;
+  var a5821;
+  var a5822;
+  var a5823;
+  var a5824;
+  var a5825;
+  var a5826;
+  var a5827;
+  var a5828;
+  var a5829;
+  var a5830;
+  var a5831;
+  var a5832;
+  var a5833;
+  var a5834;
+  var a5835;
+  var a5836;
+  var a5837;
+  var a5838;
+  var a5839;
+  var a5840;
+  var a5841;
+  var a5842;
+  var a5843;
+  var a5844;
+  var a5845;
+  var a5846;
+  var a5847;
+  var a5848;
+  var a5849;
+  var a5850;
+  var a5851;
+  var a5852;
+  var a5853;
+  var a5854;
+  var a5855;
+  var a5856;
+  var a5857;
+  var a5858;
+  var a5859;
+  var a5860;
+  var a5861;
+  var a5862;
+  var a5863;
+  var a5864;
+  var a5865;
+  var a5866;
+  var a5867;
+  var a5868;
+  var a5869;
+  var a5870;
+  var a5871;
+  var a5872;
+  var a5873;
+  var a5874;
+  var a5875;
+  var a5876;
+  var a5877;
+  var a5878;
+  var a5879;
+  var a5880;
+  var a5881;
+  var a5882;
+  var a5883;
+  var a5884;
+  var a5885;
+  var a5886;
+  var a5887;
+  var a5888;
+  var a5889;
+  var a5890;
+  var a5891;
+  var a5892;
+  var a5893;
+  var a5894;
+  var a5895;
+  var a5896;
+  var a5897;
+  var a5898;
+  var a5899;
+  var a5900;
+  var a5901;
+  var a5902;
+  var a5903;
+  var a5904;
+  var a5905;
+  var a5906;
+  var a5907;
+  var a5908;
+  var a5909;
+  var a5910;
+  var a5911;
+  var a5912;
+  var a5913;
+  var a5914;
+  var a5915;
+  var a5916;
+  var a5917;
+  var a5918;
+  var a5919;
+  var a5920;
+  var a5921;
+  var a5922;
+  var a5923;
+  var a5924;
+  var a5925;
+  var a5926;
+  var a5927;
+  var a5928;
+  var a5929;
+  var a5930;
+  var a5931;
+  var a5932;
+  var a5933;
+  var a5934;
+  var a5935;
+  var a5936;
+  var a5937;
+  var a5938;
+  var a5939;
+  var a5940;
+  var a5941;
+  var a5942;
+  var a5943;
+  var a5944;
+  var a5945;
+  var a5946;
+  var a5947;
+  var a5948;
+  var a5949;
+  var a5950;
+  var a5951;
+  var a5952;
+  var a5953;
+  var a5954;
+  var a5955;
+  var a5956;
+  var a5957;
+  var a5958;
+  var a5959;
+  var a5960;
+  var a5961;
+  var a5962;
+  var a5963;
+  var a5964;
+  var a5965;
+  var a5966;
+  var a5967;
+  var a5968;
+  var a5969;
+  var a5970;
+  var a5971;
+  var a5972;
+  var a5973;
+  var a5974;
+  var a5975;
+  var a5976;
+  var a5977;
+  var a5978;
+  var a5979;
+  var a5980;
+  var a5981;
+  var a5982;
+  var a5983;
+  var a5984;
+  var a5985;
+  var a5986;
+  var a5987;
+  var a5988;
+  var a5989;
+  var a5990;
+  var a5991;
+  var a5992;
+  var a5993;
+  var a5994;
+  var a5995;
+  var a5996;
+  var a5997;
+  var a5998;
+  var a5999;
+  var a6000;
+  var a6001;
+  var a6002;
+  var a6003;
+  var a6004;
+  var a6005;
+  var a6006;
+  var a6007;
+  var a6008;
+  var a6009;
+  var a6010;
+  var a6011;
+  var a6012;
+  var a6013;
+  var a6014;
+  var a6015;
+  var a6016;
+  var a6017;
+  var a6018;
+  var a6019;
+  var a6020;
+  var a6021;
+  var a6022;
+  var a6023;
+  var a6024;
+  var a6025;
+  var a6026;
+  var a6027;
+  var a6028;
+  var a6029;
+  var a6030;
+  var a6031;
+  var a6032;
+  var a6033;
+  var a6034;
+  var a6035;
+  var a6036;
+  var a6037;
+  var a6038;
+  var a6039;
+  var a6040;
+  var a6041;
+  var a6042;
+  var a6043;
+  var a6044;
+  var a6045;
+  var a6046;
+  var a6047;
+  var a6048;
+  var a6049;
+  var a6050;
+  var a6051;
+  var a6052;
+  var a6053;
+  var a6054;
+  var a6055;
+  var a6056;
+  var a6057;
+  var a6058;
+  var a6059;
+  var a6060;
+  var a6061;
+  var a6062;
+  var a6063;
+  var a6064;
+  var a6065;
+  var a6066;
+  var a6067;
+  var a6068;
+  var a6069;
+  var a6070;
+  var a6071;
+  var a6072;
+  var a6073;
+  var a6074;
+  var a6075;
+  var a6076;
+  var a6077;
+  var a6078;
+  var a6079;
+  var a6080;
+  var a6081;
+  var a6082;
+  var a6083;
+  var a6084;
+  var a6085;
+  var a6086;
+  var a6087;
+  var a6088;
+  var a6089;
+  var a6090;
+  var a6091;
+  var a6092;
+  var a6093;
+  var a6094;
+  var a6095;
+  var a6096;
+  var a6097;
+  var a6098;
+  var a6099;
+  var a6100;
+  var a6101;
+  var a6102;
+  var a6103;
+  var a6104;
+  var a6105;
+  var a6106;
+  var a6107;
+  var a6108;
+  var a6109;
+  var a6110;
+  var a6111;
+  var a6112;
+  var a6113;
+  var a6114;
+  var a6115;
+  var a6116;
+  var a6117;
+  var a6118;
+  var a6119;
+  var a6120;
+  var a6121;
+  var a6122;
+  var a6123;
+  var a6124;
+  var a6125;
+  var a6126;
+  var a6127;
+  var a6128;
+  var a6129;
+  var a6130;
+  var a6131;
+  var a6132;
+  var a6133;
+  var a6134;
+  var a6135;
+  var a6136;
+  var a6137;
+  var a6138;
+  var a6139;
+  var a6140;
+  var a6141;
+  var a6142;
+  var a6143;
+  var a6144;
+  var a6145;
+  var a6146;
+  var a6147;
+  var a6148;
+  var a6149;
+  var a6150;
+  var a6151;
+  var a6152;
+  var a6153;
+  var a6154;
+  var a6155;
+  var a6156;
+  var a6157;
+  var a6158;
+  var a6159;
+  var a6160;
+  var a6161;
+  var a6162;
+  var a6163;
+  var a6164;
+  var a6165;
+  var a6166;
+  var a6167;
+  var a6168;
+  var a6169;
+  var a6170;
+  var a6171;
+  var a6172;
+  var a6173;
+  var a6174;
+  var a6175;
+  var a6176;
+  var a6177;
+  var a6178;
+  var a6179;
+  var a6180;
+  var a6181;
+  var a6182;
+  var a6183;
+  var a6184;
+  var a6185;
+  var a6186;
+  var a6187;
+  var a6188;
+  var a6189;
+  var a6190;
+  var a6191;
+  var a6192;
+  var a6193;
+  var a6194;
+  var a6195;
+  var a6196;
+  var a6197;
+  var a6198;
+  var a6199;
+  var a6200;
+  var a6201;
+  var a6202;
+  var a6203;
+  var a6204;
+  var a6205;
+  var a6206;
+  var a6207;
+  var a6208;
+  var a6209;
+  var a6210;
+  var a6211;
+  var a6212;
+  var a6213;
+  var a6214;
+  var a6215;
+  var a6216;
+  var a6217;
+  var a6218;
+  var a6219;
+  var a6220;
+  var a6221;
+  var a6222;
+  var a6223;
+  var a6224;
+  var a6225;
+  var a6226;
+  var a6227;
+  var a6228;
+  var a6229;
+  var a6230;
+  var a6231;
+  var a6232;
+  var a6233;
+  var a6234;
+  var a6235;
+  var a6236;
+  var a6237;
+  var a6238;
+  var a6239;
+  var a6240;
+  var a6241;
+  var a6242;
+  var a6243;
+  var a6244;
+  var a6245;
+  var a6246;
+  var a6247;
+  var a6248;
+  var a6249;
+  var a6250;
+  var a6251;
+  var a6252;
+  var a6253;
+  var a6254;
+  var a6255;
+  var a6256;
+  var a6257;
+  var a6258;
+  var a6259;
+  var a6260;
+  var a6261;
+  var a6262;
+  var a6263;
+  var a6264;
+  var a6265;
+  var a6266;
+  var a6267;
+  var a6268;
+  var a6269;
+  var a6270;
+  var a6271;
+  var a6272;
+  var a6273;
+  var a6274;
+  var a6275;
+  var a6276;
+  var a6277;
+  var a6278;
+  var a6279;
+  var a6280;
+  var a6281;
+  var a6282;
+  var a6283;
+  var a6284;
+  var a6285;
+  var a6286;
+  var a6287;
+  var a6288;
+  var a6289;
+  var a6290;
+  var a6291;
+  var a6292;
+  var a6293;
+  var a6294;
+  var a6295;
+  var a6296;
+  var a6297;
+  var a6298;
+  var a6299;
+  var a6300;
+  var a6301;
+  var a6302;
+  var a6303;
+  var a6304;
+  var a6305;
+  var a6306;
+  var a6307;
+  var a6308;
+  var a6309;
+  var a6310;
+  var a6311;
+  var a6312;
+  var a6313;
+  var a6314;
+  var a6315;
+  var a6316;
+  var a6317;
+  var a6318;
+  var a6319;
+  var a6320;
+  var a6321;
+  var a6322;
+  var a6323;
+  var a6324;
+  var a6325;
+  var a6326;
+  var a6327;
+  var a6328;
+  var a6329;
+  var a6330;
+  var a6331;
+  var a6332;
+  var a6333;
+  var a6334;
+  var a6335;
+  var a6336;
+  var a6337;
+  var a6338;
+  var a6339;
+  var a6340;
+  var a6341;
+  var a6342;
+  var a6343;
+  var a6344;
+  var a6345;
+  var a6346;
+  var a6347;
+  var a6348;
+  var a6349;
+  var a6350;
+  var a6351;
+  var a6352;
+  var a6353;
+  var a6354;
+  var a6355;
+  var a6356;
+  var a6357;
+  var a6358;
+  var a6359;
+  var a6360;
+  var a6361;
+  var a6362;
+  var a6363;
+  var a6364;
+  var a6365;
+  var a6366;
+  var a6367;
+  var a6368;
+  var a6369;
+  var a6370;
+  var a6371;
+  var a6372;
+  var a6373;
+  var a6374;
+  var a6375;
+  var a6376;
+  var a6377;
+  var a6378;
+  var a6379;
+  var a6380;
+  var a6381;
+  var a6382;
+  var a6383;
+  var a6384;
+  var a6385;
+  var a6386;
+  var a6387;
+  var a6388;
+  var a6389;
+  var a6390;
+  var a6391;
+  var a6392;
+  var a6393;
+  var a6394;
+  var a6395;
+  var a6396;
+  var a6397;
+  var a6398;
+  var a6399;
+  var a6400;
+  var a6401;
+  var a6402;
+  var a6403;
+  var a6404;
+  var a6405;
+  var a6406;
+  var a6407;
+  var a6408;
+  var a6409;
+  var a6410;
+  var a6411;
+  var a6412;
+  var a6413;
+  var a6414;
+  var a6415;
+  var a6416;
+  var a6417;
+  var a6418;
+  var a6419;
+  var a6420;
+  var a6421;
+  var a6422;
+  var a6423;
+  var a6424;
+  var a6425;
+  var a6426;
+  var a6427;
+  var a6428;
+  var a6429;
+  var a6430;
+  var a6431;
+  var a6432;
+  var a6433;
+  var a6434;
+  var a6435;
+  var a6436;
+  var a6437;
+  var a6438;
+  var a6439;
+  var a6440;
+  var a6441;
+  var a6442;
+  var a6443;
+  var a6444;
+  var a6445;
+  var a6446;
+  var a6447;
+  var a6448;
+  var a6449;
+  var a6450;
+  var a6451;
+  var a6452;
+  var a6453;
+  var a6454;
+  var a6455;
+  var a6456;
+  var a6457;
+  var a6458;
+  var a6459;
+  var a6460;
+  var a6461;
+  var a6462;
+  var a6463;
+  var a6464;
+  var a6465;
+  var a6466;
+  var a6467;
+  var a6468;
+  var a6469;
+  var a6470;
+  var a6471;
+  var a6472;
+  var a6473;
+  var a6474;
+  var a6475;
+  var a6476;
+  var a6477;
+  var a6478;
+  var a6479;
+  var a6480;
+  var a6481;
+  var a6482;
+  var a6483;
+  var a6484;
+  var a6485;
+  var a6486;
+  var a6487;
+  var a6488;
+  var a6489;
+  var a6490;
+  var a6491;
+  var a6492;
+  var a6493;
+  var a6494;
+  var a6495;
+  var a6496;
+  var a6497;
+  var a6498;
+  var a6499;
+  var a6500;
+  var a6501;
+  var a6502;
+  var a6503;
+  var a6504;
+  var a6505;
+  var a6506;
+  var a6507;
+  var a6508;
+  var a6509;
+  var a6510;
+  var a6511;
+  var a6512;
+  var a6513;
+  var a6514;
+  var a6515;
+  var a6516;
+  var a6517;
+  var a6518;
+  var a6519;
+  var a6520;
+  var a6521;
+  var a6522;
+  var a6523;
+  var a6524;
+  var a6525;
+  var a6526;
+  var a6527;
+  var a6528;
+  var a6529;
+  var a6530;
+  var a6531;
+  var a6532;
+  var a6533;
+  var a6534;
+  var a6535;
+  var a6536;
+  var a6537;
+  var a6538;
+  var a6539;
+  var a6540;
+  var a6541;
+  var a6542;
+  var a6543;
+  var a6544;
+  var a6545;
+  var a6546;
+  var a6547;
+  var a6548;
+  var a6549;
+  var a6550;
+  var a6551;
+  var a6552;
+  var a6553;
+  var a6554;
+  var a6555;
+  var a6556;
+  var a6557;
+  var a6558;
+  var a6559;
+  var a6560;
+  var a6561;
+  var a6562;
+  var a6563;
+  var a6564;
+  var a6565;
+  var a6566;
+  var a6567;
+  var a6568;
+  var a6569;
+  var a6570;
+  var a6571;
+  var a6572;
+  var a6573;
+  var a6574;
+  var a6575;
+  var a6576;
+  var a6577;
+  var a6578;
+  var a6579;
+  var a6580;
+  var a6581;
+  var a6582;
+  var a6583;
+  var a6584;
+  var a6585;
+  var a6586;
+  var a6587;
+  var a6588;
+  var a6589;
+  var a6590;
+  var a6591;
+  var a6592;
+  var a6593;
+  var a6594;
+  var a6595;
+  var a6596;
+  var a6597;
+  var a6598;
+  var a6599;
+  var a6600;
+  var a6601;
+  var a6602;
+  var a6603;
+  var a6604;
+  var a6605;
+  var a6606;
+  var a6607;
+  var a6608;
+  var a6609;
+  var a6610;
+  var a6611;
+  var a6612;
+  var a6613;
+  var a6614;
+  var a6615;
+  var a6616;
+  var a6617;
+  var a6618;
+  var a6619;
+  var a6620;
+  var a6621;
+  var a6622;
+  var a6623;
+  var a6624;
+  var a6625;
+  var a6626;
+  var a6627;
+  var a6628;
+  var a6629;
+  var a6630;
+  var a6631;
+  var a6632;
+  var a6633;
+  var a6634;
+  var a6635;
+  var a6636;
+  var a6637;
+  var a6638;
+  var a6639;
+  var a6640;
+  var a6641;
+  var a6642;
+  var a6643;
+  var a6644;
+  var a6645;
+  var a6646;
+  var a6647;
+  var a6648;
+  var a6649;
+  var a6650;
+  var a6651;
+  var a6652;
+  var a6653;
+  var a6654;
+  var a6655;
+  var a6656;
+  var a6657;
+  var a6658;
+  var a6659;
+  var a6660;
+  var a6661;
+  var a6662;
+  var a6663;
+  var a6664;
+  var a6665;
+  var a6666;
+  var a6667;
+  var a6668;
+  var a6669;
+  var a6670;
+  var a6671;
+  var a6672;
+  var a6673;
+  var a6674;
+  var a6675;
+  var a6676;
+  var a6677;
+  var a6678;
+  var a6679;
+  var a6680;
+  var a6681;
+  var a6682;
+  var a6683;
+  var a6684;
+  var a6685;
+  var a6686;
+  var a6687;
+  var a6688;
+  var a6689;
+  var a6690;
+  var a6691;
+  var a6692;
+  var a6693;
+  var a6694;
+  var a6695;
+  var a6696;
+  var a6697;
+  var a6698;
+  var a6699;
+  var a6700;
+  var a6701;
+  var a6702;
+  var a6703;
+  var a6704;
+  var a6705;
+  var a6706;
+  var a6707;
+  var a6708;
+  var a6709;
+  var a6710;
+  var a6711;
+  var a6712;
+  var a6713;
+  var a6714;
+  var a6715;
+  var a6716;
+  var a6717;
+  var a6718;
+  var a6719;
+  var a6720;
+  var a6721;
+  var a6722;
+  var a6723;
+  var a6724;
+  var a6725;
+  var a6726;
+  var a6727;
+  var a6728;
+  var a6729;
+  var a6730;
+  var a6731;
+  var a6732;
+  var a6733;
+  var a6734;
+  var a6735;
+  var a6736;
+  var a6737;
+  var a6738;
+  var a6739;
+  var a6740;
+  var a6741;
+  var a6742;
+  var a6743;
+  var a6744;
+  var a6745;
+  var a6746;
+  var a6747;
+  var a6748;
+  var a6749;
+  var a6750;
+  var a6751;
+  var a6752;
+  var a6753;
+  var a6754;
+  var a6755;
+  var a6756;
+  var a6757;
+  var a6758;
+  var a6759;
+  var a6760;
+  var a6761;
+  var a6762;
+  var a6763;
+  var a6764;
+  var a6765;
+  var a6766;
+  var a6767;
+  var a6768;
+  var a6769;
+  var a6770;
+  var a6771;
+  var a6772;
+  var a6773;
+  var a6774;
+  var a6775;
+  var a6776;
+  var a6777;
+  var a6778;
+  var a6779;
+  var a6780;
+  var a6781;
+  var a6782;
+  var a6783;
+  var a6784;
+  var a6785;
+  var a6786;
+  var a6787;
+  var a6788;
+  var a6789;
+  var a6790;
+  var a6791;
+  var a6792;
+  var a6793;
+  var a6794;
+  var a6795;
+  var a6796;
+  var a6797;
+  var a6798;
+  var a6799;
+  var a6800;
+  var a6801;
+  var a6802;
+  var a6803;
+  var a6804;
+  var a6805;
+  var a6806;
+  var a6807;
+  var a6808;
+  var a6809;
+  var a6810;
+  var a6811;
+  var a6812;
+  var a6813;
+  var a6814;
+  var a6815;
+  var a6816;
+  var a6817;
+  var a6818;
+  var a6819;
+  var a6820;
+  var a6821;
+  var a6822;
+  var a6823;
+  var a6824;
+  var a6825;
+  var a6826;
+  var a6827;
+  var a6828;
+  var a6829;
+  var a6830;
+  var a6831;
+  var a6832;
+  var a6833;
+  var a6834;
+  var a6835;
+  var a6836;
+  var a6837;
+  var a6838;
+  var a6839;
+  var a6840;
+  var a6841;
+  var a6842;
+  var a6843;
+  var a6844;
+  var a6845;
+  var a6846;
+  var a6847;
+  var a6848;
+  var a6849;
+  var a6850;
+  var a6851;
+  var a6852;
+  var a6853;
+  var a6854;
+  var a6855;
+  var a6856;
+  var a6857;
+  var a6858;
+  var a6859;
+  var a6860;
+  var a6861;
+  var a6862;
+  var a6863;
+  var a6864;
+  var a6865;
+  var a6866;
+  var a6867;
+  var a6868;
+  var a6869;
+  var a6870;
+  var a6871;
+  var a6872;
+  var a6873;
+  var a6874;
+  var a6875;
+  var a6876;
+  var a6877;
+  var a6878;
+  var a6879;
+  var a6880;
+  var a6881;
+  var a6882;
+  var a6883;
+  var a6884;
+  var a6885;
+  var a6886;
+  var a6887;
+  var a6888;
+  var a6889;
+  var a6890;
+  var a6891;
+  var a6892;
+  var a6893;
+  var a6894;
+  var a6895;
+  var a6896;
+  var a6897;
+  var a6898;
+  var a6899;
+  var a6900;
+  var a6901;
+  var a6902;
+  var a6903;
+  var a6904;
+  var a6905;
+  var a6906;
+  var a6907;
+  var a6908;
+  var a6909;
+  var a6910;
+  var a6911;
+  var a6912;
+  var a6913;
+  var a6914;
+  var a6915;
+  var a6916;
+  var a6917;
+  var a6918;
+  var a6919;
+  var a6920;
+  var a6921;
+  var a6922;
+  var a6923;
+  var a6924;
+  var a6925;
+  var a6926;
+  var a6927;
+  var a6928;
+  var a6929;
+  var a6930;
+  var a6931;
+  var a6932;
+  var a6933;
+  var a6934;
+  var a6935;
+  var a6936;
+  var a6937;
+  var a6938;
+  var a6939;
+  var a6940;
+  var a6941;
+  var a6942;
+  var a6943;
+  var a6944;
+  var a6945;
+  var a6946;
+  var a6947;
+  var a6948;
+  var a6949;
+  var a6950;
+  var a6951;
+  var a6952;
+  var a6953;
+  var a6954;
+  var a6955;
+  var a6956;
+  var a6957;
+  var a6958;
+  var a6959;
+  var a6960;
+  var a6961;
+  var a6962;
+  var a6963;
+  var a6964;
+  var a6965;
+  var a6966;
+  var a6967;
+  var a6968;
+  var a6969;
+  var a6970;
+  var a6971;
+  var a6972;
+  var a6973;
+  var a6974;
+  var a6975;
+  var a6976;
+  var a6977;
+  var a6978;
+  var a6979;
+  var a6980;
+  var a6981;
+  var a6982;
+  var a6983;
+  var a6984;
+  var a6985;
+  var a6986;
+  var a6987;
+  var a6988;
+  var a6989;
+  var a6990;
+  var a6991;
+  var a6992;
+  var a6993;
+  var a6994;
+  var a6995;
+  var a6996;
+  var a6997;
+  var a6998;
+  var a6999;
+  var a7000;
+  var a7001;
+  var a7002;
+  var a7003;
+  var a7004;
+  var a7005;
+  var a7006;
+  var a7007;
+  var a7008;
+  var a7009;
+  var a7010;
+  var a7011;
+  var a7012;
+  var a7013;
+  var a7014;
+  var a7015;
+  var a7016;
+  var a7017;
+  var a7018;
+  var a7019;
+  var a7020;
+  var a7021;
+  var a7022;
+  var a7023;
+  var a7024;
+  var a7025;
+  var a7026;
+  var a7027;
+  var a7028;
+  var a7029;
+  var a7030;
+  var a7031;
+  var a7032;
+  var a7033;
+  var a7034;
+  var a7035;
+  var a7036;
+  var a7037;
+  var a7038;
+  var a7039;
+  var a7040;
+  var a7041;
+  var a7042;
+  var a7043;
+  var a7044;
+  var a7045;
+  var a7046;
+  var a7047;
+  var a7048;
+  var a7049;
+  var a7050;
+  var a7051;
+  var a7052;
+  var a7053;
+  var a7054;
+  var a7055;
+  var a7056;
+  var a7057;
+  var a7058;
+  var a7059;
+  var a7060;
+  var a7061;
+  var a7062;
+  var a7063;
+  var a7064;
+  var a7065;
+  var a7066;
+  var a7067;
+  var a7068;
+  var a7069;
+  var a7070;
+  var a7071;
+  var a7072;
+  var a7073;
+  var a7074;
+  var a7075;
+  var a7076;
+  var a7077;
+  var a7078;
+  var a7079;
+  var a7080;
+  var a7081;
+  var a7082;
+  var a7083;
+  var a7084;
+  var a7085;
+  var a7086;
+  var a7087;
+  var a7088;
+  var a7089;
+  var a7090;
+  var a7091;
+  var a7092;
+  var a7093;
+  var a7094;
+  var a7095;
+  var a7096;
+  var a7097;
+  var a7098;
+  var a7099;
+  var a7100;
+  var a7101;
+  var a7102;
+  var a7103;
+  var a7104;
+  var a7105;
+  var a7106;
+  var a7107;
+  var a7108;
+  var a7109;
+  var a7110;
+  var a7111;
+  var a7112;
+  var a7113;
+  var a7114;
+  var a7115;
+  var a7116;
+  var a7117;
+  var a7118;
+  var a7119;
+  var a7120;
+  var a7121;
+  var a7122;
+  var a7123;
+  var a7124;
+  var a7125;
+  var a7126;
+  var a7127;
+  var a7128;
+  var a7129;
+  var a7130;
+  var a7131;
+  var a7132;
+  var a7133;
+  var a7134;
+  var a7135;
+  var a7136;
+  var a7137;
+  var a7138;
+  var a7139;
+  var a7140;
+  var a7141;
+  var a7142;
+  var a7143;
+  var a7144;
+  var a7145;
+  var a7146;
+  var a7147;
+  var a7148;
+  var a7149;
+  var a7150;
+  var a7151;
+  var a7152;
+  var a7153;
+  var a7154;
+  var a7155;
+  var a7156;
+  var a7157;
+  var a7158;
+  var a7159;
+  var a7160;
+  var a7161;
+  var a7162;
+  var a7163;
+  var a7164;
+  var a7165;
+  var a7166;
+  var a7167;
+  var a7168;
+  var a7169;
+  var a7170;
+  var a7171;
+  var a7172;
+  var a7173;
+  var a7174;
+  var a7175;
+  var a7176;
+  var a7177;
+  var a7178;
+  var a7179;
+  var a7180;
+  var a7181;
+  var a7182;
+  var a7183;
+  var a7184;
+  var a7185;
+  var a7186;
+  var a7187;
+  var a7188;
+  var a7189;
+  var a7190;
+  var a7191;
+  var a7192;
+  var a7193;
+  var a7194;
+  var a7195;
+  var a7196;
+  var a7197;
+  var a7198;
+  var a7199;
+  var a7200;
+  var a7201;
+  var a7202;
+  var a7203;
+  var a7204;
+  var a7205;
+  var a7206;
+  var a7207;
+  var a7208;
+  var a7209;
+  var a7210;
+  var a7211;
+  var a7212;
+  var a7213;
+  var a7214;
+  var a7215;
+  var a7216;
+  var a7217;
+  var a7218;
+  var a7219;
+  var a7220;
+  var a7221;
+  var a7222;
+  var a7223;
+  var a7224;
+  var a7225;
+  var a7226;
+  var a7227;
+  var a7228;
+  var a7229;
+  var a7230;
+  var a7231;
+  var a7232;
+  var a7233;
+  var a7234;
+  var a7235;
+  var a7236;
+  var a7237;
+  var a7238;
+  var a7239;
+  var a7240;
+  var a7241;
+  var a7242;
+  var a7243;
+  var a7244;
+  var a7245;
+  var a7246;
+  var a7247;
+  var a7248;
+  var a7249;
+  var a7250;
+  var a7251;
+  var a7252;
+  var a7253;
+  var a7254;
+  var a7255;
+  var a7256;
+  var a7257;
+  var a7258;
+  var a7259;
+  var a7260;
+  var a7261;
+  var a7262;
+  var a7263;
+  var a7264;
+  var a7265;
+  var a7266;
+  var a7267;
+  var a7268;
+  var a7269;
+  var a7270;
+  var a7271;
+  var a7272;
+  var a7273;
+  var a7274;
+  var a7275;
+  var a7276;
+  var a7277;
+  var a7278;
+  var a7279;
+  var a7280;
+  var a7281;
+  var a7282;
+  var a7283;
+  var a7284;
+  var a7285;
+  var a7286;
+  var a7287;
+  var a7288;
+  var a7289;
+  var a7290;
+  var a7291;
+  var a7292;
+  var a7293;
+  var a7294;
+  var a7295;
+  var a7296;
+  var a7297;
+  var a7298;
+  var a7299;
+  var a7300;
+  var a7301;
+  var a7302;
+  var a7303;
+  var a7304;
+  var a7305;
+  var a7306;
+  var a7307;
+  var a7308;
+  var a7309;
+  var a7310;
+  var a7311;
+  var a7312;
+  var a7313;
+  var a7314;
+  var a7315;
+  var a7316;
+  var a7317;
+  var a7318;
+  var a7319;
+  var a7320;
+  var a7321;
+  var a7322;
+  var a7323;
+  var a7324;
+  var a7325;
+  var a7326;
+  var a7327;
+  var a7328;
+  var a7329;
+  var a7330;
+  var a7331;
+  var a7332;
+  var a7333;
+  var a7334;
+  var a7335;
+  var a7336;
+  var a7337;
+  var a7338;
+  var a7339;
+  var a7340;
+  var a7341;
+  var a7342;
+  var a7343;
+  var a7344;
+  var a7345;
+  var a7346;
+  var a7347;
+  var a7348;
+  var a7349;
+  var a7350;
+  var a7351;
+  var a7352;
+  var a7353;
+  var a7354;
+  var a7355;
+  var a7356;
+  var a7357;
+  var a7358;
+  var a7359;
+  var a7360;
+  var a7361;
+  var a7362;
+  var a7363;
+  var a7364;
+  var a7365;
+  var a7366;
+  var a7367;
+  var a7368;
+  var a7369;
+  var a7370;
+  var a7371;
+  var a7372;
+  var a7373;
+  var a7374;
+  var a7375;
+  var a7376;
+  var a7377;
+  var a7378;
+  var a7379;
+  var a7380;
+  var a7381;
+  var a7382;
+  var a7383;
+  var a7384;
+  var a7385;
+  var a7386;
+  var a7387;
+  var a7388;
+  var a7389;
+  var a7390;
+  var a7391;
+  var a7392;
+  var a7393;
+  var a7394;
+  var a7395;
+  var a7396;
+  var a7397;
+  var a7398;
+  var a7399;
+  var a7400;
+  var a7401;
+  var a7402;
+  var a7403;
+  var a7404;
+  var a7405;
+  var a7406;
+  var a7407;
+  var a7408;
+  var a7409;
+  var a7410;
+  var a7411;
+  var a7412;
+  var a7413;
+  var a7414;
+  var a7415;
+  var a7416;
+  var a7417;
+  var a7418;
+  var a7419;
+  var a7420;
+  var a7421;
+  var a7422;
+  var a7423;
+  var a7424;
+  var a7425;
+  var a7426;
+  var a7427;
+  var a7428;
+  var a7429;
+  var a7430;
+  var a7431;
+  var a7432;
+  var a7433;
+  var a7434;
+  var a7435;
+  var a7436;
+  var a7437;
+  var a7438;
+  var a7439;
+  var a7440;
+  var a7441;
+  var a7442;
+  var a7443;
+  var a7444;
+  var a7445;
+  var a7446;
+  var a7447;
+  var a7448;
+  var a7449;
+  var a7450;
+  var a7451;
+  var a7452;
+  var a7453;
+  var a7454;
+  var a7455;
+  var a7456;
+  var a7457;
+  var a7458;
+  var a7459;
+  var a7460;
+  var a7461;
+  var a7462;
+  var a7463;
+  var a7464;
+  var a7465;
+  var a7466;
+  var a7467;
+  var a7468;
+  var a7469;
+  var a7470;
+  var a7471;
+  var a7472;
+  var a7473;
+  var a7474;
+  var a7475;
+  var a7476;
+  var a7477;
+  var a7478;
+  var a7479;
+  var a7480;
+  var a7481;
+  var a7482;
+  var a7483;
+  var a7484;
+  var a7485;
+  var a7486;
+  var a7487;
+  var a7488;
+  var a7489;
+  var a7490;
+  var a7491;
+  var a7492;
+  var a7493;
+  var a7494;
+  var a7495;
+  var a7496;
+  var a7497;
+  var a7498;
+  var a7499;
+  var a7500;
+  var a7501;
+  var a7502;
+  var a7503;
+  var a7504;
+  var a7505;
+  var a7506;
+  var a7507;
+  var a7508;
+  var a7509;
+  var a7510;
+  var a7511;
+  var a7512;
+  var a7513;
+  var a7514;
+  var a7515;
+  var a7516;
+  var a7517;
+  var a7518;
+  var a7519;
+  var a7520;
+  var a7521;
+  var a7522;
+  var a7523;
+  var a7524;
+  var a7525;
+  var a7526;
+  var a7527;
+  var a7528;
+  var a7529;
+  var a7530;
+  var a7531;
+  var a7532;
+  var a7533;
+  var a7534;
+  var a7535;
+  var a7536;
+  var a7537;
+  var a7538;
+  var a7539;
+  var a7540;
+  var a7541;
+  var a7542;
+  var a7543;
+  var a7544;
+  var a7545;
+  var a7546;
+  var a7547;
+  var a7548;
+  var a7549;
+  var a7550;
+  var a7551;
+  var a7552;
+  var a7553;
+  var a7554;
+  var a7555;
+  var a7556;
+  var a7557;
+  var a7558;
+  var a7559;
+  var a7560;
+  var a7561;
+  var a7562;
+  var a7563;
+  var a7564;
+  var a7565;
+  var a7566;
+  var a7567;
+  var a7568;
+  var a7569;
+  var a7570;
+  var a7571;
+  var a7572;
+  var a7573;
+  var a7574;
+  var a7575;
+  var a7576;
+  var a7577;
+  var a7578;
+  var a7579;
+  var a7580;
+  var a7581;
+  var a7582;
+  var a7583;
+  var a7584;
+  var a7585;
+  var a7586;
+  var a7587;
+  var a7588;
+  var a7589;
+  var a7590;
+  var a7591;
+  var a7592;
+  var a7593;
+  var a7594;
+  var a7595;
+  var a7596;
+  var a7597;
+  var a7598;
+  var a7599;
+  var a7600;
+  var a7601;
+  var a7602;
+  var a7603;
+  var a7604;
+  var a7605;
+  var a7606;
+  var a7607;
+  var a7608;
+  var a7609;
+  var a7610;
+  var a7611;
+  var a7612;
+  var a7613;
+  var a7614;
+  var a7615;
+  var a7616;
+  var a7617;
+  var a7618;
+  var a7619;
+  var a7620;
+  var a7621;
+  var a7622;
+  var a7623;
+  var a7624;
+  var a7625;
+  var a7626;
+  var a7627;
+  var a7628;
+  var a7629;
+  var a7630;
+  var a7631;
+  var a7632;
+  var a7633;
+  var a7634;
+  var a7635;
+  var a7636;
+  var a7637;
+  var a7638;
+  var a7639;
+  var a7640;
+  var a7641;
+  var a7642;
+  var a7643;
+  var a7644;
+  var a7645;
+  var a7646;
+  var a7647;
+  var a7648;
+  var a7649;
+  var a7650;
+  var a7651;
+  var a7652;
+  var a7653;
+  var a7654;
+  var a7655;
+  var a7656;
+  var a7657;
+  var a7658;
+  var a7659;
+  var a7660;
+  var a7661;
+  var a7662;
+  var a7663;
+  var a7664;
+  var a7665;
+  var a7666;
+  var a7667;
+  var a7668;
+  var a7669;
+  var a7670;
+  var a7671;
+  var a7672;
+  var a7673;
+  var a7674;
+  var a7675;
+  var a7676;
+  var a7677;
+  var a7678;
+  var a7679;
+  var a7680;
+  var a7681;
+  var a7682;
+  var a7683;
+  var a7684;
+  var a7685;
+  var a7686;
+  var a7687;
+  var a7688;
+  var a7689;
+  var a7690;
+  var a7691;
+  var a7692;
+  var a7693;
+  var a7694;
+  var a7695;
+  var a7696;
+  var a7697;
+  var a7698;
+  var a7699;
+  var a7700;
+  var a7701;
+  var a7702;
+  var a7703;
+  var a7704;
+  var a7705;
+  var a7706;
+  var a7707;
+  var a7708;
+  var a7709;
+  var a7710;
+  var a7711;
+  var a7712;
+  var a7713;
+  var a7714;
+  var a7715;
+  var a7716;
+  var a7717;
+  var a7718;
+  var a7719;
+  var a7720;
+  var a7721;
+  var a7722;
+  var a7723;
+  var a7724;
+  var a7725;
+  var a7726;
+  var a7727;
+  var a7728;
+  var a7729;
+  var a7730;
+  var a7731;
+  var a7732;
+  var a7733;
+  var a7734;
+  var a7735;
+  var a7736;
+  var a7737;
+  var a7738;
+  var a7739;
+  var a7740;
+  var a7741;
+  var a7742;
+  var a7743;
+  var a7744;
+  var a7745;
+  var a7746;
+  var a7747;
+  var a7748;
+  var a7749;
+  var a7750;
+  var a7751;
+  var a7752;
+  var a7753;
+  var a7754;
+  var a7755;
+  var a7756;
+  var a7757;
+  var a7758;
+  var a7759;
+  var a7760;
+  var a7761;
+  var a7762;
+  var a7763;
+  var a7764;
+  var a7765;
+  var a7766;
+  var a7767;
+  var a7768;
+  var a7769;
+  var a7770;
+  var a7771;
+  var a7772;
+  var a7773;
+  var a7774;
+  var a7775;
+  var a7776;
+  var a7777;
+  var a7778;
+  var a7779;
+  var a7780;
+  var a7781;
+  var a7782;
+  var a7783;
+  var a7784;
+  var a7785;
+  var a7786;
+  var a7787;
+  var a7788;
+  var a7789;
+  var a7790;
+  var a7791;
+  var a7792;
+  var a7793;
+  var a7794;
+  var a7795;
+  var a7796;
+  var a7797;
+  var a7798;
+  var a7799;
+  var a7800;
+  var a7801;
+  var a7802;
+  var a7803;
+  var a7804;
+  var a7805;
+  var a7806;
+  var a7807;
+  var a7808;
+  var a7809;
+  var a7810;
+  var a7811;
+  var a7812;
+  var a7813;
+  var a7814;
+  var a7815;
+  var a7816;
+  var a7817;
+  var a7818;
+  var a7819;
+  var a7820;
+  var a7821;
+  var a7822;
+  var a7823;
+  var a7824;
+  var a7825;
+  var a7826;
+  var a7827;
+  var a7828;
+  var a7829;
+  var a7830;
+  var a7831;
+  var a7832;
+  var a7833;
+  var a7834;
+  var a7835;
+  var a7836;
+  var a7837;
+  var a7838;
+  var a7839;
+  var a7840;
+  var a7841;
+  var a7842;
+  var a7843;
+  var a7844;
+  var a7845;
+  var a7846;
+  var a7847;
+  var a7848;
+  var a7849;
+  var a7850;
+  var a7851;
+  var a7852;
+  var a7853;
+  var a7854;
+  var a7855;
+  var a7856;
+  var a7857;
+  var a7858;
+  var a7859;
+  var a7860;
+  var a7861;
+  var a7862;
+  var a7863;
+  var a7864;
+  var a7865;
+  var a7866;
+  var a7867;
+  var a7868;
+  var a7869;
+  var a7870;
+  var a7871;
+  var a7872;
+  var a7873;
+  var a7874;
+  var a7875;
+  var a7876;
+  var a7877;
+  var a7878;
+  var a7879;
+  var a7880;
+  var a7881;
+  var a7882;
+  var a7883;
+  var a7884;
+  var a7885;
+  var a7886;
+  var a7887;
+  var a7888;
+  var a7889;
+  var a7890;
+  var a7891;
+  var a7892;
+  var a7893;
+  var a7894;
+  var a7895;
+  var a7896;
+  var a7897;
+  var a7898;
+  var a7899;
+  var a7900;
+  var a7901;
+  var a7902;
+  var a7903;
+  var a7904;
+  var a7905;
+  var a7906;
+  var a7907;
+  var a7908;
+  var a7909;
+  var a7910;
+  var a7911;
+  var a7912;
+  var a7913;
+  var a7914;
+  var a7915;
+  var a7916;
+  var a7917;
+  var a7918;
+  var a7919;
+  var a7920;
+  var a7921;
+  var a7922;
+  var a7923;
+  var a7924;
+  var a7925;
+  var a7926;
+  var a7927;
+  var a7928;
+  var a7929;
+  var a7930;
+  var a7931;
+  var a7932;
+  var a7933;
+  var a7934;
+  var a7935;
+  var a7936;
+  var a7937;
+  var a7938;
+  var a7939;
+  var a7940;
+  var a7941;
+  var a7942;
+  var a7943;
+  var a7944;
+  var a7945;
+  var a7946;
+  var a7947;
+  var a7948;
+  var a7949;
+  var a7950;
+  var a7951;
+  var a7952;
+  var a7953;
+  var a7954;
+  var a7955;
+  var a7956;
+  var a7957;
+  var a7958;
+  var a7959;
+  var a7960;
+  var a7961;
+  var a7962;
+  var a7963;
+  var a7964;
+  var a7965;
+  var a7966;
+  var a7967;
+  var a7968;
+  var a7969;
+  var a7970;
+  var a7971;
+  var a7972;
+  var a7973;
+  var a7974;
+  var a7975;
+  var a7976;
+  var a7977;
+  var a7978;
+  var a7979;
+  var a7980;
+  var a7981;
+  var a7982;
+  var a7983;
+  var a7984;
+  var a7985;
+  var a7986;
+  var a7987;
+  var a7988;
+  var a7989;
+  var a7990;
+  var a7991;
+  var a7992;
+  var a7993;
+  var a7994;
+  var a7995;
+  var a7996;
+  var a7997;
+  var a7998;
+  var a7999;
+  var a8000;
+  var a8001;
+  var a8002;
+  var a8003;
+  var a8004;
+  var a8005;
+  var a8006;
+  var a8007;
+  var a8008;
+  var a8009;
+  var a8010;
+  var a8011;
+  var a8012;
+  var a8013;
+  var a8014;
+  var a8015;
+  var a8016;
+  var a8017;
+  var a8018;
+  var a8019;
+  var a8020;
+  var a8021;
+  var a8022;
+  var a8023;
+  var a8024;
+  var a8025;
+  var a8026;
+  var a8027;
+  var a8028;
+  var a8029;
+  var a8030;
+  var a8031;
+  var a8032;
+  var a8033;
+  var a8034;
+  var a8035;
+  var a8036;
+  var a8037;
+  var a8038;
+  var a8039;
+  var a8040;
+  var a8041;
+  var a8042;
+  var a8043;
+  var a8044;
+  var a8045;
+  var a8046;
+  var a8047;
+  var a8048;
+  var a8049;
+  var a8050;
+  var a8051;
+  var a8052;
+  var a8053;
+  var a8054;
+  var a8055;
+  var a8056;
+  var a8057;
+  var a8058;
+  var a8059;
+  var a8060;
+  var a8061;
+  var a8062;
+  var a8063;
+  var a8064;
+  var a8065;
+  var a8066;
+  var a8067;
+  var a8068;
+  var a8069;
+  var a8070;
+  var a8071;
+  var a8072;
+  var a8073;
+  var a8074;
+  var a8075;
+  var a8076;
+  var a8077;
+  var a8078;
+  var a8079;
+  var a8080;
+  var a8081;
+  var a8082;
+  var a8083;
+  var a8084;
+  var a8085;
+  var a8086;
+  var a8087;
+  var a8088;
+  var a8089;
+  var a8090;
+  var a8091;
+  var a8092;
+  var a8093;
+  var a8094;
+  var a8095;
+  var a8096;
+  var a8097;
+  var a8098;
+  var a8099;
+  var a8100;
+  var a8101;
+  var a8102;
+  var a8103;
+  var a8104;
+  var a8105;
+  var a8106;
+  var a8107;
+  var a8108;
+  var a8109;
+  var a8110;
+  var a8111;
+  var a8112;
+  var a8113;
+  var a8114;
+  var a8115;
+  var a8116;
+  var a8117;
+  var a8118;
+  var a8119;
+  var a8120;
+  var a8121;
+  var a8122;
+  var a8123;
+  var a8124;
+  var a8125;
+  var a8126;
+  var a8127;
+  var a8128;
+  var a8129;
+  var a8130;
+  var a8131;
+  var a8132;
+  var a8133;
+  var a8134;
+  var a8135;
+  var a8136;
+  var a8137;
+  var a8138;
+  var a8139;
+  var a8140;
+  var a8141;
+  var a8142;
+  var a8143;
+  var a8144;
+  var a8145;
+  var a8146;
+  var a8147;
+  var a8148;
+  var a8149;
+  var a8150;
+  var a8151;
+  var a8152;
+  var a8153;
+  var a8154;
+  var a8155;
+  var a8156;
+  var a8157;
+  var a8158;
+  var a8159;
+  var a8160;
+  var a8161;
+  var a8162;
+  var a8163;
+  var a8164;
+  var a8165;
+  var a8166;
+  var a8167;
+  var a8168;
+  var a8169;
+  var a8170;
+  var a8171;
+  var a8172;
+  var a8173;
+  var a8174;
+  var a8175;
+  var a8176;
+  var a8177;
+  var a8178;
+  var a8179;
+  var a8180;
+  var a8181;
+  var a8182;
+  var a8183;
+  var a8184;
+  var a8185;
+  var a8186;
+  var a8187;
+  var a8188;
+  var a8189;
+  var a8190;
+  var a8191;
+  var a8192;
+  var a8193;
+  var a8194;
+  var a8195;
+  var a8196;
+  var a8197;
+  var a8198;
+  var a8199;
+  var a8200;
+  var a8201;
+  var a8202;
+  var a8203;
+  var a8204;
+  var a8205;
+  var a8206;
+  var a8207;
+  var a8208;
+  var a8209;
+  var a8210;
+  var a8211;
+  var a8212;
+  var a8213;
+  var a8214;
+  var a8215;
+  var a8216;
+  var a8217;
+  var a8218;
+  var a8219;
+  var a8220;
+  var a8221;
+  var a8222;
+  var a8223;
+  var a8224;
+  var a8225;
+  var a8226;
+  var a8227;
+  var a8228;
+  var a8229;
+  var a8230;
+  var a8231;
+  var a8232;
+  var a8233;
+  var a8234;
+  var a8235;
+  var a8236;
+  var a8237;
+  var a8238;
+  var a8239;
+  var a8240;
+  var a8241;
+  var a8242;
+  var a8243;
+  var a8244;
+  var a8245;
+  var a8246;
+  var a8247;
+  var a8248;
+  var a8249;
+  var a8250;
+  var a8251;
+  var a8252;
+  var a8253;
+  var a8254;
+  var a8255;
+  var a8256;
+  var a8257;
+  var a8258;
+  var a8259;
+  var a8260;
+  var a8261;
+  var a8262;
+  var a8263;
+  var a8264;
+  var a8265;
+  var a8266;
+  var a8267;
+  var a8268;
+  var a8269;
+  var a8270;
+  var a8271;
+  var a8272;
+  var a8273;
+  var a8274;
+  var a8275;
+  var a8276;
+  var a8277;
+  var a8278;
+  var a8279;
+  var a8280;
+  var a8281;
+  var a8282;
+  var a8283;
+  var a8284;
+  var a8285;
+  var a8286;
+  var a8287;
+  var a8288;
+  var a8289;
+  var a8290;
+  var a8291;
+  var a8292;
+  var a8293;
+  var a8294;
+  var a8295;
+  var a8296;
+  var a8297;
+  var a8298;
+  var a8299;
+  var a8300;
+  var a8301;
+  var a8302;
+  var a8303;
+  var a8304;
+  var a8305;
+  var a8306;
+  var a8307;
+  var a8308;
+  var a8309;
+  var a8310;
+  var a8311;
+  var a8312;
+  var a8313;
+  var a8314;
+  var a8315;
+  var a8316;
+  var a8317;
+  var a8318;
+  var a8319;
+  var a8320;
+  var a8321;
+  var a8322;
+  var a8323;
+  var a8324;
+  var a8325;
+  var a8326;
+  var a8327;
+  var a8328;
+  var a8329;
+  var a8330;
+  var a8331;
+  var a8332;
+  var a8333;
+  var a8334;
+  var a8335;
+  var a8336;
+  var a8337;
+  var a8338;
+  var a8339;
+  var a8340;
+  var a8341;
+  var a8342;
+  var a8343;
+  var a8344;
+  var a8345;
+  var a8346;
+  var a8347;
+  var a8348;
+  var a8349;
+  var a8350;
+  var a8351;
+  var a8352;
+  var a8353;
+  var a8354;
+  var a8355;
+  var a8356;
+  var a8357;
+  var a8358;
+  var a8359;
+  var a8360;
+  var a8361;
+  var a8362;
+  var a8363;
+  var a8364;
+  var a8365;
+  var a8366;
+  var a8367;
+  var a8368;
+  var a8369;
+  var a8370;
+  var a8371;
+  var a8372;
+  var a8373;
+  var a8374;
+  var a8375;
+  var a8376;
+  var a8377;
+  var a8378;
+  var a8379;
+  var a8380;
+  var a8381;
+  var a8382;
+  var a8383;
+  var a8384;
+  var a8385;
+  var a8386;
+  var a8387;
+  var a8388;
+  var a8389;
+  var a8390;
+  var a8391;
+  var a8392;
+  var a8393;
+  var a8394;
+  var a8395;
+  var a8396;
+  var a8397;
+  var a8398;
+  var a8399;
+  var a8400;
+  var a8401;
+  var a8402;
+  var a8403;
+  var a8404;
+  var a8405;
+  var a8406;
+  var a8407;
+  var a8408;
+  var a8409;
+  var a8410;
+  var a8411;
+  var a8412;
+  var a8413;
+  var a8414;
+  var a8415;
+  var a8416;
+  var a8417;
+  var a8418;
+  var a8419;
+  var a8420;
+  var a8421;
+  var a8422;
+  var a8423;
+  var a8424;
+  var a8425;
+  var a8426;
+  var a8427;
+  var a8428;
+  var a8429;
+  var a8430;
+  var a8431;
+  var a8432;
+  var a8433;
+  var a8434;
+  var a8435;
+  var a8436;
+  var a8437;
+  var a8438;
+  var a8439;
+  var a8440;
+  var a8441;
+  var a8442;
+  var a8443;
+  var a8444;
+  var a8445;
+  var a8446;
+  var a8447;
+  var a8448;
+  var a8449;
+  var a8450;
+  var a8451;
+  var a8452;
+  var a8453;
+  var a8454;
+  var a8455;
+  var a8456;
+  var a8457;
+  var a8458;
+  var a8459;
+  var a8460;
+  var a8461;
+  var a8462;
+  var a8463;
+  var a8464;
+  var a8465;
+  var a8466;
+  var a8467;
+  var a8468;
+  var a8469;
+  var a8470;
+  var a8471;
+  var a8472;
+  var a8473;
+  var a8474;
+  var a8475;
+  var a8476;
+  var a8477;
+  var a8478;
+  var a8479;
+  var a8480;
+  var a8481;
+  var a8482;
+  var a8483;
+  var a8484;
+  var a8485;
+  var a8486;
+  var a8487;
+  var a8488;
+  var a8489;
+  var a8490;
+  var a8491;
+  var a8492;
+  var a8493;
+  var a8494;
+  var a8495;
+  var a8496;
+  var a8497;
+  var a8498;
+  var a8499;
+  var a8500;
+  var a8501;
+  var a8502;
+  var a8503;
+  var a8504;
+  var a8505;
+  var a8506;
+  var a8507;
+  var a8508;
+  var a8509;
+  var a8510;
+  var a8511;
+  var a8512;
+  var a8513;
+  var a8514;
+  var a8515;
+  var a8516;
+  var a8517;
+  var a8518;
+  var a8519;
+  var a8520;
+  var a8521;
+  var a8522;
+  var a8523;
+  var a8524;
+  var a8525;
+  var a8526;
+  var a8527;
+  var a8528;
+  var a8529;
+  var a8530;
+  var a8531;
+  var a8532;
+  var a8533;
+  var a8534;
+  var a8535;
+  var a8536;
+  var a8537;
+  var a8538;
+  var a8539;
+  var a8540;
+  var a8541;
+  var a8542;
+  var a8543;
+  var a8544;
+  var a8545;
+  var a8546;
+  var a8547;
+  var a8548;
+  var a8549;
+  var a8550;
+  var a8551;
+  var a8552;
+  var a8553;
+  var a8554;
+  var a8555;
+  var a8556;
+  var a8557;
+  var a8558;
+  var a8559;
+  var a8560;
+  var a8561;
+  var a8562;
+  var a8563;
+  var a8564;
+  var a8565;
+  var a8566;
+  var a8567;
+  var a8568;
+  var a8569;
+  var a8570;
+  var a8571;
+  var a8572;
+  var a8573;
+  var a8574;
+  var a8575;
+  var a8576;
+  var a8577;
+  var a8578;
+  var a8579;
+  var a8580;
+  var a8581;
+  var a8582;
+  var a8583;
+  var a8584;
+  var a8585;
+  var a8586;
+  var a8587;
+  var a8588;
+  var a8589;
+  var a8590;
+  var a8591;
+  var a8592;
+  var a8593;
+  var a8594;
+  var a8595;
+  var a8596;
+  var a8597;
+  var a8598;
+  var a8599;
+  var a8600;
+  var a8601;
+  var a8602;
+  var a8603;
+  var a8604;
+  var a8605;
+  var a8606;
+  var a8607;
+  var a8608;
+  var a8609;
+  var a8610;
+  var a8611;
+  var a8612;
+  var a8613;
+  var a8614;
+  var a8615;
+  var a8616;
+  var a8617;
+  var a8618;
+  var a8619;
+  var a8620;
+  var a8621;
+  var a8622;
+  var a8623;
+  var a8624;
+  var a8625;
+  var a8626;
+  var a8627;
+  var a8628;
+  var a8629;
+  var a8630;
+  var a8631;
+  var a8632;
+  var a8633;
+  var a8634;
+  var a8635;
+  var a8636;
+  var a8637;
+  var a8638;
+  var a8639;
+  var a8640;
+  var a8641;
+  var a8642;
+  var a8643;
+  var a8644;
+  var a8645;
+  var a8646;
+  var a8647;
+  var a8648;
+  var a8649;
+  var a8650;
+  var a8651;
+  var a8652;
+  var a8653;
+  var a8654;
+  var a8655;
+  var a8656;
+  var a8657;
+  var a8658;
+  var a8659;
+  var a8660;
+  var a8661;
+  var a8662;
+  var a8663;
+  var a8664;
+  var a8665;
+  var a8666;
+  var a8667;
+  var a8668;
+  var a8669;
+  var a8670;
+  var a8671;
+  var a8672;
+  var a8673;
+  var a8674;
+  var a8675;
+  var a8676;
+  var a8677;
+  var a8678;
+  var a8679;
+  var a8680;
+  var a8681;
+  var a8682;
+  var a8683;
+  var a8684;
+  var a8685;
+  var a8686;
+  var a8687;
+  var a8688;
+  var a8689;
+  var a8690;
+  var a8691;
+  var a8692;
+  var a8693;
+  var a8694;
+  var a8695;
+  var a8696;
+  var a8697;
+  var a8698;
+  var a8699;
+  var a8700;
+  var a8701;
+  var a8702;
+  var a8703;
+  var a8704;
+  var a8705;
+  var a8706;
+  var a8707;
+  var a8708;
+  var a8709;
+  var a8710;
+  var a8711;
+  var a8712;
+  var a8713;
+  var a8714;
+  var a8715;
+  var a8716;
+  var a8717;
+  var a8718;
+  var a8719;
+  var a8720;
+  var a8721;
+  var a8722;
+  var a8723;
+  var a8724;
+  var a8725;
+  var a8726;
+  var a8727;
+  var a8728;
+  var a8729;
+  var a8730;
+  var a8731;
+  var a8732;
+  var a8733;
+  var a8734;
+  var a8735;
+  var a8736;
+  var a8737;
+  var a8738;
+  var a8739;
+  var a8740;
+  var a8741;
+  var a8742;
+  var a8743;
+  var a8744;
+  var a8745;
+  var a8746;
+  var a8747;
+  var a8748;
+  var a8749;
+  var a8750;
+  var a8751;
+  var a8752;
+  var a8753;
+  var a8754;
+  var a8755;
+  var a8756;
+  var a8757;
+  var a8758;
+  var a8759;
+  var a8760;
+  var a8761;
+  var a8762;
+  var a8763;
+  var a8764;
+  var a8765;
+  var a8766;
+  var a8767;
+  var a8768;
+  var a8769;
+  var a8770;
+  var a8771;
+  var a8772;
+  var a8773;
+  var a8774;
+  var a8775;
+  var a8776;
+  var a8777;
+  var a8778;
+  var a8779;
+  var a8780;
+  var a8781;
+  var a8782;
+  var a8783;
+  var a8784;
+  var a8785;
+  var a8786;
+  var a8787;
+  var a8788;
+  var a8789;
+  var a8790;
+  var a8791;
+  var a8792;
+  var a8793;
+  var a8794;
+  var a8795;
+  var a8796;
+  var a8797;
+  var a8798;
+  var a8799;
+  var a8800;
+  var a8801;
+  var a8802;
+  var a8803;
+  var a8804;
+  var a8805;
+  var a8806;
+  var a8807;
+  var a8808;
+  var a8809;
+  var a8810;
+  var a8811;
+  var a8812;
+  var a8813;
+  var a8814;
+  var a8815;
+  var a8816;
+  var a8817;
+  var a8818;
+  var a8819;
+  var a8820;
+  var a8821;
+  var a8822;
+  var a8823;
+  var a8824;
+  var a8825;
+  var a8826;
+  var a8827;
+  var a8828;
+  var a8829;
+  var a8830;
+  var a8831;
+  var a8832;
+  var a8833;
+  var a8834;
+  var a8835;
+  var a8836;
+  var a8837;
+  var a8838;
+  var a8839;
+  var a8840;
+  var a8841;
+  var a8842;
+  var a8843;
+  var a8844;
+  var a8845;
+  var a8846;
+  var a8847;
+  var a8848;
+  var a8849;
+  var a8850;
+  var a8851;
+  var a8852;
+  var a8853;
+  var a8854;
+  var a8855;
+  var a8856;
+  var a8857;
+  var a8858;
+  var a8859;
+  var a8860;
+  var a8861;
+  var a8862;
+  var a8863;
+  var a8864;
+  var a8865;
+  var a8866;
+  var a8867;
+  var a8868;
+  var a8869;
+  var a8870;
+  var a8871;
+  var a8872;
+  var a8873;
+  var a8874;
+  var a8875;
+  var a8876;
+  var a8877;
+  var a8878;
+  var a8879;
+  var a8880;
+  var a8881;
+  var a8882;
+  var a8883;
+  var a8884;
+  var a8885;
+  var a8886;
+  var a8887;
+  var a8888;
+  var a8889;
+  var a8890;
+  var a8891;
+  var a8892;
+  var a8893;
+  var a8894;
+  var a8895;
+  var a8896;
+  var a8897;
+  var a8898;
+  var a8899;
+  var a8900;
+  var a8901;
+  var a8902;
+  var a8903;
+  var a8904;
+  var a8905;
+  var a8906;
+  var a8907;
+  var a8908;
+  var a8909;
+  var a8910;
+  var a8911;
+  var a8912;
+  var a8913;
+  var a8914;
+  var a8915;
+  var a8916;
+  var a8917;
+  var a8918;
+  var a8919;
+  var a8920;
+  var a8921;
+  var a8922;
+  var a8923;
+  var a8924;
+  var a8925;
+  var a8926;
+  var a8927;
+  var a8928;
+  var a8929;
+  var a8930;
+  var a8931;
+  var a8932;
+  var a8933;
+  var a8934;
+  var a8935;
+  var a8936;
+  var a8937;
+  var a8938;
+  var a8939;
+  var a8940;
+  var a8941;
+  var a8942;
+  var a8943;
+  var a8944;
+  var a8945;
+  var a8946;
+  var a8947;
+  var a8948;
+  var a8949;
+  var a8950;
+  var a8951;
+  var a8952;
+  var a8953;
+  var a8954;
+  var a8955;
+  var a8956;
+  var a8957;
+  var a8958;
+  var a8959;
+  var a8960;
+  var a8961;
+  var a8962;
+  var a8963;
+  var a8964;
+  var a8965;
+  var a8966;
+  var a8967;
+  var a8968;
+  var a8969;
+  var a8970;
+  var a8971;
+  var a8972;
+  var a8973;
+  var a8974;
+  var a8975;
+  var a8976;
+  var a8977;
+  var a8978;
+  var a8979;
+  var a8980;
+  var a8981;
+  var a8982;
+  var a8983;
+  var a8984;
+  var a8985;
+  var a8986;
+  var a8987;
+  var a8988;
+  var a8989;
+  var a8990;
+  var a8991;
+  var a8992;
+  var a8993;
+  var a8994;
+  var a8995;
+  var a8996;
+  var a8997;
+  var a8998;
+  var a8999;
+  var a9000;
+  var a9001;
+  var a9002;
+  var a9003;
+  var a9004;
+  var a9005;
+  var a9006;
+  var a9007;
+  var a9008;
+  var a9009;
+  var a9010;
+  var a9011;
+  var a9012;
+  var a9013;
+  var a9014;
+  var a9015;
+  var a9016;
+  var a9017;
+  var a9018;
+  var a9019;
+  var a9020;
+  var a9021;
+  var a9022;
+  var a9023;
+  var a9024;
+  var a9025;
+  var a9026;
+  var a9027;
+  var a9028;
+  var a9029;
+  var a9030;
+  var a9031;
+  var a9032;
+  var a9033;
+  var a9034;
+  var a9035;
+  var a9036;
+  var a9037;
+  var a9038;
+  var a9039;
+  var a9040;
+  var a9041;
+  var a9042;
+  var a9043;
+  var a9044;
+  var a9045;
+  var a9046;
+  var a9047;
+  var a9048;
+  var a9049;
+  var a9050;
+  var a9051;
+  var a9052;
+  var a9053;
+  var a9054;
+  var a9055;
+  var a9056;
+  var a9057;
+  var a9058;
+  var a9059;
+  var a9060;
+  var a9061;
+  var a9062;
+  var a9063;
+  var a9064;
+  var a9065;
+  var a9066;
+  var a9067;
+  var a9068;
+  var a9069;
+  var a9070;
+  var a9071;
+  var a9072;
+  var a9073;
+  var a9074;
+  var a9075;
+  var a9076;
+  var a9077;
+  var a9078;
+  var a9079;
+  var a9080;
+  var a9081;
+  var a9082;
+  var a9083;
+  var a9084;
+  var a9085;
+  var a9086;
+  var a9087;
+  var a9088;
+  var a9089;
+  var a9090;
+  var a9091;
+  var a9092;
+  var a9093;
+  var a9094;
+  var a9095;
+  var a9096;
+  var a9097;
+  var a9098;
+  var a9099;
+  var a9100;
+  var a9101;
+  var a9102;
+  var a9103;
+  var a9104;
+  var a9105;
+  var a9106;
+  var a9107;
+  var a9108;
+  var a9109;
+  var a9110;
+  var a9111;
+  var a9112;
+  var a9113;
+  var a9114;
+  var a9115;
+  var a9116;
+  var a9117;
+  var a9118;
+  var a9119;
+  var a9120;
+  var a9121;
+  var a9122;
+  var a9123;
+  var a9124;
+  var a9125;
+  var a9126;
+  var a9127;
+  var a9128;
+  var a9129;
+  var a9130;
+  var a9131;
+  var a9132;
+  var a9133;
+  var a9134;
+  var a9135;
+  var a9136;
+  var a9137;
+  var a9138;
+  var a9139;
+  var a9140;
+  var a9141;
+  var a9142;
+  var a9143;
+  var a9144;
+  var a9145;
+  var a9146;
+  var a9147;
+  var a9148;
+  var a9149;
+  var a9150;
+  var a9151;
+  var a9152;
+  var a9153;
+  var a9154;
+  var a9155;
+  var a9156;
+  var a9157;
+  var a9158;
+  var a9159;
+  var a9160;
+  var a9161;
+  var a9162;
+  var a9163;
+  var a9164;
+  var a9165;
+  var a9166;
+  var a9167;
+  var a9168;
+  var a9169;
+  var a9170;
+  var a9171;
+  var a9172;
+  var a9173;
+  var a9174;
+  var a9175;
+  var a9176;
+  var a9177;
+  var a9178;
+  var a9179;
+  var a9180;
+  var a9181;
+  var a9182;
+  var a9183;
+  var a9184;
+  var a9185;
+  var a9186;
+  var a9187;
+  var a9188;
+  var a9189;
+  var a9190;
+  var a9191;
+  var a9192;
+  var a9193;
+  var a9194;
+  var a9195;
+  var a9196;
+  var a9197;
+  var a9198;
+  var a9199;
+  var a9200;
+  var a9201;
+  var a9202;
+  var a9203;
+  var a9204;
+  var a9205;
+  var a9206;
+  var a9207;
+  var a9208;
+  var a9209;
+  var a9210;
+  var a9211;
+  var a9212;
+  var a9213;
+  var a9214;
+  var a9215;
+  var a9216;
+  var a9217;
+  var a9218;
+  var a9219;
+  var a9220;
+  var a9221;
+  var a9222;
+  var a9223;
+  var a9224;
+  var a9225;
+  var a9226;
+  var a9227;
+  var a9228;
+  var a9229;
+  var a9230;
+  var a9231;
+  var a9232;
+  var a9233;
+  var a9234;
+  var a9235;
+  var a9236;
+  var a9237;
+  var a9238;
+  var a9239;
+  var a9240;
+  var a9241;
+  var a9242;
+  var a9243;
+  var a9244;
+  var a9245;
+  var a9246;
+  var a9247;
+  var a9248;
+  var a9249;
+  var a9250;
+  var a9251;
+  var a9252;
+  var a9253;
+  var a9254;
+  var a9255;
+  var a9256;
+  var a9257;
+  var a9258;
+  var a9259;
+  var a9260;
+  var a9261;
+  var a9262;
+  var a9263;
+  var a9264;
+  var a9265;
+  var a9266;
+  var a9267;
+  var a9268;
+  var a9269;
+  var a9270;
+  var a9271;
+  var a9272;
+  var a9273;
+  var a9274;
+  var a9275;
+  var a9276;
+  var a9277;
+  var a9278;
+  var a9279;
+  var a9280;
+  var a9281;
+  var a9282;
+  var a9283;
+  var a9284;
+  var a9285;
+  var a9286;
+  var a9287;
+  var a9288;
+  var a9289;
+  var a9290;
+  var a9291;
+  var a9292;
+  var a9293;
+  var a9294;
+  var a9295;
+  var a9296;
+  var a9297;
+  var a9298;
+  var a9299;
+  var a9300;
+  var a9301;
+  var a9302;
+  var a9303;
+  var a9304;
+  var a9305;
+  var a9306;
+  var a9307;
+  var a9308;
+  var a9309;
+  var a9310;
+  var a9311;
+  var a9312;
+  var a9313;
+  var a9314;
+  var a9315;
+  var a9316;
+  var a9317;
+  var a9318;
+  var a9319;
+  var a9320;
+  var a9321;
+  var a9322;
+  var a9323;
+  var a9324;
+  var a9325;
+  var a9326;
+  var a9327;
+  var a9328;
+  var a9329;
+  var a9330;
+  var a9331;
+  var a9332;
+  var a9333;
+  var a9334;
+  var a9335;
+  var a9336;
+  var a9337;
+  var a9338;
+  var a9339;
+  var a9340;
+  var a9341;
+  var a9342;
+  var a9343;
+  var a9344;
+  var a9345;
+  var a9346;
+  var a9347;
+  var a9348;
+  var a9349;
+  var a9350;
+  var a9351;
+  var a9352;
+  var a9353;
+  var a9354;
+  var a9355;
+  var a9356;
+  var a9357;
+  var a9358;
+  var a9359;
+  var a9360;
+  var a9361;
+  var a9362;
+  var a9363;
+  var a9364;
+  var a9365;
+  var a9366;
+  var a9367;
+  var a9368;
+  var a9369;
+  var a9370;
+  var a9371;
+  var a9372;
+  var a9373;
+  var a9374;
+  var a9375;
+  var a9376;
+  var a9377;
+  var a9378;
+  var a9379;
+  var a9380;
+  var a9381;
+  var a9382;
+  var a9383;
+  var a9384;
+  var a9385;
+  var a9386;
+  var a9387;
+  var a9388;
+  var a9389;
+  var a9390;
+  var a9391;
+  var a9392;
+  var a9393;
+  var a9394;
+  var a9395;
+  var a9396;
+  var a9397;
+  var a9398;
+  var a9399;
+  var a9400;
+  var a9401;
+  var a9402;
+  var a9403;
+  var a9404;
+  var a9405;
+  var a9406;
+  var a9407;
+  var a9408;
+  var a9409;
+  var a9410;
+  var a9411;
+  var a9412;
+  var a9413;
+  var a9414;
+  var a9415;
+  var a9416;
+  var a9417;
+  var a9418;
+  var a9419;
+  var a9420;
+  var a9421;
+  var a9422;
+  var a9423;
+  var a9424;
+  var a9425;
+  var a9426;
+  var a9427;
+  var a9428;
+  var a9429;
+  var a9430;
+  var a9431;
+  var a9432;
+  var a9433;
+  var a9434;
+  var a9435;
+  var a9436;
+  var a9437;
+  var a9438;
+  var a9439;
+  var a9440;
+  var a9441;
+  var a9442;
+  var a9443;
+  var a9444;
+  var a9445;
+  var a9446;
+  var a9447;
+  var a9448;
+  var a9449;
+  var a9450;
+  var a9451;
+  var a9452;
+  var a9453;
+  var a9454;
+  var a9455;
+  var a9456;
+  var a9457;
+  var a9458;
+  var a9459;
+  var a9460;
+  var a9461;
+  var a9462;
+  var a9463;
+  var a9464;
+  var a9465;
+  var a9466;
+  var a9467;
+  var a9468;
+  var a9469;
+  var a9470;
+  var a9471;
+  var a9472;
+  var a9473;
+  var a9474;
+  var a9475;
+  var a9476;
+  var a9477;
+  var a9478;
+  var a9479;
+  var a9480;
+  var a9481;
+  var a9482;
+  var a9483;
+  var a9484;
+  var a9485;
+  var a9486;
+  var a9487;
+  var a9488;
+  var a9489;
+  var a9490;
+  var a9491;
+  var a9492;
+  var a9493;
+  var a9494;
+  var a9495;
+  var a9496;
+  var a9497;
+  var a9498;
+  var a9499;
+  var a9500;
+  var a9501;
+  var a9502;
+  var a9503;
+  var a9504;
+  var a9505;
+  var a9506;
+  var a9507;
+  var a9508;
+  var a9509;
+  var a9510;
+  var a9511;
+  var a9512;
+  var a9513;
+  var a9514;
+  var a9515;
+  var a9516;
+  var a9517;
+  var a9518;
+  var a9519;
+  var a9520;
+  var a9521;
+  var a9522;
+  var a9523;
+  var a9524;
+  var a9525;
+  var a9526;
+  var a9527;
+  var a9528;
+  var a9529;
+  var a9530;
+  var a9531;
+  var a9532;
+  var a9533;
+  var a9534;
+  var a9535;
+  var a9536;
+  var a9537;
+  var a9538;
+  var a9539;
+  var a9540;
+  var a9541;
+  var a9542;
+  var a9543;
+  var a9544;
+  var a9545;
+  var a9546;
+  var a9547;
+  var a9548;
+  var a9549;
+  var a9550;
+  var a9551;
+  var a9552;
+  var a9553;
+  var a9554;
+  var a9555;
+  var a9556;
+  var a9557;
+  var a9558;
+  var a9559;
+  var a9560;
+  var a9561;
+  var a9562;
+  var a9563;
+  var a9564;
+  var a9565;
+  var a9566;
+  var a9567;
+  var a9568;
+  var a9569;
+  var a9570;
+  var a9571;
+  var a9572;
+  var a9573;
+  var a9574;
+  var a9575;
+  var a9576;
+  var a9577;
+  var a9578;
+  var a9579;
+  var a9580;
+  var a9581;
+  var a9582;
+  var a9583;
+  var a9584;
+  var a9585;
+  var a9586;
+  var a9587;
+  var a9588;
+  var a9589;
+  var a9590;
+  var a9591;
+  var a9592;
+  var a9593;
+  var a9594;
+  var a9595;
+  var a9596;
+  var a9597;
+  var a9598;
+  var a9599;
+  var a9600;
+  var a9601;
+  var a9602;
+  var a9603;
+  var a9604;
+  var a9605;
+  var a9606;
+  var a9607;
+  var a9608;
+  var a9609;
+  var a9610;
+  var a9611;
+  var a9612;
+  var a9613;
+  var a9614;
+  var a9615;
+  var a9616;
+  var a9617;
+  var a9618;
+  var a9619;
+  var a9620;
+  var a9621;
+  var a9622;
+  var a9623;
+  var a9624;
+  var a9625;
+  var a9626;
+  var a9627;
+  var a9628;
+  var a9629;
+  var a9630;
+  var a9631;
+  var a9632;
+  var a9633;
+  var a9634;
+  var a9635;
+  var a9636;
+  var a9637;
+  var a9638;
+  var a9639;
+  var a9640;
+  var a9641;
+  var a9642;
+  var a9643;
+  var a9644;
+  var a9645;
+  var a9646;
+  var a9647;
+  var a9648;
+  var a9649;
+  var a9650;
+  var a9651;
+  var a9652;
+  var a9653;
+  var a9654;
+  var a9655;
+  var a9656;
+  var a9657;
+  var a9658;
+  var a9659;
+  var a9660;
+  var a9661;
+  var a9662;
+  var a9663;
+  var a9664;
+  var a9665;
+  var a9666;
+  var a9667;
+  var a9668;
+  var a9669;
+  var a9670;
+  var a9671;
+  var a9672;
+  var a9673;
+  var a9674;
+  var a9675;
+  var a9676;
+  var a9677;
+  var a9678;
+  var a9679;
+  var a9680;
+  var a9681;
+  var a9682;
+  var a9683;
+  var a9684;
+  var a9685;
+  var a9686;
+  var a9687;
+  var a9688;
+  var a9689;
+  var a9690;
+  var a9691;
+  var a9692;
+  var a9693;
+  var a9694;
+  var a9695;
+  var a9696;
+  var a9697;
+  var a9698;
+  var a9699;
+  var a9700;
+  var a9701;
+  var a9702;
+  var a9703;
+  var a9704;
+  var a9705;
+  var a9706;
+  var a9707;
+  var a9708;
+  var a9709;
+  var a9710;
+  var a9711;
+  var a9712;
+  var a9713;
+  var a9714;
+  var a9715;
+  var a9716;
+  var a9717;
+  var a9718;
+  var a9719;
+  var a9720;
+  var a9721;
+  var a9722;
+  var a9723;
+  var a9724;
+  var a9725;
+  var a9726;
+  var a9727;
+  var a9728;
+  var a9729;
+  var a9730;
+  var a9731;
+  var a9732;
+  var a9733;
+  var a9734;
+  var a9735;
+  var a9736;
+  var a9737;
+  var a9738;
+  var a9739;
+  var a9740;
+  var a9741;
+  var a9742;
+  var a9743;
+  var a9744;
+  var a9745;
+  var a9746;
+  var a9747;
+  var a9748;
+  var a9749;
+  var a9750;
+  var a9751;
+  var a9752;
+  var a9753;
+  var a9754;
+  var a9755;
+  var a9756;
+  var a9757;
+  var a9758;
+  var a9759;
+  var a9760;
+  var a9761;
+  var a9762;
+  var a9763;
+  var a9764;
+  var a9765;
+  var a9766;
+  var a9767;
+  var a9768;
+  var a9769;
+  var a9770;
+  var a9771;
+  var a9772;
+  var a9773;
+  var a9774;
+  var a9775;
+  var a9776;
+  var a9777;
+  var a9778;
+  var a9779;
+  var a9780;
+  var a9781;
+  var a9782;
+  var a9783;
+  var a9784;
+  var a9785;
+  var a9786;
+  var a9787;
+  var a9788;
+  var a9789;
+  var a9790;
+  var a9791;
+  var a9792;
+  var a9793;
+  var a9794;
+  var a9795;
+  var a9796;
+  var a9797;
+  var a9798;
+  var a9799;
+  var a9800;
+  var a9801;
+  var a9802;
+  var a9803;
+  var a9804;
+  var a9805;
+  var a9806;
+  var a9807;
+  var a9808;
+  var a9809;
+  var a9810;
+  var a9811;
+  var a9812;
+  var a9813;
+  var a9814;
+  var a9815;
+  var a9816;
+  var a9817;
+  var a9818;
+  var a9819;
+  var a9820;
+  var a9821;
+  var a9822;
+  var a9823;
+  var a9824;
+  var a9825;
+  var a9826;
+  var a9827;
+  var a9828;
+  var a9829;
+  var a9830;
+  var a9831;
+  var a9832;
+  var a9833;
+  var a9834;
+  var a9835;
+  var a9836;
+  var a9837;
+  var a9838;
+  var a9839;
+  var a9840;
+  var a9841;
+  var a9842;
+  var a9843;
+  var a9844;
+  var a9845;
+  var a9846;
+  var a9847;
+  var a9848;
+  var a9849;
+  var a9850;
+  var a9851;
+  var a9852;
+  var a9853;
+  var a9854;
+  var a9855;
+  var a9856;
+  var a9857;
+  var a9858;
+  var a9859;
+  var a9860;
+  var a9861;
+  var a9862;
+  var a9863;
+  var a9864;
+  var a9865;
+  var a9866;
+  var a9867;
+  var a9868;
+  var a9869;
+  var a9870;
+  var a9871;
+  var a9872;
+  var a9873;
+  var a9874;
+  var a9875;
+  var a9876;
+  var a9877;
+  var a9878;
+  var a9879;
+  var a9880;
+  var a9881;
+  var a9882;
+  var a9883;
+  var a9884;
+  var a9885;
+  var a9886;
+  var a9887;
+  var a9888;
+  var a9889;
+  var a9890;
+  var a9891;
+  var a9892;
+  var a9893;
+  var a9894;
+  var a9895;
+  var a9896;
+  var a9897;
+  var a9898;
+  var a9899;
+  var a9900;
+  var a9901;
+  var a9902;
+  var a9903;
+  var a9904;
+  var a9905;
+  var a9906;
+  var a9907;
+  var a9908;
+  var a9909;
+  var a9910;
+  var a9911;
+  var a9912;
+  var a9913;
+  var a9914;
+  var a9915;
+  var a9916;
+  var a9917;
+  var a9918;
+  var a9919;
+  var a9920;
+  var a9921;
+  var a9922;
+  var a9923;
+  var a9924;
+  var a9925;
+  var a9926;
+  var a9927;
+  var a9928;
+  var a9929;
+  var a9930;
+  var a9931;
+  var a9932;
+  var a9933;
+  var a9934;
+  var a9935;
+  var a9936;
+  var a9937;
+  var a9938;
+  var a9939;
+  var a9940;
+  var a9941;
+  var a9942;
+  var a9943;
+  var a9944;
+  var a9945;
+  var a9946;
+  var a9947;
+  var a9948;
+  var a9949;
+  var a9950;
+  var a9951;
+  var a9952;
+  var a9953;
+  var a9954;
+  var a9955;
+  var a9956;
+  var a9957;
+  var a9958;
+  var a9959;
+  var a9960;
+  var a9961;
+  var a9962;
+  var a9963;
+  var a9964;
+  var a9965;
+  var a9966;
+  var a9967;
+  var a9968;
+  var a9969;
+  var a9970;
+  var a9971;
+  var a9972;
+  var a9973;
+  var a9974;
+  var a9975;
+  var a9976;
+  var a9977;
+  var a9978;
+  var a9979;
+  var a9980;
+  var a9981;
+  var a9982;
+  var a9983;
+  var a9984;
+  var a9985;
+  var a9986;
+  var a9987;
+  var a9988;
+  var a9989;
+  var a9990;
+  var a9991;
+  var a9992;
+  var a9993;
+  var a9994;
+  var a9995;
+  var a9996;
+  var a9997;
+  var a9998;
+  var a9999;
+  var a10000;
+  var a10001;
+  var a10002;
+  var a10003;
+  var a10004;
+  var a10005;
+  var a10006;
+  var a10007;
+  var a10008;
+  var a10009;
+  var a10010;
+  var a10011;
+  var a10012;
+  var a10013;
+  var a10014;
+  var a10015;
+  var a10016;
+  var a10017;
+  var a10018;
+  var a10019;
+  var a10020;
+  var a10021;
+  var a10022;
+  var a10023;
+  var a10024;
+  var a10025;
+  var a10026;
+  var a10027;
+  var a10028;
+  var a10029;
+  var a10030;
+  var a10031;
+  var a10032;
+  var a10033;
+  var a10034;
+  var a10035;
+  var a10036;
+  var a10037;
+  var a10038;
+  var a10039;
+  var a10040;
+  var a10041;
+  var a10042;
+  var a10043;
+  var a10044;
+  var a10045;
+  var a10046;
+  var a10047;
+  var a10048;
+  var a10049;
+  var a10050;
+  var a10051;
+  var a10052;
+  var a10053;
+  var a10054;
+  var a10055;
+  var a10056;
+  var a10057;
+  var a10058;
+  var a10059;
+  var a10060;
+  var a10061;
+  var a10062;
+  var a10063;
+  var a10064;
+  var a10065;
+  var a10066;
+  var a10067;
+  var a10068;
+  var a10069;
+  var a10070;
+  var a10071;
+  var a10072;
+  var a10073;
+  var a10074;
+  var a10075;
+  var a10076;
+  var a10077;
+  var a10078;
+  var a10079;
+  var a10080;
+  var a10081;
+  var a10082;
+  var a10083;
+  var a10084;
+  var a10085;
+  var a10086;
+  var a10087;
+  var a10088;
+  var a10089;
+  var a10090;
+  var a10091;
+  var a10092;
+  var a10093;
+  var a10094;
+  var a10095;
+  var a10096;
+  var a10097;
+  var a10098;
+  var a10099;
+  var a10100;
+  var a10101;
+  var a10102;
+  var a10103;
+  var a10104;
+  var a10105;
+  var a10106;
+  var a10107;
+  var a10108;
+  var a10109;
+  var a10110;
+  var a10111;
+  var a10112;
+  var a10113;
+  var a10114;
+  var a10115;
+  var a10116;
+  var a10117;
+  var a10118;
+  var a10119;
+  var a10120;
+  var a10121;
+  var a10122;
+  var a10123;
+  var a10124;
+  var a10125;
+  var a10126;
+  var a10127;
+  var a10128;
+  var a10129;
+  var a10130;
+  var a10131;
+  var a10132;
+  var a10133;
+  var a10134;
+  var a10135;
+  var a10136;
+  var a10137;
+  var a10138;
+  var a10139;
+  var a10140;
+  var a10141;
+  var a10142;
+  var a10143;
+  var a10144;
+  var a10145;
+  var a10146;
+  var a10147;
+  var a10148;
+  var a10149;
+  var a10150;
+  var a10151;
+  var a10152;
+  var a10153;
+  var a10154;
+  var a10155;
+  var a10156;
+  var a10157;
+  var a10158;
+  var a10159;
+  var a10160;
+  var a10161;
+  var a10162;
+  var a10163;
+  var a10164;
+  var a10165;
+  var a10166;
+  var a10167;
+  var a10168;
+  var a10169;
+  var a10170;
+  var a10171;
+  var a10172;
+  var a10173;
+  var a10174;
+  var a10175;
+  var a10176;
+  var a10177;
+  var a10178;
+  var a10179;
+  var a10180;
+  var a10181;
+  var a10182;
+  var a10183;
+  var a10184;
+  var a10185;
+  var a10186;
+  var a10187;
+  var a10188;
+  var a10189;
+  var a10190;
+  var a10191;
+  var a10192;
+  var a10193;
+  var a10194;
+  var a10195;
+  var a10196;
+  var a10197;
+  var a10198;
+  var a10199;
+  var a10200;
+  var a10201;
+  var a10202;
+  var a10203;
+  var a10204;
+  var a10205;
+  var a10206;
+  var a10207;
+  var a10208;
+  var a10209;
+  var a10210;
+  var a10211;
+  var a10212;
+  var a10213;
+  var a10214;
+  var a10215;
+  var a10216;
+  var a10217;
+  var a10218;
+  var a10219;
+  var a10220;
+  var a10221;
+  var a10222;
+  var a10223;
+  var a10224;
+  var a10225;
+  var a10226;
+  var a10227;
+  var a10228;
+  var a10229;
+  var a10230;
+  var a10231;
+  var a10232;
+  var a10233;
+  var a10234;
+  var a10235;
+  var a10236;
+  var a10237;
+  var a10238;
+  var a10239;
+  var a10240;
+  var a10241;
+  var a10242;
+  var a10243;
+  var a10244;
+  var a10245;
+  var a10246;
+  var a10247;
+  var a10248;
+  var a10249;
+  var a10250;
+  var a10251;
+  var a10252;
+  var a10253;
+  var a10254;
+  var a10255;
+  var a10256;
+  var a10257;
+  var a10258;
+  var a10259;
+  var a10260;
+  var a10261;
+  var a10262;
+  var a10263;
+  var a10264;
+  var a10265;
+  var a10266;
+  var a10267;
+  var a10268;
+  var a10269;
+  var a10270;
+  var a10271;
+  var a10272;
+  var a10273;
+  var a10274;
+  var a10275;
+  var a10276;
+  var a10277;
+  var a10278;
+  var a10279;
+  var a10280;
+  var a10281;
+  var a10282;
+  var a10283;
+  var a10284;
+  var a10285;
+  var a10286;
+  var a10287;
+  var a10288;
+  var a10289;
+  var a10290;
+  var a10291;
+  var a10292;
+  var a10293;
+  var a10294;
+  var a10295;
+  var a10296;
+  var a10297;
+  var a10298;
+  var a10299;
+  var a10300;
+  var a10301;
+  var a10302;
+  var a10303;
+  var a10304;
+  var a10305;
+  var a10306;
+  var a10307;
+  var a10308;
+  var a10309;
+  var a10310;
+  var a10311;
+  var a10312;
+  var a10313;
+  var a10314;
+  var a10315;
+  var a10316;
+  var a10317;
+  var a10318;
+  var a10319;
+  var a10320;
+  var a10321;
+  var a10322;
+  var a10323;
+  var a10324;
+  var a10325;
+  var a10326;
+  var a10327;
+  var a10328;
+  var a10329;
+  var a10330;
+  var a10331;
+  var a10332;
+  var a10333;
+  var a10334;
+  var a10335;
+  var a10336;
+  var a10337;
+  var a10338;
+  var a10339;
+  var a10340;
+  var a10341;
+  var a10342;
+  var a10343;
+  var a10344;
+  var a10345;
+  var a10346;
+  var a10347;
+  var a10348;
+  var a10349;
+  var a10350;
+  var a10351;
+  var a10352;
+  var a10353;
+  var a10354;
+  var a10355;
+  var a10356;
+  var a10357;
+  var a10358;
+  var a10359;
+  var a10360;
+  var a10361;
+  var a10362;
+  var a10363;
+  var a10364;
+  var a10365;
+  var a10366;
+  var a10367;
+  var a10368;
+  var a10369;
+  var a10370;
+  var a10371;
+  var a10372;
+  var a10373;
+  var a10374;
+  var a10375;
+  var a10376;
+  var a10377;
+  var a10378;
+  var a10379;
+  var a10380;
+  var a10381;
+  var a10382;
+  var a10383;
+  var a10384;
+  var a10385;
+  var a10386;
+  var a10387;
+  var a10388;
+  var a10389;
+  var a10390;
+  var a10391;
+  var a10392;
+  var a10393;
+  var a10394;
+  var a10395;
+  var a10396;
+  var a10397;
+  var a10398;
+  var a10399;
+  var a10400;
+  var a10401;
+  var a10402;
+  var a10403;
+  var a10404;
+  var a10405;
+  var a10406;
+  var a10407;
+  var a10408;
+  var a10409;
+  var a10410;
+  var a10411;
+  var a10412;
+  var a10413;
+  var a10414;
+  var a10415;
+  var a10416;
+  var a10417;
+  var a10418;
+  var a10419;
+  var a10420;
+  var a10421;
+  var a10422;
+  var a10423;
+  var a10424;
+  var a10425;
+  var a10426;
+  var a10427;
+  var a10428;
+  var a10429;
+  var a10430;
+  var a10431;
+  var a10432;
+  var a10433;
+  var a10434;
+  var a10435;
+  var a10436;
+  var a10437;
+  var a10438;
+  var a10439;
+  var a10440;
+  var a10441;
+  var a10442;
+  var a10443;
+  var a10444;
+  var a10445;
+  var a10446;
+  var a10447;
+  var a10448;
+  var a10449;
+  var a10450;
+  var a10451;
+  var a10452;
+  var a10453;
+  var a10454;
+  var a10455;
+  var a10456;
+  var a10457;
+  var a10458;
+  var a10459;
+  var a10460;
+  var a10461;
+  var a10462;
+  var a10463;
+  var a10464;
+  var a10465;
+  var a10466;
+  var a10467;
+  var a10468;
+  var a10469;
+  var a10470;
+  var a10471;
+  var a10472;
+  var a10473;
+  var a10474;
+  var a10475;
+  var a10476;
+  var a10477;
+  var a10478;
+  var a10479;
+  var a10480;
+  var a10481;
+  var a10482;
+  var a10483;
+  var a10484;
+  var a10485;
+  var a10486;
+  var a10487;
+  var a10488;
+  var a10489;
+  var a10490;
+  var a10491;
+  var a10492;
+  var a10493;
+  var a10494;
+  var a10495;
+  var a10496;
+  var a10497;
+  var a10498;
+  var a10499;
+  var a10500;
+  var a10501;
+  var a10502;
+  var a10503;
+  var a10504;
+  var a10505;
+  var a10506;
+  var a10507;
+  var a10508;
+  var a10509;
+  var a10510;
+  var a10511;
+  var a10512;
+  var a10513;
+  var a10514;
+  var a10515;
+  var a10516;
+  var a10517;
+  var a10518;
+  var a10519;
+  var a10520;
+  var a10521;
+  var a10522;
+  var a10523;
+  var a10524;
+  var a10525;
+  var a10526;
+  var a10527;
+  var a10528;
+  var a10529;
+  var a10530;
+  var a10531;
+  var a10532;
+  var a10533;
+  var a10534;
+  var a10535;
+  var a10536;
+  var a10537;
+  var a10538;
+  var a10539;
+  var a10540;
+  var a10541;
+  var a10542;
+  var a10543;
+  var a10544;
+  var a10545;
+  var a10546;
+  var a10547;
+  var a10548;
+  var a10549;
+  var a10550;
+  var a10551;
+  var a10552;
+  var a10553;
+  var a10554;
+  var a10555;
+  var a10556;
+  var a10557;
+  var a10558;
+  var a10559;
+  var a10560;
+  var a10561;
+  var a10562;
+  var a10563;
+  var a10564;
+  var a10565;
+  var a10566;
+  var a10567;
+  var a10568;
+  var a10569;
+  var a10570;
+  var a10571;
+  var a10572;
+  var a10573;
+  var a10574;
+  var a10575;
+  var a10576;
+  var a10577;
+  var a10578;
+  var a10579;
+  var a10580;
+  var a10581;
+  var a10582;
+  var a10583;
+  var a10584;
+  var a10585;
+  var a10586;
+  var a10587;
+  var a10588;
+  var a10589;
+  var a10590;
+  var a10591;
+  var a10592;
+  var a10593;
+  var a10594;
+  var a10595;
+  var a10596;
+  var a10597;
+  var a10598;
+  var a10599;
+  var a10600;
+  var a10601;
+  var a10602;
+  var a10603;
+  var a10604;
+  var a10605;
+  var a10606;
+  var a10607;
+  var a10608;
+  var a10609;
+  var a10610;
+  var a10611;
+  var a10612;
+  var a10613;
+  var a10614;
+  var a10615;
+  var a10616;
+  var a10617;
+  var a10618;
+  var a10619;
+  var a10620;
+  var a10621;
+  var a10622;
+  var a10623;
+  var a10624;
+  var a10625;
+  var a10626;
+  var a10627;
+  var a10628;
+  var a10629;
+  var a10630;
+  var a10631;
+  var a10632;
+  var a10633;
+  var a10634;
+  var a10635;
+  var a10636;
+  var a10637;
+  var a10638;
+  var a10639;
+  var a10640;
+  var a10641;
+  var a10642;
+  var a10643;
+  var a10644;
+  var a10645;
+  var a10646;
+  var a10647;
+  var a10648;
+  var a10649;
+  var a10650;
+  var a10651;
+  var a10652;
+  var a10653;
+  var a10654;
+  var a10655;
+  var a10656;
+  var a10657;
+  var a10658;
+  var a10659;
+  var a10660;
+  var a10661;
+  var a10662;
+  var a10663;
+  var a10664;
+  var a10665;
+  var a10666;
+  var a10667;
+  var a10668;
+  var a10669;
+  var a10670;
+  var a10671;
+  var a10672;
+  var a10673;
+  var a10674;
+  var a10675;
+  var a10676;
+  var a10677;
+  var a10678;
+  var a10679;
+  var a10680;
+  var a10681;
+  var a10682;
+  var a10683;
+  var a10684;
+  var a10685;
+  var a10686;
+  var a10687;
+  var a10688;
+  var a10689;
+  var a10690;
+  var a10691;
+  var a10692;
+  var a10693;
+  var a10694;
+  var a10695;
+  var a10696;
+  var a10697;
+  var a10698;
+  var a10699;
+  var a10700;
+  var a10701;
+  var a10702;
+  var a10703;
+  var a10704;
+  var a10705;
+  var a10706;
+  var a10707;
+  var a10708;
+  var a10709;
+  var a10710;
+  var a10711;
+  var a10712;
+  var a10713;
+  var a10714;
+  var a10715;
+  var a10716;
+  var a10717;
+  var a10718;
+  var a10719;
+  var a10720;
+  var a10721;
+  var a10722;
+  var a10723;
+  var a10724;
+  var a10725;
+  var a10726;
+  var a10727;
+  var a10728;
+  var a10729;
+  var a10730;
+  var a10731;
+  var a10732;
+  var a10733;
+  var a10734;
+  var a10735;
+  var a10736;
+  var a10737;
+  var a10738;
+  var a10739;
+  var a10740;
+  var a10741;
+  var a10742;
+  var a10743;
+  var a10744;
+  var a10745;
+  var a10746;
+  var a10747;
+  var a10748;
+  var a10749;
+  var a10750;
+  var a10751;
+  var a10752;
+  var a10753;
+  var a10754;
+  var a10755;
+  var a10756;
+  var a10757;
+  var a10758;
+  var a10759;
+  var a10760;
+  var a10761;
+  var a10762;
+  var a10763;
+  var a10764;
+  var a10765;
+  var a10766;
+  var a10767;
+  var a10768;
+  var a10769;
+  var a10770;
+  var a10771;
+  var a10772;
+  var a10773;
+  var a10774;
+  var a10775;
+  var a10776;
+  var a10777;
+  var a10778;
+  var a10779;
+  var a10780;
+  var a10781;
+  var a10782;
+  var a10783;
+  var a10784;
+  var a10785;
+  var a10786;
+  var a10787;
+  var a10788;
+  var a10789;
+  var a10790;
+  var a10791;
+  var a10792;
+  var a10793;
+  var a10794;
+  var a10795;
+  var a10796;
+  var a10797;
+  var a10798;
+  var a10799;
+  var a10800;
+  var a10801;
+  var a10802;
+  var a10803;
+  var a10804;
+  var a10805;
+  var a10806;
+  var a10807;
+  var a10808;
+  var a10809;
+  var a10810;
+  var a10811;
+  var a10812;
+  var a10813;
+  var a10814;
+  var a10815;
+  var a10816;
+  var a10817;
+  var a10818;
+  var a10819;
+  var a10820;
+  var a10821;
+  var a10822;
+  var a10823;
+  var a10824;
+  var a10825;
+  var a10826;
+  var a10827;
+  var a10828;
+  var a10829;
+  var a10830;
+  var a10831;
+  var a10832;
+  var a10833;
+  var a10834;
+  var a10835;
+  var a10836;
+  var a10837;
+  var a10838;
+  var a10839;
+  var a10840;
+  var a10841;
+  var a10842;
+  var a10843;
+  var a10844;
+  var a10845;
+  var a10846;
+  var a10847;
+  var a10848;
+  var a10849;
+  var a10850;
+  var a10851;
+  var a10852;
+  var a10853;
+  var a10854;
+  var a10855;
+  var a10856;
+  var a10857;
+  var a10858;
+  var a10859;
+  var a10860;
+  var a10861;
+  var a10862;
+  var a10863;
+  var a10864;
+  var a10865;
+  var a10866;
+  var a10867;
+  var a10868;
+  var a10869;
+  var a10870;
+  var a10871;
+  var a10872;
+  var a10873;
+  var a10874;
+  var a10875;
+  var a10876;
+  var a10877;
+  var a10878;
+  var a10879;
+  var a10880;
+  var a10881;
+  var a10882;
+  var a10883;
+  var a10884;
+  var a10885;
+  var a10886;
+  var a10887;
+  var a10888;
+  var a10889;
+  var a10890;
+  var a10891;
+  var a10892;
+  var a10893;
+  var a10894;
+  var a10895;
+  var a10896;
+  var a10897;
+  var a10898;
+  var a10899;
+  var a10900;
+  var a10901;
+  var a10902;
+  var a10903;
+  var a10904;
+  var a10905;
+  var a10906;
+  var a10907;
+  var a10908;
+  var a10909;
+  var a10910;
+  var a10911;
+  var a10912;
+  var a10913;
+  var a10914;
+  var a10915;
+  var a10916;
+  var a10917;
+  var a10918;
+  var a10919;
+  var a10920;
+  var a10921;
+  var a10922;
+  var a10923;
+  var a10924;
+  var a10925;
+  var a10926;
+  var a10927;
+  var a10928;
+  var a10929;
+  var a10930;
+  var a10931;
+  var a10932;
+  var a10933;
+  var a10934;
+  var a10935;
+  var a10936;
+  var a10937;
+  var a10938;
+  var a10939;
+  var a10940;
+  var a10941;
+  var a10942;
+  var a10943;
+  var a10944;
+  var a10945;
+  var a10946;
+  var a10947;
+  var a10948;
+  var a10949;
+  var a10950;
+  var a10951;
+  var a10952;
+  var a10953;
+  var a10954;
+  var a10955;
+  var a10956;
+  var a10957;
+  var a10958;
+  var a10959;
+  var a10960;
+  var a10961;
+  var a10962;
+  var a10963;
+  var a10964;
+  var a10965;
+  var a10966;
+  var a10967;
+  var a10968;
+  var a10969;
+  var a10970;
+  var a10971;
+  var a10972;
+  var a10973;
+  var a10974;
+  var a10975;
+  var a10976;
+  var a10977;
+  var a10978;
+  var a10979;
+  var a10980;
+  var a10981;
+  var a10982;
+  var a10983;
+  var a10984;
+  var a10985;
+  var a10986;
+  var a10987;
+  var a10988;
+  var a10989;
+  var a10990;
+  var a10991;
+  var a10992;
+  var a10993;
+  var a10994;
+  var a10995;
+  var a10996;
+  var a10997;
+  var a10998;
+  var a10999;
+  var a11000;
+  var a11001;
+  var a11002;
+  var a11003;
+  var a11004;
+  var a11005;
+  var a11006;
+  var a11007;
+  var a11008;
+  var a11009;
+  var a11010;
+  var a11011;
+  var a11012;
+  var a11013;
+  var a11014;
+  var a11015;
+  var a11016;
+  var a11017;
+  var a11018;
+  var a11019;
+  var a11020;
+  var a11021;
+  var a11022;
+  var a11023;
+  var a11024;
+  var a11025;
+  var a11026;
+  var a11027;
+  var a11028;
+  var a11029;
+  var a11030;
+  var a11031;
+  var a11032;
+  var a11033;
+  var a11034;
+  var a11035;
+  var a11036;
+  var a11037;
+  var a11038;
+  var a11039;
+  var a11040;
+  var a11041;
+  var a11042;
+  var a11043;
+  var a11044;
+  var a11045;
+  var a11046;
+  var a11047;
+  var a11048;
+  var a11049;
+  var a11050;
+  var a11051;
+  var a11052;
+  var a11053;
+  var a11054;
+  var a11055;
+  var a11056;
+  var a11057;
+  var a11058;
+  var a11059;
+  var a11060;
+  var a11061;
+  var a11062;
+  var a11063;
+  var a11064;
+  var a11065;
+  var a11066;
+  var a11067;
+  var a11068;
+  var a11069;
+  var a11070;
+  var a11071;
+  var a11072;
+  var a11073;
+  var a11074;
+  var a11075;
+  var a11076;
+  var a11077;
+  var a11078;
+  var a11079;
+  var a11080;
+  var a11081;
+  var a11082;
+  var a11083;
+  var a11084;
+  var a11085;
+  var a11086;
+  var a11087;
+  var a11088;
+  var a11089;
+  var a11090;
+  var a11091;
+  var a11092;
+  var a11093;
+  var a11094;
+  var a11095;
+  var a11096;
+  var a11097;
+  var a11098;
+  var a11099;
+  var a11100;
+  var a11101;
+  var a11102;
+  var a11103;
+  var a11104;
+  var a11105;
+  var a11106;
+  var a11107;
+  var a11108;
+  var a11109;
+  var a11110;
+  var a11111;
+  var a11112;
+  var a11113;
+  var a11114;
+  var a11115;
+  var a11116;
+  var a11117;
+  var a11118;
+  var a11119;
+  var a11120;
+  var a11121;
+  var a11122;
+  var a11123;
+  var a11124;
+  var a11125;
+  var a11126;
+  var a11127;
+  var a11128;
+  var a11129;
+  var a11130;
+  var a11131;
+  var a11132;
+  var a11133;
+  var a11134;
+  var a11135;
+  var a11136;
+  var a11137;
+  var a11138;
+  var a11139;
+  var a11140;
+  var a11141;
+  var a11142;
+  var a11143;
+  var a11144;
+  var a11145;
+  var a11146;
+  var a11147;
+  var a11148;
+  var a11149;
+  var a11150;
+  var a11151;
+  var a11152;
+  var a11153;
+  var a11154;
+  var a11155;
+  var a11156;
+  var a11157;
+  var a11158;
+  var a11159;
+  var a11160;
+  var a11161;
+  var a11162;
+  var a11163;
+  var a11164;
+  var a11165;
+  var a11166;
+  var a11167;
+  var a11168;
+  var a11169;
+  var a11170;
+  var a11171;
+  var a11172;
+  var a11173;
+  var a11174;
+  var a11175;
+  var a11176;
+  var a11177;
+  var a11178;
+  var a11179;
+  var a11180;
+  var a11181;
+  var a11182;
+  var a11183;
+  var a11184;
+  var a11185;
+  var a11186;
+  var a11187;
+  var a11188;
+  var a11189;
+  var a11190;
+  var a11191;
+  var a11192;
+  var a11193;
+  var a11194;
+  var a11195;
+  var a11196;
+  var a11197;
+  var a11198;
+  var a11199;
+  var a11200;
+  var a11201;
+  var a11202;
+  var a11203;
+  var a11204;
+  var a11205;
+  var a11206;
+  var a11207;
+  var a11208;
+  var a11209;
+  var a11210;
+  var a11211;
+  var a11212;
+  var a11213;
+  var a11214;
+  var a11215;
+  var a11216;
+  var a11217;
+  var a11218;
+  var a11219;
+  var a11220;
+  var a11221;
+  var a11222;
+  var a11223;
+  var a11224;
+  var a11225;
+  var a11226;
+  var a11227;
+  var a11228;
+  var a11229;
+  var a11230;
+  var a11231;
+  var a11232;
+  var a11233;
+  var a11234;
+  var a11235;
+  var a11236;
+  var a11237;
+  var a11238;
+  var a11239;
+  var a11240;
+  var a11241;
+  var a11242;
+  var a11243;
+  var a11244;
+  var a11245;
+  var a11246;
+  var a11247;
+  var a11248;
+  var a11249;
+  var a11250;
+  var a11251;
+  var a11252;
+  var a11253;
+  var a11254;
+  var a11255;
+  var a11256;
+  var a11257;
+  var a11258;
+  var a11259;
+  var a11260;
+  var a11261;
+  var a11262;
+  var a11263;
+  var a11264;
+  var a11265;
+  var a11266;
+  var a11267;
+  var a11268;
+  var a11269;
+  var a11270;
+  var a11271;
+  var a11272;
+  var a11273;
+  var a11274;
+  var a11275;
+  var a11276;
+  var a11277;
+  var a11278;
+  var a11279;
+  var a11280;
+  var a11281;
+  var a11282;
+  var a11283;
+  var a11284;
+  var a11285;
+  var a11286;
+  var a11287;
+  var a11288;
+  var a11289;
+  var a11290;
+  var a11291;
+  var a11292;
+  var a11293;
+  var a11294;
+  var a11295;
+  var a11296;
+  var a11297;
+  var a11298;
+  var a11299;
+  var a11300;
+  var a11301;
+  var a11302;
+  var a11303;
+  var a11304;
+  var a11305;
+  var a11306;
+  var a11307;
+  var a11308;
+  var a11309;
+  var a11310;
+  var a11311;
+  var a11312;
+  var a11313;
+  var a11314;
+  var a11315;
+  var a11316;
+  var a11317;
+  var a11318;
+  var a11319;
+  var a11320;
+  var a11321;
+  var a11322;
+  var a11323;
+  var a11324;
+  var a11325;
+  var a11326;
+  var a11327;
+  var a11328;
+  var a11329;
+  var a11330;
+  var a11331;
+  var a11332;
+  var a11333;
+  var a11334;
+  var a11335;
+  var a11336;
+  var a11337;
+  var a11338;
+  var a11339;
+  var a11340;
+  var a11341;
+  var a11342;
+  var a11343;
+  var a11344;
+  var a11345;
+  var a11346;
+  var a11347;
+  var a11348;
+  var a11349;
+  var a11350;
+  var a11351;
+  var a11352;
+  var a11353;
+  var a11354;
+  var a11355;
+  var a11356;
+  var a11357;
+  var a11358;
+  var a11359;
+  var a11360;
+  var a11361;
+  var a11362;
+  var a11363;
+  var a11364;
+  var a11365;
+  var a11366;
+  var a11367;
+  var a11368;
+  var a11369;
+  var a11370;
+  var a11371;
+  var a11372;
+  var a11373;
+  var a11374;
+  var a11375;
+  var a11376;
+  var a11377;
+  var a11378;
+  var a11379;
+  var a11380;
+  var a11381;
+  var a11382;
+  var a11383;
+  var a11384;
+  var a11385;
+  var a11386;
+  var a11387;
+  var a11388;
+  var a11389;
+  var a11390;
+  var a11391;
+  var a11392;
+  var a11393;
+  var a11394;
+  var a11395;
+  var a11396;
+  var a11397;
+  var a11398;
+  var a11399;
+  var a11400;
+  var a11401;
+  var a11402;
+  var a11403;
+  var a11404;
+  var a11405;
+  var a11406;
+  var a11407;
+  var a11408;
+  var a11409;
+  var a11410;
+  var a11411;
+  var a11412;
+  var a11413;
+  var a11414;
+  var a11415;
+  var a11416;
+  var a11417;
+  var a11418;
+  var a11419;
+  var a11420;
+  var a11421;
+  var a11422;
+  var a11423;
+  var a11424;
+  var a11425;
+  var a11426;
+  var a11427;
+  var a11428;
+  var a11429;
+  var a11430;
+  var a11431;
+  var a11432;
+  var a11433;
+  var a11434;
+  var a11435;
+  var a11436;
+  var a11437;
+  var a11438;
+  var a11439;
+  var a11440;
+  var a11441;
+  var a11442;
+  var a11443;
+  var a11444;
+  var a11445;
+  var a11446;
+  var a11447;
+  var a11448;
+  var a11449;
+  var a11450;
+  var a11451;
+  var a11452;
+  var a11453;
+  var a11454;
+  var a11455;
+  var a11456;
+  var a11457;
+  var a11458;
+  var a11459;
+  var a11460;
+  var a11461;
+  var a11462;
+  var a11463;
+  var a11464;
+  var a11465;
+  var a11466;
+  var a11467;
+  var a11468;
+  var a11469;
+  var a11470;
+  var a11471;
+  var a11472;
+  var a11473;
+  var a11474;
+  var a11475;
+  var a11476;
+  var a11477;
+  var a11478;
+  var a11479;
+  var a11480;
+  var a11481;
+  var a11482;
+  var a11483;
+  var a11484;
+  var a11485;
+  var a11486;
+  var a11487;
+  var a11488;
+  var a11489;
+  var a11490;
+  var a11491;
+  var a11492;
+  var a11493;
+  var a11494;
+  var a11495;
+  var a11496;
+  var a11497;
+  var a11498;
+  var a11499;
+  var a11500;
+  var a11501;
+  var a11502;
+  var a11503;
+  var a11504;
+  var a11505;
+  var a11506;
+  var a11507;
+  var a11508;
+  var a11509;
+  var a11510;
+  var a11511;
+  var a11512;
+  var a11513;
+  var a11514;
+  var a11515;
+  var a11516;
+  var a11517;
+  var a11518;
+  var a11519;
+  var a11520;
+  var a11521;
+  var a11522;
+  var a11523;
+  var a11524;
+  var a11525;
+  var a11526;
+  var a11527;
+  var a11528;
+  var a11529;
+  var a11530;
+  var a11531;
+  var a11532;
+  var a11533;
+  var a11534;
+  var a11535;
+  var a11536;
+  var a11537;
+  var a11538;
+  var a11539;
+  var a11540;
+  var a11541;
+  var a11542;
+  var a11543;
+  var a11544;
+  var a11545;
+  var a11546;
+  var a11547;
+  var a11548;
+  var a11549;
+  var a11550;
+  var a11551;
+  var a11552;
+  var a11553;
+  var a11554;
+  var a11555;
+  var a11556;
+  var a11557;
+  var a11558;
+  var a11559;
+  var a11560;
+  var a11561;
+  var a11562;
+  var a11563;
+  var a11564;
+  var a11565;
+  var a11566;
+  var a11567;
+  var a11568;
+  var a11569;
+  var a11570;
+  var a11571;
+  var a11572;
+  var a11573;
+  var a11574;
+  var a11575;
+  var a11576;
+  var a11577;
+  var a11578;
+  var a11579;
+  var a11580;
+  var a11581;
+  var a11582;
+  var a11583;
+  var a11584;
+  var a11585;
+  var a11586;
+  var a11587;
+  var a11588;
+  var a11589;
+  var a11590;
+  var a11591;
+  var a11592;
+  var a11593;
+  var a11594;
+  var a11595;
+  var a11596;
+  var a11597;
+  var a11598;
+  var a11599;
+  var a11600;
+  var a11601;
+  var a11602;
+  var a11603;
+  var a11604;
+  var a11605;
+  var a11606;
+  var a11607;
+  var a11608;
+  var a11609;
+  var a11610;
+  var a11611;
+  var a11612;
+  var a11613;
+  var a11614;
+  var a11615;
+  var a11616;
+  var a11617;
+  var a11618;
+  var a11619;
+  var a11620;
+  var a11621;
+  var a11622;
+  var a11623;
+  var a11624;
+  var a11625;
+  var a11626;
+  var a11627;
+  var a11628;
+  var a11629;
+  var a11630;
+  var a11631;
+  var a11632;
+  var a11633;
+  var a11634;
+  var a11635;
+  var a11636;
+  var a11637;
+  var a11638;
+  var a11639;
+  var a11640;
+  var a11641;
+  var a11642;
+  var a11643;
+  var a11644;
+  var a11645;
+  var a11646;
+  var a11647;
+  var a11648;
+  var a11649;
+  var a11650;
+  var a11651;
+  var a11652;
+  var a11653;
+  var a11654;
+  var a11655;
+  var a11656;
+  var a11657;
+  var a11658;
+  var a11659;
+  var a11660;
+  var a11661;
+  var a11662;
+  var a11663;
+  var a11664;
+  var a11665;
+  var a11666;
+  var a11667;
+  var a11668;
+  var a11669;
+  var a11670;
+  var a11671;
+  var a11672;
+  var a11673;
+  var a11674;
+  var a11675;
+  var a11676;
+  var a11677;
+  var a11678;
+  var a11679;
+  var a11680;
+  var a11681;
+  var a11682;
+  var a11683;
+  var a11684;
+  var a11685;
+  var a11686;
+  var a11687;
+  var a11688;
+  var a11689;
+  var a11690;
+  var a11691;
+  var a11692;
+  var a11693;
+  var a11694;
+  var a11695;
+  var a11696;
+  var a11697;
+  var a11698;
+  var a11699;
+  var a11700;
+  var a11701;
+  var a11702;
+  var a11703;
+  var a11704;
+  var a11705;
+  var a11706;
+  var a11707;
+  var a11708;
+  var a11709;
+  var a11710;
+  var a11711;
+  var a11712;
+  var a11713;
+  var a11714;
+  var a11715;
+  var a11716;
+  var a11717;
+  var a11718;
+  var a11719;
+  var a11720;
+  var a11721;
+  var a11722;
+  var a11723;
+  var a11724;
+  var a11725;
+  var a11726;
+  var a11727;
+  var a11728;
+  var a11729;
+  var a11730;
+  var a11731;
+  var a11732;
+  var a11733;
+  var a11734;
+  var a11735;
+  var a11736;
+  var a11737;
+  var a11738;
+  var a11739;
+  var a11740;
+  var a11741;
+  var a11742;
+  var a11743;
+  var a11744;
+  var a11745;
+  var a11746;
+  var a11747;
+  var a11748;
+  var a11749;
+  var a11750;
+  var a11751;
+  var a11752;
+  var a11753;
+  var a11754;
+  var a11755;
+  var a11756;
+  var a11757;
+  var a11758;
+  var a11759;
+  var a11760;
+  var a11761;
+  var a11762;
+  var a11763;
+  var a11764;
+  var a11765;
+  var a11766;
+  var a11767;
+  var a11768;
+  var a11769;
+  var a11770;
+  var a11771;
+  var a11772;
+  var a11773;
+  var a11774;
+  var a11775;
+  var a11776;
+  var a11777;
+  var a11778;
+  var a11779;
+  var a11780;
+  var a11781;
+  var a11782;
+  var a11783;
+  var a11784;
+  var a11785;
+  var a11786;
+  var a11787;
+  var a11788;
+  var a11789;
+  var a11790;
+  var a11791;
+  var a11792;
+  var a11793;
+  var a11794;
+  var a11795;
+  var a11796;
+  var a11797;
+  var a11798;
+  var a11799;
+  var a11800;
+  var a11801;
+  var a11802;
+  var a11803;
+  var a11804;
+  var a11805;
+  var a11806;
+  var a11807;
+  var a11808;
+  var a11809;
+  var a11810;
+  var a11811;
+  var a11812;
+  var a11813;
+  var a11814;
+  var a11815;
+  var a11816;
+  var a11817;
+  var a11818;
+  var a11819;
+  var a11820;
+  var a11821;
+  var a11822;
+  var a11823;
+  var a11824;
+  var a11825;
+  var a11826;
+  var a11827;
+  var a11828;
+  var a11829;
+  var a11830;
+  var a11831;
+  var a11832;
+  var a11833;
+  var a11834;
+  var a11835;
+  var a11836;
+  var a11837;
+  var a11838;
+  var a11839;
+  var a11840;
+  var a11841;
+  var a11842;
+  var a11843;
+  var a11844;
+  var a11845;
+  var a11846;
+  var a11847;
+  var a11848;
+  var a11849;
+  var a11850;
+  var a11851;
+  var a11852;
+  var a11853;
+  var a11854;
+  var a11855;
+  var a11856;
+  var a11857;
+  var a11858;
+  var a11859;
+  var a11860;
+  var a11861;
+  var a11862;
+  var a11863;
+  var a11864;
+  var a11865;
+  var a11866;
+  var a11867;
+  var a11868;
+  var a11869;
+  var a11870;
+  var a11871;
+  var a11872;
+  var a11873;
+  var a11874;
+  var a11875;
+  var a11876;
+  var a11877;
+  var a11878;
+  var a11879;
+  var a11880;
+  var a11881;
+  var a11882;
+  var a11883;
+  var a11884;
+  var a11885;
+  var a11886;
+  var a11887;
+  var a11888;
+  var a11889;
+  var a11890;
+  var a11891;
+  var a11892;
+  var a11893;
+  var a11894;
+  var a11895;
+  var a11896;
+  var a11897;
+  var a11898;
+  var a11899;
+  var a11900;
+  var a11901;
+  var a11902;
+  var a11903;
+  var a11904;
+  var a11905;
+  var a11906;
+  var a11907;
+  var a11908;
+  var a11909;
+  var a11910;
+  var a11911;
+  var a11912;
+  var a11913;
+  var a11914;
+  var a11915;
+  var a11916;
+  var a11917;
+  var a11918;
+  var a11919;
+  var a11920;
+  var a11921;
+  var a11922;
+  var a11923;
+  var a11924;
+  var a11925;
+  var a11926;
+  var a11927;
+  var a11928;
+  var a11929;
+  var a11930;
+  var a11931;
+  var a11932;
+  var a11933;
+  var a11934;
+  var a11935;
+  var a11936;
+  var a11937;
+  var a11938;
+  var a11939;
+  var a11940;
+  var a11941;
+  var a11942;
+  var a11943;
+  var a11944;
+  var a11945;
+  var a11946;
+  var a11947;
+  var a11948;
+  var a11949;
+  var a11950;
+  var a11951;
+  var a11952;
+  var a11953;
+  var a11954;
+  var a11955;
+  var a11956;
+  var a11957;
+  var a11958;
+  var a11959;
+  var a11960;
+  var a11961;
+  var a11962;
+  var a11963;
+  var a11964;
+  var a11965;
+  var a11966;
+  var a11967;
+  var a11968;
+  var a11969;
+  var a11970;
+  var a11971;
+  var a11972;
+  var a11973;
+  var a11974;
+  var a11975;
+  var a11976;
+  var a11977;
+  var a11978;
+  var a11979;
+  var a11980;
+  var a11981;
+  var a11982;
+  var a11983;
+  var a11984;
+  var a11985;
+  var a11986;
+  var a11987;
+  var a11988;
+  var a11989;
+  var a11990;
+  var a11991;
+  var a11992;
+  var a11993;
+  var a11994;
+  var a11995;
+  var a11996;
+  var a11997;
+  var a11998;
+  var a11999;
+  var a12000;
+  var a12001;
+  var a12002;
+  var a12003;
+  var a12004;
+  var a12005;
+  var a12006;
+  var a12007;
+  var a12008;
+  var a12009;
+  var a12010;
+  var a12011;
+  var a12012;
+  var a12013;
+  var a12014;
+  var a12015;
+  var a12016;
+  var a12017;
+  var a12018;
+  var a12019;
+  var a12020;
+  var a12021;
+  var a12022;
+  var a12023;
+  var a12024;
+  var a12025;
+  var a12026;
+  var a12027;
+  var a12028;
+  var a12029;
+  var a12030;
+  var a12031;
+  var a12032;
+  var a12033;
+  var a12034;
+  var a12035;
+  var a12036;
+  var a12037;
+  var a12038;
+  var a12039;
+  var a12040;
+  var a12041;
+  var a12042;
+  var a12043;
+  var a12044;
+  var a12045;
+  var a12046;
+  var a12047;
+  var a12048;
+  var a12049;
+  var a12050;
+  var a12051;
+  var a12052;
+  var a12053;
+  var a12054;
+  var a12055;
+  var a12056;
+  var a12057;
+  var a12058;
+  var a12059;
+  var a12060;
+  var a12061;
+  var a12062;
+  var a12063;
+  var a12064;
+  var a12065;
+  var a12066;
+  var a12067;
+  var a12068;
+  var a12069;
+  var a12070;
+  var a12071;
+  var a12072;
+  var a12073;
+  var a12074;
+  var a12075;
+  var a12076;
+  var a12077;
+  var a12078;
+  var a12079;
+  var a12080;
+  var a12081;
+  var a12082;
+  var a12083;
+  var a12084;
+  var a12085;
+  var a12086;
+  var a12087;
+  var a12088;
+  var a12089;
+  var a12090;
+  var a12091;
+  var a12092;
+  var a12093;
+  var a12094;
+  var a12095;
+  var a12096;
+  var a12097;
+  var a12098;
+  var a12099;
+  var a12100;
+  var a12101;
+  var a12102;
+  var a12103;
+  var a12104;
+  var a12105;
+  var a12106;
+  var a12107;
+  var a12108;
+  var a12109;
+  var a12110;
+  var a12111;
+  var a12112;
+  var a12113;
+  var a12114;
+  var a12115;
+  var a12116;
+  var a12117;
+  var a12118;
+  var a12119;
+  var a12120;
+  var a12121;
+  var a12122;
+  var a12123;
+  var a12124;
+  var a12125;
+  var a12126;
+  var a12127;
+  var a12128;
+  var a12129;
+  var a12130;
+  var a12131;
+  var a12132;
+  var a12133;
+  var a12134;
+  var a12135;
+  var a12136;
+  var a12137;
+  var a12138;
+  var a12139;
+  var a12140;
+  var a12141;
+  var a12142;
+  var a12143;
+  var a12144;
+  var a12145;
+  var a12146;
+  var a12147;
+  var a12148;
+  var a12149;
+  var a12150;
+  var a12151;
+  var a12152;
+  var a12153;
+  var a12154;
+  var a12155;
+  var a12156;
+  var a12157;
+  var a12158;
+  var a12159;
+  var a12160;
+  var a12161;
+  var a12162;
+  var a12163;
+  var a12164;
+  var a12165;
+  var a12166;
+  var a12167;
+  var a12168;
+  var a12169;
+  var a12170;
+  var a12171;
+  var a12172;
+  var a12173;
+  var a12174;
+  var a12175;
+  var a12176;
+  var a12177;
+  var a12178;
+  var a12179;
+  var a12180;
+  var a12181;
+  var a12182;
+  var a12183;
+  var a12184;
+  var a12185;
+  var a12186;
+  var a12187;
+  var a12188;
+  var a12189;
+  var a12190;
+  var a12191;
+  var a12192;
+  var a12193;
+  var a12194;
+  var a12195;
+  var a12196;
+  var a12197;
+  var a12198;
+  var a12199;
+  var a12200;
+  var a12201;
+  var a12202;
+  var a12203;
+  var a12204;
+  var a12205;
+  var a12206;
+  var a12207;
+  var a12208;
+  var a12209;
+  var a12210;
+  var a12211;
+  var a12212;
+  var a12213;
+  var a12214;
+  var a12215;
+  var a12216;
+  var a12217;
+  var a12218;
+  var a12219;
+  var a12220;
+  var a12221;
+  var a12222;
+  var a12223;
+  var a12224;
+  var a12225;
+  var a12226;
+  var a12227;
+  var a12228;
+  var a12229;
+  var a12230;
+  var a12231;
+  var a12232;
+  var a12233;
+  var a12234;
+  var a12235;
+  var a12236;
+  var a12237;
+  var a12238;
+  var a12239;
+  var a12240;
+  var a12241;
+  var a12242;
+  var a12243;
+  var a12244;
+  var a12245;
+  var a12246;
+  var a12247;
+  var a12248;
+  var a12249;
+  var a12250;
+  var a12251;
+  var a12252;
+  var a12253;
+  var a12254;
+  var a12255;
+  var a12256;
+  var a12257;
+  var a12258;
+  var a12259;
+  var a12260;
+  var a12261;
+  var a12262;
+  var a12263;
+  var a12264;
+  var a12265;
+  var a12266;
+  var a12267;
+  var a12268;
+  var a12269;
+  var a12270;
+  var a12271;
+  var a12272;
+  var a12273;
+  var a12274;
+  var a12275;
+  var a12276;
+  var a12277;
+  var a12278;
+  var a12279;
+  var a12280;
+  var a12281;
+  var a12282;
+  var a12283;
+  var a12284;
+  var a12285;
+  var a12286;
+  var a12287;
+  var a12288;
+  var a12289;
+  var a12290;
+  var a12291;
+  var a12292;
+  var a12293;
+  var a12294;
+  var a12295;
+  var a12296;
+  var a12297;
+  var a12298;
+  var a12299;
+  var a12300;
+  var a12301;
+  var a12302;
+  var a12303;
+  var a12304;
+  var a12305;
+  var a12306;
+  var a12307;
+  var a12308;
+  var a12309;
+  var a12310;
+  var a12311;
+  var a12312;
+  var a12313;
+  var a12314;
+  var a12315;
+  var a12316;
+  var a12317;
+  var a12318;
+  var a12319;
+  var a12320;
+  var a12321;
+  var a12322;
+  var a12323;
+  var a12324;
+  var a12325;
+  var a12326;
+  var a12327;
+  var a12328;
+  var a12329;
+  var a12330;
+  var a12331;
+  var a12332;
+  var a12333;
+  var a12334;
+  var a12335;
+  var a12336;
+  var a12337;
+  var a12338;
+  var a12339;
+  var a12340;
+  var a12341;
+  var a12342;
+  var a12343;
+  var a12344;
+  var a12345;
+  var a12346;
+  var a12347;
+  var a12348;
+  var a12349;
+  var a12350;
+  var a12351;
+  var a12352;
+  var a12353;
+  var a12354;
+  var a12355;
+  var a12356;
+  var a12357;
+  var a12358;
+  var a12359;
+  var a12360;
+  var a12361;
+  var a12362;
+  var a12363;
+  var a12364;
+  var a12365;
+  var a12366;
+  var a12367;
+  var a12368;
+  var a12369;
+  var a12370;
+  var a12371;
+  var a12372;
+  var a12373;
+  var a12374;
+  var a12375;
+  var a12376;
+  var a12377;
+  var a12378;
+  var a12379;
+  var a12380;
+  var a12381;
+  var a12382;
+  var a12383;
+  var a12384;
+  var a12385;
+  var a12386;
+  var a12387;
+  var a12388;
+  var a12389;
+  var a12390;
+  var a12391;
+  var a12392;
+  var a12393;
+  var a12394;
+  var a12395;
+  var a12396;
+  var a12397;
+  var a12398;
+  var a12399;
+  var a12400;
+  var a12401;
+  var a12402;
+  var a12403;
+  var a12404;
+  var a12405;
+  var a12406;
+  var a12407;
+  var a12408;
+  var a12409;
+  var a12410;
+  var a12411;
+  var a12412;
+  var a12413;
+  var a12414;
+  var a12415;
+  var a12416;
+  var a12417;
+  var a12418;
+  var a12419;
+  var a12420;
+  var a12421;
+  var a12422;
+  var a12423;
+  var a12424;
+  var a12425;
+  var a12426;
+  var a12427;
+  var a12428;
+  var a12429;
+  var a12430;
+  var a12431;
+  var a12432;
+  var a12433;
+  var a12434;
+  var a12435;
+  var a12436;
+  var a12437;
+  var a12438;
+  var a12439;
+  var a12440;
+  var a12441;
+  var a12442;
+  var a12443;
+  var a12444;
+  var a12445;
+  var a12446;
+  var a12447;
+  var a12448;
+  var a12449;
+  var a12450;
+  var a12451;
+  var a12452;
+  var a12453;
+  var a12454;
+  var a12455;
+  var a12456;
+  var a12457;
+  var a12458;
+  var a12459;
+  var a12460;
+  var a12461;
+  var a12462;
+  var a12463;
+  var a12464;
+  var a12465;
+  var a12466;
+  var a12467;
+  var a12468;
+  var a12469;
+  var a12470;
+  var a12471;
+  var a12472;
+  var a12473;
+  var a12474;
+  var a12475;
+  var a12476;
+  var a12477;
+  var a12478;
+  var a12479;
+  var a12480;
+  var a12481;
+  var a12482;
+  var a12483;
+  var a12484;
+  var a12485;
+  var a12486;
+  var a12487;
+  var a12488;
+  var a12489;
+  var a12490;
+  var a12491;
+  var a12492;
+  var a12493;
+  var a12494;
+  var a12495;
+  var a12496;
+  var a12497;
+  var a12498;
+  var a12499;
+  var a12500;
+  var a12501;
+  var a12502;
+  var a12503;
+  var a12504;
+  var a12505;
+  var a12506;
+  var a12507;
+  var a12508;
+  var a12509;
+  var a12510;
+  var a12511;
+  var a12512;
+  var a12513;
+  var a12514;
+  var a12515;
+  var a12516;
+  var a12517;
+  var a12518;
+  var a12519;
+  var a12520;
+  var a12521;
+  var a12522;
+  var a12523;
+  var a12524;
+  var a12525;
+  var a12526;
+  var a12527;
+  var a12528;
+  var a12529;
+  var a12530;
+  var a12531;
+  var a12532;
+  var a12533;
+  var a12534;
+  var a12535;
+  var a12536;
+  var a12537;
+  var a12538;
+  var a12539;
+  var a12540;
+  var a12541;
+  var a12542;
+  var a12543;
+  var a12544;
+  var a12545;
+  var a12546;
+  var a12547;
+  var a12548;
+  var a12549;
+  var a12550;
+  var a12551;
+  var a12552;
+  var a12553;
+  var a12554;
+  var a12555;
+  var a12556;
+  var a12557;
+  var a12558;
+  var a12559;
+  var a12560;
+  var a12561;
+  var a12562;
+  var a12563;
+  var a12564;
+  var a12565;
+  var a12566;
+  var a12567;
+  var a12568;
+  var a12569;
+  var a12570;
+  var a12571;
+  var a12572;
+  var a12573;
+  var a12574;
+  var a12575;
+  var a12576;
+  var a12577;
+  var a12578;
+  var a12579;
+  var a12580;
+  var a12581;
+  var a12582;
+  var a12583;
+  var a12584;
+  var a12585;
+  var a12586;
+  var a12587;
+  var a12588;
+  var a12589;
+  var a12590;
+  var a12591;
+  var a12592;
+  var a12593;
+  var a12594;
+  var a12595;
+  var a12596;
+  var a12597;
+  var a12598;
+  var a12599;
+  var a12600;
+  var a12601;
+  var a12602;
+  var a12603;
+  var a12604;
+  var a12605;
+  var a12606;
+  var a12607;
+  var a12608;
+  var a12609;
+  var a12610;
+  var a12611;
+  var a12612;
+  var a12613;
+  var a12614;
+  var a12615;
+  var a12616;
+  var a12617;
+  var a12618;
+  var a12619;
+  var a12620;
+  var a12621;
+  var a12622;
+  var a12623;
+  var a12624;
+  var a12625;
+  var a12626;
+  var a12627;
+  var a12628;
+  var a12629;
+  var a12630;
+  var a12631;
+  var a12632;
+  var a12633;
+  var a12634;
+  var a12635;
+  var a12636;
+  var a12637;
+  var a12638;
+  var a12639;
+  var a12640;
+  var a12641;
+  var a12642;
+  var a12643;
+  var a12644;
+  var a12645;
+  var a12646;
+  var a12647;
+  var a12648;
+  var a12649;
+  var a12650;
+  var a12651;
+  var a12652;
+  var a12653;
+  var a12654;
+  var a12655;
+  var a12656;
+  var a12657;
+  var a12658;
+  var a12659;
+  var a12660;
+  var a12661;
+  var a12662;
+  var a12663;
+  var a12664;
+  var a12665;
+  var a12666;
+  var a12667;
+  var a12668;
+  var a12669;
+  var a12670;
+  var a12671;
+  var a12672;
+  var a12673;
+  var a12674;
+  var a12675;
+  var a12676;
+  var a12677;
+  var a12678;
+  var a12679;
+  var a12680;
+  var a12681;
+  var a12682;
+  var a12683;
+  var a12684;
+  var a12685;
+  var a12686;
+  var a12687;
+  var a12688;
+  var a12689;
+  var a12690;
+  var a12691;
+  var a12692;
+  var a12693;
+  var a12694;
+  var a12695;
+  var a12696;
+  var a12697;
+  var a12698;
+  var a12699;
+  var a12700;
+  var a12701;
+  var a12702;
+  var a12703;
+  var a12704;
+  var a12705;
+  var a12706;
+  var a12707;
+  var a12708;
+  var a12709;
+  var a12710;
+  var a12711;
+  var a12712;
+  var a12713;
+  var a12714;
+  var a12715;
+  var a12716;
+  var a12717;
+  var a12718;
+  var a12719;
+  var a12720;
+  var a12721;
+  var a12722;
+  var a12723;
+  var a12724;
+  var a12725;
+  var a12726;
+  var a12727;
+  var a12728;
+  var a12729;
+  var a12730;
+  var a12731;
+  var a12732;
+  var a12733;
+  var a12734;
+  var a12735;
+  var a12736;
+  var a12737;
+  var a12738;
+  var a12739;
+  var a12740;
+  var a12741;
+  var a12742;
+  var a12743;
+  var a12744;
+  var a12745;
+  var a12746;
+  var a12747;
+  var a12748;
+  var a12749;
+  var a12750;
+  var a12751;
+  var a12752;
+  var a12753;
+  var a12754;
+  var a12755;
+  var a12756;
+  var a12757;
+  var a12758;
+  var a12759;
+  var a12760;
+  var a12761;
+  var a12762;
+  var a12763;
+  var a12764;
+  var a12765;
+  var a12766;
+  var a12767;
+  var a12768;
+  var a12769;
+  var a12770;
+  var a12771;
+  var a12772;
+  var a12773;
+  var a12774;
+  var a12775;
+  var a12776;
+  var a12777;
+  var a12778;
+  var a12779;
+  var a12780;
+  var a12781;
+  var a12782;
+  var a12783;
+  var a12784;
+  var a12785;
+  var a12786;
+  var a12787;
+  var a12788;
+  var a12789;
+  var a12790;
+  var a12791;
+  var a12792;
+  var a12793;
+  var a12794;
+  var a12795;
+  var a12796;
+  var a12797;
+  var a12798;
+  var a12799;
+  var a12800;
+  var a12801;
+  var a12802;
+  var a12803;
+  var a12804;
+  var a12805;
+  var a12806;
+  var a12807;
+  var a12808;
+  var a12809;
+  var a12810;
+  var a12811;
+  var a12812;
+  var a12813;
+  var a12814;
+  var a12815;
+  var a12816;
+  var a12817;
+  var a12818;
+  var a12819;
+  var a12820;
+  var a12821;
+  var a12822;
+  var a12823;
+  var a12824;
+  var a12825;
+  var a12826;
+  var a12827;
+  var a12828;
+  var a12829;
+  var a12830;
+  var a12831;
+  var a12832;
+  var a12833;
+  var a12834;
+  var a12835;
+  var a12836;
+  var a12837;
+  var a12838;
+  var a12839;
+  var a12840;
+  var a12841;
+  var a12842;
+  var a12843;
+  var a12844;
+  var a12845;
+  var a12846;
+  var a12847;
+  var a12848;
+  var a12849;
+  var a12850;
+  var a12851;
+  var a12852;
+  var a12853;
+  var a12854;
+  var a12855;
+  var a12856;
+  var a12857;
+  var a12858;
+  var a12859;
+  var a12860;
+  var a12861;
+  var a12862;
+  var a12863;
+  var a12864;
+  var a12865;
+  var a12866;
+  var a12867;
+  var a12868;
+  var a12869;
+  var a12870;
+  var a12871;
+  var a12872;
+  var a12873;
+  var a12874;
+  var a12875;
+  var a12876;
+  var a12877;
+  var a12878;
+  var a12879;
+  var a12880;
+  var a12881;
+  var a12882;
+  var a12883;
+  var a12884;
+  var a12885;
+  var a12886;
+  var a12887;
+  var a12888;
+  var a12889;
+  var a12890;
+  var a12891;
+  var a12892;
+  var a12893;
+  var a12894;
+  var a12895;
+  var a12896;
+  var a12897;
+  var a12898;
+  var a12899;
+  var a12900;
+  var a12901;
+  var a12902;
+  var a12903;
+  var a12904;
+  var a12905;
+  var a12906;
+  var a12907;
+  var a12908;
+  var a12909;
+  var a12910;
+  var a12911;
+  var a12912;
+  var a12913;
+  var a12914;
+  var a12915;
+  var a12916;
+  var a12917;
+  var a12918;
+  var a12919;
+  var a12920;
+  var a12921;
+  var a12922;
+  var a12923;
+  var a12924;
+  var a12925;
+  var a12926;
+  var a12927;
+  var a12928;
+  var a12929;
+  var a12930;
+  var a12931;
+  var a12932;
+  var a12933;
+  var a12934;
+  var a12935;
+  var a12936;
+  var a12937;
+  var a12938;
+  var a12939;
+  var a12940;
+  var a12941;
+  var a12942;
+  var a12943;
+  var a12944;
+  var a12945;
+  var a12946;
+  var a12947;
+  var a12948;
+  var a12949;
+  var a12950;
+  var a12951;
+  var a12952;
+  var a12953;
+  var a12954;
+  var a12955;
+  var a12956;
+  var a12957;
+  var a12958;
+  var a12959;
+  var a12960;
+  var a12961;
+  var a12962;
+  var a12963;
+  var a12964;
+  var a12965;
+  var a12966;
+  var a12967;
+  var a12968;
+  var a12969;
+  var a12970;
+  var a12971;
+  var a12972;
+  var a12973;
+  var a12974;
+  var a12975;
+  var a12976;
+  var a12977;
+  var a12978;
+  var a12979;
+  var a12980;
+  var a12981;
+  var a12982;
+  var a12983;
+  var a12984;
+  var a12985;
+  var a12986;
+  var a12987;
+  var a12988;
+  var a12989;
+  var a12990;
+  var a12991;
+  var a12992;
+  var a12993;
+  var a12994;
+  var a12995;
+  var a12996;
+  var a12997;
+  var a12998;
+  var a12999;
+  var a13000;
+  var a13001;
+  var a13002;
+  var a13003;
+  var a13004;
+  var a13005;
+  var a13006;
+  var a13007;
+  var a13008;
+  var a13009;
+  var a13010;
+  var a13011;
+  var a13012;
+  var a13013;
+  var a13014;
+  var a13015;
+  var a13016;
+  var a13017;
+  var a13018;
+  var a13019;
+  var a13020;
+  var a13021;
+  var a13022;
+  var a13023;
+  var a13024;
+  var a13025;
+  var a13026;
+  var a13027;
+  var a13028;
+  var a13029;
+  var a13030;
+  var a13031;
+  var a13032;
+  var a13033;
+  var a13034;
+  var a13035;
+  var a13036;
+  var a13037;
+  var a13038;
+  var a13039;
+  var a13040;
+  var a13041;
+  var a13042;
+  var a13043;
+  var a13044;
+  var a13045;
+  var a13046;
+  var a13047;
+  var a13048;
+  var a13049;
+  var a13050;
+  var a13051;
+  var a13052;
+  var a13053;
+  var a13054;
+  var a13055;
+  var a13056;
+  var a13057;
+  var a13058;
+  var a13059;
+  var a13060;
+  var a13061;
+  var a13062;
+  var a13063;
+  var a13064;
+  var a13065;
+  var a13066;
+  var a13067;
+  var a13068;
+  var a13069;
+  var a13070;
+  var a13071;
+  var a13072;
+  var a13073;
+  var a13074;
+  var a13075;
+  var a13076;
+  var a13077;
+  var a13078;
+  var a13079;
+  var a13080;
+  var a13081;
+  var a13082;
+  var a13083;
+  var a13084;
+  var a13085;
+  var a13086;
+  var a13087;
+  var a13088;
+  var a13089;
+  var a13090;
+  var a13091;
+  var a13092;
+  var a13093;
+  var a13094;
+  var a13095;
+  var a13096;
+  var a13097;
+  var a13098;
+  var a13099;
+  var a13100;
+  var a13101;
+  var a13102;
+  var a13103;
+  var a13104;
+  var a13105;
+  var a13106;
+  var a13107;
+  var a13108;
+  var a13109;
+  var a13110;
+  var a13111;
+  var a13112;
+  var a13113;
+  var a13114;
+  var a13115;
+  var a13116;
+  var a13117;
+  var a13118;
+  var a13119;
+  var a13120;
+  var a13121;
+  var a13122;
+  var a13123;
+  var a13124;
+  var a13125;
+  var a13126;
+  var a13127;
+  var a13128;
+  var a13129;
+  var a13130;
+  var a13131;
+  var a13132;
+  var a13133;
+  var a13134;
+  var a13135;
+  var a13136;
+  var a13137;
+  var a13138;
+  var a13139;
+  var a13140;
+  var a13141;
+  var a13142;
+  var a13143;
+  var a13144;
+  var a13145;
+  var a13146;
+  var a13147;
+  var a13148;
+  var a13149;
+  var a13150;
+  var a13151;
+  var a13152;
+  var a13153;
+  var a13154;
+  var a13155;
+  var a13156;
+  var a13157;
+  var a13158;
+  var a13159;
+  var a13160;
+  var a13161;
+  var a13162;
+  var a13163;
+  var a13164;
+  var a13165;
+  var a13166;
+  var a13167;
+  var a13168;
+  var a13169;
+  var a13170;
+  var a13171;
+  var a13172;
+  var a13173;
+  var a13174;
+  var a13175;
+  var a13176;
+  var a13177;
+  var a13178;
+  var a13179;
+  var a13180;
+  var a13181;
+  var a13182;
+  var a13183;
+  var a13184;
+  var a13185;
+  var a13186;
+  var a13187;
+  var a13188;
+  var a13189;
+  var a13190;
+  var a13191;
+  var a13192;
+  var a13193;
+  var a13194;
+  var a13195;
+  var a13196;
+  var a13197;
+  var a13198;
+  var a13199;
+  var a13200;
+  var a13201;
+  var a13202;
+  var a13203;
+  var a13204;
+  var a13205;
+  var a13206;
+  var a13207;
+  var a13208;
+  var a13209;
+  var a13210;
+  var a13211;
+  var a13212;
+  var a13213;
+  var a13214;
+  var a13215;
+  var a13216;
+  var a13217;
+  var a13218;
+  var a13219;
+  var a13220;
+  var a13221;
+  var a13222;
+  var a13223;
+  var a13224;
+  var a13225;
+  var a13226;
+  var a13227;
+  var a13228;
+  var a13229;
+  var a13230;
+  var a13231;
+  var a13232;
+  var a13233;
+  var a13234;
+  var a13235;
+  var a13236;
+  var a13237;
+  var a13238;
+  var a13239;
+  var a13240;
+  var a13241;
+  var a13242;
+  var a13243;
+  var a13244;
+  var a13245;
+  var a13246;
+  var a13247;
+  var a13248;
+  var a13249;
+  var a13250;
+  var a13251;
+  var a13252;
+  var a13253;
+  var a13254;
+  var a13255;
+  var a13256;
+  var a13257;
+  var a13258;
+  var a13259;
+  var a13260;
+  var a13261;
+  var a13262;
+  var a13263;
+  var a13264;
+  var a13265;
+  var a13266;
+  var a13267;
+  var a13268;
+  var a13269;
+  var a13270;
+  var a13271;
+  var a13272;
+  var a13273;
+  var a13274;
+  var a13275;
+  var a13276;
+  var a13277;
+  var a13278;
+  var a13279;
+  var a13280;
+  var a13281;
+  var a13282;
+  var a13283;
+  var a13284;
+  var a13285;
+  var a13286;
+  var a13287;
+  var a13288;
+  var a13289;
+  var a13290;
+  var a13291;
+  var a13292;
+  var a13293;
+  var a13294;
+  var a13295;
+  var a13296;
+  var a13297;
+  var a13298;
+  var a13299;
+  var a13300;
+  var a13301;
+  var a13302;
+  var a13303;
+  var a13304;
+  var a13305;
+  var a13306;
+  var a13307;
+  var a13308;
+  var a13309;
+  var a13310;
+  var a13311;
+  var a13312;
+  var a13313;
+  var a13314;
+  var a13315;
+  var a13316;
+  var a13317;
+  var a13318;
+  var a13319;
+  var a13320;
+  var a13321;
+  var a13322;
+  var a13323;
+  var a13324;
+  var a13325;
+  var a13326;
+  var a13327;
+  var a13328;
+  var a13329;
+  var a13330;
+  var a13331;
+  var a13332;
+  var a13333;
+  var a13334;
+  var a13335;
+  var a13336;
+  var a13337;
+  var a13338;
+  var a13339;
+  var a13340;
+  var a13341;
+  var a13342;
+  var a13343;
+  var a13344;
+  var a13345;
+  var a13346;
+  var a13347;
+  var a13348;
+  var a13349;
+  var a13350;
+  var a13351;
+  var a13352;
+  var a13353;
+  var a13354;
+  var a13355;
+  var a13356;
+  var a13357;
+  var a13358;
+  var a13359;
+  var a13360;
+  var a13361;
+  var a13362;
+  var a13363;
+  var a13364;
+  var a13365;
+  var a13366;
+  var a13367;
+  var a13368;
+  var a13369;
+  var a13370;
+  var a13371;
+  var a13372;
+  var a13373;
+  var a13374;
+  var a13375;
+  var a13376;
+  var a13377;
+  var a13378;
+  var a13379;
+  var a13380;
+  var a13381;
+  var a13382;
+  var a13383;
+  var a13384;
+  var a13385;
+  var a13386;
+  var a13387;
+  var a13388;
+  var a13389;
+  var a13390;
+  var a13391;
+  var a13392;
+  var a13393;
+  var a13394;
+  var a13395;
+  var a13396;
+  var a13397;
+  var a13398;
+  var a13399;
+  var a13400;
+  var a13401;
+  var a13402;
+  var a13403;
+  var a13404;
+  var a13405;
+  var a13406;
+  var a13407;
+  var a13408;
+  var a13409;
+  var a13410;
+  var a13411;
+  var a13412;
+  var a13413;
+  var a13414;
+  var a13415;
+  var a13416;
+  var a13417;
+  var a13418;
+  var a13419;
+  var a13420;
+  var a13421;
+  var a13422;
+  var a13423;
+  var a13424;
+  var a13425;
+  var a13426;
+  var a13427;
+  var a13428;
+  var a13429;
+  var a13430;
+  var a13431;
+  var a13432;
+  var a13433;
+  var a13434;
+  var a13435;
+  var a13436;
+  var a13437;
+  var a13438;
+  var a13439;
+  var a13440;
+  var a13441;
+  var a13442;
+  var a13443;
+  var a13444;
+  var a13445;
+  var a13446;
+  var a13447;
+  var a13448;
+  var a13449;
+  var a13450;
+  var a13451;
+  var a13452;
+  var a13453;
+  var a13454;
+  var a13455;
+  var a13456;
+  var a13457;
+  var a13458;
+  var a13459;
+  var a13460;
+  var a13461;
+  var a13462;
+  var a13463;
+  var a13464;
+  var a13465;
+  var a13466;
+  var a13467;
+  var a13468;
+  var a13469;
+  var a13470;
+  var a13471;
+  var a13472;
+  var a13473;
+  var a13474;
+  var a13475;
+  var a13476;
+  var a13477;
+  var a13478;
+  var a13479;
+  var a13480;
+  var a13481;
+  var a13482;
+  var a13483;
+  var a13484;
+  var a13485;
+  var a13486;
+  var a13487;
+  var a13488;
+  var a13489;
+  var a13490;
+  var a13491;
+  var a13492;
+  var a13493;
+  var a13494;
+  var a13495;
+  var a13496;
+  var a13497;
+  var a13498;
+  var a13499;
+  var a13500;
+  var a13501;
+  var a13502;
+  var a13503;
+  var a13504;
+  var a13505;
+  var a13506;
+  var a13507;
+  var a13508;
+  var a13509;
+  var a13510;
+  var a13511;
+  var a13512;
+  var a13513;
+  var a13514;
+  var a13515;
+  var a13516;
+  var a13517;
+  var a13518;
+  var a13519;
+  var a13520;
+  var a13521;
+  var a13522;
+  var a13523;
+  var a13524;
+  var a13525;
+  var a13526;
+  var a13527;
+  var a13528;
+  var a13529;
+  var a13530;
+  var a13531;
+  var a13532;
+  var a13533;
+  var a13534;
+  var a13535;
+  var a13536;
+  var a13537;
+  var a13538;
+  var a13539;
+  var a13540;
+  var a13541;
+  var a13542;
+  var a13543;
+  var a13544;
+  var a13545;
+  var a13546;
+  var a13547;
+  var a13548;
+  var a13549;
+  var a13550;
+  var a13551;
+  var a13552;
+  var a13553;
+  var a13554;
+  var a13555;
+  var a13556;
+  var a13557;
+  var a13558;
+  var a13559;
+  var a13560;
+  var a13561;
+  var a13562;
+  var a13563;
+  var a13564;
+  var a13565;
+  var a13566;
+  var a13567;
+  var a13568;
+  var a13569;
+  var a13570;
+  var a13571;
+  var a13572;
+  var a13573;
+  var a13574;
+  var a13575;
+  var a13576;
+  var a13577;
+  var a13578;
+  var a13579;
+  var a13580;
+  var a13581;
+  var a13582;
+  var a13583;
+  var a13584;
+  var a13585;
+  var a13586;
+  var a13587;
+  var a13588;
+  var a13589;
+  var a13590;
+  var a13591;
+  var a13592;
+  var a13593;
+  var a13594;
+  var a13595;
+  var a13596;
+  var a13597;
+  var a13598;
+  var a13599;
+  var a13600;
+  var a13601;
+  var a13602;
+  var a13603;
+  var a13604;
+  var a13605;
+  var a13606;
+  var a13607;
+  var a13608;
+  var a13609;
+  var a13610;
+  var a13611;
+  var a13612;
+  var a13613;
+  var a13614;
+  var a13615;
+  var a13616;
+  var a13617;
+  var a13618;
+  var a13619;
+  var a13620;
+  var a13621;
+  var a13622;
+  var a13623;
+  var a13624;
+  var a13625;
+  var a13626;
+  var a13627;
+  var a13628;
+  var a13629;
+  var a13630;
+  var a13631;
+  var a13632;
+  var a13633;
+  var a13634;
+  var a13635;
+  var a13636;
+  var a13637;
+  var a13638;
+  var a13639;
+  var a13640;
+  var a13641;
+  var a13642;
+  var a13643;
+  var a13644;
+  var a13645;
+  var a13646;
+  var a13647;
+  var a13648;
+  var a13649;
+  var a13650;
+  var a13651;
+  var a13652;
+  var a13653;
+  var a13654;
+  var a13655;
+  var a13656;
+  var a13657;
+  var a13658;
+  var a13659;
+  var a13660;
+  var a13661;
+  var a13662;
+  var a13663;
+  var a13664;
+  var a13665;
+  var a13666;
+  var a13667;
+  var a13668;
+  var a13669;
+  var a13670;
+  var a13671;
+  var a13672;
+  var a13673;
+  var a13674;
+  var a13675;
+  var a13676;
+  var a13677;
+  var a13678;
+  var a13679;
+  var a13680;
+  var a13681;
+  var a13682;
+  var a13683;
+  var a13684;
+  var a13685;
+  var a13686;
+  var a13687;
+  var a13688;
+  var a13689;
+  var a13690;
+  var a13691;
+  var a13692;
+  var a13693;
+  var a13694;
+  var a13695;
+  var a13696;
+  var a13697;
+  var a13698;
+  var a13699;
+  var a13700;
+  var a13701;
+  var a13702;
+  var a13703;
+  var a13704;
+  var a13705;
+  var a13706;
+  var a13707;
+  var a13708;
+  var a13709;
+  var a13710;
+  var a13711;
+  var a13712;
+  var a13713;
+  var a13714;
+  var a13715;
+  var a13716;
+  var a13717;
+  var a13718;
+  var a13719;
+  var a13720;
+  var a13721;
+  var a13722;
+  var a13723;
+  var a13724;
+  var a13725;
+  var a13726;
+  var a13727;
+  var a13728;
+  var a13729;
+  var a13730;
+  var a13731;
+  var a13732;
+  var a13733;
+  var a13734;
+  var a13735;
+  var a13736;
+  var a13737;
+  var a13738;
+  var a13739;
+  var a13740;
+  var a13741;
+  var a13742;
+  var a13743;
+  var a13744;
+  var a13745;
+  var a13746;
+  var a13747;
+  var a13748;
+  var a13749;
+  var a13750;
+  var a13751;
+  var a13752;
+  var a13753;
+  var a13754;
+  var a13755;
+  var a13756;
+  var a13757;
+  var a13758;
+  var a13759;
+  var a13760;
+  var a13761;
+  var a13762;
+  var a13763;
+  var a13764;
+  var a13765;
+  var a13766;
+  var a13767;
+  var a13768;
+  var a13769;
+  var a13770;
+  var a13771;
+  var a13772;
+  var a13773;
+  var a13774;
+  var a13775;
+  var a13776;
+  var a13777;
+  var a13778;
+  var a13779;
+  var a13780;
+  var a13781;
+  var a13782;
+  var a13783;
+  var a13784;
+  var a13785;
+  var a13786;
+  var a13787;
+  var a13788;
+  var a13789;
+  var a13790;
+  var a13791;
+  var a13792;
+  var a13793;
+  var a13794;
+  var a13795;
+  var a13796;
+  var a13797;
+  var a13798;
+  var a13799;
+  var a13800;
+  var a13801;
+  var a13802;
+  var a13803;
+  var a13804;
+  var a13805;
+  var a13806;
+  var a13807;
+  var a13808;
+  var a13809;
+  var a13810;
+  var a13811;
+  var a13812;
+  var a13813;
+  var a13814;
+  var a13815;
+  var a13816;
+  var a13817;
+  var a13818;
+  var a13819;
+  var a13820;
+  var a13821;
+  var a13822;
+  var a13823;
+  var a13824;
+  var a13825;
+  var a13826;
+  var a13827;
+  var a13828;
+  var a13829;
+  var a13830;
+  var a13831;
+  var a13832;
+  var a13833;
+  var a13834;
+  var a13835;
+  var a13836;
+  var a13837;
+  var a13838;
+  var a13839;
+  var a13840;
+  var a13841;
+  var a13842;
+  var a13843;
+  var a13844;
+  var a13845;
+  var a13846;
+  var a13847;
+  var a13848;
+  var a13849;
+  var a13850;
+  var a13851;
+  var a13852;
+  var a13853;
+  var a13854;
+  var a13855;
+  var a13856;
+  var a13857;
+  var a13858;
+  var a13859;
+  var a13860;
+  var a13861;
+  var a13862;
+  var a13863;
+  var a13864;
+  var a13865;
+  var a13866;
+  var a13867;
+  var a13868;
+  var a13869;
+  var a13870;
+  var a13871;
+  var a13872;
+  var a13873;
+  var a13874;
+  var a13875;
+  var a13876;
+  var a13877;
+  var a13878;
+  var a13879;
+  var a13880;
+  var a13881;
+  var a13882;
+  var a13883;
+  var a13884;
+  var a13885;
+  var a13886;
+  var a13887;
+  var a13888;
+  var a13889;
+  var a13890;
+  var a13891;
+  var a13892;
+  var a13893;
+  var a13894;
+  var a13895;
+  var a13896;
+  var a13897;
+  var a13898;
+  var a13899;
+  var a13900;
+  var a13901;
+  var a13902;
+  var a13903;
+  var a13904;
+  var a13905;
+  var a13906;
+  var a13907;
+  var a13908;
+  var a13909;
+  var a13910;
+  var a13911;
+  var a13912;
+  var a13913;
+  var a13914;
+  var a13915;
+  var a13916;
+  var a13917;
+  var a13918;
+  var a13919;
+  var a13920;
+  var a13921;
+  var a13922;
+  var a13923;
+  var a13924;
+  var a13925;
+  var a13926;
+  var a13927;
+  var a13928;
+  var a13929;
+  var a13930;
+  var a13931;
+  var a13932;
+  var a13933;
+  var a13934;
+  var a13935;
+  var a13936;
+  var a13937;
+  var a13938;
+  var a13939;
+  var a13940;
+  var a13941;
+  var a13942;
+  var a13943;
+  var a13944;
+  var a13945;
+  var a13946;
+  var a13947;
+  var a13948;
+  var a13949;
+  var a13950;
+  var a13951;
+  var a13952;
+  var a13953;
+  var a13954;
+  var a13955;
+  var a13956;
+  var a13957;
+  var a13958;
+  var a13959;
+  var a13960;
+  var a13961;
+  var a13962;
+  var a13963;
+  var a13964;
+  var a13965;
+  var a13966;
+  var a13967;
+  var a13968;
+  var a13969;
+  var a13970;
+  var a13971;
+  var a13972;
+  var a13973;
+  var a13974;
+  var a13975;
+  var a13976;
+  var a13977;
+  var a13978;
+  var a13979;
+  var a13980;
+  var a13981;
+  var a13982;
+  var a13983;
+  var a13984;
+  var a13985;
+  var a13986;
+  var a13987;
+  var a13988;
+  var a13989;
+  var a13990;
+  var a13991;
+  var a13992;
+  var a13993;
+  var a13994;
+  var a13995;
+  var a13996;
+  var a13997;
+  var a13998;
+  var a13999;
+  var a14000;
+  var a14001;
+  var a14002;
+  var a14003;
+  var a14004;
+  var a14005;
+  var a14006;
+  var a14007;
+  var a14008;
+  var a14009;
+  var a14010;
+  var a14011;
+  var a14012;
+  var a14013;
+  var a14014;
+  var a14015;
+  var a14016;
+  var a14017;
+  var a14018;
+  var a14019;
+  var a14020;
+  var a14021;
+  var a14022;
+  var a14023;
+  var a14024;
+  var a14025;
+  var a14026;
+  var a14027;
+  var a14028;
+  var a14029;
+  var a14030;
+  var a14031;
+  var a14032;
+  var a14033;
+  var a14034;
+  var a14035;
+  var a14036;
+  var a14037;
+  var a14038;
+  var a14039;
+  var a14040;
+  var a14041;
+  var a14042;
+  var a14043;
+  var a14044;
+  var a14045;
+  var a14046;
+  var a14047;
+  var a14048;
+  var a14049;
+  var a14050;
+  var a14051;
+  var a14052;
+  var a14053;
+  var a14054;
+  var a14055;
+  var a14056;
+  var a14057;
+  var a14058;
+  var a14059;
+  var a14060;
+  var a14061;
+  var a14062;
+  var a14063;
+  var a14064;
+  var a14065;
+  var a14066;
+  var a14067;
+  var a14068;
+  var a14069;
+  var a14070;
+  var a14071;
+  var a14072;
+  var a14073;
+  var a14074;
+  var a14075;
+  var a14076;
+  var a14077;
+  var a14078;
+  var a14079;
+  var a14080;
+  var a14081;
+  var a14082;
+  var a14083;
+  var a14084;
+  var a14085;
+  var a14086;
+  var a14087;
+  var a14088;
+  var a14089;
+  var a14090;
+  var a14091;
+  var a14092;
+  var a14093;
+  var a14094;
+  var a14095;
+  var a14096;
+  var a14097;
+  var a14098;
+  var a14099;
+  var a14100;
+  var a14101;
+  var a14102;
+  var a14103;
+  var a14104;
+  var a14105;
+  var a14106;
+  var a14107;
+  var a14108;
+  var a14109;
+  var a14110;
+  var a14111;
+  var a14112;
+  var a14113;
+  var a14114;
+  var a14115;
+  var a14116;
+  var a14117;
+  var a14118;
+  var a14119;
+  var a14120;
+  var a14121;
+  var a14122;
+  var a14123;
+  var a14124;
+  var a14125;
+  var a14126;
+  var a14127;
+  var a14128;
+  var a14129;
+  var a14130;
+  var a14131;
+  var a14132;
+  var a14133;
+  var a14134;
+  var a14135;
+  var a14136;
+  var a14137;
+  var a14138;
+  var a14139;
+  var a14140;
+  var a14141;
+  var a14142;
+  var a14143;
+  var a14144;
+  var a14145;
+  var a14146;
+  var a14147;
+  var a14148;
+  var a14149;
+  var a14150;
+  var a14151;
+  var a14152;
+  var a14153;
+  var a14154;
+  var a14155;
+  var a14156;
+  var a14157;
+  var a14158;
+  var a14159;
+  var a14160;
+  var a14161;
+  var a14162;
+  var a14163;
+  var a14164;
+  var a14165;
+  var a14166;
+  var a14167;
+  var a14168;
+  var a14169;
+  var a14170;
+  var a14171;
+  var a14172;
+  var a14173;
+  var a14174;
+  var a14175;
+  var a14176;
+  var a14177;
+  var a14178;
+  var a14179;
+  var a14180;
+  var a14181;
+  var a14182;
+  var a14183;
+  var a14184;
+  var a14185;
+  var a14186;
+  var a14187;
+  var a14188;
+  var a14189;
+  var a14190;
+  var a14191;
+  var a14192;
+  var a14193;
+  var a14194;
+  var a14195;
+  var a14196;
+  var a14197;
+  var a14198;
+  var a14199;
+  var a14200;
+  var a14201;
+  var a14202;
+  var a14203;
+  var a14204;
+  var a14205;
+  var a14206;
+  var a14207;
+  var a14208;
+  var a14209;
+  var a14210;
+  var a14211;
+  var a14212;
+  var a14213;
+  var a14214;
+  var a14215;
+  var a14216;
+  var a14217;
+  var a14218;
+  var a14219;
+  var a14220;
+  var a14221;
+  var a14222;
+  var a14223;
+  var a14224;
+  var a14225;
+  var a14226;
+  var a14227;
+  var a14228;
+  var a14229;
+  var a14230;
+  var a14231;
+  var a14232;
+  var a14233;
+  var a14234;
+  var a14235;
+  var a14236;
+  var a14237;
+  var a14238;
+  var a14239;
+  var a14240;
+  var a14241;
+  var a14242;
+  var a14243;
+  var a14244;
+  var a14245;
+  var a14246;
+  var a14247;
+  var a14248;
+  var a14249;
+  var a14250;
+  var a14251;
+  var a14252;
+  var a14253;
+  var a14254;
+  var a14255;
+  var a14256;
+  var a14257;
+  var a14258;
+  var a14259;
+  var a14260;
+  var a14261;
+  var a14262;
+  var a14263;
+  var a14264;
+  var a14265;
+  var a14266;
+  var a14267;
+  var a14268;
+  var a14269;
+  var a14270;
+  var a14271;
+  var a14272;
+  var a14273;
+  var a14274;
+  var a14275;
+  var a14276;
+  var a14277;
+  var a14278;
+  var a14279;
+  var a14280;
+  var a14281;
+  var a14282;
+  var a14283;
+  var a14284;
+  var a14285;
+  var a14286;
+  var a14287;
+  var a14288;
+  var a14289;
+  var a14290;
+  var a14291;
+  var a14292;
+  var a14293;
+  var a14294;
+  var a14295;
+  var a14296;
+  var a14297;
+  var a14298;
+  var a14299;
+  var a14300;
+  var a14301;
+  var a14302;
+  var a14303;
+  var a14304;
+  var a14305;
+  var a14306;
+  var a14307;
+  var a14308;
+  var a14309;
+  var a14310;
+  var a14311;
+  var a14312;
+  var a14313;
+  var a14314;
+  var a14315;
+  var a14316;
+  var a14317;
+  var a14318;
+  var a14319;
+  var a14320;
+  var a14321;
+  var a14322;
+  var a14323;
+  var a14324;
+  var a14325;
+  var a14326;
+  var a14327;
+  var a14328;
+  var a14329;
+  var a14330;
+  var a14331;
+  var a14332;
+  var a14333;
+  var a14334;
+  var a14335;
+  var a14336;
+  var a14337;
+  var a14338;
+  var a14339;
+  var a14340;
+  var a14341;
+  var a14342;
+  var a14343;
+  var a14344;
+  var a14345;
+  var a14346;
+  var a14347;
+  var a14348;
+  var a14349;
+  var a14350;
+  var a14351;
+  var a14352;
+  var a14353;
+  var a14354;
+  var a14355;
+  var a14356;
+  var a14357;
+  var a14358;
+  var a14359;
+  var a14360;
+  var a14361;
+  var a14362;
+  var a14363;
+  var a14364;
+  var a14365;
+  var a14366;
+  var a14367;
+  var a14368;
+  var a14369;
+  var a14370;
+  var a14371;
+  var a14372;
+  var a14373;
+  var a14374;
+  var a14375;
+  var a14376;
+  var a14377;
+  var a14378;
+  var a14379;
+  var a14380;
+  var a14381;
+  var a14382;
+  var a14383;
+  var a14384;
+  var a14385;
+  var a14386;
+  var a14387;
+  var a14388;
+  var a14389;
+  var a14390;
+  var a14391;
+  var a14392;
+  var a14393;
+  var a14394;
+  var a14395;
+  var a14396;
+  var a14397;
+  var a14398;
+  var a14399;
+  var a14400;
+  var a14401;
+  var a14402;
+  var a14403;
+  var a14404;
+  var a14405;
+  var a14406;
+  var a14407;
+  var a14408;
+  var a14409;
+  var a14410;
+  var a14411;
+  var a14412;
+  var a14413;
+  var a14414;
+  var a14415;
+  var a14416;
+  var a14417;
+  var a14418;
+  var a14419;
+  var a14420;
+  var a14421;
+  var a14422;
+  var a14423;
+  var a14424;
+  var a14425;
+  var a14426;
+  var a14427;
+  var a14428;
+  var a14429;
+  var a14430;
+  var a14431;
+  var a14432;
+  var a14433;
+  var a14434;
+  var a14435;
+  var a14436;
+  var a14437;
+  var a14438;
+  var a14439;
+  var a14440;
+  var a14441;
+  var a14442;
+  var a14443;
+  var a14444;
+  var a14445;
+  var a14446;
+  var a14447;
+  var a14448;
+  var a14449;
+  var a14450;
+  var a14451;
+  var a14452;
+  var a14453;
+  var a14454;
+  var a14455;
+  var a14456;
+  var a14457;
+  var a14458;
+  var a14459;
+  var a14460;
+  var a14461;
+  var a14462;
+  var a14463;
+  var a14464;
+  var a14465;
+  var a14466;
+  var a14467;
+  var a14468;
+  var a14469;
+  var a14470;
+  var a14471;
+  var a14472;
+  var a14473;
+  var a14474;
+  var a14475;
+  var a14476;
+  var a14477;
+  var a14478;
+  var a14479;
+  var a14480;
+  var a14481;
+  var a14482;
+  var a14483;
+  var a14484;
+  var a14485;
+  var a14486;
+  var a14487;
+  var a14488;
+  var a14489;
+  var a14490;
+  var a14491;
+  var a14492;
+  var a14493;
+  var a14494;
+  var a14495;
+  var a14496;
+  var a14497;
+  var a14498;
+  var a14499;
+  var a14500;
+  var a14501;
+  var a14502;
+  var a14503;
+  var a14504;
+  var a14505;
+  var a14506;
+  var a14507;
+  var a14508;
+  var a14509;
+  var a14510;
+  var a14511;
+  var a14512;
+  var a14513;
+  var a14514;
+  var a14515;
+  var a14516;
+  var a14517;
+  var a14518;
+  var a14519;
+  var a14520;
+  var a14521;
+  var a14522;
+  var a14523;
+  var a14524;
+  var a14525;
+  var a14526;
+  var a14527;
+  var a14528;
+  var a14529;
+  var a14530;
+  var a14531;
+  var a14532;
+  var a14533;
+  var a14534;
+  var a14535;
+  var a14536;
+  var a14537;
+  var a14538;
+  var a14539;
+  var a14540;
+  var a14541;
+  var a14542;
+  var a14543;
+  var a14544;
+  var a14545;
+  var a14546;
+  var a14547;
+  var a14548;
+  var a14549;
+  var a14550;
+  var a14551;
+  var a14552;
+  var a14553;
+  var a14554;
+  var a14555;
+  var a14556;
+  var a14557;
+  var a14558;
+  var a14559;
+  var a14560;
+  var a14561;
+  var a14562;
+  var a14563;
+  var a14564;
+  var a14565;
+  var a14566;
+  var a14567;
+  var a14568;
+  var a14569;
+  var a14570;
+  var a14571;
+  var a14572;
+  var a14573;
+  var a14574;
+  var a14575;
+  var a14576;
+  var a14577;
+  var a14578;
+  var a14579;
+  var a14580;
+  var a14581;
+  var a14582;
+  var a14583;
+  var a14584;
+  var a14585;
+  var a14586;
+  var a14587;
+  var a14588;
+  var a14589;
+  var a14590;
+  var a14591;
+  var a14592;
+  var a14593;
+  var a14594;
+  var a14595;
+  var a14596;
+  var a14597;
+  var a14598;
+  var a14599;
+  var a14600;
+  var a14601;
+  var a14602;
+  var a14603;
+  var a14604;
+  var a14605;
+  var a14606;
+  var a14607;
+  var a14608;
+  var a14609;
+  var a14610;
+  var a14611;
+  var a14612;
+  var a14613;
+  var a14614;
+  var a14615;
+  var a14616;
+  var a14617;
+  var a14618;
+  var a14619;
+  var a14620;
+  var a14621;
+  var a14622;
+  var a14623;
+  var a14624;
+  var a14625;
+  var a14626;
+  var a14627;
+  var a14628;
+  var a14629;
+  var a14630;
+  var a14631;
+  var a14632;
+  var a14633;
+  var a14634;
+  var a14635;
+  var a14636;
+  var a14637;
+  var a14638;
+  var a14639;
+  var a14640;
+  var a14641;
+  var a14642;
+  var a14643;
+  var a14644;
+  var a14645;
+  var a14646;
+  var a14647;
+  var a14648;
+  var a14649;
+  var a14650;
+  var a14651;
+  var a14652;
+  var a14653;
+  var a14654;
+  var a14655;
+  var a14656;
+  var a14657;
+  var a14658;
+  var a14659;
+  var a14660;
+  var a14661;
+  var a14662;
+  var a14663;
+  var a14664;
+  var a14665;
+  var a14666;
+  var a14667;
+  var a14668;
+  var a14669;
+  var a14670;
+  var a14671;
+  var a14672;
+  var a14673;
+  var a14674;
+  var a14675;
+  var a14676;
+  var a14677;
+  var a14678;
+  var a14679;
+  var a14680;
+  var a14681;
+  var a14682;
+  var a14683;
+  var a14684;
+  var a14685;
+  var a14686;
+  var a14687;
+  var a14688;
+  var a14689;
+  var a14690;
+  var a14691;
+  var a14692;
+  var a14693;
+  var a14694;
+  var a14695;
+  var a14696;
+  var a14697;
+  var a14698;
+  var a14699;
+  var a14700;
+  var a14701;
+  var a14702;
+  var a14703;
+  var a14704;
+  var a14705;
+  var a14706;
+  var a14707;
+  var a14708;
+  var a14709;
+  var a14710;
+  var a14711;
+  var a14712;
+  var a14713;
+  var a14714;
+  var a14715;
+  var a14716;
+  var a14717;
+  var a14718;
+  var a14719;
+  var a14720;
+  var a14721;
+  var a14722;
+  var a14723;
+  var a14724;
+  var a14725;
+  var a14726;
+  var a14727;
+  var a14728;
+  var a14729;
+  var a14730;
+  var a14731;
+  var a14732;
+  var a14733;
+  var a14734;
+  var a14735;
+  var a14736;
+  var a14737;
+  var a14738;
+  var a14739;
+  var a14740;
+  var a14741;
+  var a14742;
+  var a14743;
+  var a14744;
+  var a14745;
+  var a14746;
+  var a14747;
+  var a14748;
+  var a14749;
+  var a14750;
+  var a14751;
+  var a14752;
+  var a14753;
+  var a14754;
+  var a14755;
+  var a14756;
+  var a14757;
+  var a14758;
+  var a14759;
+  var a14760;
+  var a14761;
+  var a14762;
+  var a14763;
+  var a14764;
+  var a14765;
+  var a14766;
+  var a14767;
+  var a14768;
+  var a14769;
+  var a14770;
+  var a14771;
+  var a14772;
+  var a14773;
+  var a14774;
+  var a14775;
+  var a14776;
+  var a14777;
+  var a14778;
+  var a14779;
+  var a14780;
+  var a14781;
+  var a14782;
+  var a14783;
+  var a14784;
+  var a14785;
+  var a14786;
+  var a14787;
+  var a14788;
+  var a14789;
+  var a14790;
+  var a14791;
+  var a14792;
+  var a14793;
+  var a14794;
+  var a14795;
+  var a14796;
+  var a14797;
+  var a14798;
+  var a14799;
+  var a14800;
+  var a14801;
+  var a14802;
+  var a14803;
+  var a14804;
+  var a14805;
+  var a14806;
+  var a14807;
+  var a14808;
+  var a14809;
+  var a14810;
+  var a14811;
+  var a14812;
+  var a14813;
+  var a14814;
+  var a14815;
+  var a14816;
+  var a14817;
+  var a14818;
+  var a14819;
+  var a14820;
+  var a14821;
+  var a14822;
+  var a14823;
+  var a14824;
+  var a14825;
+  var a14826;
+  var a14827;
+  var a14828;
+  var a14829;
+  var a14830;
+  var a14831;
+  var a14832;
+  var a14833;
+  var a14834;
+  var a14835;
+  var a14836;
+  var a14837;
+  var a14838;
+  var a14839;
+  var a14840;
+  var a14841;
+  var a14842;
+  var a14843;
+  var a14844;
+  var a14845;
+  var a14846;
+  var a14847;
+  var a14848;
+  var a14849;
+  var a14850;
+  var a14851;
+  var a14852;
+  var a14853;
+  var a14854;
+  var a14855;
+  var a14856;
+  var a14857;
+  var a14858;
+  var a14859;
+  var a14860;
+  var a14861;
+  var a14862;
+  var a14863;
+  var a14864;
+  var a14865;
+  var a14866;
+  var a14867;
+  var a14868;
+  var a14869;
+  var a14870;
+  var a14871;
+  var a14872;
+  var a14873;
+  var a14874;
+  var a14875;
+  var a14876;
+  var a14877;
+  var a14878;
+  var a14879;
+  var a14880;
+  var a14881;
+  var a14882;
+  var a14883;
+  var a14884;
+  var a14885;
+  var a14886;
+  var a14887;
+  var a14888;
+  var a14889;
+  var a14890;
+  var a14891;
+  var a14892;
+  var a14893;
+  var a14894;
+  var a14895;
+  var a14896;
+  var a14897;
+  var a14898;
+  var a14899;
+  var a14900;
+  var a14901;
+  var a14902;
+  var a14903;
+  var a14904;
+  var a14905;
+  var a14906;
+  var a14907;
+  var a14908;
+  var a14909;
+  var a14910;
+  var a14911;
+  var a14912;
+  var a14913;
+  var a14914;
+  var a14915;
+  var a14916;
+  var a14917;
+  var a14918;
+  var a14919;
+  var a14920;
+  var a14921;
+  var a14922;
+  var a14923;
+  var a14924;
+  var a14925;
+  var a14926;
+  var a14927;
+  var a14928;
+  var a14929;
+  var a14930;
+  var a14931;
+  var a14932;
+  var a14933;
+  var a14934;
+  var a14935;
+  var a14936;
+  var a14937;
+  var a14938;
+  var a14939;
+  var a14940;
+  var a14941;
+  var a14942;
+  var a14943;
+  var a14944;
+  var a14945;
+  var a14946;
+  var a14947;
+  var a14948;
+  var a14949;
+  var a14950;
+  var a14951;
+  var a14952;
+  var a14953;
+  var a14954;
+  var a14955;
+  var a14956;
+  var a14957;
+  var a14958;
+  var a14959;
+  var a14960;
+  var a14961;
+  var a14962;
+  var a14963;
+  var a14964;
+  var a14965;
+  var a14966;
+  var a14967;
+  var a14968;
+  var a14969;
+  var a14970;
+  var a14971;
+  var a14972;
+  var a14973;
+  var a14974;
+  var a14975;
+  var a14976;
+  var a14977;
+  var a14978;
+  var a14979;
+  var a14980;
+  var a14981;
+  var a14982;
+  var a14983;
+  var a14984;
+  var a14985;
+  var a14986;
+  var a14987;
+  var a14988;
+  var a14989;
+  var a14990;
+  var a14991;
+  var a14992;
+  var a14993;
+  var a14994;
+  var a14995;
+  var a14996;
+  var a14997;
+  var a14998;
+  var a14999;
+  var a15000;
+  var a15001;
+  var a15002;
+  var a15003;
+  var a15004;
+  var a15005;
+  var a15006;
+  var a15007;
+  var a15008;
+  var a15009;
+  var a15010;
+  var a15011;
+  var a15012;
+  var a15013;
+  var a15014;
+  var a15015;
+  var a15016;
+  var a15017;
+  var a15018;
+  var a15019;
+  var a15020;
+  var a15021;
+  var a15022;
+  var a15023;
+  var a15024;
+  var a15025;
+  var a15026;
+  var a15027;
+  var a15028;
+  var a15029;
+  var a15030;
+  var a15031;
+  var a15032;
+  var a15033;
+  var a15034;
+  var a15035;
+  var a15036;
+  var a15037;
+  var a15038;
+  var a15039;
+  var a15040;
+  var a15041;
+  var a15042;
+  var a15043;
+  var a15044;
+  var a15045;
+  var a15046;
+  var a15047;
+  var a15048;
+  var a15049;
+  var a15050;
+  var a15051;
+  var a15052;
+  var a15053;
+  var a15054;
+  var a15055;
+  var a15056;
+  var a15057;
+  var a15058;
+  var a15059;
+  var a15060;
+  var a15061;
+  var a15062;
+  var a15063;
+  var a15064;
+  var a15065;
+  var a15066;
+  var a15067;
+  var a15068;
+  var a15069;
+  var a15070;
+  var a15071;
+  var a15072;
+  var a15073;
+  var a15074;
+  var a15075;
+  var a15076;
+  var a15077;
+  var a15078;
+  var a15079;
+  var a15080;
+  var a15081;
+  var a15082;
+  var a15083;
+  var a15084;
+  var a15085;
+  var a15086;
+  var a15087;
+  var a15088;
+  var a15089;
+  var a15090;
+  var a15091;
+  var a15092;
+  var a15093;
+  var a15094;
+  var a15095;
+  var a15096;
+  var a15097;
+  var a15098;
+  var a15099;
+  var a15100;
+  var a15101;
+  var a15102;
+  var a15103;
+  var a15104;
+  var a15105;
+  var a15106;
+  var a15107;
+  var a15108;
+  var a15109;
+  var a15110;
+  var a15111;
+  var a15112;
+  var a15113;
+  var a15114;
+  var a15115;
+  var a15116;
+  var a15117;
+  var a15118;
+  var a15119;
+  var a15120;
+  var a15121;
+  var a15122;
+  var a15123;
+  var a15124;
+  var a15125;
+  var a15126;
+  var a15127;
+  var a15128;
+  var a15129;
+  var a15130;
+  var a15131;
+  var a15132;
+  var a15133;
+  var a15134;
+  var a15135;
+  var a15136;
+  var a15137;
+  var a15138;
+  var a15139;
+  var a15140;
+  var a15141;
+  var a15142;
+  var a15143;
+  var a15144;
+  var a15145;
+  var a15146;
+  var a15147;
+  var a15148;
+  var a15149;
+  var a15150;
+  var a15151;
+  var a15152;
+  var a15153;
+  var a15154;
+  var a15155;
+  var a15156;
+  var a15157;
+  var a15158;
+  var a15159;
+  var a15160;
+  var a15161;
+  var a15162;
+  var a15163;
+  var a15164;
+  var a15165;
+  var a15166;
+  var a15167;
+  var a15168;
+  var a15169;
+  var a15170;
+  var a15171;
+  var a15172;
+  var a15173;
+  var a15174;
+  var a15175;
+  var a15176;
+  var a15177;
+  var a15178;
+  var a15179;
+  var a15180;
+  var a15181;
+  var a15182;
+  var a15183;
+  var a15184;
+  var a15185;
+  var a15186;
+  var a15187;
+  var a15188;
+  var a15189;
+  var a15190;
+  var a15191;
+  var a15192;
+  var a15193;
+  var a15194;
+  var a15195;
+  var a15196;
+  var a15197;
+  var a15198;
+  var a15199;
+  var a15200;
+  var a15201;
+  var a15202;
+  var a15203;
+  var a15204;
+  var a15205;
+  var a15206;
+  var a15207;
+  var a15208;
+  var a15209;
+  var a15210;
+  var a15211;
+  var a15212;
+  var a15213;
+  var a15214;
+  var a15215;
+  var a15216;
+  var a15217;
+  var a15218;
+  var a15219;
+  var a15220;
+  var a15221;
+  var a15222;
+  var a15223;
+  var a15224;
+  var a15225;
+  var a15226;
+  var a15227;
+  var a15228;
+  var a15229;
+  var a15230;
+  var a15231;
+  var a15232;
+  var a15233;
+  var a15234;
+  var a15235;
+  var a15236;
+  var a15237;
+  var a15238;
+  var a15239;
+  var a15240;
+  var a15241;
+  var a15242;
+  var a15243;
+  var a15244;
+  var a15245;
+  var a15246;
+  var a15247;
+  var a15248;
+  var a15249;
+  var a15250;
+  var a15251;
+  var a15252;
+  var a15253;
+  var a15254;
+  var a15255;
+  var a15256;
+  var a15257;
+  var a15258;
+  var a15259;
+  var a15260;
+  var a15261;
+  var a15262;
+  var a15263;
+  var a15264;
+  var a15265;
+  var a15266;
+  var a15267;
+  var a15268;
+  var a15269;
+  var a15270;
+  var a15271;
+  var a15272;
+  var a15273;
+  var a15274;
+  var a15275;
+  var a15276;
+  var a15277;
+  var a15278;
+  var a15279;
+  var a15280;
+  var a15281;
+  var a15282;
+  var a15283;
+  var a15284;
+  var a15285;
+  var a15286;
+  var a15287;
+  var a15288;
+  var a15289;
+  var a15290;
+  var a15291;
+  var a15292;
+  var a15293;
+  var a15294;
+  var a15295;
+  var a15296;
+  var a15297;
+  var a15298;
+  var a15299;
+  var a15300;
+  var a15301;
+  var a15302;
+  var a15303;
+  var a15304;
+  var a15305;
+  var a15306;
+  var a15307;
+  var a15308;
+  var a15309;
+  var a15310;
+  var a15311;
+  var a15312;
+  var a15313;
+  var a15314;
+  var a15315;
+  var a15316;
+  var a15317;
+  var a15318;
+  var a15319;
+  var a15320;
+  var a15321;
+  var a15322;
+  var a15323;
+  var a15324;
+  var a15325;
+  var a15326;
+  var a15327;
+  var a15328;
+  var a15329;
+  var a15330;
+  var a15331;
+  var a15332;
+  var a15333;
+  var a15334;
+  var a15335;
+  var a15336;
+  var a15337;
+  var a15338;
+  var a15339;
+  var a15340;
+  var a15341;
+  var a15342;
+  var a15343;
+  var a15344;
+  var a15345;
+  var a15346;
+  var a15347;
+  var a15348;
+  var a15349;
+  var a15350;
+  var a15351;
+  var a15352;
+  var a15353;
+  var a15354;
+  var a15355;
+  var a15356;
+  var a15357;
+  var a15358;
+  var a15359;
+  var a15360;
+  var a15361;
+  var a15362;
+  var a15363;
+  var a15364;
+  var a15365;
+  var a15366;
+  var a15367;
+  var a15368;
+  var a15369;
+  var a15370;
+  var a15371;
+  var a15372;
+  var a15373;
+  var a15374;
+  var a15375;
+  var a15376;
+  var a15377;
+  var a15378;
+  var a15379;
+  var a15380;
+  var a15381;
+  var a15382;
+  var a15383;
+  var a15384;
+  var a15385;
+  var a15386;
+  var a15387;
+  var a15388;
+  var a15389;
+  var a15390;
+  var a15391;
+  var a15392;
+  var a15393;
+  var a15394;
+  var a15395;
+  var a15396;
+  var a15397;
+  var a15398;
+  var a15399;
+  var a15400;
+  var a15401;
+  var a15402;
+  var a15403;
+  var a15404;
+  var a15405;
+  var a15406;
+  var a15407;
+  var a15408;
+  var a15409;
+  var a15410;
+  var a15411;
+  var a15412;
+  var a15413;
+  var a15414;
+  var a15415;
+  var a15416;
+  var a15417;
+  var a15418;
+  var a15419;
+  var a15420;
+  var a15421;
+  var a15422;
+  var a15423;
+  var a15424;
+  var a15425;
+  var a15426;
+  var a15427;
+  var a15428;
+  var a15429;
+  var a15430;
+  var a15431;
+  var a15432;
+  var a15433;
+  var a15434;
+  var a15435;
+  var a15436;
+  var a15437;
+  var a15438;
+  var a15439;
+  var a15440;
+  var a15441;
+  var a15442;
+  var a15443;
+  var a15444;
+  var a15445;
+  var a15446;
+  var a15447;
+  var a15448;
+  var a15449;
+  var a15450;
+  var a15451;
+  var a15452;
+  var a15453;
+  var a15454;
+  var a15455;
+  var a15456;
+  var a15457;
+  var a15458;
+  var a15459;
+  var a15460;
+  var a15461;
+  var a15462;
+  var a15463;
+  var a15464;
+  var a15465;
+  var a15466;
+  var a15467;
+  var a15468;
+  var a15469;
+  var a15470;
+  var a15471;
+  var a15472;
+  var a15473;
+  var a15474;
+  var a15475;
+  var a15476;
+  var a15477;
+  var a15478;
+  var a15479;
+  var a15480;
+  var a15481;
+  var a15482;
+  var a15483;
+  var a15484;
+  var a15485;
+  var a15486;
+  var a15487;
+  var a15488;
+  var a15489;
+  var a15490;
+  var a15491;
+  var a15492;
+  var a15493;
+  var a15494;
+  var a15495;
+  var a15496;
+  var a15497;
+  var a15498;
+  var a15499;
+  var a15500;
+  var a15501;
+  var a15502;
+  var a15503;
+  var a15504;
+  var a15505;
+  var a15506;
+  var a15507;
+  var a15508;
+  var a15509;
+  var a15510;
+  var a15511;
+  var a15512;
+  var a15513;
+  var a15514;
+  var a15515;
+  var a15516;
+  var a15517;
+  var a15518;
+  var a15519;
+  var a15520;
+  var a15521;
+  var a15522;
+  var a15523;
+  var a15524;
+  var a15525;
+  var a15526;
+  var a15527;
+  var a15528;
+  var a15529;
+  var a15530;
+  var a15531;
+  var a15532;
+  var a15533;
+  var a15534;
+  var a15535;
+  var a15536;
+  var a15537;
+  var a15538;
+  var a15539;
+  var a15540;
+  var a15541;
+  var a15542;
+  var a15543;
+  var a15544;
+  var a15545;
+  var a15546;
+  var a15547;
+  var a15548;
+  var a15549;
+  var a15550;
+  var a15551;
+  var a15552;
+  var a15553;
+  var a15554;
+  var a15555;
+  var a15556;
+  var a15557;
+  var a15558;
+  var a15559;
+  var a15560;
+  var a15561;
+  var a15562;
+  var a15563;
+  var a15564;
+  var a15565;
+  var a15566;
+  var a15567;
+  var a15568;
+  var a15569;
+  var a15570;
+  var a15571;
+  var a15572;
+  var a15573;
+  var a15574;
+  var a15575;
+  var a15576;
+  var a15577;
+  var a15578;
+  var a15579;
+  var a15580;
+  var a15581;
+  var a15582;
+  var a15583;
+  var a15584;
+  var a15585;
+  var a15586;
+  var a15587;
+  var a15588;
+  var a15589;
+  var a15590;
+  var a15591;
+  var a15592;
+  var a15593;
+  var a15594;
+  var a15595;
+  var a15596;
+  var a15597;
+  var a15598;
+  var a15599;
+  var a15600;
+  var a15601;
+  var a15602;
+  var a15603;
+  var a15604;
+  var a15605;
+  var a15606;
+  var a15607;
+  var a15608;
+  var a15609;
+  var a15610;
+  var a15611;
+  var a15612;
+  var a15613;
+  var a15614;
+  var a15615;
+  var a15616;
+  var a15617;
+  var a15618;
+  var a15619;
+  var a15620;
+  var a15621;
+  var a15622;
+  var a15623;
+  var a15624;
+  var a15625;
+  var a15626;
+  var a15627;
+  var a15628;
+  var a15629;
+  var a15630;
+  var a15631;
+  var a15632;
+  var a15633;
+  var a15634;
+  var a15635;
+  var a15636;
+  var a15637;
+  var a15638;
+  var a15639;
+  var a15640;
+  var a15641;
+  var a15642;
+  var a15643;
+  var a15644;
+  var a15645;
+  var a15646;
+  var a15647;
+  var a15648;
+  var a15649;
+  var a15650;
+  var a15651;
+  var a15652;
+  var a15653;
+  var a15654;
+  var a15655;
+  var a15656;
+  var a15657;
+  var a15658;
+  var a15659;
+  var a15660;
+  var a15661;
+  var a15662;
+  var a15663;
+  var a15664;
+  var a15665;
+  var a15666;
+  var a15667;
+  var a15668;
+  var a15669;
+  var a15670;
+  var a15671;
+  var a15672;
+  var a15673;
+  var a15674;
+  var a15675;
+  var a15676;
+  var a15677;
+  var a15678;
+  var a15679;
+  var a15680;
+  var a15681;
+  var a15682;
+  var a15683;
+  var a15684;
+  var a15685;
+  var a15686;
+  var a15687;
+  var a15688;
+  var a15689;
+  var a15690;
+  var a15691;
+  var a15692;
+  var a15693;
+  var a15694;
+  var a15695;
+  var a15696;
+  var a15697;
+  var a15698;
+  var a15699;
+  var a15700;
+  var a15701;
+  var a15702;
+  var a15703;
+  var a15704;
+  var a15705;
+  var a15706;
+  var a15707;
+  var a15708;
+  var a15709;
+  var a15710;
+  var a15711;
+  var a15712;
+  var a15713;
+  var a15714;
+  var a15715;
+  var a15716;
+  var a15717;
+  var a15718;
+  var a15719;
+  var a15720;
+  var a15721;
+  var a15722;
+  var a15723;
+  var a15724;
+  var a15725;
+  var a15726;
+  var a15727;
+  var a15728;
+  var a15729;
+  var a15730;
+  var a15731;
+  var a15732;
+  var a15733;
+  var a15734;
+  var a15735;
+  var a15736;
+  var a15737;
+  var a15738;
+  var a15739;
+  var a15740;
+  var a15741;
+  var a15742;
+  var a15743;
+  var a15744;
+  var a15745;
+  var a15746;
+  var a15747;
+  var a15748;
+  var a15749;
+  var a15750;
+  var a15751;
+  var a15752;
+  var a15753;
+  var a15754;
+  var a15755;
+  var a15756;
+  var a15757;
+  var a15758;
+  var a15759;
+  var a15760;
+  var a15761;
+  var a15762;
+  var a15763;
+  var a15764;
+  var a15765;
+  var a15766;
+  var a15767;
+  var a15768;
+  var a15769;
+  var a15770;
+  var a15771;
+  var a15772;
+  var a15773;
+  var a15774;
+  var a15775;
+  var a15776;
+  var a15777;
+  var a15778;
+  var a15779;
+  var a15780;
+  var a15781;
+  var a15782;
+  var a15783;
+  var a15784;
+  var a15785;
+  var a15786;
+  var a15787;
+  var a15788;
+  var a15789;
+  var a15790;
+  var a15791;
+  var a15792;
+  var a15793;
+  var a15794;
+  var a15795;
+  var a15796;
+  var a15797;
+  var a15798;
+  var a15799;
+  var a15800;
+  var a15801;
+  var a15802;
+  var a15803;
+  var a15804;
+  var a15805;
+  var a15806;
+  var a15807;
+  var a15808;
+  var a15809;
+  var a15810;
+  var a15811;
+  var a15812;
+  var a15813;
+  var a15814;
+  var a15815;
+  var a15816;
+  var a15817;
+  var a15818;
+  var a15819;
+  var a15820;
+  var a15821;
+  var a15822;
+  var a15823;
+  var a15824;
+  var a15825;
+  var a15826;
+  var a15827;
+  var a15828;
+  var a15829;
+  var a15830;
+  var a15831;
+  var a15832;
+  var a15833;
+  var a15834;
+  var a15835;
+  var a15836;
+  var a15837;
+  var a15838;
+  var a15839;
+  var a15840;
+  var a15841;
+  var a15842;
+  var a15843;
+  var a15844;
+  var a15845;
+  var a15846;
+  var a15847;
+  var a15848;
+  var a15849;
+  var a15850;
+  var a15851;
+  var a15852;
+  var a15853;
+  var a15854;
+  var a15855;
+  var a15856;
+  var a15857;
+  var a15858;
+  var a15859;
+  var a15860;
+  var a15861;
+  var a15862;
+  var a15863;
+  var a15864;
+  var a15865;
+  var a15866;
+  var a15867;
+  var a15868;
+  var a15869;
+  var a15870;
+  var a15871;
+  var a15872;
+  var a15873;
+  var a15874;
+  var a15875;
+  var a15876;
+  var a15877;
+  var a15878;
+  var a15879;
+  var a15880;
+  var a15881;
+  var a15882;
+  var a15883;
+  var a15884;
+  var a15885;
+  var a15886;
+  var a15887;
+  var a15888;
+  var a15889;
+  var a15890;
+  var a15891;
+  var a15892;
+  var a15893;
+  var a15894;
+  var a15895;
+  var a15896;
+  var a15897;
+  var a15898;
+  var a15899;
+  var a15900;
+  var a15901;
+  var a15902;
+  var a15903;
+  var a15904;
+  var a15905;
+  var a15906;
+  var a15907;
+  var a15908;
+  var a15909;
+  var a15910;
+  var a15911;
+  var a15912;
+  var a15913;
+  var a15914;
+  var a15915;
+  var a15916;
+  var a15917;
+  var a15918;
+  var a15919;
+  var a15920;
+  var a15921;
+  var a15922;
+  var a15923;
+  var a15924;
+  var a15925;
+  var a15926;
+  var a15927;
+  var a15928;
+  var a15929;
+  var a15930;
+  var a15931;
+  var a15932;
+  var a15933;
+  var a15934;
+  var a15935;
+  var a15936;
+  var a15937;
+  var a15938;
+  var a15939;
+  var a15940;
+  var a15941;
+  var a15942;
+  var a15943;
+  var a15944;
+  var a15945;
+  var a15946;
+  var a15947;
+  var a15948;
+  var a15949;
+  var a15950;
+  var a15951;
+  var a15952;
+  var a15953;
+  var a15954;
+  var a15955;
+  var a15956;
+  var a15957;
+  var a15958;
+  var a15959;
+  var a15960;
+  var a15961;
+  var a15962;
+  var a15963;
+  var a15964;
+  var a15965;
+  var a15966;
+  var a15967;
+  var a15968;
+  var a15969;
+  var a15970;
+  var a15971;
+  var a15972;
+  var a15973;
+  var a15974;
+  var a15975;
+  var a15976;
+  var a15977;
+  var a15978;
+  var a15979;
+  var a15980;
+  var a15981;
+  var a15982;
+  var a15983;
+  var a15984;
+  var a15985;
+  var a15986;
+  var a15987;
+  var a15988;
+  var a15989;
+  var a15990;
+  var a15991;
+  var a15992;
+  var a15993;
+  var a15994;
+  var a15995;
+  var a15996;
+  var a15997;
+  var a15998;
+  var a15999;
+  var a16000;
+  var a16001;
+  var a16002;
+  var a16003;
+  var a16004;
+  var a16005;
+  var a16006;
+  var a16007;
+  var a16008;
+  var a16009;
+  var a16010;
+  var a16011;
+  var a16012;
+  var a16013;
+  var a16014;
+  var a16015;
+  var a16016;
+  var a16017;
+  var a16018;
+  var a16019;
+  var a16020;
+  var a16021;
+  var a16022;
+  var a16023;
+  var a16024;
+  var a16025;
+  var a16026;
+  var a16027;
+  var a16028;
+  var a16029;
+  var a16030;
+  var a16031;
+  var a16032;
+  var a16033;
+  var a16034;
+  var a16035;
+  var a16036;
+  var a16037;
+  var a16038;
+  var a16039;
+  var a16040;
+  var a16041;
+  var a16042;
+  var a16043;
+  var a16044;
+  var a16045;
+  var a16046;
+  var a16047;
+  var a16048;
+  var a16049;
+  var a16050;
+  var a16051;
+  var a16052;
+  var a16053;
+  var a16054;
+  var a16055;
+  var a16056;
+  var a16057;
+  var a16058;
+  var a16059;
+  var a16060;
+  var a16061;
+  var a16062;
+  var a16063;
+  var a16064;
+  var a16065;
+  var a16066;
+  var a16067;
+  var a16068;
+  var a16069;
+  var a16070;
+  var a16071;
+  var a16072;
+  var a16073;
+  var a16074;
+  var a16075;
+  var a16076;
+  var a16077;
+  var a16078;
+  var a16079;
+  var a16080;
+  var a16081;
+  var a16082;
+  var a16083;
+  var a16084;
+  var a16085;
+  var a16086;
+  var a16087;
+  var a16088;
+  var a16089;
+  var a16090;
+  var a16091;
+  var a16092;
+  var a16093;
+  var a16094;
+  var a16095;
+  var a16096;
+  var a16097;
+  var a16098;
+  var a16099;
+  var a16100;
+  var a16101;
+  var a16102;
+  var a16103;
+  var a16104;
+  var a16105;
+  var a16106;
+  var a16107;
+  var a16108;
+  var a16109;
+  var a16110;
+  var a16111;
+  var a16112;
+  var a16113;
+  var a16114;
+  var a16115;
+  var a16116;
+  var a16117;
+  var a16118;
+  var a16119;
+  var a16120;
+  var a16121;
+  var a16122;
+  var a16123;
+  var a16124;
+  var a16125;
+  var a16126;
+  var a16127;
+  var a16128;
+  var a16129;
+  var a16130;
+  var a16131;
+  var a16132;
+  var a16133;
+  var a16134;
+  var a16135;
+  var a16136;
+  var a16137;
+  var a16138;
+  var a16139;
+  var a16140;
+  var a16141;
+  var a16142;
+  var a16143;
+  var a16144;
+  var a16145;
+  var a16146;
+  var a16147;
+  var a16148;
+  var a16149;
+  var a16150;
+  var a16151;
+  var a16152;
+  var a16153;
+  var a16154;
+  var a16155;
+  var a16156;
+  var a16157;
+  var a16158;
+  var a16159;
+  var a16160;
+  var a16161;
+  var a16162;
+  var a16163;
+  var a16164;
+  var a16165;
+  var a16166;
+  var a16167;
+  var a16168;
+  var a16169;
+  var a16170;
+  var a16171;
+  var a16172;
+  var a16173;
+  var a16174;
+  var a16175;
+  var a16176;
+  var a16177;
+  var a16178;
+  var a16179;
+  var a16180;
+  var a16181;
+  var a16182;
+  var a16183;
+  var a16184;
+  var a16185;
+  var a16186;
+  var a16187;
+  var a16188;
+  var a16189;
+  var a16190;
+  var a16191;
+  var a16192;
+  var a16193;
+  var a16194;
+  var a16195;
+  var a16196;
+  var a16197;
+  var a16198;
+  var a16199;
+  var a16200;
+  var a16201;
+  var a16202;
+  var a16203;
+  var a16204;
+  var a16205;
+  var a16206;
+  var a16207;
+  var a16208;
+  var a16209;
+  var a16210;
+  var a16211;
+  var a16212;
+  var a16213;
+  var a16214;
+  var a16215;
+  var a16216;
+  var a16217;
+  var a16218;
+  var a16219;
+  var a16220;
+  var a16221;
+  var a16222;
+  var a16223;
+  var a16224;
+  var a16225;
+  var a16226;
+  var a16227;
+  var a16228;
+  var a16229;
+  var a16230;
+  var a16231;
+  var a16232;
+  var a16233;
+  var a16234;
+  var a16235;
+  var a16236;
+  var a16237;
+  var a16238;
+  var a16239;
+  var a16240;
+  var a16241;
+  var a16242;
+  var a16243;
+  var a16244;
+  var a16245;
+  var a16246;
+  var a16247;
+  var a16248;
+  var a16249;
+  var a16250;
+  var a16251;
+  var a16252;
+  var a16253;
+  var a16254;
+  var a16255;
+  var a16256;
+  var a16257;
+  var a16258;
+  var a16259;
+  var a16260;
+  var a16261;
+  var a16262;
+  var a16263;
+  var a16264;
+  var a16265;
+  var a16266;
+  var a16267;
+  var a16268;
+  var a16269;
+  var a16270;
+  var a16271;
+  var a16272;
+  var a16273;
+  var a16274;
+  var a16275;
+  var a16276;
+  var a16277;
+  var a16278;
+  var a16279;
+  var a16280;
+  var a16281;
+  var a16282;
+  var a16283;
+  var a16284;
+  var a16285;
+  var a16286;
+  var a16287;
+  var a16288;
+  var a16289;
+  var a16290;
+  var a16291;
+  var a16292;
+  var a16293;
+  var a16294;
+  var a16295;
+  var a16296;
+  var a16297;
+  var a16298;
+  var a16299;
+  var a16300;
+  var a16301;
+  var a16302;
+  var a16303;
+  var a16304;
+  var a16305;
+  var a16306;
+  var a16307;
+  var a16308;
+  var a16309;
+  var a16310;
+  var a16311;
+  var a16312;
+  var a16313;
+  var a16314;
+  var a16315;
+  var a16316;
+  var a16317;
+  var a16318;
+  var a16319;
+  var a16320;
+  var a16321;
+  var a16322;
+  var a16323;
+  var a16324;
+  var a16325;
+  var a16326;
+  var a16327;
+  var a16328;
+  var a16329;
+  var a16330;
+  var a16331;
+  var a16332;
+  var a16333;
+  var a16334;
+  var a16335;
+  var a16336;
+  var a16337;
+  var a16338;
+  var a16339;
+  var a16340;
+  var a16341;
+  var a16342;
+  var a16343;
+  var a16344;
+  var a16345;
+  var a16346;
+  var a16347;
+  var a16348;
+  var a16349;
+  var a16350;
+  var a16351;
+  var a16352;
+  var a16353;
+  var a16354;
+  var a16355;
+  var a16356;
+  var a16357;
+  var a16358;
+  var a16359;
+  var a16360;
+  var a16361;
+  var a16362;
+  var a16363;
+  var a16364;
+  var a16365;
+  var a16366;
+  var a16367;
+  var a16368;
+  var a16369;
+  var a16370;
+  var a16371;
+  var a16372;
+  var a16373;
+  var a16374;
+  var a16375;
+  var a16376;
+  var a16377;
+  var a16378;
+  var a16379;
+  var a16380;
+  var a16381;
+  var a16382;
+  var a16383;
+  var a16384;
+  var a16385;
+  var a16386;
+  var a16387;
+  var a16388;
+  var a16389;
+  var a16390;
+  var a16391;
+  var a16392;
+  var a16393;
+  var a16394;
+  var a16395;
+  var a16396;
+  var a16397;
+  var a16398;
+  var a16399;
+  var a16400;
+  var a16401;
+  var a16402;
+  var a16403;
+  var a16404;
+  var a16405;
+  var a16406;
+  var a16407;
+  var a16408;
+  var a16409;
+  var a16410;
+  var a16411;
+  var a16412;
+  var a16413;
+  var a16414;
+  var a16415;
+  var a16416;
+  var a16417;
+  var a16418;
+  var a16419;
+  var a16420;
+  var a16421;
+  var a16422;
+  var a16423;
+  var a16424;
+  var a16425;
+  var a16426;
+  var a16427;
+  var a16428;
+  var a16429;
+  var a16430;
+  var a16431;
+  var a16432;
+  var a16433;
+  var a16434;
+  var a16435;
+  var a16436;
+  var a16437;
+  var a16438;
+  var a16439;
+  var a16440;
+  var a16441;
+  var a16442;
+  var a16443;
+  var a16444;
+  var a16445;
+  var a16446;
+  var a16447;
+  var a16448;
+  var a16449;
+  var a16450;
+  var a16451;
+  var a16452;
+  var a16453;
+  var a16454;
+  var a16455;
+  var a16456;
+  var a16457;
+  var a16458;
+  var a16459;
+  var a16460;
+  var a16461;
+  var a16462;
+  var a16463;
+  var a16464;
+  var a16465;
+  var a16466;
+  var a16467;
+  var a16468;
+  var a16469;
+  var a16470;
+  var a16471;
+  var a16472;
+  var a16473;
+  var a16474;
+  var a16475;
+  var a16476;
+  var a16477;
+  var a16478;
+  var a16479;
+  var a16480;
+  var a16481;
+  var a16482;
+  var a16483;
+  var a16484;
+  var a16485;
+  var a16486;
+  var a16487;
+  var a16488;
+  var a16489;
+  var a16490;
+  var a16491;
+  var a16492;
+  var a16493;
+  var a16494;
+  var a16495;
+  var a16496;
+  var a16497;
+  var a16498;
+  var a16499;
+  var a16500;
+  var a16501;
+  var a16502;
+  var a16503;
+  var a16504;
+  var a16505;
+  var a16506;
+  var a16507;
+  var a16508;
+  var a16509;
+  var a16510;
+  var a16511;
+  var a16512;
+  var a16513;
+  var a16514;
+  var a16515;
+  var a16516;
+  var a16517;
+  var a16518;
+  var a16519;
+  var a16520;
+  var a16521;
+  var a16522;
+  var a16523;
+  var a16524;
+  var a16525;
+  var a16526;
+  var a16527;
+  var a16528;
+  var a16529;
+  var a16530;
+  var a16531;
+  var a16532;
+  var a16533;
+  var a16534;
+  var a16535;
+  var a16536;
+  var a16537;
+  var a16538;
+  var a16539;
+  var a16540;
+  var a16541;
+  var a16542;
+  var a16543;
+  var a16544;
+  var a16545;
+  var a16546;
+  var a16547;
+  var a16548;
+  var a16549;
+  var a16550;
+  var a16551;
+  var a16552;
+  var a16553;
+  var a16554;
+  var a16555;
+  var a16556;
+  var a16557;
+  var a16558;
+  var a16559;
+  var a16560;
+  var a16561;
+  var a16562;
+  var a16563;
+  var a16564;
+  var a16565;
+  var a16566;
+  var a16567;
+  var a16568;
+  var a16569;
+  var a16570;
+  var a16571;
+  var a16572;
+  var a16573;
+  var a16574;
+  var a16575;
+  var a16576;
+  var a16577;
+  var a16578;
+  var a16579;
+  var a16580;
+  var a16581;
+  var a16582;
+  var a16583;
+  var a16584;
+  var a16585;
+  var a16586;
+  var a16587;
+  var a16588;
+  var a16589;
+  var a16590;
+  var a16591;
+  var a16592;
+  var a16593;
+  var a16594;
+  var a16595;
+  var a16596;
+  var a16597;
+  var a16598;
+  var a16599;
+  var a16600;
+  var a16601;
+  var a16602;
+  var a16603;
+  var a16604;
+  var a16605;
+  var a16606;
+  var a16607;
+  var a16608;
+  var a16609;
+  var a16610;
+  var a16611;
+  var a16612;
+  var a16613;
+  var a16614;
+  var a16615;
+  var a16616;
+  var a16617;
+  var a16618;
+  var a16619;
+  var a16620;
+  var a16621;
+  var a16622;
+  var a16623;
+  var a16624;
+  var a16625;
+  var a16626;
+  var a16627;
+  var a16628;
+  var a16629;
+  var a16630;
+  var a16631;
+  var a16632;
+  var a16633;
+  var a16634;
+  var a16635;
+  var a16636;
+  var a16637;
+  var a16638;
+  var a16639;
+  var a16640;
+  var a16641;
+  var a16642;
+  var a16643;
+  var a16644;
+  var a16645;
+  var a16646;
+  var a16647;
+  var a16648;
+  var a16649;
+  var a16650;
+  var a16651;
+  var a16652;
+  var a16653;
+  var a16654;
+  var a16655;
+  var a16656;
+  var a16657;
+  var a16658;
+  var a16659;
+  var a16660;
+  var a16661;
+  var a16662;
+  var a16663;
+  var a16664;
+  var a16665;
+  var a16666;
+  var a16667;
+  var a16668;
+  var a16669;
+  var a16670;
+  var a16671;
+  var a16672;
+  var a16673;
+  var a16674;
+  var a16675;
+  var a16676;
+  var a16677;
+  var a16678;
+  var a16679;
+  var a16680;
+  var a16681;
+  var a16682;
+  var a16683;
+  var a16684;
+  var a16685;
+  var a16686;
+  var a16687;
+  var a16688;
+  var a16689;
+  var a16690;
+  var a16691;
+  var a16692;
+  var a16693;
+  var a16694;
+  var a16695;
+  var a16696;
+  var a16697;
+  var a16698;
+  var a16699;
+  var a16700;
+  var a16701;
+  var a16702;
+  var a16703;
+  var a16704;
+  var a16705;
+  var a16706;
+  var a16707;
+  var a16708;
+  var a16709;
+  var a16710;
+  var a16711;
+  var a16712;
+  var a16713;
+  var a16714;
+  var a16715;
+  var a16716;
+  var a16717;
+  var a16718;
+  var a16719;
+  var a16720;
+  var a16721;
+  var a16722;
+  var a16723;
+  var a16724;
+  var a16725;
+  var a16726;
+  var a16727;
+  var a16728;
+  var a16729;
+  var a16730;
+  var a16731;
+  var a16732;
+  var a16733;
+  var a16734;
+  var a16735;
+  var a16736;
+  var a16737;
+  var a16738;
+  var a16739;
+  var a16740;
+  var a16741;
+  var a16742;
+  var a16743;
+  var a16744;
+  var a16745;
+  var a16746;
+  var a16747;
+  var a16748;
+  var a16749;
+  var a16750;
+  var a16751;
+  var a16752;
+  var a16753;
+  var a16754;
+  var a16755;
+  var a16756;
+  var a16757;
+  var a16758;
+  var a16759;
+  var a16760;
+  var a16761;
+  var a16762;
+  var a16763;
+  var a16764;
+  var a16765;
+  var a16766;
+  var a16767;
+  var a16768;
+  var a16769;
+  var a16770;
+  var a16771;
+  var a16772;
+  var a16773;
+  var a16774;
+  var a16775;
+  var a16776;
+  var a16777;
+  var a16778;
+  var a16779;
+  var a16780;
+  var a16781;
+  var a16782;
+  var a16783;
+  var a16784;
+  var a16785;
+  var a16786;
+  var a16787;
+  var a16788;
+  var a16789;
+  var a16790;
+  var a16791;
+  var a16792;
+  var a16793;
+  var a16794;
+  var a16795;
+  var a16796;
+  var a16797;
+  var a16798;
+  var a16799;
+  var a16800;
+  var a16801;
+  var a16802;
+  var a16803;
+  var a16804;
+  var a16805;
+  var a16806;
+  var a16807;
+  var a16808;
+  var a16809;
+  var a16810;
+  var a16811;
+  var a16812;
+  var a16813;
+  var a16814;
+  var a16815;
+  var a16816;
+  var a16817;
+  var a16818;
+  var a16819;
+  var a16820;
+  var a16821;
+  var a16822;
+  var a16823;
+  var a16824;
+  var a16825;
+  var a16826;
+  var a16827;
+  var a16828;
+  var a16829;
+  var a16830;
+  var a16831;
+  var a16832;
+  var a16833;
+  var a16834;
+  var a16835;
+  var a16836;
+  var a16837;
+  var a16838;
+  var a16839;
+  var a16840;
+  var a16841;
+  var a16842;
+  var a16843;
+  var a16844;
+  var a16845;
+  var a16846;
+  var a16847;
+  var a16848;
+  var a16849;
+  var a16850;
+  var a16851;
+  var a16852;
+  var a16853;
+  var a16854;
+  var a16855;
+  var a16856;
+  var a16857;
+  var a16858;
+  var a16859;
+  var a16860;
+  var a16861;
+  var a16862;
+  var a16863;
+  var a16864;
+  var a16865;
+  var a16866;
+  var a16867;
+  var a16868;
+  var a16869;
+  var a16870;
+  var a16871;
+  var a16872;
+  var a16873;
+  var a16874;
+  var a16875;
+  var a16876;
+  var a16877;
+  var a16878;
+  var a16879;
+  var a16880;
+  var a16881;
+  var a16882;
+  var a16883;
+  var a16884;
+  var a16885;
+  var a16886;
+  var a16887;
+  var a16888;
+  var a16889;
+  var a16890;
+  var a16891;
+  var a16892;
+  var a16893;
+  var a16894;
+  var a16895;
+  var a16896;
+  var a16897;
+  var a16898;
+  var a16899;
+  var a16900;
+  var a16901;
+  var a16902;
+  var a16903;
+  var a16904;
+  var a16905;
+  var a16906;
+  var a16907;
+  var a16908;
+  var a16909;
+  var a16910;
+  var a16911;
+  var a16912;
+  var a16913;
+  var a16914;
+  var a16915;
+  var a16916;
+  var a16917;
+  var a16918;
+  var a16919;
+  var a16920;
+  var a16921;
+  var a16922;
+  var a16923;
+  var a16924;
+  var a16925;
+  var a16926;
+  var a16927;
+  var a16928;
+  var a16929;
+  var a16930;
+  var a16931;
+  var a16932;
+  var a16933;
+  var a16934;
+  var a16935;
+  var a16936;
+  var a16937;
+  var a16938;
+  var a16939;
+  var a16940;
+  var a16941;
+  var a16942;
+  var a16943;
+  var a16944;
+  var a16945;
+  var a16946;
+  var a16947;
+  var a16948;
+  var a16949;
+  var a16950;
+  var a16951;
+  var a16952;
+  var a16953;
+  var a16954;
+  var a16955;
+  var a16956;
+  var a16957;
+  var a16958;
+  var a16959;
+  var a16960;
+  var a16961;
+  var a16962;
+  var a16963;
+  var a16964;
+  var a16965;
+  var a16966;
+  var a16967;
+  var a16968;
+  var a16969;
+  var a16970;
+  var a16971;
+  var a16972;
+  var a16973;
+  var a16974;
+  var a16975;
+  var a16976;
+  var a16977;
+  var a16978;
+  var a16979;
+  var a16980;
+  var a16981;
+  var a16982;
+  var a16983;
+  var a16984;
+  var a16985;
+  var a16986;
+  var a16987;
+  var a16988;
+  var a16989;
+  var a16990;
+  var a16991;
+  var a16992;
+  var a16993;
+  var a16994;
+  var a16995;
+  var a16996;
+  var a16997;
+  var a16998;
+  var a16999;
+  var a17000;
+  var a17001;
+  var a17002;
+  var a17003;
+  var a17004;
+  var a17005;
+  var a17006;
+  var a17007;
+  var a17008;
+  var a17009;
+  var a17010;
+  var a17011;
+  var a17012;
+  var a17013;
+  var a17014;
+  var a17015;
+  var a17016;
+  var a17017;
+  var a17018;
+  var a17019;
+  var a17020;
+  var a17021;
+  var a17022;
+  var a17023;
+  var a17024;
+  var a17025;
+  var a17026;
+  var a17027;
+  var a17028;
+  var a17029;
+  var a17030;
+  var a17031;
+  var a17032;
+  var a17033;
+  var a17034;
+  var a17035;
+  var a17036;
+  var a17037;
+  var a17038;
+  var a17039;
+  var a17040;
+  var a17041;
+  var a17042;
+  var a17043;
+  var a17044;
+  var a17045;
+  var a17046;
+  var a17047;
+  var a17048;
+  var a17049;
+  var a17050;
+  var a17051;
+  var a17052;
+  var a17053;
+  var a17054;
+  var a17055;
+  var a17056;
+  var a17057;
+  var a17058;
+  var a17059;
+  var a17060;
+  var a17061;
+  var a17062;
+  var a17063;
+  var a17064;
+  var a17065;
+  var a17066;
+  var a17067;
+  var a17068;
+  var a17069;
+  var a17070;
+  var a17071;
+  var a17072;
+  var a17073;
+  var a17074;
+  var a17075;
+  var a17076;
+  var a17077;
+  var a17078;
+  var a17079;
+  var a17080;
+  var a17081;
+  var a17082;
+  var a17083;
+  var a17084;
+  var a17085;
+  var a17086;
+  var a17087;
+  var a17088;
+  var a17089;
+  var a17090;
+  var a17091;
+  var a17092;
+  var a17093;
+  var a17094;
+  var a17095;
+  var a17096;
+  var a17097;
+  var a17098;
+  var a17099;
+  var a17100;
+  var a17101;
+  var a17102;
+  var a17103;
+  var a17104;
+  var a17105;
+  var a17106;
+  var a17107;
+  var a17108;
+  var a17109;
+  var a17110;
+  var a17111;
+  var a17112;
+  var a17113;
+  var a17114;
+  var a17115;
+  var a17116;
+  var a17117;
+  var a17118;
+  var a17119;
+  var a17120;
+  var a17121;
+  var a17122;
+  var a17123;
+  var a17124;
+  var a17125;
+  var a17126;
+  var a17127;
+  var a17128;
+  var a17129;
+  var a17130;
+  var a17131;
+  var a17132;
+  var a17133;
+  var a17134;
+  var a17135;
+  var a17136;
+  var a17137;
+  var a17138;
+  var a17139;
+  var a17140;
+  var a17141;
+  var a17142;
+  var a17143;
+  var a17144;
+  var a17145;
+  var a17146;
+  var a17147;
+  var a17148;
+  var a17149;
+  var a17150;
+  var a17151;
+  var a17152;
+  var a17153;
+  var a17154;
+  var a17155;
+  var a17156;
+  var a17157;
+  var a17158;
+  var a17159;
+  var a17160;
+  var a17161;
+  var a17162;
+  var a17163;
+  var a17164;
+  var a17165;
+  var a17166;
+  var a17167;
+  var a17168;
+  var a17169;
+  var a17170;
+  var a17171;
+  var a17172;
+  var a17173;
+  var a17174;
+  var a17175;
+  var a17176;
+  var a17177;
+  var a17178;
+  var a17179;
+  var a17180;
+  var a17181;
+  var a17182;
+  var a17183;
+  var a17184;
+  var a17185;
+  var a17186;
+  var a17187;
+  var a17188;
+  var a17189;
+  var a17190;
+  var a17191;
+  var a17192;
+  var a17193;
+  var a17194;
+  var a17195;
+  var a17196;
+  var a17197;
+  var a17198;
+  var a17199;
+  var a17200;
+  var a17201;
+  var a17202;
+  var a17203;
+  var a17204;
+  var a17205;
+  var a17206;
+  var a17207;
+  var a17208;
+  var a17209;
+  var a17210;
+  var a17211;
+  var a17212;
+  var a17213;
+  var a17214;
+  var a17215;
+  var a17216;
+  var a17217;
+  var a17218;
+  var a17219;
+  var a17220;
+  var a17221;
+  var a17222;
+  var a17223;
+  var a17224;
+  var a17225;
+  var a17226;
+  var a17227;
+  var a17228;
+  var a17229;
+  var a17230;
+  var a17231;
+  var a17232;
+  var a17233;
+  var a17234;
+  var a17235;
+  var a17236;
+  var a17237;
+  var a17238;
+  var a17239;
+  var a17240;
+  var a17241;
+  var a17242;
+  var a17243;
+  var a17244;
+  var a17245;
+  var a17246;
+  var a17247;
+  var a17248;
+  var a17249;
+  var a17250;
+  var a17251;
+  var a17252;
+  var a17253;
+  var a17254;
+  var a17255;
+  var a17256;
+  var a17257;
+  var a17258;
+  var a17259;
+  var a17260;
+  var a17261;
+  var a17262;
+  var a17263;
+  var a17264;
+  var a17265;
+  var a17266;
+  var a17267;
+  var a17268;
+  var a17269;
+  var a17270;
+  var a17271;
+  var a17272;
+  var a17273;
+  var a17274;
+  var a17275;
+  var a17276;
+  var a17277;
+  var a17278;
+  var a17279;
+  var a17280;
+  var a17281;
+  var a17282;
+  var a17283;
+  var a17284;
+  var a17285;
+  var a17286;
+  var a17287;
+  var a17288;
+  var a17289;
+  var a17290;
+  var a17291;
+  var a17292;
+  var a17293;
+  var a17294;
+  var a17295;
+  var a17296;
+  var a17297;
+  var a17298;
+  var a17299;
+  var a17300;
+  var a17301;
+  var a17302;
+  var a17303;
+  var a17304;
+  var a17305;
+  var a17306;
+  var a17307;
+  var a17308;
+  var a17309;
+  var a17310;
+  var a17311;
+  var a17312;
+  var a17313;
+  var a17314;
+  var a17315;
+  var a17316;
+  var a17317;
+  var a17318;
+  var a17319;
+  var a17320;
+  var a17321;
+  var a17322;
+  var a17323;
+  var a17324;
+  var a17325;
+  var a17326;
+  var a17327;
+  var a17328;
+  var a17329;
+  var a17330;
+  var a17331;
+  var a17332;
+  var a17333;
+  var a17334;
+  var a17335;
+  var a17336;
+  var a17337;
+  var a17338;
+  var a17339;
+  var a17340;
+  var a17341;
+  var a17342;
+  var a17343;
+  var a17344;
+  var a17345;
+  var a17346;
+  var a17347;
+  var a17348;
+  var a17349;
+  var a17350;
+  var a17351;
+  var a17352;
+  var a17353;
+  var a17354;
+  var a17355;
+  var a17356;
+  var a17357;
+  var a17358;
+  var a17359;
+  var a17360;
+  var a17361;
+  var a17362;
+  var a17363;
+  var a17364;
+  var a17365;
+  var a17366;
+  var a17367;
+  var a17368;
+  var a17369;
+  var a17370;
+  var a17371;
+  var a17372;
+  var a17373;
+  var a17374;
+  var a17375;
+  var a17376;
+  var a17377;
+  var a17378;
+  var a17379;
+  var a17380;
+  var a17381;
+  var a17382;
+  var a17383;
+  var a17384;
+  var a17385;
+  var a17386;
+  var a17387;
+  var a17388;
+  var a17389;
+  var a17390;
+  var a17391;
+  var a17392;
+  var a17393;
+  var a17394;
+  var a17395;
+  var a17396;
+  var a17397;
+  var a17398;
+  var a17399;
+  var a17400;
+  var a17401;
+  var a17402;
+  var a17403;
+  var a17404;
+  var a17405;
+  var a17406;
+  var a17407;
+  var a17408;
+  var a17409;
+  var a17410;
+  var a17411;
+  var a17412;
+  var a17413;
+  var a17414;
+  var a17415;
+  var a17416;
+  var a17417;
+  var a17418;
+  var a17419;
+  var a17420;
+  var a17421;
+  var a17422;
+  var a17423;
+  var a17424;
+  var a17425;
+  var a17426;
+  var a17427;
+  var a17428;
+  var a17429;
+  var a17430;
+  var a17431;
+  var a17432;
+  var a17433;
+  var a17434;
+  var a17435;
+  var a17436;
+  var a17437;
+  var a17438;
+  var a17439;
+  var a17440;
+  var a17441;
+  var a17442;
+  var a17443;
+  var a17444;
+  var a17445;
+  var a17446;
+  var a17447;
+  var a17448;
+  var a17449;
+  var a17450;
+  var a17451;
+  var a17452;
+  var a17453;
+  var a17454;
+  var a17455;
+  var a17456;
+  var a17457;
+  var a17458;
+  var a17459;
+  var a17460;
+  var a17461;
+  var a17462;
+  var a17463;
+  var a17464;
+  var a17465;
+  var a17466;
+  var a17467;
+  var a17468;
+  var a17469;
+  var a17470;
+  var a17471;
+  var a17472;
+  var a17473;
+  var a17474;
+  var a17475;
+  var a17476;
+  var a17477;
+  var a17478;
+  var a17479;
+  var a17480;
+  var a17481;
+  var a17482;
+  var a17483;
+  var a17484;
+  var a17485;
+  var a17486;
+  var a17487;
+  var a17488;
+  var a17489;
+  var a17490;
+  var a17491;
+  var a17492;
+  var a17493;
+  var a17494;
+  var a17495;
+  var a17496;
+  var a17497;
+  var a17498;
+  var a17499;
+  var a17500;
+  var a17501;
+  var a17502;
+  var a17503;
+  var a17504;
+  var a17505;
+  var a17506;
+  var a17507;
+  var a17508;
+  var a17509;
+  var a17510;
+  var a17511;
+  var a17512;
+  var a17513;
+  var a17514;
+  var a17515;
+  var a17516;
+  var a17517;
+  var a17518;
+  var a17519;
+  var a17520;
+  var a17521;
+  var a17522;
+  var a17523;
+  var a17524;
+  var a17525;
+  var a17526;
+  var a17527;
+  var a17528;
+  var a17529;
+  var a17530;
+  var a17531;
+  var a17532;
+  var a17533;
+  var a17534;
+  var a17535;
+  var a17536;
+  var a17537;
+  var a17538;
+  var a17539;
+  var a17540;
+  var a17541;
+  var a17542;
+  var a17543;
+  var a17544;
+  var a17545;
+  var a17546;
+  var a17547;
+  var a17548;
+  var a17549;
+  var a17550;
+  var a17551;
+  var a17552;
+  var a17553;
+  var a17554;
+  var a17555;
+  var a17556;
+  var a17557;
+  var a17558;
+  var a17559;
+  var a17560;
+  var a17561;
+  var a17562;
+  var a17563;
+  var a17564;
+  var a17565;
+  var a17566;
+  var a17567;
+  var a17568;
+  var a17569;
+  var a17570;
+  var a17571;
+  var a17572;
+  var a17573;
+  var a17574;
+  var a17575;
+  var a17576;
+  var a17577;
+  var a17578;
+  var a17579;
+  var a17580;
+  var a17581;
+  var a17582;
+  var a17583;
+  var a17584;
+  var a17585;
+  var a17586;
+  var a17587;
+  var a17588;
+  var a17589;
+  var a17590;
+  var a17591;
+  var a17592;
+  var a17593;
+  var a17594;
+  var a17595;
+  var a17596;
+  var a17597;
+  var a17598;
+  var a17599;
+  var a17600;
+  var a17601;
+  var a17602;
+  var a17603;
+  var a17604;
+  var a17605;
+  var a17606;
+  var a17607;
+  var a17608;
+  var a17609;
+  var a17610;
+  var a17611;
+  var a17612;
+  var a17613;
+  var a17614;
+  var a17615;
+  var a17616;
+  var a17617;
+  var a17618;
+  var a17619;
+  var a17620;
+  var a17621;
+  var a17622;
+  var a17623;
+  var a17624;
+  var a17625;
+  var a17626;
+  var a17627;
+  var a17628;
+  var a17629;
+  var a17630;
+  var a17631;
+  var a17632;
+  var a17633;
+  var a17634;
+  var a17635;
+  var a17636;
+  var a17637;
+  var a17638;
+  var a17639;
+  var a17640;
+  var a17641;
+  var a17642;
+  var a17643;
+  var a17644;
+  var a17645;
+  var a17646;
+  var a17647;
+  var a17648;
+  var a17649;
+  var a17650;
+  var a17651;
+  var a17652;
+  var a17653;
+  var a17654;
+  var a17655;
+  var a17656;
+  var a17657;
+  var a17658;
+  var a17659;
+  var a17660;
+  var a17661;
+  var a17662;
+  var a17663;
+  var a17664;
+  var a17665;
+  var a17666;
+  var a17667;
+  var a17668;
+  var a17669;
+  var a17670;
+  var a17671;
+  var a17672;
+  var a17673;
+  var a17674;
+  var a17675;
+  var a17676;
+  var a17677;
+  var a17678;
+  var a17679;
+  var a17680;
+  var a17681;
+  var a17682;
+  var a17683;
+  var a17684;
+  var a17685;
+  var a17686;
+  var a17687;
+  var a17688;
+  var a17689;
+  var a17690;
+  var a17691;
+  var a17692;
+  var a17693;
+  var a17694;
+  var a17695;
+  var a17696;
+  var a17697;
+  var a17698;
+  var a17699;
+  var a17700;
+  var a17701;
+  var a17702;
+  var a17703;
+  var a17704;
+  var a17705;
+  var a17706;
+  var a17707;
+  var a17708;
+  var a17709;
+  var a17710;
+  var a17711;
+  var a17712;
+  var a17713;
+  var a17714;
+  var a17715;
+  var a17716;
+  var a17717;
+  var a17718;
+  var a17719;
+  var a17720;
+  var a17721;
+  var a17722;
+  var a17723;
+  var a17724;
+  var a17725;
+  var a17726;
+  var a17727;
+  var a17728;
+  var a17729;
+  var a17730;
+  var a17731;
+  var a17732;
+  var a17733;
+  var a17734;
+  var a17735;
+  var a17736;
+  var a17737;
+  var a17738;
+  var a17739;
+  var a17740;
+  var a17741;
+  var a17742;
+  var a17743;
+  var a17744;
+  var a17745;
+  var a17746;
+  var a17747;
+  var a17748;
+  var a17749;
+  var a17750;
+  var a17751;
+  var a17752;
+  var a17753;
+  var a17754;
+  var a17755;
+  var a17756;
+  var a17757;
+  var a17758;
+  var a17759;
+  var a17760;
+  var a17761;
+  var a17762;
+  var a17763;
+  var a17764;
+  var a17765;
+  var a17766;
+  var a17767;
+  var a17768;
+  var a17769;
+  var a17770;
+  var a17771;
+  var a17772;
+  var a17773;
+  var a17774;
+  var a17775;
+  var a17776;
+  var a17777;
+  var a17778;
+  var a17779;
+  var a17780;
+  var a17781;
+  var a17782;
+  var a17783;
+  var a17784;
+  var a17785;
+  var a17786;
+  var a17787;
+  var a17788;
+  var a17789;
+  var a17790;
+  var a17791;
+  var a17792;
+  var a17793;
+  var a17794;
+  var a17795;
+  var a17796;
+  var a17797;
+  var a17798;
+  var a17799;
+  var a17800;
+  var a17801;
+  var a17802;
+  var a17803;
+  var a17804;
+  var a17805;
+  var a17806;
+  var a17807;
+  var a17808;
+  var a17809;
+  var a17810;
+  var a17811;
+  var a17812;
+  var a17813;
+  var a17814;
+  var a17815;
+  var a17816;
+  var a17817;
+  var a17818;
+  var a17819;
+  var a17820;
+  var a17821;
+  var a17822;
+  var a17823;
+  var a17824;
+  var a17825;
+  var a17826;
+  var a17827;
+  var a17828;
+  var a17829;
+  var a17830;
+  var a17831;
+  var a17832;
+  var a17833;
+  var a17834;
+  var a17835;
+  var a17836;
+  var a17837;
+  var a17838;
+  var a17839;
+  var a17840;
+  var a17841;
+  var a17842;
+  var a17843;
+  var a17844;
+  var a17845;
+  var a17846;
+  var a17847;
+  var a17848;
+  var a17849;
+  var a17850;
+  var a17851;
+  var a17852;
+  var a17853;
+  var a17854;
+  var a17855;
+  var a17856;
+  var a17857;
+  var a17858;
+  var a17859;
+  var a17860;
+  var a17861;
+  var a17862;
+  var a17863;
+  var a17864;
+  var a17865;
+  var a17866;
+  var a17867;
+  var a17868;
+  var a17869;
+  var a17870;
+  var a17871;
+  var a17872;
+  var a17873;
+  var a17874;
+  var a17875;
+  var a17876;
+  var a17877;
+  var a17878;
+  var a17879;
+  var a17880;
+  var a17881;
+  var a17882;
+  var a17883;
+  var a17884;
+  var a17885;
+  var a17886;
+  var a17887;
+  var a17888;
+  var a17889;
+  var a17890;
+  var a17891;
+  var a17892;
+  var a17893;
+  var a17894;
+  var a17895;
+  var a17896;
+  var a17897;
+  var a17898;
+  var a17899;
+  var a17900;
+  var a17901;
+  var a17902;
+  var a17903;
+  var a17904;
+  var a17905;
+  var a17906;
+  var a17907;
+  var a17908;
+  var a17909;
+  var a17910;
+  var a17911;
+  var a17912;
+  var a17913;
+  var a17914;
+  var a17915;
+  var a17916;
+  var a17917;
+  var a17918;
+  var a17919;
+  var a17920;
+  var a17921;
+  var a17922;
+  var a17923;
+  var a17924;
+  var a17925;
+  var a17926;
+  var a17927;
+  var a17928;
+  var a17929;
+  var a17930;
+  var a17931;
+  var a17932;
+  var a17933;
+  var a17934;
+  var a17935;
+  var a17936;
+  var a17937;
+  var a17938;
+  var a17939;
+  var a17940;
+  var a17941;
+  var a17942;
+  var a17943;
+  var a17944;
+  var a17945;
+  var a17946;
+  var a17947;
+  var a17948;
+  var a17949;
+  var a17950;
+  var a17951;
+  var a17952;
+  var a17953;
+  var a17954;
+  var a17955;
+  var a17956;
+  var a17957;
+  var a17958;
+  var a17959;
+  var a17960;
+  var a17961;
+  var a17962;
+  var a17963;
+  var a17964;
+  var a17965;
+  var a17966;
+  var a17967;
+  var a17968;
+  var a17969;
+  var a17970;
+  var a17971;
+  var a17972;
+  var a17973;
+  var a17974;
+  var a17975;
+  var a17976;
+  var a17977;
+  var a17978;
+  var a17979;
+  var a17980;
+  var a17981;
+  var a17982;
+  var a17983;
+  var a17984;
+  var a17985;
+  var a17986;
+  var a17987;
+  var a17988;
+  var a17989;
+  var a17990;
+  var a17991;
+  var a17992;
+  var a17993;
+  var a17994;
+  var a17995;
+  var a17996;
+  var a17997;
+  var a17998;
+  var a17999;
+  var a18000;
+  var a18001;
+  var a18002;
+  var a18003;
+  var a18004;
+  var a18005;
+  var a18006;
+  var a18007;
+  var a18008;
+  var a18009;
+  var a18010;
+  var a18011;
+  var a18012;
+  var a18013;
+  var a18014;
+  var a18015;
+  var a18016;
+  var a18017;
+  var a18018;
+  var a18019;
+  var a18020;
+  var a18021;
+  var a18022;
+  var a18023;
+  var a18024;
+  var a18025;
+  var a18026;
+  var a18027;
+  var a18028;
+  var a18029;
+  var a18030;
+  var a18031;
+  var a18032;
+  var a18033;
+  var a18034;
+  var a18035;
+  var a18036;
+  var a18037;
+  var a18038;
+  var a18039;
+  var a18040;
+  var a18041;
+  var a18042;
+  var a18043;
+  var a18044;
+  var a18045;
+  var a18046;
+  var a18047;
+  var a18048;
+  var a18049;
+  var a18050;
+  var a18051;
+  var a18052;
+  var a18053;
+  var a18054;
+  var a18055;
+  var a18056;
+  var a18057;
+  var a18058;
+  var a18059;
+  var a18060;
+  var a18061;
+  var a18062;
+  var a18063;
+  var a18064;
+  var a18065;
+  var a18066;
+  var a18067;
+  var a18068;
+  var a18069;
+  var a18070;
+  var a18071;
+  var a18072;
+  var a18073;
+  var a18074;
+  var a18075;
+  var a18076;
+  var a18077;
+  var a18078;
+  var a18079;
+  var a18080;
+  var a18081;
+  var a18082;
+  var a18083;
+  var a18084;
+  var a18085;
+  var a18086;
+  var a18087;
+  var a18088;
+  var a18089;
+  var a18090;
+  var a18091;
+  var a18092;
+  var a18093;
+  var a18094;
+  var a18095;
+  var a18096;
+  var a18097;
+  var a18098;
+  var a18099;
+  var a18100;
+  var a18101;
+  var a18102;
+  var a18103;
+  var a18104;
+  var a18105;
+  var a18106;
+  var a18107;
+  var a18108;
+  var a18109;
+  var a18110;
+  var a18111;
+  var a18112;
+  var a18113;
+  var a18114;
+  var a18115;
+  var a18116;
+  var a18117;
+  var a18118;
+  var a18119;
+  var a18120;
+  var a18121;
+  var a18122;
+  var a18123;
+  var a18124;
+  var a18125;
+  var a18126;
+  var a18127;
+  var a18128;
+  var a18129;
+  var a18130;
+  var a18131;
+  var a18132;
+  var a18133;
+  var a18134;
+  var a18135;
+  var a18136;
+  var a18137;
+  var a18138;
+  var a18139;
+  var a18140;
+  var a18141;
+  var a18142;
+  var a18143;
+  var a18144;
+  var a18145;
+  var a18146;
+  var a18147;
+  var a18148;
+  var a18149;
+  var a18150;
+  var a18151;
+  var a18152;
+  var a18153;
+  var a18154;
+  var a18155;
+  var a18156;
+  var a18157;
+  var a18158;
+  var a18159;
+  var a18160;
+  var a18161;
+  var a18162;
+  var a18163;
+  var a18164;
+  var a18165;
+  var a18166;
+  var a18167;
+  var a18168;
+  var a18169;
+  var a18170;
+  var a18171;
+  var a18172;
+  var a18173;
+  var a18174;
+  var a18175;
+  var a18176;
+  var a18177;
+  var a18178;
+  var a18179;
+  var a18180;
+  var a18181;
+  var a18182;
+  var a18183;
+  var a18184;
+  var a18185;
+  var a18186;
+  var a18187;
+  var a18188;
+  var a18189;
+  var a18190;
+  var a18191;
+  var a18192;
+  var a18193;
+  var a18194;
+  var a18195;
+  var a18196;
+  var a18197;
+  var a18198;
+  var a18199;
+  var a18200;
+  var a18201;
+  var a18202;
+  var a18203;
+  var a18204;
+  var a18205;
+  var a18206;
+  var a18207;
+  var a18208;
+  var a18209;
+  var a18210;
+  var a18211;
+  var a18212;
+  var a18213;
+  var a18214;
+  var a18215;
+  var a18216;
+  var a18217;
+  var a18218;
+  var a18219;
+  var a18220;
+  var a18221;
+  var a18222;
+  var a18223;
+  var a18224;
+  var a18225;
+  var a18226;
+  var a18227;
+  var a18228;
+  var a18229;
+  var a18230;
+  var a18231;
+  var a18232;
+  var a18233;
+  var a18234;
+  var a18235;
+  var a18236;
+  var a18237;
+  var a18238;
+  var a18239;
+  var a18240;
+  var a18241;
+  var a18242;
+  var a18243;
+  var a18244;
+  var a18245;
+  var a18246;
+  var a18247;
+  var a18248;
+  var a18249;
+  var a18250;
+  var a18251;
+  var a18252;
+  var a18253;
+  var a18254;
+  var a18255;
+  var a18256;
+  var a18257;
+  var a18258;
+  var a18259;
+  var a18260;
+  var a18261;
+  var a18262;
+  var a18263;
+  var a18264;
+  var a18265;
+  var a18266;
+  var a18267;
+  var a18268;
+  var a18269;
+  var a18270;
+  var a18271;
+  var a18272;
+  var a18273;
+  var a18274;
+  var a18275;
+  var a18276;
+  var a18277;
+  var a18278;
+  var a18279;
+  var a18280;
+  var a18281;
+  var a18282;
+  var a18283;
+  var a18284;
+  var a18285;
+  var a18286;
+  var a18287;
+  var a18288;
+  var a18289;
+  var a18290;
+  var a18291;
+  var a18292;
+  var a18293;
+  var a18294;
+  var a18295;
+  var a18296;
+  var a18297;
+  var a18298;
+  var a18299;
+  var a18300;
+  var a18301;
+  var a18302;
+  var a18303;
+  var a18304;
+  var a18305;
+  var a18306;
+  var a18307;
+  var a18308;
+  var a18309;
+  var a18310;
+  var a18311;
+  var a18312;
+  var a18313;
+  var a18314;
+  var a18315;
+  var a18316;
+  var a18317;
+  var a18318;
+  var a18319;
+  var a18320;
+  var a18321;
+  var a18322;
+  var a18323;
+  var a18324;
+  var a18325;
+  var a18326;
+  var a18327;
+  var a18328;
+  var a18329;
+  var a18330;
+  var a18331;
+  var a18332;
+  var a18333;
+  var a18334;
+  var a18335;
+  var a18336;
+  var a18337;
+  var a18338;
+  var a18339;
+  var a18340;
+  var a18341;
+  var a18342;
+  var a18343;
+  var a18344;
+  var a18345;
+  var a18346;
+  var a18347;
+  var a18348;
+  var a18349;
+  var a18350;
+  var a18351;
+  var a18352;
+  var a18353;
+  var a18354;
+  var a18355;
+  var a18356;
+  var a18357;
+  var a18358;
+  var a18359;
+  var a18360;
+  var a18361;
+  var a18362;
+  var a18363;
+  var a18364;
+  var a18365;
+  var a18366;
+  var a18367;
+  var a18368;
+  var a18369;
+  var a18370;
+  var a18371;
+  var a18372;
+  var a18373;
+  var a18374;
+  var a18375;
+  var a18376;
+  var a18377;
+  var a18378;
+  var a18379;
+  var a18380;
+  var a18381;
+  var a18382;
+  var a18383;
+  var a18384;
+  var a18385;
+  var a18386;
+  var a18387;
+  var a18388;
+  var a18389;
+  var a18390;
+  var a18391;
+  var a18392;
+  var a18393;
+  var a18394;
+  var a18395;
+  var a18396;
+  var a18397;
+  var a18398;
+  var a18399;
+  var a18400;
+  var a18401;
+  var a18402;
+  var a18403;
+  var a18404;
+  var a18405;
+  var a18406;
+  var a18407;
+  var a18408;
+  var a18409;
+  var a18410;
+  var a18411;
+  var a18412;
+  var a18413;
+  var a18414;
+  var a18415;
+  var a18416;
+  var a18417;
+  var a18418;
+  var a18419;
+  var a18420;
+  var a18421;
+  var a18422;
+  var a18423;
+  var a18424;
+  var a18425;
+  var a18426;
+  var a18427;
+  var a18428;
+  var a18429;
+  var a18430;
+  var a18431;
+  var a18432;
+  var a18433;
+  var a18434;
+  var a18435;
+  var a18436;
+  var a18437;
+  var a18438;
+  var a18439;
+  var a18440;
+  var a18441;
+  var a18442;
+  var a18443;
+  var a18444;
+  var a18445;
+  var a18446;
+  var a18447;
+  var a18448;
+  var a18449;
+  var a18450;
+  var a18451;
+  var a18452;
+  var a18453;
+  var a18454;
+  var a18455;
+  var a18456;
+  var a18457;
+  var a18458;
+  var a18459;
+  var a18460;
+  var a18461;
+  var a18462;
+  var a18463;
+  var a18464;
+  var a18465;
+  var a18466;
+  var a18467;
+  var a18468;
+  var a18469;
+  var a18470;
+  var a18471;
+  var a18472;
+  var a18473;
+  var a18474;
+  var a18475;
+  var a18476;
+  var a18477;
+  var a18478;
+  var a18479;
+  var a18480;
+  var a18481;
+  var a18482;
+  var a18483;
+  var a18484;
+  var a18485;
+  var a18486;
+  var a18487;
+  var a18488;
+  var a18489;
+  var a18490;
+  var a18491;
+  var a18492;
+  var a18493;
+  var a18494;
+  var a18495;
+  var a18496;
+  var a18497;
+  var a18498;
+  var a18499;
+  var a18500;
+  var a18501;
+  var a18502;
+  var a18503;
+  var a18504;
+  var a18505;
+  var a18506;
+  var a18507;
+  var a18508;
+  var a18509;
+  var a18510;
+  var a18511;
+  var a18512;
+  var a18513;
+  var a18514;
+  var a18515;
+  var a18516;
+  var a18517;
+  var a18518;
+  var a18519;
+  var a18520;
+  var a18521;
+  var a18522;
+  var a18523;
+  var a18524;
+  var a18525;
+  var a18526;
+  var a18527;
+  var a18528;
+  var a18529;
+  var a18530;
+  var a18531;
+  var a18532;
+  var a18533;
+  var a18534;
+  var a18535;
+  var a18536;
+  var a18537;
+  var a18538;
+  var a18539;
+  var a18540;
+  var a18541;
+  var a18542;
+  var a18543;
+  var a18544;
+  var a18545;
+  var a18546;
+  var a18547;
+  var a18548;
+  var a18549;
+  var a18550;
+  var a18551;
+  var a18552;
+  var a18553;
+  var a18554;
+  var a18555;
+  var a18556;
+  var a18557;
+  var a18558;
+  var a18559;
+  var a18560;
+  var a18561;
+  var a18562;
+  var a18563;
+  var a18564;
+  var a18565;
+  var a18566;
+  var a18567;
+  var a18568;
+  var a18569;
+  var a18570;
+  var a18571;
+  var a18572;
+  var a18573;
+  var a18574;
+  var a18575;
+  var a18576;
+  var a18577;
+  var a18578;
+  var a18579;
+  var a18580;
+  var a18581;
+  var a18582;
+  var a18583;
+  var a18584;
+  var a18585;
+  var a18586;
+  var a18587;
+  var a18588;
+  var a18589;
+  var a18590;
+  var a18591;
+  var a18592;
+  var a18593;
+  var a18594;
+  var a18595;
+  var a18596;
+  var a18597;
+  var a18598;
+  var a18599;
+  var a18600;
+  var a18601;
+  var a18602;
+  var a18603;
+  var a18604;
+  var a18605;
+  var a18606;
+  var a18607;
+  var a18608;
+  var a18609;
+  var a18610;
+  var a18611;
+  var a18612;
+  var a18613;
+  var a18614;
+  var a18615;
+  var a18616;
+  var a18617;
+  var a18618;
+  var a18619;
+  var a18620;
+  var a18621;
+  var a18622;
+  var a18623;
+  var a18624;
+  var a18625;
+  var a18626;
+  var a18627;
+  var a18628;
+  var a18629;
+  var a18630;
+  var a18631;
+  var a18632;
+  var a18633;
+  var a18634;
+  var a18635;
+  var a18636;
+  var a18637;
+  var a18638;
+  var a18639;
+  var a18640;
+  var a18641;
+  var a18642;
+  var a18643;
+  var a18644;
+  var a18645;
+  var a18646;
+  var a18647;
+  var a18648;
+  var a18649;
+  var a18650;
+  var a18651;
+  var a18652;
+  var a18653;
+  var a18654;
+  var a18655;
+  var a18656;
+  var a18657;
+  var a18658;
+  var a18659;
+  var a18660;
+  var a18661;
+  var a18662;
+  var a18663;
+  var a18664;
+  var a18665;
+  var a18666;
+  var a18667;
+  var a18668;
+  var a18669;
+  var a18670;
+  var a18671;
+  var a18672;
+  var a18673;
+  var a18674;
+  var a18675;
+  var a18676;
+  var a18677;
+  var a18678;
+  var a18679;
+  var a18680;
+  var a18681;
+  var a18682;
+  var a18683;
+  var a18684;
+  var a18685;
+  var a18686;
+  var a18687;
+  var a18688;
+  var a18689;
+  var a18690;
+  var a18691;
+  var a18692;
+  var a18693;
+  var a18694;
+  var a18695;
+  var a18696;
+  var a18697;
+  var a18698;
+  var a18699;
+  var a18700;
+  var a18701;
+  var a18702;
+  var a18703;
+  var a18704;
+  var a18705;
+  var a18706;
+  var a18707;
+  var a18708;
+  var a18709;
+  var a18710;
+  var a18711;
+  var a18712;
+  var a18713;
+  var a18714;
+  var a18715;
+  var a18716;
+  var a18717;
+  var a18718;
+  var a18719;
+  var a18720;
+  var a18721;
+  var a18722;
+  var a18723;
+  var a18724;
+  var a18725;
+  var a18726;
+  var a18727;
+  var a18728;
+  var a18729;
+  var a18730;
+  var a18731;
+  var a18732;
+  var a18733;
+  var a18734;
+  var a18735;
+  var a18736;
+  var a18737;
+  var a18738;
+  var a18739;
+  var a18740;
+  var a18741;
+  var a18742;
+  var a18743;
+  var a18744;
+  var a18745;
+  var a18746;
+  var a18747;
+  var a18748;
+  var a18749;
+  var a18750;
+  var a18751;
+  var a18752;
+  var a18753;
+  var a18754;
+  var a18755;
+  var a18756;
+  var a18757;
+  var a18758;
+  var a18759;
+  var a18760;
+  var a18761;
+  var a18762;
+  var a18763;
+  var a18764;
+  var a18765;
+  var a18766;
+  var a18767;
+  var a18768;
+  var a18769;
+  var a18770;
+  var a18771;
+  var a18772;
+  var a18773;
+  var a18774;
+  var a18775;
+  var a18776;
+  var a18777;
+  var a18778;
+  var a18779;
+  var a18780;
+  var a18781;
+  var a18782;
+  var a18783;
+  var a18784;
+  var a18785;
+  var a18786;
+  var a18787;
+  var a18788;
+  var a18789;
+  var a18790;
+  var a18791;
+  var a18792;
+  var a18793;
+  var a18794;
+  var a18795;
+  var a18796;
+  var a18797;
+  var a18798;
+  var a18799;
+  var a18800;
+  var a18801;
+  var a18802;
+  var a18803;
+  var a18804;
+  var a18805;
+  var a18806;
+  var a18807;
+  var a18808;
+  var a18809;
+  var a18810;
+  var a18811;
+  var a18812;
+  var a18813;
+  var a18814;
+  var a18815;
+  var a18816;
+  var a18817;
+  var a18818;
+  var a18819;
+  var a18820;
+  var a18821;
+  var a18822;
+  var a18823;
+  var a18824;
+  var a18825;
+  var a18826;
+  var a18827;
+  var a18828;
+  var a18829;
+  var a18830;
+  var a18831;
+  var a18832;
+  var a18833;
+  var a18834;
+  var a18835;
+  var a18836;
+  var a18837;
+  var a18838;
+  var a18839;
+  var a18840;
+  var a18841;
+  var a18842;
+  var a18843;
+  var a18844;
+  var a18845;
+  var a18846;
+  var a18847;
+  var a18848;
+  var a18849;
+  var a18850;
+  var a18851;
+  var a18852;
+  var a18853;
+  var a18854;
+  var a18855;
+  var a18856;
+  var a18857;
+  var a18858;
+  var a18859;
+  var a18860;
+  var a18861;
+  var a18862;
+  var a18863;
+  var a18864;
+  var a18865;
+  var a18866;
+  var a18867;
+  var a18868;
+  var a18869;
+  var a18870;
+  var a18871;
+  var a18872;
+  var a18873;
+  var a18874;
+  var a18875;
+  var a18876;
+  var a18877;
+  var a18878;
+  var a18879;
+  var a18880;
+  var a18881;
+  var a18882;
+  var a18883;
+  var a18884;
+  var a18885;
+  var a18886;
+  var a18887;
+  var a18888;
+  var a18889;
+  var a18890;
+  var a18891;
+  var a18892;
+  var a18893;
+  var a18894;
+  var a18895;
+  var a18896;
+  var a18897;
+  var a18898;
+  var a18899;
+  var a18900;
+  var a18901;
+  var a18902;
+  var a18903;
+  var a18904;
+  var a18905;
+  var a18906;
+  var a18907;
+  var a18908;
+  var a18909;
+  var a18910;
+  var a18911;
+  var a18912;
+  var a18913;
+  var a18914;
+  var a18915;
+  var a18916;
+  var a18917;
+  var a18918;
+  var a18919;
+  var a18920;
+  var a18921;
+  var a18922;
+  var a18923;
+  var a18924;
+  var a18925;
+  var a18926;
+  var a18927;
+  var a18928;
+  var a18929;
+  var a18930;
+  var a18931;
+  var a18932;
+  var a18933;
+  var a18934;
+  var a18935;
+  var a18936;
+  var a18937;
+  var a18938;
+  var a18939;
+  var a18940;
+  var a18941;
+  var a18942;
+  var a18943;
+  var a18944;
+  var a18945;
+  var a18946;
+  var a18947;
+  var a18948;
+  var a18949;
+  var a18950;
+  var a18951;
+  var a18952;
+  var a18953;
+  var a18954;
+  var a18955;
+  var a18956;
+  var a18957;
+  var a18958;
+  var a18959;
+  var a18960;
+  var a18961;
+  var a18962;
+  var a18963;
+  var a18964;
+  var a18965;
+  var a18966;
+  var a18967;
+  var a18968;
+  var a18969;
+  var a18970;
+  var a18971;
+  var a18972;
+  var a18973;
+  var a18974;
+  var a18975;
+  var a18976;
+  var a18977;
+  var a18978;
+  var a18979;
+  var a18980;
+  var a18981;
+  var a18982;
+  var a18983;
+  var a18984;
+  var a18985;
+  var a18986;
+  var a18987;
+  var a18988;
+  var a18989;
+  var a18990;
+  var a18991;
+  var a18992;
+  var a18993;
+  var a18994;
+  var a18995;
+  var a18996;
+  var a18997;
+  var a18998;
+  var a18999;
+  var a19000;
+  var a19001;
+  var a19002;
+  var a19003;
+  var a19004;
+  var a19005;
+  var a19006;
+  var a19007;
+  var a19008;
+  var a19009;
+  var a19010;
+  var a19011;
+  var a19012;
+  var a19013;
+  var a19014;
+  var a19015;
+  var a19016;
+  var a19017;
+  var a19018;
+  var a19019;
+  var a19020;
+  var a19021;
+  var a19022;
+  var a19023;
+  var a19024;
+  var a19025;
+  var a19026;
+  var a19027;
+  var a19028;
+  var a19029;
+  var a19030;
+  var a19031;
+  var a19032;
+  var a19033;
+  var a19034;
+  var a19035;
+  var a19036;
+  var a19037;
+  var a19038;
+  var a19039;
+  var a19040;
+  var a19041;
+  var a19042;
+  var a19043;
+  var a19044;
+  var a19045;
+  var a19046;
+  var a19047;
+  var a19048;
+  var a19049;
+  var a19050;
+  var a19051;
+  var a19052;
+  var a19053;
+  var a19054;
+  var a19055;
+  var a19056;
+  var a19057;
+  var a19058;
+  var a19059;
+  var a19060;
+  var a19061;
+  var a19062;
+  var a19063;
+  var a19064;
+  var a19065;
+  var a19066;
+  var a19067;
+  var a19068;
+  var a19069;
+  var a19070;
+  var a19071;
+  var a19072;
+  var a19073;
+  var a19074;
+  var a19075;
+  var a19076;
+  var a19077;
+  var a19078;
+  var a19079;
+  var a19080;
+  var a19081;
+  var a19082;
+  var a19083;
+  var a19084;
+  var a19085;
+  var a19086;
+  var a19087;
+  var a19088;
+  var a19089;
+  var a19090;
+  var a19091;
+  var a19092;
+  var a19093;
+  var a19094;
+  var a19095;
+  var a19096;
+  var a19097;
+  var a19098;
+  var a19099;
+  var a19100;
+  var a19101;
+  var a19102;
+  var a19103;
+  var a19104;
+  var a19105;
+  var a19106;
+  var a19107;
+  var a19108;
+  var a19109;
+  var a19110;
+  var a19111;
+  var a19112;
+  var a19113;
+  var a19114;
+  var a19115;
+  var a19116;
+  var a19117;
+  var a19118;
+  var a19119;
+  var a19120;
+  var a19121;
+  var a19122;
+  var a19123;
+  var a19124;
+  var a19125;
+  var a19126;
+  var a19127;
+  var a19128;
+  var a19129;
+  var a19130;
+  var a19131;
+  var a19132;
+  var a19133;
+  var a19134;
+  var a19135;
+  var a19136;
+  var a19137;
+  var a19138;
+  var a19139;
+  var a19140;
+  var a19141;
+  var a19142;
+  var a19143;
+  var a19144;
+  var a19145;
+  var a19146;
+  var a19147;
+  var a19148;
+  var a19149;
+  var a19150;
+  var a19151;
+  var a19152;
+  var a19153;
+  var a19154;
+  var a19155;
+  var a19156;
+  var a19157;
+  var a19158;
+  var a19159;
+  var a19160;
+  var a19161;
+  var a19162;
+  var a19163;
+  var a19164;
+  var a19165;
+  var a19166;
+  var a19167;
+  var a19168;
+  var a19169;
+  var a19170;
+  var a19171;
+  var a19172;
+  var a19173;
+  var a19174;
+  var a19175;
+  var a19176;
+  var a19177;
+  var a19178;
+  var a19179;
+  var a19180;
+  var a19181;
+  var a19182;
+  var a19183;
+  var a19184;
+  var a19185;
+  var a19186;
+  var a19187;
+  var a19188;
+  var a19189;
+  var a19190;
+  var a19191;
+  var a19192;
+  var a19193;
+  var a19194;
+  var a19195;
+  var a19196;
+  var a19197;
+  var a19198;
+  var a19199;
+  var a19200;
+  var a19201;
+  var a19202;
+  var a19203;
+  var a19204;
+  var a19205;
+  var a19206;
+  var a19207;
+  var a19208;
+  var a19209;
+  var a19210;
+  var a19211;
+  var a19212;
+  var a19213;
+  var a19214;
+  var a19215;
+  var a19216;
+  var a19217;
+  var a19218;
+  var a19219;
+  var a19220;
+  var a19221;
+  var a19222;
+  var a19223;
+  var a19224;
+  var a19225;
+  var a19226;
+  var a19227;
+  var a19228;
+  var a19229;
+  var a19230;
+  var a19231;
+  var a19232;
+  var a19233;
+  var a19234;
+  var a19235;
+  var a19236;
+  var a19237;
+  var a19238;
+  var a19239;
+  var a19240;
+  var a19241;
+  var a19242;
+  var a19243;
+  var a19244;
+  var a19245;
+  var a19246;
+  var a19247;
+  var a19248;
+  var a19249;
+  var a19250;
+  var a19251;
+  var a19252;
+  var a19253;
+  var a19254;
+  var a19255;
+  var a19256;
+  var a19257;
+  var a19258;
+  var a19259;
+  var a19260;
+  var a19261;
+  var a19262;
+  var a19263;
+  var a19264;
+  var a19265;
+  var a19266;
+  var a19267;
+  var a19268;
+  var a19269;
+  var a19270;
+  var a19271;
+  var a19272;
+  var a19273;
+  var a19274;
+  var a19275;
+  var a19276;
+  var a19277;
+  var a19278;
+  var a19279;
+  var a19280;
+  var a19281;
+  var a19282;
+  var a19283;
+  var a19284;
+  var a19285;
+  var a19286;
+  var a19287;
+  var a19288;
+  var a19289;
+  var a19290;
+  var a19291;
+  var a19292;
+  var a19293;
+  var a19294;
+  var a19295;
+  var a19296;
+  var a19297;
+  var a19298;
+  var a19299;
+  var a19300;
+  var a19301;
+  var a19302;
+  var a19303;
+  var a19304;
+  var a19305;
+  var a19306;
+  var a19307;
+  var a19308;
+  var a19309;
+  var a19310;
+  var a19311;
+  var a19312;
+  var a19313;
+  var a19314;
+  var a19315;
+  var a19316;
+  var a19317;
+  var a19318;
+  var a19319;
+  var a19320;
+  var a19321;
+  var a19322;
+  var a19323;
+  var a19324;
+  var a19325;
+  var a19326;
+  var a19327;
+  var a19328;
+  var a19329;
+  var a19330;
+  var a19331;
+  var a19332;
+  var a19333;
+  var a19334;
+  var a19335;
+  var a19336;
+  var a19337;
+  var a19338;
+  var a19339;
+  var a19340;
+  var a19341;
+  var a19342;
+  var a19343;
+  var a19344;
+  var a19345;
+  var a19346;
+  var a19347;
+  var a19348;
+  var a19349;
+  var a19350;
+  var a19351;
+  var a19352;
+  var a19353;
+  var a19354;
+  var a19355;
+  var a19356;
+  var a19357;
+  var a19358;
+  var a19359;
+  var a19360;
+  var a19361;
+  var a19362;
+  var a19363;
+  var a19364;
+  var a19365;
+  var a19366;
+  var a19367;
+  var a19368;
+  var a19369;
+  var a19370;
+  var a19371;
+  var a19372;
+  var a19373;
+  var a19374;
+  var a19375;
+  var a19376;
+  var a19377;
+  var a19378;
+  var a19379;
+  var a19380;
+  var a19381;
+  var a19382;
+  var a19383;
+  var a19384;
+  var a19385;
+  var a19386;
+  var a19387;
+  var a19388;
+  var a19389;
+  var a19390;
+  var a19391;
+  var a19392;
+  var a19393;
+  var a19394;
+  var a19395;
+  var a19396;
+  var a19397;
+  var a19398;
+  var a19399;
+  var a19400;
+  var a19401;
+  var a19402;
+  var a19403;
+  var a19404;
+  var a19405;
+  var a19406;
+  var a19407;
+  var a19408;
+  var a19409;
+  var a19410;
+  var a19411;
+  var a19412;
+  var a19413;
+  var a19414;
+  var a19415;
+  var a19416;
+  var a19417;
+  var a19418;
+  var a19419;
+  var a19420;
+  var a19421;
+  var a19422;
+  var a19423;
+  var a19424;
+  var a19425;
+  var a19426;
+  var a19427;
+  var a19428;
+  var a19429;
+  var a19430;
+  var a19431;
+  var a19432;
+  var a19433;
+  var a19434;
+  var a19435;
+  var a19436;
+  var a19437;
+  var a19438;
+  var a19439;
+  var a19440;
+  var a19441;
+  var a19442;
+  var a19443;
+  var a19444;
+  var a19445;
+  var a19446;
+  var a19447;
+  var a19448;
+  var a19449;
+  var a19450;
+  var a19451;
+  var a19452;
+  var a19453;
+  var a19454;
+  var a19455;
+  var a19456;
+  var a19457;
+  var a19458;
+  var a19459;
+  var a19460;
+  var a19461;
+  var a19462;
+  var a19463;
+  var a19464;
+  var a19465;
+  var a19466;
+  var a19467;
+  var a19468;
+  var a19469;
+  var a19470;
+  var a19471;
+  var a19472;
+  var a19473;
+  var a19474;
+  var a19475;
+  var a19476;
+  var a19477;
+  var a19478;
+  var a19479;
+  var a19480;
+  var a19481;
+  var a19482;
+  var a19483;
+  var a19484;
+  var a19485;
+  var a19486;
+  var a19487;
+  var a19488;
+  var a19489;
+  var a19490;
+  var a19491;
+  var a19492;
+  var a19493;
+  var a19494;
+  var a19495;
+  var a19496;
+  var a19497;
+  var a19498;
+  var a19499;
+  var a19500;
+  var a19501;
+  var a19502;
+  var a19503;
+  var a19504;
+  var a19505;
+  var a19506;
+  var a19507;
+  var a19508;
+  var a19509;
+  var a19510;
+  var a19511;
+  var a19512;
+  var a19513;
+  var a19514;
+  var a19515;
+  var a19516;
+  var a19517;
+  var a19518;
+  var a19519;
+  var a19520;
+  var a19521;
+  var a19522;
+  var a19523;
+  var a19524;
+  var a19525;
+  var a19526;
+  var a19527;
+  var a19528;
+  var a19529;
+  var a19530;
+  var a19531;
+  var a19532;
+  var a19533;
+  var a19534;
+  var a19535;
+  var a19536;
+  var a19537;
+  var a19538;
+  var a19539;
+  var a19540;
+  var a19541;
+  var a19542;
+  var a19543;
+  var a19544;
+  var a19545;
+  var a19546;
+  var a19547;
+  var a19548;
+  var a19549;
+  var a19550;
+  var a19551;
+  var a19552;
+  var a19553;
+  var a19554;
+  var a19555;
+  var a19556;
+  var a19557;
+  var a19558;
+  var a19559;
+  var a19560;
+  var a19561;
+  var a19562;
+  var a19563;
+  var a19564;
+  var a19565;
+  var a19566;
+  var a19567;
+  var a19568;
+  var a19569;
+  var a19570;
+  var a19571;
+  var a19572;
+  var a19573;
+  var a19574;
+  var a19575;
+  var a19576;
+  var a19577;
+  var a19578;
+  var a19579;
+  var a19580;
+  var a19581;
+  var a19582;
+  var a19583;
+  var a19584;
+  var a19585;
+  var a19586;
+  var a19587;
+  var a19588;
+  var a19589;
+  var a19590;
+  var a19591;
+  var a19592;
+  var a19593;
+  var a19594;
+  var a19595;
+  var a19596;
+  var a19597;
+  var a19598;
+  var a19599;
+  var a19600;
+  var a19601;
+  var a19602;
+  var a19603;
+  var a19604;
+  var a19605;
+  var a19606;
+  var a19607;
+  var a19608;
+  var a19609;
+  var a19610;
+  var a19611;
+  var a19612;
+  var a19613;
+  var a19614;
+  var a19615;
+  var a19616;
+  var a19617;
+  var a19618;
+  var a19619;
+  var a19620;
+  var a19621;
+  var a19622;
+  var a19623;
+  var a19624;
+  var a19625;
+  var a19626;
+  var a19627;
+  var a19628;
+  var a19629;
+  var a19630;
+  var a19631;
+  var a19632;
+  var a19633;
+  var a19634;
+  var a19635;
+  var a19636;
+  var a19637;
+  var a19638;
+  var a19639;
+  var a19640;
+  var a19641;
+  var a19642;
+  var a19643;
+  var a19644;
+  var a19645;
+  var a19646;
+  var a19647;
+  var a19648;
+  var a19649;
+  var a19650;
+  var a19651;
+  var a19652;
+  var a19653;
+  var a19654;
+  var a19655;
+  var a19656;
+  var a19657;
+  var a19658;
+  var a19659;
+  var a19660;
+  var a19661;
+  var a19662;
+  var a19663;
+  var a19664;
+  var a19665;
+  var a19666;
+  var a19667;
+  var a19668;
+  var a19669;
+  var a19670;
+  var a19671;
+  var a19672;
+  var a19673;
+  var a19674;
+  var a19675;
+  var a19676;
+  var a19677;
+  var a19678;
+  var a19679;
+  var a19680;
+  var a19681;
+  var a19682;
+  var a19683;
+  var a19684;
+  var a19685;
+  var a19686;
+  var a19687;
+  var a19688;
+  var a19689;
+  var a19690;
+  var a19691;
+  var a19692;
+  var a19693;
+  var a19694;
+  var a19695;
+  var a19696;
+  var a19697;
+  var a19698;
+  var a19699;
+  var a19700;
+  var a19701;
+  var a19702;
+  var a19703;
+  var a19704;
+  var a19705;
+  var a19706;
+  var a19707;
+  var a19708;
+  var a19709;
+  var a19710;
+  var a19711;
+  var a19712;
+  var a19713;
+  var a19714;
+  var a19715;
+  var a19716;
+  var a19717;
+  var a19718;
+  var a19719;
+  var a19720;
+  var a19721;
+  var a19722;
+  var a19723;
+  var a19724;
+  var a19725;
+  var a19726;
+  var a19727;
+  var a19728;
+  var a19729;
+  var a19730;
+  var a19731;
+  var a19732;
+  var a19733;
+  var a19734;
+  var a19735;
+  var a19736;
+  var a19737;
+  var a19738;
+  var a19739;
+  var a19740;
+  var a19741;
+  var a19742;
+  var a19743;
+  var a19744;
+  var a19745;
+  var a19746;
+  var a19747;
+  var a19748;
+  var a19749;
+  var a19750;
+  var a19751;
+  var a19752;
+  var a19753;
+  var a19754;
+  var a19755;
+  var a19756;
+  var a19757;
+  var a19758;
+  var a19759;
+  var a19760;
+  var a19761;
+  var a19762;
+  var a19763;
+  var a19764;
+  var a19765;
+  var a19766;
+  var a19767;
+  var a19768;
+  var a19769;
+  var a19770;
+  var a19771;
+  var a19772;
+  var a19773;
+  var a19774;
+  var a19775;
+  var a19776;
+  var a19777;
+  var a19778;
+  var a19779;
+  var a19780;
+  var a19781;
+  var a19782;
+  var a19783;
+  var a19784;
+  var a19785;
+  var a19786;
+  var a19787;
+  var a19788;
+  var a19789;
+  var a19790;
+  var a19791;
+  var a19792;
+  var a19793;
+  var a19794;
+  var a19795;
+  var a19796;
+  var a19797;
+  var a19798;
+  var a19799;
+  var a19800;
+  var a19801;
+  var a19802;
+  var a19803;
+  var a19804;
+  var a19805;
+  var a19806;
+  var a19807;
+  var a19808;
+  var a19809;
+  var a19810;
+  var a19811;
+  var a19812;
+  var a19813;
+  var a19814;
+  var a19815;
+  var a19816;
+  var a19817;
+  var a19818;
+  var a19819;
+  var a19820;
+  var a19821;
+  var a19822;
+  var a19823;
+  var a19824;
+  var a19825;
+  var a19826;
+  var a19827;
+  var a19828;
+  var a19829;
+  var a19830;
+  var a19831;
+  var a19832;
+  var a19833;
+  var a19834;
+  var a19835;
+  var a19836;
+  var a19837;
+  var a19838;
+  var a19839;
+  var a19840;
+  var a19841;
+  var a19842;
+  var a19843;
+  var a19844;
+  var a19845;
+  var a19846;
+  var a19847;
+  var a19848;
+  var a19849;
+  var a19850;
+  var a19851;
+  var a19852;
+  var a19853;
+  var a19854;
+  var a19855;
+  var a19856;
+  var a19857;
+  var a19858;
+  var a19859;
+  var a19860;
+  var a19861;
+  var a19862;
+  var a19863;
+  var a19864;
+  var a19865;
+  var a19866;
+  var a19867;
+  var a19868;
+  var a19869;
+  var a19870;
+  var a19871;
+  var a19872;
+  var a19873;
+  var a19874;
+  var a19875;
+  var a19876;
+  var a19877;
+  var a19878;
+  var a19879;
+  var a19880;
+  var a19881;
+  var a19882;
+  var a19883;
+  var a19884;
+  var a19885;
+  var a19886;
+  var a19887;
+  var a19888;
+  var a19889;
+  var a19890;
+  var a19891;
+  var a19892;
+  var a19893;
+  var a19894;
+  var a19895;
+  var a19896;
+  var a19897;
+  var a19898;
+  var a19899;
+  var a19900;
+  var a19901;
+  var a19902;
+  var a19903;
+  var a19904;
+  var a19905;
+  var a19906;
+  var a19907;
+  var a19908;
+  var a19909;
+  var a19910;
+  var a19911;
+  var a19912;
+  var a19913;
+  var a19914;
+  var a19915;
+  var a19916;
+  var a19917;
+  var a19918;
+  var a19919;
+  var a19920;
+  var a19921;
+  var a19922;
+  var a19923;
+  var a19924;
+  var a19925;
+  var a19926;
+  var a19927;
+  var a19928;
+  var a19929;
+  var a19930;
+  var a19931;
+  var a19932;
+  var a19933;
+  var a19934;
+  var a19935;
+  var a19936;
+  var a19937;
+  var a19938;
+  var a19939;
+  var a19940;
+  var a19941;
+  var a19942;
+  var a19943;
+  var a19944;
+  var a19945;
+  var a19946;
+  var a19947;
+  var a19948;
+  var a19949;
+  var a19950;
+  var a19951;
+  var a19952;
+  var a19953;
+  var a19954;
+  var a19955;
+  var a19956;
+  var a19957;
+  var a19958;
+  var a19959;
+  var a19960;
+  var a19961;
+  var a19962;
+  var a19963;
+  var a19964;
+  var a19965;
+  var a19966;
+  var a19967;
+  var a19968;
+  var a19969;
+  var a19970;
+  var a19971;
+  var a19972;
+  var a19973;
+  var a19974;
+  var a19975;
+  var a19976;
+  var a19977;
+  var a19978;
+  var a19979;
+  var a19980;
+  var a19981;
+  var a19982;
+  var a19983;
+  var a19984;
+  var a19985;
+  var a19986;
+  var a19987;
+  var a19988;
+  var a19989;
+  var a19990;
+  var a19991;
+  var a19992;
+  var a19993;
+  var a19994;
+  var a19995;
+  var a19996;
+  var a19997;
+  var a19998;
+  var a19999;
+  var a20000;
+}
+
+main() {
+  var a = new A();
+  a.a20000 = 42;
+  Expect.equals(42, a.a20000);
+}
\ No newline at end of file
diff --git a/tests/language/malformed_test.dart b/tests/language/malformed_test.dart
index 2364696..e43ee7a 100644
--- a/tests/language/malformed_test.dart
+++ b/tests/language/malformed_test.dart
@@ -121,8 +121,8 @@
   // The expression 'undeclared_prefix.Unresolved()' is parsed as the invocation
   // of the named constructor 'Unresolved' on the type 'undeclared_prefix'.
   Expect.throws(() => new undeclared_prefix.Unresolved(), (e) => true);
-  // The expression 'undeclared_prefix.Unresolved<int>' cannot be parsed.
-  Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true);  /// 05: compile-time error
+  // The expression 'undeclared_prefix.Unresolved<int>' is a malformed type.
+  Expect.throws(() => new undeclared_prefix.Unresolved<int>(), (e) => true);
 
   try {
     try {
@@ -163,7 +163,7 @@
   try {
     throw 'foo';
   }
-    on undeclared_prefix.Unresolved<int>  /// 06: compile-time error
+    on undeclared_prefix.Unresolved<int>  /// 06: runtime error
     catch (e) {
   }
 }
\ No newline at end of file
diff --git a/tests/language/memory_swap_test.dart b/tests/language/memory_swap_test.dart
new file mode 100644
index 0000000..53fd4b4
--- /dev/null
+++ b/tests/language/memory_swap_test.dart
@@ -0,0 +1,70 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 the ParalleMoveResolver in the VM uses valid registers
+// when requiring scratch registers.
+
+main() {
+  // Iterate enough to ensure optimizing `spillingMethod`.
+  for (int i = 0; i < 100000; i++) {
+    spillingMethod(i, () => 0);
+  }
+}
+
+spillingMethod(what, obfuscate) {
+  // Define lots of variables to get a few in stack.
+  var a = obfuscate();
+  var b = obfuscate();
+  var c = obfuscate();
+  var d = obfuscate();
+  var e = obfuscate();
+  var f = obfuscate();
+  var g = obfuscate();
+  var h = obfuscate();
+  var i = obfuscate();
+  var j = obfuscate();
+  var k = obfuscate();
+  var l = obfuscate();
+  var m = obfuscate();
+  var n = obfuscate();
+  var o = obfuscate();
+  var p = obfuscate();
+  var q = obfuscate();
+  var r = obfuscate();
+  var s = obfuscate();
+  var t = obfuscate();
+  var u = obfuscate();
+  var v = obfuscate();
+
+  // Swap all variables, in the hope of a memory <-> memory swap operation.
+  while (what == 42) {
+    a = b;
+    b = a;
+    c = d;
+    d = c;
+    e = f;
+    f = e;
+    g = h;
+    h = g;
+    i = j;
+    j = i;
+    k = l;
+    l = k;
+    m = n;
+    n = m;
+    o = p;
+    p = o;
+    q = r;
+    r = q;
+    s = t;
+    t = s;
+    u = v;
+    v = u;
+    what++;
+  }
+
+  // Keep all variables alive.
+  return a + b + c + d + e + f + g + h + i + j + k + l + m + n + o
+       + p + q + r + s + t + u + v;
+}
diff --git a/tests/language/number_identity2_test.dart b/tests/language/number_identity2_test.dart
index 1a4c90d..655ac51 100644
--- a/tests/language/number_identity2_test.dart
+++ b/tests/language/number_identity2_test.dart
@@ -8,14 +8,31 @@
 // VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
+import 'dart:typed_data';
 
-main() {
-  for (int i = 0; i < 20; i++) testNumberIdentity();
+double uint64toDouble(int i) {
+  var buffer = new Uint8List(8).buffer;
+  var bdata = new ByteData.view(buffer);
+  bdata.setUint64(0, i);
+  return bdata.getFloat64(0);
 }
 
-
 testNumberIdentity () {
   var a = double.NAN;
   var b = a + 0.0;
   Expect.isTrue(identical(a, b));
+
+  a = uint64toDouble((1 << 64) - 1);
+  b = uint64toDouble((1 << 64) - 2);
+  Expect.isFalse(identical(a, b));
+
+  a = 0.0/0.0;
+  b = 1.0/0.0;
+  Expect.isFalse(identical(a, b));
+}
+
+main() {
+  for (int i = 0; i < 20; i++) {
+    testNumberIdentity();
+  }
 }
diff --git a/tests/language/reify_typevar_test.dart b/tests/language/reify_typevar_test.dart
new file mode 100644
index 0000000..874efd6
--- /dev/null
+++ b/tests/language/reify_typevar_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.
+
+import "package:expect/expect.dart";
+
+class Foo<T> {
+    reify() {
+        return T;
+    }
+}
+
+main() {
+    Expect.equals(int, new Foo<int>().reify());
+    Expect.equals(Foo, new Foo().runtimeType);
+}
diff --git a/tests/language/rewrite_for_update_order_test.dart b/tests/language/rewrite_for_update_order_test.dart
new file mode 100644
index 0000000..80ed9de
--- /dev/null
+++ b/tests/language/rewrite_for_update_order_test.dart
@@ -0,0 +1,32 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+var counter = 0;
+var global = 0;
+
+test() {
+    ++counter;
+    return counter <= 2;
+}
+
+first() {
+    global = global + 1;
+}
+second() {
+    global = global * 2;
+}
+
+foo() {
+    while (test()) {
+        first();
+        second();
+    }
+}
+
+main() {
+    foo();
+    Expect.equals(6, global);
+}
diff --git a/tests/language/rewrite_swap_test.dart b/tests/language/rewrite_swap_test.dart
new file mode 100644
index 0000000..acb4e8f
--- /dev/null
+++ b/tests/language/rewrite_swap_test.dart
@@ -0,0 +1,90 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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";
+
+swap1(x,y,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+}
+
+swap2(x,y,z,w,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+
+        var q = z;
+        z = w;
+        w = q;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+    Expect.equals(4, z);
+    Expect.equals(3, w);
+}
+
+swap3(x,y,z,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = z;
+        z = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(3, y);
+    Expect.equals(1, z);
+}
+
+swap4(x,y,z,b) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = z; // swap cycle involves unused variable 'y'
+        z = t;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, z);
+}
+
+swap5(x,y,z,w,b,b2) {
+    if (b) {
+        var t = x;
+        x = y;
+        y = t;
+    }
+    if (b2) {
+        var q = z;
+        z = w;
+        w = q;
+    }
+    Expect.equals(2, x);
+    Expect.equals(1, y);
+    Expect.equals(4, z);
+    Expect.equals(3, w);
+}
+
+main() {
+    swap1(1,2,true);
+    swap1(2,1,false);
+
+    swap2(1,2,3,4,true);
+    swap2(2,1,4,3,false);
+
+    swap3(1,2,3,true);
+    swap3(2,3,1,false);
+
+    swap4(1,2,3,true);
+    swap4(2,3,1,false);
+
+    swap5(1,2,3,4,true, true);
+    swap5(1,2,4,3,true, false);
+    swap5(2,1,3,4,false, true);
+    swap5(2,1,4,3,false, false);
+}
diff --git a/tests/language/rewrite_variable_initializer_test.dart b/tests/language/rewrite_variable_initializer_test.dart
new file mode 100644
index 0000000..7909ead
--- /dev/null
+++ b/tests/language/rewrite_variable_initializer_test.dart
@@ -0,0 +1,40 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+class Foo {
+    var field = 0;
+}
+
+bar(x,y) {
+    return x * 100 + y;
+}
+
+foo(z) {
+    var x = 0, y = x;
+    if (z > 0) {
+        x = 10;
+    }
+    if (z > 10) {
+        y = 20;
+    }
+    return bar(x,y);
+}
+
+baz(z) {
+    var f = new Foo()
+            ..field = 10
+            ..field = z;
+    return f;
+}
+
+main() {
+    Expect.equals(0, foo(0));
+    Expect.equals(1000, foo(5));
+    Expect.equals(1020, foo(15));
+
+    Expect.equals(20, baz(20).field);
+    Expect.equals(30, baz(30).field);
+}
diff --git a/tests/language/rewrite_while_many_exits_test.dart b/tests/language/rewrite_while_many_exits_test.dart
new file mode 100644
index 0000000..a3a3c0c
--- /dev/null
+++ b/tests/language/rewrite_while_many_exits_test.dart
@@ -0,0 +1,48 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+var baz_clicks = 0;
+
+baz() {
+    return ++baz_clicks;
+}
+
+var global = 0;
+
+increment_global() {
+    ++global;
+    return global <= 10;
+}
+
+foo(x, y) {
+    var n = 0;
+    while (true) {
+        baz();
+        if (n >= x) {
+            return n;
+        }
+        baz();
+        if (n >= y) {
+            return n;
+        }
+        n = n + 1;
+    }
+}
+
+bar() {
+    while (increment_global()) {
+        baz();
+    }
+    return baz();
+}
+
+main() {
+    Expect.equals(10, foo(10, 20));
+    Expect.equals(10, foo(20, 10));
+
+    baz_clicks = 0;
+    Expect.equals(11, bar());
+}
diff --git a/tests/language/rewrite_while_test.dart b/tests/language/rewrite_while_test.dart
index 44e72ed..e7375ef 100644
--- a/tests/language/rewrite_while_test.dart
+++ b/tests/language/rewrite_while_test.dart
@@ -26,6 +26,30 @@
     return n;
 }
 
+loop3(x) {
+    var n = 0;
+    if (x < 100) {
+        while (n < x) {
+            n = n + 1;
+            baz();
+        }
+    }
+    baz();
+    return n;
+}
+
+loop4(x) {
+    var n = 0;
+    if (x < 100) {
+        while (n < x) {
+            baz();
+            n = n + 1;
+        }
+    }
+    baz();
+    return n;
+}
+
 f1(b) {
   while (b)
     return 1;
@@ -48,6 +72,14 @@
     Expect.equals(10, loop2(10));
     Expect.equals(0,  loop2(200));
 
+    Expect.equals(0,  loop3(-10));
+    Expect.equals(10, loop3(10));
+    Expect.equals(0,  loop3(200));
+
+    Expect.equals(0,  loop4(-10));
+    Expect.equals(10, loop4(10));
+    Expect.equals(0,  loop4(200));
+
     Expect.equals(1, f1(true));
     Expect.equals(2, f1(false));
     Expect.equals(1, f2(true));
diff --git a/tests/language/stacktrace_rethrow_error_test.dart b/tests/language/stacktrace_rethrow_error_test.dart
new file mode 100644
index 0000000..64ca5e9
--- /dev/null
+++ b/tests/language/stacktrace_rethrow_error_test.dart
@@ -0,0 +1,155 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 SubclassOfError extends Error {}
+
+fail() => throw "Fail";
+
+// == Rethrow, skipping through typed handlers. ==
+
+aa1() {
+  try {
+    bb1();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: ok
+          ) {
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], error.stackTrace);
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb1() => cc1();
+
+cc1() {
+  try {
+    dd1();
+  } on String catch(e) {
+    fail();
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd1() => ee1();
+
+ee1() {
+  try {
+    ff1();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff1() => gg1();
+
+gg1() => throw new SubclassOfError();
+
+// == Rethrow, rethrow again in typed handler. ==
+
+aa2() {
+  try {
+    bb2();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: continued
+          ) {
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], error.stackTrace);
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb2() => cc2();
+
+cc2() {
+  try {
+    dd2();
+  } on SubclassOfError catch(e) {
+    rethrow;
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd2() => ee2();
+
+ee2() {
+  try {
+    ff2();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff2() => gg2();
+
+gg2() => throw new SubclassOfError();
+
+// == Rethrow, with intervening catch without a trace parameter.
+
+aa3() {
+  try {
+    bb3();
+    fail();
+  } catch(error
+          , stacktrace  /// withtraceparameter: continued
+         ) {
+    expectTrace(['gg3', 'ff3', 'ee3', 'dd3', 'cc3', 'bb3', 'aa3'], error.stackTrace);
+    expectTrace(['cc3', 'bb3', 'aa3'], stacktrace);  /// withtraceparameter: continued
+  }
+}
+
+bb3() => cc3();
+
+cc3() {
+  try {
+    dd3();
+  } catch(e) {
+    throw e;
+  }
+}
+
+dd3() => ee3();
+
+ee3() {
+  try {
+    ff3();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff3() => gg3();
+
+gg3() => throw new SubclassOfError();
+
+expectTrace(functionNames, stacktrace) {
+  // Note we don't expect functionNames to cover the whole trace, only the
+  // top portion, because the frames below main are an implementation detail.
+  var traceLines = stacktrace.toString().split('\n');
+  var expectedIndex = 0;
+  var actualIndex = 0;
+  print(stacktrace);
+  print(functionNames);
+  while (expectedIndex < functionNames.length) {
+    var expected = functionNames[expectedIndex];
+    var actual = traceLines[actualIndex];
+    if (actual.indexOf(expected) == -1) {
+      if (expectedIndex == 0) {
+        actualIndex++; // Skip over some helper frames at the top
+      } else {
+        throw "Expected: $expected actual: $actual";
+      }
+    } else {
+      actualIndex++;
+      expectedIndex++;
+    }
+  }
+}
+
+main() {
+  aa1();
+  aa2();
+  aa3();
+}
\ No newline at end of file
diff --git a/tests/language/stacktrace_rethrow_nonerror_test.dart b/tests/language/stacktrace_rethrow_nonerror_test.dart
new file mode 100644
index 0000000..5707a24
--- /dev/null
+++ b/tests/language/stacktrace_rethrow_nonerror_test.dart
@@ -0,0 +1,148 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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 NotASubclassOfError {}
+
+fail() => throw "Fail";
+
+// == Rethrow, skipping through typed handlers. ==
+
+aa1() {
+  try {
+    bb1();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['gg1', 'ff1', 'ee1', 'dd1', 'cc1', 'bb1', 'aa1'],
+                stacktrace);
+  }
+}
+
+bb1() => cc1();
+
+cc1() {
+  try {
+    dd1();
+  } on String catch(e) {
+    fail();
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd1() => ee1();
+
+ee1() {
+  try {
+    ff1();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff1() => gg1();
+
+gg1() => throw new NotASubclassOfError();
+
+// == Rethrow, rethrow again in typed handler. ==
+
+aa2() {
+  try {
+    bb2();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['gg2', 'ff2', 'ee2', 'dd2', 'cc2', 'bb2', 'aa2'],
+                stacktrace);
+  }
+}
+
+bb2() => cc2();
+
+cc2() {
+  try {
+    dd2();
+  } on NotASubclassOfError catch(e) {
+    rethrow;
+  } on int catch(e) {
+    fail();
+  }
+}
+
+dd2() => ee2();
+
+ee2() {
+  try {
+    ff2();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff2() => gg2();
+
+gg2() => throw new NotASubclassOfError();
+
+// == Rethrow, with intervening catch without a trace parameter.
+
+aa3() {
+  try {
+    bb3();
+    fail();
+  } catch(exception, stacktrace) {
+    expectTrace(['cc3', 'bb3', 'aa3'], stacktrace);
+  }
+}
+
+bb3() => cc3();
+
+cc3() {
+  try {
+    dd3();
+  } catch(e) {
+    throw e;
+  }
+}
+
+dd3() => ee3();
+
+ee3() {
+  try {
+    ff3();
+  } catch(e) {
+    rethrow;
+  }
+}
+
+ff3() => gg3();
+
+gg3() => throw new NotASubclassOfError();
+
+expectTrace(functionNames, stacktrace) {
+  // Note we don't expect functionNames to cover the whole trace, only the
+  // top portion, because the frames below main are an implementation detail.
+  var traceLines = stacktrace.toString().split('\n');
+  var expectedIndex = 0;
+  var actualIndex = 0;
+  print(stacktrace);
+  print(functionNames);
+  while (expectedIndex < functionNames.length) {
+    var expected = functionNames[expectedIndex];
+    var actual = traceLines[actualIndex];
+    if (actual.indexOf(expected) == -1) {
+      if (expectedIndex == 0) {
+        actualIndex++; // Skip over some helper frames at the top
+      } else {
+        throw "Expected: $expected actual: $actual";
+      }
+    } else {
+      actualIndex++;
+      expectedIndex++;
+    }
+  }
+}
+
+main() {
+  aa1();
+  aa2();
+  aa3();
+}
\ No newline at end of file
diff --git a/tests/language/try_catch_optimized1_test.dart b/tests/language/try_catch_optimized1_test.dart
index 380e451..d1be3da 100644
--- a/tests/language/try_catch_optimized1_test.dart
+++ b/tests/language/try_catch_optimized1_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized2_test.dart b/tests/language/try_catch_optimized2_test.dart
index d383a7f..aa7a9f3 100644
--- a/tests/language/try_catch_optimized2_test.dart
+++ b/tests/language/try_catch_optimized2_test.dart
@@ -1,7 +1,7 @@
 // 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.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
diff --git a/tests/language/try_catch_optimized3_test.dart b/tests/language/try_catch_optimized3_test.dart
index 18ca114..e0e8437 100644
--- a/tests/language/try_catch_optimized3_test.dart
+++ b/tests/language/try_catch_optimized3_test.dart
@@ -1,7 +1,7 @@
 // Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
-// VMOptions=--optimization-counter-threshold=10 --no-use-osr
+// VMOptions=--optimization-counter-threshold=10
 
 import "package:expect/expect.dart";
 
@@ -22,7 +22,7 @@
 }
 
 main() {
-  for (var i=0; i<100; i++) test_double(1.0, false);
+  for (var i = 0; i < 100; i++) test_double(1.0, false);
   test_double(1.0, false);
   Expect.equals(1.0, test_double(1.0, true));
 }
diff --git a/tests/language/try_catch_optimized4_test.dart b/tests/language/try_catch_optimized4_test.dart
new file mode 100644
index 0000000..7cad947
--- /dev/null
+++ b/tests/language/try_catch_optimized4_test.dart
@@ -0,0 +1,41 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+// Test correct dead phi elimination with try catch.
+
+List<Object> a = [1,2,3,4,5];
+
+class MyError { }
+
+class M {
+  maythrow(i) {
+    try {
+      if (i <= 5) throw new MyError();
+    } catch(e) { throw e; }
+  }
+}
+
+loop_test() {
+  bool failed = false;
+  M m = new M();
+  for (Object i in a) {
+    try {
+      String res = m.maythrow(i);
+      failed = true;
+    } on MyError catch(e) { }
+    if (!identical(failed, false)) {
+      Expect.fail("");
+    }
+  }
+}
+
+main() {
+  for (var i = 0; i < 20; i++) loop_test();
+}
+
+
+
diff --git a/tests/language/try_catch_osr_test.dart b/tests/language/try_catch_osr_test.dart
new file mode 100644
index 0000000..7533ba0
--- /dev/null
+++ b/tests/language/try_catch_osr_test.dart
@@ -0,0 +1,102 @@
+// Copyright (c) 2013, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10
+
+// Test OSR in different places of a try-catch.
+
+import "package:expect/expect.dart";
+
+maythrow(x) {
+  try {
+    if (x == null) throw 42;
+    return 99;
+  } finally { }
+}
+
+f1() {
+  var s = 0, t = "abc";
+  for (var i = 0; i < 21; ++i) {
+    s += i;
+  }
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s++;
+  }
+  return s;
+}
+
+f2([x = 1]) {
+  var s = 0, t = "abc";
+  try {
+    try {
+      for (var i = 0; i < 20; ++i) {
+        if (i == 18) maythrow(null);
+        s += x;
+      }
+    } catch (e) {
+      Expect.equals(1, x);
+      Expect.equals("abc", t);
+      Expect.equals(42, e);
+      s++;
+    }
+  } catch (e) { }
+  return s;
+}
+
+f3() {
+  var s = 0, t = "abc";
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    for (var i = 0; i < 21; ++i) {
+      s += i;
+    }
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    return s;
+  }
+}
+
+f4() {
+  var s = 0, t = "abc";
+  try {
+    for (var i = 0; i < 21; ++i) {
+      if (i == 18) maythrow(null);
+      s += i;
+    }
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s++;
+  }
+  return s;
+}
+
+f5() {
+  var s, t = "abc";
+  try {
+    maythrow(null);
+  } catch (e) {
+    Expect.equals("abc", t);
+    Expect.equals(42, e);
+    s = 0;
+  }
+  for (var i = 0; i < 21; ++i) {
+    s += i;
+  }
+  Expect.equals("abc", t);
+  return s;
+}
+
+main() {
+  Expect.equals(211, f1());
+  Expect.equals(19, f2());
+  Expect.equals(210, f3());
+  Expect.equals(9 * 17 + 1, f4());
+  Expect.equals(210, f5());
+}
diff --git a/tests/language/vm/optimized_shl_test.dart b/tests/language/vm/optimized_shl_test.dart
new file mode 100644
index 0000000..559506c
--- /dev/null
+++ b/tests/language/vm/optimized_shl_test.dart
@@ -0,0 +1,21 @@
+
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+// VMOptions=--optimization-counter-threshold=10
+
+import "package:expect/expect.dart";
+
+// Test truncating left-shift that can deoptimize.
+// Regression test for issue 19330.
+
+test_shl(w, x) {
+  x += 1;
+  return w << x & 0xff ;
+}
+
+main() {
+  for (var i = 0; i < 20; i++) test_shl(i, i % 10);
+  Expect.equals(4, test_shl(1, 1));
+}
+
diff --git a/tests/lib/lib.status b/tests/lib/lib.status
index 5176cbf..bc764ba 100644
--- a/tests/lib/lib.status
+++ b/tests/lib/lib.status
@@ -20,9 +20,6 @@
 mirrors/deferred_mirrors_metadata_test: Fail # Issue 16898
 mirrors/deferred_mirrors_metatarget_test: Fail # Issue 16898
 
-[ $compiler == dart2js && $checked && $runtime == drt && $nocsp ]
-async/stream_transform_test: RuntimeError # Issue 16719
-
 [ $compiler == dart2js ]
 async/schedule_microtask6_test: RuntimeError # global error handling is not supported. http://dartbug.com/5958
 
@@ -72,6 +69,7 @@
 mirrors/library_imports_prefixed_test: RuntimeError # Issue 6490
 mirrors/library_imports_prefixed_show_hide_test: RuntimeError # Issue 6490
 mirrors/library_uri_io_test: Skip # Not intended for dart2js as it uses dart:io.
+mirrors/lru_test: Skip # dart2js_native/lru_test is used instead
 mirrors/metadata_allowed_values_test/01: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/05: MissingCompileTimeError # Issue 14548
 mirrors/metadata_allowed_values_test/10: MissingCompileTimeError # Issue 14548
@@ -85,6 +83,7 @@
 mirrors/method_mirror_source_line_ending_test : RuntimeError # Issue 6490
 mirrors/method_mirror_location_test: RuntimeError # Issue 6490
 mirrors/mirrors_test: RuntimeError # TODO(ahe): I'm working on fixing this. When removing this line please change the "endsWith" to "/mirrors_test.dart".
+mirrors/mirrors_nsm_test/dart2js: RuntimeError # Issue 19353
 mirrors/mixin_test: RuntimeError # Issue 12464
 mirrors/mixin_application_test/none: RuntimeError # Issue 12464
 mirrors/parameter_test/none: RuntimeError # Issue 6490
@@ -249,40 +248,29 @@
 
 async/timer_not_available_test: SkipByDesign # only meant to test when there is no way to implement timer (currently only in d8)
 
-mirrors/mirrors_nsm_test/vm: Fail # Issue 18042
-
 [ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
 async/schedule_microtask6_test: Fail # Issue 10910
+async/timer_test: Fail, Pass # Issue 15487
+async/multiple_timer_test: Fail, Pass # Issue 15487
+async/stream_periodic3_test: Fail, Pass # Issue 15487
+async/timer_isolate_test: Fail, Pass # Issue 15487. Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
 mirrors/immutable_collections_test: Pass, Slow # Dartium debug uses -O0
 mirrors/mirrors_reader_test: Pass, Slow # Dartium debug uses -O0
 mirrors/library_uri_io_test: Skip # Not intended for drt as it uses dart:io.
 mirrors/local_isolate_test: Skip # http://dartbug.com/12188
-
-[ $compiler == none && ( $runtime == drt || $runtime == dartium || $runtime == ContentShellOnAndroid) ]
-async/timer_test: Fail, Pass # Issue 15487
-async/multiple_timer_test: Fail, Pass # Issue 15487
-async/stream_periodic3_test: Fail, Pass # Issue 15487
-async/timer_isolate_test: Fail, Pass # Issue 15487
+mirrors/deferred*: Skip # Lazy deferred loading not yet implemented. Issue 19449. Crashes drt in checked mode.
 
 [ $compiler == none && $runtime == drt && $system == windows ]
 async/multiple_timer_test: Fail, Pass # See Issue 10982
 async/timer_test: Fail, Pass # See Issue 10982
 
-[ $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.
-
 [ $compiler == none && $runtime == dartium ]
 async/schedule_microtask5_test: Pass, Timeout # Issue 13719: Please triage this failure.
 async/timer_cancel2_test: Pass, Timeout # Issue 13719: Please triage this failure.
 
-[ $compiler == none && ($runtime == drt || $runtime == dartium) ]
-# Issue 13921: spawnFunction is not allowed on Dartium's DOM thread.
-async/timer_isolate_test: Fail
+[$compiler == none && $runtime == ContentShellOnAndroid ]
+mirrors/lazy_static_test: Skip # Times out. Issue 19127
+mirrors/mirrors_reader_test: Skip # Times out. Issue 19127
 
 [ $compiler == dart2dart || ($compiler == none && ($runtime == drt || $runtime == dartium || $runtime == vm || $runtime == ContentShellOnAndroid)) ]
 # Deferred loading is not implemented in the VM so the error-handling will never be triggered.
@@ -302,6 +290,8 @@
 
 mirrors/immutable_collections_test: StaticWarning, OK # Expect failure for any type of Iterable.
 mirrors/inference_and_no_such_method_test: StaticWarning, OK # Expect to trigger noSuchMethod.
+mirrors/mirrors_nsm_test: StaticWarning, OK # Expect to trigger noSuchMethod.
+
 mirrors/repeated_private_anon_mixin_app_test: StaticWarning, OK # Intentional library name conflict.
 mirrors/removed_api_test: StaticWarning, OK # Deliberately refers to undeclared members.
 
@@ -313,3 +303,11 @@
 
 [ $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.
diff --git a/tests/lib/mirrors/lru_expect.dart b/tests/lib/mirrors/lru_expect.dart
new file mode 100644
index 0000000..a048fcb
--- /dev/null
+++ b/tests/lib/mirrors/lru_expect.dart
@@ -0,0 +1,27 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+import "package:expect/expect.dart";
+
+expect(lruMapFactory) {
+  Expect.throws(() => lruMapFactory(0), (e) => e is Exception);
+
+  for (int shift = 1; shift < 5; shift++) {
+    var map = lruMapFactory(shift);
+    var capacity = (1 << shift) * 3 ~/ 4;
+    for (int value = 0; value < 100; value++) {
+      var key = "$value";
+      map[key] = value;
+      Expect.equals(value, map[key]);
+    }
+    for (int value = 0; value < 100 - capacity - 1; value++) {
+      var key = "$value";
+      Expect.equals(null, map[key]);
+    }
+    for (int value = 100 - capacity; value < 100; value++) {
+      var key = "$value";
+      Expect.equals(value, map[key]);
+    }
+  }
+}
diff --git a/tests/lib/mirrors/lru_test.dart b/tests/lib/mirrors/lru_test.dart
index 141fc98..1a0c8fd 100644
--- a/tests/lib/mirrors/lru_test.dart
+++ b/tests/lib/mirrors/lru_test.dart
@@ -3,7 +3,7 @@
 // BSD-style license that can be found in the LICENSE file.
 
 import "dart:mirrors";
-import "package:expect/expect.dart";
+import "lru_expect.dart";
 
 newLRUMapWithShift(int shift) {
   var lib = currentMirrorSystem().libraries[Uri.parse("dart:_internal")];
@@ -12,23 +12,5 @@
 }
 
 main() {
-  Expect.throws(() => newLRUMapWithShift(0), (e) => e is Exception);
-
-  for (int shift = 1; shift < 5; shift++) {
-    var map = newLRUMapWithShift(shift);
-    var capacity = (1 << shift) * 3 ~/ 4;
-    for (int value = 0; value < 100; value++) {
-      var key = "$value";
-      map[key] = value;
-      Expect.equals(value, map[key]);
-    }
-    for (int value = 0; value < 100 - capacity - 1; value++) {
-      var key = "$value";
-      Expect.equals(null, map[key]);
-    }
-    for (int value = 100 - capacity; value < 100; value++) {
-      var key = "$value";
-      Expect.equals(value, map[key]);
-    }
-  }
-}
\ No newline at end of file
+  expect(newLRUMapWithShift);
+}
diff --git a/tests/lib/mirrors/mirrors_nsm_test.dart b/tests/lib/mirrors/mirrors_nsm_test.dart
index 88ad27c..f1abaa7 100644
--- a/tests/lib/mirrors/mirrors_nsm_test.dart
+++ b/tests/lib/mirrors/mirrors_nsm_test.dart
@@ -15,25 +15,33 @@
   return "$e".contains(needle) && ! "$e".contains(needle + "=");
 }
 
-class A {}
+final finalTopLevel = 0;
+class A {
+  final finalInstance = 0;
+  static final finalStatic = 0;
+}
 
-main() {
+testMessageContents() {
   var mirrors = currentMirrorSystem();
   var libMirror = mirrors.findLibrary(#MirrorsTest);
   Expect.throws(() => libMirror.invoke(#foo, []),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => libMirror.getField(#foo),
                 (e) => isNSMContainingFieldName(e, "foo", false));
-  Expect.throws(() => libMirror.setField(#foo, null),             /// vm: ok
-                (e) => isNSMContainingFieldName(e, "foo", true)); /// vm: continued
+  Expect.throws(() => libMirror.setField(#foo, null),
+                (e) => isNSMContainingFieldName(e, "foo", true));
+  Expect.throws(() => libMirror.setField(#finalTopLevel, null),
+                (e) => isNSMContainingFieldName(e, "finalTopLevel", true));
 
-  var classMirror = reflect(A);
+  var classMirror = reflectClass(A);
   Expect.throws(() => classMirror.invoke(#foo, []),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => classMirror.getField(#foo),
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => classMirror.setField(#foo, null),
                 (e) => isNSMContainingFieldName(e, "foo", true));
+  Expect.throws(() => classMirror.setField(#finalStatic, null),
+                (e) => isNSMContainingFieldName(e, "finalStatic", true));
 
   var instanceMirror = reflect(new A());
   Expect.throws(() => instanceMirror.invoke(#foo, []),
@@ -42,5 +50,61 @@
                 (e) => isNSMContainingFieldName(e, "foo", false));
   Expect.throws(() => instanceMirror.setField(#foo, null),
                 (e) => isNSMContainingFieldName(e, "foo", true));
-
+  Expect.throws(() => instanceMirror.setField(#finalInstance, null),
+                (e) => isNSMContainingFieldName(e, "finalInstance", true));
 }
+
+expectMatchingErrors(reflectiveAction, baseAction) {
+  var reflectiveError, baseError;
+  try {
+    reflectiveAction();
+  } catch(e) {
+    reflectiveError = e;
+  }
+  try {
+    baseAction();
+  } catch(e) {
+    baseError = e;
+  }
+  print("\n==Base==\n $baseError");
+  print("\n==Reflective==\n $reflectiveError");
+  Expect.stringEquals(baseError.toString(), reflectiveError.toString());
+}
+
+testMatchingMessages() {
+  var mirrors = currentMirrorSystem();
+  var libMirror = mirrors.findLibrary(#MirrorsTest);
+  expectMatchingErrors(() => libMirror.invoke(#foo, []),
+                       () => foo());
+  expectMatchingErrors(() => libMirror.getField(#foo),
+                       () => foo);
+  expectMatchingErrors(() => libMirror.setField(#foo, null),
+                       () => foo= null);
+  expectMatchingErrors(() => libMirror.setField(#finalTopLevel, null),
+                       () => finalTopLevel= null);
+
+  var classMirror = reflectClass(A);
+  expectMatchingErrors(() => classMirror.invoke(#foo, []),
+                       () => A.foo());
+  expectMatchingErrors(() => classMirror.getField(#foo),
+                       () => A.foo);
+  expectMatchingErrors(() => classMirror.setField(#foo, null),
+                       () => A.foo= null);
+  expectMatchingErrors(() => classMirror.setField(#finalStatic, null),
+                       () => A.finalStatic= null);
+
+  var instanceMirror = reflect(new A());
+  expectMatchingErrors(() => instanceMirror.invoke(#foo, []),
+                       () => new A().foo());
+  expectMatchingErrors(() => instanceMirror.getField(#foo),
+                       () => new A().foo);
+  expectMatchingErrors(() => instanceMirror.setField(#foo, null),
+                       () => new A().foo= null);
+  expectMatchingErrors(() => instanceMirror.setField(#finalInstance, null),
+                       () => new A().finalInstance= null);
+}
+
+main() {
+  testMessageContents();
+  testMatchingMessages(); /// dart2js: ok
+}
\ No newline at end of file
diff --git a/tests/standalone/full_coverage_test.dart b/tests/standalone/full_coverage_test.dart
new file mode 100644
index 0000000..7bba623
--- /dev/null
+++ b/tests/standalone/full_coverage_test.dart
@@ -0,0 +1,231 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for details. All rights reserved. Use of this source code is governed by a
+// BSD-style license that can be found in the LICENSE file.
+
+// These tests fork a second VM process that runs the script
+// ``tools/full-coverage.dart'' and verifies that the tool
+// produces the expeced output.
+
+import 'dart:async';
+import 'dart:convert';
+import 'dart:io';
+
+import 'package:path/path.dart' as path;
+import 'package:unittest/unittest.dart';
+
+final String coverageScript = "tools/full-coverage.dart";
+final String packageRoot = Platform.packageRoot;
+final List dartBaseArgs = ['--package-root=${packageRoot}', '--checked',];
+
+// With line numbers starting at 0, the list of hits can be understood as
+// follows:
+// * -1: No coverage data on this line.
+// *  0: No hits on this line.
+// *  1: ``Some'' hits on this line.
+final coverageTests = [
+  {
+    'name': 'faculty',
+    'program': '''
+dummy () {
+  for (int i = 0; i < 100; i++) {
+    print(i);
+  }
+}
+
+int fac(int n) {
+  int f = 1;
+  for (int i = 1; i <= n; i++) {
+    f *= i;
+  }
+  return f;
+}
+
+main() {
+  if (false) {
+    dummy(11);
+  } else {
+    fac(10);
+  }
+}
+''',
+    'expectedHits': [-1, 0, 0, -1, -1, -1, -1, -1, 1, 1, -1, -1, -1, -1, -1, -1,
+                     0, -1, 1, -1, -1]
+  },{
+    'name': 'closures',
+    'program': '''
+main() {
+  foo(bar) {
+    bar();
+  }
+
+  foo(() {
+    print("in closure");
+  });
+}
+''',
+    'expectedHits': [-1, -1, 1, -1, -1, 1, 1, -1, -1]
+  }
+];
+
+
+String prepareEnv() {
+  Directory testDir = Directory.systemTemp.createTempSync("coverage-");
+  for (var coverageProg in coverageTests) {
+    var coverageProgDir = new Directory(
+        path.join(testDir.path, coverageProg["name"]))
+      ..createSync();
+    var f = new File(path.join(coverageProgDir.path,
+        "${coverageProg['name']}.dart"));
+    f.writeAsStringSync(coverageProg["program"], mode: FileMode.WRITE);
+  }
+  return testDir.path;
+}
+
+
+destroyEnv(base) => new Directory(base).deleteSync(recursive: true);
+
+
+generateCoverage(String workingDirectory) {
+  for (var coverageProg in coverageTests) {
+    var progPath = path.join(workingDirectory, coverageProg['name']);
+    var script = path.join(progPath, "${coverageProg['name']}.dart");
+    var dartArgs = new List.from(dartBaseArgs)
+      ..addAll(['--coverage-dir=${progPath}', '${script}']);
+    var result = Process.runSync(Platform.executable, dartArgs);
+    expect(result.exitCode, 0);
+  }
+}
+
+
+Future<Process> convertCoverage(String programDir, String format) {
+  var dartArgs = new List.from(dartBaseArgs)
+      ..addAll([
+        coverageScript,
+        '--package-root=${packageRoot}',
+        '--in=${programDir}',
+        format
+      ]);
+  return Process.start(Platform.executable, dartArgs);
+}
+
+
+class PrettyPrintDescriptor {
+  var _programPath;
+  var _validFormat = new RegExp(r"^\s*\d*\|.*$", multiLine: true);
+  var _pattern = new RegExp(r"^\s*(\d+)\|", multiLine: true);
+
+  PrettyPrintDescriptor(this._programPath);
+
+  get sectionStart => _programPath;
+  get sectionEnd => '/';
+  get coverageParameter => '--pretty-print';
+
+  hitData(line) {
+    expect(_validFormat.hasMatch(line), isTrue);
+    var match = _pattern.firstMatch(line);
+    var result = -1;
+    if (match != null) {
+      result = (int.parse(match.group(1)) != 0) ? 1 : 0;
+    }
+    return [result];
+  }
+}
+
+
+class LcovDescriptor {
+  var _pattern = new RegExp(r"^DA:(\d+),(\d+)$", multiLine: true);
+  var _programPath;
+  var _line_nr = 0;
+
+  LcovDescriptor(this._programPath);
+
+  get sectionStart => 'SF:${_programPath}';
+  get sectionEnd => 'end_of_record';
+  get coverageParameter => '--lcov';
+
+  hitData(line) {
+    expect(_pattern.hasMatch(line), isTrue);
+    var match = _pattern.firstMatch(line);
+    // Lcov data starts at line 1, we start at 0.
+    var out_line = int.parse(match[1]) - 1;
+    var hitCount = int.parse(match[2]);
+    var result = [];
+    for ( ; _line_nr < out_line; _line_nr++) {
+      result.add(-1);
+    }
+    result.add((hitCount != 0) ? 1 : 0);
+    _line_nr++;
+    return result;
+  }
+}
+
+
+Stream filterHitData(input, descriptor) {
+  bool in_program_section = false;
+  return input.where((line) {
+    if (in_program_section) {
+      if (line.startsWith(descriptor.sectionEnd)) {
+        in_program_section = false;
+        return false;
+      }
+      return true;
+    }
+    if (line.startsWith(descriptor.sectionStart)) {
+      in_program_section = true;
+    }
+    return false;
+  }).map((line) {
+    return descriptor.hitData(line);
+  });
+}
+
+
+testCoverage(String programDir, String programPath, descriptor,
+             List expectedHitMap) {
+  var p = convertCoverage(programDir, descriptor.coverageParameter);
+  expect(p.then((process) {
+    var hitStream = filterHitData(
+        process.stdout.transform(UTF8.decoder)
+                      .transform(const LineSplitter()),
+        descriptor);
+    var hitMap = [];
+    var subscription = hitStream.listen((data) {
+      // Flatten results.
+      data.forEach((e) => hitMap.add(e));
+    });
+    expect(subscription.asFuture().then((_) {
+      hitMap.forEach((e) {
+        expect(e, expectedHitMap.removeAt(0));
+      });
+      // Make sure that there are only lines left that do not contain coverage
+      // data.
+      expectedHitMap.forEach((e) => expect(e, -1));
+    }), completes);
+  }), completes);
+}
+
+
+main() {
+  String testingDirectory;
+
+  setUp(() {
+    testingDirectory = prepareEnv();
+  });
+
+  tearDown(() => destroyEnv(testingDirectory));
+
+  test('CoverageTests', () {
+    generateCoverage(testingDirectory);
+
+    coverageTests.forEach((cTest) {
+      String programDir = path.join(testingDirectory, cTest['name']);
+      String programPath = path.join(programDir, "${cTest['name']}.dart");
+      testCoverage(programDir, programPath,
+                   new LcovDescriptor(programPath),
+                   new List.from(cTest['expectedHits']));
+      testCoverage(programDir, programPath,
+                   new PrettyPrintDescriptor(programPath),
+                   new List.from(cTest['expectedHits']));
+    });
+  });
+}
diff --git a/tests/standalone/io/file_typed_data_test.dart b/tests/standalone/io/file_typed_data_test.dart
index 882ed54..7c0cfa0 100644
--- a/tests/standalone/io/file_typed_data_test.dart
+++ b/tests/standalone/io/file_typed_data_test.dart
@@ -143,7 +143,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int16List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int16List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -187,7 +188,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint16List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint16List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -231,7 +233,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int32List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int32List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -275,7 +278,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint32List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint32List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -319,7 +323,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Int64List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Int64List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
@@ -363,7 +368,8 @@
       for (int i = 0; i < content.length; i++) {
         typed_data_content[i] = content[i];
       }
-      Expect.listEquals(expected, new Uint64List.view(typed_data_content));
+      Expect.listEquals(expected,
+                        new Uint64List.view(typed_data_content.buffer));
       temp.deleteSync(recursive: true);
       asyncEnd();
     });
diff --git a/tests/standalone/io/http_client_exception_test.dart b/tests/standalone/io/http_client_exception_test.dart
index 4a5ab98..a2bb7a8 100644
--- a/tests/standalone/io/http_client_exception_test.dart
+++ b/tests/standalone/io/http_client_exception_test.dart
@@ -18,7 +18,7 @@
       (e) => e.toString().contains("Unsupported scheme"));
   Expect.throws(
       () => client.getUrl(Uri.parse('http://::1')),
-      (e) => e.toString().contains("No host specified"));
+      (e) => e is FormatException);
   Expect.throws(
       () => client.getUrl(Uri.parse('http://user@:1')),
       (e) => e.toString().contains("No host specified"));
diff --git a/tests/standalone/io/http_proxy_configuration_test.dart b/tests/standalone/io/http_proxy_configuration_test.dart
index 64aa3b0..0d1f57d 100644
--- a/tests/standalone/io/http_proxy_configuration_test.dart
+++ b/tests/standalone/io/http_proxy_configuration_test.dart
@@ -43,26 +43,26 @@
          {"http_proxy": "www.proxy.com:8080",
           "https_proxy": "www.proxys.com:8080"});
 
-  expect("PROXY [::FFFF:1]:1080",
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]"});
-  expect("PROXY [::FFFF:2]:1080",
+         {"http_proxy": "[::ffff:1]"});
+  expect("PROXY [::ffff:2]:1080",
          "https://www.google.com",
-         {"https_proxy": "[::FFFF:2]"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"https_proxy": "[::ffff:2]"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "[::ffff:1]:8080"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"https_proxy": "[::FFFF:2]:8080"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"https_proxy": "[::ffff:2]:8080"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080",
-          "https_proxy": "[::FFFF:2]:8080"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "[::ffff:1]:8080",
+          "https_proxy": "[::ffff:2]:8080"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "[::FFFF:1]:8080",
-          "https_proxy": "[::FFFF:2]:8080"});
+         {"http_proxy": "[::ffff:1]:8080",
+          "https_proxy": "[::ffff:2]:8080"});
 
   expect("PROXY www.proxy.com:1080",
          "http://www.google.com",
@@ -93,34 +93,34 @@
          {"http_proxy": "http://www.proxy.com:8080/",
           "https_proxy": "http://www.proxys.com:8080/index.html"});
 
-  expect("PROXY [::FFFF:1]:1080",
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]"});
-  expect("PROXY [::FFFF:1]:1080",
+         {"http_proxy": "http://[::ffff:1]"});
+  expect("PROXY [::ffff:1]:1080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/index.html"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/index.html"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:1]:8080/"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:1]:8080/"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:2]:8080/"});
-  expect("PROXY [::FFFF:1]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:2]:8080/"});
+  expect("PROXY [::ffff:1]:8080",
          "http://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:1]:8080/index.html"});
-  expect("PROXY [::FFFF:2]:8080",
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:1]:8080/index.html"});
+  expect("PROXY [::ffff:2]:8080",
          "https://www.google.com",
-         {"http_proxy": "http://[::FFFF:1]:8080/",
-          "https_proxy": "http://[::FFFF:2]:8080/index.html"});
+         {"http_proxy": "http://[::ffff:1]:8080/",
+          "https_proxy": "http://[::ffff:2]:8080/index.html"});
 
   expectDirect("http://www.google.com",
                {"http_proxy": "www.proxy.com:8080",
@@ -141,18 +141,18 @@
                {"https_proxy": "www.proxy.com:8080"});
 
   expect("PROXY www.proxy.com:8080",
-         "http://[::FFFF:1]",
+         "http://[::ffff:1]",
          {"http_proxy": "www.proxy.com:8080",
           "no_proxy": "["});
   expect("PROXY www.proxy.com:8080",
-         "http://[::FFFF:1]",
+         "http://[::ffff:1]",
          {"http_proxy": "www.proxy.com:8080",
           "no_proxy": "[]"});
 
-  expectDirect("http://[::FFFF:1]",
+  expectDirect("http://[::ffff:1]",
                {"http_proxy": "www.proxy.com:8080",
-                "no_proxy": "[::FFFF:1]"});
-  expectDirect("http://[::FFFF:1]",
+                "no_proxy": "[::ffff:1]"});
+  expectDirect("http://[::ffff:1]",
                {"http_proxy": "www.proxy.com:8080",
-                "no_proxy": ",,  , www.google.edu,,[::FFFF:1]    "});
+                "no_proxy": ",,  , www.google.edu,,[::ffff:1]    "});
 }
diff --git a/tests/standalone/io/observatory_test.dart b/tests/standalone/io/observatory_test.dart
new file mode 100644
index 0000000..b9a656e
--- /dev/null
+++ b/tests/standalone/io/observatory_test.dart
@@ -0,0 +1,99 @@
+// Copyright (c) 2014, the Dart project authors.  Please see the AUTHORS file
+// for 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:convert';
+import 'dart:io';
+import 'dart:mirrors';
+
+import 'package:expect/expect.dart';
+import 'package:async_helper/async_helper.dart';
+
+Map lookupServiceObject(String path) {
+  var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+  var m = MirrorSystem.getSymbol('_serviceObjectHandler', io);
+  var paths = Uri.parse(path).pathSegments;
+  Expect.equals('io', paths.first);
+  return JSON.decode(
+      io.invoke(m, [paths.sublist(1), [], []]).reflectee);
+}
+
+
+String getServicePath(obj) {
+  var io = currentMirrorSystem().findLibrary(const Symbol('dart.io'));
+  var m = MirrorSystem.getSymbol('_getServicePath', io);
+  return io.invoke(m, [obj]).reflectee;
+}
+
+
+Future testHttpServer1() {
+  return HttpServer.bind('localhost', 0).then((server) {
+    var path = getServicePath(server);
+    var map = lookupServiceObject(path);
+    Expect.equals(map['type'], 'HttpServer');
+    Expect.equals(map['id'], path);
+    Expect.equals(map['address'], 'localhost');
+    Expect.equals(map['port'], server.port);
+    Expect.equals(map['closed'], false);
+    Expect.listEquals(map['idle'], []);
+    Expect.listEquals(map['active'], []);
+    var socket = map['socket'];
+    Expect.equals(socket['type'], '@Socket');
+    Expect.equals(socket['kind'], 'Listening');
+    // Validate owner back-ref.
+    socket = lookupServiceObject(socket['id']);
+    Expect.equals(socket['owner']['id'], path);
+    return server.close();
+  });
+}
+
+
+Future testHttpServerConnection1() {
+  return HttpServer.bind('localhost', 0).then((server) {
+    server.listen((request) {
+      var map = lookupServiceObject(getServicePath(server));
+      Expect.listEquals(map['idle'], []);
+      Expect.equals(map['active'].length, 1);
+      var active = map['active'].first;
+      Expect.equals(active['type'], '@HttpServerConnection');
+      var path = active['id'];
+      map = lookupServiceObject(path);
+      Expect.equals(map['type'], 'HttpServerConnection');
+      var socket = map['socket'];
+      Expect.equals(socket['type'], '@Socket');
+      Expect.equals(socket['kind'], 'Normal');
+      // Validate owner back-ref.
+      socket = lookupServiceObject(socket['id']);
+      Expect.equals(socket['owner']['id'], path);
+      request.response.close();
+    });
+    var client = new HttpClient();
+    return client.get('localhost', server.port, '/')
+        .then((request) => request.close())
+        .then((response) => response.drain())
+        .then((_) {
+          // The connection should be idle now.
+          var map = lookupServiceObject(getServicePath(server));
+          Expect.equals(map['idle'].length, 1);
+          Expect.listEquals(map['active'], []);
+          return server.close();
+        });
+
+  });
+}
+
+
+void main() {
+  final tests = [
+    testHttpServer1(),
+    testHttpServerConnection1(),
+  ];
+
+  asyncStart();
+  // Run one test at a time.
+  Future.forEach(tests, (f) => f)
+      .then((_) {
+        asyncEnd();
+      });
+}
diff --git a/tests/standalone/io/raw_socket_test.dart b/tests/standalone/io/raw_socket_test.dart
index bc537f5..4acc6ee 100644
--- a/tests/standalone/io/raw_socket_test.dart
+++ b/tests/standalone/io/raw_socket_test.dart
@@ -23,6 +23,7 @@
   asyncStart();
   RawServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
     Expect.isTrue(s.port > 0);
+    s.close();
     asyncEnd();
   });
 }
@@ -56,6 +57,7 @@
             })
             .catchError((error) {
               Expect.isTrue(error is SocketException);
+              s.close();
               asyncEnd();
             });
       });
diff --git a/tests/standalone/io/socket_exception_test.dart b/tests/standalone/io/socket_exception_test.dart
index 58abb85..40a5851 100644
--- a/tests/standalone/io/socket_exception_test.dart
+++ b/tests/standalone/io/socket_exception_test.dart
@@ -207,9 +207,11 @@
         int errors = 0;
         client.add(new List.filled(SIZE, 0));
         client.close();
-        client.done.catchError((error) {
-          server.close();
-        });
+        client.done
+            .catchError((_) {})
+            .whenComplete(() {
+              server.close();
+            });
         // Destroy other socket now.
         completer.complete(null);
       });
diff --git a/tests/standalone/io/socket_test.dart b/tests/standalone/io/socket_test.dart
index 3ebadf8..0cca8e4 100644
--- a/tests/standalone/io/socket_test.dart
+++ b/tests/standalone/io/socket_test.dart
@@ -23,6 +23,7 @@
   asyncStart();
   ServerSocket.bind(InternetAddress.LOOPBACK_IP_V4, 0).then((s) {
     Expect.isTrue(s.port > 0);
+    s.close();
     asyncEnd();
   });
 }
diff --git a/tests/standalone/io/test_runner_test.dart b/tests/standalone/io/test_runner_test.dart
index 61e762b..d3f80e0 100644
--- a/tests/standalone/io/test_runner_test.dart
+++ b/tests/standalone/io/test_runner_test.dart
@@ -30,7 +30,8 @@
             new String.fromCharCodes(testCase.lastCommandOutput.stderr);
         print("stdout = [$stdout]");
         print("stderr = [$stderr]");
-        throw "Expected fail-unexpected: ${testCase.result}";
+        throw "Test case ${testCase.displayName} passed unexpectedly, "
+              "result == ${testCase.result}";
       }
     } else {
       if (testCase.unexpectedOutput) {
@@ -40,7 +41,8 @@
             new String.fromCharCodes(testCase.lastCommandOutput.stderr);
         print("stdout = [$stdout]");
         print("stderr = [$stderr]");
-        throw "Unexpected fail";
+        throw "Test case ${testCase.displayName} failed, "
+              "result == ${testCase.result}";
       }
     }
   }
diff --git a/tests/standalone/issue14236_source.dart b/tests/standalone/issue14236_source.dart
index 4a55aa9..65becdf 100644
--- a/tests/standalone/issue14236_source.dart
+++ b/tests/standalone/issue14236_source.dart
@@ -14,6 +14,8 @@
 // Steps for regenerating:
 // 1) Swap the test functions below.
 // 2) $ ./xcodebuild/DebugIA32/dart --package-root=./xcodebuild/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
+// OR:
+// 2) $ ./out/DebugIA32/dart --package-root=./out/DebugIA32/packages --snapshot=tests/standalone/issue14236_test.dart tests/standalone/issue14236_source.dart
 // 3) Undo changes in 1.
 
 library test.issue14236;
diff --git a/tests/standalone/issue14236_test.dart b/tests/standalone/issue14236_test.dart
index f103ca2..8fa1ddd 100644
--- a/tests/standalone/issue14236_test.dart
+++ b/tests/standalone/issue14236_test.dart
Binary files differ
diff --git a/tests/standalone/javascript_compatibility_errors_test.dart b/tests/standalone/javascript_compatibility_errors_test.dart
index 888ff20..6404a2e 100644
--- a/tests/standalone/javascript_compatibility_errors_test.dart
+++ b/tests/standalone/javascript_compatibility_errors_test.dart
@@ -7,15 +7,15 @@
 import "package:expect/expect.dart";
 
 f(x, y) {
-  // Unoptimized code.
-  1 is double;  /// 00: compile-time error
-  if (1 is double) { x++; }  /// 01: compile-time error
-  try { 1 as double; } on CastError catch (e) { }  /// 02: compile-time error
-  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: compile-time error
-  1.0 is int;  /// 04: compile-time error
-  if (1.0 is int) { x++; }  /// 05: compile-time error
-  try { 1.0 as int; } on CastError catch (e) { }  /// 06: compile-time error
-  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: compile-time error
+  // Unoptimized and optimized code.
+  1 is double;  /// 00: ok
+  if (1 is double) { x++; }  /// 01: ok
+  try { 1 as double; } on CastError catch (e) { }  /// 02: ok
+  try { var y = 1 as double; } on CastError catch (e) { }  /// 03: ok
+  1.0 is int;  /// 04: ok
+  if (1.0 is int) { x++; }  /// 05: ok
+  try { 1.0 as int; } on CastError catch (e) { }  /// 06: ok
+  try { var z = 1.0 as int; } on CastError catch (e) { }  /// 07: ok
 
   x is double;  /// 10: ok
   if (x is double) { }  /// 11: ok
@@ -26,8 +26,11 @@
   try { y as int; } on CastError catch (e) { }  /// 16: ok
   try { var z = y as int; } on CastError catch (e) { }  /// 17: ok
 
+  // It is a compile-time error if evaluation of a constant object results in
+  // an uncaught exception being thrown, a JavascriptCompatibilityError here.
   "${1.0}";  /// 20: compile-time error
   var z = "${1.0}";  /// 21: compile-time error
+
   (1.0).toString();  /// 22: ok
   var z = (1.0).toString();  /// 23: ok
   "$y";  /// 24: ok
@@ -35,30 +38,47 @@
   y.toString();  /// 26: ok
   var z = y.toString();  /// 27: ok
 
+  var a = "yz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }  /// 28: ok
+
+  if (identical(x, y)) { }  /// 29: ok
+  if (identical(y, x)) { }  /// 30: ok
+
   if (x > 10) {
     // Optimized code.
-    x is double;  /// 30: ok
-    if (x is double) { }  /// 31: ok
-    try { x as double; } on CastError catch (e) { }  /// 32: ok
-    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
-    y is int;  /// 34: ok
-    if (y is int) { }  /// 35: ok
-    try { y as int; } on CastError catch (e) { }  /// 36: ok
-    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+    x is double;  /// 40: ok
+    if (x is double) { }  /// 41: ok
+    try { x as double; } on CastError catch (e) { }  /// 42: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 43: ok
+    y is int;  /// 44: ok
+    if (y is int) { }  /// 45: ok
+    try { y as int; } on CastError catch (e) { }  /// 46: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 47: ok
 
-    "${1.0}";  /// 40: compile-time error
-    var z = "${1.0}";  /// 41: compile-time error
-    (1.0).toString();  /// 42: ok
-    var z = (1.0).toString();  /// 43: ok
-    "$y";  /// 44: ok
-    var z = "$y";  /// 45: ok
-    y.toString();  /// 46: ok
-    var z = y.toString();  /// 47: ok
+    "${1.0}";  /// 50: compile-time error
+    var z = "${1.0}";  /// 51: compile-time error
+
+    (1.0).toString();  /// 52: ok
+    var z = (1.0).toString();  /// 53: ok
+    "$y";  /// 54: ok
+    var z = "$y";  /// 55: ok
+    y.toString();  /// 56: ok
+    var z = y.toString();  /// 57: ok
+
+    var a = "yz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }  /// 58: ok
+
+    if (identical(x, y)) { }  /// 59: ok
+    if (identical(y, x)) { }  /// 60: ok
   }
 }
 
 k(x, y) {
-  // Unoptimized code.
+  // Unoptimized and optimized code.
   1.5 is double;
   if (1.5 is double) { x++; }
   try { 1.5 as double; } on CastError catch (e) { }
@@ -95,6 +115,14 @@
   y.toString();
   z = y.toString();
 
+  var a = "xyz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }
+
+  if (identical(x, y)) { }
+  if (identical(y, x)) { }
+
   if (x > 10) {
     // Optimized code.
     x is double;
@@ -114,6 +142,14 @@
     z = "$y";
     y.toString();
     z = y.toString();
+
+    var a = "xyz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }
+
+    if (identical(x, y)) { }
+    if (identical(y, x)) { }
   }
 }
 
@@ -126,16 +162,18 @@
     e is Error && "$e".contains("Javascript Compatibility Error");
 
 main() {
-  // Since the warning (or error in case of --warning_as_error) is issued at
-  // most once per location, the Expect.throw must guard the whole loop.
-  Expect.throws(
-      () {
-        for (var i = 0; i < 20; i++) {
-          h(i, i * 1.0);
-        }
-      },
-      isJavascriptCompatibilityError);
-
+  // The warning (or error in case of --warning_as_error) is issued at
+  // most once per location.
+  var numWarnings = 0;
+  for (var i = 0; i < 20; i++) {
+    try {
+      h(i, i * 1.0);
+    } catch(e) {
+      Expect.isTrue(isJavascriptCompatibilityError(e));
+      numWarnings++;
+    }
+  }
+  Expect.equals(1, numWarnings);
   // No warnings (errors) should be issued after this point.
   for (var i = 0; i < 20; i++) {
     k(i * 1.0, i);
diff --git a/tests/standalone/javascript_compatibility_warnings_test.dart b/tests/standalone/javascript_compatibility_warnings_test.dart
index 9d44700..bb744b1 100644
--- a/tests/standalone/javascript_compatibility_warnings_test.dart
+++ b/tests/standalone/javascript_compatibility_warnings_test.dart
@@ -7,7 +7,7 @@
 import "package:expect/expect.dart";
 
 f(x, y) {
-  // Unoptimized code.
+  // Unoptimized and optimized code.
   1 is double;  /// 00: ok
   if (1 is double) { x++; }  /// 01: ok
   try { 1 as double; } on CastError catch (e) { }  /// 02: ok
@@ -35,25 +35,41 @@
   y.toString();  /// 26: ok
   var z = y.toString();  /// 27: ok
 
+  var a = "yz";
+  var b = "xyz";
+  b = b.substring(1);
+  if (identical(a, b)) { }  /// 28: ok
+
+  if (identical(x, y)) { }  /// 29: ok
+  if (identical(y, x)) { }  /// 30: ok
+
   if (x > 10) {
     // Optimized code.
-    x is double;  /// 30: ok
-    if (x is double) { }  /// 31: ok
-    try { x as double; } on CastError catch (e) { }  /// 32: ok
-    try { var z = x as double; } on CastError catch (e) { }  /// 33: ok
-    y is int;  /// 34: ok
-    if (y is int) { }  /// 35: ok
-    try { y as int; } on CastError catch (e) { }  /// 36: ok
-    try { var z = y as int; } on CastError catch (e) { }  /// 37: ok
+    x is double;  /// 40: ok
+    if (x is double) { }  /// 41: ok
+    try { x as double; } on CastError catch (e) { }  /// 42: ok
+    try { var z = x as double; } on CastError catch (e) { }  /// 43: ok
+    y is int;  /// 44: ok
+    if (y is int) { }  /// 45: ok
+    try { y as int; } on CastError catch (e) { }  /// 46: ok
+    try { var z = y as int; } on CastError catch (e) { }  /// 47: ok
 
-    "${1.0}";  /// 40: ok
-    var z = "${1.0}";  /// 41: ok
-    (1.0).toString();  /// 42: ok
-    var z = (1.0).toString();  /// 43: ok
-    "$y";  /// 44: ok
-    var z = "$y";  /// 45: ok
-    y.toString();  /// 46: ok
-    var z = y.toString();  /// 47: ok
+    "${1.0}";  /// 50: ok
+    var z = "${1.0}";  /// 51: ok
+    (1.0).toString();  /// 52: ok
+    var z = (1.0).toString();  /// 53: ok
+    "$y";  /// 54: ok
+    var z = "$y";  /// 55: ok
+    y.toString();  /// 56: ok
+    var z = y.toString();  /// 57: ok
+
+    var a = "yz";
+    var b = "xyz";
+    b = b.substring(1);
+    if (identical(a, b)) { }  /// 58: ok
+
+    if (identical(x, y)) { }  /// 59: ok
+    if (identical(y, x)) { }  /// 60: ok
   }
 }
 
diff --git a/tests/standalone/standalone.status b/tests/standalone/standalone.status
index 90ed933..3e81112 100644
--- a/tests/standalone/standalone.status
+++ b/tests/standalone/standalone.status
@@ -43,6 +43,7 @@
 package/*: Skip # Do not run those in Dartium.
 debugger/*: Skip # Do not run standalone debugger tests in browser.
 coverage_test: Skip
+full_coverage_test: Skip
 http_launch_test: Skip
 vmservice/*: Skip # Do not run standalone vm service tests in browser.
 issue14236_test: Skip # Issue 14236 Script snapshots do not work in the browser.
@@ -74,6 +75,7 @@
 io/process_exit_negative_test: Fail, OK # relies on a static error that is a warning now.
 package/package_isolate_test: Skip # spawnUri does not work in dart2js. See issue 3051
 debugger/*: Skip # Do not run standalone vm debugger tests with dart2js.
+full_coverage_test: Skip
 left_shift_bit_and_op_test: Skip # Integers exceed dart2js precision.
 pow_test: Skip # Precision > 53 bits.
 double_smi_comparison_test: Skip # Precision > 53 bits.
@@ -143,3 +145,5 @@
 javascript_compatibility_errors_test: Skip
 javascript_compatibility_warnings_test: Skip
 
+[ $system == windows ]
+io/skipping_dart2js_compilations_test: Fail # Issue 19551.
diff --git a/tests/standalone/typed_data_test.dart b/tests/standalone/typed_data_test.dart
index 4429765..669bee0 100644
--- a/tests/standalone/typed_data_test.dart
+++ b/tests/standalone/typed_data_test.dart
@@ -175,7 +175,7 @@
 
   Expect.throws(() {
     var size = typed_data.elementSizeInBytes;
-    var i = (typed_data.length - 1) * size + 1; 
+    var i = (typed_data.length - 1) * size + 1;
     typed_data[new C(i)] = value;
   });
 
@@ -302,7 +302,7 @@
 }
 
 testViewCreation() {
-  var bytes = new Uint8List(1024);
+  var bytes = new Uint8List(1024).buffer;
   var view = new ByteData.view(bytes, 24);
   Expect.equals(1000, view.lengthInBytes);
   view = new Uint8List.view(bytes, 24);
diff --git a/tests/try/cursor_position_test.dart b/tests/try/cursor_position_test.dart
index f791796..36ff990 100644
--- a/tests/try/cursor_position_test.dart
+++ b/tests/try/cursor_position_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 // Test that cursor positions are correctly updated after adding new content.
 
 import 'test_try.dart';
@@ -82,7 +80,15 @@
   Expect.equals(4, text.length);
   Text newline = secondLine.firstChild.nextNode;
   Expect.equals(newline, secondLine.lastChild);
-  checkSelectionIsCollapsed(newline, 0);
+  /// Chrome and Firefox cannot agree on where to put the cursor.  At the end
+  /// of [text] or at the beginning of [newline].  It's the same position.
+  if (window.getSelection().anchorOffset == 0) {
+    // Firefox.
+    checkSelectionIsCollapsed(newline, 0);
+  } else {
+    // Chrome.
+    checkSelectionIsCollapsed(text, 4);
+  }
 }
 
 class MockKeyboardEvent extends KeyEvent {
diff --git a/tests/try/internal_error_test.dart b/tests/try/internal_error_test.dart
index 8cbac3a..9cad55e 100644
--- a/tests/try/internal_error_test.dart
+++ b/tests/try/internal_error_test.dart
@@ -2,23 +2,21 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 library trydart.internal_error_test;
 
 import 'dart:html';
 import 'dart:async';
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager,
     TRY_DART_NEW_DEFECT;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     mainEditorPane,
     observer,
     outputDiv;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 import '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/mock_try.dart b/tests/try/mock_try.dart
index 1e2e3e50..745bb71 100644
--- a/tests/try/mock_try.dart
+++ b/tests/try/mock_try.dart
@@ -7,15 +7,15 @@
     MutationObserver,
     document;
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     hackDiv,
     mainEditorPane,
     observer;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 InteractionManager mockTryDartInteraction() {
diff --git a/tests/try/paste_content_rewriting_test.dart b/tests/try/paste_content_rewriting_test.dart
index f16c3d8..d04e7ac 100644
--- a/tests/try/paste_content_rewriting_test.dart
+++ b/tests/try/paste_content_rewriting_test.dart
@@ -2,21 +2,19 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 library trydart.paste_test;
 
 import 'dart:html';
 import 'dart:async';
 
-import '../../site/try/src/interaction_manager.dart' show
+import 'package:try/src/interaction_manager.dart' show
     InteractionManager;
 
-import '../../site/try/src/ui.dart' show
+import 'package:try/src/ui.dart' show
     mainEditorPane,
     observer;
 
-import '../../site/try/src/user_option.dart' show
+import 'package:try/src/user_option.dart' show
     UserOption;
 
 import '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/source_update_test.dart b/tests/try/source_update_test.dart
index 1ea94ca..b40159a 100644
--- a/tests/try/source_update_test.dart
+++ b/tests/try/source_update_test.dart
@@ -2,8 +2,6 @@
 // for details. All rights reserved. Use of this source code is governed by a
 // BSD-style license that can be found in the LICENSE file.
 
-// SharedOptions=--package-root=sdk/lib/_internal/
-
 import 'test_try.dart';
 
 InteractionContext interaction;
diff --git a/tests/try/test_try.dart b/tests/try/test_try.dart
index 6a09719..743f929 100644
--- a/tests/try/test_try.dart
+++ b/tests/try/test_try.dart
@@ -6,11 +6,11 @@
 
 export 'dart:html';
 
-export '../../site/try/src/interaction_manager.dart' show
+export 'package:try/src/interaction_manager.dart' show
     InteractionContext,
     InteractionManager;
 
-export '../../site/try/src/ui.dart' show
+export 'package:try/src/ui.dart' show
     mainEditorPane;
 
 export '../../pkg/expect/lib/expect.dart';
diff --git a/tests/try/try.status b/tests/try/try.status
index 59a5f7c..5a32cc2 100644
--- a/tests/try/try.status
+++ b/tests/try/try.status
@@ -9,5 +9,8 @@
 [ $compiler != dart2js || ($runtime != drt && $runtime != chrome && $runtime != ff) ]
 *: Skip
 
+[ $compiler == dart2js && $runtime == drt ]
+end_to_end_test: Skip # dartbug.com/19658
+
 [ $csp ]
 end_to_end_test: Fail, OK # http://dartbug.com/17935
diff --git a/tests/utils/dart2js_test.dart b/tests/utils/dart2js_test.dart
index 74d890cd..84f5a3f 100644
--- a/tests/utils/dart2js_test.dart
+++ b/tests/utils/dart2js_test.dart
@@ -4,7 +4,7 @@
 
 // Test to ensure that dart2js is free of warnings.
 
-import '../../sdk/lib/_internal/compiler/implementation/dart2js.dart'
+import 'package:compiler/implementation/dart2js.dart'
     as dart2js;
 
 void main() {
diff --git a/tests/utils/dummy_compiler_test.dart b/tests/utils/dummy_compiler_test.dart
index 1743615..60a5ed74 100644
--- a/tests/utils/dummy_compiler_test.dart
+++ b/tests/utils/dummy_compiler_test.dart
@@ -10,15 +10,11 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 
-import '../../sdk/lib/_internal/compiler/compiler.dart';
+import 'package:compiler/compiler.dart';
 
-Future<String> provider(Uri uri) {
-  String source;
-  if (uri.scheme == "main") {
-    source = "main() {}";
-  } else if (uri.scheme == "lib") {
-    if (uri.path.endsWith("/core.dart")) {
-      source = """
+String libProvider(Uri uri) {
+  if (uri.path.endsWith("/core.dart")) {
+    return """
 library core;
 class Object {
   Object();
@@ -50,10 +46,13 @@
 eqNull(a) {}
 eqNullB(a) {}
 const proxy = 0;""";
-    } else if (uri.path.endsWith('_patch.dart')) {
-      source = '';
-    } else if (uri.path.endsWith('interceptors.dart')) {
-      source = """
+  } else if (uri.path.endsWith('_patch.dart')) {
+    return """
+import 'dart:_js_helper';
+import 'dart:_interceptors';
+import 'dart:_isolate_helper';""";
+  } else if (uri.path.endsWith('interceptors.dart')) {
+    return """
 class Interceptor {
   operator==(other) {}
   get hashCode => throw 'Interceptor.hashCode not implemented.';
@@ -94,15 +93,28 @@
 getDispatchProperty(o) {}
 setDispatchProperty(o, v) {}
 var mapTypeToInterceptor;""";
-    } else if (uri.path.endsWith('js_helper.dart')) {
-      source = 'library jshelper; class JSInvocationMirror {} '
-               'class ConstantMap {} class TypeImpl {} '
-               'createRuntimeType(String name) => null;';
-    } else if (uri.path.endsWith('isolate_helper.dart')) {
-      source = 'library isolatehelper; class _WorkerStub {}';
-    } else {
-      source = "library lib${uri.path.replaceAll('/', '.')};";
-    }
+  } else if (uri.path.endsWith('js_helper.dart')) {
+    return """
+library jshelper; class JSInvocationMirror {}
+class ConstantMap {} class TypeImpl {}
+createRuntimeType(String name) => null;
+class Closure {}
+class BoundClosure extends Closure {}
+const patch = 0;
+""";
+  } else if (uri.path.endsWith('isolate_helper.dart')) {
+    return 'library isolatehelper; class _WorkerStub {}';
+  } else {
+    return "library lib${uri.path.replaceAll('/', '.')};";
+  }
+}
+
+Future<String> provider(Uri uri) {
+  String source;
+  if (uri.scheme == "main") {
+    source = "main() {}";
+  } else if (uri.scheme == "lib") {
+    source = libProvider(uri);
   } else {
    throw "unexpected URI $uri";
   }
diff --git a/tests/utils/recursive_import_test.dart b/tests/utils/recursive_import_test.dart
index b343200..c1815e8 100644
--- a/tests/utils/recursive_import_test.dart
+++ b/tests/utils/recursive_import_test.dart
@@ -7,66 +7,8 @@
 import "package:expect/expect.dart";
 import "package:async_helper/async_helper.dart";
 import 'dart:async';
-import '../../sdk/lib/_internal/compiler/compiler.dart';
-
-const CORE_LIB = """
-library core;
-class Object {
-  const Object();
-  operator==(other) {}
-}
-class bool {}
-class num {}
-class int {}
-class double{}
-class String{}
-class Function{}
-class List {}
-class Map {}
-class BoundClosure {}
-class Closure {}
-class Dynamic_ {}
-class Type {}
-class Null {}
-class StackTrace {}
-class LinkedHashMap {}
-getRuntimeTypeInfo(o) {}
-setRuntimeTypeInfo(o, i) {}
-eqNull(a) {}
-eqNullB(a) {}
-class JSInvocationMirror {}  // Should be in helper.
-class _Proxy { const _Proxy(); }
-const proxy = const _Proxy();
-""";
-
-const INTERCEPTORS_LIB = """
-library interceptors;
-class JSIndexable {
-  get length {}
-}
-class JSMutableIndexable {}
-class JSArray {
-  JSArray() {}
-  factory JSArray.typed(a) => a;
-  removeLast() => null;
-  add(x) { }
-}
-class JSMutableArray extends JSArray {}
-class JSExtendableArray extends JSMutableArray {}
-class JSFixedArray extends JSMutableArray {}
-class JSString {
-  split(x) => null;
-  concat(x) => null;
-  toString() => null;
-  operator+(other) => null;
-}
-class JSNull {
-  bool operator ==(other) => identical(null, other);
-  int get hashCode => 0;
-}
-class JSBool {
-}
-""";
+import 'dummy_compiler_test.dart';
+import 'package:compiler/compiler.dart';
 
 const String RECURSIVE_MAIN = """
 library fisk;
@@ -86,17 +28,7 @@
       count++;
       source = RECURSIVE_MAIN;
     } else if (uri.scheme == "lib") {
-      if (uri.path.endsWith("/core.dart")) {
-        source = CORE_LIB;
-      } else if (uri.path.endsWith('_patch.dart')) {
-        source = '';
-      } else if (uri.path.endsWith('isolate_helper.dart')) {
-        source = 'class _WorkerStub {}';
-      } else if (uri.path.endsWith('interceptors.dart')) {
-        source = INTERCEPTORS_LIB;
-      } else {
-        source = "library lib${uri.path.replaceAll('/', '.')};";
-      }
+      source = libProvider(uri);
     } else {
      return new Future.error("unexpected URI $uri");
     }
diff --git a/tests/utils/source_mirrors_test.dart b/tests/utils/source_mirrors_test.dart
index f587560..c61fafb 100644
--- a/tests/utils/source_mirrors_test.dart
+++ b/tests/utils/source_mirrors_test.dart
@@ -10,7 +10,7 @@
 import 'dart:async';
 import "package:async_helper/async_helper.dart";
 
-import '../../sdk/lib/_internal/compiler/implementation/mirrors/analyze.dart';
+import 'package:compiler/implementation/mirrors/analyze.dart';
 import 'dummy_compiler_test.dart';
 
 main() {
diff --git a/tools/VERSION b/tools/VERSION
index 57df64f..1873f13 100644
--- a/tools/VERSION
+++ b/tools/VERSION
@@ -25,7 +25,7 @@
 #
 CHANNEL dev
 MAJOR 1
-MINOR 5
+MINOR 6
 PATCH 0
-PRERELEASE 4
-PRERELEASE_PATCH 23
+PRERELEASE 0
+PRERELEASE_PATCH 0
diff --git a/tools/bots/bot_utils.py b/tools/bots/bot_utils.py
index a1e2f5d..b2bf9a7 100644
--- a/tools/bots/bot_utils.py
+++ b/tools/bots/bot_utils.py
@@ -107,6 +107,10 @@
     return '/'.join([self.editor_directory(revision),
       self.editor_installer_filename(system, arch, extension)])
 
+  def editor_android_zipfilepath(self, revision):
+    return '/'.join([self.editor_directory(revision),
+      self.editor_android_zipfilename()])
+
   def sdk_zipfilepath(self, revision, system, arch, mode):
     return '/'.join([self.sdk_directory(revision),
       self.sdk_zipfilename(system, arch, mode)])
@@ -169,6 +173,9 @@
     return 'darteditor-%s-%s.zip' % (
         SYSTEM_RENAMES[system], ARCH_RENAMES[arch])
 
+  def editor_android_zipfilename(self):
+    return 'android.zip'
+
   def editor_installer_filename(self, system, arch, extension):
     assert extension in ['dmg', 'msi']
     return 'darteditor-installer-%s-%s.%s' % (
@@ -333,7 +340,7 @@
   return checksum_filename
 
 def GetChannelFromName(name):
-  """Get the channel from the name. Bleeding edge builders don't 
+  """Get the channel from the name. Bleeding edge builders don't
       have a suffix."""
   channel_name = string.split(name, '-').pop()
   if channel_name in Channel.ALL_CHANNELS:
diff --git a/tools/bots/compiler.py b/tools/bots/compiler.py
index 5ea8d34..5c02fb9 100644
--- a/tools/bots/compiler.py
+++ b/tools/bots/compiler.py
@@ -157,7 +157,7 @@
   with bot.BuildStep(step_name, swallow_error=True):
     sys.stdout.flush()
     if NeedsXterm(compiler, runtime) and system == 'linux':
-      cmd = ['xvfb-run', '-a']
+      cmd = ['xvfb-run', '-a', '--server-args=-screen 0 1024x768x24']
     else:
       cmd = []
 
diff --git a/tools/bots/cross-vm.py b/tools/bots/cross-vm.py
index cb53e2f..9c81275 100644
--- a/tools/bots/cross-vm.py
+++ b/tools/bots/cross-vm.py
@@ -91,6 +91,8 @@
     for path in temporary_files:
       if os.path.exists(path):
         os.remove(path)
+    # We always clobber this to save disk on the arm board.
+    bot.Clobber(force=True)
 
 def main():
   name, is_buildbot = bot.GetBotName()
diff --git a/tools/bots/dartium_android.py b/tools/bots/dartium_android.py
index e10afd5..18bc171 100644
--- a/tools/bots/dartium_android.py
+++ b/tools/bots/dartium_android.py
@@ -40,7 +40,9 @@
 def UploadAPKs(options):
   with bot.BuildStep('Upload apk'):
     revision = utils.GetSVNRevision()
-    namer = bot_utils.GCSNamer()
+    bot_name = os.environ.get("BUILDBOT_BUILDERNAME")
+    channel = bot_utils.GetChannelFromName(bot_name)
+    namer = bot_utils.GCSNamer(channel=channel)
     gsutil = bot_utils.GSUtil()
 
     web_link_prefix = 'https://storage.cloud.google.com/'
diff --git a/tools/bots/run_android_tests.sh b/tools/bots/run_android_tests.sh
index c728f3a..a4a3ca5 100755
--- a/tools/bots/run_android_tests.sh
+++ b/tools/bots/run_android_tests.sh
@@ -21,7 +21,7 @@
 adb install -r $1
 ./build/android/adb_reverse_forwarder.py 8081 8081 8082 8082 \
                                          8083 8083 8084 8084 &
-FORWARDER_PID = $!
+FORWARDER_PID=$!
 sleep 15
 ./dart/tools/test.py -m release -a arm --progress=line --report --time \
     --failure-summary --write-debug-log --local_ip=localhost \
diff --git a/tools/build.py b/tools/build.py
index e0205ba..4dfb024 100755
--- a/tools/build.py
+++ b/tools/build.py
@@ -401,16 +401,25 @@
             project_file = 'dart.sln'
             if os.path.exists('dart-%s.gyp' % CurrentDirectoryBaseName()):
               project_file = 'dart-%s.sln' % CurrentDirectoryBaseName()
+            # Select a platform suffix to pass to devenv.
+            if arch == 'ia32':
+              platform_suffix = 'Win32'
+            elif arch == 'x64':
+              platform_suffix = 'x64'
+            else:
+              print 'Unsupported arch for MSVC build: %s' % arch
+              return 1
+            config_name = '%s|%s' % (build_config, platform_suffix)
             if target == 'all':
               args = [options.devenv + os.sep + options.executable,
                       '/build',
-                      build_config,
+                      config_name,
                       project_file
                      ]
             else:
               args = [options.devenv + os.sep + options.executable,
                       '/build',
-                      build_config,
+                      config_name,
                       '/project',
                       target,
                       project_file
diff --git a/tools/create_editor.py b/tools/create_editor.py
index 3957260..f5c890a 100644
--- a/tools/create_editor.py
+++ b/tools/create_editor.py
@@ -208,7 +208,7 @@
   # (dart-editor-macosx.cocoa.x86.zip). It contains the editor application in a
   # dart/ subdirectory. We unzip the contents of the archive into OUTPUT. It
   # will use the ../dart-sdk directory as its SDK.
-  archives = glob.glob(join(OUTPUT, '*.zip'))
+  archives = glob.glob(join(OUTPUT, 'd*.zip'))
 
   if archives:
     ProcessEditorArchive(arch, archives[0], OUTPUT)
diff --git a/tools/dart2js/sourceMapViewer/README.TXT b/tools/dart2js/sourceMapViewer/README.TXT
index aa8cab5..cd84fbb 100644
--- a/tools/dart2js/sourceMapViewer/README.TXT
+++ b/tools/dart2js/sourceMapViewer/README.TXT
@@ -1,7 +1,9 @@
-This program serves a visualization of a JavaScript source map file generated 
+This program serves a visualization of a JavaScript source map file generated
 by dart2js or pub.
 
-Usage: dart bin/source_map_viewer.dart <path to map file>.
+Run 'pub build' to build the application.
+
+Usage: dart --package-root=packages/ bin/source_map_viewer.dart <path to map file>.
 
 The default system browser is started and pointed to the viewer if available.
 
diff --git a/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
index 8981862..2c8533d 100644
--- a/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
+++ b/tools/dart2js/sourceMapViewer/bin/source_map_viewer.dart
@@ -18,8 +18,7 @@
  * available.
  */
 
-Directory rootDir = null;
-String sourceMapFile;
+Uri sourceMapFile;
 
 void main(List<String> args) {
   if (args.length != 1) {
@@ -35,9 +34,8 @@
     return;
   }
 
-  sourceMapFile = basename(mapFile.path);
-  rootDir = mapFile.parent;
-  startServer(rootDir);
+  sourceMapFile = toUri(mapFile.path);
+  startServer();
 }
 
 // Sends the content of the file requested in the path parameter.
@@ -48,17 +46,16 @@
     return;
   }
 
-  path = rootDir.path + '/' + path;
-  new File(Uri.parse(path).toFilePath()).openRead()
-    .pipe(request.response).catchError((e) {
-  print("Error: $e");
+  Uri uri = sourceMapFile.resolve(path);
+  new File.fromUri(uri).openRead().pipe(request.response).catchError((e) {
+    print("Error: $e");
     request.response.close();
   });
 }
 
 // Sends back the name of the source map file.
 void handleSourceMapFile(HttpRequest request) {
-  request.response.write(sourceMapFile);
+  request.response.write(basename(sourceMapFile.path));
   request.response.close();
 }
 
@@ -69,8 +66,15 @@
 //
 // /map serves the name of the map file such that its content can be requested
 // with a /file request as above.
-void startServer(Directory dir) {
-  rootDir = dir;
+void startServer() {
+  String root = fromUri(Platform.script.resolve('../build/web/'));
+  Directory directory = new Directory(root);
+  if (!directory.existsSync()) {
+    print("Directory '$root' does not exist. "
+          "Run 'pub build' to generate the output.");
+    exit(-1);
+  }
+
   // Use port 0 to get an ephemeral port.
   int port = 0;
   HttpServer.bind(InternetAddress.LOOPBACK_IP_V4, port).then((server) {
@@ -83,7 +87,7 @@
 
     // Set up default handler. This will serve files from our 'build'
     // directory. Disable jail root, as packages are local symlinks.
-    VirtualDirectory virDir = new http_server.VirtualDirectory(dir.path)
+    VirtualDirectory virDir = new http_server.VirtualDirectory(root)
       ..jailRoot = false
       ..allowDirectoryListing = true;
 
diff --git a/tools/dart2js/sourceMapViewer/web/display.html b/tools/dart2js/sourceMapViewer/web/display.html
index f6d6758..834cf64 100644
--- a/tools/dart2js/sourceMapViewer/web/display.html
+++ b/tools/dart2js/sourceMapViewer/web/display.html
@@ -38,22 +38,22 @@
     <tr><td>
       <h2>Generated Output</h2>
       <div id="target_filename"></div>
-      <div id="generated_output" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+      <div id="generated_output" style="border:2px solid;overflow:auto;width:550px;height:50px;"></div>
     </td><td>
       <h2>Selected Source Code</h2>
       <div id="source_filename"></div>
-      <div id="selected_source" style="border:2px solid;overflow:scroll;width:550px;height:50px;"></div>
+      <div id="selected_source" style="border:2px solid;overflow:auto;width:550px;height:50px;"></div>
     </td><td>
-      <div id="current_span" style="background-color: #99ff99;visibility:hidden;border:green 1px dashed;overflow:scroll;width:250px;height:50px;font-size:12pt;position:absolute;"></div>
+      <div id="current_span" style="background-color: #99ff99;visibility:hidden;border:green 1px dashed;overflow:auto;width:250px;height:50px;font-size:12pt;position:absolute;"></div>
     </td>
     <tr><td>
      <h2>Decoded Map</h2>
      <small><i>(&lt;generated column&gt;,&lt;src url id&gt;,&lt;src line&gt;,&lt;src col&gt;)</i></small>
-     <div id="decoded_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     <div id="decoded_map" style="border: 2px solid;overflow:auto;width:550px;height:50px;"></div>
      </td><td>
      <h2>Original Map</h2>
      <small><i>The encoded mapping data.</i></small>
-     <div id="original_map" style="border: 2px solid;overflow:scroll;width:550px;height:50px;"></div>
+     <div id="original_map" style="border: 2px solid;overflow:auto;width:550px;height:50px;"></div>
      </td>
     </tr>
     </table></div>
diff --git a/tools/dartium/download_multivm.py b/tools/dartium/download_multivm.py
index 0a31bce..a97c84f 100755
--- a/tools/dartium/download_multivm.py
+++ b/tools/dartium/download_multivm.py
@@ -23,6 +23,8 @@
 GS_BUCKET = 'gs://dartium-archive'
 if platform.system() == 'Windows':
   GSUTIL = 'e:\\b\\build\\scripts\\slave\\gsutil.bat'
+  if not os.path.exists(GSUTIL):
+    GSUTIL = 'c:\\b\\build\\scripts\\slave\\gsutil.bat'
 else:
   GSUTIL = '/b/build/scripts/slave/gsutil'
 if not os.path.exists(GSUTIL):
diff --git a/tools/dartium/update_deps.py b/tools/dartium/update_deps.py
index ed91c16..e2ea7d6 100755
--- a/tools/dartium/update_deps.py
+++ b/tools/dartium/update_deps.py
@@ -40,7 +40,7 @@
 # Repositories to auto-update
 ########################################################################
 
-BRANCH_CURRENT="dart/1916"
+BRANCH_CURRENT="dart/1985"
 BRANCH_NEXT="dart/1985"
 BRANCH_MULTIVM="dart/multivm"
 
diff --git a/tools/dom/scripts/htmldartgenerator.py b/tools/dom/scripts/htmldartgenerator.py
index c81be53..76be905 100644
--- a/tools/dom/scripts/htmldartgenerator.py
+++ b/tools/dom/scripts/htmldartgenerator.py
@@ -438,7 +438,7 @@
       return is_optional(operations[signature_index], argument)
 
     emitter = \
-        self._native_library_emitter if self._dart_use_blink \
+        self._native_class_emitter if self._dart_use_blink \
         else self._members_emitter
 
     self._GenerateOverloadDispatcher(
@@ -548,9 +548,7 @@
           version, signature_index, argument_count):
         name = emitter.Format('_create_$VERSION', VERSION=version)
         if self._dart_use_blink:
-            qualified_name = \
-                "_".join(["Native",self._interface.id,
-                          name + 'constructorCallback'])
+            qualified_name = self.DeriveNativeName(name + 'constructorCallback')
         else:
             qualified_name = emitter.Format(
                 '$FACTORY.$NAME',
@@ -577,11 +575,11 @@
           PARAMS=constructor_info.ParametersAsDeclaration(self._DartType))
 
       if self._dart_use_blink:
-          overload_emitter = self._native_library_emitter
+          overload_emitter = self._native_class_emitter
           mname = constructor_full_name.replace(".", "_")
-          blink_name = \
-              "_".join(["Native",self._interface.id, mname])
-          qual_name = self._native_library_name + "." + blink_name
+          blink_name = "$mk" + mname
+          qual_name = self.DeriveQualifiedBlinkName(
+              self._interface.id, blink_name)
           actuals_s = constructor_info.ParametersAsStringOfVariables()
           self._members_emitter.Emit(
             '\n'
@@ -591,7 +589,7 @@
             ACTUALS=actuals_s)
           overload_declaration = emitter.Format(
               '// Generated overload resolver\n'
-              '$CTOR($PARAMS)',
+              '  static $CTOR($PARAMS)',
               CTOR=blink_name,
               PARAMS=actuals_s)
 
diff --git a/tools/dom/scripts/systemhtml.py b/tools/dom/scripts/systemhtml.py
index 42d252e..d1090b6 100644
--- a/tools/dom/scripts/systemhtml.py
+++ b/tools/dom/scripts/systemhtml.py
@@ -1256,7 +1256,7 @@
       items.sort()
       for (idl_name, dart_name) in items:
         map_emitter.Emit(
-          "  '$IDL_NAME': $DART_NAME,\n",
+          "  '$IDL_NAME': () => $DART_NAME,\n",
           IDL_NAME=idl_name,
           DART_NAME=dart_name)
       
diff --git a/tools/dom/scripts/systemnative.py b/tools/dom/scripts/systemnative.py
index a513aa7..1a7571f 100644
--- a/tools/dom/scripts/systemnative.py
+++ b/tools/dom/scripts/systemnative.py
@@ -375,11 +375,8 @@
 def DeriveQualifiedName(library_name, name):
     return library_name + "." + name
 
-def DeriveNativeName(interface_name, name, suffix):
-    fields = ["Native", interface_name, name]
-    if suffix != "":
-        fields.append(suffix)
-    return "_".join(fields)
+def DeriveBlinkClassName(name):
+    return "Blink" + name
 
 def DeriveResolverString(interface_id, operation_id, native_suffix, type_ids, database, is_custom):
     type_string = \
@@ -429,7 +426,6 @@
     self._type_registry = options.type_registry
     self._interface_type_info = self._type_registry.TypeInfo(self._interface.id)
     self._metadata = options.metadata
-    self._native_library_name = "_blink"
     # These get initialized by StartInterface
     self._cpp_header_emitter = None
     self._cpp_impl_emitter = None
@@ -438,6 +434,7 @@
     self._cpp_impl_includes = None
     self._cpp_definitions_emitter = None
     self._cpp_resolver_emitter = None
+    self._native_class_emitter = None
 
   def ImplementsMergedMembers(self):
     # We could not add merged functions to implementation class because
@@ -569,6 +566,17 @@
   def RootClassName(self):
     return 'NativeFieldWrapperClass2'
 
+  def DeriveNativeName(self, name, suffix=""):
+      fields = ['$' + name]
+      if suffix != "":
+          fields.append(suffix)
+      return "_".join(fields)
+
+  def DeriveQualifiedBlinkName(self, interface_name, name):
+      return DeriveQualifiedName(
+          "_blink", DeriveQualifiedName(DeriveBlinkClassName(interface_name),
+                                        name))
+
   def NativeSpec(self):
     return ''
 
@@ -618,6 +626,13 @@
         '    WebCore::DartArrayBufferViewInternal::constructWebGLArray<Dart$(INTERFACE_NAME)>(args);\n'
         '}\n',
         INTERFACE_NAME=self._interface.id);
+    if self._dart_use_blink:
+        self._native_class_emitter = self._native_library_emitter.Emit(
+          '\n'
+          'class $INTERFACE_NAME {'
+          '$!METHODS'
+          '}\n',
+          INTERFACE_NAME=DeriveBlinkClassName(self._interface.id))
 
   def _EmitConstructorInfrastructure(self,
       constructor_info, cpp_prefix, cpp_suffix, factory_method_name,
@@ -648,13 +663,13 @@
     if self._dart_use_blink:
         # First we emit the toplevel function
         dart_native_name = \
-            DeriveNativeName(self._interface.id, constructor_callback_cpp_name, "")
+            self.DeriveNativeName(constructor_callback_cpp_name)
         if constructor_callback_id in _cpp_resolver_string_map:
             constructor_callback_id = \
                 _cpp_resolver_string_map[constructor_callback_id]
-        self._native_library_emitter.Emit(
+        self._native_class_emitter.Emit(
             '\n'
-            '$FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
+            '  static $FACTORY_METHOD_NAME($PARAMETERS) native "$ID";\n',
             FACTORY_METHOD_NAME=dart_native_name,
             PARAMETERS=parameters,
             ID=constructor_callback_id)
@@ -662,6 +677,9 @@
         # Then we emit the impedance matching wrapper to call out to the
         # toplevel wrapper
         if not emit_to_native:
+            toplevel_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
             self._members_emitter.Emit(
                 '\n  @DocsEditable()\n'
                 '  static $INTERFACE_NAME $FACTORY_METHOD_NAME($PARAMETERS) => '
@@ -669,8 +687,7 @@
                 INTERFACE_NAME=self._interface_type_info.interface_name(),
                 FACTORY_METHOD_NAME=factory_method_name,
                 PARAMETERS=typed_formals,
-                TOPLEVEL_NAME=DeriveQualifiedName(self._native_library_name,
-                                                  dart_native_name),
+                TOPLEVEL_NAME=toplevel_name,
                 OUTPARAMETERS=parameters)
     else:
         self._members_emitter.Emit(
@@ -1068,7 +1085,7 @@
       if self._dart_use_blink:
           is_custom = any((op.id == 'item' and 'Custom' in op.ext_attrs) for op in self._interface.operations)
           dart_native_name = \
-              DeriveNativeName(self._interface.id, "NativeIndexed", "Getter")
+              self.DeriveNativeName("NativeIndexed", "Getter")
           # First emit a toplevel function to do the native call
           # Calls to this are emitted elsewhere,
           resolver_string = \
@@ -1077,15 +1094,18 @@
           if resolver_string in _cpp_resolver_string_map:
               resolver_string = \
                   _cpp_resolver_string_map[resolver_string]
-          self._native_library_emitter.Emit(
+          self._native_class_emitter.Emit(
               '\n'
-              '$(DART_NATIVE_NAME)(mthis, index) '
+              '  static $(DART_NATIVE_NAME)(mthis, index) '
               'native "$(RESOLVER_STRING)";\n',
               DART_NATIVE_NAME = dart_native_name,
               RESOLVER_STRING=resolver_string)
 
           # Emit the method which calls the toplevel function, along with
           # the [] operator.
+          dart_qualified_name = \
+              self.DeriveQualifiedBlinkName(self._interface.id,
+                                            dart_native_name)
           self._members_emitter.Emit(
               '\n'
               '  $TYPE operator[](int index) {\n'
@@ -1095,8 +1115,7 @@
               '  }\n\n'
               '  $TYPE _nativeIndexedGetter(int index) =>'
               ' $(DART_NATIVE_NAME)(this, index);\n',
-              DART_NATIVE_NAME=DeriveQualifiedName(self._native_library_name,
-                                                   dart_native_name),
+              DART_NATIVE_NAME=dart_qualified_name,
               TYPE=self.SecureOutputType(element_type),
               INTERFACE=self._interface.id)
       else:
@@ -1237,7 +1256,7 @@
       if self._dart_use_blink:
           base_name = '_%s_%s' % (operation.id, version)
           overload_name = \
-              DeriveNativeName(self._interface.id, base_name, native_suffix)
+              self.DeriveNativeName(base_name, native_suffix)
           static = True
           if not operation.is_static:
             actuals = ['mthis'] + actuals
@@ -1275,9 +1294,9 @@
 
 
     if self._dart_use_blink:
-        name = DeriveNativeName(self._interface.id, html_name, "")
-        qual_name = DeriveQualifiedName(self._native_library_name,
-                                        name)
+        name = self.DeriveNativeName(html_name)
+        qual_name = self.DeriveQualifiedBlinkName(self._interface.id,
+                                                  name)
         actuals = info.ParametersAsListOfVariables()
         formals = info.ParametersAsListOfVariables()
         if not info.IsStatic():
@@ -1294,7 +1313,7 @@
 
         dart_declaration = \
             '// Generated overload resolver\n' \
-            '%s(%s)' % (name, formals_s)
+            '  static %s(%s)' % (name, formals_s)
 
     self._GenerateDispatcherBody(
         info,
@@ -1703,7 +1722,7 @@
           self._renamer.GetLibraryName(self._interface),
           self._interface, idl_name, '  ')
     dart_native_name = \
-        DeriveNativeName(self._interface.id, idl_name, native_suffix)
+        self.DeriveNativeName(idl_name, native_suffix)
 
     if (resolver_string):
         native_binding = resolver_string
@@ -1724,17 +1743,18 @@
         if native_binding in _cpp_resolver_string_map:
             native_binding = \
                 _cpp_resolver_string_map[native_binding]
-        self._native_library_emitter.Emit(
+        self._native_class_emitter.Emit(
             '\n'
-            '$DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
+            '  static $DART_NAME($FORMALS) native "$NATIVE_BINDING";\n',
             DART_NAME=dart_native_name,
             FORMALS=formals,
             NATIVE_BINDING=native_binding)
 
         if not emit_to_native:
             caller_emitter = self._members_emitter
-            full_dart_name = DeriveQualifiedName(self._native_library_name,
-                                                 dart_native_name)
+            full_dart_name = \
+                self.DeriveQualifiedBlinkName(self._interface.id,
+                                              dart_native_name)
             caller_emitter.Emit(
                 '\n'
                 '  $METADATA$DART_DECLARATION => $DART_NAME($ACTUALS);\n',
diff --git a/tools/dom/src/blink_native_DOMImplementation.dart b/tools/dom/src/blink_native_DOMImplementation.dart
index 8e7582a..3c0031c 100644
--- a/tools/dom/src/blink_native_DOMImplementation.dart
+++ b/tools/dom/src/blink_native_DOMImplementation.dart
@@ -5,54 +5,64 @@
 part of _blink;
 
 // _Utils native entry points
-Native_Utils_window() native "Utils_window";
+class Blink_Utils {
+  static window() native "Utils_window";
 
-Native_Utils_forwardingPrint(message) native "Utils_forwardingPrint";
+  static forwardingPrint(message) native "Utils_forwardingPrint";
 
-Native_Utils_spawnDomUri(uri) native "Utils_spawnDomUri";
+  static spawnDomUri(uri) native "Utils_spawnDomUri";
 
-Native_Utils_register(document, tag, customType, extendsTagName) native "Utils_register";
+  static register(document, tag, customType, extendsTagName) native "Utils_register";
 
-Native_Utils_createElement(document, tagName) native "Utils_createElement";
+  static createElement(document, tagName) native "Utils_createElement";
 
-Native_Utils_initializeCustomElement(element) native "Utils_initializeCustomElement";
+  static initializeCustomElement(element) native "Utils_initializeCustomElement";
 
-Native_Utils_changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+  static changeElementWrapper(element, type) native "Utils_changeElementWrapper";
+}
 
-// FIXME: Return to using explicit cross frame entry points after roll to M35
-Native_DOMWindowCrossFrame_get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
+class Blink_DOMWindowCrossFrame {
+  // FIXME: Return to using explicit cross frame entry points after roll to M35
+  static get_history(_DOMWindowCrossFrame) native "Window_history_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
+  static get_location(_DOMWindowCrossFrame) native "Window_location_cross_frame_Getter";
 
-Native_DOMWindowCrossFrame_get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
+  static get_closed(_DOMWindowCrossFrame) native "Window_closed_Getter";
 
-Native_DOMWindowCrossFrame_get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
+  static get_opener(_DOMWindowCrossFrame) native "Window_opener_Getter";
 
-Native_DOMWindowCrossFrame_get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
+  static get_parent(_DOMWindowCrossFrame) native "Window_parent_Getter";
 
-Native_DOMWindowCrossFrame_get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
+  static get_top(_DOMWindowCrossFrame) native "Window_top_Getter";
 
-Native_DOMWindowCrossFrame_close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
+  static close(_DOMWindowCrossFrame) native "Window_close_Callback_RESOLVER_STRING_0_";
 
-Native_DOMWindowCrossFrame_postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+  static postMessage(_DOMWindowCrossFrame, message, targetOrigin, [messagePorts]) native "Window_postMessage_Callback";
+}
 
-// _HistoryCrossFrame native entry points
-Native_HistoryCrossFrame_back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
+class Blink_HistoryCrossFrame {
+  // _HistoryCrossFrame native entry points
+  static back(_HistoryCrossFrame) native "History_back_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
+  static forward(_HistoryCrossFrame) native "History_forward_Callback_RESOLVER_STRING_0_";
 
-Native_HistoryCrossFrame_go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+  static go(_HistoryCrossFrame, distance) native "History_go_Callback_RESOLVER_STRING_1_long";
+}
 
-// _LocationCrossFrame native entry points
-Native_LocationCrossFrame_set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+class Blink_LocationCrossFrame {
+  // _LocationCrossFrame native entry points
+  static set_href(_LocationCrossFrame, h) native "Location_href_Setter";
+}
 
-// _DOMStringMap native entry  points
-Native_DOMStringMap_containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
+class Blink_DOMStringMap {
+  // _DOMStringMap native entry  points
+  static containsKey(_DOMStringMap, key) native "DOMStringMap_containsKey_Callback";
 
-Native_DOMStringMap_item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
+  static item(_DOMStringMap, key) native "DOMStringMap_item_Callback";
 
-Native_DOMStringMap_setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
+  static setItem(_DOMStringMap, key, value) native "DOMStringMap_setItem_Callback";
 
-Native_DOMStringMap_remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
+  static remove(_DOMStringMap, key) native "DOMStringMap_remove_Callback";
 
-Native_DOMStringMap_get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+  static get_keys(_DOMStringMap) native "DOMStringMap_getKeys_Callback";
+}
\ No newline at end of file
diff --git a/tools/dom/src/html_native_DOMImplementation.dart b/tools/dom/src/html_native_DOMImplementation.dart
index 4ac5eff..75ba90f 100644
--- a/tools/dom/src/html_native_DOMImplementation.dart
+++ b/tools/dom/src/html_native_DOMImplementation.dart
@@ -185,11 +185,11 @@
     return element;
   }
 
-  static window() => _blink.Native_Utils_window();
-  static forwardingPrint(String message) => _blink.Native_Utils_forwardingPrint(message);
+  static window() => _blink.Blink_Utils.window();
+  static forwardingPrint(String message) => _blink.Blink_Utils.forwardingPrint(message);
   // TODO(vsm): Make this API compatible with spawnUri.  It should also
   // return a Future<Isolate>.
-  static spawnDomUri(String uri) => _blink.Native_Utils_spawnDomUri(uri);
+  static spawnDomUri(String uri) => _blink.Blink_Utils.spawnDomUri(uri);
 
   // The following methods were added for debugger integration to make working
   // with the Dart C mirrors API simpler.
@@ -793,16 +793,16 @@
   }
 
   static void _register(Document document, String tag, Type customType,
-    String extendsTagName) => _blink.Native_Utils_register(document, tag, customType, extendsTagName);
+    String extendsTagName) => _blink.Blink_Utils.register(document, tag, customType, extendsTagName);
 
   static Element createElement(Document document, String tagName) =>
-    _blink.Native_Utils_createElement(document, tagName);
+    _blink.Blink_Utils.createElement(document, tagName);
 
   static void initializeCustomElement(HtmlElement element) =>
-    _blink.Native_Utils_initializeCustomElement(element);
+    _blink.Blink_Utils.initializeCustomElement(element);
 
   static Element changeElementWrapper(HtmlElement element, Type type) =>
-    _blink.Native_Utils_changeElementWrapper(element, type);
+    _blink.Blink_Utils.changeElementWrapper(element, type);
 }
 
 class _DOMWindowCrossFrame extends NativeFieldWrapperClass2 implements
@@ -810,17 +810,17 @@
   _DOMWindowCrossFrame.internal();
 
   // Fields.
-  HistoryBase get history => _blink.Native_DOMWindowCrossFrame_get_history(this);
-  LocationBase get location => _blink.Native_DOMWindowCrossFrame_get_location(this);
-  bool get closed => _blink.Native_DOMWindowCrossFrame_get_closed(this);
-  WindowBase get opener => _blink.Native_DOMWindowCrossFrame_get_opener(this);
-  WindowBase get parent => _blink.Native_DOMWindowCrossFrame_get_parent(this);
-  WindowBase get top => _blink.Native_DOMWindowCrossFrame_get_top(this);
+  HistoryBase get history => _blink.Blink_DOMWindowCrossFrame.get_history(this);
+  LocationBase get location => _blink.Blink_DOMWindowCrossFrame.get_location(this);
+  bool get closed => _blink.Blink_DOMWindowCrossFrame.get_closed(this);
+  WindowBase get opener => _blink.Blink_DOMWindowCrossFrame.get_opener(this);
+  WindowBase get parent => _blink.Blink_DOMWindowCrossFrame.get_parent(this);
+  WindowBase get top => _blink.Blink_DOMWindowCrossFrame.get_top(this);
 
   // Methods.
-  void close() => _blink.Native_DOMWindowCrossFrame_close(this);
+  void close() => _blink.Blink_DOMWindowCrossFrame.close(this);
   void postMessage(/*SerializedScriptValue*/ message, String targetOrigin, [List messagePorts]) =>
-    _blink.Native_DOMWindowCrossFrame_postMessage(this, message, targetOrigin, messagePorts);
+    _blink.Blink_DOMWindowCrossFrame.postMessage(this, message, targetOrigin, messagePorts);
 
   // Implementation support.
   String get typeName => "Window";
@@ -845,9 +845,9 @@
   _HistoryCrossFrame.internal();
 
   // Methods.
-  void back() => _blink.Native_HistoryCrossFrame_back(this);
-  void forward() => _blink.Native_HistoryCrossFrame_forward(this);
-  void go(int distance) => _blink.Native_HistoryCrossFrame_go(this, distance);
+  void back() => _blink.Blink_HistoryCrossFrame.back(this);
+  void forward() => _blink.Blink_HistoryCrossFrame.forward(this);
+  void go(int distance) => _blink.Blink_HistoryCrossFrame.go(this, distance);
 
   // Implementation support.
   String get typeName => "History";
@@ -857,7 +857,7 @@
   _LocationCrossFrame.internal();
 
   // Fields.
-  void set href(String h) => _blink.Native_LocationCrossFrame_set_href(this, h);
+  void set href(String h) => _blink.Blink_LocationCrossFrame.set_href(this, h);
 
   // Implementation support.
   String get typeName => "Location";
@@ -867,14 +867,14 @@
   _DOMStringMap.internal();
 
   bool containsValue(String value) => Maps.containsValue(this, value);
-  bool containsKey(String key) => _blink.Native_DOMStringMap_containsKey(this, key);
-  String operator [](String key) => _blink.Native_DOMStringMap_item(this, key);
-  void operator []=(String key, String value) => _blink.Native_DOMStringMap_setItem(this, key, value);
+  bool containsKey(String key) => _blink.Blink_DOMStringMap.containsKey(this, key);
+  String operator [](String key) => _blink.Blink_DOMStringMap.item(this, key);
+  void operator []=(String key, String value) => _blink.Blink_DOMStringMap.setItem(this, key, value);
   String putIfAbsent(String key, String ifAbsent()) => Maps.putIfAbsent(this, key, ifAbsent);
-  String remove(String key) => _blink.Native_DOMStringMap_remove(this, key);
+  String remove(String key) => _blink.Blink_DOMStringMap.remove(this, key);
   void clear() => Maps.clear(this);
   void forEach(void f(String key, String value)) => Maps.forEach(this, f);
-  Iterable<String> get keys => _blink.Native_DOMStringMap_get_keys(this);
+  Iterable<String> get keys => _blink.Blink_DOMStringMap.get_keys(this);
   Iterable<String> get values => Maps.getValues(this);
   int get length => Maps.length(this);
   bool get isEmpty => Maps.isEmpty(this);
diff --git a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
index 36c722b..04c4317 100644
--- a/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/_blink_dartium.darttemplate
@@ -43,18 +43,88 @@
 
 // TODO(vsm): This should be moved out of this library.  Into dart:html?
 Type _getType(String key) {
+  var result;
+
   // TODO(vsm): Add Cross Frame and JS types here as well.
-  if (htmlBlinkMap.containsKey(key))
-    return htmlBlinkMap[key];
-  if (indexed_dbBlinkMap.containsKey(key))
-    return indexed_dbBlinkMap[key];
-  if (web_audioBlinkMap.containsKey(key))
-    return web_audioBlinkMap[key];
-  if (web_glBlinkMap.containsKey(key))
-    return web_glBlinkMap[key];
-  if (web_sqlBlinkMap.containsKey(key))
-    return web_sqlBlinkMap[key];
-  if (svgBlinkMap.containsKey(key))
-    return svgBlinkMap[key];
+
+  // Check the html library.
+  result = _getHtmlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web gl library.
+  result = _getWebGlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the indexed db library.
+  result = _getIndexDbType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web audio library.
+  result = _getWebAudioType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the web sql library.
+  result = _getWebSqlType(key);
+  if (result != null) {
+    return result;
+  }
+
+  // Check the svg library.
+  result = _getSvgType(key);
+  if (result != null) {
+    return result;
+  }
+
   return null;
-}
\ No newline at end of file
+}
+
+Type _getHtmlType(String key) {
+  if (htmlBlinkMap.containsKey(key)) {
+    return htmlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebGlType(String key) {
+  if (web_glBlinkMap.containsKey(key)) {
+    return web_glBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getIndexDbType(String key) {
+  if (indexed_dbBlinkMap.containsKey(key)) {
+    return indexed_dbBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebAudioType(String key) {
+  if (web_audioBlinkMap.containsKey(key)) {
+    return web_audioBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getWebSqlType(String key) {
+  if (web_sqlBlinkMap.containsKey(key)) {
+    return web_sqlBlinkMap[key]();
+  }
+  return null;
+}
+
+Type _getSvgType(String key) {
+  if (svgBlinkMap.containsKey(key)) {
+    return svgBlinkMap[key]();
+  }
+  return null;
+}
+
diff --git a/tools/dom/templates/html/dartium/html_dartium.darttemplate b/tools/dom/templates/html/dartium/html_dartium.darttemplate
index aef8e8b..7e7453e 100644
--- a/tools/dom/templates/html/dartium/html_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/html_dartium.darttemplate
@@ -142,18 +142,18 @@
 }
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const htmlBlinkMap = const {
-  '_HistoryCrossFrame': _HistoryCrossFrame,
-  '_LocationCrossFrame': _LocationCrossFrame,
-  '_DOMWindowCrossFrame': _DOMWindowCrossFrame,
+final htmlBlinkMap = {
+  '_HistoryCrossFrame': () => _HistoryCrossFrame,
+  '_LocationCrossFrame': () => _LocationCrossFrame,
+  '_DOMWindowCrossFrame': () => _DOMWindowCrossFrame,
   // FIXME: Move these to better locations.
-  'DateTime': DateTime,
-  'JsObject': js.JsObject,
-  'JsFunction': js.JsFunction,
-  'JsArray': js.JsArray,
+  'DateTime': () => DateTime,
+  'JsObject': () => js.JsObject,
+  'JsFunction': () => js.JsFunction,
+  'JsArray': () => js.JsArray,
 $!TYPE_MAP
   // FIXME: Temporary workaround.  The Blink name matches the Dart name
   // post Chrome 35.  We still generate the old mapping from 'Clipboard'.
-  'DataTransfer': DataTransfer,
+  'DataTransfer': () => DataTransfer,
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
index 340bbec..a0f1d1b 100644
--- a/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/indexed_db_dartium.darttemplate
@@ -37,7 +37,7 @@
 }
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const indexed_dbBlinkMap = const {
+final indexed_dbBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/svg_dartium.darttemplate b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
index e0cca26..3e3d2f3 100644
--- a/tools/dom/templates/html/dartium/svg_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/svg_dartium.darttemplate
@@ -18,7 +18,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const svgBlinkMap = const {
+final svgBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
index ea6c581..997d187 100644
--- a/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_audio_dartium.darttemplate
@@ -17,7 +17,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_audioBlinkMap = const {
+final web_audioBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
index f3d8c40..333001d 100644
--- a/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_gl_dartium.darttemplate
@@ -19,7 +19,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_glBlinkMap = const {
+final web_glBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
index 1af98eb..dae37f1 100644
--- a/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
+++ b/tools/dom/templates/html/dartium/web_sql_dartium.darttemplate
@@ -27,7 +27,7 @@
 $!GENERATED_DART_FILES
 $if DART_USE_BLINK
 // FIXME: Can we make this private?
-const web_sqlBlinkMap = const {
+final web_sqlBlinkMap = {
 $!TYPE_MAP
 };
 $endif
diff --git a/tools/dom/templates/html/impl/impl_Element.darttemplate b/tools/dom/templates/html/impl/impl_Element.darttemplate
index 3266c6c..a676fa0 100644
--- a/tools/dom/templates/html/impl/impl_Element.darttemplate
+++ b/tools/dom/templates/html/impl/impl_Element.darttemplate
@@ -1385,59 +1385,59 @@
 $else
   @DomName('Element.offsetHeight')
   @DocsEditable()
-  int get offsetHeight => _blink.Native_Element_offsetHeight_Getter(this).round();
+  int get offsetHeight => _blink.BlinkElement.$offsetHeight_Getter(this).round();
 
   @DomName('Element.offsetLeft')
   @DocsEditable()
-  int get offsetLeft => _blink.Native_Element_offsetLeft_Getter(this).round();
+  int get offsetLeft => _blink.BlinkElement.$offsetLeft_Getter(this).round();
 
   @DomName('Element.offsetTop')
   @DocsEditable()
-  int get offsetTop => _blink.Native_Element_offsetTop_Getter(this).round();
+  int get offsetTop => _blink.BlinkElement.$offsetTop_Getter(this).round();
 
   @DomName('Element.offsetWidth')
   @DocsEditable()
-  int get offsetWidth => _blink.Native_Element_offsetWidth_Getter(this).round();
+  int get offsetWidth => _blink.BlinkElement.$offsetWidth_Getter(this).round();
 
   @DomName('Element.clientHeight')
   @DocsEditable()
-  int get clientHeight => _blink.Native_Element_clientHeight_Getter(this).round();
+  int get clientHeight => _blink.BlinkElement.$clientHeight_Getter(this).round();
 
   @DomName('Element.clientLeft')
   @DocsEditable()
-  int get clientLeft => _blink.Native_Element_clientLeft_Getter(this).round();
+  int get clientLeft => _blink.BlinkElement.$clientLeft_Getter(this).round();
 
   @DomName('Element.clientTop')
   @DocsEditable()
-  int get clientTop => _blink.Native_Element_clientTop_Getter(this).round();
+  int get clientTop => _blink.BlinkElement.$clientTop_Getter(this).round();
 
   @DomName('Element.clientWidth')
   @DocsEditable()
-  int get clientWidth => _blink.Native_Element_clientWidth_Getter(this).round();
+  int get clientWidth => _blink.BlinkElement.$clientWidth_Getter(this).round();
 
   @DomName('Element.scrollHeight')
   @DocsEditable()
-  int get scrollHeight => _blink.Native_Element_scrollHeight_Getter(this).round();
+  int get scrollHeight => _blink.BlinkElement.$scrollHeight_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  int get scrollLeft => _blink.Native_Element_scrollLeft_Getter(this).round();
+  int get scrollLeft => _blink.BlinkElement.$scrollLeft_Getter(this).round();
 
   @DomName('Element.scrollLeft')
   @DocsEditable()
-  void set scrollLeft(int value) => _blink.Native_Element_scrollLeft_Setter(this, value.round());
+  void set scrollLeft(int value) => _blink.BlinkElement.$scrollLeft_Setter(this, value.round());
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  int get scrollTop => _blink.Native_Element_scrollTop_Getter(this).round();
+  int get scrollTop => _blink.BlinkElement.$scrollTop_Getter(this).round();
 
   @DomName('Element.scrollTop')
   @DocsEditable()
-  void set scrollTop(int value) => _blink.Native_Element_scrollTop_Setter(this, value.round());
+  void set scrollTop(int value) => _blink.BlinkElement.$scrollTop_Setter(this, value.round());
 
   @DomName('Element.scrollWidth')
   @DocsEditable()
-  int get scrollWidth => _blink.Native_Element_scrollWidth_Getter(this).round();
+  int get scrollWidth => _blink.BlinkElement.$scrollWidth_Getter(this).round();
 $endif
 
 $!MEMBERS
diff --git a/tools/full-coverage.dart b/tools/full-coverage.dart
index bafc0d1..2963574 100644
--- a/tools/full-coverage.dart
+++ b/tools/full-coverage.dart
@@ -17,8 +17,8 @@
   var input;
   var output;
   int workers;
-  bool prettyPrint;
-  bool lcov;
+  bool prettyPrint = false;
+  bool lcov = false;
   bool expectMarkers;
   bool verbose;
 }
@@ -405,7 +405,8 @@
   parser.addOption("sdk-root", abbr: "s",
                    help: "path to the SDK root");
   parser.addOption("package-root", abbr: "p",
-                   help: "path to the package root");
+                   help: "override path to the package root "
+                         "(default: inherited from dart)");
   parser.addOption("in", abbr: "i",
                    help: "input(s): may be file or directory");
   parser.addOption("out", abbr: "o",
@@ -465,6 +466,8 @@
     if (!FileSystemEntity.isDirectorySync(env.pkgRoot)) {
       fail("Provided package root '${args["package-root"]}' is not directory.");
     }
+  } else {
+    env.pkgRoot = Platform.packageRoot;
   }
 
   if (args["in"] == null) {
diff --git a/tools/gyp/configurations.gypi b/tools/gyp/configurations.gypi
index ddbe770..45a5850 100644
--- a/tools/gyp/configurations.gypi
+++ b/tools/gyp/configurations.gypi
@@ -368,6 +368,21 @@
       'Release': {
         'inherit_from': ['Release<(chrome_target_os)<(dart_target_arch)']
       },
+
+      'conditions': [
+        # On Windows ninja generator has hardcorded configuration naming
+        # patterns and it expects that x64 configurations are named smth_x64.
+        # This is a workaround for the crash that these expectations cause.
+        [ 'OS=="win" and GENERATOR=="ninja"', {
+          'DebugX64_x64': {
+            'inherit_from': [ 'DebugX64' ]
+          },
+
+          'ReleaseX64_x64': {
+            'inherit_from': [ 'ReleaseX64' ]
+          },
+        }],
+      ],
     },
   },
 }
diff --git a/tools/gyp/configurations_msvs.gypi b/tools/gyp/configurations_msvs.gypi
index 970c1ae..20d69be 100644
--- a/tools/gyp/configurations_msvs.gypi
+++ b/tools/gyp/configurations_msvs.gypi
@@ -19,6 +19,7 @@
       },
       'Dart_Win_x64_Base': {
         'abstract': 1,
+        'msvs_configuration_platform': 'x64',
       },
       'Dart_Win_simarm_Base': {
         'abstract': 1,
diff --git a/tools/make_links.py b/tools/make_links.py
index 1893f2d..0874ca8 100644
--- a/tools/make_links.py
+++ b/tools/make_links.py
@@ -32,7 +32,7 @@
       default='')
   return result.parse_args()
 
-def make_link(source, target):
+def make_link(source, target, orig_source):
   if os.path.islink(target):
     print 'Removing %s' % target
     sys.stdout.flush()
@@ -43,13 +43,19 @@
     sys.stdout.flush()
     os.rmdir(target)
 
-  print 'Creating link from %s to %s' % (source, target)
-  sys.stdout.flush()
-
-  if utils.GuessOS() == 'win32':
-    return subprocess.call(['mklink', '/j', target, source], shell=True)
+  if os.path.isfile(orig_source):
+    print 'Copying file from %s to %s' % (orig_source, target)
+    sys.stdout.flush()
+    shutil.copyfile(orig_source, target)
+    return 0
   else:
-    return subprocess.call(['ln', '-s', source, target])
+    print 'Creating link from %s to %s' % (source, target)
+    sys.stdout.flush()
+
+    if utils.GuessOS() == 'win32':
+      return subprocess.call(['mklink', '/j', target, source], shell=True)
+    else:
+      return subprocess.call(['ln', '-s', source, target])
 
 def create_timestamp_file(options):
   if options.timestamp_file != '':
@@ -67,12 +73,13 @@
     # it. This is necessary, otherwise we can end up having links in there
     # pointing to directories which no longer exist (on incremental builds).
     for link in os.listdir(target):
-      if utils.GuessOS() == 'win32':
-        # It seems like python on windows is treating pseudo symlinks to
+      full_link = os.path.join(target, link)
+      if os.path.isdir(full_link) and utils.IsWindows():
+        # It seems like python on Windows is treating pseudo symlinks to
         # directories as directories.
-        os.rmdir(os.path.join(target, link))
+        os.rmdir(full_link)
       else:
-        os.remove(os.path.join(target, link))
+        os.remove(full_link)
   else:
     os.makedirs(target)
   for source in args[1:]:
@@ -82,11 +89,12 @@
       name = source
     # Remove any addtional path components preceding NAME.
     (path, name) = os.path.split(name)
+    orig_source = source
     if utils.GuessOS() == 'win32':
       source = os.path.relpath(source)
     else:
       source = os.path.relpath(source, start=target)
-    exit_code = make_link(source, os.path.join(target, name))
+    exit_code = make_link(source, os.path.join(target, name), orig_source)
     if exit_code != 0:
       return exit_code
   create_timestamp_file(options)
diff --git a/tools/task_kill.py b/tools/task_kill.py
index b13dba5..9b905ee 100755
--- a/tools/task_kill.py
+++ b/tools/task_kill.py
@@ -38,6 +38,7 @@
     'content_shell': 'content_shell',
     'dart': 'dart',
     'editor': 'DartEditor',
+    'java': 'java',
     'eggplant': 'Eggplant',
     'firefox': 'firefox.exe',
     'git': 'git',
@@ -196,6 +197,8 @@
 def KillEditor():
   status = Kill("editor")
   if os_name == "linux":
+    # it is important to kill java after editor on linux
+    status += Kill("java")
     status += Kill("eggplant")
   return status
 
diff --git a/tools/testing/dart/browser_controller.dart b/tools/testing/dart/browser_controller.dart
index 718588d..abaf1fe 100644
--- a/tools/testing/dart/browser_controller.dart
+++ b/tools/testing/dart/browser_controller.dart
@@ -1016,6 +1016,7 @@
           status.browser.testBrowserOutput,
           didTimeout: true);
       status.currentTest.doneCallback(browserTestOutput);
+      status.lastTest = status.currentTest;
       status.currentTest = null;
 
       // We don't want to start a new browser if we are terminating.
@@ -1088,9 +1089,10 @@
       status.currentTest.lastKnownMessage = '';
     } else {
       // TODO(ricow): Handle this better.
-      print("This is bad, should never happen, getNextTest all full");
+      print("Browser requested next test before reporting previous result");
       print("This happened for browser $browserId");
       print("Old test was: ${status.currentTest.url}");
+      print("The test before that was: ${status.lastTest.url}");
       print("Timed out tests:");
       for (var v in timedOut) {
         print("  $v");
diff --git a/tools/testing/dart/test_options.dart b/tools/testing/dart/test_options.dart
index b880a72..b41edfa 100644
--- a/tools/testing/dart/test_options.dart
+++ b/tools/testing/dart/test_options.dart
@@ -107,7 +107,7 @@
               'arch',
               'The architecture to run tests for',
               ['-a', '--arch'],
-              ['all', 'ia32', 'x64', 'arm', 'mips',
+              ['all', 'ia32', 'x64', 'arm', 'arm64', 'mips',
                'simarm', 'simarm64', 'simmips'],
               'ia32'),
           new _TestOptionSpecification(
diff --git a/tools/testing/dart/test_suite.dart b/tools/testing/dart/test_suite.dart
index a0a3f73..25fbe3d 100644
--- a/tools/testing/dart/test_suite.dart
+++ b/tools/testing/dart/test_suite.dart
@@ -2117,10 +2117,33 @@
 
   static String getShortName(String path) {
     final PATH_REPLACEMENTS = const {
-      "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
-          "co19_shadow-trees_",
-      "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
-          "co19_shadowdom_",
+      "pkg_polymer_e2e_test_bad_import_test": "polymer_bi",
+      "pkg_polymer_e2e_test_canonicalization_test": "polymer_c16n",
+      "pkg_polymer_e2e_test_experimental_boot_test": "polymer_boot",
+      "pkg_polymer_e2e_test_good_import_test": "polymer_gi",
+      "tests_co19_src_Language_12_Expressions_14_Function_Invocation_":
+          "co19_fn_invoke_",
+      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
+          "caretRangeFromPoint-": "co19_caretrangefrompoint_",
+      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
+          "hittest-relative-to-viewport_": "co19_caretrange_hittest_",
+      "tests_co19_src_LayoutTests_fast_dom_HTMLLinkElement_link-onerror-"
+          "stylesheet-with-": "co19_dom_link-",
+      "tests_co19_src_LayoutTests_fast_dom_": "co19_dom",
+      "tests_co19_src_LibTest_core_AbstractClassInstantiationError_"
+          "AbstractClassInstantiationError_": "co19_abstract_class_",
+      "tests_co19_src_LibTest_core_IntegerDivisionByZeroException_"
+          "IntegerDivisionByZeroException_": "co19_division_by_zero",
+      "tests_co19_src_WebPlatformTest_html_dom_documents_dom-tree-accessors_":
+          "co19_dom_accessors_",
+      "tests_co19_src_WebPlatformTest_html_semantics_embedded-content_"
+          "media-elements_": "co19_media_elements",
+      "tests_co19_src_WebPlatformTest_html_semantics_": "co19_semantics_",
+
+      "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
+          "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
+      "tests_co19_src_WebPlatformTest_html-templates_definitions_"
+          "template-contents-owner": "co19_htmltemplates_contents",
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_additions-to-": "co19_htmltemplates_add_",
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
@@ -2131,14 +2154,17 @@
       "tests_co19_src_WebPlatformTest_html-templates_parsing-html-"
           "templates_creating-an-element-for-the-token_":
           "co19_htmltemplates_create_",
-      "tests_co19_src_WebPlatformTest_html-templates_additions-to-"
-          "the-steps-to-clone-a-node_": "co19_htmltemplates_clone_",
-      "tests_co19_src_LayoutTests_fast_dom_Document_CaretRangeFromPoint_"
-      "caretRangeFromPoint-": "co19_caretrangefrompoint_",
-      "pkg_polymer_e2e_test_canonicalization_test": "polymer_c16n",
-      "pkg_polymer_e2e_test_experimental_boot_test": "polymer_boot",
-      "pkg_polymer_e2e_test_bad_import_test": "polymer_bi",
-      "pkg_polymer_e2e_test_good_import_test": "polymer_gi",
+      "tests_co19_src_WebPlatformTest_html-templates_template-element"
+          "_template-": "co19_htmltemplates_element-",
+      "tests_co19_src_WebPlatformTest_html-templates_": "co19_htmltemplate_",
+
+      "tests_co19_src_WebPlatformTest_shadow-dom_shadow-trees_":
+          "co19_shadow-trees_",
+      "tests_co19_src_WebPlatformTest_shadow-dom_elements-and-dom-objects_":
+          "co19_shadowdom_",
+      "tests_co19_src_WebPlatformTest_shadow-dom_html-elements-in-"
+          "shadow-trees_": "co19_shadow_html_",
+      "tests_co19_src_WebPlatformTest_DOMEvents_approved_": "co19_dom_approved_"
     };
 
     // Some tests are already in [build_dir]/generated_tests.
diff --git a/tools/utils.py b/tools/utils.py
index 43947b5..f8fe68c 100644
--- a/tools/utils.py
+++ b/tools/utils.py
@@ -50,6 +50,8 @@
   id = platform.machine()
   if id.startswith('arm'):
     return 'arm'
+  elif id.startswith('aarch64'):
+    return 'arm64'
   elif id.startswith('mips'):
     return 'mips'
   elif (not id) or (not re.match('(x|i[3-6])86', id) is None):
@@ -364,7 +366,18 @@
   if revision:
     return revision
 
-  # maybe the builder is using git-svn, try that
+  # Check for revision using git (Note: we can't use git-svn because in a
+  # pure-git checkout, "git-svn anyCommand" just hangs!). We look an arbitrary
+  # number of commits backwards (100) to get past any local commits.
+  p = subprocess.Popen(['git', 'log', '-100'], stdout = subprocess.PIPE,
+      stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
+  output, _ = p.communicate()
+  revision = ParseGitInfoOutput(output)
+  if revision:
+    return revision
+
+  # In the rare off-chance that git log -100 doesn't have a svn repo number,
+  # attempt to use "git svn info."
   p = subprocess.Popen(['git', 'svn', 'info'], stdout = subprocess.PIPE,
       stderr = subprocess.STDOUT, shell=IsWindows(), cwd = DART_DIR)
   output, _ = p.communicate()
@@ -379,6 +392,14 @@
 
   return None
 
+def ParseGitInfoOutput(output):
+  """Given a git log, determine the latest corresponding svn revision."""
+  for line in output.split('\n'):
+    tokens = line.split()
+    if len(tokens) > 0 and tokens[0] == 'git-svn-id:':
+      return tokens[1].split('@')[1]
+  return None
+
 def ParseSvnInfoOutput(output):
   revision_match = re.search('Last Changed Rev: (\d+)', output)
   if revision_match:
@@ -528,6 +549,8 @@
     system = GuessOS()
     if arch == 'arm':
       return os.path.join(dart_binary_prefix, system, 'dart-arm')
+    elif arch == 'arm64':
+      return os.path.join(dart_binary_prefix, system, 'dart-arm64')
     elif arch == 'mips':
       return os.path.join(dart_binary_prefix, system, 'dart-mips')
     else:
diff --git a/utils/apidoc/docgen.gyp b/utils/apidoc/docgen.gyp
index 69bb64a..ee33b15 100644
--- a/utils/apidoc/docgen.gyp
+++ b/utils/apidoc/docgen.gyp
@@ -82,8 +82,11 @@
             '--no-include-dependent-packages',
             '--package-root=<(PRODUCT_DIR)/packages',
             '--exclude-lib=async_helper',
-            '--exclude-lib=expect',
+            '--exclude-lib=compiler',
+            '--exclude-lib=dart2js_incremental',
             '--exclude-lib=docgen',
+            '--exclude-lib=expect',
+            '--exclude-lib=try',
             '../../pkg'
           ],
           'message': 'Running docgen: <(_action)',
